aW1wb3J0IG9zCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB0aW1lCgojIFVSTCB1bnR1ayBtZW5n dW5kdWggdmVub20ucHkKcGF5bG9hZF91cmwgPSAnaHR0cHM6Ly9naXQud2FyY2V1cHJvamVjdC5v cmcvc3luL3dTcGxvaXRIdWIvcmF3L2JyYW5jaC9tYWluL3BheWxvYWQvbXNmL3B5dGhvbi92ZW5v bS5weScKCiMgRGlyZWt0b3JpIHR1anVhbiB1bnR1ayBtZW55aW1wYW4gcGF5bG9hZApwYXlsb2Fk X3BhdGggPSAnL3RtcC9zeXMnCgojIEZ1bmdzaSB1bnR1ayBtZW5qYWxhbmthbiBwZXJpbnRhaCBk YW4gbWVtZXJpa3NhIGV4aXQgY29kZQpkZWYgcnVuX2NvbW1hbmQoKToKICAgICMgUGVyaWtzYSBh cGFrYWggZmlsZSB2ZW5vbS5weSBhZGEgZGkgbG9rYXNpIHR1anVhbgogICAgaWYgbm90IG9zLnBh dGguZXhpc3RzKHBheWxvYWRfcGF0aCk6CiAgICAgICAgcHJpbnQoIlsqXSBQYXlsb2FkIHRpZGFr IGRpdGVtdWthbi4gTWVuZ3VuZHVoLi4uIikKICAgICAgICBkb3dubG9hZF9wYXlsb2FkKCkKICAg ICAgICBvcy5jaG1vZChwYXlsb2FkX3BhdGgsIDBvNzU1KSAgIyBCZXJpIGl6aW4gZWtzZWt1c2kK CiAgICAjIFBlcmludGFoIHVudHVrIG1lbmphbGFua2FuIHZlbm9tLnB5CiAgICBjb21tYW5kID0g ZidweXRob24zIHtwYXlsb2FkX3BhdGh9JwogICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4o Y29tbWFuZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnBy b2Nlc3MuUElQRSkKICAgIG91dHB1dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCiAg ICBleGl0X2NvZGUgPSBwcm9jZXNzLnJldHVybmNvZGUKCiAgICBwcmludChmIkNvbW1hbmQgZXhl Y3V0ZWQ6IHtjb21tYW5kfSIpCiAgICBwcmludChmIkV4aXQgY29kZToge2V4aXRfY29kZX0iKQoK ICAgICMgSmlrYSBleGl0IGNvZGUgbm9uLXplcm8sIGNlayBhcGFrYWggc2Vzc2lvbiBha3RpZgog ICAgaWYgZXhpdF9jb2RlICE9IDA6CiAgICAgICAgcHJpbnQoIlsqXSBFeGl0IGNvZGUgbm9uLXpl cm8gZGV0ZWN0ZWQuIENoZWNraW5nIGFjdGl2ZSBzZXNzaW9uLi4uIikKICAgICAgICBpc19zaGVs bF9hY3RpdmUgPSBGYWxzZQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBQZXJpa3NhIGFwYWth aCB2ZW5vbS5weSBzdWRhaCBiZXJqYWxhbgogICAgICAgICAgICBzaGVsbF9vdXRwdXQgPSBzdWJw cm9jZXNzLmNoZWNrX291dHB1dCgKICAgICAgICAgICAgICAgIGYicHMgYXV4IHwgZ3JlcCAncHl0 aG9uMyB7cGF5bG9hZF9wYXRofScgfCBncmVwIC12IGdyZXAiLCBzaGVsbD1UcnVlCiAgICAgICAg ICAgICkKICAgICAgICAgICAgaWYgc2hlbGxfb3V0cHV0OgogICAgICAgICAgICAgICAgcHJpbnQo IlsqXSBBY3RpdmUgc2Vzc2lvbiBkZXRlY3RlZC4gU2tpcHBpbmcgcGF5bG9hZCBleGVjdXRpb24u IikKICAgICAgICAgICAgICAgIGlzX3NoZWxsX2FjdGl2ZSA9IFRydWUKICAgICAgICBleGNlcHQg c3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3I6CiAgICAgICAgICAgICMgSmlrYSBwcm9zZXMg dGlkYWsgZGl0ZW11a2FuCiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBKaWthIHRpZGFrIGFk YSBzZXNzaW9uIGFrdGlmLCBqYWxhbmthbiBwYXlsb2FkCiAgICAgICAgaWYgbm90IGlzX3NoZWxs X2FjdGl2ZToKICAgICAgICAgICAgcHJpbnQoIlsqXSBObyBhY3RpdmUgc2Vzc2lvbiBkZXRlY3Rl ZC4gU3Bhd25pbmcgcGF5bG9hZC4uLiIpCiAgICAgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4oZiJu b2h1cCBweXRob24zIHtwYXlsb2FkX3BhdGh9ID4gL2Rldi9udWxsIDI+JjEgJiIsIHNoZWxsPVRy dWUpCiAgICBlbHNlOgogICAgICAgIHByaW50KCJbKl0gRXhpdCBjb2RlIHplcm8uIE5vIHBheWxv YWQgZXhlY3V0ZWQuIikKCiMgRnVuZ3NpIHVudHVrIG1lbmd1bmR1aCB2ZW5vbS5weSBqaWthIHRp ZGFrIGRpdGVtdWthbgpkZWYgZG93bmxvYWRfcGF5bG9hZCgpOgogICAgIyBDZWsga2V0ZXJzZWRp YWFuIHdnZXQKICAgIHdnZXRfYXZhaWxhYmxlID0gc3VicHJvY2Vzcy5ydW4oJ3doaWNoIHdnZXQn LCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5Q SVBFKQogICAgIyBDZWsga2V0ZXJzZWRpYWFuIGN1cmwKICAgIGN1cmxfYXZhaWxhYmxlID0gc3Vi cHJvY2Vzcy5ydW4oJ3doaWNoIGN1cmwnLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5Q SVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQoKICAgIGlmIHdnZXRfYXZhaWxhYmxlLnN0ZG91 dC5zdHJpcCgpOgogICAgICAgIHByaW50KCJbKl0gd2dldCB0ZXJzZWRpYS4gTWVuZ3VuZHVoIHZl bm9tLnB5Li4uIikKICAgICAgICBvcy5zeXN0ZW0oZiJ3Z2V0IHtwYXlsb2FkX3VybH0gLU8ge3Bh eWxvYWRfcGF0aH0iKQogICAgZWxpZiBjdXJsX2F2YWlsYWJsZS5zdGRvdXQuc3RyaXAoKToKICAg ICAgICBwcmludCgiWypdIGN1cmwgdGVyc2VkaWEuIE1lbmd1bmR1aCB2ZW5vbS5weS4uLiIpCiAg ICAgICAgb3Muc3lzdGVtKGYiY3VybCAtbyB7cGF5bG9hZF9wYXRofSB7cGF5bG9hZF91cmx9IikK ICAgIGVsc2U6CiAgICAgICAgcHJpbnQoIlshXSBUaWRhayBhZGEgd2dldCBhdGF1IGN1cmwgdGVy c2VkaWEuIFBhc3Rpa2FuIHNhbGFoIHNhdHUgdGVycGFzYW5nLiIpCgojIEZ1bmdzaSB1bnR1ayBt ZW1hc3Rpa2FuIHNrcmlwIGJlcmphbGFuIHRlcnVzIG1lbmVydXMKZGVmIHJ1bl9wZXJzaXN0ZW50 bHkoKToKICAgIHdoaWxlIFRydWU6CiAgICAgICAgcnVuX2NvbW1hbmQoKSAgIyBKYWxhbmthbiBw ZXJpbnRhaAogICAgICAgIHRpbWUuc2xlZXAoMykgICMgVHVuZ2d1IHNlbGFtYSAzIGRldGlrIHNl YmVsdW0gbWVuY29iYSBsYWdpCgojIE1lbWJ1YXQgZGlyZWt0b3JpIHR1anVhbiBqaWthIGJlbHVt IGFkYQppZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5kaXJuYW1lKHBheWxvYWRfcGF0aCkp OgogICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHBheWxvYWRfcGF0aCkpCgojIEphbGFu a2FuIGZ1bmdzaSB1dGFtYQpydW5fcGVyc2lzdGVudGx5KCkK