LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2luaXQuYyx2IDEuNSAyMDAyLzA1LzIxIDE3OjQ4OjE1IGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKc3RhdGljIEZjQ29uZmlnICoKRmNJbml0RmFsbGJhY2tDb25maWcgKHZvaWQpCnsKICAgIEZjQ29uZmlnCSpjb25maWc7CgogICAgY29uZmlnID0gRmNDb25maWdDcmVhdGUgKCk7CiAgICBpZiAoIWNvbmZpZykKCWdvdG8gYmFpbDA7CiAgICBpZiAoIUZjQ29uZmlnQWRkRGlyIChjb25maWcsIChGY0NoYXI4ICopIEZDX0RFRkFVTFRfRk9OVFMpKQoJZ290byBiYWlsMTsKICAgIHJldHVybiBjb25maWc7CgpiYWlsMToKICAgIEZjQ29uZmlnRGVzdHJveSAoY29uZmlnKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQoKaW50CkZjR2V0VmVyc2lvbiAodm9pZCkKewogICAgcmV0dXJuIEZDX1ZFUlNJT047Cn0KCi8qCiAqIExvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMKICovCkZjQ29uZmlnICoKRmNJbml0TG9hZENvbmZpZyAodm9pZCkKewogICAgRmNDb25maWcJKmNvbmZpZzsKICAgIAogICAgY29uZmlnID0gRmNDb25maWdDcmVhdGUgKCk7CiAgICBpZiAoIWNvbmZpZykKCXJldHVybiBGY0ZhbHNlOwogICAgCiAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkIChjb25maWcsIDAsIEZjVHJ1ZSkpCiAgICB7CglGY0NvbmZpZ0Rlc3Ryb3kgKGNvbmZpZyk7CglyZXR1cm4gRmNJbml0RmFsbGJhY2tDb25maWcgKCk7CiAgICB9CgogICAgcmV0dXJuIGNvbmZpZzsKfQoKLyoKICogTG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgc2NhbiBmb3IgYXZhaWxhYmxlIGZvbnRzCiAqLwpGY0NvbmZpZyAqCkZjSW5pdExvYWRDb25maWdBbmRGb250cyAodm9pZCkKewogICAgRmNDb25maWcJKmNvbmZpZyA9IEZjSW5pdExvYWRDb25maWcgKCk7CgogICAgaWYgKCFjb25maWcpCglyZXR1cm4gMDsKICAgIGlmICghRmNDb25maWdCdWlsZEZvbnRzIChjb25maWcpKQogICAgewoJRmNDb25maWdEZXN0cm95IChjb25maWcpOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gY29uZmlnOwp9CgovKgogKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGxpYnJhcnkgY29uZmlndXJhdGlvbgogKi8KRmNCb29sCkZjSW5pdCAodm9pZCkKewogICAgRmNDb25maWcJKmNvbmZpZzsKCiAgICBpZiAoX2ZjQ29uZmlnKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGNvbmZpZyA9IEZjSW5pdExvYWRDb25maWdBbmRGb250cyAoKTsKICAgIGlmICghY29uZmlnKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIEZjQ29uZmlnU2V0Q3VycmVudCAoY29uZmlnKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCi8qCiAqIFJlcmVhZCB0aGUgY29uZmlndXJhdGlvbiBhbmQgYXZhaWxhYmxlIGZvbnQgbGlzdHMKICovCkZjQm9vbApGY0luaXRSZWluaXRpYWxpemUgKHZvaWQpCnsKICAgIEZjQ29uZmlnCSpjb25maWc7CgogICAgY29uZmlnID0gRmNJbml0TG9hZENvbmZpZ0FuZEZvbnRzICgpOwogICAgaWYgKCFjb25maWcpCglyZXR1cm4gRmNGYWxzZTsKICAgIEZjQ29uZmlnU2V0Q3VycmVudCAoY29uZmlnKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY0luaXRCcmluZ1VwdG9EYXRlICh2b2lkKQp7CiAgICBGY0NvbmZpZwkqY29uZmlnID0gRmNDb25maWdHZXRDdXJyZW50ICgpOwogICAgdGltZV90CW5vdzsKCiAgICAvKgogICAgICogcmVzY2FuSW50ZXJ2YWwgPT0gMCBkaXNhYmxlcyBhdXRvbWF0aWMgdXAgdG8gZGF0ZQogICAgICovCiAgICBpZiAoY29uZmlnLT5yZXNjYW5JbnRlcnZhbCA9PSAwKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIC8qCiAgICAgKiBDaGVjayBubyBtb3JlIG9mdGVuIHRoYW4gcmVzY2FuSW50ZXJ2YWwgc2Vjb25kcwogICAgICovCiAgICBub3cgPSB0aW1lICgwKTsKICAgIGlmIChjb25maWctPnJlc2NhblRpbWUgKyBjb25maWctPnJlc2NhbkludGVydmFsIC0gbm93ID4gMCkKCXJldHVybiBGY1RydWU7CiAgICAvKgogICAgICogSWYgdXAgdG8gZGF0ZSwgZG9uJ3QgcmVsb2FkIGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgaWYgKEZjQ29uZmlnVXB0b0RhdGUgKDApKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIHJldHVybiBGY0luaXRSZWluaXRpYWxpemUgKCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgewogICAgY2hhciAgICAqbmFtZTsKICAgIGludAkgICAgYWxsb2NfY291bnQ7CiAgICBpbnQJICAgIGFsbG9jX21lbTsKICAgIGludAkgICAgZnJlZV9jb3VudDsKICAgIGludAkgICAgZnJlZV9tZW07Cn0gRmNJblVzZVtGQ19NRU1fTlVNXSA9IHsKICAgIHsgImNoYXJzZXQiLCAwLCAwIH0sCiAgICB7ICJjaGFybm9kZSIsIDAgLDAgfSwKICAgIHsgImZvbnRzZXQiLCAwLCAwIH0sCiAgICB7ICJmb250cHRyIiwgMCwgMCB9LAogICAgeyAib2JqZWN0c2V0IiwgMCwgMCB9LAogICAgeyAib2JqZWN0cHRyIiwgMCwgMCB9LAogICAgeyAibWF0cml4IiwgMCwgMCB9LAogICAgeyAicGF0dGVybiIsIDAsIDAgfSwKICAgIHsgInBhdGVsdCIsIDAsIDAgfSwKICAgIHsgInZhbGxpc3QiLCAwLCAwIH0sCiAgICB7ICJzdWJzdGF0ZSIsIDAsIDAgfSwKICAgIHsgInN0cmluZyIsIDAsIDAgfSwKICAgIHsgImxpc3RidWNrIiwgMCwgMCB9LAp9OwoKc3RhdGljIGludCAgRmNBbGxvY0NvdW50LCBGY0FsbG9jTWVtOwpzdGF0aWMgaW50ICBGY0ZyZWVDb3VudCwgRmNGcmVlTWVtOwoKc3RhdGljIGludCAgRmNNZW1Ob3RpY2UgPSAxKjEwMjQqMTAyNDsKCnN0YXRpYyBpbnQgIEZjQWxsb2NOb3RpZnksIEZjRnJlZU5vdGlmeTsKCnZvaWQKRmNNZW1SZXBvcnQgKHZvaWQpCnsKICAgIGludAlpOwogICAgcHJpbnRmICgiRmMgTWVtb3J5IFVzYWdlOlxuIik7CiAgICBwcmludGYgKCJcdCAgIFdoaWNoICAgICAgIEFsbG9jICAgICAgICAgICBGcmVlICAgICAgICAgICBBY3RpdmVcbiIpOwogICAgcHJpbnRmICgiXHQgICAgICAgICAgIGNvdW50ICAgYnl0ZXMgICBjb3VudCAgIGJ5dGVzICAgY291bnQgICBieXRlc1xuIik7CiAgICBmb3IgKGkgPSAwOyBpIDwgRkNfTUVNX05VTTsgaSsrKQoJcHJpbnRmICgiXHQlOC44cyU4ZCU4ZCU4ZCU4ZCU4ZCU4ZFxuIiwKCQlGY0luVXNlW2ldLm5hbWUsCgkJRmNJblVzZVtpXS5hbGxvY19jb3VudCwgRmNJblVzZVtpXS5hbGxvY19tZW0sCgkJRmNJblVzZVtpXS5mcmVlX2NvdW50LCBGY0luVXNlW2ldLmZyZWVfbWVtLAoJCUZjSW5Vc2VbaV0uYWxsb2NfY291bnQgLSBGY0luVXNlW2ldLmZyZWVfY291bnQsCgkJRmNJblVzZVtpXS5hbGxvY19tZW0gLSBGY0luVXNlW2ldLmZyZWVfbWVtKTsKICAgIHByaW50ZiAoIlx0JTguOHMlOGQlOGQlOGQlOGQlOGQlOGRcbiIsCgkgICAgIlRvdGFsIiwKCSAgICBGY0FsbG9jQ291bnQsIEZjQWxsb2NNZW0sCgkgICAgRmNGcmVlQ291bnQsIEZjRnJlZU1lbSwKCSAgICBGY0FsbG9jQ291bnQgLSBGY0ZyZWVDb3VudCwKCSAgICBGY0FsbG9jTWVtIC0gRmNGcmVlTWVtKTsKICAgIEZjQWxsb2NOb3RpZnkgPSAwOwogICAgRmNGcmVlTm90aWZ5ID0gMDsKfQoKdm9pZApGY01lbUFsbG9jIChpbnQga2luZCwgaW50IHNpemUpCnsKICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfTUVNT1JZKQogICAgewoJRmNJblVzZVtraW5kXS5hbGxvY19jb3VudCsrOwoJRmNJblVzZVtraW5kXS5hbGxvY19tZW0gKz0gc2l6ZTsKCUZjQWxsb2NDb3VudCsrOwoJRmNBbGxvY01lbSArPSBzaXplOwoJRmNBbGxvY05vdGlmeSArPSBzaXplOwoJaWYgKEZjQWxsb2NOb3RpZnkgPiBGY01lbU5vdGljZSkKCSAgICBGY01lbVJlcG9ydCAoKTsKICAgIH0KfQoKdm9pZApGY01lbUZyZWUgKGludCBraW5kLCBpbnQgc2l6ZSkKewogICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19NRU1PUlkpCiAgICB7CglGY0luVXNlW2tpbmRdLmZyZWVfY291bnQrKzsKCUZjSW5Vc2Vba2luZF0uZnJlZV9tZW0gKz0gc2l6ZTsKCUZjRnJlZUNvdW50Kys7CglGY0ZyZWVNZW0gKz0gc2l6ZTsKCUZjRnJlZU5vdGlmeSArPSBzaXplOwoJaWYgKEZjRnJlZU5vdGlmeSA+IEZjTWVtTm90aWNlKQoJICAgIEZjTWVtUmVwb3J0ICgpOwogICAgfQp9Cg==