LyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAogICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgoKICAgcnVudGVzdC5jIDogcnVuIHRoZSBFeHBhdCB0ZXN0IHN1aXRlCiovCgojaWZkZWYgSEFWRV9FWFBBVF9DT05GSUdfSAojaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CiNlbmRpZgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAiZXhwYXQuaCIKI2luY2x1ZGUgImNoYXJkYXRhLmgiCiNpbmNsdWRlICJtaW5pY2hlY2suaCIKCgpzdGF0aWMgWE1MX1BhcnNlciBwYXJzZXI7CgoKc3RhdGljIHZvaWQKYmFzaWNfc2V0dXAodm9pZCkKewogICAgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKICAgIGlmIChwYXJzZXIgPT0gTlVMTCkKICAgICAgICBmYWlsKCJQYXJzZXIgbm90IGNyZWF0ZWQuIik7Cn0KCnN0YXRpYyB2b2lkCmJhc2ljX3RlYXJkb3duKHZvaWQpCnsKICAgIGlmIChwYXJzZXIgIT0gTlVMTCkKICAgICAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwp9CgovKiBHZW5lcmF0ZSBhIGZhaWx1cmUgdXNpbmcgdGhlIHBhcnNlciBzdGF0ZSB0byBjcmVhdGUgYW4gZXJyb3IgbWVzc2FnZTsKICAgdGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBwYXJzZXIgcmVwb3J0cyBhbiBlcnJvciB3ZSB3ZXJlbid0CiAgIGV4cGVjdGluZy4KKi8Kc3RhdGljIHZvaWQKX3htbF9mYWlsdXJlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKewogICAgY2hhciBidWZmZXJbMTAyNF07CiAgICBzcHJpbnRmKGJ1ZmZlciwKICAgICAgICAgICAgIlxuICAgICVzIChsaW5lICVkLCBvZmZzZXQgJWQpXG4gICAgcmVwb3J0ZWQgZnJvbSAlcywgbGluZSAlZCIsCiAgICAgICAgICAgIFhNTF9FcnJvclN0cmluZyhYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpLAogICAgICAgICAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKSwKICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKSwKICAgICAgICAgICAgZmlsZSwgbGluZSk7CiAgICBfZmFpbF91bmxlc3MoMCwgZmlsZSwgbGluZSwgYnVmZmVyKTsKfQoKI2RlZmluZSB4bWxfZmFpbHVyZShwYXJzZXIpIF94bWxfZmFpbHVyZSgocGFyc2VyKSwgX19GSUxFX18sIF9fTElORV9fKQoKc3RhdGljIHZvaWQKX2V4cGVjdF9mYWlsdXJlKGNoYXIgKnRleHQsIGVudW0gWE1MX0Vycm9yIGVycm9yQ29kZSwgY2hhciAqZXJyb3JNZXNzYWdlLAogICAgICAgICAgICAgICAgY2hhciAqZmlsZSwgaW50IGxpbmVubykKewogICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfT0spCiAgICAgICAgLyogSGFja2lzaCB1c2Ugb2YgX2ZhaWxfdW5sZXNzKCkgbWFjcm8sIGJ1dCBsZXQncyB1cyByZXBvcnQKICAgICAgICAgICB0aGUgcmlnaHQgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLiAqLwogICAgICAgIF9mYWlsX3VubGVzcygwLCBmaWxlLCBsaW5lbm8sIGVycm9yTWVzc2FnZSk7CiAgICBpZiAoWE1MX0dldEVycm9yQ29kZShwYXJzZXIpICE9IGVycm9yQ29kZSkKICAgICAgICBfeG1sX2ZhaWx1cmUocGFyc2VyLCBmaWxlLCBsaW5lbm8pOwp9CgojZGVmaW5lIGV4cGVjdF9mYWlsdXJlKHRleHQsIGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlKSBcCiAgICAgICAgX2V4cGVjdF9mYWlsdXJlKCh0ZXh0KSwgKGVycm9yQ29kZSksIChlcnJvck1lc3NhZ2UpLCBcCiAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKCi8qIER1bW15IGhhbmRsZXJzIGZvciB3aGVuIHdlIG5lZWQgdG8gc2V0IGEgaGFuZGxlciB0byB0aWNrbGUgYSBidWcsCiAgIGJ1dCBpdCBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCiovCgpzdGF0aWMgdm9pZCBYTUxDQUxMCmR1bW15X3N0YXJ0X2RvY3R5cGVfaGFuZGxlcih2b2lkICAgICAgICAgICAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZG9jdHlwZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHViaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNfaW50ZXJuYWxfc3Vic2V0KQp7fQoKc3RhdGljIHZvaWQgWE1MQ0FMTApkdW1teV9lbmRfZG9jdHlwZV9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhKQp7fQoKc3RhdGljIHZvaWQgWE1MQ0FMTApkdW1teV9lbnRpdHlfZGVjbF9oYW5kbGVyKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpc19wYXJhbWV0ZXJfZW50aXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB2YWx1ZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lKQp7fQoKc3RhdGljIHZvaWQgWE1MQ0FMTApkdW1teV9ub3RhdGlvbl9kZWNsX2hhbmRsZXIodm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCnt9CgpzdGF0aWMgdm9pZCBYTUxDQUxMCmR1bW15X2VsZW1lbnRfZGVjbF9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbnRlbnQgKm1vZGVsKQp7fQoKc3RhdGljIHZvaWQgWE1MQ0FMTApkdW1teV9hdHRsaXN0X2RlY2xfaGFuZGxlcih2b2lkICAgICAgICAgICAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICphdHRuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYXR0X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkZmx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpc3JlcXVpcmVkKQp7fQoKc3RhdGljIHZvaWQgWE1MQ0FMTApkdW1teV9jb21tZW50X2hhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpkYXRhKQp7fQoKc3RhdGljIHZvaWQgWE1MQ0FMTApkdW1teV9waV9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0LCBjb25zdCBYTUxfQ2hhciAqZGF0YSkKe30KCnN0YXRpYyB2b2lkIFhNTENBTEwKZHVtbXlfc3RhcnRfZWxlbWVudCh2b2lkICp1c2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwgY29uc3QgWE1MX0NoYXIgKiphdHRzKQp7fQoKCi8qCiAqIENoYXJhY3RlciAmIGVuY29kaW5nIHRlc3RzLgogKi8KClNUQVJUX1RFU1QodGVzdF9udWxfYnl0ZSkKewogICAgY2hhciB0ZXh0W10gPSAiPGRvYz5cMDwvZG9jPiI7CgogICAgLyogdGVzdCB0aGF0IGEgTlVMIGJ5dGUgKGluIFVTLUFTQ0lJIGRhdGEpIGlzIGFuIGVycm9yICovCiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc2l6ZW9mKHRleHQpIC0gMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfT0spCiAgICAgICAgZmFpbCgiUGFyc2VyIGRpZCBub3QgcmVwb3J0IGVycm9yIG9uIE5VTC1ieXRlLiIpOwogICAgaWYgKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSAhPSBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgoKU1RBUlRfVEVTVCh0ZXN0X3UwMDAwX2NoYXIpCnsKICAgIC8qIHRlc3QgdGhhdCBhIE5VTCBieXRlIChpbiBVUy1BU0NJSSBkYXRhKSBpcyBhbiBlcnJvciAqLwogICAgZXhwZWN0X2ZhaWx1cmUoIjxkb2M+JiMwOzwvZG9jPiIsCiAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfQkFEX0NIQVJfUkVGLAogICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCBlcnJvciBvbiBOVUwtYnl0ZS4iKTsKfQpFTkRfVEVTVAoKU1RBUlRfVEVTVCh0ZXN0X2JvbV91dGY4KQp7CiAgICAvKiBUaGlzIHRlc3QgaXMgcmVhbGx5IGp1c3QgbWFraW5nIHN1cmUgd2UgZG9uJ3QgY29yZSBvbiBhIFVURi04IEJPTS4gKi8KICAgIGNoYXIgKnRleHQgPSAiXDM1N1wyNzNcMjc3PGUvPiI7CgogICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKfQpFTkRfVEVTVAoKU1RBUlRfVEVTVCh0ZXN0X2JvbV91dGYxNl9iZSkKewogICAgY2hhciB0ZXh0W10gPSAiXDM3NlwzNzdcMDxcMGVcMC9cMD4iOwoKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKfQpFTkRfVEVTVAoKU1RBUlRfVEVTVCh0ZXN0X2JvbV91dGYxNl9sZSkKewogICAgY2hhciB0ZXh0W10gPSAiXDM3N1wzNzY8XDBlXDAvXDA+XDAiOwoKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKfQpFTkRfVEVTVAoKc3RhdGljIHZvaWQgWE1MQ0FMTAphY2N1bXVsYXRlX2NoYXJhY3RlcnModm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQp7CiAgICBDaGFyRGF0YV9BcHBlbmRYTUxDaGFycygoQ2hhckRhdGEgKil1c2VyRGF0YSwgcywgbGVuKTsKfQoKc3RhdGljIHZvaWQgWE1MQ0FMTAphY2N1bXVsYXRlX2F0dHJpYnV0ZSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKewogICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKil1c2VyRGF0YTsKICAgIGlmIChzdG9yYWdlLT5jb3VudCA8IDAgJiYgYXR0cyAhPSBOVUxMICYmIGF0dHNbMF0gIT0gTlVMTCkgewogICAgICAgIC8qICJhY2N1bXVsYXRlIiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGF0dHJpYnV0ZSB3ZSBzZWUgKi8KICAgICAgICBDaGFyRGF0YV9BcHBlbmRYTUxDaGFycyhzdG9yYWdlLCBhdHRzWzFdLCAtMSk7CiAgICB9Cn0KCgpzdGF0aWMgdm9pZApfcnVuX2NoYXJhY3Rlcl9jaGVjayhYTUxfQ2hhciAqdGV4dCwgWE1MX0NoYXIgKmV4cGVjdGVkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKewogICAgQ2hhckRhdGEgc3RvcmFnZTsKCiAgICBDaGFyRGF0YV9Jbml0KCZzdG9yYWdlKTsKICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZzdG9yYWdlKTsKICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGFjY3VtdWxhdGVfY2hhcmFjdGVycyk7CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICBfeG1sX2ZhaWx1cmUocGFyc2VyLCBmaWxlLCBsaW5lKTsKICAgIENoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoJnN0b3JhZ2UsIGV4cGVjdGVkKTsKfQoKI2RlZmluZSBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsIGV4cGVjdGVkKSBcCiAgICAgICAgX3J1bl9jaGFyYWN0ZXJfY2hlY2sodGV4dCwgZXhwZWN0ZWQsIF9fRklMRV9fLCBfX0xJTkVfXykKCnN0YXRpYyB2b2lkCl9ydW5fYXR0cmlidXRlX2NoZWNrKFhNTF9DaGFyICp0ZXh0LCBYTUxfQ2hhciAqZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQp7CiAgICBDaGFyRGF0YSBzdG9yYWdlOwoKICAgIENoYXJEYXRhX0luaXQoJnN0b3JhZ2UpOwogICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgJnN0b3JhZ2UpOwogICAgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBhY2N1bXVsYXRlX2F0dHJpYnV0ZSk7CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICBfeG1sX2ZhaWx1cmUocGFyc2VyLCBmaWxlLCBsaW5lKTsKICAgIENoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoJnN0b3JhZ2UsIGV4cGVjdGVkKTsKfQoKI2RlZmluZSBydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIGV4cGVjdGVkKSBcCiAgICAgICAgX3J1bl9hdHRyaWJ1dGVfY2hlY2sodGV4dCwgZXhwZWN0ZWQsIF9fRklMRV9fLCBfX0xJTkVfXykKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0OTE5ODYuICovClNUQVJUX1RFU1QodGVzdF9kYW5pc2hfbGF0aW4xKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PlxuIgogICAgICAgICI8ZT5K+HJnZW4g5vjlxtjFPC9lPiI7CiAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsCiAgICAgICAgICAgICAiSlx4QzNceEI4cmdlbiBceEMzXHhBNlx4QzNceEI4XHhDM1x4QTVceEMzXHg4Nlx4QzNceDk4XHhDM1x4ODUiKTsKfQpFTkRfVEVTVAoKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM1MTQyODEuICovClNUQVJUX1RFU1QodGVzdF9mcmVuY2hfY2hhcnJlZl9oZXhpZGVjaW1hbCkKewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz5cbiIKICAgICAgICAiPGRvYz4mI3hFOTsmI3hFODsmI3hFMDsmI3hFNzsmI3hFQTsmI3hDODs8L2RvYz4iOwogICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAiXHhDM1x4QTlceEMzXHhBOFx4QzNceEEwXHhDM1x4QTdceEMzXHhBQVx4QzNceDg4Iik7Cn0KRU5EX1RFU1QKClNUQVJUX1RFU1QodGVzdF9mcmVuY2hfY2hhcnJlZl9kZWNpbWFsKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PlxuIgogICAgICAgICI8ZG9jPiYjMjMzOyYjMjMyOyYjMjI0OyYjMjMxOyYjMjM0OyYjMjAwOzwvZG9jPiI7CiAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICJceEMzXHhBOVx4QzNceEE4XHhDM1x4QTBceEMzXHhBN1x4QzNceEFBXHhDM1x4ODgiKTsKfQpFTkRfVEVTVAoKU1RBUlRfVEVTVCh0ZXN0X2ZyZW5jaF9sYXRpbjEpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCiAgICAgICAgIjxkb2M+XHhFOVx4RThceEUwXHhFN1x4RWFceEM4PC9kb2M+IjsKICAgIHJ1bl9jaGFyYWN0ZXJfY2hlY2sodGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIlx4QzNceEE5XHhDM1x4QThceEMzXHhBMFx4QzNceEE3XHhDM1x4QUFceEMzXHg4OCIpOwp9CkVORF9URVNUCgpTVEFSVF9URVNUKHRlc3RfZnJlbmNoX3V0ZjgpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PlxuIgogICAgICAgICI8ZG9jPlx4QzNceEE5PC9kb2M+IjsKICAgIHJ1bl9jaGFyYWN0ZXJfY2hlY2sodGV4dCwgIlx4QzNceEE5Iik7Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM2MDA0NzkuCiAgIFhYWCBUaGVyZSBzaG91bGQgYmUgYSB0ZXN0IHRoYXQgZXhlcmNpc2VzIGFsbCBsZWdhbCBYTUwgVW5pY29kZQogICBjaGFyYWN0ZXJzIGFzIFBDREFUQSBhbmQgYXR0cmlidXRlIHZhbHVlIGNvbnRlbnQsIGFuZCBYTUwgTmFtZQogICBjaGFyYWN0ZXJzIGFzIHBhcnQgb2YgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzLgoqLwpTVEFSVF9URVNUKHRlc3RfdXRmOF9mYWxzZV9yZWplY3Rpb24pCnsKICAgIGNoYXIgKnRleHQgPSAiPGRvYz5ceEVGXHhCQVx4QkY8L2RvYz4iOwogICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCAiXHhFRlx4QkFceEJGIik7Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0Nzc2NjcuCiAgIFRoaXMgdGVzdCBhc3N1cmVzIHRoYXQgYW55IDgtYml0IGNoYXJhY3RlciBmb2xsb3dlZCBieSBhIDctYml0CiAgIGNoYXJhY3RlciB3aWxsIG5vdCBiZSBtaXN0YWtlbmx5IGludGVycHJldGVkIGFzIGEgdmFsaWQgVVRGLTgKICAgc2VxdWVuY2UuCiovClNUQVJUX1RFU1QodGVzdF9pbGxlZ2FsX3V0ZjgpCnsKICAgIGNoYXIgdGV4dFsxMDBdOwogICAgaW50IGk7CgogICAgZm9yIChpID0gMTI4OyBpIDw9IDI1NTsgKytpKSB7CiAgICAgICAgc3ByaW50Zih0ZXh0LCAiPGU+JWNjZDwvZT4iLCBpKTsKICAgICAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19PSykgewogICAgICAgICAgICBzcHJpbnRmKHRleHQsCiAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRva2VuIGVycm9yIGZvciAnJWMnIChvcmRpbmFsICVkKSBpbiBVVEYtOCB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICBpLCBpKTsKICAgICAgICAgICAgZmFpbCh0ZXh0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoWE1MX0dldEVycm9yQ29kZShwYXJzZXIpICE9IFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOKQogICAgICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwogICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgc2luY2Ugd2UgdXNlIHRoZSBzYW1lIHBhcnNlciByZXBlYXRlZGx5LiAqLwogICAgICAgIFhNTF9QYXJzZXJSZXNldChwYXJzZXIsIE5VTEwpOwogICAgfQp9CkVORF9URVNUCgpTVEFSVF9URVNUKHRlc3RfdXRmMTYpCnsKICAgIC8qIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi0xNiI/PgogICAgICAgPGRvYyBhPScxMjMnPnNvbWUgdGV4dDwvZG9jPgogICAgKi8KICAgIGNoYXIgdGV4dFtdID0KICAgICAgICAiXDAwMDxcMDAwP1wwMDB4XDAwMG1cMDAwXDE1NFwwMDAgXDAwMHZcMDAwZVwwMDByXDAwMHNcMDAwaVwwMDBvIgogICAgICAgICJcMDAwblwwMDA9XDAwMCdcMDAwMVwwMDAuXDAwMFwwNjBcMDAwJ1wwMDAgXDAwMGVcMDAwblwwMDBjXDAwMG8iCiAgICAgICAgIlwwMDBkXDAwMGlcMDAwblwwMDBnXDAwMD1cMDAwJ1wwMDBVXDAwMFRcMDAwRlwwMDAtXDAwMDFcMDAwXDA2NiIKICAgICAgICAiXDAwMCdcMDAwP1wwMDA+XDAwMFxuIgogICAgICAgICJcMDAwPFwwMDBkXDAwMG9cMDAwY1wwMDAgXDAwMGFcMDAwPVwwMDAnXDAwMDFcMDAwMlwwMDAzXDAwMCciCiAgICAgICAgIlwwMDA+XDAwMHNcMDAwb1wwMDBtXDAwMGVcMDAwIFwwMDB0XDAwMGVcMDAweFwwMDB0XDAwMDxcMDAwLyIKICAgICAgICAiXDAwMGRcMDAwb1wwMDBjXDAwMD4iOwogICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHNpemVvZih0ZXh0KS0xLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgpTVEFSVF9URVNUKHRlc3RfdXRmMTZfbGVfZXBpbG9nX25ld2xpbmUpCnsKICAgIGludCBmaXJzdF9jaHVua19ieXRlcyA9IDE3OwogICAgY2hhciB0ZXh0W10gPSAKICAgICAgICAiXHhGRlx4RkUiICAgICAgICAgICAgICAgICAgICAgIC8qIEJPTSAqLwogICAgICAgICI8XDAwMGVcMDAwL1wwMDA+XDAwMCIgICAgICAgICAgLyogZG9jdW1lbnQgZWxlbWVudCAqLwogICAgICAgICJcclwwMDBcblwwMDBcclwwMDBcblwwMDAiOyAgICAgLyogZXBpbG9nICovCgogICAgaWYgKGZpcnN0X2NodW5rX2J5dGVzID49IHNpemVvZih0ZXh0KSAtIDEpCiAgICAgICAgZmFpbCgiYmFkIHZhbHVlIG9mIGZpcnN0X2NodW5rX2J5dGVzIik7CiAgICBpZiAoICBYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBmaXJzdF9jaHVua19ieXRlcywgWE1MX0ZBTFNFKQogICAgICAgICAgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwogICAgZWxzZSB7CiAgICAgICAgZW51bSBYTUxfU3RhdHVzIHJjOwogICAgICAgIHJjID0gWE1MX1BhcnNlKHBhcnNlciwgdGV4dCArIGZpcnN0X2NodW5rX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0ZXh0KSAtIGZpcnN0X2NodW5rX2J5dGVzIC0gMSwgWE1MX1RSVUUpOwogICAgICAgIGlmIChyYyA9PSBYTUxfU1RBVFVTX0VSUk9SKQogICAgICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwogICAgfQp9CkVORF9URVNUCgovKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNDgxNjA5LCAjNzc0MDI4LiAqLwpTVEFSVF9URVNUKHRlc3RfbGF0aW4xX3VtbGF1dHMpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCiAgICAgICAgIjxlIGE9J+Qg9iD8ICYjMjI4OyAmIzI0NjsgJiMyNTI7ICYjeDAwRTQ7ICYjeDBGNjsgJiN4RkM7ID4nXG4iCiAgICAgICAgIiAgPuQg9iD8ICYjMjI4OyAmIzI0NjsgJiMyNTI7ICYjeDAwRTQ7ICYjeDBGNjsgJiN4RkM7ID48L2U+IjsKICAgIGNoYXIgKnV0ZjggPQogICAgICAgICJceEMzXHhBNCBceEMzXHhCNiBceEMzXHhCQyAiCiAgICAgICAgIlx4QzNceEE0IFx4QzNceEI2IFx4QzNceEJDICIKICAgICAgICAiXHhDM1x4QTQgXHhDM1x4QjYgXHhDM1x4QkMgPiI7CiAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsIHV0ZjgpOwogICAgWE1MX1BhcnNlclJlc2V0KHBhcnNlciwgTlVMTCk7CiAgICBydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIHV0ZjgpOwp9CkVORF9URVNUCgovKiBSZWdyZXNzaW9uIHRlc3QgIzEgZm9yIFNGIGJ1ZyAjNjUzMTgwLiAqLwpTVEFSVF9URVNUKHRlc3RfbGluZV9udW1iZXJfYWZ0ZXJfcGFyc2UpCnsgIAogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjx0YWc+XG4iCiAgICAgICAgIlxuIgogICAgICAgICJcbjwvdGFnPiI7CiAgICBpbnQgbGluZW5vOwoKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9GQUxTRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwogICAgbGluZW5vID0gWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHBhcnNlcik7CiAgICBpZiAobGluZW5vICE9IDQpIHsKICAgICAgICBjaGFyIGJ1ZmZlclsxMDBdOwogICAgICAgIHNwcmludGYoYnVmZmVyLCAiZXhwZWN0ZWQgNCBsaW5lcywgc2F3ICVkIiwgbGluZW5vKTsKICAgICAgICBmYWlsKGJ1ZmZlcik7CiAgICB9Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCAjMiBmb3IgU0YgYnVnICM2NTMxODAuICovClNUQVJUX1RFU1QodGVzdF9jb2x1bW5fbnVtYmVyX2FmdGVyX3BhcnNlKQp7CiAgICBjaGFyICp0ZXh0ID0gIjx0YWc+PC90YWc+IjsKICAgIGludCBjb2xubzsKCiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfRkFMU0UpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKICAgIGNvbG5vID0gWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKTsKICAgIGlmIChjb2xubyAhPSAxMSkgewogICAgICAgIGNoYXIgYnVmZmVyWzEwMF07CiAgICAgICAgc3ByaW50ZihidWZmZXIsICJleHBlY3RlZCAxMSBjb2x1bW5zLCBzYXcgJWQiLCBjb2xubyk7CiAgICAgICAgZmFpbChidWZmZXIpOwogICAgfQp9CkVORF9URVNUCgpzdGF0aWMgdm9pZCBYTUxDQUxMCnN0YXJ0X2VsZW1lbnRfZXZlbnRfaGFuZGxlcjIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lLAoJCQkgICAgIGNvbnN0IFhNTF9DaGFyICoqYXR0cikKewogICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CiAgICBjaGFyIGJ1ZmZlclsxMDBdOwoKICAgIHNwcmludGYoYnVmZmVyLCAiPCVzPiBhdCBjb2w6JWQgbGluZTolZFxuIiwgbmFtZSwKCSAgICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihwYXJzZXIpLAoJICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpKTsKICAgIENoYXJEYXRhX0FwcGVuZFN0cmluZyhzdG9yYWdlLCBidWZmZXIpOwp9CgpzdGF0aWMgdm9pZCBYTUxDQUxMCmVuZF9lbGVtZW50X2V2ZW50X2hhbmRsZXIyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKewogICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CiAgICBjaGFyIGJ1ZmZlclsxMDBdOwoKICAgIHNwcmludGYoYnVmZmVyLCAiPC8lcz4gYXQgY29sOiVkIGxpbmU6JWRcbiIsIG5hbWUsCgkgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKSwKCSAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKSk7CiAgICBDaGFyRGF0YV9BcHBlbmRTdHJpbmcoc3RvcmFnZSwgYnVmZmVyKTsKfQoKLyogUmVncmVzc2lvbiB0ZXN0ICMzIGZvciBTRiBidWcgIzY1MzE4MC4gKi8KU1RBUlRfVEVTVCh0ZXN0X2xpbmVfYW5kX2NvbHVtbl9udW1iZXJzX2luc2lkZV9oYW5kbGVycykKewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjxhPlxuIiAgICAgICAgLyogVW5peCBlbmQtb2YtbGluZSAqLwogICAgICAgICIgIDxiPlxyXG4iICAgIC8qIFdpbmRvd3MgZW5kLW9mLWxpbmUgKi8KICAgICAgICAiICAgIDxjLz5cciIgICAvKiBNYWMgT1MgZW5kLW9mLWxpbmUgKi8KICAgICAgICAiICA8L2I+XG4iCiAgICAgICAgIiAgPGQ+XG4iCiAgICAgICAgIiAgICA8Zi8+XG4iCiAgICAgICAgIiAgPC9kPlxuIgogICAgICAgICI8L2E+IjsKICAgIGNoYXIgKmV4cGVjdGVkID0KICAgICAgICAiPGE+IGF0IGNvbDowIGxpbmU6MVxuIgogICAgICAgICI8Yj4gYXQgY29sOjIgbGluZToyXG4iCiAgICAgICAgIjxjPiBhdCBjb2w6NCBsaW5lOjNcbiIKICAgICAgICAiPC9jPiBhdCBjb2w6OCBsaW5lOjNcbiIKICAgICAgICAiPC9iPiBhdCBjb2w6MiBsaW5lOjRcbiIKICAgICAgICAiPGQ+IGF0IGNvbDoyIGxpbmU6NVxuIgogICAgICAgICI8Zj4gYXQgY29sOjQgbGluZTo2XG4iCiAgICAgICAgIjwvZj4gYXQgY29sOjggbGluZTo2XG4iCiAgICAgICAgIjwvZD4gYXQgY29sOjIgbGluZTo3XG4iCiAgICAgICAgIjwvYT4gYXQgY29sOjAgbGluZTo4XG4iOwogICAgQ2hhckRhdGEgc3RvcmFnZTsKCiAgICBDaGFyRGF0YV9Jbml0KCZzdG9yYWdlKTsKICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZzdG9yYWdlKTsKICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnRfZWxlbWVudF9ldmVudF9oYW5kbGVyMik7CiAgICBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIocGFyc2VyLCBlbmRfZWxlbWVudF9ldmVudF9oYW5kbGVyMik7CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwoKICAgIENoYXJEYXRhX0NoZWNrU3RyaW5nKCZzdG9yYWdlLCBleHBlY3RlZCk7IAp9CkVORF9URVNUCgovKiBSZWdyZXNzaW9uIHRlc3QgIzQgZm9yIFNGIGJ1ZyAjNjUzMTgwLiAqLwpTVEFSVF9URVNUKHRlc3RfbGluZV9udW1iZXJfYWZ0ZXJfZXJyb3IpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8YT5cbiIKICAgICAgICAiICA8Yj5cbiIKICAgICAgICAiICA8L2E+IjsgIC8qIG1pc3NpbmcgPC9iPiAqLwogICAgaW50IGxpbmVubzsKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9GQUxTRSkgIT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIHBhcnNlIGVycm9yIik7CgogICAgbGluZW5vID0gWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHBhcnNlcik7CiAgICBpZiAobGluZW5vICE9IDMpIHsKICAgICAgICBjaGFyIGJ1ZmZlclsxMDBdOwogICAgICAgIHNwcmludGYoYnVmZmVyLCAiZXhwZWN0ZWQgMyBsaW5lcywgc2F3ICVkIiwgbGluZW5vKTsKICAgICAgICBmYWlsKGJ1ZmZlcik7CiAgICB9Cn0KRU5EX1RFU1QKICAgIAovKiBSZWdyZXNzaW9uIHRlc3QgIzUgZm9yIFNGIGJ1ZyAjNjUzMTgwLiAqLwpTVEFSVF9URVNUKHRlc3RfY29sdW1uX251bWJlcl9hZnRlcl9lcnJvcikKewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjxhPlxuIgogICAgICAgICIgIDxiPlxuIgogICAgICAgICIgIDwvYT4iOyAgLyogbWlzc2luZyA8L2I+ICovCiAgICBpbnQgY29sbm87CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfRkFMU0UpICE9IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBwYXJzZSBlcnJvciIpOwoKICAgIGNvbG5vID0gWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKTsKICAgIGlmIChjb2xubyAhPSA0KSB7IAogICAgICAgIGNoYXIgYnVmZmVyWzEwMF07CiAgICAgICAgc3ByaW50ZihidWZmZXIsICJleHBlY3RlZCA0IGNvbHVtbnMsIHNhdyAlZCIsIGNvbG5vKTsKICAgICAgICBmYWlsKGJ1ZmZlcik7CiAgICB9Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0NzgzMzIuICovClNUQVJUX1RFU1QodGVzdF9yZWFsbHlfbG9uZ19saW5lcykKewogICAgLyogVGhpcyBwYXJzZXMgYW4gaW5wdXQgbGluZSBsb25nZXIgdGhhbiBJTklUX0RBVEFfQlVGX1NJWkUKICAgICAgIGNoYXJhY3RlcnMgbG9uZyAoZGVmaW5lZCB0byBiZSAxMDI0IGluIHhtbHBhcnNlLmMpLiAgV2UgdGFrZSBhCiAgICAgICByZWFsbHkgY2hlZXN5IGFwcHJvYWNoIHRvIGJ1aWxkaW5nIHRoZSBpbnB1dCBidWZmZXIsIGJlY2F1c2UKICAgICAgIHRoaXMgYXZvaWRzIHdyaXRpbmcgYnVncyBpbiBidWZmZXItZmlsbGluZyBjb2RlLgogICAgKi8KICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8ZT4iCiAgICAgICAgLyogNjQgY2hhcnMgKi8KICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAvKiB1bnRpbCB3ZSBoYXZlIGF0IGxlYXN0IDEwMjQgY2hhcmFjdGVycyBvbiB0aGUgbGluZTogKi8KICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKICAgICAgICAiPC9lPiI7CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgoKLyoKICogRWxlbWVudCBldmVudCB0ZXN0cy4KICovCgpzdGF0aWMgdm9pZCBYTUxDQUxMCmVuZF9lbGVtZW50X2V2ZW50X2hhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQp7CiAgICBDaGFyRGF0YSAqc3RvcmFnZSA9IChDaGFyRGF0YSAqKSB1c2VyRGF0YTsKICAgIENoYXJEYXRhX0FwcGVuZFN0cmluZyhzdG9yYWdlLCAiLyIpOwogICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgbmFtZSwgLTEpOwp9CgpTVEFSVF9URVNUKHRlc3RfZW5kX2VsZW1lbnRfZXZlbnRzKQp7CiAgICBjaGFyICp0ZXh0ID0gIjxhPjxiPjxjLz48L2I+PGQ+PGYvPjwvZD48L2E+IjsKICAgIGNoYXIgKmV4cGVjdGVkID0gIi9jL2IvZi9kL2EiOwogICAgQ2hhckRhdGEgc3RvcmFnZTsKCiAgICBDaGFyRGF0YV9Jbml0KCZzdG9yYWdlKTsKICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZzdG9yYWdlKTsKICAgIFhNTF9TZXRFbmRFbGVtZW50SGFuZGxlcihwYXJzZXIsIGVuZF9lbGVtZW50X2V2ZW50X2hhbmRsZXIpOwogICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKICAgIENoYXJEYXRhX0NoZWNrU3RyaW5nKCZzdG9yYWdlLCBleHBlY3RlZCk7Cn0KRU5EX1RFU1QKCgovKgogKiBBdHRyaWJ1dGUgdGVzdHMuCiAqLwoKLyogSGVscGVycyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdDsgdGhpcyBjaGVja3MgYW55ICJhdHRyIiBhbmQgInJlZnMiCiAgIGF0dHJpYnV0ZXMgdG8gbWFrZSBzdXJlIHdoaXRlc3BhY2UgaGFzIGJlZW4gbm9ybWFsaXplZC4KCiAgIFJldHVybiB0cnVlIGlmIHdoaXRlc3BhY2UgaGFzIGJlZW4gbm9ybWFsaXplZCBpbiBhIHN0cmluZywgdXNpbmcKICAgdGhlIHJ1bGVzIGZvciBhdHRyaWJ1dGUgdmFsdWUgbm9ybWFsaXphdGlvbi4gIFRoZSAnaXNfY2RhdGEnIGZsYWcKICAgaXMgbmVlZGVkIHNpbmNlIENEQVRBIGF0dHJpYnV0ZXMgZG9uJ3QgbmVlZCB0byBoYXZlIG11bHRpcGxlCiAgIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBjb2xsYXBzZWQgdG8gYSBzaW5nbGUgc3BhY2UsIHdoaWxlIG90aGVyCiAgIGF0dHJpYnV0ZSBkYXRhIHR5cGVzIGRvLiAgKFNlY3Rpb24gMy4zLjMgb2YgdGhlIHJlY29tbWVuZGF0aW9uLikKKi8Kc3RhdGljIGludAppc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoY29uc3QgWE1MX0NoYXIgKnMsIGludCBpc19jZGF0YSkKewogICAgaW50IGJsYW5rcyA9IDA7CiAgICBpbnQgYXRfc3RhcnQgPSAxOwogICAgd2hpbGUgKCpzKSB7CiAgICAgICAgaWYgKCpzID09ICcgJykKICAgICAgICAgICAgKytibGFua3M7CiAgICAgICAgZWxzZSBpZiAoKnMgPT0gJ1x0JyB8fCAqcyA9PSAnXG4nIHx8ICpzID09ICdccicpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoYXRfc3RhcnQpIHsKICAgICAgICAgICAgICAgIGF0X3N0YXJ0ID0gMDsKICAgICAgICAgICAgICAgIGlmIChibGFua3MgJiYgIWlzX2NkYXRhKQogICAgICAgICAgICAgICAgICAgIC8qIGlsbGVnYWwgbGVhZGluZyBibGFua3MgKi8KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChibGFua3MgPiAxICYmICFpc19jZGF0YSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBibGFua3MgPSAwOwogICAgICAgIH0KICAgICAgICArK3M7CiAgICB9CiAgICBpZiAoYmxhbmtzICYmICFpc19jZGF0YSkKICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiAxOwp9CgovKiBDaGVjayB0aGUgYXR0cmlidXRlIHdoaXRlc3BhY2UgY2hlY2tlcjogKi8Kc3RhdGljIHZvaWQKdGVzdGhlbHBlcl9pc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQodm9pZCkKewogICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjIiwgMCkpOwogICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjIiwgMSkpOwogICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjIGRlZiBnaGkiLCAwKSk7CiAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmMgZGVmIGdoaSIsIDEpKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCIgYWJjIGRlZiBnaGkiLCAwKSk7CiAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCIgYWJjIGRlZiBnaGkiLCAxKSk7CiAgICBhc3NlcnQoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjICBkZWYgZ2hpIiwgMCkpOwogICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjICBkZWYgZ2hpIiwgMSkpOwogICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyBkZWYgZ2hpICIsIDApKTsKICAgIGFzc2VydChpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyBkZWYgZ2hpICIsIDEpKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCIgIiwgMCkpOwogICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiICIsIDEpKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcdCIsIDApKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcdCIsIDEpKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcbiIsIDApKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcbiIsIDEpKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcciIsIDApKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcciIsIDEpKTsKICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmNcdCBkZWYiLCAxKSk7Cn0KCnN0YXRpYyB2b2lkIFhNTENBTEwKY2hlY2tfYXR0cl9jb250YWluc19ub3JtYWxpemVkX3doaXRlc3BhY2Uodm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCnsKICAgIGludCBpOwogICAgZm9yIChpID0gMDsgYXR0c1tpXSAhPSBOVUxMOyBpICs9IDIpIHsKICAgICAgICBjb25zdCBYTUxfQ2hhciAqYXR0cm5hbWUgPSBhdHRzW2ldOwogICAgICAgIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSA9IGF0dHNbaSArIDFdOwogICAgICAgIGlmIChzdHJjbXAoImF0dHIiLCBhdHRybmFtZSkgPT0gMAogICAgICAgICAgICB8fCBzdHJjbXAoImVudHMiLCBhdHRybmFtZSkgPT0gMAogICAgICAgICAgICB8fCBzdHJjbXAoInJlZnMiLCBhdHRybmFtZSkgPT0gMCkgewogICAgICAgICAgICBpZiAoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCh2YWx1ZSwgMCkpIHsKICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07CiAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgImF0dHJpYnV0ZSB2YWx1ZSBub3Qgbm9ybWFsaXplZDogJXM9JyVzJyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBmYWlsKGJ1ZmZlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KClNUQVJUX1RFU1QodGVzdF9hdHRyX3doaXRlc3BhY2Vfbm9ybWFsaXphdGlvbikKewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgogICAgICAgICIgIDwhQVRUTElTVCBkb2NcbiIKICAgICAgICAiICAgICAgICAgICAgYXR0ciBOTVRPS0VOUyAjUkVRVUlSRURcbiIKICAgICAgICAiICAgICAgICAgICAgZW50cyBFTlRJVElFUyAjUkVRVUlSRURcbiIKICAgICAgICAiICAgICAgICAgICAgcmVmcyBJRFJFRlMgICAjUkVRVUlSRUQ+XG4iCiAgICAgICAgIl0+XG4iCiAgICAgICAgIjxkb2MgYXR0cj0nICAgIGEgIGIgY1x0XHRkXHRlXHQnIHJlZnM9JyBpZC0xICAgXHQgIGlkLTJcdFx0JyAgXG4iCiAgICAgICAgIiAgICAgZW50cz0nIGVudC0xICAgXHRcclxuIgogICAgICAgICIgICAgICAgICAgICBlbnQtMiAgJyA+XG4iCiAgICAgICAgIiAgPGUgaWQ9J2lkLTEnLz5cbiIKICAgICAgICAiICA8ZSBpZD0naWQtMicvPlxuIgogICAgICAgICI8L2RvYz4iOwoKICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2F0dHJfY29udGFpbnNfbm9ybWFsaXplZF93aGl0ZXNwYWNlKTsKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQogICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cn0KRU5EX1RFU1QKCgovKgogKiBYTUwgZGVjbGFyYXRpb24gdGVzdHMuCiAqLwoKU1RBUlRfVEVTVCh0ZXN0X3htbGRlY2xfbWlzcGxhY2VkKQp7CiAgICBleHBlY3RfZmFpbHVyZSgiXG4iCiAgICAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+XG4iCiAgICAgICAgICAgICAgICAgICAiPGEvPiIsCiAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSSwKICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVwb3J0IG1pc3BsYWNlZCBYTUwgZGVjbGFyYXRpb24iKTsKfQpFTkRfVEVTVAoKLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzU4NDgzMi4gKi8Kc3RhdGljIGludCBYTUxDQUxMClVua25vd25FbmNvZGluZ0hhbmRsZXIodm9pZCAqZGF0YSxjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsWE1MX0VuY29kaW5nICppbmZvKQp7CiAgICBpZiAoc3RyY21wKGVuY29kaW5nLCJ1bnN1cHBvcnRlZC1lbmNvZGluZyIpID09IDApIHsKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpCiAgICAgICAgICAgIGluZm8tPm1hcFtpXSA9IGk7CiAgICAgICAgaW5mby0+ZGF0YSA9IE5VTEw7CiAgICAgICAgaW5mby0+Y29udmVydCA9IE5VTEw7CiAgICAgICAgaW5mby0+cmVsZWFzZSA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7CiAgICB9CiAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKfQoKU1RBUlRfVEVTVCh0ZXN0X3Vua25vd25fZW5jb2RpbmdfaW50ZXJuYWxfZW50aXR5KQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndW5zdXBwb3J0ZWQtZW5jb2RpbmcnPz5cbiIKICAgICAgICAiPCFET0NUWVBFIHRlc3QgWzwhRU5USVRZIGZvbyAnYmFyJz5dPlxuIgogICAgICAgICI8dGVzdCBhPScmZm9vOycvPiI7CgogICAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIocGFyc2VyLCBVbmtub3duRW5jb2RpbmdIYW5kbGVyLCBOVUxMKTsKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQogICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM2MjAxMDYuICovCnN0YXRpYyBpbnQgWE1MQ0FMTApleHRlcm5hbF9lbnRpdHlfbG9hZGVyX3NldF9lbmNvZGluZyhYTUxfUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKewogICAgLyogVGhpcyB0ZXh0IHNheXMgaXQncyBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZywgYnV0IGl0J3MgcmVhbGx5CiAgICAgICBVVEYtOCwgd2hpY2ggd2UgdGVsbCBFeHBhdCB1c2luZyBYTUxfU2V0RW5jb2RpbmcoKS4KICAgICovCiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPD94bWwgZW5jb2Rpbmc9J2lzby04ODU5LTMnPz4iCiAgICAgICAgIlx4QzNceEE5IjsKICAgIFhNTF9QYXJzZXIgZXh0cGFyc2VyOwoKICAgIGV4dHBhcnNlciA9IFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIE5VTEwpOwogICAgaWYgKGV4dHBhcnNlciA9PSBOVUxMKQogICAgICAgIGZhaWwoIkNvdWxkIG5vdCBjcmVhdGUgZXh0ZXJuYWwgZW50aXR5IHBhcnNlci4iKTsKICAgIGlmICghWE1MX1NldEVuY29kaW5nKGV4dHBhcnNlciwgInV0Zi04IikpCiAgICAgICAgZmFpbCgiWE1MX1NldEVuY29kaW5nKCkgaWdub3JlZCBmb3IgZXh0ZXJuYWwgZW50aXR5Iik7CiAgICBpZiAoICBYTUxfUGFyc2UoZXh0cGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKQogICAgICAgICAgPT0gWE1MX1NUQVRVU19FUlJPUikgewogICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKU1RBUlRfVEVTVCh0ZXN0X2V4dF9lbnRpdHlfc2V0X2VuY29kaW5nKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCiAgICAgICAgIiAgPCFFTlRJVFkgZW4gU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9kdW1teS5lbnQnPlxuIgogICAgICAgICJdPlxuIgogICAgICAgICI8ZG9jPiZlbjs8L2RvYz4iOwoKICAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9lbnRpdHlfbG9hZGVyX3NldF9lbmNvZGluZyk7CiAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsICJceEMzXHhBOSIpOwp9CkVORF9URVNUCgovKiBUZXN0IHRoYXQgbm8gZXJyb3IgaXMgcmVwb3J0ZWQgZm9yIHVua25vd24gZW50aXRpZXMgaWYgd2UgZG9uJ3QKICAgcmVhZCBhbiBleHRlcm5hbCBzdWJzZXQuICBUaGlzIHdhcyBmaXhlZCBpbiBFeHBhdCAxLjk1LjUuCiovClNUQVJUX1RFU1QodGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfdW5yZWFkX2V4dGVybmFsX3N1YnNldCkgewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgogICAgICAgICI8ZG9jPiZlbnRpdHk7PC9kb2M+IjsKCiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgovKiBUZXN0IHRoYXQgYW4gZXJyb3IgaXMgcmVwb3J0ZWQgZm9yIHVua25vd24gZW50aXRpZXMgaWYgd2UgZG9uJ3QKICAgaGF2ZSBhbiBleHRlcm5hbCBzdWJzZXQuCiovClNUQVJUX1RFU1QodGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfbm9fZXh0ZXJuYWxfc3Vic2V0KSB7CiAgICBleHBlY3RfZmFpbHVyZSgiPGRvYz4mZW50aXR5OzwvZG9jPiIsCiAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWSwKICAgICAgICAgICAgICAgICAgICJQYXJzZXIgZGlkIG5vdCByZXBvcnQgdW5kZWZpbmVkIGVudGl0eSB3L291dCBhIERURC4iKTsKfQpFTkRfVEVTVAoKLyogVGVzdCB0aGF0IGFuIGVycm9yIGlzIHJlcG9ydGVkIGZvciB1bmtub3duIGVudGl0aWVzIGlmIHdlIGRvbid0CiAgIHJlYWQgYW4gZXh0ZXJuYWwgc3Vic2V0LCBidXQgaGF2ZSBiZWVuIGRlY2xhcmVkIHN0YW5kYWxvbmUuCiovClNUQVJUX1RFU1QodGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfc3RhbmRhbG9uZSkgewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3VzLWFzY2lpJyBzdGFuZGFsb25lPSd5ZXMnPz5cbiIKICAgICAgICAiPCFET0NUWVBFIGRvYyBTWVNURU0gJ2Zvbyc+XG4iCiAgICAgICAgIjxkb2M+JmVudGl0eTs8L2RvYz4iOwoKICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCiAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWSwKICAgICAgICAgICAgICAgICAgICJQYXJzZXIgZGlkIG5vdCByZXBvcnQgdW5kZWZpbmVkIGVudGl0eSAoc3RhbmRhbG9uZSkuIik7Cn0KRU5EX1RFU1QKCnN0YXRpYyBpbnQgWE1MQ0FMTApleHRlcm5hbF9lbnRpdHlfbG9hZGVyKFhNTF9QYXJzZXIgcGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCnsKICAgIGNoYXIgKnRleHQgPSAoY2hhciAqKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOwogICAgWE1MX1BhcnNlciBleHRwYXJzZXI7CgogICAgZXh0cGFyc2VyID0gWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHBhcnNlciwgY29udGV4dCwgTlVMTCk7CiAgICBpZiAoZXh0cGFyc2VyID09IE5VTEwpCiAgICAgICAgZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBleHRlcm5hbCBlbnRpdHkgcGFyc2VyLiIpOwogICAgaWYgKCAgWE1MX1BhcnNlKGV4dHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkKICAgICAgICAgID09IFhNTF9TVEFUVVNfRVJST1IpIHsKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwogICAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwogICAgfQogICAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7Cn0KCi8qIFRlc3QgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgdW5rbm93biBlbnRpdGllcyBpZiB3ZSBoYXZlIHJlYWQKICAgYW4gZXh0ZXJuYWwgc3Vic2V0LCBhbmQgc3RhbmRhbG9uZSBpcyB0cnVlLgoqLwpTVEFSVF9URVNUKHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3dpdGhfZXh0ZXJuYWxfc3Vic2V0X3N0YW5kYWxvbmUpIHsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1cy1hc2NpaScgc3RhbmRhbG9uZT0neWVzJz8+XG4iCiAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgogICAgICAgICI8ZG9jPiZlbnRpdHk7PC9kb2M+IjsKICAgIGNoYXIgKmZvb190ZXh0ID0KICAgICAgICAiPCFFTEVNRU5UIGRvYyAoI1BDREFUQSkqPiI7CgogICAgWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhwYXJzZXIsIFhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19BTFdBWVMpOwogICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgZm9vX3RleHQpOwogICAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsIGV4dGVybmFsX2VudGl0eV9sb2FkZXIpOwogICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZLAogICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCB1bmRlZmluZWQgZW50aXR5IChleHRlcm5hbCBEVEQpLiIpOwp9CkVORF9URVNUCgovKiBUZXN0IHRoYXQgbm8gZXJyb3IgaXMgcmVwb3J0ZWQgZm9yIHVua25vd24gZW50aXRpZXMgaWYgd2UgaGF2ZSByZWFkCiAgIGFuIGV4dGVybmFsIHN1YnNldCwgYW5kIHN0YW5kYWxvbmUgaXMgZmFsc2UuCiovClNUQVJUX1RFU1QodGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfd2l0aF9leHRlcm5hbF9zdWJzZXQpIHsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1cy1hc2NpaSc/PlxuIgogICAgICAgICI8IURPQ1RZUEUgZG9jIFNZU1RFTSAnZm9vJz5cbiIKICAgICAgICAiPGRvYz4mZW50aXR5OzwvZG9jPiI7CiAgICBjaGFyICpmb29fdGV4dCA9CiAgICAgICAgIjwhRUxFTUVOVCBkb2MgKCNQQ0RBVEEpKj4iOwoKICAgIFhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcocGFyc2VyLCBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTKTsKICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIGZvb190ZXh0KTsKICAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLCBleHRlcm5hbF9lbnRpdHlfbG9hZGVyKTsKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQogICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cn0KRU5EX1RFU1QKClNUQVJUX1RFU1QodGVzdF93ZmNfbm9fcmVjdXJzaXZlX2VudGl0eV9yZWZzKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCiAgICAgICAgIiAgPCFFTlRJVFkgZW50aXR5ICcmIzM4O2VudGl0eTsnPlxuIgogICAgICAgICJdPlxuIgogICAgICAgICI8ZG9jPiZlbnRpdHk7PC9kb2M+IjsKCiAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAogICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGLAogICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZS4iKTsKfQpFTkRfVEVTVAoKLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzQ4MzUxNC4gKi8KU1RBUlRfVEVTVCh0ZXN0X2R0ZF9kZWZhdWx0X2hhbmRsaW5nKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCiAgICAgICAgIjwhRU5USVRZIGUgU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9lJz5cbiIKICAgICAgICAiPCFOT1RBVElPTiBuIFNZU1RFTSAnaHR0cDovL3htbC5saWJleHBhdC5vcmcvbic+XG4iCiAgICAgICAgIjwhRUxFTUVOVCBkb2MgRU1QVFk+XG4iCiAgICAgICAgIjwhQVRUTElTVCBkb2MgYSBDREFUQSAjSU1QTElFRD5cbiIKICAgICAgICAiPD9waSBpbiBkdGQ/PlxuIgogICAgICAgICI8IS0tY29tbWVudCBpbiBkdGQtLT5cbiIKICAgICAgICAiXT48ZG9jLz4iOwoKICAgIFhNTF9TZXREZWZhdWx0SGFuZGxlcihwYXJzZXIsIGFjY3VtdWxhdGVfY2hhcmFjdGVycyk7CiAgICBYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfc3RhcnRfZG9jdHlwZV9oYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV9lbmRfZG9jdHlwZV9oYW5kbGVyKTsKICAgIFhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcihwYXJzZXIsIGR1bW15X2VudGl0eV9kZWNsX2hhbmRsZXIpOwogICAgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIocGFyc2VyLCBkdW1teV9ub3RhdGlvbl9kZWNsX2hhbmRsZXIpOwogICAgWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihwYXJzZXIsIGR1bW15X2VsZW1lbnRfZGVjbF9oYW5kbGVyKTsKICAgIFhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIocGFyc2VyLCBkdW1teV9hdHRsaXN0X2RlY2xfaGFuZGxlcik7CiAgICBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihwYXJzZXIsIGR1bW15X3BpX2hhbmRsZXIpOwogICAgWE1MX1NldENvbW1lbnRIYW5kbGVyKHBhcnNlciwgZHVtbXlfY29tbWVudF9oYW5kbGVyKTsKICAgIHJ1bl9jaGFyYWN0ZXJfY2hlY2sodGV4dCwgIlxuXG5cblxuXG5cblxuPGRvYy8+Iik7Cn0KRU5EX1RFU1QKCi8qIFNlZSByZWxhdGVkIFNGIGJ1ZyAjNjczNzkxLgogICBXaGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIHNldHRpbmcgdGhlIG5hbWVzcGFjZSBVUkkgZm9yCiAgIGEgcHJlZml4IGlzIG5vdCBhbGxvd2VkOyB0aGlzIHRlc3QgZW5zdXJlcyB0aGF0IGl0ICppcyogYWxsb3dlZAogICB3aGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIG5vdCBlbmFibGVkLgogICAoU2VlIE5hbWVzcGFjZXMgaW4gWE1MLCBzZWN0aW9uIDIuKQoqLwpTVEFSVF9URVNUKHRlc3RfZW1wdHlfbnNfd2l0aG91dF9uYW1lc3BhY2VzKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPGRvYyB4bWxuczpwcmVmaXg9J2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vJz5cbiIKICAgICAgICAiICA8ZSB4bWxuczpwcmVmaXg9JycvPlxuIgogICAgICAgICI8L2RvYz4iOwoKICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQogICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM4MjQ0MjAuCiAgIENoZWNrcyB0aGF0IGFuIHhtbG5zOnByZWZpeCBhdHRyaWJ1dGUgc2V0IGluIGFuIGF0dHJpYnV0ZSdzIGRlZmF1bHQKICAgdmFsdWUgaXNuJ3QgbWlzaW50ZXJwcmV0ZWQuCiovClNUQVJUX1RFU1QodGVzdF9uc19pbl9hdHRyaWJ1dGVfZGVmYXVsdF93aXRob3V0X25hbWVzcGFjZXMpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8IURPQ1RZUEUgZTplbGVtZW50IFtcbiIKICAgICAgICAiICA8IUFUVExJU1QgZTplbGVtZW50XG4iCiAgICAgICAgIiAgICB4bWxuczplIENEQVRBICdodHRwOi8vZXhhbXBsZS5jb20vJz5cbiIKICAgICAgICAiICAgICAgXT5cbiIKICAgICAgICAiPGU6ZWxlbWVudC8+IjsKCiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgoKLyoKICogTmFtZXNwYWNlcyB0ZXN0cy4KICovCgpzdGF0aWMgdm9pZApuYW1lc3BhY2Vfc2V0dXAodm9pZCkKewogICAgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZU5TKE5VTEwsICcgJyk7CiAgICBpZiAocGFyc2VyID09IE5VTEwpCiAgICAgICAgZmFpbCgiUGFyc2VyIG5vdCBjcmVhdGVkLiIpOwp9CgpzdGF0aWMgdm9pZApuYW1lc3BhY2VfdGVhcmRvd24odm9pZCkKewogICAgYmFzaWNfdGVhcmRvd24oKTsKfQoKLyogQ2hlY2sgdGhhdCBhbiBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZSBuYW1lIG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZXMuCiAgIFRoZSBleHBlY3RlZCB2YWx1ZXMgYXJlIHBhc3NlZCBhcyBhbiBhcnJheSByZWZlcmVuY2Ugb2Ygc3RyaW5nIHBvaW50ZXJzCiAgIHByb3ZpZGVkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudDsgdGhlIGZpcnN0IGlzIHRoZSBleHBlY3RlZAogICBlbGVtZW50IG5hbWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBleHBlY3RlZCBhdHRyaWJ1dGUgbmFtZS4KKi8Kc3RhdGljIHZvaWQgWE1MQ0FMTAp0cmlwbGV0X3N0YXJ0X2NoZWNrZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQp7CiAgICBjaGFyICoqZWxlbXN0ciA9IChjaGFyICoqKXVzZXJEYXRhOwogICAgY2hhciBidWZmZXJbMTAyNF07CiAgICBpZiAoc3RyY21wKGVsZW1zdHJbMF0sIG5hbWUpICE9IDApIHsKICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgInVuZXhwZWN0ZWQgc3RhcnQgc3RyaW5nOiAnJXMnIiwgbmFtZSk7CiAgICAgICAgZmFpbChidWZmZXIpOwogICAgfQogICAgaWYgKHN0cmNtcChlbGVtc3RyWzFdLCBhdHRzWzBdKSAhPSAwKSB7CiAgICAgICAgc3ByaW50ZihidWZmZXIsICJ1bmV4cGVjdGVkIGF0dHJpYnV0ZSBzdHJpbmc6ICclcyciLCBhdHRzWzBdKTsKICAgICAgICBmYWlsKGJ1ZmZlcik7CiAgICB9Cn0KCi8qIENoZWNrIHRoYXQgdGhlIGVsZW1lbnQgbmFtZSBwYXNzZWQgdG8gdGhlIGVuZC1lbGVtZW50IGhhbmRsZXIgbWF0Y2hlcwogICB0aGUgZXhwZWN0ZWQgdmFsdWUuICBUaGUgZXhwZWN0ZWQgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBlbGVtZW50CiAgIGluIGFuIGFycmF5IG9mIHN0cmluZ3MgcGFzc2VkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudC4KKi8Kc3RhdGljIHZvaWQgWE1MQ0FMTAp0cmlwbGV0X2VuZF9jaGVja2VyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKewogICAgY2hhciAqKmVsZW1zdHIgPSAoY2hhciAqKil1c2VyRGF0YTsKICAgIGlmIChzdHJjbXAoZWxlbXN0clswXSwgbmFtZSkgIT0gMCkgewogICAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOwogICAgICAgIHNwcmludGYoYnVmZmVyLCAidW5leHBlY3RlZCBlbmQgc3RyaW5nOiAnJXMnIiwgbmFtZSk7CiAgICAgICAgZmFpbChidWZmZXIpOwogICAgfQp9CgpTVEFSVF9URVNUKHRlc3RfcmV0dXJuX25zX3RyaXBsZXQpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8Zm9vOmUgeG1sbnM6Zm9vPSdodHRwOi8vZXhwYXQuc2YubmV0LycgYmFyOmE9JzEyJ1xuIgogICAgICAgICIgICAgICAgeG1sbnM6YmFyPSdodHRwOi8vZXhwYXQuc2YubmV0Lyc+PC9mb286ZT4iOwogICAgY2hhciAqZWxlbXN0cltdID0gewogICAgICAgICJodHRwOi8vZXhwYXQuc2YubmV0LyBlIGZvbyIsCiAgICAgICAgImh0dHA6Ly9leHBhdC5zZi5uZXQvIGEgYmFyIgogICAgfTsKICAgIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQocGFyc2VyLCBYTUxfVFJVRSk7CiAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCBlbGVtc3RyKTsKICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHRyaXBsZXRfc3RhcnRfY2hlY2tlciwgdHJpcGxldF9lbmRfY2hlY2tlcik7CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgpzdGF0aWMgdm9pZCBYTUxDQUxMCm92ZXJ3cml0ZV9zdGFydF9jaGVja2VyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQp7CiAgICBDaGFyRGF0YSAqc3RvcmFnZSA9IChDaGFyRGF0YSAqKSB1c2VyRGF0YTsKICAgIENoYXJEYXRhX0FwcGVuZFN0cmluZyhzdG9yYWdlLCAic3RhcnQgIik7CiAgICBDaGFyRGF0YV9BcHBlbmRYTUxDaGFycyhzdG9yYWdlLCBuYW1lLCAtMSk7CiAgICB3aGlsZSAoKmF0dHMgIT0gTlVMTCkgewogICAgICAgIENoYXJEYXRhX0FwcGVuZFN0cmluZyhzdG9yYWdlLCAiXG5hdHRyaWJ1dGUgIik7CiAgICAgICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgKmF0dHMsIC0xKTsKICAgICAgICBhdHRzICs9IDI7CiAgICB9CiAgICBDaGFyRGF0YV9BcHBlbmRTdHJpbmcoc3RvcmFnZSwgIlxuIik7Cn0KCnN0YXRpYyB2b2lkIFhNTENBTEwKb3ZlcndyaXRlX2VuZF9jaGVja2VyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKewogICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CiAgICBDaGFyRGF0YV9BcHBlbmRTdHJpbmcoc3RvcmFnZSwgImVuZCAiKTsKICAgIENoYXJEYXRhX0FwcGVuZFhNTENoYXJzKHN0b3JhZ2UsIG5hbWUsIC0xKTsKICAgIENoYXJEYXRhX0FwcGVuZFN0cmluZyhzdG9yYWdlLCAiXG4iKTsKfQoKc3RhdGljIHZvaWQKcnVuX25zX3RhZ25hbWVfb3ZlcndyaXRlX3Rlc3QoY2hhciAqdGV4dCwgY2hhciAqcmVzdWx0KQp7CiAgICBDaGFyRGF0YSBzdG9yYWdlOwogICAgQ2hhckRhdGFfSW5pdCgmc3RvcmFnZSk7CiAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmc3RvcmFnZSk7CiAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZV9zdGFydF9jaGVja2VyLCBvdmVyd3JpdGVfZW5kX2NoZWNrZXIpOwogICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKICAgIENoYXJEYXRhX0NoZWNrU3RyaW5nKCZzdG9yYWdlLCByZXN1bHQpOwp9CgovKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNTY2MzM0LiAqLwpTVEFSVF9URVNUKHRlc3RfbnNfdGFnbmFtZV9vdmVyd3JpdGUpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8bjplIHhtbG5zOm49J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCiAgICAgICAgIiAgPG46ZiBuOmF0dHI9J2ZvbycvPlxuIgogICAgICAgICIgIDxuOmcgbjphdHRyMj0nYmFyJy8+XG4iCiAgICAgICAgIjwvbjplPiI7CiAgICBjaGFyICpyZXN1bHQgPQogICAgICAgICJzdGFydCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZVxuIgogICAgICAgICJzdGFydCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZlxuIgogICAgICAgICJhdHRyaWJ1dGUgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGF0dHJcbiIKICAgICAgICAiZW5kIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBmXG4iCiAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBnXG4iCiAgICAgICAgImF0dHJpYnV0ZSBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gYXR0cjJcbiIKICAgICAgICAiZW5kIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBnXG4iCiAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZVxuIjsKICAgIHJ1bl9uc190YWduYW1lX292ZXJ3cml0ZV90ZXN0KHRleHQsIHJlc3VsdCk7Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM1NjYzMzQuICovClNUQVJUX1RFU1QodGVzdF9uc190YWduYW1lX292ZXJ3cml0ZV90cmlwbGV0KQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPG46ZSB4bWxuczpuPSdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8nPlxuIgogICAgICAgICIgIDxuOmYgbjphdHRyPSdmb28nLz5cbiIKICAgICAgICAiICA8bjpnIG46YXR0cjI9J2JhcicvPlxuIgogICAgICAgICI8L246ZT4iOwogICAgY2hhciAqcmVzdWx0ID0KICAgICAgICAic3RhcnQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGUgblxuIgogICAgICAgICJzdGFydCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZiBuXG4iCiAgICAgICAgImF0dHJpYnV0ZSBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gYXR0ciBuXG4iCiAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZiBuXG4iCiAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBnIG5cbiIKICAgICAgICAiYXR0cmlidXRlIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBhdHRyMiBuXG4iCiAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZyBuXG4iCiAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZSBuXG4iOwogICAgWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIFhNTF9UUlVFKTsKICAgIHJ1bl9uc190YWduYW1lX292ZXJ3cml0ZV90ZXN0KHRleHQsIHJlc3VsdCk7Cn0KRU5EX1RFU1QKCgovKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjIwMzQzLiAqLwpzdGF0aWMgdm9pZCBYTUxDQUxMCnN0YXJ0X2VsZW1lbnRfZmFpbCh2b2lkICp1c2VyRGF0YSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLCBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCnsKICAgIC8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4gKi8KICAgIGZhaWwoInNob3VsZCBuZXZlciByZWFjaCBzdGFydF9lbGVtZW50X2ZhaWwoKSIpOwp9CgpzdGF0aWMgdm9pZCBYTUxDQUxMCnN0YXJ0X25zX2NsZWFyaW5nX3N0YXJ0X2VsZW1lbnQodm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKQp7CiAgICBYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcigoWE1MX1BhcnNlcikgdXNlckRhdGEsIE5VTEwpOwp9CgpTVEFSVF9URVNUKHRlc3Rfc3RhcnRfbnNfY2xlYXJzX3N0YXJ0X2VsZW1lbnQpCnsKICAgIC8qIFRoaXMgbmVlZHMgdG8gdXNlIHNlcGFyYXRlIHN0YXJ0L2VuZCB0YWdzOyB1c2luZyB0aGUgZW1wdHkgdGFnCiAgICAgICBzeW50YXggZG9lc24ndCBjYXVzZSB0aGUgcHJvYmxlbWF0aWMgcGF0aCB0aHJvdWdoIEV4cGF0IHRvIGJlCiAgICAgICB0YWtlbi4KICAgICovCiAgICBjaGFyICp0ZXh0ID0gIjxlIHhtbG5zPSdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8nPjwvZT4iOwoKICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnRfZWxlbWVudF9mYWlsKTsKICAgIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnRfbnNfY2xlYXJpbmdfc3RhcnRfZWxlbWVudCk7CiAgICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHBhcnNlcik7CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgovKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjE2ODYzLiAqLwpzdGF0aWMgaW50IFhNTENBTEwKZXh0ZXJuYWxfZW50aXR5X2hhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpIAp7CiAgICBpbnQgY2FsbG5vID0gMSArIChpbnQpWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CiAgICBjaGFyICp0ZXh0OwogICAgWE1MX1BhcnNlciBwMjsKCiAgICBpZiAoY2FsbG5vID09IDEpCiAgICAgICAgdGV4dCA9ICgiPCFFTEVNRU5UIGRvYyAoZSspPlxuIgogICAgICAgICAgICAgICAgIjwhQVRUTElTVCBkb2MgeG1sbnMgQ0RBVEEgI0lNUExJRUQ+XG4iCiAgICAgICAgICAgICAgICAiPCFFTEVNRU5UIGUgRU1QVFk+XG4iKTsKICAgIGVsc2UKICAgICAgICB0ZXh0ID0gKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1cy1hc2NpaSc/PiIKICAgICAgICAgICAgICAgICI8ZS8+Iik7CgogICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgKHZvaWQgKikgY2FsbG5vKTsKICAgIHAyID0gWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHBhcnNlciwgY29udGV4dCwgTlVMTCk7CiAgICBpZiAoWE1MX1BhcnNlKHAyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKSB7CiAgICAgICAgeG1sX2ZhaWx1cmUocDIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgWE1MX1BhcnNlckZyZWUocDIpOwogICAgcmV0dXJuIDE7Cn0KClNUQVJUX1RFU1QodGVzdF9kZWZhdWx0X25zX2Zyb21fZXh0X3N1YnNldF9hbmRfZXh0X2dlKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+XG4iCiAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9kb2MuZHRkJyBbXG4iCiAgICAgICAgIiAgPCFFTlRJVFkgZW4gU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9lbnRpdHkuZW50Jz5cbiIKICAgICAgICAiXT5cbiIKICAgICAgICAiPGRvYyB4bWxucz0naHR0cDovL3htbC5saWJleHBhdC5vcmcvbnMxJz5cbiIKICAgICAgICAiJmVuO1xuIgogICAgICAgICI8L2RvYz4iOwoKICAgIFhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcocGFyc2VyLCBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTKTsKICAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLCBleHRlcm5hbF9lbnRpdHlfaGFuZGxlcik7CiAgICAvKiBXZSBhY3R1YWxseSBuZWVkIHRvIHNldCB0aGlzIGhhbmRsZXIgdG8gdGlja2xlIHRoaXMgYnVnLiAqLwogICAgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBkdW1teV9zdGFydF9lbGVtZW50KTsKICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIE5VTEwpOwogICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKfQpFTkRfVEVTVAoKLyogUmVncmVzc2lvbiB0ZXN0ICMxIGZvciBTRiBidWcgIzY3Mzc5MS4gKi8KU1RBUlRfVEVTVCh0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV8xKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPGRvYyB4bWxuczpwcmVmaXg9J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCiAgICAgICAgIiAgPGUgeG1sbnM6cHJlZml4PScnLz5cbiIKICAgICAgICAiPC9kb2M+IjsKCiAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAogICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1VOREVDTEFSSU5HX1BSRUZJWCwKICAgICAgICAgICAgICAgICAgICJEaWQgbm90IHJlcG9ydCByZS1zZXR0aW5nIG5hbWVzcGFjZSIKICAgICAgICAgICAgICAgICAgICIgVVJJIHdpdGggcHJlZml4IHRvICcnLiIpOwp9CkVORF9URVNUCgovKiBSZWdyZXNzaW9uIHRlc3QgIzIgZm9yIFNGIGJ1ZyAjNjczNzkxLiAqLwpTVEFSVF9URVNUKHRlc3RfbnNfcHJlZml4X3dpdGhfZW1wdHlfdXJpXzIpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnPz5cbiIKICAgICAgICAiPGRvY2VsZW0geG1sbnM6cHJlPScnLz4iOwoKICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCiAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5ERUNMQVJJTkdfUFJFRklYLAogICAgICAgICAgICAgICAgICAgIkRpZCBub3QgcmVwb3J0IHNldHRpbmcgbmFtZXNwYWNlIFVSSSB3aXRoIHByZWZpeCB0byAnJy4iKTsKfQpFTkRfVEVTVAoKLyogUmVncmVzc2lvbiB0ZXN0ICMzIGZvciBTRiBidWcgIzY3Mzc5MS4gKi8KU1RBUlRfVEVTVCh0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV8zKQp7CiAgICBjaGFyICp0ZXh0ID0KICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCiAgICAgICAgIiAgPCFFTEVNRU5UIGRvYyBFTVBUWT5cbiIKICAgICAgICAiICA8IUFUVExJU1QgZG9jXG4iCiAgICAgICAgIiAgICB4bWxuczpwcmVmaXggQ0RBVEEgJyc+XG4iCiAgICAgICAgIl0+XG4iCiAgICAgICAgIjxkb2MvPiI7CgogICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkRFQ0xBUklOR19QUkVGSVgsCiAgICAgICAgICAgICAgICAgICAiRGlkbid0IHJlcG9ydCBhdHRyIGRlZmF1bHQgc2V0dGluZyBOUyB3LyBwcmVmaXggdG8gJycuIik7Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCAjNCBmb3IgU0YgYnVnICM2NzM3OTEuICovClNUQVJUX1RFU1QodGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfNCkKewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgogICAgICAgICIgIDwhRUxFTUVOVCBwcmVmaXg6ZG9jIEVNUFRZPlxuIgogICAgICAgICIgIDwhQVRUTElTVCBwcmVmaXg6ZG9jXG4iCiAgICAgICAgIiAgICB4bWxuczpwcmVmaXggQ0RBVEEgJ2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCiAgICAgICAgIl0+XG4iCiAgICAgICAgIjxwcmVmaXg6ZG9jLz4iOwogICAgLyogUGFja2FnZWQgaW5mbyBleHBlY3RlZCBieSB0aGUgZW5kIGVsZW1lbnQgaGFuZGxlcjsKICAgICAgIHRoZSB3ZWlyZCBzdHJ1Y3R1cmluZyBsZXRzIHVzIHJlLXVzZSB0aGUgdHJpcGxldF9lbmRfY2hlY2tlcigpCiAgICAgICBmdW5jdGlvbiBhbHNvIHVzZWQgZm9yIGFub3RoZXIgdGVzdC4gKi8KICAgIGNoYXIgKmVsZW1zdHJbXSA9IHsKICAgICAgICAiaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGRvYyBwcmVmaXgiCiAgICB9OwogICAgWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIFhNTF9UUlVFKTsKICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIGVsZW1zdHIpOwogICAgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgdHJpcGxldF9lbmRfY2hlY2tlcik7CiAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOwp9CkVORF9URVNUCgpTVEFSVF9URVNUKHRlc3RfbnNfZGVmYXVsdF93aXRoX2VtcHR5X3VyaSkKewogICAgY2hhciAqdGV4dCA9CiAgICAgICAgIjxkb2MgeG1sbnM9J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCiAgICAgICAgIiAgPGUgeG1sbnM9JycvPlxuIgogICAgICAgICI8L2RvYz4iOwogICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCiAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKfQpFTkRfVEVTVAoKLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzY5Mjk2NDogdHdvIHByZWZpeGVzIGZvciBvbmUgbmFtZXNwYWNlLiAqLwpTVEFSVF9URVNUKHRlc3RfbnNfZHVwbGljYXRlX2F0dHJzX2RpZmZfcHJlZml4ZXMpCnsKICAgIGNoYXIgKnRleHQgPQogICAgICAgICI8ZG9jIHhtbG5zOmE9J2h0dHA6Ly94bWwubGliZXhwYXQub3JnL2EnXG4iCiAgICAgICAgIiAgICAgeG1sbnM6Yj0naHR0cDovL3htbC5saWJleHBhdC5vcmcvYSdcbiIKICAgICAgICAiICAgICBhOmE9J3YnIGI6YT0ndicgLz4iOwogICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9EVVBMSUNBVEVfQVRUUklCVVRFLAogICAgICAgICAgICAgICAgICAgImRpZCBub3QgcmVwb3J0IG11bHRpcGxlIGF0dHJpYnV0ZXMgd2l0aCBzYW1lIFVSSStuYW1lIik7Cn0KRU5EX1RFU1QKCi8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM2OTU0MDE6IHVuYm91bmQgcHJlZml4LiAqLwpTVEFSVF9URVNUKHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fYXR0cmlidXRlKQp7CiAgICBjaGFyICp0ZXh0ID0gIjxkb2MgYTphdHRyPScnLz4iOwogICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWCwKICAgICAgICAgICAgICAgICAgICJkaWQgbm90IHJlcG9ydCB1bmJvdW5kIHByZWZpeCBvbiBhdHRyaWJ1dGUiKTsKfQpFTkRfVEVTVAoKLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzY5NTQwMTogdW5ib3VuZCBwcmVmaXguICovClNUQVJUX1RFU1QodGVzdF9uc191bmJvdW5kX3ByZWZpeF9vbl9lbGVtZW50KQp7CiAgICBjaGFyICp0ZXh0ID0gIjxhOmRvYy8+IjsKICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCiAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5CT1VORF9QUkVGSVgsCiAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCByZXBvcnQgdW5ib3VuZCBwcmVmaXggb24gZWxlbWVudCIpOwp9CkVORF9URVNUCgpzdGF0aWMgU3VpdGUgKgptYWtlX3N1aXRlKHZvaWQpCnsKICAgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlKCJiYXNpYyIpOwogICAgVENhc2UgKnRjX2Jhc2ljID0gdGNhc2VfY3JlYXRlKCJiYXNpYyB0ZXN0cyIpOwogICAgVENhc2UgKnRjX25hbWVzcGFjZSA9IHRjYXNlX2NyZWF0ZSgiWE1MIG5hbWVzcGFjZXMiKTsKCiAgICBzdWl0ZV9hZGRfdGNhc2UocywgdGNfYmFzaWMpOwogICAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSh0Y19iYXNpYywgYmFzaWNfc2V0dXAsIGJhc2ljX3RlYXJkb3duKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X251bF9ieXRlKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3UwMDAwX2NoYXIpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYm9tX3V0ZjgpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYm9tX3V0ZjE2X2JlKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2JvbV91dGYxNl9sZSk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9pbGxlZ2FsX3V0ZjgpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfdXRmMTYpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfdXRmMTZfbGVfZXBpbG9nX25ld2xpbmUpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfbGF0aW4xX3VtbGF1dHMpOwogICAgLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzQ5MTk4Ni4gKi8KICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2RhbmlzaF9sYXRpbjEpOwogICAgLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzUxNDI4MS4gKi8KICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2ZyZW5jaF9jaGFycmVmX2hleGlkZWNpbWFsKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2ZyZW5jaF9jaGFycmVmX2RlY2ltYWwpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZnJlbmNoX2xhdGluMSk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9mcmVuY2hfdXRmOCk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF91dGY4X2ZhbHNlX3JlamVjdGlvbik7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9saW5lX251bWJlcl9hZnRlcl9wYXJzZSk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9jb2x1bW5fbnVtYmVyX2FmdGVyX3BhcnNlKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2xpbmVfYW5kX2NvbHVtbl9udW1iZXJzX2luc2lkZV9oYW5kbGVycyk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9saW5lX251bWJlcl9hZnRlcl9lcnJvcik7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9jb2x1bW5fbnVtYmVyX2FmdGVyX2Vycm9yKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3JlYWxseV9sb25nX2xpbmVzKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2VuZF9lbGVtZW50X2V2ZW50cyk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9hdHRyX3doaXRlc3BhY2Vfbm9ybWFsaXphdGlvbik7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF94bWxkZWNsX21pc3BsYWNlZCk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF91bmtub3duX2VuY29kaW5nX2ludGVybmFsX2VudGl0eSk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywKICAgICAgICAgICAgICAgICAgIHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3VucmVhZF9leHRlcm5hbF9zdWJzZXQpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X25vX2V4dGVybmFsX3N1YnNldCk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfc3RhbmRhbG9uZSk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfd2l0aF9leHRlcm5hbF9zdWJzZXQpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsCiAgICAgICAgICAgICAgICAgICB0ZXN0X3dmY191bmRlY2xhcmVkX2VudGl0eV93aXRoX2V4dGVybmFsX3N1YnNldF9zdGFuZGFsb25lKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3dmY19ub19yZWN1cnNpdmVfZW50aXR5X3JlZnMpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZXh0X2VudGl0eV9zZXRfZW5jb2RpbmcpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZHRkX2RlZmF1bHRfaGFuZGxpbmcpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZW1wdHlfbnNfd2l0aG91dF9uYW1lc3BhY2VzKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X25zX2luX2F0dHJpYnV0ZV9kZWZhdWx0X3dpdGhvdXRfbmFtZXNwYWNlcyk7CgogICAgc3VpdGVfYWRkX3RjYXNlKHMsIHRjX25hbWVzcGFjZSk7CiAgICB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlKHRjX25hbWVzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3NldHVwLCBuYW1lc3BhY2VfdGVhcmRvd24pOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X3JldHVybl9uc190cmlwbGV0KTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9uc190YWduYW1lX292ZXJ3cml0ZSk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdGFnbmFtZV9vdmVyd3JpdGVfdHJpcGxldCk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3Rfc3RhcnRfbnNfY2xlYXJzX3N0YXJ0X2VsZW1lbnQpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X2RlZmF1bHRfbnNfZnJvbV9leHRfc3Vic2V0X2FuZF9leHRfZ2UpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV8xKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfMik7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfcHJlZml4X3dpdGhfZW1wdHlfdXJpXzMpOwogICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV80KTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9uc19kZWZhdWx0X3dpdGhfZW1wdHlfdXJpKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9uc19kdXBsaWNhdGVfYXR0cnNfZGlmZl9wcmVmaXhlcyk7CiAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fYXR0cmlidXRlKTsKICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9uc191bmJvdW5kX3ByZWZpeF9vbl9lbGVtZW50KTsKCiAgICByZXR1cm4gczsKfQoKCmludAptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGludCBpLCBuZjsKICAgIGludCBmb3JraW5nID0gMCwgZm9ya2luZ19zZXQgPSAwOwogICAgaW50IHZlcmJvc2l0eSA9IENLX05PUk1BTDsKICAgIFN1aXRlICpzID0gbWFrZV9zdWl0ZSgpOwogICAgU1J1bm5lciAqc3IgPSBzcnVubmVyX2NyZWF0ZShzKTsKCiAgICAvKiBydW4gdGhlIHRlc3RzIGZvciBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zICovCiAgICB0ZXN0aGVscGVyX2lzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgpOwoKICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKICAgICAgICBjaGFyICpvcHQgPSBhcmd2W2ldOwogICAgICAgIGlmIChzdHJjbXAob3B0LCAiLXYiKSA9PSAwIHx8IHN0cmNtcChvcHQsICItLXZlcmJvc2UiKSA9PSAwKQogICAgICAgICAgICB2ZXJib3NpdHkgPSBDS19WRVJCT1NFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChvcHQsICItcSIpID09IDAgfHwgc3RyY21wKG9wdCwgIi0tcXVpZXQiKSA9PSAwKQogICAgICAgICAgICB2ZXJib3NpdHkgPSBDS19TSUxFTlQ7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKG9wdCwgIi1mIikgPT0gMCB8fCBzdHJjbXAob3B0LCAiLS1mb3JrIikgPT0gMCkgewogICAgICAgICAgICBmb3JraW5nID0gMTsKICAgICAgICAgICAgZm9ya2luZ19zZXQgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdHJjbXAob3B0LCAiLW4iKSA9PSAwIHx8IHN0cmNtcChvcHQsICItLW5vLWZvcmsiKSA9PSAwKSB7CiAgICAgICAgICAgIGZvcmtpbmcgPSAwOwogICAgICAgICAgICBmb3JraW5nX3NldCA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJ1bnRlc3RzOiB1bmtub3duIG9wdGlvbiAnJXMnXG4iLCBvcHQpOwogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZm9ya2luZ19zZXQpCiAgICAgICAgc3J1bm5lcl9zZXRfZm9ya19zdGF0dXMoc3IsIGZvcmtpbmcgPyBDS19GT1JLIDogQ0tfTk9GT1JLKTsKICAgIGlmICh2ZXJib3NpdHkgIT0gQ0tfU0lMRU5UKQogICAgICAgIHByaW50ZigiRXhwYXQgdmVyc2lvbjogJXNcbiIsIFhNTF9FeHBhdFZlcnNpb24oKSk7CiAgICBzcnVubmVyX3J1bl9hbGwoc3IsIHZlcmJvc2l0eSk7CiAgICBuZiA9IHNydW5uZXJfbnRlc3RzX2ZhaWxlZChzcik7CiAgICBzcnVubmVyX2ZyZWUoc3IpOwoKICAgIHJldHVybiAobmYgPT0gMCkgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7Cn0K