IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMKIyB0aGlzIHRlc3RzIHRoZSBiYXNpYyBBUElzIG9mIHRoZSBYbWxUZXh0UmVhZGVyIGludGVyZmFjZQojCmltcG9ydCBzZXR1cF90ZXN0CmltcG9ydCBsaWJ4bWwyCmltcG9ydCBzeXMKdHJ5OgogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBzdHJfaW8gPSBTdHJpbmdJTy5TdHJpbmdJTwpleGNlcHQ6CiAgICBpbXBvcnQgaW8KICAgIHN0cl9pbyA9IGlvLlN0cmluZ0lPCgojIE1lbW9yeSBkZWJ1ZyBzcGVjaWZpYwpsaWJ4bWwyLmRlYnVnTWVtb3J5KDEpCgpmID0gc3RyX2lvKCIiIjxhPjxiIGIxPSJiMSIvPjxjPmNvbnRlbnQgb2YgYzwvYz48L2E+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDEiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGZpcnN0IGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYSIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDEgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSBmaXJzdCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gc2Vjb25kIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYiIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMSBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDEgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAxOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIHRoaXJkIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYyIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDEgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSB0aGlyZCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gdGV4dCBub2RlIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gIiN0ZXh0IiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMyBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDAgb3IgXAogICByZWFkZXIuVmFsdWUoKSAhPSAiY29udGVudCBvZiBjIjoKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgdGV4dCBub2RlIikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gZW5kIG9mIHRoaXJkIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYyIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDE1IG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMDoKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgZW5kIG9mIHRoaXJkIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBlbmQgb2YgZmlyc3QgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMTUgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSBlbmQgb2YgZmlyc3QgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAwOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGVuZCBvZiBkb2N1bWVudCIpCiAgICBzeXMuZXhpdCgxKQoKIwojIGV4YW1wbGUgZnJvbSB0aGUgWG1sVGV4dFJlYWRlciBkb2NzCiMKZiA9IHN0cl9pbygiIiI8dGVzdCB4bWxuczpkdD0idXJuOmRhdGF0eXBlcyIgZHQ6dHlwZT0iaW50Ii8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDIiKQoKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJFcnJvciByZWFkaW5nIHRlc3QgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuR2V0QXR0cmlidXRlTm8oMCkgIT0gInVybjpkYXRhdHlwZXMiIG9yIFwKICAgcmVhZGVyLkdldEF0dHJpYnV0ZU5vKDEpICE9ICJpbnQiIG9yIFwKICAgcmVhZGVyLkdldEF0dHJpYnV0ZU5zKCJ0eXBlIiwgInVybjpkYXRhdHlwZXMiKSAhPSAiaW50IiBvciBcCiAgIHJlYWRlci5HZXRBdHRyaWJ1dGUoImR0OnR5cGUiKSAhPSAiaW50IjoKICAgIHByaW50KCJlcnJvciByZWFkaW5nIHRlc3QgYXR0cmlidXRlcyIpCiAgICBzeXMuZXhpdCgxKQoKIwojIGV4YW1wbGUgZnJvbSB0aGUgWG1sVGV4dFJlYWRlciBkb2NzCiMKZiA9IHN0cl9pbygiIiI8cm9vdCB4bWxuczphPSJ1cm46NDU2Ij4KPGl0ZW0+CjxyZWYgaHJlZj0iYTpiIi8+CjwvaXRlbT4KPC9yb290PiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QzIikKCnJldCA9IHJlYWRlci5SZWFkKCkKd2hpbGUgcmV0ID09IDE6CiAgICBpZiByZWFkZXIuTmFtZSgpID09ICJyZWYiOgogICAgICAgIGlmIHJlYWRlci5Mb29rdXBOYW1lc3BhY2UoImEiKSAhPSAidXJuOjQ1NiI6CiAgICAgICAgICAgIHByaW50KCJlcnJvciByZXNvbHZpbmcgbmFtZXNwYWNlIHByZWZpeCIpCiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAgICAgYnJlYWsKICAgIHJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgiRXJyb3IgZmluZGluZyB0aGUgcmVmIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKCiMKIyBIb21lIG1hZGUgZXhhbXBsZSBmb3IgdGhlIHZhcmlvdXMgYXR0cmlidXRlIGFjY2VzcyBmdW5jdGlvbnMKIwpmID0gc3RyX2lvKCIiIjx0ZXN0YXR0ciB4bWxucz0idXJuOjEiIHhtbG5zOmE9InVybjoyIiBiPSJiIiBhOmI9ImE6YiIvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3Q0IikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJFcnJvciByZWFkaW5nIHRoZSB0ZXN0YXR0ciBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCiMKIyBBdHRyaWJ1dGUgZXhwbG9yYXRpb24gYnkgaW5kZXgKIwppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMCkgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDApIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MSI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMSkgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDEpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDEpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zOmEiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVObygyKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoMikiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMikgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMykgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDMpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJhOmIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgzKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhOmIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgzKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCiMKIyBBdHRyaWJ1dGUgZXhwbG9yYXRpb24gYnkgbmFtZQojCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoInhtbG5zIikgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCd4bWxucycpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MSI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCd4bWxucycpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoInhtbG5zOmEiKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ3htbG5zJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ3htbG5zOmEnKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJiIikgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCdiJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgnYicpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoImE6YiIpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgnYTpiJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCdhOmInKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTnMoImIiLCAidXJuOjIiKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ2InLCAndXJuOjInKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2InLCAndXJuOjInKSIpCiAgICBzeXMuZXhpdCgxKQojCiMgR28gYmFjayBhbmQgcmVhZCBpbiBzZXF1ZW5jZQojCmlmIHJlYWRlci5Nb3ZlVG9FbGVtZW50KCkgIT0gMToKICAgIHByaW50KCJGYWlsZWQgdG8gbW92ZSBiYWNrIHRvIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0ZpcnN0QXR0cmlidXRlKCkgIT0gMToKICAgIHByaW50KCJGYWlsZWQgdG8gbW92ZSB0byBmaXJzdCBhdHRyaWJ1dGUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnMiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgwKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMToKICAgIHByaW50KCJGYWlsZWQgdG8gbW92ZSB0byBuZXh0IGF0dHJpYnV0ZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczphIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIHRvIG1vdmUgdG8gbmV4dCBhdHRyaWJ1dGUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMikgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIHRvIG1vdmUgdG8gbmV4dCBhdHRyaWJ1dGUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImE6YiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAwOgogICAgcHJpbnQoIkZhaWxlZCB0byBkZXRlY3QgbGFzdCBhdHRyaWJ1dGUiKQogICAgc3lzLmV4aXQoMSkKCiAgICAKIwojIGEgY291cGxlIG9mIHRlc3RzIGZvciBuYW1lc3BhY2Ugbm9kZXMKIwpmID0gc3RyX2lvKCIiIjxhIHhtbG5zPSJodHRwOi8vZXhhbXBsZS5jb20vZm9vIi8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDYiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3Q2OiBmYWlsZWQgdG8gUmVhZCgpIikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5Nb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3Q2OiBmYWlsZWQgdG8gTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZXNwYWNlVXJpKCkgIT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiBvciBcCiAgIHJlYWRlci5Mb2NhbE5hbWUoKSAhPSAieG1sbnMiIG9yIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zIiBvciBcCiAgIHJlYWRlci5WYWx1ZSgpICE9ICJodHRwOi8vZXhhbXBsZS5jb20vZm9vIiBvciByZWFkZXIuTm9kZVR5cGUoKSAhPSAyOgogICAgcHJpbnQoInRlc3Q2OiBmYWlsZWQgdG8gcmVhZCB0aGUgbmFtZXNwYWNlIG5vZGUiKQogICAgc3lzLmV4aXQoMSkKCmYgPSBzdHJfaW8oIiIiPGEgeG1sbnM6cHJlZml4PSJodHRwOi8vZXhhbXBsZS5jb20vZm9vIi8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDciKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3Q3OiBmYWlsZWQgdG8gUmVhZCgpIikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5Nb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3Q3OiBmYWlsZWQgdG8gTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZXNwYWNlVXJpKCkgIT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiBvciBcCiAgIHJlYWRlci5Mb2NhbE5hbWUoKSAhPSAicHJlZml4IiBvciByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczpwcmVmaXgiIG9yIFwKICAgcmVhZGVyLlZhbHVlKCkgIT0gImh0dHA6Ly9leGFtcGxlLmNvbS9mb28iIG9yIHJlYWRlci5Ob2RlVHlwZSgpICE9IDI6CiAgICBwcmludCgidGVzdDc6IGZhaWxlZCB0byByZWFkIHRoZSBuYW1lc3BhY2Ugbm9kZSIpCiAgICBzeXMuZXhpdCgxKQoKIwojIFRlc3QgZm9yIGEgbGltaXQgY2FzZToKIwpmID0gc3RyX2lvKCIiIjxhLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0OCIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDg6IGZhaWxlZCB0byByZWFkIHRoZSBub2RlIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImEiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDE6CiAgICBwcmludCgidGVzdDg6IGZhaWxlZCB0byBhbmFseXplIHRoZSBub2RlIikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDA6CiAgICBwcmludCgidGVzdDg6IGZhaWxlZCB0byBkZXRlY3QgdGhlIEVPRiIpCiAgICBzeXMuZXhpdCgxKQoKIwojIEFub3RoZXIgdGVzdCBwcm92aWRlZCBieSBTdOlwaGFuZSBCaWRvdWwgYW5kIGNoZWNrZWQgd2l0aCBDIwojCmRlZiB0c3RfcmVhZGVyKHMpOgogICAgZiA9IHN0cl9pbyhzKQogICAgaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCiAgICByZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0c3QiKQogICAgcmVzID0gIiIKICAgIHdoaWxlIHJlYWRlci5SZWFkKCk6CiAgICAgICAgcmVzPXJlcyArICIlcyAoJXMpIFslc10gJWQgJWRcbiIgJSAocmVhZGVyLk5vZGVUeXBlKCkscmVhZGVyLk5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuVmFsdWUoKSwgcmVhZGVyLklzRW1wdHlFbGVtZW50KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLkRlcHRoKCkpCiAgICAgICAgaWYgcmVhZGVyLk5vZGVUeXBlKCkgPT0gMTogIyBFbGVtZW50CiAgICAgICAgICAgIHdoaWxlIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCk6CiAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAiLS0gJXMgKCVzKSBbJXNdICVkICVkXG4iICUgKHJlYWRlci5Ob2RlVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuTmFtZSgpLHJlYWRlci5WYWx1ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSwgcmVhZGVyLkRlcHRoKCkpCiAgICByZXR1cm4gcmVzCiAgICAKZG9jPSIiIjxhPjxiIGIxPSJiMSIvPjxjPmNvbnRlbnQgb2YgYzwvYz48L2E+IiIiCmV4cGVjdD0iIiIxIChhKSBbTm9uZV0gMCAwCjEgKGIpIFtOb25lXSAxIDEKLS0gMiAoYjEpIFtiMV0gMCAyCjEgKGMpIFtOb25lXSAwIDEKMyAoI3RleHQpIFtjb250ZW50IG9mIGNdIDAgMgoxNSAoYykgW05vbmVdIDAgMQoxNSAoYSkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDUgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3Q+PGIvPjxjLz48L3Rlc3Q+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMCAwCjEgKGIpIFtOb25lXSAxIDEKMSAoYykgW05vbmVdIDEgMQoxNSAodGVzdCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDkgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPGE+PGI+YmJiPC9iPjxjPmNjYzwvYz48L2E+IiIiCmV4cGVjdD0iIiIxIChhKSBbTm9uZV0gMCAwCjEgKGIpIFtOb25lXSAwIDEKMyAoI3RleHQpIFtiYmJdIDAgMgoxNSAoYikgW05vbmVdIDAgMQoxIChjKSBbTm9uZV0gMCAxCjMgKCN0ZXh0KSBbY2NjXSAwIDIKMTUgKGMpIFtOb25lXSAwIDEKMTUgKGEpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3QxMCBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8dGVzdCBhPSJhIi8+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMSAwCi0tIDIgKGEpIFthXSAwIDEKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3QxMSBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8dGVzdD48YT5hYWE8L2E+PGIvPjwvdGVzdD4iIiIKZXhwZWN0PSIiIjEgKHRlc3QpIFtOb25lXSAwIDAKMSAoYSkgW05vbmVdIDAgMQozICgjdGV4dCkgW2FhYV0gMCAyCjE1IChhKSBbTm9uZV0gMCAxCjEgKGIpIFtOb25lXSAxIDEKMTUgKHRlc3QpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3QxMiBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8dGVzdD48cD48L3A+PC90ZXN0PiIiIgpleHBlY3Q9IiIiMSAodGVzdCkgW05vbmVdIDAgMAoxIChwKSBbTm9uZV0gMCAxCjE1IChwKSBbTm9uZV0gMCAxCjE1ICh0ZXN0KSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0MTMgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHA+PC9wPiIiIgpleHBlY3Q9IiIiMSAocCkgW05vbmVdIDAgMAoxNSAocCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDE0IGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKIwojIHRlc3QgZnJvbSBidWcgIzEwODgwMSAKIwpkb2M9IiIiPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIiBbCl0+Cgo8YXJ0aWNsZT4KeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKPC9hcnRpY2xlPgoiIiIKZXhwZWN0PSIiIjEwIChhcnRpY2xlKSBbTm9uZV0gMCAwCjEgKGFydGljbGUpIFtOb25lXSAwIDAKMyAoI3RleHQpIFsKeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKXSAwIDEKMTUgKGFydGljbGUpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3QxNSBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCiMKIyBjbGVhbnVwIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBjb3VudGluZwojCmRlbCBmCmRlbCBpbnB1dApkZWwgcmVhZGVyCgojIE1lbW9yeSBkZWJ1ZyBzcGVjaWZpYwpsaWJ4bWwyLmNsZWFudXBQYXJzZXIoKQppZiBsaWJ4bWwyLmRlYnVnTWVtb3J5KDEpID09IDA6CiAgICBwcmludCgiT0siKQplbHNlOgogICAgcHJpbnQoIk1lbW9yeSBsZWFrICVkIGJ5dGVzIiAlIChsaWJ4bWwyLmRlYnVnTWVtb3J5KDEpKSkK