LyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogKiBtb2RfdmVyc2lvbi5jCiAqIEFsbG93IGNvbmRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZGVwZW5kaW5nIG9uIHRoZSBodHRwZCB2ZXJzaW9uCiAqCiAqIEFuZHLpIE1hbG8gKG5kL3BlcmxpZy5kZSksIEphbnVhcnkgMjAwNAogKgogKiBTb21lIHN0dWZmIGNvZGVkIGhlcmUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgY29yZSA8SWZNb2R1bGU+CiAqIGNvbnRhaW5lcnMuCiAqCiAqIFRoZSBtb2R1bGUgbWFrZXMgdGhlIGZvbGxvd2luZyBjb25mZ3VyYXRpb25zIHBvc3NpYmxlOgogKgogKiA8SWZWZXJzaW9uIG9wIG1ham9yLm1pbm9yLnBhdGNoPgogKiAgICAgIyBjb25kaXRpb25hbCBjb25maWcgaGVyZSAuLi4KICo8L0lmVmVyc2lvbj4KICoKICogd2hlcmUgIm9wIiBpcyBvbmUgb2Y6CiAqID0gLyA9PSAgICAgICBlcXVhbAogKiA+ICAgICAgICAgICAgZ3JlYXRlciB0aGFuCiAqID49ICAgICAgICAgICBncmVhdGVyIG9yIGVxdWFsCiAqIDwgICAgICAgICAgICBsZXNzIHRoYW4KICogPD0gICAgICAgICAgIGxlc3Mgb3IgZXF1YWwKICoKICogSWYgbWlub3IgdmVyc2lvbiBhbmQgcGF0Y2ggbGV2ZWwgYXJlIG9taXR0ZWQgdGhleSBhcmUgYXNzdW1lZCB0byBiZSAwLgogKgogKiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gbWF0Y2ggdGhlIHdob2xlIHZlcnNpb24gKGluY2x1ZGluZyBzb21lIHZlbmRvci1hZGRlZAogKiBzdHJpbmcgb2YgdGhlIENPUkUgdmVyc2lvbiwgc2VlIGFwX3JlbGVhc2UuaCkgYWdhaW5zdCBhIHJlZ3VsYXIgZXhwcmVzc2lvbjoKICoKICogPElmVmVyc2lvbiBvcCByZWdleD4KICogICAgICMgY29uZGl0aW9uYWwgY29uZmlnIGhlcmUgLi4uCiAqPC9JZlZlcnNpb24+CiAqCiAqIHdoZXJlICJvcCIgaXMgb25lIG9mOgogKiA9IC8gPT0gICAgICAgbWF0Y2g7IHJlZ2V4IG11c3QgYmUgc3Vycm91bmRlZCBieSBzbGFzaGVzCiAqIH4gICAgICAgICAgICBtYXRjaDsgcmVnZXggTUFZIE5PVCBiZSBzdXJyb3VuZGVkIGJ5IHNsYXNoZXMKICoKICogTm90ZSB0aGF0IGFsbCBvcGVyYXRvcnMgbWF5IGJlIHByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIG1hcmsKICogKHdpdGhvdXQgc3BhY2VzKSBpbiBvcmRlciB0byByZXZlcnNlIHRoZWlyIG1lYW5pbmcuCiAqCiAqLwoKI2luY2x1ZGUgImFwci5oIgojaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKI2luY2x1ZGUgImFwcl9saWIuaCIKCiNpbmNsdWRlICJodHRwZC5oIgojaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKI2luY2x1ZGUgImh0dHBfbG9nLmgiCgoKLyogbW9kdWxlIHN0cnVjdHVyZSAqLwptb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSB2ZXJzaW9uX21vZHVsZTsKCi8qIHF1ZXJpZWQgaHR0cGQgdmVyc2lvbiAqLwpzdGF0aWMgYXBfdmVyc2lvbl90IGh0dHBkX3ZlcnNpb247CgoKLyoKICogY29tcGFyZSB0aGUgc3VwcGxpZWQgdmVyc2lvbiB3aXRoIHRoZSBjb3JlIG9uZQogKi8Kc3RhdGljIGludCBjb21wYXJlX3ZlcnNpb24oY2hhciAqdmVyc2lvbl9zdHJpbmcsIGNvbnN0IGNoYXIgKiplcnJvcikKewogICAgY2hhciAqcCA9IHZlcnNpb25fc3RyaW5nLCAqZXA7CiAgICBpbnQgdmVyc2lvblszXSA9IHswLCAwLCAwfTsKICAgIGludCBjID0gMDsKCiAgICAqZXJyb3IgPSAiVmVyc2lvbiBhcHBlYXJzIHRvIGJlIGludmFsaWQuIEl0IG11c3QgaGF2ZSB0aGUgZm9ybWF0ICIKICAgICAgICAgICAgICJtYWpvclsubWlub3JbLnBhdGNoXV0gd2hlcmUgbWFqb3IsIG1pbm9yIGFuZCBwYXRjaCBhcmUgIgogICAgICAgICAgICAgIm51bWJlcnMuIjsKCiAgICBpZiAoIWFwcl9pc2RpZ2l0KCpwKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIHBhcnNlIHN1cHBsaWVkIHZlcnNpb24gKi8KICAgIGVwID0gdmVyc2lvbl9zdHJpbmcgKyBzdHJsZW4odmVyc2lvbl9zdHJpbmcpOwogICAgd2hpbGUgKHAgPD0gZXAgJiYgYyA8IDMpIHsKICAgICAgICBpZiAoKnAgPT0gJy4nKSB7CiAgICAgICAgICAgICpwID0gJ1wwJzsKICAgICAgICB9CgogICAgICAgIGlmICghKnApIHsKICAgICAgICAgICAgdmVyc2lvbltjKytdID0gYXRvaSh2ZXJzaW9uX3N0cmluZyk7CiAgICAgICAgICAgIHZlcnNpb25fc3RyaW5nID0gKytwOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICghYXByX2lzZGlnaXQoKnApKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgKytwOwogICAgfQoKICAgIGlmIChwIDwgZXApIHsgLyogc3ludGF4IGVycm9yICovCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgKmVycm9yID0gTlVMTDsKCiAgICBpZiAgICAgIChodHRwZF92ZXJzaW9uLm1ham9yID4gdmVyc2lvblswXSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSBpZiAoaHR0cGRfdmVyc2lvbi5tYWpvciA8IHZlcnNpb25bMF0pIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBlbHNlIGlmIChodHRwZF92ZXJzaW9uLm1pbm9yID4gdmVyc2lvblsxXSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSBpZiAoaHR0cGRfdmVyc2lvbi5taW5vciA8IHZlcnNpb25bMV0pIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBlbHNlIGlmIChodHRwZF92ZXJzaW9uLnBhdGNoID4gdmVyc2lvblsyXSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSBpZiAoaHR0cGRfdmVyc2lvbi5wYXRjaCA8IHZlcnNpb25bMl0pIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogc2VlbXMgdG8gYmUgdGhlIHNhbWUgKi8KICAgIHJldHVybiAwOwp9CgovKgogKiBtYXRjaCB2ZXJzaW9uIGFnYWluc3QgYSByZWd1bGFyIGV4cHJlc3Npb24KICovCnN0YXRpYyBpbnQgbWF0Y2hfdmVyc2lvbihhcHJfcG9vbF90ICpwb29sLCBjaGFyICp2ZXJzaW9uX3N0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplcnJvcikKewogICAgYXBfcmVnZXhfdCAqY29tcGlsZWQ7CiAgICBjb25zdCBjaGFyICp0b19tYXRjaDsKICAgIGludCByYzsKCiAgICBjb21waWxlZCA9IGFwX3ByZWdjb21wKHBvb2wsIHZlcnNpb25fc3RyaW5nLCBBUF9SRUdfRVhURU5ERUQpOwogICAgaWYgKCFjb21waWxlZCkgewogICAgICAgICplcnJvciA9ICJVbmFibGUgdG8gY29tcGlsZSByZWd1bGFyIGV4cHJlc3Npb24iOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICplcnJvciA9IE5VTEw7CgogICAgdG9fbWF0Y2ggPSBhcHJfcHNwcmludGYocG9vbCwgIiVkLiVkLiVkJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cGRfdmVyc2lvbi5tYWpvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBkX3ZlcnNpb24ubWlub3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwZF92ZXJzaW9uLnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cGRfdmVyc2lvbi5hZGRfc3RyaW5nKTsKCiAgICByYyA9ICFhcF9yZWdleGVjKGNvbXBpbGVkLCB0b19tYXRjaCwgMCwgTlVMTCwgMCk7CgogICAgYXBfcHJlZ2ZyZWUocG9vbCwgY29tcGlsZWQpOwogICAgcmV0dXJuIHJjOwp9CgovKgogKiBJbXBsZW1lbnRzIHRoZSA8SWZWZXJzaW9uPiBjb250YWluZXIKICovCnN0YXRpYyBjb25zdCBjaGFyICpzdGFydF9pZnZlcnNpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnMSwgY29uc3QgY2hhciAqYXJnMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmczKQp7CiAgICBjb25zdCBjaGFyICplbmRwOwogICAgaW50IHJldmVyc2UgPSAwLCBkb25lID0gMCwgbWF0Y2ggPSAwLCBjb21wYXJlOwogICAgY29uc3QgY2hhciAqcCwgKmVycm9yOwogICAgY2hhciBjOwoKICAgIC8qIHN1cHBseWluZyBvbmUgYXJndW1lbnQgaXMgcG9zc2libGUsIHdlIGFzc3VtZSBhbiBlcXVhbGl0eSBjaGVjayB0aGVuICovCiAgICBpZiAoIWFyZzIpIHsKICAgICAgICBhcmcyID0gYXJnMTsKICAgICAgICBhcmcxID0gIj0iOwogICAgfQoKICAgIC8qIHN1cnJvdW5kaW5nIHF1b3RlcyB3aXRob3V0IG9wZXJhdG9yICovCiAgICBpZiAoIWFyZzMgJiYgKmFyZzIgPT0gJz4nICYmICFhcmcyWzFdKSB7CiAgICAgICAgYXJnMyA9ICI+IjsKICAgICAgICBhcmcyID0gYXJnMTsKICAgICAgICBhcmcxID0gIj0iOwogICAgfQoKICAgIC8qIHRoZSB0aGlyZCBhcmd1bWVudCBtYWtlcyB2ZXJzaW9uIHN1cnJvdW5kaW5nIHF1b3RlcyBwbHVzIG9wZXJhdG9yCiAgICAgKiBwb3NzaWJsZS4KICAgICAqLwogICAgZW5kcCA9IGFyZzIgKyBzdHJsZW4oYXJnMik7CiAgICBpZiAoICAgZW5kcCA9PSBhcmcyCiAgICAgICAgfHwgKCEoYXJnMyAmJiAqYXJnMyA9PSAnPicgJiYgIWFyZzNbMV0pICYmICotLWVuZHAgIT0gJz4nKSkgewogICAgICAgIHJldHVybiBhcHJfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiPiBkaXJlY3RpdmUgbWlzc2luZyBjbG9zaW5nICc+JyIsIE5VTEwpOwogICAgfQoKICAgIHAgPSBhcmcxOwogICAgaWYgKCpwID09ICchJykgewogICAgICAgIHJldmVyc2UgPSAxOwogICAgICAgIGlmIChwWzFdKSB7CiAgICAgICAgICAgICsrcDsKICAgICAgICB9CiAgICB9CgogICAgYyA9ICpwKys7CiAgICBpZiAoISpwIHx8ICgqcCA9PSAnPScgJiYgIXBbMV0gJiYgYyAhPSAnficpKSB7CiAgICAgICAgaWYgKCFodHRwZF92ZXJzaW9uLm1ham9yKSB7CiAgICAgICAgICAgIGFwX2dldF9zZXJ2ZXJfcmV2aXNpb24oJmh0dHBkX3ZlcnNpb24pOwogICAgICAgIH0KCiAgICAgICAgZG9uZSA9IDE7CiAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgY2FzZSAnPSc6CiAgICAgICAgICAgIC8qIG5vcm1hbCBjb21wYXJpc29uICovCiAgICAgICAgICAgIGlmICgqYXJnMiAhPSAnLycpIHsKICAgICAgICAgICAgICAgIGNvbXBhcmUgPSBjb21wYXJlX3ZlcnNpb24oYXByX3BzdHJtZW1kdXAoY21kLT50ZW1wX3Bvb2wsIGFyZzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtYXJnMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWF0Y2ggPSAhY29tcGFyZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiByZWdleHAgb3RoZXJ3aXNlICovCiAgICAgICAgICAgIGlmIChlbmRwID09ICsrYXJnMiB8fCAqLS1lbmRwICE9ICcvJykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nIGRlbGltaXRpbmcgLyBvZiByZWd1bGFyIGV4cHJlc3Npb24uIjsKICAgICAgICAgICAgfQoKICAgICAgICBjYXNlICd+JzoKICAgICAgICAgICAgLyogcmVndWxhciBleHByZXNzaW9uICovCiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hfdmVyc2lvbihjbWQtPnRlbXBfcG9vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wc3RybWVtZHVwKGNtZC0+dGVtcF9wb29sLCBhcmcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC1hcmcyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CiAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICc8JzoKICAgICAgICAgICAgY29tcGFyZSA9IGNvbXBhcmVfdmVyc2lvbihhcHJfcHN0cm1lbWR1cChjbWQtPnRlbXBfcG9vbCwgYXJnMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLWFyZzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CiAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtYXRjaCA9ICgoLTEgPT0gY29tcGFyZSkgfHwgKCpwICYmICFjb21wYXJlKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICc+JzoKICAgICAgICAgICAgY29tcGFyZSA9IGNvbXBhcmVfdmVyc2lvbihhcHJfcHN0cm1lbWR1cChjbWQtPnRlbXBfcG9vbCwgYXJnMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLWFyZzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CiAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtYXRjaCA9ICgoMSA9PSBjb21wYXJlKSB8fCAoKnAgJiYgIWNvbXBhcmUpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGRvbmUgPSAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFkb25lKSB7CiAgICAgICAgcmV0dXJuIGFwcl9wc3RyY2F0KGNtZC0+cG9vbCwgInVucmVjb2duaXplZCBvcGVyYXRvciAnIiwgYXJnMSwgIiciLAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIH0KCiAgICBpZiAoKCFyZXZlcnNlICYmIG1hdGNoKSB8fCAocmV2ZXJzZSAmJiAhbWF0Y2gpKSB7CiAgICAgICAgYXBfZGlyZWN0aXZlX3QgKnBhcmVudCA9IE5VTEw7CiAgICAgICAgYXBfZGlyZWN0aXZlX3QgKmN1cnJlbnQgPSBOVUxMOwogICAgICAgIGNvbnN0IGNoYXIgKnJldHZhbDsKCiAgICAgICAgcmV0dmFsID0gYXBfYnVpbGRfY29udF9jb25maWcoY21kLT5wb29sLCBjbWQtPnRlbXBfcG9vbCwgY21kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50LCAmcGFyZW50LCAiPElmVmVyc2lvbiIpOwogICAgICAgICooYXBfZGlyZWN0aXZlX3QgKiopbWNvbmZpZyA9IGN1cnJlbnQ7CiAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgIH0KCiAgICAqKGFwX2RpcmVjdGl2ZV90ICoqKW1jb25maWcgPSBOVUxMOwogICAgcmV0dXJuIGFwX3NvYWtfZW5kX2NvbnRhaW5lcihjbWQsICI8SWZWZXJzaW9uIik7Cn0KCnN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyB2ZXJzaW9uX2NtZHNbXSA9IHsKICAgIEFQX0lOSVRfVEFLRTEyMygiPElmVmVyc2lvbiIsIHN0YXJ0X2lmdmVyc2lvbiwgTlVMTCwgRVhFQ19PTl9SRUFEIHwgT1JfQUxMLAogICAgICAgICAgICAgICAgICAgICJhIGNvbXBhcmlzb24gb3BlcmF0b3IsIGEgdmVyc2lvbiAoYW5kIGEgZGVsaW1pdGVyKSIpLAogICAgeyBOVUxMIH0KfTsKCkFQX0RFQ0xBUkVfTU9EVUxFKHZlcnNpb24pID0KewogICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCiAgICBOVUxMLCAgICAgICAgICAgICAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KICAgIE5VTEwsICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KICAgIE5VTEwsICAgICAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KICAgIE5VTEwsICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWdzICovCiAgICB2ZXJzaW9uX2NtZHMsICAgICAvKiBjb21tYW5kIGFwcl90YWJsZV90ICovCiAgICBOVUxMLCAgICAgICAgICAgICAvKiByZWdpc3RlciBob29rcyAqLwp9Owo=