From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bob Copeland Subject: readdir on hash filesystems Date: Wed, 21 Sep 2005 13:46:22 -0400 Message-ID: Reply-To: Bob Copeland Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_2419_14582407.1127324782612" Return-path: Received: from xproxy.gmail.com ([66.249.82.205]:32147 "EHLO xproxy.gmail.com") by vger.kernel.org with ESMTP id S1751314AbVIURqZ (ORCPT ); Wed, 21 Sep 2005 13:46:25 -0400 Received: by xproxy.gmail.com with SMTP id s14so215365wxc for ; Wed, 21 Sep 2005 10:46:22 -0700 (PDT) To: linux-fsdevel@vger.kernel.org Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org ------=_Part_2419_14582407.1127324782612 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hi all, I am writing a new filesystem driver for the filesystem used by the Rio Karma (and, as it happens, ReplayTV). See the attached patch and my webpage here for more info: http://bobcopeland.com/karma/. I have a couple of newbie questions: 1) The directory structure implements a hash table where each directory has a fixed number of entries. Each entry is a file that has a pointer to another file in the hash chain and so there can be an unlimited number of files in any hash chain. What is the usual way to implement readdir efficiently in this case? With f_pos alone, I don't have any idea which node I want along the hash chain without counting up f_pos nodes in the tree. 2) Also, does there happen to be a way to use sb_bread to operate on more than 4k at a time? OMFS uses 8k blocks and a lot of the complexity in my driver involves operating on 512-byte blocks, loading new sectors when I hit a sector boundary, etc; reading 8k at a time would clean things up a little. ------=_Part_2419_14582407.1127324782612 Content-Type: text/plain; name="0003-Added-OMFS-the-filesystem-for-Rio-Karma.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0003-Added-OMFS-the-filesystem-for-Rio-Karma.txt" U3ViamVjdDogW1BBVENIXSBBZGRlZCBPTUZTLCB0aGUgZmlsZXN5c3RlbSBmb3IgUmlvIEthcm1h CgotLS0KCiBmcy9LY29uZmlnICAgICAgIHwgICAgNSArCiBmcy9NYWtlZmlsZSAgICAgIHwgICAg MSAKIGZzL29tZnMvTWFrZWZpbGUgfCAgICA4ICsrCiBmcy9vbWZzL2Rpci5jICAgIHwgIDI0NiAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGZz L29tZnMvZmlsZS5jICAgfCAgMTE2ICsrKysrKysrKysrKysrKysrKysrKysrKysKIGZzL29tZnMv aW5vZGUuYyAgfCAgMTUxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZnMvb21m cy9vbWZzLmggICB8ICAgOTQgKysrKysrKysrKysrKysrKysrKysrCiA3IGZpbGVzIGNoYW5nZWQs IDYyMSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZz L29tZnMvTWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcy9vbWZzL2Rpci5jCiBjcmVhdGUg bW9kZSAxMDA2NDQgZnMvb21mcy9maWxlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcy9vbWZzL2lu b2RlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcy9vbWZzL29tZnMuaAoKMDc1OTQ1MDgxYWUzM2Ex ODI1Y2U3OTMxN2Y1YjNkNWNiYTI1OTJmMgpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tj b25maWcKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0xNzAwLDYgKzE3MDAs MTEgQEAgY29uZmlnIENPREFfRlNfT0xEX0FQSQogCSAgCiAJICBGb3IgbW9zdCBjYXNlcyB5b3Ug cHJvYmFibHkgd2FudCB0byBzYXkgTi4KIAorY29uZmlnIE9NRlNfRlMKKwl0cmlzdGF0ZSAiT01G UyAoUmlvIEthcm1hKSIKKwloZWxwCisJICBTYXkgJ1knIHRvIGdldCBzdXBwb3J0IGZvciB0aGUg UklPIEthcm1hIGZzLgorCiBjb25maWcgQUZTX0ZTCiAjIGZvciBmcy9ubHMvQ29uZmlnLmluCiAJ dHJpc3RhdGUgIkFuZHJldyBGaWxlIFN5c3RlbSBzdXBwb3J0IChBRlMpIChFeHBlcmltZW50YWwp IgpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQotLS0gYS9mcy9NYWtlZmls ZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtMTAwLDQgKzEwMCw1IEBAIG9iai0kKENPTkZJR19BRlNf RlMpCQkrPSBhZnMvCiBvYmotJChDT05GSUdfQkVGU19GUykJCSs9IGJlZnMvCiBvYmotJChDT05G SUdfSE9TVEZTKQkJKz0gaG9zdGZzLwogb2JqLSQoQ09ORklHX0hQUEZTKQkJKz0gaHBwZnMvCitv YmotJChDT05GSUdfT01GU19GUykJCSs9IG9tZnMvCiBvYmotJChDT05GSUdfREVCVUdfRlMpCQkr PSBkZWJ1Z2ZzLwpkaWZmIC0tZ2l0IGEvZnMvb21mcy9NYWtlZmlsZSBiL2ZzL29tZnMvTWFrZWZp bGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9vbWZzL01ha2Vm aWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgT01GUyBmaWxlc3lzdGVtLgor IworCisKK29iai0kKENPTkZJR19PTUZTX0ZTKSArPSBvbWZzLm8KKworb21mcy1vYmpzIDo9IGlu b2RlLm8gZGlyLm8gZmlsZS5vCmRpZmYgLS1naXQgYS9mcy9vbWZzL2Rpci5jIGIvZnMvb21mcy9k aXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29tZnMvZGly LmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBmcy9vbWZzL2Rpci5jCisgKiBPTUZTIChhcyB1 c2VkIGJ5IFJJTyBLYXJtYSkgZGlyZWN0b3J5IG9wZXJhdGlvbnMuCisgKiBDb3B5cmlnaHQgKEMp IDIwMDUgQm9iIENvcGVsYW5kIDxtZUBib2Jjb3BlbGFuZC5jb20+CisgKi8KKworI2luY2x1ZGUg PGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgv Y3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgIm9tZnMu aCIKKworc3RhdGljIGludCBvbWZzX2hhc2goY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4s IGludCBtb2QpCit7CisJaW50IGksIGhhc2g9MDsKKwlmb3IgKGk9MDsgaTxuYW1lbGVuOyBpKysp CisJCWhhc2ggXj0gdG9sb3dlcihuYW1lW2ldKSA8PCAoaSAlIDI0KTsKKwlyZXR1cm4gaGFzaCAl IG1vZDsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqb21mc19maW5kX2VudHJ5KHN0 cnVjdCBpbm9kZSAqZGlyLAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikK K3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBvbWZzX2lub2RlICpvaTsKKwls b2ZmX3QgcHRyOworCXU2NCBjbHVzdGVyOworCisJaW50IGJsb2NrID0gY2x1c190b19ibGsoZGly LT5pX2lubyk7CisJaW50IGJ1Y2tldCA9IG9tZnNfaGFzaChuYW1lLCBuYW1lbGVuLCAyMDEpOwor CisJcHRyID0gT01GU19ESVJfU1RBUlQgKyBidWNrZXQgKiA4OworCWJsb2NrICs9IHB0ciA+PiBk aXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IG9mcyA9IHB0ciAmIChkaXItPmlfc2It PnNfYmxvY2tzaXplIC0gMSk7CisKKwliaCA9IHNiX2JyZWFkKGRpci0+aV9zYiwgYmxvY2spOwor CWNsdXN0ZXIgPSBiZTMyX3RvX2NwdSgqKCh1MzIgKikgJiBiaC0+Yl9kYXRhW29mcyArIDRdKSk7 CisJYnJlbHNlKGJoKTsKKwl3aGlsZSAoY2x1c3RlciAhPSB+MCkgeworCQliaCA9IHNiX2JyZWFk KGRpci0+aV9zYiwgY2x1c190b19ibGsoY2x1c3RlcikpOworCQlpZiAoIWJoKQorCQkJZ290byBv dXQ7CisKKwkJb2kgPSAoc3RydWN0IG9tZnNfaW5vZGUgKiliaC0+Yl9kYXRhOworCQlpZiAoc3Ry bmNtcChvaS0+bmFtZSwgbmFtZSwgbmFtZWxlbikgPT0gMCkgeworCQkJcmV0dXJuIGJoOworCQl9 CisJCWNsdXN0ZXIgPSBiZTMyX3RvX2NwdShvaS0+c2libGluZyk7CisJCWJyZWxzZShiaCk7CisJ fQorb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqb21mc19sb29r dXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIHN0cnVj dCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGlu b2RlICppbm9kZSA9IE5VTEw7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gT01GU19OQU1F TEVOKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCWJoID0gb21mc19maW5k X2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKwlp ZiAoYmgpIHsKKwkJc3RydWN0IG9tZnNfaW5vZGUgKm9pID0gKHN0cnVjdCBvbWZzX2lub2RlICop YmgtPmJfZGF0YTsKKwkJaW5vX3QgaW5vID0gYmUzMl90b19jcHUob2ktPmhlYWQuc2VsZik7CisJ CWJyZWxzZShiaCk7CisJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7CisJCWlmICghaW5v ZGUpIHsKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwkKKwkJfQorCX0KKwlkX2FkZChkZW50 cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIDEKK3N0YXRpYyBpbnQgb21mc19y ZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGly KQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3Ry dWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmJoMjsKKwlzdHJ1Y3Qgb21mc19pbm9kZSAqb2k7CisJbG9m Zl90IGJsX29mczsKKwlsb2ZmX3Qgb2Zmc2V0LCBwb3MsIHJlczsKKwl1MzIgY2x1c3RlcjsKKwl1 bnNpZ25lZCBjaGFyIGRfdHlwZTsKKwlpbm9fdCBzZWxmOworCisJc3dpdGNoIChmaWxwLT5mX3Bv cykgeworCWNhc2UgMDoKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIDAsIGRpci0+aV9p bm8sIERUX0RJUikgPCAwKSAKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBm YWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwg MSwgcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSksIERUX0RJUikgPCAwKSAKKwkJCWdvdG8gb3V0 OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwl9CisKKwkvKiB0aGlz IGlzIG5vdCBhdCBhbGwgZWZmaWNpZW50LiA6KCBjb3VudCB0aGUgbm9kZXMgdW50aWwgd2UgaGl0 CisJICogZl9wb3Mgb3IgZW5kCisJICovCisJcG9zID0gMjsKKworCWJoID0gc2JfYnJlYWQoZGly LT5pX3NiLCBjbHVzX3RvX2JsayhkaXItPmlfaW5vKSk7CisJaWYgKCFiaCkKKwkJZ290byBub19i aDsKKworCWZvciAob2Zmc2V0ID0gT01GU19ESVJfU1RBUlQ7IG9mZnNldCA8IGRpci0+aV9zaXpl OyBvZmZzZXQgKz0gOCkgeworCQlzZWN0b3JfdCBibG9jayA9IG9mZnNldCA+PiBkaXItPmlfc2It PnNfYmxvY2tzaXplX2JpdHM7CisJCWJsX29mcyA9IG9mZnNldCAmIChkaXItPmlfc2ItPnNfYmxv Y2tzaXplIC0gMSk7CisJCWlmICghYmxfb2ZzKSB7IC8vIHdyYXBwZWQgYSBibG9jaworCQkJYnJl bHNlKGJoKTsKKwkJCWJoID0gc2JfYnJlYWQoZGlyLT5pX3NiLCBibG9jayArIGNsdXNfdG9fYmxr KGRpci0+aV9pbm8pKTsKKwkJCWlmICghYmgpIAorCQkJCWdvdG8gbm9fYmg7CisJCX0KKwkJY2x1 c3RlciA9IGJlMzJfdG9fY3B1KCooKHUzMiAqKSAmIGJoLT5iX2RhdGFbYmxfb2ZzICsgNF0pKTsK KwkJd2hpbGUgKGNsdXN0ZXIgIT0gfjApIHsKKwkJCWJoMiA9IHNiX2JyZWFkKGRpci0+aV9zYiwg Y2x1c190b19ibGsoY2x1c3RlcikpOworCQkJaWYgKCFiaDIpCisJCQkJZ290byBub19iaDI7CisK KwkJCW9pID0gKHN0cnVjdCBvbWZzX2lub2RlICopYmgyLT5iX2RhdGE7CisJCQlzZWxmID0gY2x1 c3RlcjsKKwkJCWNsdXN0ZXIgPSBiZTMyX3RvX2NwdShvaS0+c2libGluZyk7CisKKwkJCWlmIChw b3MrKyA8IGZpbHAtPmZfcG9zKSB7CisJCQkJYnJlbHNlKGJoMik7CisJCQkJY29udGludWU7CisJ CQl9CisKKwkJCWlmIChvaS0+dHlwZSA9PSBPTUZTX0RJUikKKwkJCQlkX3R5cGUgPSBEVF9ESVI7 CisJCQllbHNlCisJCQkJZF90eXBlID0gRFRfUkVHOworCisJCQlyZXMgPSBmaWxsZGlyKGRpcmVu dCwgb2ktPm5hbWUsIHN0cm5sZW4ob2ktPm5hbWUsIAorCQkJCU9NRlNfTkFNRUxFTiksIGZpbHAt PmZfcG9zLCBzZWxmLCBkX3R5cGUpOworCQkJYnJlbHNlKGJoMik7CisJCQlpZiAocmVzIDwgMCkg CisJCQl7CisJCQkJYnJlbHNlKGJoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWZpbHAtPmZf cG9zKys7CisJCX0KKwl9CisJYnJlbHNlKGJoKTsKK291dDoKKwlyZXR1cm4gMDsKK25vX2JoMjoK KwlicmVsc2UoYmgpOworbm9fYmg6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNlbHNlCisKK3N0 YXRpYyBpbnQgb21mc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZp bGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZmlscC0+Zl9kZW50cnkt PmRfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmJoMjsKKwlzdHJ1Y3Qgb21mc19p bm9kZSAqb2k7CisJbG9mZl90IGJsX29mczsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZmls cC0+Zl9wb3MpIHsKKwljYXNlIDA6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCAwLCBk aXItPmlfaW5vLCBEVF9ESVIpIDwgMCkgCisJCQlnb3RvIG91dDsKKwkJZmlscC0+Zl9wb3MrKzsK KwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIu LiIsIDIsIDEsIHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpLCBEVF9ESVIpIDwgMCkgCisJCQln b3RvIG91dDsKKwkJZmlscC0+Zl9wb3MrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJfQorCisJ bG9mZl90IG9mZnNldCA9IGZpbHAtPmZfcG9zICsgT01GU19ESVJfU1RBUlQgLSAyIDsKKworCXdo aWxlIChvZmZzZXQgPCBkaXItPmlfc2l6ZSkgeworCQlzZWN0b3JfdCBibG9jayA9IG9mZnNldCA+ PiBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWJsX29mcyA9IG9mZnNldCAmIChkaXIt Pmlfc2ItPnNfYmxvY2tzaXplIC0gMSk7CisKKwkJYmggPSBzYl9icmVhZChkaXItPmlfc2IsIGJs b2NrICsgY2x1c190b19ibGsoZGlyLT5pX2lubykpOworCQlpZiAoIWJoKSB7CisJCQlyZXQgPSAt RUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJZG8geworCQkJdW5zaWduZWQgY2hhciBkX3R5 cGUgPSBEVF9ESVI7CisJCQl1NjQgY2x1c3RlciA9CisJCQkJYmU2NF90b19jcHUoKigodTY0ICop ICYgYmgtPmJfZGF0YVtibF9vZnNdKSk7CisJCQlpZiAoY2x1c3RlciAhPSB+MCkgeworCQkJCWJo MiA9IHNiX2JyZWFkKGRpci0+aV9zYiwKKwkJCQkJCSBjbHVzX3RvX2JsayhjbHVzdGVyKSk7CisJ CQkJaWYgKCFiaDIpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJZ290byBvdXQ7CisJCQkJ fQorCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVsbHhcbiIsIGNsdXN0ZXIpOworCisJCQkJb2kg PSAoc3RydWN0IG9tZnNfaW5vZGUgKiliaDItPmJfZGF0YTsKKwkJCQlpZiAob2ktPnR5cGUgPT0g T01GU19ESVIpCisJCQkJCWRfdHlwZSA9IERUX0RJUjsKKwkJCQllbHNlCisJCQkJCWRfdHlwZSA9 IERUX1JFRzsKKworCQkJCXJldCA9IGZpbGxkaXIoZGlyZW50LCBvaS0+bmFtZSwKKwkJCQkJc3Ry bmxlbihvaS0+bmFtZSwgT01GU19OQU1FTEVOKSwKKwkJCQkJZmlscC0+Zl9wb3MsIGNsdXN0ZXIs IGRfdHlwZSk7CisJCQkJYnJlbHNlKGJoMik7CisJCQkJaWYgKHJldCA8IDApIAorCQkJCXsKKwkJ CQkJYnJlbHNlKGJoKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJb2Zmc2V0ICs9 IDg7CisJCQlibF9vZnMgKz0gODsKKwkJCWZpbHAtPmZfcG9zICs9IDg7CisKKwkJfSB3aGlsZSAo b2Zmc2V0IDwgZGlyLT5pX3NpemUgJiYKKwkJCSBibF9vZnMgPCBkaXItPmlfc2ItPnNfYmxvY2tz aXplKTsKKwkJYnJlbHNlKGJoKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlm CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG9tZnNfZGlyX2lub3BzID0geworCS5sb29rdXAg PSBvbWZzX2xvb2t1cCwKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21mc19kaXJfb3Bl cmF0aW9ucyA9IHsKKwkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPSBvbWZz X3JlYWRkaXIsCit9OwpkaWZmIC0tZ2l0IGEvZnMvb21mcy9maWxlLmMgYi9mcy9vbWZzL2ZpbGUu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29tZnMvZmlsZS5j CkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogZnMvb21mcy9maWxlLmMKKyAqIE9NRlMgKGFzIHVz ZWQgYnkgUklPIEthcm1hKSBmaWxlIG9wZXJhdGlvbnMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUg Qm9iIENvcGVsYW5kIDxtZUBib2Jjb3BlbGFuZC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4 L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVy X2hlYWQuaD4KKyNpbmNsdWRlICJvbWZzLmgiCisKKy8qIAorICogU2NhbnMgYWNyb3NzIHRoZSBk aXJlY3RvcnkgdGFibGUgZm9yIGEgZ2l2ZW4gYmxvY2sgbnVtYmVyLiAgVGhlcmUgYXJlIAorICog c2V2ZXJhbCBwb3NzaWJsZSBleGl0IGNvbmRpdGlvbnM6IAorICogMSkgd2UgZmluZCB0aGUgY2x1 c3RlciBhbmQgcmV0dXJuIGl0CisgKiAyKSBjb3VudCBpcyB6ZXJvIChmb3IgdGhpcyB0YWJsZSk7 IHdlIHJldHVybiAwIGFuZCAqY291bnQgaXMgemVyby4KKyAqIDMpIG5vIG1vcmUgcG9pbnRlcnMg b24gdGhpcyBwYWdlIChidXQgbW9yZSBpbiB0YWJsZSk7IHJldHVybiAwIGFuZAorICogKmNvdW50 IGlzIG5vbi16ZXJvLiAgY2FsbGVyIG11c3QgcmVwZWF0IHdpdGggZW50IG9uIG5leHQgYmxvY2su CisgKi8KK3N0YXRpYyBzZWN0b3JfdCBmaW5kX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0 cnVjdCBvbWZzX2V4dGVudF9lbnRyeSAqZW50LCAKKwkgCSAgICAgICBzZWN0b3JfdCBibG9jaywg c2VjdG9yX3QgKnNlYXJjaGVkLAorCQkgICAgICAgaW50IGJsb2NrX29mcywgaW50ICpjb3VudCkK K3sKKwlmb3IgKDsgKmNvdW50ID4gMCAmJiBibG9ja19vZnMgPCBpbm9kZS0+aV9zYi0+c19ibG9j a3NpemU7IAorCQkqY291bnQtLSwgYmxvY2tfb2ZzICs9IHNpemVvZihzdHJ1Y3Qgb21mc19leHRl bnRfZW50cnkpKQorCXsKKwkJaW50IG51bWJsb2NrcyA9IGNsdXNfdG9fYmxrKGJlMzJfdG9fY3B1 KGVudC0+YmxvY2tzKSk7CisJCWlmIChibG9jayA+PSAqc2VhcmNoZWQgICYmIAorCQkgICAgYmxv Y2sgPCAoKnNlYXJjaGVkICsgbnVtYmxvY2tzKSkKKwkJeworCQkJLy8gZm91bmQgaXQgYXQgY2x1 c3RlciArIChibG9jayAtIHNlYXJjaGVkKQorCQkJcmV0dXJuIGNsdXNfdG9fYmxrKGJlMzJfdG9f Y3B1KGVudC0+Y2x1c3RlcikpICsgCisJCQkJYmxvY2sgLSAqc2VhcmNoZWQ7CisJCX0KKwkJKnNl YXJjaGVkICs9IG51bWJsb2NrczsKKwkJZW50Kys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IG9tZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2Nr LAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlz dHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXNlY3Rvcl90IG5leHQsIGJsb2NrX3N0YXJ0LCBvZmZz ZXQsIHNlYXJjaGVkPTA7CisJaW50IGJsb2NrX29mczsKKwlzdHJ1Y3Qgb21mc19leHRlbnQgKm9l OworCXN0cnVjdCBvbWZzX2V4dGVudF9lbnRyeSAqZW50cnk7CisJaWYgKGNyZWF0ZSkKKwkJZ290 byBlcnI7CisKKwlpZiAoYmxvY2sgPCAwKQkJLy8gfHwgPiBzdHVmZgorCQlnb3RvIGVycjsKKwor CWJsb2NrX3N0YXJ0ID0gY2x1c190b19ibGsoaW5vZGUtPmlfaW5vKTsKKwliaCA9IHNiX2JyZWFk KGlub2RlLT5pX3NiLCBibG9ja19zdGFydCk7CisJaWYgKCFiaCkKKwkJZ290byBlcnI7CisKKwlv ZSA9IChzdHJ1Y3Qgb21mc19leHRlbnQgKikoJmJoLT5iX2RhdGFbMHgxZDBdKTsKKworCWZvcig7 OykgeworCQlpbnQgY291bnQgPSBiZTMyX3RvX2NwdShvZS0+ZXh0ZW50X2NvdW50KTsKKwkJbmV4 dCA9IGJlMzJfdG9fY3B1KG9lLT5uZXh0KTsKKwkJZW50cnkgPSAmb2UtPmVudHJ5OworCQlibG9j a19vZnMgPSAobG9uZykgZW50cnkgLSAobG9uZyliaC0+Yl9kYXRhOworCisJCXdoaWxlIChjb3Vu dCA+IDApIHsKKwkJCW9mZnNldCA9IGZpbmRfYmxvY2soaW5vZGUsIGVudHJ5LCBibG9jaywgJnNl YXJjaGVkLCAKKwkJCQkJYmxvY2tfb2ZzLCAmY291bnQpOworCQkJaWYgKG9mZnNldCA+IDApIHsK KwkJCQlicmVsc2UoYmgpOworCQkJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBvZmZz ZXQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGNvdW50KSB7CisJCQkJLy8gc3BpbGxl ZCBvdmVyIGEgYnVmZmVyCisJCQkJYnJlbHNlKGJoKTsKKwkJCQliaCA9IHNiX2JyZWFkKGlub2Rl LT5pX3NiLCArK2Jsb2NrX3N0YXJ0KTsKKwkJCQlpZiAoIWJoKSBnb3RvIGVycjsKKwkJCQllbnRy eSA9IChzdHJ1Y3Qgb21mc19leHRlbnRfZW50cnkgKikgYmgtPmJfZGF0YTsKKwkJCQlibG9ja19v ZnMgPSAwOworCQkJfQorCQl9CisJCWJyZWxzZShiaCk7CisKKwkJaWYgKG5leHQgPT0gfjApCisJ CQlicmVhazsKKworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBuZXh0KTsKKwkJaWYgKCFi aCkgZ290byBlcnI7CisJCW9lID0gKHN0cnVjdCBvbWZzX2V4dGVudCAqKSAoJmJoLT5iX2RhdGFb MHg0MF0pOworCX0KKworCXJldHVybiAwOworZXJyOgorCXJldHVybiAtRUlPOworfQorCitzdGF0 aWMgaW50IG9tZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdl KQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBvbWZzX2dldF9ibG9jayk7 Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21mc19maWxlX29wZXJhdGlvbnMgPSB7CisJ Lmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQgPSBnZW5lcmljX2ZpbGVfcmVh ZCwKKwkud3JpdGUgPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAgPSBnZW5lcmljX2ZpbGVf bW1hcCwKKwkuc2VuZGZpbGUgPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3Qg YWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG9tZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UgPSBvbWZz X3JlYWRwYWdlLAorfTsKKwpkaWZmIC0tZ2l0IGEvZnMvb21mcy9pbm9kZS5jIGIvZnMvb21mcy9p bm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvb21mcy9p bm9kZS5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogZnMvb21mcy9pbm9kZS5jCisgKiBPTUZT IChhcyB1c2VkIGJ5IFJJTyBLYXJtYSkgaW5vZGUgYW5kIHN1cGVyIG9wZXJhdGlvbnMuCisgKiBD b3B5cmlnaHQgKEMpIDIwMDUgQm9iIENvcGVsYW5kIDxtZUBib2Jjb3BlbGFuZC5jb20+CisgKi8K KworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgor I2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8 bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJvbWZzLmgiCisKK01PRFVMRV9BVVRIT1Io IkJvYiBDb3BlbGFuZCA8bWVAYm9iY29wZWxhbmQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9O KCJPTUZTIChSZXBsYXlUVi9LYXJtYSkgRmlsZXN5c3RlbSBmb3IgTGludXgiKTsKK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKKwordm9pZCBvbWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9k ZSkKK3sKKwlzdHJ1Y3Qgb21mc19pbm9kZSAqb2k7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsK Kwl1bnNpZ25lZCBpbnQgYmxvY2s7CisJaW5vX3QgaW5vID0gaW5vZGUtPmlfaW5vOworCisJLy8g Y2hlY2sgYWdhaW5zdCBudW1fYmxvY2tzCisJYmxvY2sgPSBjbHVzX3RvX2Jsayhpbm8pOworCWJo ID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGJsb2NrKTsKKwlpZiAoIWJoKSB7CisJCW1ha2VfYmFk X2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKworCW9pID0gKHN0cnVjdCBvbWZzX2lub2Rl ICopYmgtPmJfZGF0YTsKKworCS8vIGNoZWNrIHNlbGYKKwlpZiAoaW5vICE9IGJlMzJfdG9fY3B1 KG9pLT5oZWFkLnNlbGYpKSB7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOwor CX0KKworCWlub2RlLT5pX3VpZCA9IDA7CisJaW5vZGUtPmlfZ2lkID0gMDsKKworCWxvbmcgc2Vj cyA9ICgobG9uZyliZTY0X3RvX2NwdShvaS0+Y3RpbWUpKSAvIDEwMDA7CisJbG9uZyBuc2VjcyA9 ICgobG9uZyliZTY0X3RvX2NwdShvaS0+Y3RpbWUpKSAlIDEwMDA7CisKKwlpbm9kZS0+aV9hdGlt ZS50dl9zZWMgPSBzZWNzOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHNlY3M7CisJaW5vZGUt PmlfY3RpbWUudHZfc2VjID0gc2VjczsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gbnNlY3M7 CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IG5zZWNzOworCWlub2RlLT5pX2N0aW1lLnR2X25z ZWMgPSBuc2VjczsKKworCWlmIChvaS0+dHlwZSA9PSBPTUZTX0RJUikgeworCQlpbm9kZS0+aV9t b2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPOworCQlpbm9kZS0+aV9tb2RlIHw9IFNf SUZESVI7CisJCWlub2RlLT5pX29wID0gJm9tZnNfZGlyX2lub3BzOworCQlpbm9kZS0+aV9mb3Ag PSAmb21mc19kaXJfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfc2l6ZSA9IChsb2ZmX3QpIGJlMzJf dG9fY3B1KG9pLT5oZWFkLmJvZHlfc2l6ZSkgKworCQkJc2l6ZW9mKHN0cnVjdCBvbWZzX2hlYWRl cik7CisJfSBlbHNlIGlmIChvaS0+dHlwZSA9PSBPTUZTX0ZJTEUpIHsKKwkJaW5vZGUtPmlfbW9k ZSA9IFNfSUZSRUcgfCBTX0lSVUdPOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZvbWZz X2FvcHM7CisJCWlub2RlLT5pX2ZvcCA9ICZvbWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUt Pmlfc2l6ZSA9IChsb2ZmX3QpIGJlNjRfdG9fY3B1KG9pLT5zaXplKTsKKwl9CisJYnJlbHNlKGJo KTsKK30KKworc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgb21mc19zb3BzID0geworCS5yZWFkX2lu b2RlID0gb21mc19yZWFkX2lub2RlLAorfTsKKworc3RhdGljIGludCBvbWZzX2ZpbGxfc3VwZXIo c3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1 Y3QgYnVmZmVyX2hlYWQgKmJoLCAqYmgyOworCXN0cnVjdCBvbWZzX3N1cGVyX2Jsb2NrICpvbWZz X3NiOworCXN0cnVjdCBvbWZzX3Jvb3RfYmxvY2sgKm9tZnNfcmI7CisJc3RydWN0IGlub2RlICpy b290OworCisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCXNiLT5zX21heGJ5dGVzID0gMHhm ZmZmZmZmZjsKKworCXNiX3NldF9ibG9ja3NpemUoc2IsIDB4MjAwKTsKKworCWlmICghKGJoID0g c2JfYnJlYWQoc2IsIDApKSkKKwkJZ290byBvdXQ7CisKKwlvbWZzX3NiID0gKHN0cnVjdCBvbWZz X3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKKwlpZiAoYmUzMl90b19jcHUob21mc19zYi0+bWFn aWMpICE9IE9NRlNfTUFHSUMpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoS0VSTl9FUlIg Im9tZnM6IEludmFsaWQgc3VwZXJibG9jayAoJXgpXG4iLAorCQkJCSAgIG9tZnNfc2ItPm1hZ2lj KTsKKwkJZ290byBvdXQ7CisJfQorCXNiLT5zX21hZ2ljID0gT01GU19NQUdJQzsKKworCXNlY3Rv cl90IHN0YXJ0ID0gY2x1c190b19ibGsoYmUzMl90b19jcHUob21mc19zYi0+cm9vdF9ibG9jaykp OworCWlmICghKGJoMiA9IHNiX2JyZWFkKHNiLCBzdGFydCkpKQorCQlnb3RvIG91dDsKKworCW9t ZnNfcmIgPSAoc3RydWN0IG9tZnNfcm9vdF9ibG9jayAqKWJoMi0+Yl9kYXRhOworCXByaW50ayhL RVJOX0RFQlVHICJvbWZzOiB2b2x1bWU6ICVzXG4iLCBvbWZzX3JiLT5uYW1lKTsKKworCXNiLT5z X29wID0gJm9tZnNfc29wczsKKwlyb290ID0gaWdldChzYiwgYmUzMl90b19jcHUob21mc19yYi0+ cm9vdF9kaXIpKTsKKworCWJyZWxzZShiaCk7CisJYnJlbHNlKGJoMik7CisKKwlzYi0+c19yb290 ID0gZF9hbGxvY19yb290KHJvb3QpOworCWlmICghc2ItPnNfcm9vdCkgeworCQlpcHV0KHJvb3Qp OworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0OgorCS8vIGZpeHVwIGJyZWxz ZXMKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqb21m c19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgIGludCBm bGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJcmV0 dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgb21mc19maWxs X3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG9tZnNfZnNfdHlw ZSA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJvbWZzIiwKKwkuZ2V0X3Ni ID0gb21mc19nZXRfc2IsCisJLmtpbGxfc2IgPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFn cyA9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfb21mc19m cyh2b2lkKQoreworCXJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm9tZnNfZnNfdHlwZSk7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X29tZnNfZnModm9pZCkKK3sKKwl1bnJl Z2lzdGVyX2ZpbGVzeXN0ZW0oJm9tZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRf b21mc19mcyk7Cittb2R1bGVfZXhpdChleGl0X29tZnNfZnMpOwpkaWZmIC0tZ2l0IGEvZnMvb21m cy9vbWZzLmggYi9mcy9vbWZzL29tZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAotLS0gL2Rldi9u dWxsCisrKyBiL2ZzL29tZnMvb21mcy5oCkBAIC0wLDAgKzEsOTQgQEAKKyNpZm5kZWYgX09NRlNf SAorI2RlZmluZSBfT01GU19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmlu ZSBPTUZTX01BR0lDIDB4QzI5OTNEODcKKyNkZWZpbmUgT01GU19ESVIgJ0QnCisjZGVmaW5lIE9N RlNfRklMRSAnRicKKyNkZWZpbmUgT01GU19OQU1FTEVOIDI1NgorI2RlZmluZSBPTUZTX0RJUl9T VEFSVCAweDFiOAorCitzdHJ1Y3Qgb21mc19zdXBlcl9ibG9jayB7CisJY2hhciBmaWxsMVsyNTZd OworCXUzMiBmaWxsMjsKKwl1MzIgcm9vdF9ibG9jazsKKwl1NjQgbnVtX2Jsb2NrczsKKwl1MzIg bWFnaWM7CisJdTMyIGJsb2Nrc2l6ZTsKKwl1MzIgbWlycm9yczsKKwl1MzIgc3lzX2Jsb2Nrc2l6 ZTsKK307CisKK3N0cnVjdCBvbWZzX2hlYWRlciB7CisJdTMyIGZpbGwxOworCXUzMiBzZWxmOwor CXUzMiBib2R5X3NpemU7CisJdTE2IGNyYzsKKwljaGFyIGZpbGwyWzVdOworCXU4IGNoZWNrX3hv cjsKKwl1MzIgZmlsbDM7Cit9OworCitzdHJ1Y3Qgb21mc19yb290X2Jsb2NrIHsKKwlzdHJ1Y3Qg b21mc19oZWFkZXIgaGVhZDsKKwl1NjQgZmlsbDM7CisJdTY0IG51bV9ibG9ja3M7CisJdTMyIGZp bGw0OworCXUzMiByb290X2RpcjsKKwl1NjQgZmlsbDU7CisJdTMyIGJsb2Nrc2l6ZTsKKwl1MzIg Y2x1c3RlcnNpemU7CisJdTY0IG1pcnJvcnM7CisJY2hhciBuYW1lW09NRlNfTkFNRUxFTl07Cit9 OworCitzdHJ1Y3Qgb21mc19pbm9kZSB7CisJc3RydWN0IG9tZnNfaGVhZGVyIGhlYWQ7CisJdTMy IGZpbGwxOworCXUzMiBwYXJlbnQ7CisJdTMyIGZpbGwyOworCXUzMiBzaWJsaW5nOworCXU2NCBj dGltZTsKKwljaGFyIGZpbGwzWzM1XTsKKwljaGFyIHR5cGU7CisJdTMyIGZpbGw0OworCWNoYXIg ZmlsbDVbNjRdOworCWNoYXIgbmFtZVtPTUZTX05BTUVMRU5dOworCXU2NCBzaXplOworCS8vIDE5 OCBieXRlcyBvZiBub25zZW5zZS4KK307CisKK3N0cnVjdCBvbWZzX2V4dGVudF9lbnRyeSB7CisJ dTMyIGZpbGwxOworCXUzMiBjbHVzdGVyOworCXUzMiBmaWxsMjsKKwl1MzIgYmxvY2tzOworfTsK KwkKK3N0cnVjdCBvbWZzX2V4dGVudCB7CisJdTMyIGZpbGwxOworCXUzMiBuZXh0OworCXUzMiBl eHRlbnRfY291bnQ7CisJdTMyIGZpbGwyOworCXN0cnVjdCBvbWZzX2V4dGVudF9lbnRyeSBlbnRy eTsKK307CisKKy8qIGNvbnZlcnQgYSBjbHVzdGVyIG51bWJlciB0byBhIDUxMi1ieXRlIGJsb2Nr IG51bWJlciAqLworc3RhdGljIGlubGluZSBzZWN0b3JfdCBjbHVzX3RvX2JsayhzZWN0b3JfdCBp bikKK3sKKwlyZXR1cm4gaW4gPDwgNDsKK30KKworLyogZGlyLmMgKi8KK2V4dGVybiBzdHJ1Y3Qg ZmlsZV9vcGVyYXRpb25zIG9tZnNfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2Rl X29wZXJhdGlvbnMgb21mc19kaXJfaW5vcHM7CisKKy8qIGZpbGUuYyAqLworZXh0ZXJuIHN0cnVj dCBmaWxlX29wZXJhdGlvbnMgb21mc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGFk ZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBvbWZzX2FvcHM7CisKKy8qIGlub2RlLmMgKi8KK2V4dGVy biB2b2lkIG9tZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworI2VuZGlmCg== ------=_Part_2419_14582407.1127324782612--