LyoKCiAgICBidHR2LWNhcmRzLmMKCiAgICB0aGlzIGZpbGUgaGFzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25zIC0gY2FyZC1zcGVjaWZpYyBzdHVmZgogICAgbGlrZSB0aGUgYmlnIHR2Y2FyZHMgYXJyYXkgZm9yIHRoZSBtb3N0IHBhcnQKCiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKCQkJICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQogICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgva21vZC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgoKI2luY2x1ZGUgImJ0dHZwLmgiCiNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgojaW5jbHVkZSA8bWVkaWEvdHZhdWRpby5oPgoKLyogZndkIGRlY2wgKi8Kc3RhdGljIHZvaWQgYm9vdF9tc3AzNHh4KHN0cnVjdCBidHR2ICpidHYsIGludCBwaW4pOwpzdGF0aWMgdm9pZCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgdm9pZCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaW5pdF9SVFYyNChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgbHQ5NDE1X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwKCQkJCSAgICBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgICBpbnQgc2V0KTsKc3RhdGljIHZvaWQgdGVycmF0dl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHYzcGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGd2YmN0djVwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcHZidDg3OHA5Yl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBmdjIwMDBzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmR2cl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhZHR2azUwM19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBydjYwNV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHhndWFyZF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgaXZjMTIwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBndmMxMTAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIHZvaWQgUFhDMjAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgdGliZXRDUzE2X2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQgc2lnbWFTTENfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHNpZ21hU1FfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CgpzdGF0aWMgaW50IHRlcnJhdGVjX2FjdGl2ZV9yYWRpb191cGdyYWRlKHN0cnVjdCBidHR2ICpidHYpOwpzdGF0aWMgaW50IHRlYTU3NTdfcmVhZChzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSk7CnN0YXRpYyB2b2lkIGlkZW50aWZ5X2J5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LAoJCQkgICAgICAgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdKTsKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dik7CgovKiBjb25maWcgdmFyaWFibGVzICovCnN0YXRpYyB1bnNpZ25lZCBpbnQgdHJpdG9uMTsKc3RhdGljIHVuc2lnbmVkIGludCB2c2Z4OwpzdGF0aWMgdW5zaWduZWQgaW50IGxhdGVuY3kgPSBVTlNFVDsKaW50IG5vX292ZXJsYXk9LTE7CgpzdGF0aWMgdW5zaWduZWQgaW50IGNhcmRbQlRUVl9NQVhdICAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHBsbFtCVFRWX01BWF0gICAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHR1bmVyW0JUVFZfTUFYXSAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHN2aHNbQlRUVl9NQVhdICAgPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IHJlbW90ZVtCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBVTlNFVCB9OwpzdGF0aWMgc3RydWN0IGJ0dHYgICptYXN0ZXJbQlRUVl9NQVhdID0geyBbIDAgLi4uIChCVFRWX01BWC0xKSBdID0gTlVMTCB9OwojaWZkZWYgTU9EVUxFCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAxOwojZWxzZQpzdGF0aWMgdW5zaWduZWQgaW50IGF1dG9sb2FkOwojZW5kaWYKc3RhdGljIHVuc2lnbmVkIGludCBncGlvbWFzayA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKCi8qIGluc21vZCBvcHRpb25zICovCm1vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0odnNmeCwgICAgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKG5vX292ZXJsYXksIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oZ3Bpb21hc2ssICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1ZGlvYWxsLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOwoKbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHN2aHMsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShhdWRpb211eCwgaW50LCBOVUxMLCAwNDQ0KTsKCk1PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgoJCSAiW2VuYWJsZSBidWcgY29tcGF0aWJpbGl0eSBmb3IgdHJpdG9uMSArIG90aGVyc10iKTsKTU9EVUxFX1BBUk1fREVTQyh2c2Z4LCJzZXQgVlNGWCBwY2kgY29uZmlnIGJpdCAiCgkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7Ck1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJzcGVjaWZ5IFRWL2dyYWJiZXIgY2FyZCBtb2RlbCwgc2VlIENBUkRMSVNUIGZpbGUgZm9yIGEgbGlzdCIpOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKTU9EVUxFX1BBUk1fREVTQyh0dW5lciwic3BlY2lmeSBpbnN0YWxsZWQgdHVuZXIgdHlwZSIpOwpNT0RVTEVfUEFSTV9ERVNDKGF1dG9sb2FkLCJhdXRvbWF0aWNhbGx5IGxvYWQgaTJjIG1vZHVsZXMgbGlrZSB0dW5lci5vLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKTU9EVUxFX1BBUk1fREVTQyhub19vdmVybGF5LCJhbGxvdyBvdmVycmlkZSBvdmVybGF5IGRlZmF1bHQgKDAgZGlzYWJsZXMsIDEgZW5hYmxlcykiCgkJIiBbc29tZSBWSUEvU0lTIGNoaXBzZXRzIGFyZSBrbm93biB0byBoYXZlIHByb2JsZW0gd2l0aCBvdmVybGF5XSIpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbGlzdCBvZiBjYXJkIElEcyBmb3IgYnQ4NzgrIGNhcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBzdHJ1Y3QgQ0FSRCB7Cgl1bnNpZ25lZCBpZDsKCWludCBjYXJkbnI7CgljaGFyICpuYW1lOwp9IGNhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKCXsgMHgxM2ViMDA3MCwgQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzgsICAiSGF1cHBhdWdlIFdpblRWIiB9LAoJeyAweDM5MDAwMDcwLCBCVFRWX0JPQVJEX0hBVVBQQVVHRTg3OCwgICJIYXVwcGF1Z2UgV2luVFYtRCIgfSwKCXsgMHg0NTAwMDA3MCwgQlRUVl9CT0FSRF9IQVVQUEFVR0VQVlIsICAiSGF1cHBhdWdlIFdpblRWL1BWUiIgfSwKCXsgMHhmZjAwMDA3MCwgQlRUVl9CT0FSRF9PU1BSRVkxeDAsICAgICAiT3NwcmV5LTEwMCIgfSwKCXsgMHhmZjAxMDA3MCwgQlRUVl9CT0FSRF9PU1BSRVkyeDBfU1ZJRCwiT3NwcmV5LTIwMCIgfSwKCXsgMHhmZjAyMDA3MCwgQlRUVl9CT0FSRF9PU1BSRVk1MDAsICAgICAiT3NwcmV5LTUwMCIgfSwKCXsgMHhmZjAzMDA3MCwgQlRUVl9CT0FSRF9PU1BSRVkyMDAwLCAgICAiT3NwcmV5LTIwMDAiIH0sCgl7IDB4ZmYwNDAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZNTQwLCAgICAgIk9zcHJleS01NDAiIH0sCgl7IDB4ZmYwNzAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZNDQwLCAgICAgIk9zcHJleS00NDAiIH0sCgoJeyAweDAwMDExMDAyLCBCVFRWX0JPQVJEX0FUSV9UVldPTkRFUiwgICJBVEkgVFYgV29uZGVyIiB9LAoJeyAweDAwMDMxMDAyLCBCVFRWX0JPQVJEX0FUSV9UVldPTkRFUlZFLCJBVEkgVFYgV29uZGVyL1ZFIiB9LAoKCXsgMHg2NjA2MTA3ZCwgQlRUVl9CT0FSRF9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4NjYwNzEwN2QsIEJUVFZfQk9BUkRfV0lORkFTVFZDMTAwLCAgIkxlYWR0ZWsgV2luRmFzdCBWQyAxMDAiIH0sCgl7IDB4NjYwOTEwN2QsIEJUVFZfQk9BUkRfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgVFYgMjAwMCBYUCIgfSwKCXsgMHgyNjM2MTBiNCwgQlRUVl9CT0FSRF9TVEIyLCAgICAgICAgICAiU1RCIFRWIFBDSSBGTSwgR2F0ZXdheSBQL04gNjAwMDcwNCIgfSwKCXsgMHgyNjQ1MTBiNCwgQlRUVl9CT0FSRF9TVEIyLCAgICAgICAgICAiU1RCIFRWIFBDSSBGTSwgR2F0ZXdheSBQL04gNjAwMDcwNCIgfSwKCXsgMHg0MDIwMTBmYywgQlRUVl9CT0FSRF9HVkJDVFYzUENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFYzL1BDSSIgfSwKCXsgMHg0MDUwMTBmYywgQlRUVl9CT0FSRF9HVkJDVFY0UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY0L1BDSSIgfSwKCXsgMHg0MDcwMTBmYywgQlRUVl9CT0FSRF9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKCXsgMHhkMDE4MTBmYywgQlRUVl9CT0FSRF9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKCgl7IDB4MDAxMjExYmQsIEJUVFZfQk9BUkRfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgkvKiBzb21lIGNhcmRzIHNoaXAgd2l0aCBieXRlc3dhcHBlZCBJRHMgLi4uICovCgl7IDB4MTIwMGJkMTEsIEJUVFZfQk9BUkRfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCXsgMHhmZjAwYmQxMSwgQlRUVl9CT0FSRF9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViBbYnN3YXBdIiB9LAoJLyogdGhpcyBzZWVtcyB0byBoYXBwZW4gYXMgd2VsbCAuLi4gKi8KCXsgMHhmZjEyMTFiZCwgQlRUVl9CT0FSRF9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKCgl7IDB4MzAwMDEyMWEsIEJUVFZfQk9BUkRfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgyNjM3MTBiNCwgQlRUVl9CT0FSRF9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAoJeyAweDMwNjAxMjFhLCBCVFRWX0JPQVJEX1NUQjIsCSAgIjNEZnggVm9vZG9vVFYgMTAwLyBTVEIgT0VNIiB9LAoKCXsgMHgzMDAwMTQ0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYzLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNngiIH0sCgl7IDB4YTAwNTE0NGYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MywgIkNQSDA2WCBUVmlldzk5LUNhcmQiIH0sCgl7IDB4MzAwMjE0NGYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MSwgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDV4IiB9LAoJeyAweDMwMDUxNDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2MS8wNkwgKFQxL0xDKSIgfSwKCXsgMHg1MDAwMTQ0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYxLCAiQXNrZXkgQ1BIMDUwIiB9LAoJeyAweDMwMDAxNGZmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjEsICJUVmlldyA5OSAoQ1BIMDYxKSIgfSwKCXsgMHgzMDAyMTRmZiwgQlRUVl9CT0FSRF9QSE9FQkVfVFZNQVMsICAiUGhvZWJlIFRWIE1hc3RlciAoQ1BIMDYwKSIgfSwKCgl7IDB4MDAwMTE0NjEsIEJUVFZfQk9BUkRfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwMjE0NjEsIEJUVFZfQk9BUkRfQVZFUk1FRElBOTgsICAgIkFWZXJtZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDAwMzE0NjEsIEJUVFZfQk9BUkRfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwNDE0NjEsIEJUVFZfQk9BUkRfQVZFUk1FRElBOTgsICAgIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDMwMDE0NjEsIEJUVFZfQk9BUkRfQVZFUk1FRElBOTgsICAgIlZET01BVEUgVFYgVFVORVIgQ0FSRCIgfSwKCgl7IDB4MTExNzE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE4MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE5MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBJKSIgfSwKCXsgMHgxMTFhMTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgSSkiIH0sCgoJeyAweDExMjMxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZSQURJTywgICJUZXJyYXRlYyBUViBSYWRpbysiIH0sCgl7IDB4MTEyNzE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUViwgICAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMDUpIiAgICB9LAoJLyogY2xhc2hlcyB3aXRoIEZseVZpZGVvCgkgKnsgMHgxODUyMTg1MiwgQlRUVl9CT0FSRF9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LCAqLwoJeyAweDExMzQxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKExSMTAyKSIgfSwKCXsgMHgxMTM1MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvKiBMUjEwMiAqLwoJeyAweDUwMTgxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8qID8/ICovCgl7IDB4ZmYzYjE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLyogPz8gKi8KCgl7IDB4NDAwMDE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwYTE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwZDE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDEwMTViMCwgQlRUVl9CT0FSRF9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoJeyAweDQwMTYxNWIwLCBCVFRWX0JPQVJEX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgoJeyAweDE0MzBhYTAwLCBCVFRWX0JPQVJEX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0EiIH0sCgl7IDB4MTQzMWFhMDAsIEJUVFZfQk9BUkRfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQiIgfSwKCXsgMHgxNDMyYWEwMCwgQlRUVl9CT0FSRF9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNDIiB9LAoJeyAweDE0MzNhYTAwLCBCVFRWX0JPQVJEX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0QiIH0sCgl7IDB4MTQzM2FhMDMsIEJUVFZfQk9BUkRfUFYxNDMsICAgICAgICAgIlNlY3VyaXR5IEV5ZXMiIH0sCgoJeyAweDE0NjBhYTAwLCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMSIgfSwKCXsgMHgxNDYxYWEwMSwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTIiIH0sCgl7IDB4MTQ2MmFhMDIsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0zIiB9LAoJeyAweDE0NjNhYTAzLCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtNCIgfSwKCgl7IDB4MTQ2NGFhMDQsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0xIiB9LAoJeyAweDE0NjVhYTA1LCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMiIgfSwKCXsgMHgxNDY2YWEwNiwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTMiIH0sCgl7IDB4MTQ2N2FhMDcsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi00IiB9LAoKCXsgMHhhMTMyZmYwMCwgQlRUVl9CT0FSRF9JVkMxMDAsICAgICAgICAiSVZDLTEwMCIgIH0sCgl7IDB4YTE1NTAwMDAsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAxLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMiwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDMsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMTAwLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMSwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDIsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAzLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTgyZmYwMCwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDEsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAyLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMywgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDQsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA1LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNiwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDcsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA4LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOSwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGEsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBiLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYywgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGQsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBlLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZiwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgoJeyAweDQxNDI0MzQ0LCBCVFRWX0JPQVJEX0dSQU5EVEVDLCAgICAgICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIiB9LAoJeyAweDAxMDIwMzA0LCBCVFRWX0JPQVJEX1hHVUFSRCwgICAgICAgICJHcmFuZHRlYyBHcmFuZCBYLUd1YXJkIiB9LAoKCXsgMHgxODUwMTg1MSwgQlRUVl9CT0FSRF9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCgl7IDB4YTA1MDE4NTEsIEJUVFZfQk9BUkRfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweDE4NTExODUxLCBCVFRWX0JPQVJEX0ZMWVZJREVPOThFWiwgICJGbHlWaWRlbyA5OEVaIChMUjUxKS8gQ3liZXJNYWlsIEFWIiB9LAoJeyAweDE4NTIxODUyLCBCVFRWX0JPQVJEX1RZUEhPT05fVFZJRVcsICJGbHlWaWRlbyA5OEZNIChMUjUwKS8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIgfSwKCXsgMHg0MWEwYTA1MSwgQlRUVl9CT0FSRF9GTFlWSURFT185OEZNLCAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCBSZXYgUSIgfSwKCXsgMHgxODUwMWY3ZiwgQlRUVl9CT0FSRF9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCgoJeyAweDAxMDExNWNiLCBCVFRWX0JPQVJEX0dNVjEsICAgICAgICAgICJBRyBHTVYxIiB9LAoJeyAweDAxMDExNGM3LCBCVFRWX0JPQVJEX01PRFRFQ18yMDUsICAgICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViIgfSwKCgl7IDB4MTBiNDI2MzYsIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4LCAgIlNUQiA/Pz8iIH0sCgl7IDB4MjE3ZDY2MDYsIEJUVFZfQk9BUkRfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweGZmZjZmNmZmLCBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHgwMzExNjAwMCwgQlRUVl9CT0FSRF9TRU5TT1JBWTMxMSwgICAiU2Vuc29yYXkgMzExIiB9LAoJeyAweDAwNzkwZTExLCBCVFRWX0JPQVJEX1dJTkRWUiwgICAgICAgICJDYW5vcHVzIFdpbkRWUiBQQ0kiIH0sCgl7IDB4YTBmY2ExYTAsIEJUVFZfQk9BUkRfWk9MVFJJWCwgICAgICAgIkZhY2UgdG8gRmFjZSBUdm1heCIgfSwKCXsgMHg4MmIyYWE2YSwgQlRUVl9CT0FSRF9TSU1VU19HVkMxMTAwLCAiU0lNVVMgR1ZDMTEwMCIgfSwKCXsgMHgxNDZjYWEwYywgQlRUVl9CT0FSRF9QVjk1MSwgICAgICAgICAiaXR1bmVyIHNwZWN0cmE4IiB9LAoJeyAweDIwMGExMjk1LCBCVFRWX0JPQVJEX1BYQzIwMCwgICAgICAgICJJbWFnZU5hdGlvbiBQWEMyMDBBIiB9LAoKCXsgMHg0MDExMTU1NCwgQlRUVl9CT0FSRF9QVl9CVDg3OFBfOUIsICAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQiIH0sCgl7IDB4MTdkZTBhMDEsIEJUVFZfQk9BUkRfS1dPUkxELCAgICAgICAgIk1lY2VyIFRWL0ZNL1ZpZGVvIFR1bmVyIiB9LAoKCXsgMHgwMTA1MTgwNSwgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMxIiB9LAoJeyAweDAxMDYxODA1LCBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzIiIH0sCgl7IDB4MDEwNzE4MDUsIEJUVFZfQk9BUkRfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMyIgfSwKCXsgMHgwMTA4MTgwNSwgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICM0IiB9LAoKCXsgMHgxNTQwOTUxMSwgQlRUVl9CT0FSRF9BQ09SUF9ZODc4RiwgIkFjb3JwIFk4NzhGIiB9LAoKCS8qIGxpa2VseSBicm9rZW4sIHZlbmRvciBpZCBkb2Vzbid0IG1hdGNoIHRoZSBvdGhlciBtYWdpYyB2aWV3cyAuLi4KCSAqIHsgMHhhMGZjYTA0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYzLCAiR3VpbGxlbW90IE1heGkgVFYgVmlkZW8gMyIgfSwgKi8KCgkvKiBEdXBsaWNhdGUgUENJIElELCByZWNvbmZpZ3VyZSBmb3IgdGhpcyBib2FyZCBkdXJpbmcgdGhlIGVlcHJvbSByZWFkLgoJKiB7IDB4MTNlYjAwNzAsIEJUVFZfQk9BUkRfSEFVUFBBVUdFX0lNUEFDVFZDQiwgICJIYXVwcGF1Z2UgSW1wYWN0VkNCIiB9LCAqLwoKCS8qIERWQiBjYXJkcyAodXNpbmcgcGNpIGZ1bmN0aW9uIC4xIGZvciBtcGVnIGRhdGEgeGZlcikgKi8KCXsgMHgwMDFjMTFiZCwgQlRUVl9CT0FSRF9QSU5OQUNMRVNBVCwgICAiUGlubmFjbGUgUENUViBTYXQiIH0sCgl7IDB4MDEwMTAwNzEsIEJUVFZfQk9BUkRfTkVCVUxBX0RJR0lUViwgIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiIH0sCgl7IDB4MjAwMDcwNjMsIEJUVFZfQk9BUkRfUENfSERUViwgICAgICAgInBjSERUViBIRC0yMDAwIFRWIn0sCgl7IDB4MDAyNjExYmQsIEJUVFZfQk9BUkRfVFdJTkhBTl9EU1QsICAgIlBpbm5hY2xlIFBDVFYgU0FUIENJIiB9LAoJeyAweDAwMDExODIyLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULCAgICJUd2luaGFuIFZpc2lvblBsdXMgRFZCIiB9LAoJeyAweGZjMDAyNzBmLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULCAgICJDaGFpblRlY2ggZGlnaXRvcCBEU1QtMTAwMCBEVkItUyIgfSwKCXsgMHgwNzcxMTQ2MSwgQlRUVl9CT0FSRF9BVkRWQlRfNzcxLCAgICAiQVZlcm1lZGlhIEF2ZXJUViBEVkItVCA3NzEiIH0sCgl7IDB4MDc2MTE0NjEsIEJUVFZfQk9BUkRfQVZEVkJUXzc2MSwgICAgIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiB9LAoJeyAweGRiMTAxOGFjLCBCVFRWX0JPQVJEX0RWSUNPX0RWQlRfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKCXsgMHhkNTAwMThhYywgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAoJeyAweDAwMjYxODIyLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULAkiRE5UViBMaXZlISBNaW5pICJ9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CgkvKiAtLS0tIGNhcmQgMHgwMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9VTktOT1dOXSA9IHsKCQkubmFtZQkJPSAiICoqKiBVTktOT1dOL0dFTkVSSUMgKioqICIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCB9LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUlST10gPSB7CgkJLm5hbWUJCT0gIk1JUk8gUENUViIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAxNSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMiwgMCwgMCwgMCB9LAoJCS5ncGlvbXV0ZSAJPSAxMCwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0VdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSA3LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0geyAwLCAxLCAyLCAzIH0sCgkJLmdwaW9tdXRlIAk9IDQsCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfU1RCXSA9IHsKCQkubmFtZQkJPSAiU1RCLCBHYXRld2F5IFAvTiA2MDAwNjk5IChidDg0OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gNywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgNCwgMCwgMiwgMyB9LAoJCS5ncGlvbXV0ZSAJPSAxLAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgwNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9JTlRFTF0gPSB7CgkJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDAsCgkJLnR1bmVyX3R5cGUJPSA0LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0RJQU1PTkRdID0gewoJCS5uYW1lCQk9ICJEaWFtb25kIERUVjIwMDAiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMSwgMCwgMSB9LAoJCS5ncGlvbXV0ZSAJPSAzLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FWRVJNRURJQV0gPSB7CgkJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVlBob25lIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAzLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tYXNrCT0gMHgwZiwKCQkuZ3Bpb211eCAJPSB7IDB4MGMsIDB4MDQsIDB4MDgsIDB4MDQgfSwKCQkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT05dID0gewoJCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwIH0sCgkJLmdwaW9tdXggCT0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDA4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0ZMWVZJREVPXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gSUkgKEJ0ODQ4KSBMUjI2IC8gTUFYSSBUViBWaWRlbyBQQ0kyIExSMjYiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhjMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDAsIDB4YzAwLCAweDgwMCwgMHg0MDAgfSwKCQkuZ3Bpb211dGUgCT0gMHhjMDAsCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVFVSQk9UVl0gPSB7CgkJLm5hbWUJCT0gIklNUy9JWG1pY3JvIFR1cmJvVFYiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMSwgMSwgMiwgMyB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzhdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMSwgMiwgMyB9LAoJCS5ncGlvbXV0ZSAJPSA0LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01JUk9QUk9dID0gewoJCS5uYW1lCQk9ICJNSVJPIFBDVFYgcHJvIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MzAxNGYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCB9LAoJCS5ncGlvbXV0ZSAJPSAxMCwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQURTVEVDSF9UVl0gPSB7CgkJLm5hbWUJCT0gIkFEUyBUZWNobm9sb2dpZXMgQ2hhbm5lbCBTdXJmZXIgVFYgKGJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAxNSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMTMsIDE0LCAxMSwgNyB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FWRVJNRURJQTk4XSA9IHsKCQkubmFtZQkJPSAiQVZlck1lZGlhIFRWQ2FwdHVyZSA5OCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDQsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAxNSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMTMsIDE0LCAxMSwgNyB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkubXNwMzR4eF9hbHQgICAgPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sgICAgID0gYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbywKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1ZIWF0gPSB7CgkJLm5hbWUJCT0gIkFpbXNsYWIgVmlkZW8gSGlnaHdheSBYdHJlbWUgKFZIWCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gNywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMiwgMSwgMyB9LCAvKiBvbGQ6IHswLCAxLCAyLCAzLCA0fSAqLwoJCS5ncGlvbXV0ZSAJPSA0LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1pPTFRSSVhdID0gewoJCS5uYW1lCQk9ICJab2x0cml4IFRWLU1heCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAxNSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMCwgMSwgMCB9LAoJCS5ncGlvbXV0ZSAJPSAxMCwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfUElYVklFV1BMQVlUVl0gPSB7CgkJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBsYXlUViAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MDFmZTAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkjaWYgMAoJCS8qIG9sZCAqLwoJCS5ncGlvbXV4IAk9IHsgMHgwMWMwMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAgfSwKCSNlbHNlCgkJLyogMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+ICovCgkJLmdwaW9tdXggICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4MDAyMDAwLAoJI2VuZGlmCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgl9LAoJW0JUVFZfQk9BUkRfV0lOVklFV182MDFdID0gewoJCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ODMwMGY4LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDAgfSwKCQkuZ3Bpb211eCAJPSB7IDB4NGZhMDA3LDB4Y2ZhMDA3LDB4Y2ZhMDA3LDB4Y2ZhMDA3IH0sCgkJLmdwaW9tdXRlIAk9IDB4Y2ZhMDA3LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gd2ludmlld19hdWRpbywKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9BVkVDX0lOVEVSQ0FQXSA9IHsKCQkubmFtZQkJPSAiQVZFQyBJbnRlcmNhcHR1cmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAyLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMSwgMCwgMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0xJRkVfRkxZS0lUXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gSUkgRVogL0ZseUtpdCBMUjM4IEJ0ODQ4IChjYXB0dXJlIG9ubHkpIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gLTEsCgkJLmdwaW9tYXNrCT0gMHg4ZGZmMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQ0VJX1JBRkZMRVNdID0gewoJCS5uYW1lCQk9ICJDRUkgUmFmZmxlcyBDYXJkIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9DT05GRVJFTkNFVFZdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OC8gTHVja3kgU3RhciBJbWFnZSBXb3JsZCBDb25mZXJlbmNlVFYgTFI1MCIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDIsICAvKiB0dW5lciwgbGluZSBpbiAqLwoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxODAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAgfSwKCQkuZ3Bpb211dGUgCT0gMHgxODAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUxfSSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9QSE9FQkVfVFZNQVNdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGMwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMSwgMHg4MDAsIDB4NDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4YzAwLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01PRFRFQ18yMDVdID0gewoJCS5uYW1lCQk9ICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViwgYnQ4NzgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIC0xIH0sCgkJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCQkuZ3Bpb211eCAJPSB7IDAsIDAsIDAsIDAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FMUFNfVFNCQjVfUEFMX0ksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDE4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjFdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNVgvMDZYIChidDg3OCkgW21hbnkgdmVuZG9yc10iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhlMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7MHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAgfSwKCQkuZ3Bpb211dGUgCT0gMHhjMDAsCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9WT0JJU19CT09TVEFSXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjAgKEJ0ODQ4KS8gVGVycmEgVFZhbHVlIFZlcnNpb24gMS4wLyBWb2JpcyBUVi1Cb29zdGFyIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MWYwZmZmLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4NDAwMDAsCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sgICAgID0gdGVycmF0dl9hdWRpbywKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR19XQ0FNXSA9IHsKCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpbkNhbSBuZXdlciAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAzLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDAsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDAsIDEsIDIsIDMgfSwKCQkuZ3Bpb211dGUgCT0gNCwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NQVhJXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4MTgwMCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1NFQ0FNLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgxYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9URVJSQVRWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjEgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDFmMGZmZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCB9LAoJCS5ncGlvbXV0ZSAJPSAweDQwMDAwLAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gdGVycmF0dl9hdWRpbywKCQkvKiBHUElPIHdpcmluZzoKCQlFeHRlcm5hbCAyMCBwaW4gY29ubmVjdG9yIChmb3IgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgYm9hcmQpCgkJZ3BpbzAwOiBpMmMtc2RhCgkJZ3BpbzAxOiBpMmMtc2NsCgkJZ3BpbzAyOiBvbTU2MTAtZGF0YQoJCWdwaW8wMzogb201NjEwLWNsawoJCWdwaW8wNDogb201NjEwLXdyZQoJCWdwaW8wNTogb201NjEwLXN0ZXJlbwoJCWdwaW8wNjogcmRzNjU4OC1kYXZuCgkJZ3BpbzA3OiBQaW4gNyBuLmMuCgkJZ3BpbzA4OiBuSU9XCgkJZ3BpbzA5KzEwOiBuSU9SLCBuU0VMID8/IChidDg3OCkKCQkJZ3BpbzA5OiBuSU9SIChidDg0OCkKCQkJZ3BpbzEwOiBuU0VMIChidDg0OCkKCQlTb3VuZCBSb3V0aW5nOgoJCWdwaW8xNjogdTItQTAgKDFzdCA0MDUyYnQpCgkJZ3BpbzE3OiB1Mi1BMQoJCWdwaW8xODogdTItbkVOCgkJZ3BpbzE5OiB1NC1BMCAoMm5kIDQwNTIpCgkJZ3BpbzIwOiB1NC1BMQoJCQl1NC1uRU4gLSBHTkQKCQlCdHNweToKCQkJMDAwMDAgOiBDZHJvbSAoaW50ZXJuYWwgYXVkaW8gaW5wdXQpCgkJCTEwMDAwIDogZXh0LiBWaWRlbyBhdWRpbyBpbnB1dAoJCQkyMDAwMCA6IFRWIE1vbm8KCQkJYTAwMDAgOiBUViBNb25vLzIKCQkxYTAwMDAgOiBUViBTdGVyZW8KCQkJMzAwMDAgOiBSYWRpbwoJCQk0MDAwMCA6IE11dGUKCSovCgoJfSwKCVtCVFRWX0JPQVJEX1BYQzIwMF0gPSB7CgkJLyogSmFubmlrIEZyaXRzY2ggPGphbm5pa0B0ZWNoZmFrLnVuaS1iaWVsZWZlbGQuZGU+ICovCgkJLm5hbWUJCT0gIkltYWdlbmF0aW9uIFBYQzIwMCIsCgkJLnZpZGVvX2lucHV0cwk9IDUsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDEsIC8qIHdhczogNCAqLwoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJCS5ncGlvbXV4IAk9IHsgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWxfaG9vayAgICA9IFBYQzIwMF9tdXhzZWwsCgoJfSwKCVtCVFRWX0JPQVJEX0ZMWVZJREVPXzk4XSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4MDAsICAvKiAweDhkZmUwMCAqLwoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0geyAwLCAweDA4MDAsIDB4MTAwMCwgMHgxMDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4MTgwMCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9JUFJPVFZdID0gewoJCS5uYW1lCQk9ICJGb3JtYWMgaVByb1RWLCBGb3JtYWMgUHJvVFYgSSAoYnQ4NDgpIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAzLAoJCS5ncGlvbWFzawk9IDEsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDEsIDAsIDAsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSU5URUxfQ19TX1BDSV0gPSB7CgkJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDAsCgkJLnR1bmVyX3R5cGUJPSA0LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RFUlJBVFZBTFVFXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVmFsdWUgVmVyc2lvbiBCdDg3OCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMHg1MDAsIDAsIDB4MzAwLCAweDkwMCB9LAoJCS5ncGlvbXV0ZSAJPSAweDkwMCwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9XSU5GQVNUMjAwMF0gPSB7CgkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luRmFzdCAyMDAwLyBXaW5GYXN0IDIwMDAgWFAiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDAgfSwgLyogVFYsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLwoJI2lmIDAKCQkuZ3Bpb21hc2sJPSAweGMzMzAwMCwKCQkuZ3Bpb211eCAJPSB7IDB4NDIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKCSNlbHNlCgkJLyogQWxleGFuZGVyIFZhcmFraW4gPGF2YXJha2luQGhvdG1haWwuY29tPiBbc3RlcmVvIHZlcnNpb25dICovCgkJLmdwaW9tYXNrCT0gMHhiMzMwMDAsCgkJLmdwaW9tdXggCT0geyAweDEyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4ODAwMDAwLAoJI2VuZGlmCgkJLyogQXVkaW8gUm91dGluZyBmb3IgIldpbkZhc3QgMjAwMCBYUCIgKG5vIHR2IHN0ZXJlbyAhKQoJCQlncGlvMjMgLS0gaGVmNDA1MjpuRW5hYmxlICgweDgwMDAwMCkKCQkJZ3BpbzEyIC0tIGhlZjQwNTI6QTEKCQkJZ3BpbzEzIC0tIGhlZjQwNTI6QTAKCQkweDAwMDA6IGV4dGVybmFsIGF1ZGlvCgkJMHgxMDAwOiBGTQoJCTB4MjAwMDogVFYKCQkweDMwMDA6IG4uYy4KCQlOb3RlOiBUaGVyZSBleGlzdHMgYW5vdGhlciB2YXJpYW50ICJXaW5mYXN0IDIwMDAiIHdpdGggdHYgc3RlcmVvICE/CgkJTm90ZTogZWVwcm9tIG9ubHkgY29udGFpbnMgRkYgYW5kIHBjaSBzdWJzeXN0ZW0gaWQgMTA3ZDo2NjA2CgkJKi8KCQkubmVlZHNfdHZhdWRpbwk9IDAsCgkJLnBsbAkJPSBQTExfMjgsCgkJLmhhc19yYWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSA1LCAvKiBkZWZhdWx0IGZvciBub3csIGdwaW8gcmVhZHMgQkZGRjA2IGZvciBQYWwgYmcrZGsgKi8KCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vawk9IHdpbmZhc3QyMDAwX2F1ZGlvLAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQ0hST05PU19WUzJdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIC8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4MTgwMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgyNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9UWVBIT09OX1RWSUVXXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThGTSBMUjUwIC8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDMsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4MDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCB9LAoJCS5ncGlvbXV0ZSAJPSAweDE4MDAsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9QWEVMVldQTFRWUFJPXSA9IHsKCQkubmFtZQkJPSAiUHJvbGluayBQaXhlbFZpZXcgUGxheVRWIHBybyIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGZmLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0geyAweDIxLCAweDIwLCAweDI0LCAweDJjIH0sCgkJLmdwaW9tdXRlIAk9IDB4MjksCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUFHSUNUVklFVzA2M10gPSB7CgkJLm5hbWUJCT0gIkFza2V5IENQSDA2WCBUVmlldzk5IiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4NTUxZTAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCgkJLmdwaW9tdXggCT0geyAweDU1MTQwMCwgMHg1NTEyMDAsIDAsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMHg1NTFjMDAsCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1BJTk5BQ0xFXSA9IHsKCQkubmFtZQkJPSAiUGlubmFjbGUgUENUViBTdHVkaW8vUmF2ZSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAzMDAwRiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMiwgMHhkMDAwMSwgMCwgMCB9LAoJCS5ncGlvbXV0ZSAJPSAxLAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9TVEIyXSA9IHsKCQkubmFtZQkJPSAiU1RCIFRWIFBDSSBGTSwgR2F0ZXdheSBQL04gNjAwMDcwNCAoYnQ4NzgpLCAzRGZ4IFZvb2Rvb1RWIDEwMCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSA3LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0geyA0LCAwLCAyLCAzIH0sCgkJLmdwaW9tdXRlIAk9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQVZQSE9ORTk4XSA9IHsKCQkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUgOTgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSA0LAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMTUsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDEzLCA0LCAxMSwgNyB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCgl9LAoJW0JUVFZfQk9BUkRfUFY5NTFdID0gewoJCS5uYW1lCQk9ICJQcm9WaWRlbyBQVjk1MSIsIC8qIHBpYzE2YzU0ICovCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuZ3Bpb211eCAJPSB7IDAsIDAsIDAsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAxLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX09OQUlSX1RWXSA9IHsKCQkubmFtZQkJPSAiTGl0dGxlIE9uQWlyIFRWIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ZTAwYiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMHhmZjlmZjYsIDB4ZmY5ZmY2LCAweGZmMWZmNywgMCB9LAoJCS5ncGlvbXV0ZSAJPSAweGZmM2ZmYywKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfU0lHTUFfVFZJSV9GTV0gPSB7CgkJLm5hbWUJCT0gIlNpZ21hIFRWSUktRk0iLAoJCS52aWRlb19pbnB1dHMJPSAyLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDEsIDEsIDAsIDIgfSwKCQkuZ3Bpb211dGUgCT0gMywKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfTk9ORSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT04yXSA9IHsKCQkubmFtZQkJPSAiTUFUUklYLVZpc2lvbiBNVi1EZWx0YSAyIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwIH0sCgkJLmdwaW9tdXggCT0geyAwIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRV0gPSB7CgkJLm5hbWUJCT0gIlpvbHRyaXggR2VuaWUgVFYvRk0iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhiY2YwM2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDB4YmM4MDNmLCAweGJjOTAzZiwgMHhiY2IwM2YsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMHhiY2IwM2YsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMjEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVEVSUkFUVlJBRElPXSA9IHsKCQkubmFtZQkJPSAiVGVycmF0ZWMgVFYvUmFkaW8rIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4NzAwMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMHg0MDAwMCwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzM1LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfRFlOQUxJTktdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwM3gvIER5bmFsaW5rIE1hZ2ljIFRWaWV3IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0gezIsMCwwLDAgfSwKCQkuZ3Bpb211dGUgCT0gMSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9HVkJDVFYzUENJXSA9IHsKCQkubmFtZQkJPSAiSU9EQVRBIEdWLUJDVFYzL1BDSSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxMGYwMCwKCQkubXV4c2VsCQk9IHsyLCAzLCAwLCAwIH0sCgkJLmdwaW9tdXggCT0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9BTFBTX1RTSEM2X05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBndmJjdHYzcGNpX2F1ZGlvLAoJfSwKCVtCVFRWX0JPQVJEX1BYRUxWV1BMVFZQQUtdID0gewoJCS5uYW1lCQk9ICJQcm9saW5rIFBWLUJUODc4UCs0RSAvIFBpeGVsVmlldyBQbGF5VFYgUEFLIC8gTGVuY28gTVhUVi05NTc4IENQIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAzLAoJCS5ncGlvbWFzawk9IDB4QUEwMDAwLAoJCS5tdXhzZWwJCT0geyAyLDMsMSwxLC0xIH0sCgkJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCQkuZ3Bpb211eCAJPSB7IDB4MjAwMDAsIDAsIDB4ODAwMDAsIDB4ODAwMDAgfSwKCQkuZ3Bpb211dGUgCT0gMHhhODAwMCwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlCT0gMSwKCQkvKiBHUElPIHdpcmluZzogKGRpZmZlcmVudCBmcm9tIFJldi40QyAhKQoJCQlHUElPMTc6IFU0LkEwIChmaXJzdCBoZWY0MDUyYnQpCgkJCUdQSU8xOTogVTQuQTEKCQkJR1BJTzIwOiBVNS5BMSAoc2Vjb25kIGhlZjQwNTJidCkKCQkJR1BJTzIxOiBVNC5uRU4KCQkJR1BJTzIyOiBCVDgzMiBSZXNldCBMaW5lCgkJCUdQSU8yMzogQTUsQTAsIFU1LG5FTgoJCU5vdGU6IEF0IGkyYz0weDhhIGlzIGEgQnQ4MzIgY2hpcCwgd2hpY2ggY2hhbmdlcyB0byAweDg4IGFmdGVyIGJlaW5nIHJlc2V0IHZpYSBHUElPMjIKCQkqLwoJfSwKCVtCVFRWX0JPQVJEX0VBR0xFXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiRWFnbGUgV2lyZWxlc3MgQ2Fwcmljb3JuMiAoYnQ4NzhBKSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMSB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMSwgMiwgMyB9LAoJCS5ncGlvbXV0ZSAJPSA0LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BJTk5BQ0xFUFJPXSA9IHsKCQkvKiBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQDJnZW4uY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpbyBQcm8iLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDEsIDB4ZDAwMDEsIDAsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMTAsCgkJCQkvKiBzb3VuZCBwYXRoICg1IHNvdXJjZXMpOgoJCQkJTVVYMSAobWFzayAweDAzKSwgRW5hYmxlIFBpbiAweDA4ICgwPWVuYWJsZSwgMT1kaXNhYmxlKQoJCQkJCTA9IGV4dC4gQXVkaW8gSU4KCQkJCQkxPSBmcm9tIE1VWDIKCQkJCQkyPSBNb25vIFRWIHNvdW5kIGZyb20gVHVuZXIKCQkJCQkzPSBub3QgY29ubmVjdGVkCgkJCQlNVVgyIChtYXNrIDB4MzAwMDApOgoJCQkJCTAsMiwzPSBmcm9tIE1TUDM0eHgKCQkJCQkxPSBGTSBzdGVyZW8gUmFkaW8gZnJvbSBUdW5lciAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RWSUVXX1JEU19GTV0gPSB7CgkJLyogQ2xhYXMgTGFuZ2JlaG4gPGNsYWFzQGJpZ2Zvb3QuY29tPiwKCQlTdmVuIEdyb3Roa2xhZ3MgPHN2ZW5AdXBiLmRlPiAqLwoJCS5uYW1lCQk9ICJUeXBob29uIFRWaWV3IFJEUyArIEZNIFN0ZXJlbyAvIEtOQzEgVFYgU3RhdGlvbiBSRFMiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAzLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxYywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMCwgMHgxMCwgOCB9LAoJCS5ncGlvbXV0ZSAJPSA0LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0xJRkVURUNfOTQxNV0gPSB7CgkJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KCQlpbiBkZS5jb21wLm9zLnVuaXgubGludXguaGFyZHdhcmU6CgkJCW9wdGlvbnMgYnR0diBjYXJkPTAgcGxsPTEgcmFkaW89MSBncGlvbWFzaz0weDE4ZTAKCQkJZ3Bpb211eCA9MHg0NGM3MWYsMHg0NGQ3MWYsMCwweDQ0ZDcxZiwweDQ0ZGZmZgoJCQlvcHRpb25zIHR1bmVyIHR5cGU9NSAqLwoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwIC9GbHlWaWRlbyBBMi8gTGlmZXRlYyBMVCA5NDE1IFRWIFtMUjkwXSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4ZTAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCB9LAoJCS5ncGlvbXV0ZSAJPSAweDE4ZTAsCgkJCS8qIEZvciBjYXJkcyB3aXRoIHRkYTk4MjAvdGRhOTgyMToKCQkJCTB4MDAwMDogVHVuZXIgbm9ybWFsIHN0ZXJlbwoJCQkJMHgwMDgwOiBUdW5lciBBMiBTQVAgKHNlY29uZCBhdWRpbyBwcm9ncmFtID0gWndlaWthbmFsdG9uKQoJCQkJMHgwODgwOiBUdW5lciBBMiBzdGVyZW8gKi8KCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0JFU1RCVVlfRUFTWVRWXSA9IHsKCQkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgoJCW9sZCBFYXN5IFRWIEJUODQ4IHZlcnNpb24gKG1vZGVsIENQSDAzMSkgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQXNrZXkgQ1BIMDMxLyBCRVNUQlVZIEVhc3kgVFYiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4RiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDIsIDAsIDAsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMTAsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MzggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfRkxZVklERU9fOThGTV0gPSB7CgkJLyogR29yZG9uIEhleWRvbiA8Z2poZXlkb25AYmlnZm9vdC5jb20gKCc5OCkgKi8KCQkubmFtZSAgICAgICAgICAgPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThGTSBMUjUwIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MTgwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCB9LAoJCS5ncGlvbXV0ZSAJPSAweDE4MDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJCS8qIFRoaXMgaXMgdGhlIHVsdGltYXRlIGNoZWFwbyBjYXB0dXJlIGNhcmQKCQkqIGp1c3QgYSBCVDg0OEEgb24gYSBzbWFsbCBQQ0IhCgkJKiBTdGV2ZSBIb3Nnb29kIDxzdGV2ZUBlcXVpaW5ldC5jb20+ICovCglbQlRUVl9CT0FSRF9HUkFORFRFQ10gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjICdHcmFuZCBWaWRlbyBDYXB0dXJlJyAoQnQ4NDgpIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMzUsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQVNLRVlfQ1BIMDYwXSA9IHsKCQkvKiBEYW5pZWwgSGVycmluZ3RvbiA8ZGFuaWVsLmhlcnJpbmd0b25AaG9tZS5jb20+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MC8gUGhvZWJlIFRWIE1hc3RlciBPbmx5IChObyBGTSkiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHhlMDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4ODAwLAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9BU0tFWV9DUEgwM1hdID0gewoJCS8qIE1hdHRpIE1vdHR1cyA8bW90dHVzQHBoeXNpYy51dC5lZT4gKi8KCQkubmFtZQkJPSAiQXNrZXkgQ1BIMDN4IFRWIENhcHR1cmVyIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAyLCAwLCAwLCAwIH0sCgkJLmdwaW9tdXRlIAk9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4M2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfTU0xMDBQQ1RWXSA9IHsKCQkvKiBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+ICovCgkJLm5hbWUgICAgICAgICAgID0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTEwMFBDVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAxMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDIsIDAsIDAsIDEgfSwKCQkuZ3Bpb211dGUgCT0gOCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMzUsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0dNVjFdID0gewoJCS8qIEFkcmlhbiBDb3ggPGFkcmlhbkBodW1ib2xkdC5jby51ayAqLwoJCS5uYW1lCQk9ICJBRyBFbGVjdHJvbmljcyBHTVYxIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDEsCgkJLmdwaW9tYXNrICAgICAgID0gMHhGLAoJCS5tdXhzZWwJCT0geyAyLCAyIH0sCgkJLmdwaW9tdXggICAgICAgID0geyB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9CRVNUQlVZX0VBU1lUVjJdID0gewoJCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+CgkJbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQoJCXNwZWNpYWwgdGhhbmtzIHRvIEluZm9ybWF0aWNhIE1pZXJlcyBmb3IgcHJvdmlkaW5nIHRoZSBjYXJkICovCgkJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MS8gQkVTVEJVWSBFYXN5IFRWIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDIsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4RkYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAxLCAwLCA0LCA0IH0sCgkJLmdwaW9tdXRlIAk9IDksCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FUSV9UVldPTkRFUl0gPSB7CgkJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCQkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGYwM2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKCQkuZ3Bpb211eCAJPSB7IDB4YmZmZSwgMCwgMHhiZmZmLCAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4YmZmZSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHg0MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BVElfVFZXT05ERVJWRV0gPSB7CgkJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCQkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciBWRSIsCgkJLnZpZGVvX2lucHV0cwk9IDIsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gLTEsCgkJLmdwaW9tYXNrCT0gMSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMCwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMCwgMCwgMSwgMCB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0ZMWVZJREVPMjAwMF0gPSB7CgkJLyogRGVlSmF5IDxkZWVqYXlAd2VzdGVsOTAwLm5ldCAoMjAwMFMpICovCgkJLm5hbWUgICAgICAgICAgID0gIkxpZmV2aWV3IEZseVZpZGVvIDIwMDBTIExSOTAiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMywKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrCT0gMHgxOGUwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxIH0sCgkJCQkvKiBSYWRpbyBjaGFuZ2VkIGZyb20gMWU4MCB0byAweDgwMCB0byBtYWtlCgkJCQlGbHlWaWRlbzIwMDBTIGluIC5odSBoYXBweSAoZ20pKi8KCQkJCS8qIC1kay0/Pz86IHNldCBtdXRlPTB4MTgwMCBmb3IgdGRhOTg3NGggZGF1Z2h0ZXJib2FyZCAqLwoJCS5ncGlvbXV4IAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwIH0sCgkJLmdwaW9tdXRlIAk9IDB4MTgwMCwKCQkuYXVkaW9faG9vawk9IGZ2MjAwMHNfYXVkaW8sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE5ODc1CT0gMSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RFUlJBVFZBTFVFUl0gPSB7CgkJLm5hbWUJCT0gIlRlcnJhdGVjIFRWYWx1ZVJhZGlvIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ZmZmZjAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0geyAweDUwMCwgMHg1MDAsIDB4MzAwLCAweDkwMCB9LAoJCS5ncGlvbXV0ZSAJPSAweDkwMCwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9HVkJDVFY0UENJXSA9IHsKCQkvKiBUQU5BS0EgS2VpIDxwZWcwMDYyNUBuaWZ0eS5jb20+ICovCgkJLm5hbWUgICAgICAgICAgID0gIklPREFUQSBHVi1CQ1RWNC9QQ0kiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMTBmMDAsCgkJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDAsIDAgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rICAgICA9IGd2YmN0djNwY2lfYXVkaW8sCgl9LAoKCS8qIC0tLS0gY2FyZCAweDQ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiM0RmeCBWb29kb29UViBGTSAoRXVybyksIFZvb2Rvb1RWIDIwMCAoVVNBKSIsCgkJLyogdHJ5ICJpbnNtb2QgbXNwMzQwMCBzaW1wbGU9MCIgaWYgeW91IGhhdmUKCQkqIHNvdW5kIHByb2JsZW1zIHdpdGggdGhpcyBjYXJkLiAqLwoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDB4NGY4YTAwLAoJCS8qIDB4MTAwMDAwOiAxPU1TUCBlbmFibGVkICgwPWRpc2FibGUgYWdhaW4pCgkJKiAweDAxMDAwMDogQ29ubmVjdGVkIHRvICJTMCIgb24gdGRhOTg4MCAoMD1QYWwvQkcsIDE9TlRTQykgKi8KCQkuZ3Bpb211eCAgICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmIH0sCgkJLmdwaW9tdXRlIAk9IDB4OTQ3ZmZmLAoJCS8qIHR2dHVuZXIsIHJhZGlvLCAgIGV4dGVybmFsLGludGVybmFsLCBtdXRlLCAgc3RlcmVvCgkJKiB0dW5lciwgQ29tcG9zaXQsIFNWaWQsIENvbXBvc2l0LW9uLVN2aWQtYWRhcHRlciAqLwoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMSB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsCQk9IFBMTF8yOCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9BSU1NU10gPSB7CgkJLyogUGhpbGlwIEJsdW5kZWxsIDxwYkBuZXh1cy5jby51az4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQWN0aXZlIEltYWdpbmcgQUlNTVMiLAoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkJLmdwaW9tYXNrICAgICAgID0gMAoJfSwKCVtCVFRWX0JPQVJEX1BWX0JUODc4UF9QTFVTXSA9IHsKCQkvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi40Qyw4RSkiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gNCwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMTUsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwLCAwLCAxMSwgNyB9LCAvKiBUViBhbmQgUmFkaW8gd2l0aCBzYW1lIEdQSU8gISAqLwoJCS5ncGlvbXV0ZSAJPSAxMywKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAyNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJCS8qIEdQSU8gd2lyaW5nOgoJCQlHUElPMDogVTQuQTAgKGhlZjQwNTJidCkKCQkJR1BJTzE6IFU0LkExCgkJCUdQSU8yOiBVNC5BMSAoc2Vjb25kIGhlZjQwNTJidCkKCQkJR1BJTzM6IFU0Lm5FTiwgVTUuQTAsIEE1Lm5FTgoJCQlHUElPOC0xNTogdnJkODY2YiA/CgkJKi8KCX0sCglbQlRUVl9CT0FSRF9GTFlWSURFTzk4RVpdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEVaIChjYXB0dXJlIG9ubHkpIExSNTEiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDIsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwgLyogQVYxLCBBVjIsIFNWSFMsIENWaWQgYWRhcHRlciBvbiBTVkhTICovCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDQ4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BWX0JUODc4UF85Ql0gPSB7CgkJLyogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4gKi8KCQkubmFtZQkJPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKzlCIChQbGF5VFYgUHJvIHJldi45QiBGTStOSUNBTSkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgzZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMHgwMSwgMHgwMCwgMHgwMywgMHgwMyB9LAoJCS5ncGlvbXV0ZSAJPSAweDA5LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE5ODc1CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBwdmJ0ODc4cDliX2F1ZGlvLCAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgc3RlcmVvICovCgkJLmhhc19yYWRpbwk9IDEsICAvKiBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgcmFkaW8gKi8KCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJCS8qIEdQSU8gd2lyaW5nOgoJCQlHUElPMDogQTAgaGVmNDA1MgoJCQlHUElPMTogQTEgaGVmNDA1MgoJCQlHUElPMzogbkVOIGhlZjQwNTIKCQkJR1BJTzgtMTU6IHZyZDg2NmIKCQkJR1BJTzIwLDIyLDIzOiBSMzAsUjI5LFIyOAoJCSovCgl9LAoJW0JUVFZfQk9BUkRfU0VOU09SQVkzMTFdID0gewoJCS8qIENsYXkgS3VueiA8Y2t1bnpAbWFpbC5hcmMubmFzYS5nb3Y+ICovCgkJLyogeW91IG11c3QganVtcGVyIEpQNSBmb3IgdGhlIGNhcmQgdG8gd29yayAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTZW5zb3JheSAzMTEiLAoJCS52aWRlb19pbnB1dHMgICA9IDUsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSA0LAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwLCAwIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9SVjYwNV0gPSB7CgkJLyogTWlndWVsIEZyZWl0YXMgPG1pZ3VlbEBjZXR1Yy5wdWMtcmlvLmJyPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJSZW1vdGVWaXNpb24gTVggKFJWNjA1KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4MDdmZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDB4MzMsIDB4MTMsIDB4MjMsIDB4NDMsIDB4ZjMsIDB4NzMsIDB4ZTMsIDB4MDMsCgkJCQkweGQzLCAweGIzLCAweGMzLCAweDYzLCAweDkzLCAweDUzLCAweDgzLCAweGEzIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWxfaG9vayAgICA9IHJ2NjA1X211eHNlbCwKCX0sCglbQlRUVl9CT0FSRF9QT1dFUkNMUl9NVFY4NzhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQb3dlcmNvbG9yIE1UVjg3OC8gTVRWODc4Ui8gTVRWODc4RiIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAyLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgxQzgwMEYsICAvKiBCaXQwLTI6IEF1ZGlvIHNlbGVjdCwgOC0xMjpyZW1vdGUgY29udHJvbCAxNDpyZW1vdGUgdmFsaWQgMTU6cmVtb3RlIHJlc2V0ICovCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAxLCAxLCB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMSwgMiwgMiB9LAoJCS5ncGlvbXV0ZSAJPSA0LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbAkJPSBQTExfMjgsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDRjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1dJTkRWUl0gPSB7CgkJLyogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQ2Fub3B1cyBXaW5EVlIgUENJIChDT01QQVEgUHJlc2FyaW8gMzUyNEpQLCA1MTEySlApIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MTQwMDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMSwgMiwgMyB9LAoJCS5ncGlvbXV0ZSAJPSA0LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCgl9LAoJW0JUVFZfQk9BUkRfR1JBTkRURUNfTVVMVEldID0gewoJCS5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIENhcmQgKEJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9LV09STERdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJKZXR3YXkgVFYvQ2FwdHVyZSBKVy1UVjg3OC1GQkssIEt3b3JsZCBLVy1UVjg3OFJGIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sICAgLyogVHVuZXIsIFNWaWQsIFNWSFMsIFNWaWQgdG8gU1ZIUyBjb25uZWN0b3IgKi8KCQkuZ3Bpb211eCAgICAgICAgPSB7IDAsIDAsIDQsIDQgfSwvKiBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKCQkJCQkJKiBUaGlzIGNhcmQgbGFja3MgZXh0ZXJuYWwgQXVkaW8gSW4sIHNvIHdlIG11dGUgaXQgb24gRXh0LiAmIEludC4KCQkJCQkJKiBUaGUgUENCIGNhbiB0YWtlIGEgc2J4MTYzNy9zYngxNjczLCB3aXJpbmcgdW5rbm93bi4KCQkJCQkJKiBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KCQkJCQkJKiBncGlvbXV4ID0xOiBsb3dlciB2b2x1bWUsIDIrMzogbXV0ZQoJCQkJCQkqIGJ0d2luY2FwIHVzZXMgMHg4MDAwMC8weDgwMDAzCgkJCQkJCSovCgkJLmdwaW9tdXRlIAk9IDQsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS8qIFNhbXN1bmcgVENQQTkwOTVQQzI3QSAoQkcrREspLCBwaGlsaXBzIGNvbXBhdGlibGUsIHcvRk0sIHN0ZXJlbyBhbmQKCQlyYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuICovCgkJLmhhc19yYWRpbwk9IDEsCgkJLyogR1BJTyBJbmZvOgoJCQlHUElPMCwxOiAgIEhFRjQwNTIgQTAsQTEKCQkJR1BJTzI6ICAgICBIRUY0MDUyIG5FTkFCTEUKCQkJR1BJTzMtNzogICBuLmMuCgkJCUdQSU84LTEzOiAgSVJEQzM1NyBkYXRhMC01IChkYXRhNiBuLmMuID8pIFtjaGlwIG5vdCBwcmVzZW50IG9uIG15IGNhcmRdCgkJCUdQSU8xNCwxNTogPz8KCQkJR1BJTzE2LTIxOiBuLmMuCgkJCUdQSU8yMiwyMzogPz8KCQkJPz8gICAgICAgOiBtdHU4YjU2ZXAgbWljcm9jb250cm9sbGVyIGZvciBJUiAoR1BJTyB3aXJpbmcgdW5rbm93bikqLwoJfSwKCVtCVFRWX0JPQVJEX0RTUF9UQ1ZJREVPXSA9IHsKCQkvKiBBcnRodXIgVGV0emxhZmYtRGVhcywgRFNQIERlc2lnbiBMdGQgPHNvZnR3YXJlQGRzcGRlc2lnbi5jb20+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg1MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9IQVVQUEFVR0VQVlJdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgUFZSIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMSB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoKCQkuZ3Bpb21hc2sgICAgICAgPSA3LAoJCS5ncGlvbXV4ICAgICAgICA9IHs3fSwKCX0sCglbQlRUVl9CT0FSRF9HVkJDVFY1UENJXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWLUJDVFY1L1BDSSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDBmMGY4MCwKCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMCB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsweDAzMDAwMCwgMHgwMTAwMDAsIDAsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMHgwMjAwMDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sgICAgID0gZ3ZiY3R2NXBjaV9hdWRpbywKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTF4MF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDAvMTUwICg4NzgpIiwgLyogMHgxKDJ8MyktNDVDNi1DMSAqLwoJCS52aWRlb19pbnB1dHMgICA9IDQsICAgICAgICAgICAgICAgICAgLyogaWQtaW5wdXRzLWNsb2NrICovCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAzLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMiwgMCwgMSB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4XSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg0OCkiLCAvKiAweDA0LTU0QzAtQzEgJiBvbGRlciBib2FyZHMgKi8KCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg1NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9PU1BSRVkxMDFfODQ4XSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMSAoODQ4KSIsIC8qIDB4MDUtNDBDMC1DMSAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVkxeDFdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxLzE1MSIsICAgICAgIC8qIDB4MSg0fDUpLTAwMDQtQzQgKi8KCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTF4MV9TVklEXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEgdy8gc3ZpZCIsICAvKiAweCgxNnwxN3wyMCktMDBDNC1DMSAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVkyeHhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwLzIwMS8yNTAvMjUxIiwgIC8qIDB4MSg4fDl8RXxGKS0wMDA0LUM0ICovCgkJLnZpZGVvX2lucHV0cyAgID0gMSwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NTggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfT1NQUkVZMngwX1NWSURdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwLzI1MCIsICAgLyogMHgxKEF8QiktMDBDNC1DMSAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTJ4MF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMTAvMjIwLzIzMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTUwMF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1MDAiLCAgIC8qIDUwMCAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVk1NDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTQwIiwgICAvKiA1NDAgKi8KCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkjaWYgMCAvKiBUT0RPIC4uLiAqLwoJCS5zdmhzICAgICAgICAgICA9IE9TUFJFWTU0MF9TVklEX0FOQUxPRywKCQkubXV4c2VsICAgICAgICAgPSB7ICAgICAgIFtPU1BSRVk1NDBfQ09NUF9BTkFMT0ddID0gMiwKCQkJCQlbT1NQUkVZNTQwX1NWSURfQU5BTE9HXSA9IDMsIH0sCgkjZW5kaWYKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkjaWYgMCAvKiBUT0RPIC4uLiAqLwoJCS5tdXhzZWxfaG9vayAgICA9IG9zcHJleV81NDBfbXV4c2VsLAoJCS5waWN0dXJlX2hvb2sgICA9IG9zcHJleV81NDBfc2V0X3BpY3R1cmUsCgkjZW5kaWYKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDVDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX09TUFJFWTIwMDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwMCIsICAvKiAyMDAwICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsICAgICAgLyogbXVzdCBhdm9pZCwgY29uZmxpY3RzIHdpdGggdGhlIGJ0ODYwICovCgl9LAoJW0JUVFZfQk9BUkRfSURTX0VBR0xFXSA9IHsKCQkvKiBNIEcgQmVyYmVyaWNoIDxiZXJiZXJpY0Bmb3J3aXNzLnVuaS1wYXNzYXUuZGU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIklEUyBFYWdsZSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCgkJLm11eHNlbF9ob29rICAgID0gZWFnbGVfbXV4c2VsLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoJW0JUVFZfQk9BUkRfUElOTkFDTEVTQVRdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFNhdCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAwLCAxLCAyIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9GT1JNQUNfUFJPVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJGb3JtYWMgUHJvVFYgSUkgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMywKCQkuZ3Bpb21hc2sgICAgICAgPSAyLAoJCS8qIFRWLCBDb21wMSwgQ29tcG9zaXRlIG92ZXIgU1ZJRCBjb24sIFNWSUQgKi8KCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDIsIDIsIDAsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCS8qIHNvdW5kIHJvdXRpbmc6CgkJR1BJTz0weDAwLDB4MDEsMHgwMzogbXV0ZSAoPykKCQkweDAyOiBib3RoIFRWIGFuZCByYWRpbyAodHVuZXI6IEZNMTIxNi9JKQoJCVRoZSBjYXJkIGhhcyBvbmJvYXJkIGF1ZGlvIGNvbm5lY3RvcnMgbGFiZWxlZCAiY2Ryb20iIGFuZCAiYm9hcmQiLAoJCW5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCgkJQ2FyZCBsYWNrczogZXh0ZXJuYWwgYXVkaW8gaW4sIHBjaSBzdWJzeXN0ZW0gaWQuCgkqLwoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfTUFDSFRWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiTWFjaFRWIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmdwaW9tdXggICAgICAgID0geyAwLCAxLCAyLCAzfSwKCQkuZ3Bpb211dGUgCT0gNCwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCVtCVFRWX0JPQVJEX0VVUkVTWVNfUElDT0xPXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8iLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfUFYxNTBdID0gewoJCS8qIEx1YyBWYW4gSG9leWxhbmR0IDxsdWNAZS1tYWdpYy5iZT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiUHJvVmlkZW8gUFYxNTAiLCAvKiAweDRmICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9BRF9UVks1MDNdID0gewoJCS8qIEhpcm9zaGkgVGFrZWthd2EgPHNpYW5AYmlnLm9yLmpwPiAqLwoJCS8qIFRoaXMgY2FyZCBsYWNrcyBzdWJzeXN0ZW0gSUQgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQUQtVFZLNTAzIiwgLyogMHg2MyAqLwoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDFlODAwNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkvKiAgICAgICAgICAgICAgICAgIFR1bmVyLCBSYWRpbywgZXh0ZXJuYWwsIGludGVybmFsLCBvZmYsICBvbiAqLwoJCS5ncGlvbXV4ICAgICAgICA9IHsgMHgwOCwgIDB4MGYsICAweDBhLCAgICAgMHgwOCB9LAoJCS5ncGlvbXV0ZSAJPSAweDBmLAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gMiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vawk9IGFkdHZrNTAzX2F1ZGlvLAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSEVSQ1VMRVNfU01fVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJIZXJjdWxlcyBTbWFydCBUViBTdGVyZW8iLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLyogTm90ZXM6CgkJLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAoJCS0gc3RlcmVvIHZhcmlhbnQgdy8gZGF1Z2h0ZXIgYm9hcmQgd2l0aCB0ZGE5ODc0YSBAMHhiMAoJCS0gQXVkaW8gUm91dGluZzoKCQkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQoJCQlleHRlcm5hbCBsaW5lIGluOiB1bmtub3duCgkJLSBPdGhlciBjaGlwczogZW03OHAxNTZlbHAgQCAweDk2IChwcm9iYWJseSBJUiByZW1vdGUgY29udHJvbCkKCQkJaGVmNDA1MyAoaW5zdGVhZCA0MDUyKSBmb3IgdW5rbm93biBmdW5jdGlvbgoJCSovCgl9LAoJW0JUVFZfQk9BUkRfUEFDRVRWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiUGFjZSBUViAmIFJhZGlvIENhcmQiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sIC8qIFR1bmVyLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IgKi8KCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSAxLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS8qIEJ0ODc4LCBCdDgzMiwgRkkxMjQ2IHR1bmVyOyBubyBwY2kgc3Vic3lzdGVtIGlkCgkJb25seSBpbnRlcm5hbCBsaW5lIG91dDogKDRwaW4gaGVhZGVyKSBSR0dMCgkJUmFkaW8gbXVzdCBiZSBkZWNvZGVkIGJ5IG1zcDM0MTBkIChub3Qgcm91dGVkIHRocm91Z2gpKi8KCQkvKgoJCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsICB0b2RvIQoJCSovCgl9LAoJW0JUVFZfQk9BUkRfSVZDMjAwXSA9IHsKCQkvKiBDaHJpcyBXaWxsaW5nIDxjaHJpc0B2aXNsYWIudXN5ZC5lZHUuYXU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIklWQy0yMDAiLAoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweGRmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9YR1VBUkRdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJHcmFuZCBYLUd1YXJkIC8gVHJ1c3QgODE0UENJIiwKCQkudmlkZW9faW5wdXRzICAgPSAxNiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IDQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmdwaW9tYXNrMiAgICAgID0gMHhmZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsMiwyLDIsIDMsMywzLDMsIDEsMSwxLDEsIDAsMCwwLDAgfSwKCQkubXV4c2VsX2hvb2sgICAgPSB4Z3VhcmRfbXV4c2VsLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDY4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX05FQlVMQV9ESUdJVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiwKCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJCS5oYXNfcmVtb3RlCT0gMSwKCQkuZ3Bpb21hc2sJPSAweDFiLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfUFYxNDNdID0gewoJCS8qIEpvcmdlIEJvbmNvbXB0ZSAtIERUSTIgPGpvcmdlQGR0aTIubmV0PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQcm9WaWRlbyBQVjE0MyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9WRDAwOVgxX01JTklESU5dID0gewoJCS8qIE0uS2xhaHJAcGh5dGVjLmRlICovCgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgTWluaURJTiAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkJLnN2aHMgICAgICAgICAgID0gMywKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1ZEMDA5WDFfQ09NQkldID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIENvbWJpIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCQkuc3ZocyAgICAgICAgICAgPSAzLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg2YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9WRDAwOV9NSU5JRElOXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOSBNaW5pRElOIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDEwLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkJLnN2aHMgICAgICAgICAgID0gOSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4MDMsIC8qIGdwaW9tYXNrMiBkZWZpbmVzIHRoZSBiaXRzIHVzZWQgdG8gc3dpdGNoIGF1ZGlvCgkJCQkJdmlhIHRoZSB1cHBlciBuaWJibGUgb2YgbXV4c2VsLiBoZXJlOiB1c2VkIGZvcgoJCQkJCXh0ZXJuYWwgdmlkZW8tbXV4ICovCgkJLm11eHNlbCAgICAgICAgID0geyAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDAxLCAweDAwIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVkQwMDlfQ09NQkldID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IENvbWJpIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDEwLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkJLnN2aHMgICAgICAgICAgID0gOSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4MDMsIC8qIGdwaW9tYXNrMiBkZWZpbmVzIHRoZSBiaXRzIHVzZWQgdG8gc3dpdGNoIGF1ZGlvCgkJCQkJdmlhIHRoZSB1cHBlciBuaWJibGUgb2YgbXV4c2VsLiBoZXJlOiB1c2VkIGZvcgoJCQkJCXh0ZXJuYWwgdmlkZW8tbXV4ICovCgkJLm11eHNlbCAgICAgICAgID0geyAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDAxLCAweDAxIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfSVZDMTAwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiSVZDLTEwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDB4ZGYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCVtCVFRWX0JPQVJEX0lWQzEyMF0gPSB7CgkJLyogSVZDLTEyMEcgLSBBbGFuIEdhcmZpZWxkIDxhbGFuQGZyb21vcmJpdC5jb20+ICovCgkJLm5hbWUgICAgICAgICAgID0gIklWQy0xMjBHIiwKCQkudmlkZW9faW5wdXRzICAgPSAxNiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLCAgICAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS50dW5lciAgICAgICAgICA9IC0xLCAgIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMgICAgICAgICAgID0gLTEsICAgLyogY2FyZCBoYXMgbm8gc3ZocyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCgkJCQkweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwIH0sCgkJLm11eHNlbF9ob29rICAgID0gaXZjMTIwX211eHNlbCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg3MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9QQ19IRFRWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAicGNIRFRWIEhELTIwMDAgVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19BVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfZHZiICAgICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfVFdJTkhBTl9EU1RdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUd2luaGFuIERTVCArIGNsb25lcyIsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub192aWRlbyAgICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9XSU5GQVNUVkMxMDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJXaW5mYXN0IFZDMTAwIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDEsIDMgfSwgLyogVmlkIEluLCBTVmlkIEluLCBWaWQgb3ZlciBTVmlkIGluIGNvbm5lY3RvciAqLwoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoJW0JUVFZfQk9BUkRfVEVWNTYwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiVGVwcHJvIFRFVi01NjAvSW50ZXJWaXNpb24gSVYtNTYwIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDMsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAxLCAxLCAxLCAxIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMzUsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg3NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9TSU1VU19HVkMxMTAwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDIgfSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDNGLAoJCS5tdXhzZWxfaG9vayAgICA9IGd2YzExMDBfbXV4c2VsLAoJfSwKCVtCVFRWX0JPQVJEX05HU1RWX1BMVVNdID0gewoJCS8qIENhcmxvcyBTaWx2YSByM3Bla0ByM3Blay5ob21lbGludXgub3JnIHx8IGNhcmQgMHg3NSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJOR1MgTkdTVFYrIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDAsIDAgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDAsIDAsIDAsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMHgwMDAwMDMsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfTE1MQlQ0XSA9IHsKCQkvKiBodHRwOi8vbGludXhtZWRpYWxhYnMuY29tICovCgkJLm5hbWUgICAgICAgICAgID0gIkxNTEJUNCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwgLyogSU4xLElOMixJTjMsSU40ICovCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RFS1JBTV9NMjA1XSA9IHsKCQkvKiBIZWxtcm9vcyBIYXJyaSA8aGFycmkuaGVsbXJvb3NAcHAuaW5ldC5maT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiVGVrcmFtIE0yMDUgUFJPIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLmdwaW9tYXNrICAgICAgID0gMHg2OCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDB4NjgsIDB4NjgsIDB4NjEsIDB4NjEgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg3OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9DT05UVkZNSV0gPSB7CgkJLyogSmF2aWVyIENlbmRhbiBBcmVzIDxqY2VuZGFuQGx5Y29zLmVzPiAqLwoJCS8qIGJ0ODc4IFRWICsgRk0gd2l0aG91dCBzdWJzeXN0ZW0gSUQgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQ29uY2VwdHJvbmljIENPTlRWRk1pIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMSwgMiwgMiB9LAoJCS5ncGlvbXV0ZSAJPSAzLAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUF0gPSB7CgkJLypFcmljIERFQklFRiA8ZGViaWVmQHRlbGVtc2EuY29tPiovCgkJLypFVVJFU1lTIFBpY29sbyBUZXRyYSA6IDQgQ29uZXhhbnQgRnVzaW9uIDg3OEEsIG5vIGF1ZGlvLCB2aWRlbyBpbnB1dCBzZXQgd2l0aCBhbmFsb2cgbXVsdGlwbGV4ZXJzIEdQSU8gY29udHJvbGVkKi8KCQkvKiBhZGRzIHBpY29sb190ZXRyYV9tdXhzZWwoKSwgcGljb2xvX3RldHJhX2luaXQoKSwgdGhlIGZvbG93aW5nIGRlY2xhcmF0aW9uIHN0cnVjdXJlLCBhbmQgI2RlZmluZSBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQKi8KCQkvKjB4NzkgaW4gYnR0di5oKi8KCQkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8gVGV0cmEiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4M0M8PDE2LC8qU2V0IHRoZSBHUElPWzE4XS0+R1BJT1syMV0gYXMgb3V0cHV0IHBpbi49PT4gZHJpdmUgdGhlIHZpZGVvIGlucHV0cyB0aHJvdWdoIGFuYWxvZyBtdWx0aXBsZXhlcnMqLwoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsyLDIsMiwyfSwvKjg3OEEgaW5wdXQgaXMgYWx3YXlzIE1VWDAsIHNlZSBhYm92ZS4qLwoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5tdXhzZWxfaG9vayAgICA9IHBpY29sb190ZXRyYV9tdXhzZWwsLypSZXF1aXJlZCBhcyBpdCBkb2Vzbid0IGZvbGxvdyB0aGUgY2xhc3NpYyBpbnB1dCBzZWxlY3Rpb24gcG9saWN5Ki8KCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9TUElSSVRfVFZdID0gewoJCS8qIFNwaXJpdCBUViBUdW5lciBmcm9tIGh0dHA6Ly9zcGlyaXRtb2RlbXMuY29tLmF1ICovCgkJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTcGlyaXQgVFYgVHVuZXIiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDAwMDAwZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAgfSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0FWRFZCVF83NzFdID0gewoJCS8qIFdvbGZyYW0gSm9vc3QgPHdvam9AZnJva2FzY2h3ZWkuZGU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgNzcxIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWwgICAgICAgICA9IHsgMyAsIDMgfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDdjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0FWRFZCVF83NjFdID0gewoJCS8qIE1hdHQgSmVzc29uIDxkdmJAamVzc29uLmVjbGlwc2UuY28udWs+ICovCgkJLyogQmFzZWQgb24gdGhlIE5lYnVsYSBjYXJkIGRhdGEgLSBhZGRlZCByZW1vdGUgYW5kIG5ldyBjYXJkIG51bWJlciAtIEJUVFZfQk9BUkRfQVZEVkJUXzc2MSwgc2VlIGFsc28gaXIta2JkLWdwaW8uYyAqLwoJCS5uYW1lICAgICAgICAgICA9ICJBdmVyTWVkaWEgQXZlclRWIERWQi1UIDc2MSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMiwgMCB9LCAvKiBDb21wMCwgUy1WaWRlbywgPywgPyAqLwoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9NQVRSSVhfVklTSU9OU1FdID0gewoJCS8qIGFuZHJlLnNjaHdhcnpAbWF0cml4LXZpc2lvbi5kZSAqLwoJCS5uYW1lICAgICAgICAgICAgID0gIk1BVFJJWCBWaXNpb24gU2lnbWEtU1EiLAoJCS52aWRlb19pbnB1dHMgICAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgICAgPSAwLAoJCS50dW5lciAgICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgICA9IDB4MCwKCQkubXV4c2VsICAgICAgICAgICA9IHsgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKCQkJCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCQkubXV4c2VsX2hvb2sgICAgICA9IHNpZ21hU1FfbXV4c2VsLAoJCS5ncGlvbXV4ICAgICAgICAgID0geyAwIH0sCgkJLm5vX21zcDM0eHggICAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJICA9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NQVRSSVhfVklTSU9OU0xDXSA9IHsKCQkvKiBhbmRyZS5zY2h3YXJ6QG1hdHJpeC12aXNpb24uZGUgKi8KCQkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNMQyIsCgkJLnZpZGVvX2lucHV0cyAgICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICAgID0gMCwKCQkudHVuZXIgICAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCgkJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIgfSwKCQkubXV4c2VsX2hvb2sgICAgICA9IHNpZ21hU0xDX211eHNlbCwKCQkuZ3Bpb211eCAgICAgICAgICA9IHsgMCB9LAoJCS5ub19tc3AzNHh4ICAgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCSAgPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJCS8qIEJUVFZfQk9BUkRfQVBBQ19WSUVXQ09NUCAqLwoJW0JUVFZfQk9BUkRfQVBBQ19WSUVXQ09NUF0gPSB7CgkJLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwoJCS8qIGJ0ODc4IFRWICsgRk0gMHgwMDAwMDAwMCBzdWJzeXN0ZW0gSUQgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQVBBQyBWaWV3Y29tcCA4NzgoQU1BWCkiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDB4RkYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAyLCAwLCAwLCAwIH0sCgkJLmdwaW9tdXRlIAk9IDEwLAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsICAgLyogbWluaXJlbW90ZSB3b3Jrcywgc2VlIGlyLWtiZC1ncGlvLmMgKi8KCQkuaGFzX3JhZGlvICAgICAgPSAxLCAgIC8qIG5vdCBldmVyeSBjYXJkIGhhcyByYWRpbyAqLwoJfSwKCgkJLyogLS0tLSBjYXJkIDB4ODAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfRFZJQ09fRFZCVF9MSVRFXSA9IHsKCQkvKiBDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIExpdGUiLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubm9fdmlkZW8gICAgICAgPSAxLAoJCS5oYXNfZHZiICAgICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVkdFQVJfTVlWQ0RdID0gewoJCS8qIFN0ZXZlbiA8cGhvdG9uMzhAcGNob21lLmNvbS50dz4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiVi1HZWFyIE15VkNEIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4M2YsCgkJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDAgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7MHgzMSwgMHgzMSwgMHgzMSwgMHgzMSB9LAoJCS5ncGlvbXV0ZSAJPSAweDMxLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8gICAgICA9IDAsCgkjaWYgMAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgkjZW5kaWYKCX0sCglbQlRUVl9CT0FSRF9TVVBFUl9UVl0gPSB7CgkJLyogUmljayBDIDxjcnlwdGRyYWdvb25AZ21haWwuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTdXBlciBUViBUdW5lciIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCgkJLmdwaW9tdXggICAgICAgID0geyAwLCAweDAwMDAwMSwwLDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfVElCRVRfQ1MxNl0gPSB7CgkJLyogQ2hyaXMgRmFubmluZyA8dmlkZW80bGludXhAaGF5ZG9uLm5ldD4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IiwKCQkudmlkZW9faW5wdXRzICAgPSAxNiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMgk9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm11eHNlbF9ob29rICAgID0gdGliZXRDUzE2X211eHNlbCwKCX0sCglbQlRUVl9CT0FSRF9LT0RJQ09NXzQ0MDBSXSA9IHsKCQkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KCQkvKgoJCSogTm90ZSB0aGF0LCBiZWNhdXNlIG9mIHRoZSBjYXJkJ3Mgd2lyaW5nLCB0aGUgIm1hc3RlciIKCQkqIEJUODc4QSBjaGlwIChpLmUuIHRoZSBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gKCQkqIGFuZCBtdXN0IHVzZSB0aGlzIGNhcmQgdHlwZSkgaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUKCQkqIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSBjYXJkIHR5cGUgMHg4NSwgd2hvc2UgZGVzY3JpcHRpb24KCQkqIGZvbGxvd3MgdGhpcyBvbmUuICBUaGVyZSBpcyBhIEVFUFJPTSBvbiB0aGUgY2FyZCAod2hpY2ggaXMKCQkqIGNvbm5lY3RlZCB0byB0aGUgSTJDIG9mIG9uZSBvZiB0aG9zZSBvdGhlciBjaGlwcyksIGJ1dCBpcwoJCSogbm90IGN1cnJlbnRseSBoYW5kbGVkLiAgVGhlcmUgaXMgYWxzbyBhIGZhY2lsaXR5IGZvciBhCgkJKiAibW9uaXRvciIsIHdoaWNoIGlzIGFsc28gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KCQkqLwoJCS5uYW1lICAgICAgICAgICA9ICJLb2RpY29tIDQ0MDBSIChtYXN0ZXIpIiwKCQkudmlkZW9faW5wdXRzCT0gMTYsCgkJLmF1ZGlvX2lucHV0cwk9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMJCT0gLTEsCgkJLyogR1BJTyBiaXRzIDAtOSB1c2VkIGZvciBhbmFsb2cgc3dpdGNoOgoJCSogICAwMCAtIDAzOgljYW1lcmEgc2VsZWN0b3IKCQkqICAgMDQgLSAwNjoJY2hhbm5lbCAoY29udHJvbGxlcikgc2VsZWN0b3IKCQkqICAgMDc6CWRhdGEgKDEtPm9uLCAwLT5vZmYpCgkJKiAgIDA4OglzdHJvYmUKCQkqICAgMDk6CXJlc2V0CgkJKiBiaXQgMTYgaXMgaW5wdXQgZnJvbSBzeW5jIHNlcGFyYXRvciBmb3IgdGhlIGNoYW5uZWwKCQkqLwoJCS5ncGlvbWFzawk9IDB4MDAwM2ZmLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLm11eHNlbAkJPSB7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLm5vX3RkYTc0MzIJPSAxLAoJCS5ub190ZGE5ODc1CT0gMSwKCQkubXV4c2VsX2hvb2sJPSBrb2RpY29tNDQwMHJfbXV4c2VsLAoJfSwKCVtCVFRWX0JPQVJEX0tPRElDT01fNDQwMFJfU0xdID0gewoJCS8qIEJpbGwgQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPiAqLwoJCS8qIE5vdGUgdGhhdCwgZm9yIHJlYXNvbnMgdW5rbm93biwgdGhlICJtYXN0ZXIiIEJUODc4QSBjaGlwIChpLmUuIHRoZQoJCSogb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoLCBhbmQgbXVzdCB1c2UgdGhlIGNhcmQgdHlwZSkKCQkqIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSB0aGlzIGNhcmQKCQkqIHR5cGUKCQkqLwoJCS5uYW1lCQk9ICJLb2RpY29tIDQ0MDBSIChzbGF2ZSkiLAoJCS52aWRlb19pbnB1dHMJPSAxNiwKCQkuYXVkaW9faW5wdXRzCT0gMCwKCQkudHVuZXIJCT0gLTEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sJPSAweDAxMDAwMCwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE3NDMyCT0gMSwKCQkubm9fdGRhOTg3NQk9IDEsCgkJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKCX0sCgkJLyogLS0tLSBjYXJkIDB4ODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BRExJTktfUlRWMjRdID0gewoJCS8qIE1pY2hhZWwgSGVuc29uIDxtaGVuc29uQGNsYXJpdHl2aS5jb20+ICovCgkJLyogQWRsaW5rIFJUVjI0IHdpdGggc3BlY2lhbCB1bmxvY2sgY29kZXMgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQWRsaW5rIFJUVjI0IiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCgkJLyogLS0tLSBjYXJkIDB4ODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURV0gPSB7CgkJLyogTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViA1IExpdGUiLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDZYRiwgLyogVERWUy1IMDY0RiAqLwoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxIH0sCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMGUwMDAwNywKCQkuZ3Bpb211eCAgICAgICAgPSB7IDB4MDA0MDAwMDUsIDAsIDB4MDAwMDAwMDEsIDAgfSwKCQkuZ3Bpb211dGUgCT0gMHgwMGMwMDAwNywKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0FDT1JQX1k4NzhGXSA9IHsKCQkvKiBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4gKi8KCQkubmFtZQkJPSAiQWNvcnAgWTg3OEYiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgwMWZlMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuZ3Bpb211eCAgICAgICAgPSB7IDB4MDAxZTAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAgfSwKCQkuZ3Bpb211dGUgCT0gMHgwMDIwMDAsCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfWU1FQ19UVkY2NlQ1X0JfREZGLAoJCS50dW5lcl9hZGRyCT0gMHhjMSA+PjEsCgkJLnJhZGlvX2FkZHIgICAgID0gMHhjMSA+PjEsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDg5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0NPTkNFUFRST05JQ19DVFZGTUkyXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiQ29uY2VwdHJvbmljIENUVkZNaSB2MiIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwMWMwMDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMSwgMiwgMiB9LAoJCS5ncGlvbXV0ZSAJPSAzLAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTkFfOTUzM19ESSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDhhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BWX0JUODc4UF8yRV0gPSB7CgkJLm5hbWUgICAgICAgICAgPSAiUHJvbGluayBQaXhlbHZpZXcgUFYtQlQ4NzhQKyAoUmV2LjJFKSIsCgkJLnZpZGVvX2lucHV0cyAgPSA1LAoJCS5hdWRpb19pbnB1dHMgID0gMSwKCQkudHVuZXIgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgPSAzLAoJCS5ncGlvbWFzayAgICAgID0gMHgwMWZlMDAsCgkJLm11eHNlbCAgICAgICAgPSB7IDIsMywxLDEsLTEgfSwKCQkuZGlnaXRhbF9tb2RlICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCgkJLmdwaW9tdXggICAgICAgPSB7IDB4MDA0MDAsIDB4MTA0MDAsIDB4MDQ0MDAsIDB4ODAwMDAgfSwKCQkuZ3Bpb211dGUgICAgICA9IDB4MTI0MDAsCgkJLm5vX21zcDM0eHggICAgPSAxLAoJCS5wbGwgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgID0gVFVORVJfTEdfUEFMX0ZNLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4OGIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfUFZfTTQ5MDBdID0gewoJCS8qIFPpcmdpbyBGb3J0aWVyIDxzZXJnaW9mb3J0aWVyQHlhaG9vLmNvbS5icj4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiUHJvbGluayBQaXhlbFZpZXcgUGxheVRWIE1QRUcyIFBWLU00OTAwIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4M2YsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggICAgICAgID0geyAweDIxLCAweDIwLCAweDI0LCAweDJjIH0sCgkJLmdwaW9tdXRlIAk9IDB4MjksCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWU1FQ19UVkZfNTUzM01GLAoJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDhjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX09TUFJFWTQ0MF0gID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNDQwIiwKCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCgkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4ZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BU09VTkRfU0tZRVlFXSA9IHsKCQkubmFtZQkJPSAiQXNvdW5kIFNreWV5ZSBQQ1RWIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkJLmdwaW9tdXggCT0geyAyLCAwLCAwLCAwIH0sCgkJLmdwaW9tdXRlIAk9IDEsCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgkJLyogLS0tLSBjYXJkIDB4OGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfU0FCUkVOVF9UVkZNXSA9IHsKCQkubmFtZQkJPSAiU2FicmVudCBUVi1GTSAoYnR0diB2ZXJzaW9uKSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDEwODAwNywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4IAk9IHsgMTAwMDAwLCAxMDAwMDIsIDEwMDAwMiwgMTAwMDAwIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RORl81MzM1TUYsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJLyogLS0tLSBjYXJkIDB4OGYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSEFVUFBBVUdFX0lNUEFDVFZDQl0gPSB7CgkJLm5hbWUJCT0gIkhhdXBwYXVnZSBJbXBhY3RWQ0IgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDB4MGYsIC8qIG9sZDogNyAqLwoJCS5tdXhzZWwJCT0geyAwLCAxLCAzLCAyIH0sIC8qIENvbXBvc2l0ZSAwLTMgKi8KCQkubm9fbXNwMzR4eAk9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUFDSFRWX01BR0lDVFZdID0gewoJCS8qIEp1bGlhbiBDYWxhYnkgPGp1bGlhbi5jYWxhYnlAZ21haWwuY29tPgoJCSAqIFNsaWdodGx5IGRpZmZlcmVudCBmcm9tIG9yaWdpbmFsIE1hY2hUViBkZWZpbml0aW9uICgweDYwKQoKCQkgKiBGSVhNRTogUmVnU3B5IHNheXMgZ3Bpb21hc2sgc2hvdWxkIGJlICIweDAwMWM4MDBmIiwgYnV0IGl0CgkJICogc3R1ZmZzIHVwIHJlbW90ZSBjaGlwLiBCdWcgaXMgYSBwaW4gb24gdGhlIGphZWNzIGlzIG5vdCBzZXQKCQkgKiBwcm9wZXJseSAobWV0aGlua3MpIGNhdXNpbmcgbm8ga2V5dXAgYml0cyBiZWluZyBzZXQgKi8KCgkJLm5hbWUgICAgICAgICAgID0gIk1hZ2ljVFYiLCAvKiByZWJyYW5kZWQgTWFjaFRWICovCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMSwgMiwgMyB9LAoJCS5ncGlvbXV0ZSAJPSA0LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMDlGUjVfUEFMLAoJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYnR0dl9udW1fdHZjYXJkcyA9IEFSUkFZX1NJWkUoYnR0dl90dmNhcmRzKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdOwoKLyoKICogaWRlbnRpZnkgY2FyZAogKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pZGNhcmQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgaW50IGdwaW9iaXRzOwoJaW50IGksdHlwZTsKCXVuc2lnbmVkIHNob3J0IHRtcDsKCgkvKiByZWFkIFBDSSBzdWJzeXN0ZW0gSUQgKi8KCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ0di0+Yy5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgPSB0bXAgPDwgMTY7CglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRtcCk7CglidHYtPmNhcmRpZCB8PSB0bXA7CgoJaWYgKDAgIT0gYnR2LT5jYXJkaWQgJiYgMHhmZmZmZmZmZiAhPSBidHYtPmNhcmRpZCkgewoJCS8qIGxvb2sgZm9yIHRoZSBjYXJkICovCgkJZm9yICh0eXBlID0gLTEsIGkgPSAwOyBjYXJkc1tpXS5pZCAhPSAwOyBpKyspCgkJCWlmIChjYXJkc1tpXS5pZCAgPT0gYnR2LT5jYXJkaWQpCgkJCQl0eXBlID0gaTsKCgkJaWYgKHR5cGUgIT0gLTEpIHsKCQkJLyogZm91bmQgaXQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBkZXRlY3RlZDogJXMgW2NhcmQ9JWRdLCAiCgkJCSAgICAgICAiUENJIHN1YnN5c3RlbSBJRCBpcyAlMDR4OiUwNHhcbiIsCgkJCSAgICAgICBidHYtPmMubnIsY2FyZHNbdHlwZV0ubmFtZSxjYXJkc1t0eXBlXS5jYXJkbnIsCgkJCSAgICAgICBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlidHYtPmMudHlwZSA9IGNhcmRzW3R5cGVdLmNhcmRucjsKCQl9IGVsc2UgewoJCQkvKiA0MDQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCAoVU5LTk9XTilcbiIsCgkJCSAgICAgICBidHYtPmMubnIsIGJ0di0+Y2FyZGlkICYgMHhmZmZmLAoJCQkgICAgICAgKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CgkJCXByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSBhbmQgIgoJCQkgICAgICAgInRoZSBjb3JyZWN0IGNhcmQ9IGluc21vZCBvcHRpb24gdG8gdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tXG4iKTsKCQl9Cgl9CgoJLyogbGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBhdXRvZGV0ZWN0ZWQgdHlwZSAqLwoJaWYgKGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMpCgkJYnR2LT5jLnR5cGU9Y2FyZFtidHYtPmMubnJdOwoKCS8qIHByaW50IHdoaWNoIGNhcmQgY29uZmlnIHdlIGFyZSB1c2luZyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiB1c2luZzogJXMgW2NhcmQ9JWQsJXNdXG4iLGJ0di0+Yy5uciwKCSAgICAgICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlLAoJICAgICAgIGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMKCSAgICAgICA/ICJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKCgkvKiBvdmVyd3JpdGUgZ3BpbyBzdHVmZiA/PyAqLwoJaWYgKFVOU0VUID09IGF1ZGlvYWxsICYmIFVOU0VUID09IGF1ZGlvbXV4WzBdKQoJCXJldHVybjsKCglpZiAoVU5TRVQgIT0gYXVkaW9tdXhbMF0pIHsKCQlncGlvYml0cyA9IDA7CgkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tdXhbaV0gPSBhdWRpb211eFtpXTsKCQkJZ3Bpb2JpdHMgfD0gYXVkaW9tdXhbaV07CgkJfQoJfSBlbHNlIHsKCQlncGlvYml0cyA9IGF1ZGlvYWxsOwoJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbXV4W2ldID0gYXVkaW9hbGw7CgkJfQoJfQoJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayA9IChVTlNFVCAhPSBncGlvbWFzaykgPyBncGlvbWFzayA6IGdwaW9iaXRzOwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKCSAgICAgICBidHYtPmMubnIsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayk7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb211eFtpXSk7Cgl9CglwcmludGsoIlxuIik7Cn0KCi8qCiAqIChtb3N0KSBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbnMgZ29lcyBoZXJlCiAqLwoKLyogU29tZSBNb2R1bGFyIFRlY2hub2xvZ3kgY2FyZHMgaGF2ZSBhbiBlZXByb20sIGJ1dCBubyBzdWJzeXN0ZW0gSUQgKi8Kc3RhdGljIHZvaWQgaWRlbnRpZnlfYnlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSkKewoJaW50IHR5cGUgPSAtMTsKCglpZiAoMCA9PSBzdHJuY21wKGVlcHJvbV9kYXRhLCJHRVQgTU0yMHhQQ1RWIiwxMykpCgkJdHlwZSA9IEJUVFZfQk9BUkRfTU9EVEVDXzIwNTsKCWVsc2UgaWYgKDAgPT0gc3RybmNtcChlZXByb21fZGF0YSsyMCwiUGljb2xvIiw3KSkKCQl0eXBlID0gQlRUVl9CT0FSRF9FVVJFU1lTX1BJQ09MTzsKCWVsc2UgaWYgKGVlcHJvbV9kYXRhWzBdID09IDB4ODQgJiYgZWVwcm9tX2RhdGFbMl09PSAwKQoJCXR5cGUgPSBCVFRWX0JPQVJEX0hBVVBQQVVHRTsgLyogb2xkIGJ0ODQ4ICovCgoJaWYgKC0xICE9IHR5cGUpIHsKCQlidHYtPmMudHlwZSA9IHR5cGU7CgkJcHJpbnRrKCJidHR2JWQ6IGRldGVjdGVkIGJ5IGVlcHJvbTogJXMgW2NhcmQ9JWRdXG4iLAoJCSAgICAgICBidHYtPmMubnIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSwgYnR2LT5jLnR5cGUpOwoJfQp9CgpzdGF0aWMgdm9pZCBmbHl2aWRlb19ncGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCBncGlvLGhhc19yZW1vdGUsaGFzX3JhZGlvLGlzX2NhcHR1cmVfb25seSxpc19scjkwLGhhc190ZGE5ODIwX3RkYTk4MjE7CglpbnQgdHVuZXI9LTEsdHR5cGU7CgoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMCk7Cgl1ZGVsYXkoOCk7ICAvKiB3aXRob3V0IHRoaXMgd2Ugd291bGQgc2VlIHRoZSAweDE4MDAgbWFzayAqLwoJZ3BpbyA9IGdwaW9fcmVhZCgpOwoJLyogRklYTUU6IG11c3QgcmVzdG9yZSBPVVJfRU4gPz8/ICovCgoJLyogYWxsIGNhcmRzIHByb3ZpZGUgR1BJTyBpbmZvLCBzb21lIGhhdmUgYW4gYWRkaXRpb25hbCBlZXByb20KCSAqIExSNTA6IEdQSU8gY29kaW5nIGNhbiBiZSBmb3VuZCBsb3dlciByaWdodCBDUDEgLi4gQ1A5CgkgKiAgICAgICBDUDk9R1BJTzIzIC4uIENQMT1HUElPMTU7IHdoZW4gT1BFTiwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyByZWFkcyAxLgoJICogICAgICAgR1BJTzE0LTEyOiBuLmMuCgkgKiBMUjkwOiBHUDk9R1BJTzIzIC4uIEdQMT1HUElPMTUgKHJpZ2h0IGFib3ZlIHRoZSBidDg3OCkKCgkgKiBsb3dlc3QgMyBieXRlcyBhcmUgcmVtb3RlIGNvbnRyb2wgY29kZXMgKG5vIGhhbmRzaGFrZSBuZWVkZWQpCgkgKiB4eHhGRkY6IE5vIHJlbW90ZSBjb250cm9sIGNoaXAgc29sZGVyZWQKCSAqIHh4eEYwMChMUjI2L0xSNTApLCB4eHhGRTAoTFI5MCk6IFJlbW90ZSBjb250cm9sIGNoaXAgKExWQTAwMSBvciBDRjQ1KSBzb2xkZXJlZAoJICogTm90ZTogU29tZSBiaXRzIGFyZSBBdWRpb19NYXNrICEKCSAqLwoJdHR5cGU9KGdwaW8mMHgwZjAwMDApPj4xNjsKCXN3aXRjaCh0dHlwZSkgewoJY2FzZSAweDA6IHR1bmVyPTI7IC8qIE5UU0MsIGUuZy4gVFBJOE5TUjExUCAqLwoJCWJyZWFrOwoJY2FzZSAweDI6IHR1bmVyPTM5Oy8qIExHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKSBUQVBDLUg3MDFQICovCgkJYnJlYWs7CgljYXNlIDB4NDogdHVuZXI9NTsgLyogUGhpbGlwcyBQQUwgVFBJOFBTQjAyUCwgVFBJOFBTQjEyUCwgVFBJOFBTQjEyRCBvciBGSTEyMTYsIEZNMTIxNiAqLwoJCWJyZWFrOwoJY2FzZSAweDY6IHR1bmVyPTM3Oy8qIExHIFBBTCAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtRzcwMlAgKi8KCQlicmVhazsKCQljYXNlIDB4QzogdHVuZXI9MzsgLyogUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRiAqLwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvX2dwaW86IHVua25vd24gdHVuZXIgdHlwZS5cbiIsIGJ0di0+Yy5ucik7Cgl9CgoJaGFzX3JlbW90ZSAgICAgICAgICA9ICAgZ3BpbyAmIDB4ODAwMDAwOwoJaGFzX3JhZGlvCSAgICA9ICAgZ3BpbyAmIDB4NDAwMDAwOwoJLyogICB1bmtub3duICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwOwoJICogICB1bmtub3duMiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwOyAqLwoJaXNfY2FwdHVyZV9vbmx5ICAgICA9ICEoZ3BpbyAmIDB4MDA4MDAwKTsgLyogR1BJTzE1ICovCgloYXNfdGRhOTgyMF90ZGE5ODIxID0gIShncGlvICYgMHgwMDQwMDApOwoJaXNfbHI5MCAgICAgICAgICAgICA9ICEoZ3BpbyAmIDB4MDAyMDAwKTsgLyogZWxzZSBMUjI2L0xSNTAgKExSMzgvTFI1MSBmLiBjYXB0dXJlIG9ubHkpICovCgkvKgoJICogZ3BpbyAmIDB4MDAxMDAwICAgIG91dHB1dCBiaXQgZm9yIGF1ZGlvIHJvdXRpbmcgKi8KCglpZihpc19jYXB0dXJlX29ubHkpCgkJdHVuZXI9NDsgLyogTm8gdHVuZXIgcHJlc2VudCAqLwoKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gUmFkaW89JXMgUmVtb3RlQ29udHJvbD0lcyBUdW5lcj0lZCBncGlvPTB4JTA2eFxuIiwKCSAgICAgICBidHYtPmMubnIsIGhhc19yYWRpbz8gInllcyI6Im5vICIsIGhhc19yZW1vdGU/ICJ5ZXMiOiJubyAiLCB0dW5lciwgZ3Bpbyk7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvICBMUjkwPSVzIHRkYTk4MjEvdGRhOTgyMD0lcyBjYXB0dXJlX29ubHk9JXNcbiIsCgkJYnR2LT5jLm5yLCBpc19scjkwPyJ5ZXMiOiJubyAiLCBoYXNfdGRhOTgyMF90ZGE5ODIxPyJ5ZXMiOiJubyAiLAoJCWlzX2NhcHR1cmVfb25seT8ieWVzIjoibm8gIik7CgoJaWYodHVuZXIhPSAtMSkgLyogb25seSBzZXQgaWYga25vd24gdHVuZXIgYXV0b2RldGVjdGVkLCBlbHNlIGxldCBpbnNtb2Qgb3B0aW9uIHRocm91Z2ggKi8KCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcjsKCWJ0di0+aGFzX3JhZGlvID0gaGFzX3JhZGlvOwoKCS8qIExSOTAgQXVkaW8gUm91dGluZyBpcyBkb25lIGJ5IDIgaGVmNDA1Miwgc28gQXVkaW9fTWFzayBoYXMgNCBiaXRzOiAweDAwMWM4MAoJICogTFIyNi9MUjUwIG9ubHkgaGFzIDEgaGVmNDA1MiwgQXVkaW9fTWFzayAweDAwMGMwMAoJICogQXVkaW8gb3B0aW9uczogZnJvbSB0dW5lciwgZnJvbSB0ZGE5ODIxL3RkYTk4MjEobW9ubyxzdGVyZW8sc2FwKSwgZnJvbSB0ZGE5ODc0LCBleHQuLCBtdXRlICovCglpZihoYXNfdGRhOTgyMF90ZGE5ODIxKSBidHYtPmF1ZGlvX2hvb2sgPSBsdDk0MTVfYXVkaW87CgkvKiB0b2RvOiBpZihoYXNfdGRhOTg3NCkgYnR2LT5hdWRpb19ob29rID0gZnYyMDAwc19hdWRpbzsgKi8KfQoKc3RhdGljIGludCBtaXJvX3R1bmVybWFwW10gPSB7IDAsNiwyLDMsICAgNCw1LDYsMCwgIDMsMCw0LDUsICA1LDIsMTYsMSwKCQkJICAgICAgIDE0LDIsMTcsMSwgNCwxLDQsMywgIDEsMiwxNiwxLCA0LDQsNCw0IH07CnN0YXRpYyBpbnQgbWlyb19mbXR1bmVyW10gID0geyAwLDAsMCwwLCAgIDAsMCwwLDAsICAwLDAsMCwwLCAgMCwwLDAsMSwKCQkJICAgICAgIDEsMSwxLDEsICAgMSwxLDEsMCwgIDAsMCwwLDAsICAwLDEsMCwwIH07CgpzdGF0aWMgdm9pZCBtaXJvX3Bpbm5hY2xlX2dwaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGlkLG1zcCxncGlvOwoJY2hhciAqaW5mbzsKCglncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKCWdwaW8gPSBncGlvX3JlYWQoKTsKCWlkICAgPSAoKGdwaW8+PjEwKSAmIDYzKSAtMTsKCW1zcCAgPSBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQUREUl9NU1AzNDAwLCAiTVNQMzR4eCIpOwoJaWYgKGlkIDwgMzIpIHsKCQlidHYtPnR1bmVyX3R5cGUgPSBtaXJvX3R1bmVybWFwW2lkXTsKCQlpZiAoMCA9PSAoZ3BpbyAmIDB4MjApKSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJaWYgKCFtaXJvX2ZtdHVuZXJbaWRdKSB7CgkJCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJCQlidHYtPm1ib3hfd2UgICAgPSAoMTw8Nik7CgkJCQlidHYtPm1ib3hfbW9zdCAgPSAoMTw8Nyk7CgkJCQlidHYtPm1ib3hfY2xrICAgPSAoMTw8OCk7CgkJCQlidHYtPm1ib3hfZGF0YSAgPSAoMTw8OSk7CgkJCQlidHYtPm1ib3hfbWFzayAgPSAoMTw8Nil8KDE8PDcpfCgxPDw4KXwoMTw8OSk7CgkJCX0KCQl9IGVsc2UgewoJCQlidHYtPmhhc19yYWRpbyA9IDA7CgkJfQoJCWlmICgtMSAhPSBtc3ApIHsKCQkJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfQk9BUkRfTUlSTykKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9NSVJPUFJPOwoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9QSU5OQUNMRSkKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9QSU5OQUNMRVBSTzsKCQl9CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBtaXJvOiBpZD0lZCB0dW5lcj0lZCByYWRpbz0lcyBzdGVyZW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQrMSwgYnR2LT50dW5lcl90eXBlLAoJCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKCQkgICAgICAgKGJ0di0+aGFzX21hdGNoYm94ID8gIm1hdGNoYm94IiA6ICJmbXR1bmVyIiksCgkJICAgICAgICgtMSA9PSBtc3ApID8gIm5vIiA6ICJ5ZXMiKTsKCX0gZWxzZSB7CgkJLyogbmV3IGNhcmRzIHdpdGggbWljcm90dW5lIHR1bmVyICovCgkJaWQgPSA2MyAtIGlkOwoJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQlzd2l0Y2ggKGlkKSB7CgkJY2FzZSAxOgoJCQlpbmZvID0gIlBBTCAvIG1vbm8iOwoJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfSU5URVJDQVJSSUVSOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUVNTOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJYnR2LT50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1FTUzsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQlpbmZvID0gIlBBTCtTRUNBTSAvIG1vbm8iOwoJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUVNTOwoJCQlicmVhazsKCQljYXNlIDU6CgkJCWluZm8gPSAiTlRTQyAvIG1vbm8iOwoJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfSU5URVJDQVJSSUVSOwoJCQlicmVhazsKCQljYXNlIDY6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19JTlRFUkNBUlJJRVI7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJaW5mbyA9ICJQQUwgLyBzdGVyZW8iOwoJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfSU5URVJDQVJSSUVSOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvID0gIm9vcHM6IHVua25vd24gY2FyZCI7CgkJCWJyZWFrOwoJCX0KCQlpZiAoLTEgIT0gbXNwKQoJCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfUElOTkFDTEVQUk87CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBwaW5uYWNsZS9tdDogaWQ9JWQgaW5mbz1cIiVzXCIgcmFkaW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKCQlidHYtPnR1bmVyX3R5cGUgPSBUVU5FUl9NVDIwMzI7Cgl9Cn0KCi8qIEdQSU8yMSAgIEw6IEJ1ZmZlciBha3RpdiwgSDogQnVmZmVyIGluYWt0aXYgKi8KI2RlZmluZSBMTTE4ODJfU1lOQ19EUklWRSAgICAgMHgyMDAwMDBMCgpzdGF0aWMgdm9pZCBpbml0X2lkc19lYWdsZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglncGlvX2lub3V0KDB4ZmZmZmZmLDB4RkZGRjM3KTsKCWdwaW9fd3JpdGUoMHgyMDAwMjApOwoKCS8qIGZsYXNoIHN0cm9iZSBpbnZlcnRlciA/ISAqLwoJZ3Bpb193cml0ZSgweDIwMDAyNCk7CgoJLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCglncGlvX2JpdHMoTE0xODgyX1NZTkNfRFJJVkUsTE0xODgyX1NZTkNfRFJJVkUpOwoKCS8qIHNldCBCVDg0OCBtdXhlbCB0byAyICovCglidGFvcigoMik8PDUsIH4oMjw8NSksIEJUODQ4X0lGT1JNKTsKfQoKLyogTXV4c2VsIGhlbHBlciBmb3IgdGhlIElEUyBFYWdsZS4KICogdGhlIGVhZ2xlcyBkb2VzIG5vdCB1c2UgdGhlIHN0YW5kYXJkIG11eHNlbC1iaXRzIGJ1dAogKiBoYXMgaXRzIG93biBtdWx0aXBsZXhlciAqLwpzdGF0aWMgdm9pZCBlYWdsZV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglidGFvcigoMik8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKCWdwaW9fYml0cygzLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXV4c2VsW2lucHV0JjddKTsKCiAgICAgICAvKiBjb21wb3NpdGUgKi8KICAgICAgIC8qIHNldCBjaHJvbWEgQURDIHRvIHNsZWVwICovCiAgICAgICBidG9yKEJUODQ4X0FEQ19DX1NMRUVQLCBCVDg0OF9BREMpOwogICAgICAgLyogc2V0IHRvIGNvbXBvc2l0ZSB2aWRlbyAqLwogICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfRV9DT05UUk9MKTsKICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X09fQ09OVFJPTCk7CgogICAgICAgLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCiAgICAgICBncGlvX2JpdHMoTE0xODgyX1NZTkNfRFJJVkUsTE0xODgyX1NZTkNfRFJJVkUpOwp9CgpzdGF0aWMgdm9pZCBndmMxMTAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXN0YXRpYyBjb25zdCBpbnQgbWFza3NbXSA9IHsweDMwLCAweDAxLCAweDEyLCAweDIzfTsKCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlNF0pOwp9CgovKiBMTUxCVDR4IGluaXRpYWxpemF0aW9uIC0gdG8gYWxsb3cgYWNjZXNzIHRvIEdQSU8gYml0cyBmb3Igc2Vuc29ycyBpbnB1dCBhbmQKICAgYWxhcm1zIG91dHB1dAoKICAgR1BJT2JpdCAgICB8IDEwIHwgOSB8IDggfCA3IHwgNiB8IDUgfCA0IHwgMyB8IDIgfCAxIHwgMCB8CiAgIGFzc2lnbm1lbnQgfCBUSSB8IE8zfElOeHwgTzJ8IE8xfElONHxJTjN8SU4yfElOMXwgICB8ICAgfAoKICAgSU4gLSBzZW5zb3IgaW5wdXRzLCBJTnggLSBzZW5zb3IgaW5wdXRzIGFuZCBUSSBYT1JlZCB0b2dldGhlcgogICBPMSxPMixPMyAtIGFsYXJtIG91dHB1dHMgKHJlbGF5cykKCiAgIE9VVCBFTkFCTEUgICAxICAgIDEgICAwICAuIDEgIDEgICAwICAgMCAuIDAgICAwICAgMCAgICAwICAgPSAweDZDMAoKKi8KCnN0YXRpYyB2b2lkIGluaXRfbG1sYnQ0eChzdHJ1Y3QgYnR0diAqYnR2KQp7CglwcmludGsoS0VSTl9ERUJVRyAiTE1MQlQ0eCBpbml0XG4iKTsKCWJ0d3JpdGUoMHgwMDAwMDAsIEJUODQ4X0dQSU9fUkVHX0lOUCk7CglncGlvX2lub3V0KDB4ZmZmZmZmLCAweDAwMDZDMCk7CglncGlvX3dyaXRlKDB4MDAwMDAwKTsKfQoKc3RhdGljIHZvaWQgc2lnbWFTUV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7Cgl1bnNpZ25lZCBpbnQgaW5tdXggPSBpbnB1dCAlIDg7CglncGlvX2lub3V0KCAweGYsIDB4ZiApOwoJZ3Bpb19iaXRzKCAweGYsIGlubXV4ICk7Cn0KCnN0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgNDsKCWdwaW9faW5vdXQoIDM8PDksIDM8PDkgKTsKCWdwaW9fYml0cyggMzw8OSwgaW5tdXg8PDkgKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIGJ0dHZfcmVzZXRfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJLyoKCSAqIEJUODc4QSBoYXMgYSBhdWRpby1yZXNldCByZWdpc3Rlci4KCSAqIDEuIFRoaXMgcmVnaXN0ZXIgaXMgYW4gYXVkaW8gcmVzZXQgZnVuY3Rpb24gYnV0IGl0IGlzIGluCgkgKiAgICBmdW5jdGlvbi0wICh2aWRlbyBjYXB0dXJlKSBhZGRyZXNzIHNwYWNlLgoJICogMi4gSXQgaXMgZW5vdWdoIHRvIGRvIHRoaXMgb25jZSBwZXIgcG93ZXItdXAgb2YgdGhlIGNhcmQuCgkgKiAzLiBUaGVyZSBpcyBhIHR5cG8gaW4gdGhlIENvbmV4YW50IGRvYyAtLSBpdCBpcyBub3QgYXQKCSAqICAgIDB4NUIsIGJ1dCBhdCAweDA1OC4gKEIgaXMgYW4gb2RkLW51bWJlciwgb2J2aW91c2x5IGEgdHlwbyEpLgoJICogLS0vL1NocmlrdW1hciAwMzA2MDkKCSAqLwoJaWYgKGJ0di0+aWQgIT0gODc4KQoJCXJldHVybjsKCglpZiAoYnR0dl9kZWJ1ZykKCQlwcmludGsoImJ0dHYlZDogQlQ4NzhBIEFSRVNFVFxuIixidHYtPmMubnIpOwoJYnR3cml0ZSgoMTw8NyksIDB4MDU4KTsKCXVkZWxheSgxMCk7CglidHdyaXRlKCAgICAgMCwgMHgwNTgpOwp9CgovKiBpbml0aWFsaXphdGlvbiBwYXJ0IG9uZSAtLSBiZWZvcmUgcmVnaXN0ZXJpbmcgaTJjIGJ1cyAqLwp2b2lkIF9fZGV2aW5pdCBidHR2X2luaXRfY2FyZDEoc3RydWN0IGJ0dHYgKmJ0dikKewoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRToKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0U4Nzg6CgkJYm9vdF9tc3AzNHh4KGJ0diw1KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9WT09ET09UVl9GTToKCQlib290X21zcDM0eHgoYnR2LDIwKTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9BVkVSTUVESUE5ODoKCQlib290X21zcDM0eHgoYnR2LDExKTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0VQVlI6CgkJcHZyX2Jvb3QoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVDoKCWNhc2UgQlRUVl9CT0FSRF9BVkRWQlRfNzcxOgoJY2FzZSBCVFRWX0JPQVJEX1BJTk5BQ0xFU0FUOgoJCWJ0di0+dXNlX2kyY19odyA9IDE7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfQURMSU5LX1JUVjI0OgoJCWluaXRfUlRWMjQoIGJ0diApOwoJCWJyZWFrOwoKCX0KCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiKQoJCWJ0dHZfcmVzZXRfYXVkaW8oYnR2KTsKfQoKLyogaW5pdGlhbGl6YXRpb24gcGFydCB0d28gLS0gYWZ0ZXIgcmVnaXN0ZXJpbmcgaTJjIGJ1cyAqLwp2b2lkIF9fZGV2aW5pdCBidHR2X2luaXRfY2FyZDIoc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IHRkYTk4ODc7CglpbnQgYWRkcj1BRERSX1VOU0VUOwoKCWJ0di0+dHVuZXJfdHlwZSA9IC0xOwoKCWlmIChCVFRWX0JPQVJEX1VOS05PV04gPT0gYnR2LT5jLnR5cGUpIHsKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJaWRlbnRpZnlfYnlfZWVwcm9tKGJ0dixlZXByb21fZGF0YSk7Cgl9CgoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX0JPQVJEX01JUk86CgljYXNlIEJUVFZfQk9BUkRfTUlST1BSTzoKCWNhc2UgQlRUVl9CT0FSRF9QSU5OQUNMRToKCWNhc2UgQlRUVl9CT0FSRF9QSU5OQUNMRVBSTzoKCQkvKiBtaXJvL3Bpbm5hY2xlICovCgkJbWlyb19waW5uYWNsZV9ncGlvKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfRkxZVklERU9fOTg6CgljYXNlIEJUVFZfQk9BUkRfTUFYSToKCWNhc2UgQlRUVl9CT0FSRF9MSUZFX0ZMWUtJVDoKCWNhc2UgQlRUVl9CT0FSRF9GTFlWSURFTzoKCWNhc2UgQlRUVl9CT0FSRF9UWVBIT09OX1RWSUVXOgoJY2FzZSBCVFRWX0JPQVJEX0NIUk9OT1NfVlMyOgoJY2FzZSBCVFRWX0JPQVJEX0ZMWVZJREVPXzk4Rk06CgljYXNlIEJUVFZfQk9BUkRfRkxZVklERU8yMDAwOgoJY2FzZSBCVFRWX0JPQVJEX0ZMWVZJREVPOThFWjoKCWNhc2UgQlRUVl9CT0FSRF9DT05GRVJFTkNFVFY6CgljYXNlIEJUVFZfQk9BUkRfTElGRVRFQ185NDE1OgoJCWZseXZpZGVvX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0U6CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4OgoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRVBWUjoKCQkvKiBwaWNrIHVwIHNvbWUgY29uZmlnIGluZm9zIGZyb20gdGhlIGVlcHJvbSAqLwoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQloYXVwcGF1Z2VfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfQVZFUk1FRElBOTg6CgljYXNlIEJUVFZfQk9BUkRfQVZQSE9ORTk4OgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQlhdmVybWVkaWFfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfUFhDMjAwOgoJCWluaXRfUFhDMjAwKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfUElDT0xPX1RFVFJBX0NISVA6CgkJcGljb2xvX3RldHJhX2luaXQoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9WSFg6CgkJYnR2LT5oYXNfcmFkaW8gICAgPSAxOwoJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCQlidHYtPm1ib3hfd2UgICAgICA9IDB4MjA7CgkJYnR2LT5tYm94X21vc3QgICAgPSAwOwoJCWJ0di0+bWJveF9jbGsgICAgID0gMHgwODsKCQlidHYtPm1ib3hfZGF0YSAgICA9IDB4MTA7CgkJYnR2LT5tYm94X21hc2sgICAgPSAweDM4OwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1ZPQklTX0JPT1NUQVI6CgljYXNlIEJUVFZfQk9BUkRfVEVSUkFUVjoKCQl0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjE6CgkJaWYgKGJ0di0+Y2FyZGlkID09IDB4MzAwMjE0NGYpIHsKCQkJYnR2LT5oYXNfcmFkaW89MTsKCQkJcHJpbnRrKCJidHR2JWQ6IHJhZGlvIGRldGVjdGVkIGJ5IHN1YnN5c3RlbSBpZCAoQ1BIMDV4KVxuIixidHYtPmMubnIpOwoJCX0KCQlicmVhazsKICAgICAgIGNhc2UgQlRUVl9CT0FSRF9TVEIyOgoJCWlmIChidHYtPmNhcmRpZCA9PSAweDMwNjAxMjFhKSB7CgkJCS8qIEZpeCB1cCBlbnRyeSBmb3IgM0RGWCBWb29kb29UViAxMDAsCgkJCSAgIHdoaWNoIGlzIGFuIE9FTSBTVEIgY2FyZCB2YXJpYW50LiAqLwoJCQlidHYtPmhhc19yYWRpbz0wOwoJCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfVEVNSUNfTlRTQzsKCQl9CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMXgwOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTF4MF84NDg6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMTAxXzg0ODoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkxeDE6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMXgxX1NWSUQ6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMnh4OgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTJ4MF9TVklEOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTJ4MDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVk1MDA6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZNTQwOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTIwMDA6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCW9zcHJleV9lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9JRFNfRUFHTEU6CgkJaW5pdF9pZHNfZWFnbGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9NT0RURUNfMjA1OgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQltb2R0ZWNfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfTE1MQlQ0OgoJCWluaXRfbG1sYnQ0eChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1RJQkVUX0NTMTY6CgkJdGliZXRDUzE2X2luaXQoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9LT0RJQ09NXzQ0MDBSOgoJCWtvZGljb200NDAwcl9pbml0KGJ0dik7CgkJYnJlYWs7Cgl9CgoJLyogcGxsIGNvbmZpZ3VyYXRpb24gKi8KCWlmICghKGJ0di0+aWQ9PTg0OCAmJiBidHYtPnJldmlzaW9uPT0weDExKSkgewoJCS8qIGRlZmF1bHRzIGZyb20gY2FyZCBsaXN0ICovCgkJaWYgKFBMTF8yOCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnBsbCkgewoJCQlidHYtPnBsbC5wbGxfaWZyZXE9Mjg2MzYzNjM7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsPUJUODQ4X0lGT1JNX1hUMDsKCQl9CgkJaWYgKFBMTF8zNSA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnBsbCkgewoJCQlidHYtPnBsbC5wbGxfaWZyZXE9MzU0Njg5NTA7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsPUJUODQ4X0lGT1JNX1hUMTsKCQl9CgkJLyogaW5zbW9kIG9wdGlvbnMgY2FuIG92ZXJyaWRlICovCgkJc3dpdGNoIChwbGxbYnR2LT5jLm5yXSkgewoJCWNhc2UgMDogLyogbm9uZSAqLwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbCA9IDA7CgkJCWJ0di0+cGxsLnBsbF9pZnJlcSAgID0gMDsKCQkJYnR2LT5wbGwucGxsX29mcmVxICAgPSAwOwoJCQlicmVhazsKCQljYXNlIDE6IC8qIDI4IE1IeiAqLwoJCWNhc2UgMjg6CgkJCWJ0di0+cGxsLnBsbF9pZnJlcSAgID0gMjg2MzYzNjM7CgkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKCQkJYnR2LT5wbGwucGxsX2NyeXN0YWwgPSBCVDg0OF9JRk9STV9YVDA7CgkJCWJyZWFrOwoJCWNhc2UgMjogLyogMzUgTUh6ICovCgkJY2FzZSAzNToKCQkJYnR2LT5wbGwucGxsX2lmcmVxICAgPSAzNTQ2ODk1MDsKCQkJYnR2LT5wbGwucGxsX29mcmVxICAgPSAwOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbCA9IEJUODQ4X0lGT1JNX1hUMTsKCQkJYnJlYWs7CgkJfQoJfQoJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKCgkvKiB0dW5lciBjb25maWd1cmF0aW9uIChmcm9tIGNhcmQgbGlzdCAvIGF1dG9kZXRlY3QgLyBpbnNtb2Qgb3B0aW9uKSAqLwoJaWYgKEFERFJfVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl9hZGRyKQoJCWFkZHIgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX2FkZHI7CgoJaWYgKFVOU0VUICE9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZSkKCQlpZihVTlNFVCA9PSBidHYtPnR1bmVyX3R5cGUpCgkJCWJ0di0+dHVuZXJfdHlwZSA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZTsKCWlmIChVTlNFVCAhPSB0dW5lcltidHYtPmMubnJdKQoJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyW2J0di0+Yy5ucl07CglwcmludGsoImJ0dHYlZDogdXNpbmcgdHVuZXI9JWRcbiIsYnR2LT5jLm5yLGJ0di0+dHVuZXJfdHlwZSk7CgoJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgewoJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CgoJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKCQl0dW5fc2V0dXAudHlwZSA9IGJ0di0+dHVuZXJfdHlwZTsKCQl0dW5fc2V0dXAuYWRkciA9IGFkZHI7CgoJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOwoJfQoKCWlmIChidHYtPnRkYTk4ODdfY29uZikgewoJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFREQTk4ODdfU0VUX0NPTkZJRywKCQkJCQkJCSZidHYtPnRkYTk4ODdfY29uZik7Cgl9CgoJYnR2LT5zdmhzID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5zdmhzOwoJaWYgKHN2aHNbYnR2LT5jLm5yXSAhPSBVTlNFVCkKCQlidHYtPnN2aHMgPSBzdmhzW2J0di0+Yy5ucl07CglpZiAocmVtb3RlW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5oYXNfcmVtb3RlID0gcmVtb3RlW2J0di0+Yy5ucl07CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JhZGlvKQoJCWJ0di0+aGFzX3JhZGlvPTE7CglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfcmVtb3RlKQoJCWJ0di0+aGFzX3JlbW90ZT0xOwoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX2dwaW9pcnEpCgkJYnR2LT5ncGlvaXJxPTE7CglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19ob29rKQoJCWJ0di0+YXVkaW9faG9vaz1idHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2s7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZGlnaXRhbF9tb2RlID09IERJR0lUQUxfTU9ERV9DQU1FUkEpIHsKCQkvKiBkZXRlY3QgQnQ4MzIgY2hpcCBmb3IgcXVhcnR6c2lnaHQgZGlnaXRhbCBjYW1lcmEgKi8KCQlpZiAoKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19BRERSX0JUODMyX0FMVDEsICJCdDgzMiIpID49MCkgfHwKCQkgICAgKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19BRERSX0JUODMyX0FMVDIsICJCdDgzMiIpID49MCkpCgkJCWJvb3RfYnQ4MzIoYnR2KTsKCX0KCglpZiAoIWF1dG9sb2FkKQoJCXJldHVybjsKCgkvKiB0cnkgdG8gZGV0ZWN0IGF1ZGlvL2ZhZGVyIGNoaXBzICovCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fbXNwMzR4eCAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19BRERSX01TUDM0MDAsICJNU1AzNHh4IikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXNwMzR4eF9hbHQgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQUREUl9NU1AzNDAwX0FMVCwgIk1TUDM0eHggKGFsdGVybmF0ZSBhZGRyZXNzKSIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgibXNwMzQwMCIpOwoKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub190ZGE5ODc1ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX0FERFJfVERBOTg3NSwgIlREQTk4NzUiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoInRkYTk4NzUiKTsKCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhNzQzMiAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19BRERSX1REQTc0MzIsICJUREE3NDMyIikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE3NDMyIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmVlZHNfdHZhdWRpbykKCQlyZXF1ZXN0X21vZHVsZSgidHZhdWRpbyIpOwoKCS8qIHR1bmVyIG1vZHVsZXMgKi8KCXRkYTk4ODcgPSAwOwoJaWYgKGJ0di0+dGRhOTg4N19jb25mKQoJCXRkYTk4ODcgPSAxOwoJaWYgKDAgPT0gdGRhOTg4NyAmJiAwID09IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YiAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19BRERSX1REQTk4ODcsICJUREE5ODg3IikgPj0wKQoJCXRkYTk4ODcgPSAxOwoJLyogSHlicmlkIERWQiBjYXJkLCBET0VTIGhhdmUgYSB0ZGE5ODg3ICovCglpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSkKCQl0ZGE5ODg3ID0gMTsKCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCgkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpZiggc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiVGVtaWMgNDA2NiBGWTUiLDE0KSA9PTApIHsKCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfVEVNSUNfNDA2NkZZNV9QQUxfSTsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgaWYgKHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIkFscHMgVFNCQjUiLDEwKSA9PTApIHsKCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfQUxQU19UU0JCNV9QQUxfSTsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgaWYgKHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlBoaWxpcHMgRk0xMjQ2IiwxNCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1BISUxJUFNfTlRTQzsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9IGVsc2UgewoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFVua25vd24gVHVuZXJTdHJpbmc6ICVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0KfQoKc3RhdGljIHZvaWQgX19kZXZpbml0IGhhdXBwYXVnZV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewoJc3RydWN0IHR2ZWVwcm9tIHR2OwoKCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coJmJ0di0+aTJjX2NsaWVudCwgJnR2LCBlZXByb21fZGF0YSk7CglidHYtPnR1bmVyX3R5cGUgPSB0di50dW5lcl90eXBlOwoJYnR2LT5oYXNfcmFkaW8gID0gdHYuaGFzX3JhZGlvOwoKCXByaW50aygiYnR0diVkOiBIYXVwcGF1Z2UgZWVwcm9tIGluZGljYXRlcyBtb2RlbCMlZFxuIiwKCQlidHYtPmMubnIsIHR2Lm1vZGVsKTsKCgkvKgoJICogU29tZSBvZiB0aGUgODc4IGJvYXJkcyBoYXZlIGR1cGxpY2F0ZSBQQ0kgSURzLiBTd2l0Y2ggdGhlIGJvYXJkCgkgKiB0eXBlIGJhc2VkIG9uIG1vZGVsICMuCgkgKi8KCWlmKHR2Lm1vZGVsID09IDY0OTAwKSB7CgkJcHJpbnRrKCJidHR2JWQ6IFN3aXRjaGluZyBib2FyZCB0eXBlIGZyb20gJXMgdG8gJXNcbiIsCgkJCWJ0di0+Yy5uciwKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLAoJCQlidHR2X3R2Y2FyZHNbQlRUVl9CT0FSRF9IQVVQUEFVR0VfSU1QQUNUVkNCXS5uYW1lKTsKCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfSEFVUFBBVUdFX0lNUEFDVFZDQjsKCX0KfQoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZnJlcTsKCglidHYtPmhhc19yYWRpbyAgICA9IDE7CglidHYtPmhhc19tYXRjaGJveCA9IDE7CglidHYtPm1ib3hfd2UgICAgICA9IDB4MTA7CglidHYtPm1ib3hfbW9zdCAgICA9IDB4MjA7CglidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CglidHYtPm1ib3hfZGF0YSAgICA9IDB4MDQ7CglidHYtPm1ib3hfbWFzayAgICA9IDB4M2M7CgoJYnR2LT5tYm94X2lvdyAgICAgPSAxIDw8ICA4OwoJYnR2LT5tYm94X2lvciAgICAgPSAxIDw8ICA5OwoJYnR2LT5tYm94X2NzZWwgICAgPSAxIDw8IDEwOwoKCWZyZXE9ODgwMDAvNjIuNTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogd3JpdGUgMHgxZWQ4ICovCglpZiAoMHgxZWQ4ID09IHRlYTU3NTdfcmVhZChidHYpKSB7CgkJcHJpbnRrKCJidHR2JWQ6IFRlcnJhdGVjIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGZvdW5kLlxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJfSBlbHNlIHsKCQlidHYtPmhhc19yYWRpbyAgICA9IDA7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAwOwoJfQoJcmV0dXJuIDA7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogbWluaW1hbCBib290c3RyYXAgZm9yIHRoZSBXaW5UVi9QVlIgLS0gdXBsb2FkIGFsdGVyYSBmaXJtd2FyZS4KICoKICogVGhlIGhjd2FtYy5yYmYgZmlybXdhcmUgZmlsZSBpcyBvbiB0aGUgSGF1cHBhdWdlIGRyaXZlciBDRC4gIEhhdmUKICogYSBsb29rIGF0IFB2ci9wdnI0NXh4eC5FWEUgKHNlbGYtZXh0cmFjdGluZyB6aXAgYXJjaGl2ZSwgY2FuIGJlCiAqIHVucGFja2VkIHdpdGggdW56aXApLgogKi8KI2RlZmluZSBQVlJfR1BJT19ERUxBWQkJMTAKCiNkZWZpbmUgQlRUVl9BTFRfREFUQQkJMHgwMDAwMDEKI2RlZmluZSBCVFRWX0FMVF9EQ0xLCQkweDEwMDAwMAojZGVmaW5lIEJUVFZfQUxUX05DT05GSUcJMHg4MDAwMDAKCnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9hbHRlcmFfbG9hZChzdHJ1Y3QgYnR0diAqYnR2LCB1OCAqbWljcm8sIHUzMiBtaWNyb2xlbikKewoJdTMyIG47Cgl1OCBiaXRzOwoJaW50IGk7CgoJZ3Bpb19pbm91dCgweGZmZmZmZixCVFRWX0FMVF9EQVRBfEJUVFZfQUxUX0RDTEt8QlRUVl9BTFRfTkNPTkZJRyk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglncGlvX3dyaXRlKEJUVFZfQUxUX05DT05GSUcpOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglmb3IgKG4gPSAwOyBuIDwgbWljcm9sZW47IG4rKykgewoJCWJpdHMgPSBtaWNyb1tuXTsKCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgewoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCQkJaWYgKGJpdHMgJiAweDAxKQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsQlRUVl9BTFRfREFUQSk7CgkJCWVsc2UKCQkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQVRBLDApOwoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKCQkJYml0cyA+Pj0gMTsKCQl9Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJLyogYmVnaW4gQWx0ZXJhIGluaXQgbG9vcCAoTm90IG5lY2Vzc2FyeSxidXQgZG9lc24ndCBodXJ0KSAqLwoJZm9yIChpID0gMCA7IGkgPCAzMCA7IGkrKykgewoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJfQoJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dikKewoJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKCWludCByYzsKCglyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiaGN3YW1jLnJiZiIsICZidHYtPmMucGNpLT5kZXYpOwoJaWYgKHJjICE9IDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAoJCSAgICAgICBidHYtPmMubnIpOwoJCXJldHVybiByYzsKCX0KCXJjID0gcHZyX2FsdGVyYV9sb2FkKGJ0diwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogYWx0ZXJhIGZpcm13YXJlIHVwbG9hZCAlc1xuIiwKCSAgICAgICBidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOwoJcmV0dXJuIHJjOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBzb21lIG9zcHJleSBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IG9zcHJleV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgaW50IGkgPSAwOwogICAgICAgdW5zaWduZWQgY2hhciAqZWUgPSBlZXByb21fZGF0YTsKICAgICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsID0gMDsKCiAgICAgICBpZiAoYnR2LT5jLnR5cGUgPT0gMCkgewoJICAgICAgIC8qIHRoaXMgbWlnaHQgYmUgYW4gYW50aXF1ZS4uLiBjaGVjayBmb3IgTU1BQyBsYWJlbCBpbiBlZXByb20gKi8KCSAgICAgICBpZiAoKGVlWzBdPT0nTScpICYmIChlZVsxXT09J00nKSAmJiAoZWVbMl09PSdBJykgJiYgKGVlWzNdPT0nQycpKSB7CgkJICAgICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOwoJCSAgICAgICBmb3IgKGkgPTA7IGk8MjE7IGkrKykKCQkJICAgICAgIGNoZWNrc3VtICs9IGVlW2ldOwoJCSAgICAgICBpZiAoY2hlY2tzdW0gIT0gZWVbMjFdKQoJCQkgICAgICAgcmV0dXJuOwoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgwXzg0ODsKCQkgICAgICAgZm9yIChpID0gMTI7IGkgPCAyMTsgaSsrKQoJCQkgICAgICAgc2VyaWFsICo9IDEwLCBzZXJpYWwgKz0gZWVbaV0gLSAnMCc7CgkgICAgICAgfQogICAgICAgfSBlbHNlIHsKCSAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOwoJICAgICAgIGludCBvZmZzZXQgPSA0KjE2OwoKCSAgICAgICBmb3IoOyBvZmZzZXQgPCA4KjE2OyBvZmZzZXQgKz0gMTYpIHsKCQkgICAgICAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gPSAwOwoJCSAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCgkJICAgICAgIGZvcihpID0gMDsgaTwxNDsgaSsrKSBjaGVja3N1bSArPSBlZVtpK29mZnNldF07CgkJCSAgICAgICBjaGVja3N1bSA9IH5jaGVja3N1bTsgIC8qIG5vIGlkZWEgd2h5ICovCgkJCSAgICAgICBpZiAoKCgoY2hlY2tzdW0+PjgpJjB4MEZGKSA9PSBlZVtvZmZzZXQrMTRdKSAmJgoJCQkJICAgKChjaGVja3N1bSAmIDB4MEZGKSA9PSBlZVtvZmZzZXQrMTVdKSkgewoJCQkgICAgICAgYnJlYWs7CgkJICAgICAgIH0KCSAgICAgICB9CgoJICAgICAgIGlmIChvZmZzZXQgPj0gOCoxNikKCQkgICAgICAgcmV0dXJuOwoKCSAgICAgICAvKiBmb3VuZCBhIHZhbGlkIGRlc2NyaXB0b3IgKi8KCSAgICAgICB0eXBlID0gKGVlW29mZnNldCs0XTw8OCkgfCAoZWVbb2Zmc2V0KzVdKTsKCgkgICAgICAgc3dpdGNoKHR5cGUpIHsKCgkgICAgICAgLyogODQ4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMDQ6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAwNToKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTEwMV84NDg7CgkJICAgICAgIGJyZWFrOwoKCSAgICAgICAvKiA4NzggYmFzZWQgKi8KCSAgICAgICBjYXNlIDB4MDAxMjoKCSAgICAgICBjYXNlIDB4MDAxMzoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTF4MDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMTQ6CgkgICAgICAgY2FzZSAweDAwMTU6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDE7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE2OgoJICAgICAgIGNhc2UgMHgwMDE3OgoJICAgICAgIGNhc2UgMHgwMDIwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgxX1NWSUQ7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE4OgoJICAgICAgIGNhc2UgMHgwMDE5OgoJICAgICAgIGNhc2UgMHgwMDFFOgoJICAgICAgIGNhc2UgMHgwMDFGOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMnh4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxQToKCSAgICAgICBjYXNlIDB4MDAxQjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTJ4MF9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA0MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTUwMDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNTA6CgkgICAgICAgY2FzZSAweDAwNTY6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVk1NDA7CgkJICAgICAgIC8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDYwOgoJICAgICAgIGNhc2UgMHgwMDcwOgoJICAgICAgIGNhc2UgMHgwMEEwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMngwOwoJCSAgICAgICAvKiBlbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzICovCgkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwoJCSAgICAgICBicmVhazsKCSAgICAgICBkZWZhdWx0OgoJCSAgICAgICAvKiB1bmtub3duLi4ubGVhdmUgZ2VuZXJpYywgYnV0IGdldCBzZXJpYWwgIyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgc2VyaWFsID0gIChlZVtvZmZzZXQrNl0gPDwgMjQpCgkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOV0pOwogICAgICAgfQoKICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCgkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQVZlcm1lZGlhIHNwZWNpZmljIHN0dWZmLCBmcm9tICBia3RyX2NhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0gewoJVFVORVJfUEhJTElQU19OVFNDLCAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUJHKi8sCglUVU5FUl9QSElMSVBTX1BBTCwgICBUVU5FUl9QSElMSVBTX1BBTCAvKiBQQUwtSSovLAoJVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCglUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1NFQ0FNLAoJVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19QQUwsCglUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMyB9OwoKc3RhdGljIGludCB0dW5lcl8xX3RhYmxlW10gPSB7CglUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCglUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvKiBUVU5FUl9URU1JQ19TRUNBTSAqLwoJVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfUEFMfTsKCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0dW5lcl9tYWtlLHR1bmVyX3R2X2ZtLHR1bmVyX2Zvcm1hdCx0dW5lcj0wOwoKCXR1bmVyX21ha2UgICAgICA9IChlZXByb21fZGF0YVsweDQxXSAmIDB4Nyk7Cgl0dW5lcl90dl9mbSAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDE4KSA+PiAzOwoJdHVuZXJfZm9ybWF0ICAgID0gKGVlcHJvbV9kYXRhWzB4NDJdICYgMHhmMCkgPj4gNDsKCWJ0di0+aGFzX3JlbW90ZSA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4MDEpOwoKCWlmICh0dW5lcl9tYWtlID09IDAgfHwgdHVuZXJfbWFrZSA9PSAyKQoJCWlmKHR1bmVyX2Zvcm1hdCA8PTB4MGEpCgkJCXR1bmVyID0gdHVuZXJfMF90YWJsZVt0dW5lcl9mb3JtYXRdOwoJaWYgKHR1bmVyX21ha2UgPT0gMSkKCQlpZih0dW5lcl9mb3JtYXQgPD05KQoJCQl0dW5lciA9IHR1bmVyXzFfdGFibGVbdHVuZXJfZm9ybWF0XTsKCglpZiAodHVuZXJfbWFrZSA9PSA0KQoJCWlmKHR1bmVyX2Zvcm1hdCA9PSAweDA5KQoJCQl0dW5lciA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEM7IC8qIFRBUEMtRzcwMlAgKi8KCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCgkJYnR2LT5jLm5yLGVlcHJvbV9kYXRhWzB4NDFdLGVlcHJvbV9kYXRhWzB4NDJdKTsKCWlmKHR1bmVyKSB7CgkJYnR2LT50dW5lcl90eXBlPXR1bmVyOwoJCXByaW50aygiJWQiLHR1bmVyKTsKCX0gZWxzZQoJCXByaW50aygiVW5rbm93biB0eXBlIik7CglwcmludGsoIiByYWRpbzolcyByZW1vdGUgY29udHJvbDolc1xuIiwKCSAgICAgICB0dW5lcl90dl9mbSAgICAgPyAieWVzIiA6ICJubyIsCgkgICAgICAgYnR2LT5oYXNfcmVtb3RlID8gInllcyIgOiAibm8iKTsKfQoKLyogdXNlZCBvbiBWb29kb28gVFYvRk0gKFZvb2RvbyAyMDApLCBTMCB3aXJlZCB0byAweDEwMDAwICovCnZvaWQgYnR0dl90ZGE5ODgwX3NldG5vcm0oc3RydWN0IGJ0dHYgKmJ0diwgaW50IG5vcm0pCnsKCS8qIGZpeCB1cCBvdXIgY2FyZCBlbnRyeSAqLwoJaWYobm9ybT09VklERU9fTU9ERV9OVFNDKSB7CgkJYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmdwaW9tdXhbVFZBVURJT19JTlBVVF9UVU5FUl09MHg5NTdmZmY7CgkJYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmdwaW9tdXRlPTB4OTU3ZmZmOwoJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIE5UU0NcbiIpOwoJfQoJZWxzZSB7CgkJYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmdwaW9tdXhbVFZBVURJT19JTlBVVF9UVU5FUl09MHg5NDdmZmY7CgkJYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmdwaW9tdXRlPTB4OTQ3ZmZmOwoJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIFBBTFxuIik7Cgl9CgkvKiBzZXQgR1BJTyBhY2NvcmRpbmcgKi8KCWdwaW9fYml0cyhidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrLAoJCSAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbXV4W2J0di0+YXVkaW9dKTsKfQoKCi8qCiAqIHJlc2V0L2VuYWJsZSB0aGUgTVNQIG9uIHNvbWUgSGF1cHBhdWdlIGNhcmRzCiAqIFRoYW5rcyB0byBLecO2c3RpIE3DpGxra2kgKGttYWxra2lAY2MuaHV0LmZpKSEKICoKICogSGF1cHBhdWdlOiAgcGluICA1CiAqIFZvb2RvbzogICAgIHBpbiAyMAogKi8Kc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKQp7CglpbnQgbWFzayA9ICgxIDw8IHBpbik7CgoJZ3Bpb19pbm91dChtYXNrLG1hc2spOwoJZ3Bpb19iaXRzKG1hc2ssMCk7Cgl1ZGVsYXkoMjUwMCk7CglncGlvX2JpdHMobWFzayxtYXNrKTsKCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIm1zcDM0eHgiKTsKCWlmIChidHR2X3ZlcmJvc2UpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBIYXVwcGF1Z2UvVm9vZG9vIG1zcDM0eHg6IHJlc2V0IGxpbmUgIgoJCSAgICAgICAiaW5pdCBbJWRdXG4iLCBidHYtPmMubnIsIHBpbik7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpCnsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogIEltYWdlbmF0aW9uIEwtTW9kZWwgUFhDMjAwIEZyYW1lZ3JhYmJlciAqLwovKiAgVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgcHJvY2VkdXJlIGFzCiAqICB1c2VkIGJ5IEFsZXNzYW5kcm8gUnViaW5pIGluIGhpcyBweGMyMDAKICogIGRyaXZlciwgYnV0IHVzaW5nIEJUVFYgZnVuY3Rpb25zICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dikKewoJc3RhdGljIGludCB2YWxzW10gX19kZXZpbml0ZGF0YSA9IHsgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwZCwgMHgwZCwKCQkJCQkgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKCQkJCQkgICAgMHgwMCB9OwoJdW5zaWduZWQgaW50IGk7CglpbnQgdG1wOwoJdTMyIHZhbDsKCgkvKiBJbml0aWFsaXNlIEdQSU8tY29ubmV2dGVkIHN0dWZmICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAoMTw8MTMpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMyk7CglncGlvX3dyaXRlKDE8PDEzKTsKCS8qIEdQSU8gaW5wdXRzIGFyZSBwdWxsZWQgdXAsIHNvIG5vIG5lZWQgdG8gZHJpdmUKCSAqIHJlc2V0IHBpbiBhbnkgbG9uZ2VyICovCglncGlvX2JpdHMoMHhmZmZmZmYsIDApOwoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJweGMyMDAiKTsKCgkvKiAgd2UgY291bGQvc2hvdWxkIHRyeSBhbmQgcmVzZXQvY29udHJvbCB0aGUgQUQgcG90cz8gYnV0CgkgICAgcmlnaHQgbm93ICB3ZSBzaW1wbHkgIHR1cm5lZCBvZmYgdGhlIGNydXNoaW5nLiAgV2l0aG91dAoJICAgIHRoaXMgdGhlIEFHQyBkcmlmdHMgZHJpZnRzCgkgICAgcmVtZW1iZXIgdGhlIEVOIGlzIHJldmVyc2UgbG9naWMgLS0+CgkgICAgc2V0dGluZyBCVDg0OF9BRENfQUdDX0VOIGRpc2FibGUgdGhlIEFHQwoJICAgIHRib3VsdEBlZWNzLmxlaGlnaC5lZHUKCSovCgoJYnR3cml0ZShCVDg0OF9BRENfUkVTRVJWRUR8QlQ4NDhfQURDX0FHQ19FTiwgQlQ4NDhfQURDKTsKCgkvKglJbml0aWFsaXNlIE1BWDUxNyBEQUMgKi8KCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgREFDIHJlZmVyZW5jZSB2b2x0YWdlIGxldmVsIC4uLlxuIik7CglidHR2X0kyQ1dyaXRlKGJ0diwweDVFLDAsMHg4MCwxKTsKCgkvKglJbml0aWFsaXNlIDEyQzUwOCBQSUMgKi8KCS8qCVRoZSBJMkNXcml0ZSBhbmQgSTJDUmVhZCBjb21tbWFuZHMgYXJlIGFjdHVhbGx5IHRvIHRoZQoJICoJc2FtZSBjaGlwcyAtIGJ1dCB0aGUgUi9XIGJpdCBpcyBpbmNsdWRlZCBpbiB0aGUgYWRkcmVzcwoJICoJYXJndW1lbnQgc28gdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudCAqLwoKCglwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXNpbmcgMTJDNTA4IFBJQyBjaGlwIC4uLlxuIik7CgoJLyogRmlyc3Qgb2YgYWxsLCBlbmFibGUgdGhlIGNsb2NrIGxpbmUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgUFhDMjAwLUYgKi8KCXZhbCA9IGJ0cmVhZChCVDg0OF9HUElPX0RNQV9DVEwpOwoJdmFsIHw9IEJUODQ4X0dQSU9fRE1BX0NUTF9HUENMS01PREU7CglidHdyaXRlKHZhbCwgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKCgkvKiBUaGVuLCBwdXNoIHRvIDAgdGhlIHJlc2V0IHBpbiBsb25nIGVub3VnaCB0byByZXNldCB0aGUgKgoJICogZGV2aWNlIHNhbWUgYXMgYWJvdmUgZm9yIHRoZSByZXNldCBsaW5lLCBidXQgbm90IHRoZSBzYW1lCgkgKiB2YWx1ZSBzZW50IHRvIHRoZSBHUElPLWNvbm5lY3RlZCBzdHVmZgoJICogd2hpY2ggb25lIGlzIHRoZSBnb29kIG9uZT8gKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsKDE8PDIpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMTApOwoJZ3Bpb193cml0ZSgxPDwyKTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxzKTsgaSsrKSB7CgkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwoJCWlmICh0bXAgIT0gLTEpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTwoJCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAoJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKCQl9Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiUFhDMjAwIEluaXRpYWxpc2VkLlxuIik7Cn0KCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoKICogIFRoZSBBZGxpbmsgUlRWLTI0IChha2EgQW5nZWxvKSBoYXMgc29tZSBzcGVjaWFsIGluaXRpYWxpc2F0aW9uIHRvIHVubG9jawogKiAgaXQuIFRoaXMgYXBwYXJlbnRseSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBmb3IgZWFjaCA4NzggY2hpcDoKICoKICogIDEpIHdyaXRlIDB4MDBDM0ZFRkYgdG8gdGhlIEdQSU9fT1VUX0VOIHJlZ2lzdGVyCiAqCiAqICAyKSAgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIDB4MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSAweDBFCiAqICAgICByZWFkIGZyb20gR1BJT19EQVRBIGludG8gYnVmICh1aW50XzMyKQogKiAgICAgIC0gaWYgKCBkYXRhPj4xOCAmIDB4MDEgIT0gMCkgfHwgKCBidWY+PjE5ICYgMHgwMSAhPSAxICkKICogICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCBzdG9wLgogKgogKiAgMykgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSB3cml0ZSAweDQ0MDAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSB3cml0ZSAweDQ0MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIHdyaXRlIDB4MEUKICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCiAqICAgICAgLSBpZiAoIGJ1Zj4+MTggJiAweDAxICkgfHwgKCBidWY+PjE5ICYmIDB4MDEgIT0gMCApCiAqICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZC4KICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnN0YXRpYyB2b2lkCmluaXRfUlRWMjQgKHN0cnVjdCBidHR2ICpidHYpCnsKCXVpbnQzMl90IGRhdGFSZWFkID0gMDsKCWxvbmcgd2F0Y2hkb2dfdmFsdWUgPSAweDBFOwoKCXByaW50ayAoS0VSTl9JTkZPCgkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBpbiBwcm9ncmVzcyAuLi5cbiIsCgkJYnR2LT5jLm5yKTsKCglidHdyaXRlICgweDAwYzNmZWZmLCBCVDg0OF9HUElPX09VVF9FTik7CgoJYnR3cml0ZSAoMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxKTsKCWJ0d3JpdGUgKDB4MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMTApOwoJYnR3cml0ZSAoMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoKCWRhdGFSZWFkID0gYnRyZWFkIChCVDg0OF9HUElPX0RBVEEpOwoKCWlmICgoKChkYXRhUmVhZCA+PiAxOCkgJiAweDAxKSAhPSAwKSB8fCAoKChkYXRhUmVhZCA+PiAxOSkgJiAweDAxKSAhPSAxKSkgewoJCXByaW50ayAoS0VSTl9JTkZPCgkJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMSkgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAoJCQlidHYtPmMubnIsIGRhdGFSZWFkKTsKCX0KCglidHdyaXRlICgweDQ0MDAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMTApOwoJYnR3cml0ZSAoMHg0NDEwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJYnR3cml0ZSAod2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CgoJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDApKSB7CgkJcHJpbnRrIChLRVJOX0lORk8KCQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigyKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCgkJCWJ0di0+Yy5uciwgZGF0YVJlYWQpOwoKCQlyZXR1cm47Cgl9CgoJcHJpbnRrIChLRVJOX0lORk8KCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlLlxuIiwgYnR2LT5jLm5yKTsKfQoKCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBNaXJvIFBybyByYWRpbyBzdHVmZiAtLSB0aGUgdGVhNTc1NyBpcyBjb25uZWN0ZWQgdG8gc29tZSBHUElPIHBvcnRzICAgICAqLwovKgogKiBDb3B5cmlnaHQgKGMpIDE5OTkgQ3NhYmEgSGFsYXN6IDxxZ2VoYWxpQHVuaS1taXNrb2xjLmh1PgogKiBUaGlzIGNvZGUgaXMgcGxhY2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoKICogQnJ1dGFsbHkgaGFja2VkIGJ5IERhbiBTaGVyaWRhbiA8ZGFuLnNoZXJpZGFuQGNvbnRhY3Qub3JnLnVrPiBkanM1MiA4LzMvMDAKICovCgpzdGF0aWMgdm9pZCBidXNfbG93KHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsMCk7Cgl1ZGVsYXkoNSk7CgoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLCAwKTsKCQl1ZGVsYXkoNSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGJ1c19oaWdoKHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsYml0KTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIGludCBidXNfaW4oc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7CgoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KCXJldHVybiBncGlvX3JlYWQoKSAmIChiaXQpOwp9CgovKiBURUE1NzU3IHJlZ2lzdGVyIGJpdHMgKi8KI2RlZmluZSBURUFfRlJFUQkJMDoxNAojZGVmaW5lIFRFQV9CVUZGRVIJCTE1OjE1CgojZGVmaW5lIFRFQV9TSUdOQUxfU1RSRU5HVEgJMTY6MTcKCiNkZWZpbmUgVEVBX1BPUlQxCQkxODoxOAojZGVmaW5lIFRFQV9QT1JUMAkJMTk6MTkKCiNkZWZpbmUgVEVBX0JBTkQJCTIwOjIxCiNkZWZpbmUgVEVBX0JBTkRfRk0JCTAKI2RlZmluZSBURUFfQkFORF9NVwkJMQojZGVmaW5lIFRFQV9CQU5EX0xXCQkyCiNkZWZpbmUgVEVBX0JBTkRfU1cJCTMKCiNkZWZpbmUgVEVBX01PTk8JCTIyOjIyCiNkZWZpbmUgVEVBX0FMTE9XX1NURVJFTwkwCiNkZWZpbmUgVEVBX0ZPUkNFX01PTk8JCTEKCiNkZWZpbmUgVEVBX1NFQVJDSF9ESVJFQ1RJT04JMjM6MjMKI2RlZmluZSBURUFfU0VBUkNIX0RPV04JCTAKI2RlZmluZSBURUFfU0VBUkNIX1VQCQkxCgojZGVmaW5lIFRFQV9TVEFUVVMJCTI0OjI0CiNkZWZpbmUgVEVBX1NUQVRVU19UVU5FRAkwCiNkZWZpbmUgVEVBX1NUQVRVU19TRUFSQ0hJTkcJMQoKLyogTG93LWxldmVsIHN0dWZmICovCnN0YXRpYyBpbnQgdGVhNTc1N19yZWFkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKCWludCB2YWx1ZSA9IDA7CglpbnQgaTsKCgkvKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlYTU3NTcgcmVhZCIpOwoKCWJ1c19sb3coYnR2LGJ0di0+bWJveF93ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCgl1ZGVsYXkoMTApOwoJdGltZW91dD0gamlmZmllcyArIEhaOwoKCS8qIHdhaXQgZm9yIERBVEEgbGluZSB0byBnbyBsb3c7IGVycm9yIGlmIGl0IGRvZXNuJ3QgKi8KCXdoaWxlIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKCQlzY2hlZHVsZSgpOwoJaWYgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiB0ZWE1NzU3OiByZWFkIHRpbWVvdXRcbiIsYnR2LT5jLm5yKTsKCQlyZXR1cm4gLTE7Cgl9CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiIsYnR2LT5jLm5yKTsKCWZvcihpID0gMDsgaSA8IDI0OyBpKyspCgl7CgkJdWRlbGF5KDUpOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoNSk7CgkJZHByaW50aygiJWMiLChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nVCc6Jy0nKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl2YWx1ZSA8PD0gMTsKCQl2YWx1ZSB8PSAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkgPT0gMCk/MDoxOyAgLyogTVNCIGZpcnN0ICovCgkJZHByaW50aygiJWMiLCAoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1MnOidNJyk7Cgl9CglkcHJpbnRrKCJcbmJ0dHYlZDogdGVhNTc1NzogcmVhZCAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCXJldHVybiB2YWx1ZTsKfQoKc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSkKewoJaW50IGk7CglpbnQgcmVnID0gdmFsdWU7CgoJZ3Bpb19pbm91dChidHYtPm1ib3hfbWFzaywgYnR2LT5tYm94X2NsayB8IGJ0di0+bWJveF93ZSB8IGJ0di0+bWJveF9kYXRhKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyB3cml0ZSIpOwoKCWRwcmludGsoImJ0dHYlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfd2UpOwoJZm9yKGkgPSAwOyBpIDwgMjU7IGkrKykKCXsKCQlpZiAocmVnICYgMHgxMDAwMDAwKQoJCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2RhdGEpOwoJCWVsc2UKCQkJYnVzX2xvdyhidHYsYnR2LT5tYm94X2RhdGEpOwoJCXJlZyA8PD0gMTsKCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2Nsayk7CgkJdWRlbGF5KDEwKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJfQoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsgIC8qIHVubXV0ZSAhISEgKi8KCXJldHVybiAwOwp9Cgp2b2lkIHRlYTU3NTdfc2V0X2ZyZXEoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgc2hvcnQgZnJlcSkKewoJZHByaW50aygidGVhNTc1N19zZXRfZnJlcSAlZFxuIixmcmVxKTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogYWRkIDEwLjdNSHogKHNlZSBkb2NzKSAqLwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogd2ludmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyB2b2lkIHdpbnZpZXdfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CgkvKiBQVDIyNTRBIHByb2dyYW1taW5nIEpvbiBUb21icywgam9uQGd0ZS5lc2kudXMuZXMgKi8KCWludCBiaXRzX291dCwgbG9vcHMsIHZvbCwgZGF0YTsKCglpZiAoIXNldCkgewoJCS8qIEZpeGVkIGJ5IExlYW5kcm8gTHVjYXJlbGxhIDxsdWNhQGxpbnV4bWVuZG96YS5vcmcuYXIgKDA3LzMxLzAxKSAqLwoJCXYtPmZsYWdzIHw9IFZJREVPX0FVRElPX1ZPTFVNRTsKCQlyZXR1cm47Cgl9CgoJLyogMzIgbGV2ZWxzIGxvZ2FyaXRobWljICovCgl2b2wgPSAzMiAtICgodi0+dm9sdW1lPj4xMSkpOwoJLyogdW5pdHMgKi8KCWJpdHNfb3V0ID0gKFBUMjI1NF9EQlNfSU5fMj4+KHZvbCU1KSk7CgkvKiB0ZW5zICovCgliaXRzX291dCB8PSAoUFQyMjU0X0RCU19JTl8xMD4+KHZvbC81KSk7CgliaXRzX291dCB8PSBQVDIyNTRfTF9DSEFOTkVMIHwgUFQyMjU0X1JfQ0hBTk5FTDsKCWRhdGEgPSBncGlvX3JlYWQoKTsKCWRhdGEgJj0gfihXSU5WSUVXX1BUMjI1NF9DTEt8IFdJTlZJRVdfUFQyMjU0X0RBVEF8CgkJICBXSU5WSUVXX1BUMjI1NF9TVFJPQkUpOwoJZm9yIChsb29wcyA9IDE3OyBsb29wcyA+PSAwIDsgbG9vcHMtLSkgewoJCWlmIChiaXRzX291dCAmICgxPDxsb29wcykpCgkJCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X0RBVEE7CgkJZWxzZQoJCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9EQVRBOwoJCWdwaW9fd3JpdGUoZGF0YSk7CgkJdWRlbGF5KDUpOwoJCWRhdGEgfD0gV0lOVklFV19QVDIyNTRfQ0xLOwoJCWdwaW9fd3JpdGUoZGF0YSk7CgkJdWRlbGF5KDUpOwoJCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0NMSzsKCQlncGlvX3dyaXRlKGRhdGEpOwoJfQoJZGF0YSB8PSAgV0lOVklFV19QVDIyNTRfU1RST0JFOwoJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKCWdwaW9fd3JpdGUoZGF0YSk7Cgl1ZGVsYXkoMTApOwoJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfU1RST0JFOwoJZ3Bpb193cml0ZShkYXRhKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbW9uby9zdGVyZW8gY29udHJvbCBmb3IgdmFyaW91cyBjYXJkcyAod2hpY2ggZG9uJ3QgdXNlIGkyYyBjaGlwcyBidXQgICAgKi8KLyogY29ubmVjdCBzb21ldGhpbmcgdG8gdGhlIEdQSU8gcGlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyB2b2lkCmd2YmN0djNwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDMwMCwgMHgzMDApOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCgkJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MzAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDIwMDsKLyoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKICoJCQljb24gPSAweDEwMDsgKi8KCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxICB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgpzdGF0aWMgdm9pZApndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCwgY29uOwoKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwoKCXZhbCA9IGdwaW9fcmVhZCgpOwoJaWYgKHNldCkgewoJCWNvbiA9IDB4MDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpIHsKCQkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgewoJCQkJLyogTEFORzEgKyBMQU5HMiAqLwoJCQkJY29uID0gMHgxMDA7CgkJCX0KCQkJZWxzZSB7CgkJCQkvKiBMQU5HMiAqLwoJCQkJY29uID0gMHgzMDA7CgkJCX0KCQl9CgkJaWYgKGNvbiAhPSAodmFsICYgMHgzMDApKSB7CgkJCWdwaW9fYml0cygweDMwMCwgY29uKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImd2YmN0djVwY2kiKTsKCQl9Cgl9IGVsc2UgewoJCXN3aXRjaCAodmFsICYgMHg3MCkgewoJCSAgY2FzZSAweDEwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4MzA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMjsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NTA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMTsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NjA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU87CgkJCWJyZWFrOwoJCSAgY2FzZSAweDcwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQkJYnJlYWs7CgkJICBkZWZhdWx0OgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJfQoJfQp9CgovKgogKiBNYXJpbyBNZWRpbmEgTnVzc2JhdW0gPG1lZGlzb2Z0QGFsb2hhYmJzLm9yZy5teD4KICogIEkgZGlzY292ZXIgdGhhdCBvbiBCVDg0OF9HUElPX0RBVEEgYWRkcmVzcyBhIGJ5dGUgMHhjY2UgZW5hYmxlIHN0ZXJlbywKICogIDB4ZGRlIGVuYWJsZXMgbW9ubyBhbmQgMHhjY2QgZW5hYmxlcyBzYXAKICoKICogUGV0ciBWYW5kcm92ZWMgPFZBTkRST1ZFQHZjLmN2dXQuY3o+CiAqICBQLlMuOiBBdCBsZWFzdCBtYXNrIGluIGxpbmUgYWJvdmUgaXMgd3JvbmcgLSBHUElPIHBpbnMgMywyIHNlbGVjdAogKiAgaW5wdXQvb3V0cHV0IHNvdW5kIGNvbm5lY3Rpb24sIHNvIGJvdGggbXVzdCBiZSBzZXQgZm9yIG91dHB1dCBtb2RlLgogKgogKiBMb29rcyBsaWtlIGl0J3MgbmVlZGVkIG9ubHkgZm9yIHRoZSAidHZwaG9uZSIsIHRoZSAidHZwaG9uZSA5OCIKICogaGFuZGxlcyB0aGlzIHdpdGggYSB0ZGE5ODQwCiAqCiAqLwpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCWludCB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgIC8qIFNBUCAqLwoJCQl2YWwgPSAweDAyOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQl2YWwgPSAweDAxOwoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMTsKCQlyZXR1cm47Cgl9Cn0KCnN0YXRpYyB2b2lkCmF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgIC8qIFNURVJFTyAqLwoJCQl2YWwgPSAweDAyOwoJCWJ0YW9yKHZhbCwgfjB4MDMsIEJUODQ4X0dQSU9fREFUQSk7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiYXZlcm1lZGlhIik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQlyZXR1cm47Cgl9Cn0KCi8qIExpZmV0ZWMgOTQxNSBoYW5kbGluZyAqLwpzdGF0aWMgdm9pZApsdDk0MTVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoZ3Bpb19yZWFkKCkgJiAweDQwMDApIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKCQlyZXR1cm47Cgl9CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAvKiBBMiBTQVAgKi8KCQkJdmFsID0gMHgwMDgwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSAvKiBBMiBzdGVyZW8gKi8KCQkJdmFsID0gMHgwODgwOwoJCWlmICgodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKSB8fAoJCSAgICAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pKQoJCQl2YWwgPSAwOwoJCWdwaW9fYml0cygweDA4ODAsIHZhbCk7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwibHQ5NDE1Iik7Cgl9IGVsc2UgewoJCS8qIGF1dG9kZXRlY3QgZG9lc24ndCB3b3JrIHdpdGggdGhpcyBjYXJkIDotKCAqLwoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQlyZXR1cm47Cgl9Cn0KCi8qIFREQTk4MjEgb24gVGVycmFUVisgQnQ4NDgsIEJ0ODc4ICovCnN0YXRpYyB2b2lkCnRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgY29uID0gMDsKCglpZiAoc2V0KSB7CgkJZ3Bpb19pbm91dCgweDE4MDAwMCwweDE4MDAwMCk7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgwODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MTgwMDAwOwoJCWdwaW9fYml0cygweDE4MDAwMCwgY29uKTsKCQlpZiAoYnR0dl9ncGlvKQoJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZXJyYXR2Iik7Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKd2luZmFzdDIwMDBfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCS8qYnRvciAoMHhjMzIwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsqLwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkJLyogTW9ubyAqLwoJCQl2YWwgPSAweDQyMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQkvKiBTQVAgKi8KCQkJdmFsID0gMHg0MTAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCS8qIFN0ZXJlbyAqLwoJCQl2YWwgPSAweDAyMDAwMDsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDQzMDAwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmZhc3QyMDAwIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgUHJvbGluayBQVi1CVDg3OFArOUIgKFBpeGVsVmlldyBQbGF5VFYgUHJvIEZNK05JQ0FNCiAqIHJldmlzaW9uIDlCIGhhcyBvbi1ib2FyZCBUREE5ODc0QSBzb3VuZCBkZWNvZGVyKS4KICoKICogTm90ZTogVGhlcmUgYXJlIGNhcmQgdmFyaWFudHMgd2l0aG91dCB0ZGE5ODc0YS4gRm9yY2luZyB0aGUgInN0ZXJlbyBzb3VuZCByb3V0ZSIKICogICAgICAgd2lsbCBtdXRlIHRoaXMgY2FyZHMuCiAqLwpzdGF0aWMgdm9pZApwdmJ0ODc4cDliX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDA7CgoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewoJCQl2YWwgPSAweDAxOwoJCX0KCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCgkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgewoJCQl2YWwgPSAweDAyOwoJCX0KCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDAzLHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJwdmJ0ODc4cDliIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CiAqIHNvdW5kIGNvbnRyb2wgZm9yIEZseVZpZGVvIDIwMDBTICh3aXRoIHRkYTk4NzQgZGVjb2RlcikKICogYmFzZWQgb24gcHZidDg3OHA5Yl9hdWRpbygpIC0gdGhpcyBpcyBub3QgdGVzdGVkLCBwbGVhc2UgZml4ISEhCiAqLwpzdGF0aWMgdm9pZApmdjIwMDBzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IHZhbCA9IDB4ZmZmZjsKCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCXsKCQkJdmFsID0gMHgwMDAwOwoJCX0KCQlpZiAoKHYtPm1vZGUgJiAoVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMikpCgkJICAgIHx8ICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSkgewoJCQl2YWwgPSAweDEwODA7IC8qLWRrLT8/PzogMHgwODgwLCAweDAwODAsIDB4MTgwMCAuLi4gKi8KCQl9CgkJaWYgKHZhbCAhPSAweGZmZmYpIHsKCQkJZ3Bpb19iaXRzKDB4MTgwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImZ2MjAwMHMiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogc291bmQgY29udHJvbCBmb3IgQ2Fub3B1cyBXaW5EVlIgUENJCiAqIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+CiAqLwpzdGF0aWMgdm9pZAp3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKCQkJdmFsID0gMHgwNDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJdmFsID0gMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQl2YWwgPSAweDEwMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJdmFsID0gMDsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDE0MDAwMCwgdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmR2ciIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIEFELVRWSzUwMwogKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4KICovCnN0YXRpYyB2b2lkCmFkdHZrNTAzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDB4ZmZmZmZmOwoKCS8qIGJ0YW9yKDB4MWUwMDAwLCB+MHgxZTAwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsgKi8KCglpZiAoc2V0KSB7CgkJLyogYnRvcigqKiosIEJUODQ4X0dQSU9fT1VUX0VOKTsgKi8KCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MDAxODAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MDAwMDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQoJCQljb24gPSAweDAwMDYwMDAwOwoJCWlmIChjb24gIT0gMHhmZmZmZmYpIHsKCQkJZ3Bpb19iaXRzKDB4MWUwMDAwLGNvbik7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCAiYWR0dms1MDMiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyogUmVtb3RlVmlzaW9uIE1YIChydjYwNSkgbXV4c2VsIGhlbHBlciBbTWlndWVsIEZyZWl0YXNdCiAqCiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcnY2MDUgZG9uJ3QgdXNlIGEgbm9ybWFsIG11bHRpcGxleCwgYnV0IGEgY3Jvc3Nwb2ludAogKiBzd2l0Y2ggaW5zdGVhZCAoQ0QyMk0zNDk0RSkuIFRoaXMgSUMgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGNvbm5lY3Rpb25zCiAqIGJldHdlZW4gWG4gKGlucHV0KSBhbmQgWW4gKG91dHB1dCkgcGlucy4gV2UgbmVlZCB0byBjbGVhciBhbnkgZXhpc3RpbmcKICogY29ubmVjdGlvbiBwcmlvciB0byBlc3RhYmxpc2ggYSBuZXcgb25lLCBwdWxzaW5nIHRoZSBTVFJPQkUgcGluLgogKgogKiBUaGUgYm9hcmQgaGFyZHdpcmUgWTAgKHhwb2ludCkgdG8gTVVYMSBhbmQgTVVYT1VUIHRvIFlpbi4KICogR1BJTyBwaW5zIGFyZSB3aXJlZCBhczoKICogIEdQSU9bMDozXSAtIEFYWzA6M10gKHhwb2ludCkgLSBQMVswOjNdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bNDo2XSAtIEFZWzA6Ml0gKHhwb2ludCkgLSBQMVs0OjZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bN10gICAtIERBVEEgKHhwb2ludCkgICAgLSBQMVs3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzhdICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNV0gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s5XSAgIC0gUkVTRVQgKHhwb2ludCkgICAtIFAzWzZdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bMTBdICAtIFNUUk9CRSAoeHBvaW50KSAgLSBQM1s3XSAobWljcm9jb250cm9sZXIpCiAqICBHUElOVFIgICAgLSAgICAgICAgICAgICAgICAgIC0gUDNbNF0gKG1pY3JvY29udHJvbGVyKQogKgogKiBUaGUgbWljcm9jb250cm9sZXIgaXMgYSA4MEMzMiBsaWtlLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gY2hhbmdlIHhwb2ludAogKiBjb25maWd1cmF0aW9uIGVpdGhlciBkaXJlY3RseSAoYXMgd2UgYXJlIGRvaW5nKSBvciB1c2luZyB0aGUgbWljcm9jb250cm9sZXIKICogd2hpY2ggaXMgYWxzbyB3aXJlZCB0byBJMkMgaW50ZXJmYWNlLiBJIGhhdmUgbm8gZnVydGhlciBpbmZvIG9uIHRoZQogKiBtaWNyb2NvbnRyb2xlciBmZWF0dXJlcywgb25lIHdvdWxkIG5lZWQgdG8gZGlzYXNzZW1ibHkgdGhlIGZpcm13YXJlLgogKiBub3RlOiB0aGUgdmVuZG9yIHJlZnVzZWQgdG8gZ2l2ZSBhbnkgaW5mb3JtYXRpb24gb24gdGhpcyBwcm9kdWN0LCBhbGwKICogICAgICAgdGhhdCBzdHVmZiB3YXMgZm91bmQgdXNpbmcgYSBtdWx0aW1ldGVyISA6KQogKi8Kc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLyogcmVzZXQgYWxsIGNvbmVjdGlvbnMgKi8KCWdwaW9fYml0cygweDIwMCwweDIwMCk7CgltZGVsYXkoMSk7CglncGlvX2JpdHMoMHgyMDAsMHgwMDApOwoJbWRlbGF5KDEpOwoKCS8qIGNyZWF0ZSBhIG5ldyBjb25lY3Rpb24gKi8KCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CglncGlvX2JpdHMoMHg0ODAsMHg0ODApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4NDgwLDB4MDgwKTsKCW1kZWxheSgxKTsKfQoKLyogVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IG11eHNlbCBoZWxwZXIgW0NocmlzIEZhbm5pbmddCiAqCiAqIFRoZSBDUzE2IChhdmFpbGFibGUgb24gZUJheSBjaGVhcCkgaXMgYSBQQ0kgYm9hcmQgd2l0aCBmb3VyIEZ1c2lvbgogKiA4NzhBIGNoaXBzLCBhIFBDSSBicmlkZ2UsIGFuIEF0bWVsIG1pY3JvY29udHJvbGxlciwgZm91ciBzeW5jIHNlcGVyYXRvcgogKiBjaGlwcywgdGVuIGVpZ2h0IGlucHV0IGFuYWxvZyBtdWx0aXBsZXhvcnMsIGEgbm90IGNoaXAgYW5kIGEgZmV3CiAqIG90aGVyIGNvbXBvbmVudHMuCiAqCiAqIDE2IGlucHV0cyBvbiBhIHNlY29uZGFyeSBicmFja2V0IGFyZSBwcm92aWRlZCBhbmQgY2FuIGJlIHNlbGVjdGVkCiAqIGZyb20gZWFjaCBvZiB0aGUgZm91ciBjYXB0dXJlIGNoaXBzLiAgVHdvIG9mIHRoZSBlaWdodCBpbnB1dAogKiBtdWx0aXBsZXhvcnMgYXJlIHVzZWQgdG8gc2VsZWN0IGZyb20gYW55IG9mIHRoZSAxNiBpbnB1dCBzaWduYWxzLgogKgogKiBVbnN1cHBvcnRlZCBoYXJkd2FyZSBjYXBhYmlsaXRpZXM6CiAqICAuIEEgdmlkZW8gb3V0cHV0IG1vbml0b3Igb24gdGhlIHNlY29uZGFyeSBicmFja2V0IGNhbiBiZSBzZWxlY3RlZCBmcm9tCiAqICAgIG9uZSBvZiB0aGUgODc4QSBjaGlwcy4KICogIC4gQW5vdGhlciBwYXNzdGhyb3VnaCBidXQgSSBoYXZlbid0IHNwZW50IGFueSB0aW1lIGludmVzdGlnYXRpbmcgaXQuCiAqICAuIERpZ2l0YWwgSS9PIChsb2dpYyBsZXZlbCBjb25uZWN0ZWQgdG8gR1BJTykgaXMgYXZhaWxhYmxlIGZyb20gYW4KICogICAgb25ib2FyZCBoZWFkZXIuCiAqCiAqIFRoZSBvbiBjaGlwIGlucHV0IG11eCBzaG91bGQgYWx3YXlzIGJlIHNldCB0byAyLgogKiBHUElPWzE2OjE5XSAtIFZpZGVvIGlucHV0IHNlbGVjdGlvbgogKiBHUElPWzA6M10gICAtIFZpZGVvIG91dHB1dCBtb25pdG9yIHNlbGVjdCAob25seSBhdmFpbGFibGUgZnJvbSBvbmUgODc4QSkKICogR1BJT1s/Oj9dICAgLSBEaWdpdGFsIEkvTy4KICoKICogVGhlcmUgaXMgYW4gQVRNRUwgbWljcm9jb250cm9sbGVyIHdpdGggYW4gODAzMSBjb3JlIG9uIGJvYXJkLiAgSSBoYXZlIG5vdAogKiBkZXRlcm1pbmVkIHdoYXQgZnVuY3Rpb24gKGlmIGFueSkgaXQgcHJvdmlkZXMuICBXaXRoIHRoZSBtaWNyb2NvbnRyb2xsZXIKICogYW5kIHN5bmMgc2VwZXJhdG9yIGNoaXBzIGEgZ3Vlc3MgaXMgdGhhdCBpdCBtaWdodCBoYXZlIHRvIGRvIHdpdGggdmlkZW8KICogc3dpdGNoaW5nIGFuZCBtYXliZSBzb21lIGRpZ2l0YWwgSS9PLgogKi8Kc3RhdGljIHZvaWQgdGliZXRDUzE2X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHZpZGVvIG11eCAqLwoJZ3Bpb19iaXRzKDB4MGYwMDAwLCBpbnB1dCA8PCAxNik7Cn0KCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCS8qIGVuYWJsZSBncGlvIGJpdHMsIG1hc2sgb2J0YWluZWQgdmlhIGJ0U3B5ICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAweDBmN2ZmZik7CglncGlvX3dyaXRlKDB4MGY3ZmZmKTsKfQoKLyoKICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBmb3IgdGhlIEtvZGljb20tNDQwMHIgZ2V0IGEgbGl0dGxlIG1pbmQtdHdpc3RpbmcuCiAqIFRoZXJlIGlzIGEgIm1hc3RlciIgY29udHJvbGxlciBhbmQgdGhyZWUgInNsYXZlIiBjb250cm9sbGVycywgdG9nZXRoZXIKICogYW4gYW5hbG9nIHN3aXRjaCB3aGljaCBjb25uZWN0cyBhbnkgb2YgMTYgY2FtZXJhcyB0byBhbnkgb2YgdGhlIEJUODdBJ3MuCiAqIFRoZSBhbmFsb2cgc3dpdGNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlICJtYXN0ZXIiLCBidXQgdGhlIGRldGVjdGlvbiBvcmRlcgogKiBvZiB0aGUgZm91ciBCVDg3OEEgY2hpcHMgaXMgaW4gYW4gb3JkZXIgd2hpY2ggSSBqdXN0IGRvbid0IHVuZGVyc3RhbmQuCiAqIFRoZSAibWFzdGVyIiBpcyBhY3R1YWxseSB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgdG8gYmUgZGV0ZWN0ZWQuICBUaGUKICogbG9naWMgb24gdGhlIGJvYXJkIHVzZXMgbG9naWNhbCBudW1iZXJzIGZvciB0aGUgNCBjb250cm9sZXJzLCBidXQKICogdGhvc2UgbnVtYmVycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZS4gIFdoZW4gd29ya2luZwogKiB3aXRoIHRoZSBhbmFsb2cgc3dpdGNoLCB3ZSBuZWVkIHRvICJtYXAiIGZyb20gdGhlIGRldGVjdGlvbiBzZXF1ZW5jZQogKiBvdmVyIHRvIHRoZSBib2FyZCdzIGxvZ2ljYWwgY29udHJvbGxlciBudW1iZXIuICBUaGlzIG1hcHBpbmcgc2VxdWVuY2UKICogaXMgezMsIDAsIDIsIDF9LCBpLmUuIHRoZSBmaXJzdCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkIGlzIGxvZ2ljYWwKICogdW5pdCAzLCB0aGUgc2Vjb25kICh3aGljaCBpcyB0aGUgbWFzdGVyKSBpcyBsb2dpY2FsIHVuaXQgMCwgZXRjLgogKiBXZSBuZWVkIHRvIG1haW50YWluIHRoZSBzdGF0dXMgb2YgdGhlIGFuYWxvZyBzd2l0Y2ggKHdoaWNoIG9mIHRoZSAxNgogKiBjYW1lcmFzIGlzIGNvbm5lY3RlZCB0byB3aGljaCBvZiB0aGUgNCBjb250cm9sbGVycykuICBSYXRoZXIgdGhhbgogKiBhZGQgdG8gdGhlIGJ0dHYgc3RydWN0dXJlIGZvciB0aGlzLCB3ZSB1c2UgdGhlIGRhdGEgcmVzZXJ2ZWQgZm9yCiAqIHRoZSBtYm94ICh1bnVzZWQgZm9yIHRoaXMgY2FyZCB0eXBlKS4KICovCgovKgogKiBGaXJzdCBhIHJvdXRpbmUgdG8gc2V0IHRoZSBhbmFsb2cgc3dpdGNoLCB3aGljaCBjb250cm9scyB3aGljaCBjYW1lcmEKICogaXMgcm91dGVkIHRvIHdoaWNoIGNvbnRyb2xsZXIuICBUaGUgc3dpdGNoIGNvbXByaXNlcyBhbiBYLWFkZHJlc3MKICogKGdwaW8gYml0cyAwLTMsIHJlcHJlc2VudGluZyB0aGUgY2FtZXJhLCByYW5naW5nIGZyb20gMC0xNSksIGFuZCBhCiAqIFktYWRkcmVzcyAoZ3BpbyBiaXRzIDQtNiwgcmVwcmVzZW50aW5nIHRoZSBjb250cm9sbGVyLCByYW5naW5nIGZyb20gMC0zKS4KICogQSBkYXRhIHZhbHVlIChncGlvIGJpdCA3KSBvZiAnMScgZW5hYmxlcyB0aGUgc3dpdGNoLCBhbmQgJzAnIGRpc2FibGVzCiAqIHRoZSBzd2l0Y2guICBBIFNUUk9CRSBiaXQgKGdwaW8gYml0IDgpIGxhdGNoZXMgdGhlIGRhdGEgdmFsdWUgaW50byB0aGUKICogc3BlY2lmaWVkIGFkZHJlc3MuICBUaGUgaWRlYSBpcyB0byBzZXQgdGhlIGFkZHJlc3MgYW5kIGRhdGEsIHRoZW4gYnJpbmcKICogU1RST0JFIGhpZ2gsIGFuZCBmaW5hbGx5IGJyaW5nIFNUUk9CRSBiYWNrIHRvIGxvdy4KICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl93cml0ZShzdHJ1Y3QgYnR0diAqYnR2LAoJCQkgICAgICAgdW5zaWduZWQgY2hhciB4YWRkciwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeWFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGEpIHsKCXVuc2lnbmVkIGludCB1ZGF0YTsKCgl1ZGF0YSA9IChkYXRhIDw8IDcpIHwgKCh5YWRkciYzKSA8PCA0KSB8ICh4YWRkciYweGYpOwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiB3cml0ZSBBRERSIGFuZCBEQVQgKi8KCWdwaW9fYml0cygweDFmZiwgdWRhdGEgfCAoMSA8PCA4KSk7CS8qIHN0cm9iZSBoaWdoICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhKTsJCS8qIHN0cm9iZSBsb3cgKi8KfQoKLyoKICogTmV4dCB0aGUgbXV4IHNlbGVjdC4gIEJvdGggdGhlICJtYXN0ZXIiIGFuZCAic2xhdmUiICdjYXJkcycgKGNvbnRyb2xsZXJzKQogKiB1c2UgdGhpcyByb3V0aW5lLiAgVGhlIHJvdXRpbmUgZmluZHMgdGhlICJtYXN0ZXIiIGZvciB0aGUgY2FyZCwgbWFwcwogKiB0aGUgY29udHJvbGxlciBudW1iZXIgZnJvbSB0aGUgZGV0ZWN0ZWQgcG9zaXRpb24gb3ZlciB0byB0aGUgbG9naWNhbAogKiBudW1iZXIsIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0byB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIGhvdXNla2VlcHMKICogdGhlIGxvY2FsIGNvcHkgb2YgdGhlIHN3aXRjaCBpbmZvcm1hdGlvbi4gIFRoZSBwYXJhbWV0ZXIgJ2lucHV0JyBpcyB0aGUKICogcmVxdWVzdGVkIGNhbWVyYSBudW1iZXIgKDAgLSAxNSkuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJY2hhciAqc3dfc3RhdHVzOwoJaW50IHhhZGRyLCB5YWRkcjsKCXN0cnVjdCBidHR2ICptY3RscjsKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hcFs0XSA9IHszLCAwLCAyLCAxfTsKCgltY3RsciA9IG1hc3RlcltidHYtPmMubnJdOwoJaWYgKG1jdGxyID09IE5VTEwpIHsJLyogaWdub3JlIGlmIG1hc3RlciBub3QgeWV0IGRldGVjdGVkICovCgkJcmV0dXJuOwoJfQoJeWFkZHIgPSAoYnR2LT5jLm5yIC0gbWN0bHItPmMubnIgKyAxKSAmIDM7IC8qIHRoZSAnJicgaXMgZm9yIHNhZmV0eSAqLwoJeWFkZHIgPSBtYXBbeWFkZHJdOwoJc3dfc3RhdHVzID0gKGNoYXIgKikoJm1jdGxyLT5tYm94X3dlKTsKCXhhZGRyID0gaW5wdXQgJiAweGY7CgkvKiBDaGVjayBpZiB0aGUgY29udHJvbGxlci9jYW1lcmEgcGFpciBoYXMgY2hhbmdlZCwgZWxzZSBpZ25vcmUgKi8KCWlmIChzd19zdGF0dXNbeWFkZHJdICE9IHhhZGRyKQoJewoJCS8qICJvcGVuIiB0aGUgb2xkIHN3aXRjaCwgImNsb3NlIiB0aGUgbmV3IG9uZSwgc2F2ZSB0aGUgbmV3ICovCgkJa29kaWNvbTQ0MDByX3dyaXRlKG1jdGxyLCBzd19zdGF0dXNbeWFkZHJdLCB5YWRkciwgMCk7CgkJc3dfc3RhdHVzW3lhZGRyXSA9IHhhZGRyOwoJCWtvZGljb200NDAwcl93cml0ZShtY3RsciwgeGFkZHIsIHlhZGRyLCAxKTsKCX0KfQoKLyoKICogRHVyaW5nIGluaXRpYWxpc2F0aW9uLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBhbmFsb2cgc3dpdGNoLiAgV2UKICogYWxzbyBwcmVzZXQgdGhlIHN3aXRjaCB0byBtYXAgdGhlIDQgY29ubmVjdG9ycyBvbiB0aGUgY2FyZCB0byB0aGUKICogKnVzZXIncyogKHNlZSBhYm92ZSBkZXNjcmlwdGlvbiBvZiBrb2RpY29tNDQwMHJfbXV4c2VsKSBjaGFubmVscwogKiAwIHRocm91Z2ggMwogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJY2hhciAqc3dfc3RhdHVzID0gKGNoYXIgKikoJmJ0di0+bWJveF93ZSk7CglpbnQgaXg7CgoJZ3Bpb19pbm91dCgweDAwMDNmZiwgMHgwMDAzZmYpOwoJZ3Bpb193cml0ZSgxIDw8IDkpOwkvKiByZXNldCBNVVggKi8KCWdwaW9fd3JpdGUoMCk7CgkvKiBQcmVzZXQgY2FtZXJhIDAgdG8gdGhlIDQgY29udHJvbGxlcnMgKi8KCWZvciAoaXg9MDsgaXg8NDsgaXgrKykgewoJCXN3X3N0YXR1c1tpeF0gPSBpeDsKCQlrb2RpY29tNDQwMHJfd3JpdGUoYnR2LCBpeCwgaXgsIDEpOwoJfQoJLyoKCSAqIFNpbmNlIHRoaXMgaXMgdGhlICJtYXN0ZXIiLCB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKCSAqIG90aGVyIHRocmVlIGNvbnRyb2xsZXIgY2hpcHMnIHBvaW50ZXJzIHRvIHRoaXMgc3RydWN0dXJlCgkgKiBmb3IgbGF0ZXIgdXNlIGluIHRoZSBtdXhzZWwgcm91dGluZS4KCSAqLwoJaWYgKChidHYtPmMubnI8MSkgfHwgKGJ0di0+Yy5ucj5CVFRWX01BWC0zKSkKCSAgICByZXR1cm47CgltYXN0ZXJbYnR2LT5jLm5yLTFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucl0gICA9IGJ0djsKCW1hc3RlcltidHYtPmMubnIrMV0gPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzJdID0gYnR2Owp9CgovKiBUaGUgR3JhbmR0ZWMgWC1HdWFyZCBmcmFtZWdyYWJiZXIgY2FyZCB1c2VzIHR3byBEdWFsIDQtY2hhbm5lbAogKiB2aWRlbyBtdWx0aXBsZXhlcnMgdG8gcHJvdmlkZSB1cCB0byAxNiB2aWRlbyBpbnB1dHMuIFRoZXNlCiAqIG11bHRpcGxleGVycyBhcmUgY29udHJvbGxlZCBieSB0aGUgbG93ZXIgOCBHUElPIHBpbnMgb2YgdGhlCiAqIGJ0ODc4LiBUaGUgbXVsdGlwbGV4ZXJzIHByb2JhYmx5IFBlcmljb20gUEk1VjMzMVEgb3Igc2ltaWxhci4KCiAqIHh4eDAgaXMgcGluIHh4eCBvZiBtdWx0aXBsZXhlciBVNSwKICogeXl5MSBpcyBwaW4geXl5IG9mIG11bHRpcGxleGVyIFUyCiAqLwojZGVmaW5lIEVOQTAgICAgMHgwMQojZGVmaW5lIEVOQjAgICAgMHgwMgojZGVmaW5lIEVOQTEgICAgMHgwNAojZGVmaW5lIEVOQjEgICAgMHgwOAoKI2RlZmluZSBJTjEwICAgIDB4MTAKI2RlZmluZSBJTjAwICAgIDB4MjAKI2RlZmluZSBJTjExICAgIDB4NDAKI2RlZmluZSBJTjAxICAgIDB4ODAKCnN0YXRpYyB2b2lkIHhndWFyZF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglzdGF0aWMgY29uc3QgaW50IG1hc2tzW10gPSB7CgkJRU5CMCwgRU5CMHxJTjAwLCBFTkIwfElOMTAsIEVOQjB8SU4wMHxJTjEwLAoJCUVOQTAsIEVOQTB8SU4wMCwgRU5BMHxJTjEwLCBFTkEwfElOMDB8SU4xMCwKCQlFTkIxLCBFTkIxfElOMDEsIEVOQjF8SU4xMSwgRU5CMXxJTjAxfElOMTEsCgkJRU5BMSwgRU5BMXxJTjAxLCBFTkExfElOMTEsIEVOQTF8SU4wMXxJTjExLAoJfTsKCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlMTZdKTsKfQpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKlRoaXMgaXMgdGhlIHZpZGVvIGlucHV0IHJlZGlyZWN0aW9uIGZvbmN0aW9uYWxpdHkgOiBJIERJRCBOT1QgVVNFRCBJVC4gKi8KCWJ0d3JpdGUgKDB4MDg8PDE2LEJUODQ4X0dQSU9fREFUQSk7LypHUElPWzE5XSBbPT0+IDQwNTMgQitDXSBzZXQgdG8gMSAqLwoJYnR3cml0ZSAoMHgwNDw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMThdIFs9PT4gNDA1MyBBXSAgc2V0IHRvIDEqLwp9CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwgKHN0cnVjdCBidHR2KiBidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoKCWRwcmludGsgKEtFUk5fREVCVUcgImJ0dHYlZCA6IHBpY29sb190ZXRyYV9tdXhzZWwgPT4gIGlucHV0ID0gJWRcbiIsYnR2LT5jLm5yLGlucHV0KTsKCS8qSnVzdCBzZXQgdGhlIHJpZ2h0IHBhdGggaW4gdGhlIGFuYWxvZyBtdWx0aXBsZXhlcnMgOiBjaGFubmVsIDEgLT4gNCA9PT4gQW5hbG9nIE11eCA9PT4gTVVYMCovCgkvKkdQSU9bMjBdJkdQSU9bMjFdIHVzZWQgdG8gY2hvb3NlIHRoZSByaWdodCBpbnB1dCovCglidHdyaXRlIChpbnB1dDw8MjAsQlQ4NDhfR1BJT19EQVRBKTsKCn0KCi8qCiAqIGl2YzEyMF9tdXhzZWwgW0FkZGVkIGJ5IEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT5dCiAqCiAqIFRoZSBJVkMxMjBHIHNlY3VyaXR5IGNhcmQgaGFzIDQgaTJjIGNvbnRyb2xsZWQgVERBODU0MCBtYXRyaXgKICogc3dpY2hlcnMgdG8gcHJvdmlkZSAxNiBjaGFubmVscyB0byBNVVgwLiBUaGUgVERBODU0MCdzIGhhdmUKICogNCBpbmRlcGVuZGVudCBvdXRwdXRzIGFuZCBhcyBzdWNoIHRoZSBJVkMxMjBHIGFsc28gaGFzIHRoZQogKiBvcHRpb25hbCAiTW9uaXRvciBPdXQiIGJ1cy4gVGhpcyBhbGxvd3MgdGhlIGNhcmQgdG8gYmUgbG9va2luZwogKiBhdCBvbmUgaW5wdXQgd2hpbGUgdGhlIG1vbml0b3IgaXMgbG9va2luZyBhdCBhbm90aGVyLgogKgogKiBTaW5jZSBJJ3ZlIGNvdWxkbid0IGJlIGJvdGhlcmVkIGZpZ3VyaW5nIG91dCBob3cgdG8gYWRkIGFuCiAqIGluZGVwZW5kYW50IG11eHNlbCBmb3IgdGhlIG1vbml0b3IgYnVzLCBJJ3ZlIGp1c3Qgc2V0IGl0IHRvCiAqIHdoYXRldmVyIHRoZSBjYXJkIGlzIGxvb2tpbmcgYXQuCiAqCiAqICBPVVQwIG9mIHRoZSBUREE4NTQwJ3MgaXMgY29ubmVjdGVkIHRvIE1VWDAgICAgICAgICAoMHgwMykKICogIE9VVDEgb2YgdGhlIFREQTg1NDAncyBpcyBjb25uZWN0ZWQgdG8gIk1vbml0b3IgT3V0IiAgICAgICAgKDB4MEMpCiAqCiAqICBUREE4NTQwX0FMVDMgSU4wLTMgPSBDaGFubmVsIDEzIC0gMTYgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDQgSU4wLTMgPSBDaGFubmVsIDEgLSA0ICAgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDUgSU4wLTMgPSBDaGFubmVsIDUgLSA4ICAgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDYgSU4wLTMgPSBDaGFubmVsIDkgLSAxMiAgICAgICAgICAgICAgICAoMHgwMykKICoKICovCgovKiBBbGwgNyBwb3NzaWJsZSBzdWItaWRzIGZvciB0aGUgVERBODU0MCBNYXRyaXggU3dpdGNoZXIgKi8KI2RlZmluZSBJMkNfVERBODU0MCAgICAgICAgMHg5MAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDEgICAweDkyCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMiAgIDB4OTQKI2RlZmluZSBJMkNfVERBODU0MF9BTFQzICAgMHg5NgojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDQgICAweDk4CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNSAgIDB4OWEKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ2ICAgMHg5YwoKc3RhdGljIHZvaWQgaXZjMTIwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIFNpbXBsZSBtYXRocyAqLwoJaW50IGtleSA9IGlucHV0ICUgNDsKCWludCBtYXRyaXggPSBpbnB1dCAvIDQ7CgoJZHByaW50aygiYnR0diVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAoJCWJ0di0+Yy5uciwgaW5wdXQsIG1hdHJpeCwga2V5KTsKCgkvKiBIYW5kbGVzIHRoZSBpbnB1dCBzZWxlY3Rpb24gb24gdGhlIFREQTg1NDAncyAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMykgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMCkgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDUsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMSkgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDYsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMikgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoKCS8qIEhhbmRsZXMgdGhlIG91dHB1dCBlbmFibGVzIG9uIHRoZSBUREE4NTQwJ3MgKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQzLCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDMpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEzIC0gMTYgKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ0LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDApID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEtNCAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDUsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMSkgPyAweDAzIDogMHgwMCksIDEpOyAgLyogNS04ICovCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvKiA5LTEyICovCgoJLyogU2VsZWN0cyBNVVgwIGZvciBpbnB1dCBvbiB0aGUgODc4ICovCglidGFvcigoMCk8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKfQoKCi8qIFBYQzIwMCBtdXhzZWwgaGVscGVyCiAqIGx1a2VAc3lzZW5nLmFudS5lZHUuYXUKICogYW5vdGhlciB0cmFuc3BsYW50CiAqIGZyb20gQWxlc3NhbmRybyBSdWJpbmkgKHJ1YmluaUBsaW51eC5pdCkKICoKICogVGhlcmUgYXJlIDQga2luZHMgb2YgY2FyZHM6CiAqIFBYQzIwMEwgd2hpY2ggaXMgYnQ4NDgKICogUFhDMjAwRiB3aGljaCBpcyBidDg0OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKICogUFhDMjAwQUwgd2hpY2ggaXMgYnQ4NzgKICogUFhDMjAwQUYgd2hpY2ggaXMgYnQ4Nzggd2l0aCBQSUMgY29udHJvbGxpbmcgbXV4CiAqLwojZGVmaW5lIFBYX0NGR19QWEMyMDBGIDB4MDEKI2RlZmluZSBQWF9GTEFHX1BYQzIwMEEgIDB4MDAwMDEwMDAgLyogYSBweGMyMDBBIGlzIGJ0LTg3OCBiYXNlZCAqLwojZGVmaW5lIFBYX0kyQ19QSUMgICAgICAgMHgwZgojZGVmaW5lIFBYX1BYQzIwMEFfQ0FSRElEIDB4MjAwYTEyOTUKI2RlZmluZSBQWF9JMkNfQ01EX0NGRyAgIDB4MDAKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglpbnQgcmM7Cglsb25nIG11eDsKCWludCBiaXRtYXNrOwoJdW5zaWduZWQgY2hhciBidWZbMl07CgoJLyogUmVhZCBQSUMgY29uZmlnIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGEgUFhDMjAwRiAqLwoJLyogUFhfSTJDX0NNRF9DRkcqLwoJYnVmWzBdPTA7CglidWZbMV09MDsKCXJjPWJ0dHZfSTJDV3JpdGUoYnR2LChQWF9JMkNfUElDPDwxKSxidWZbMF0sYnVmWzFdLDEpOwoJaWYgKHJjKSB7CgkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IHBpYyBjZmcgd3JpdGUgZmFpbGVkOiVkXG4iLCBidHYtPmMubnIscmMpOwoJICAvKiBub3QgUFhDID8gZG8gbm90aGluZyAqLwoJICByZXR1cm47Cgl9CgoJcmM9YnR0dl9JMkNSZWFkKGJ0diwoUFhfSTJDX1BJQzw8MSksTlVMTCk7CglpZiAoIShyYyAmIFBYX0NGR19QWEMyMDBGKSkgewoJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBub3QgUFhDMjAwRiByYzolZCBcbiIsIGJ0di0+Yy5ucixyYyk7CgkgIHJldHVybjsKCX0KCgoJLyogVGhlIG11bHRpcGxleGVyIGluIHRoZSAyMDBGIGlzIGhhbmRsZWQgYnkgdGhlIEdQSU8gcG9ydCAqLwoJLyogZ2V0IGNvcnJlY3QgbWFwcGluZyBiZXR3ZWVuIGlucHV0cyAgKi8KCS8qICBtdXggPSBidHR2X3R2Y2FyZHNbYnR2LT50eXBlXS5tdXhzZWxbaW5wdXRdICYgMzsgKi8KCS8qICoqIG5vdCBuZWVkZWQhPyAgICovCgltdXggPSBpbnB1dDsKCgkvKiBtYWtlIHN1cmUgb3V0cHV0IHBpbnMgYXJlIGVuYWJsZWQgKi8KCS8qIGJpdG1hc2s9MHgzMGY7ICovCgliaXRtYXNrPTB4MzAyOwoJLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgUFhDMjAwQSAqLwoJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKSAgewoJICAgYml0bWFzayBePSAweDE4MDsgLyogdXNlIDcgYW5kIDksIG5vdCA4IGFuZCA5ICovCgkgICBiaXRtYXNrIHw9IDc8PDQ7IC8qIHRoZSBEQUMgKi8KCX0KCWJ0d3JpdGUoYml0bWFzaywgQlQ4NDhfR1BJT19PVVRfRU4pOwoKCWJpdG1hc2sgPSBidHJlYWQoQlQ4NDhfR1BJT19EQVRBKTsKCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MjgwKSB8ICgobXV4ICYgMikgPDwgOCkgfCAoKG11eCAmIDEpIDw8IDcpOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MzAwKSB8ICgobXV4ICYgMykgPDwgOCk7CglidHdyaXRlKGJpdG1hc2ssQlQ4NDhfR1BJT19EQVRBKTsKCgkvKgoJICogV2FzICJ0byBiZSBzYWZlLCBzZXQgdGhlIGJ0ODQ4IHRvIGlucHV0IDAiCgkgKiBBY3R1YWxseSwgc2luY2UgaXQncyBvayBhdCBsb2FkIHRpbWUsIGJldHRlciBub3QgbWVzc2luZwoJICogd2l0aCB0aGVzZSBiaXRzIChvbiBQWEMyMDBBRiB5b3UgbmVlZCB0byBzZXQgbXV4IDIgaGVyZSkKCSAqCgkgKiBuZWVkZWQgYmVjYXVzZSBidHR2LWRyaXZlciBzZXRzIG11eCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCgkgKi8KCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYnRhb3IoMjw8NSwgfkJUODQ4X0lGT1JNX01VWFNFTCwgQlQ4NDhfSUZPUk0pOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYnRhbmQofkJUODQ4X0lGT1JNX01VWFNFTCxCVDg0OF9JRk9STSk7CgoJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogc2V0dGluZyBpbnB1dCBjaGFubmVsIHRvOiVkXG4iLCBidHYtPmMubnIsKGludCltdXgpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBtb3RoZXJib2FyZCBjaGlwc2V0IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCBfX2RldmluaXQgYnR0dl9jaGVja19jaGlwc2V0KHZvaWQpCnsKCWludCBwY2lwY2lfZmFpbCA9IDA7CglzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9GQUlMKQoJCXBjaXBjaV9mYWlsID0gMTsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgKFBDSVBDSV9UUklUT058UENJUENJX05BVE9NQXxQQ0lQQ0lfVklBRVRCRikpCgkJdHJpdG9uMSA9IDE7CglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9WU0ZYKQoJCXZzZnggPSAxOwojaWZkZWYgUENJUENJX0FMSU1BR0lLCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9BTElNQUdJSykKCQlsYXRlbmN5ID0gMHgwQTsKI2VuZGlmCgoKCS8qIHByaW50IHdhcm5pbmdzIGFib3V0IGFueSBxdWlya3MgZm91bmQgKi8KCWlmICh0cml0b24xKQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIG5lZWRzIEVUQkYgZW5hYmxlZC5cbiIpOwoJaWYgKHZzZngpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgVlNGWCBlbmFibGVkLlxuIik7CglpZiAocGNpcGNpX2ZhaWwpIHsKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBidHR2IGFuZCB5b3VyIGNoaXBzZXQgbWF5IG5vdCB3b3JrICIKCQkJCQkJCSJ0b2dldGhlci5cbiIpOwoJCWlmICghbm9fb3ZlcmxheSkgewoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBvdmVybGF5IHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKCQkJbm9fb3ZlcmxheSA9IDE7CgkJfSBlbHNlIHsKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogb3ZlcmxheSBmb3JjZWQuIFVzZSB0aGlzICIKCQkJCQkJIm9wdGlvbiBhdCB5b3VyIG93biByaXNrLlxuIik7CgkJfQoJfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogcGNpIGxhdGVuY3kgZml4dXAgWyVkXVxuIixsYXRlbmN5KTsKCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDEsIGRldikpKSB7CgkJdW5zaWduZWQgY2hhciBiOwoJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MywgJmIpOwoJCWlmIChidHR2X2RlYnVnKQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZTogODI0NDFGWCBOYXRvbWEsICIKCQkJICAgICAgICJidWZjb249MHglMDJ4XG4iLGIpOwoJfQp9CgppbnQgX19kZXZpbml0IGJ0dHZfaGFuZGxlX2NoaXBzZXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgY2hhciBjb21tYW5kOwoKCWlmICghdHJpdG9uMSAmJiAhdnNmeCAmJiBVTlNFVCA9PSBsYXRlbmN5KQoJCXJldHVybiAwOwoKCWlmIChidHR2X3ZlcmJvc2UpIHsKCQlpZiAodHJpdG9uMSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBlbmFibGluZyBFVEJGICg0MzBGWC9WUDMgY29tcGF0aWJpbHR5KVxuIixidHYtPmMubnIpOwoJCWlmICh2c2Z4ICYmIGJ0di0+aWQgPj0gODc4KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIFZTRlhcbiIsYnR2LT5jLm5yKTsKCQlpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzZXR0aW5nIHBjaSB0aW1lciB0byAlZFxuIiwKCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKCX0KCglpZiAoYnR2LT5pZCA8IDg3OCkgewoJCS8qIGJ0ODQ4IChtaXMpdXNlcyBhIGJpdCBpbiB0aGUgaXJxIG1hc2sgZm9yIGV0YmYgKi8KCQlpZiAodHJpdG9uMSkKCQkJYnR2LT50cml0b24xID0gQlQ4NDhfSU5UX0VUQkY7Cgl9IGVsc2UgewoJCS8qIGJ0ODc4IGhhcyBhIGJpdCBpbiB0aGUgcGNpIGNvbmZpZyBzcGFjZSBmb3IgaXQgKi8KCQlwY2lfcmVhZF9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCAmY29tbWFuZCk7CgkJaWYgKHRyaXRvbjEpCgkJCWNvbW1hbmQgfD0gQlQ4NzhfRU5fVEJGWDsKCQlpZiAodnNmeCkKCQkJY29tbWFuZCB8PSBCVDg3OF9FTl9WU0ZYOwoJCXBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCBjb21tYW5kKTsKCX0KCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCXBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBQQ0lfTEFURU5DWV9USU1FUiwgbGF0ZW5jeSk7CglyZXR1cm4gMDsKfQoKCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogYy1iYXNpYy1vZmZzZXQ6IDgKICogRW5kOgogKi8K