From: Akinori MUSHA Date: 2009-02-19T04:33:12+09:00 Subject: [ruby-dev:38048] Add option hash support to rb_scan_args() --pgp-sign-Multipart_Thu_Feb_19_04:33:38_2009-1 Content-Type: multipart/mixed; boundary="Multipart_Thu_Feb_19_04:33:38_2009-1" --Multipart_Thu_Feb_19_04:33:38_2009-1 Content-Type: text/plain; charset=ISO-2022-JP  rb_scan_args() にoption hash対応を組み込むのはどうでしょうか。 実装してみたのでパッチを添付しました。 argc = rb_scan_args(argc, argv, ":12", &opt, &path, &mode, &perm); のように頭に : と書くと、必須引数より多くの引数が与えられ、その 最後の引数がHash(ないし #to_hash で変換可能)な場合に取得されます。  なお、Rubyでは def open(path, mode = File::RDONLY, perm = 0666, opt = nil) のように書くことが多いですが、これに依存して option hash を与え ない場合に(空のHashでなく) nil を渡す習慣が存在しています。この ときに読み捨てられた nil があったかどうかを判定できるようにする ため、返り値は元の argc そのままではなく、 option hash (nil の 場合を含む)を除いた数を返すようにしてみました。  : を指定する場合は上記のように argc を更新するのが定石となり ます。(nil を読み捨てる条件は README.EXT* に記載しました)  ある種 option hash は特別なので妥当な仕様だと考えていますが、 いかがでしょうか。いずれは、キーワード引数も &block 同様の疑似 引数となり、 open(path, **hash) のように展開させる形になれば その辺はすっきりすると思います。 -- Akinori MUSHA / http://akinori.org/ --Multipart_Thu_Feb_19_04:33:38_2009-1 Content-Type: text/plain; charset=EUC-JP Content-Disposition: attachment; filename="rb_scan_args.opthash.patch" Content-Transfer-Encoding: base64 SW5kZXg6IFJFQURNRS5FWFQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUkVBRE1FLkVYVAkocmV2aXNpb24gMjI0 MjYpCisrKyBSRUFETUUuRVhUCSh3b3JraW5nIGNvcHkpCkBAIC0xMDc5LDEzICsxMDc5LDI2IEBA IGFjY29yZGluZyB0byB0aGUgZm9ybWF0IHN0cmluZy4gIFRoZSBmb3IKIGFzIGZvbGxvd3M6CiAK IC0tCi1zY2FuLWFyZy1zcGVjICA6PSBwYXJhbS1hcmctc3BlYyBbYmxvY2stYXJnLXNwZWNdCitz Y2FuLWFyZy1zcGVjICA6PSBbb3B0aW9uLWhhc2gtYXJnLXNwZWNdIHBhcmFtLWFyZy1zcGVjIFti bG9jay1hcmctc3BlY10KIAorb3B0aW9uLWhhc2gtYXJnLXNwZWMgOj0gc3ltLWZvci1vcHRpb24t aGFzaC1hcmcKIHBhcmFtLWFyZy1zcGVjIDo9IHByZS1hcmctc3BlYyBbcG9zdC1hcmctc3BlY10g LyBwb3N0LWFyZy1zcGVjCiBwcmUtYXJnLXNwZWMgICA6PSBudW0tb2YtbGVhZGluZy1tYW5kYXRv cnktYXJncyBbbnVtLW9mLW9wdGlvbmFsLWFyZ3NdCiBwb3N0LWFyZy1zcGVjICA6PSBzeW0tZm9y LXZhcmlhYmxlLWxlbmd0aC1hcmdzIFtudW0tb2YtdHJhaWxpbmctbWFuZGF0b3J5LWFyZ3NdCiBi bG9jay1hcmctc3BlYyA6PSBzeW0tZm9yLWJsb2NrLWFyZwogCitzeW0tZm9yLW9wdGlvbi1oYXNo LWFyZyAgICAgICAgOj0gIjoiICAgOyBJbmRpY2F0ZXMgdGhhdCBhbiBvcHRpb24KKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGhhc2ggaXMgY2FwdHVyZWQgaWYgdGhl IGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFyZ3VtZW50 IGlzIG9yIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsg Y29udmVydGVkIHRvIGEgaGFzaCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOyAjdG9faGFzaC4gIFdoZW4gdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7IGFyZ3VtZW50IGlzIG5pbCwgaXQgaXMKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGNhcHR1cmVkIGlmIGl0IGlzIG5vdAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYW1iaWd1b3VzIHRvIHRha2Ug aXQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGVtcHR5IG9w dGlvbiBoYXNoOyBpLmUuICcqJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDsgaXMgbm90IHNwZWNpZmllZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7IGFyZ3VtZW50cyBhcmUgZ2l2ZW4gbW9yZQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsgdGhhbiBzdWZmaWNpZW50LgogbnVtLW9mLWxlYWRpbmct bWFuZGF0b3J5LWFyZ3MgIDo9IERJR0lUIDsgVGhlIG51bWJlciBvZiBsZWFkaW5nCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtYW5kYXRvcnkgYXJndW1lbnRzCiBu dW0tb2Ytb3B0aW9uYWwtYXJncyAgICAgICAgICAgOj0gRElHSVQgOyBUaGUgbnVtYmVyIG9mIG9w dGlvbmFsCkBAIC0xMTA3LDggKzExMjAsOCBAQCBhc3NpZ25lZCB0byBjYXB0dXJlZCBhcmd1bWVu dHMuICBGb3Igb21pCiBzZXQgdG8gUW5pbC4gIE5VTEwgY2FuIGJlIHB1dCBpbiBwbGFjZSBvZiBh IHZhcmlhYmxlIHJlZmVyZW5jZSwgd2hpY2gKIG1lYW5zIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1 cmVkIGFyZ3VtZW50KHMpIHNob3VsZCBiZSBqdXN0IGRyb3BwZWQuCiAKLVRoZSBudW1iZXIgb2Yg Z2l2ZW4gYXJndW1lbnRzLCBleGNsdWRpbmcgYW4gaXRlcmF0b3IgYmxvY2ssIGlzCi1yZXR1cm5l ZC4KK1RoZSBudW1iZXIgb2YgZ2l2ZW4gYXJndW1lbnRzLCBleGNsdWRpbmcgYW4gb3B0aW9uIGhh c2ggb3IgaXRlcmF0b3IKK2Jsb2NrLCBpcyByZXR1cm5lZC4KIAogKiogSW52b2tpbmcgUnVieSBt ZXRob2QKIApJbmRleDogaW8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBpby5jCShyZXZpc2lvbiAyMjQyNikK KysrIGlvLmMJKHdvcmtpbmcgY29weSkKQEAgLTQ3NzYsMjAgKzQ3NzYsNiBAQCBwaXBlX29wZW5f cyhWQUxVRSBwcm9nLCBjb25zdCBjaGFyICptb2RlCiAgICAgcmV0dXJuIHBpcGVfb3BlbigmZWFy ZywgcHJvZywgbW9kZXN0ciwgZm1vZGUsIGNvbnZjb25maWcpOwogfQogCi1zdGF0aWMgVkFMVUUK LXBvcF9sYXN0X2hhc2goaW50ICphcmdjX3AsIFZBTFVFICphcmd2KQotewotICAgIFZBTFVFIGxh c3QsIHRtcDsKLSAgICBpZiAoKmFyZ2NfcCA9PSAwKQotICAgICAgICByZXR1cm4gUW5pbDsKLSAg ICBsYXN0ID0gYXJndlsqYXJnY19wLTFdOwotICAgIHRtcCA9IHJiX2NoZWNrX2NvbnZlcnRfdHlw ZShsYXN0LCBUX0hBU0gsICJIYXNoIiwgInRvX2hhc2giKTsKLSAgICBpZiAoTklMX1AodG1wKSkK LSAgICAgICAgcmV0dXJuIFFuaWw7Ci0gICAgKCphcmdjX3ApLS07Ci0gICAgcmV0dXJuIHRtcDsK LX0KLQogLyoKICAqICBjYWxsLXNlcToKICAqICAgICBJTy5wb3BlbihjbWQsIG1vZGU9InIiIFss IG9wdF0pICAgICAgICAgICAgICAgPT4gaW8KQEAgLTQ4NzksOCArNDg2NSw3IEBAIHJiX2lvX3Nf cG9wZW4oaW50IGFyZ2MsIFZBTFVFICphcmd2LCBWQUwKICAgICBpbnQgb2ZsYWdzLCBmbW9kZTsK ICAgICBjb252Y29uZmlnX3QgY29udmNvbmZpZzsKIAotICAgIG9wdCA9IHBvcF9sYXN0X2hhc2go JmFyZ2MsIGFyZ3YpOwotICAgIHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiMTEiLCAmcG5hbWUs ICZwbW9kZSk7CisgICAgYXJnYyA9IHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiOjExIiwgJm9w dCwgJnBuYW1lLCAmcG1vZGUpOwogCiAgICAgcmJfaW9fZXh0cmFjdF9tb2RlZW5jKCZwbW9kZSwg MCwgb3B0LCAmb2ZsYWdzLCAmZm1vZGUsICZjb252Y29uZmlnKTsKICAgICBtb2Rlc3RyID0gcmJf aW9fb2ZsYWdzX21vZGVzdHIob2ZsYWdzKTsKQEAgLTQ5MTgsMTIgKzQ5MDMsMTEgQEAgcmJfc2Nh bl9vcGVuX2FyZ3MoaW50IGFyZ2MsIFZBTFVFICphcmd2LAogICAgICAgICBWQUxVRSAqZm5hbWVf cCwgaW50ICpvZmxhZ3NfcCwgaW50ICpmbW9kZV9wLAogICAgICAgICBjb252Y29uZmlnX3QgKmNv bnZjb25maWdfcCwgbW9kZV90ICpwZXJtX3ApCiB7Ci0gICAgVkFMVUUgb3B0PVFuaWwsIGZuYW1l LCB2bW9kZSwgdnBlcm07CisgICAgVkFMVUUgb3B0LCBmbmFtZSwgdm1vZGUsIHZwZXJtOwogICAg IGludCBvZmxhZ3MsIGZtb2RlOwogICAgIG1vZGVfdCBwZXJtOwogCi0gICAgb3B0ID0gcG9wX2xh c3RfaGFzaCgmYXJnYywgYXJndik7Ci0gICAgcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIxMiIs ICZmbmFtZSwgJnZtb2RlLCAmdnBlcm0pOworICAgIGFyZ2MgPSByYl9zY2FuX2FyZ3MoYXJnYywg YXJndiwgIjoxMiIsICZvcHQsICZmbmFtZSwgJnZtb2RlLCAmdnBlcm0pOwogICAgIEZpbGVQYXRo VmFsdWUoZm5hbWUpOwogI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19BUFBMRV9fCiAg ICAgewpAQCAtNTk3OCw4ICs1OTYyLDcgQEAgcmJfaW9faW5pdGlhbGl6ZShpbnQgYXJnYywgVkFM VUUgKmFyZ3YsIAogCiAgICAgcmJfc2VjdXJlKDQpOwogCi0gICAgb3B0ID0gcG9wX2xhc3RfaGFz aCgmYXJnYywgYXJndik7Ci0gICAgcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIxMSIsICZmbnVt LCAmdm1vZGUpOworICAgIGFyZ2MgPSByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjoxMSIsICZv cHQsICZmbnVtLCAmdm1vZGUpOwogICAgIHJiX2lvX2V4dHJhY3RfbW9kZWVuYygmdm1vZGUsIDAs IG9wdCwgJm9mbGFncywgJmZtb2RlLCAmY29udmNvbmZpZyk7CiAKICAgICBmZCA9IE5VTTJJTlQo Zm51bSk7CkBAIC03MTM4LDggKzcxMjEsNyBAQCByYl9pb19zX3BpcGUoaW50IGFyZ2MsIFZBTFVF ICphcmd2LCBWQUxVCiAgICAgaW50IGZtb2RlID0gMDsKICAgICBWQUxVRSByZXQ7CiAKLSAgICBv cHQgPSBwb3BfbGFzdF9oYXNoKCZhcmdjLCBhcmd2KTsKLSAgICByYl9zY2FuX2FyZ3MoYXJnYywg YXJndiwgIjAyIiwgJnYxLCAmdjIpOworICAgIGFyZ2MgPSByYl9zY2FuX2FyZ3MoYXJnYywgYXJn diwgIjowMiIsICZvcHQsICZ2MSwgJnYyKTsKICAgICBpZiAocmJfcGlwZShwaXBlcykgPT0gLTEp CiAgICAgICAgIHJiX3N5c19mYWlsKDApOwogCkBAIC03MTg2LDM1ICs3MTY4LDMzIEBAIHN0cnVj dCBmb3JlYWNoX2FyZyB7CiB9OwogCiBzdGF0aWMgdm9pZAotb3Blbl9rZXlfYXJncyhpbnQgYXJn YywgVkFMVUUgKmFyZ3YsIHN0cnVjdCBmb3JlYWNoX2FyZyAqYXJnKQorb3Blbl9rZXlfYXJncyhp bnQgYXJnYywgVkFMVUUgKmFyZ3YsIFZBTFVFIG9wdCwgc3RydWN0IGZvcmVhY2hfYXJnICphcmcp CiB7Ci0gICAgVkFMVUUgb3B0LCB2OworICAgIFZBTFVFIHBhdGgsIHY7CiAKLSAgICBGaWxlUGF0 aFZhbHVlKGFyZ3ZbMF0pOworICAgIHBhdGggPSAqYXJndisrOworICAgIGFyZ2MtLTsKKyAgICBG aWxlUGF0aFZhbHVlKHBhdGgpOwogICAgIGFyZy0+aW8gPSAwOwotICAgIGFyZy0+YXJnYyA9IGFy Z2MgLSAxOwotICAgIGFyZy0+YXJndiA9IGFyZ3YgKyAxOwotICAgIGlmIChhcmdjID09IDEpIHsK LSAgICAgIG5vX2tleToKLQlhcmctPmlvID0gcmJfaW9fb3Blbihhcmd2WzBdLCBJTlQyTlVNKE9f UkRPTkxZKSwgSU5UMkZJWCgwNjY2KSwgUW5pbCk7CisgICAgYXJnLT5hcmdjID0gYXJnYzsKKyAg ICBhcmctPmFyZ3YgPSBhcmd2OworICAgIGlmIChOSUxfUChvcHQpKSB7CisJYXJnLT5pbyA9IHJi X2lvX29wZW4ocGF0aCwgSU5UMk5VTShPX1JET05MWSksIElOVDJGSVgoMDY2NiksIFFuaWwpOwog CXJldHVybjsKICAgICB9Ci0gICAgb3B0ID0gcG9wX2xhc3RfaGFzaCgmYXJnLT5hcmdjLCBhcmct PmFyZ3YpOwotICAgIGlmIChOSUxfUChvcHQpKSBnb3RvIG5vX2tleTsKLQogICAgIHYgPSByYl9o YXNoX2FyZWYob3B0LCBzeW1fb3Blbl9hcmdzKTsKICAgICBpZiAoIU5JTF9QKHYpKSB7CiAJVkFM VUUgYXJnczsKIAogCXYgPSByYl9jb252ZXJ0X3R5cGUodiwgVF9BUlJBWSwgIkFycmF5IiwgInRv X2FyeSIpOwogCWFyZ3MgPSByYl9hcnlfbmV3MihSQVJSQVlfTEVOKHYpKzEpOwotCXJiX2FyeV9w dXNoKGFyZ3MsIGFyZ3ZbMF0pOworCXJiX2FyeV9wdXNoKGFyZ3MsIHBhdGgpOwogCXJiX2FyeV9j b25jYXQoYXJncywgdik7CiAKIAlhcmctPmlvID0gcmJfaW9fb3Blbl93aXRoX2FyZ3MoUkFSUkFZ X0xFTihhcmdzKSwgUkFSUkFZX1BUUihhcmdzKSk7CiAJcmV0dXJuOwogICAgIH0KLSAgICBhcmct PmlvID0gcmJfaW9fb3Blbihhcmd2WzBdLCBRbmlsLCBRbmlsLCBvcHQpOworICAgIGFyZy0+aW8g PSByYl9pb19vcGVuKHBhdGgsIFFuaWwsIFFuaWwsIG9wdCk7CiB9CiAKIHN0YXRpYyBWQUxVRQpA QCAtNzI1NCwxMSArNzIzNCwxMiBAQCBpb19zX2ZvcmVhY2goc3RydWN0IGZvcmVhY2hfYXJnICph cmcpCiBzdGF0aWMgVkFMVUUKIHJiX2lvX3NfZm9yZWFjaChpbnQgYXJnYywgVkFMVUUgKmFyZ3Ys IFZBTFVFIHNlbGYpCiB7CisgICAgVkFMVUUgb3B0OwogICAgIHN0cnVjdCBmb3JlYWNoX2FyZyBh cmc7CiAKLSAgICByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjEzIiwgTlVMTCwgTlVMTCwgTlVM TCwgTlVMTCk7CisgICAgYXJnYyA9IHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiOjEzIiwgJm9w dCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgUkVUVVJOX0VOVU1FUkFUT1Ioc2VsZiwg YXJnYywgYXJndik7Ci0gICAgb3Blbl9rZXlfYXJncyhhcmdjLCBhcmd2LCAmYXJnKTsKKyAgICBv cGVuX2tleV9hcmdzKGFyZ2MsIGFyZ3YsIG9wdCwgJmFyZyk7CiAgICAgaWYgKE5JTF9QKGFyZy5p bykpIHJldHVybiBRbmlsOwogICAgIHJldHVybiByYl9lbnN1cmUoaW9fc19mb3JlYWNoLCAoVkFM VUUpJmFyZywgcmJfaW9fY2xvc2UsIGFyZy5pbyk7CiB9CkBAIC03MjkwLDEwICs3MjcxLDExIEBA IGlvX3NfcmVhZGxpbmVzKHN0cnVjdCBmb3JlYWNoX2FyZyAqYXJnKQogc3RhdGljIFZBTFVFCiBy Yl9pb19zX3JlYWRsaW5lcyhpbnQgYXJnYywgVkFMVUUgKmFyZ3YsIFZBTFVFIGlvKQogeworICAg IFZBTFVFIG9wdDsKICAgICBzdHJ1Y3QgZm9yZWFjaF9hcmcgYXJnOwogCi0gICAgcmJfc2Nhbl9h cmdzKGFyZ2MsIGFyZ3YsICIxMyIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIG9wZW5f a2V5X2FyZ3MoYXJnYywgYXJndiwgJmFyZyk7CisgICAgYXJnYyA9IHJiX3NjYW5fYXJncyhhcmdj LCBhcmd2LCAiOjEzIiwgJm9wdCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgb3Blbl9r ZXlfYXJncyhhcmdjLCBhcmd2LCBvcHQsICZhcmcpOwogICAgIGlmIChOSUxfUChhcmcuaW8pKSBy ZXR1cm4gUW5pbDsKICAgICByZXR1cm4gcmJfZW5zdXJlKGlvX3NfcmVhZGxpbmVzLCAoVkFMVUUp JmFyZywgcmJfaW9fY2xvc2UsIGFyZy5pbyk7CiB9CkBAIC03MzM5LDExICs3MzIxLDExIEBAIGlv X3NfcmVhZChzdHJ1Y3QgZm9yZWFjaF9hcmcgKmFyZykKIHN0YXRpYyBWQUxVRQogcmJfaW9fc19y ZWFkKGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkFMVUUgaW8pCiB7Ci0gICAgVkFMVUUgb2Zmc2V0 OworICAgIFZBTFVFIG9wdCwgb2Zmc2V0OwogICAgIHN0cnVjdCBmb3JlYWNoX2FyZyBhcmc7CiAK LSAgICByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjEzIiwgTlVMTCwgTlVMTCwgJm9mZnNldCwg TlVMTCk7Ci0gICAgb3Blbl9rZXlfYXJncyhhcmdjLCBhcmd2LCAmYXJnKTsKKyAgICBhcmdjID0g cmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICI6MTMiLCAmb3B0LCBOVUxMLCBOVUxMLCAmb2Zmc2V0 LCBOVUxMKTsKKyAgICBvcGVuX2tleV9hcmdzKGFyZ2MsIGFyZ3YsIG9wdCwgJmFyZyk7CiAgICAg aWYgKE5JTF9QKGFyZy5pbykpIHJldHVybiBRbmlsOwogICAgIGlmICghTklMX1Aob2Zmc2V0KSkg ewogCXJiX2lvX2Jpbm1vZGUoYXJnLmlvKTsKQEAgLTgwMDcsOCArNzk4OSw3IEBAIHJiX2lvX3Nl dF9lbmNvZGluZyhpbnQgYXJnYywgVkFMVUUgKmFyZ3YKICAgICByYl9pb190ICpmcHRyOwogICAg IFZBTFVFIHYxLCB2Miwgb3B0OwogCi0gICAgb3B0ID0gcG9wX2xhc3RfaGFzaCgmYXJnYywgYXJn dik7Ci0gICAgcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIxMSIsICZ2MSwgJnYyKTsKKyAgICBh cmdjID0gcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICI6MTEiLCAmb3B0LCAmdjEsICZ2Mik7CiAg ICAgR2V0T3BlbkZpbGUoaW8sIGZwdHIpOwogICAgIGlvX2VuY29kaW5nX3NldChmcHRyLCB2MSwg djIsIG9wdCk7CiAgICAgcmV0dXJuIGlvOwpJbmRleDogZGlyLmMKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZGly LmMJKHJldmlzaW9uIDIyNDI2KQorKysgZGlyLmMJKHdvcmtpbmcgY29weSkKQEAgLTM0MiwxMSAr MzQyLDEwIEBAIGRpcl9pbml0aWFsaXplKGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkEKICAgICB9 CiAgICAgZnNlbmMgPSByYl9maWxlc3lzdGVtX2VuY29kaW5nKCk7CiAKLSAgICByYl9zY2FuX2Fy Z3MoYXJnYywgYXJndiwgIjExIiwgJmRpcm5hbWUsICZvcHQpOworICAgIGFyZ2MgPSByYl9zY2Fu X2FyZ3MoYXJnYywgYXJndiwgIjoxIiwgJm9wdCwgJmRpcm5hbWUpOwogCiAgICAgaWYgKCFOSUxf UChvcHQpKSB7CiAgICAgICAgIFZBTFVFIHYsIGVuYz1RbmlsOwotICAgICAgICBvcHQgPSByYl9j b252ZXJ0X3R5cGUob3B0LCBUX0hBU0gsICJIYXNoIiwgInRvX2hhc2giKTsKIAogICAgICAgICB2 ID0gcmJfaGFzaF9hcmVmKG9wdCwgc3ltX2VuYyk7CiAgICAgICAgIGlmICghTklMX1AodikpIGVu YyA9IHY7CkluZGV4OiBjbGFzcy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGNsYXNzLmMJKHJldmlzaW9uIDIy NDI2KQorKysgY2xhc3MuYwkod29ya2luZyBjb3B5KQpAQCAtOTIwLDExMiArOTIwLDEyOSBAQCBy Yl9kZWZpbmVfYXR0cihWQUxVRSBrbGFzcywgY29uc3QgY2hhciAqCiBpbnQKIHJiX3NjYW5fYXJn cyhpbnQgYXJnYywgY29uc3QgVkFMVUUgKmFyZ3YsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewot ICAgIGludCBpID0gMCwgcG9zdGFyZ2MsIG5vbnBvc3RhcmdjOwotICAgIGNvbnN0IGNoYXIgKnAg PSBmbXQsICpxOworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnAgPSBmbXQ7CiAgICAgVkFM VUUgKnZhcjsKICAgICB2YV9saXN0IHZhcmdzOworICAgIGludCBmX2hhc2ggPSAwLCBmX3ZhciA9 IDAsIGZfYmxvY2sgPSAwOworICAgIGludCBuX2xlYWQgPSAwLCBuX29wdCA9IDAsIG5fdHJhaWwg PSAwLCBuX21hbmQ7CisgICAgaW50IGFyZ2kgPSAwOwogCi0gICAgdmFfc3RhcnQodmFyZ3MsIGZt dCk7Ci0KLSAgICAvKiBjaGVjayB0aGUgdHJhaWxpbmcgbWFuZGF0b3J5IGFyZ3VtZW50IGxlbmd0 aCBpbiBhZHZhbmNlICovCi0gICAgaWYgKChxID0gc3RyY2hyKHAsICcqJykpICE9IE5VTEwgJiYg SVNESUdJVCgqKytxKSkgewotCXBvc3RhcmdjID0gKnEgLSAnMCc7Ci0Jbm9ucG9zdGFyZ2MgPSBh cmdjIC0gcG9zdGFyZ2M7CisgICAgaWYgKCpwID09ICc6JykgeworCWZfaGFzaCA9IDE7CisJcCsr OwogICAgIH0KLSAgICBlbHNlIHsgCi0JcG9zdGFyZ2MgPSAwOwotCW5vbnBvc3RhcmdjID0gYXJn YzsKKyAgICBpZiAoSVNESUdJVCgqcCkpIHsKKwluX2xlYWQgPSAqcCAtICcwJzsKKwlwKys7CisJ aWYgKElTRElHSVQoKnApKSB7CisJICAgIG5fb3B0ID0gKnAgLSAnMCc7CisJICAgIHArKzsKKwl9 CiAgICAgfQotCiAgICAgaWYgKCpwID09ICcqJykgewotCWlmIChub25wb3N0YXJnYyA8IDApCi0J ICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKCVk IGZvciAlZCkiLAotCQkgICAgIGFyZ2MsIHBvc3RhcmdjKTsKLQlnb3RvIHJlc3RfYXJnOyAgICAK LSAgICB9Ci0gICAgZWxzZSBpZiAoSVNESUdJVCgqcCkpIHsKLQkvKiBsZWFkaW5nIG1hbmRhdG9y eSBhcmd1bWVudHMgKi8KLQlpbnQgbiA9ICpwIC0gJzAnOwotCi0JaWYgKG5vbnBvc3RhcmdjIDwg bikKLQkgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50 cyAoJWQgZm9yICVkKSIsCi0JCSAgICAgYXJnYywgbiArIHBvc3RhcmdjKTsKLQlmb3IgKDsgbi0t ID4gMDsgaSsrKSB7Ci0JICAgIHZhciA9IHZhX2FyZyh2YXJncywgVkFMVUUqKTsKLQkgICAgaWYg KHZhcikgKnZhciA9IGFyZ3ZbaV07CisJZl92YXIgPSAxOworCXArKzsKKwlpZiAoSVNESUdJVCgq cCkpIHsKKwkgICAgbl90cmFpbCA9ICpwIC0gJzAnOworCSAgICBwKys7CiAJfQorICAgIH0KKyAg ICBpZiAoKnAgPT0gJyYnKSB7CisJZl9ibG9jayA9IDE7CiAJcCsrOwogICAgIH0KLSAgICBlbHNl IHsKLQlnb3RvIGVycm9yOworICAgIGlmICgqcCAhPSAnXDAnKSB7CisJcmJfZmF0YWwoImJhZCBz Y2FuIGFyZyBmb3JtYXQ6ICVzIiwgZm10KTsKICAgICB9CisgICAgbl9tYW5kID0gbl9sZWFkICsg bl90cmFpbDsKIAotICAgIC8qIG9wdGlvbmFsIGFyZ3VtZW50cyAodHlwaWNhbGx5IHdpdGggZGVm YXVsdCB2YWx1ZXMpICovCi0gICAgaWYgKElTRElHSVQoKnApKSB7Ci0JaW50IG4gPSAqcCAtICcw JzsKKyAgICBpZiAoYXJnYyA8IG5fbWFuZCkKKwlnb3RvIGFyZ2NfZXJyb3I7CiAKLQlmb3IgKDsg bi0tID4gMDsgKSB7Ci0JICAgIHZhciA9IHZhX2FyZyh2YXJncywgVkFMVUUqKTsKLQkgICAgaWYg KGkgPCBub25wb3N0YXJnYykgewotCQlpZiAodmFyKSAqdmFyID0gYXJndltpXTsKLQkJaSsrOwor ICAgIHZhX3N0YXJ0KHZhcmdzLCBmbXQpOworCisgICAgLyogY2FwdHVyZSBhbiBvcHRpb24gaGFz aCAqLworICAgIGlmIChmX2hhc2gpIHsKKwlWQUxVRSBoYXNoID0gUW5pbDsKKworCXZhciA9IHZh X2FyZyh2YXJncywgVkFMVUUgKik7CisJaWYgKG5fbWFuZCA8IGFyZ2MpIHsKKwkgICAgVkFMVUUg bGFzdCA9IGFyZ3ZbYXJnYyAtIDFdOworCisJICAgIGlmIChOSUxfUChsYXN0KSkgeworCQkvKiBu aWwgaXMgdGFrZW4gYXMgYW4gZW1wdHkgb3B0aW9uIGhhc2ggb25seSBpZiBpdCBpcworCQkgICBu b3QgYW1iaWd1b3VzOyBpLmUuICcqJyBpcyBub3Qgc3BlY2lmaWVkIGFuZAorCQkgICBhcmd1bWVu dHMgYXJlIGdpdmVuIG1vcmUgdGhhbiBzdWZmaWNpZW50ICovCisJCWlmICghZl92YXIgJiYgbl9t YW5kICsgbl9vcHQgPCBhcmdjKQorCQkgICAgYXJnYy0tOwogCSAgICB9CiAJICAgIGVsc2Ugewot CQlpZiAodmFyKSAqdmFyID0gUW5pbDsKKwkJaGFzaCA9IHJiX2NoZWNrX2NvbnZlcnRfdHlwZShs YXN0LCBUX0hBU0gsICJIYXNoIiwgInRvX2hhc2giKTsKKwkJaWYgKCFOSUxfUChoYXNoKSkKKwkJ ICAgIGFyZ2MtLTsKIAkgICAgfQogCX0KLQlwKys7CisJaWYgKHZhcikgKnZhciA9IGhhc2g7CiAg ICAgfQotCi0gICAgaWYgKCpwID09ICcqJykgewotICAgICAgcmVzdF9hcmc6Ci0JLyogdmFyaWFi bGUgbGVuZ3RoIGFyZ3VtZW50cyAodGhlIDwqcmVzdD4gcGFydCkgKi8KLQl2YXIgPSB2YV9hcmco dmFyZ3MsIFZBTFVFKik7Ci0JaWYgKGkgPCBub25wb3N0YXJnYykgewotCSAgICBpZiAodmFyKSAq dmFyID0gcmJfYXJ5X25ldzQobm9ucG9zdGFyZ2MtaSwgYXJnditpKTsKLQkgICAgaSA9IG5vbnBv c3RhcmdjOworICAgIC8qIGNhcHR1cmUgbGVhZGluZyBtYW5kYXRvcnkgYXJndW1lbnRzICovCisg ICAgZm9yIChpID0gbl9sZWFkOyBpLS0gPiAwOyApIHsKKwl2YXIgPSB2YV9hcmcodmFyZ3MsIFZB TFVFICopOworCWlmICh2YXIpICp2YXIgPSBhcmd2W2FyZ2ldOworCWFyZ2krKzsKKyAgICB9Cisg ICAgLyogY2FwdHVyZSBvcHRpb25hbCBhcmd1bWVudHMgKi8KKyAgICBmb3IgKGkgPSBuX29wdDsg aS0tID4gMDsgKSB7CisJdmFyID0gdmFfYXJnKHZhcmdzLCBWQUxVRSAqKTsKKwlpZiAoYXJnaSA8 IGFyZ2MgLSBuX3RyYWlsKSB7CisJICAgIGlmICh2YXIpICp2YXIgPSBhcmd2W2FyZ2ldOworCSAg ICBhcmdpKys7CiAJfQogCWVsc2UgewotCSAgICBpZiAodmFyKSAqdmFyID0gcmJfYXJ5X25ldygp OworCSAgICBpZiAodmFyKSAqdmFyID0gUW5pbDsKIAl9Ci0JcCsrOwotCi0JaWYgKDAgPCBwb3N0 YXJnYykgewotCSAgICAvKiB0cmFpbGluZyBtYW5kYXRvcnkgYXJndW1lbnRzICovCi0JICAgIGlu dCBuID0gcG9zdGFyZ2M7CisgICAgfQorICAgIC8qIGNhcHR1cmUgdmFyaWFibGUgbGVuZ3RoIGFy Z3VtZW50cyAqLworICAgIGlmIChmX3ZhcikgeworCWludCBuX3ZhciA9IGFyZ2MgLSBhcmdpIC0g bl90cmFpbDsKIAotCSAgICBmb3IgKDsgbi0tID4gMDsgaSsrKSB7Ci0JCXZhciA9IHZhX2FyZyh2 YXJncywgVkFMVUUqKTsKLQkJaWYgKHZhcikgKnZhciA9IGFyZ3ZbaV07Ci0JICAgIH0KLQkgICAg cCsrOworCXZhciA9IHZhX2FyZyh2YXJncywgVkFMVUUgKik7CisJaWYgKDAgPCBuX3Zhcikgewor CSAgICBpZiAodmFyKSAqdmFyID0gcmJfYXJ5X25ldzQobl92YXIsICZhcmd2W2FyZ2ldKTsKKwkg ICAgYXJnaSArPSBuX3ZhcjsKKwl9CisJZWxzZSB7CisJICAgIGlmICh2YXIpICp2YXIgPSByYl9h cnlfbmV3KCk7CiAJfQogICAgIH0KLQotICAgIGlmICgqcCA9PSAnJicpIHsKLQkvKiBpdGVyYXRv ciBibG9jayAqLwotCXZhciA9IHZhX2FyZyh2YXJncywgVkFMVUUqKTsKKyAgICAvKiBjYXB0dXJl IHRyYWlsaW5nIG1hbmRhdG9yeSBhcmd1bWVudHMgKi8KKyAgICBmb3IgKGkgPSBuX3RyYWlsOyBp LS0gPiAwOyApIHsKKwl2YXIgPSB2YV9hcmcodmFyZ3MsIFZBTFVFICopOworCWlmICh2YXIpICp2 YXIgPSBhcmd2W2FyZ2ldOworCWFyZ2krKzsKKyAgICB9CisgICAgLyogY2FwdHVyZSBpdGVyYXRv ciBibG9jayAqLyAgICAKKyAgICBpZiAoZl9ibG9jaykgeworCXZhciA9IHZhX2FyZyh2YXJncywg VkFMVUUgKik7CiAJaWYgKHJiX2Jsb2NrX2dpdmVuX3AoKSkgewogCSAgICAqdmFyID0gcmJfYmxv Y2tfcHJvYygpOwogCX0KIAllbHNlIHsKIAkgICAgKnZhciA9IFFuaWw7CiAJfQotCXArKzsKICAg ICB9CiAgICAgdmFfZW5kKHZhcmdzKTsKIAotICAgIGlmICgqcCAhPSAnXDAnKSB7Ci0JZ290byBl cnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoaSA8IGFyZ2MpIHsKLQlyYl9yYWlzZShyYl9lQXJnRXJy b3IsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICglZCBmb3IgJWQpIiwgYXJnYywgaSk7Ci0g ICAgfQorICAgIGlmIChhcmdpIDwgYXJnYykKKwlnb3RvIGFyZ2NfZXJyb3I7CiAKICAgICByZXR1 cm4gYXJnYzsKIAotICBlcnJvcjoKLSAgICByYl9mYXRhbCgiYmFkIHNjYW4gYXJnIGZvcm1hdDog JXMiLCBmbXQpOwotICAgIHJldHVybiAwOworICBhcmdjX2Vycm9yOgorICAgIGlmICgwIDwgbl9v cHQpCisJcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAo JWQgZm9yICVkLi4lZCVzKSIsCisJCSBhcmdjLCBuX21hbmQsIG5fbWFuZCArIG5fb3B0LCBmX3Zh ciA/ICIrIiA6ICIiKTsKKyAgICBlbHNlCisJcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAid3Jvbmcg bnVtYmVyIG9mIGFyZ3VtZW50cyAoJWQgZm9yICVkJXMpIiwKKwkJIGFyZ2MsIG5fbWFuZCwgZl92 YXIgPyAiKyIgOiAiIik7CiB9CkluZGV4OiBleHQvemxpYi96bGliLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g ZXh0L3psaWIvemxpYi5jCShyZXZpc2lvbiAyMjQyNikKKysrIGV4dC96bGliL3psaWIuYwkod29y a2luZyBjb3B5KQpAQCAtMjc1MSwxMiArMjc1MSw3IEBAIHJiX2d6d3JpdGVyX2luaXRpYWxpemUo aW50IGFyZ2MsIFZBTFVFICoKICAgICBWQUxVRSBpbywgbGV2ZWwsIHN0cmF0ZWd5LCBvcHQgPSBR bmlsOwogICAgIGludCBlcnI7CiAKLSAgICBpZiAoYXJnYyA+IDEpIHsKLQlvcHQgPSByYl9jaGVj a19jb252ZXJ0X3R5cGUoYXJndlthcmdjLTFdLCBUX0hBU0gsICJIYXNoIiwgInRvX2hhc2giKTsK LQlpZiAoIU5JTF9QKG9wdCkpIGFyZ2MtLTsKLSAgICB9Ci0gICAgCi0gICAgcmJfc2Nhbl9hcmdz KGFyZ2MsIGFyZ3YsICIxMiIsICZpbywgJmxldmVsLCAmc3RyYXRlZ3kpOworICAgIGFyZ2MgPSBy Yl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjoxMiIsICZvcHQsICZpbywgJmxldmVsLCAmc3RyYXRl Z3kpOwogICAgIERhdGFfR2V0X1N0cnVjdChvYmosIHN0cnVjdCBnemZpbGUsIGd6KTsKIAogICAg IC8qIHRoaXMgaXMgdW5kb2N1bWVudGVkIGZlYXR1cmUgb2YgemxpYiAqLwpAQCAtMjk0OSwxMSAr Mjk0NCw3IEBAIHJiX2d6cmVhZGVyX2luaXRpYWxpemUoaW50IGFyZ2MsIFZBTFVFICoKICAgICBp bnQgZXJyOwogCiAgICAgRGF0YV9HZXRfU3RydWN0KG9iaiwgc3RydWN0IGd6ZmlsZSwgZ3opOwot ICAgIGlmIChhcmdjID4gMSkgewotCW9wdCA9IHJiX2NoZWNrX2NvbnZlcnRfdHlwZShhcmd2W2Fy Z2MtMV0sIFRfSEFTSCwgIkhhc2giLCAidG9faGFzaCIpOwotCWlmICghTklMX1Aob3B0KSkgYXJn Yy0tOwotICAgIH0KLSAgICByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjEiLCAmaW8pOworICAg IHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiOjEiLCAmb3B0LCAmaW8pOwogCiAgICAgLyogdGhp cyBpcyB1bmRvY3VtZW50ZWQgZmVhdHVyZSBvZiB6bGliICovCiAgICAgZXJyID0gaW5mbGF0ZUlu aXQyKCZnei0+ei5zdHJlYW0sIC1NQVhfV0JJVFMpOwpJbmRleDogUkVBRE1FLkVYVC5qYQo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09Ci0tLSBSRUFETUUuRVhULmphCShyZXZpc2lvbiAyMjQyNikKKysrIFJFQURNRS5FWFQu amEJKHdvcmtpbmcgY29weSkKQEAgLTExNzgsMTggKzExNzgsMjggQEAgcmJfc2Nhbl9hcmdzKGlu dCBhcmdjLCBWQUxVRSAqYXJndiwgY29ucwogICClyKTPoaRBQk5GpMe1rb3SpLmk66TIsMqyvKTO xMyk6qTHpLmhpQogCiAtLQotc2Nhbi1hcmctc3BlYyAgOj0gcGFyYW0tYXJnLXNwZWMgW2Jsb2Nr LWFyZy1zcGVjXQorc2Nhbi1hcmctc3BlYyAgOj0gW29wdGlvbi1oYXNoLWFyZy1zcGVjXSBwYXJh bS1hcmctc3BlYyBbYmxvY2stYXJnLXNwZWNdCiAKK29wdGlvbi1oYXNoLWFyZy1zcGVjIDo9IHN5 bS1mb3Itb3B0aW9uLWhhc2gtYXJnCiBwYXJhbS1hcmctc3BlYyA6PSBwcmUtYXJnLXNwZWMgW3Bv c3QtYXJnLXNwZWNdIC8gcG9zdC1hcmctc3BlYwogcHJlLWFyZy1zcGVjICAgOj0gbnVtLW9mLWxl YWRpbmctbWFuZGF0b3J5LWFyZ3MgW251bS1vZi1vcHRpb25hbC1hcmdzXQogcG9zdC1hcmctc3Bl YyAgOj0gc3ltLWZvci12YXJpYWJsZS1sZW5ndGgtYXJncyBbbnVtLW9mLXRyYWlsaW5nLW1hbmRh dG9yeS1hcmdzXQogYmxvY2stYXJnLXNwZWMgOj0gc3ltLWZvci1ibG9jay1hcmcKIAotbnVtLW9m LWxlYWRpbmctbWFuZGF0b3J5LWFyZ3MgIDo9IERJR0lUIDsgwOjGrKTLw9akq6TspOu+ys6sydSy xMe9pMqw+r/0pM6/9Aorc3ltLWZvci1vcHRpb24taGFzaC1hcmcgICAgICAgIDo9ICI6IiAgIDsg paql16W3peel86XPpcOlt6XlpPK86MbApLmk6worICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDsgpL+k4aTOu9jE6jsgvsrOrMnUx72kyrD6v/SkzgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgv/Sk6KTqpOLCv6SvpM6w+r/0pKy72MTqpLWk 7KGkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyC6x7jlpM6w+r/0 pKylz6XDpbel5aHKpN6kv6TPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgOyAjdG9faGFzaKTHytG0ubLEx72hy6TOvuy556TLCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOyC86MbApLWk7KTroaW6x7jlpM6w+r/0pKxuaWykzgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgvuy556GkssTK0cS5sPq/9LvYxOqk rKTKpK+hpAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgvsrOrMnU x72w+r/0pM6/9KTopOqk4sK/pK+kzgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsgsPq/9KSsu9jE6qS1pOykv77sueeky7zoxsCktaTspOsKK251bS1vZi1sZWFkaW5n LW1hbmRhdG9yeS1hcmdzICA6PSBESUdJVCA7IMDoxqyky8PWpKuk7KTrvsrOrMnUx72kyrD6v/Sk zr/0CiBudW0tb2Ytb3B0aW9uYWwtYXJncyAgICAgICAgICAgOj0gRElHSVQgOyDCs6SkpMbD1qSr pOyk677KzqyyxMe9pMqw+r/0pM6/9Aogc3ltLWZvci12YXJpYWJsZS1sZW5ndGgtYXJncyAgIDo9 ICIqIiAgIDsgwrOkpKTGw9akq6TspOuyxMrRxLmw+r/0pPIKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7IFJ1YnmkzsfbzvOkx7zoxsCkuaTrpL+k4aTOu9jE6gotbnVt LW9mLXRyYWlsaW5nLW1hbmRhdG9yeS1hcmdzIDo9IERJR0lUIDsgvarDvKTLw9akq6TspOu+ys6s ydSyxMe9pMqw+r/0pM6/9AorbnVtLW9mLXRyYWlsaW5nLW1hbmRhdG9yeS1hcmdzIDo9IERJR0lU IDsgvarDvKTLw9akq6TspOu+ys6sydTHvaTKsPq/9KTOv/QKIHN5bS1mb3ItYmxvY2stYXJnICAg ICAgICAgICAgICA6PSAiJiIgICA7IKWkpcal7KG8pb+l1qXtpcOlr6TyvOjGwKS5pOukv6ThpM4K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ILvYxOoKIC0tCkBAIC0x MjAyLDggKzEyMTIsOCBAQCBzeW0tZm9yLWJsb2NrLWFyZyAgICAgICAgICAgICAgOj0gIiYiICAg CiAgIL7KzqyyxMe9sPq/9KSsvsrOrKS1pOykv7v+pM7K0b/0pM7DzaTPbmlsKEO4wLjspM6l7KXZ peukx6TPCiAgIFFuaWwppMukyqTqpN6kuaGlCiAKLSAgytak6sPNpM/Nv6SopOmk7KS/sPq/9KTO v/Skx6S5oaWlpKXGpeyhvKW/pdal7aXDpa+kz7/0pKik3gotICCku6TzoaUKKyAgytak6sPNpM/N v6SopOmk7KS/sPq/9KTOv/Skx6S5oaWlqqXXpbel56Xzpc+lw6W3peWkqqTopNOlpAorICClxqXs obylv6XWpe2lw6WvpM+/9KSopN6ku6TzoaUKIAogKiogUnVieaXhpb2lw6XJuMak073QpLcKIApJ bmRleDogdHJhbnNjb2RlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gdHJhbnNjb2RlLmMJKHJldmlzaW9uIDIy NDI2KQorKysgdHJhbnNjb2RlLmMJKHdvcmtpbmcgY29weSkKQEAgLTI1NDcsMTIgKzI1NDcsOSBA QCBzdHJfdHJhbnNjb2RlKGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkFMCiAgICAgaW50IGVjZmxh Z3MgPSAwOwogICAgIFZBTFVFIGVjb3B0cyA9IFFuaWw7CiAKLSAgICBpZiAoMCA8IGFyZ2MpIHsK LSAgICAgICAgb3B0ID0gcmJfY2hlY2tfY29udmVydF90eXBlKGFyZ3ZbYXJnYy0xXSwgVF9IQVNI LCAiSGFzaCIsICJ0b19oYXNoIik7Ci0gICAgICAgIGlmICghTklMX1Aob3B0KSkgewotICAgICAg ICAgICAgYXJnYy0tOwotICAgICAgICAgICAgZWNmbGFncyA9IHJiX2Vjb252X3ByZXBhcmVfb3B0 cyhvcHQsICZlY29wdHMpOwotICAgICAgICB9CisgICAgYXJnYyA9IHJiX3NjYW5fYXJncyhhcmdj LCBhcmd2LCAiOjAyIiwgJm9wdCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFOSUxfUChvcHQpKSB7 CisJZWNmbGFncyA9IHJiX2Vjb252X3ByZXBhcmVfb3B0cyhvcHQsICZlY29wdHMpOwogICAgIH0K ICAgICByZXR1cm4gc3RyX3RyYW5zY29kZTAoYXJnYywgYXJndiwgc2VsZiwgZWNmbGFncywgZWNv cHRzKTsKIH0KQEAgLTI3NjAsMjUgKzI3NTcsMjggQEAgZWNvbnZfYXJncyhpbnQgYXJnYywgVkFM VUUgKmFyZ3YsCiAgICAgaW50ICplY2ZsYWdzX3AsCiAgICAgVkFMVUUgKmVjb3B0c19wKQogewot ICAgIFZBTFVFIG9wdCwgb3B0aGFzaCwgZmxhZ3NfdiwgZWNvcHRzOworICAgIFZBTFVFIG9wdCwg ZmxhZ3NfdiwgZWNvcHRzOwogICAgIGludCBzaWR4LCBkaWR4OwogICAgIGNvbnN0IGNoYXIgKnNu YW1lLCAqZG5hbWU7CiAgICAgcmJfZW5jb2RpbmcgKnNlbmMsICpkZW5jOwogICAgIGludCBlY2Zs YWdzOwogCi0gICAgcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIyMSIsIHNuYW1ldl9wLCBkbmFt ZXZfcCwgJm9wdCk7CisgICAgYXJnYyA9IHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiOjIxIiwg Jm9wdCwgc25hbWV2X3AsIGRuYW1ldl9wLCAmZmxhZ3Nfdik7CiAKLSAgICBpZiAoTklMX1Aob3B0 KSkgewotICAgICAgICBlY2ZsYWdzID0gMDsKKyAgICBpZiAoIU5JTF9QKGZsYWdzX3YpKSB7CisJ aWYgKCFOSUxfUChvcHQpKSB7CisJICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIndyb25nIG51 bWJlciBvZiBhcmd1bWVudHMgKCVkIGZvciAyLi4zKSIsCisJCWFyZ2MgKyAxKTsKKwl9CisgICAg ICAgIGVjZmxhZ3MgPSBOVU0ySU5UKHJiX3RvX2ludChmbGFnc192KSk7CiAgICAgICAgIGVjb3B0 cyA9IFFuaWw7CiAgICAgfQotICAgIGVsc2UgaWYgKCFOSUxfUChmbGFnc192ID0gcmJfY2hlY2tf dG9faW50ZWdlcihvcHQsICJ0b19pbnQiKSkpIHsKLSAgICAgICAgZWNmbGFncyA9IE5VTTJJTlQo ZmxhZ3Nfdik7Ci0gICAgICAgIGVjb3B0cyA9IFFuaWw7CisgICAgZWxzZSBpZiAoIU5JTF9QKG9w dCkpIHsKKyAgICAgICAgZWNmbGFncyA9IHJiX2Vjb252X3ByZXBhcmVfb3B0cyhvcHQsICZlY29w dHMpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgb3B0aGFzaCA9IHJiX2NvbnZlcnRfdHlw ZShvcHQsIFRfSEFTSCwgIkhhc2giLCAidG9faGFzaCIpOwotICAgICAgICBlY2ZsYWdzID0gcmJf ZWNvbnZfcHJlcGFyZV9vcHRzKG9wdGhhc2gsICZlY29wdHMpOworICAgICAgICBlY2ZsYWdzID0g MDsKKyAgICAgICAgZWNvcHRzID0gUW5pbDsKICAgICB9CiAKICAgICBzZW5jID0gTlVMTDsKQEAg LTMzOTgsNyArMzM5OCw3IEBAIGVjb252X3ByaW1pdGl2ZV9jb252ZXJ0KGludCBhcmdjLCBWQUxV RSAKICAgICB1bnNpZ25lZCBsb25nIG91dHB1dF9ieXRlZW5kOwogICAgIGludCBmbGFnczsKIAot ICAgIHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiMjMiLCAmaW5wdXQsICZvdXRwdXQsICZvdXRw dXRfYnl0ZW9mZnNldF92LCAmb3V0cHV0X2J5dGVzaXplX3YsICZvcHQpOworICAgIGFyZ2MgPSBy Yl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjoyMyIsICZvcHQsICZpbnB1dCwgJm91dHB1dCwgJm91 dHB1dF9ieXRlb2Zmc2V0X3YsICZvdXRwdXRfYnl0ZXNpemVfdiwgJmZsYWdzX3YpOwogCiAgICAg aWYgKE5JTF9QKG91dHB1dF9ieXRlb2Zmc2V0X3YpKQogICAgICAgICBvdXRwdXRfYnl0ZW9mZnNl dCA9IDA7IC8qIGR1bW15ICovCkBAIC0zNDEwLDE1ICszNDEwLDE1IEBAIGVjb252X3ByaW1pdGl2 ZV9jb252ZXJ0KGludCBhcmdjLCBWQUxVRSAKICAgICBlbHNlCiAgICAgICAgIG91dHB1dF9ieXRl c2l6ZSA9IE5VTTJMT05HKG91dHB1dF9ieXRlc2l6ZV92KTsKIAotICAgIGlmIChOSUxfUChvcHQp KSB7Ci0gICAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIU5JTF9QKGZsYWdz X3YgPSByYl9jaGVja190b19pbnRlZ2VyKG9wdCwgInRvX2ludCIpKSkgewotICAgICAgICBmbGFn cyA9IE5VTTJJTlQoZmxhZ3Nfdik7CisgICAgaWYgKCFOSUxfUChmbGFnc192KSkgeworCWlmICgh TklMX1Aob3B0KSkgeworCSAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJ3cm9uZyBudW1iZXIg b2YgYXJndW1lbnRzICglZCBmb3IgMi4uNSkiLAorCQlhcmdjICsgMSk7CisJfQorCWZsYWdzID0g TlVNMklOVChyYl90b19pbnQoZmxhZ3NfdikpOwogICAgIH0KLSAgICBlbHNlIHsKKyAgICBlbHNl IGlmICghTklMX1Aob3B0KSkgewogICAgICAgICBWQUxVRSB2OwotICAgICAgICBvcHQgPSByYl9j b252ZXJ0X3R5cGUob3B0LCBUX0hBU0gsICJIYXNoIiwgInRvX2hhc2giKTsKICAgICAgICAgZmxh Z3MgPSAwOwogICAgICAgICB2ID0gcmJfaGFzaF9hcmVmKG9wdCwgc3ltX3BhcnRpYWxfaW5wdXQp OwogICAgICAgICBpZiAoUlRFU1QodikpCkBAIC0zNDI3LDYgKzM0MjcsOSBAQCBlY29udl9wcmlt aXRpdmVfY29udmVydChpbnQgYXJnYywgVkFMVUUgCiAgICAgICAgIGlmIChSVEVTVCh2KSkKICAg ICAgICAgICAgIGZsYWdzIHw9IEVDT05WX0FGVEVSX09VVFBVVDsKICAgICB9CisgICAgZWxzZSB7 CisgICAgICAgIGZsYWdzID0gMDsKKyAgICB9CiAKICAgICBTdHJpbmdWYWx1ZShvdXRwdXQpOwog ICAgIGlmICghTklMX1AoaW5wdXQpKQo= --Multipart_Thu_Feb_19_04:33:38_2009-1-- --pgp-sign-Multipart_Thu_Feb_19_04:33:38_2009-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkmcYpIACgkQkgvvx5/Z4e5UqQCgoi0+s9lGcqIMRmJ324peKQON 5WcAniXmtYtZW868XY0jZ0WsY8wmauYx =WO35 -----END PGP SIGNATURE----- --pgp-sign-Multipart_Thu_Feb_19_04:33:38_2009-1--