Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IFN5bnRhY29yZSBMTEMgqSAyMDE2LTIwMjEKLy8gCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAovLyBTUERYLUZpbGVDb250cmlidXRvcjogU3ludGFjb3JlIExMQwovLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gQGZpbGUgICAgICAgPHNjcjFfaW1lbV9haGIuc3Y+Ci8vLyBAYnJpZWYgICAgICBJbnN0cnVjdGlvbiBtZW1vcnkgQUhCIGJyaWRnZQovLy8KCmBpbmNsdWRlICJzY3IxX2FoYi5zdmgiCmBpbmNsdWRlICJzY3IxX21lbWlmLnN2aCIKCm1vZHVsZSBzY3IxX2ltZW1fYWhiICgKICAgIC8vIENvbnRyb2wgU2lnbmFscwogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzdF9uLAogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaywKCiAgICAvLyBDb3JlIEludGVyZmFjZQogICAgb3V0cHV0ICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZW1fcmVxX2FjaywKICAgIGlucHV0ICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWVtX3JlcSwKICAgIGlucHV0ICAgbG9naWMgICBbU0NSMV9BSEJfV0lEVEgtMTowXSAgICBpbWVtX2FkZHIsCiAgICBvdXRwdXQgIGxvZ2ljICAgW1NDUjFfQUhCX1dJRFRILTE6MF0gICAgaW1lbV9yZGF0YSwKICAgIG91dHB1dCAgbG9naWMgWzE6MF0gICAgICAgICAgICAgICAgICAgICBpbWVtX3Jlc3AsCgogICAgLy8gQUhCIEludGVyZmFjZQogICAgb3V0cHV0ICBsb2dpYyAgIFszOjBdICAgICAgICAgICAgICAgICAgIGhwcm90LAogICAgb3V0cHV0ICBsb2dpYyAgIFsyOjBdICAgICAgICAgICAgICAgICAgIGhidXJzdCwKICAgIG91dHB1dCAgbG9naWMgICBbMjowXSAgICAgICAgICAgICAgICAgICBoc2l6ZSwKICAgIG91dHB1dCAgbG9naWMgICBbMTowXSAgICAgICAgICAgICAgICAgICBodHJhbnMsCiAgICBvdXRwdXQgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgaG1hc3Rsb2NrLAogICAgb3V0cHV0ICBsb2dpYyAgIFtTQ1IxX0FIQl9XSURUSC0xOjBdICAgIGhhZGRyLAogICAgaW5wdXQgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWFkeSwKICAgIGlucHV0ICAgbG9naWMgICBbU0NSMV9BSEJfV0lEVEgtMTowXSAgICBocmRhdGEsCiAgICBpbnB1dCAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlc3AKCik7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTG9jYWwgcGFyYW1ldGVycyBkZWNsYXJhdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGlmbmRlZiBTQ1IxX0lNRU1fQUhCX09VVF9CUApsb2NhbHBhcmFtICBTQ1IxX0ZJRk9fV0lEVEggPSAyOwpsb2NhbHBhcmFtICBTQ1IxX0ZJRk9fQ05UX1dJRFRIID0gJGNsb2cyKFNDUjFfRklGT19XSURUSCsxKTsKYGVuZGlmIC8vIFNDUjFfSU1FTV9BSEJfT1VUX0JQCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTG9jYWwgdHlwZXMgZGVjbGFyYXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnR5cGVkZWYgZW51bSBsb2dpYyB7CiAgICBTQ1IxX0ZTTV9BRERSID0gMSdiMCwKICAgIFNDUjFfRlNNX0RBVEEgPSAxJ2IxLAogICAgU0NSMV9GU01fRVJSICA9IDEnYngKfSB0eXBlX3NjcjFfZnNtX2U7Cgp0eXBlZGVmIHN0cnVjdCBwYWNrZWQgewogICAgbG9naWMgICBbU0NSMV9BSEJfV0lEVEgtMTowXSAgICBoYWRkcjsKfSB0eXBlX3NjcjFfcmVxX2ZpZm9fczsKCnR5cGVkZWYgc3RydWN0IHBhY2tlZCB7CiAgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXNwOwogICAgbG9naWMgICBbU0NSMV9BSEJfV0lEVEgtMTowXSAgICBocmRhdGE7Cn0gdHlwZV9zY3IxX3Jlc3BfZmlmb19zOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExvY2FsIHNpZ25hbCBkZWNsYXJhdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHlwZV9zY3IxX2ZzbV9lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc207CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fcmQ7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fd3I7CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpZm9fdXA7CmBpZmRlZiBTQ1IxX0lNRU1fQUhCX09VVF9CUAp0eXBlX3NjcjFfcmVxX2ZpZm9fcyAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9maWZvX3I7CnR5cGVfc2NyMV9yZXFfZmlmb19zIFswOjBdICAgICAgICAgICAgICAgICAgcmVxX2ZpZm87CmBlbHNlIC8vIFNDUjFfSU1FTV9BSEJfT1VUX0JQCnR5cGVfc2NyMV9yZXFfZmlmb19zIFswOlNDUjFfRklGT19XSURUSC0xXSAgcmVxX2ZpZm87CnR5cGVfc2NyMV9yZXFfZmlmb19zIFswOlNDUjFfRklGT19XSURUSC0xXSAgcmVxX2ZpZm9fbmV3Owpsb2dpYyAgICAgICBbU0NSMV9GSUZPX0NOVF9XSURUSC0xOjBdICAgICAgIHJlcV9maWZvX2NudDsKbG9naWMgICAgICAgW1NDUjFfRklGT19DTlRfV0lEVEgtMTowXSAgICAgICByZXFfZmlmb19jbnRfbmV3OwpgZW5kaWYgLy8gU0NSMV9JTUVNX0FIQl9PVVRfQlAKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb19lbXB0eTsKbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlmb19mdWxsOwoKdHlwZV9zY3IxX3Jlc3BfZmlmb19zICAgICAgICAgICAgICAgICAgICAgICByZXNwX2ZpZm87CmxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcF9maWZvX2hyZWFkeTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJbnRlcmZhY2UgdG8gQ29yZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYXNzaWduIGltZW1fcmVxX2FjayA9IH5yZXFfZmlmb19mdWxsOwphc3NpZ24gcmVxX2ZpZm9fd3IgID0gfnJlcV9maWZvX2Z1bGwgJiBpbWVtX3JlcTsKCmFzc2lnbiBpbWVtX3JkYXRhID0gcmVzcF9maWZvLmhyZGF0YTsKCmFzc2lnbiBpbWVtX3Jlc3AgPSAocmVzcF9maWZvX2hyZWFkeSkKICAgICAgICAgICAgICAgICAgICA/IChyZXNwX2ZpZm8uaHJlc3AgPT0gU0NSMV9IUkVTUF9PS0FZKQogICAgICAgICAgICAgICAgICAgICAgICA/IFNDUjFfTUVNX1JFU1BfUkRZX09LCiAgICAgICAgICAgICAgICAgICAgICAgIDogU0NSMV9NRU1fUkVTUF9SRFlfRVIKICAgICAgICAgICAgICAgICAgICA6IFNDUjFfTUVNX1JFU1BfTk9UUkRZOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJFUV9GSUZPCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgaWZkZWYgU0NSMV9JTUVNX0FIQl9PVVRfQlAKYWx3YXlzX2ZmIEAobmVnZWRnZSByc3RfbiwgcG9zZWRnZSBjbGspIGJlZ2luCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICAgIHJlcV9maWZvX2Z1bGwgPD0gMSdiMDsKICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICAgaWYgKH5yZXFfZmlmb19mdWxsKSBiZWdpbgogICAgICAgICAgICByZXFfZmlmb19mdWxsIDw9IGltZW1fcmVxICYgfnJlcV9maWZvX3JkOwogICAgICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICAgICAgIHJlcV9maWZvX2Z1bGwgPD0gfnJlcV9maWZvX3JkOwogICAgICAgIGVuZAogICAgZW5kCmVuZAphc3NpZ24gcmVxX2ZpZm9fZW1wdHkgPSB+KHJlcV9maWZvX2Z1bGwgfCBpbWVtX3JlcSk7Cgphc3NpZ24gcmVxX2ZpZm9fdXAgICAgPSB+cmVxX2ZpZm9fcmQgJiByZXFfZmlmb193cjsKYWx3YXlzX2ZmIEAocG9zZWRnZSBjbGspIGJlZ2luCiAgICBpZiAocmVxX2ZpZm9fdXApIGJlZ2luCiAgICAgICAgcmVxX2ZpZm9fci5oYWRkciA8PSBpbWVtX2FkZHI7CiAgICBlbmQKZW5kCgphc3NpZ24gcmVxX2ZpZm9bMF0gPSAocmVxX2ZpZm9fZnVsbCkgPyByZXFfZmlmb19yIDogaW1lbV9hZGRyOwoKYGVsc2UgLy8gU0NSMV9JTUVNX0FIQl9PVVRfQlAKYWx3YXlzX2NvbWIgYmVnaW4KICAgIHJlcV9maWZvX3VwICAgICAgPSAxJ2IwOwogICAgcmVxX2ZpZm9fY250X25ldyA9IHJlcV9maWZvX2NudDsKICAgIHJlcV9maWZvX25ldyAgICAgPSByZXFfZmlmbzsKICAgIGNhc2UgKHtyZXFfZmlmb19yZCwgcmVxX2ZpZm9fd3J9KQogICAgICAgIDInYjAwIDogYmVnaW4KICAgICAgICAgICAgLy8gbm90aGluZyB0b2RvCiAgICAgICAgZW5kCiAgICAgICAgMidiMDE6IGJlZ2luCiAgICAgICAgICAgIC8vIEZJRk8gd3JpdGUKICAgICAgICAgICAgcmVxX2ZpZm9fdXAgPSAxJ2IxOwogICAgICAgICAgICByZXFfZmlmb19uZXdbcmVxX2ZpZm9fY250XS5oYWRkciAgPSBpbWVtX2FkZHI7CiAgICAgICAgICAgIHJlcV9maWZvX2NudF9uZXcgPSByZXFfZmlmb19jbnQgKyAxJ2IxOwogICAgICAgIGVuZAogICAgICAgIDInYjEwIDogYmVnaW4KICAgICAgICAgICAgLy8gRklGTyByZWFkCiAgICAgICAgICAgIHJlcV9maWZvX3VwICAgICA9IDEnYjE7CiAgICAgICAgICAgIHJlcV9maWZvX25ld1swXSA9IHJlcV9maWZvX25ld1sxXTsKICAgICAgICAgICAgcmVxX2ZpZm9fbmV3WzFdLmhhZGRyICA9ICd4OwogICAgICAgICAgICByZXFfZmlmb19jbnRfbmV3ID0gcmVxX2ZpZm9fY250IC0gMSdiMTsKICAgICAgICBlbmQKICAgICAgICAyJ2IxMSA6IGJlZ2luCiAgICAgICAgICAgIC8vIFJlYWQgYW5kIFdyaXRlIEZJRk8uIEl0IGlzIHBvc3NpYmxlIG9ubHkgd2hlbiBmaWZvX2NudCA9IDEKICAgICAgICAgICAgcmVxX2ZpZm9fdXAgICAgICAgICAgID0gMSdiMTsKICAgICAgICAgICAgcmVxX2ZpZm9fbmV3WzBdLmhhZGRyID0gaW1lbV9hZGRyOwogICAgICAgIGVuZAogICAgICAgIGRlZmF1bHQgOiBiZWdpbgogICAgICAgICAgICByZXFfZmlmb191cCAgICAgID0gJ3g7CiAgICAgICAgICAgIHJlcV9maWZvX2NudF9uZXcgPSAneDsKICAgICAgICAgICAgcmVxX2ZpZm9fbmV3ICAgICA9ICd4OwogICAgICAgIGVuZAogICAgZW5kY2FzZQplbmQKCmFsd2F5c19mZiBAKG5lZ2VkZ2UgcnN0X24sIHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKH5yc3RfbikgYmVnaW4KICAgICAgICByZXFfZmlmb19jbnQgPD0gJzA7CiAgICBlbmQgZWxzZSBiZWdpbgogICAgICAgIGlmIChyZXFfZmlmb191cCkgYmVnaW4KICAgICAgICAgICAgcmVxX2ZpZm9fY250IDw9IHJlcV9maWZvX2NudF9uZXc7CiAgICAgICAgZW5kCiAgICBlbmQKZW5kCmFzc2lnbiByZXFfZmlmb19mdWxsICA9IChyZXFfZmlmb19jbnQgPT0gU0NSMV9GSUZPX1dJRFRIKTsKYXNzaWduIHJlcV9maWZvX2VtcHR5ID0gfih8cmVxX2ZpZm9fY250KTsKCmFsd2F5c19mZiBAKHBvc2VkZ2UgY2xrKSBiZWdpbgogICAgaWYgKHJlcV9maWZvX3VwKSBiZWdpbgogICAgICAgIHJlcV9maWZvIDw9IHJlcV9maWZvX25ldzsKICAgIGVuZAplbmQKYGVuZGlmIC8vIFNDUjFfSU1FTV9BSEJfT1VUX0JQCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRlNNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQphbHdheXNfZmYgQChuZWdlZGdlIHJzdF9uLCBwb3NlZGdlIGNsaykgYmVnaW4KICAgIGlmICh+cnN0X24pIGJlZ2luCiAgICAgICAgZnNtIDw9IFNDUjFfRlNNX0FERFI7CiAgICBlbmQgZWxzZSBiZWdpbgogICAgICAgIGNhc2UgKGZzbSkKICAgICAgICAgICAgU0NSMV9GU01fQUREUiA6IGJlZ2luCiAgICAgICAgICAgICAgICBpZiAoaHJlYWR5KSBiZWdpbgogICAgICAgICAgICAgICAgICAgIGZzbSA8PSAocmVxX2ZpZm9fZW1wdHkpID8gU0NSMV9GU01fQUREUiA6IFNDUjFfRlNNX0RBVEE7CiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIFNDUjFfRlNNX0RBVEEgOiBiZWdpbgogICAgICAgICAgICAgICAgaWYgKGhyZWFkeSkgYmVnaW4KICAgICAgICAgICAgICAgICAgICBpZiAoaHJlc3AgPT0gU0NSMV9IUkVTUF9PS0FZKSBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICBmc20gPD0gKHJlcV9maWZvX2VtcHR5KSA/IFNDUjFfRlNNX0FERFIgOiBTQ1IxX0ZTTV9EQVRBOwogICAgICAgICAgICAgICAgICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgIGZzbSA8PSBTQ1IxX0ZTTV9BRERSOwogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBkZWZhdWx0IDogYmVnaW4KICAgICAgICAgICAgICAgIGZzbSA8PSBTQ1IxX0ZTTV9FUlI7CiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZGNhc2UKICAgIGVuZAplbmQKCmFsd2F5c19jb21iIGJlZ2luCiAgICByZXFfZmlmb19yZCA9IDEnYjA7CiAgICBjYXNlIChmc20pCiAgICAgICAgU0NSMV9GU01fQUREUiA6IGJlZ2luCiAgICAgICAgICAgIGlmIChocmVhZHkpIGJlZ2luCiAgICAgICAgICAgICAgICByZXFfZmlmb19yZCA9IH5yZXFfZmlmb19lbXB0eTsKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAgICAgICAgU0NSMV9GU01fREFUQSA6IGJlZ2luCiAgICAgICAgICAgIGlmIChocmVhZHkpIGJlZ2luCiAgICAgICAgICAgICAgICByZXFfZmlmb19yZCA9IH5yZXFfZmlmb19lbXB0eSAmIChocmVzcCA9PSBTQ1IxX0hSRVNQX09LQVkpOwogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgICAgICBkZWZhdWx0IDogYmVnaW4KICAgICAgICAgICAgcmVxX2ZpZm9fcmQgPSAxJ2J4OwogICAgICAgIGVuZAogICAgZW5kY2FzZQplbmQKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGSUZPIHJlc3BvbnNlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgaWZkZWYgU0NSMV9JTUVNX0FIQl9JTl9CUAphc3NpZ24gcmVzcF9maWZvX2hyZWFkeSA9IChmc20gPT0gU0NSMV9GU01fREFUQSkgPyBocmVhZHkgOiAxJ2IwOwphc3NpZ24gcmVzcF9maWZvLmhyZXNwICA9IGhyZXNwOwphc3NpZ24gcmVzcF9maWZvLmhyZGF0YSA9IGhyZGF0YTsKYGVsc2UgLy8gU0NSMV9JTUVNX0FIQl9JTl9CUAphbHdheXNfZmYgQChuZWdlZGdlIHJzdF9uLCBwb3NlZGdlIGNsaykgYmVnaW4KICAgIGlmICh+cnN0X24pIGJlZ2luCiAgICAgICAgcmVzcF9maWZvX2hyZWFkeSA8PSAxJ2IwOwogICAgZW5kIGVsc2UgYmVnaW4KICAgICAgICByZXNwX2ZpZm9faHJlYWR5IDw9IChmc20gPT0gU0NSMV9GU01fREFUQSkgPyBocmVhZHkgOiAxJ2IwOwogICAgZW5kCmVuZAoKYWx3YXlzX2ZmIEAocG9zZWRnZSBjbGspIGJlZ2luCiAgICBpZiAoaHJlYWR5ICYgKGZzbSA9PSBTQ1IxX0ZTTV9EQVRBKSkgYmVnaW4KICAgICAgICByZXNwX2ZpZm8uaHJlc3AgIDw9IGhyZXNwOwogICAgICAgIHJlc3BfZmlmby5ocmRhdGEgPD0gaHJkYXRhOwogICAgZW5kCmVuZApgZW5kaWYgLy8gU0NSMV9JTUVNX0FIQl9JTl9CUAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEludGVyZmFjZSB0byBBSEIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmFzc2lnbiBocHJvdFtTQ1IxX0hQUk9UX0RBVEFdICA9IDEnYjA7CmFzc2lnbiBocHJvdFtTQ1IxX0hQUk9UX1BSVl0gICA9IDEnYjA7CmFzc2lnbiBocHJvdFtTQ1IxX0hQUk9UX0JVRl0gICA9IDEnYjA7CmFzc2lnbiBocHJvdFtTQ1IxX0hQUk9UX0NBQ0hFXSA9IDEnYjA7Cgphc3NpZ24gaGJ1cnN0ICAgICAgID0gU0NSMV9IQlVSU1RfU0lOR0xFOwphc3NpZ24gaHNpemUgICAgICAgID0gU0NSMV9IU0laRV8zMkI7CmFzc2lnbiBobWFzdGxvY2sgICAgPSAxJ2IwOwoKYWx3YXlzX2NvbWIgYmVnaW4KICAgIGh0cmFucyA9IFNDUjFfSFRSQU5TX0lETEU7CiAgICBjYXNlIChmc20pCiAgICAgICAgU0NSMV9GU01fQUREUiA6IGJlZ2luCiAgICAgICAgICAgIGlmICh+cmVxX2ZpZm9fZW1wdHkpIGJlZ2luCiAgICAgICAgICAgICAgICBodHJhbnMgPSBTQ1IxX0hUUkFOU19OT05TRVE7CiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgICAgIFNDUjFfRlNNX0RBVEEgOiBiZWdpbgogICAgICAgICAgICBpZiAoaHJlYWR5KSBiZWdpbgogICAgICAgICAgICAgICAgaWYgKGhyZXNwID09IFNDUjFfSFJFU1BfT0tBWSkgYmVnaW4KICAgICAgICAgICAgICAgICAgICBpZiAofnJlcV9maWZvX2VtcHR5KSBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICBodHJhbnMgPSBTQ1IxX0hUUkFOU19OT05TRVE7CiAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAgICAgICAgZGVmYXVsdCA6IGJlZ2luCiAgICAgICAgICAgIGh0cmFucyA9IFNDUjFfSFRSQU5TX0VSUjsKICAgICAgICBlbmQKICAgIGVuZGNhc2UKZW5kCgphc3NpZ24gaGFkZHIgID0gcmVxX2ZpZm9bMF0uaGFkZHI7CgpgaWZkZWYgU0NSMV9UUkdUX1NJTVVMQVRJT04KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzc2VydGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENoZWNrIENvcmUgaW50ZXJmYWNlClNDUjFfU1ZBX0lNRU1fQUhCX0JSSURHRV9SRVFfWENIRUNLIDogYXNzZXJ0IHByb3BlcnR5ICgKICAgIEAobmVnZWRnZSBjbGspIGRpc2FibGUgaWZmICh+cnN0X24pCiAgICAhJGlzdW5rbm93bihpbWVtX3JlcSkKICAgICkgZWxzZSAkZXJyb3IoIklNRU0gQUhCIGJyaWRnZSBFcnJvcjogaW1lbV9yZXEgaGFzIHVua25vd24gdmFsdWVzIik7CgpTQ1IxX0lNRU1fQUhCX0JSSURHRV9BRERSX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgaW1lbV9yZXEgfC0+ICEkaXN1bmtub3duKGltZW1fYWRkcikKICAgICkgZWxzZSAkZXJyb3IoIklNRU0gQUhCIGJyaWRnZSBFcnJvcjogaW1lbV9hZGRyIGhhcyB1bmtub3duIHZhbHVlcyIpOwoKU0NSMV9JTUVNX0FIQl9CUklER0VfQUREUl9BTExJR04gOiBhc3NlcnQgcHJvcGVydHkgKAogICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgIGltZW1fcmVxIHwtPiAoaW1lbV9hZGRyWzE6MF0gPT0gJzApCiAgICApIGVsc2UgJGVycm9yKCJJTUVNIEFIQiBicmlkZ2UgRXJyb3I6IGltZW1fYWRkciBoYXMgdW5hbGlnbiB2YWx1ZXMiKTsKCi8vIENoZWNrIEFIQiBpbnRlcmZhY2UKU0NSMV9JTUVNX0FIQl9CUklER0VfSFJFQURZX1hDSEVDSyA6IGFzc2VydCBwcm9wZXJ0eSAoCiAgICBAKG5lZ2VkZ2UgY2xrKSBkaXNhYmxlIGlmZiAofnJzdF9uKQogICAgISRpc3Vua25vd24oaHJlYWR5KQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBBSEIgYnJpZGdlIEVycm9yOiBocmVhZHkgaGFzIHVua25vd24gdmFsdWVzIik7CgpTQ1IxX0lNRU1fQUhCX0JSSURHRV9IUkVTUF9YQ0hFQ0sgOiBhc3NlcnQgcHJvcGVydHkgKAogICAgQChuZWdlZGdlIGNsaykgZGlzYWJsZSBpZmYgKH5yc3RfbikKICAgICEkaXN1bmtub3duKGhyZXNwKQogICAgKSBlbHNlICRlcnJvcigiSU1FTSBBSEIgYnJpZGdlIEVycm9yOiBocmVzcCBoYXMgdW5rbm93biB2YWx1ZXMiKTsKCmBlbmRpZiAvLyBTQ1IxX1RSR1RfU0lNVUxBVElPTgoKZW5kbW9kdWxlIDogc2NyMV9pbWVtX2FoYgo=