Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gIHlpZml2ZSBXaXNoYm9uZSBpbnRlcmZhY2UgZm9yIEluc3RydWN0aW9uIG1lbW9yeSAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgeWlmaXZlIGNvcmVzIHByb2plY3QgICAgICAgICAgICAgICAvLy8vCi8vLy8gIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9jb3Jlcy95aWZpdmUvICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgIGludGVncmF0ZWQgd2lzaGJvbmUgaS9mIHRvIGluc3RydWN0aW9uIG1lbW9yeSAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBUbyBEbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBBdXRob3Iocyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAtIERpbmVzaCBBbm5heXlhLCBkaW5lc2hhQG9wZW5jb3Jlcy5vcmcgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICBSZXZpc2lvbiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgIHYwOiAgICBKdW5lIDcsIDIwMjEsIERpbmVzaCBBICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICB3aXNoYm9uZSBpbnRlZ3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICB2MTogICAgSnVuZSA5LCAyMDIxLCBEaW5lc2ggQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgIE9uIHBvd2VyIHVwLCB3aXNoYm9uZSBvdXRwdXQgYXJlIHVua293biBhcyBpdCAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgZHJpdmVuIGZyb20gZmlmbyBvdXRwdXQuIFRvIGF2b2lkIHVua25vd24gICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICBwcm9wZ2F0aW9uLCB3ZSBhcmUgZHJpdmluZyAnaDAgd2hlbiBmaWZvIGVtcHR5ICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gQ29weXJpZ2h0IChDKSAyMDAwIEF1dGhvcnMgYW5kIE9QRU5DT1JFUy5PUkcgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vIFRoaXMgc291cmNlIGZpbGUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHdpdGhvdXQgICAgICAgICAvLy8vCi8vLy8gcmVzdHJpY3Rpb24gcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBzdGF0ZW1lbnQgaXMgbm90ICAgIC8vLy8KLy8vLyByZW1vdmVkIGZyb20gdGhlIGZpbGUgYW5kIHRoYXQgYW55IGRlcml2YXRpdmUgd29yayBjb250YWlucyAgLy8vLwovLy8vIHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGUgYXNzb2NpYXRlZCBkaXNjbGFpbWVyLiAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0ICAgLy8vLwovLy8vIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgICAvLy8vCi8vLy8gUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IC8vLy8KLy8vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55ICAgLy8vLwovLy8vIGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgICAgICAgLy8vLwovLy8vIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgICAvLy8vCi8vLy8gd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAgICAgIC8vLy8KLy8vLyBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgLy8vLwovLy8vIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgICAgLy8vLwovLy8vIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBzb3VyY2U7IGlmIG5vdCwgZG93bmxvYWQgaXQgICAvLy8vCi8vLy8gZnJvbSBodHRwOi8vd3d3Lm9wZW5jb3Jlcy5vcmcvbGdwbC5zaHRtbCAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICAgICBPcmdpbmFsIG93bmVyIERldGFpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gQ29weXJpZ2h0IGJ5IFN5bnRhY29yZSBMTEMgqSAyMDE2LTIwMjEuIFNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLy8vCi8vLyBAZmlsZSAgICAgICA8c2NyMV9pbWVtX3diLnN2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8KLy8vIEBicmllZiAgICAgIEluc3RydWN0aW9uIG1lbW9yeSBBSEIgYnJpZGdlICAgICAgICAgICAgICAgICAgICAgIC8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpgaW5jbHVkZSAic2NyMV93Yi5zdmgiCmBpbmNsdWRlICJzY3IxX21lbWlmLnN2aCIKCm1vZHVsZSBzY3IxX2ltZW1fd2IgKAogICAgLy8gQ29udHJvbCBTaWduYWxzCiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgcnN0X24sCiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xrLAoKICAgIC8vIENvcmUgSW50ZXJmYWNlCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1lbV9yZXFfYWNrLAogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZW1fcmVxLAogICAgaW5wdXQgICBsb2dpYyAgIFtTQ1IxX1dCX1dJRFRILTE6MF0gICAgIGltZW1fYWRkciwKICAgIG91dHB1dCAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgICBpbWVtX3JkYXRhLAogICAgb3V0cHV0ICBsb2dpYyBbMTowXSAgICAgICAgICAgICAgICAgICAgIGltZW1fcmVzcCwKCiAgICAvLyBXQiBJbnRlcmZhY2UKICAgIG91dHB1dCAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICB3YmRfc3RiX28sIC8vIHN0cm9iZS9yZXF1ZXN0CiAgICBvdXRwdXQgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICAgd2JkX2Fkcl9vLCAvLyBhZGRyZXNzCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JkX3dlX28sICAvLyB3cml0ZQogICAgb3V0cHV0ICBsb2dpYyAgIFtTQ1IxX1dCX1dJRFRILTE6MF0gICAgIHdiZF9kYXRfbywgLy8gZGF0YSBvdXRwdXQKICAgIG91dHB1dCAgbG9naWMgICBbMzowXSAgICAgICAgICAgICAgICAgICB3YmRfc2VsX28sIC8vIGJ5dGUgZW5hYmxlCiAgICBpbnB1dCAgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICAgd2JkX2RhdF9pLCAvLyBkYXRhIGlucHV0CiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JkX2Fja19pLCAvLyBhY2tub3dsZWdlbWVudAogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiZF9lcnJfaSAgLy8gZXJyb3IKCik7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTG9jYWwgcGFyYW1ldGVycyBkZWNsYXJhdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGlmbmRlZiBTQ1IxX0lNRU1fV0JfT1VUX0JQCmxvY2FscGFyYW0gIFNDUjFfRklGT19XSURUSCA9IDI7CmxvY2FscGFyYW0gIFNDUjFfRklGT19DTlRfV0lEVEggPSAkY2xvZzIoU0NSMV9GSUZPX1dJRFRIKzEpOwpgZW5kaWYgLy8gU0NSMV9JTUVNX1dCX09VVF9CUAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExvY2FsIHR5cGVzIGRlY2xhcmF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0eXBlZGVmIGVudW0gbG9naWMgewogICAgU0NSMV9GU01fQUREUiA9IDEnYjAsCiAgICBTQ1IxX0ZTTV9EQVRBID0gMSdiMSwKICAgIFNDUjFfRlNNX0VSUiAgPSAxJ2J4Cn0gdHlwZV9zY3IxX2ZzbV9lOwoKdHlwZWRlZiBzdHJ1Y3QgcGFja2VkIHsKICAgIGxvZ2ljICAgW1NDUjFfV0JfV0lEVEgtMTowXSAgICBoYWRkcjsKfSB0eXBlX3NjcjFfcmVxX2ZpZm9fczsKCnR5cGVkZWYgc3RydWN0IHBhY2tlZCB7CiAgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXNwOwogICAgbG9naWMgICBbU0NSMV9XQl9XSURUSC0xOjBdICAgIGhyZGF0YTsKfSB0eXBlX3NjcjFfcmVzcF9maWZvX3M7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTG9jYWwgc2lnbmFsIGRlY2xhcmF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0eXBlX3NjcjFfZnNtX2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb19yZDsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb193cjsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb191cDsKYGlmZGVmIFNDUjFfSU1FTV9XQl9PVVRfQlAKdHlwZV9zY3IxX3JlcV9maWZvX3MgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb19yOwp0eXBlX3NjcjFfcmVxX2ZpZm9fcyBbMDowXSAgICAgICAgICAgICAgICAgIHJlcV9maWZvOwpgZWxzZSAvLyBTQ1IxX0lNRU1fV0JfT1VUX0JQCmxvZ2ljIFtTQ1IxX1dCX1dJRFRILTE6MF0gICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fZG91dDsKYGVuZGlmIC8vIFNDUjFfSU1FTV9XQl9PVVRfQlAKCmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fZW1wdHk7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fZnVsbDsKCnR5cGVfc2NyMV9yZXNwX2ZpZm9fcyAgICAgICAgICAgICAgICAgICAgICAgcmVzcF9maWZvOwpsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfZmlmb19ocmVhZHk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSW50ZXJmYWNlIHRvIENvcmUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmFzc2lnbiBpbWVtX3JlcV9hY2sgPSB+cmVxX2ZpZm9fZnVsbDsKYXNzaWduIHJlcV9maWZvX3dyICA9IH5yZXFfZmlmb19mdWxsICYgaW1lbV9yZXE7Cgphc3NpZ24gaW1lbV9yZGF0YSA9IHJlc3BfZmlmby5ocmRhdGE7Cgphc3NpZ24gaW1lbV9yZXNwID0gKHJlc3BfZmlmb19ocmVhZHkpCiAgICAgICAgICAgICAgICAgICAgPyAocmVzcF9maWZvLmhyZXNwID09IDEnYjEpCiAgICAgICAgICAgICAgICAgICAgICAgID8gU0NSMV9NRU1fUkVTUF9SRFlfT0sKICAgICAgICAgICAgICAgICAgICAgICAgOiBTQ1IxX01FTV9SRVNQX1JEWV9FUgogICAgICAgICAgICAgICAgICAgIDogU0NSMV9NRU1fUkVTUF9OT1RSRFk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUkVRX0ZJRk8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBpZmRlZiBTQ1IxX0lNRU1fV0JfT1VUX0JQCmFsd2F5c19mZiBAKG5lZ2VkZ2UgcnN0X24sIHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKH5yc3RfbikgYmVnaW4KICAgICAgICByZXFfZmlmb19mdWxsIDw9IDEnYjA7CiAgICBlbmQgZWxzZSBiZWdpbgogICAgICAgIGlmICh+cmVxX2ZpZm9fZnVsbCkgYmVnaW4KICAgICAgICAgICAgcmVxX2ZpZm9fZnVsbCA8PSBpbWVtX3JlcSAmIH5yZXFfZmlmb19yZDsKICAgICAgICBlbmQgZWxzZSBiZWdpbgogICAgICAgICAgICByZXFfZmlmb19mdWxsIDw9IH5yZXFfZmlmb19yZDsKICAgICAgICBlbmQKICAgIGVuZAplbmQKYXNzaWduIHJlcV9maWZvX2VtcHR5ID0gfihyZXFfZmlmb19mdWxsIHwgaW1lbV9yZXEpOwoKYXNzaWduIHJlcV9maWZvX3VwICAgID0gfnJlcV9maWZvX3JkICYgcmVxX2ZpZm9fd3I7CmFsd2F5c19mZiBAKHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKHJlcV9maWZvX3VwKSBiZWdpbgogICAgICAgIHJlcV9maWZvX3IuaGFkZHIgPD0gaW1lbV9hZGRyOwogICAgZW5kCmVuZAoKYXNzaWduIHJlcV9maWZvWzBdID0gKHJlcV9maWZvX2Z1bGwpID8gcmVxX2ZpZm9fciA6IGltZW1fYWRkcjsKCmBlbHNlIC8vIFNDUjFfSU1FTV9XQl9PVVRfQlAKCgogc3luY19maWZvICMoCiAgICAgIC5XKFNDUjFfV0JfV0lEVEgpLCAvLyBEYXRhIFdpZHRoCiAgICAgIC5EKDIpICAgIC8vIEZJRk8gREVQVEgKICAgICApICAgdV9yZXFfZmlmbygKCiAgICAgICAucmRfZGF0YSAgICAocmVxX2ZpZm9fZG91dCAgKSwKCiAgICAgICAucmVzZXRfbiAgIChyc3RfbiAgICAgICAgICApLAogICAgICAgLmNsayAgICAgICAoY2xrICAgICAgICAgICAgKSwKICAgICAgIC53cl9lbiAgICAgKHJlcV9maWZvX3dyICAgICksIC8vIFdyaXRlCiAgICAgICAucmRfZW4gICAgIChyZXFfZmlmb19yZCAgICApLCAvLyBSZWFkCiAgICAgICAud3JfZGF0YSAgIChpbWVtX2FkZHIgICAgICApLAogICAgICAgLmZ1bGwgICAgICAocmVxX2ZpZm9fZnVsbCAgKSwKICAgICAgIC5lbXB0eSAgICAgKHJlcV9maWZvX2VtcHR5ICkKKTsKCgoKCmBlbmRpZiAvLyBTQ1IxX0lNRU1fV0JfT1VUX0JQCgoKYWx3YXlzX2NvbWIgYmVnaW4KICAgIHJlcV9maWZvX3JkID0gMSdiMDsKICAgIGlmICh3YmRfYWNrX2kpIGJlZ2luCiAgICAgICAgIHJlcV9maWZvX3JkID0gfnJlcV9maWZvX2VtcHR5OwogICAgZW5kCmVuZAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZJRk8gcmVzcG9uc2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBpZmRlZiBTQ1IxX0lNRU1fV0JfSU5fQlAKYXNzaWduIHJlc3BfZmlmb19ocmVhZHkgPSB3YmRfYWNrX2k7CmFzc2lnbiByZXNwX2ZpZm8uaHJlc3AgID0gKHdiZF9lcnJfaSkgPyAxJ2IwIDogMSdiMTsKYXNzaWduIHJlc3BfZmlmby5ocmRhdGEgPSB3YmRfZGF0X2k7CmFzc2lnbiB3YmRfc3RiX28gICAgICAgID0gfnJlcV9maWZvX2VtcHR5Owphc3NpZ24gd2JkX2Fkcl9vICAgICAgICA9IHJlcV9maWZvWzBdOwphc3NpZ24gd2JkX3dlX28gICAgICAgICA9IDA7IC8vIE9ubHkgUmVhZCBzdXBwb3J0ZWQKYXNzaWduIHdiZF9kYXRfbyAgICAgICAgPSAzMidoMDsgLy8gTm8gV3JpdGUKYXNzaWduIHdiZF9zZWxfbyAgICAgICAgPSA0J2IxMTExOyAvLyBPbmx5IFJlYWQgYWxsb3dlZCBpbiBpbWVtIGkvZgoKCmBlbHNlIC8vIFNDUjFfSU1FTV9XQl9JTl9CUAphbHdheXNfZmYgQChuZWdlZGdlIHJzdF9uLCBwb3NlZGdlIGNsaykgYmVnaW4KICAgIGlmICh+cnN0X24pIGJlZ2luCiAgICAgICAgcmVzcF9maWZvX2hyZWFkeSA8PSAxJ2IwOwogICAgZW5kIGVsc2UgYmVnaW4KICAgICAgICByZXNwX2ZpZm9faHJlYWR5IDw9IHdiZF9hY2tfaSA7CiAgICBlbmQKZW5kCgphbHdheXNfZmYgQChwb3NlZGdlIGNsaykgYmVnaW4KICAgIGlmICh3YmRfYWNrX2kpIGJlZ2luCiAgICAgICAgcmVzcF9maWZvLmhyZXNwICA8PSAod2JkX2Vycl9pKSA/IDEnYjAgOiAxJ2IxOwogICAgICAgIHJlc3BfZmlmby5ocmRhdGEgPD0gd2JkX2RhdF9pOwogICAgZW5kCmVuZAoKYXNzaWduIHdiZF9zdGJfbyAgICA9IH5yZXFfZmlmb19lbXB0eTsKLy8gT24gUG93ZXIsIHRvIGF2b2lkIHVua25vdyBwcm9wZ2F0aW5nIHRoZSB2YWx1ZQphc3NpZ24gd2JkX2Fkcl9vICAgID0gKHJlcV9maWZvX2VtcHR5KSA/ICdoMCA6IHJlcV9maWZvX2RvdXQ7IAphc3NpZ24gd2JkX3dlX28gICAgID0gMDsgLy8gT25seSBSZWFkIHN1cHBvcnRlZAphc3NpZ24gd2JkX2RhdF9vICAgID0gMzInaDA7IC8vIE5vIFdyaXRlCmFzc2lnbiB3YmRfc2VsX28gICAgPSA0J2IxMTExOyAvLyBPbmx5IFJlYWQgYWxsb3dlZCBpbiBpbWVtIGkvZgpgZW5kaWYgLy8gU0NSMV9JTUVNX1dCX0lOX0JQCgoKCmBpZmRlZiBTQ1IxX1RSR1RfU0lNVUxBVElPTgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQXNzZXJ0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gQ2hlY2sgQ29yZSBpbnRlcmZhY2UKU0NSMV9TVkFfSU1FTV9XQl9CUklER0VfUkVRX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgISRpc3Vua25vd24oaW1lbV9yZXEpCiAgICApIGVsc2UgJGVycm9yKCJJTUVNIFdCIGJyaWRnZSBFcnJvcjogaW1lbV9yZXEgaGFzIHVua25vd24gdmFsdWVzIik7CgpTQ1IxX0lNRU1fV0JfQlJJREdFX0FERFJfWENIRUNLIDogYXNzZXJ0IHByb3BlcnR5ICgKICAgIEAobmVnZWRnZSBjbGspIGRpc2FibGUgaWZmICh+cnN0X24pCiAgICBpbWVtX3JlcSB8LT4gISRpc3Vua25vd24oaW1lbV9hZGRyKQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBXQiBicmlkZ2UgRXJyb3I6IGltZW1fYWRkciBoYXMgdW5rbm93biB2YWx1ZXMiKTsKClNDUjFfSU1FTV9XQl9CUklER0VfQUREUl9BTExJR04gOiBhc3NlcnQgcHJvcGVydHkgKAogICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgIGltZW1fcmVxIHwtPiAoaW1lbV9hZGRyWzE6MF0gPT0gJzApCiAgICApIGVsc2UgJGVycm9yKCJJTUVNIFdCIGJyaWRnZSBFcnJvcjogaW1lbV9hZGRyIGhhcyB1bmFsaWduIHZhbHVlcyIpOwoKLy8gQ2hlY2sgV0IgaW50ZXJmYWNlClNDUjFfSU1FTV9XQl9CUklER0VfSFJFQURZX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgISRpc3Vua25vd24oaHJlYWR5KQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBXQiBicmlkZ2UgRXJyb3I6IGhyZWFkeSBoYXMgdW5rbm93biB2YWx1ZXMiKTsKClNDUjFfSU1FTV9XQl9CUklER0VfSFJFU1BfWENIRUNLIDogYXNzZXJ0IHByb3BlcnR5ICgKICAgIEAobmVnZWRnZSBjbGspIGRpc2FibGUgaWZmICh+cnN0X24pCiAgICAhJGlzdW5rbm93bihocmVzcCkKICAgICkgZWxzZSAkZXJyb3IoIklNRU0gV0IgYnJpZGdlIEVycm9yOiBocmVzcCBoYXMgdW5rbm93biB2YWx1ZXMiKTsKCmBlbmRpZiAvLyBTQ1IxX1RSR1RfU0lNVUxBVElPTgoKZW5kbW9kdWxlIDogc2NyMV9pbWVtX3diCg==