From: authorNari Date: 2008-05-20T13:23:16+09:00 Subject: [ruby-dev:34768] Improvement of lazy sweep patch ------=_Part_2225_10852417.1211257398584 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline authorNariです。 前に作成していたLazySweepを、現在のHeap構造に合うように修正しました。 といってもほぼ書き直してしまいましたが。 性能は手持ちのベンチマークでためした所、さほど変化はありませんでした。 http://d.hatena.ne.jp/authorNari/20080520/1211251926 --- nari ------=_Part_2225_10852417.1211257398584 Content-Type: text/x-patch; name=rb_gc_lazy_sweep_r_16484.diff Content-Transfer-Encoding: base64 X-Attachment-Id: f_fgfz9ai40 Content-Disposition: attachment; filename=rb_gc_lazy_sweep_r_16484.diff SW5kZXg6IGdjLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2MuYwkoGyRCJWolUyU4JWclcxsoQiAxNjQ4NCkK KysrIGdjLmMJKBskQjpuNkglMyVUITwbKEIpCkBAIC05MSw2ICs5MSw3IEBACiBpbnQgcnVieV9n Y19kZWJ1Z19pbmRlbnQgPSAwOwogCiAjdW5kZWYgR0NfREVCVUcKKyNkZWZpbmUgR0NfTk9USUZZ IDAKIAogI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBk ZWZpbmVkKF9fQ1lHV0lOX18pCiAjcHJhZ21hIHBhY2socHVzaCwgMSkgLyogbWFnaWMgZm9yIHJl ZHVjaW5nIHNpemVvZihSVkFMVUUpOiAyNCAtPiAyMCAqLwpAQCAtMTIzLDIwICsxMjQsMjUgQEAK ICAgICBjaGFyICpmaWxlOwogICAgIGludCAgIGxpbmU7CiAjZW5kaWYKKyAgICBjaGFyIGNvbG9y OwogfSBSVkFMVUU7CiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFO RENfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQogI3ByYWdtYSBwYWNrKHBvcCkKICNlbmRpZgog CisjZGVmaW5lIFdISVRFIDB4MDAKKyNkZWZpbmUgQkxBQ0sgMHgwMQorI2RlZmluZSBHUkFZICAw eDAyCisgCiBzdHJ1Y3QgaGVhcHNfc2xvdCB7CiAgICAgdm9pZCAqbWVtYmFzZTsKICAgICBSVkFM VUUgKnNsb3Q7CiAgICAgaW50IGxpbWl0OworICAgIGNoYXIgY29sb3I7ICAvLyB3aGl0ZSA6IGdh cmJhZ2UsIGJsYWNrIDogdXNlZCwgZ3JheSA6IG5vdCBzd2VlcAogfTsKIAogI2RlZmluZSBIRUFQ X01JTl9TTE9UUyAxMDAwMAotI2RlZmluZSBGUkVFX01JTiAgNDA5NgogCiBzdHJ1Y3QgZ2NfbGlz dCB7CiAgICAgVkFMVUUgKnZhcnB0cjsKQEAgLTE1NiwxMCArMTYyLDE2IEBACiAJUlZBTFVFICpm cmVlbGlzdDsKIAlSVkFMVUUgKnJhbmdlWzJdOwogCVJWQUxVRSAqZnJlZWQ7CisJc2l6ZV90IGxp dmU7CisJc2l6ZV90IGRlYWQ7CisJc2l6ZV90IGRvX2hlYXBfZnJlZTsKKwlzaXplX3Qgc3dlZXBf aW5kZXg7CisJc2l6ZV90IHN3ZWVwX2luY3JlbWVudDsKICAgICB9IGhlYXA7CiAgICAgc3RydWN0 IHsKIAlpbnQgZG9udF9nYzsKIAlpbnQgZHVyaW5nX2djOworCWludCBkdXJpbmdfc3dlZXA7CiAg ICAgfSBmbGFnczsKICAgICBzdHJ1Y3QgewogCWludCBuZWVkX2NhbGw7CkBAIC0xOTEsOCArMjAz LDE0IEBACiAjZGVmaW5lIGhpbWVtCQkJb2Jqc3BhY2UtPmhlYXAucmFuZ2VbMV0KICNkZWZpbmUg aGVhcHNfaW5jCQlvYmpzcGFjZS0+aGVhcC5pbmNyZW1lbnQKICNkZWZpbmUgaGVhcHNfZnJlZWQJ CW9ianNwYWNlLT5oZWFwLmZyZWVkCisjZGVmaW5lIGxpdmUgICAgICAgICAgICAgICAgICAgIG9i anNwYWNlLT5oZWFwLmxpdmUKKyNkZWZpbmUgZGVhZCAgICAgICAgICAgICAgICAgICAgb2Jqc3Bh Y2UtPmhlYXAuZGVhZAorI2RlZmluZSBkb19oZWFwX2ZyZWUgICAgICAgICAgICBvYmpzcGFjZS0+ aGVhcC5kb19oZWFwX2ZyZWUKKyNkZWZpbmUgaGVhcHNfc3dlZXBfaW5kZXggICAgICAgb2Jqc3Bh Y2UtPmhlYXAuc3dlZXBfaW5kZXgKKyNkZWZpbmUgaGVhcHNfc3dlZXBfaW5jICAgICAgICAgb2Jq c3BhY2UtPmhlYXAuc3dlZXBfaW5jcmVtZW50CiAjZGVmaW5lIGRvbnRfZ2MgCQlvYmpzcGFjZS0+ ZmxhZ3MuZG9udF9nYwogI2RlZmluZSBkdXJpbmdfZ2MJCW9ianNwYWNlLT5mbGFncy5kdXJpbmdf Z2MKKyNkZWZpbmUgZHVyaW5nX3N3ZWVwICAgICAgICAgICAgb2Jqc3BhY2UtPmZsYWdzLmR1cmlu Z19zd2VlcAogI2RlZmluZSBuZWVkX2NhbGxfZmluYWwgCW9ianNwYWNlLT5maW5hbC5uZWVkX2Nh bGwKICNkZWZpbmUgZmluYWxpemVyX3RhYmxlIAlvYmpzcGFjZS0+ZmluYWwudGFibGUKICNkZWZp bmUgZGVmZXJyZWRfZmluYWxfbGlzdAlvYmpzcGFjZS0+ZmluYWwuZGVmZXJyZWQKQEAgLTI1Miw2 ICsyNzAsNyBAQAogCiBzdGF0aWMgdm9pZCBydW5fZmluYWwocmJfb2Jqc3BhY2VfdCAqb2Jqc3Bh Y2UsIFZBTFVFIG9iaik7CiBzdGF0aWMgaW50IGdhcmJhZ2VfY29sbGVjdChyYl9vYmpzcGFjZV90 ICpvYmpzcGFjZSk7CitzdGF0aWMgaW50IGdhcmJhZ2VfY29sbGVjdF9mb3JjZShyYl9vYmpzcGFj ZV90ICpvYmpzcGFjZSk7CiAKIHZvaWQKIHJiX2dsb2JhbF92YXJpYWJsZShWQUxVRSAqdmFyKQpA QCAtMzE2LDExICszMzUsMTEgQEAKICAgICBpZiAoc2l6ZSA9PSAwKSBzaXplID0gMTsKIAogICAg IGlmIChydWJ5X2djX3N0cmVzcyB8fCAobWFsbG9jX2luY3JlYXNlK3NpemUpID4gbWFsbG9jX2xp bWl0KSB7Ci0JZ2FyYmFnZV9jb2xsZWN0KG9ianNwYWNlKTsKKwlnYXJiYWdlX2NvbGxlY3RfZm9y Y2Uob2Jqc3BhY2UpOwogICAgIH0KICAgICBSVUJZX0NSSVRJQ0FMKG1lbSA9IG1hbGxvYyhzaXpl KSk7CiAgICAgaWYgKCFtZW0pIHsKLQlpZiAoZ2FyYmFnZV9jb2xsZWN0KG9ianNwYWNlKSkgewor CWlmIChnYXJiYWdlX2NvbGxlY3RfZm9yY2Uob2Jqc3BhY2UpKSB7CiAJICAgIFJVQllfQ1JJVElD QUwobWVtID0gbWFsbG9jKHNpemUpKTsKIAl9CiAJaWYgKCFtZW0pIHsKQEAgLTM4MSwxMCArNDAw LDEwIEBACiAgICAgfQogICAgIGlmICghcHRyKSByZXR1cm4gcnVieV94bWFsbG9jKHNpemUpOwog ICAgIGlmIChzaXplID09IDApIHNpemUgPSAxOwotICAgIGlmIChydWJ5X2djX3N0cmVzcykgZ2Fy YmFnZV9jb2xsZWN0KG9ianNwYWNlKTsKKyAgICBpZiAocnVieV9nY19zdHJlc3MpIGdhcmJhZ2Vf Y29sbGVjdF9mb3JjZShvYmpzcGFjZSk7CiAgICAgUlVCWV9DUklUSUNBTChtZW0gPSByZWFsbG9j KHB0ciwgc2l6ZSkpOwogICAgIGlmICghbWVtKSB7Ci0JaWYgKGdhcmJhZ2VfY29sbGVjdChvYmpz cGFjZSkpIHsKKwlpZiAoZ2FyYmFnZV9jb2xsZWN0X2ZvcmNlKG9ianNwYWNlKSkgewogCSAgICBS VUJZX0NSSVRJQ0FMKG1lbSA9IHJlYWxsb2MocHRyLCBzaXplKSk7CiAJfQogCWlmICghbWVtKSB7 CkBAIC01MzYsMTEgKzU1NSwxMyBAQAogICAgIGhlYXBzX2xlbmd0aCA9IG5leHRfaGVhcHNfbGVu Z3RoOwogfQogCisjZGVmaW5lIFJBTlkobykgKChSVkFMVUUqKShvKSkKKwogc3RhdGljIHZvaWQK IGFzc2lnbl9oZWFwX3Nsb3QocmJfb2Jqc3BhY2VfdCAqb2Jqc3BhY2UpCiB7CiAgICAgUlZBTFVF ICpwLCAqcGVuZCwgKm1lbWJhc2U7Ci0gICAgc2l6ZV90IGhpLCBsbywgbWlkOworICAgIHNpemVf dCBoaSwgbG8sIG1pZCwgaTsKICAgICBpbnQgb2JqczsKIAkKICAgICBvYmpzID0gSEVBUF9PQkpf TElNSVQ7CkBAIC01NzAsNiArNTkxLDcgQEAKIAkgICAgaGkgPSBtaWQ7CiAJfQogCWVsc2Ugewor CSAgICBwcmludGYoIm1lbWJhc2UgPSAlcCA6IG1pZF9tZW1iYXNlID0gJXBcbiIsIG1lbWJhc2Us IG1pZF9tZW1iYXNlKTsKIAkgICAgcmJfYnVnKCJzYW1lIGhlYXAgc2xvdCBpcyBhbGxvY2F0ZWQ6 ICVwIGF0ICVsZCIsIG1lbWJhc2UsIG1pZCk7CiAJfQogICAgIH0KQEAgLTU3OSw2ICs2MDEsNyBA QAogICAgIGhlYXBzW2hpXS5tZW1iYXNlID0gbWVtYmFzZTsKICAgICBoZWFwc1toaV0uc2xvdCA9 IHA7CiAgICAgaGVhcHNbaGldLmxpbWl0ID0gb2JqczsKKyAgICBoZWFwc1toaV0uY29sb3IgPSBC TEFDSzsKICAgICBwZW5kID0gcCArIG9ianM7CiAgICAgaWYgKGxvbWVtID09IDAgfHwgbG9tZW0g PiBwKSBsb21lbSA9IHA7CiAgICAgaWYgKGhpbWVtIDwgcGVuZCkgaGltZW0gPSBwZW5kOwpAQCAt NTkwLDYgKzYxMyw5IEBACiAJZnJlZWxpc3QgPSBwOwogCXArKzsKICAgICB9CisgICAgaWYgKGhp IDwgaGVhcHNfc3dlZXBfaW5kZXgpIHsKKwloZWFwc19zd2VlcF9pbmRleCsrOworICAgIH0KIH0K IAogc3RhdGljIHZvaWQKQEAgLTYzMiwxNSArNjU4LDE0IEBACiAgICAgcmV0dXJuIFFmYWxzZTsK IH0KIAotI2RlZmluZSBSQU5ZKG8pICgoUlZBTFVFKikobykpCi0KLXN0YXRpYyBWQUxVRQorVkFM VUUKIHJiX25ld29ial9mcm9tX2hlYXAocmJfb2Jqc3BhY2VfdCAqb2Jqc3BhY2UpCiB7CiAgICAg VkFMVUUgb2JqOworICAgIHJiX3RocmVhZF90ICp0aCA9IEdFVF9USFJFQUQoKTsKIAkKICAgICBp ZiAocnVieV9nY19zdHJlc3MgfHwgIWZyZWVsaXN0KSB7Ci0gICAgCWlmICghaGVhcHNfaW5jcmVt ZW50KG9ianNwYWNlKSAmJiAhZ2FyYmFnZV9jb2xsZWN0KG9ianNwYWNlKSkgeworICAgCWlmICgh Z2FyYmFnZV9jb2xsZWN0KG9ianNwYWNlKSkgewogCSAgICByYl9tZW1lcnJvcigpOwogCX0KICAg ICB9CkBAIC02NzEsNiArNjk2LDcgQEAKIAogCXRoLT52YWx1ZV9jYWNoZVtpXSA9IHY7CiAJUkJB U0lDKHYpLT5mbGFncyA9IEZMX01BUks7CisJUkFOWSh2KS0+Y29sb3IgPSBCTEFDSzsKICAgICB9 CiAgICAgdGgtPnZhbHVlX2NhY2hlX3B0ciA9ICZ0aC0+dmFsdWVfY2FjaGVbMF07CiAgICAgcnYg PSByYl9uZXdvYmpfZnJvbV9oZWFwKG9ianNwYWNlKTsKQEAgLTY5Myw2ICs3MTksNyBAQAogCiAg ICAgaWYgKHYpIHsKIAlSQkFTSUModiktPmZsYWdzID0gMDsKKwlSQU5ZKHYpLT5jb2xvciA9IFdI SVRFOwogCXRoLT52YWx1ZV9jYWNoZV9wdHIrKzsKICAgICB9CiAgICAgZWxzZSB7CkBAIC04MjQs OCArODUxLDggQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgaGVhcHNfdXNlZDsgaSsrKSB7CiAJcCA9 IGhlYXBzW2ldLnNsb3Q7IHBlbmQgPSBwICsgaGVhcHNbaV0ubGltaXQ7CiAJd2hpbGUgKHAgPCBw ZW5kKSB7Ci0JICAgIGlmICgocC0+YXMuYmFzaWMuZmxhZ3MgJiBGTF9NQVJLKSAmJgotCQkocC0+ YXMuYmFzaWMuZmxhZ3MgIT0gRkxfTUFSSykpIHsKKwkgICAgaWYgKChwLT5jb2xvciA9PSBCTEFD SykgJiYKKwkJKHAtPmFzLmZyZWUuZmxhZ3MgIT0gRkxfTUFSSykpIHsKIAkJZ2NfbWFya19jaGls ZHJlbihvYmpzcGFjZSwgKFZBTFVFKXAsIDApOwogCSAgICB9CiAJICAgIHArKzsKQEAgLTg2NSw4 ICs4OTIsOCBAQAogICAgIHdoaWxlIChsbyA8IGhpKSB7CiAJbWlkID0gKGxvICsgaGkpIC8gMjsK IAloZWFwID0gJmhlYXBzW21pZF07Ci0JaWYgKGhlYXAtPnNsb3QgPD0gcCkgewotCSAgICBpZiAo cCA8IGhlYXAtPnNsb3QgKyBoZWFwLT5saW1pdCkKKwlpZiAoUkFOWShoZWFwLT5zbG90KSA8PSBw KSB7CisJICAgIGlmIChwIDwgUkFOWShoZWFwLT5zbG90KSArIGhlYXAtPmxpbWl0KQogCQlyZXR1 cm4gUXRydWU7CiAJICAgIGxvID0gbWlkICsgMTsKIAl9CkBAIC0xMDA1LDggKzEwMzIsOSBAQAog ICAgIG9iaiA9IFJBTlkocHRyKTsKICAgICBpZiAocmJfc3BlY2lhbF9jb25zdF9wKHB0cikpIHJl dHVybjsgLyogc3BlY2lhbCBjb25zdCBub3QgbWFya2VkICovCiAgICAgaWYgKG9iai0+YXMuYmFz aWMuZmxhZ3MgPT0gMCkgcmV0dXJuOyAgICAgICAvKiBmcmVlIGNlbGwgKi8KLSAgICBpZiAob2Jq LT5hcy5iYXNpYy5mbGFncyAmIEZMX01BUkspIHJldHVybjsgIC8qIGFscmVhZHkgbWFya2VkICov Ci0gICAgb2JqLT5hcy5iYXNpYy5mbGFncyB8PSBGTF9NQVJLOworICAgIGlmIChvYmotPmNvbG9y ICYgQkxBQ0spIHJldHVybjsgIC8qIGFscmVhZHkgbWFya2VkICovCisgICAgb2JqLT5jb2xvciA9 IEJMQUNLOworICAgIGxpdmUrKzsKIAogICAgIGlmIChsZXYgPiBHQ19MRVZFTF9NQVggfHwgKGxl diA9PSAwICYmIHJ1Ynlfc3RhY2tfY2hlY2soKSkpIHsKIAlpZiAoIW1hcmtfc3RhY2tfb3ZlcmZs b3cpIHsKQEAgLTEwMzksOSArMTA2NywxMCBAQAogICBhZ2FpbjoKICAgICBvYmogPSBSQU5ZKHB0 cik7CiAgICAgaWYgKHJiX3NwZWNpYWxfY29uc3RfcChwdHIpKSByZXR1cm47IC8qIHNwZWNpYWwg Y29uc3Qgbm90IG1hcmtlZCAqLwotICAgIGlmIChvYmotPmFzLmJhc2ljLmZsYWdzID09IDApIHJl dHVybjsgICAgICAgLyogZnJlZSBjZWxsICovCi0gICAgaWYgKG9iai0+YXMuYmFzaWMuZmxhZ3Mg JiBGTF9NQVJLKSByZXR1cm47ICAvKiBhbHJlYWR5IG1hcmtlZCAqLwotICAgIG9iai0+YXMuYmFz aWMuZmxhZ3MgfD0gRkxfTUFSSzsKKyAgICBpZiAob2JqLT5hcy5mcmVlLmZsYWdzID09IDApIHJl dHVybjsgICAgICAgLyogZnJlZSBjZWxsICovCisgICAgaWYgKG9iai0+Y29sb3IgJiBCTEFDSykg cmV0dXJuOyAgLyogYWxyZWFkeSBtYXJrZWQgKi8KKyAgICBvYmotPmNvbG9yID0gQkxBQ0s7Cisg ICAgbGl2ZSsrOwogCiAgIG1hcmtpbmc6CiAgICAgaWYgKEZMX1RFU1Qob2JqLCBGTF9FWElWQVIp KSB7CkBAIC0xMjkyLDEyICsxMzIxLDE1IEBACiBzdGF0aWMgdm9pZAogZmluYWxpemVfbGlzdChy Yl9vYmpzcGFjZV90ICpvYmpzcGFjZSwgUlZBTFVFICpwKQogeworICAgIHJiX3RocmVhZF90ICp0 aCA9IEdFVF9USFJFQUQoKTsKKyAgICAKICAgICB3aGlsZSAocCkgewogCVJWQUxVRSAqdG1wID0g cC0+YXMuZnJlZS5uZXh0OwogCXJ1bl9maW5hbChvYmpzcGFjZSwgKFZBTFVFKXApOwogCWlmICgh RkxfVEVTVChwLCBGTF9TSU5HTEVUT04pKSB7IC8qIG5vdCBmcmVlaW5nIHBhZ2UgKi8KICAgICAg ICAgICAgIFZBTEdSSU5EX01BS0VfTUVNX1VOREVGSU5FRCgodm9pZCopcCwgc2l6ZW9mKFJWQUxV RSkpOwogCSAgICBwLT5hcy5mcmVlLmZsYWdzID0gMDsKKwkgICAgcC0+Y29sb3IgPSBXSElURTsK IAkgICAgcC0+YXMuZnJlZS5uZXh0ID0gZnJlZWxpc3Q7CiAJICAgIGZyZWVsaXN0ID0gcDsKIAl9 CkBAIC0xMzA1LDEyNCArMTMzNywxMDIgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkCi1mcmVl X3VudXNlZF9oZWFwcyhyYl9vYmpzcGFjZV90ICpvYmpzcGFjZSkKLXsKLSAgICBzaXplX3QgaSwg ajsKLSAgICBSVkFMVUUgKmxhc3QgPSAwOwordm9pZCByYl9nY19hYm9ydF90aHJlYWRzKHZvaWQp OwogCi0gICAgZm9yIChpID0gaiA9IDE7IGogPCBoZWFwc191c2VkOyBpKyspIHsKLQlpZiAoaGVh cHNbaV0ubGltaXQgPT0gMCkgewotCSAgICBpZiAoIWxhc3QpIHsKLQkJbGFzdCA9IGhlYXBzW2ld Lm1lbWJhc2U7CitzdGF0aWMgaW50CitzbG90X3N3ZWVwKHJiX29ianNwYWNlX3QgKm9ianNwYWNl LCBzdHJ1Y3QgaGVhcHNfc2xvdCAqdGFyZ2V0KSB7CisgICAgUlZBTFVFICpwLCAqcGVuZCwgKmZy ZWU7CisgICAgUlZBTFVFICpmaW5hbDsKKyAgICBpbnQgZnJlZWQgPSAwOworCisgICAgaWYgKHRh cmdldC0+Y29sb3IgPT0gQkxBQ0sgfHwgdGFyZ2V0LT5jb2xvciA9PSBXSElURSkgeworCXJldHVy biBRZmFsc2U7CisgICAgfQorCisgICAgZmluYWwgPSBkZWZlcnJlZF9maW5hbF9saXN0OworICAg IGZyZWUgPSBmcmVlbGlzdDsKKyAgICBwID0gdGFyZ2V0LT5zbG90OyBwZW5kID0gcCArIHRhcmdl dC0+bGltaXQ7CisgICAgd2hpbGUgKHAgPCBwZW5kKSB7CisJaWYgKHAtPmNvbG9yICE9IEJMQUNL KSB7CisJICAgIGlmIChwLT5hcy5iYXNpYy5mbGFncykgeworCQlvYmpfZnJlZShvYmpzcGFjZSwg KFZBTFVFKXApOwogCSAgICB9CisJICAgIGlmIChuZWVkX2NhbGxfZmluYWwgJiYgRkxfVEVTVChw LCBGTF9GSU5BTElaRSkpIHsKKwkJcC0+YXMuZnJlZS5mbGFncyA9IEZMX01BUks7IC8qIHJlbWFp biBtYXJrZWQgKi8KKwkJcC0+YXMuZnJlZS5uZXh0ID0gZGVmZXJyZWRfZmluYWxfbGlzdDsKKwkJ ZGVmZXJyZWRfZmluYWxfbGlzdCA9IHA7CisJICAgIH0KIAkgICAgZWxzZSB7Ci0JCWZyZWUoaGVh cHNbaV0ubWVtYmFzZSk7CisJCVZBTEdSSU5EX01BS0VfTUVNX1VOREVGSU5FRCgodm9pZCopcCwg c2l6ZW9mKFJWQUxVRSkpOworCQlwLT5jb2xvciA9IFdISVRFOworCQlwLT5hcy5mcmVlLmZsYWdz ID0gMDsKKwkJcC0+YXMuZnJlZS5uZXh0ID0gZnJlZWxpc3Q7CisJCWZyZWVsaXN0ID0gcDsKIAkg ICAgfQotCSAgICBoZWFwc191c2VkLS07CisJICAgIGZyZWVkKys7CiAJfQorCWVsc2UgaWYgKFJC QVNJQyhwKS0+ZmxhZ3MgPT0gRkxfTUFSSykgeworCSAgICAvKiBvYmplY3RzIHRvIGJlIGZpbmFs aXplZCAqLworCSAgICAvKiBkbyBub3RoaW5nIHJlbWFpbiBtYXJrZWQgKi8KKwl9CiAJZWxzZSB7 Ci0JICAgIGlmIChpICE9IGopIHsKLQkJaGVhcHNbal0gPSBoZWFwc1tpXTsKLQkgICAgfQotCSAg ICBqKys7CisJICAgIHAtPmNvbG9yID0gV0hJVEU7CisJICAgIGRlYWQgKz0gZnJlZWQ7CiAJfQor CXArKzsKICAgICB9Ci0gICAgaWYgKGxhc3QpIHsKLQlpZiAobGFzdCA8IGhlYXBzX2ZyZWVkKSB7 Ci0JICAgIGZyZWUoaGVhcHNfZnJlZWQpOwotCSAgICBoZWFwc19mcmVlZCA9IGxhc3Q7CisgICAg aWYgKGZyZWVkID09IHRhcmdldC0+bGltaXQgJiYgZGVhZCA+IGRvX2hlYXBfZnJlZSkgeworCVJW QUxVRSAqcHA7CisJCisJdGFyZ2V0LT5saW1pdCA9IDA7CisJdGFyZ2V0LT5jb2xvciA9IFdISVRF OworCWZvciAocHAgPSBkZWZlcnJlZF9maW5hbF9saXN0OyBwcCAhPSBmaW5hbDsgcHAgPSBwcC0+ YXMuZnJlZS5uZXh0KSB7CisJICAgIHBwLT5hcy5mcmVlLmZsYWdzIHw9IEZMX1NJTkdMRVRPTjsg LyogZnJlZWluZyBwYWdlIG1hcmsgKi8KIAl9Ci0JZWxzZSB7Ci0JICAgIGZyZWUobGFzdCk7CisJ ZnJlZWxpc3QgPSBmcmVlOwkvKiBjYW5jZWwgdGhpcyBwYWdlIGZyb20gZnJlZWxpc3QgKi8KKyAg ICB9CisgICAgZWxzZSB7CisJdGFyZ2V0LT5jb2xvciA9IEJMQUNLOworICAgIH0KKyAgICByZXR1 cm4gUXRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitoZWFwX3N3ZWVwX2luY3JlbWVudChyYl9vYmpz cGFjZV90ICpvYmpzcGFjZSkgeworICAgIGludCBpID0gMDsKKworICAgIHdoaWxlIChpIDwgaGVh cHNfc3dlZXBfaW5jICYmIGhlYXBzX3N3ZWVwX2luZGV4IDwgaGVhcHNfdXNlZCkgeworCWlmIChz bG90X3N3ZWVwKG9ianNwYWNlLCAmaGVhcHNbaGVhcHNfc3dlZXBfaW5kZXhdKSkgeworCSAgICBp Kys7CiAJfQorCWhlYXBzX3N3ZWVwX2luZGV4Kys7CiAgICAgfQogfQogCi12b2lkIHJiX2djX2Fi b3J0X3RocmVhZHModm9pZCk7Ci0KIHN0YXRpYyB2b2lkCi1nY19zd2VlcChyYl9vYmpzcGFjZV90 ICpvYmpzcGFjZSkKLXsKLSAgICBSVkFMVUUgKnAsICpwZW5kLCAqZmluYWxfbGlzdDsKLSAgICBz aXplX3QgZnJlZWQgPSAwOwotICAgIHNpemVfdCBpOwotICAgIHNpemVfdCBsaXZlID0gMCwgZnJl ZV9taW4gPSAwLCBkb19oZWFwX2ZyZWUgPSAwOworaGVhcF9zd2VlcChyYl9vYmpzcGFjZV90ICpv YmpzcGFjZSkgewogCi0gICAgZG9faGVhcF9mcmVlID0gKGhlYXBzX3VzZWQgKiBIRUFQX09CSl9M SU1JVCkgKiAwLjY1OwotICAgIGZyZWVfbWluID0gKGhlYXBzX3VzZWQgKiBIRUFQX09CSl9MSU1J VCkgICogMC4yOwotICAgIGlmIChmcmVlX21pbiA8IEZSRUVfTUlOKSB7Ci0JZG9faGVhcF9mcmVl ID0gaGVhcHNfdXNlZCAqIEhFQVBfT0JKX0xJTUlUOwotICAgICAgICBmcmVlX21pbiA9IEZSRUVf TUlOOworICAgIHdoaWxlICghZnJlZWxpc3QgJiYgaGVhcHNfc3dlZXBfaW5kZXggPCBoZWFwc191 c2VkKSB7CisJc2xvdF9zd2VlcChvYmpzcGFjZSwgJmhlYXBzW2hlYXBzX3N3ZWVwX2luZGV4XSk7 CisJaGVhcHNfc3dlZXBfaW5kZXgrKzsKICAgICB9Cit9CiAKLSAgICBmcmVlbGlzdCA9IDA7Ci0g ICAgZmluYWxfbGlzdCA9IGRlZmVycmVkX2ZpbmFsX2xpc3Q7Ci0gICAgZGVmZXJyZWRfZmluYWxf bGlzdCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGhlYXBzX3VzZWQ7IGkrKykgewotCWludCBu ID0gMDsKLQlSVkFMVUUgKmZyZWUgPSBmcmVlbGlzdDsKLQlSVkFMVUUgKmZpbmFsID0gZmluYWxf bGlzdDsKK3N0YXRpYyBpbnQKK2djX2xhenlfc3dlZXAocmJfb2Jqc3BhY2VfdCAqb2Jqc3BhY2Us IHJiX3RocmVhZF90ICp0aCkgewogCi0JcCA9IGhlYXBzW2ldLnNsb3Q7IHBlbmQgPSBwICsgaGVh cHNbaV0ubGltaXQ7Ci0Jd2hpbGUgKHAgPCBwZW5kKSB7Ci0JICAgIGlmICghKHAtPmFzLmJhc2lj LmZsYWdzICYgRkxfTUFSSykpIHsKLQkJaWYgKHAtPmFzLmJhc2ljLmZsYWdzKSB7Ci0JCSAgICBv YmpfZnJlZShvYmpzcGFjZSwgKFZBTFVFKXApOwotCQl9Ci0JCWlmIChuZWVkX2NhbGxfZmluYWwg JiYgRkxfVEVTVChwLCBGTF9GSU5BTElaRSkpIHsKLQkJICAgIHAtPmFzLmZyZWUuZmxhZ3MgPSBG TF9NQVJLOyAvKiByZW1haW4gbWFya2VkICovCi0JCSAgICBwLT5hcy5mcmVlLm5leHQgPSBmaW5h bF9saXN0OwotCQkgICAgZmluYWxfbGlzdCA9IHA7Ci0JCX0KLQkJZWxzZSB7Ci0gICAgICAgICAg ICAgICAgICAgIFZBTEdSSU5EX01BS0VfTUVNX1VOREVGSU5FRCgodm9pZCopcCwgc2l6ZW9mKFJW QUxVRSkpOwotCQkgICAgcC0+YXMuZnJlZS5mbGFncyA9IDA7Ci0JCSAgICBwLT5hcy5mcmVlLm5l eHQgPSBmcmVlbGlzdDsKLQkJICAgIGZyZWVsaXN0ID0gcDsKLQkJfQotCQluKys7Ci0JICAgIH0K LQkgICAgZWxzZSBpZiAoUkJBU0lDKHApLT5mbGFncyA9PSBGTF9NQVJLKSB7Ci0JCS8qIG9iamVj dHMgdG8gYmUgZmluYWxpemVkICovCi0JCS8qIGRvIG5vdGhpbmcgcmVtYWluIG1hcmtlZCAqLwot CSAgICB9Ci0JICAgIGVsc2UgewotCQlSQkFTSUMocCktPmZsYWdzICY9IH5GTF9NQVJLOwotCQls aXZlKys7Ci0JICAgIH0KLQkgICAgcCsrOwotCX0KLQlpZiAobiA9PSBoZWFwc1tpXS5saW1pdCAm JiBmcmVlZCA+IGRvX2hlYXBfZnJlZSkgewotCSAgICBSVkFMVUUgKnBwOwotCi0JICAgIGhlYXBz W2ldLmxpbWl0ID0gMDsKLQkgICAgZm9yIChwcCA9IGZpbmFsX2xpc3Q7IHBwICE9IGZpbmFsOyBw cCA9IHBwLT5hcy5mcmVlLm5leHQpIHsKLQkJcC0+YXMuZnJlZS5mbGFncyB8PSBGTF9TSU5HTEVU T047IC8qIGZyZWVpbmcgcGFnZSBtYXJrICovCi0JICAgIH0KLQkgICAgZnJlZWxpc3QgPSBmcmVl OwkvKiBjYW5jZWwgdGhpcyBwYWdlIGZyb20gZnJlZWxpc3QgKi8KLQl9Ci0JZWxzZSB7Ci0JICAg IGZyZWVkICs9IG47Ci0JfQorICAgIGlmIChoZWFwc19pbmNyZW1lbnQob2Jqc3BhY2UpKSB7CisJ aGVhcF9zd2VlcF9pbmNyZW1lbnQob2Jqc3BhY2UpOwogICAgIH0KLSAgICBpZiAobWFsbG9jX2lu Y3JlYXNlID4gbWFsbG9jX2xpbWl0KSB7Ci0JbWFsbG9jX2xpbWl0ICs9IChtYWxsb2NfaW5jcmVh c2UgLSBtYWxsb2NfbGltaXQpICogKGRvdWJsZSlsaXZlIC8gKGxpdmUgKyBmcmVlZCk7Ci0JaWYg KG1hbGxvY19saW1pdCA8IEdDX01BTExPQ19MSU1JVCkgbWFsbG9jX2xpbWl0ID0gR0NfTUFMTE9D X0xJTUlUOworICAgIGVsc2UgeworCWhlYXBfc3dlZXAob2Jqc3BhY2UpOwogICAgIH0KLSAgICBt YWxsb2NfaW5jcmVhc2UgPSAwOwotICAgIGlmIChmcmVlZCA8IGZyZWVfbWluKSB7Ci0gICAgCXNl dF9oZWFwc19pbmNyZW1lbnQob2Jqc3BhY2UpOwotCWhlYXBzX2luY3JlbWVudChvYmpzcGFjZSk7 CisgICAgCisgICAgaWYgKCFmcmVlbGlzdCkgeworCXJldHVybiBRZmFsc2U7CiAgICAgfQotICAg IGR1cmluZ19nYyA9IDA7Ci0KLSAgICAvKiBjbGVhciBmaW5hbGl6YXRpb24gbGlzdCAqLwotICAg IGlmIChmaW5hbF9saXN0KSB7Ci0JZGVmZXJyZWRfZmluYWxfbGlzdCA9IGZpbmFsX2xpc3Q7Ci0J cmV0dXJuOwotICAgIH0KLSAgICBmcmVlX3VudXNlZF9oZWFwcyhvYmpzcGFjZSk7CisgICAgCisg ICAgcmV0dXJuIFF0cnVlOwogfQogCiB2b2lkCkBAIC0xNDMxLDggKzE0NDEsNyBAQAogICAgIHJi X29ianNwYWNlX3QgKm9ianNwYWNlID0gJnJiX29ianNwYWNlOwogICAgIFZBTEdSSU5EX01BS0Vf TUVNX1VOREVGSU5FRCgodm9pZCopcCwgc2l6ZW9mKFJWQUxVRSkpOwogICAgIFJBTlkocCktPmFz LmZyZWUuZmxhZ3MgPSAwOwotICAgIFJBTlkocCktPmFzLmZyZWUubmV4dCA9IGZyZWVsaXN0Owot ICAgIGZyZWVsaXN0ID0gUkFOWShwKTsKKyAgICBSQU5ZKHApLT5jb2xvciA9IFdISVRFOwogfQog CiBzdGF0aWMgdm9pZApAQCAtMTU4OSw4ICsxNTk4LDYgQEAKICNlbmRpZiAvKiBfX2h1bWFuNjhr X18gb3IgREpHUFAgKi8KICNlbmRpZiAvKiBfX0dOVUNfXyAqLwogCi0jZGVmaW5lIEdDX05PVElG WSAwCi0KIHZvaWQgcmJfdm1fbWFyayh2b2lkICpwdHIpOwogCiBzdGF0aWMgdm9pZApAQCAtMTYz NiwzMCArMTY0Myw3MSBAQAogCiB2b2lkIHJiX2djX21hcmtfZW5jb2RpbmdzKHZvaWQpOwogCi1z dGF0aWMgaW50Ci1nYXJiYWdlX2NvbGxlY3QocmJfb2Jqc3BhY2VfdCAqb2Jqc3BhY2UpCitzdGF0 aWMgdm9pZAorZ2NfbWFya19hbGxfY2xlYXIocmJfb2Jqc3BhY2VfdCAqb2Jqc3BhY2UpCiB7Cisg ICAgUlZBTFVFICpsYXN0ID0gMDsKKyAgICBzaXplX3QgaSwgajsKKyAgICAKKyAgICBmb3IgKGkg PSBqID0gMDsgaiA8IGhlYXBzX3VzZWQ7IGkrKykgeworCWlmIChoZWFwc1tpXS5jb2xvciA9PSBX SElURSAmJiAhZGVmZXJyZWRfZmluYWxfbGlzdCkgeworCSAgICBpZiAoIWxhc3QpIHsKKwkJbGFz dCA9IGhlYXBzW2ldLm1lbWJhc2U7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCWZyZWUoaGVhcHNb aV0ubWVtYmFzZSk7CisJICAgIH0KKwkgICAgaGVhcHNfdXNlZC0tOworCX0KKwllbHNlIHsKKwkg ICAgaWYgKGhlYXBzW2ldLmNvbG9yID09IEdSQVkpIHsKKwkJUlZBTFVFICpwLCAqcGVuZDsKKwkJ cCA9IGhlYXBzW2ldLnNsb3Q7IHBlbmQgPSBwICsgaGVhcHNbaV0ubGltaXQ7CisJCXdoaWxlIChw IDwgcGVuZCkgeworCQkgICAgaWYgKHAtPmNvbG9yICE9IEJMQUNLKSB7CisJCQlpZiAocC0+YXMu YmFzaWMuZmxhZ3MgJiYgIUZMX1RFU1QocCwgRkxfRklOQUxJWkUpKSB7CisJCQkgICAgb2JqX2Zy ZWUob2Jqc3BhY2UsIChWQUxVRSlwKTsKKwkJCSAgICBWQUxHUklORF9NQUtFX01FTV9VTkRFRklO RUQoKHZvaWQqKXAsIHNpemVvZihSVkFMVUUpKTsKKwkJCSAgICBwLT5hcy5mcmVlLmZsYWdzID0g MDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKFJCQVNJQyhwKS0+ZmxhZ3MgIT0gRkxf TUFSSykgeworCQkJcC0+Y29sb3IgPSBXSElURTsKKwkJICAgIH0KKwkJICAgIHArKzsKKwkJfQor CSAgICB9CisJICAgIGVsc2UgeworCQloZWFwc1tpXS5jb2xvciA9IEdSQVk7CisJICAgIH0KKwkg ICAgaWYgKGkgIT0gaikgeworCQloZWFwc1tqXSA9IGhlYXBzW2ldOworCSAgICB9CisJICAgIGor KzsKKwl9CisgICAgfQorICAgIGlmIChsYXN0KSB7CisJaWYgKGxhc3QgPCBoZWFwc19mcmVlZCkg eworCSAgICBmcmVlKGhlYXBzX2ZyZWVkKTsKKwkgICAgaGVhcHNfZnJlZWQgPSBsYXN0OworCX0K KwllbHNlIHsKKwkgICAgZnJlZShsYXN0KTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAor Z2NfbWFya3MocmJfb2Jqc3BhY2VfdCAqb2Jqc3BhY2UsIHJiX3RocmVhZF90ICp0aCkKK3sKICAg ICBzdHJ1Y3QgZ2NfbGlzdCAqbGlzdDsKLSAgICByYl90aHJlYWRfdCAqdGggPSBHRVRfVEhSRUFE KCk7CisgICAgc2l6ZV90IGZyZWVfbWluID0gMDsKIAotICAgIGlmIChHQ19OT1RJRlkpIHByaW50 Zigic3RhcnQgZ2FyYmFnZV9jb2xsZWN0KClcbiIpOworICAgIGxpdmUgPSAwOworICAgIGZyZWVs aXN0ID0gMDsKIAotICAgIGlmICghaGVhcHMpIHsKLQlyZXR1cm4gUWZhbHNlOwotICAgIH0KKyAg ICBnY19tYXJrX2FsbF9jbGVhcihvYmpzcGFjZSk7CiAKLSAgICBpZiAoZG9udF9nYyB8fCBkdXJp bmdfZ2MpIHsKLQlpZiAoIWZyZWVsaXN0KSB7Ci0gICAgICAgICAgICBpZiAoIWhlYXBzX2luY3Jl bWVudChvYmpzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICBzZXRfaGVhcHNfaW5jcmVtZW50KG9i anNwYWNlKTsKLSAgICAgICAgICAgICAgICBoZWFwc19pbmNyZW1lbnQob2Jqc3BhY2UpOwotICAg ICAgICAgICAgfQotCX0KLQlyZXR1cm4gUXRydWU7Ci0gICAgfQotICAgIGR1cmluZ19nYysrOwot ICAgIG9ianNwYWNlLT5jb3VudCsrOwotCiAgICAgU0VUX1NUQUNLX0VORDsKIAogICAgIGluaXRf bWFya19zdGFjayhvYmpzcGFjZSk7CkBAIC0xNzAxLDkgKzE3NDksNjAgQEAKIAl9CiAgICAgfQog Ci0gICAgZ2Nfc3dlZXAob2Jqc3BhY2UpOworICAgIGRlYWQgPSAwOworICAgIGhlYXBzX3N3ZWVw X2luZGV4ID0gMDsKKyAgICBoZWFwc19zd2VlcF9pbmMgPSAoaGVhcHNfdXNlZCAvIDEwKSArIDE7 CisgICAgZG9faGVhcF9mcmVlID0gKGhlYXBzX3VzZWQgKiBIRUFQX09CSl9MSU1JVCkgKiAwLjY1 OworICAgIGZyZWVfbWluID0gKGhlYXBzX3VzZWQgKiBIRUFQX09CSl9MSU1JVCkgICogMC4yOwor ICAgIGlmIChmcmVlX21pbiA8IEZSRUVfTUlOKSBmcmVlX21pbiA9IEZSRUVfTUlOOworICAgIGlm IChmcmVlX21pbiA+IChoZWFwc191c2VkICogSEVBUF9PQkpfTElNSVQgLSBsaXZlKSkgeworCXNl dF9oZWFwc19pbmNyZW1lbnQob2Jqc3BhY2UpOworCWhlYXBzX3N3ZWVwX2luYyA9IChoZWFwc191 c2VkICsgaGVhcHNfc3dlZXBfaW5jKSAvIGhlYXBzX3N3ZWVwX2luYyArIDE7CisgICAgfQorfQog CitzdGF0aWMgaW50CitnYXJiYWdlX2NvbGxlY3RfZm9yY2UocmJfb2Jqc3BhY2VfdCAqb2Jqc3Bh Y2UpCit7CisgICAgaWYgKG1hbGxvY19pbmNyZWFzZSA+IG1hbGxvY19saW1pdCkgeworCW1hbGxv Y19saW1pdCArPSAobWFsbG9jX2luY3JlYXNlIC0gbWFsbG9jX2xpbWl0KSAqIChkb3VibGUpbGl2 ZSAvIChoZWFwc191c2VkICogSEVBUF9PQkpfTElNSVQpOworCWlmIChtYWxsb2NfbGltaXQgPCBH Q19NQUxMT0NfTElNSVQpIG1hbGxvY19saW1pdCA9IEdDX01BTExPQ19MSU1JVDsKKyAgICB9Cisg ICAgbWFsbG9jX2luY3JlYXNlID0gMDsKKyAgICBnY19tYXJrcyhvYmpzcGFjZSwgR0VUX1RIUkVB RCgpKTsKKyAgICByZXR1cm4gZ2FyYmFnZV9jb2xsZWN0KG9ianNwYWNlKTsKK30KKworc3RhdGlj IGludAorZ2FyYmFnZV9jb2xsZWN0KHJiX29ianNwYWNlX3QgKm9ianNwYWNlKQoreworICAgIHJi X3RocmVhZF90ICp0aCA9IEdFVF9USFJFQUQoKTsKKworICAgIGlmIChHQ19OT1RJRlkpIHByaW50 Zigic3RhcnQgZ2FyYmFnZV9jb2xsZWN0KClcbiIpOworCisgICAgaWYgKCFoZWFwcykgeworCXJl dHVybiBRZmFsc2U7CisgICAgfQorCisgICAgaWYgKGRvbnRfZ2MgfHwgZHVyaW5nX2djKSB7CisJ aWYgKCFmcmVlbGlzdCkgeworICAgICAgICAgICAgaWYgKCFoZWFwc19pbmNyZW1lbnQob2Jqc3Bh Y2UpKSB7CisgICAgICAgICAgICAgICAgc2V0X2hlYXBzX2luY3JlbWVudChvYmpzcGFjZSk7Cisg ICAgICAgICAgICAgICAgaGVhcHNfaW5jcmVtZW50KG9ianNwYWNlKTsKKyAgICAgICAgICAgIH0K Kwl9CisJcmV0dXJuIFF0cnVlOworICAgIH0KKyAgICBkdXJpbmdfZ2MrKzsKKyAgICBvYmpzcGFj ZS0+Y291bnQrKzsKKworICAgIHdoaWxlICghZ2NfbGF6eV9zd2VlcChvYmpzcGFjZSwgdGgpKSB7 CisJZ2NfbWFya3Mob2Jqc3BhY2UsIHRoKTsKKyAgICB9CisKICAgICBpZiAoR0NfTk9USUZZKSBw cmludGYoImVuZCBnYXJiYWdlX2NvbGxlY3QoKVxuIik7CisgICAgZHVyaW5nX2djID0gMDsKKwog ICAgIHJldHVybiBRdHJ1ZTsKIH0KIApAQCAtMjA0OCw3ICsyMTQ3LDYgQEAKICAgICBpZiAocCkg ewogCWZpbmFsaXplX2xpc3Qob2Jqc3BhY2UsIHApOwogICAgIH0KLSAgICBmcmVlX3VudXNlZF9o ZWFwcyhvYmpzcGFjZSk7CiAgICAgZHVyaW5nX2djID0gMDsKIH0KIApAQCAtMjA5Miw2ICsyMTkw LDcgQEAKIAkJREFUQV9QVFIocCkgJiYgUkFOWShwKS0+YXMuZGF0YS5kZnJlZSAmJgogCQlSQU5Z KHApLT5hcy5iYXNpYy5rbGFzcyAhPSByYl9jVGhyZWFkKSB7CiAJCXAtPmFzLmZyZWUuZmxhZ3Mg PSAwOworCQlwLT5jb2xvciA9IFdISVRFOwogCQlpZiAoKGxvbmcpUkFOWShwKS0+YXMuZGF0YS5k ZnJlZSA9PSAtMSkgewogCQkgICAgUlVCWV9DUklUSUNBTChmcmVlKERBVEFfUFRSKHApKSk7CiAJ CX0KQEAgLTIxMDMsNiArMjIwMiw3IEBACiAJICAgIGVsc2UgaWYgKEJVSUxUSU5fVFlQRShwKSA9 PSBUX0ZJTEUpIHsKIAkJaWYgKHJiX2lvX2ZwdHJfZmluYWxpemUoUkFOWShwKS0+YXMuZmlsZS5m cHRyKSkgewogCQkgICAgcC0+YXMuZnJlZS5mbGFncyA9IDA7CisJCSAgICBwLT5jb2xvciA9IFdI SVRFOwogICAgICAgICAgICAgICAgICAgICBWQUxHUklORF9NQUtFX01FTV9VTkRFRklORUQoKHZv aWQqKXAsIHNpemVvZihSVkFMVUUpKTsKIAkJfQogCSAgICB9CkBAIC0yMTE2LDggKzIyMTYsOCBA QAogcmJfZ2Modm9pZCkKIHsKICAgICByYl9vYmpzcGFjZV90ICpvYmpzcGFjZSA9ICZyYl9vYmpz cGFjZTsKKyAgICBnY19maW5hbGl6ZV9kZWZlcnJlZChvYmpzcGFjZSk7CiAgICAgZ2FyYmFnZV9j b2xsZWN0KG9ianNwYWNlKTsKLSAgICBnY19maW5hbGl6ZV9kZWZlcnJlZChvYmpzcGFjZSk7CiB9 CiAKIC8qCg== ------=_Part_2225_10852417.1211257398584--