LyoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQUFAgICBEREREICAgRkZGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCAgIFAgIEQgICBEICBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFBQICAgRCAgIEQgIEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAgICAgICBEICAgRCAgRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCAgICAgIEREREQgICBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgUmVhZC9Xcml0ZSBQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgRGVzaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyaXN0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1bHkgMTk5MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgQ29weXJpZ2h0IDE5OTktMjAxNCBJbWFnZU1hZ2ljayBTdHVkaW8gTExDLCBhIG5vbi1wcm9maXQgb3JnYW5pemF0aW9uICAgICAgJQolICBkZWRpY2F0ZWQgdG8gbWFraW5nIHNvZnR3YXJlIGltYWdpbmcgc29sdXRpb25zIGZyZWVseSBhdmFpbGFibGUuICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSAgJQolICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZy9zY3JpcHQvbGljZW5zZS5waHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICUKJSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgJQolICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAlCiUgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICUKJSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJQolCiovCgwKLyoKICBJbmNsdWRlIGRlY2xhcmF0aW9ucy4KKi8KI2luY2x1ZGUgIk1hZ2lja0NvcmUvc3R1ZGlvLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2F0dHJpYnV0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9hcnRpZmFjdC5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9ibG9iLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2Jsb2ItcHJpdmF0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9jYWNoZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9jb2xvci5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9jb2xvci1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbG9yc3BhY2UuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvY29sb3JzcGFjZS1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbXByZXNzLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbnN0aXR1dGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvZGVsZWdhdGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvZGVsZWdhdGUtcHJpdmF0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9kcmF3LmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2V4Y2VwdGlvbi5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9leGNlcHRpb24tcHJpdmF0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9nZW9tZXRyeS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9pbWFnZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9pbWFnZS1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2xpc3QuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvbWFnaWNrLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL21lbW9yeV8uaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvbW9uaXRvci5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9tb25pdG9yLXByaXZhdGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvb3B0aW9uLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3BpeGVsLWFjY2Vzc29yLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3Byb2ZpbGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvcHJvcGVydHkuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvcXVhbnR1bS1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3Jlc291cmNlXy5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9yZXNpemUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvc2lnbmF0dXJlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3N0YXRpYy5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9zdHJpbmdfLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL21vZHVsZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS90b2tlbi5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS90cmFuc2Zvcm0uaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvdXRpbGl0eS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9tb2R1bGUuaCIKDAovKgogIERlZmluZSBkZWNsYXJhdGlvbnMuCiovCiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfVElGRl9ERUxFR0FURSkKI2RlZmluZSBDQ0lUVFBhcmFtICAiLTEiCiNlbHNlCiNkZWZpbmUgQ0NJVFRQYXJhbSAgIjAiCiNlbmRpZgoMCi8qCiAgRm9yd2FyZCBkZWNsYXJhdGlvbnMuCiovCnN0YXRpYyBNYWdpY2tCb29sZWFuVHlwZQogIFdyaXRlUERGSW1hZ2UoY29uc3QgSW1hZ2VJbmZvICosSW1hZ2UgKixFeGNlcHRpb25JbmZvICopOwoMCi8qCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgIEkgbiB2IG8gayBlIFAgRCBGIEQgZSBsIGUgZyBhIHQgZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUKJSAgSW52b2tlUERGRGVsZWdhdGUoKSBleGVjdXRlcyB0aGUgUERGIGludGVycHJldGVyIHdpdGggdGhlIHNwZWNpZmllZCBjb21tYW5kLgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIEludm9rZVBERkRlbGVnYXRlIG1ldGhvZCBpczoKJQolICAgICAgTWFnaWNrQm9vbGVhblR5cGUgSW52b2tlUERGRGVsZWdhdGUoY29uc3QgTWFnaWNrQm9vbGVhblR5cGUgdmVyYm9zZSwKJSAgICAgICAgY29uc3QgY2hhciAqY29tbWFuZCxFeGNlcHRpb25JbmZvICpleGNlcHRpb24pCiUKJSAgQSBkZXNjcmlwdGlvbiBvZiBlYWNoIHBhcmFtZXRlciBmb2xsb3dzOgolCiUgICAgbyB2ZXJib3NlOiBBIHZhbHVlIG90aGVyIHRoYW4gemVybyBkaXNwbGF5cyB0aGUgY29tbWFuZCBwcmlvciB0bwolICAgICAgZXhlY3V0aW5nIGl0LgolCiUgICAgbyBjb21tYW5kOiB0aGUgYWRkcmVzcyBvZiBhIGNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWFuZCB0bwolICAgICAgZXhlY3V0ZS4KJQolICAgIG8gZXhjZXB0aW9uOiByZXR1cm4gYW55IGVycm9ycyBvciB3YXJuaW5ncyBpbiB0aGlzIHN0cnVjdHVyZS4KJQoqLwpzdGF0aWMgTWFnaWNrQm9vbGVhblR5cGUgSW52b2tlUERGRGVsZWdhdGUoY29uc3QgTWFnaWNrQm9vbGVhblR5cGUgdmVyYm9zZSwKICBjb25zdCBjaGFyICpjb21tYW5kLEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKewogIGludAogICAgc3RhdHVzOwoKI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9HU19ERUxFR0FURSkgfHwgZGVmaW5lZChNQUdJQ0tDT1JFX1dJTkRPV1NfU1VQUE9SVCkKICBjaGFyCiAgICAqKmFyZ3Y7CgogIGNvbnN0IEdob3N0SW5mbwogICAgKmdob3N0X2luZm87CgogIGdzX21haW5faW5zdGFuY2UKICAgICppbnRlcnByZXRlcjsKCiAgaW50CiAgICBhcmdjLAogICAgY29kZTsKCiAgcmVnaXN0ZXIgc3NpemVfdAogICAgaTsKCiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfV0lORE9XU19TVVBQT1JUKQogIGdob3N0X2luZm89TlRHaG9zdHNjcmlwdERMTFZlY3RvcnMoKTsKI2Vsc2UKICBHaG9zdEluZm8KICAgIGdob3N0X2luZm9fc3RydWN0OwoKICBnaG9zdF9pbmZvPSgmZ2hvc3RfaW5mb19zdHJ1Y3QpOwogICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeSgmZ2hvc3RfaW5mbywwLHNpemVvZihnaG9zdF9pbmZvKSk7CiAgZ2hvc3RfaW5mb19zdHJ1Y3QubmV3X2luc3RhbmNlPShpbnQgKCopKGdzX21haW5faW5zdGFuY2UgKiosdm9pZCAqKSkKICAgIGdzYXBpX25ld19pbnN0YW5jZTsKICBnaG9zdF9pbmZvX3N0cnVjdC5pbml0X3dpdGhfYXJncz0oaW50ICgqKShnc19tYWluX2luc3RhbmNlICosaW50LGNoYXIgKiopKQogICAgZ3NhcGlfaW5pdF93aXRoX2FyZ3M7CiAgZ2hvc3RfaW5mb19zdHJ1Y3QucnVuX3N0cmluZz0oaW50ICgqKShnc19tYWluX2luc3RhbmNlICosY29uc3QgY2hhciAqLGludCwKICAgIGludCAqKSkgZ3NhcGlfcnVuX3N0cmluZzsKICBnaG9zdF9pbmZvX3N0cnVjdC5kZWxldGVfaW5zdGFuY2U9KHZvaWQgKCopKGdzX21haW5faW5zdGFuY2UgKikpCiAgICBnc2FwaV9kZWxldGVfaW5zdGFuY2U7CiAgZ2hvc3RfaW5mb19zdHJ1Y3QuZXhpdD0oaW50ICgqKShnc19tYWluX2luc3RhbmNlICopKSBnc2FwaV9leGl0OwojZW5kaWYKICBpZiAoZ2hvc3RfaW5mbyA9PSAoR2hvc3RJbmZvICopIE5VTEwpCiAgICB7CiAgICAgIHN0YXR1cz1TeXN0ZW1Db21tYW5kKE1hZ2lja0ZhbHNlLHZlcmJvc2UsY29tbWFuZCxleGNlcHRpb24pOwogICAgICByZXR1cm4oc3RhdHVzID09IDAgPyBNYWdpY2tUcnVlIDogTWFnaWNrRmFsc2UpOwogICAgfQogIGlmICh2ZXJib3NlICE9IE1hZ2lja0ZhbHNlKQogICAgewogICAgICAodm9pZCkgZnB1dHMoIltnaG9zdHNjcmlwdCBsaWJyYXJ5XSIsc3Rkb3V0KTsKICAgICAgKHZvaWQpIGZwdXRzKHN0cmNocihjb21tYW5kLCcgJyksc3Rkb3V0KTsKICAgIH0KICBzdGF0dXM9KGdob3N0X2luZm8tPm5ld19pbnN0YW5jZSkoJmludGVycHJldGVyLCh2b2lkICopIE5VTEwpOwogIGlmIChzdGF0dXMgPCAwKQogICAgewogICAgICBzdGF0dXM9U3lzdGVtQ29tbWFuZChNYWdpY2tGYWxzZSx2ZXJib3NlLGNvbW1hbmQsZXhjZXB0aW9uKTsKICAgICAgcmV0dXJuKHN0YXR1cyA9PSAwID8gTWFnaWNrVHJ1ZSA6IE1hZ2lja0ZhbHNlKTsKICAgIH0KICBjb2RlPTA7CiAgYXJndj1TdHJpbmdUb0FyZ3YoY29tbWFuZCwmYXJnYyk7CiAgaWYgKGFyZ3YgPT0gKGNoYXIgKiopIE5VTEwpCiAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogIHN0YXR1cz0oZ2hvc3RfaW5mby0+aW5pdF93aXRoX2FyZ3MpKGludGVycHJldGVyLGFyZ2MtMSxhcmd2KzEpOwogIGlmIChzdGF0dXMgPT0gMCkKICAgIHN0YXR1cz0oZ2hvc3RfaW5mby0+cnVuX3N0cmluZykoaW50ZXJwcmV0ZXIsInN5c3RlbWRpY3QgL3N0YXJ0IGdldCBleGVjXG4iLAogICAgICAwLCZjb2RlKTsKICAoZ2hvc3RfaW5mby0+ZXhpdCkoaW50ZXJwcmV0ZXIpOwogIChnaG9zdF9pbmZvLT5kZWxldGVfaW5zdGFuY2UpKGludGVycHJldGVyKTsKI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9XSU5ET1dTX1NVUFBPUlQpCiAgTlRHaG9zdHNjcmlwdFVuTG9hZERMTCgpOwojZW5kaWYKICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBhcmdjOyBpKyspCiAgICBhcmd2W2ldPURlc3Ryb3lTdHJpbmcoYXJndltpXSk7CiAgYXJndj0oY2hhciAqKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShhcmd2KTsKICBpZiAoKHN0YXR1cyAhPSAwKSAmJiAoc3RhdHVzICE9IC0xMDEpKQogICAgewogICAgICBjaGFyCiAgICAgICAgKm1lc3NhZ2U7CgogICAgICBtZXNzYWdlPUdldEV4Y2VwdGlvbk1lc3NhZ2UoZXJybm8pOwogICAgICAodm9pZCkgVGhyb3dNYWdpY2tFeGNlcHRpb24oZXhjZXB0aW9uLEdldE1hZ2lja01vZHVsZSgpLERlbGVnYXRlRXJyb3IsCiAgICAgICAgImAlcyc6ICVzIixjb21tYW5kLG1lc3NhZ2UpOwogICAgICBtZXNzYWdlPURlc3Ryb3lTdHJpbmcobWVzc2FnZSk7CiAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICJHaG9zdHNjcmlwdCByZXR1cm5zIHN0YXR1cyAlZCwgZXhpdCBjb2RlICVkIixzdGF0dXMsY29kZSk7CiAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICB9CiAgcmV0dXJuKE1hZ2lja1RydWUpOwojZWxzZQogIHN0YXR1cz1TeXN0ZW1Db21tYW5kKE1hZ2lja0ZhbHNlLHZlcmJvc2UsY29tbWFuZCxleGNlcHRpb24pOwogIHJldHVybihzdGF0dXMgPT0gMCA/IE1hZ2lja1RydWUgOiBNYWdpY2tGYWxzZSk7CiNlbmRpZgp9CgwKLyoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgSSBzIFAgRCBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJQolICBJc1BERigpIHJldHVybnMgTWFnaWNrVHJ1ZSBpZiB0aGUgaW1hZ2UgZm9ybWF0IHR5cGUsIGlkZW50aWZpZWQgYnkgdGhlCiUgIG1hZ2ljayBzdHJpbmcsIGlzIFBERi4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBJc1BERiBtZXRob2QgaXM6CiUKJSAgICAgIE1hZ2lja0Jvb2xlYW5UeXBlIElzUERGKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hZ2ljayxjb25zdCBzaXplX3Qgb2Zmc2V0KQolCiUgIEEgZGVzY3JpcHRpb24gb2YgZWFjaCBwYXJhbWV0ZXIgZm9sbG93czoKJQolICAgIG8gbWFnaWNrOiBjb21wYXJlIGltYWdlIGZvcm1hdCBwYXR0ZXJuIGFnYWluc3QgdGhlc2UgYnl0ZXMuCiUKJSAgICBvIG9mZnNldDogU3BlY2lmaWVzIHRoZSBvZmZzZXQgb2YgdGhlIG1hZ2ljayBzdHJpbmcuCiUKKi8Kc3RhdGljIE1hZ2lja0Jvb2xlYW5UeXBlIElzUERGKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hZ2ljayxjb25zdCBzaXplX3Qgb2Zmc2V0KQp7CiAgaWYgKG9mZnNldCA8IDUpCiAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogIGlmIChMb2NhbGVOQ29tcGFyZSgoY29uc3QgY2hhciAqKSBtYWdpY2ssIiVQREYtIiw1KSA9PSAwKQogICAgcmV0dXJuKE1hZ2lja1RydWUpOwogIHJldHVybihNYWdpY2tGYWxzZSk7Cn0KDAovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBSIGUgYSBkIFAgRCBGIEkgbSBhIGcgZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIFJlYWRQREZJbWFnZSgpIHJlYWRzIGEgUG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0IGltYWdlIGZpbGUgYW5kCiUgIHJldHVybnMgaXQuICBJdCBhbGxvY2F0ZXMgdGhlIG1lbW9yeSBuZWNlc3NhcnkgZm9yIHRoZSBuZXcgSW1hZ2Ugc3RydWN0dXJlCiUgIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IGltYWdlLgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIFJlYWRQREZJbWFnZSBtZXRob2QgaXM6CiUKJSAgICAgIEltYWdlICpSZWFkUERGSW1hZ2UoY29uc3QgSW1hZ2VJbmZvICppbWFnZV9pbmZvLEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKJQolICBBIGRlc2NyaXB0aW9uIG9mIGVhY2ggcGFyYW1ldGVyIGZvbGxvd3M6CiUKJSAgICBvIGltYWdlX2luZm86IHRoZSBpbWFnZSBpbmZvLgolCiUgICAgbyBleGNlcHRpb246IHJldHVybiBhbnkgZXJyb3JzIG9yIHdhcm5pbmdzIGluIHRoaXMgc3RydWN0dXJlLgolCiovCgpzdGF0aWMgTWFnaWNrQm9vbGVhblR5cGUgSXNQREZSZW5kZXJlZChjb25zdCBjaGFyICpwYXRoKQp7CiAgTWFnaWNrQm9vbGVhblR5cGUKICAgIHN0YXR1czsKCiAgc3RydWN0IHN0YXQKICAgIGF0dHJpYnV0ZXM7CgogIGlmICgocGF0aCA9PSAoY29uc3QgY2hhciAqKSBOVUxMKSB8fCAoKnBhdGggPT0gJ1wwJykpCiAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogIHN0YXR1cz1HZXRQYXRoQXR0cmlidXRlcyhwYXRoLCZhdHRyaWJ1dGVzKTsKICBpZiAoKHN0YXR1cyAhPSBNYWdpY2tGYWxzZSkgJiYgU19JU1JFRyhhdHRyaWJ1dGVzLnN0X21vZGUpICYmCiAgICAgIChhdHRyaWJ1dGVzLnN0X3NpemUgPiAwKSkKICAgIHJldHVybihNYWdpY2tUcnVlKTsKICByZXR1cm4oTWFnaWNrRmFsc2UpOwp9CgpzdGF0aWMgSW1hZ2UgKlJlYWRQREZJbWFnZShjb25zdCBJbWFnZUluZm8gKmltYWdlX2luZm8sRXhjZXB0aW9uSW5mbyAqZXhjZXB0aW9uKQp7CiNkZWZpbmUgQ01ZS1Byb2Nlc3NDb2xvciAgIkNNWUtQcm9jZXNzQ29sb3IiCiNkZWZpbmUgQ3JvcEJveCAgIkNyb3BCb3giCiNkZWZpbmUgRGVmYXVsdENNWUsgICJEZWZhdWx0Q01ZSyIKI2RlZmluZSBEZXZpY2VDTVlLICAiRGV2aWNlQ01ZSyIKI2RlZmluZSBNZWRpYUJveCAgIk1lZGlhQm94IgojZGVmaW5lIFJlbmRlclBvc3RzY3JpcHRUZXh0ICAiUmVuZGVyaW5nIFBvc3RzY3JpcHQuLi4gICIKI2RlZmluZSBQREZSb3RhdGUgICJSb3RhdGUiCiNkZWZpbmUgU3BvdENvbG9yICAiU2VwYXJhdGlvbiIKI2RlZmluZSBUcmltQm94ICAiVHJpbUJveCIKI2RlZmluZSBQREZWZXJzaW9uICAiUERGLSIKCiAgY2hhcgogICAgY29tbWFuZFtNYXhUZXh0RXh0ZW50XSwKICAgIGRlbnNpdHlbTWF4VGV4dEV4dGVudF0sCiAgICBmaWxlbmFtZVtNYXhUZXh0RXh0ZW50XSwKICAgIGdlb21ldHJ5W01heFRleHRFeHRlbnRdLAogICAgb3B0aW9uc1tNYXhUZXh0RXh0ZW50XSwKICAgIGlucHV0X2ZpbGVuYW1lW01heFRleHRFeHRlbnRdLAogICAgcG9zdHNjcmlwdF9maWxlbmFtZVtNYXhUZXh0RXh0ZW50XTsKCiAgY29uc3QgY2hhcgogICAgKm9wdGlvbjsKCiAgY29uc3QgRGVsZWdhdGVJbmZvCiAgICAqZGVsZWdhdGVfaW5mbzsKCiAgZG91YmxlCiAgICBhbmdsZTsKCiAgR2VvbWV0cnlJbmZvCiAgICBnZW9tZXRyeV9pbmZvOwoKICBJbWFnZQogICAgKmltYWdlLAogICAgKm5leHQsCiAgICAqcGRmX2ltYWdlOwoKICBJbWFnZUluZm8KICAgICpyZWFkX2luZm87CgogIGludAogICAgYywKICAgIGZpbGU7CgogIE1hZ2lja0Jvb2xlYW5UeXBlCiAgICBjbXlrLAogICAgY3JvcGJveCwKICAgIHRyaW1ib3gsCiAgICBzdGF0dXM7CgogIE1hZ2lja1N0YXR1c1R5cGUKICAgIGZsYWdzOwoKICBQb2ludEluZm8KICAgIGRlbHRhOwoKICBSZWN0YW5nbGVJbmZvCiAgICBib3VuZGluZ19ib3gsCiAgICBwYWdlOwoKICByZWdpc3RlciBjaGFyCiAgICAqcDsKCiAgcmVnaXN0ZXIgc3NpemVfdAogICAgaTsKCiAgU2VnbWVudEluZm8KICAgIGJvdW5kcywKICAgIGhpcmVzX2JvdW5kczsKCiAgc2l6ZV90CiAgICBzY2VuZSwKICAgIHNwb3Rjb2xvcjsKCiAgc3NpemVfdAogICAgY291bnQ7CgogIGFzc2VydChpbWFnZV9pbmZvICE9IChjb25zdCBJbWFnZUluZm8gKikgTlVMTCk7CiAgYXNzZXJ0KGltYWdlX2luZm8tPnNpZ25hdHVyZSA9PSBNYWdpY2tTaWduYXR1cmUpOwogIGlmIChpbWFnZV9pbmZvLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChUcmFjZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsCiAgICAgIGltYWdlX2luZm8tPmZpbGVuYW1lKTsKICBhc3NlcnQoZXhjZXB0aW9uICE9IChFeGNlcHRpb25JbmZvICopIE5VTEwpOwogIGFzc2VydChleGNlcHRpb24tPnNpZ25hdHVyZSA9PSBNYWdpY2tTaWduYXR1cmUpOwogIC8qCiAgICBPcGVuIGltYWdlIGZpbGUuCiAgKi8KICBpbWFnZT1BY3F1aXJlSW1hZ2UoaW1hZ2VfaW5mbyxleGNlcHRpb24pOwogIHN0YXR1cz1PcGVuQmxvYihpbWFnZV9pbmZvLGltYWdlLFJlYWRCaW5hcnlCbG9iTW9kZSxleGNlcHRpb24pOwogIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICB7CiAgICAgIGltYWdlPURlc3Ryb3lJbWFnZUxpc3QoaW1hZ2UpOwogICAgICByZXR1cm4oKEltYWdlICopIE5VTEwpOwogICAgfQogIHN0YXR1cz1BY3F1aXJlVW5pcXVlU3ltYm9saWNMaW5rKGltYWdlX2luZm8tPmZpbGVuYW1lLGlucHV0X2ZpbGVuYW1lKTsKICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgewogICAgICBUaHJvd0ZpbGVFeGNlcHRpb24oZXhjZXB0aW9uLEZpbGVPcGVuRXJyb3IsIlVuYWJsZVRvQ3JlYXRlVGVtcG9yYXJ5RmlsZSIsCiAgICAgICAgaW1hZ2VfaW5mby0+ZmlsZW5hbWUpOwogICAgICBpbWFnZT1EZXN0cm95SW1hZ2VMaXN0KGltYWdlKTsKICAgICAgcmV0dXJuKChJbWFnZSAqKSBOVUxMKTsKICAgIH0KICAvKgogICAgU2V0IHRoZSBwYWdlIGRlbnNpdHkuCiAgKi8KICBkZWx0YS54PURlZmF1bHRSZXNvbHV0aW9uOwogIGRlbHRhLnk9RGVmYXVsdFJlc29sdXRpb247CiAgaWYgKChpbWFnZS0+cmVzb2x1dGlvbi54ID09IDAuMCkgfHwgKGltYWdlLT5yZXNvbHV0aW9uLnkgPT0gMC4wKSkKICAgIHsKICAgICAgZmxhZ3M9UGFyc2VHZW9tZXRyeShQU0RlbnNpdHlHZW9tZXRyeSwmZ2VvbWV0cnlfaW5mbyk7CiAgICAgIGltYWdlLT5yZXNvbHV0aW9uLng9Z2VvbWV0cnlfaW5mby5yaG87CiAgICAgIGltYWdlLT5yZXNvbHV0aW9uLnk9Z2VvbWV0cnlfaW5mby5zaWdtYTsKICAgICAgaWYgKChmbGFncyAmIFNpZ21hVmFsdWUpID09IDApCiAgICAgICAgaW1hZ2UtPnJlc29sdXRpb24ueT1pbWFnZS0+cmVzb2x1dGlvbi54OwogICAgfQogIGlmIChpbWFnZV9pbmZvLT5kZW5zaXR5ICE9IChjaGFyICopIE5VTEwpCiAgICB7CiAgICAgIGZsYWdzPVBhcnNlR2VvbWV0cnkoaW1hZ2VfaW5mby0+ZGVuc2l0eSwmZ2VvbWV0cnlfaW5mbyk7CiAgICAgIGltYWdlLT5yZXNvbHV0aW9uLng9Z2VvbWV0cnlfaW5mby5yaG87CiAgICAgIGltYWdlLT5yZXNvbHV0aW9uLnk9Z2VvbWV0cnlfaW5mby5zaWdtYTsKICAgICAgaWYgKChmbGFncyAmIFNpZ21hVmFsdWUpID09IDApCiAgICAgICAgaW1hZ2UtPnJlc29sdXRpb24ueT1pbWFnZS0+cmVzb2x1dGlvbi54OwogICAgfQogICh2b2lkKSBQYXJzZUFic29sdXRlR2VvbWV0cnkoUFNQYWdlR2VvbWV0cnksJnBhZ2UpOwogIGlmIChpbWFnZV9pbmZvLT5wYWdlICE9IChjaGFyICopIE5VTEwpCiAgICAodm9pZCkgUGFyc2VBYnNvbHV0ZUdlb21ldHJ5KGltYWdlX2luZm8tPnBhZ2UsJnBhZ2UpOwogIHBhZ2Uud2lkdGg9KHNpemVfdCkgY2VpbCgoZG91YmxlKSAocGFnZS53aWR0aCppbWFnZS0+cmVzb2x1dGlvbi54L2RlbHRhLngpLQogICAgMC41KTsKICBwYWdlLmhlaWdodD0oc2l6ZV90KSBjZWlsKChkb3VibGUpIChwYWdlLmhlaWdodCppbWFnZS0+cmVzb2x1dGlvbi55L2RlbHRhLnkpLQogICAgMC41KTsKICAvKgogICAgRGV0ZXJtaW5lIHBhZ2UgZ2VvbWV0cnkgZnJvbSB0aGUgUERGIG1lZGlhIGJveC4KICAqLwogIGNteWs9aW1hZ2VfaW5mby0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSA/IE1hZ2lja1RydWUgOiBNYWdpY2tGYWxzZTsKICBjcm9wYm94PUlzU3RyaW5nVHJ1ZShHZXRJbWFnZU9wdGlvbihpbWFnZV9pbmZvLCJwZGY6dXNlLWNyb3Bib3giKSk7CiAgdHJpbWJveD1Jc1N0cmluZ1RydWUoR2V0SW1hZ2VPcHRpb24oaW1hZ2VfaW5mbywicGRmOnVzZS10cmltYm94IikpOwogIGNvdW50PTA7CiAgc3BvdGNvbG9yPTA7CiAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KCZib3VuZGluZ19ib3gsMCxzaXplb2YoYm91bmRpbmdfYm94KSk7CiAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KCZib3VuZHMsMCxzaXplb2YoYm91bmRzKSk7CiAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KCZoaXJlc19ib3VuZHMsMCxzaXplb2YoaGlyZXNfYm91bmRzKSk7CiAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KGNvbW1hbmQsMCxzaXplb2YoY29tbWFuZCkpOwogIGFuZ2xlPTAuMDsKICBwPWNvbW1hbmQ7CiAgZm9yIChjPVJlYWRCbG9iQnl0ZShpbWFnZSk7IGMgIT0gRU9GOyBjPVJlYWRCbG9iQnl0ZShpbWFnZSkpCiAgewogICAgLyoKICAgICAgTm90ZSBQREYgZWxlbWVudHMuCiAgICAqLwogICAgaWYgKGMgPT0gJ1xuJykKICAgICAgYz0nICc7CiAgICAqcCsrPShjaGFyKSBjOwogICAgaWYgKChjICE9IChpbnQpICcvJykgJiYgKGMgIT0gKGludCkgJyUnKSAmJgogICAgICAgICgoc2l6ZV90KSAocC1jb21tYW5kKSA8IChNYXhUZXh0RXh0ZW50LTEpKSkKICAgICAgY29udGludWU7CiAgICAqKC0tcCk9J1wwJzsKICAgIHA9Y29tbWFuZDsKICAgIGlmIChMb2NhbGVOQ29tcGFyZShQREZSb3RhdGUsY29tbWFuZCxzdHJsZW4oUERGUm90YXRlKSkgPT0gMCkKICAgICAgY291bnQ9KHNzaXplX3QpIHNzY2FuZihjb21tYW5kLCJSb3RhdGUgJWxmIiwmYW5nbGUpOwogICAgLyoKICAgICAgSXMgdGhpcyBhIENNWUsgZG9jdW1lbnQ/CiAgICAqLwogICAgaWYgKExvY2FsZU5Db21wYXJlKERlZmF1bHRDTVlLLGNvbW1hbmQsc3RybGVuKERlZmF1bHRDTVlLKSkgPT0gMCkKICAgICAgY215az1NYWdpY2tUcnVlOwogICAgaWYgKExvY2FsZU5Db21wYXJlKERldmljZUNNWUssY29tbWFuZCxzdHJsZW4oRGV2aWNlQ01ZSykpID09IDApCiAgICAgIGNteWs9TWFnaWNrVHJ1ZTsKICAgIGlmIChMb2NhbGVOQ29tcGFyZShDTVlLUHJvY2Vzc0NvbG9yLGNvbW1hbmQsc3RybGVuKENNWUtQcm9jZXNzQ29sb3IpKSA9PSAwKQogICAgICBjbXlrPU1hZ2lja1RydWU7CiAgICBpZiAoTG9jYWxlTkNvbXBhcmUoU3BvdENvbG9yLGNvbW1hbmQsc3RybGVuKFNwb3RDb2xvcikpID09IDApCiAgICAgIHsKICAgICAgICBjaGFyCiAgICAgICAgICBuYW1lW01heFRleHRFeHRlbnRdLAogICAgICAgICAgcHJvcGVydHlbTWF4VGV4dEV4dGVudF0sCiAgICAgICAgICAqdmFsdWU7CgogICAgICAgIHJlZ2lzdGVyIHNzaXplX3QKICAgICAgICAgIGk7CgogICAgICAgIC8qCiAgICAgICAgICBOb3RlIHNwb3QgbmFtZXMuCiAgICAgICAgKi8KICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKHByb3BlcnR5LE1heFRleHRFeHRlbnQsInBkZjpTcG90Q29sb3ItJS4yMGciLAogICAgICAgICAgKGRvdWJsZSkgc3BvdGNvbG9yKyspOwogICAgICAgIGk9MDsKICAgICAgICBmb3IgKGM9UmVhZEJsb2JCeXRlKGltYWdlKTsgYyAhPSBFT0Y7IGM9UmVhZEJsb2JCeXRlKGltYWdlKSkKICAgICAgICB7CiAgICAgICAgICBpZiAoKGlzc3BhY2UoYykgIT0gMCkgfHwgKGMgPT0gJy8nKSB8fCAoKGkrMSkgPT0gTWF4VGV4dEV4dGVudCkpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgbmFtZVtpKytdPShjaGFyKSBjOwogICAgICAgIH0KICAgICAgICBuYW1lW2ldPSdcMCc7CiAgICAgICAgdmFsdWU9QWNxdWlyZVN0cmluZyhuYW1lKTsKICAgICAgICAodm9pZCkgU3Vic3RpdHV0ZVN0cmluZygmdmFsdWUsIiMyMCIsIiAiKTsKICAgICAgICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSxwcm9wZXJ0eSx2YWx1ZSxleGNlcHRpb24pOwogICAgICAgIHZhbHVlPURlc3Ryb3lTdHJpbmcodmFsdWUpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICBpZiAoTG9jYWxlTkNvbXBhcmUoUERGVmVyc2lvbixjb21tYW5kLHN0cmxlbihQREZWZXJzaW9uKSkgPT0gMCkKICAgICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkoaW1hZ2UsInBkZjpWZXJzaW9uIixjb21tYW5kLGV4Y2VwdGlvbik7CiAgICBpZiAoaW1hZ2VfaW5mby0+cGFnZSAhPSAoY2hhciAqKSBOVUxMKQogICAgICBjb250aW51ZTsKICAgIGNvdW50PTA7CiAgICBpZiAoY3JvcGJveCAhPSBNYWdpY2tGYWxzZSkKICAgICAgewogICAgICAgIGlmIChMb2NhbGVOQ29tcGFyZShDcm9wQm94LGNvbW1hbmQsc3RybGVuKENyb3BCb3gpKSA9PSAwKQogICAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgIE5vdGUgcmVnaW9uIGRlZmluZWQgYnkgY3JvcCBib3guCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvdW50PShzc2l6ZV90KSBzc2NhbmYoY29tbWFuZCwiQ3JvcEJveCBbJWxmICVsZiAlbGYgJWxmIiwKICAgICAgICAgICAgICAmYm91bmRzLngxLCZib3VuZHMueTEsJmJvdW5kcy54MiwmYm91bmRzLnkyKTsKICAgICAgICAgICAgaWYgKGNvdW50ICE9IDQpCiAgICAgICAgICAgICAgY291bnQ9KHNzaXplX3QpIHNzY2FuZihjb21tYW5kLCJDcm9wQm94WyVsZiAlbGYgJWxmICVsZiIsCiAgICAgICAgICAgICAgICAmYm91bmRzLngxLCZib3VuZHMueTEsJmJvdW5kcy54MiwmYm91bmRzLnkyKTsKICAgICAgICAgIH0KICAgICAgfQogICAgZWxzZQogICAgICBpZiAodHJpbWJveCAhPSBNYWdpY2tGYWxzZSkKICAgICAgICB7CiAgICAgICAgICBpZiAoTG9jYWxlTkNvbXBhcmUoVHJpbUJveCxjb21tYW5kLHN0cmxlbihUcmltQm94KSkgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBOb3RlIHJlZ2lvbiBkZWZpbmVkIGJ5IHRyaW0gYm94LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgY291bnQ9KHNzaXplX3QpIHNzY2FuZihjb21tYW5kLCJUcmltQm94IFslbGYgJWxmICVsZiAlbGYiLAogICAgICAgICAgICAgICAgJmJvdW5kcy54MSwmYm91bmRzLnkxLCZib3VuZHMueDIsJmJvdW5kcy55Mik7CiAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDQpCiAgICAgICAgICAgICAgICBjb3VudD0oc3NpemVfdCkgc3NjYW5mKGNvbW1hbmQsIlRyaW1Cb3hbJWxmICVsZiAlbGYgJWxmIiwKICAgICAgICAgICAgICAgICAgJmJvdW5kcy54MSwmYm91bmRzLnkxLCZib3VuZHMueDIsJmJvdW5kcy55Mik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICBpZiAoTG9jYWxlTkNvbXBhcmUoTWVkaWFCb3gsY29tbWFuZCxzdHJsZW4oTWVkaWFCb3gpKSA9PSAwKQogICAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgIE5vdGUgcmVnaW9uIGRlZmluZWQgYnkgbWVkaWEgYm94LgogICAgICAgICAgICAqLwogICAgICAgICAgICBjb3VudD0oc3NpemVfdCkgc3NjYW5mKGNvbW1hbmQsIk1lZGlhQm94IFslbGYgJWxmICVsZiAlbGYiLAogICAgICAgICAgICAgICZib3VuZHMueDEsJmJvdW5kcy55MSwmYm91bmRzLngyLCZib3VuZHMueTIpOwogICAgICAgICAgICBpZiAoY291bnQgIT0gNCkKICAgICAgICAgICAgICBjb3VudD0oc3NpemVfdCkgc3NjYW5mKGNvbW1hbmQsIk1lZGlhQm94WyVsZiAlbGYgJWxmICVsZiIsCiAgICAgICAgICAgICAgICAmYm91bmRzLngxLCZib3VuZHMueTEsJmJvdW5kcy54MiwmYm91bmRzLnkyKTsKICAgICAgICAgIH0KICAgIGlmIChjb3VudCAhPSA0KQogICAgICBjb250aW51ZTsKICAgIGlmICgoZmFicyhib3VuZHMueDItYm91bmRzLngxKSA8PSBmYWJzKGhpcmVzX2JvdW5kcy54Mi1oaXJlc19ib3VuZHMueDEpKSB8fAogICAgICAgIChmYWJzKGJvdW5kcy55Mi1ib3VuZHMueTEpIDw9IGZhYnMoaGlyZXNfYm91bmRzLnkyLWhpcmVzX2JvdW5kcy55MSkpKQogICAgICBjb250aW51ZTsKICAgIGhpcmVzX2JvdW5kcz1ib3VuZHM7CiAgfQogIGlmICgoZmFicyhoaXJlc19ib3VuZHMueDItaGlyZXNfYm91bmRzLngxKSA+PSBNYWdpY2tFcHNpbG9uKSAmJiAKICAgICAgKGZhYnMoaGlyZXNfYm91bmRzLnkyLWhpcmVzX2JvdW5kcy55MSkgPj0gTWFnaWNrRXBzaWxvbikpCiAgICB7CiAgICAgIC8qCiAgICAgICAgU2V0IFBERiByZW5kZXIgZ2VvbWV0cnkuCiAgICAgICovCiAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWd4JWclKy4xNWclKy4xNWciLAogICAgICAgIGhpcmVzX2JvdW5kcy54Mi1ib3VuZHMueDEsaGlyZXNfYm91bmRzLnkyLWhpcmVzX2JvdW5kcy55MSwKICAgICAgICBoaXJlc19ib3VuZHMueDEsaGlyZXNfYm91bmRzLnkxKTsKICAgICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkoaW1hZ2UsInBkZjpIaVJlc0JvdW5kaW5nQm94IixnZW9tZXRyeSxleGNlcHRpb24pOwogICAgICBwYWdlLndpZHRoPShzaXplX3QpIGNlaWwoKGRvdWJsZSkgKChoaXJlc19ib3VuZHMueDItaGlyZXNfYm91bmRzLngxKSoKICAgICAgICBpbWFnZS0+cmVzb2x1dGlvbi54L2RlbHRhLngpLTAuNSk7CiAgICAgIHBhZ2UuaGVpZ2h0PShzaXplX3QpIGNlaWwoKGRvdWJsZSkgKChoaXJlc19ib3VuZHMueTItaGlyZXNfYm91bmRzLnkxKSoKICAgICAgICBpbWFnZS0+cmVzb2x1dGlvbi55L2RlbHRhLnkpLTAuNSk7CiAgICB9CiAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgaWYgKChmYWJzKGFuZ2xlKSA9PSA5MC4wKSB8fCAoZmFicyhhbmdsZSkgPT0gMjcwLjApKQogICAgewogICAgICBzaXplX3QKICAgICAgICBzd2FwOwoKICAgICAgc3dhcD1wYWdlLndpZHRoOwogICAgICBwYWdlLndpZHRoPXBhZ2UuaGVpZ2h0OwogICAgICBwYWdlLmhlaWdodD1zd2FwOwogICAgfQogIGlmIChJc3NSR0JDb21wYXRpYmxlQ29sb3JzcGFjZShpbWFnZV9pbmZvLT5jb2xvcnNwYWNlKSAhPSBNYWdpY2tGYWxzZSkKICAgIGNteWs9TWFnaWNrRmFsc2U7CiAgLyoKICAgIENyZWF0ZSBHaG9zdHNjcmlwdCBjb250cm9sIGZpbGUuCiAgKi8KICBmaWxlPUFjcXVpcmVVbmlxdWVGaWxlUmVzb3VyY2UocG9zdHNjcmlwdF9maWxlbmFtZSk7CiAgaWYgKGZpbGUgPT0gLTEpCiAgICB7CiAgICAgIFRocm93RmlsZUV4Y2VwdGlvbihleGNlcHRpb24sRmlsZU9wZW5FcnJvciwiVW5hYmxlVG9DcmVhdGVUZW1wb3JhcnlGaWxlIiwKICAgICAgICBpbWFnZV9pbmZvLT5maWxlbmFtZSk7CiAgICAgIGltYWdlPURlc3Ryb3lJbWFnZShpbWFnZSk7CiAgICAgIHJldHVybigoSW1hZ2UgKikgTlVMTCk7CiAgICB9CiAgY291bnQ9d3JpdGUoZmlsZSwiICIsMSk7CiAgZmlsZT1jbG9zZShmaWxlKS0xOwogIC8qCiAgICBSZW5kZXIgUG9zdHNjcmlwdCB3aXRoIHRoZSBHaG9zdHNjcmlwdCBkZWxlZ2F0ZS4KICAqLwogIGlmICgoaW1hZ2VfaW5mby0+cGluZyAhPSBNYWdpY2tGYWxzZSkgfHwKICAgICAgKGltYWdlX2luZm8tPm1vbm9jaHJvbWUgIT0gTWFnaWNrRmFsc2UpKQogICAgZGVsZWdhdGVfaW5mbz1HZXREZWxlZ2F0ZUluZm8oInBzOm1vbm8iLChjaGFyICopIE5VTEwsZXhjZXB0aW9uKTsKICBlbHNlCiAgICAgaWYgKGNteWsgIT0gTWFnaWNrRmFsc2UpCiAgICAgICBkZWxlZ2F0ZV9pbmZvPUdldERlbGVnYXRlSW5mbygicHM6Y215ayIsKGNoYXIgKikgTlVMTCxleGNlcHRpb24pOwogICAgIGVsc2UKICAgICAgIGRlbGVnYXRlX2luZm89R2V0RGVsZWdhdGVJbmZvKCJwczphbHBoYSIsKGNoYXIgKikgTlVMTCxleGNlcHRpb24pOwogIGlmIChkZWxlZ2F0ZV9pbmZvID09IChjb25zdCBEZWxlZ2F0ZUluZm8gKikgTlVMTCkKICAgIHsKICAgICAgKHZvaWQpIFJlbGlucXVpc2hVbmlxdWVGaWxlUmVzb3VyY2UocG9zdHNjcmlwdF9maWxlbmFtZSk7CiAgICAgIGltYWdlPURlc3Ryb3lJbWFnZShpbWFnZSk7CiAgICAgIHJldHVybigoSW1hZ2UgKikgTlVMTCk7CiAgICB9CiAgKm9wdGlvbnM9J1wwJzsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGRlbnNpdHksTWF4VGV4dEV4dGVudCwiJWd4JWciLGltYWdlLT5yZXNvbHV0aW9uLngsCiAgICBpbWFnZS0+cmVzb2x1dGlvbi55KTsKICBpZiAoaW1hZ2VfaW5mby0+cGFnZSAhPSAoY2hhciAqKSBOVUxMKQogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1nJS4yMGd4JS4yMGcgIiwoZG91YmxlKQogICAgICBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0KTsKICBpZiAoY215ayAhPSBNYWdpY2tGYWxzZSkKICAgICh2b2lkKSBDb25jYXRlbmF0ZU1hZ2lja1N0cmluZyhvcHRpb25zLCItZFVzZUNJRUNvbG9yICIsTWF4VGV4dEV4dGVudCk7CiAgaWYgKGNyb3Bib3ggIT0gTWFnaWNrRmFsc2UpCiAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucywiLWRVc2VDcm9wQm94ICIsTWF4VGV4dEV4dGVudCk7CiAgaWYgKHRyaW1ib3ggIT0gTWFnaWNrRmFsc2UpCiAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucywiLWRVc2VUcmltQm94ICIsTWF4VGV4dEV4dGVudCk7CiAgcmVhZF9pbmZvPUNsb25lSW1hZ2VJbmZvKGltYWdlX2luZm8pOwogICpyZWFkX2luZm8tPm1hZ2ljaz0nXDAnOwogIGlmIChyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMCkKICAgIHsKICAgICAgY2hhcgogICAgICAgIHBhZ2VzW01heFRleHRFeHRlbnRdOwoKICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhwYWdlcyxNYXhUZXh0RXh0ZW50LCItZEZpcnN0UGFnZT0lLjIwZyAiCiAgICAgICAgIi1kTGFzdFBhZ2U9JS4yMGciLChkb3VibGUpIHJlYWRfaW5mby0+c2NlbmUrMSwoZG91YmxlKQogICAgICAgIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucyxwYWdlcyxNYXhUZXh0RXh0ZW50KTsKICAgICAgcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzPTA7CiAgICAgIGlmIChyZWFkX2luZm8tPnNjZW5lcyAhPSAoY2hhciAqKSBOVUxMKQogICAgICAgICpyZWFkX2luZm8tPnNjZW5lcz0nXDAnOwogICAgfQogIG9wdGlvbj1HZXRJbWFnZU9wdGlvbihpbWFnZV9pbmZvLCJhdXRoZW50aWNhdGUiKTsKICBpZiAob3B0aW9uICE9IChjb25zdCBjaGFyICopIE5VTEwpCiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKG9wdGlvbnMrc3RybGVuKG9wdGlvbnMpLE1heFRleHRFeHRlbnQsCiAgICAgICIgLXNQQ0xQYXNzd29yZD0lcyIsb3B0aW9uKTsKICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhmaWxlbmFtZSxyZWFkX2luZm8tPmZpbGVuYW1lLE1heFRleHRFeHRlbnQpOwogICh2b2lkKSBBY3F1aXJlVW5pcXVlRmlsZW5hbWUoZmlsZW5hbWUpOwogICh2b2lkKSBDb25jYXRlbmF0ZU1hZ2lja1N0cmluZyhmaWxlbmFtZSwiJWQiLE1heFRleHRFeHRlbnQpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoY29tbWFuZCxNYXhUZXh0RXh0ZW50LAogICAgR2V0RGVsZWdhdGVDb21tYW5kcyhkZWxlZ2F0ZV9pbmZvKSwKICAgIHJlYWRfaW5mby0+YW50aWFsaWFzICE9IE1hZ2lja0ZhbHNlID8gNCA6IDEsCiAgICByZWFkX2luZm8tPmFudGlhbGlhcyAhPSBNYWdpY2tGYWxzZSA/IDQgOiAxLGRlbnNpdHksb3B0aW9ucyxmaWxlbmFtZSwKICAgIHBvc3RzY3JpcHRfZmlsZW5hbWUsaW5wdXRfZmlsZW5hbWUpOwogIHN0YXR1cz1JbnZva2VQREZEZWxlZ2F0ZShyZWFkX2luZm8tPnZlcmJvc2UsY29tbWFuZCxleGNlcHRpb24pOwogICh2b2lkKSBSZWxpbnF1aXNoVW5pcXVlRmlsZVJlc291cmNlKHBvc3RzY3JpcHRfZmlsZW5hbWUpOwogICh2b2lkKSBSZWxpbnF1aXNoVW5pcXVlRmlsZVJlc291cmNlKGlucHV0X2ZpbGVuYW1lKTsKICBwZGZfaW1hZ2U9KEltYWdlICopIE5VTEw7CiAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgIGZvciAoaT0xOyA7IGkrKykKICAgIHsKICAgICAgKHZvaWQpIEludGVycHJldEltYWdlRmlsZW5hbWUoaW1hZ2VfaW5mbyxpbWFnZSxmaWxlbmFtZSwoaW50KSBpLAogICAgICAgIHJlYWRfaW5mby0+ZmlsZW5hbWUsZXhjZXB0aW9uKTsKICAgICAgaWYgKElzUERGUmVuZGVyZWQocmVhZF9pbmZvLT5maWxlbmFtZSkgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgYnJlYWs7CiAgICAgICh2b2lkKSBSZWxpbnF1aXNoVW5pcXVlRmlsZVJlc291cmNlKHJlYWRfaW5mby0+ZmlsZW5hbWUpOwogICAgfQogIGVsc2UKICAgIGZvciAoaT0xOyA7IGkrKykKICAgIHsKICAgICAgKHZvaWQpIEludGVycHJldEltYWdlRmlsZW5hbWUoaW1hZ2VfaW5mbyxpbWFnZSxmaWxlbmFtZSwoaW50KSBpLAogICAgICAgIHJlYWRfaW5mby0+ZmlsZW5hbWUsZXhjZXB0aW9uKTsKICAgICAgaWYgKElzUERGUmVuZGVyZWQocmVhZF9pbmZvLT5maWxlbmFtZSkgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgYnJlYWs7CiAgICAgIHJlYWRfaW5mby0+YmxvYj1OVUxMOwogICAgICByZWFkX2luZm8tPmxlbmd0aD0wOwogICAgICBuZXh0PVJlYWRJbWFnZShyZWFkX2luZm8sZXhjZXB0aW9uKTsKICAgICAgKHZvaWQpIFJlbGlucXVpc2hVbmlxdWVGaWxlUmVzb3VyY2UocmVhZF9pbmZvLT5maWxlbmFtZSk7CiAgICAgIGlmIChuZXh0ID09IChJbWFnZSAqKSBOVUxMKQogICAgICAgIGJyZWFrOwogICAgICBBcHBlbmRJbWFnZVRvTGlzdCgmcGRmX2ltYWdlLG5leHQpOwogICAgfQogIHJlYWRfaW5mbz1EZXN0cm95SW1hZ2VJbmZvKHJlYWRfaW5mbyk7CiAgaWYgKHBkZl9pbWFnZSA9PSAoSW1hZ2UgKikgTlVMTCkKICAgIHsKICAgICAgVGhyb3dGaWxlRXhjZXB0aW9uKGV4Y2VwdGlvbixEZWxlZ2F0ZUVycm9yLCJQb3N0c2NyaXB0RGVsZWdhdGVGYWlsZWQiLAogICAgICAgIGltYWdlX2luZm8tPmZpbGVuYW1lKTsKICAgICAgaW1hZ2U9RGVzdHJveUltYWdlKGltYWdlKTsKICAgICAgcmV0dXJuKChJbWFnZSAqKSBOVUxMKTsKICAgIH0KICBpZiAoTG9jYWxlQ29tcGFyZShwZGZfaW1hZ2UtPm1hZ2ljaywiQk1QIikgPT0gMCkKICAgIHsKICAgICAgSW1hZ2UKICAgICAgICAqY215a19pbWFnZTsKCiAgICAgIGNteWtfaW1hZ2U9Q29uc29saWRhdGVDTVlLSW1hZ2VzKHBkZl9pbWFnZSxleGNlcHRpb24pOwogICAgICBpZiAoY215a19pbWFnZSAhPSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICB7CiAgICAgICAgICBwZGZfaW1hZ2U9RGVzdHJveUltYWdlTGlzdChwZGZfaW1hZ2UpOwogICAgICAgICAgcGRmX2ltYWdlPWNteWtfaW1hZ2U7CiAgICAgICAgfQogICAgfQogIGlmIChpbWFnZV9pbmZvLT5udW1iZXJfc2NlbmVzICE9IDApCiAgICB7CiAgICAgIEltYWdlCiAgICAgICAgKmNsb25lX2ltYWdlOwoKICAgICAgcmVnaXN0ZXIgc3NpemVfdAogICAgICAgIGk7CgogICAgICAvKgogICAgICAgIEFkZCBwbGFjZSBob2xkZXIgaW1hZ2VzIHRvIG1lZXQgdGhlIHN1YmltYWdlIHNwZWNpZmljYXRpb24gcmVxdWlyZW1lbnQuCiAgICAgICovCiAgICAgIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIGltYWdlX2luZm8tPnNjZW5lOyBpKyspCiAgICAgIHsKICAgICAgICBjbG9uZV9pbWFnZT1DbG9uZUltYWdlKHBkZl9pbWFnZSwxLDEsTWFnaWNrVHJ1ZSxleGNlcHRpb24pOwogICAgICAgIGlmIChjbG9uZV9pbWFnZSAhPSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgIFByZXBlbmRJbWFnZVRvTGlzdCgmcGRmX2ltYWdlLGNsb25lX2ltYWdlKTsKICAgICAgfQogICAgfQogIGRvCiAgewogICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcocGRmX2ltYWdlLT5maWxlbmFtZSxmaWxlbmFtZSxNYXhUZXh0RXh0ZW50KTsKICAgIHBkZl9pbWFnZS0+cGFnZT1wYWdlOwogICAgKHZvaWQpIENsb25lSW1hZ2VQcm9maWxlcyhwZGZfaW1hZ2UsaW1hZ2UpOwogICAgKHZvaWQpIENsb25lSW1hZ2VQcm9wZXJ0aWVzKHBkZl9pbWFnZSxpbWFnZSk7CiAgICBuZXh0PVN5bmNOZXh0SW1hZ2VJbkxpc3QocGRmX2ltYWdlKTsKICAgIGlmIChuZXh0ICE9IChJbWFnZSAqKSBOVUxMKQogICAgICBwZGZfaW1hZ2U9bmV4dDsKICB9IHdoaWxlIChuZXh0ICE9IChJbWFnZSAqKSBOVUxMKTsKICBpbWFnZT1EZXN0cm95SW1hZ2UoaW1hZ2UpOwogIHNjZW5lPTA7CiAgZm9yIChuZXh0PUdldEZpcnN0SW1hZ2VJbkxpc3QocGRmX2ltYWdlKTsgbmV4dCAhPSAoSW1hZ2UgKikgTlVMTDsgKQogIHsKICAgIG5leHQtPnNjZW5lPXNjZW5lKys7CiAgICBuZXh0PUdldE5leHRJbWFnZUluTGlzdChuZXh0KTsKICB9CiAgcmV0dXJuKEdldEZpcnN0SW1hZ2VJbkxpc3QocGRmX2ltYWdlKSk7Cn0KDAovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBSIGUgZyBpIHMgdCBlIHIgUCBEIEYgSSBtIGEgZyBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIFJlZ2lzdGVyUERGSW1hZ2UoKSBhZGRzIHByb3BlcnRpZXMgZm9yIHRoZSBQREYgaW1hZ2UgZm9ybWF0IHRvCiUgIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzLiAgVGhlIHByb3BlcnRpZXMgaW5jbHVkZSB0aGUgaW1hZ2UgZm9ybWF0CiUgIHRhZywgYSBtZXRob2QgdG8gcmVhZCBhbmQvb3Igd3JpdGUgdGhlIGZvcm1hdCwgd2hldGhlciB0aGUgZm9ybWF0CiUgIHN1cHBvcnRzIHRoZSBzYXZpbmcgb2YgbW9yZSB0aGFuIG9uZSBmcmFtZSB0byB0aGUgc2FtZSBmaWxlIG9yIGJsb2IsCiUgIHdoZXRoZXIgdGhlIGZvcm1hdCBzdXBwb3J0cyBuYXRpdmUgaW4tbWVtb3J5IEkvTywgYW5kIGEgYnJpZWYKJSAgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBSZWdpc3RlclBERkltYWdlIG1ldGhvZCBpczoKJQolICAgICAgc2l6ZV90IFJlZ2lzdGVyUERGSW1hZ2Uodm9pZCkKJQoqLwpNb2R1bGVFeHBvcnQgc2l6ZV90IFJlZ2lzdGVyUERGSW1hZ2Uodm9pZCkKewogIE1hZ2lja0luZm8KICAgICplbnRyeTsKCiAgZW50cnk9U2V0TWFnaWNrSW5mbygiQUkiKTsKICBlbnRyeS0+ZGVjb2Rlcj0oRGVjb2RlSW1hZ2VIYW5kbGVyICopIFJlYWRQREZJbWFnZTsKICBlbnRyeS0+ZW5jb2Rlcj0oRW5jb2RlSW1hZ2VIYW5kbGVyICopIFdyaXRlUERGSW1hZ2U7CiAgZW50cnktPmFkam9pbj1NYWdpY2tGYWxzZTsKICBlbnRyeS0+YmxvYl9zdXBwb3J0PU1hZ2lja0ZhbHNlOwogIGVudHJ5LT5zZWVrYWJsZV9zdHJlYW09TWFnaWNrVHJ1ZTsKICBlbnRyeS0+ZGVzY3JpcHRpb249Q29uc3RhbnRTdHJpbmcoIkFkb2JlIElsbHVzdHJhdG9yIENTMiIpOwogIGVudHJ5LT5taW1lX3R5cGU9Q29uc3RhbnRTdHJpbmcoImFwcGxpY2F0aW9uL3BkZiIpOwogIGVudHJ5LT5tb2R1bGU9Q29uc3RhbnRTdHJpbmcoIlBERiIpOwogICh2b2lkKSBSZWdpc3Rlck1hZ2lja0luZm8oZW50cnkpOwogIGVudHJ5PVNldE1hZ2lja0luZm8oIkVQREYiKTsKICBlbnRyeS0+ZGVjb2Rlcj0oRGVjb2RlSW1hZ2VIYW5kbGVyICopIFJlYWRQREZJbWFnZTsKICBlbnRyeS0+ZW5jb2Rlcj0oRW5jb2RlSW1hZ2VIYW5kbGVyICopIFdyaXRlUERGSW1hZ2U7CiAgZW50cnktPmFkam9pbj1NYWdpY2tGYWxzZTsKICBlbnRyeS0+YmxvYl9zdXBwb3J0PU1hZ2lja0ZhbHNlOwogIGVudHJ5LT5zZWVrYWJsZV9zdHJlYW09TWFnaWNrVHJ1ZTsKICBlbnRyeS0+ZGVzY3JpcHRpb249Q29uc3RhbnRTdHJpbmcoIkVuY2Fwc3VsYXRlZCBQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQiKTsKICBlbnRyeS0+bWltZV90eXBlPUNvbnN0YW50U3RyaW5nKCJhcHBsaWNhdGlvbi9wZGYiKTsKICBlbnRyeS0+bW9kdWxlPUNvbnN0YW50U3RyaW5nKCJQREYiKTsKICAodm9pZCkgUmVnaXN0ZXJNYWdpY2tJbmZvKGVudHJ5KTsKICBlbnRyeT1TZXRNYWdpY2tJbmZvKCJQREYiKTsKICBlbnRyeS0+ZGVjb2Rlcj0oRGVjb2RlSW1hZ2VIYW5kbGVyICopIFJlYWRQREZJbWFnZTsKICBlbnRyeS0+ZW5jb2Rlcj0oRW5jb2RlSW1hZ2VIYW5kbGVyICopIFdyaXRlUERGSW1hZ2U7CiAgZW50cnktPm1hZ2ljaz0oSXNJbWFnZUZvcm1hdEhhbmRsZXIgKikgSXNQREY7CiAgZW50cnktPmJsb2Jfc3VwcG9ydD1NYWdpY2tGYWxzZTsKICBlbnRyeS0+c2Vla2FibGVfc3RyZWFtPU1hZ2lja1RydWU7CiAgZW50cnktPmRlc2NyaXB0aW9uPUNvbnN0YW50U3RyaW5nKCJQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQiKTsKICBlbnRyeS0+bWltZV90eXBlPUNvbnN0YW50U3RyaW5nKCJhcHBsaWNhdGlvbi9wZGYiKTsKICBlbnRyeS0+bW9kdWxlPUNvbnN0YW50U3RyaW5nKCJQREYiKTsKICAodm9pZCkgUmVnaXN0ZXJNYWdpY2tJbmZvKGVudHJ5KTsKICBlbnRyeT1TZXRNYWdpY2tJbmZvKCJQREZBIik7CiAgZW50cnktPmRlY29kZXI9KERlY29kZUltYWdlSGFuZGxlciAqKSBSZWFkUERGSW1hZ2U7CiAgZW50cnktPmVuY29kZXI9KEVuY29kZUltYWdlSGFuZGxlciAqKSBXcml0ZVBERkltYWdlOwogIGVudHJ5LT5tYWdpY2s9KElzSW1hZ2VGb3JtYXRIYW5kbGVyICopIElzUERGOwogIGVudHJ5LT5ibG9iX3N1cHBvcnQ9TWFnaWNrRmFsc2U7CiAgZW50cnktPnNlZWthYmxlX3N0cmVhbT1NYWdpY2tUcnVlOwogIGVudHJ5LT5kZXNjcmlwdGlvbj1Db25zdGFudFN0cmluZygiUG9ydGFibGUgRG9jdW1lbnQgQXJjaGl2ZSBGb3JtYXQiKTsKICBlbnRyeS0+bWltZV90eXBlPUNvbnN0YW50U3RyaW5nKCJhcHBsaWNhdGlvbi9wZGYiKTsKICBlbnRyeS0+bW9kdWxlPUNvbnN0YW50U3RyaW5nKCJQREYiKTsKICAodm9pZCkgUmVnaXN0ZXJNYWdpY2tJbmZvKGVudHJ5KTsKICByZXR1cm4oTWFnaWNrSW1hZ2VDb2RlclNpZ25hdHVyZSk7Cn0KDAovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBVIG4gciBlIGcgaSBzIHQgZSByIFAgRCBGIEkgbSBhIGcgZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIFVucmVnaXN0ZXJQREZJbWFnZSgpIHJlbW92ZXMgZm9ybWF0IHJlZ2lzdHJhdGlvbnMgbWFkZSBieSB0aGUKJSAgUERGIG1vZHVsZSBmcm9tIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzLgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIFVucmVnaXN0ZXJQREZJbWFnZSBtZXRob2QgaXM6CiUKJSAgICAgIFVucmVnaXN0ZXJQREZJbWFnZSh2b2lkKQolCiovCk1vZHVsZUV4cG9ydCB2b2lkIFVucmVnaXN0ZXJQREZJbWFnZSh2b2lkKQp7CiAgKHZvaWQpIFVucmVnaXN0ZXJNYWdpY2tJbmZvKCJBSSIpOwogICh2b2lkKSBVbnJlZ2lzdGVyTWFnaWNrSW5mbygiRVBERiIpOwogICh2b2lkKSBVbnJlZ2lzdGVyTWFnaWNrSW5mbygiUERGIik7CiAgKHZvaWQpIFVucmVnaXN0ZXJNYWdpY2tJbmZvKCJQREZBIik7Cn0KDAovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBXIHIgaSB0IGUgUCBEIEYgSSBtIGEgZyBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIFdyaXRlUERGSW1hZ2UoKSB3cml0ZXMgYW4gaW1hZ2UgaW4gdGhlIFBvcnRhYmxlIERvY3VtZW50IGltYWdlCiUgIGZvcm1hdC4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBXcml0ZVBERkltYWdlIG1ldGhvZCBpczoKJQolICAgICAgTWFnaWNrQm9vbGVhblR5cGUgV3JpdGVQREZJbWFnZShjb25zdCBJbWFnZUluZm8gKmltYWdlX2luZm8sCiUgICAgICAgIEltYWdlICppbWFnZSxFeGNlcHRpb25JbmZvICpleGNlcHRpb24pCiUKJSAgQSBkZXNjcmlwdGlvbiBvZiBlYWNoIHBhcmFtZXRlciBmb2xsb3dzLgolCiUgICAgbyBpbWFnZV9pbmZvOiB0aGUgaW1hZ2UgaW5mby4KJQolICAgIG8gaW1hZ2U6ICBUaGUgaW1hZ2UuCiUKJSAgICBvIGV4Y2VwdGlvbjogcmV0dXJuIGFueSBlcnJvcnMgb3Igd2FybmluZ3MgaW4gdGhpcyBzdHJ1Y3R1cmUuCiUKKi8KCnN0YXRpYyBpbmxpbmUgc2l6ZV90IE1hZ2lja01heChjb25zdCBzaXplX3QgeCxjb25zdCBzaXplX3QgeSkKewogIGlmICh4ID4geSkKICAgIHJldHVybih4KTsKICByZXR1cm4oeSk7Cn0KCnN0YXRpYyBpbmxpbmUgc2l6ZV90IE1hZ2lja01pbihjb25zdCBzaXplX3QgeCxjb25zdCBzaXplX3QgeSkKewogIGlmICh4IDwgeSkKICAgIHJldHVybih4KTsKICByZXR1cm4oeSk7Cn0KCnN0YXRpYyBjaGFyICpFc2NhcGVQYXJlbnRoZXNpcyhjb25zdCBjaGFyICp0ZXh0KQp7CiAgcmVnaXN0ZXIgY2hhcgogICAgKnA7CgogIHJlZ2lzdGVyIHNzaXplX3QKICAgIGk7CgogIHNpemVfdAogICAgZXNjYXBlczsKCiAgc3RhdGljIGNoYXIKICAgIGJ1ZmZlcltNYXhUZXh0RXh0ZW50XTsKCiAgZXNjYXBlcz0wOwogIHA9YnVmZmVyOwogIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIE1hZ2lja01pbihzdHJsZW4odGV4dCksKE1heFRleHRFeHRlbnQtZXNjYXBlcy0xKSk7IGkrKykKICB7CiAgICBpZiAoKHRleHRbaV0gPT0gJygnKSB8fCAodGV4dFtpXSA9PSAnKScpKQogICAgICB7CiAgICAgICAgKnArKz0nXFwnOwogICAgICAgIGVzY2FwZXMrKzsKICAgICAgfQogICAgKnArKz10ZXh0W2ldOwogIH0KICAqcD0nXDAnOwogIHJldHVybihidWZmZXIpOwp9CgpzdGF0aWMgTWFnaWNrQm9vbGVhblR5cGUgSHVmZm1hbjJERW5jb2RlSW1hZ2UoY29uc3QgSW1hZ2VJbmZvICppbWFnZV9pbmZvLAogIEltYWdlICppbWFnZSxJbWFnZSAqaW5qZWN0X2ltYWdlLEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKewogIEltYWdlCiAgICAqZ3JvdXA0X2ltYWdlOwoKICBJbWFnZUluZm8KICAgICp3cml0ZV9pbmZvOwoKICBNYWdpY2tCb29sZWFuVHlwZQogICAgc3RhdHVzOwoKICBzaXplX3QKICAgIGxlbmd0aDsKCiAgdW5zaWduZWQgY2hhcgogICAgKmdyb3VwNDsKCiAgc3RhdHVzPU1hZ2lja1RydWU7CiAgd3JpdGVfaW5mbz1DbG9uZUltYWdlSW5mbyhpbWFnZV9pbmZvKTsKICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyh3cml0ZV9pbmZvLT5maWxlbmFtZSwiR1JPVVA0OiIsTWF4VGV4dEV4dGVudCk7CiAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcod3JpdGVfaW5mby0+bWFnaWNrLCJHUk9VUDQiLE1heFRleHRFeHRlbnQpOwogIGdyb3VwNF9pbWFnZT1DbG9uZUltYWdlKGluamVjdF9pbWFnZSwwLDAsTWFnaWNrVHJ1ZSxleGNlcHRpb24pOwogIGlmIChncm91cDRfaW1hZ2UgPT0gKEltYWdlICopIE5VTEwpCiAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogIGdyb3VwND0odW5zaWduZWQgY2hhciAqKSBJbWFnZVRvQmxvYih3cml0ZV9pbmZvLGdyb3VwNF9pbWFnZSwmbGVuZ3RoLAogICAgZXhjZXB0aW9uKTsKICBncm91cDRfaW1hZ2U9RGVzdHJveUltYWdlKGdyb3VwNF9pbWFnZSk7CiAgaWYgKGdyb3VwNCA9PSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQogICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICB3cml0ZV9pbmZvPURlc3Ryb3lJbWFnZUluZm8od3JpdGVfaW5mbyk7CiAgaWYgKFdyaXRlQmxvYihpbWFnZSxsZW5ndGgsZ3JvdXA0KSAhPSAoc3NpemVfdCkgbGVuZ3RoKQogICAgc3RhdHVzPU1hZ2lja0ZhbHNlOwogIGdyb3VwND0odW5zaWduZWQgY2hhciAqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KGdyb3VwNCk7CiAgcmV0dXJuKHN0YXR1cyk7Cn0KCnN0YXRpYyBNYWdpY2tCb29sZWFuVHlwZSBXcml0ZVBERkltYWdlKGNvbnN0IEltYWdlSW5mbyAqaW1hZ2VfaW5mbyxJbWFnZSAqaW1hZ2UsCiAgRXhjZXB0aW9uSW5mbyAqZXhjZXB0aW9uKQp7CiNkZWZpbmUgQ0Zvcm1hdCAgIi9GaWx0ZXIgWyAvJXMgXVxuIgojZGVmaW5lIE9iamVjdHNQZXJJbWFnZSAgMTQKCkRpc2FibGVNU0NXYXJuaW5nKDQzMTApCiAgc3RhdGljIGNvbnN0IGNoYXIKICAgIFhNUFByb2ZpbGVbXT0KICAgIHsKICAgICAgIjw/eHBhY2tldCBiZWdpbj1cIiVzXCIgaWQ9XCJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWRcIj8+XG4iCiAgICAgICI8eDp4bXBtZXRhIHhtbG5zOng9XCJhZG9iZTpuczptZXRhL1wiIHg6eG1wdGs9XCJBZG9iZSBYTVAgQ29yZSA0LjAtYzMxNiA0NC4yNTM5MjEsIFN1biBPY3QgMDEgMjAwNiAxNzowODoyM1wiPlxuIgogICAgICAiICAgPHJkZjpSREYgeG1sbnM6cmRmPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI1wiPlxuIgogICAgICAiICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCJcIlxuIgogICAgICAiICAgICAgICAgICAgeG1sbnM6eGFwPVwiaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL1wiPlxuIgogICAgICAiICAgICAgICAgPHhhcDpNb2RpZnlEYXRlPiVzPC94YXA6TW9kaWZ5RGF0ZT5cbiIKICAgICAgIiAgICAgICAgIDx4YXA6Q3JlYXRlRGF0ZT4lczwveGFwOkNyZWF0ZURhdGU+XG4iCiAgICAgICIgICAgICAgICA8eGFwOk1ldGFkYXRhRGF0ZT4lczwveGFwOk1ldGFkYXRhRGF0ZT5cbiIKICAgICAgIiAgICAgICAgIDx4YXA6Q3JlYXRvclRvb2w+JXM8L3hhcDpDcmVhdG9yVG9vbD5cbiIKICAgICAgIiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPlxuIgogICAgICAiICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCJcIlxuIgogICAgICAiICAgICAgICAgICAgeG1sbnM6ZGM9XCJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL1wiPlxuIgogICAgICAiICAgICAgICAgPGRjOmZvcm1hdD5hcHBsaWNhdGlvbi9wZGY8L2RjOmZvcm1hdD5cbiIKICAgICAgIiAgICAgICAgIDxkYzp0aXRsZT5cbiIKICAgICAgIiAgICAgICAgICAgPHJkZjpBbHQ+XG4iCiAgICAgICIgICAgICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9XCJ4LWRlZmF1bHRcIj4lczwvcmRmOmxpPlxuIgogICAgICAiICAgICAgICAgICA8L3JkZjpBbHQ+XG4iCiAgICAgICIgICAgICAgICA8L2RjOnRpdGxlPlxuIgogICAgICAiICAgICAgPC9yZGY6RGVzY3JpcHRpb24+XG4iCiAgICAgICIgICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD1cIlwiXG4iCiAgICAgICIgICAgICAgICAgICB4bWxuczp4YXBNTT1cImh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS9cIj5cbiIKICAgICAgIiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6NmVjMTE5ZDctNzk4Mi00ZjU2LTgwOGQtZGZlNjRmNWIzNWNmPC94YXBNTTpEb2N1bWVudElEPlxuIgogICAgICAiICAgICAgICAgPHhhcE1NOkluc3RhbmNlSUQ+dXVpZDphNzliOTliNC02MjM1LTQ0N2YtOWY2Yy1lYzE4ZWY3NTU1Y2I8L3hhcE1NOkluc3RhbmNlSUQ+XG4iCiAgICAgICIgICAgICA8L3JkZjpEZXNjcmlwdGlvbj5cbiIKICAgICAgIiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PVwiXCJcbiIKICAgICAgIiAgICAgICAgICAgIHhtbG5zOnBkZj1cImh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy9cIj5cbiIKICAgICAgIiAgICAgICAgIDxwZGY6UHJvZHVjZXI+JXM8L3BkZjpQcm9kdWNlcj5cbiIKICAgICAgIiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPlxuIgogICAgICAiICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCJcIlxuIgogICAgICAiICAgICAgICAgICAgeG1sbnM6cGRmYWlkPVwiaHR0cDovL3d3dy5haWltLm9yZy9wZGZhL25zL2lkL1wiPlxuIgogICAgICAiICAgICAgICAgPHBkZmFpZDpwYXJ0PjI8L3BkZmFpZDpwYXJ0PlxuIgogICAgICAiICAgICAgICAgPHBkZmFpZDpjb25mb3JtYW5jZT5CPC9wZGZhaWQ6Y29uZm9ybWFuY2U+XG4iCiAgICAgICIgICAgICA8L3JkZjpEZXNjcmlwdGlvbj5cbiIKICAgICAgIiAgIDwvcmRmOlJERj5cbiIKICAgICAgIjwveDp4bXBtZXRhPlxuIgogICAgICAiPD94cGFja2V0IGVuZD1cIndcIj8+XG4iCiAgICB9LAogICAgWE1QUHJvZmlsZU1hZ2lja1s0XT0geyAoY2hhcikgMHhlZiwgKGNoYXIpIDB4YmIsIChjaGFyKSAweGJmLCAoY2hhcikgMHgwMCB9OwpSZXN0b3JlTVNDV2FybmluZwoKICBjaGFyCiAgICBiYXNlbmFtZVtNYXhUZXh0RXh0ZW50XSwKICAgIGJ1ZmZlcltNYXhUZXh0RXh0ZW50XSwKICAgIGRhdGVbTWF4VGV4dEV4dGVudF0sCiAgICAqKmxhYmVscywKICAgIHBhZ2VfZ2VvbWV0cnlbTWF4VGV4dEV4dGVudF07CgogIENvbXByZXNzaW9uVHlwZQogICAgY29tcHJlc3Npb247CgogIGNvbnN0IGNoYXIKICAgICp2YWx1ZTsKCiAgZG91YmxlCiAgICBwb2ludHNpemU7CgogIEdlb21ldHJ5SW5mbwogICAgZ2VvbWV0cnlfaW5mbzsKCiAgSW1hZ2UKICAgICpuZXh0LAogICAgKnRpbGVfaW1hZ2U7CgogIE1hZ2lja0Jvb2xlYW5UeXBlCiAgICBzdGF0dXM7CgogIE1hZ2lja09mZnNldFR5cGUKICAgIG9mZnNldCwKICAgIHNjZW5lLAogICAgKnhyZWY7CgogIE1hZ2lja1NpemVUeXBlCiAgICBudW1iZXJfcGl4ZWxzOwoKICBNYWdpY2tTdGF0dXNUeXBlCiAgICBmbGFnczsKCiAgUG9pbnRJbmZvCiAgICBkZWx0YSwKICAgIHJlc29sdXRpb24sCiAgICBzY2FsZTsKCiAgUmVjdGFuZ2xlSW5mbwogICAgZ2VvbWV0cnksCiAgICBtZWRpYV9pbmZvLAogICAgcGFnZV9pbmZvOwoKICByZWdpc3RlciBjb25zdCBRdWFudHVtCiAgICAqcDsKCiAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhcgogICAgKnE7CgogIHJlZ2lzdGVyIHNzaXplX3QKICAgIGksCiAgICB4OwoKICBzaXplX3QKICAgIGluZm9faWQsCiAgICBsZW5ndGgsCiAgICBvYmplY3QsCiAgICBwYWdlc19pZCwKICAgIHJvb3RfaWQsCiAgICB0ZXh0X3NpemUsCiAgICB2ZXJzaW9uOwoKICBzc2l6ZV90CiAgICBjb3VudCwKICAgIHk7CgogIHN0cnVjdCB0bQogICAgbG9jYWxfdGltZTsKCiAgdGltZV90CiAgICBzZWNvbmRzOwoKICB1bnNpZ25lZCBjaGFyCiAgICAqcGl4ZWxzOwoKICAvKgogICAgT3BlbiBvdXRwdXQgaW1hZ2UgZmlsZS4KICAqLwogIGFzc2VydChpbWFnZV9pbmZvICE9IChjb25zdCBJbWFnZUluZm8gKikgTlVMTCk7CiAgYXNzZXJ0KGltYWdlX2luZm8tPnNpZ25hdHVyZSA9PSBNYWdpY2tTaWduYXR1cmUpOwogIGFzc2VydChpbWFnZSAhPSAoSW1hZ2UgKikgTlVMTCk7CiAgYXNzZXJ0KGltYWdlLT5zaWduYXR1cmUgPT0gTWFnaWNrU2lnbmF0dXJlKTsKICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFRyYWNlRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIixpbWFnZS0+ZmlsZW5hbWUpOwogIGFzc2VydChleGNlcHRpb24gIT0gKEV4Y2VwdGlvbkluZm8gKikgTlVMTCk7CiAgYXNzZXJ0KGV4Y2VwdGlvbi0+c2lnbmF0dXJlID09IE1hZ2lja1NpZ25hdHVyZSk7CiAgc3RhdHVzPU9wZW5CbG9iKGltYWdlX2luZm8saW1hZ2UsV3JpdGVCaW5hcnlCbG9iTW9kZSxleGNlcHRpb24pOwogIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICByZXR1cm4oc3RhdHVzKTsKICAvKgogICAgQWxsb2NhdGUgWCByZWYgbWVtb3J5LgogICovCiAgeHJlZj0oTWFnaWNrT2Zmc2V0VHlwZSAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeSgyMDQ4VUwsc2l6ZW9mKCp4cmVmKSk7CiAgaWYgKHhyZWYgPT0gKE1hZ2lja09mZnNldFR5cGUgKikgTlVMTCkKICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOwogICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeSh4cmVmLDAsMjA0OFVMKnNpemVvZigqeHJlZikpOwogIC8qCiAgICBXcml0ZSBJbmZvIG9iamVjdC4KICAqLwogIG9iamVjdD0wOwogIHZlcnNpb249MzsKICBpZiAoaW1hZ2VfaW5mby0+Y29tcHJlc3Npb24gPT0gSlBFRzIwMDBDb21wcmVzc2lvbikKICAgIHZlcnNpb249KHNpemVfdCkgTWFnaWNrTWF4KHZlcnNpb24sNSk7CiAgZm9yIChuZXh0PWltYWdlOyBuZXh0ICE9IChJbWFnZSAqKSBOVUxMOyBuZXh0PUdldE5leHRJbWFnZUluTGlzdChuZXh0KSkKICAgIGlmIChuZXh0LT5hbHBoYV90cmFpdCA9PSBCbGVuZFBpeGVsVHJhaXQpCiAgICAgIHZlcnNpb249KHNpemVfdCkgTWFnaWNrTWF4KHZlcnNpb24sNCk7CiAgaWYgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgPT0gMCkKICAgIHZlcnNpb249KHNpemVfdCkgTWFnaWNrTWF4KHZlcnNpb24sNik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJSVQREYtMS4lLjIwZyBcbiIsKGRvdWJsZSkKICAgIHZlcnNpb24pOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICBpZiAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERkEiKSA9PSAwKQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSXi48/TXG4iKTsKICAvKgogICAgV3JpdGUgQ2F0YWxvZyBvYmplY3QuCiAgKi8KICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgcm9vdF9pZD1vYmplY3Q7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgIG9iamVjdCk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICBpZiAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERkEiKSAhPSAwKQogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhZ2VzICUuMjBnIDAgUlxuIiwoZG91YmxlKQogICAgICBvYmplY3QrMSk7CiAgZWxzZQogICAgewogICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTWV0YWRhdGEgJS4yMGcgMCBSXG4iLAogICAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUGFnZXMgJS4yMGcgMCBSXG4iLAogICAgICAgIChkb3VibGUpIG9iamVjdCsyKTsKICAgIH0KICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1R5cGUgL0NhdGFsb2dcbiIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogIEdldFBhdGhDb21wb25lbnQoaW1hZ2UtPmZpbGVuYW1lLEJhc2VQYXRoLGJhc2VuYW1lKTsKICBpZiAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERkEiKSA9PSAwKQogICAgewogICAgICBjaGFyCiAgICAgICAgY3JlYXRlX2RhdGVbTWF4VGV4dEV4dGVudF0sCiAgICAgICAgbW9kaWZ5X2RhdGVbTWF4VGV4dEV4dGVudF0sCiAgICAgICAgdGltZXN0YW1wW01heFRleHRFeHRlbnRdLAogICAgICAgIHhtcF9wcm9maWxlW01heFRleHRFeHRlbnRdOwoKICAgICAgc2l6ZV90CiAgICAgICAgdmVyc2lvbjsKCiAgICAgIC8qCiAgICAgICAgV3JpdGUgWE1QIG9iamVjdC4KICAgICAgKi8KICAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgIG9iamVjdCk7CiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvU3VidHlwZSAvWE1MXG4iKTsKICAgICAgKm1vZGlmeV9kYXRlPSdcMCc7CiAgICAgIHZhbHVlPUdldEltYWdlUHJvcGVydHkoaW1hZ2UsImRhdGU6bW9kaWZ5IixleGNlcHRpb24pOwogICAgICBpZiAodmFsdWUgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhtb2RpZnlfZGF0ZSx2YWx1ZSxNYXhUZXh0RXh0ZW50KTsKICAgICAgKmNyZWF0ZV9kYXRlPSdcMCc7CiAgICAgIHZhbHVlPUdldEltYWdlUHJvcGVydHkoaW1hZ2UsImRhdGU6Y3JlYXRlIixleGNlcHRpb24pOwogICAgICBpZiAodmFsdWUgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhjcmVhdGVfZGF0ZSx2YWx1ZSxNYXhUZXh0RXh0ZW50KTsKICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1RpbWUodGltZSgodGltZV90ICopIE5VTEwpLE1heFRleHRFeHRlbnQsdGltZXN0YW1wKTsKICAgICAgaT1Gb3JtYXRMb2NhbGVTdHJpbmcoeG1wX3Byb2ZpbGUsTWF4VGV4dEV4dGVudCxYTVBQcm9maWxlLAogICAgICAgIFhNUFByb2ZpbGVNYWdpY2ssbW9kaWZ5X2RhdGUsY3JlYXRlX2RhdGUsdGltZXN0YW1wLAogICAgICAgIEdldE1hZ2lja1ZlcnNpb24oJnZlcnNpb24pLEVzY2FwZVBhcmVudGhlc2lzKGJhc2VuYW1lKSwKICAgICAgICBHZXRNYWdpY2tWZXJzaW9uKCZ2ZXJzaW9uKSk7CiAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgICBpKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvTWV0YWRhdGFcbiIpOwogICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+Plxuc3RyZWFtXG4iKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSx4bXBfcHJvZmlsZSk7CiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuZW5kc3RyZWFtXG4iKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIH0KICAvKgogICAgV3JpdGUgUGFnZXMgb2JqZWN0LgogICovCiAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogIHBhZ2VzX2lkPW9iamVjdDsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgb2JqZWN0KTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9QYWdlc1xuIik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0tpZHMgWyAlLjIwZyAwIFIgIiwoZG91YmxlKQogICAgb2JqZWN0KzEpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICBjb3VudD0oc3NpemVfdCkgKHBhZ2VzX2lkK09iamVjdHNQZXJJbWFnZSsxKTsKICBpZiAoaW1hZ2VfaW5mby0+YWRqb2luICE9IE1hZ2lja0ZhbHNlKQogICAgewogICAgICBJbWFnZQogICAgICAgICpraWRfaW1hZ2U7CgogICAgICAvKgogICAgICAgIFByZWRpY3QgcGFnZSBvYmplY3QgaWQncy4KICAgICAgKi8KICAgICAga2lkX2ltYWdlPWltYWdlOwogICAgICBmb3IgKCA7IEdldE5leHRJbWFnZUluTGlzdChraWRfaW1hZ2UpICE9IChJbWFnZSAqKSBOVUxMOyBjb3VudCs9T2JqZWN0c1BlckltYWdlKQogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBSICIsKGRvdWJsZSkKICAgICAgICAgIGNvdW50KTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAga2lkX2ltYWdlPUdldE5leHRJbWFnZUluTGlzdChraWRfaW1hZ2UpOwogICAgICB9CiAgICAgIHhyZWY9KE1hZ2lja09mZnNldFR5cGUgKikgUmVzaXplUXVhbnR1bU1lbW9yeSh4cmVmLChzaXplX3QpIGNvdW50KzIwNDhVTCwKICAgICAgICBzaXplb2YoKnhyZWYpKTsKICAgICAgaWYgKHhyZWYgPT0gKE1hZ2lja09mZnNldFR5cGUgKikgTlVMTCkKICAgICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgIH0KICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJdXG4iKTsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ291bnQgJS4yMGdcbiIsKGRvdWJsZSkKICAgICgoY291bnQtcGFnZXNfaWQpL09iamVjdHNQZXJJbWFnZSkpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICBzY2VuZT0wOwogIGRvCiAgewogICAgY29tcHJlc3Npb249VW5kZWZpbmVkQ29tcHJlc3Npb247CiAgICBpZiAoaW1hZ2VfaW5mby0+Y29tcHJlc3Npb24gIT0gVW5kZWZpbmVkQ29tcHJlc3Npb24pCiAgICAgIGNvbXByZXNzaW9uPWltYWdlX2luZm8tPmNvbXByZXNzaW9uOwogICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgIHsKICAgICAgY2FzZSBGYXhDb21wcmVzc2lvbjoKICAgICAgY2FzZSBHcm91cDRDb21wcmVzc2lvbjoKICAgICAgewogICAgICAgIGlmICgoSXNJbWFnZU1vbm9jaHJvbWUoaW1hZ2UsZXhjZXB0aW9uKSA9PSBNYWdpY2tGYWxzZSkgfHwKICAgICAgICAgICAgKGltYWdlLT5hbHBoYV90cmFpdCA9PSBCbGVuZFBpeGVsVHJhaXQpKQogICAgICAgICAgY29tcHJlc3Npb249UkxFQ29tcHJlc3Npb247CiAgICAgICAgYnJlYWs7CiAgICAgIH0KI2lmICFkZWZpbmVkKE1BR0lDS0NPUkVfSlBFR19ERUxFR0FURSkKICAgICAgY2FzZSBKUEVHQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICBjb21wcmVzc2lvbj1STEVDb21wcmVzc2lvbjsKICAgICAgICAodm9pZCkgVGhyb3dNYWdpY2tFeGNlcHRpb24oZXhjZXB0aW9uLEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgTWlzc2luZ0RlbGVnYXRlRXJyb3IsIkRlbGVnYXRlTGlicmFyeVN1cHBvcnROb3RCdWlsdEluIiwiYCVzJyAoSlBFRykiLAogICAgICAgICAgaW1hZ2UtPmZpbGVuYW1lKTsKICAgICAgICBicmVhazsKICAgICAgfQojZW5kaWYKI2lmICFkZWZpbmVkKE1BR0lDS0NPUkVfSlAyX0RFTEVHQVRFKQogICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICBjb21wcmVzc2lvbj1STEVDb21wcmVzc2lvbjsKICAgICAgICAodm9pZCkgVGhyb3dNYWdpY2tFeGNlcHRpb24oZXhjZXB0aW9uLEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgTWlzc2luZ0RlbGVnYXRlRXJyb3IsIkRlbGVnYXRlTGlicmFyeVN1cHBvcnROb3RCdWlsdEluIiwiYCVzJyAoSlAyKSIsCiAgICAgICAgICBpbWFnZS0+ZmlsZW5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICB9CiNlbmRpZgojaWYgIWRlZmluZWQoTUFHSUNLQ09SRV9aTElCX0RFTEVHQVRFKQogICAgICBjYXNlIFppcENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgY29tcHJlc3Npb249UkxFQ29tcHJlc3Npb247CiAgICAgICAgKHZvaWQpIFRocm93TWFnaWNrRXhjZXB0aW9uKGV4Y2VwdGlvbixHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgIE1pc3NpbmdEZWxlZ2F0ZUVycm9yLCJEZWxlZ2F0ZUxpYnJhcnlTdXBwb3J0Tm90QnVpbHRJbiIsImAlcycgKFpMSUIpIiwKICAgICAgICAgIGltYWdlLT5maWxlbmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KI2VuZGlmCiAgICAgIGNhc2UgTFpXQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICBpZiAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERkEiKSA9PSAwKQogICAgICAgICAgY29tcHJlc3Npb249UkxFQ29tcHJlc3Npb247ICAvKiBMWlcgY29tcHJlc3Npb24gaXMgZm9yYmlkZGVuICovCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgaWYgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgPT0gMCkKICAgICAgICAgIGNvbXByZXNzaW9uPVJMRUNvbXByZXNzaW9uOyAvKiBBU0NJSSA4NSBjb21wcmVzc2lvbiBpcyBmb3JiaWRkZW4gKi8KICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGNvbXByZXNzaW9uID09IEpQRUcyMDAwQ29tcHJlc3Npb24pCiAgICAgIHsKICAgICAgICBpZiAoSXNzUkdCQ29tcGF0aWJsZUNvbG9yc3BhY2UoaW1hZ2UtPmNvbG9yc3BhY2UpID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgKHZvaWQpIFRyYW5zZm9ybUltYWdlQ29sb3JzcGFjZShpbWFnZSxzUkdCQ29sb3JzcGFjZSxleGNlcHRpb24pOwogICAgICB9CiAgICAvKgogICAgICBTY2FsZSByZWxhdGl2ZSB0byBkb3RzLXBlci1pbmNoLgogICAgKi8KICAgIGRlbHRhLng9RGVmYXVsdFJlc29sdXRpb247CiAgICBkZWx0YS55PURlZmF1bHRSZXNvbHV0aW9uOwogICAgcmVzb2x1dGlvbi54PWltYWdlLT5yZXNvbHV0aW9uLng7CiAgICByZXNvbHV0aW9uLnk9aW1hZ2UtPnJlc29sdXRpb24ueTsKICAgIGlmICgocmVzb2x1dGlvbi54ID09IDAuMCkgfHwgKHJlc29sdXRpb24ueSA9PSAwLjApKQogICAgICB7CiAgICAgICAgZmxhZ3M9UGFyc2VHZW9tZXRyeShQU0RlbnNpdHlHZW9tZXRyeSwmZ2VvbWV0cnlfaW5mbyk7CiAgICAgICAgcmVzb2x1dGlvbi54PWdlb21ldHJ5X2luZm8ucmhvOwogICAgICAgIHJlc29sdXRpb24ueT1nZW9tZXRyeV9pbmZvLnNpZ21hOwogICAgICAgIGlmICgoZmxhZ3MgJiBTaWdtYVZhbHVlKSA9PSAwKQogICAgICAgICAgcmVzb2x1dGlvbi55PXJlc29sdXRpb24ueDsKICAgICAgfQogICAgaWYgKGltYWdlX2luZm8tPmRlbnNpdHkgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgewogICAgICAgIGZsYWdzPVBhcnNlR2VvbWV0cnkoaW1hZ2VfaW5mby0+ZGVuc2l0eSwmZ2VvbWV0cnlfaW5mbyk7CiAgICAgICAgcmVzb2x1dGlvbi54PWdlb21ldHJ5X2luZm8ucmhvOwogICAgICAgIHJlc29sdXRpb24ueT1nZW9tZXRyeV9pbmZvLnNpZ21hOwogICAgICAgIGlmICgoZmxhZ3MgJiBTaWdtYVZhbHVlKSA9PSAwKQogICAgICAgICAgcmVzb2x1dGlvbi55PXJlc29sdXRpb24ueDsKICAgICAgfQogICAgaWYgKGltYWdlLT51bml0cyA9PSBQaXhlbHNQZXJDZW50aW1ldGVyUmVzb2x1dGlvbikKICAgICAgewogICAgICAgIHJlc29sdXRpb24ueD0oZG91YmxlKSAoKHNpemVfdCkgKDEwMC4wKjIuNTQqcmVzb2x1dGlvbi54KzAuNSkvMTAwLjApOwogICAgICAgIHJlc29sdXRpb24ueT0oZG91YmxlKSAoKHNpemVfdCkgKDEwMC4wKjIuNTQqcmVzb2x1dGlvbi55KzAuNSkvMTAwLjApOwogICAgICB9CiAgICBTZXRHZW9tZXRyeShpbWFnZSwmZ2VvbWV0cnkpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnIiwoZG91YmxlKQogICAgICBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICBpZiAoaW1hZ2VfaW5mby0+cGFnZSAhPSAoY2hhciAqKSBOVUxMKQogICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LGltYWdlX2luZm8tPnBhZ2UsTWF4VGV4dEV4dGVudCk7CiAgICBlbHNlCiAgICAgIGlmICgoaW1hZ2UtPnBhZ2Uud2lkdGggIT0gMCkgJiYgKGltYWdlLT5wYWdlLmhlaWdodCAhPSAwKSkKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZyUrLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPnBhZ2Uud2lkdGgsKGRvdWJsZSkKICAgICAgICAgIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKSBpbWFnZS0+cGFnZS54LChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgICBlbHNlCiAgICAgICAgaWYgKChpbWFnZS0+Z3Jhdml0eSAhPSBVbmRlZmluZWRHcmF2aXR5KSAmJgogICAgICAgICAgICAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERiIpID09IDApKQogICAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxQU1BhZ2VHZW9tZXRyeSxNYXhUZXh0RXh0ZW50KTsKICAgICh2b2lkKSBDb25jYXRlbmF0ZU1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LCI+IixNYXhUZXh0RXh0ZW50KTsKICAgICh2b2lkKSBQYXJzZU1ldGFHZW9tZXRyeShwYWdlX2dlb21ldHJ5LCZnZW9tZXRyeS54LCZnZW9tZXRyeS55LAogICAgICAmZ2VvbWV0cnkud2lkdGgsJmdlb21ldHJ5LmhlaWdodCk7CiAgICBzY2FsZS54PShkb3VibGUpIChnZW9tZXRyeS53aWR0aCpkZWx0YS54KS9yZXNvbHV0aW9uLng7CiAgICBnZW9tZXRyeS53aWR0aD0oc2l6ZV90KSBmbG9vcihzY2FsZS54KzAuNSk7CiAgICBzY2FsZS55PShkb3VibGUpIChnZW9tZXRyeS5oZWlnaHQqZGVsdGEueSkvcmVzb2x1dGlvbi55OwogICAgZ2VvbWV0cnkuaGVpZ2h0PShzaXplX3QpIGZsb29yKHNjYWxlLnkrMC41KTsKICAgICh2b2lkKSBQYXJzZUFic29sdXRlR2VvbWV0cnkocGFnZV9nZW9tZXRyeSwmbWVkaWFfaW5mbyk7CiAgICAodm9pZCkgUGFyc2VHcmF2aXR5R2VvbWV0cnkoaW1hZ2UscGFnZV9nZW9tZXRyeSwmcGFnZV9pbmZvLGV4Y2VwdGlvbik7CiAgICBpZiAoaW1hZ2UtPmdyYXZpdHkgIT0gVW5kZWZpbmVkR3Jhdml0eSkKICAgICAgewogICAgICAgIGdlb21ldHJ5Lng9KC1wYWdlX2luZm8ueCk7CiAgICAgICAgZ2VvbWV0cnkueT0oc3NpemVfdCkgKG1lZGlhX2luZm8uaGVpZ2h0K3BhZ2VfaW5mby55LWltYWdlLT5yb3dzKTsKICAgICAgfQogICAgcG9pbnRzaXplPTEyLjA7CiAgICBpZiAoaW1hZ2VfaW5mby0+cG9pbnRzaXplICE9IDAuMCkKICAgICAgcG9pbnRzaXplPWltYWdlX2luZm8tPnBvaW50c2l6ZTsKICAgIHRleHRfc2l6ZT0wOwogICAgdmFsdWU9R2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSwibGFiZWwiLGV4Y2VwdGlvbik7CiAgICBpZiAodmFsdWUgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKICAgICAgdGV4dF9zaXplPShzaXplX3QpIChNdWx0aWxpbmVDZW5zdXModmFsdWUpKnBvaW50c2l6ZSsxMik7CiAgICAodm9pZCkgdGV4dF9zaXplOwogICAgLyoKICAgICAgV3JpdGUgUGFnZSBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9QYWdlXG4iKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9QYXJlbnQgJS4yMGcgMCBSXG4iLAogICAgICAoZG91YmxlKSBwYWdlc19pZCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvUmVzb3VyY2VzIDw8XG4iKTsKICAgIGxhYmVscz0oY2hhciAqKikgTlVMTDsKICAgIHZhbHVlPUdldEltYWdlUHJvcGVydHkoaW1hZ2UsImxhYmVsIixleGNlcHRpb24pOwogICAgaWYgKHZhbHVlICE9IChjb25zdCBjaGFyICopIE5VTEwpCiAgICAgIGxhYmVscz1TdHJpbmdUb0xpc3QodmFsdWUpOwogICAgaWYgKGxhYmVscyAhPSAoY2hhciAqKikgTlVMTCkKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCiAgICAgICAgICAiL0ZvbnQgPDwgL0YlLjIwZyAlLjIwZyAwIFIgPj5cbiIsKGRvdWJsZSkgaW1hZ2UtPnNjZW5lLChkb3VibGUpCiAgICAgICAgICBvYmplY3QrNCk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICB9CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAiL1hPYmplY3QgPDwgL0ltJS4yMGcgJS4yMGcgMCBSID4+XG4iLChkb3VibGUpIGltYWdlLT5zY2VuZSwoZG91YmxlKQogICAgICBvYmplY3QrNSk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUHJvY1NldCAlLjIwZyAwIFIgPj5cbiIsCiAgICAgIChkb3VibGUpIG9iamVjdCszKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCiAgICAgICIvTWVkaWFCb3ggWzAgMCAlZyAlZ11cbiIsNzIuMCptZWRpYV9pbmZvLndpZHRoL3Jlc29sdXRpb24ueCwKICAgICAgNzIuMCptZWRpYV9pbmZvLmhlaWdodC9yZXNvbHV0aW9uLnkpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKICAgICAgIi9Dcm9wQm94IFswIDAgJWcgJWddXG4iLDcyLjAqbWVkaWFfaW5mby53aWR0aC9yZXNvbHV0aW9uLngsCiAgICAgIDcyLjAqbWVkaWFfaW5mby5oZWlnaHQvcmVzb2x1dGlvbi55KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Db250ZW50cyAlLjIwZyAwIFJcbiIsCiAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9UaHVtYiAlLjIwZyAwIFJcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KzgpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIENvbnRlbnRzIG9iamVjdC4KICAgICovCiAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICBvYmplY3QpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlLjIwZyAwIFJcbiIsCiAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CiAgICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwicVxuIik7CiAgICBpZiAobGFiZWxzICE9IChjaGFyICoqKSBOVUxMKQogICAgICBmb3IgKGk9MDsgbGFiZWxzW2ldICE9IChjaGFyICopIE5VTEw7IGkrKykKICAgICAgewogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIkJUXG4iKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRiUuMjBnICVnIFRmXG4iLAogICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnNjZW5lLHBvaW50c2l6ZSk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnIFRkXG4iLAogICAgICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSAoZ2VvbWV0cnkueStnZW9tZXRyeS5oZWlnaHQraSpwb2ludHNpemUrCiAgICAgICAgICAxMikpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIoJXMpIFRqXG4iLGxhYmVsc1tpXSk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIkVUXG4iKTsKICAgICAgICBsYWJlbHNbaV09RGVzdHJveVN0cmluZyhsYWJlbHNbaV0pOwogICAgICB9CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlZyAwIDAgJWcgJS4yMGcgJS4yMGcgY21cbiIsCiAgICAgIHNjYWxlLngsc2NhbGUueSwoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5LnkpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0ltJS4yMGcgRG9cbiIsKGRvdWJsZSkKICAgICAgaW1hZ2UtPnNjZW5lKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlFcbiIpOwogICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKS1vZmZzZXQ7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJcbmVuZHN0cmVhbVxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgTGVuZ3RoIG9iamVjdC4KICAgICovCiAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICBvYmplY3QpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkgb2Zmc2V0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAvKgogICAgICBXcml0ZSBQcm9jc2V0IG9iamVjdC4KICAgICovCiAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICBvYmplY3QpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgaWYgKChpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBEaXJlY3RDbGFzcykgfHwgKGltYWdlLT5jb2xvcnMgPiAyNTYpKQogICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIlsgL1BERiAvVGV4dCAvSW1hZ2VDIixNYXhUZXh0RXh0ZW50KTsKICAgIGVsc2UKICAgICAgaWYgKChjb21wcmVzc2lvbiA9PSBGYXhDb21wcmVzc2lvbikgfHwgKGNvbXByZXNzaW9uID09IEdyb3VwNENvbXByZXNzaW9uKSkKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIlsgL1BERiAvVGV4dCAvSW1hZ2VCIixNYXhUZXh0RXh0ZW50KTsKICAgICAgZWxzZQogICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGJ1ZmZlciwiWyAvUERGIC9UZXh0IC9JbWFnZUkiLE1heFRleHRFeHRlbnQpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiIF1cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIEZvbnQgb2JqZWN0LgogICAgKi8KICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICBpZiAobGFiZWxzICE9IChjaGFyICoqKSBOVUxMKQogICAgICB7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1R5cGUgL0ZvbnRcbiIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9TdWJ0eXBlIC9UeXBlMVxuIik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL05hbWUgL0YlLjIwZ1xuIiwKICAgICAgICAgIChkb3VibGUpIGltYWdlLT5zY2VuZSk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9CYXNlRm9udCAvSGVsdmV0aWNhXG4iKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmdcbiIpOwogICAgICAgIGxhYmVscz0oY2hhciAqKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShsYWJlbHMpOwogICAgICB9CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgWE9iamVjdCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9YT2JqZWN0XG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9TdWJ0eXBlIC9JbWFnZVxuIik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTmFtZSAvSW0lLjIwZ1xuIiwoZG91YmxlKQogICAgICBpbWFnZS0+c2NlbmUpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgIHsKICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJBU0NJSTg1RGVjb2RlIik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBKUEVHQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsIkRDVERlY29kZSIpOwogICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSAhPSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgIGJyZWFrOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZWNvZGUgWzEgMCAxIDAgMSAwIDEgMF1cbiIsCiAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsIkpQWERlY29kZSIpOwogICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSAhPSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgIGJyZWFrOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZWNvZGUgWzEgMCAxIDAgMSAwIDEgMF1cbiIsCiAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIExaV0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJMWldEZWNvZGUiKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIFppcENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJGbGF0ZURlY29kZSIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgRmF4Q29tcHJlc3Npb246CiAgICAgIGNhc2UgR3JvdXA0Q29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9GaWx0ZXIgWyAvQ0NJVFRGYXhEZWNvZGUgXVxuIiwKICAgICAgICAgIE1heFRleHRFeHRlbnQpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRGVjb2RlUGFybXMgWyA8PCAiCiAgICAgICAgICAiL0sgJXMgL0JsYWNrSXMxIGZhbHNlIC9Db2x1bW5zICUuMjBnIC9Sb3dzICUuMjBnID4+IF1cbiIsQ0NJVFRQYXJhbSwKICAgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LAogICAgICAgICAgIlJ1bkxlbmd0aERlY29kZSIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvV2lkdGggJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgaW1hZ2UtPmNvbHVtbnMpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0hlaWdodCAlLjIwZ1xuIiwoZG91YmxlKQogICAgICBpbWFnZS0+cm93cyk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29sb3JTcGFjZSAlLjIwZyAwIFJcbiIsCiAgICAgIChkb3VibGUpIG9iamVjdCsyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9CaXRzUGVyQ29tcG9uZW50ICVkXG4iLAogICAgICAoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgPwogICAgICAxIDogOCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICBpZiAoaW1hZ2UtPmFscGhhX3RyYWl0ID09IEJsZW5kUGl4ZWxUcmFpdCkKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9TTWFzayAlLjIwZyAwIFJcbiIsCiAgICAgICAgICAoZG91YmxlKSBvYmplY3QrNyk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICB9CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKICAgICAgKGRvdWJsZSkgb2JqZWN0KzEpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwic3RyZWFtXG4iKTsKICAgIG9mZnNldD1UZWxsQmxvYihpbWFnZSk7CiAgICBudW1iZXJfcGl4ZWxzPShNYWdpY2tTaXplVHlwZSkgaW1hZ2UtPmNvbHVtbnMqaW1hZ2UtPnJvd3M7CiAgICBpZiAoKDQqbnVtYmVyX3BpeGVscykgIT0gKE1hZ2lja1NpemVUeXBlKSAoKHNpemVfdCkgKDQqbnVtYmVyX3BpeGVscykpKQogICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgIGlmICgoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgfHwKICAgICAgICAoKGltYWdlX2luZm8tPnR5cGUgIT0gVHJ1ZUNvbG9yVHlwZSkgJiYKICAgICAgICAgKElzSW1hZ2VHcmF5KGltYWdlLGV4Y2VwdGlvbikgIT0gTWFnaWNrRmFsc2UpKSkKICAgICAgewogICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgewogICAgICAgICAgY2FzZSBGYXhDb21wcmVzc2lvbjoKICAgICAgICAgIGNhc2UgR3JvdXA0Q29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChMb2NhbGVDb21wYXJlKENDSVRUUGFyYW0sIjAiKSA9PSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBIdWZmbWFuRW5jb2RlSW1hZ2UoaW1hZ2VfaW5mbyxpbWFnZSxpbWFnZSxleGNlcHRpb24pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAodm9pZCkgSHVmZm1hbjJERW5jb2RlSW1hZ2UoaW1hZ2VfaW5mbyxpbWFnZSxpbWFnZSxleGNlcHRpb24pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgSlBFR0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICBzdGF0dXM9SW5qZWN0SW1hZ2VCbG9iKGltYWdlX2luZm8saW1hZ2UsaW1hZ2UsImpwZWciLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cz1JbmplY3RJbWFnZUJsb2IoaW1hZ2VfaW5mbyxpbWFnZSxpbWFnZSwianAyIixleGNlcHRpb24pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBSTEVDb21wcmVzc2lvbjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIE1lbW9yeUluZm8KICAgICAgICAgICAgICAqcGl4ZWxfaW5mbzsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgQWxsb2NhdGUgcGl4ZWwgYXJyYXkuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGxlbmd0aD0oc2l6ZV90KSBudW1iZXJfcGl4ZWxzOwogICAgICAgICAgICBwaXhlbF9pbmZvPUFjcXVpcmVWaXJ0dWFsTWVtb3J5KGxlbmd0aCxzaXplb2YoKnBpeGVscykpOwogICAgICAgICAgICBpZiAocGl4ZWxfaW5mbyA9PSAoTWVtb3J5SW5mbyAqKSBOVUxMKQogICAgICAgICAgICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOwogICAgICAgICAgICBwaXhlbHM9KHVuc2lnbmVkIGNoYXIgKikgR2V0VmlydHVhbE1lbW9yeUJsb2IocGl4ZWxfaW5mbyk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgRHVtcCBSdW5sZW5ndGggZW5jb2RlZCBwaXhlbHMuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcD1HZXRWaXJ0dWFsUGl4ZWxzKGltYWdlLDAseSxpbWFnZS0+Y29sdW1ucywxLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGZvciAoeD0wOyB4IDwgKHNzaXplX3QpIGltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoQ2xhbXBUb1F1YW50dW0oR2V0UGl4ZWxMdW1hKGltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGltYWdlLT5wcmV2aW91cyA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgc3RhdHVzPVNldEltYWdlUHJvZ3Jlc3MoaW1hZ2UsU2F2ZUltYWdlVGFnLChNYWdpY2tPZmZzZXRUeXBlKQogICAgICAgICAgICAgICAgICAgIHksaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfWkxJQl9ERUxFR0FURSkKICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IFppcENvbXByZXNzaW9uKQogICAgICAgICAgICAgIHN0YXR1cz1aTElCRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBMWldDb21wcmVzc2lvbikKICAgICAgICAgICAgICAgIHN0YXR1cz1MWldFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3RhdHVzPVBhY2tiaXRzRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBwaXhlbF9pbmZvPVJlbGlucXVpc2hWaXJ0dWFsTWVtb3J5KHBpeGVsX2luZm8pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgIER1bXAgdW5jb21wcmVzc2VkIFBzZXVkb0NvbG9yIHBhY2tldHMuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKENsYW1wVG9RdWFudHVtKAogICAgICAgICAgICAgICAgICBHZXRQaXhlbEx1bWEoaW1hZ2UscCkpKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGltYWdlLT5wcmV2aW91cyA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgc3RhdHVzPVNldEltYWdlUHJvZ3Jlc3MoaW1hZ2UsU2F2ZUltYWdlVGFnLChNYWdpY2tPZmZzZXRUeXBlKQogICAgICAgICAgICAgICAgICAgIHksaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEFzY2lpODVGbHVzaChpbWFnZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgZWxzZQogICAgICBpZiAoKGltYWdlLT5zdG9yYWdlX2NsYXNzID09IERpcmVjdENsYXNzKSB8fCAoaW1hZ2UtPmNvbG9ycyA+IDI1NikgfHwKICAgICAgICAgIChjb21wcmVzc2lvbiA9PSBKUEVHQ29tcHJlc3Npb24pIHx8CiAgICAgICAgICAoY29tcHJlc3Npb24gPT0gSlBFRzIwMDBDb21wcmVzc2lvbikpCiAgICAgICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgICAgICB7CiAgICAgICAgICBjYXNlIEpQRUdDb21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgc3RhdHVzPUluamVjdEltYWdlQmxvYihpbWFnZV9pbmZvLGltYWdlLGltYWdlLCJqcGVnIixleGNlcHRpb24pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBKUEVHMjAwMENvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICBzdGF0dXM9SW5qZWN0SW1hZ2VCbG9iKGltYWdlX2luZm8saW1hZ2UsaW1hZ2UsImpwMiIsZXhjZXB0aW9uKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICAgICAgICAgICAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgUkxFQ29tcHJlc3Npb246CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgewogICAgICAgICAgICBNZW1vcnlJbmZvCiAgICAgICAgICAgICAgKnBpeGVsX2luZm87CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgIEFsbG9jYXRlIHBpeGVsIGFycmF5LgogICAgICAgICAgICAqLwogICAgICAgICAgICBsZW5ndGg9KHNpemVfdCkgbnVtYmVyX3BpeGVsczsKICAgICAgICAgICAgbGVuZ3RoKj1pbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSA/IDRVTCA6IDNVTDsKICAgICAgICAgICAgcGl4ZWxfaW5mbz1BY3F1aXJlVmlydHVhbE1lbW9yeShsZW5ndGgsc2l6ZW9mKCpwaXhlbHMpKTsKICAgICAgICAgICAgaWYgKHBpeGVsX2luZm8gPT0gKE1lbW9yeUluZm8gKikgTlVMTCkKICAgICAgICAgICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICAgICAgICAgcGl4ZWxzPSh1bnNpZ25lZCBjaGFyICopIEdldFZpcnR1YWxNZW1vcnlCbG9iKHBpeGVsX2luZm8pOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgIER1bXAgcnVub2Zmc2V0IGVuY29kZWQgcGl4ZWxzLgogICAgICAgICAgICAqLwogICAgICAgICAgICBxPXBpeGVsczsKICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICpxKys9U2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsUmVkKGltYWdlLHApKTsKICAgICAgICAgICAgICAgICpxKys9U2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsR3JlZW4oaW1hZ2UscCkpOwogICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxCbHVlKGltYWdlLHApKTsKICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxCbGFjayhpbWFnZSxwKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGltYWdlLT5wcmV2aW91cyA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgc3RhdHVzPVNldEltYWdlUHJvZ3Jlc3MoaW1hZ2UsU2F2ZUltYWdlVGFnLChNYWdpY2tPZmZzZXRUeXBlKQogICAgICAgICAgICAgICAgICAgIHksaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfWkxJQl9ERUxFR0FURSkKICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IFppcENvbXByZXNzaW9uKQogICAgICAgICAgICAgIHN0YXR1cz1aTElCRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBMWldDb21wcmVzc2lvbikKICAgICAgICAgICAgICAgIHN0YXR1cz1MWldFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3RhdHVzPVBhY2tiaXRzRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBwaXhlbF9pbmZvPVJlbGlucXVpc2hWaXJ0dWFsTWVtb3J5KHBpeGVsX2luZm8pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgIER1bXAgdW5jb21wcmVzc2VkIERpcmVjdENvbG9yIHBhY2tldHMuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsUmVkKGltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEdyZWVuKGltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEJsdWUoaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoCiAgICAgICAgICAgICAgICAgICAgR2V0UGl4ZWxCbGFjayhpbWFnZSxwKSkpOwogICAgICAgICAgICAgICAgcCs9R2V0UGl4ZWxDaGFubmVscyhpbWFnZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChpbWFnZS0+cHJldmlvdXMgPT0gKEltYWdlICopIE5VTEwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHN0YXR1cz1TZXRJbWFnZVByb2dyZXNzKGltYWdlLFNhdmVJbWFnZVRhZywoTWFnaWNrT2Zmc2V0VHlwZSkKICAgICAgICAgICAgICAgICAgICB5LGltYWdlLT5yb3dzKTsKICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBBc2NpaTg1Rmx1c2goaW1hZ2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvKgogICAgICAgICAgICBEdW1wIG51bWJlciBvZiBjb2xvcnMgYW5kIGNvbG9ybWFwLgogICAgICAgICAgKi8KICAgICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgUkxFQ29tcHJlc3Npb246CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBNZW1vcnlJbmZvCiAgICAgICAgICAgICAgICAqcGl4ZWxfaW5mbzsKCiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIEFsbG9jYXRlIHBpeGVsIGFycmF5LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgbGVuZ3RoPShzaXplX3QpIG51bWJlcl9waXhlbHM7CiAgICAgICAgICAgICAgcGl4ZWxfaW5mbz1BY3F1aXJlVmlydHVhbE1lbW9yeShsZW5ndGgsc2l6ZW9mKCpwaXhlbHMpKTsKICAgICAgICAgICAgICBpZiAocGl4ZWxfaW5mbyA9PSAoTWVtb3J5SW5mbyAqKSBOVUxMKQogICAgICAgICAgICAgICAgVGhyb3dXcml0ZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLAogICAgICAgICAgICAgICAgICAiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOwogICAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBHZXRWaXJ0dWFsTWVtb3J5QmxvYihwaXhlbF9pbmZvKTsKICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgRHVtcCBSdW5sZW5ndGggZW5jb2RlZCBwaXhlbHMuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICBxPXBpeGVsczsKICAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAqcSsrPSh1bnNpZ25lZCBjaGFyKSBHZXRQaXhlbEluZGV4KGltYWdlLHApOwogICAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+cHJldmlvdXMgPT0gKEltYWdlICopIE5VTEwpCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM9U2V0SW1hZ2VQcm9ncmVzcyhpbWFnZSxTYXZlSW1hZ2VUYWcsCiAgICAgICAgICAgICAgICAgICAgICAoTWFnaWNrT2Zmc2V0VHlwZSkgeSxpbWFnZS0+cm93cyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX1pMSUJfREVMRUdBVEUpCiAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IFppcENvbXByZXNzaW9uKQogICAgICAgICAgICAgICAgc3RhdHVzPVpMSUJFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBMWldDb21wcmVzc2lvbikKICAgICAgICAgICAgICAgICAgc3RhdHVzPUxaV0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgc3RhdHVzPVBhY2tiaXRzRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICAgIHBpeGVsX2luZm89UmVsaW5xdWlzaFZpcnR1YWxNZW1vcnkocGl4ZWxfaW5mbyk7CiAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIER1bXAgdW5jb21wcmVzc2VkIFBzZXVkb0NvbG9yIHBhY2tldHMuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICBBc2NpaTg1SW5pdGlhbGl6ZShpbWFnZSk7CiAgICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHMoaW1hZ2UsMCx5LGltYWdlLT5jb2x1bW5zLDEsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgaW1hZ2UtPmNvbHVtbnM7IHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSwodW5zaWduZWQgY2hhcikgR2V0UGl4ZWxJbmRleChpbWFnZSxwKSk7CiAgICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHMoaW1hZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGltYWdlLT5wcmV2aW91cyA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0YXR1cz1TZXRJbWFnZVByb2dyZXNzKGltYWdlLFNhdmVJbWFnZVRhZywKICAgICAgICAgICAgICAgICAgICAgIChNYWdpY2tPZmZzZXRUeXBlKSB5LGltYWdlLT5yb3dzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgQXNjaWk4NUZsdXNoKGltYWdlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgIG9mZnNldD1UZWxsQmxvYihpbWFnZSktb2Zmc2V0OwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXG5lbmRzdHJlYW1cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgQ29sb3JzcGFjZSBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkKICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCIvRGV2aWNlQ01ZS1xuIixNYXhUZXh0RXh0ZW50KTsKICAgIGVsc2UKICAgICAgaWYgKChjb21wcmVzc2lvbiA9PSBGYXhDb21wcmVzc2lvbikgfHwKICAgICAgICAgIChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgfHwKICAgICAgICAgICgoaW1hZ2VfaW5mby0+dHlwZSAhPSBUcnVlQ29sb3JUeXBlKSAmJgogICAgICAgICAgIChJc0ltYWdlR3JheShpbWFnZSxleGNlcHRpb24pICE9IE1hZ2lja0ZhbHNlKSkpCiAgICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZXZpY2VHcmF5XG4iLE1heFRleHRFeHRlbnQpOwogICAgICBlbHNlCiAgICAgICAgaWYgKChpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBEaXJlY3RDbGFzcykgfHwgKGltYWdlLT5jb2xvcnMgPiAyNTYpIHx8CiAgICAgICAgICAgIChjb21wcmVzc2lvbiA9PSBKUEVHQ29tcHJlc3Npb24pIHx8CiAgICAgICAgICAgIChjb21wcmVzc2lvbiA9PSBKUEVHMjAwMENvbXByZXNzaW9uKSkKICAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGJ1ZmZlciwiL0RldmljZVJHQlxuIixNYXhUZXh0RXh0ZW50KTsKICAgICAgICBlbHNlCiAgICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAgICAgICAiWyAvSW5kZXhlZCAvRGV2aWNlUkdCICUuMjBnICUuMjBnIDAgUiBdXG4iLChkb3VibGUpIGltYWdlLT5jb2xvcnMtCiAgICAgICAgICAgIDEsKGRvdWJsZSkgb2JqZWN0KzMpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIFRodW1iIG9iamVjdC4KICAgICovCiAgICBTZXRHZW9tZXRyeShpbWFnZSwmZ2VvbWV0cnkpOwogICAgKHZvaWQpIFBhcnNlTWV0YUdlb21ldHJ5KCIxMDZ4MTA2KzArMD4iLCZnZW9tZXRyeS54LCZnZW9tZXRyeS55LAogICAgICAmZ2VvbWV0cnkud2lkdGgsJmdlb21ldHJ5LmhlaWdodCk7CiAgICB0aWxlX2ltYWdlPVRodW1ibmFpbEltYWdlKGltYWdlLGdlb21ldHJ5LndpZHRoLGdlb21ldHJ5LmhlaWdodCxleGNlcHRpb24pOwogICAgaWYgKHRpbGVfaW1hZ2UgPT0gKEltYWdlICopIE5VTEwpCiAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICBvYmplY3QpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgIHsKICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJBU0NJSTg1RGVjb2RlIik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBKUEVHQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsIkRDVERlY29kZSIpOwogICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSAhPSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgIGJyZWFrOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZWNvZGUgWzEgMCAxIDAgMSAwIDEgMF1cbiIsCiAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsIkpQWERlY29kZSIpOwogICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSAhPSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgIGJyZWFrOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZWNvZGUgWzEgMCAxIDAgMSAwIDEgMF1cbiIsCiAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIExaV0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJMWldEZWNvZGUiKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIFppcENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJGbGF0ZURlY29kZSIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgRmF4Q29tcHJlc3Npb246CiAgICAgIGNhc2UgR3JvdXA0Q29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9GaWx0ZXIgWyAvQ0NJVFRGYXhEZWNvZGUgXVxuIiwKICAgICAgICAgIE1heFRleHRFeHRlbnQpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRGVjb2RlUGFybXMgWyA8PCAiCiAgICAgICAgICAiL0sgJXMgL0JsYWNrSXMxIGZhbHNlIC9Db2x1bW5zICUuMjBnIC9Sb3dzICUuMjBnID4+IF1cbiIsQ0NJVFRQYXJhbSwKICAgICAgICAgIChkb3VibGUpIHRpbGVfaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgdGlsZV9pbWFnZS0+cm93cyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVmYXVsdDoKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsQ0Zvcm1hdCwKICAgICAgICAgICJSdW5MZW5ndGhEZWNvZGUiKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1dpZHRoICUuMjBnXG4iLChkb3VibGUpCiAgICAgIHRpbGVfaW1hZ2UtPmNvbHVtbnMpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0hlaWdodCAlLjIwZ1xuIiwoZG91YmxlKQogICAgICB0aWxlX2ltYWdlLT5yb3dzKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Db2xvclNwYWNlICUuMjBnIDAgUlxuIiwKICAgICAgKGRvdWJsZSkgb2JqZWN0LTEpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0JpdHNQZXJDb21wb25lbnQgJWRcbiIsCiAgICAgIChjb21wcmVzc2lvbiA9PSBGYXhDb21wcmVzc2lvbikgfHwgKGNvbXByZXNzaW9uID09IEdyb3VwNENvbXByZXNzaW9uKSA/CiAgICAgIDEgOiA4KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGcgMCBSXG4iLAogICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwogICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKTsKICAgIG51bWJlcl9waXhlbHM9KE1hZ2lja1NpemVUeXBlKSB0aWxlX2ltYWdlLT5jb2x1bW5zKnRpbGVfaW1hZ2UtPnJvd3M7CiAgICBpZiAoKGNvbXByZXNzaW9uID09IEZheENvbXByZXNzaW9uKSB8fAogICAgICAgIChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgfHwKICAgICAgICAoKGltYWdlX2luZm8tPnR5cGUgIT0gVHJ1ZUNvbG9yVHlwZSkgJiYKICAgICAgICAgKElzSW1hZ2VHcmF5KHRpbGVfaW1hZ2UsZXhjZXB0aW9uKSAhPSBNYWdpY2tGYWxzZSkpKQogICAgICB7CiAgICAgICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgICAgICB7CiAgICAgICAgICBjYXNlIEZheENvbXByZXNzaW9uOgogICAgICAgICAgY2FzZSBHcm91cDRDb21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKExvY2FsZUNvbXBhcmUoQ0NJVFRQYXJhbSwiMCIpID09IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIEh1ZmZtYW5FbmNvZGVJbWFnZShpbWFnZV9pbmZvLGltYWdlLHRpbGVfaW1hZ2UsCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICh2b2lkKSBIdWZmbWFuMkRFbmNvZGVJbWFnZShpbWFnZV9pbmZvLGltYWdlLHRpbGVfaW1hZ2UsZXhjZXB0aW9uKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEpQRUdDb21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgc3RhdHVzPUluamVjdEltYWdlQmxvYihpbWFnZV9pbmZvLGltYWdlLHRpbGVfaW1hZ2UsImpwZWciLAogICAgICAgICAgICAgIGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cz1JbmplY3RJbWFnZUJsb2IoaW1hZ2VfaW5mbyxpbWFnZSx0aWxlX2ltYWdlLCJqcDIiLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIFJMRUNvbXByZXNzaW9uOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHsKICAgICAgICAgICAgTWVtb3J5SW5mbwogICAgICAgICAgICAgICpwaXhlbF9pbmZvOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBBbGxvY2F0ZSBwaXhlbCBhcnJheS4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgbGVuZ3RoPShzaXplX3QpIG51bWJlcl9waXhlbHM7CiAgICAgICAgICAgIHBpeGVsX2luZm89QWNxdWlyZVZpcnR1YWxNZW1vcnkobGVuZ3RoLHNpemVvZigqcGl4ZWxzKSk7CiAgICAgICAgICAgIGlmIChwaXhlbF9pbmZvID09IChNZW1vcnlJbmZvICopIE5VTEwpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGlsZV9pbWFnZT1EZXN0cm95SW1hZ2UodGlsZV9pbWFnZSk7CiAgICAgICAgICAgICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsCiAgICAgICAgICAgICAgICAgICJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBwaXhlbHM9KHVuc2lnbmVkIGNoYXIgKikgR2V0VmlydHVhbE1lbW9yeUJsb2IocGl4ZWxfaW5mbyk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgRHVtcCBydW5sZW5ndGggZW5jb2RlZCBwaXhlbHMuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHModGlsZV9pbWFnZSwwLHksdGlsZV9pbWFnZS0+Y29sdW1ucywxLAogICAgICAgICAgICAgICAgZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBpZiAocCA9PSAoY29uc3QgUXVhbnR1bSAqKSBOVUxMKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgdGlsZV9pbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICpxKys9U2NhbGVRdWFudHVtVG9DaGFyKENsYW1wVG9RdWFudHVtKEdldFBpeGVsTHVtYSgKICAgICAgICAgICAgICAgICAgdGlsZV9pbWFnZSxwKSkpOwogICAgICAgICAgICAgICAgcCs9R2V0UGl4ZWxDaGFubmVscyh0aWxlX2ltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9aTElCX0RFTEVHQVRFKQogICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gWmlwQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgc3RhdHVzPVpMSUJFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IExaV0NvbXByZXNzaW9uKQogICAgICAgICAgICAgICAgc3RhdHVzPUxaV0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzdGF0dXM9UGFja2JpdHNFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIHBpeGVsX2luZm89UmVsaW5xdWlzaFZpcnR1YWxNZW1vcnkocGl4ZWxfaW5mbyk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE5vQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgRHVtcCB1bmNvbXByZXNzZWQgUHNldWRvQ29sb3IgcGFja2V0cy4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgQXNjaWk4NUluaXRpYWxpemUoaW1hZ2UpOwogICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHModGlsZV9pbWFnZSwwLHksdGlsZV9pbWFnZS0+Y29sdW1ucywxLAogICAgICAgICAgICAgICAgZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBpZiAocCA9PSAoY29uc3QgUXVhbnR1bSAqKSBOVUxMKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgdGlsZV9pbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKENsYW1wVG9RdWFudHVtKAogICAgICAgICAgICAgICAgICBHZXRQaXhlbEx1bWEodGlsZV9pbWFnZSxwKSkpKTsKICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHModGlsZV9pbWFnZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEFzY2lpODVGbHVzaChpbWFnZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgZWxzZQogICAgICBpZiAoKHRpbGVfaW1hZ2UtPnN0b3JhZ2VfY2xhc3MgPT0gRGlyZWN0Q2xhc3MpIHx8CiAgICAgICAgICAodGlsZV9pbWFnZS0+Y29sb3JzID4gMjU2KSB8fCAoY29tcHJlc3Npb24gPT0gSlBFR0NvbXByZXNzaW9uKSB8fAogICAgICAgICAgKGNvbXByZXNzaW9uID09IEpQRUcyMDAwQ29tcHJlc3Npb24pKQogICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgewogICAgICAgICAgY2FzZSBKUEVHQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cz1JbmplY3RJbWFnZUJsb2IoaW1hZ2VfaW5mbyxpbWFnZSx0aWxlX2ltYWdlLCJqcGVnIiwKICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBKUEVHMjAwMENvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICBzdGF0dXM9SW5qZWN0SW1hZ2VCbG9iKGltYWdlX2luZm8saW1hZ2UsdGlsZV9pbWFnZSwianAyIixleGNlcHRpb24pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBSTEVDb21wcmVzc2lvbjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIE1lbW9yeUluZm8KICAgICAgICAgICAgICAqcGl4ZWxfaW5mbzsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgQWxsb2NhdGUgcGl4ZWwgYXJyYXkuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGxlbmd0aD0oc2l6ZV90KSBudW1iZXJfcGl4ZWxzOwogICAgICAgICAgICBsZW5ndGgqPXRpbGVfaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UgPyA0VUwgOiAzVUw7CiAgICAgICAgICAgIHBpeGVsX2luZm89QWNxdWlyZVZpcnR1YWxNZW1vcnkobGVuZ3RoLDQqc2l6ZW9mKCpwaXhlbHMpKTsKICAgICAgICAgICAgaWYgKHBpeGVsX2luZm8gPT0gKE1lbW9yeUluZm8gKikgTlVMTCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aWxlX2ltYWdlPURlc3Ryb3lJbWFnZSh0aWxlX2ltYWdlKTsKICAgICAgICAgICAgICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwKICAgICAgICAgICAgICAgICAgIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBHZXRWaXJ0dWFsTWVtb3J5QmxvYihwaXhlbF9pbmZvKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBEdW1wIHJ1bmxlbmd0aCBlbmNvZGVkIHBpeGVscy4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgcT1waXhlbHM7CiAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIHRpbGVfaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyh0aWxlX2ltYWdlLDAseSx0aWxlX2ltYWdlLT5jb2x1bW5zLDEsCiAgICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxSZWQodGlsZV9pbWFnZSxwKSk7CiAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEdyZWVuKHRpbGVfaW1hZ2UscCkpOwogICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxCbHVlKHRpbGVfaW1hZ2UscCkpOwogICAgICAgICAgICAgICAgaWYgKGltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlKQogICAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEJsYWNrKHRpbGVfaW1hZ2UscCkpOwogICAgICAgICAgICAgICAgcCs9R2V0UGl4ZWxDaGFubmVscyh0aWxlX2ltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9aTElCX0RFTEVHQVRFKQogICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gWmlwQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgc3RhdHVzPVpMSUJFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IExaV0NvbXByZXNzaW9uKQogICAgICAgICAgICAgICAgc3RhdHVzPUxaV0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzdGF0dXM9UGFja2JpdHNFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIHBpeGVsX2luZm89UmVsaW5xdWlzaFZpcnR1YWxNZW1vcnkocGl4ZWxfaW5mbyk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE5vQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgRHVtcCB1bmNvbXByZXNzZWQgRGlyZWN0Q29sb3IgcGFja2V0cy4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgQXNjaWk4NUluaXRpYWxpemUoaW1hZ2UpOwogICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHModGlsZV9pbWFnZSwwLHksdGlsZV9pbWFnZS0+Y29sdW1ucywxLAogICAgICAgICAgICAgICAgZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBpZiAocCA9PSAoY29uc3QgUXVhbnR1bSAqKSBOVUxMKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgdGlsZV9pbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKAogICAgICAgICAgICAgICAgICBHZXRQaXhlbFJlZCh0aWxlX2ltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcigKICAgICAgICAgICAgICAgICAgR2V0UGl4ZWxHcmVlbih0aWxlX2ltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcigKICAgICAgICAgICAgICAgICAgR2V0UGl4ZWxCbHVlKHRpbGVfaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoCiAgICAgICAgICAgICAgICAgICAgR2V0UGl4ZWxCbGFjayh0aWxlX2ltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKHRpbGVfaW1hZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBBc2NpaTg1Rmx1c2goaW1hZ2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAvKgogICAgICAgICAgICBEdW1wIG51bWJlciBvZiBjb2xvcnMgYW5kIGNvbG9ybWFwLgogICAgICAgICAgKi8KICAgICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgUkxFQ29tcHJlc3Npb246CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBNZW1vcnlJbmZvCiAgICAgICAgICAgICAgICAqcGl4ZWxfaW5mbzsKCiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIEFsbG9jYXRlIHBpeGVsIGFycmF5LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgbGVuZ3RoPShzaXplX3QpIG51bWJlcl9waXhlbHM7CiAgICAgICAgICAgICAgcGl4ZWxfaW5mbz1BY3F1aXJlVmlydHVhbE1lbW9yeShsZW5ndGgsc2l6ZW9mKCpwaXhlbHMpKTsKICAgICAgICAgICAgICBpZiAocGl4ZWxfaW5mbyA9PSAoTWVtb3J5SW5mbyAqKSBOVUxMKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0aWxlX2ltYWdlPURlc3Ryb3lJbWFnZSh0aWxlX2ltYWdlKTsKICAgICAgICAgICAgICAgICAgVGhyb3dXcml0ZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLAogICAgICAgICAgICAgICAgICAgICJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGl4ZWxzPSh1bnNpZ25lZCBjaGFyICopIEdldFZpcnR1YWxNZW1vcnlCbG9iKHBpeGVsX2luZm8pOwogICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBEdW1wIHJ1bmxlbmd0aCBlbmNvZGVkIHBpeGVscy4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIHRpbGVfaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHModGlsZV9pbWFnZSwwLHksdGlsZV9pbWFnZS0+Y29sdW1ucywxLAogICAgICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICpxKys9KHVuc2lnbmVkIGNoYXIpIEdldFBpeGVsSW5kZXgodGlsZV9pbWFnZSxwKTsKICAgICAgICAgICAgICAgICAgcCs9R2V0UGl4ZWxDaGFubmVscyh0aWxlX2ltYWdlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfWkxJQl9ERUxFR0FURSkKICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gWmlwQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgICBzdGF0dXM9WkxJQkVuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IExaV0NvbXByZXNzaW9uKQogICAgICAgICAgICAgICAgICBzdGF0dXM9TFpXRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBzdGF0dXM9UGFja2JpdHNFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgcGl4ZWxfaW5mbz1SZWxpbnF1aXNoVmlydHVhbE1lbW9yeShwaXhlbF9pbmZvKTsKICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIE5vQ29tcHJlc3Npb246CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgRHVtcCB1bmNvbXByZXNzZWQgUHNldWRvQ29sb3IgcGFja2V0cy4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcD1HZXRWaXJ0dWFsUGl4ZWxzKHRpbGVfaW1hZ2UsMCx5LHRpbGVfaW1hZ2UtPmNvbHVtbnMsMSwKICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgdGlsZV9pbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLCh1bnNpZ25lZCBjaGFyKQogICAgICAgICAgICAgICAgICAgIEdldFBpeGVsSW5kZXgodGlsZV9pbWFnZSxwKSk7CiAgICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHMoaW1hZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBBc2NpaTg1Rmx1c2goaW1hZ2UpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgdGlsZV9pbWFnZT1EZXN0cm95SW1hZ2UodGlsZV9pbWFnZSk7CiAgICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpLW9mZnNldDsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuZW5kc3RyZWFtXG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAvKgogICAgICBXcml0ZSBMZW5ndGggb2JqZWN0LgogICAgKi8KICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKSBvZmZzZXQpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICBpZiAoKGltYWdlLT5zdG9yYWdlX2NsYXNzID09IERpcmVjdENsYXNzKSB8fCAoaW1hZ2UtPmNvbG9ycyA+IDI1NikgfHwKICAgICAgICAoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikpCiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgIGVsc2UKICAgICAgewogICAgICAgIC8qCiAgICAgICAgICBXcml0ZSBDb2xvcm1hcCBvYmplY3QuCiAgICAgICAgKi8KICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikKICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZSBdXG4iKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKICAgICAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CiAgICAgICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKTsKICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikKICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBpbWFnZS0+Y29sb3JzOyBpKyspCiAgICAgICAgewogICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IE5vQ29tcHJlc3Npb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcihDbGFtcFRvUXVhbnR1bSgKICAgICAgICAgICAgICAgIGltYWdlLT5jb2xvcm1hcFtpXS5yZWQpKSk7CiAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoQ2xhbXBUb1F1YW50dW0oCiAgICAgICAgICAgICAgICBpbWFnZS0+Y29sb3JtYXBbaV0uZ3JlZW4pKSk7CiAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoQ2xhbXBUb1F1YW50dW0oCiAgICAgICAgICAgICAgICBpbWFnZS0+Y29sb3JtYXBbaV0uYmx1ZSkpKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYkJ5dGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKAogICAgICAgICAgICAgQ2xhbXBUb1F1YW50dW0oaW1hZ2UtPmNvbG9ybWFwW2ldLnJlZCkpKTsKICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JCeXRlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcigKICAgICAgICAgICAgIENsYW1wVG9RdWFudHVtKGltYWdlLT5jb2xvcm1hcFtpXS5ncmVlbikpKTsKICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JCeXRlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcigKICAgICAgICAgICAgIENsYW1wVG9RdWFudHVtKGltYWdlLT5jb2xvcm1hcFtpXS5ibHVlKSkpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikKICAgICAgICAgIEFzY2lpODVGbHVzaChpbWFnZSk7CiAgICAgICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpLW9mZnNldDsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuZW5kc3RyZWFtXG4iKTsKICAgICAgfQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpCiAgICAgIG9mZnNldCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgc29mdG1hc2sgb2JqZWN0LgogICAgKi8KICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICBpZiAoaW1hZ2UtPmFscGhhX3RyYWl0ICE9IEJsZW5kUGl4ZWxUcmFpdCkKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgZWxzZQogICAgICB7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1R5cGUgL1hPYmplY3RcbiIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9TdWJ0eXBlIC9JbWFnZVxuIik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL05hbWUgL01hJS4yMGdcbiIsCiAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICBzd2l0Y2ggKGNvbXByZXNzaW9uKQogICAgICAgIHsKICAgICAgICAgIGNhc2UgTm9Db21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LAogICAgICAgICAgICAgICJBU0NJSTg1RGVjb2RlIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBMWldDb21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJMWldEZWNvZGUiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIFppcENvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsCiAgICAgICAgICAgICAgIkZsYXRlRGVjb2RlIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHsKICAgICAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LAogICAgICAgICAgICAgICJSdW5MZW5ndGhEZWNvZGUiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvV2lkdGggJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgICAgIGltYWdlLT5jb2x1bW5zKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0hlaWdodCAlLjIwZ1xuIiwKICAgICAgICAgIChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL0NvbG9yU3BhY2UgL0RldmljZUdyYXlcbiIpOwogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9CaXRzUGVyQ29tcG9uZW50ICVkXG4iLAogICAgICAgICAgKGNvbXByZXNzaW9uID09IEZheENvbXByZXNzaW9uKSB8fCAoY29tcHJlc3Npb24gPT0gR3JvdXA0Q29tcHJlc3Npb24pCiAgICAgICAgICA/IDEgOiA4KTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlLjIwZyAwIFJcbiIsCiAgICAgICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwogICAgICAgIG9mZnNldD1UZWxsQmxvYihpbWFnZSk7CiAgICAgICAgbnVtYmVyX3BpeGVscz0oTWFnaWNrU2l6ZVR5cGUpIGltYWdlLT5jb2x1bW5zKmltYWdlLT5yb3dzOwogICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgewogICAgICAgICAgY2FzZSBSTEVDb21wcmVzc2lvbjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIE1lbW9yeUluZm8KICAgICAgICAgICAgICAqcGl4ZWxfaW5mbzsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgQWxsb2NhdGUgcGl4ZWwgYXJyYXkuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGxlbmd0aD0oc2l6ZV90KSBudW1iZXJfcGl4ZWxzOwogICAgICAgICAgICBwaXhlbF9pbmZvPUFjcXVpcmVWaXJ0dWFsTWVtb3J5KGxlbmd0aCw0KnNpemVvZigqcGl4ZWxzKSk7CiAgICAgICAgICAgIGlmIChwaXhlbF9pbmZvID09IChNZW1vcnlJbmZvICopIE5VTEwpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW1hZ2U9RGVzdHJveUltYWdlKGltYWdlKTsKICAgICAgICAgICAgICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwKICAgICAgICAgICAgICAgICAgIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBHZXRWaXJ0dWFsTWVtb3J5QmxvYihwaXhlbF9pbmZvKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBEdW1wIFJ1bmxlbmd0aCBlbmNvZGVkIHBpeGVscy4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgcT1waXhlbHM7CiAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIGltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHMoaW1hZ2UsMCx5LGltYWdlLT5jb2x1bW5zLDEsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBpZiAocCA9PSAoY29uc3QgUXVhbnR1bSAqKSBOVUxMKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgaW1hZ2UtPmNvbHVtbnM7IHgrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEFscGhhKGltYWdlLHApKTsKICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHMoaW1hZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX1pMSUJfREVMRUdBVEUpCiAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBaaXBDb21wcmVzc2lvbikKICAgICAgICAgICAgICBzdGF0dXM9WkxJQkVuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTFpXQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgICBzdGF0dXM9TFpXRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHN0YXR1cz1QYWNrYml0c0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgcGl4ZWxfaW5mbz1SZWxpbnF1aXNoVmlydHVhbE1lbW9yeShwaXhlbF9pbmZvKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICAgICAgICAgICAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgTm9Db21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBEdW1wIHVuY29tcHJlc3NlZCBQc2V1ZG9Db2xvciBwYWNrZXRzLgogICAgICAgICAgICAqLwogICAgICAgICAgICBBc2NpaTg1SW5pdGlhbGl6ZShpbWFnZSk7CiAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIGltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHMoaW1hZ2UsMCx5LGltYWdlLT5jb2x1bW5zLDEsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBpZiAocCA9PSAoY29uc3QgUXVhbnR1bSAqKSBOVUxMKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgaW1hZ2UtPmNvbHVtbnM7IHgrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEFscGhhKGltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQXNjaWk4NUZsdXNoKGltYWdlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9mZnNldD1UZWxsQmxvYihpbWFnZSktb2Zmc2V0OwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuZW5kc3RyZWFtXG4iKTsKICAgICAgfQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgaWYgKEdldE5leHRJbWFnZUluTGlzdChpbWFnZSkgPT0gKEltYWdlICopIE5VTEwpCiAgICAgIGJyZWFrOwogICAgaW1hZ2U9U3luY05leHRJbWFnZUluTGlzdChpbWFnZSk7CiAgICBzdGF0dXM9U2V0SW1hZ2VQcm9ncmVzcyhpbWFnZSxTYXZlSW1hZ2VzVGFnLHNjZW5lKyssCiAgICAgIEdldEltYWdlTGlzdExlbmd0aChpbWFnZSkpOwogICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgYnJlYWs7CiAgfSB3aGlsZSAoaW1hZ2VfaW5mby0+YWRqb2luICE9IE1hZ2lja0ZhbHNlKTsKICAvKgogICAgV3JpdGUgTWV0YWRhdGEgb2JqZWN0LgogICovCiAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogIGluZm9faWQ9b2JqZWN0OwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICBvYmplY3QpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1RpdGxlICglcylcbiIsCiAgICBFc2NhcGVQYXJlbnRoZXNpcyhiYXNlbmFtZSkpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICBzZWNvbmRzPXRpbWUoKHRpbWVfdCAqKSBOVUxMKTsKI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9IQVZFX0xPQ0FMVElNRV9SKQogICh2b2lkKSBsb2NhbHRpbWVfcigmc2Vjb25kcywmbG9jYWxfdGltZSk7CiNlbHNlCiAgKHZvaWQpIG1lbWNweSgmbG9jYWxfdGltZSxsb2NhbHRpbWUoJnNlY29uZHMpLHNpemVvZihsb2NhbF90aW1lKSk7CiNlbmRpZgogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoZGF0ZSxNYXhUZXh0RXh0ZW50LCJEOiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZCIsCiAgICBsb2NhbF90aW1lLnRtX3llYXIrMTkwMCxsb2NhbF90aW1lLnRtX21vbisxLGxvY2FsX3RpbWUudG1fbWRheSwKICAgIGxvY2FsX3RpbWUudG1faG91cixsb2NhbF90aW1lLnRtX21pbixsb2NhbF90aW1lLnRtX3NlYyk7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NyZWF0aW9uRGF0ZSAoJXMpXG4iLGRhdGUpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTW9kRGF0ZSAoJXMpXG4iLGRhdGUpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUHJvZHVjZXIgKCVzKVxuIiwKICAgIEVzY2FwZVBhcmVudGhlc2lzKEdldE1hZ2lja1ZlcnNpb24oKHNpemVfdCAqKSBOVUxMKSkpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAvKgogICAgV3JpdGUgWHJlZiBvYmplY3QuCiAgKi8KICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpLXhyZWZbMF0rCiAgIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUERGQSIpID09IDAgPyA2IDogMCkrMTA7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwieHJlZlxuIik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiMCAlLjIwZ1xuIiwoZG91YmxlKQogICAgb2JqZWN0KzEpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIwMDAwMDAwMDAwIDY1NTM1IGYgXG4iKTsKICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBvYmplY3Q7IGkrKykKICB7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlMDEwbHUgMDAwMDAgbiBcbiIsCiAgICAgICh1bnNpZ25lZCBsb25nKSB4cmVmW2ldKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICB9CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwidHJhaWxlclxuIik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9TaXplICUuMjBnXG4iLChkb3VibGUpCiAgICBvYmplY3QrMSk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9JbmZvICUuMjBnIDAgUlxuIiwoZG91YmxlKQogICAgaW5mb19pZCk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Sb290ICUuMjBnIDAgUlxuIiwoZG91YmxlKQogICAgcm9vdF9pZCk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBTaWduYXR1cmVJbWFnZShpbWFnZSxleGNlcHRpb24pOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9JRCBbPCVzPiA8JXM+XVxuIiwKICAgIEdldEltYWdlUHJvcGVydHkoaW1hZ2UsInNpZ25hdHVyZSIsZXhjZXB0aW9uKSwKICAgIEdldEltYWdlUHJvcGVydHkoaW1hZ2UsInNpZ25hdHVyZSIsZXhjZXB0aW9uKSk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdGFydHhyZWZcbiIpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRU9GXG4iKTsKICB4cmVmPShNYWdpY2tPZmZzZXRUeXBlICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkoeHJlZik7CiAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgcmV0dXJuKE1hZ2lja1RydWUpOwp9Cg==