Advertisement
Pearlfromsu

s3l4

Oct 10th, 2022
919
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 41.41 KB | None | 0 0
  1. dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0Owp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwoKbmFtZXNwYWNlIHMzbDIgewoJY2xhc3MgUHJpbnRlZE1hdHRlckNvbnRhaW5lciB7CgkJTGlua2VkTGlzdDxQcmludGVkTWF0dGVyPiBfbGlzdDsKCQlwdWJsaWMgUHJpbnRlZE1hdHRlckNvbnRhaW5lcigpIHsKCQkJX2xpc3QgPSBuZXcgTGlua2VkTGlzdDxQcmludGVkTWF0dGVyPigpOwoJCX0KCQlwdWJsaWMgUHJpbnRlZE1hdHRlciBCYWNrKCkgewoJCQlyZXR1cm4gX2xpc3QuTGFzdCgpOwoJCX0KCQlwdWJsaWMgUHJpbnRlZE1hdHRlciBGcm9udCgpIHsKCQkJcmV0dXJuIF9saXN0LkZpcnN0KCk7CgkJfQoJCXB1YmxpYyB2b2lkIFB1c2hCYWNrKFByaW50ZWRNYXR0ZXIgcG0pIHsKCQkJX2xpc3QuQWRkTGFzdChwbSk7CgkJfQoKCQlwdWJsaWMgdm9pZCBQdXNoRnJvbnQoUHJpbnRlZE1hdHRlciBwbSkgewoJCQlfbGlzdC5BZGRGaXJzdChwbSk7CgkJfQoKCQlwdWJsaWMgdm9pZCBQb3BCYWNrKFByaW50ZWRNYXR0ZXIgcG0pIHsKCQkJaWYgKF9saXN0LkNvdW50ICE9IDApCgkJCQlfbGlzdC5SZW1vdmVMYXN0KCk7CgkJfQoJCXB1YmxpYyB2b2lkIFBvcEZyb250KFByaW50ZWRNYXR0ZXIgcG0pIHsKCQkJaWYgKF9saXN0LkNvdW50ICE9IDApCgkJCQlfbGlzdC5SZW1vdmVGaXJzdCgpOwoJCX0KCQlwdWJsaWMgYm9vbCBDb250YWlucyhQcmludGVkTWF0dGVyIHBtKSB7CgkJCWZvcmVhY2ggKFByaW50ZWRNYXR0ZXIgY3VycmVudCBpbiBfbGlzdCkKCQkJCWlmIChjdXJyZW50ID09IHBtKQoJCQkJCXJldHVybiB0cnVlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXB1YmxpYyB2b2lkIENsZWFyKCkgewoJCQlfbGlzdC5DbGVhcigpOwoJCX0KCgkJcHVibGljIGludCBDb3VudCgpIHsKCQkJcmV0dXJuIF9saXN0LkNvdW50KCk7CgkJfQoKCQlwdWJsaWMgdm9pZCBSZW1vdmUoUHJpbnRlZE1hdHRlciBwbSkgewoJCQlfbGlzdC5SZW1vdmUocG0pOwoJCX0KCQlwdWJsaWMgdm9pZCBSZW1vdmUoTGlzdDxQcmludGVkTWF0dGVyPiBwbSkgewoJCQlwbS5Gb3JFYWNoKG5ldyBBY3Rpb248UHJpbnRlZE1hdHRlcj4oUmVtb3ZlKSk7CgkJfQoKCQlwdWJsaWMgdm9pZCBTb3J0KElDb21wYXJlcjxQcmludGVkTWF0dGVyPiBjb21wYXJlciA9IG51bGwpIHsKCQkJTGlzdDxQcmludGVkTWF0dGVyPiBsaXN0ID0gX2xpc3QuVG9MaXN0KCk7CgkJCWlmIChjb21wYXJlciAhPSBudWxsKQoJCQkJbGlzdC5Tb3J0KGNvbXBhcmVyKTsKCQkJZWxzZQoJCQkJbGlzdC5Tb3J0KCk7CgkJCV9saXN0ID0gbmV3IExpbmtlZExpc3Q8UHJpbnRlZE1hdHRlcj4obGlzdCk7CgkJfQoKCQlwdWJsaWMgTGlzdDxQcmludGVkTWF0dGVyPiBHZXRNYXR0ZXJzKCkgewoJCQlyZXR1cm4gX2xpc3QuVG9MaXN0KCk7CgkJfQoJCS8v0L/QvtC70YPRh9Cw0LXRgiDQstGB0LUg0L/QtdGH0LDRgtC90YvQtSDQuNC30LTQsNC90LjRjywg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0LDQvdC40YYg0LrQvtGC0L7RgNC+0LPQviDQu9C10LbQuNGCINC+0YIgZnJvbSDQtNC+IHRvINCy0LrQu9GO0YfQuNGC0LXQu9GM0L3QvgoJCXB1YmxpYyBMaXN0PFByaW50ZWRNYXR0ZXI+IEdldE1hdHRlcnNCeVBhZ2VzKGludCBmcm9tLCBpbnQgdG8pIHsKCQkJTGlzdDxQcmludGVkTWF0dGVyPiBsaXN0ID0gbmV3IExpc3Q8UHJpbnRlZE1hdHRlcj4oKTsKCQkJZm9yZWFjaCAoUHJpbnRlZE1hdHRlciBjdXJyZW50IGluIF9saXN0KQoJCQkJaWYgKGN1cnJlbnQuUGFnZXNDb3VudCA+PSBmcm9tICYmIGN1cnJlbnQuUGFnZXNDb3VudCA8PSB0bykKCQkJCQlsaXN0LkFkZChjdXJyZW50KTsKCQkJcmV0dXJuIGxpc3Q7CgkJfQoKCX0KfQoKCgoKCgoKCgoKCgoKCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBzM2wyIHsKCWFic3RyYWN0IGNsYXNzIFByaW50ZWRNYXR0ZXIgOiBJQ29tcGFyYWJsZTxQcmludGVkTWF0dGVyPiB7CgkJc3RyaW5nIF9uYW1lOyAvL9C90LDQt9Cy0LDQvdC40LUg0L/QtdGH0LDRgtC90L7Qs9C+INC40LfQtNCw0L3QuNGPCgkJc3RyaW5nIF9jb250ZW50czsgLy/RgtC10LrRgdGCINC/0LXRh9Cw0YLQvdC+0LPQviDQuNC30LTQsNC90LjRjwoJCWludCBfcGFnZXNDb3VudDsgLy/QutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQsNC90LjRhgoJCUxhbmd1YWdlIF9sYW5nOyAvL9GP0LfRi9C6CgoKCQlwdWJsaWMgc3RyaW5nIE5hbWUgeyAvL9C90LDQt9Cy0LDQvdC40LUg0L/QtdGH0LDRgtC90L7Qs9C+INC40LfQtNCw0L3QuNGPCgkJCWdldCB7CgkJCQlyZXR1cm4gX25hbWU7CgkJCX0KCQkJcHJpdmF0ZSBzZXQgewoJCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkgeyAvLydvcicnPScKCQkJCQlDb25zb2xlLldyaXRlTGluZSgi0KPRgdGC0LDQvdC+0LLQu9C10L3QviDQt9C90LDRh9C10L3QuNC1INC40LzQtdC90Lgg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4iKTsKCQkJCQlfbmFtZSA9ICJVbmtub3duIjsKCQkJCX0gZWxzZQoJCQkJCV9uYW1lID0gdmFsdWU7CgkJCX0KCQl9CgoJCXB1YmxpYyBzdHJpbmcgQ29udGVudHMgeyAvL9GC0LXQutGB0YIg0L/QtdGH0LDRgtC90L7Qs9C+INC40LfQtNCw0L3QuNGPCgkJCWdldCB7CgkJCQlyZXR1cm4gX2NvbnRlbnRzOwoJCQl9CgkJCXByaXZhdGUgc2V0IHsgLy/QvdC40LrRgtC+INC90LUg0LTQvtC70LbQtdC9INC80LXQvdGP0YLRjCDRgdC+0LTQtdGA0LbQsNC90LjQtSDQutC90LjQs9C4CgkJCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpKSB7CgkJCQkJLy90aGlzLkxvZ0Vycm9yKCLQndC1INCy0LLQtdC00LXQvdC+INGB0L7QtNC10YDQttCw0L3QuNC1INC40LfQtNCw0L3QuNGPLiDQn9C10YDQtdGB0L7Qt9C00LDQudGC0LUg0L7QsdGK0LXQutGCIik7CgkJCQkJdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigi0KHQvtC00LXRgNC20LDQvdC40LUg0LjQt9C00LDQvdC40Y8iLCAi0J3QtSDQstCy0LXQtNC10L3QviDRgdC+0LTQtdGA0LbQsNC90LjQtSDQuNC30LTQsNC90LjRjy4g0J/QtdGA0LXRgdC+0LfQtNCw0LnRgtC1INC+0LHRitC10LrRgiIpOwoJCQkJCS8vX2NvbnRlbnRzID0gIiI7CgkJCQl9IGVsc2UKCQkJCQlfY29udGVudHMgPSB2YWx1ZTsKCQkJfQoJCX0KCgkJcHVibGljIGludCBQYWdlc0NvdW50IHsgLy/QutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQsNC90LjRhgoJCQlnZXQgewoJCQkJcmV0dXJuIF9wYWdlc0NvdW50OwoJCQl9CgkJCXByaXZhdGUgc2V0IHsgLy/QvdC10LLQvtC30LzQvtC20L3QviDQtNC+0LHQsNCy0LjRgtGMINC40LvQuCDRg9Cx0YDQsNGC0Ywg0YHRgtGA0LDQvdC40YbRiyDQutC90LjQs9C4INC/0L7RgdC70LUg0L/QtdGH0LDRgtC4CgkJCQlpZiAodmFsdWUgPD0gMCkgewoJCQkJCS8vQ29uc29sZS5Xcml0ZUxpbmUoItCj0YHRgtCw0L3QvtCy0LvQtdC90L4g0LfQvdCw0YfQtdC90LjQtSDQv9C+INGD0LzQvtC70YfQsNC90LjRjiIpOwoJCQkJCS8vdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigi0JrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0LDQvdC40YYiLCAkItCd0LXQutC+0YDRgNC10LrRgtC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQsNC90LjRhjoge3ZhbHVlfSIpOwoJCQkJCXRocm93IG5ldyBQcmludGVkTWF0dGVyRXhjZXB0aW9uKCLQntGI0LjQsdC60LAg0L/RgNC4INGB0L7Qt9C00LDQvdC40Lgg0L/QtdGH0LDRgtC90L7Qs9C+INC40LfQtNCw0L3QuNGPICIsICIo0JrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0LDQvdC40YYg0LTQvtC70LbQvdC+INCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C8INGH0LjRgdC70L7QvCkiLCBEYXRlVGltZS5Ob3cpOwoJCQkJCS8vX3BhZ2VzQ291bnQgPSAxOyAvL9C60LDQuiDQvNC40L3QuNC80YPQvCDQvtC00L3QsCDRgdGC0YDQsNC90LjRhtCwLCDRh9GC0L7QsdGLINC00LXRgNC20LDRgtGMINCyINGA0YPQutCw0YUKCQkJCX0gZWxzZQoJCQkJCV9wYWdlc0NvdW50ID0gdmFsdWU7CgkJCX0KCQl9CgkJcHVibGljIExhbmd1YWdlIExhbmcgeyAvL9C60L7Qu9C40YfQtdGB0YLQstC+INGB0YLRgNCw0L3QuNGGCgkJCWdldCB7CgkJCQlyZXR1cm4gX2xhbmc7CgkJCX0KCQkJcHJpdmF0ZSBzZXQgewoJCQkJX2xhbmcgPSB2YWx1ZTsKCQkJfQoJCX0KCgkJcHJvdGVjdGVkIHZvaWQgTG9nRXJyb3Ioc3RyaW5nIG1zZywgc3RyaW5nIGFyZyA9ICJhcmciKSB7CgkJCXRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oYXJnLCBtc2cpOwoJCQkvKgoJCQlDb25zb2xlLkZvcmVncm91bmRDb2xvciA9IENvbnNvbGVDb2xvci5SZWQ7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0J7RiNC40LHQutCwINCyINC60LvQsNGB0YHQtSB7dGhpcy5HZXRUeXBlKCl9OiB7bXNnfSIpOwoJCQlDb25zb2xlLkZvcmVncm91bmRDb2xvciA9IENvbnNvbGVDb2xvci5XaGl0ZTsqLwoJCX0KCgkJcHVibGljIFByaW50ZWRNYXR0ZXIoc3RyaW5nIG5hbWUsIHN0cmluZyBjb250ZW50cywgaW50IHBhZ2VzQ291bnQsIExhbmd1YWdlIGxhbmcpIHsKCQkJTmFtZSA9IG5hbWU7IC8v0L3QsNC30LLQsNC90LjQtSDQv9C10YfQsNGC0L3QvtCz0L4g0LjQt9C00LDQvdC40Y8KCQkJQ29udGVudHMgPSBjb250ZW50czsgLy/RgtC10LrRgdGCINC/0LXRh9Cw0YLQvdC+0LPQviDQuNC30LTQsNC90LjRjwoJCQlQYWdlc0NvdW50ID0gcGFnZXNDb3VudDsgLy/QutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQsNC90LjRhgoJCQlMYW5nID0gbGFuZzsgLy/Rj9C30YvQugoJCX0KCgkJcHVibGljIFByaW50ZWRNYXR0ZXIoKSA6IHRoaXMoIlVua25vd24gYm9vayIsICJFbXB0eSBwYWdlIiwgMSwgTGFuZ3VhZ2UuUnVzc2lhbikgeyB9CgoJCXB1YmxpYyBpbnQgR2V0V29yZHNDb3VudCgpIHsKCQkJaW50IGNudCA9IDAsIGxldHRlcnMgPSAwOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IENvbnRlbnRzLkxlbmd0aDsgaSsrKSB7CgkJCQlpZiAoY2hhci5Jc0xldHRlck9yRGlnaXQoQ29udGVudHNbaV0pKQoJCQkJCWxldHRlcnMrKzsKCQkJCWVsc2UgewoJCQkJCWlmIChsZXR0ZXJzID4gMCkKCQkJCQkJY250Kys7CgkJCQkJbGV0dGVycyA9IDA7CgkJCQl9CgkJCX0KCQkJaWYgKGxldHRlcnMgPiAwKQoJCQkJY250Kys7CgkJCXJldHVybiBjbnQ7CgkJfQoKCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBPcGVuKGJvb2wgZXJyb3IgPSBmYWxzZSk7IC8v0LDQsdGB0YLRgNCw0LrRgtC90YvQuSDQvNC10YLQvtC0IG9wZW4oKSwg0LrQvtGC0L7RgNGL0Lkg0LTQvtC70LbQvdGLINGA0LXQsNC70LjQt9C+0LLQsNGC0Ywg0LIg0L/QvtGC0L7QvNC60LDRhQoKCQlwdWJsaWMgdmlydHVhbCB2b2lkIFByaW50Q29udGVudHMoKSB7CgkJCUNvbnNvbGUuRm9yZWdyb3VuZENvbG9yID0gQ29uc29sZUNvbG9yLlllbGxvdzsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoQ29udGVudHMpOwoJCQlDb25zb2xlLkZvcmVncm91bmRDb2xvciA9IENvbnNvbGVDb2xvci5XaGl0ZTsKCQl9CgkJcHVibGljIHZpcnR1YWwgdm9pZCBQcmludEluZm8oKSB7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0J3QsNC30LLQsNC90LjQtToge05hbWV9Iik7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0K/Qt9GL0Lo6IHtMYW5nfSIpOwoJCQlDb25zb2xlLldyaXRlTGluZSgkItCa0L7Qu9C40YfQtdGB0YLQstC+INGB0YLRgNCw0L3QuNGGOiB7UGFnZXNDb3VudH0iKTsKCQl9CgoJCXB1YmxpYyBpbnQgQ29tcGFyZVRvKFByaW50ZWRNYXR0ZXIgb3RoZXIpIHsKCQkJcmV0dXJuIHRoaXMuTmFtZS5Db21wYXJlVG8ob3RoZXIuTmFtZSk7CgkJfQoKCQkvL292ZXJyaWRpbmcKCQlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewoJCQlyZXR1cm4gKCQi0J/QtdGH0LDRgtC90L7QtSDQuNC30LTQsNC90LjQtSB7TmFtZX0o0K/Qt9GL0Lo6IHtMYW5nfSwge1BhZ2VzQ291bnR9INGB0YLRgNCw0L3QuNGGKSIpOy8vSEg6bW0KCQl9CgoJCXB1YmxpYyBzdGF0aWMgYm9vbCBvcGVyYXRvciA+KFByaW50ZWRNYXR0ZXIgdDEsIFByaW50ZWRNYXR0ZXIgdDIpIHsKCQkJcmV0dXJuIHQxLk5hbWUuQ29tcGFyZVRvKHQyLk5hbWUpID4gMDsKCQl9CgkJcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yIDwoUHJpbnRlZE1hdHRlciB0MSwgUHJpbnRlZE1hdHRlciB0MikgewoJCQlyZXR1cm4gdDEuTmFtZS5Db21wYXJlVG8odDIuTmFtZSkgPCAwOwoJCX0KCQlwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3IgPj0oUHJpbnRlZE1hdHRlciB0MSwgUHJpbnRlZE1hdHRlciB0MikgewoJCQlyZXR1cm4gdDEuTmFtZS5Db21wYXJlVG8odDIuTmFtZSkgPiAwOwoJCX0KCQlwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3IgPD0oUHJpbnRlZE1hdHRlciB0MSwgUHJpbnRlZE1hdHRlciB0MikgewoJCQlyZXR1cm4gdDEuTmFtZS5Db21wYXJlVG8odDIuTmFtZSkgPCAwOwoJCX0KCgkJcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yID09KFByaW50ZWRNYXR0ZXIgdDEsIFByaW50ZWRNYXR0ZXIgdDIpIHsKCQkJcmV0dXJuIHQxLk5hbWUuRXF1YWxzKHQyLk5hbWUpOwoJCX0KCQlwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3IgIT0oUHJpbnRlZE1hdHRlciB0MSwgUHJpbnRlZE1hdHRlciB0MikgewoJCQlyZXR1cm4gIXQxLk5hbWUuRXF1YWxzKHQyLk5hbWUpOwoJCX0KCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG8pIHsKCQkJaWYgKG8gaXMgUHJpbnRlZE1hdHRlcikKCQkJCXJldHVybiAoKChQcmludGVkTWF0dGVyKW8pLk5hbWUgPT0gdGhpcy5OYW1lKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewoJCQlyZXR1cm4gdGhpcy5Ub1N0cmluZygpLkdldEhhc2hDb2RlKCk7CgkJfQoJfQp9CgoKCgoKCgo2Ck5ld3NQYXBlcgrQmNC30LLQtdGB0YLQuNGPCi4uLtCh0LLQtdC20LjQtSDQvdC+0LLQvtGB0YLQuDog0LIg0K/RgNC+0YHQu9Cw0LLQu9C1INC/0L4g0LDQtNGA0LXRgdGDINCh0L7RjtC30L3QsNGPIDE0NCDRgdGC0YPQtNC10L3RgtGLINC90LDRh9Cw0LvQuCDQuNC30YPRh9Cw0YLRjCDQntCe0J8uLi4KNQpSdXNzaWFuCtCv0YDQk9CjCjIwCgpCb29rCtCQ0JAg0K/Qt9GL0Log0L/RgNC+0LPRgNCw0LzQvNC40YDQvtCy0LDQvdC40Y8gQyMgNyDQuCDQv9C70LDRgtGE0L7RgNC80YsgLk5FVCDQuCAuTkVUIENvcmUKLi4u0J/QtdGA0LXQstC+0LQg0YEg0LDQvdCz0LvQuNC50YHQutC+0LPQviDQuCDRgNC10LTQsNC60YbQuNGPINCuLtCdLtCQ0YDRgtC10LzQtdC90LrQvlxu0J/QviDQvtCx0YnQuNC8INCy0L7Qv9GA0L7RgdCw0Lwg0L7QsdGA0LDRidCw0LnRgtC10YHRjCDQsiDQuNC30LTQsNGC0LXQu9GM0YHRgtCy0L4g4oCc0JTQuNCw0LvQtdC60YLQuNC60LDigJ0g0L/QviDQsNC00YDQtdGB0YM6XG5pbmZvcm0uLi4KMTMzMApSdXNzaWFuCtCi0YDQvtC10LvRgdC10L0sINCU0LbQtdC/0LjQutGBCtCR0LjQsdC70LjQvtGC0LXQutCwINCv0YDQk9CjCjEwMDAwMAoKVGV4dEJvb2sK0JzQsNGC0LXQvNCw0YLQuNC60LAKLi7Qn9Cw0YDQsNCz0YDQsNGEIDUuINCf0YDQvtGB0YLRi9C1INC4INGB0L7RgdGC0LDQstC90YvQtSDRh9C40YHQu9CwCjk1ClJ1c3NpYW4K0J0uINCvLiDQktC40LvQtdC90LrQuNC9CtCa0YDQvtGC0L7QsiDQodC10YDQs9C10LkKMjAwMDAwCjgKTWF0aAoKQm9vawrQktC+0LnQvdCwINC4INCc0LjRgAouLi4uLi4uLi4uLi4uCjk2MApSdXNzaWFuCtCbLiDQnS4g0KLQvtC70YHRgtC+0LkK0JHQuNCx0LvQuNC+0YLQtdC60LAg0K/RgNCT0KMKMTAwMDAKClRleHRCb29rCkphdmFTY3JpcHQg0LTQu9GPINC00LXRgtC10LkK0KHQsNC80L7Rg9GH0LjRgtC10LvRjCDQv9C+INC/0YDQvtCz0YDQsNC80LzQuNGA0L7QstCw0L3QuNGOCjMwClJ1c3NpYW4K0J3QuNC6INCc0L7RgNCz0LDQvQrQkdC40LHQu9C40L7RgtC10LrQsCDQr9GA0JPQowoxMTAwCjMKSW5mb3JtYXRpY3MKCkJvb2sK0J7Qu9C40LzQv9C40LDQtNC90YvQtSDQt9Cw0LTQsNGH0Lgg0L/QviDQv9GA0L7Qs9GA0LDQvNC80LjRgNC+0LLQsNC90LjRjgouLi4uLi4uLi4uLi4uCjMyMApSdXNzaWFuCtCkLiDQnNC10L3RjNGI0LjQutC+0LIK0JHQuNCx0LvQuNC+0YLQtdC60LAg0K/RgNCT0KMKOTAwCgoKCgoKCgoKCgoKQm9vawrQuNC80Y8K0YHQvtC00LXRgNC20LDQvdC40LUK0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0LDQvdC40YYK0Y/Qt9GL0LoK0LDQstGC0L7RgArQstC70LDQtNC10LvQtdGGCtGC0LjRgNCw0LYKLy9zdHJpbmcgbmFtZSwgc3RyaW5nIGNvbnRlbnRzLCBpbnQgcGFnZXNDb3VudCwgTGFuZ3VhZ2UgbGFuZywgc3RyaW5nIGF1dGhvciwgc3RyaW5nIG93bmVyLCBpbnQgY2lyY3VsYXRpb24KCk5ld3NQYXBlcgrQuNC80Y8K0YHQvtC00LXRgNC20LDQvdC40LUK0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0LDQvdC40YYK0Y/Qt9GL0LoK0LjQt9C00LDRgtC10LvRjNGB0YLQstC+CtC00LDRgtCwINC/0LXRh9Cw0YLQuAovL3N0cmluZyBuYW1lLCBzdHJpbmcgY29udGVudHMsIGludCBwYWdlc0NvdW50LCBMYW5ndWFnZSBsYW5nLCBzdHJpbmcgcHVibGljYXRpb24sIGludCBwcmludERhdGUKCgpUZXh0Qm9vawrQuNC80Y8K0YHQvtC00LXRgNC20LDQvdC40LUK0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0LDQvdC40YYK0Y/Qt9GL0LoK0LDQstGC0L7RgArQstC70LDQtNC10LvQtdGGCtGC0LjRgNCw0LYK0LrQu9Cw0YHRgSDRg9GH0LXQsdC90LjQutCwCtC/0YDQtdC00LzQtdGCINGD0YfQtdCx0L3QuNC60LAKLy9zdHJpbmcgbmFtZSwgc3RyaW5nIGNvbnRlbnRzLCBpbnQgcGFnZXNDb3VudCwgTGFuZ3VhZ2UgbGFuZywgc3RyaW5nIGF1dGhvciwgc3RyaW5nIG93bmVyLCBpbnQgY2lyY3VsYXRpb24sIGludCBncmFkZSwgU3ViamVjdCBzdWJqZWN0CgoKCgoKCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBzM2wyIHsKCWNsYXNzIFByaW50ZWRNYXR0ZXJFeGNlcHRpb24gOiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CgkJCXB1YmxpYyBEYXRlVGltZSBUaW1lIHsgZ2V0OyBzZXQ7IH0KCQkJcHVibGljIHN0cmluZyBEZXRhaWxzIHsgZ2V0OyBzZXQ7IH0KCQkJcHVibGljIFByaW50ZWRNYXR0ZXJFeGNlcHRpb24oKSB7IH0KCQkJLy8g0J/QtdGA0LXQtNCw0YfQsCDRgdC+0L7QsdGJ0LXQvdC40Y8g0LrQvtC90YHRgtGA0YPQutGC0L7RgNGDINGA0L7QtNC40YLQtdC70YzRgdC60L7Qs9C+INC60LvQsNGB0YHQsC4KCQkJcHVibGljIFByaW50ZWRNYXR0ZXJFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBkZXRhaWxzLCBEYXRlVGltZSB0aW1lKSA6IGJhc2UobWVzc2FnZSkgewoJCQkJRGV0YWlscyA9IGRldGFpbHM7CgkJCQlUaW1lID0gdGltZTsKCQkJfQoJCQkKCQl9Cn0KCgoKCgoKCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBzM2wyIHsKCWNsYXNzIE5ld3NQYXBlciA6IFByaW50ZWRNYXR0ZXIgewoJCXN0cmluZyBfcHVibGljYXRpb247IC8v0LjQt9C00LDRgtC10LvRjNGB0YLQstC+LCDQstGL0L/Rg9GB0YLQuNCy0YjQtdC1INCz0LDQt9C10YLRgwoJCWludCBfcHJpbnREYXRlOyAvL9C00LXQvdGMINCy0YvQv9GD0YHQutCwINCz0LDQt9C10YLRiwoJCQoJCXB1YmxpYyBOZXdzUGFwZXIoc3RyaW5nIG5hbWUsIHN0cmluZyBjb250ZW50cywgaW50IHBhZ2VzQ291bnQsIExhbmd1YWdlIGxhbmcsIHN0cmluZyBwdWJsaWNhdGlvbiwgaW50IHByaW50RGF0ZSkgOiBiYXNlKG5hbWUsIGNvbnRlbnRzLCBwYWdlc0NvdW50LCBsYW5nKSB7CgkJCVB1YmxpY2F0aW9uID0gcHVibGljYXRpb247CgkJCVByaW50RGF0ZSA9IHByaW50RGF0ZTsKCQl9CgkJcHVibGljIE5ld3NQYXBlcigpIDogYmFzZSgpIHsKCQkJUHVibGljYXRpb24gPSAi0K/RgNCT0KMiOwoJCQlQcmludERhdGUgPSBEYXRlVGltZS5Ob3cuRGF5OwoJCQkvL1ByaW50RGF0ZSA9IERhdGVUaW1lLk5vdzsKCQl9CgoJCXB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50SW5mbygpIHsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQs9Cw0LfQtdGC0LU6IHtOYW1lfSIpOwoJCQlDb25zb2xlLldyaXRlTGluZSgkItCY0LfQtNCw0YLQtdC70YzRgdGC0LLQvjoge1B1YmxpY2F0aW9ufSIpOwoJCQliYXNlLlByaW50SW5mbygpOwoJCQlDb25zb2xlLldyaXRlTGluZSgkItCU0LXQvdGMINCy0YvQv9GD0YHQutCwINCz0LDQt9C10YLRizoge1ByaW50RGF0ZX0iKTsKCQkJLy9Db25zb2xlLldyaXRlTGluZSgkItCU0LDRgtCwINC40LfQtNCw0L3QuNGPINCz0LDQt9C10YLRizoge1ByaW50RGF0ZS5Ub1N0cmluZygiZGQuTU0ueXl5eSIpfSIpOwoJCX0KCgkJcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRDb250ZW50cygpIHsgLy/Qv9C10YDQtdC+0L/RgNC10LTQtdC70Y/QtdC8INCy0LjRgNGC0YPQsNC70YzQvdGL0Lkg0LzQtdGC0L7QtCBQcmludENvbnRlbnRzKCkgKNGA0LDRgdGI0LjRgNGP0LXQvCDQtdCz0L4g0LLQvtC30LzQvtC20L3QvtGB0YLQuCkKCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCLQodC+0LTQtdGA0LbQsNC90LjQtSDQs9Cw0LfQtdGC0Ysg4oCce05hbWV94oCdOiIpOwoJCQliYXNlLlByaW50Q29udGVudHMoKTsKCQl9CgkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3Blbihib29sIGVycm9yID0gZmFsc2UpIHsgLy/Qv9C10YDQtdC+0L/RgNC10LTQtdC70Y/QtdC8INCw0LHRgdGC0YDQsNC60YLQvdGL0Lkg0LzQtdGC0L7QtCBvcGVuKCkKCQkJQ29uc29sZS5Xcml0ZUxpbmUoItCe0YLQvtCx0YDQsNC20LDQtdC8INCz0LDQt9C10YLRgy4uLiIpOwoJCQlpZiAoZXJyb3IpCgkJCQl0aHJvdyBuZXcgUHJpbnRlZE1hdHRlckV4Y2VwdGlvbigi0J7RiNC40LHQutCwINC/0YDQuCDQvtGC0L7QsdGA0LDQttCw0LXQvdC40Lgg0LPQsNC30LXRgtGLLiAiLCAiKNGH0YLQvi3RgtC+INC/0L7RiNC70L4g0L3QtSDRgtCw0Log0LjQty3Qt9CwINC40L3RgtC10YDQtdGB0L3QvtC5INC/0YDQuNGH0LjQvdGLOiAuLi4pIiwgRGF0ZVRpbWUuTm93KTsKCQkJLy8uLi4KCQkJQ29uc29sZS5Xcml0ZUxpbmUoItCT0LDQt9C10YLQsCDQvtGC0L7QsdGA0LDQttC10L3QsCEiKTsKCQl9CgoKCQlwdWJsaWMgc3RyaW5nIFB1YmxpY2F0aW9uIHsgLy/QvdCw0LfQstCw0L3QuNC1INC/0LXRh9Cw0YLQvdC+0LPQviDQuNC30LTQsNC90LjRjwoJCQlnZXQgewoJCQkJcmV0dXJuIF9wdWJsaWNhdGlvbjsKCQkJfQoJCQlwcml2YXRlIHNldCB7CgkJCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpKSB7CgkJCQkJLy90aGlzLkxvZ0Vycm9yKCLQndC1INC30LDQtNCw0L3QviDQvdCw0LfQstCw0L3QuNC1INC40LfQtNCw0YLQtdC70YzRgdGC0LLQsCDQs9Cw0LfQtdGC0YsiKTsKCQkJCQl0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCLQmNC30LTQsNGC0LXQu9GM0YHRgtCy0L4iLCAi0J3QtSDQt9Cw0LTQsNC90L4g0L3QsNC30LLQsNC90LjQtSDQuNC30LTQsNGC0LXQu9GM0YHRgtCy0LAg0LPQsNC30LXRgtGLIik7CgkJCQkJLy9fcHVibGljYXRpb24gPSAiVW5rbm93biI7CgkJCQl9IGVsc2UKCQkJCQlfcHVibGljYXRpb24gPSB2YWx1ZTsKCQkJfQoJCX0KCQlwdWJsaWMgaW50IFByaW50RGF0ZSB7IC8v0YLQuNGA0LDQtgoJCQlnZXQgewoJCQkJcmV0dXJuIF9wcmludERhdGU7CgkJCX0KCQkJcHJpdmF0ZSBzZXQgeyAvL9C90LXQstC+0LfQvNC+0LbQvdC+INC00L7QsdCw0LLQuNGC0Ywg0LjQu9C4INGD0LHRgNCw0YLRjCDRgdGC0YDQsNC90LjRhtGLINC60L3QuNCz0Lgg0L/QvtGB0LvQtSDQv9C10YfQsNGC0LgKCQkJCWlmICh2YWx1ZSA8IDEgfHwgdmFsdWUgPiAzMSkgewoJCQkJCS8vdGhpcy5Mb2dFcnJvcigi0J3QtdC60L7RgNGA0LXQutGC0L3Ri9C5INC00LXQvdGMINCy0YvQv9GD0YHQutCwINCz0LDQt9C10YLRiy4g0J/QtdGA0LXRgdC+0LfQtNCw0LnRgtC1INC+0LHRitC10LrRgiIpOwoJCQkJCXRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oItCh0L7QtNC10YDQttCw0L3QuNC1INC40LfQtNCw0L3QuNGPIiwgItCd0LUg0LLQstC10LTQtdC90L4g0YHQvtC00LXRgNC20LDQvdC40LUg0LjQt9C00LDQvdC40Y8uINCf0LXRgNC10YHQvtC30LTQsNC50YLQtSDQvtCx0YrQtdC60YIiKTsKCQkJCQkvL19wcmludERhdGUgPSAxOwoJCQkJfSBlbHNlCgkJCQkJX3ByaW50RGF0ZSA9IHZhbHVlOwoJCQl9CgkJfQoKCQlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewoJCQlyZXR1cm4gKCQi0JPQsNC30LXRgtCwIHtOYW1lfSDQuNC30LTQsNGC0LXQu9GM0YHRgtCy0LAge1B1YmxpY2F0aW9ufSjQr9C30YvQujoge0xhbmd9LCB7UGFnZXNDb3VudH0g0YHRgtGA0LDQvdC40YYsINC00LXQvdGMINCy0YvQv9GD0YHQutCwOiB7UHJpbnREYXRlfSkiKTsvL0hIOm1tCgkJfQoKCQkvKnB1YmxpYyBEYXRlVGltZSBQcmludERhdGUgeyAvL9Cz0L7QtCjQtNCw0YLQsCkg0LjQt9C00LDQvdC40Y8gCgkJCWdldCB7CgkJCQlyZXR1cm4gX3ByaW50RGF0ZTsKCQkJfQoJCQlwcml2YXRlIHNldCB7CgkJCQlpZiAoX3ByaW50RGF0ZSA+IERhdGVUaW1lLk5vdykgeyAvL9C90LXQu9GM0LfRjyDQvdCw0L/QtdGH0LDRgtCw0YLRjCDQuNC30LTQsNC90LjQtSDQsiDQsdGD0LTRg9GJ0LXQvAoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCLQk9Cw0LfQtdGC0LUg0YPRgdGC0LDQvdC+0LLQu9C10L3QsCDRgtC10LrRg9GJ0LDRjyDQtNCw0YLQsCIpOwoJCQkJCV9wcmludERhdGUgPSBEYXRlVGltZS5Ob3c7CgkJCQl9IGVsc2UKCQkJCQlfcHJpbnREYXRlID0gdmFsdWU7CgkJCX0KCQl9Ki8KCX0KfQoKCgoKCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBzM2wyIHsKCWVudW0gU3ViamVjdCB7CgkJSW5mb3JtYXRpY3MsCgkJTWF0aCwKCQlSdXNzaWFuCgl9CgljbGFzcyBUZXh0Qm9vayA6IEJvb2sgewoJCWludCBfZ3JhZGU7IC8v0LrQu9Cw0YHRgSwg0L3QsCDQutC+0YLQvtGA0YvQuSDRgNCw0YHRgdGH0LjRgtCw0L0g0YPRh9C10LHQvdC40LoKCQlTdWJqZWN0IF9zdWJqZWN0OyAvL9C/0YDQtdC00LzQtdGCLCDQv9C+INC60L7RgtC+0YDQvtC80YMg0LTQsNC90L3Ri9C5INGD0YfQtdCx0L3QuNC6CgoJCXB1YmxpYyBUZXh0Qm9vayhzdHJpbmcgbmFtZSwgc3RyaW5nIGNvbnRlbnRzLCBpbnQgcGFnZXNDb3VudCwgTGFuZ3VhZ2UgbGFuZywgc3RyaW5nIGF1dGhvciwgc3RyaW5nIG93bmVyLCBpbnQgY2lyY3VsYXRpb24sIGludCBncmFkZSwgU3ViamVjdCBzdWJqZWN0KSA6CgkJCWJhc2UobmFtZSwgY29udGVudHMsIHBhZ2VzQ291bnQsIGxhbmcsIGF1dGhvciwgb3duZXIsIGNpcmN1bGF0aW9uKSB7CgkJCUdyYWRlID0gZ3JhZGU7CgkJCVN1YmplY3QgPSBzdWJqZWN0OwoJCX0KCQlwdWJsaWMgVGV4dEJvb2soKSA6IGJhc2UoKSB7CgkJCUdyYWRlID0gMTsKCQkJU3ViamVjdCA9IFN1YmplY3QuSW5mb3JtYXRpY3M7CgkJfQoJCXB1YmxpYyBpbnQgR3JhZGUgeyAvL9GC0LjRgNCw0LYKCQkJZ2V0IHsKCQkJCXJldHVybiBfZ3JhZGU7CgkJCX0KCQkJcHJpdmF0ZSBzZXQgeyAvL9C90LXQstC+0LfQvNC+0LbQvdC+INC00L7QsdCw0LLQuNGC0Ywg0LjQu9C4INGD0LHRgNCw0YLRjCDRgdGC0YDQsNC90LjRhtGLINC60L3QuNCz0Lgg0L/QvtGB0LvQtSDQv9C10YfQsNGC0LgKCQkJCWlmICh2YWx1ZSA8IDEgfHwgdmFsdWUgPiAxMSkgewoJCQkJCXRoaXMuTG9nRXJyb3IoItCd0LXQutC+0YDRgNC10LrRgtC90YvQuSDQutC70LDRgdGBINGD0YfQtdCx0L3QuNC60LAuINCf0LXRgNC10YHQvtC30LTQsNC50YLQtSDQvtCx0YrQtdC60YIiKTsKCQkJCQlfZ3JhZGUgPSAxOwoJCQkJfSBlbHNlCgkJCQkJX2dyYWRlID0gdmFsdWU7CgkJCX0KCQl9CgkJcHVibGljIFN1YmplY3QgU3ViamVjdCB7IC8v0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0LDQvdC40YYKCQkJZ2V0IHsgcmV0dXJuIF9zdWJqZWN0OyB9CgkJCXByaXZhdGUgc2V0IHsgX3N1YmplY3QgPSB2YWx1ZTsgfQoJCX0KCgoJCXB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50SW5mbygpIHsKCQkJYmFzZS5QcmludEluZm8oKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCLQr9Cy0LvRj9C10YLRgdGPINGD0YfQtdCx0L3QuNC60L7QvCDQtNC70Y8ge0dyYWRlfSDQutC70LDRgdGB0LAiKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCLQo9GH0LXQsdC90YvQuSDQv9GA0LXQtNC80LXRgjoge1N1YmplY3R9Iik7CgkJfQoKCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBQcmludENvbnRlbnRzKCkgeyAvL9C/0LXRgNC10L7Qv9GA0LXQtNC10LvRj9C10Lwg0LLQuNGA0YLRg9Cw0LvRjNC90YvQuSDQvNC10YLQvtC0IFByaW50Q29udGVudHMoKSAo0YDQsNGB0YjQuNGA0Y/QtdC8INC10LPQviDQstC+0LfQvNC+0LbQvdC+0YHRgtC4KQoJCQliYXNlLlByaW50Q29udGVudHMoKTsKCQl9CgkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3Blbihib29sIGVycm9yID0gZmFsc2UpIHsgLy/Qv9C10YDQtdC+0L/RgNC10LTQtdC70Y/QtdC8INCw0LHRgdGC0YDQsNC60YLQvdGL0Lkg0LzQtdGC0L7QtCBvcGVuKCkKCQkJQ29uc29sZS5Xcml0ZUxpbmUoItCe0YLQutGA0YvQstCw0LXQvCDRg9GH0LXQsdC90LjQui4uLiIpOwoJCQlpZihlcnJvcikKCQkJCXRocm93IG5ldyBQcmludGVkTWF0dGVyRXhjZXB0aW9uKCLQntGI0LjQsdC60LAg0L/RgNC4INC+0YLQutGA0YvRgtC40Lgg0YPRh9C10LHQvdC40LrQsC4gIiwgIijRh9GC0L4t0YLQviDQv9C+0YjQu9C+INC90LUg0YLQsNC6INC40Lct0LfQsCDQuNC90YLQtdGA0LXRgdC90L7QuSDQv9GA0LjRh9C40L3RizogLi4uKSIsIERhdGVUaW1lLk5vdyk7CgkJCS8vLi4uCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCLQo9GH0LXQsdC90LjQuiDQvtGC0LrRgNGL0YIhIik7CgkJfQoKCQlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewoJCQlyZXR1cm4gKCQi0KPRh9C10LHQvdC40Log0LTQu9GPIHtHcmFkZX0g0LrQu9Cw0YHRgdCwINC/0L4g0L/RgNC10LTQvNC10YLRgyB7U3ViamVjdH06IHtOYW1lfSjQkNCy0YLQvtGAOiB7QXV0aG9yfSwg0JLQu9Cw0LTQtdC70LXRhjoge093bmVyfSwg0KLQuNGA0LDQtjoge0NpcmN1bGF0aW9ufS4g0K/Qt9GL0Lo6IHtMYW5nfSwge1BhZ2VzQ291bnR9INGB0YLRgNCw0L3QuNGGKSIpOy8vSEg6bW0KCQl9Cgl9Cgp9CgoKCgoKCgoKCgoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLklPOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLlRleHQ7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CgpuYW1lc3BhY2UgczNsMiB7CgkvL9Ca0YDQvtGC0L7QsiDQodC10YDQs9C10Lkg0JrQkS0yMdCh0J4g0JvQsNCx0L7RgNCw0YLQvtGA0L3QsNGPIOKEljEg0JLQsNGA0LjQsNC90YIgOS4g0J/QtdGH0LDRgtC90L7QtSDQuNC30LTQsNC90LjQtQoJZW51bSBMYW5ndWFnZSB7CgkJRW5nbGlzaCwKCQlSdXNzaWFuLAoJCURldXRzY2gsCgkJSmFwYW5lc2UKCX0KCglwdWJsaWMgY2xhc3MgUGFnZUNvbXBhcmVyIDogSUNvbXBhcmVyPFByaW50ZWRNYXR0ZXI+IHsKCQlpbnQgSUNvbXBhcmVyPFByaW50ZWRNYXR0ZXI+LkNvbXBhcmUoUHJpbnRlZE1hdHRlciB4LCBQcmludGVkTWF0dGVyIHkpIHsKCQkJcmV0dXJuIHguUGFnZXNDb3VudC5Db21wYXJlVG8oeS5QYWdlc0NvdW50KTsKCQl9Cgl9CgoKCWNsYXNzIFByb2dyYW0gewoJCXN0YXRpYyBMYW5ndWFnZSBHZXRMYW5ndWFnZShzdHJpbmcgc3RyKSB7CgkJCXN3aXRjaCAoc3RyKSB7CgkJCQljYXNlICJFbmdsaXNoIjoKCQkJCQlyZXR1cm4gTGFuZ3VhZ2UuRW5nbGlzaDsKCQkJCWNhc2UgIlJ1c3NpYW4iOgoJCQkJCXJldHVybiBMYW5ndWFnZS5SdXNzaWFuOwoJCQkJY2FzZSAiRGV1dHNjaCI6CgkJCQkJcmV0dXJuIExhbmd1YWdlLkRldXRzY2g7CgkJCQljYXNlICJKYXBhbmVzZSI6CgkJCQkJcmV0dXJuIExhbmd1YWdlLkphcGFuZXNlOwoJCQl9CgkJCXJldHVybiBMYW5ndWFnZS5SdXNzaWFuOwoJCX0KCQlzdGF0aWMgU3ViamVjdCBHZXRTdWJqZWN0KHN0cmluZyBzdHIpIHsKCQkJc3dpdGNoIChzdHIpIHsKCQkJCWNhc2UgIkluZm9ybWF0aWNzIjoKCQkJCQlyZXR1cm4gU3ViamVjdC5JbmZvcm1hdGljczsKCQkJCWNhc2UgIk1hdGgiOgoJCQkJCXJldHVybiBTdWJqZWN0Lk1hdGg7CgkJCQljYXNlICJSdXNzaWFuIjoKCQkJCQlyZXR1cm4gU3ViamVjdC5SdXNzaWFuOwoJCQl9CgkJCXJldHVybiBTdWJqZWN0LkluZm9ybWF0aWNzOwoJCX0KCQlzdGF0aWMgc3RyaW5nIEdldENvbnRlbnRzKHN0cmluZyBzdHIpIHsgLy/QtNC70Y8g0YHQvtGF0YDQsNC90LXQvdC40Y8g0L3QvtCy0YvRhSDRgdGC0YDQvtC6CgkJCXJldHVybiBzdHIuUmVwbGFjZSgoIlxcbiIpLCAiXG4iKTsKCQl9CgkJc3RhdGljIHZvaWQgUHJpbnRNYXR0ZXJzKExpc3Q8UHJpbnRlZE1hdHRlcj4gcG0pIHsKCQkJLy9Db25zb2xlLkJhY2tncm91bmRDb2xvciA9IENvbnNvbGVDb2xvci5EYXJrQmx1ZTsKCQkJQ29uc29sZS5Gb3JlZ3JvdW5kQ29sb3IgPSBDb25zb2xlQ29sb3IuRGFya1llbGxvdzsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbS5Db3VudDsgaSsrKQoJCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCIje2krMX06IHtwbVtpXX0iKTsKCQkJLy9Db25zb2xlLkJhY2tncm91bmRDb2xvciA9IENvbnNvbGVDb2xvci5CbGFjazsKCQkJQ29uc29sZS5Gb3JlZ3JvdW5kQ29sb3IgPSBDb25zb2xlQ29sb3IuV2hpdGU7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJfQoJCXN0YXRpYyB2b2lkIFByaW50SW50ZXJlc3Rpbmcoc3RyaW5nIG1zZyA9ICIiKSB7CgkJCUNvbnNvbGUuRm9yZWdyb3VuZENvbG9yID0gQ29uc29sZUNvbG9yLkJsdWU7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKG1zZyk7CgkJCUNvbnNvbGUuRm9yZWdyb3VuZENvbG9yID0gQ29uc29sZUNvbG9yLldoaXRlOwoJCX0KCQlzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpIHsKCQkJLy9jb250ZW50cyA9ICIgICAgIGlvZGZqIGZkamlvIGxlciBrICDQsNCw0LHQsdCxLi7QutGD0LDRiy8zNDEgIjsKCQkJTGlzdDxQcmludGVkTWF0dGVyPiBNYXR0ZXJzOwoKCgkJCVN0cmVhbVdyaXRlciBsb2dzID0gbmV3IFN0cmVhbVdyaXRlcigibG9ncy50eHQiKTsKCgkJCVN0cmVhbVJlYWRlciBzciA9IG51bGw7CgkJCXdoaWxlIChzciA9PSBudWxsKSB7CgkJCQlDb25zb2xlLldyaXRlTGluZSgi0JLQstC10LTQuNGC0LUg0L3QsNC30LLQsNC90LjQtSDRhNCw0LnQu9CwINC00LvRjyDQuNC80L/QvtGA0YLQsCDQv9C10YfQsNGC0L3Ri9GFINC40LfQtNCw0L3QuNC5OiIpOwoJCQkJc3RyaW5nIGZpbGVQYXRoID0gQ29uc29sZS5SZWFkTGluZSgpOwoJCQkJdHJ5IHsKCQkJCQlzciA9IG5ldyBTdHJlYW1SZWFkZXIoZmlsZVBhdGgsIEVuY29kaW5nLkRlZmF1bHQpOwoJCQkJfSBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24gZSkgewoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0J3QtdC60L7RgNGA0LXQutGC0L3QvtC1INC90LDQt9Cy0LDQvdC40LUg0YTQsNC50LvQsCB7ZmlsZVBhdGh9ISDQn9GA0Lgg0LLQstC+0LTQtSDQvdC1INC00L7Qu9C20L3QviDQsdGL0YLRjCDQvdC10LTQvtC/0YPRgdGC0LjQvNGL0YUg0YHQuNC80LLQvtC70L7QsiIpOwoJCQkJfSBjYXRjaCAoVW5hdXRob3JpemVkQWNjZXNzRXhjZXB0aW9uIGUpIHsKCQkJCQlDb25zb2xlLldyaXRlTGluZSgkItCf0L7Qv9GL0YLQutCwINC90LXQsNCy0YLQvtGA0LjQt9C+0LLQsNC90L3QvtCz0L4g0LTQvtGB0YLRg9C/0LAg0Log0YTQsNC50LvRgy4g0J7QsdGA0LDRgtC40YLQtdGB0Ywg0Log0LDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YDRgyDQuNC70Lgg0LLQstC10LTQuNGC0LUg0L3QsNC30LLQsNC90LjQtSDRhNCw0LnQu9CwLCDQuiDQutC+0YLQvtGA0L7QvNGDINC10YHRgtGMINC00L7RgdGC0YPQvyIpOwoJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKCQkJCQlDb25zb2xlLldyaXRlTGluZSgkItCk0LDQudC7IHtlLkZpbGVOYW1lfSDQvdC1INC90LDQudC00LXQvS4g0J/RgNC+0LLQtdGA0YzRgtC1INCy0LLQvtC0Iik7CgkJCQl9CgkJCX0KCgoJCQlpbnQgbiA9IGludC5QYXJzZShzci5SZWFkTGluZSgpKTsKCQkJTWF0dGVycyA9IG5ldyBMaXN0PFByaW50ZWRNYXR0ZXI+KCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCQiTjoge259Iik7CgoJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJCQkJc3RyaW5nIHR5cGUgPSBzci5SZWFkTGluZSgpOwoJCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCJ0eXBlOiB7dHlwZX0iKTsKCQkJCXN0cmluZ1tdIGluZm87CgkJCQl0cnkgewoJCQkJCXN3aXRjaCAodHlwZSkgewoJCQkJCQljYXNlICJCb29rIjoKCQkJCQkJCWluZm8gPSBuZXcgc3RyaW5nWzddOwoJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCA3OyBqKyspCgkJCQkJCQkJaW5mb1tqXSA9IHNyLlJlYWRMaW5lKCk7CgkJCQkJCQkvL3N0cmluZyBuYW1lLCBzdHJpbmcgY29udGVudHMsIGludCBwYWdlc0NvdW50LCBMYW5ndWFnZSBsYW5nLCBzdHJpbmcgYXV0aG9yLCBzdHJpbmcgb3duZXIsIGludCBjaXJjdWxhdGlvbgoJCQkJCQkJTWF0dGVycy5BZGQobmV3IEJvb2soaW5mb1swXSwgR2V0Q29udGVudHMoaW5mb1sxXSksIGludC5QYXJzZShpbmZvWzJdKSwgR2V0TGFuZ3VhZ2UoaW5mb1szXSksIGluZm9bNF0sIGluZm9bNV0sIGludC5QYXJzZShpbmZvWzZdKSkpOwoJCQkJCQkJLy9NYXR0ZXJzW2ldID0gbmV3IEJvb2soaW5mb1swXSwgR2V0Q29udGVudHMoaW5mb1sxXSksIGludC5QYXJzZShpbmZvWzJdKSwgR2V0TGFuZ3VhZ2UoaW5mb1szXSksIGluZm9bNF0sIGluZm9bNV0sIGludC5QYXJzZShpbmZvWzZdKSk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiTmV3c1BhcGVyIjoKCQkJCQkJCWluZm8gPSBuZXcgc3RyaW5nWzZdOwoJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCA2OyBqKyspCgkJCQkJCQkJaW5mb1tqXSA9IHNyLlJlYWRMaW5lKCk7CgkJCQkJCQkvL3N0cmluZyBuYW1lLCBzdHJpbmcgY29udGVudHMsIGludCBwYWdlc0NvdW50LCBMYW5ndWFnZSBsYW5nLCBzdHJpbmcgcHVibGljYXRpb24sIGludCBwcmludERhdGUKCQkJCQkJCU1hdHRlcnMuQWRkKG5ldyBOZXdzUGFwZXIoaW5mb1swXSwgR2V0Q29udGVudHMoaW5mb1sxXSksIGludC5QYXJzZShpbmZvWzJdKSwgR2V0TGFuZ3VhZ2UoaW5mb1szXSksIGluZm9bNF0sIGludC5QYXJzZShpbmZvWzVdKSkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgIlRleHRCb29rIjoKCQkJCQkJCWluZm8gPSBuZXcgc3RyaW5nWzldOwoJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCA5OyBqKyspCgkJCQkJCQkJaW5mb1tqXSA9IHNyLlJlYWRMaW5lKCk7CgkJCQkJCQkvL3N0cmluZyBuYW1lLCBzdHJpbmcgY29udGVudHMsIGludCBwYWdlc0NvdW50LCBMYW5ndWFnZSBsYW5nLCBzdHJpbmcgYXV0aG9yLCBzdHJpbmcgb3duZXIsIGludCBjaXJjdWxhdGlvbiwgaW50IGdyYWRlLCBTdWJqZWN0IHN1YmplY3QKCQkJCQkJCU1hdHRlcnMuQWRkKG5ldyBUZXh0Qm9vayhpbmZvWzBdLCBHZXRDb250ZW50cyhpbmZvWzFdKSwgaW50LlBhcnNlKGluZm9bMl0pLCBHZXRMYW5ndWFnZShpbmZvWzNdKSwgaW5mb1s0XSwgaW5mb1s1XSwgaW50LlBhcnNlKGluZm9bNl0pLCBpbnQuUGFyc2UoaW5mb1s3XSksIEdldFN1YmplY3QoaW5mb1s4XSkpKTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKFByaW50ZWRNYXR0ZXJFeGNlcHRpb24gZSkgeyAvL9GB0L/QtdGG0LjQsNC70YzQvdC+0LUg0LjRgdC60LvRjtGH0LXQvdC40LUg0L/QtdGH0LDRgtC90L7Qs9C+INC40LfQtNCw0L3QuNGPCgkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCIoe2UuVGltZX0p0J/QtdGH0LDRgtC90L7QtSDQuNC30LTQsNC90LjQtToge2UuTWVzc2FnZX0uIHtlLkRldGFpbHN9Iik7CgkJCQl9IGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gZSkgewoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0JfQvdCw0YfQtdC90LjQtSB7ZS5BY3R1YWxWYWx1ZX0g0L3QtdC00L7Qv9GD0YHRgtC40LzQviDQtNC70Y8g0L/QsNGA0LDQvNC10YLRgNCwIHtlLlBhcmFtTmFtZX0g0LIg0LrQu9Cw0YHRgdC1IHtlLlNvdXJjZX06IHtlLk1lc3NhZ2V9LiDQmNGB0L/RgNCw0LLRjNGC0LUg0LTQsNC90L3Ri9C1Iik7CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0JIg0L/RgNC+0LPRgNCw0LzQvNC1INC/0YDQvtC40LfQvtGI0LvQviDRh9GC0L4t0YLQviDQstC+0LLRgdC1INC90LUg0L/Qu9C+0YXQvtC1LiDQodC60L7RgNC+INC80Ysg0YHQtNC10LvQsNC10Lwg0LXRidGRINC70YPRh9GI0LUuIik7CgkJCQkJbG9ncy5Xcml0ZUxpbmUoIj09INCh0JHQntCZINCSINCf0KDQntCT0KDQkNCc0JzQlT09Iik7CgkJCQkJbG9ncy5Xcml0ZUxpbmUoItCY0LzRjyDRh9C70LXQvdCwOiB7MH0iLCBlLlRhcmdldFNpdGUpOwoJCQkJCWxvZ3MuV3JpdGVMaW5lKCLQmtC70LDRgdGBLCDQvtC/0YDQtdC00LXQu9GP0Y7RidC40Lkg0YfQu9C10L06IHswfSIsIGUuVGFyZ2V0U2l0ZS5EZWNsYXJpbmdUeXBlKTsKCQkJCQlsb2dzLldyaXRlTGluZSgi0KLQuNC/INGH0LvQtdC90LA6IHswfSIsIGUuVGFyZ2V0U2l0ZS5NZW1iZXJUeXBlKTsKCQkJCQlsb2dzLldyaXRlTGluZSgi0KHQvtC+0LHRidC10L3QuNC1OiB7MH0iLCBlLk1lc3NhZ2UpOwoJCQkJCWxvZ3MuV3JpdGVMaW5lKCLQmNGB0YLQvtGH0L3QuNC6INC+0YjQuNCx0LrQuDogezB9IiwgZS5Tb3VyY2UpOwoJCQkJCWxvZ3MuV3JpdGVMaW5lKCLQodGC0LXQuiDQstGL0LfQvtCy0L7QsjogezB9IiwgZS5TdGFja1RyYWNlKTsKCgkJCQkJbG9ncy5Xcml0ZUxpbmUoIj09PT0iKTsKCQkJCX0KCgoJCQkJc3IuUmVhZExpbmUoKTsKCQkJfQoJCQkKCQkJCgkJCWZvcmVhY2ggKFByaW50ZWRNYXR0ZXIgTWF0dGVyIGluIE1hdHRlcnMpIHsKCQkJCXRyeSB7CgkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoTWF0dGVyKTsgLy/Qn9C10YDQtdCz0YDRg9C30LrQsCBUb1N0cmluZwoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCQkJTWF0dGVyLlByaW50SW5mbygpOyAvL9Cf0LXRgNC10L7Qv9GA0LXQtNC10LvRkdC90L3Ri9C5INCy0LjRgNGC0YPQsNC70YzQvdGL0Lkg0LzQtdGC0L7QtAoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCQkJTWF0dGVyLk9wZW4oKTsgICAgIC8v0KDQtdCw0LvQuNC30L7QstCw0L3QvdGL0Lkg0LDQsdGB0YLRgNCw0LrRgtC90YvQuSDQvNC10YLQvtC0CgkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKCQkJCQlNYXR0ZXIuUHJpbnRDb250ZW50cygpOyAvL9Cf0LXRgNC10L7Qv9GA0LXQtNC10LvRkdC90L3Ri9C5INCy0LjRgNGC0YPQsNC70YzQvdGL0Lkg0LzQtdGC0L7QtAoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgoJCQkJCS8vaW50W10gZ2cgPSBuZXcgaW50WzFdOyAvL9C+0YjQuNCx0LrQsAoJCQkJCS8vQ29uc29sZS5Xcml0ZUxpbmUoZ2dbMl0pOwoKCQkJCQlDb25zb2xlLldyaXRlTGluZSgpOwoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCQkJLy9NYXR0ZXIuT3Blbih0cnVlKTsgICAgIC8v0L7RgtC60YDRi9GC0LjQtSDRgSDQvtGI0LjQsdC60L7QuQoJCQkJfSBjYXRjaCAoUHJpbnRlZE1hdHRlckV4Y2VwdGlvbiBlKSB7IC8v0YHQv9C10YbQuNCw0LvRjNC90L7QtSDQuNGB0LrQu9GO0YfQtdC90LjQtSDQv9C10YfQsNGC0L3QvtCz0L4g0LjQt9C00LDQvdC40Y8KCQkJCQlDb25zb2xlLldyaXRlTGluZSgkIih7ZS5UaW1lfSnQn9C10YfQsNGC0L3QvtC1INC40LfQtNCw0L3QuNC1OiB7ZS5NZXNzYWdlfS4ge2UuRGV0YWlsc30iKTsKCQkJCX0KCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgeyAvL9Cy0YHQtSDQvtGB0YLQsNC70YzQvdGL0LUg0LjRgdC60LvRjtGH0LXQvdC40Y8KCQkJCQlDb25zb2xlLldyaXRlTGluZSgkItCSINC/0YDQvtCz0YDQsNC80LzQtSDQv9GA0L7QuNC30L7RiNC70L4g0YfRgtC+LdGC0L4g0LLQvtCy0YHQtSDQvdC1INC/0LvQvtGF0L7QtS4g0KHQutC+0YDQviDQvNGLINGB0LTQtdC70LDQtdC8INC10YnRkSDQu9GD0YfRiNC1LiIpOwoJCQkJCWxvZ3MuV3JpdGVMaW5lKCI9PSDQodCR0J7QmSDQkiDQn9Cg0J7Qk9Cg0JDQnNCc0JU9PSIpOwoJCQkJCWxvZ3MuV3JpdGVMaW5lKCLQmNC80Y8g0YfQu9C10L3QsDogezB9IiwgZS5UYXJnZXRTaXRlKTsKCQkJCQlsb2dzLldyaXRlTGluZSgi0JrQu9Cw0YHRgSwg0L7Qv9GA0LXQtNC10LvRj9GO0YnQuNC5INGH0LvQtdC9OiB7MH0iLCBlLlRhcmdldFNpdGUuRGVjbGFyaW5nVHlwZSk7CgkJCQkJbG9ncy5Xcml0ZUxpbmUoItCi0LjQvyDRh9C70LXQvdCwOiB7MH0iLCBlLlRhcmdldFNpdGUuTWVtYmVyVHlwZSk7CgkJCQkJbG9ncy5Xcml0ZUxpbmUoItCh0L7QvtCx0YnQtdC90LjQtTogezB9IiwgZS5NZXNzYWdlKTsKCQkJCQlsb2dzLldyaXRlTGluZSgi0JjRgdGC0L7Rh9C90LjQuiDQvtGI0LjQsdC60Lg6IHswfSIsIGUuU291cmNlKTsKCQkJCQlsb2dzLldyaXRlTGluZSgi0KHRgtC10Log0LLRi9C30L7QstC+0LI6IHswfSIsIGUuU3RhY2tUcmFjZSk7CgoJCQkJCWxvZ3MuV3JpdGVMaW5lKCI9PT09Iik7CgkJCQl9CgkJCX0KCgkJCVByaW50TWF0dGVycyhNYXR0ZXJzKTsKCQkJTWF0dGVycy5Tb3J0KCk7CgkJCVByaW50TWF0dGVycyhNYXR0ZXJzKTsKCQkJTWF0dGVycy5Tb3J0KG5ldyBQYWdlQ29tcGFyZXIoKSk7CgkJCVByaW50TWF0dGVycyhNYXR0ZXJzKTsKCgoJCQlpZiAoTWF0dGVycy5Db3VudCA+PSA2KSB7CgkJCQlTdGFjazxQcmludGVkTWF0dGVyPiBzdGFjayA9IG5ldyBTdGFjazxQcmludGVkTWF0dGVyPigpOwoJCQkJLy/QktGB0YLQsNCy0LjQvCAxINC4IDMg0L/QtdGH0LDRgtC90L7QtSDQuNC30LTQsNC90LjQtSDQuNC3INGB0YfQuNGC0LDQvdC90L7Qs9C+INC80LDRgdGB0LjQstCwCgkJCQlzdGFjay5QdXNoKE1hdHRlcnNbMF0pOwoJCQkJUHJpbnRJbnRlcmVzdGluZygkItCS0YHRgtCw0LLQu9GP0LXQvCBNYXR0ZXJzWzBdLi4uINCt0LvQtdC80LXQvdGCINC90LAg0LLQtdGA0YjQuNC90LUg0YHRgtC10LrQsDoge3N0YWNrLkZpcnN0KCl9Iik7CgkJCQlzdGFjay5QdXNoKE1hdHRlcnNbMl0pOwoJCQkJUHJpbnRJbnRlcmVzdGluZygkItCS0YHRgtCw0LLQu9GP0LXQvCBNYXR0ZXJzWzJdLi4uINCt0LvQtdC80LXQvdGCINC90LAg0LLQtdGA0YjQuNC90LUg0YHRgtC10LrQsDoge3N0YWNrLkZpcnN0KCl9Iik7CgoJCQkJc3RhY2suUHVzaChNYXR0ZXJzWzFdKTsKCQkJCVByaW50SW50ZXJlc3RpbmcoJCLQktGB0YLQsNCy0LvRj9C10Lwg0L3QtdGB0LrQvtC70YzQutC+INC00YDRg9Cz0LjRhSDRjdC70LXQvNC10L3RgtC+0LIg0LjQtyBNYXR0ZXJzW10uLi4g0K3Qu9C10LzQtdC90YIg0L3QsCDQstC10YDRiNC40L3QtSDRgdGC0LXQutCwOiB7c3RhY2suRmlyc3QoKX0iKTsKCQkJCXN0YWNrLlB1c2goTWF0dGVyc1szXSk7CgkJCQlzdGFjay5QdXNoKE1hdHRlcnNbNV0pOwoJCQkJc3RhY2suUHVzaChNYXR0ZXJzWzRdKTsKCgoJCQkJUHJpbnRlZE1hdHRlckNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgUHJpbnRlZE1hdHRlckNvbnRhaW5lcigpOwoKCQkJCVByaW50SW50ZXJlc3RpbmcoKTsKCQkJCVByaW50SW50ZXJlc3RpbmcoJCLQkCDRgtC10L/QtdGA0Ywg0LTQvtCx0LDQstC40Lwg0LIg0LLQtdGA0YUg0YHQstC+0LXQs9C+INC60L7QvdGC0LXQudC90LXRgNCwINCy0YHQtSDQvtCx0YrQtdC60YLRiyDQuNC3INGB0YLQtdC60LA6Iik7CgkJCQlQcmludEludGVyZXN0aW5nKCk7CgkJCQl3aGlsZSAoc3RhY2suQ291bnQgPiAwKSB7CgkJCQkJY29udGFpbmVyLlB1c2hCYWNrKHN0YWNrLlBvcCgpKTsKCQkJCQlQcmludEludGVyZXN0aW5nKCQi0J/QtdGA0LXQvdC+0YHQuNC8INGBINCy0LXRgNGI0LjQvdGLINGB0YLQtdC60LA6IHtjb250YWluZXIuQmFjaygpfSIpOwoJCQkJfQoKCgkJCQlQcmludEludGVyZXN0aW5nKCk7CgkJCQlQcmludEludGVyZXN0aW5nKCQi0KLQtdC/0LXRgNGMINC90LDRiCDQutC+0L3RgtC10LnQvdC10YAg0LLRi9Cz0LvRj9C00LjRgiDRgtCw0Lo6Iik7CgkJCQlQcmludE1hdHRlcnMoY29udGFpbmVyLkdldE1hdHRlcnMoKSk7CgkJCQlQcmludEludGVyZXN0aW5nKCk7CgoKCQkJCVByaW50SW50ZXJlc3RpbmcoJCLQktGL0LHQtdGA0LXQvCDQuNC3INC60L7QvdGC0LXQudC90LXRgNCwINCy0YHQtSDQv9C10YfQsNGC0L3Ri9C1INC40LfQtNCw0L3QuNGPINC60L7Qu9C40YfQtdGB0YLQstC+0Lwg0YHRgtGA0LDQvdC40YYg0L7RgiAzMCDQtNC+IDMyMDoiKTsKCQkJCUxpc3Q8UHJpbnRlZE1hdHRlcj4gbGlzdCA9IGNvbnRhaW5lci5HZXRNYXR0ZXJzQnlQYWdlcygzMCwgMzIwKTsKCQkJCVByaW50TWF0dGVycyhsaXN0KTsKCQkJCVByaW50SW50ZXJlc3RpbmcoKTsKCQkJCVByaW50SW50ZXJlc3RpbmcoJCLQotC10L/QtdGA0Ywg0YPQtNCw0LvQuNC8INC40YUg0Lgg0LLRi9Cy0LXQtNC10Lwg0YHQvtC00LXRgNC20LjQvNC+0LUg0LrQvtC90YLQtdC50L3QtdGA0LA6Iik7CgkJCQljb250YWluZXIuUmVtb3ZlKGxpc3QpOwoJCQkJUHJpbnRNYXR0ZXJzKGNvbnRhaW5lci5HZXRNYXR0ZXJzKCkpOwoJCQkJUHJpbnRJbnRlcmVzdGluZygpOwoKCQkJCVByaW50SW50ZXJlc3RpbmcoJCLQntGC0YHQvtGA0YLQuNGA0YPQtdC8INC/0L4g0L3QsNC30LLQsNC90LjRjiwg0YfRgtC+INC+0YHRgtCw0LvQvtGB0Yw6Iik7CgkJCQljb250YWluZXIuU29ydCgpOwoJCQkJUHJpbnRNYXR0ZXJzKGNvbnRhaW5lci5HZXRNYXR0ZXJzKCkpOwoJCQkJUHJpbnRJbnRlcmVzdGluZygpOwoKCQkJCVByaW50SW50ZXJlc3RpbmcoJCLQntGC0YHQvtGA0YLQuNGA0YPQtdC8INC/0L4g0LrQvtC70LjRh9C10YHRgtCy0YMg0YHRgtGA0LDQvdC40YYsINGH0YLQviDQvtGB0YLQsNC70L7RgdGMOiIpOwoJCQkJY29udGFpbmVyLlNvcnQobmV3IFBhZ2VDb21wYXJlcigpKTsKCQkJCVByaW50TWF0dGVycyhjb250YWluZXIuR2V0TWF0dGVycygpKTsKCQkJCVByaW50SW50ZXJlc3RpbmcoKTsKCgkJCX0KCgkJCXNyLkNsb3NlKCk7CgkJCWxvZ3MuQ2xvc2UoKTsKCgoJCQkvKgoJCQl2YXIgRW1wdHlCb29rID0gbmV3IFByaW50ZWRNYXR0ZXIoKTsKCgkJCUVtcHR5Qm9vay5QcmludEluZm8oKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKCQkJRW1wdHlCb29rLlByaW50Q29udGVudHMoKTsKCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgoJCQlzdHJpbmcgY29udGVudHMgPSAi0JrQvtC80L/RjNGO0YLQtdGA0L3QvtC1INC40LfQtNCw0YLQtdC70YzRgdGC0LLQviDigJzQlNC40LDQu9C10LrRgtC40LrQsOKAnVxu0J/QtdGA0LXQstC+0LQg0YEg0LDQvdCz0LvQuNC50YHQutC+0LPQviDQuCDRgNC10LTQsNC60YbQuNGPINCuLtCdLtCQ0YDRgtC10LzQtdC90LrQvlxu0J/QviDQvtCx0YnQuNC8INCy0L7Qv9GA0L7RgdCw0Lwg0L7QsdGA0LDRidCw0LnRgtC10YHRjCDQsiDQuNC30LTQsNGC0LXQu9GM0YHRgtCy0L4g4oCc0JTQuNCw0LvQtdC60YLQuNC60LDigJ0g0L/QviDQsNC00YDQtdGB0YM6XG5pbmZvIEBkaWFsZWt0aWthLmNvbSwgaHR0cDpcbtCi0YDQvtC10LvRgdC10L0sINCt0L3QtNGA0Y4sINCU0LbQtdC/0LjQutGBLCDQpNC40LvQuNC/0L8u0KI3MCDQr9C30YvQuiDQv9GA0L7Qs9GA0LDQvNC80LjRgNC+0LLQsNC90LjRjyBDIyA3INC4INC/0LvQsNGC0YTQvtGA0LzRiyAuTkVUINC4IC5ORVQgQ29yZSwgOC3QtSDQuNC30LQuIDog0J/QtdGALiDRgVxu0LDQvdCz0LsuIOKAlCDQodCf0LEuIDog0J7QntCeIOKAnNCU0LjQsNC70LXQutGC0LjQutCw4oCdLCAyMDE4IOKAlCAxMzI4INGBLiA6INC40LsuIOKAlCDQn9Cw0YDQsNC7LtGC0LjRgi7QsNC90LPQuy5cbklTQk4gOTc4IC0gNSAtIDYwNDA3MjMgLSAxIC0gOCjRgNGD0YEuKVxu0JHQkdCaIDMyLjk3MyI7CgoJCQl2YXIgQ3NoYXJwID0gbmV3IFByaW50ZWRNYXR0ZXIoCgkJCQki0K/Qt9GL0Log0L/RgNC+0LPRgNCw0LzQvNC40YDQvtCy0LDQvdC40Y8gQyMgNyDQuCDQv9C70LDRgtGE0L7RgNC80YsgLk5FVCDQuCAuTkVUIENvcmUgIiwKCQkJCSLQotGA0L7QtdC70YHQtdC9LCDQlNC20LXQv9C40LrRgSIsCgkJCQljb250ZW50cywKCQkJCSLQkdC40LHQu9C40L7RgtC10LrQsCDQr9GA0JPQoyIsCgkJCQkxMzMwLAoJCQkJTGFuZ3VhZ2UuUnVzc2lhbiwKCQkJCVByaW50ZWRNYXR0ZXJUeXBlLmJvb2ssCgkJCQluZXcgRGF0ZVRpbWUoMjAxOCwgMSwgMSwgMSwgMCwgMCkKCQkJKTsKCgkJCUNzaGFycC5QcmludENvbnRlbnRzKCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCUNzaGFycC5QcmludEluZm8oKTsKCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgoJCQl2YXIgR29vZEJvb2sgPSBuZXcgUHJpbnRlZE1hdHRlcigiU3V2bWVyJ3MgYm9vayIsICLQmtGA0L7RgtC+0LIg0KHQtdGA0LPQtdC5IiwgIk15IHByb2ZpbGUgb24gZ2l0aHViOiBodHRwczovL2dpdGh1Yi5jb20vc3V2bWVyIik7IC8vOCB3b3JkcwoKCQkJR29vZEJvb2suUHJpbnRDb250ZW50cygpOwoJCQlDb25zb2xlLldyaXRlTGluZSgpOwoJCQlHb29kQm9vay5QcmludEluZm8oKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoJCLQktC70LDQtNC10LvQtdGGINC60L3QuNCz0Lgge0dvb2RCb29rLk5hbWV9OiB7R29vZEJvb2suT3duZXJ9Iik7CgkJCUdvb2RCb29rLk93bmVyID0gIiI7IC8v0J7RiNC40LHQutCwINCyINC60L7QvdGB0L7Qu9C4CgkJCUdvb2RCb29rLk93bmVyID0gItCh0LXRgNCz0LXQuSDQmtGA0L7RgtC+0LIiOwoJCQlDb25zb2xlLldyaXRlTGluZSgkItCa0L3QuNCz0LAge0dvb2RCb29rLk5hbWV9INC/0LXRgNC10YjQu9CwINCy0L4g0LLQu9Cw0LTQtdC90LjQtSDRh9C10LvQvtCy0LXQutGDOiB7R29vZEJvb2suT3duZXJ9Iik7CgoJCQlDb25zb2xlLldyaXRlTGluZSgpOwoJCQlDb25zb2xlLldyaXRlTGluZSgkItCa0L7Qu9C40YfQtdGB0YLQstC+INGB0LvQvtCyINCyINGC0LXQutGB0YLQtSDQutC90LjQs9C4ICB7Q3NoYXJwfToiKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoQ3NoYXJwLkdldFdvcmRzQ291bnQoKSk7CgoJCQlDb25zb2xlLldyaXRlTGluZSgkItCa0L7Qu9C40YfQtdGB0YLQstC+INGB0LvQvtCyINCyINGC0LXQutGB0YLQtSDQutC90LjQs9C4ICB7R29vZEJvb2t9OiIpOwoJCQlDb25zb2xlLldyaXRlTGluZShHb29kQm9vay5HZXRXb3Jkc0NvdW50KCkpOwoKCQkJQ29uc29sZS5Gb3JlZ3JvdW5kQ29sb3IgPSBDb25zb2xlQ29sb3IuWWVsbG93OwoJCQlpZiAoR29vZEJvb2sgPiBDc2hhcnApIHsKCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0JrQvdC40LPQsCDQsNCy0YLQvtGA0LAge0dvb2RCb29rLkF1dGhvcn0g0LHQvtC70YzRiNC1INC/0L4g0YHQu9C+0LLQsNC8LCDRh9C10Lwg0LrQvdC40LPQsCB7Q3NoYXJwLk5hbWV9Iik7CgkJCX0gZWxzZSBpZiAoR29vZEJvb2sgPT0gQ3NoYXJwKSB7CgkJCQlDb25zb2xlLldyaXRlTGluZSgkItCjINC60L3QuNCzINC+0LTQuNC90LDQutC+0LLQvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGB0LvQvtCyIik7CgkJCX0gZWxzZSB7CgkJCQlDb25zb2xlLldyaXRlTGluZSgkItCd0LDQuNCx0L7Qu9GM0YjQtdC1INC60L7Qu9C40YfQtdGB0YLQstC+INGB0LvQvtCyINCyINC60L3QuNCz0LUge0NzaGFycC5OYW1lfSIpOwoJCQl9CgkJCUNvbnNvbGUuRm9yZWdyb3VuZENvbG9yID0gQ29uc29sZUNvbG9yLldoaXRlOwoKCQkJKi8KCQkJQ29uc29sZS5SZWFkS2V5KCk7CgkJfQoJfQoJLyoKCWNsYXNzIEVtcGxveWVlCiAgICB7CgkJcHVibGljIHN0YXRpYyBzdHJpbmcgQ29tcGFueU5hbWU7CgkJc3RhdGljIEVtcGxveWVlKCkKICAgICAgICB7CgkJCUNvbXBhbnlOYW1lID0gItCv0YDQk9CjIjsKICAgICAgICB9CiAgICB9Ki8KfQoKCgoKCgp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLlRleHQ7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CgpuYW1lc3BhY2UgczNsMiB7CgljbGFzcyBCb29rIDogUHJpbnRlZE1hdHRlciB7CgkJc3RyaW5nIF9hdXRob3I7IC8v0LDQstGC0L7RgCDQutC90LjQs9C4CgkJc3RyaW5nIF9vd25lcjsgLy/QstC70LDQtNC10LvQtdGGINC60L3QuNCz0LgKCQlpbnQgX2NpcmN1bGF0aW9uOyAvL9GC0LjRgNCw0LYKCgkJcHVibGljIHN0cmluZyBBdXRob3IgeyAvL9CQ0LLRgtC+0YAg0LrQvdC40LPQuAoJCQlnZXQgewoJCQkJcmV0dXJuIF9hdXRob3I7CgkJCX0KCQkJcHJpdmF0ZSBzZXQgewoJCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkgewoJCQkJCS8vdGhpcy5Mb2dFcnJvcigi0J3QtSDQstCy0LXQtNC10L0g0LDQstGC0L7RgCDQutC90LjQs9C4LiDQn9C10YDQtdGB0L7Qt9C00LDQudGC0LUg0L7QsdGK0LXQutGCIik7CgkJCQkJdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigi0JDQstGC0L7RgCDQutC90LjQs9C4IiwgItCd0LUg0LLQstC10LTQtdC9INCw0LLRgtC+0YAg0LrQvdC40LPQuCIpOwoJCQkJCS8vX2F1dGhvciA9ICJVbmtub3duIGF1dGhvciI7CgkJCQl9IGVsc2UKCQkJCQlfYXV0aG9yID0gdmFsdWU7CgkJCX0KCQl9CgkJcHVibGljIHN0cmluZyBPd25lciB7IC8v0JLQu9Cw0LTQtdC70LXRhiDQutC90LjQs9C4CgkJCWdldCB7CgkJCQlyZXR1cm4gX293bmVyOwoJCQl9CgkJCXNldCB7CgkJCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpKSB7CgkJCQkJLy90aGlzLkxvZ0Vycm9yKCLQndC1INCy0LLQtdC00LXQvSDQstC70LDQtNC10LvQtdGGINC60L3QuNCz0LguINCf0LXRgNC10YHQvtC30LTQsNC50YLQtSDQvtCx0YrQtdC60YIiKTsKCQkJCQl0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCLQktC70LDQtNC10LvQtdGGINC60L3QuNCz0LgiLCAi0J3QtSDQstCy0LXQtNC10L0g0LLQu9Cw0LTQtdC70LXRhiDQutC90LjQs9C4Iik7CgkJCQkJLy9fb3duZXIgPSAiIjsKCQkJCX0gZWxzZQoJCQkJCV9vd25lciA9IHZhbHVlOwoJCQl9CgkJfQoJCXB1YmxpYyBpbnQgQ2lyY3VsYXRpb24geyAvL9GC0LjRgNCw0LYKCQkJZ2V0IHsKCQkJCXJldHVybiBfY2lyY3VsYXRpb247CgkJCX0KCQkJcHJpdmF0ZSBzZXQgeyAvL9C90LXQstC+0LfQvNC+0LbQvdC+INC00L7QsdCw0LLQuNGC0Ywg0LjQu9C4INGD0LHRgNCw0YLRjCDRgdGC0YDQsNC90LjRhtGLINC60L3QuNCz0Lgg0L/QvtGB0LvQtSDQv9C10YfQsNGC0LgKCQkJCWlmICh2YWx1ZSA8PSAwKSB7CgkJCQkJLy90aGlzLkxvZ0Vycm9yKCLQndC10LrQvtGA0YDQtdC60YLQvdGL0Lkg0YLQuNGA0LDQtiDQutC90LjQs9C4LiDQn9C10YDQtdGB0L7Qt9C00LDQudGC0LUg0L7QsdGK0LXQutGCIiwgItCi0LjRgNCw0LYiKTsKCQkJCQl0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCLQotC40YDQsNC2IiwgItCd0LXQutC+0YDRgNC10LrRgtC90YvQuSDRgtC40YDQsNC2INC60L3QuNCz0LgiKTsKCQkJCQkvL19jaXJjdWxhdGlvbiA9IDE7CgkJCQl9IGVsc2UKCQkJCQlfY2lyY3VsYXRpb24gPSB2YWx1ZTsKCQkJfQoJCX0KCgkJcHVibGljIEJvb2soc3RyaW5nIG5hbWUsIHN0cmluZyBjb250ZW50cywgaW50IHBhZ2VzQ291bnQsIExhbmd1YWdlIGxhbmcsIHN0cmluZyBhdXRob3IsIHN0cmluZyBvd25lciwgaW50IGNpcmN1bGF0aW9uKSA6IGJhc2UobmFtZSwgY29udGVudHMsIHBhZ2VzQ291bnQsIGxhbmcpIHsKCQkJQXV0aG9yID0gYXV0aG9yOwoJCQlPd25lciA9IG93bmVyOwoJCQlDaXJjdWxhdGlvbiA9IGNpcmN1bGF0aW9uOwoJCX0KCQlwdWJsaWMgQm9vaygpIDogYmFzZSgpIHsKCQkJQXV0aG9yID0gItCv0YDQk9CjIjsKCQkJT3duZXIgPSAi0JHQuNCx0LvQuNC+0YLQtdC60LAg0K/RgNCT0KMiOwoJCQlDaXJjdWxhdGlvbiA9IDE7CgkJfQoKCgkJcHVibGljIG92ZXJyaWRlIHZvaWQgUHJpbnRJbmZvKCkgewoJCQlDb25zb2xlLldyaXRlTGluZSgkItCY0L3RhNC+0YDQvNCw0YbQuNGPINC+INC60L3QuNCz0LU6IHtOYW1lfSIpOwoJCQlDb25zb2xlLldyaXRlTGluZSgkItCQ0LLRgtC+0YA6IHtBdXRob3J9Iik7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0JLQu9Cw0LTQtdC70LXRhjoge093bmVyfSIpOwoJCQlDb25zb2xlLldyaXRlTGluZSgkItCi0LjRgNCw0LY6IHtDaXJjdWxhdGlvbn0iKTsKCQkJYmFzZS5QcmludEluZm8oKTsKCQl9CgoJCXB1YmxpYyBvdmVycmlkZSB2b2lkIFByaW50Q29udGVudHMoKSB7IC8v0L/QtdGA0LXQvtC/0YDQtdC00LXQu9GP0LXQvCDQstC40YDRgtGD0LDQu9GM0L3Ri9C5INC80LXRgtC+0LQgUHJpbnRDb250ZW50cygpICjRgNCw0YHRiNC40YDRj9C10Lwg0LXQs9C+INCy0L7Qt9C80L7QttC90L7RgdGC0LgpCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCQi0KHQvtC00LXRgNC20LDQvdC40LUg0LrQvdC40LPQuCDigJx7TmFtZX3igJ06Iik7CgkJCWJhc2UuUHJpbnRDb250ZW50cygpOwoJCX0KCgkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3Blbihib29sIGVycm9yID0gZmFsc2UpIHsgLy/Qv9C10YDQtdC+0L/RgNC10LTQtdC70Y/QtdC8INCw0LHRgdGC0YDQsNC60YLQvdGL0Lkg0LzQtdGC0L7QtCBvcGVuKCkKCQkJQ29uc29sZS5Xcml0ZUxpbmUoItCe0YLQutGA0YvQstCw0LXQvCDQutC90LjQs9GDLi4uIik7CgkJCWlmIChlcnJvcikKCQkJCXRocm93IG5ldyBQcmludGVkTWF0dGVyRXhjZXB0aW9uKCLQntGI0LjQsdC60LAg0L/RgNC4INC+0YLQutGA0YvRgtC40Lgg0LrQvdC40LPQuC4gIiwgIijRh9GC0L4t0YLQviDQv9C+0YjQu9C+INC90LUg0YLQsNC6INC40Lct0LfQsCDQuNC90YLQtdGA0LXRgdC90L7QuSDQv9GA0LjRh9C40L3RizogLi4uKSIsIERhdGVUaW1lLk5vdyk7CgkJCS8vLi4uCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCLQmtC90LjQs9CwINC+0YLQutGA0YvRgtCwISIpOwoJCX0KCgkJcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKCQkJcmV0dXJuICgkItCa0L3QuNCz0LAge05hbWV9KNCQ0LLRgtC+0YA6IHtBdXRob3J9LCDQktC70LDQtNC10LvQtdGGOiB7T3duZXJ9LCDQotC40YDQsNC2OiB7Q2lyY3VsYXRpb259LiDQr9C30YvQujoge0xhbmd9LCB7UGFnZXNDb3VudH0g0YHRgtGA0LDQvdC40YYpIik7Ly9ISDptbQoJCX0KCgl9Cn0KCg==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement