LyoKICogIGxpbnV4L2RyaXZlcnMvYmxvY2svbG9vcC5jCiAqCiAqICBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDMvMjkvOTMKICoKICogQ29weXJpZ2h0IDE5OTMgYnkgVGhlb2RvcmUgVHMnby4gIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcwogKiBwZXJtaXR0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgogKgogKiBERVMgZW5jcnlwdGlvbiBwbHVzIHNvbWUgbWlub3IgY2hhbmdlcyBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIDMwLU1BWS0xOTkzCiAqIG1vcmUgREVTIGVuY3J5cHRpb24gcGx1cyBJREVBIGVuY3J5cHRpb24gYnkgTmljaG9sYXMgSi4gTGVvbiwgSnVuZSAyMCwgMTk5NgogKgogKiBNb2R1bGFyaXplZCBhbmQgdXBkYXRlZCBmb3IgMS4xLjE2IGtlcm5lbCAtIE1pdGNoIERzb3V6YSAyOHRoIE1heSAxOTk0CiAqIEFkYXB0ZWQgZm9yIDEuMy41OSBrZXJuZWwgLSBBbmRyaWVzIEJyb3V3ZXIsIDEgRmViIDE5OTYKICoKICogRml4ZWQgZG9fbG9vcF9yZXF1ZXN0KCkgcmUtZW50cmFuY3kgLSBWaW5jZW50LlJlbmFyZGlhc0B3YXcuY29tIE1hciAyMCwgMTk5NwogKgogKiBBZGRlZCBkZXZmcyBzdXBwb3J0IC0gUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IDE2LUphbi0xOTk4CiAqCiAqIEhhbmRsZSBzcGFyc2UgYmFja2luZyBmaWxlcyBjb3JyZWN0bHkgLSBLZW5uIEh1bWJvcmcsIEp1biAyOCwgMTk5OAogKgogKiBMb2FkYWJsZSBtb2R1bGVzIGFuZCBvdGhlciBmaXhlcyBieSBBSywgMTk5OAogKgogKiBNYWtlIHJlYWwgYmxvY2sgbnVtYmVyIGF2YWlsYWJsZSB0byBkb3duc3RyZWFtIHRyYW5zZmVyIGZ1bmN0aW9ucywgZW5hYmxlcwogKiBDQkMgKGFuZCByZWxhdGl2ZXMpIG1vZGUgZW5jcnlwdGlvbiByZXF1aXJpbmcgdW5pcXVlIElWcyBwZXIgZGF0YSBibG9jay4KICogUmVlZCBILiBQZXR0eSwgcmhwQGRyYXBlci5uZXQKICoKICogTWF4aW11bSBudW1iZXIgb2YgbG9vcCBkZXZpY2VzIG5vdyBkeW5hbWljIHZpYSBtYXhfbG9vcCBtb2R1bGUgcGFyYW1ldGVyLgogKiBSdXNzZWxsIEtyb2xsIDxya3JvbGxAZXhwbG9pdHMub3JnPiAxOTk5MDcwMQogKgogKiBNYXhpbXVtIG51bWJlciBvZiBsb29wIGRldmljZXMgd2hlbiBjb21waWxlZC1pbiBub3cgc2VsZWN0YWJsZSBieSBwYXNzaW5nCiAqIG1heF9sb29wPTwxLTI1NT4gdG8gdGhlIGtlcm5lbCBvbiBib290LgogKiBFcmlrIEkuIEJvbHP4LCA8ZXJpa2lAaGltb2xkZS5ubz4sIE9jdCAzMSwgMTk5OQogKgogKiBDb21wbGV0ZWx5IHJld3JpdGUgcmVxdWVzdCBoYW5kbGluZyB0byBiZSBtYWtlX3JlcXVlc3RfZm4gc3R5bGUgYW5kCiAqIG5vbiBibG9ja2luZywgcHVzaGluZyB3b3JrIHRvIGEgaGVscGVyIHRocmVhZC4gTG90cyBvZiBmaXhlcyBmcm9tCiAqIEFsIFZpcm8gdG9vLgogKiBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPiwgTm92IDIwMDAKICoKICogU3VwcG9ydCB1cCB0byAyNTYgbG9vcCBkZXZpY2VzCiAqIEhlaW56IE1hdWVsc2hhZ2VuIDxtZ2VAc2lzdGluYS5jb20+LCBGZWIgMjAwMgogKgogKiBTdXBwb3J0IGZvciBmYWxsaW5nIGJhY2sgb24gdGhlIHdyaXRlIGZpbGUgb3BlcmF0aW9uIHdoZW4gdGhlIGFkZHJlc3Mgc3BhY2UKICogb3BlcmF0aW9ucyBwcmVwYXJlX3dyaXRlIGFuZC9vciBjb21taXRfd3JpdGUgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlCiAqIGJhY2tpbmcgZmlsZXN5c3RlbS4KICogQW50b24gQWx0YXBhcm1ha292LCAxNiBGZWIgMjAwNQogKgogKiBTdGlsbCBUbyBGaXg6CiAqIC0gQWR2aXNvcnkgbG9ja2luZyBpcyBpZ25vcmVkIGhlcmUuCiAqIC0gU2hvdWxkIHVzZSBhbiBvd24gQ0FQXyogY2F0ZWdvcnkgaW5zdGVhZCBvZiBDQVBfU1lTX0FETUlOCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvZmlsZS5oPgojaW5jbHVkZSA8bGludXgvc3RhdC5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgojaW5jbHVkZSA8bGludXgvc3dhcC5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvbG9vcC5oPgojaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgojaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIGludmFsaWRhdGVfYmRldigpICovCiNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiNpbmNsdWRlIDxsaW51eC9nZnAuaD4KCiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKc3RhdGljIGludCBtYXhfbG9vcCA9IDg7CnN0YXRpYyBzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvb3BfZGV2OwpzdGF0aWMgc3RydWN0IGdlbmRpc2sgKipkaXNrczsKCi8qCiAqIFRyYW5zZmVyIGZ1bmN0aW9ucwogKi8Kc3RhdGljIGludCB0cmFuc2Zlcl9ub25lKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGludCBjbWQsCgkJCSBzdHJ1Y3QgcGFnZSAqcmF3X3BhZ2UsIHVuc2lnbmVkIHJhd19vZmYsCgkJCSBzdHJ1Y3QgcGFnZSAqbG9vcF9wYWdlLCB1bnNpZ25lZCBsb29wX29mZiwKCQkJIGludCBzaXplLCBzZWN0b3JfdCByZWFsX2Jsb2NrKQp7CgljaGFyICpyYXdfYnVmID0ga21hcF9hdG9taWMocmF3X3BhZ2UsIEtNX1VTRVIwKSArIHJhd19vZmY7CgljaGFyICpsb29wX2J1ZiA9IGttYXBfYXRvbWljKGxvb3BfcGFnZSwgS01fVVNFUjEpICsgbG9vcF9vZmY7CgoJaWYgKGNtZCA9PSBSRUFEKQoJCW1lbWNweShsb29wX2J1ZiwgcmF3X2J1Ziwgc2l6ZSk7CgllbHNlCgkJbWVtY3B5KHJhd19idWYsIGxvb3BfYnVmLCBzaXplKTsKCglrdW5tYXBfYXRvbWljKHJhd19idWYsIEtNX1VTRVIwKTsKCWt1bm1hcF9hdG9taWMobG9vcF9idWYsIEtNX1VTRVIxKTsKCWNvbmRfcmVzY2hlZCgpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgdHJhbnNmZXJfeG9yKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGludCBjbWQsCgkJCXN0cnVjdCBwYWdlICpyYXdfcGFnZSwgdW5zaWduZWQgcmF3X29mZiwKCQkJc3RydWN0IHBhZ2UgKmxvb3BfcGFnZSwgdW5zaWduZWQgbG9vcF9vZmYsCgkJCWludCBzaXplLCBzZWN0b3JfdCByZWFsX2Jsb2NrKQp7CgljaGFyICpyYXdfYnVmID0ga21hcF9hdG9taWMocmF3X3BhZ2UsIEtNX1VTRVIwKSArIHJhd19vZmY7CgljaGFyICpsb29wX2J1ZiA9IGttYXBfYXRvbWljKGxvb3BfcGFnZSwgS01fVVNFUjEpICsgbG9vcF9vZmY7CgljaGFyICppbiwgKm91dCwgKmtleTsKCWludCBpLCBrZXlzaXplOwoKCWlmIChjbWQgPT0gUkVBRCkgewoJCWluID0gcmF3X2J1ZjsKCQlvdXQgPSBsb29wX2J1ZjsKCX0gZWxzZSB7CgkJaW4gPSBsb29wX2J1ZjsKCQlvdXQgPSByYXdfYnVmOwoJfQoKCWtleSA9IGxvLT5sb19lbmNyeXB0X2tleTsKCWtleXNpemUgPSBsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCgkJKm91dCsrID0gKmluKysgXiBrZXlbKGkgJiA1MTEpICUga2V5c2l6ZV07CgoJa3VubWFwX2F0b21pYyhyYXdfYnVmLCBLTV9VU0VSMCk7CglrdW5tYXBfYXRvbWljKGxvb3BfYnVmLCBLTV9VU0VSMSk7Cgljb25kX3Jlc2NoZWQoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHhvcl9pbml0KHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGNvbnN0IHN0cnVjdCBsb29wX2luZm82NCAqaW5mbykKewoJaWYgKHVubGlrZWx5KGluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPD0gMCkpCgkJcmV0dXJuIC1FSU5WQUw7CglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBsb29wX2Z1bmNfdGFibGUgbm9uZV9mdW5jcyA9IHsKCS5udW1iZXIgPSBMT19DUllQVF9OT05FLAoJLnRyYW5zZmVyID0gdHJhbnNmZXJfbm9uZSwKfTsgCQoKc3RhdGljIHN0cnVjdCBsb29wX2Z1bmNfdGFibGUgeG9yX2Z1bmNzID0gewoJLm51bWJlciA9IExPX0NSWVBUX1hPUiwKCS50cmFuc2ZlciA9IHRyYW5zZmVyX3hvciwKCS5pbml0ID0geG9yX2luaXQKfTsgCQoKLyogeGZlcl9mdW5jc1swXSBpcyBzcGVjaWFsIC0gaXRzIHJlbGVhc2UgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkICovCnN0YXRpYyBzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICp4ZmVyX2Z1bmNzW01BWF9MT19DUllQVF0gPSB7Cgkmbm9uZV9mdW5jcywKCSZ4b3JfZnVuY3MKfTsKCnN0YXRpYyBsb2ZmX3QgZ2V0X2xvb3Bfc2l6ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJbG9mZl90IHNpemUsIG9mZnNldCwgbG9vcHNpemU7CgoJLyogQ29tcHV0ZSBsb29wc2l6ZSBpbiBieXRlcyAqLwoJc2l6ZSA9IGlfc2l6ZV9yZWFkKGZpbGUtPmZfbWFwcGluZy0+aG9zdCk7CglvZmZzZXQgPSBsby0+bG9fb2Zmc2V0OwoJbG9vcHNpemUgPSBzaXplIC0gb2Zmc2V0OwoJaWYgKGxvLT5sb19zaXplbGltaXQgPiAwICYmIGxvLT5sb19zaXplbGltaXQgPCBsb29wc2l6ZSkKCQlsb29wc2l6ZSA9IGxvLT5sb19zaXplbGltaXQ7CgoJLyoKCSAqIFVuZm9ydHVuYXRlbHksIGlmIHdlIHdhbnQgdG8gZG8gSS9PIG9uIHRoZSBkZXZpY2UsCgkgKiB0aGUgbnVtYmVyIG9mIDUxMi1ieXRlIHNlY3RvcnMgaGFzIHRvIGZpdCBpbnRvIGEgc2VjdG9yX3QuCgkgKi8KCXJldHVybiBsb29wc2l6ZSA+PiA5Owp9CgpzdGF0aWMgaW50CmZpZ3VyZV9sb29wX3NpemUoc3RydWN0IGxvb3BfZGV2aWNlICpsbykKewoJbG9mZl90IHNpemUgPSBnZXRfbG9vcF9zaXplKGxvLCBsby0+bG9fYmFja2luZ19maWxlKTsKCXNlY3Rvcl90IHggPSAoc2VjdG9yX3Qpc2l6ZTsKCglpZiAodW5saWtlbHkoKGxvZmZfdCl4ICE9IHNpemUpKQoJCXJldHVybiAtRUZCSUc7CgoJc2V0X2NhcGFjaXR5KGRpc2tzW2xvLT5sb19udW1iZXJdLCB4KTsKCXJldHVybiAwOwkJCQkJCn0KCnN0YXRpYyBpbmxpbmUgaW50CmxvX2RvX3RyYW5zZmVyKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGludCBjbWQsCgkgICAgICAgc3RydWN0IHBhZ2UgKnJwYWdlLCB1bnNpZ25lZCByb2ZmcywKCSAgICAgICBzdHJ1Y3QgcGFnZSAqbHBhZ2UsIHVuc2lnbmVkIGxvZmZzLAoJICAgICAgIGludCBzaXplLCBzZWN0b3JfdCByYmxvY2spCnsKCWlmICh1bmxpa2VseSghbG8tPnRyYW5zZmVyKSkKCQlyZXR1cm4gMDsKCglyZXR1cm4gbG8tPnRyYW5zZmVyKGxvLCBjbWQsIHJwYWdlLCByb2ZmcywgbHBhZ2UsIGxvZmZzLCBzaXplLCByYmxvY2spOwp9CgovKioKICogZG9fbG9fc2VuZF9hb3BzIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogKgogKiBUaGlzIGlzIHRoZSBmYXN0IHZlcnNpb24gZm9yIGJhY2tpbmcgZmlsZXN5c3RlbXMgd2hpY2ggaW1wbGVtZW50IHRoZSBhZGRyZXNzCiAqIHNwYWNlIG9wZXJhdGlvbnMgcHJlcGFyZV93cml0ZSBhbmQgY29tbWl0X3dyaXRlLgogKi8Kc3RhdGljIGludCBkb19sb19zZW5kX2FvcHMoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpb192ZWMgKmJ2ZWMsCgkJaW50IGJzaXplLCBsb2ZmX3QgcG9zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKewoJc3RydWN0IGZpbGUgKmZpbGUgPSBsby0+bG9fYmFja2luZ19maWxlOyAvKiBrdWRvcyB0byBORnNja2luZ1MgKi8KCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwoJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYW9wcyA9IG1hcHBpbmctPmFfb3BzOwoJcGdvZmZfdCBpbmRleDsKCXVuc2lnbmVkIG9mZnNldCwgYnZfb2ZmczsKCWludCBsZW4sIHJldDsKCgltdXRleF9sb2NrKCZtYXBwaW5nLT5ob3N0LT5pX211dGV4KTsKCWluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CglvZmZzZXQgPSBwb3MgJiAoKHBnb2ZmX3QpUEFHRV9DQUNIRV9TSVpFIC0gMSk7Cglidl9vZmZzID0gYnZlYy0+YnZfb2Zmc2V0OwoJbGVuID0gYnZlYy0+YnZfbGVuOwoJd2hpbGUgKGxlbiA+IDApIHsKCQlzZWN0b3JfdCBJVjsKCQl1bnNpZ25lZCBzaXplOwoJCWludCB0cmFuc2Zlcl9yZXN1bHQ7CgoJCUlWID0gKChzZWN0b3JfdClpbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIDkpKSsob2Zmc2V0ID4+IDkpOwoJCXNpemUgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CgkJaWYgKHNpemUgPiBsZW4pCgkJCXNpemUgPSBsZW47CgkJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CgkJaWYgKHVubGlrZWx5KCFwYWdlKSkKCQkJZ290byBmYWlsOwoJCXJldCA9IGFvcHMtPnByZXBhcmVfd3JpdGUoZmlsZSwgcGFnZSwgb2Zmc2V0LAoJCQkJCSAgb2Zmc2V0ICsgc2l6ZSk7CgkJaWYgKHVubGlrZWx5KHJldCkpIHsKCQkJaWYgKHJldCA9PSBBT1BfVFJVTkNBVEVEX1BBR0UpIHsKCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWdvdG8gdW5sb2NrOwoJCX0KCQl0cmFuc2Zlcl9yZXN1bHQgPSBsb19kb190cmFuc2ZlcihsbywgV1JJVEUsIHBhZ2UsIG9mZnNldCwKCQkJCWJ2ZWMtPmJ2X3BhZ2UsIGJ2X29mZnMsIHNpemUsIElWKTsKCQlpZiAodW5saWtlbHkodHJhbnNmZXJfcmVzdWx0KSkgewoJCQljaGFyICprYWRkcjsKCgkJCS8qCgkJCSAqIFRoZSB0cmFuc2ZlciBmYWlsZWQsIGJ1dCB3ZSBzdGlsbCB3cml0ZSB0aGUgZGF0YSB0bwoJCQkgKiBrZWVwIHByZXBhcmUvY29tbWl0IGNhbGxzIGJhbGFuY2VkLgoJCQkgKi8KCQkJcHJpbnRrKEtFUk5fRVJSICJsb29wOiB0cmFuc2ZlciBlcnJvciBibG9jayAlbGx1XG4iLAoJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbmRleCk7CgkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwoJCQltZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIHNpemUpOwoJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CgkJfQoJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwoJCXJldCA9IGFvcHMtPmNvbW1pdF93cml0ZShmaWxlLCBwYWdlLCBvZmZzZXQsCgkJCQkJIG9mZnNldCArIHNpemUpOwoJCWlmICh1bmxpa2VseShyZXQpKSB7CgkJCWlmIChyZXQgPT0gQU9QX1RSVU5DQVRFRF9QQUdFKSB7CgkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CgkJCQljb250aW51ZTsKCQkJfQoJCQlnb3RvIHVubG9jazsKCQl9CgkJaWYgKHVubGlrZWx5KHRyYW5zZmVyX3Jlc3VsdCkpCgkJCWdvdG8gdW5sb2NrOwoJCWJ2X29mZnMgKz0gc2l6ZTsKCQlsZW4gLT0gc2l6ZTsKCQlvZmZzZXQgPSAwOwoJCWluZGV4Kys7CgkJcG9zICs9IHNpemU7CgkJdW5sb2NrX3BhZ2UocGFnZSk7CgkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwoJfQoJcmV0ID0gMDsKb3V0OgoJbXV0ZXhfdW5sb2NrKCZtYXBwaW5nLT5ob3N0LT5pX211dGV4KTsKCXJldHVybiByZXQ7CnVubG9jazoKCXVubG9ja19wYWdlKHBhZ2UpOwoJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwpmYWlsOgoJcmV0ID0gLTE7Cglnb3RvIG91dDsKfQoKLyoqCiAqIF9fZG9fbG9fc2VuZF93cml0ZSAtIGhlbHBlciBmb3Igd3JpdGluZyBkYXRhIHRvIGEgbG9vcCBkZXZpY2UKICoKICogVGhpcyBoZWxwZXIganVzdCBmYWN0b3JzIG91dCBjb21tb24gY29kZSBiZXR3ZWVuIGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlKCkKICogYW5kIGRvX2xvX3NlbmRfd3JpdGUoKS4KICovCnN0YXRpYyBpbnQgX19kb19sb19zZW5kX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAoJCXU4IF9fdXNlciAqYnVmLCBjb25zdCBpbnQgbGVuLCBsb2ZmX3QgcG9zKQp7Cglzc2l6ZV90IGJ3OwoJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwoKCXNldF9mcyhnZXRfZHMoKSk7CglidyA9IGZpbGUtPmZfb3AtPndyaXRlKGZpbGUsIGJ1ZiwgbGVuLCAmcG9zKTsKCXNldF9mcyhvbGRfZnMpOwoJaWYgKGxpa2VseShidyA9PSBsZW4pKQoJCXJldHVybiAwOwoJcHJpbnRrKEtFUk5fRVJSICJsb29wOiBXcml0ZSBlcnJvciBhdCBieXRlIG9mZnNldCAlbGx1LCBsZW5ndGggJWkuXG4iLAoJCQkodW5zaWduZWQgbG9uZyBsb25nKXBvcywgbGVuKTsKCWlmIChidyA+PSAwKQoJCWJ3ID0gLUVJTzsKCXJldHVybiBidzsKfQoKLyoqCiAqIGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogKgogKiBUaGlzIGlzIHRoZSBmYXN0LCBub24tdHJhbnNmb3JtaW5nIHZlcnNpb24gZm9yIGJhY2tpbmcgZmlsZXN5c3RlbXMgd2hpY2ggZG8KICogbm90IGltcGxlbWVudCB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIHByZXBhcmVfd3JpdGUgYW5kIGNvbW1pdF93cml0ZS4KICogSXQgdXNlcyB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIHdyaXRlYWJsZQogKiBmaWxlc3lzdGVtcy4KICovCnN0YXRpYyBpbnQgZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywKCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgaW50IGJzaXplLCBsb2ZmX3QgcG9zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKewoJc3NpemVfdCBidyA9IF9fZG9fbG9fc2VuZF93cml0ZShsby0+bG9fYmFja2luZ19maWxlLAoJCQkodTggX191c2VyICopa21hcChidmVjLT5idl9wYWdlKSArIGJ2ZWMtPmJ2X29mZnNldCwKCQkJYnZlYy0+YnZfbGVuLCBwb3MpOwoJa3VubWFwKGJ2ZWMtPmJ2X3BhZ2UpOwoJY29uZF9yZXNjaGVkKCk7CglyZXR1cm4gYnc7Cn0KCi8qKgogKiBkb19sb19zZW5kX3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogKgogKiBUaGlzIGlzIHRoZSBzbG93LCB0cmFuc2Zvcm1pbmcgdmVyc2lvbiBmb3IgZmlsZXN5c3RlbXMgd2hpY2ggZG8gbm90CiAqIGltcGxlbWVudCB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIHByZXBhcmVfd3JpdGUgYW5kIGNvbW1pdF93cml0ZS4gIEl0CiAqIHVzZXMgdGhlIHdyaXRlIGZpbGUgb3BlcmF0aW9uIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50IG9uIGFsbCB3cml0ZWFibGUKICogZmlsZXN5c3RlbXMuCiAqCiAqIFVzaW5nIGZvcHMtPndyaXRlIGlzIHNsb3dlciB0aGFuIHVzaW5nIGFvcHMtPntwcmVwYXJlLGNvbW1pdH1fd3JpdGUgaW4gdGhlCiAqIHRyYW5zZm9ybWluZyBjYXNlIGJlY2F1c2Ugd2UgbmVlZCB0byBkb3VibGUgYnVmZmVyIHRoZSBkYXRhIGFzIHdlIGNhbm5vdCBkbwogKiB0aGUgdHJhbnNmb3JtYXRpb25zIGluIHBsYWNlIGFzIHdlIGRvIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlCiAqIGRlc3RpbmF0aW9uIHBhZ2VzIG9mIHRoZSBiYWNraW5nIGZpbGUuCiAqLwpzdGF0aWMgaW50IGRvX2xvX3NlbmRfd3JpdGUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpb192ZWMgKmJ2ZWMsCgkJaW50IGJzaXplLCBsb2ZmX3QgcG9zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKewoJaW50IHJldCA9IGxvX2RvX3RyYW5zZmVyKGxvLCBXUklURSwgcGFnZSwgMCwgYnZlYy0+YnZfcGFnZSwKCQkJYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4sIHBvcyA+PiA5KTsKCWlmIChsaWtlbHkoIXJldCkpCgkJcmV0dXJuIF9fZG9fbG9fc2VuZF93cml0ZShsby0+bG9fYmFja2luZ19maWxlLAoJCQkJKHU4IF9fdXNlciAqKXBhZ2VfYWRkcmVzcyhwYWdlKSwgYnZlYy0+YnZfbGVuLAoJCQkJcG9zKTsKCXByaW50ayhLRVJOX0VSUiAibG9vcDogVHJhbnNmZXIgZXJyb3IgYXQgYnl0ZSBvZmZzZXQgJWxsdSwgIgoJCQkibGVuZ3RoICVpLlxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwb3MsIGJ2ZWMtPmJ2X2xlbik7CglpZiAocmV0ID4gMCkKCQlyZXQgPSAtRUlPOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBsb19zZW5kKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBiaW8gKmJpbywgaW50IGJzaXplLAoJCWxvZmZfdCBwb3MpCnsKCWludCAoKmRvX2xvX3NlbmQpKHN0cnVjdCBsb29wX2RldmljZSAqLCBzdHJ1Y3QgYmlvX3ZlYyAqLCBpbnQsIGxvZmZfdCwKCQkJc3RydWN0IHBhZ2UgKnBhZ2UpOwoJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CglzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CglpbnQgaSwgcmV0ID0gMDsKCglkb19sb19zZW5kID0gZG9fbG9fc2VuZF9hb3BzOwoJaWYgKCEobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfVVNFX0FPUFMpKSB7CgkJZG9fbG9fc2VuZCA9IGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlOwoJCWlmIChsby0+dHJhbnNmZXIgIT0gdHJhbnNmZXJfbm9uZSkgewoJCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9JTyB8IF9fR0ZQX0hJR0hNRU0pOwoJCQlpZiAodW5saWtlbHkoIXBhZ2UpKQoJCQkJZ290byBmYWlsOwoJCQlrbWFwKHBhZ2UpOwoJCQlkb19sb19zZW5kID0gZG9fbG9fc2VuZF93cml0ZTsKCQl9Cgl9CgliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKCQlyZXQgPSBkb19sb19zZW5kKGxvLCBidmVjLCBic2l6ZSwgcG9zLCBwYWdlKTsKCQlpZiAocmV0IDwgMCkKCQkJYnJlYWs7CgkJcG9zICs9IGJ2ZWMtPmJ2X2xlbjsKCX0KCWlmIChwYWdlKSB7CgkJa3VubWFwKHBhZ2UpOwoJCV9fZnJlZV9wYWdlKHBhZ2UpOwoJfQpvdXQ6CglyZXR1cm4gcmV0OwpmYWlsOgoJcHJpbnRrKEtFUk5fRVJSICJsb29wOiBGYWlsZWQgdG8gYWxsb2NhdGUgdGVtcG9yYXJ5IHBhZ2UgZm9yIHdyaXRlLlxuIik7CglyZXQgPSAtRU5PTUVNOwoJZ290byBvdXQ7Cn0KCnN0cnVjdCBsb19yZWFkX2RhdGEgewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbzsKCXN0cnVjdCBwYWdlICpwYWdlOwoJdW5zaWduZWQgb2Zmc2V0OwoJaW50IGJzaXplOwp9OwoKc3RhdGljIGludApsb19yZWFkX2FjdG9yKHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCnsKCXVuc2lnbmVkIGxvbmcgY291bnQgPSBkZXNjLT5jb3VudDsKCXN0cnVjdCBsb19yZWFkX2RhdGEgKnAgPSBkZXNjLT5hcmcuZGF0YTsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBwLT5sbzsKCXNlY3Rvcl90IElWOwoKCUlWID0gKChzZWN0b3JfdCkgcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSA5KSkrKG9mZnNldCA+PiA5KTsKCglpZiAoc2l6ZSA+IGNvdW50KQoJCXNpemUgPSBjb3VudDsKCglpZiAobG9fZG9fdHJhbnNmZXIobG8sIFJFQUQsIHBhZ2UsIG9mZnNldCwgcC0+cGFnZSwgcC0+b2Zmc2V0LCBzaXplLCBJVikpIHsKCQlzaXplID0gMDsKCQlwcmludGsoS0VSTl9FUlIgImxvb3A6IHRyYW5zZmVyIGVycm9yIGJsb2NrICVsZFxuIiwKCQkgICAgICAgcGFnZS0+aW5kZXgpOwoJCWRlc2MtPmVycm9yID0gLUVJTlZBTDsKCX0KCglmbHVzaF9kY2FjaGVfcGFnZShwLT5wYWdlKTsKCglkZXNjLT5jb3VudCA9IGNvdW50IC0gc2l6ZTsKCWRlc2MtPndyaXR0ZW4gKz0gc2l6ZTsKCXAtPm9mZnNldCArPSBzaXplOwoJcmV0dXJuIHNpemU7Cn0KCnN0YXRpYyBpbnQKZG9fbG9fcmVjZWl2ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLAoJICAgICAgc3RydWN0IGJpb192ZWMgKmJ2ZWMsIGludCBic2l6ZSwgbG9mZl90IHBvcykKewoJc3RydWN0IGxvX3JlYWRfZGF0YSBjb29raWU7CglzdHJ1Y3QgZmlsZSAqZmlsZTsKCWludCByZXR2YWw7CgoJY29va2llLmxvID0gbG87Cgljb29raWUucGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7Cgljb29raWUub2Zmc2V0ID0gYnZlYy0+YnZfb2Zmc2V0OwoJY29va2llLmJzaXplID0gYnNpemU7CglmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKCXJldHZhbCA9IGZpbGUtPmZfb3AtPnNlbmRmaWxlKGZpbGUsICZwb3MsIGJ2ZWMtPmJ2X2xlbiwKCQkJbG9fcmVhZF9hY3RvciwgJmNvb2tpZSk7CglyZXR1cm4gKHJldHZhbCA8IDApPyByZXR2YWw6IDA7Cn0KCnN0YXRpYyBpbnQKbG9fcmVjZWl2ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBic2l6ZSwgbG9mZl90IHBvcykKewoJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CglpbnQgaSwgcmV0ID0gMDsKCgliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKCQlyZXQgPSBkb19sb19yZWNlaXZlKGxvLCBidmVjLCBic2l6ZSwgcG9zKTsKCQlpZiAocmV0IDwgMCkKCQkJYnJlYWs7CgkJcG9zICs9IGJ2ZWMtPmJ2X2xlbjsKCX0KCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgZG9fYmlvX2ZpbGViYWNrZWQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvKQp7Cglsb2ZmX3QgcG9zOwoJaW50IHJldDsKCglwb3MgPSAoKGxvZmZfdCkgYmlvLT5iaV9zZWN0b3IgPDwgOSkgKyBsby0+bG9fb2Zmc2V0OwoJaWYgKGJpb19ydyhiaW8pID09IFdSSVRFKQoJCXJldCA9IGxvX3NlbmQobG8sIGJpbywgbG8tPmxvX2Jsb2Nrc2l6ZSwgcG9zKTsKCWVsc2UKCQlyZXQgPSBsb19yZWNlaXZlKGxvLCBiaW8sIGxvLT5sb19ibG9ja3NpemUsIHBvcyk7CglyZXR1cm4gcmV0Owp9CgovKgogKiBBZGQgYmlvIHRvIGJhY2sgb2YgcGVuZGluZyBsaXN0CiAqLwpzdGF0aWMgdm9pZCBsb29wX2FkZF9iaW8oc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpbyAqYmlvKQp7CglpZiAobG8tPmxvX2Jpb3RhaWwpIHsKCQlsby0+bG9fYmlvdGFpbC0+YmlfbmV4dCA9IGJpbzsKCQlsby0+bG9fYmlvdGFpbCA9IGJpbzsKCX0gZWxzZQoJCWxvLT5sb19iaW8gPSBsby0+bG9fYmlvdGFpbCA9IGJpbzsKfQoKLyoKICogR3JhYiBmaXJzdCBwZW5kaW5nIGJ1ZmZlcgogKi8Kc3RhdGljIHN0cnVjdCBiaW8gKmxvb3BfZ2V0X2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQp7CglzdHJ1Y3QgYmlvICpiaW87CgoJaWYgKChiaW8gPSBsby0+bG9fYmlvKSkgewoJCWlmIChiaW8gPT0gbG8tPmxvX2Jpb3RhaWwpCgkJCWxvLT5sb19iaW90YWlsID0gTlVMTDsKCQlsby0+bG9fYmlvID0gYmlvLT5iaV9uZXh0OwoJCWJpby0+YmlfbmV4dCA9IE5VTEw7Cgl9CgoJcmV0dXJuIGJpbzsKfQoKc3RhdGljIGludCBsb29wX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKm9sZF9iaW8pCnsKCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBxLT5xdWV1ZWRhdGE7CglpbnQgcncgPSBiaW9fcncob2xkX2Jpbyk7CgoJaWYgKHJ3ID09IFJFQURBKQoJCXJ3ID0gUkVBRDsKCglCVUdfT04oIWxvIHx8IChydyAhPSBSRUFEICYmIHJ3ICE9IFdSSVRFKSk7CgoJc3Bpbl9sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKCQlnb3RvIG91dDsKCWlmICh1bmxpa2VseShydyA9PSBXUklURSAmJiAobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUkVBRF9PTkxZKSkpCgkJZ290byBvdXQ7Cglsby0+bG9fcGVuZGluZysrOwoJbG9vcF9hZGRfYmlvKGxvLCBvbGRfYmlvKTsKCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoJY29tcGxldGUoJmxvLT5sb19iaF9kb25lKTsKCXJldHVybiAwOwoKb3V0OgoJaWYgKGxvLT5sb19wZW5kaW5nID09IDApCgkJY29tcGxldGUoJmxvLT5sb19iaF9kb25lKTsKCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoJYmlvX2lvX2Vycm9yKG9sZF9iaW8sIG9sZF9iaW8tPmJpX3NpemUpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIGtpY2sgb2ZmIGlvIG9uIHRoZSB1bmRlcmx5aW5nIGFkZHJlc3Mgc3BhY2UKICovCnN0YXRpYyB2b2lkIGxvb3BfdW5wbHVnKHJlcXVlc3RfcXVldWVfdCAqcSkKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IHEtPnF1ZXVlZGF0YTsKCgljbGVhcl9iaXQoUVVFVUVfRkxBR19QTFVHR0VELCAmcS0+cXVldWVfZmxhZ3MpOwoJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGxvLT5sb19iYWNraW5nX2ZpbGUtPmZfbWFwcGluZyk7Cn0KCnN0cnVjdCBzd2l0Y2hfcmVxdWVzdCB7CglzdHJ1Y3QgZmlsZSAqZmlsZTsKCXN0cnVjdCBjb21wbGV0aW9uIHdhaXQ7Cn07CgpzdGF0aWMgdm9pZCBkb19sb29wX3N3aXRjaChzdHJ1Y3QgbG9vcF9kZXZpY2UgKiwgc3RydWN0IHN3aXRjaF9yZXF1ZXN0ICopOwoKc3RhdGljIGlubGluZSB2b2lkIGxvb3BfaGFuZGxlX2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8pCnsKCWlmICh1bmxpa2VseSghYmlvLT5iaV9iZGV2KSkgewoJCWRvX2xvb3Bfc3dpdGNoKGxvLCBiaW8tPmJpX3ByaXZhdGUpOwoJCWJpb19wdXQoYmlvKTsKCX0gZWxzZSB7CgkJaW50IHJldCA9IGRvX2Jpb19maWxlYmFja2VkKGxvLCBiaW8pOwoJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgcmV0KTsKCX0KfQoKLyoKICogd29ya2VyIHRocmVhZCB0aGF0IGhhbmRsZXMgcmVhZHMvd3JpdGVzIHRvIGZpbGUgYmFja2VkIGxvb3AgZGV2aWNlcywKICogdG8gYXZvaWQgYmxvY2tpbmcgaW4gb3VyIG1ha2VfcmVxdWVzdF9mbi4gaXQgYWxzbyBkb2VzIGxvb3AgZGVjcnlwdGluZwogKiBvbiByZWFkcyBmb3IgYmxvY2sgYmFja2VkIGxvb3AsIGFzIHRoYXQgaXMgdG9vIGhlYXZ5IHRvIGRvIGZyb20KICogYl9lbmRfaW8gY29udGV4dCB3aGVyZSBpcnFzIG1heSBiZSBkaXNhYmxlZC4KICovCnN0YXRpYyBpbnQgbG9vcF90aHJlYWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGRhdGE7CglzdHJ1Y3QgYmlvICpiaW87CgoJZGFlbW9uaXplKCJsb29wJWQiLCBsby0+bG9fbnVtYmVyKTsKCgkvKgoJICogbG9vcCBjYW4gYmUgdXNlZCBpbiBhbiBlbmNyeXB0ZWQgZGV2aWNlLAoJICogaGVuY2UsIGl0IG11c3RuJ3QgYmUgc3RvcHBlZCBhdCBhbGwKCSAqIGJlY2F1c2UgaXQgY291bGQgYmUgaW5kaXJlY3RseSB1c2VkIGR1cmluZyBzdXNwZW5zaW9uCgkgKi8KCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwoKCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKCglsby0+bG9fc3RhdGUgPSBMb19ib3VuZDsKCWxvLT5sb19wZW5kaW5nID0gMTsKCgkvKgoJICogY29tcGxldGUgaXQsIHdlIGFyZSBydW5uaW5nCgkgKi8KCWNvbXBsZXRlKCZsby0+bG9fZG9uZSk7CgoJZm9yICg7OykgewoJCWludCBwZW5kaW5nOwoKCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZsby0+bG9fYmhfZG9uZSkpCgkJCWNvbnRpbnVlOwoKCQlzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7CgoJCS8qCgkJICogY291bGQgYmUgY29tcGxldGVkIGJlY2F1c2Ugb2YgdGVhci1kb3duLCBub3QgcGVuZGluZyB3b3JrCgkJICovCgkJaWYgKHVubGlrZWx5KCFsby0+bG9fcGVuZGluZykpIHsKCQkJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7CgkJCWJyZWFrOwoJCX0KCgkJYmlvID0gbG9vcF9nZXRfYmlvKGxvKTsKCQlsby0+bG9fcGVuZGluZy0tOwoJCXBlbmRpbmcgPSBsby0+bG9fcGVuZGluZzsKCQlzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKCgkJQlVHX09OKCFiaW8pOwoJCWxvb3BfaGFuZGxlX2JpbyhsbywgYmlvKTsKCgkJLyoKCQkgKiB1cHBlZCBib3RoIGZvciBwZW5kaW5nIHdvcmsgYW5kIHRlYXItZG93biwgbG9fcGVuZGluZwoJCSAqIHdpbGwgaGl0IHplcm8gdGhlbgoJCSAqLwoJCWlmICh1bmxpa2VseSghcGVuZGluZykpCgkJCWJyZWFrOwoJfQoKCWNvbXBsZXRlKCZsby0+bG9fZG9uZSk7CglyZXR1cm4gMDsKfQoKLyoKICogbG9vcF9zd2l0Y2ggcGVyZm9ybXMgdGhlIGhhcmQgd29yayBvZiBzd2l0Y2hpbmcgYSBiYWNraW5nIHN0b3JlLgogKiBGaXJzdCBpdCBuZWVkcyB0byBmbHVzaCBleGlzdGluZyBJTywgaXQgZG9lcyB0aGlzIGJ5IHNlbmRpbmcgYSBtYWdpYwogKiBCSU8gZG93biB0aGUgcGlwZS4gVGhlIGNvbXBsZXRpb24gb2YgdGhpcyBCSU8gZG9lcyB0aGUgYWN0dWFsIHN3aXRjaC4KICovCnN0YXRpYyBpbnQgbG9vcF9zd2l0Y2goc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBzd2l0Y2hfcmVxdWVzdCB3OwoJc3RydWN0IGJpbyAqYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIDEpOwoJaWYgKCFiaW8pCgkJcmV0dXJuIC1FTk9NRU07Cglpbml0X2NvbXBsZXRpb24oJncud2FpdCk7Cgl3LmZpbGUgPSBmaWxlOwoJYmlvLT5iaV9wcml2YXRlID0gJnc7CgliaW8tPmJpX2JkZXYgPSBOVUxMOwoJbG9vcF9tYWtlX3JlcXVlc3QobG8tPmxvX3F1ZXVlLCBiaW8pOwoJd2FpdF9mb3JfY29tcGxldGlvbigmdy53YWl0KTsKCXJldHVybiAwOwp9CgovKgogKiBEbyB0aGUgYWN0dWFsIHN3aXRjaDsgY2FsbGVkIGZyb20gdGhlIEJJTyBjb21wbGV0aW9uIHJvdXRpbmUKICovCnN0YXRpYyB2b2lkIGRvX2xvb3Bfc3dpdGNoKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBzd2l0Y2hfcmVxdWVzdCAqcCkKewoJc3RydWN0IGZpbGUgKmZpbGUgPSBwLT5maWxlOwoJc3RydWN0IGZpbGUgKm9sZF9maWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwoKCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG9sZF9maWxlLT5mX21hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2spOwoJbG8tPmxvX2JhY2tpbmdfZmlsZSA9IGZpbGU7Cglsby0+bG9fYmxvY2tzaXplID0gU19JU0JMSyhtYXBwaW5nLT5ob3N0LT5pX21vZGUpID8KCQltYXBwaW5nLT5ob3N0LT5pX2JkZXYtPmJkX2Jsb2NrX3NpemUgOiBQQUdFX1NJWkU7Cglsby0+b2xkX2dmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2sgJiB+KF9fR0ZQX0lPfF9fR0ZQX0ZTKSk7Cgljb21wbGV0ZSgmcC0+d2FpdCk7Cn0KCgovKgogKiBsb29wX2NoYW5nZV9mZCBzd2l0Y2hlZCB0aGUgYmFja2luZyBzdG9yZSBvZiBhIGxvb3BiYWNrIGRldmljZSB0bwogKiBhIG5ldyBmaWxlLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3BlcmF0aW5nIHN5c3RlbSBpbnN0YWxsZXJzIHRvIGZyZWUgdXAKICogdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGluIEhpZ2ggQXZhaWxhYmlsaXR5IGVudmlyb25tZW50cyB0byBzd2l0Y2ggdG8KICogYW4gYWx0ZXJuYXRpdmUgbG9jYXRpb24gZm9yIHRoZSBjb250ZW50IGluIGNhc2Ugb2Ygc2VydmVyIG1lbHRkb3duLgogKiBUaGlzIGNhbiBvbmx5IHdvcmsgaWYgdGhlIGxvb3AgZGV2aWNlIGlzIHVzZWQgcmVhZC1vbmx5LCBhbmQgaWYgdGhlCiAqIG5ldyBiYWNraW5nIHN0b3JlIGlzIHRoZSBzYW1lIHNpemUgYW5kIHR5cGUgYXMgdGhlIG9sZCBiYWNraW5nIHN0b3JlLgogKi8Kc3RhdGljIGludCBsb29wX2NoYW5nZV9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgZmlsZSAqbG9fZmlsZSwKCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IGFyZykKewoJc3RydWN0IGZpbGUJKmZpbGUsICpvbGRfZmlsZTsKCXN0cnVjdCBpbm9kZQkqaW5vZGU7CglpbnQJCWVycm9yOwoKCWVycm9yID0gLUVOWElPOwoJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKCQlnb3RvIG91dDsKCgkvKiB0aGUgbG9vcCBkZXZpY2UgaGFzIHRvIGJlIHJlYWQtb25seSAqLwoJZXJyb3IgPSAtRUlOVkFMOwoJaWYgKCEobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUkVBRF9PTkxZKSkKCQlnb3RvIG91dDsKCgllcnJvciA9IC1FQkFERjsKCWZpbGUgPSBmZ2V0KGFyZyk7CglpZiAoIWZpbGUpCgkJZ290byBvdXQ7CgoJaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CglvbGRfZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CgoJZXJyb3IgPSAtRUlOVkFMOwoKCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQlnb3RvIG91dF9wdXRmOwoKCS8qIG5ldyBiYWNraW5nIHN0b3JlIG5lZWRzIHRvIHN1cHBvcnQgbG9vcCAoZWcgc2VuZGZpbGUpICovCglpZiAoIWlub2RlLT5pX2ZvcC0+c2VuZGZpbGUpCgkJZ290byBvdXRfcHV0ZjsKCgkvKiBzaXplIG9mIHRoZSBuZXcgYmFja2luZyBzdG9yZSBuZWVkcyB0byBiZSB0aGUgc2FtZSAqLwoJaWYgKGdldF9sb29wX3NpemUobG8sIGZpbGUpICE9IGdldF9sb29wX3NpemUobG8sIG9sZF9maWxlKSkKCQlnb3RvIG91dF9wdXRmOwoKCS8qIGFuZCAuLi4gc3dpdGNoICovCgllcnJvciA9IGxvb3Bfc3dpdGNoKGxvLCBmaWxlKTsKCWlmIChlcnJvcikKCQlnb3RvIG91dF9wdXRmOwoKCWZwdXQob2xkX2ZpbGUpOwoJcmV0dXJuIDA7Cgogb3V0X3B1dGY6CglmcHV0KGZpbGUpOwogb3V0OgoJcmV0dXJuIGVycm9yOwp9CgpzdGF0aWMgaW5saW5lIGludCBpc19sb29wX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IGlub2RlICppID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwoKCXJldHVybiBpICYmIFNfSVNCTEsoaS0+aV9tb2RlKSAmJiBNQUpPUihpLT5pX3JkZXYpID09IExPT1BfTUFKT1I7Cn0KCnN0YXRpYyBpbnQgbG9vcF9zZXRfZmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGZpbGUgKmxvX2ZpbGUsCgkJICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGludCBhcmcpCnsKCXN0cnVjdCBmaWxlCSpmaWxlLCAqZjsKCXN0cnVjdCBpbm9kZQkqaW5vZGU7CglzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKCXVuc2lnbmVkIGxvX2Jsb2Nrc2l6ZTsKCWludAkJbG9fZmxhZ3MgPSAwOwoJaW50CQllcnJvcjsKCWxvZmZfdAkJc2l6ZTsKCgkvKiBUaGlzIGlzIHNhZmUsIHNpbmNlIHdlIGhhdmUgYSByZWZlcmVuY2UgZnJvbSBvcGVuKCkuICovCglfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwoKCWVycm9yID0gLUVCQURGOwoJZmlsZSA9IGZnZXQoYXJnKTsKCWlmICghZmlsZSkKCQlnb3RvIG91dDsKCgllcnJvciA9IC1FQlVTWTsKCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fdW5ib3VuZCkKCQlnb3RvIG91dF9wdXRmOwoKCS8qIEF2b2lkIHJlY3Vyc2lvbiAqLwoJZiA9IGZpbGU7Cgl3aGlsZSAoaXNfbG9vcF9kZXZpY2UoZikpIHsKCQlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmw7CgoJCWlmIChmLT5mX21hcHBpbmctPmhvc3QtPmlfcmRldiA9PSBsb19maWxlLT5mX21hcHBpbmctPmhvc3QtPmlfcmRldikKCQkJZ290byBvdXRfcHV0ZjsKCgkJbCA9IGYtPmZfbWFwcGluZy0+aG9zdC0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CgkJaWYgKGwtPmxvX3N0YXRlID09IExvX3VuYm91bmQpIHsKCQkJZXJyb3IgPSAtRUlOVkFMOwoJCQlnb3RvIG91dF9wdXRmOwoJCX0KCQlmID0gbC0+bG9fYmFja2luZ19maWxlOwoJfQoKCW1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Cglpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CgoJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQoJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1JFQURfT05MWTsKCgllcnJvciA9IC1FSU5WQUw7CglpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CgkJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYW9wcyA9IG1hcHBpbmctPmFfb3BzOwoJCS8qCgkJICogSWYgd2UgY2FuJ3QgcmVhZCAtIHNvcnJ5LiBJZiB3ZSBvbmx5IGNhbid0IHdyaXRlIC0gd2VsbCwKCQkgKiBpdCdzIGdvaW5nIHRvIGJlIHJlYWQtb25seS4KCQkgKi8KCQlpZiAoIWZpbGUtPmZfb3AtPnNlbmRmaWxlKQoJCQlnb3RvIG91dF9wdXRmOwoJCWlmIChhb3BzLT5wcmVwYXJlX3dyaXRlICYmIGFvcHMtPmNvbW1pdF93cml0ZSkKCQkJbG9fZmxhZ3MgfD0gTE9fRkxBR1NfVVNFX0FPUFM7CgkJaWYgKCEobG9fZmxhZ3MgJiBMT19GTEFHU19VU0VfQU9QUykgJiYgIWZpbGUtPmZfb3AtPndyaXRlKQoJCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CgoJCWxvX2Jsb2Nrc2l6ZSA9IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgPwoJCQlpbm9kZS0+aV9iZGV2LT5iZF9ibG9ja19zaXplIDogUEFHRV9TSVpFOwoKCQllcnJvciA9IDA7Cgl9IGVsc2UgewoJCWdvdG8gb3V0X3B1dGY7Cgl9CgoJc2l6ZSA9IGdldF9sb29wX3NpemUobG8sIGZpbGUpOwoKCWlmICgobG9mZl90KShzZWN0b3JfdClzaXplICE9IHNpemUpIHsKCQllcnJvciA9IC1FRkJJRzsKCQlnb3RvIG91dF9wdXRmOwoJfQoKCWlmICghKGxvX2ZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CgoJc2V0X2RldmljZV9ybyhiZGV2LCAobG9fZmxhZ3MgJiBMT19GTEFHU19SRUFEX09OTFkpICE9IDApOwoKCWxvLT5sb19ibG9ja3NpemUgPSBsb19ibG9ja3NpemU7Cglsby0+bG9fZGV2aWNlID0gYmRldjsKCWxvLT5sb19mbGFncyA9IGxvX2ZsYWdzOwoJbG8tPmxvX2JhY2tpbmdfZmlsZSA9IGZpbGU7Cglsby0+dHJhbnNmZXIgPSB0cmFuc2Zlcl9ub25lOwoJbG8tPmlvY3RsID0gTlVMTDsKCWxvLT5sb19zaXplbGltaXQgPSAwOwoJbG8tPm9sZF9nZnBfbWFzayA9IG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZyk7CgltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBsby0+b2xkX2dmcF9tYXNrICYgfihfX0dGUF9JT3xfX0dGUF9GUykpOwoKCWxvLT5sb19iaW8gPSBsby0+bG9fYmlvdGFpbCA9IE5VTEw7CgoJLyoKCSAqIHNldCBxdWV1ZSBtYWtlX3JlcXVlc3RfZm4sIGFuZCBhZGQgbGltaXRzIGJhc2VkIG9uIGxvd2VyIGxldmVsCgkgKiBkZXZpY2UKCSAqLwoJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChsby0+bG9fcXVldWUsIGxvb3BfbWFrZV9yZXF1ZXN0KTsKCWxvLT5sb19xdWV1ZS0+cXVldWVkYXRhID0gbG87Cglsby0+bG9fcXVldWUtPnVucGx1Z19mbiA9IGxvb3BfdW5wbHVnOwoKCXNldF9jYXBhY2l0eShkaXNrc1tsby0+bG9fbnVtYmVyXSwgc2l6ZSk7CgliZF9zZXRfc2l6ZShiZGV2LCBzaXplIDw8IDkpOwoKCXNldF9ibG9ja3NpemUoYmRldiwgbG9fYmxvY2tzaXplKTsKCgllcnJvciA9IGtlcm5lbF90aHJlYWQobG9vcF90aHJlYWQsIGxvLCBDTE9ORV9LRVJORUwpOwoJaWYgKGVycm9yIDwgMCkKCQlnb3RvIG91dF9wdXRmOwoJd2FpdF9mb3JfY29tcGxldGlvbigmbG8tPmxvX2RvbmUpOwoJcmV0dXJuIDA7Cgogb3V0X3B1dGY6CglmcHV0KGZpbGUpOwogb3V0OgoJLyogVGhpcyBpcyBzYWZlOiBvcGVuKCkgaXMgc3RpbGwgaG9sZGluZyBhIHJlZmVyZW5jZS4gKi8KCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwoJcmV0dXJuIGVycm9yOwp9CgpzdGF0aWMgaW50Cmxvb3BfcmVsZWFzZV94ZmVyKHN0cnVjdCBsb29wX2RldmljZSAqbG8pCnsKCWludCBlcnIgPSAwOwoJc3RydWN0IGxvb3BfZnVuY190YWJsZSAqeGZlciA9IGxvLT5sb19lbmNyeXB0aW9uOwoKCWlmICh4ZmVyKSB7CgkJaWYgKHhmZXItPnJlbGVhc2UpCgkJCWVyciA9IHhmZXItPnJlbGVhc2UobG8pOwoJCWxvLT50cmFuc2ZlciA9IE5VTEw7CgkJbG8tPmxvX2VuY3J5cHRpb24gPSBOVUxMOwoJCW1vZHVsZV9wdXQoeGZlci0+b3duZXIpOwoJfQoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludApsb29wX2luaXRfeGZlcihzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICp4ZmVyLAoJICAgICAgIGNvbnN0IHN0cnVjdCBsb29wX2luZm82NCAqaSkKewoJaW50IGVyciA9IDA7CgoJaWYgKHhmZXIpIHsKCQlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHhmZXItPm93bmVyOwoKCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KG93bmVyKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKHhmZXItPmluaXQpCgkJCWVyciA9IHhmZXItPmluaXQobG8sIGkpOwoJCWlmIChlcnIpCgkJCW1vZHVsZV9wdXQob3duZXIpOwoJCWVsc2UKCQkJbG8tPmxvX2VuY3J5cHRpb24gPSB4ZmVyOwoJfQoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBsb29wX2Nscl9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQp7CglzdHJ1Y3QgZmlsZSAqZmlscCA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CglnZnBfdCBnZnAgPSBsby0+b2xkX2dmcF9tYXNrOwoKCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fYm91bmQpCgkJcmV0dXJuIC1FTlhJTzsKCglpZiAobG8tPmxvX3JlZmNudCA+IDEpCS8qIHdlIG5lZWRlZCBvbmUgZmQgZm9yIHRoZSBpb2N0bCAqLwoJCXJldHVybiAtRUJVU1k7CgoJaWYgKGZpbHAgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7Cglsby0+bG9fc3RhdGUgPSBMb19ydW5kb3duOwoJbG8tPmxvX3BlbmRpbmctLTsKCWlmICghbG8tPmxvX3BlbmRpbmcpCgkJY29tcGxldGUoJmxvLT5sb19iaF9kb25lKTsKCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwoKCXdhaXRfZm9yX2NvbXBsZXRpb24oJmxvLT5sb19kb25lKTsKCglsby0+bG9fYmFja2luZ19maWxlID0gTlVMTDsKCglsb29wX3JlbGVhc2VfeGZlcihsbyk7Cglsby0+dHJhbnNmZXIgPSBOVUxMOwoJbG8tPmlvY3RsID0gTlVMTDsKCWxvLT5sb19kZXZpY2UgPSBOVUxMOwoJbG8tPmxvX2VuY3J5cHRpb24gPSBOVUxMOwoJbG8tPmxvX29mZnNldCA9IDA7Cglsby0+bG9fc2l6ZWxpbWl0ID0gMDsKCWxvLT5sb19lbmNyeXB0X2tleV9zaXplID0gMDsKCWxvLT5sb19mbGFncyA9IDA7CgltZW1zZXQobG8tPmxvX2VuY3J5cHRfa2V5LCAwLCBMT19LRVlfU0laRSk7CgltZW1zZXQobG8tPmxvX2NyeXB0X25hbWUsIDAsIExPX05BTUVfU0laRSk7CgltZW1zZXQobG8tPmxvX2ZpbGVfbmFtZSwgMCwgTE9fTkFNRV9TSVpFKTsKCWludmFsaWRhdGVfYmRldihiZGV2LCAwKTsKCXNldF9jYXBhY2l0eShkaXNrc1tsby0+bG9fbnVtYmVyXSwgMCk7CgliZF9zZXRfc2l6ZShiZGV2LCAwKTsKCW1hcHBpbmdfc2V0X2dmcF9tYXNrKGZpbHAtPmZfbWFwcGluZywgZ2ZwKTsKCWxvLT5sb19zdGF0ZSA9IExvX3VuYm91bmQ7CglmcHV0KGZpbHApOwoJLyogVGhpcyBpcyBzYWZlOiBvcGVuKCkgaXMgc3RpbGwgaG9sZGluZyBhIHJlZmVyZW5jZS4gKi8KCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbG9vcF9zZXRfc3RhdHVzKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGNvbnN0IHN0cnVjdCBsb29wX2luZm82NCAqaW5mbykKewoJaW50IGVycjsKCXN0cnVjdCBsb29wX2Z1bmNfdGFibGUgKnhmZXI7CgoJaWYgKGxvLT5sb19lbmNyeXB0X2tleV9zaXplICYmIGxvLT5sb19rZXlfb3duZXIgIT0gY3VycmVudC0+dWlkICYmCgkgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCgkJcmV0dXJuIC1FUEVSTTsKCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fYm91bmQpCgkJcmV0dXJuIC1FTlhJTzsKCWlmICgodW5zaWduZWQgaW50KSBpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplID4gTE9fS0VZX1NJWkUpCgkJcmV0dXJuIC1FSU5WQUw7CgoJZXJyID0gbG9vcF9yZWxlYXNlX3hmZXIobG8pOwoJaWYgKGVycikKCQlyZXR1cm4gZXJyOwoKCWlmIChpbmZvLT5sb19lbmNyeXB0X3R5cGUpIHsKCQl1bnNpZ25lZCBpbnQgdHlwZSA9IGluZm8tPmxvX2VuY3J5cHRfdHlwZTsKCgkJaWYgKHR5cGUgPj0gTUFYX0xPX0NSWVBUKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQl4ZmVyID0geGZlcl9mdW5jc1t0eXBlXTsKCQlpZiAoeGZlciA9PSBOVUxMKQoJCQlyZXR1cm4gLUVJTlZBTDsKCX0gZWxzZQoJCXhmZXIgPSBOVUxMOwoKCWVyciA9IGxvb3BfaW5pdF94ZmVyKGxvLCB4ZmVyLCBpbmZvKTsKCWlmIChlcnIpCgkJcmV0dXJuIGVycjsKCglpZiAobG8tPmxvX29mZnNldCAhPSBpbmZvLT5sb19vZmZzZXQgfHwKCSAgICBsby0+bG9fc2l6ZWxpbWl0ICE9IGluZm8tPmxvX3NpemVsaW1pdCkgewoJCWxvLT5sb19vZmZzZXQgPSBpbmZvLT5sb19vZmZzZXQ7CgkJbG8tPmxvX3NpemVsaW1pdCA9IGluZm8tPmxvX3NpemVsaW1pdDsKCQlpZiAoZmlndXJlX2xvb3Bfc2l6ZShsbykpCgkJCXJldHVybiAtRUZCSUc7Cgl9CgoJbWVtY3B5KGxvLT5sb19maWxlX25hbWUsIGluZm8tPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCW1lbWNweShsby0+bG9fY3J5cHRfbmFtZSwgaW5mby0+bG9fY3J5cHRfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWxvLT5sb19maWxlX25hbWVbTE9fTkFNRV9TSVpFLTFdID0gMDsKCWxvLT5sb19jcnlwdF9uYW1lW0xPX05BTUVfU0laRS0xXSA9IDA7CgoJaWYgKCF4ZmVyKQoJCXhmZXIgPSAmbm9uZV9mdW5jczsKCWxvLT50cmFuc2ZlciA9IHhmZXItPnRyYW5zZmVyOwoJbG8tPmlvY3RsID0geGZlci0+aW9jdGw7CgoJbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPSBpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplOwoJbG8tPmxvX2luaXRbMF0gPSBpbmZvLT5sb19pbml0WzBdOwoJbG8tPmxvX2luaXRbMV0gPSBpbmZvLT5sb19pbml0WzFdOwoJaWYgKGluZm8tPmxvX2VuY3J5cHRfa2V5X3NpemUpIHsKCQltZW1jcHkobG8tPmxvX2VuY3J5cHRfa2V5LCBpbmZvLT5sb19lbmNyeXB0X2tleSwKCQkgICAgICAgaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSk7CgkJbG8tPmxvX2tleV9vd25lciA9IGN1cnJlbnQtPnVpZDsKCX0JCgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbG9vcF9nZXRfc3RhdHVzKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBsb29wX2luZm82NCAqaW5mbykKewoJc3RydWN0IGZpbGUgKmZpbGUgPSBsby0+bG9fYmFja2luZ19maWxlOwoJc3RydWN0IGtzdGF0IHN0YXQ7CglpbnQgZXJyb3I7CgoJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKCQlyZXR1cm4gLUVOWElPOwoJZXJyb3IgPSB2ZnNfZ2V0YXR0cihmaWxlLT5mX3Zmc21udCwgZmlsZS0+Zl9kZW50cnksICZzdGF0KTsKCWlmIChlcnJvcikKCQlyZXR1cm4gZXJyb3I7CgltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CglpbmZvLT5sb19udW1iZXIgPSBsby0+bG9fbnVtYmVyOwoJaW5mby0+bG9fZGV2aWNlID0gaHVnZV9lbmNvZGVfZGV2KHN0YXQuZGV2KTsKCWluZm8tPmxvX2lub2RlID0gc3RhdC5pbm87CglpbmZvLT5sb19yZGV2aWNlID0gaHVnZV9lbmNvZGVfZGV2KGxvLT5sb19kZXZpY2UgPyBzdGF0LnJkZXYgOiBzdGF0LmRldik7CglpbmZvLT5sb19vZmZzZXQgPSBsby0+bG9fb2Zmc2V0OwoJaW5mby0+bG9fc2l6ZWxpbWl0ID0gbG8tPmxvX3NpemVsaW1pdDsKCWluZm8tPmxvX2ZsYWdzID0gbG8tPmxvX2ZsYWdzOwoJbWVtY3B5KGluZm8tPmxvX2ZpbGVfbmFtZSwgbG8tPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCW1lbWNweShpbmZvLT5sb19jcnlwdF9uYW1lLCBsby0+bG9fY3J5cHRfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWluZm8tPmxvX2VuY3J5cHRfdHlwZSA9CgkJbG8tPmxvX2VuY3J5cHRpb24gPyBsby0+bG9fZW5jcnlwdGlvbi0+bnVtYmVyIDogMDsKCWlmIChsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSAmJiBjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CgkJaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGxvLT5sb19lbmNyeXB0X2tleV9zaXplOwoJCW1lbWNweShpbmZvLT5sb19lbmNyeXB0X2tleSwgbG8tPmxvX2VuY3J5cHRfa2V5LAoJCSAgICAgICBsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKbG9vcF9pbmZvNjRfZnJvbV9vbGQoY29uc3Qgc3RydWN0IGxvb3BfaW5mbyAqaW5mbywgc3RydWN0IGxvb3BfaW5mbzY0ICppbmZvNjQpCnsKCW1lbXNldChpbmZvNjQsIDAsIHNpemVvZigqaW5mbzY0KSk7CglpbmZvNjQtPmxvX251bWJlciA9IGluZm8tPmxvX251bWJlcjsKCWluZm82NC0+bG9fZGV2aWNlID0gaW5mby0+bG9fZGV2aWNlOwoJaW5mbzY0LT5sb19pbm9kZSA9IGluZm8tPmxvX2lub2RlOwoJaW5mbzY0LT5sb19yZGV2aWNlID0gaW5mby0+bG9fcmRldmljZTsKCWluZm82NC0+bG9fb2Zmc2V0ID0gaW5mby0+bG9fb2Zmc2V0OwoJaW5mbzY0LT5sb19zaXplbGltaXQgPSAwOwoJaW5mbzY0LT5sb19lbmNyeXB0X3R5cGUgPSBpbmZvLT5sb19lbmNyeXB0X3R5cGU7CglpbmZvNjQtPmxvX2VuY3J5cHRfa2V5X3NpemUgPSBpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplOwoJaW5mbzY0LT5sb19mbGFncyA9IGluZm8tPmxvX2ZsYWdzOwoJaW5mbzY0LT5sb19pbml0WzBdID0gaW5mby0+bG9faW5pdFswXTsKCWluZm82NC0+bG9faW5pdFsxXSA9IGluZm8tPmxvX2luaXRbMV07CglpZiAoaW5mby0+bG9fZW5jcnlwdF90eXBlID09IExPX0NSWVBUX0NSWVBUT0FQSSkKCQltZW1jcHkoaW5mbzY0LT5sb19jcnlwdF9uYW1lLCBpbmZvLT5sb19uYW1lLCBMT19OQU1FX1NJWkUpOwoJZWxzZQoJCW1lbWNweShpbmZvNjQtPmxvX2ZpbGVfbmFtZSwgaW5mby0+bG9fbmFtZSwgTE9fTkFNRV9TSVpFKTsKCW1lbWNweShpbmZvNjQtPmxvX2VuY3J5cHRfa2V5LCBpbmZvLT5sb19lbmNyeXB0X2tleSwgTE9fS0VZX1NJWkUpOwp9CgpzdGF0aWMgaW50Cmxvb3BfaW5mbzY0X3RvX29sZChjb25zdCBzdHJ1Y3QgbG9vcF9pbmZvNjQgKmluZm82NCwgc3RydWN0IGxvb3BfaW5mbyAqaW5mbykKewoJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwoJaW5mby0+bG9fbnVtYmVyID0gaW5mbzY0LT5sb19udW1iZXI7CglpbmZvLT5sb19kZXZpY2UgPSBpbmZvNjQtPmxvX2RldmljZTsKCWluZm8tPmxvX2lub2RlID0gaW5mbzY0LT5sb19pbm9kZTsKCWluZm8tPmxvX3JkZXZpY2UgPSBpbmZvNjQtPmxvX3JkZXZpY2U7CglpbmZvLT5sb19vZmZzZXQgPSBpbmZvNjQtPmxvX29mZnNldDsKCWluZm8tPmxvX2VuY3J5cHRfdHlwZSA9IGluZm82NC0+bG9fZW5jcnlwdF90eXBlOwoJaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IGluZm82NC0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKCWluZm8tPmxvX2ZsYWdzID0gaW5mbzY0LT5sb19mbGFnczsKCWluZm8tPmxvX2luaXRbMF0gPSBpbmZvNjQtPmxvX2luaXRbMF07CglpbmZvLT5sb19pbml0WzFdID0gaW5mbzY0LT5sb19pbml0WzFdOwoJaWYgKGluZm8tPmxvX2VuY3J5cHRfdHlwZSA9PSBMT19DUllQVF9DUllQVE9BUEkpCgkJbWVtY3B5KGluZm8tPmxvX25hbWUsIGluZm82NC0+bG9fY3J5cHRfbmFtZSwgTE9fTkFNRV9TSVpFKTsKCWVsc2UKCQltZW1jcHkoaW5mby0+bG9fbmFtZSwgaW5mbzY0LT5sb19maWxlX25hbWUsIExPX05BTUVfU0laRSk7CgltZW1jcHkoaW5mby0+bG9fZW5jcnlwdF9rZXksIGluZm82NC0+bG9fZW5jcnlwdF9rZXksIExPX0tFWV9TSVpFKTsKCgkvKiBlcnJvciBpbiBjYXNlIHZhbHVlcyB3ZXJlIHRydW5jYXRlZCAqLwoJaWYgKGluZm8tPmxvX2RldmljZSAhPSBpbmZvNjQtPmxvX2RldmljZSB8fAoJICAgIGluZm8tPmxvX3JkZXZpY2UgIT0gaW5mbzY0LT5sb19yZGV2aWNlIHx8CgkgICAgaW5mby0+bG9faW5vZGUgIT0gaW5mbzY0LT5sb19pbm9kZSB8fAoJICAgIGluZm8tPmxvX29mZnNldCAhPSBpbmZvNjQtPmxvX29mZnNldCkKCQlyZXR1cm4gLUVPVkVSRkxPVzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludApsb29wX3NldF9zdGF0dXNfb2xkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIGNvbnN0IHN0cnVjdCBsb29wX2luZm8gX191c2VyICphcmcpCnsKCXN0cnVjdCBsb29wX2luZm8gaW5mbzsKCXN0cnVjdCBsb29wX2luZm82NCBpbmZvNjQ7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZiAoc3RydWN0IGxvb3BfaW5mbykpKQoJCXJldHVybiAtRUZBVUxUOwoJbG9vcF9pbmZvNjRfZnJvbV9vbGQoJmluZm8sICZpbmZvNjQpOwoJcmV0dXJuIGxvb3Bfc2V0X3N0YXR1cyhsbywgJmluZm82NCk7Cn0KCnN0YXRpYyBpbnQKbG9vcF9zZXRfc3RhdHVzNjQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY29uc3Qgc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqYXJnKQp7CglzdHJ1Y3QgbG9vcF9pbmZvNjQgaW5mbzY0OwoKCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbzY0LCBhcmcsIHNpemVvZiAoc3RydWN0IGxvb3BfaW5mbzY0KSkpCgkJcmV0dXJuIC1FRkFVTFQ7CglyZXR1cm4gbG9vcF9zZXRfc3RhdHVzKGxvLCAmaW5mbzY0KTsKfQoKc3RhdGljIGludApsb29wX2dldF9zdGF0dXNfb2xkKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBsb29wX2luZm8gX191c2VyICphcmcpIHsKCXN0cnVjdCBsb29wX2luZm8gaW5mbzsKCXN0cnVjdCBsb29wX2luZm82NCBpbmZvNjQ7CglpbnQgZXJyID0gMDsKCglpZiAoIWFyZykKCQllcnIgPSAtRUlOVkFMOwoJaWYgKCFlcnIpCgkJZXJyID0gbG9vcF9nZXRfc3RhdHVzKGxvLCAmaW5mbzY0KTsKCWlmICghZXJyKQoJCWVyciA9IGxvb3BfaW5mbzY0X3RvX29sZCgmaW5mbzY0LCAmaW5mbyk7CglpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKCQllcnIgPSAtRUZBVUxUOwoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQKbG9vcF9nZXRfc3RhdHVzNjQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqYXJnKSB7CglzdHJ1Y3QgbG9vcF9pbmZvNjQgaW5mbzY0OwoJaW50IGVyciA9IDA7CgoJaWYgKCFhcmcpCgkJZXJyID0gLUVJTlZBTDsKCWlmICghZXJyKQoJCWVyciA9IGxvb3BfZ2V0X3N0YXR1cyhsbywgJmluZm82NCk7CglpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbzY0LCBzaXplb2YoaW5mbzY0KSkpCgkJZXJyID0gLUVGQVVMVDsKCglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50IGxvX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCgl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKCWludCBlcnI7CgoJbXV0ZXhfbG9jaygmbG8tPmxvX2N0bF9tdXRleCk7Cglzd2l0Y2ggKGNtZCkgewoJY2FzZSBMT09QX1NFVF9GRDoKCQllcnIgPSBsb29wX3NldF9mZChsbywgZmlsZSwgaW5vZGUtPmlfYmRldiwgYXJnKTsKCQlicmVhazsKCWNhc2UgTE9PUF9DSEFOR0VfRkQ6CgkJZXJyID0gbG9vcF9jaGFuZ2VfZmQobG8sIGZpbGUsIGlub2RlLT5pX2JkZXYsIGFyZyk7CgkJYnJlYWs7CgljYXNlIExPT1BfQ0xSX0ZEOgoJCWVyciA9IGxvb3BfY2xyX2ZkKGxvLCBpbm9kZS0+aV9iZGV2KTsKCQlicmVhazsKCWNhc2UgTE9PUF9TRVRfU1RBVFVTOgoJCWVyciA9IGxvb3Bfc2V0X3N0YXR1c19vbGQobG8sIChzdHJ1Y3QgbG9vcF9pbmZvIF9fdXNlciAqKSBhcmcpOwoJCWJyZWFrOwoJY2FzZSBMT09QX0dFVF9TVEFUVVM6CgkJZXJyID0gbG9vcF9nZXRfc3RhdHVzX29sZChsbywgKHN0cnVjdCBsb29wX2luZm8gX191c2VyICopIGFyZyk7CgkJYnJlYWs7CgljYXNlIExPT1BfU0VUX1NUQVRVUzY0OgoJCWVyciA9IGxvb3Bfc2V0X3N0YXR1czY0KGxvLCAoc3RydWN0IGxvb3BfaW5mbzY0IF9fdXNlciAqKSBhcmcpOwoJCWJyZWFrOwoJY2FzZSBMT09QX0dFVF9TVEFUVVM2NDoKCQllcnIgPSBsb29wX2dldF9zdGF0dXM2NChsbywgKHN0cnVjdCBsb29wX2luZm82NCBfX3VzZXIgKikgYXJnKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJZXJyID0gbG8tPmlvY3RsID8gbG8tPmlvY3RsKGxvLCBjbWQsIGFyZykgOiAtRUlOVkFMOwoJfQoJbXV0ZXhfdW5sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgbG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKCgltdXRleF9sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCWxvLT5sb19yZWZjbnQrKzsKCW11dGV4X3VubG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbG9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKCgltdXRleF9sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCS0tbG8tPmxvX3JlZmNudDsKCW11dGV4X3VubG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgbG9fZm9wcyA9IHsKCS5vd25lciA9CVRISVNfTU9EVUxFLAoJLm9wZW4gPQkJbG9fb3BlbiwKCS5yZWxlYXNlID0JbG9fcmVsZWFzZSwKCS5pb2N0bCA9CWxvX2lvY3RsLAp9OwoKLyoKICogQW5kIG5vdyB0aGUgbW9kdWxlcyBjb2RlIGFuZCBrZXJuZWwgaW50ZXJmYWNlLgogKi8KbW9kdWxlX3BhcmFtKG1heF9sb29wLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1heF9sb29wLCAiTWF4aW11bSBudW1iZXIgb2YgbG9vcCBkZXZpY2VzICgxLTI1NikiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQUxJQVNfQkxPQ0tERVZfTUFKT1IoTE9PUF9NQUpPUik7CgppbnQgbG9vcF9yZWdpc3Rlcl90cmFuc2ZlcihzdHJ1Y3QgbG9vcF9mdW5jX3RhYmxlICpmdW5jcykKewoJdW5zaWduZWQgaW50IG4gPSBmdW5jcy0+bnVtYmVyOwoKCWlmIChuID49IE1BWF9MT19DUllQVCB8fCB4ZmVyX2Z1bmNzW25dKQoJCXJldHVybiAtRUlOVkFMOwoJeGZlcl9mdW5jc1tuXSA9IGZ1bmNzOwoJcmV0dXJuIDA7Cn0KCmludCBsb29wX3VucmVnaXN0ZXJfdHJhbnNmZXIoaW50IG51bWJlcikKewoJdW5zaWduZWQgaW50IG4gPSBudW1iZXI7CglzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvOwoJc3RydWN0IGxvb3BfZnVuY190YWJsZSAqeGZlcjsKCglpZiAobiA9PSAwIHx8IG4gPj0gTUFYX0xPX0NSWVBUIHx8ICh4ZmVyID0geGZlcl9mdW5jc1tuXSkgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCgl4ZmVyX2Z1bmNzW25dID0gTlVMTDsKCglmb3IgKGxvID0gJmxvb3BfZGV2WzBdOyBsbyA8ICZsb29wX2RldlttYXhfbG9vcF07IGxvKyspIHsKCQltdXRleF9sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCgkJaWYgKGxvLT5sb19lbmNyeXB0aW9uID09IHhmZXIpCgkJCWxvb3BfcmVsZWFzZV94ZmVyKGxvKTsKCgkJbXV0ZXhfdW5sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKCX0KCglyZXR1cm4gMDsKfQoKRVhQT1JUX1NZTUJPTChsb29wX3JlZ2lzdGVyX3RyYW5zZmVyKTsKRVhQT1JUX1NZTUJPTChsb29wX3VucmVnaXN0ZXJfdHJhbnNmZXIpOwoKc3RhdGljIGludCBfX2luaXQgbG9vcF9pbml0KHZvaWQpCnsKCWludAlpOwoKCWlmIChtYXhfbG9vcCA8IDEgfHwgbWF4X2xvb3AgPiAyNTYpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb29wOiBpbnZhbGlkIG1heF9sb29wIChtdXN0IGJlIGJldHdlZW4iCgkJCQkgICAgIiAxIGFuZCAyNTYpLCB1c2luZyBkZWZhdWx0ICg4KVxuIik7CgkJbWF4X2xvb3AgPSA4OwoJfQoKCWlmIChyZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKSkKCQlyZXR1cm4gLUVJTzsKCglsb29wX2RldiA9IGttYWxsb2MobWF4X2xvb3AgKiBzaXplb2Yoc3RydWN0IGxvb3BfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CglpZiAoIWxvb3BfZGV2KQoJCWdvdG8gb3V0X21lbTE7CgltZW1zZXQobG9vcF9kZXYsIDAsIG1heF9sb29wICogc2l6ZW9mKHN0cnVjdCBsb29wX2RldmljZSkpOwoKCWRpc2tzID0ga21hbGxvYyhtYXhfbG9vcCAqIHNpemVvZihzdHJ1Y3QgZ2VuZGlzayAqKSwgR0ZQX0tFUk5FTCk7CglpZiAoIWRpc2tzKQoJCWdvdG8gb3V0X21lbTI7CgoJZm9yIChpID0gMDsgaSA8IG1heF9sb29wOyBpKyspIHsKCQlkaXNrc1tpXSA9IGFsbG9jX2Rpc2soMSk7CgkJaWYgKCFkaXNrc1tpXSkKCQkJZ290byBvdXRfbWVtMzsKCX0KCglmb3IgKGkgPSAwOyBpIDwgbWF4X2xvb3A7IGkrKykgewoJCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSAmbG9vcF9kZXZbaV07CgkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkaXNrc1tpXTsKCgkJbWVtc2V0KGxvLCAwLCBzaXplb2YoKmxvKSk7CgkJbG8tPmxvX3F1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwoJCWlmICghbG8tPmxvX3F1ZXVlKQoJCQlnb3RvIG91dF9tZW00OwoJCW11dGV4X2luaXQoJmxvLT5sb19jdGxfbXV0ZXgpOwoJCWluaXRfY29tcGxldGlvbigmbG8tPmxvX2RvbmUpOwoJCWluaXRfY29tcGxldGlvbigmbG8tPmxvX2JoX2RvbmUpOwoJCWxvLT5sb19udW1iZXIgPSBpOwoJCXNwaW5fbG9ja19pbml0KCZsby0+bG9fbG9jayk7CgkJZGlzay0+bWFqb3IgPSBMT09QX01BSk9SOwoJCWRpc2stPmZpcnN0X21pbm9yID0gaTsKCQlkaXNrLT5mb3BzID0gJmxvX2ZvcHM7CgkJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJsb29wJWQiLCBpKTsKCQlkaXNrLT5wcml2YXRlX2RhdGEgPSBsbzsKCQlkaXNrLT5xdWV1ZSA9IGxvLT5sb19xdWV1ZTsKCX0KCgkvKiBXZSBjYW5ub3QgZmFpbCBhZnRlciB3ZSBjYWxsIHRoaXMsIHNvIGFub3RoZXIgbG9vcCEqLwoJZm9yIChpID0gMDsgaSA8IG1heF9sb29wOyBpKyspCgkJYWRkX2Rpc2soZGlza3NbaV0pOwoJcHJpbnRrKEtFUk5fSU5GTyAibG9vcDogbG9hZGVkIChtYXggJWQgZGV2aWNlcylcbiIsIG1heF9sb29wKTsKCXJldHVybiAwOwoKb3V0X21lbTQ6Cgl3aGlsZSAoaS0tKQoJCWJsa19jbGVhbnVwX3F1ZXVlKGxvb3BfZGV2W2ldLmxvX3F1ZXVlKTsKCWkgPSBtYXhfbG9vcDsKb3V0X21lbTM6Cgl3aGlsZSAoaS0tKQoJCXB1dF9kaXNrKGRpc2tzW2ldKTsKCWtmcmVlKGRpc2tzKTsKb3V0X21lbTI6CglrZnJlZShsb29wX2Rldik7Cm91dF9tZW0xOgoJdW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKTsKCXByaW50ayhLRVJOX0VSUiAibG9vcDogcmFuIG91dCBvZiBtZW1vcnlcbiIpOwoJcmV0dXJuIC1FTk9NRU07Cn0KCnN0YXRpYyB2b2lkIGxvb3BfZXhpdCh2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgbWF4X2xvb3A7IGkrKykgewoJCWRlbF9nZW5kaXNrKGRpc2tzW2ldKTsKCQlibGtfY2xlYW51cF9xdWV1ZShsb29wX2RldltpXS5sb19xdWV1ZSk7CgkJcHV0X2Rpc2soZGlza3NbaV0pOwoJfQoJaWYgKHVucmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIikpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9vcDogY2Fubm90IHVucmVnaXN0ZXIgYmxrZGV2XG4iKTsKCglrZnJlZShkaXNrcyk7CglrZnJlZShsb29wX2Rldik7Cn0KCm1vZHVsZV9pbml0KGxvb3BfaW5pdCk7Cm1vZHVsZV9leGl0KGxvb3BfZXhpdCk7CgojaWZuZGVmIE1PRFVMRQpzdGF0aWMgaW50IF9faW5pdCBtYXhfbG9vcF9zZXR1cChjaGFyICpzdHIpCnsKCW1heF9sb29wID0gc2ltcGxlX3N0cnRvbChzdHIsIE5VTEwsIDApOwoJcmV0dXJuIDE7Cn0KCl9fc2V0dXAoIm1heF9sb29wPSIsIG1heF9sb29wX3NldHVwKTsKI2VuZGlmCg==