Ly8vIENvcHlyaWdodCBieSBTeW50YWNvcmUgTExDIKkgMjAxNi0yMDIxLiBTZWUgTElDRU5TRSBmb3IgZGV0YWlscwovLy8gQGZpbGUgICAgICAgPHNjcjFfcmlzY3ZfaXNhX2RlY29kaW5nLnN2aD4KLy8vIEBicmllZiAgICAgIFJJU0MtViBJU0EgZGVmaW5pdGlvbnMgZmlsZQovLy8KCmBpZm5kZWYgU0NSMV9SSVNDVl9JU0FfREVDT0RJTkdfU1ZICmBkZWZpbmUgU0NSMV9SSVNDVl9JU0FfREVDT0RJTkdfU1ZICgpgaW5jbHVkZSAic2NyMV9hcmNoX2Rlc2NyaXB0aW9uLnN2aCIKYGluY2x1ZGUgInNjcjFfYXJjaF90eXBlcy5zdmgiCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSW5zdHJ1Y3Rpb24gdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnR5cGVkZWYgZW51bSBsb2dpYyBbMTowXSB7CiAgICBTQ1IxX0lOU1RSX1JWQzAgICAgID0gMidiMDAsCiAgICBTQ1IxX0lOU1RSX1JWQzEgICAgID0gMidiMDEsCiAgICBTQ1IxX0lOU1RSX1JWQzIgICAgID0gMidiMTAsCiAgICBTQ1IxX0lOU1RSX1JWSSAgICAgID0gMidiMTEKfSB0eXBlX3NjcjFfaW5zdHJfdHlwZV9lOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJWMzJJIG9wY29kZXMgKGJpdHMgNjoyKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHlwZWRlZiBlbnVtIGxvZ2ljIFs2OjJdIHsKICAgIFNDUjFfT1BDT0RFX0xPQUQgICAgICAgID0gNSdiMDAwMDAsCiAgICBTQ1IxX09QQ09ERV9NSVNDX01FTSAgICA9IDUnYjAwMDExLAogICAgU0NSMV9PUENPREVfT1BfSU1NICAgICAgPSA1J2IwMDEwMCwKICAgIFNDUjFfT1BDT0RFX0FVSVBDICAgICAgID0gNSdiMDAxMDEsCiAgICBTQ1IxX09QQ09ERV9TVE9SRSAgICAgICA9IDUnYjAxMDAwLAogICAgU0NSMV9PUENPREVfT1AgICAgICAgICAgPSA1J2IwMTEwMCwKICAgIFNDUjFfT1BDT0RFX0xVSSAgICAgICAgID0gNSdiMDExMDEsCiAgICBTQ1IxX09QQ09ERV9CUkFOQ0ggICAgICA9IDUnYjExMDAwLAogICAgU0NSMV9PUENPREVfSkFMUiAgICAgICAgPSA1J2IxMTAwMSwKICAgIFNDUjFfT1BDT0RFX0pBTCAgICAgICAgID0gNSdiMTEwMTEsCiAgICBTQ1IxX09QQ09ERV9TWVNURU0gICAgICA9IDUnYjExMTAwCn0gdHlwZV9zY3IxX3J2aV9vcGNvZGVfZTsKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSUFMVSBtYWluIG9wZXJhbmRzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpsb2NhbHBhcmFtIFNDUjFfSUFMVV9PUF9BTExfTlVNX0UgPSAyOwpsb2NhbHBhcmFtIFNDUjFfSUFMVV9PUF9XSURUSF9FICAgPSAkY2xvZzIoU0NSMV9JQUxVX09QX0FMTF9OVU1fRSk7CnR5cGVkZWYgZW51bSBsb2dpYyBbU0NSMV9JQUxVX09QX1dJRFRIX0UtMTowXSB7CiAgICBTQ1IxX0lBTFVfT1BfUkVHX0lNTSwgICAgICAgICAgLy8gb3AxID0gcnMxOyBvcDIgPSBpbW0KICAgIFNDUjFfSUFMVV9PUF9SRUdfUkVHICAgICAgICAgICAvLyBvcDEgPSByczE7IG9wMiA9IHJzMgp9IHR5cGVfc2NyMV9pYWx1X29wX3NlbF9lOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIElBTFUgbWFpbiBjb21tYW5kcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGlmZGVmIFNDUjFfUlZNX0VYVApsb2NhbHBhcmFtIFNDUjFfSUFMVV9DTURfQUxMX05VTV9FICAgID0gMjM7CmBlbHNlIC8vIH5TQ1IxX1JWTV9FWFQKbG9jYWxwYXJhbSBTQ1IxX0lBTFVfQ01EX0FMTF9OVU1fRSAgICA9IDE1OwpgZW5kaWYgLy8gflNDUjFfUlZNX0VYVApsb2NhbHBhcmFtIFNDUjFfSUFMVV9DTURfV0lEVEhfRSAgICAgID0gJGNsb2cyKFNDUjFfSUFMVV9DTURfQUxMX05VTV9FKTsKdHlwZWRlZiBlbnVtIGxvZ2ljIFtTQ1IxX0lBTFVfQ01EX1dJRFRIX0UtMTowXSB7CiAgICBTQ1IxX0lBTFVfQ01EX05PTkUgID0gJzAsICAgLy8gSUFMVSBkaXNhYmxlCiAgICBTQ1IxX0lBTFVfQ01EX0FORCwgICAgICAgICAgLy8gb3AxICYgb3AyCiAgICBTQ1IxX0lBTFVfQ01EX09SLCAgICAgICAgICAgLy8gb3AxIHwgb3AyCiAgICBTQ1IxX0lBTFVfQ01EX1hPUiwgICAgICAgICAgLy8gb3AxIF4gb3AyCiAgICBTQ1IxX0lBTFVfQ01EX0FERCwgICAgICAgICAgLy8gb3AxICsgb3AyCiAgICBTQ1IxX0lBTFVfQ01EX1NVQiwgICAgICAgICAgLy8gb3AxIC0gb3AyCiAgICBTQ1IxX0lBTFVfQ01EX1NVQl9MVCwgICAgICAgLy8gb3AxIDwgb3AyCiAgICBTQ1IxX0lBTFVfQ01EX1NVQl9MVFUsICAgICAgLy8gb3AxIHU8IG9wMgogICAgU0NSMV9JQUxVX0NNRF9TVUJfRVEsICAgICAgIC8vIG9wMSA9IG9wMgogICAgU0NSMV9JQUxVX0NNRF9TVUJfTkUsICAgICAgIC8vIG9wMSAhPSBvcDIKICAgIFNDUjFfSUFMVV9DTURfU1VCX0dFLCAgICAgICAvLyBvcDEgPj0gb3AyCiAgICBTQ1IxX0lBTFVfQ01EX1NVQl9HRVUsICAgICAgLy8gb3AxIHU+PSBvcDIKICAgIFNDUjFfSUFMVV9DTURfU0xMLCAgICAgICAgICAvLyBvcDEgPDwgb3AyCiAgICBTQ1IxX0lBTFVfQ01EX1NSTCwgICAgICAgICAgLy8gb3AxID4+IG9wMgogICAgU0NSMV9JQUxVX0NNRF9TUkEgICAgICAgICAgIC8vIG9wMSA+Pj4gb3AyCmBpZmRlZiBTQ1IxX1JWTV9FWFQKICAgICwKICAgIFNDUjFfSUFMVV9DTURfTVVMLCAgICAgICAgICAvLyBsb3codW5zaWcob3AxKSAqIHVuc2lnKG9wMikpCiAgICBTQ1IxX0lBTFVfQ01EX01VTEhVLCAgICAgICAgLy8gaGlnaCh1bnNpZyhvcDEpICogdW5zaWcob3AyKSkKICAgIFNDUjFfSUFMVV9DTURfTVVMSFNVLCAgICAgICAvLyBoaWdoKG9wMSAqIHVuc2lnKG9wMikpCiAgICBTQ1IxX0lBTFVfQ01EX01VTEgsICAgICAgICAgLy8gaGlnaChvcDEgKiBvcDIpCiAgICBTQ1IxX0lBTFVfQ01EX0RJViwgICAgICAgICAgLy8gb3AxIC8gb3AyCiAgICBTQ1IxX0lBTFVfQ01EX0RJVlUsICAgICAgICAgLy8gb3AxIHUvIG9wMgogICAgU0NSMV9JQUxVX0NNRF9SRU0sICAgICAgICAgIC8vIG9wMSAlIG9wMgogICAgU0NSMV9JQUxVX0NNRF9SRU1VICAgICAgICAgIC8vIG9wMSB1JSBvcDIKYGVuZGlmICAvLyBTQ1IxX1JWTV9FWFQKfSB0eXBlX3NjcjFfaWFsdV9jbWRfc2VsX2U7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSUFMVSBTVU0yIG9wZXJhbmRzIChyZXN1bHQgaXMgSlVNUC9CUkFOQ0ggdGFyZ2V0LCBMT0FEL1NUT1JFIGFkZHJlc3MpCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpsb2NhbHBhcmFtIFNDUjFfU1VNMl9PUF9BTExfTlVNX0UgICAgPSAyOwpsb2NhbHBhcmFtIFNDUjFfU1VNMl9PUF9XSURUSF9FICAgICAgPSAkY2xvZzIoU0NSMV9TVU0yX09QX0FMTF9OVU1fRSk7CnR5cGVkZWYgZW51bSBsb2dpYyBbU0NSMV9TVU0yX09QX1dJRFRIX0UtMTowXSB7CiAgICBTQ1IxX1NVTTJfT1BfUENfSU1NLCAgICAgICAgLy8gb3AxID0gY3Vycl9wYzsgb3AyID0gaW1tIChBVUlQQywgdGFyZ2V0IG5ld19wYyBmb3IgSkFMIGFuZCBicmFuY2hlcykKICAgIFNDUjFfU1VNMl9PUF9SRUdfSU1NICAgICAgICAvLyBvcDEgPSByczE7IG9wMiA9IGltbSAodGFyZ2V0IG5ld19wYyBmb3IgSkFMUiwgTE9BRC9TVE9SRSBhZGRyZXNzKQpgaWZkZWYgU0NSMV9YUFJPUF9FTgogICAgLAogICAgU0NSMV9TVU0yX09QX0VSUk9SID0gJ3gKYGVuZGlmIC8vIFNDUjFfWFBST1BfRU4KfSB0eXBlX3NjcjFfaWFsdV9zdW0yX29wX3NlbF9lOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExTVSBjb21tYW5kcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWxwYXJhbSBTQ1IxX0xTVV9DTURfQUxMX05VTV9FICAgPSA5Owpsb2NhbHBhcmFtIFNDUjFfTFNVX0NNRF9XSURUSF9FICAgICA9ICRjbG9nMihTQ1IxX0xTVV9DTURfQUxMX05VTV9FKTsKdHlwZWRlZiBlbnVtIGxvZ2ljIFtTQ1IxX0xTVV9DTURfV0lEVEhfRS0xOjBdIHsKICAgIFNDUjFfTFNVX0NNRF9OT05FID0gJzAsCiAgICBTQ1IxX0xTVV9DTURfTEIsCiAgICBTQ1IxX0xTVV9DTURfTEgsCiAgICBTQ1IxX0xTVV9DTURfTFcsCiAgICBTQ1IxX0xTVV9DTURfTEJVLAogICAgU0NSMV9MU1VfQ01EX0xIVSwKICAgIFNDUjFfTFNVX0NNRF9TQiwKICAgIFNDUjFfTFNVX0NNRF9TSCwKICAgIFNDUjFfTFNVX0NNRF9TVwp9IHR5cGVfc2NyMV9sc3VfY21kX3NlbF9lOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENTUiBvcGVyYW5kcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWxwYXJhbSBTQ1IxX0NTUl9PUF9BTExfTlVNX0UgICA9IDI7CmxvY2FscGFyYW0gU0NSMV9DU1JfT1BfV0lEVEhfRSAgICAgPSAkY2xvZzIoU0NSMV9DU1JfT1BfQUxMX05VTV9FKTsKdHlwZWRlZiBlbnVtIGxvZ2ljIFtTQ1IxX0NTUl9PUF9XSURUSF9FLTE6MF0gewogICAgU0NSMV9DU1JfT1BfSU1NLAogICAgU0NSMV9DU1JfT1BfUkVHCn0gdHlwZV9zY3IxX2Nzcl9vcF9zZWxfZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDU1IgY29tbWFuZHMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmxvY2FscGFyYW0gU0NSMV9DU1JfQ01EX0FMTF9OVU1fRSAgID0gNDsKbG9jYWxwYXJhbSBTQ1IxX0NTUl9DTURfV0lEVEhfRSAgICAgPSAkY2xvZzIoU0NSMV9DU1JfQ01EX0FMTF9OVU1fRSk7CnR5cGVkZWYgZW51bSBsb2dpYyBbU0NSMV9DU1JfQ01EX1dJRFRIX0UtMTowXSB7CiAgICBTQ1IxX0NTUl9DTURfTk9ORSA9ICcwLAogICAgU0NSMV9DU1JfQ01EX1dSSVRFLAogICAgU0NSMV9DU1JfQ01EX1NFVCwKICAgIFNDUjFfQ1NSX0NNRF9DTEVBUgp9IHR5cGVfc2NyMV9jc3JfY21kX3NlbF9lOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE1QUkYgcmQgd3JpdGViYWNrIHNvdXJjZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWxwYXJhbSBTQ1IxX1JEX1dCX0FMTF9OVU1fRSA9IDc7CmxvY2FscGFyYW0gU0NSMV9SRF9XQl9XSURUSF9FICAgPSAkY2xvZzIoU0NSMV9SRF9XQl9BTExfTlVNX0UpOwp0eXBlZGVmIGVudW0gbG9naWMgW1NDUjFfUkRfV0JfV0lEVEhfRS0xOjBdIHsKICAgIFNDUjFfUkRfV0JfTk9ORSA9ICcwLAogICAgU0NSMV9SRF9XQl9JQUxVLCAgICAgICAgICAgIC8vIElBTFUgbWFpbiByZXN1bHQKICAgIFNDUjFfUkRfV0JfU1VNMiwgICAgICAgICAgICAvLyBJQUxVIFNVTTIgcmVzdWx0IChBVUlQQykKICAgIFNDUjFfUkRfV0JfSU1NLCAgICAgICAgICAgICAvLyBMVUkKICAgIFNDUjFfUkRfV0JfSU5DX1BDLCAgICAgICAgICAvLyBKQUwoUikKICAgIFNDUjFfUkRfV0JfTFNVLCAgICAgICAgICAgICAvLyBMb2FkIGZyb20gRE1FTQogICAgU0NSMV9SRF9XQl9DU1IgICAgICAgICAgICAgIC8vIFJlYWQgQ1NSCn0gdHlwZV9zY3IxX3JkX3diX3NlbF9lOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIElEVSB0byBFWFUgZnVsbCBjb21tYW5kIHN0cnVjdHVyZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWxwYXJhbSBTQ1IxX0dQUl9GSUVMRF9XSURUSCA9IDU7Cgp0eXBlZGVmIHN0cnVjdCBwYWNrZWQgewogICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJfcnZjOyAgICAgIC8vIHVzZWQgd2l0aCBhIGRpZmZlcmVudCBtZWFuaW5nIGZvciBJRlUgYWNjZXNzIGZhdWx0IGV4Y2VwdGlvbgogICAgdHlwZV9zY3IxX2lhbHVfb3Bfc2VsX2UgICAgICAgICAgICAgaWFsdV9vcDsKICAgIHR5cGVfc2NyMV9pYWx1X2NtZF9zZWxfZSAgICAgICAgICAgIGlhbHVfY21kOwogICAgdHlwZV9zY3IxX2lhbHVfc3VtMl9vcF9zZWxfZSAgICAgICAgc3VtMl9vcDsKICAgIHR5cGVfc2NyMV9sc3VfY21kX3NlbF9lICAgICAgICAgICAgIGxzdV9jbWQ7CiAgICB0eXBlX3NjcjFfY3NyX29wX3NlbF9lICAgICAgICAgICAgICBjc3Jfb3A7CiAgICB0eXBlX3NjcjFfY3NyX2NtZF9zZWxfZSAgICAgICAgICAgICBjc3JfY21kOwogICAgdHlwZV9zY3IxX3JkX3diX3NlbF9lICAgICAgICAgICAgICAgcmRfd2Jfc2VsOwogICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcF9yZXE7CiAgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2hfcmVxOwogICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJldF9yZXE7CiAgICBsb2dpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW5jZWlfcmVxOwogICAgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ZpX3JlcTsKICAgIGxvZ2ljIFtTQ1IxX0dQUl9GSUVMRF9XSURUSC0xOjBdICAgIHJzMV9hZGRyOyAgICAgICAvLyBhbHNvIHVzZWQgYXMgemltbSBmb3IgQ1NSUnhJIGluc3RydWN0aW9ucwogICAgbG9naWMgW1NDUjFfR1BSX0ZJRUxEX1dJRFRILTE6MF0gICAgcnMyX2FkZHI7CiAgICBsb2dpYyBbU0NSMV9HUFJfRklFTERfV0lEVEgtMTowXSAgICByZF9hZGRyOwogICAgbG9naWMgW2BTQ1IxX1hMRU4tMTowXSAgICAgICAgICAgICAgaW1tOyAgICAgICAgICAgIC8vIHVzZWQgYXMge2Z1bmN0MywgQ1NSIGFkZHJlc3N9IGZvciBDU1IgaW5zdHJ1Y3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBhcyBpbnN0cnVjdGlvbiBmaWVsZCBmb3IgaWxsZWdhbCBpbnN0cnVjdGlvbiBleGNlcHRpb24KICAgIGxvZ2ljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y19yZXE7CiAgICB0eXBlX3NjcjFfZXhjX2NvZGVfZSAgICAgICAgICAgICAgICBleGNfY29kZTsKfSB0eXBlX3NjcjFfZXh1X2NtZF9zOwoKYGVuZGlmIC8vIFNDUjFfUklTQ1ZfSVNBX0RFQ09ESU5HX1NWSAoK