ZGlmZiAtLWdpdCBhL2JvYXJkL2lubm9rb20vTWFrZWZpbGUgYi9ib2FyZC9pbm5va29tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmU3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9pbm5va29tL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gaW5ub2tvbS5vIGZsYXNoLm8KK1NPQkpTCTo9IG1lbXNldHVwLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgY3J2ICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ1BQRkxBR1MpICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykgPiAkQAorCistaW5jbHVkZSAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2lubm9rb20vY29uZmlnLm1rIGIvYm9hcmQvaW5ub2tvbS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ZmZmZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2lubm9rb20vY29uZmlnLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IGMwMDAnODAwMCwgZW50cnkgYzAwMCc4MDAwCisjCisjIHdlIGxvYWQgb3Vyc2VsZiB0byBjMTcwJzAwMDAsIHRoZSB1cHBlciAxIE1CIG9mIHNlY29uZCBiYW5rCisjCisjIGRvd25sb2FkIGFyZWFzIGlzIGM4MDAnMDAwMAorIworCisjIFRoaXMgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgVS1Cb290IGxpdmVzIGluIGZsYXNoOgorI1RFWFRfQkFTRSA9IDAKKworIyBGSVhNRTogYXJtYm9vdCBkb2VzIG9ubHkgd29yayBjb3JyZWN0bHkgd2hlbiBiZWluZyBjb21waWxlZAorIyBmb3IgdGhlIGFkZHJlc3NlcyBfYWZ0ZXJfIHJlbG9jYXRpb24gdG8gUkFNISEgT3RoZXJ3aGlzZSB0aGUKKyMgLmJzcyBzZWdtZW50IGlzIGFzc3VtZWQgaW4gZmxhc2guLi4KK1RFWFRfQkFTRSA9IDB4YTFmZTAwMDAKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvaW5ub2tvbS9mbGFzaC5jIGIvYm9hcmQvaW5ub2tvbS9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTk3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9pbm5va29tL2ZsYXNoLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEt5bGUgSGFycmlzLCBOZXh1cyBUZWNobm9sb2dpZXMsIEluYy4ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4LCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworI2RlZmluZSBGTEFTSF9CQU5LX1NJWkUgMHgwMjAwMDAwMAorI2RlZmluZSBNQUlOX1NFQ1RfU0laRSAgMHg0MDAwMCAgICAgICAgIC8qIDJ4MTYgPSAyNTZrIHBlciBzZWN0b3IgKi8KKworZmxhc2hfaW5mb190ICAgIGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKworLyoqCisgKiBmbGFzaF9pbml0OiAtIGluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBmbGFzaCBjaGlwcworICoKKyAqIEByZXR1cm46IHNpemUgb2YgdGhlIGZsYXNoCisgKi8KKwordWxvbmcgZmxhc2hfaW5pdCh2b2lkKQoreworCWludCBpLCBqOworCXVsb25nIHNpemUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7IGkrKykgeworCQl1bG9uZyBmbGFzaGJhc2UgPSAwOworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0KKwkgIAkJKElOVEVMX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spIHwKKwkgIAkJKElOVEVMX0lEXzI4RjEyOEozICYgRkxBU0hfVFlQRU1BU0spOworCQlmbGFzaF9pbmZvW2ldLnNpemUgPSBGTEFTSF9CQU5LX1NJWkU7CisJCWZsYXNoX2luZm9baV0uc2VjdG9yX2NvdW50ID0gQ0ZHX01BWF9GTEFTSF9TRUNUOworCQltZW1zZXQoZmxhc2hfaW5mb1tpXS5wcm90ZWN0LCAwLCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCisJCXN3aXRjaCAoaSkgeworCQkJY2FzZSAwOgorCQkJCWZsYXNoYmFzZSA9IFBIWVNfRkxBU0hfMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcGFuaWMoImNvbmZpZ3VyZWQgdG8gbWFueSBmbGFzaCBiYW5rcyFcbiIpOworCQkJCWJyZWFrOworCQl9CisJCWZvciAoaiA9IDA7IGogPCBmbGFzaF9pbmZvW2ldLnNlY3Rvcl9jb3VudDsgaisrKSB7CisJCQlmbGFzaF9pbmZvW2ldLnN0YXJ0W2pdID0gZmxhc2hiYXNlICsgaipNQUlOX1NFQ1RfU0laRTsKKwkJfQorCQlzaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKKwl9CisKKwkvKiBQcm90ZWN0IG1vbml0b3IgYW5kIGVudmlyb25tZW50IHNlY3RvcnMgKi8KKwlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQlDRkdfRkxBU0hfQkFTRSwKKwkJCUNGR19GTEFTSF9CQVNFICsgX2FybWJvb3RfZW5kX2RhdGEgLSBfYXJtYm9vdF9zdGFydCwKKwkJCSZmbGFzaF9pbmZvWzBdKTsKKworI2lmZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKKwlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQlDRkdfRU5WX0FERFIsCisJCQlDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NJWkUgLSAxLAorCQkJJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisKKwlyZXR1cm4gc2l6ZTsKK30KKworCisvKioKKyAqIGZsYXNoX3ByaW50X2luZm86IC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZsYXNoIHNpdHVhdGlvbgorICoKKyAqIEBwYXJhbSBpbmZvOgorICovCisKK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyAgKGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaj0wOyBqPENGR19NQVhfRkxBU0hfQkFOS1M7IGorKykgeworCisJCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworCisJCQljYXNlIChJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKToKKwkJCQlwcmludGYoIkludGVsOiAiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCJVbmtub3duIFZlbmRvciAiKTsKKwkJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCisJCQljYXNlIChJTlRFTF9JRF8yOEYxMjhKMyAmIEZMQVNIX1RZUEVNQVNLKToKKwkJCQlwcmludGYoIjI4RjEyOEozICgxMjhNYml0KVxuIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCQkJCXJldHVybjsKKwkJfQorCisJCXByaW50ZigiICBTaXplOiAlbGQgTUIgaW4gJWQgU2VjdG9yc1xuIiwKKwkJCWluZm8tPnNpemUgPj4gMjAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CisKKwkJcHJpbnRmKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkJaWYgKChpICUgNSkgPT0gMCkgcHJpbnRmICgiXG4gICAiKTsKKworCQkJcHJpbnRmICgiICUwOGxYJXMiLCBpbmZvLT5zdGFydFtpXSwKKwkJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOworCQl9CisJCXByaW50ZiAoIlxuIik7CisJCWluZm8rKzsKKwl9Cit9CisKKworLyoqCisgKiBmbGFzaF9lcmFzZTogLSBlcmFzZSBmbGFzaCBzZWN0b3JzCisgKgorICovCisKK2ludCBmbGFzaF9lcmFzZShmbGFzaF9pbmZvX3QgKmluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCWludCBmbGFnLCBwcm90LCBzZWN0OworCWludCByYyA9IEVSUl9PSzsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKQorCQlyZXR1cm4gRVJSX1VOS05PV05fRkxBU0hfVFlQRTsKKworCWlmICgoc19maXJzdCA8IDApIHx8IChzX2ZpcnN0ID4gc19sYXN0KSkgeworCQlyZXR1cm4gRVJSX0lOVkFMOworCX0KKworCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgIT0gKElOVEVMX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spKQorCQlyZXR1cm4gRVJSX1VOS05PV05fRkxBU0hfVkVORE9SOworCisJcHJvdCA9IDA7CisJZm9yIChzZWN0PXNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgKytzZWN0KSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdKSBwcm90Kys7CisJfQorCisJaWYgKHByb3QpIHJldHVybiBFUlJfUFJPVEVDVEVEOworCisJLyoKKwkgKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0CisJICogaGVyZS4gUmVtZW1iZXIgdGhhdCBvdXIgZXhjZXB0aW9uIHZlY3RvcnMgYXJlCisJICogYXQgYWRkcmVzcyAwIGluIHRoZSBmbGFzaCwgYW5kIHdlIGRvbid0IHdhbnQgYQorCSAqICh0aWNrZXIpIGV4Y2VwdGlvbiB0byBoYXBwZW4gd2hpbGUgdGhlIGZsYXNoCisJICogY2hpcCBpcyBpbiBwcm9ncmFtbWluZyBtb2RlLgorCSAqLworCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3Q8PXNfbGFzdCAmJiAhY3RybGMoKTsgc2VjdCsrKSB7CisKKwkJcHJpbnRmKCJFcmFzaW5nIHNlY3RvciAlMmQgLi4uICIsIHNlY3QpOworCisJCS8qIGFybSBzaW1wbGUsIG5vbiBpbnRlcnJ1cHQgZGVwZW5kZW50IHRpbWVyICovCisJCXJlc2V0X3RpbWVyX21hc2tlZCgpOworCisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCQkJdTMyICogdm9sYXRpbGUgYWRkciA9ICh1MzIgKiB2b2xhdGlsZSkoaW5mby0+c3RhcnRbc2VjdF0pOworCisJCQkvKiBlcmFzZSBzZWN0b3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCS8qIFRoZSBzdHJhdGEgZmxhc2hzIGFyZSBhbGlnbmVkIHNpZGUgYnkgc2lkZSBvbiAgICAqLworCQkJLyogdGhlIGRhdGEgYnVzLCBzbyB3ZSBoYXZlIHRvIHdyaXRlIHRoZSBjb21tYW5kcyAgICovCisJCQkvKiB0byBib3RoIGNoaXBzIGhlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkJKmFkZHIgPSAweDAwMjAwMDIwOwkvKiBlcmFzZSBzZXR1cCAqLworCQkJKmFkZHIgPSAweDAwRDAwMEQwOwkvKiBlcmFzZSBjb25maXJtICovCisKKwkJCXdoaWxlICgoKmFkZHIgJiAweDAwODAwMDgwKSAhPSAweDAwODAwMDgwKSB7CisJCQkJaWYgKGdldF90aW1lcl9tYXNrZWQoKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQkJCSphZGRyID0gMHgwMEIwMDBCMDsgLyogc3VzcGVuZCBlcmFzZSovCisJCQkJCSphZGRyID0gMHgwMEZGMDBGRjsgLyogcmVhZCBtb2RlICAgICovCisJCQkJCXJjID0gRVJSX1RJTU9VVDsKKwkJCQkJZ290byBvdXRhaGVyZTsKKwkJCQl9CisJCQl9CisKKwkJCSphZGRyID0gMHgwMDUwMDA1MDsgLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGNtZC4gICAqLworCQkJKmFkZHIgPSAweDAwRkYwMEZGOyAvKiByZXNlc3QgdG8gcmVhZCBtb2RlICAgICAgICAgICovCisKKwkJfQorCisJCXByaW50Zigib2suXG4iKTsKKwl9CisKKwlpZiAoY3RybGMoKSkgcHJpbnRmKCJVc2VyIEludGVycnVwdCFcbiIpOworCisJb3V0YWhlcmU6CisKKwkvKiBhbGxvdyBmbGFzaCB0byBzZXR0bGUgLSB3YWl0IDEwIG1zICovCisJdWRlbGF5X21hc2tlZCgxMDAwMCk7CisKKwlpZiAoZmxhZykgZW5hYmxlX2ludGVycnVwdHMoKTsKKworCXJldHVybiByYzsKK30KKworCisvKioKKyAqIHdyaXRlX3dvcmQ6IC0gY29weSBtZW1vcnkgdG8gZmxhc2gKKyAqCisgKiBAcGFyYW0gaW5mbzoKKyAqIEBwYXJhbSBkZXN0OgorICogQHBhcmFtIGRhdGE6CisgKiBAcmV0dXJuOgorICovCisKK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1c2hvcnQgZGF0YSkKK3sKKwl1c2hvcnQgKmFkZHIgPSAodXNob3J0ICopZGVzdCwgdmFsOworCWludCByYyA9IEVSUl9PSzsKKwlpbnQgZmxhZzsKKworCS8qIENoZWNrIGlmIEZsYXNoIGlzIChzdWZmaWNpZW50bHkpIGVyYXNlZCAqLworCWlmICgoKmFkZHIgJiBkYXRhKSAhPSBkYXRhKSByZXR1cm4gRVJSX05PVF9FUkFTRUQ7CisKKwkvKgorCSAqIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQKKwkgKiBoZXJlLiBSZW1lbWJlciB0aGF0IG91ciBleGNlcHRpb24gdmVjdG9ycyBhcmUKKwkgKiBhdCBhZGRyZXNzIDAgaW4gdGhlIGZsYXNoLCBhbmQgd2UgZG9uJ3Qgd2FudCBhCisJICogKHRpY2tlcikgZXhjZXB0aW9uIHRvIGhhcHBlbiB3aGlsZSB0aGUgZmxhc2gKKwkgKiBjaGlwIGlzIGluIHByb2dyYW1taW5nIG1vZGUuCisJICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKwkqYWRkciA9IDB4NTA7CisKKwkvKiBwcm9ncmFtIHNldC11cCBjb21tYW5kICovCisJKmFkZHIgPSAweDQwOworCisJLyogbGF0Y2ggYWRkcmVzcy9kYXRhICovCisJKmFkZHIgPSBkYXRhOworCisJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKKworCS8qIHdhaXQgd2hpbGUgcG9sbGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisJd2hpbGUoKCh2YWwgPSAqYWRkcikgJiAweDgwKSAhPSAweDgwKSB7CisJCWlmIChnZXRfdGltZXJfbWFza2VkKCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJcmMgPSBFUlJfVElNT1VUOworCQkJKmFkZHIgPSAweEIwOyAvKiBzdXNwZW5kIHByb2dyYW0gY29tbWFuZCAqLworCQkJZ290byBvdXRhaGVyZTsKKwkJfQorCX0KKworCWlmKHZhbCAmIDB4MUEpIHsJLyogY2hlY2sgZm9yIGVycm9yICovCisJCXByaW50ZigiXG5GbGFzaCB3cml0ZSBlcnJvciAlMDJ4IGF0IGFkZHJlc3MgJTA4bHhcbiIsCisJCQkoaW50KXZhbCwgKHVuc2lnbmVkIGxvbmcpZGVzdCk7CisJCWlmKHZhbCAmICgxPDwzKSkgeworCQkJcHJpbnRmKCJWb2x0YWdlIHJhbmdlIGVycm9yLlxuIik7CisJCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQkJZ290byBvdXRhaGVyZTsKKwkJfQorCQlpZih2YWwgJiAoMTw8MSkpIHsKKwkJCXByaW50ZigiRGV2aWNlIHByb3RlY3QgZXJyb3IuXG4iKTsKKwkJCXJjID0gRVJSX1BST1RFQ1RFRDsKKwkJCWdvdG8gb3V0YWhlcmU7CisJCX0KKwkJaWYodmFsICYgKDE8PDQpKSB7CisJCQlwcmludGYoIlByb2dyYW1taW5nIGVycm9yLlxuIik7CisJCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQkJZ290byBvdXRhaGVyZTsKKwkJfQorCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQlnb3RvIG91dGFoZXJlOworCX0KKworCW91dGFoZXJlOgorCisJKmFkZHIgPSAweEZGOyAvKiByZWFkIGFycmF5IGNvbW1hbmQgKi8KKwlpZiAoZmxhZykgZW5hYmxlX2ludGVycnVwdHMoKTsKKworCXJldHVybiByYzsKK30KKworCisvKioKKyAqIHdyaXRlX2J1ZjogLSBDb3B5IG1lbW9yeSB0byBmbGFzaC4KKyAqCisgKiBAcGFyYW0gaW5mbzoKKyAqIEBwYXJhbSBzcmM6CXNvdXJjZSBvZiBjb3B5IHRyYW5zYWN0aW9uCisgKiBAcGFyYW0gYWRkcjoJd2hlcmUgdG8gY29weSB0bworICogQHBhcmFtIGNudDogCW51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogQHJldHVybgllcnJvciBjb2RlCisgKi8KKworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXVsb25nIGNwLCB3cDsKKwl1c2hvcnQgZGF0YTsKKwlpbnQgbDsKKwlpbnQgaSwgcmM7CisKKwl3cCA9IChhZGRyICYgfjEpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpPTAsIGNwPXdwOyBpPGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCA4KTsKKwkJfQorCQlmb3IgKDsgaTwyICYmIGNudD4wOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqc3JjKysgPDwgOCk7CisJCQktLWNudDsKKwkJCSsrY3A7CisJCX0KKwkJZm9yICg7IGNudD09MCAmJiBpPDI7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCA4KTsKKwkJfQorCisJCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgKz0gMjsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorCSAqLworCXdoaWxlIChjbnQgPj0gMikgeworCQkvKiBkYXRhID0gKigodnVzaG9ydCopc3JjKTsgKi8KKwkJZGF0YSA9ICooKHVzaG9ydCopc3JjKTsKKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCQlzcmMgKz0gMjsKKwkJd3AgICs9IDI7CisJCWNudCAtPSAyOworCX0KKworCWlmIChjbnQgPT0gMCkgcmV0dXJuIEVSUl9PSzsKKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpPTAsIGNwPXdwOyBpPDIgJiYgY250PjA7ICsraSwgKytjcCkgeworCQlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKnNyYysrIDw8IDgpOworCQktLWNudDsKKwl9CisJZm9yICg7IGk8MjsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqKHVjaGFyICopY3AgPDwgOCk7CisJfQorCisJcmV0dXJuIHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9pbm5va29tL2lubm9rb20uYyBiL2JvYXJkL2lubm9rb20vaW5ub2tvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjcwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9pbm5va29tL2lubm9rb20uYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCwgci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZQorICogS3lsZSBIYXJyaXMsIE5leHVzIFRlY2hub2xvZ2llcywgSW5jLiwga2hhcnJpc0BuZXh1cy10ZWNoLm5ldAorICogTWFyaXVzIEdyb2VnZXIsIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSCwgbWdyb2VnZXJAc3lzZ28uZGUKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKKyMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpICAgICAgICBzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQorI2Vsc2UKKyMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCisjZW5kaWYKKworLyoKKyAqIE1pc2NlbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zCisgKi8KKworCisvKioKKyAqIGJvYXJkX2luaXQ6IC0gc2V0dXAgc29tZSBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcworICovCisKK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyogbWVtb3J5IGFuZCBjcHUtc3BlZWQgYXJlIHNldHVwIGJlZm9yZSByZWxvY2F0aW9uICovCisJLyogc28gd2UgZG8gX25vdGhpbmdfIGhlcmUgKi8KKworCS8qIGFyY2ggbnVtYmVyIG9mIElubm9rb20gYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gMjU4OworCisJLyogYWRyZXNzIG9mIGJvb3QgcGFyYW1ldGVycyAqLworCWdkLT5iZC0+YmlfYm9vdF9wYXJhbXMgPSAweGEwMDAwMTAwOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBkcmFtX2luaXQ6IC0gc2V0dXAgZHluYW1pYyBSQU0KKyAqCisgKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcworICovCisKK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSBQSFlTX1NEUkFNXzE7CisJZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgPSBQSFlTX1NEUkFNXzFfU0laRTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogaW5ub2tvbV9zZXRfbGVkOiAtIHN3aXRjaCBMRURzIG9uIG9yIG9mZgorICoKKyAqIEBwYXJhbSBsZWQ6ICAgTEVEIHRvIHN3aXRjaCAoMCwxLDIpCisgKiBAcGFyYW0gc3RhdGU6IHN3aXRjaCBvbiAoMSkgb3Igb2ZmICgwKQorICovCisKK3ZvaWQgaW5ub2tvbV9zZXRfbGVkKGludCBsZWQsIGludCBzdGF0ZSkKK3sKKwlzd2l0Y2gobGVkKSB7CisvKgorCQljYXNlIDA6IGlmIChzdGF0ZT09MSkgeworCQkJCUdQQ1IwIHw9IENTQjIyNl9VU0VSX0xFRDA7CisJCQl9IGVsc2UgaWYgKHN0YXRlPT0wKSB7CisJCQkJR1BTUjAgfD0gQ1NCMjI2X1VTRVJfTEVEMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMTogaWYgKHN0YXRlPT0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQ1IwIHw9IENTQjIyNl9VU0VSX0xFRDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlPT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQU1IwIHw9IENTQjIyNl9VU0VSX0xFRDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlIDI6IGlmIChzdGF0ZT09MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUENSMCB8PSBDU0IyMjZfVVNFUl9MRUQyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZT09MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFNSMCB8PSBDU0IyMjZfVVNFUl9MRUQyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisqLworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIHNob3dfYm9vdF9wcm9ncmVzczogLSBpbmRpY2F0ZSBzdGF0ZSBvZiB0aGUgYm9vdCBwcm9jZXNzCisgKgorICogQHBhcmFtIHN0YXR1czogU3RhdHVzIG51bWJlciAtIHNlZSBSRUFETUUgZm9yIGRldGFpbHMuCisgKgorICogVGhlIENTQjIyNiBkb2VzIG9ubHkgaGF2ZSAzIExFRHMsIHNvIHdlIHN3aXRjaCB0aGVtIG9uIGF0IHRoZSBtb3N0CisgKiBpbXBvcnRhbnQgc3RhdGVzICgxLCA1LCAxNSkuCisgKi8KKwordm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCBzdGF0dXMpCit7CisJc3dpdGNoKHN0YXR1cykgeworLyoKKwkJY2FzZSAgMTogY3NiMjI2X3NldF9sZWQoMCwxKTsgYnJlYWs7CisJCWNhc2UgIDU6IGNzYjIyNl9zZXRfbGVkKDEsMSk7IGJyZWFrOworCQljYXNlIDE1OiBjc2IyMjZfc2V0X2xlZCgyLDEpOyBicmVhazsKKyovCisJfQorCisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9pbm5va29tL21lbXNldHVwLlMgYi9ib2FyZC9pbm5va29tL21lbXNldHVwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkNWVlZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2lubm9rb20vbWVtc2V0dXAuUwpAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqIE1vc3Qgb2YgdGhpcyB0YWtlbiBmcm9tIFJlZGJvb3QgaGFsX3BsYXRmb3JtX3NldHVwLmggd2l0aCBjbGVhbnVwCisgKgorICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKKyAqIHJ1bm5pbmcuIFNlZSBoYWxfcGxhdGZvcm1fc2V0dXAuaCBmb3IgdGhlIHNvdXJjZS4gU2VlCisgKiBib2FyZC9jcmFkbGUvbWVtc2V0dXAuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcworICogbXVjaCBjbGVhbmVyLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworRFJBTV9TSVpFOiAgLmxvbmcgICBDRkdfRFJBTV9TSVpFCisKKy8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCisgICAubWFjcm8gQ1BXQUlUIHJlZworICAgbXJjICBwMTUsMCxccmVnLGMyLGMwLDAKKyAgIG1vdiAgXHJlZyxccmVnCisgICBzdWIgIHBjLHBjLCM0CisgICAuZW5kbQorCisKKy8qCisgKiAJTWVtb3J5IHNldHVwCisgKi8KKworLmdsb2JsIG1lbXNldHVwCittZW1zZXR1cDoKKworICAgIG1vdiAgICAgIHIxMCwgbHIKKworCS8qIFNldCB1cCBHUElPIHBpbnMgZmlyc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWxkcgkJcjAsCT1HUFNSMAorCWxkcgkJcjEsCT1DRkdfR1BTUjBfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R1BTUjEKKwlsZHIJCXIxLAk9Q0ZHX0dQU1IxX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdQU1IyCisJbGRyCQlyMSwJPUNGR19HUFNSMl9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HUENSMAorCWxkcgkJcjEsCT1DRkdfR1BDUjBfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R1BDUjEKKwlsZHIJCXIxLAk9Q0ZHX0dQQ1IxX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdQQ1IyCisJbGRyCQlyMSwJPUNGR19HUENSMl9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HUERSMAorCWxkcgkJcjEsCT1DRkdfR1BEUjBfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R1BEUjEKKwlsZHIJCXIxLAk9Q0ZHX0dQRFIxX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdQRFIyCisJbGRyCQlyMSwJPUNGR19HUERSMl9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HQUZSMF9MCisJbGRyCQlyMSwJPUNGR19HQUZSMF9MX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdBRlIwX1UKKwlsZHIJCXIxLAk9Q0ZHX0dBRlIwX1VfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjFfTAorCWxkcgkJcjEsCT1DRkdfR0FGUjFfTF9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HQUZSMV9VCisJbGRyCQlyMSwJPUNGR19HQUZSMV9VX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdBRlIyX0wKKwlsZHIJCXIxLAk9Q0ZHX0dBRlIyX0xfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjJfVQorCWxkcgkJcjEsCT1DRkdfR0FGUjJfVV9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcglyMCwJPVBTU1IJCS8qIGVuYWJsZSBHUElPIHBpbnMgKi8KKwlsZHIJCXIxLAk9Q0ZHX1BTU1JfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKy8qCWxkcglyMywJPU1TQzEJCS8gIGxvdyAtIGJhbmsgMiBMdWJib2NrIFJlZ2lzdGVycyAvIFNSQU0gKi8KKy8qCWxkcglyMiwJPUNGR19NU0MxX1ZBTAkvICBoaWdoIC0gYmFuayAzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKy8qCXN0cglyMiwJW3IzXQkJLyAgbmVlZCB0byBzZXQgTVNDMSBiZWZvcmUgdHJ5aW5nIHRvIHdyaXRlIHRvIHRoZSBIRVggTEVEcyAqLworLyoJbGRyCXIyLAlbcjNdCQkvICBuZWVkIHRvIHJlYWQgaXQgYmFjayB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIGxhdGNoZXMgKHNlZSBNU0Mgc2VjdGlvbiBvZiBtYW51YWwpICovCisvKiAqLworLyoJbGRyCXIxLAk9TEVEX0JMQU5LICovCisvKgltb3YJcjAsCSMweEZGICovCisvKglzdHIJcjAsCVtyMV0JCS8gIHR1cm4gb24gaGV4IGxlZHMgKi8KKy8qICovCisvKmxvb3A6ICovCisvKiAqLworLyogICBsZHIJcjAsID0weEIwMDcwMDAxICovCisvKiAgIGxkciAgICAJcjEsID1fTEVEICovCisvKiAgIHN0ciAgICAJcjAsIFtyMV0JCS8gIGhleCBkaXNwbGF5ICovCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBFbmFibGUgbWVtb3J5IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcyAgICAgICAgKi8KKwkvKiBkZXRhaWxlZCBpbiB0aGUgSW50ZWwgUFhBMjUwIE9wZXJhdGluZyBTeXN0ZW1zIERldmVsb3BlcnMgR3VpZGUsICovCisJLyogQ2hhcHRlciAxMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTdGVwIDE6IFdhaXQgZm9yIGF0IGxlYXN0IDIwMCBtaWNyb3NlZG9uZHMgdG8gYWxsb3cgaW50ZXJuYWwgICAgICovCisJLyogICAgICAgICBjbG9ja3MgdG8gc2V0dGxlLiBPbmx5IG5lY2Vzc2FyeSBhZnRlciBoYXJkIHJlc2V0Li4uICAgICAqLworCS8qICAgICAgICAgRklYTUU6IGNhbiBiZSBvcHRpbWl6ZWQgbGF0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KKwltb3YgcjIsICMwCisJc3RyIHIyLCBbcjNdCisJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLworCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5ICAgICAgICAqLworMToKKwlsZHIgcjIsIFtyM10KKwljbXAgcjQsIHIyCisJYmd0IDFiCisKK21lbV9pbml0OgorCisgICAgICAgIGxkciAgICAgcjEsICA9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlciAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcsIGJ1cyB3aWR0aCwgbWVtIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgLyogTVNDMDogbkNTKDAsMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIyLCAgID1DRkdfTVNDMF9WQUwKKyAgICAgICAgc3RyICAgICByMiwgICBbcjEsICNNU0MwX09GRlNFVF0KKyAgICAgICAgbGRyICAgICByMiwgICBbcjEsICNNU0MwX09GRlNFVF0JLyogcmVhZCBiYWNrIHRvIGVuc3VyZSAgICAgICovCisJCQkJCQkvKiB0aGF0IGRhdGEgbGF0Y2hlcyAgICAgICAgKi8KKyAgICAgICAgLyogTVNDMTogbkNTKDIsMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NU0MxX1ZBTAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTVNDMV9PRkZTRVRdCisgICAgICAgIGxkciAgICAgcjIsICBbcjEsICNNU0MxX09GRlNFVF0KKworCS8qIE1TQzI6IG5DUyg0LDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTVNDMl9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQorICAgICAgICBsZHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3RlcCAyYjogSW5pdGlhbGl6ZSBDYXJkIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIE1FQ1I6IE1lbW9yeSBFeHBhbnNpb24gQ2FyZCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUVDUl9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01FQ1JfT0ZGU0VUXQorCWxkcglyMiwJW3IxLCAjTUVDUl9PRkZTRVRdCisKKwkvKiBNQ01FTTA6IENhcmQgSW50ZXJmYWNlIHNsb3QgMCB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DTUVNMF9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DTUVNMF9PRkZTRVRdCisJbGRyCXIyLAlbcjEsICNNQ01FTTBfT0ZGU0VUXQorCisgICAgICAgIC8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUNNRU0xX1ZBTAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0xX09GRlNFVF0KKwlsZHIJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCisKKwkvKiBNQ0FUVDA6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DQVRUMF9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DQVRUMF9PRkZTRVRdCisJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQorCisJLyogTUNBVFQxOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDEgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NQ0FUVDFfVkFMCisgICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQorCWxkcglyMiwJW3IxLCAjTUNBVFQxX09GRlNFVF0KKworCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUNJTzBfVkFMCisgICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0lPMF9PRkZTRVRdCisJbGRyCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdCisKKwkvKiBNQ0lPMTogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DSU8xX1ZBTAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNJTzFfT0ZGU0VUXQorCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAvKiBTdGVwIDJjOiBXcml0ZSBGTFlDTkZHICBGSVhNRTogd2hhdCdzIHRoYXQ/Pz8gICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAvKiBTdGVwIDJkOiBJbml0aWFsaXplIFRpbWluZyBmb3IgU3luYyBNZW1vcnkgKFNEQ0xLMCkgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIEJlZm9yZSBhY2Nlc3NpbmcgTURSRUZSIHdlIG5lZWQgYSB2YWxpZCBEUkkgZmllbGQsIHNvIHdlIHNldCAgICAgKi8KKwkvKiB0aGlzIHRvIHBvd2VyIG9uIGRlZmF1bHRzICsgRElSIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwlsZHIJcjQsCT0weDAzY2E0ZmZmCisJc3RyCXI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQkvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByNCwJW3IxLCAjTURSRUZSX09GRlNFVF0KKworCWxkcglyNCwJPTB4MDNjYTQwMzAKKwlzdHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLworCWxkcglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0KKworICAgICAgICAvKiBOb3RlOiBwcmVzZXJ2ZSB0aGUgbWRyZWZyIHZhbHVlIGluIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTdGVwIDM6IEluaXRpYWxpemUgU3luY2hyb25vdXMgU3RhdGljIE1lbW9yeSAoRmxhc2gvUGVyaXBoZXJhbHMpICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogSW5pdGlhbGl6ZSBTWENORkcgcmVnaXN0ZXIuIEFzc2VydCB0aGUgZW5hYmxlIGJpdHMgICAgICAgICAgICAgICAqLworCisJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1hbmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YgICAgICAqLworCS8qIHN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkuIE5vdGUgdGhhdCBTWExDUiBuZWVkIG5vdCBiZSB3cml0dGVuICAgKi8KKwkvKiBhdCB0aGlzIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkvKiBGSVhNRTogd2UgdXNlIGFzeW5jIG1vZGUgZm9yIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIC8qIFN0ZXAgNDogSW5pdGlhbGl6ZSBTRFJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogU3RlcCA0YTogYXNzZXJ0IE1EUkVGUjpLMVJVTiBhbmQgTURSRUZSOksyUlVOIGFuZCBjb25maWd1cmUgICAgICAqLworCS8qICAgICAgICAgIE1EUkVGUjpLMURCMiBhbmQgTURSRUZSOksyREIyIGFzIGRlc2lyZWQuICAgICAgICAgICAgICAgKi8KKworCW9ycglyNCwJcjQsCSMoTURSRUZSX0sxUlVOfE1EUkVGUl9LMFJVTikKKworCXN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKwlsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KKworCisJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJYmljCXI0LAlyNCwJIyhNRFJFRlJfU0xGUlNIKQorCisgICAgICAgIHN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdCisKKworCS8qIFN0ZXAgNGM6IGFzc2VydCBNRFJFRlI6RTFQSU4gYW5kIEUwUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCW9ycglyNCwJcjQsCSMoTURSRUZSX0UxUElOfE1EUkVGUl9FMFBJTikKKworICAgICAgICBzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCisKKwkvKiBTdGVwIDRkOiB3cml0ZSBNRENORkcgd2l0aCBNRENORkc6REV4IGRlYXNzZXJ0ZWQgKHNldCB0byAwKSwgdG8gICovCisJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLworCisJbGRyCXI0LAk9Q0ZHX01EQ05GR19WQUwKKwliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKKworICAgICAgICBzdHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjQsICAgICBbcjEsICNNRENORkdfT0ZGU0VUXQorCisKKwkvKiBTdGVwIDRlOiBXYWl0IGZvciB0aGUgY2xvY2sgdG8gdGhlIFNEUkFNcyB0byBzdGFiaWxpemUsICAgICAgICAgICovCisJLyogICAgICAgICAgMTAwLi4yMDAgtXNlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCisJbW92IHIyLCAjMAorCXN0ciByMiwgW3IzXQorCWxkciByNCwgPTB4MzAwCQkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMsICAgKi8KKwkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KKzE6CisJbGRyIHIyLCBbcjNdCisJY21wIHI0LCByMgorCWJndCAxYgorCisKKwkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCisJLyogICAgICAgICAgYXR0ZW1wdGluZyBub24tYnVyc3QgcmVhZCBvciB3cml0ZSBhY2Nlc3NlcyB0byBkaXNhYmxlZCAqLworCS8qICAgICAgICAgIFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAgKi8KKwkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCisJLyogICAgICAgICAgZm9yIHRoaXMgcHVycG9zZSBtdXN0IG5vdCBiZSBjYWNoZWFibGUuICAgICAgICAgICAgICAgICAqLworCisJbGRyCXIzLAk9Q0ZHX0RSQU1fQkFTRQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCisKKwkvKiBTdGVwIDRnOiBXcml0ZSBNRENORkcgd2l0aCBlbmFibGUgYml0cyBhc3NlcnRlZCAgICAgICAgICAgICAgICAgICovCisJLyogICAgICAgICAgKE1EQ05GRzpERXggc2V0IHRvIDEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJbGRyCXIzLCBbcjEsICNNRENORkdfT0ZGU0VUXQorCW9ycglyMywJcjMsCSMoTURDTkZHX0RFMHxNRENORkdfREUxKQorCXN0cglyMywgW3IxLCAjTURDTkZHX09GRlNFVF0KKworCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NRE1SU19WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01ETVJTX09GRlNFVF0KKworCisJLyogV2UgYXJlIGZpbmlzaGVkIHdpdGggSW50ZWwncyBtZW1vcnkgY29udHJvbGxlciBpbml0aWFsaXNhdGlvbiAgICAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogRGlzYWJsZSAobWFzaykgYWxsIGludGVycnVwdHMgYXQgaW50ZXJydXB0IGNvbnRyb2xsZXIgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5pdGlycXM6CisKKyAgICAgICAgbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1JQ0xSCisgICAgICAgIHN0ciAgICAgcjEsICBbcjJdCisKKyAgICAgICAgbGRyICAgICByMiwgID1JQ01SCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8KKyAgICAgICAgc3RyICAgICByMSwgIFtyMl0KKworCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBDbG9jayBpbml0aWFsaXNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5pdGNsa3M6CisKKwkvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcywgYW5kIHNldCB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kgICovCisJLyogKGhhcmQtY29kaW5nIGF0IDM5OC4xMk1IeiBmb3Igbm93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJLyogVHVybiBPZmYgQUxMIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgZm9yIHJlLWNvbmZpZ3VyYXRpb24gICAgICAqLworCS8qIE5vdGU6IFNlZSBsYWJlbCAnRU5BQkxFQ0xLUycgZm9yIHRoZSByZS1lbmFibGluZyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMSwgID1DS0VOCisgICAgICAgIG1vdiAgICAgcjIsICAjMAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxXQorCisKKyAgICAgICAgLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLworICAgICAgICBsZHIgICAgIHIyLCA9KENDQ1JfTDI3fENDQ1JfTTJ8Q0NDUl9OMTApICAvKiBERUZBVUxUOiB7MjAwLzIwMC8xMDB9ICovCisKKyAgICAgICAgLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIxLCAgPUNDQ1IKKyAgICAgICAgc3RyICAgICByMiwgIFtyMV0KKworCS8qIGVuYWJsZSB0aGUgMzJLaHogb3NjaWxsYXRvciBmb3IgUlRDIGFuZCBQb3dlck1hbmFnZXIgICAgICAgICAgICAgKi8KKy8qCisgICAgICAgIGxkciAgICAgcjEsICA9T1NDQworICAgICAgICBtb3YgICAgIHIyLCAgI09TQ0NfT09OCisgICAgICAgIHN0ciAgICAgcjIsICBbcjFdCisqLworCS8qIE5PVEU6ICBzcGluIGhlcmUgdW50aWwgT1NDQy5PT0sgZ2V0IHNldCwgbWVhbmluZyB0aGUgUExMICAgICAgICAgKi8KKwkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCis2MDoKKyAgICAgICAgbGRyICAgICByMiwgW3IxXQorICAgICAgICBhbmRzICAgIHIyLCByMiwgIzEKKyAgICAgICAgYmVxICAgICA2MGIKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIFNhdmUgU0RSQU0gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIJcjEsID1EUkFNX1NJWkUKKwlzdHIJcjgsIFtyMV0KKworCS8qIEludGVycnVwdCBpbml0OiBNYXNrIGFsbCBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIJcjAsID1JQ01SCQkJLyogZW5hYmxlIG5vIHNvdXJjZXMgICAgICAgICovCisJbW92CXIxLCAjMAorCXN0cglyMSwgW3IwXQorCisJLyogRklYTUUgKi8KKworI2RlZmluZSBOT0RFQlVHCisjaWZkZWYgTk9ERUJVRworCS8qRGlzYWJsZSBzb2Z0d2FyZSBhbmQgZGF0YSBicmVha3BvaW50cyAqLworCW1vdglyMCwjMAorCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KKwltY3IJcDE1LDAscjAsYzE0LGM5LDAgIC8qIGliY3IxICovCisJbWNyCXAxNSwwLHIwLGMxNCxjNCwwICAvKiBkYmNvbiAqLworCisJLypFbmFibGUgYWxsIGRlYnVnIGZ1bmN0aW9uYWxpdHkgKi8KKwltb3YJcjAsIzB4ODAwMDAwMDAKKwltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KKworI2VuZGlmCisKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEVuZCBtZW1zZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbmRtZW1zZXR1cDoKKworICAgIG1vdiAgICAgcGMsIGxyCisKZGlmZiAtLWdpdCBhL2JvYXJkL2lubm9rb20vdS1ib290LmxkcyBiL2JvYXJkL2lubm9rb20vdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg5YjMyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvaW5ub2tvbS91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgICAgICAgLiA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS94c2NhbGUvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmRhdGEgOiB7ICooLmRhdGEpIH0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5nb3QgOiB7ICooLmdvdCkgfQorCisJYXJtYm9vdF9lbmRfZGF0YSA9IC47CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuYnNzIDogeyAqKC5ic3MpIH0KKworCWFybWJvb3RfZW5kID0gLjsKK30K