IyEgL2Jpbi9zaAouICIke3NyY2Rpcj0ufS9pbml0LnNoIjsgcGF0aF9wcmVwZW5kXyAuIC4uL3NyYwoKIyBUZXN0IG9mIGdldHRleHQgZmFjaWxpdGllcyBpbiB0aGUgVmFsYSBsYW5ndWFnZS4KIyBBc3N1bWVzIGFuIGZyX0ZSIGxvY2FsZSBpcyBpbnN0YWxsZWQuCiMgQXNzdW1lcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQ6IHZhbGEuCgojIFRlc3QgZm9yIHByZXNlbmNlIG9mIHZhbGFjLgoodmFsYWMgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsCnRlc3QgJD8gLWxlIDEgXAogIHx8IHsgZWNobyAiU2tpcHBpbmcgdGVzdDogdmFsYWMgbm90IGZvdW5kIjsgRXhpdCA3NzsgfQoKIyBUZXN0IHdoZXRoZXIgdmFsYWMgY2FuIGNvbXBpbGUgYSB0cml2aWFsIHByb2dyYW0uCmNhdCA8PFxFT0YgPiBwcm9nLnZhbGEKaW50IG1haW4gKHN0cmluZ1tdIGFyZ3MpIHsKICAgIHJldHVybiAwOwp9CkVPRgo6ICR7VkFMQUM9dmFsYWN9CiR7VkFMQUN9IHByb2cudmFsYSAyPnByb2cuZXJyIFwKICB8fCB7IGlmIGdyZXAgImZhdGFsIGVycm9yOiAnZ2xpYlwuaCcgZmlsZSBub3QgZm91bmQiIDwgcHJvZy5lcnIgPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgZWNobyAiU2tpcHBpbmcgdGVzdDogdmFsYWMgaW5zdGFsbGF0aW9uIGluY29tcGxldGUiCiAgICAgICAgIEV4aXQgNzcKICAgICAgIGVsc2UKICAgICAgICAgY2F0IHByb2cuZXJyIDE+JjIKICAgICAgICAgZWNobyAiU2tpcHBpbmcgdGVzdDogdmFsYWMgaW5zdGFsbGF0aW9uIGRvZXMgbm90IHdvcmsiCiAgICAgICAgIEV4aXQgNzcKICAgICAgIGZpCiAgICAgfQoKY2F0IDw8XEVPRiA+IHByb2cudmFsYQppbnQgbWFpbiAoc3RyaW5nW10gYXJncykgewogICAgSW50bC5zZXRsb2NhbGUgKExvY2FsZUNhdGVnb3J5LkFMTCwgIiIpOwogICAgSW50bC50ZXh0ZG9tYWluICgicHJvZyIpOwogICAgSW50bC5iaW5kdGV4dGRvbWFpbiAoInByb2ciLCAiLiIpOwogICAgc3Rkb3V0LnByaW50ZiAoIiVzXG4iLCBfKCInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iKSk7CiAgICBzdGRvdXQucHJpbnRmICgiJXNcbiIsIF8oIiVzIGlzIHJlcGxhY2VkIGJ5ICVzLiIpLnByaW50ZiAoIkZGIiwgIkVVUiIpKTsKICAgIHJldHVybiAwOwp9CkVPRgoKOiAke1ZBTEFDPXZhbGFjfQoke1ZBTEFDfSAtLVhjYz0tREdFVFRFWFRfUEFDS0FHRT1cInByb2dcIiBwcm9nLnZhbGEgMj5wcm9nLmVyciBcCiAgfHwgeyBjYXQgcHJvZy5lcnIgMT4mMjsgRXhpdCAxOyB9Cgo6ICR7WEdFVFRFWFQ9eGdldHRleHR9CiR7WEdFVFRFWFR9IC1vIHByb2cudG1wIC0tb21pdC1oZWFkZXIgLS1uby1sb2NhdGlvbiBwcm9nLnZhbGEgfHwgRXhpdCAxCkxDX0FMTD1DIHRyIC1kICdccicgPCBwcm9nLnRtcCA+IHByb2cucG90IHx8IEV4aXQgMQoKY2F0IDw8RU9GID4gcHJvZy5vawptc2dpZCAiJ1lvdXIgY29tbWFuZCwgcGxlYXNlPycsIGFza2VkIHRoZSB3YWl0ZXIuIgptc2dzdHIgIiIKCiMsIGMtZm9ybWF0Cm1zZ2lkICIlcyBpcyByZXBsYWNlZCBieSAlcy4iCm1zZ3N0ciAiIgpFT0YKCjogJHtESUZGPWRpZmZ9CiR7RElGRn0gcHJvZy5vayBwcm9nLnBvdCB8fCBFeGl0IDEKCmNhdCA8PFxFT0YgPiBmci5wbwptc2dpZCAiIgptc2dzdHIgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXG4iCgptc2dpZCAiJ1lvdXIgY29tbWFuZCwgcGxlYXNlPycsIGFza2VkIHRoZSB3YWl0ZXIuIgptc2dzdHIgIqtWb3RyZSBjb21tYW5kZSwgcydpbCB2b3VzIHBsYWl0uywgZGl0IGxlIGdhcudvbi4iCgojIFJldmVyc2UgdGhlIGFyZ3VtZW50cy4KIywgYy1mb3JtYXQKbXNnaWQgIiVzIGlzIHJlcGxhY2VkIGJ5ICVzLiIKbXNnc3RyICIlMiRzIHJlbXBsYWNlICUxJHMuIgpFT0YKCjogJHtNU0dNRVJHRT1tc2dtZXJnZX0KJHtNU0dNRVJHRX0gLXEgLW8gZnIucG8udG1wIGZyLnBvIHByb2cucG90IHx8IEV4aXQgMQpMQ19BTEw9QyB0ciAtZCAnXHInIDwgZnIucG8udG1wID4gZnIucG8ubmV3IHx8IEV4aXQgMQoKOiAke0RJRkY9ZGlmZn0KJHtESUZGfSBmci5wbyBmci5wby5uZXcgfHwgRXhpdCAxCgp0ZXN0IC1kIGZyIHx8IG1rZGlyIGZyCnRlc3QgLWQgZnIvTENfTUVTU0FHRVMgfHwgbWtkaXIgZnIvTENfTUVTU0FHRVMKCjogJHtNU0dGTVQ9bXNnZm10fQoke01TR0ZNVH0gLW8gZnIvTENfTUVTU0FHRVMvcHJvZy5tbyBmci5wbwoKOiAke0RJRkY9ZGlmZn0KY2F0IDw8XEVPRiA+IHByb2cub2sKq1ZvdHJlIGNvbW1hbmRlLCBzJ2lsIHZvdXMgcGxhaXS7LCBkaXQgbGUgZ2Fy529uLgpFVVIgcmVtcGxhY2UgRkYuCkVPRgpjYXQgPDxcRU9GID4gcHJvZy5va3UKwqtWb3RyZSBjb21tYW5kZSwgcydpbCB2b3VzIHBsYWl0wrssIGRpdCBsZSBnYXLDp29uLgpFVVIgcmVtcGxhY2UgRkYuCkVPRgoKOiAke0xPQ0FMRV9GUj1mcl9GUn0KOiAke0xPQ0FMRV9GUl9VVEY4PWZyX0ZSLlVURi04fQppZiB0ZXN0ICRMT0NBTEVfRlIgIT0gbm9uZTsgdGhlbgogIHByZXBhcmVfbG9jYWxlXyBmciAkTE9DQUxFX0ZSCiAgTEFOR1VBR0U9IExDX0FMTD0kTE9DQUxFX0ZSIC4vcHJvZyA+IHByb2cub3V0CiAgY2FzZSAkPyBpbgogICAgMCkgJHtESUZGfSBwcm9nLm9rIHByb2cub3V0IHx8IEV4aXQgMTs7CiAgICA3NykgTE9DQUxFX0ZSPW5vbmU7OwogICAgKikgRXhpdCAxOzsKICBlc2FjCmZpCmlmIHRlc3QgJExPQ0FMRV9GUl9VVEY4ICE9IG5vbmU7IHRoZW4KICBwcmVwYXJlX2xvY2FsZV8gZnIgJExPQ0FMRV9GUl9VVEY4CiAgTEFOR1VBR0U9IExDX0FMTD0kTE9DQUxFX0ZSX1VURjggLi9wcm9nID4gcHJvZy5vdXQKICBjYXNlICQ/IGluCiAgICAwKSAke0RJRkZ9IHByb2cub2t1IHByb2cub3V0IHx8IEV4aXQgMTs7CiAgICA3NykgTE9DQUxFX0ZSX1VURjg9bm9uZTs7CiAgICAqKSBFeGl0IDE7OwogIGVzYWMKZmkKaWYgdGVzdCAkTE9DQUxFX0ZSID0gbm9uZSAmJiB0ZXN0ICRMT0NBTEVfRlJfVVRGOCA9IG5vbmU7IHRoZW4KICBpZiB0ZXN0IC1mIC91c3IvYmluL2xvY2FsZWRlZjsgdGhlbgogICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gZnJlbmNoIGxvY2FsZSBpcyBpbnN0YWxsZWQiCiAgZWxzZQogICAgZWNobyAiU2tpcHBpbmcgdGVzdDogbm8gZnJlbmNoIGxvY2FsZSBpcyBzdXBwb3J0ZWQiCiAgZmkKICBFeGl0IDc3CmZpCgpFeGl0IDAK