LyoKICogU0hMV0FQSSBvcmRpbmFsIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICogICAgICAgICAgIDE5OTggSvxyZ2VuIFNjaG1pZWQKICogICAgICAgICAgIDIwMDEgSm9uIEdyaWZmaXRocwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJkZGVtbC5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJzaGVsbGFwaS5oIgojaW5jbHVkZSAiY29tbWRsZy5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL29ial9iYXNlLmgiCiNpbmNsdWRlICJ3aW5lL29ial9pbnBsYWNlLmgiCiNpbmNsdWRlICJ3aW5lL29ial9zZXJ2aWNlcHJvdmlkZXIuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJvcmRpbmFsLmgiCiNpbmNsdWRlICJzaGx3YXBpLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChzaGVsbCk7CgpleHRlcm4gSElOU1RBTkNFIHNobHdhcGlfaEluc3RhbmNlOwpleHRlcm4gSE1PRFVMRSBTSExXQVBJX2hzaGVsbDMyOwpleHRlcm4gSE1PRFVMRSBTSExXQVBJX2h3aW5tbTsKZXh0ZXJuIEhNT0RVTEUgU0hMV0FQSV9oY29tZGxnMzI7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaG1wcjsKZXh0ZXJuIEhNT0RVTEUgU0hMV0FQSV9obWxhbmc7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaHZlcnNpb247CgpleHRlcm4gRFdPUkQgU0hMV0FQSV9UaHJlYWRSZWZfaW5kZXg7Cgp0eXBlZGVmIEhBTkRMRSBIU0hBUkVEOyAvKiBTaGFyZWQgbWVtb3J5ICovCgovKiBmb2xsb3dpbmcgaXMgR1VJRCBmb3IgSU9iamVjdFdpdGhTaXRlOjpTZXRTaXRlICAtLSBzZWUgXzE3NCAgICAgICAgICAgKi8Kc3RhdGljIERXT1JEIGlkMVs0XSA9IHsweGZjNDgwMWEzLCAweDExY2YyYmE5LCAweGFhMDAyOWEyLCAweDUyNzMzZDAwfTsKLyogZm9sbG93aW5nIGlzIEdVSUQgZm9yIElQZXJzaXN0TW9uaWtlcjo6R2V0Q2xhc3NJRCAgLS0gc2VlIF8xNzQgICAgICAgICovCnN0YXRpYyBEV09SRCBpZDJbNF0gPSB7MHg3OWVhYzllZSwgMHgxMWNlYmFmOSwgMHhhYTAwODI4YywgMHgwYmE5NGIwMH07CgovKiBUaGUgZm9sbG93aW5nIHNjaGVtZXMgd2VyZSBpZGVudGlmaWVkIGluIHRoZSBuYXRpdmUgdmVyc2lvbiBvZgogKiBTSExXQVBJLkRMTCB2ZXJzaW9uIDUuNTAKICovCnR5cGVkZWYgZW51bSB7CiAgICBVUkxfU0NIRU1FX0lOVkFMSUQgICAgID0gLTEsCiAgICBVUkxfU0NIRU1FX1VOS05PV04gICAgID0gIDAsCiAgICBVUkxfU0NIRU1FX0ZUUCwKICAgIFVSTF9TQ0hFTUVfSFRUUCwKICAgIFVSTF9TQ0hFTUVfR09QSEVSLAogICAgVVJMX1NDSEVNRV9NQUlMVE8sCiAgICBVUkxfU0NIRU1FX05FV1MsCiAgICBVUkxfU0NIRU1FX05OVFAsCiAgICBVUkxfU0NIRU1FX1RFTE5FVCwKICAgIFVSTF9TQ0hFTUVfV0FJUywKICAgIFVSTF9TQ0hFTUVfRklMRSwKICAgIFVSTF9TQ0hFTUVfTUssCiAgICBVUkxfU0NIRU1FX0hUVFBTLAogICAgVVJMX1NDSEVNRV9TSEVMTCwKICAgIFVSTF9TQ0hFTUVfU05FV1MsCiAgICBVUkxfU0NIRU1FX0xPQ0FMLAogICAgVVJMX1NDSEVNRV9KQVZBU0NSSVBULAogICAgVVJMX1NDSEVNRV9WQlNDUklQVCwKICAgIFVSTF9TQ0hFTUVfQUJPVVQsCiAgICBVUkxfU0NIRU1FX1JFUywKICAgIFVSTF9TQ0hFTUVfTUFYVkFMVUUKfSBVUkxfU0NIRU1FOwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgVVJMX1NDSEVNRSAgc2NoZW1lX251bWJlcjsKICAgIExQQ1NUUiBzY2hlbWVfbmFtZTsKfSBTSExfMl9pbmV0X3NjaGVtZTsKCnN0YXRpYyBjb25zdCBTSExfMl9pbmV0X3NjaGVtZSBzaGx3YXBpX3NjaGVtZXNbXSA9IHsKICB7VVJMX1NDSEVNRV9GVFAsICAgICAgICAiZnRwIn0sCiAge1VSTF9TQ0hFTUVfSFRUUCwgICAgICAgImh0dHAifSwKICB7VVJMX1NDSEVNRV9HT1BIRVIsICAgICAiZ29waGVyIn0sCiAge1VSTF9TQ0hFTUVfTUFJTFRPLCAgICAgIm1haWx0byJ9LAogIHtVUkxfU0NIRU1FX05FV1MsICAgICAgICJuZXdzIn0sCiAge1VSTF9TQ0hFTUVfTk5UUCwgICAgICAgIm5udHAifSwKICB7VVJMX1NDSEVNRV9URUxORVQsICAgICAidGVsbmV0In0sCiAge1VSTF9TQ0hFTUVfV0FJUywgICAgICAgIndhaXMifSwKICB7VVJMX1NDSEVNRV9GSUxFLCAgICAgICAiZmlsZSJ9LAogIHtVUkxfU0NIRU1FX01LLCAgICAgICAgICJtayJ9LAogIHtVUkxfU0NIRU1FX0hUVFBTLCAgICAgICJodHRwcyJ9LAogIHtVUkxfU0NIRU1FX1NIRUxMLCAgICAgICJzaGVsbCJ9LAogIHtVUkxfU0NIRU1FX1NORVdTLCAgICAgICJzbmV3cyJ9LAogIHtVUkxfU0NIRU1FX0xPQ0FMLCAgICAgICJsb2NhbCJ9LAogIHtVUkxfU0NIRU1FX0pBVkFTQ1JJUFQsICJqYXZhc2NyaXB0In0sCiAge1VSTF9TQ0hFTUVfVkJTQ1JJUFQsICAgInZic2NyaXB0In0sCiAge1VSTF9TQ0hFTUVfQUJPVVQsICAgICAgImFib3V0In0sCiAge1VSTF9TQ0hFTUVfUkVTLCAgICAgICAgInJlcyJ9LAogIHswLCAwfQp9OwoKLyogZnVuY3Rpb24gcG9pbnRlcnMgZm9yIEdFVF9GVU5DIG1hY3JvOyB0aGVzZSBuZWVkIHRvIGJlIGdsb2JhbCBiZWNhdXNlIG9mIGdjYyBidWcgKi8Kc3RhdGljIExQSVRFTUlETElTVCAoV0lOQVBJICpwU0hCcm93c2VGb3JGb2xkZXJXKShMUEJST1dTRUlORk9XKTsKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqcENvbnZlcnRJTmV0VW5pY29kZVRvTXVsdGlCeXRlKShMUERXT1JELERXT1JELExQQ1dTVFIsTFBJTlQsTFBTVFIsTFBJTlQpOwpzdGF0aWMgQk9PTCAgICAoV0lOQVBJICpwUGxheVNvdW5kVykoTFBDV1NUUiwgSE1PRFVMRSwgRFdPUkQpOwpzdGF0aWMgRFdPUkQgICAoV0lOQVBJICpwU0hHZXRGaWxlSW5mb1cpKExQQ1dTVFIsRFdPUkQsU0hGSUxFSU5GT1cqLFVJTlQsVUlOVCk7CnN0YXRpYyBVSU5UICAgIChXSU5BUEkgKnBEcmFnUXVlcnlGaWxlVykoSERST1AsIFVJTlQsIExQV1NUUiwgVUlOVCk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBTSEdldFBhdGhGcm9tSURMaXN0VykoTFBDSVRFTUlETElTVCwgTFBXU1RSKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcFNoZWxsRXhlY3V0ZUV4VykoTFBTSEVMTEVYRUNVVEVJTkZPVyk7CnN0YXRpYyBISUNPTiAgIChXSU5BUEkgKnBTSEZpbGVPcGVyYXRpb25XKShMUFNIRklMRU9QU1RSVUNUVyk7CnN0YXRpYyBISUNPTiAgIChXSU5BUEkgKnBFeHRyYWN0SWNvbkV4VykoTFBDV1NUUiwgSU5ULEhJQ09OICosSElDT04gKiwgVUlOVCk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBTSEdldE5ld0xpbmtJbmZvVykoTFBDV1NUUiwgTFBDV1NUUiwgTFBDV1NUUiwgQk9PTCosIFVJTlQpOwpzdGF0aWMgRFdPUkQgICAoV0lOQVBJICpwU0hEZWZFeHRyYWN0SWNvblcpKExQVk9JRCwgTFBWT0lELCBMUFZPSUQsIExQVk9JRCwgTFBWT0lELCBMUFZPSUQpOyAvKiBGSVhNRTogQ29ycmVjdCBhcmdzICovCnN0YXRpYyBISUNPTiAgIChXSU5BUEkgKnBFeHRyYWN0SWNvblcpKEhJTlNUQU5DRSwgTFBDV1NUUiwgVUlOVCk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBHZXRTYXZlRmlsZU5hbWVXKShMUE9QRU5GSUxFTkFNRVcpOwpzdGF0aWMgRFdPUkQgICAoV0lOQVBJICpwV05ldFJlc3RvcmVDb25uZWN0aW9uVykoTFBWT0lELCBMUFZPSUQpOyAvKiBGSVhNRTogQ29ycmVjdCBhcmdzICovCnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBXTmV0R2V0TGFzdEVycm9yVykoTFBWT0lELCBMUFZPSUQsIExQVk9JRCwgTFBWT0lELCBMUFZPSUQpOyAvKiBGSVhNRTogQ29ycmVjdCBhcmdzICovCnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBQYWdlU2V0dXBEbGdXKShMUFBBR0VTRVRVUERMR1cpOwpzdGF0aWMgQk9PTCAgICAoV0lOQVBJICpwUHJpbnREbGdXKShMUFBSSU5URExHVyk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBHZXRPcGVuRmlsZU5hbWVXKShMUE9QRU5GSUxFTkFNRVcpOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpwU0hHZXRJbnN0YW5jZUV4cGxvcmVyKShMUFVOS05PV04gKik7CnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBHZXRGaWxlVmVyc2lvbkluZm9TaXplVykoTFBDV1NUUixMUERXT1JEKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcEdldEZpbGVWZXJzaW9uSW5mb1cpKExQQ1dTVFIsRFdPUkQsRFdPUkQsTFBWT0lEKTsKc3RhdGljIFdPUkQgICAgKFdJTkFQSSAqcFZlclF1ZXJ5VmFsdWVXKShMUFZPSUQsTFBDV1NUUixMUFZPSUQqLFVJTlQqKTsKCi8qCiBOT1RFUzogTW9zdCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgb3JkaW5hbCBzZWVtIHRvIGJlIHN1cGVyZmxvdXMuCiBUaGUgcmVhc29uIGZvciB0aGVzZSBmdW5jdGlvbnMgdG8gYmUgdGhlcmUgaXMgdG8gcHJvdmlkZSBhIHdyYXBlcgogZm9yIHVuaWNvZGUgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlc2UgZnVuY3Rpb25zIG9uIHN5c3RlbXMgd2l0aG91dAogdW5pY29kZSBmdW5jdGlvbnMgZWcuIHdpbjk1L3dpbjk4LiBTaW5jZSB3ZSBoYXZlIHN1Y2ggZnVuY3Rpb25zIHdlIGp1c3QKIGNhbGwgdGhlc2UuIElmIHJ1bm5pbmcgV2luZSB3aXRoIG5hdGl2ZSBETEwncywgc29tZSBsYXRlIGJvdW5kIGNhbGxzIG1heQogZmFpbC4gSG93ZXZlciwgaXRzIGJldHRlciB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgZm9yd2FyZCBETEwKIGFuZCByZWNvbW1lbmQgdGhlIGJ1aWx0aW4gcmF0aGVyIHRoYW4gcmVpbXBsZW1lbnRpbmcgdGhlIGNhbGxzIGhlcmUhCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMV0KICoKICogSWRlbnRpZmllcyB0aGUgSW50ZXJuZXQgInNjaGVtZSIgaW4gdGhlIHBhc3NlZCBzdHJpbmcuIEFTQ0lJIGJhc2VkLgogKiBBbHNvIGRldGVybWluZXMgc3RhcnQgYW5kIGxlbmd0aCBvZiBpdGVtIGFmdGVyIHRoZSAnOicKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzEgKExQQ1NUUiB4LCBVTktOT1dOX1NITFdBUElfMSAqeSkKewogICAgRFdPUkQgY250OwogICAgY29uc3QgU0hMXzJfaW5ldF9zY2hlbWUgKmluZXRfcHJvOwoKICAgIGlmICh5LT5zaXplICE9IDB4MTgpIHJldHVybiBFX0lOVkFMSURBUkc7CiAgICAvKiBGSVhNRTogbGVhZGluZyB3aGl0ZSBzcGFjZSBnZW5lcmF0ZXMgZXJyb3Igb2YgMHg4MDA0MTAwMSB3aGljaCAKICAgICAqICAgICAgICBpcyB1bmRlZmluZWQKICAgICAqLwogICAgaWYgKCp4IDw9ICcgJykgcmV0dXJuIDB4ODAwNDEwMDE7CiAgICBjbnQgPSAwOwogICAgeS0+c2l6ZXAxID0gMDsKICAgIHktPmFwMSA9IHg7CiAgICB3aGlsZSAoKngpIHsKCWlmICgqeCA9PSAnOicpIHsKCSAgICB5LT5zaXplcDEgPSBjbnQ7CgkgICAgY250ID0gLTE7CgkgICAgeS0+YXAyID0geCsxOwoJICAgIGJyZWFrOwoJfQoJeCsrOwoJY250Kys7CiAgICB9CgogICAgLyogY2hlY2sgZm9yIG5vIHNjaGVtZSBpbiBzdHJpbmcgc3RhcnQgKi8KICAgIC8qIChhcHBhcmVudGx5IHNjaGVtZXMgKm11c3QqIGJlIGxhcmdlciB0aGFuIGEgc2luZ2xlIGNoYXJhY3RlcikgICovCiAgICBpZiAoKCp4ID09ICdcMCcpIHx8ICh5LT5zaXplcDEgPD0gMSkpIHsKCXktPmFwMSA9IDA7CglyZXR1cm4gMHg4MDA0MTAwMTsKICAgIH0KCiAgICAvKiBmb3VuZCBzY2hlbWUsIHNldCBsZW5ndGggb2YgcmVtYWluZGVyICovCiAgICB5LT5zaXplcDIgPSBsc3RybGVuQSh5LT5hcDIpOwoKICAgIC8qIHNlZSBpZiBrbm93biBzY2hlbWUgYW5kIHJldHVybiBpbmRpY2F0b3IgbnVtYmVyICovCiAgICB5LT5mY25jZGUgPSBVUkxfU0NIRU1FX1VOS05PV047CiAgICBpbmV0X3BybyA9IHNobHdhcGlfc2NoZW1lczsKICAgIHdoaWxlIChpbmV0X3Byby0+c2NoZW1lX25hbWUpIHsKCWlmICghc3RybmNhc2VjbXAoaW5ldF9wcm8tPnNjaGVtZV9uYW1lLCB5LT5hcDEsCgkJICAgIG1pbih5LT5zaXplcDEsIGxzdHJsZW5BKGluZXRfcHJvLT5zY2hlbWVfbmFtZSkpKSkgewoJICAgIHktPmZjbmNkZSA9IGluZXRfcHJvLT5zY2hlbWVfbnVtYmVyOwoJICAgIGJyZWFrOwoJfQoJaW5ldF9wcm8rKzsKICAgIH0KICAgIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMl0KICoKICogSWRlbnRpZmllcyB0aGUgSW50ZXJuZXQgInNjaGVtZSIgaW4gdGhlIHBhc3NlZCBzdHJpbmcuIFVOSUNPREUgYmFzZWQuCiAqIEFsc28gZGV0ZXJtaW5lcyBzdGFydCBhbmQgbGVuZ3RoIG9mIGl0ZW0gYWZ0ZXIgdGhlICc6JwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMiAoTFBDV1NUUiB4LCBVTktOT1dOX1NITFdBUElfMiAqeSkKewogICAgRFdPUkQgY250OwogICAgY29uc3QgU0hMXzJfaW5ldF9zY2hlbWUgKmluZXRfcHJvOwogICAgTFBTVFIgY21wc3RyOwogICAgSU5UIGxlbjsKCiAgICBpZiAoeS0+c2l6ZSAhPSAweDE4KSByZXR1cm4gRV9JTlZBTElEQVJHOwogICAgLyogRklYTUU6IGxlYWRpbmcgd2hpdGUgc3BhY2UgZ2VuZXJhdGVzIGVycm9yIG9mIDB4ODAwNDEwMDEgd2hpY2gKICAgICAqICAgICAgICBpcyB1bmRlZmluZWQKICAgICAqLwogICAgaWYgKCp4IDw9IEwnICcpIHJldHVybiAweDgwMDQxMDAxOwogICAgY250ID0gMDsKICAgIHktPnNpemVwMSA9IDA7CiAgICB5LT5hcDEgPSB4OwogICAgd2hpbGUgKCp4KSB7CglpZiAoKnggPT0gTCc6JykgewoJICAgIHktPnNpemVwMSA9IGNudDsKCSAgICBjbnQgPSAtMTsKCSAgICB5LT5hcDIgPSB4KzE7CgkgICAgYnJlYWs7Cgl9Cgl4Kys7CgljbnQrKzsKICAgIH0KCiAgICAvKiBjaGVjayBmb3Igbm8gc2NoZW1lIGluIHN0cmluZyBzdGFydCAqLwogICAgLyogKGFwcGFyZW50bHkgc2NoZW1lcyAqbXVzdCogYmUgbGFyZ2VyIHRoYW4gYSBzaW5nbGUgY2hhcmFjdGVyKSAgKi8KICAgIGlmICgoKnggPT0gTCdcMCcpIHx8ICh5LT5zaXplcDEgPD0gMSkpIHsKCXktPmFwMSA9IDA7CglyZXR1cm4gMHg4MDA0MTAwMTsKICAgIH0KCiAgICAvKiBmb3VuZCBzY2hlbWUsIHNldCBsZW5ndGggb2YgcmVtYWluZGVyICovCiAgICB5LT5zaXplcDIgPSBsc3RybGVuVyh5LT5hcDIpOwoKICAgIC8qIHNlZSBpZiBrbm93biBzY2hlbWUgYW5kIHJldHVybiBpbmRpY2F0b3IgbnVtYmVyICovCiAgICBsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKDAsIDAsIHktPmFwMSwgeS0+c2l6ZXAxLCAwLCAwLCAwLCAwKTsKICAgIGNtcHN0ciA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuKzEpOwogICAgV2lkZUNoYXJUb011bHRpQnl0ZSgwLCAwLCB5LT5hcDEsIHktPnNpemVwMSwgY21wc3RyLCBsZW4rMSwgMCwgMCk7CiAgICB5LT5mY25jZGUgPSBVUkxfU0NIRU1FX1VOS05PV047CiAgICBpbmV0X3BybyA9IHNobHdhcGlfc2NoZW1lczsKICAgIHdoaWxlIChpbmV0X3Byby0+c2NoZW1lX25hbWUpIHsKCWlmICghc3RybmNhc2VjbXAoaW5ldF9wcm8tPnNjaGVtZV9uYW1lLCBjbXBzdHIsCgkJICAgIG1pbihsZW4sIGxzdHJsZW5BKGluZXRfcHJvLT5zY2hlbWVfbmFtZSkpKSkgewoJICAgIHktPmZjbmNkZSA9IGluZXRfcHJvLT5zY2hlbWVfbnVtYmVyOwoJICAgIGJyZWFrOwoJfQoJaW5ldF9wcm8rKzsKICAgIH0KICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNtcHN0cik7CiAgICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQAlbU0hMV0FQSS4zXQogKgogKiBEZXRlcm1pbmUgaWYgYSBmaWxlIGV4aXN0cyBsb2NhbGx5IGFuZCBpcyBvZiBhbiBleGVjdXRhYmxlIHR5cGUuCiAqCiAqIFBBUkFNUwogKiAgbHBzekZpbGUgICAgICAgW09dIEZpbGUgdG8gc2VhcmNoIGZvcgogKiAgZHdXaGljaCAgICAgICAgW0ldIFR5cGUgb2YgZXhlY3V0YWJsZSB0byBzZWFyY2ggZm9yCiAqCiAqIFJFVFVSTlMKICogIFRSVUUgIElmIHRoZSBmaWxlIHdhcyBmb3VuZC4gbHBzekZpbGUgY29udGFpbnMgdGhlIGZpbGUgbmFtZS4KICogIEZBTFNFIE90aGVyd2lzZS4KICoKICogTk9URVMKICogIGxwc3pQYXRoIGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCBtdXN0IGJlIGF0IGxlYXN0IE1BWF9QQVRIIGluIGxlbmd0aC4KICogIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIEZBTFNFLCB0aGUgcGF0aCBpcyBtb2RpZmllZCB0byBpdHMgb3JnaW5hbCBzdGF0ZS4KICogIElmIHRoZSBnaXZlbiBwYXRoIGNvbnRhaW5zIGFuIGV4dGVuc2lvbiBvciBkd1doaWNoIGlzIDAsIGV4ZWN1dGFibGUKICogIGV4dGVuc2lvbnMgYXJlIG5vdCBjaGVja2VkLgogKgogKiAgT3JkaW5hbHMgMy02IGFyZSBhIGNsYXNzaWMgY2FzZSBvZiBNUyBleHBvc2luZyBsaW1pdGVkIGZ1bmN0aW9uYWxpdHkgdG8KICogIHVzZXJzIChoZXJlIHRocm91Z2ggUGF0aEZpbmRPblBhdGgpIGFuZCBrZWVwaW5nIGFkdmFuY2VkIGZ1bmN0aW9uYWxpdHkgZm9yCiAqICB0aGVpciBvd24gZGV2ZWxvcGVycyBleGNsdXNpdmUgdXNlLiBNb25vcG9seSwgYW55b25lPwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zKExQU1RSIGxwc3pGaWxlLERXT1JEIGR3V2hpY2gpCnsKICByZXR1cm4gU0hMV0FQSV9QYXRoRmluZExvY2FsRXhlQShscHN6RmlsZSxkd1doaWNoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQAlbU0hMV0FQSS40XQogKgogKiBVbmljb2RlIHZlcnNpb24gb2YgU0hMV0FQSV8zLgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV80KExQV1NUUiBscHN6RmlsZSxEV09SRCBkd1doaWNoKQp7CiAgcmV0dXJuIFNITFdBUElfUGF0aEZpbmRMb2NhbEV4ZVcobHBzekZpbGUsZHdXaGljaCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAJW1NITFdBUEkuNV0KICoKICogU2VhcmNoIGEgcmFuZ2Ugb2YgcGF0aHMgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiBleGVjdXRhYmxlLgogKgogKiBQQVJBTVMKICogIGxwc3pGaWxlICAgICAgIFtPXSBGaWxlIHRvIHNlYXJjaCBmb3IKICogIGxwcHN6T3RoZXJEaXJzIFtJXSBPdGhlciBkaXJlY3RvcmllcyB0byBsb29rIGluCiAqICBkd1doaWNoICAgICAgICBbSV0gVHlwZSBvZiBleGVjdXRhYmxlIHRvIHNlYXJjaCBmb3IKICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVFJVRS4gVGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgaXMgc3RvcmVkIGluIHNGaWxlLgogKiAgRmFpbHVyZTogRkFMU0UuIFRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIGlzIHVuY2hhbmdlZC4KICovCkJPT0wgV0lOQVBJIFNITFdBUElfNShMUFNUUiBscHN6RmlsZSxMUENTVFIgKmxwcHN6T3RoZXJEaXJzLERXT1JEIGR3V2hpY2gpCnsKICByZXR1cm4gU0hMV0FQSV9QYXRoRmluZE9uUGF0aEV4QShscHN6RmlsZSxscHBzek90aGVyRGlycyxkd1doaWNoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQAlbU0hMV0FQSS42XQogKgogKiBVbmljb2RlIHZlcnNpb24gb2YgU0hMV0FQSV81LgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV82KExQV1NUUiBscHN6RmlsZSxMUENXU1RSICpscHBzek90aGVyRGlycyxEV09SRCBkd1doaWNoKQp7CiAgcmV0dXJuIFNITFdBUElfUGF0aEZpbmRPblBhdGhFeFcobHBzekZpbGUsbHBwc3pPdGhlckRpcnMsZHdXaGljaCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITFdBUElfRHVwU2hhcmVkSGFuZGxlCiAqCiAqIEludGVybmFsIGltcGxlbWV0YXRpb24gb2YgU0hMV0FQSV8xMS4KICovCnN0YXRpYwpIU0hBUkVEIFdJTkFQSSBTSExXQVBJX0R1cFNoYXJlZEhhbmRsZShIU0hBUkVEIGhTaGFyZWQsIERXT1JEIGR3RHN0UHJvY0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1NyY1Byb2NJZCwgRFdPUkQgZHdBY2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3T3B0aW9ucykKewogIEhBTkRMRSBoRHN0LCBoU3JjOwogIERXT1JEIGR3TXlQcm9jSWQgPSBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7CiAgSFNIQVJFRCBoUmV0ID0gKEhTSEFSRUQpTlVMTDsKCiAgVFJBQ0UoIiglcCwlbGQsJWxkLCUwOGx4LCUwOGx4KVxuIiwgKFBWT0lEKWhTaGFyZWQsIGR3RHN0UHJvY0lkLCBkd1NyY1Byb2NJZCwKICAgICAgICBkd0FjY2VzcywgZHdPcHRpb25zKTsKCiAgLyogR2V0IGRlc3QgcHJvY2VzcyBoYW5kbGUgKi8KICBpZiAoZHdEc3RQcm9jSWQgPT0gZHdNeVByb2NJZCkKICAgIGhEc3QgPSBHZXRDdXJyZW50UHJvY2VzcygpOwogIGVsc2UKICAgIGhEc3QgPSBPcGVuUHJvY2VzcyhQUk9DRVNTX0RVUF9IQU5ETEUsIDAsIGR3RHN0UHJvY0lkKTsKCiAgaWYgKGhEc3QpCiAgewogICAgLyogR2V0IHNyYyBwcm9jZXNzIGhhbmRsZSAqLwogICAgaWYgKGR3U3JjUHJvY0lkID09IGR3TXlQcm9jSWQpCiAgICAgIGhTcmMgPSBHZXRDdXJyZW50UHJvY2VzcygpOwogICAgZWxzZQogICAgICBoU3JjID0gT3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLCAwLCBkd1NyY1Byb2NJZCk7CgogICAgaWYgKGhTcmMpCiAgICB7CiAgICAgIC8qIE1ha2UgaGFuZGxlIGF2YWlsYWJsZSB0byBkZXN0IHByb2Nlc3MgKi8KICAgICAgaWYgKCFEdXBsaWNhdGVIYW5kbGUoaERzdCwgKEhBTkRMRSloU2hhcmVkLCBoU3JjLCAmaFJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdBY2Nlc3MsIDAsIGR3T3B0aW9ucyB8IERVUExJQ0FURV9TQU1FX0FDQ0VTUykpCiAgICAgICAgaFJldCA9IChIU0hBUkVEKU5VTEw7CgogICAgICBpZiAoZHdTcmNQcm9jSWQgIT0gZHdNeVByb2NJZCkKICAgICAgICBDbG9zZUhhbmRsZShoU3JjKTsKICAgIH0KCiAgICBpZiAoZHdEc3RQcm9jSWQgIT0gZHdNeVByb2NJZCkKICAgICAgQ2xvc2VIYW5kbGUoaERzdCk7CiAgfQoKICBUUkFDRSgiUmV0dXJuaW5nIGhhbmRsZSAlcFxuIiwgKFBWT0lEKWhSZXQpOwogIHJldHVybiBoUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAICBbU0hMV0FQSS43XQogKgogKiBDcmVhdGUgYSBibG9jayBvZiBzaGFyYWJsZSBtZW1vcnkgYW5kIGluaXRpYWxpc2UgaXQgd2l0aCBkYXRhLgogKgogKiBQQVJBTVMKICogZHdQcm9jSWQgW0ldIElEIG9mIHByb2Nlc3Mgb3duaW5nIGRhdGEKICogbHB2RGF0YSAgW0ldIFBvaW50ZXIgdG8gZGF0YSB0byB3cml0ZQogKiBkd1NpemUgICBbSV0gU2l6ZSBvZiBkYXRhCiAqCiAqIFJFVFVSTlMKICogU3VjY2VzczogQSBzaGFyZWQgbWVtb3J5IGhhbmRsZQogKiBGYWlsdXJlOiBOVUxMCiAqCiAqIE5PVEVTCiAqIE9yZGluYWxzIDctMTEgcHJvdmlkZSBhIHNldCBvZiBjYWxscyB0byBjcmVhdGUgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIGEKICogZ3JvdXAgb2YgcHJvY2Vzc2VzLiBUaGUgc2hhcmVkIG1lbW9yeSBpcyB0cmVhdGVkIG9wYXF1ZWx5IGluIHRoYXQgaXRzIHNpemUKICogaXMgbm90IGV4cG9zZWQgdG8gY2xpZW50cyB3aG8gbWFwIGl0LiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nCiAqIHRoZSBzaXplIG9mIHRoZSBtYXAgYXMgdGhlIGZpcnN0IERXT1JEIG9mIG1hcHBlZCBkYXRhLCBhbmQgdGhlbiBvZmZzZXR0aW5nCiAqIHRoZSB2aWV3IHBvaW50ZXIgcmV0dXJuZWQgYnkgdGhpcyBzaXplLgogKgogKiBTSExXQVBJXzcvU0hMV0FQSV8xMCAtIENyZWF0ZS9EZXN0cm95IHRoZSBzaGFyZWQgbWVtb3J5IGhhbmRsZQogKiBTSExXQVBJXzgvU0hMV0FQSV85ICAtIEdldC9SZWxlYXNlIGEgcG9pbnRlciB0byB0aGUgc2hhcmVkIGRhdGEKICogU0hMV0FQSV8xMSAgICAgICAgICAgLSBIZWxwZXIgZnVuY3Rpb247IER1cGxpY2F0ZSBjcm9zcy1wcm9jZXNzIGhhbmRsZXMKICAgKi8KSFNIQVJFRCBXSU5BUEkgU0hMV0FQSV83IChEV09SRCBkd1Byb2NJZCwgRFdPUkQgZHdTaXplLCBMUENWT0lEIGxwdkRhdGEpCnsKICBIQU5ETEUgaE1hcDsKICBMUFZPSUQgcE1hcHBlZDsKICBIU0hBUkVEIGhSZXQgPSAoSFNIQVJFRClOVUxMOwoKICBUUkFDRSgiKCVsZCwlcCwlbGQpXG4iLCBkd1Byb2NJZCwgbHB2RGF0YSwgZHdTaXplKTsKCiAgLyogQ3JlYXRlIGZpbGUgbWFwcGluZyBvZiB0aGUgY29ycmVjdCBsZW5ndGggKi8KICBoTWFwID0gQ3JlYXRlRmlsZU1hcHBpbmdBKElOVkFMSURfSEFORExFX1ZBTFVFLCBOVUxMLCBGSUxFX01BUF9SRUFELCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTaXplICsgc2l6ZW9mKGR3U2l6ZSksIE5VTEwpOwogIGlmICghaE1hcCkKICAgIHJldHVybiBoUmV0OwoKICAvKiBHZXQgYSB2aWV3IGluIG91ciBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UgKi8KICBwTWFwcGVkID0gTWFwVmlld09mRmlsZShoTWFwLCBGSUxFX01BUF9SRUFEIHwgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDApOwoKICBpZiAocE1hcHBlZCkKICB7CiAgICAvKiBXcml0ZSBzaXplIG9mIGRhdGEsIGZvbGxvd2VkIGJ5IHRoZSBkYXRhLCB0byB0aGUgdmlldyAqLwogICAgKigoRFdPUkQqKXBNYXBwZWQpID0gZHdTaXplOwogICAgaWYgKGR3U2l6ZSkKICAgICAgbWVtY3B5KChjaGFyICopIHBNYXBwZWQgKyBzaXplb2YoZHdTaXplKSwgbHB2RGF0YSwgZHdTaXplKTsKCiAgICAvKiBSZWxlYXNlIHZpZXcuIEFsbCBmdXJ0aGVyIHZpZXdzIG1hcHBlZCB3aWxsIGJlIG9wYXF1ZSAqLwogICAgVW5tYXBWaWV3T2ZGaWxlKHBNYXBwZWQpOwogICAgaFJldCA9IFNITFdBUElfRHVwU2hhcmVkSGFuZGxlKChIU0hBUkVEKWhNYXAsIGR3UHJvY0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzSWQoKSwgRklMRV9NQVBfQUxMX0FDQ0VTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpOwogIH0KCiAgQ2xvc2VIYW5kbGUoaE1hcCk7CiAgcmV0dXJuIGhSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAgW1NITFdBUEkuOF0KICoKICogR2V0IGEgcG9pbnRlciB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgZnJvbSBhIHNoYXJlZCBtZW1vcnkgaGFuZGxlLgogKgogKiBQQVJBTVMKICogaFNoYXJlZCAgW0ldIFNoYXJlZCBtZW1vcnkgaGFuZGxlCiAqIGR3UHJvY0lkIFtJXSBJRCBvZiBwcm9jZXNzIG93bmluZyBoU2hhcmVkCiAqCiAqIFJFVFVSTlMKICogU3VjY2VzczogQSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgbWVtb3J5CiAqIEZhaWx1cmU6IE5VTEwKICoKICogTk9URVMKICogU2VlIFNITFdBUElfNy4KICAgKi8KUFZPSUQgV0lOQVBJIFNITFdBUElfOCAoSFNIQVJFRCBoU2hhcmVkLCBEV09SRCBkd1Byb2NJZCkKICB7CiAgSFNIQVJFRCBoRHVwOwogIExQVk9JRCBwTWFwcGVkOwoKICBUUkFDRSgiKCVwICVsZClcbiIsIChQVk9JRCloU2hhcmVkLCBkd1Byb2NJZCk7CgogIC8qIEdldCBoYW5kbGUgdG8gc2hhcmVkIG1lbW9yeSBmb3IgY3VycmVudCBwcm9jZXNzICovCiAgaER1cCA9IFNITFdBUElfRHVwU2hhcmVkSGFuZGxlKGhTaGFyZWQsIGR3UHJvY0lkLCBHZXRDdXJyZW50UHJvY2Vzc0lkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfTUFQX0FMTF9BQ0NFU1MsIDApOwogIC8qIEdldCBWaWV3ICovCiAgcE1hcHBlZCA9IE1hcFZpZXdPZkZpbGUoKEhBTkRMRSloRHVwLCBGSUxFX01BUF9SRUFEIHwgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDApOwogIENsb3NlSGFuZGxlKGhEdXApOwoKICBpZiAocE1hcHBlZCkKICAgIHJldHVybiAoY2hhciAqKSBwTWFwcGVkICsgc2l6ZW9mKERXT1JEKTsgLyogSGlkZSBzaXplICovCiAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAgW1NITFdBUEkuOV0KICoKICogUmVsZWFzZSBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LgogKgogKiBQQVJBTVMKICogbHBWaWV3IFtJXSBTaGFyZWQgbWVtb3J5IHBvaW50ZXIKICoKICogUkVUVVJOUwogKiBTdWNjZXNzOiBUUlVFCiAqIEZhaWx1cmU6IEZBTFNFCiAqCiAqIE5PVEVTCiAqIFNlZSBTSExXQVBJXzcuCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzkgKExQVk9JRCBscFZpZXcpCnsKICBUUkFDRSgiKCVwKVxuIiwgbHBWaWV3KTsKICByZXR1cm4gVW5tYXBWaWV3T2ZGaWxlKChjaGFyICopIGxwVmlldyAtIHNpemVvZihEV09SRCkpOyAvKiBJbmNsdWRlIHNpemUgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQCBbU0hMV0FQSS4xMF0KICoKICogRGVzdHJveSBhIGJsb2NrIG9mIHNoYXJhYmxlIG1lbW9yeS4KICoKICogUEFSQU1TCiAqIGhTaGFyZWQgIFtJXSBTaGFyZWQgbWVtb3J5IGhhbmRsZQogKiBkd1Byb2NJZCBbSV0gSUQgb2YgcHJvY2VzcyBvd25pbmcgaFNoYXJlZAogKgogKiBSRVRVUk5TCiAqIFN1Y2Nlc3M6IFRSVUUKICogRmFpbHVyZTogRkFMU0UKICoKICogTk9URVMKICogU2VlIFNITFdBUElfNy4KICovCkJPT0wgV0lOQVBJIFNITFdBUElfMTAgKEhTSEFSRUQgaFNoYXJlZCwgRFdPUkQgZHdQcm9jSWQpCnsKICBIU0hBUkVEIGhDbG9zZTsKCiAgVFJBQ0UoIiglcCAlbGQpXG4iLCAoUFZPSUQpaFNoYXJlZCwgZHdQcm9jSWQpOwoKICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBoYW5kbGUgZm9yIG91ciBwcm9jZXNzLCBjbG9zaW5nIHRoZSBzb3VyY2UgaGFuZGxlICovCiAgaENsb3NlID0gU0hMV0FQSV9EdXBTaGFyZWRIYW5kbGUoaFNoYXJlZCwgZHdQcm9jSWQsIEdldEN1cnJlbnRQcm9jZXNzSWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTLERVUExJQ0FURV9DTE9TRV9TT1VSQ0UpOwogIC8qIENsb3NlIGxvY2FsIGNvcHkgKi8KICByZXR1cm4gQ2xvc2VIYW5kbGUoKEhBTkRMRSloQ2xvc2UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAICAgW1NITFdBUEkuMTFdCiAqCiAqIENvcHkgYSBzaGFyYWJsZSBtZW1vcnkgaGFuZGxlIGZyb20gb25lIHByb2Nlc3MgdG8gYW5vdGhlci4KICoKICogUEFSQU1TCiAqIGhTaGFyZWQgICAgIFtJXSBTaGFyZWQgbWVtb3J5IGhhbmRsZSB0byBkdXBsaWNhdGUKICogZHdEc3RQcm9jSWQgW0ldIElEIG9mIHRoZSBwcm9jZXNzIHdhbnRpbmcgdGhlIGR1cGxpY2F0ZWQgaGFuZGxlCiAqIGR3U3JjUHJvY0lkIFtJXSBJRCBvZiB0aGUgcHJvY2VzcyBvd25pbmcgaFNoYXJlZAogKiBkd0FjY2VzcyAgICBbSV0gRGVzaXJlZCBEdXBsaWNhdGVIYW5kbGUgYWNjZXNzCiAqIGR3T3B0aW9ucyAgIFtJXSBEZXNpcmVkIER1cGxpY2F0ZUhhbmRsZSBvcHRpb25zCiAqCiAqIFJFVFVSTlMKICogU3VjY2VzczogQSBoYW5kbGUgc3VpdGFibGUgZm9yIHVzZSBieSB0aGUgZHdEc3RQcm9jSWQgcHJvY2Vzcy4KICogRmFpbHVyZTogQSBOVUxMIGhhbmRsZS4KICoKICogTk9URVMKICogU2VlIFNITFdBUElfNy4KICovCkhTSEFSRUQgV0lOQVBJIFNITFdBUElfMTEoSFNIQVJFRCBoU2hhcmVkLCBEV09SRCBkd0RzdFByb2NJZCwgRFdPUkQgZHdTcmNQcm9jSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdBY2Nlc3MsIERXT1JEIGR3T3B0aW9ucykKewogIEhTSEFSRUQgaFJldDsKCiAgaFJldCA9IFNITFdBUElfRHVwU2hhcmVkSGFuZGxlKGhTaGFyZWQsIGR3RHN0UHJvY0lkLCBkd1NyY1Byb2NJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdBY2Nlc3MsIGR3T3B0aW9ucyk7CiAgcmV0dXJuIGhSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xM10KICogKFVzZWQgYnkgSUU0IGR1cmluZyBzdGFydHVwKQogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xMyAoCglMUFZPSUQgdywKCUxQVk9JRCB4KQp7CglGSVhNRSgiKCVwICVwKXN0dWJcbiIsdyx4KTsKCXJldHVybiAxOwojaWYgMAoJLyogcHNldWRvIGNvZGUgZXh0cmFjdGVkIGZyb20gcmVsYXkgdHJhY2UgKi8KCVJlZ09wZW5LZXlBKEhLTE0sICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3NcXEFjZWVwdGVkIERvY3VtZW50cyIsICZuZXdrZXkpOwoJcmV0ID0gMDsKCWkgPSAwOwoJc2l6ZSA9IDA7Cgl3aGlsZSghcmV0KSB7CgkgICAgcmV0ID0gUmVnRW51bVZhbHVlQShuZXdrZXksIGksIGExLCBhMiwgMCwgYTMsIDAsIDApOwoJICAgIHNpemUgKz0gPz8/OwoJICAgIGkrKzsKCX0KCWIxID0gTG9jYWxBbGxvYygweDQwLCBzaXplKTsKCXJldCA9IDA7CglpID0gMDsKCXdoaWxlKCFyZXQpIHsKCSAgICByZXQgPSBSZWdFbnVtVmFsdWVBKG5ld2tleSwgaSwgYTEsIGEyLCAwLCBhMywgYTQsIGE1KTsKCSAgICBSZWdpc3RlckNsaXBCb2FyZEZvcm1hdEEoYTQpOwoJICAgIGkrKzsKCX0KCWh3bmQxID0gR2V0TW9kdWxlSGFuZGxlQSgiVVJMTU9OLkRMTCIpOwoJcHJvYyA9IEdldFByb2NBZGRyZXNzKGh3bmQxLCAiQ3JlYXRlRm9ybWF0RW51bWVyYXRvciIpOwoJSGVhcEFsbG9jKD8/LCAwLCAweDE0KTsKCUhlYXBBbGxvYyg/PywgMCwgMHg1MCk7CglMb2NhbEFsbG9jKDB4NDAsIDB4NzgpOwoJLyogRklYTUU6IGJhZCBzdHJpbmcgYmVsb3cgKi8KCWxzdHJsZW5XKEwie0QwRkNBNDIwLUQzRjUtMTFDRi1CMjExLTAwQUEwMDRBRTgzN30iKTsKCVN0ckNweVcoYTYsICBMIntEMEZDQTQyMC1EM0Y1LTExQ0YtQjIxMS0wMEFBMDA0QUU4Mzd9Iik7CgoJR2V0VGlja0NvdW50KCk7CglJc0JhZFJlYWRQdHIoYzEgPSAweDQwM2ZkMjEwLDQpOwoJSW50ZXJsb2NrZWRJbmNyZW1lbnQoYzErNCk7CglMb2NhbEZyZWUoYjEpOwoJUmVnQ2xvc2VLZXkobmV3a2V5KTsKCUlzQmFkUmVhZFB0cihjMSA9IDB4NDAzZmQyMTAsNCk7CglJbnRlcmxvY2tlZEluY3JlbWVudChjMSs0KTsKCglIZWFwQWxsb2MoNDAzNTAwMDAsMDAwMDAwMDAsMDAwMDAwMTQpIHJldHZhbD00MDNmZDBhODsKCUhlYXBBbGxvYyg0MDM1MDAwMCwwMDAwMDAwMCwwMDAwMDA1MCkgcmV0dmFsPTQwM2ZlYjQ0OwoJaHduZDEgPSBHZXRNb2R1bGVIYW5kbGVBKCJVUkxNT04uRExMIik7Cglwcm9jID0gR2V0UHJvY0FkZHJlc3MoaHduZDEsICJSZWdpc3RlckZvcm1hdEVudW1lcmF0b3IiKTsKCS8qIDB4MWE0MGM4OGMgaXMgaW4gVVJMTU9OLkRMTCBqdXN0IGJlZm9yZSBhYm92ZSBwcm9jCgkgKiBjb250ZW50IGlzIEwiX0VudW1GT1JNQVRFVENfIgoJICogbGFiZWwgaXMgZDEKCSAqLwogICAgICAgIElzQmFkUmVhZFB0cihkMSA9IDB4MWE0MGM4OGMsMDAwMDAwMDIpOwoJbHN0cmxlblcoZDEpOwoJbHN0cmxlblcoZDEpOwoJSGVhcEFsbG9jKDQwMzUwMDAwLDAwMDAwMDAwLDAwMDAwMDFlKSByZXR2YWw9NDAzZmVkNDQ7CglJc0JhZFJlYWRQdHIoZDIgPSAweDQwM2ZkMGE4LDAwMDAwMDA0KTsKCUludGVybG9ja2VkSW5jcmVtZW50KGQyKzQpOwoJSXNCYWRSZWFkUHRyKGQyID0gMHg0MDNmZDBhOCwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChkMis0KTsKCUlzQmFkUmVhZFB0cihjMSwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChjMSs0KTsKCUlzQmFkUmVhZFB0cihjMSwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChjMSs0KTsKCiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTRdCiAqCiAqIEZ1bmN0aW9uOgogKiAgICBSZXRyaWV2ZXMgSUUgIkFjY2VwdExhbmd1YWdlIiB2YWx1ZSBmcm9tIHJlZ2lzdHJ5LiBBU0NJSSBtb2RlLgogKiAgCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzE0ICgKCUxQU1RSIGxhbmdidWYsCglMUERXT1JEIGJ1ZmxlbikKewoJQ0hBUiAqbXlzdHI7CglEV09SRCBteXN0cmxlbiwgbXl0eXBlOwoJSEtFWSBteWtleTsKCUxDSUQgbXlsY2lkOwoKCW15c3RybGVuID0gKCpidWZsZW4gPiA2KSA/ICpidWZsZW4gOiA2OwoJbXlzdHIgPSAoQ0hBUiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIAoJCQkJIEhFQVBfWkVST19NRU1PUlksIG15c3RybGVuKTsKCVJlZ09wZW5LZXlBKEhLRVlfQ1VSUkVOVF9VU0VSLCAKCQkgICAgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXEludGVybmV0IEV4cGxvcmVyXFxJbnRlcm5hdGlvbmFsIiwgCgkJICAgICZteWtleSk7CglpZiAoUmVnUXVlcnlWYWx1ZUV4QShteWtleSwgIkFjY2VwdExhbmd1YWdlIiwgCgkJCSAgICAgIDAsICZteXR5cGUsIG15c3RyLCAmbXlzdHJsZW4pKSB7CgkgICAgLyogRGlkIG5vdCBmaW5kIHZhbHVlICovCgkgICAgbXlsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICAgLyogc29tZWhvdyB0aGUgbXlsY2lkIHRyYW5zbGF0ZXMgaW50byAiZW4tdXMiCgkgICAgICogIHRoaXMgaXMgc2ltaWxhciB0byAiTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSIKCSAgICAgKiAgd2hpY2ggY291bGQgYmUgZ290dGVuIHZpYSBHZXRMb2NhbGVJbmZvLgoJICAgICAqICBUaGUgb25seSBwcm9ibGVtIGlzIExPQ0FMRV9TQUJCUkVWTEFOR1VBR0UiIGlzCgkgICAgICogIGEgMyBjaGFyIHN0cmluZyAoZmlyc3QgMiBhcmUgY291bnRyeSBjb2RlIGFuZCB0aGlyZCBpcwoJICAgICAqICBsZXR0ZXIgZm9yICJzdWJsYW5ndWFnZSIsIHdoaWNoIGRvZXMgbm90IGNvbWUgY2xvc2UgdG8KCSAgICAgKiAgImVuLXVzIgoJICAgICAqLwoJICAgIGxzdHJjcHlBKG15c3RyLCAiZW4tdXMiKTsKCSAgICBteXN0cmxlbiA9IGxzdHJsZW5BKG15c3RyKTsKCX0KCWVsc2UgewoJICAgIC8qIGhhbmRsZSByZXR1cm5lZCBzdHJpbmcgKi8KCSAgICBGSVhNRSgibWlzc2luZyBjb2RlXG4iKTsKCX0KCWlmIChteXN0cmxlbiA+ICpidWZsZW4pIAoJICAgIGxzdHJjcHluQShsYW5nYnVmLCBteXN0ciwgKmJ1Zmxlbik7CgllbHNlIHsKCSAgICBsc3RyY3B5QShsYW5nYnVmLCBteXN0cik7CgkgICAgKmJ1ZmxlbiA9IGxzdHJsZW5BKGxhbmdidWYpOwoJfSAgICAgICAgCglSZWdDbG9zZUtleShteWtleSk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBteXN0cik7CglUUkFDRSgibGFuZ3VhZ2UgaXMgJXNcbiIsIGRlYnVnc3RyX2EobGFuZ2J1ZikpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNV0KICoKICogRnVuY3Rpb246CiAqICAgIFJldHJpZXZlcyBJRSAiQWNjZXB0TGFuZ3VhZ2UiIHZhbHVlIGZyb20gcmVnaXN0cnkuIFVOSUNPREUgbW9kZS4KICogIAogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNSAoCglMUFdTVFIgbGFuZ2J1ZiwKCUxQRFdPUkQgYnVmbGVuKQp7CglDSEFSICpteXN0cjsKCURXT1JEIG15c3RybGVuLCBteXR5cGU7CglIS0VZIG15a2V5OwoJTENJRCBteWxjaWQ7CgoJbXlzdHJsZW4gPSAoKmJ1ZmxlbiA+IDYpID8gKmJ1ZmxlbiA6IDY7CglteXN0ciA9IChDSEFSKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgCgkJCQkgSEVBUF9aRVJPX01FTU9SWSwgbXlzdHJsZW4pOwoJUmVnT3BlbktleUEoSEtFWV9DVVJSRU5UX1VTRVIsIAoJCSAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcSW50ZXJuZXQgRXhwbG9yZXJcXEludGVybmF0aW9uYWwiLCAKCQkgICAgJm15a2V5KTsKCWlmIChSZWdRdWVyeVZhbHVlRXhBKG15a2V5LCAiQWNjZXB0TGFuZ3VhZ2UiLCAKCQkJICAgICAgMCwgJm15dHlwZSwgbXlzdHIsICZteXN0cmxlbikpIHsKCSAgICAvKiBEaWQgbm90IGZpbmQgdmFsdWUgKi8KCSAgICBteWxjaWQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgICAvKiBzb21laG93IHRoZSBteWxjaWQgdHJhbnNsYXRlcyBpbnRvICJlbi11cyIKCSAgICAgKiAgdGhpcyBpcyBzaW1pbGFyIHRvICJMT0NBTEVfU0FCQlJFVkxBTkdOQU1FIgoJICAgICAqICB3aGljaCBjb3VsZCBiZSBnb3R0ZW4gdmlhIEdldExvY2FsZUluZm8uCgkgICAgICogIFRoZSBvbmx5IHByb2JsZW0gaXMgTE9DQUxFX1NBQkJSRVZMQU5HVUFHRSIgaXMKCSAgICAgKiAgYSAzIGNoYXIgc3RyaW5nIChmaXJzdCAyIGFyZSBjb3VudHJ5IGNvZGUgYW5kIHRoaXJkIGlzCgkgICAgICogIGxldHRlciBmb3IgInN1Ymxhbmd1YWdlIiwgd2hpY2ggZG9lcyBub3QgY29tZSBjbG9zZSB0bwoJICAgICAqICAiZW4tdXMiCgkgICAgICovCgkgICAgbHN0cmNweUEobXlzdHIsICJlbi11cyIpOwoJICAgIG15c3RybGVuID0gbHN0cmxlbkEobXlzdHIpOwoJfQoJZWxzZSB7CgkgICAgLyogaGFuZGxlIHJldHVybmVkIHN0cmluZyAqLwoJICAgIEZJWE1FKCJtaXNzaW5nIGNvZGVcbiIpOwoJfQoJUmVnQ2xvc2VLZXkobXlrZXkpOwoJKmJ1ZmxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoMCwgMCwgbXlzdHIsIC0xLCBsYW5nYnVmLCAoKmJ1ZmxlbiktMSk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBteXN0cik7CglUUkFDRSgibGFuZ3VhZ2UgaXMgJXNcbiIsIGRlYnVnc3RyX3cobGFuZ2J1ZikpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNl0KICovCkhSRVNVTFQgV0lOQVBJIFNITFdBUElfMTYgKAoJTFBWT0lEIHcsCglMUFZPSUQgeCwKCUxQVk9JRCB5LAoJTFBXU1RSIHopCnsKCUZJWE1FKCIoJXAgJXAgJXAgJXApc3R1YlxuIix3LHgseSx6KTsKCXJldHVybiAweGFiYmExMjUyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMThdCiAqCiAqICB3IGlzIHBvaW50ZXIgdG8gYWRkcmVzcyBvZiBjYWxsYmFjayByb3V0aW5lCiAqICB4IGlzIHBvaW50ZXIgdG8gTFBWT0lEIHRvIHJlY2VpdmUgYWRkcmVzcyBvZiBsb2NhbGx5IGFsbG9jYXRlZAogKiAgICAgICAgIHNwYWNlIHNpemUgMHgxNAogKiAgcmV0dXJuIGlzIDAgKHVubGVzcyBvdXQgb2YgbWVtb3J5Pz8/KQogKgogKiByZWxhdGVkIHRvIF8xOSwgXzIxIGFuZCBfMjIgYmVsb3cKICogIG9ubHkgc2VlbiBpbnZva2VkIGJ5IFNIRE9DVlcKICovCkxPTkcgV0lOQVBJIFNITFdBUElfMTggKAoJTFBWT0lEICp3LAoJTFBWT0lEIHgpCnsKCUZJWE1FKCIoJXAgJXApc3R1YlxuIix3LHgpOwoJKigoTFBEV09SRCl4KSA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE5XQogKgogKiAgdyBpcyBhZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBfMjEKICogIHJldHVybiBpcyAwICh1bmxlc3Mgb3V0IG9mIG1lbW9yeT8/PykKICoKICogcmVsYXRlZCB0byBfMTgsIF8yMSBhbmQgXzIyIGJlbG93CiAqICBvbmx5IHNlZW4gaW52b2tlZCBieSBTSERPQ1ZXCiAqLwpMT05HIFdJTkFQSSBTSExXQVBJXzE5ICgKCUxQVk9JRCB3KQp7CglGSVhNRSgiKCVwKSBzdHViXG4iLHcpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMV0KICoKICogIHcgcG9pbnRzIHRvIHNwYWNlIGFsbG9jYXRlZCB2aWEgLjE4IGFib3ZlCiAqICAgICAgTG9jYWxTaXplIGlzIGRvbmUgb24gaXQgKHJldHJpZXZlcyAxOCkKICogICAgICBMb2NhbFJlQWxsb2MgaXMgZG9uZSBvbiBpdCB0byBzaXplIDggd2l0aCBMTUVNX01PVkVBQkxFICYgTE1FTV9aRVJPSU5JVAogKiAgeCB2YWx1ZXMgc2VlbiAweGEwMDAwMDA1CiAqICByZXR1cm5zIDEKICoKICogIHJlbGF0ZXMgdG8gXzE4LCBfMTkgYW5kIF8yMiBhYm92ZSBhbmQgYmVsb3cKICogICBvbmx5IHNlZW4gaW52b2tlZCBieSBTSERPQ1ZXCiAqLwpMT05HIFdJTkFQSSBTSExXQVBJXzIxICgKCUxQVk9JRCB3LAoJRFdPUkQgIHgpCnsKCUZJWE1FKCIoJXAgJWx4KXN0dWJcbiIsdyx4KTsKCXJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjJdCiAqCiAqICByZXR1cm4gaXMgJ3cnIHZhbHVlIHNlZW4gaW4geCBpcyAweGEwMDAwMDA1CiAqCiAqICByZWxhdGVzIHRvIF8xOCwgXzE5IGFuZCBfMjEgYWJvdmUKICogICBvbmx5IHNlZW4gaW52b2tlZCBieSBTSERPQ1ZXCiAqLwpMUFZPSUQgV0lOQVBJIFNITFdBUElfMjIgKAoJTFBWT0lEIHcsCglEV09SRCAgeCkKewoJRklYTUUoIiglcCAlbHgpc3R1YlxuIix3LHgpOwoJcmV0dXJuIHc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yM10KICoKICogTk9URVMKICoJY29udmVydHMgYSBndWlkIHRvIGEgc3RyaW5nCiAqCXJldHVybnMgc3RybGVuKHN0cikKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIzICgKCVJFRkdVSUQgZ3VpZCwJLyogW2luXSAgY2xzaWQgKi8KCUxQU1RSIHN0ciwJLyogW291dF0gYnVmZmVyICovCglJTlQgY21heCkJLyogW2luXSAgc2l6ZSBvZiBidWZmZXIgKi8KewoJY2hhciB4Z3VpZFs0MF07CgogICAgICAgIHNwcmludGYoIHhndWlkLCAieyUwOGx4LSUwNHgtJTA0eC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9IiwKICAgICAgICAgICAgICAgICBndWlkLT5EYXRhMSwgZ3VpZC0+RGF0YTIsIGd1aWQtPkRhdGEzLAogICAgICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzBdLCBndWlkLT5EYXRhNFsxXSwgZ3VpZC0+RGF0YTRbMl0sIGd1aWQtPkRhdGE0WzNdLAogICAgICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzRdLCBndWlkLT5EYXRhNFs1XSwgZ3VpZC0+RGF0YTRbNl0sIGd1aWQtPkRhdGE0WzddICk7CglUUkFDRSgiKCVzICVwIDB4JTA4eClzdHViXG4iLCB4Z3VpZCwgc3RyLCBjbWF4KTsKCWlmIChzdHJsZW4oeGd1aWQpPj1jbWF4KSByZXR1cm4gMDsKCXN0cmNweShzdHIseGd1aWQpOwoJcmV0dXJuIHN0cmxlbih4Z3VpZCkgKyAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjRdCiAqCiAqIE5PVEVTCiAqCWNvbnZlcnRzIGEgZ3VpZCB0byBhIHN0cmluZwogKglyZXR1cm5zIHN0cmxlbihzdHIpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yNCAoCglSRUZHVUlEIGd1aWQsCS8qIFtpbl0gIGNsc2lkICovCglMUFdTVFIgc3RyLAkvKiBbb3V0XSBidWZmZXIgKi8KCUlOVCBjbWF4KQkvKiBbaW5dICBzaXplIG9mIGJ1ZmZlciAqLwp7CiAgICBjaGFyIHhndWlkWzQwXTsKCiAgICBzcHJpbnRmKCB4Z3VpZCwgInslMDhseC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4fSIsCiAgICAgICAgICAgICBndWlkLT5EYXRhMSwgZ3VpZC0+RGF0YTIsIGd1aWQtPkRhdGEzLAogICAgICAgICAgICAgZ3VpZC0+RGF0YTRbMF0sIGd1aWQtPkRhdGE0WzFdLCBndWlkLT5EYXRhNFsyXSwgZ3VpZC0+RGF0YTRbM10sCiAgICAgICAgICAgICBndWlkLT5EYXRhNFs0XSwgZ3VpZC0+RGF0YTRbNV0sIGd1aWQtPkRhdGE0WzZdLCBndWlkLT5EYXRhNFs3XSApOwogICAgcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgeGd1aWQsIC0xLCBzdHIsIGNtYXggKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI1XQogKgogKiBTZWVtcyB0byBiZSBpc3dhbHBoYQogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yNShXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9BTFBIQSkgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI2XQogKgogKiBTZWVtcyB0byBiZSBpc3d1cHBlcgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yNihXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9VUFBFUikgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI3XQogKgogKiBTZWVtcyB0byBiZSBpc3dsb3dlcgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yNyhXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9MT1dFUikgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI4XQogKgogKiBTZWVtcyB0byBiZSBpc3dhbG51bQogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yOChXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiAoQzFfQUxQSEF8QzFfRElHSVQpKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjldCiAqCiAqIFNlZW1zIHRvIGJlIGlzd3NwYWNlCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzI5KFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX1NQQUNFKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzBdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd2JsYW5rCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMwKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX0JMQU5LKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzFdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd3B1bmN0CiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMxKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX1BVTkNUKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzJdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd2NudHJsCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMyKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX0NOVFJMKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzNdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd2RpZ2l0CiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMzKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX0RJR0lUKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzRdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd3hkaWdpdAogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zNChXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9YRElHSVQpICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNV0KICoKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzUoTFBWT0lEIHAxLCBEV09SRCBkdzIsIExQVk9JRCBwMykKewogICAgRklYTUUoIiglcCwgMHglMDhseCwgJXApOiBzdHViXG4iLCBwMSwgZHcyLCBwMyk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM2XQogKgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zNihITUVOVSBoMSwgVUlOVCB1aTIsIFVJTlQgaDMsIExQQ1dTVFIgcDQpCnsKICAgIFRSQUNFKCIoMHglMDh4LCAweCUwOHgsIDB4JTA4eCwgJXMpOiBzdHViXG4iLCAKCSAgaDEsIHVpMiwgaDMsIGRlYnVnc3RyX3cocDQpKTsKICAgIHJldHVybiBBcHBlbmRNZW51VyhoMSwgdWkyLCBoMywgcDQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNzRdCiAqCiAqIEdldCB0aGUgdGV4dCBmcm9tIGEgZ2l2ZW4gZGlhbG9nIGl0ZW0uCiAqLwpJTlQgV0lOQVBJIFNITFdBUElfNzQoSFdORCBoV25kLCBJTlQgbkl0ZW0sIExQV1NUUiBscHNEZXN0LElOVCBuRGVzdExlbikKewogIEhXTkQgaEl0ZW0gPSBHZXREbGdJdGVtKGhXbmQsIG5JdGVtKTsKCiAgaWYgKGhJdGVtKQogICAgcmV0dXJuIEdldFdpbmRvd1RleHRXKGhJdGVtLCBscHNEZXN0LCBuRGVzdExlbik7CiAgaWYgKG5EZXN0TGVuKQogICAgKmxwc0Rlc3QgPSAoV0NIQVIpJ1wwJzsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1MV0KICogRnVuY3Rpb246ICBDb21wYXJlIHR3byBBU0NJSSBzdHJpbmdzIGZvciAibGVuIiBieXRlcy4KICogUmV0dXJuczogICAqc3RyMS0qc3RyMiAgKGNhc2Ugc2Vuc2l0aXZlKQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTUxKExQU1RSIHN0cjEsIExQU1RSIHN0cjIsIElOVCBsZW4pCnsKICAgIHJldHVybiBzdHJuY21wKCBzdHIxLCBzdHIyLCBsZW4gKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1Ml0KICoKICogRnVuY3Rpb246ICBDb21wYXJlIHR3byBXSURFIHN0cmluZ3MgZm9yICJsZW4iIGJ5dGVzLgogKiBSZXR1cm5zOiAgICpzdHIxLSpzdHIyICAoY2FzZSBzZW5zaXRpdmUpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTIoTFBXU1RSIHN0cjEsIExQV1NUUiBzdHIyLCBJTlQgbGVuKQp7CiAgICByZXR1cm4gc3RybmNtcFcoIHN0cjEsIHN0cjIsIGxlbiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTUzXQogKiBGdW5jdGlvbjogIENvbXBhcmUgdHdvIEFTQ0lJIHN0cmluZ3MgZm9yICJsZW4iIGJ5dGVzIHZpYSBjYXNlbGVzcyBjb21wYXJlLgogKiBSZXR1cm5zOiAgICpzdHIxLSpzdHIyICAoY2FzZSBpbnNlbnNpdGl2ZSkKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1MyhMUFNUUiBzdHIxLCBMUFNUUiBzdHIyLCBEV09SRCBsZW4pCnsKICAgIHJldHVybiBzdHJuY2FzZWNtcCggc3RyMSwgc3RyMiwgbGVuICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNTRdCiAqCiAqIEZ1bmN0aW9uOiAgQ29tcGFyZSB0d28gV0lERSBzdHJpbmdzIGZvciAibGVuIiBieXRlcyB2aWEgY2FzZWxlc3MgY29tcGFyZS4KICogUmV0dXJuczogICAqc3RyMS0qc3RyMiAgKGNhc2UgaW5zZW5zaXRpdmUpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTQoTFBXU1RSIHN0cjEsIExQV1NUUiBzdHIyLCBEV09SRCBsZW4pCnsKICAgIHJldHVybiBzdHJuY21waVcoIHN0cjEsIHN0cjIsIGxlbiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTU1XQogKgogKglDYXNlIHNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyZSAoQVNDSUkpLiBEb2VzIG5vdCBTZXRMYXN0RXJyb3IoKS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1NSAoIExQU1RSIHN0cjEsIExQU1RSIHN0cjIpCnsKICAgIHJldHVybiBzdHJjbXAoc3RyMSwgc3RyMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNTZdCiAqCiAqCUNhc2Ugc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJlLiBEb2VzIG5vdCBTZXRMYXN0RXJyb3IoKS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1NiAoIExQV1NUUiBzdHIxLCBMUFdTVFIgc3RyMikKewogICAgcmV0dXJuIHN0cmNtcFcoIHN0cjEsIHN0cjIgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1OF0KICoKICoJQ2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyZS4gRG9lcyBub3QgU2V0TGFzdEVycm9yKCkuID8/CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTggKCBMUFdTVFIgc3RyMSwgTFBXU1RSIHN0cjIpCnsKICAgIHJldHVybiBzdHJjbXBpVyggc3RyMSwgc3RyMiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTYyXQogKgogKiBFbnN1cmUgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyIHN0cmluZyBkb2Vzbid0IGVuZCBpbiBhIGhhbmdpbmcgbGVhZCBieXRlLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTYyKExQU1RSIGxwU3RyLCBEV09SRCBzaXplKQp7CiAgaWYgKGxwU3RyICYmIHNpemUpCiAgewogICAgTFBTVFIgbGFzdEJ5dGUgPSBscFN0ciArIHNpemUgLSAxOwoKICAgIHdoaWxlKGxwU3RyIDwgbGFzdEJ5dGUpCiAgICAgIGxwU3RyICs9IElzREJDU0xlYWRCeXRlKCpscFN0cikgPyAyIDogMTsKCiAgICBpZihscFN0ciA9PSBsYXN0Qnl0ZSAmJiBJc0RCQ1NMZWFkQnl0ZSgqbHBTdHIpKQogICAgewogICAgICAqbHBTdHIgPSAnXDAnOwogICAgICBzaXplLS07CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKICB9CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNjRdCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNjQgKAoJTFBWT0lEIHUsCglMUFZPSUQgdiwKCUxQVk9JRCB3LAoJTFBWT0lEIHgsCglMUFZPSUQgeSwKCUxQVk9JRCB6KQp7CiAgICAgICAgVFJBQ0UoIiglcCAlcCAlcCAlcCAlcCAlcCkgc3R1YlxuIix1LHYsdyx4LHkseik7CglyZXR1cm4gMHg4MDAwNDAwMjsgICAgLyogRV9OT0lOVEVSRkFDRSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTY1XQogKgogKiBTZXRXaW5kb3dMb25nQSB3aXRoIG1hc2suCiAqLwpMT05HIFdJTkFQSSBTSExXQVBJXzE2NShIV05EIGh3bmQsIElOVCBvZmZzZXQsIFVJTlQgd0ZsYWdzLCBVSU5UIHdNYXNrKQp7CiAgTE9ORyByZXQgPSBHZXRXaW5kb3dMb25nQShod25kLCBvZmZzZXQpOwogIFVJTlQgbmV3RmxhZ3MgPSAod0ZsYWdzICYgd01hc2spIHwgKHJldCAmIH53RmxhZ3MpOwoKICBpZiAobmV3RmxhZ3MgIT0gcmV0KQogICAgcmV0ID0gU2V0V2luZG93TG9uZ0EoaHduZCwgb2Zmc2V0LCBuZXdGbGFncyk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE2OV0KICoKICogIERvIElVbmtub3duOjpSZWxlYXNlIG9uIHBhc3NlZCBvYmplY3QuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNjkgKElVbmtub3duICoqIGxwVW5rbm93bikKewogICAgICAgIElVbmtub3duICp0ZW1wOwoKCVRSQUNFKCIoJXApXG4iLGxwVW5rbm93bik7CglpZighbHBVbmtub3duIHx8ICEqKChMUERXT1JEKWxwVW5rbm93bikpIHJldHVybiAwOwoJdGVtcCA9ICpscFVua25vd247CgkqbHBVbmtub3duID0gTlVMTDsKCVRSQUNFKCJkb2luZyBSZWxlYXNlXG4iKTsKCXJldHVybiBJVW5rbm93bl9SZWxlYXNlKHRlbXApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTcwXQogKgogKiBTa2lwIFVSTCAnLy8nIHNlcXVlbmNlLgogKi8KTFBDU1RSIFdJTkFQSSBTSExXQVBJXzE3MChMUENTVFIgbHBzelNyYykKewogIGlmIChscHN6U3JjICYmIGxwc3pTcmNbMF0gPT0gJy8nICYmIGxwc3pTcmNbMV0gPT0gJy8nKQogICAgbHBzelNyYyArPSAyOwogIHJldHVybiBscHN6U3JjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTcyXQogKiBHZXQgd2luZG93IGhhbmRsZSBvZiBPTEUgb2JqZWN0CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNzIgKAoJSVVua25vd24gKnksICAgICAgIC8qIFtpbl0gICBPTEUgb2JqZWN0IGludGVyZmFjZSAqLwoJTFBIV05EIHopICAgICAgICAgIC8qIFtvdXRdICBsb2NhdGlvbiB0byBwdXQgd2luZG93IGhhbmRsZSAqLwp7CiAgICAgICAgRFdPUkQgcmV0OwoJSVVua25vd24gKnB2OwoKICAgICAgICBUUkFDRSgiKCVwICVwKVxuIix5LHopOwoJaWYgKCF5KSByZXR1cm4gRV9GQUlMOwoKCWlmICgocmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UoeSwgJklJRF9JT2xlV2luZG93LChMUFZPSUQgKikmcHYpKSA8IDApIHsKCSAgICAvKiBlcnJvciAqLwoJICAgIHJldHVybiByZXQ7Cgl9CglyZXQgPSBJT2xlV2luZG93X0dldFdpbmRvdygoSU9sZVdpbmRvdyAqKXB2LCB6KTsKCUlVbmtub3duX1JlbGVhc2UocHYpOwoJVFJBQ0UoInJlc3VsdCBod25kPSUwOHhcbiIsICp6KTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNzRdCiAqCiAqIFNlZW1zIHRvIGRvIGNhbGwgZWl0aGVyIElPYmplY3RXaXRoU2l0ZTo6U2V0U2l0ZSBvciAKICogICBJUGVyc2lzdE1vbmlrZXI6OkdldENsYXNzSUQuICBCdXQgc2luY2Ugd2UgZG8gbm90IGltcGxlbWVudCBlaXRoZXIKICogICBvZiB0aG9zZSBjbGFzc2VzIGluIG91ciBoZWFkZXJzLCB3ZSB3aWxsIGZha2UgaXQgb3V0LgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTc0KAoJSVVua25vd24gKnAxLCAgICAgLyogW2luXSAgIE9MRSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgTFBWT0lEICpwMikgICAgICAgLyogW291dF0gIHB0ciB0byByZXN1bHQgb2YgZWl0aGVyIEdldENsYXNzSUQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNldFNpdGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICovCnsKICAgIERXT1JEIHJldCwgYWE7CgogICAgaWYgKCFwMSkgcmV0dXJuIEVfRkFJTDsKCiAgICAvKiBzZWUgaWYgU2V0U2l0ZSBpbnRlcmZhY2UgZXhpc3RzIGZvciBJT2JqZWN0V2l0aFNpdGUgb2JqZWN0ICovCiAgICByZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZSgoSVVua25vd24gKilwMSwgKFJFRklJRClpZDEsIChMUFZPSUQgKikmcDEpOwogICAgVFJBQ0UoImZpcnN0IElVX1FJIHJldD0lMDhseCwgcDE9JXBcbiIsIHJldCwgcDEpOwogICAgaWYgKHJldCkgeyAKCgkvKiBzZWUgaWYgR2V0Q2xhc3NJZCBpbnRlcmZhY2UgZXhpc3RzIGZvciBJUGVyc2lzdE1vbmlrZXIgb2JqZWN0ICovCglyZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZSgoSVVua25vd24gKilwMSwgKFJFRklJRClpZDIsIChMUFZPSUQgKikmYWEpOwoJVFJBQ0UoInNlY29uZCBJVV9RSSByZXQ9JTA4bHgsIGFhPSUwOGx4XG4iLCByZXQsIGFhKTsKCWlmIChyZXQpIHJldHVybiByZXQ7CgoJLyogZmFrZSBhIEdldENsYXNzSWQgY2FsbCAqLwoJcmV0ID0gSU9sZVdpbmRvd19HZXRXaW5kb3coKElPbGVXaW5kb3cgKilhYSwgKEhXTkQqKXAyKTsKCVRSQUNFKCJzZWNvbmQgSVVfUUkgZG9pbmcgMHgwYyByZXQ9JTA4bHgsICpwMj0lMDhseFxuIiwgcmV0LCAKCSAgICAgICooTFBEV09SRClwMik7CglJVW5rbm93bl9SZWxlYXNlKChJVW5rbm93biAqKWFhKTsKICAgIH0KICAgIGVsc2UgewoJLyogZmFrZSBhIFNldFNpdGUgY2FsbCAqLwoJcmV0ID0gSU9sZVdpbmRvd19HZXRXaW5kb3coKElPbGVXaW5kb3cgKilwMSwgKEhXTkQqKXAyKTsKCVRSQUNFKCJmaXJzdCBJVV9RSSBkb2luZyAweDBjIHJldD0lMDhseCwgKnAyPSUwOGx4XG4iLCByZXQsIAoJICAgICAgKihMUERXT1JEKXAyKTsKCUlVbmtub3duX1JlbGVhc2UoKElVbmtub3duICopcDEpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE3Nl0KICoKICogRnVuY3Rpb24gYXBwZWFycyB0byBiZSBpbnRlcmZhY2UgdG8gSVNlcnZpY2VQcm92aWRlcjo6UXVlcnlTZXJ2aWNlCiAqCiAqIE5PVEU6CiAqICAgcmV0dXJucyBFX05PSU5URVJGQUNFCiAqICAgICAgICAgICBFX0ZBSUwgIGlmIHcgPT0gMAogKiAgICAgICAgICAgU19PSyAgICBpZiBfMjE5IGNhbGxlZCBzdWNjZXNzZnVsbHkKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE3NiAoCglJVW5rbm93biogdW5rLCAgICAvKiBbaW5dICAgIG9iamVjdCB0byBnaXZlIFNlcnZpY2UgUHJvdmlkZXIgKi8KCVJFRkdVSUQgICBzaWQsICAgIC8qIFtpbl0gICAgU2VydmljZSBJRCAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIFJFRklJRCAgICByaWlkLCAgIC8qIFtpbl0gICAgRnVuY3Rpb24gcmVxdWVzdGVkICAgICAgICAgICAgICAqLwoJTFBWT0lEICAgICp6KSAgICAgLyogW291dF0gICBwbGFjZSB0byBzYXZlIGludGVyZmFjZSBwb2ludGVyICovCnsKICAgIERXT1JEIHJldDsKICAgIExQVk9JRCBhYTsKICAgICp6ID0gMDsKICAgIGlmICghdW5rKSByZXR1cm4gRV9GQUlMOwogICAgcmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UodW5rLCAmSUlEX0lTZXJ2aWNlUHJvdmlkZXIsICZhYSk7CiAgICBUUkFDRSgiZGlkIElVX1FJIHJldHZhbD0lMDhseCwgYWE9JXBcbiIsIHJldCwgYWEpOyAKICAgIGlmIChyZXQpIHJldHVybiByZXQ7CiAgICByZXQgPSBJU2VydmljZVByb3ZpZGVyX1F1ZXJ5U2VydmljZSgoSVNlcnZpY2VQcm92aWRlciAqKWFhLCBzaWQsIHJpaWQsIAoJCQkJCSh2b2lkICoqKXopOwogICAgVFJBQ0UoImRpZCBJU1BfUVMgcmV0dmFsPSUwOGx4LCAqej0lcFxuIiwgcmV0LCAoTFBWT0lEKSp6KTsgCiAgICBJVW5rbm93bl9SZWxlYXNlKChJVW5rbm93biopYWEpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE4MV0KICoKICoJRW5hYmxlIG9yIGRpc2FibGUgYSBtZW51IGl0ZW0uCiAqLwpVSU5UIFdJTkFQSSBTSExXQVBJXzE4MShITUVOVSBoTWVudSwgVUlOVCB3SXRlbUlELCBCT09MIGJFbmFibGUpCnsKICByZXR1cm4gRW5hYmxlTWVudUl0ZW0oaE1lbnUsIHdJdGVtSUQsIGJFbmFibGUgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE4M10KICoKICogUmVnaXN0ZXIgYSB3aW5kb3cgY2xhc3MgaWYgaXQgaXNuJ3QgYWxyZWFkeS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE4MyhXTkRDTEFTU0EgKnduZGNsYXNzKQp7CiAgV05EQ0xBU1NBIHdjYTsKICBpZiAoR2V0Q2xhc3NJbmZvQSh3bmRjbGFzcy0+aEluc3RhbmNlLCB3bmRjbGFzcy0+bHBzekNsYXNzTmFtZSwgJndjYSkpCiAgICByZXR1cm4gVFJVRTsKICByZXR1cm4gKERXT1JEKVJlZ2lzdGVyQ2xhc3NBKHduZGNsYXNzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE5M10KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE5MyAoKQp7CglIREMgaGRjOwoJRFdPUkQgcmV0OwoKCVRSQUNFKCIoKVxuIik7CgoJaGRjID0gR2V0REMoMCk7CglyZXQgPSBHZXREZXZpY2VDYXBzKGhkYywgQklUU1BJWEVMKSAqIEdldERldmljZUNhcHMoaGRjLCBQTEFORVMpOwoJUmVsZWFzZURDKDAsIGhkYyk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTk5XQogKgogKiBDb3B5IGludGVyZmFjZSBwb2ludGVyCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xOTkgKAoJSVVua25vd24gKipkZXN0LCAgIC8qIFtvdXRdIHBvaW50ZXIgdG8gY29weSBvZiBpbnRlcmZhY2UgcHRyICovCglJVW5rbm93biAqc3JjKSAgICAgLyogW2luXSAgaW50ZXJmYWNlIHBvaW50ZXIgKi8KewogICAgICAgIFRSQUNFKCIoJXAgJXApXG4iLGRlc3Qsc3JjKTsKCWlmICgqZGVzdCAhPSBzcmMpIHsKCSAgICBpZiAoKmRlc3QpCgkJSVVua25vd25fUmVsZWFzZSgqZGVzdCk7CgkgICAgaWYgKHNyYykgewoJCUlVbmtub3duX0FkZFJlZihzcmMpOwoJCSpkZXN0ID0gc3JjOwoJICAgIH0KCX0KCXJldHVybiA0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjA4XQogKgogKiBTb21lIHNvcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQgcHJvY2VzcyAtIGFzc29jaWF0ZWQgd2l0aCBfMjEwCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMDggKAoJRFdPUkQgICAgYSwKCURXT1JEICAgIGIsCglMUFZPSUQgICBjLAoJTFBWT0lEICAgZCwKCURXT1JEICAgIGUpCnsKICAgIEZJWE1FKCIoMHglMDhseCAweCUwOGx4ICVwICVwIDB4JTA4bHgpIHN0dWJcbiIsCgkgIGEsIGIsIGMsIGQsIGUpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMDldCiAqCiAqIFNvbWUgc29ydCBvZiBtZW1vcnkgbWFuYWdlbWVudCBwcm9jZXNzIC0gYXNzb2NpYXRlZCB3aXRoIF8yMDgKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIwOSAoCglMUFZPSUQgICBhKQp7CiAgICBGSVhNRSgiKCVwKSBzdHViXG4iLAoJICBhKTsKICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjEwXQogKgogKiBTb21lIHNvcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQgcHJvY2VzcyAtIGFzc29jaWF0ZWQgd2l0aCBfMjA4CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMTAgKAoJTFBWT0lEICAgYSwKCURXT1JEICAgIGIsCglMUFZPSUQgICBjKQp7CiAgICBGSVhNRSgiKCVwIDB4JTA4bHggJXApIHN0dWJcbiIsCgkgIGEsIGIsIGMpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMTFdCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMTEgKAoJTFBWT0lEICAgYSwKCURXT1JEICAgIGIpCnsKICAgIEZJWE1FKCIoJXAgMHglMDhseCkgc3R1YlxuIiwKCSAgYSwgYik7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxNV0KICoKICogTk9URVMKICogIGNoZWNrIG1lIQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjE1ICgKCUxQQ1NUUiBscFN0clNyYywKCUxQV1NUUiBscHdTdHJEZXN0LAoJaW50IGxlbikKewoJSU5UIGxlbl9hLCByZXQ7CgoJbGVuX2EgPSBsc3RybGVuQShscFN0clNyYyk7CglyZXQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKDAsIDAsIGxwU3RyU3JjLCBsZW5fYSwgbHB3U3RyRGVzdCwgbGVuKTsKCVRSQUNFKCIlcyAlcyAlZCwgcmV0PSVkXG4iLCAKCSAgICAgIGRlYnVnc3RyX2EobHBTdHJTcmMpLCBkZWJ1Z3N0cl93KGxwd1N0ckRlc3QpLCBsZW4sIHJldCk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjE4XQogKgogKiBXaWRlQ2hhclRvTXVsdGlCeXRlIHdpdGggbXVsdGkgbGFuZ3VhZ2Ugc3VwcG9ydC4KICovCklOVCBXSU5BUEkgU0hMV0FQSV8yMTgoVUlOVCBDb2RlUGFnZSwgTFBDV1NUUiBscFNyY1N0ciwgTFBTVFIgbHBEc3RTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgTFBJTlQgbHBuTXVsdGlDaGFyQ291bnQpCnsKICBXQ0hBUiBlbXB0eVdbXSA9IHsgJ1wwJyB9OwogIGludCBsZW4gLCByZXFMZW47CiAgTFBTVFIgbWVtOwoKICBpZiAoIWxwRHN0U3RyIHx8ICFscG5NdWx0aUNoYXJDb3VudCkKICAgIHJldHVybiAwOwoKICBpZiAoIWxwU3JjU3RyKQogICAgbHBTcmNTdHIgPSBlbXB0eVc7CgogICpscERzdFN0ciA9ICdcMCc7CgogIGxlbiA9IHN0cmxlblcobHBTcmNTdHIpICsgMTsKCiAgc3dpdGNoIChDb2RlUGFnZSkKICB7CiAgY2FzZSBDUF9XSU5VTklDT0RFOgogICAgQ29kZVBhZ2UgPSBDUF9VVEY4OyAvKiBGYWxsIHRocm91Z2guLi4gKi8KICBjYXNlIDB4MDAwMEMzNTA6IC8qIEZJWE1FOiBDUF8gI2RlZmluZSAqLwogIGNhc2UgQ1BfVVRGNzoKICBjYXNlIENQX1VURjg6CiAgICB7CiAgICAgIERXT1JEIGR3TW9kZSA9IDA7CiAgICAgIElOVCBuV2lkZUNoYXJDb3VudCA9IGxlbiAtIDE7CgogICAgICBHRVRfRlVOQyhwQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUsIG1sYW5nLCAiQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUiLCAwKTsKICAgICAgaWYgKCFwQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUoJmR3TW9kZSwgQ29kZVBhZ2UsIGxwU3JjU3RyLCAmbldpZGVDaGFyQ291bnQsIGxwRHN0U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscG5NdWx0aUNoYXJDb3VudCkpCiAgICAgICAgcmV0dXJuIDA7CgogICAgICBpZiAobldpZGVDaGFyQ291bnQgPCBsZW4gLSAxKQogICAgICB7CiAgICAgICAgbWVtID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAqbHBuTXVsdGlDaGFyQ291bnQpOwogICAgICAgIGlmICghbWVtKQogICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgICpscG5NdWx0aUNoYXJDb3VudCA9IDA7CgogICAgICAgIGlmIChwQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUoJmR3TW9kZSwgQ29kZVBhZ2UsIGxwU3JjU3RyLCAmbGVuLCBtZW0sIGxwbk11bHRpQ2hhckNvdW50KSkKICAgICAgICB7CiAgICAgICAgICBTSExXQVBJXzE2MiAobWVtLCAqbHBuTXVsdGlDaGFyQ291bnQpOwogICAgICAgICAgbHN0cmNweW5BKGxwRHN0U3RyLCBtZW0sICpscG5NdWx0aUNoYXJDb3VudCArIDEpOwogICAgICAgICAgcmV0dXJuICpscG5NdWx0aUNoYXJDb3VudCArIDE7CiAgICAgICAgfQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG1lbSk7CiAgICAgICAgcmV0dXJuICpscG5NdWx0aUNoYXJDb3VudDsKICAgICAgfQogICAgICBscERzdFN0clsqbHBuTXVsdGlDaGFyQ291bnRdID0gJ1wwJzsKICAgICAgcmV0dXJuICpscG5NdWx0aUNoYXJDb3VudDsKICAgIH0KICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBicmVhazsKICB9CgogIHJlcUxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGxwU3JjU3RyLCBsZW4sIGxwRHN0U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxwbk11bHRpQ2hhckNvdW50LCBOVUxMLCBOVUxMKTsKCiAgaWYgKCFyZXFMZW4gJiYgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKICB7CiAgICByZXFMZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBscFNyY1N0ciwgbGVuLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKICAgIGlmIChyZXFMZW4pCiAgICB7CiAgICAgIG1lbSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcmVxTGVuKTsKICAgICAgaWYgKG1lbSkKICAgICAgewogICAgICAgIHJlcUxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGxwU3JjU3RyLCBsZW4sIG1lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcUxlbiwgTlVMTCwgTlVMTCk7CgogICAgICAgIHJlcUxlbiA9IFNITFdBUElfMTYyKG1lbSwgKmxwbk11bHRpQ2hhckNvdW50KTsKICAgICAgICByZXFMZW4rKzsKCiAgICAgICAgbHN0cmNweW5BKGxwRHN0U3RyLCBtZW0sICpscG5NdWx0aUNoYXJDb3VudCk7CgogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG1lbSk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcUxlbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxN10KICoKICogSG1tLCBzb21lIHByb2dyYW0gdXNlZCBscG5NdWx0aUNoYXJDb3VudCA9PSAweDMgKGFuZCBscFNyY1N0ciB3YXMgIkMiKQogKiAtLT4gQ3Jhc2guIFNvbWV0aGluZyB3cm9uZyBoZXJlLgogKgogKiBJdCBzZWVtcyBmcm9tIE9FIHY1IHRoYXQgdGhlIHRoaXJkIHBhcmFtIGlzIHRoZSBjb3VudC4gKEdBIDExLzIwMDEpCiAqLwpJTlQgV0lOQVBJIFNITFdBUElfMjE3KExQQ1dTVFIgbHBTcmNTdHIsIExQU1RSIGxwRHN0U3RyLCBJTlQgTXVsdGlDaGFyQ291bnQpCnsKICAgIElOVCBteWludCA9IE11bHRpQ2hhckNvdW50OwoKICAgIHJldHVybiBTSExXQVBJXzIxOChDUF9BQ1AsIGxwU3JjU3RyLCBscERzdFN0ciwgJm15aW50KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxOV0KICoKICogU2VlbXMgdG8gYmUgInN1cGVyIiBRdWVyeUludGVyZmFjZS4gU3VwcGxpZWQgd2l0aCBhdCB0YWJsZSBvZiBpbnRlcmZhY2VzCiAqIGFuZCBhbiBhcnJheSBvZiBJSURzIGFuZCBvZmZzZXRzIGludG8gdGhlIHRhYmxlLgogKgogKiBOT1RFUwogKiAgZXJyb3IgY29kZXM6IEVfUE9JTlRFUiwgRV9OT0lOVEVSRkFDRQogKi8KdHlwZWRlZiBzdHJ1Y3QgewogICAgUkVGSUlEICAgcmVmaWQ7CiAgICBEV09SRCAgICBpbmR4Owp9IElGQUNFX0lOREVYX1RCTDsKCkhSRVNVTFQgV0lOQVBJIFNITFdBUElfMjE5ICgKCUxQVk9JRCB3LCAgICAgICAgICAgLyogW2luXSAgIHRhYmxlIG9mIGludGVyZmFjZXMgICAgICAgICAgICAgICAgICAgKi8KCUlGQUNFX0lOREVYX1RCTCAqeCwgLyogW2luXSAgIGFycmF5IG9mIFJFRklJRHMgYW5kIGluZGV4ZXMgdG8gYWJvdmUgKi8KCVJFRklJRCByaWlkLCAgICAgICAgLyogW2luXSAgIFJFRklJRCB0byBnZXQgaW50ZXJmYWNlIGZvciAgICAgICAgICAgKi8KCUxQVk9JRCAqeikgICAgICAgICAgLyogW291dF0gIGxvY2F0aW9uIHRvIGdldCBpbnRlcmZhY2UgcG9pbnRlciAgICAgKi8KewoJSFJFU1VMVCByZXQ7CglJVW5rbm93biAqYV92dGJsOwoJSUZBQ0VfSU5ERVhfVEJMICp4bW92ZTsKCglUUkFDRSgiKCVwICVwICVzICVwKVxuIiwKCSAgICAgIHcseCxkZWJ1Z3N0cl9ndWlkKHJpaWQpLHopOwoJaWYgKHopIHsKCSAgICB4bW92ZSA9IHg7CgkgICAgd2hpbGUgKHhtb3ZlLT5yZWZpZCkgewoJCVRSQUNFKCJ0cnlpbmcgKGluZHggJWxkKSAlc1xuIiwgeG1vdmUtPmluZHgsIAoJCSAgICAgIGRlYnVnc3RyX2d1aWQoeG1vdmUtPnJlZmlkKSk7CgkJaWYgKElzRXF1YWxJSUQocmlpZCwgeG1vdmUtPnJlZmlkKSkgewoJCSAgICBhX3Z0YmwgPSAoSVVua25vd24qKSh4bW92ZS0+aW5keCArIChMUEJZVEUpdyk7CgkJICAgIFRSQUNFKCJtYXRjaGVkLCByZXR1cm5pbmcgKCVwKVxuIiwgYV92dGJsKTsKCQkgICAgKnogPSAoTFBWT0lEKWFfdnRibDsKCQkgICAgSVVua25vd25fQWRkUmVmKGFfdnRibCk7CgkJICAgIHJldHVybiBTX09LOwoJCX0KCQl4bW92ZSsrOwoJICAgIH0KCgkgICAgaWYgKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpIHsKCQlhX3Z0YmwgPSAoSVVua25vd24qKSh4LT5pbmR4ICsgKExQQllURSl3KTsKCQlUUkFDRSgicmV0dXJuaW5nIGZpcnN0IGZvciBJVW5rbm93biAoJXApXG4iLCBhX3Z0YmwpOwoJCSp6ID0gKExQVk9JRClhX3Z0Ymw7CgkJSVVua25vd25fQWRkUmVmKGFfdnRibCk7CgkJcmV0dXJuIFNfT0s7CgkgICAgfQoJICAgICp6ID0gMDsKCSAgICByZXQgPSBFX05PSU5URVJGQUNFOwoJfSBlbHNlCgkgICAgcmV0ID0gRV9QT0lOVEVSOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIyMl0KICoKICogTk9URVMKICogIHNlY3VyaXR5YXR0cmlidXRlcyBtaXNzaW5nCiAqLwpIQU5ETEUgV0lOQVBJIFNITFdBUElfMjIyIChMUENMU0lEIGd1aWQpCnsKCWNoYXIgbHBzdHJOYW1lWzgwXTsKCiAgICAgICAgc3ByaW50ZiggbHBzdHJOYW1lLCAic2hlbGwueyUwOGx4LSUwNHgtJTA0eC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9IiwKICAgICAgICAgICAgICAgICBndWlkLT5EYXRhMSwgZ3VpZC0+RGF0YTIsIGd1aWQtPkRhdGEzLAogICAgICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzBdLCBndWlkLT5EYXRhNFsxXSwgZ3VpZC0+RGF0YTRbMl0sIGd1aWQtPkRhdGE0WzNdLAogICAgICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzRdLCBndWlkLT5EYXRhNFs1XSwgZ3VpZC0+RGF0YTRbNl0sIGd1aWQtPkRhdGE0WzddICk7CglGSVhNRSgiKCVzKSBzdHViXG4iLCBscHN0ck5hbWUpOwoJcmV0dXJuIENyZWF0ZVNlbWFwaG9yZUEoTlVMTCwwLCAweDdmZmZmZmZmLCBscHN0ck5hbWUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjIzXQogKgogKiBOT1RFUwogKiAgZ2V0IHRoZSBjb3VudCBvZiB0aGUgc2VtYXBob3JlCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMjMgKEhBTkRMRSBoYW5kbGUpCnsKCURXT1JEIG9sZENvdW50OwoKCUZJWE1FKCIoMHglMDh4KSBzdHViXG4iLGhhbmRsZSk7CgoJUmVsZWFzZVNlbWFwaG9yZSggaGFuZGxlLCAxLCAmb2xkQ291bnQpOwkvKiArMSAqLwoJV2FpdEZvclNpbmdsZU9iamVjdCggaGFuZGxlLCAwICk7CQkvKiAtMSAqLwoJcmV0dXJuIG9sZENvdW50Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjM2XQogKi8KSE1PRFVMRSBXSU5BUEkgU0hMV0FQSV8yMzYgKFJFRklJRCBscFVua25vd24pCnsKICAgIEhLRVkgbmV3a2V5OwogICAgRFdPUkQgdHlwZSwgY291bnQ7CiAgICBDSEFSIHZhbHVlW01BWF9QQVRIXSwgc3RyaW5nW01BWF9QQVRIXTsKCiAgICBzdHJjcHkoc3RyaW5nLCAiQ0xTSURcXCIpOwogICAgc3RyY2F0KHN0cmluZywgZGVidWdzdHJfZ3VpZChscFVua25vd24pKTsKICAgIHN0cmNhdChzdHJpbmcsICJcXEluUHJvY1NlcnZlcjMyIik7CgogICAgY291bnQgPSBNQVhfUEFUSDsKICAgIFJlZ09wZW5LZXlFeEEoSEtFWV9DTEFTU0VTX1JPT1QsIHN0cmluZywgMCwgMSwgJm5ld2tleSk7CiAgICBSZWdRdWVyeVZhbHVlRXhBKG5ld2tleSwgMCwgMCwgJnR5cGUsIHZhbHVlLCAmY291bnQpOwogICAgUmVnQ2xvc2VLZXkobmV3a2V5KTsKICAgIHJldHVybiBMb2FkTGlicmFyeUV4QSh2YWx1ZSwgMCwgMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMzddCiAqCiAqIFVuaWNvZGUgdmVyc2lvbiBvZiBTSExXQVBJXzE4My4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIzNyAoV05EQ0xBU1NXICogbHBXbmRDbGFzcykKewoJV05EQ0xBU1NXIFduZENsYXNzOwoKCVRSQUNFKCIoMHglMDh4ICVzKVxuIixscFduZENsYXNzLT5oSW5zdGFuY2UsIGRlYnVnc3RyX3cobHBXbmRDbGFzcy0+bHBzekNsYXNzTmFtZSkpOwoKCWlmIChHZXRDbGFzc0luZm9XKGxwV25kQ2xhc3MtPmhJbnN0YW5jZSwgbHBXbmRDbGFzcy0+bHBzekNsYXNzTmFtZSwgJlduZENsYXNzKSkKCQlyZXR1cm4gVFJVRTsKCXJldHVybiBSZWdpc3RlckNsYXNzVyhscFduZENsYXNzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIzOV0KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIzOShISU5TVEFOQ0UgaEluc3RhbmNlLCBMUFZPSUQgcDIsIERXT1JEIGR3MykKewogICAgRklYTUUoIigweCUwOHggJXAgMHglMDhseCkgc3R1YlxuIiwKCSAgaEluc3RhbmNlLCBwMiwgZHczKTsKICAgIHJldHVybiAwOwojaWYgMAogICAgLyogcHNldWRvIGNvZGUgZnJvbSByZWxheSB0cmFjZSAqLwogICAgV2lkZUNoYXJUb011bHRpQnl0ZSgwLCAwLCBMIlNoZWxsIERvY09iamVjdCBWaWV3IiwgLTEsICZhYSwgMHgwMjA3LCAwLCAwKTsKICAgIEdldENsYXNzSW5mb0EoNzBmZTAwMDAsNDA1ODY4ZWMgIlNoZWxsIERvY09iamVjdCBWaWV3Iiw0MDU4NmIxNCk7CiAgICAvKiBhYm92ZSBwYWlyIHJlcGVhdGVkIGZvcjoKICAgICAgICAgICBUcmlkZW50VGhpY2tldFVybERsQ2xhc3MKCSAgIFNoZWxsIEVtYmVkZGluZwoJICAgQ0lFU3BsYXNoU2NyZWVuCgkgICBJbmV0IE5vdGlmeV9IaWRkZW4KCSAgIE9DSG9zdAogICAgKi8KI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNDBdCiAqCiAqCUNhbGxzIEFTQ0lJIG9yIFVuaWNvZGUgV2luZG93UHJvYyBmb3IgdGhlIGdpdmVuIHdpbmRvdy4KICovCkxSRVNVTFQgQ0FMTEJBQ0sgU0hMV0FQSV8yNDAoSFdORCBoV25kLCBVSU5UIHVNZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CglpZiAoSXNXaW5kb3dVbmljb2RlKGhXbmQpKQoJCXJldHVybiBEZWZXaW5kb3dQcm9jVyhoV25kLCB1TWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwoJcmV0dXJuIERlZldpbmRvd1Byb2NBKGhXbmQsIHVNZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNDFdCiAqCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yNDEgKCkKewoJRklYTUUoIigpc3R1YlxuIik7CglyZXR1cm4gLyogMHhhYmJhMTI0MyAqLyAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjY2XQogKgogKiBuYXRpdmUgZG9lcyBhdCBsZWFzdCBhcHByb3hpbWF0ZWx5OgogKiAgICAgc3RyY3B5VyhuZXdzdHIsIHgpOwogKiAgICAgc3RyY2F0VyhuZXdzdHIsICJcXFJlc3RyaWN0aW9ucyIpOwogKiAgICAgaWYgKFJlZ09wZW5LZXlFeEEoODAwMDAwMDEsIG5ld3N0ciwgMDAwMDAwMDAsMDAwMDAwMDEsNDA1MjBiNzgpKQogKiAgICAgICAgcmV0dXJuIDA7CiAqICAgICp1bmtub3duKgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjY2ICgKCUxQVk9JRCB3LAoJTFBWT0lEIHgsICAgLyogW2luXSBwYXJ0aWFsIHJlZ2lzdHJ5IGtleSAqLwoJTFBWT0lEIHksCglMUFZPSUQgeikKewoJRklYTUUoIiglcCAlcCAlcCAlcClzdHViXG4iLHcseCx5LHopOwoJcmV0dXJuIC8qIDB4YWJiYTEyNDggKi8gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI2N10KICovCkhSRVNVTFQgV0lOQVBJIFNITFdBUElfMjY3ICgKCUxQVk9JRCB3LCAKCUxQVk9JRCB4LCAKCUxQVk9JRCB5LCAvKiBbPz8/XSBOT1RFOiBzYW1lIGFzIDNyZCBwYXJhbWV0ZXIgb2YgU0hMV0FQSV8yMTkgKi8KCUxQVk9JRCB6KSAvKiBbPz8/XSBOT1RFOiBzYW1lIGFzIDR0aCBwYXJhbWV0ZXIgb2YgU0hMV0FQSV8yMTkgKi8KewoJRklYTUUoIiglcCAlcCAlcCAlcClzdHViXG4iLHcseCx5LHopOwoKCS8qIG5hdGl2ZSBzZWVtcyB0byBkbzoKCSAqICBTSExXQVBJXzIxOSAoKExQVk9JRCkoKChMUFNUUil4KS00KSwgPz8/LCAoUkVGSUlEKSB5LCAoTFBWT0lEKikgeik7CgkgKi8KCgkqKChMUERXT1JEKXopID0gMHhhYmJhMTIwMDsKCXJldHVybiAvKiAweGFiYmExMjU0ICovIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNjhdCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yNjggKAoJTFBWT0lEIHcsCglMUFZPSUQgeCkKewoJRklYTUUoIiglcCAlcClcbiIsdyx4KTsKCXJldHVybiAweGFiYmExMjUxOyAvKiAwID0gZmFpbHVyZSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjc2XQogKgogKiBvbiBmaXJzdCBjYWxsIHByb2Nlc3MgZG9lcyBmb2xsb3dpbmc6ICBvdGhlciBjYWxscyBqdXN0IHJldHVybnMgMgogKiAgaW5zdGFuY2UgPSBMb2FkTGlicmFyeUEoIlNIRUxMMzIuRExMIik7CiAqICBmdW5jID0gR2V0UHJvY0FkZHJlc3MoaW5zdGFuY2UsICJEbGxHZXRWZXJzaW9uIik7CiAqICByZXQgPSBSZWdPcGVuS2V5RXhBKDgwMDAwMDAyLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcSW50ZXJuZXQgRXhwbG9yZXIiLDAwMDAwMDAwLDAwMDIwMDFmLCBuZXdrZXkpOwogKiAgcmV0ID0gUmVnUXVlcnlWYWx1ZUV4QShuZXdrZXksICJJbnRlZ3JhdGVkQnJvd3NlciIsMDAwMDAwMDAsMDAwMDAwMDAsNDA1MjU4OGMsNDA1MjU4OTApOwogKiAgUmVnQ2xvc2VLZXkobmV3a2V5KTsKICogIEZyZWVMaWJyYXJ5KGluc3RhbmNlKTsKICogIHJldHVybiAyOwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjc2ICgpCnsKCUZJWE1FKCIoKXN0dWJcbiIpOwoJcmV0dXJuIC8qIDB4YWJiYTEyNDQgKi8gMjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI3OF0KICoKICovCkhXTkQgV0lOQVBJIFNITFdBUElfMjc4ICgKCUxPTkcgd25kUHJvYywKCUhXTkQgaFduZFBhcmVudCwKCURXT1JEIGR3RXhTdHlsZSwKCURXT1JEIGR3U3R5bGUsCglITUVOVSBoTWVudSwKCUxPTkcgeikKewoJV05EQ0xBU1NBIHduZGNsYXNzOwoJSFdORCBod25kOwoJSENVUlNPUiBoQ3Vyc29yOwoJY2hhciAqIGNsc25hbWUgPSAiV29ya2VyQSI7CgoJRklYTUUoIigweCUwOGx4IDB4JTA4eCAweCUwOGx4IDB4JTA4bHggMHglMDh4IDB4JTA4bHgpIHBhcnRpYWwgc3R1YlxuIiwKCSAgd25kUHJvYyxoV25kUGFyZW50LGR3RXhTdHlsZSxkd1N0eWxlLGhNZW51LHopOwoKCWhDdXJzb3IgPSBMb2FkQ3Vyc29yQSgweDAwMDAwMDAwLElEQ19BUlJPV0EpOwoKCWlmKCFHZXRDbGFzc0luZm9BKHNobHdhcGlfaEluc3RhbmNlLCBjbHNuYW1lLCAmd25kY2xhc3MpKQoJewoJICBSdGxaZXJvTWVtb3J5KCZ3bmRjbGFzcywgc2l6ZW9mKFdORENMQVNTQSkpOwoJICB3bmRjbGFzcy5scGZuV25kUHJvYyA9IERlZldpbmRvd1Byb2NXOwoJICB3bmRjbGFzcy5jYlduZEV4dHJhID0gNDsKCSAgd25kY2xhc3MuaEluc3RhbmNlID0gc2hsd2FwaV9oSW5zdGFuY2U7CgkgIHduZGNsYXNzLmhDdXJzb3IgPSBoQ3Vyc29yOwoJICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gQ09MT1JfQlROU0hBRE9XOwoJICB3bmRjbGFzcy5scHN6TWVudU5hbWUgPSBOVUxMOwoJICB3bmRjbGFzcy5scHN6Q2xhc3NOYW1lID0gY2xzbmFtZTsKCSAgUmVnaXN0ZXJDbGFzc0EgKCZ3bmRjbGFzcyk7Cgl9Cglod25kID0gQ3JlYXRlV2luZG93RXhBKGR3RXhTdHlsZSwgY2xzbmFtZSwgMCxkd1N0eWxlLDAsMCwwLDAsaFduZFBhcmVudCwKCQloTWVudSxzaGx3YXBpX2hJbnN0YW5jZSwwKTsKCVNldFdpbmRvd0xvbmdBKGh3bmQsIDAsIHopOwoJU2V0V2luZG93TG9uZ0EoaHduZCwgR1dMX1dORFBST0MsIHduZFByb2MpOwoJcmV0dXJuIGh3bmQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yODldCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byB3aW5tbS5QbGF5U291bmRXCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzI4OShMUENXU1RSIHBzelNvdW5kLCBITU9EVUxFIGhtb2QsIERXT1JEIGZkd1NvdW5kKQp7CiAgR0VUX0ZVTkMocFBsYXlTb3VuZFcsIHdpbm1tLCAiUGxheVNvdW5kVyIsIEZBTFNFKTsKICByZXR1cm4gcFBsYXlTb3VuZFcocHN6U291bmQsIGhtb2QsIGZkd1NvdW5kKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI5NF0KICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjk0KExQU1RSIHN0cjEsIExQU1RSIHN0cjIsIExQU1RSIHBTdHIsIERXT1JEIHNvbWVfbGVuLCAgTFBDU1RSIGxwU3RyMikKewogICAgLyoKICAgICAqIHN0cjE6CQkiSSIJIkkiCXB1c2hsIGVzcCsweDIwCiAgICAgKiBzdHIyOgkJIlUiCSJJIglwdXNobCAweDc3YzkzODEwCiAgICAgKiAoaXMgIkkiIGFuZCAiVSIgImludGVnZXIiIGFuZCAidW5zaWduZWQiID8/KQogICAgICoKICAgICAqIHBTdHI6CQkiIgkiIglwdXNobCBlYXgKICAgICAqIHNvbWVfbGVuOgkweDgyNAkweDEwNAlwdXNobCAweDgyNAogICAgICogbHBTdHIyOgkJIiVsIgkiJWwiCXB1c2hsIGVzcCsweGMKICAgICAqCiAgICAgKiBzaGx3YXBpLiBTdHJDcHlOVyhscFN0cjIsIGlycmVsZXZhbnRfdmFyLCAweDEwNCk7CiAgICAgKiBMb2NhbEFsbG9jKDB4MDAsIHNvbWVfbGVuKSAtPiBpcnJlbGV2YW50X3ZhcgogICAgICogTG9jYWxBbGxvYygweDQwLCBpcnJlbGV2YW50X2xlbikgLT4gcFN0cgogICAgICogc2hsd2FwaS4yOTQoc3RyMSwgc3RyMiwgcFN0ciwgc29tZV9sZW4sIGxwU3RyMik7CiAgICAgKiBzaGx3YXBpLlBhdGhSZW1vdmVCbGFua3NXKHBTdHIpOwogICAgICovCiAgICBFUlIoIignJXMnLCAnJXMnLCAnJXMnLCAlMDhseCwgJyVzJyk6IHN0dWIhXG4iLCBzdHIxLCBzdHIyLCBwU3RyLCBzb21lX2xlbiwgbHBTdHIyKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzEzXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEdldEZpbGVJbmZvVwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzEzKExQQ1dTVFIgcGF0aCwgRFdPUkQgZHdGaWxlQXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgIFNIRklMRUlORk9XICpwc2ZpLCBVSU5UIHNpemVvZnBzZmksIFVJTlQgZmxhZ3MpCnsKICBHRVRfRlVOQyhwU0hHZXRGaWxlSW5mb1csIHNoZWxsMzIsICJTSEdldEZpbGVJbmZvVyIsIDApOwogIHJldHVybiBwU0hHZXRGaWxlSW5mb1cocGF0aCwgZHdGaWxlQXR0cmlidXRlcywgcHNmaSwgc2l6ZW9mcHNmaSwgZmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzE4XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5EcmFnUXVlcnlGaWxlVwogKi8KVUlOVCBXSU5BUEkgU0hMV0FQSV8zMTgoSERST1AgaERyb3AsIFVJTlQgbEZpbGUsIExQV1NUUiBscHN6RmlsZSwgVUlOVCBsTGVuZ3RoKQp7CiAgR0VUX0ZVTkMocERyYWdRdWVyeUZpbGVXLCBzaGVsbDMyLCAiRHJhZ1F1ZXJ5RmlsZVciLCAwKTsKICByZXR1cm4gcERyYWdRdWVyeUZpbGVXKGhEcm9wLCBsRmlsZSwgbHBzekZpbGUsIGxMZW5ndGgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzMzXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEJyb3dzZUZvckZvbGRlclcKICovCkxQSVRFTUlETElTVCBXSU5BUEkgU0hMV0FQSV8zMzMoTFBCUk9XU0VJTkZPVyBscEJpKQp7CiAgR0VUX0ZVTkMocFNIQnJvd3NlRm9yRm9sZGVyVywgc2hlbGwzMiwgIlNIQnJvd3NlRm9yRm9sZGVyVyIsIE5VTEwpOwogIHJldHVybiBwU0hCcm93c2VGb3JGb2xkZXJXKGxwQmkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzM0XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEdldFBhdGhGcm9tSURMaXN0VwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zMzQoTFBDSVRFTUlETElTVCBwaWRsLExQV1NUUiBwc3pQYXRoKQp7CiAgR0VUX0ZVTkMocFNIR2V0UGF0aEZyb21JRExpc3RXLCBzaGVsbDMyLCAiU0hHZXRQYXRoRnJvbUlETGlzdFciLCAwKTsKICByZXR1cm4gcFNIR2V0UGF0aEZyb21JRExpc3RXKHBpZGwsIHBzelBhdGgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzM1XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TaGVsbEV4ZWN1dGVFeFcKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzM1KExQU0hFTExFWEVDVVRFSU5GT1cgbHBFeGVjSW5mbykKewogIEdFVF9GVU5DKHBTaGVsbEV4ZWN1dGVFeFcsIHNoZWxsMzIsICJTaGVsbEV4ZWN1dGVFeFciLCBGQUxTRSk7CiAgcmV0dXJuIHBTaGVsbEV4ZWN1dGVFeFcobHBFeGVjSW5mbyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zMzZdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLlNIRmlsZU9wZXJhdGlvblcuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zMzYoTFBTSEZJTEVPUFNUUlVDVFcgbHBGaWxlT3ApCnsKICBHRVRfRlVOQyhwU0hGaWxlT3BlcmF0aW9uVywgc2hlbGwzMiwgIlNIRmlsZU9wZXJhdGlvblciLCAwKTsKICByZXR1cm4gcFNIRmlsZU9wZXJhdGlvblcobHBGaWxlT3ApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzM3XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5FeHRyYWN0SWNvbkV4Vy4KICovCkhJQ09OIFdJTkFQSSBTSExXQVBJXzMzNyhMUENXU1RSIGxwc3pGaWxlLCBJTlQgbkljb25JbmRleCwgSElDT04gKnBoaWNvbkxhcmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgSElDT04gKnBoaWNvblNtYWxsLCBVSU5UIG5JY29ucykKewogIEdFVF9GVU5DKHBFeHRyYWN0SWNvbkV4Vywgc2hlbGwzMiwgIkV4dHJhY3RJY29uRXhXIiwgKEhJQ09OKTApOwogIHJldHVybiBwRXh0cmFjdEljb25FeFcobHBzekZpbGUsIG5JY29uSW5kZXgsIHBoaWNvbkxhcmdlLCBwaGljb25TbWFsbCwgbkljb25zKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM0Ml0KICoKICovCkxPTkcgV0lOQVBJIFNISW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoIFBMT05HIGRlc3QsIExPTkcgeGNoZywgTE9ORyBjb21wYXJlKQp7CiAgICAgICAgcmV0dXJuIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKGRlc3QsIHhjaGcsIGNvbXBhcmUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzQ2XQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzQ2ICgKCUxQQ1dTVFIgc3JjLAoJTFBXU1RSIGRlc3QsCglpbnQgbGVuKQp7CglGSVhNRSgiKCVzICVwIDB4JTA4eClzdHViXG4iLGRlYnVnc3RyX3coc3JjKSxkZXN0LGxlbik7Cglsc3RyY3B5blcoZGVzdCwgc3JjLCBsZW4pOwoJcmV0dXJuIGxzdHJsZW5XKGRlc3QpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNTBdCiAqCiAqIHNlZW1zIHRvIGJlIGxhdGUgYm91bmQgY2FsbCB0byBHZXRGaWxlVmVyc2lvbkluZm9TaXplVwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzUwICgKCUxQV1NUUiB4LAoJTFBWT0lEIHkpCnsKICAgICAgICBEV09SRCByZXQ7CgoJR0VUX0ZVTkMocEdldEZpbGVWZXJzaW9uSW5mb1NpemVXLCB2ZXJzaW9uLCAiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVciLCAwKTsKCXJldCA9IHBHZXRGaWxlVmVyc2lvbkluZm9TaXplVyh4LCB5KTsKCXJldHVybiAweDIwOCArIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM1MV0KICoKICogc2VlbXMgdG8gYmUgbGF0ZSBib3VuZCBjYWxsIHRvIEdldEZpbGVWZXJzaW9uSW5mb1cKICovCkJPT0wgIFdJTkFQSSBTSExXQVBJXzM1MSAoCglMUFdTVFIgdywgICAvKiBbaW5dIHBhdGggdG8gZGxsICovCglEV09SRCAgeCwgICAvKiBbaW5dIHBhcm0gMiB0byBHZXRGaWxlVmVyc2lvbkluZm9BICovCglEV09SRCAgeSwgICAvKiBbaW5dIHJldHVybiB2YWx1ZSBmcm9tIC4zNTAgLSBhc3N1bWUgbGVuZ3RoICovCglMUFZPSUQgeikgICAvKiBbaW4vb3V0XSBidWZmZXIgKCsweDIwOCBzZW50IHRvIEdldEZpbGVWZXJzaW9uSW5mb0EpICovCnsKICAgIEdFVF9GVU5DKHBHZXRGaWxlVmVyc2lvbkluZm9XLCB2ZXJzaW9uLCAiR2V0RmlsZVZlcnNpb25JbmZvVyIsIDApOwogICAgcmV0dXJuIHBHZXRGaWxlVmVyc2lvbkluZm9XKHcsIHgsIHktMHgyMDgsIHorMHgyMDgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzUyXQogKgogKiBzZWVtcyB0byBiZSBsYXRlIGJvdW5kIGNhbGwgdG8gVmVyUXVlcnlWYWx1ZVcKICovCldPUkQgV0lOQVBJIFNITFdBUElfMzUyICgKCUxQVk9JRCB3LCAgIC8qIFtpbl0gYnVmZmVyIGZyb20gXzM1MSAqLwoJTFBXU1RSIHgsICAgLyogW2luXSAgIHZhbHVlIHRvIHJldHJpZXZlIC0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBhbmQgcGFzc2VkIHRvIFZlclF1ZXJ5VmFsdWVBIGFzICMyICovCglMUFZPSUQgeSwgICAvKiBbb3V0XSAgdmVyIGJ1ZmZlciAtIHBhc3NlZCB0byBWZXJRdWVyeVZhbHVlQSBhcyAjMyAqLwoJVUlOVCogIHopICAgLyogW2luXSAgIHZlciBsZW5ndGggLSBwYXNzZWQgdG8gVmVyUXVlcnlWYWx1ZUEgYXMgIzQgKi8KewogICAgR0VUX0ZVTkMocFZlclF1ZXJ5VmFsdWVXLCB2ZXJzaW9uLCAiVmVyUXVlcnlWYWx1ZVciLCAwKTsKICAgIHJldHVybiBwVmVyUXVlcnlWYWx1ZVcodysweDIwOCwgeCwgeSwgeik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAgICAgICAgW1NITFdBUEkuMzU2XQogKgogKiAgICAgIG1iYyAtIHRoaXMgZnVuY3Rpb24gaXMgdW5kb2N1bWVudGVkLCBUaGUgcGFyYW1ldGVycyBhcmUgY29ycmVjdCBhbmQgCiAqICAgICAgICAgICAgdGhlIGNhbGxzIHRvIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IgYW5kIAogKiAgICAgICAgICAgIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2wgYXJlIGNvcnJlY3QsIGJ1dCBhcHBhcmVudGx5IHNvbWUgCiAqICAgICAgICAgICAgYXBwcyBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhbGwgemVybyBwYXJhbWV0ZXJzLiAKICovCgpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNTYoUEFDTCBwRGFjbCwgUFNFQ1VSSVRZX0RFU0NSSVBUT1IgcFNELCBMUENTVFIgKnN0cikKewogIGlmKHN0ciAhPSAwKXsKICAgICpzdHIgPSAwOwogIH0KCiAgaWYoIXBEYWNsKXsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCFJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKHBTRCwgMSkpIHJldHVybiAwOwogIHJldHVybiBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKHBTRCwgMSwgcERhY2wsIDApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM1N10KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuU0hHZXROZXdMaW5rSW5mb1cKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzU3KExQQ1dTVFIgcHN6TGlua1RvLCBMUENXU1RSIHBzekRpciwgTFBXU1RSIHBzek5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnBmTXVzdENvcHksIFVJTlQgdUZsYWdzKQp7CiAgR0VUX0ZVTkMocFNIR2V0TmV3TGlua0luZm9XLCBzaGVsbDMyLCAiU0hHZXROZXdMaW5rSW5mb1ciLCBGQUxTRSk7CiAgcmV0dXJuIHBTSEdldE5ld0xpbmtJbmZvVyhwc3pMaW5rVG8sIHBzekRpciwgcHN6TmFtZSwgcGZNdXN0Q29weSwgdUZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM1OF0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuU0hEZWZFeHRyYWN0SWNvblcKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM1OChMUFZPSUQgYXJnMSwgTFBWT0lEIGFyZzIsIExQVk9JRCBhcmczLCBMUFZPSUQgYXJnNCwKICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBhcmc1LCBMUFZPSUQgYXJnNikKewogIEdFVF9GVU5DKHBTSERlZkV4dHJhY3RJY29uVywgc2hlbGwzMiwgIlNIRGVmRXh0cmFjdEljb25XIiwgMCk7CiAgcmV0dXJuIHBTSERlZkV4dHJhY3RJY29uVyhhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM2NF0KICoKICogV3JhcHBlciBmb3IgbHN0cmNweW5BIHdpdGggc3JjIGFuZCBkc3Qgc3dhcHBlZC4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM2NChMUENTVFIgc3JjLCBMUFNUUiBkc3QsIElOVCBuKQp7CiAgbHN0cmNweW5BKGRzdCwgc3JjLCBuKTsKICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM3MF0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuRXh0cmFjdEljb25XCiAqLwpISUNPTiBXSU5BUEkgU0hMV0FQSV8zNzAoSElOU1RBTkNFIGhJbnN0YW5jZSwgTFBDV1NUUiBscHN6RXhlRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG5JY29uSW5kZXgpCnsKICBHRVRfRlVOQyhwRXh0cmFjdEljb25XLCBzaGVsbDMyLCAiRXh0cmFjdEljb25XIiwgKEhJQ09OKTApOwogIHJldHVybiBwRXh0cmFjdEljb25XKGhJbnN0YW5jZSwgbHBzekV4ZUZpbGVOYW1lLCBuSWNvbkluZGV4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM3Nl0KICovCkxBTkdJRCBXSU5BUEkgU0hMV0FQSV8zNzYgKCkKewogICAgRklYTUUoIigpIHN0dWJcbiIpOwogICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgZm9yd2FyZCBpbiB0aGUgLnNwZWMgZmlsZSB0byB0aGUgd2luMmsgZnVuY3Rpb24KICAgICAqIGtlcm5lbDMyLkdldFVzZXJEZWZhdWx0VUlMYW5ndWFnZSwgaG93ZXZlciB0aGF0IGZ1bmN0aW9uIGlzbid0IHRoZXJlIHlldC4KICAgICAqLwogICAgcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNzddCiAqCiAqIEZJWE1FOiBOYXRpdmUgYXBwZWFycyB0byBkbyBEUEFfQ3JlYXRlIGFuZCBhIERQQV9JbnNlcnRQdHIgZm9yIAogKiAgICAgICAgZWFjaCBjYWxsIGhlcmUuCiAqIEZJWE1FOiBOYXRpdmUgc2hvd3MgY2FsbHMgdG86CiAqICBTSFJlZ0dldFVTVmFsdWUgZm9yICJTb2Z0d2FyZVxNaWNyb3NvZnRcSW50ZXJuZXQgRXhwbG9yZXJcSW50ZXJuYXRpb25hbCIKICogICAgICAgICAgICAgICAgICAgICAgQ2hlY2tWZXJzaW9uCiAqICBSZWdPcGVuS2V5RXhBIGZvciAiSEtMTVxTb2Z0d2FyZVxNaWNyb3NvZnRcSW50ZXJuZXQgRXhwbG9yZXIiCiAqICBSZWdRdWVyeVZhbHVlRXhBIGZvciAiTFBLSW5zdGFsbGVkIgogKiAgUmVnQ2xvc2VLZXkKICogIFJlZ09wZW5LZXlFeEEgZm9yICJIS0NVXFNvZnR3YXJlXE1pY3Jvc29mdFxJbnRlcm5ldCBFeHBsb3JlclxJbnRlcm5hdGlvbmFsIgogKiAgUmVnUXVlcnlWYWx1ZUV4QSBmb3IgIlJlc291cmNlTG9jYWxlIgogKiAgUmVnQ2xvc2VLZXkKICogIFJlZ09wZW5LZXlFeEEgZm9yICJIS0xNXFNvZnR3YXJlXE1pY3Jvc29mdFxBY3RpdmUgU2V0dXBcSW5zdGFsbGVkIENvbXBvbmVudHNce2d1aWR9IgogKiAgUmVnUXVlcnlWYWx1ZUV4QSBmb3IgIkxvY2FsZSIKICogIFJlZ0Nsb3NlS2V5CiAqICBhbmQgdGhlbiB0ZXN0cyB0aGUgTG9jYWxlICgiZW4iIGZvciBtZSkuCiAqICAgICBjb2RlIGJlbG93CiAqICBhZnRlciB0aGUgY29kZSB0aGVuIGEgRFBBX0NyZWF0ZSAoZmlyc3QgdGltZSkgYW5kIERQQV9JbnNlcnRQdHIgYXJlIGRvbmUuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNzcgKExQQ1NUUiBuZXdfbW9kLCBITU9EVUxFIGluc3RfaHduZCwgTFBWT0lEIHopCnsKICAgIENIQVIgbW9kX3BhdGhbMipNQVhfUEFUSF07CiAgICBMUFNUUiBwdHI7CgogICAgR2V0TW9kdWxlRmlsZU5hbWVBKGluc3RfaHduZCwgbW9kX3BhdGgsIDIqTUFYX1BBVEgpOwogICAgcHRyID0gc3RycmNocihtb2RfcGF0aCwgJ1xcJyk7CiAgICBpZiAocHRyKSB7CglzdHJjcHkocHRyKzEsIG5ld19tb2QpOwoJVFJBQ0UoImxvYWRpbmcgJXNcbiIsIGRlYnVnc3RyX2EobW9kX3BhdGgpKTsKCXJldHVybiAoRFdPUkQpTG9hZExpYnJhcnlBKG1vZF9wYXRoKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzc4XQogKgogKiAgVGhpcyBpcyBVbmljb2RlIHZlcnNpb24gb2YgLjM3NwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzc4ICgKCUxQQ1dTVFIgICBuZXdfbW9kLCAgICAgICAgICAvKiBbaW5dIG5ldyBtb2R1bGUgbmFtZSAgICAgICAgKi8KCUhNT0RVTEUgICBpbnN0X2h3bmQsICAgICAgICAvKiBbaW5dIGNhbGxpbmcgbW9kdWxlIGhhbmRsZSAgKi8KCUxQVk9JRCB6KSAgICAgICAgICAgICAgICAgICAvKiBbPz8/XSA0ICovCnsKICAgIFdDSEFSIG1vZF9wYXRoWzIqTUFYX1BBVEhdOwogICAgTFBXU1RSIHB0cjsKCiAgICBHZXRNb2R1bGVGaWxlTmFtZVcoaW5zdF9od25kLCBtb2RfcGF0aCwgMipNQVhfUEFUSCk7CiAgICBwdHIgPSBzdHJyY2hyVyhtb2RfcGF0aCwgJ1xcJyk7CiAgICBpZiAocHRyKSB7CglzdHJjcHlXKHB0cisxLCBuZXdfbW9kKTsKCVRSQUNFKCJsb2FkaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG1vZF9wYXRoKSk7CglyZXR1cm4gKERXT1JEKUxvYWRMaWJyYXJ5Vyhtb2RfcGF0aCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM4OV0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIGNvbWRsZzMyLkdldFNhdmVGaWxlTmFtZVcKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzg5KExQT1BFTkZJTEVOQU1FVyBvZm4pCnsKICBHRVRfRlVOQyhwR2V0U2F2ZUZpbGVOYW1lVywgY29tZGxnMzIsICJHZXRTYXZlRmlsZU5hbWVXIiwgRkFMU0UpOwogIHJldHVybiBwR2V0U2F2ZUZpbGVOYW1lVyhvZm4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzkwXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gbXByLldOZXRSZXN0b3JlQ29ubmVjdGlvblcKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM5MChMUFZPSUQgYXJnMSwgTFBWT0lEIGFyZzIpCnsKICBHRVRfRlVOQyhwV05ldFJlc3RvcmVDb25uZWN0aW9uVywgbXByLCAiV05ldFJlc3RvcmVDb25uZWN0aW9uVyIsIDApOwogIHJldHVybiBwV05ldFJlc3RvcmVDb25uZWN0aW9uVyhhcmcxLCBhcmcyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM5MV0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIG1wci5XTmV0R2V0TGFzdEVycm9yVwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzkxKExQVk9JRCBhcmcxLCBMUFZPSUQgYXJnMiwgTFBWT0lEIGFyZzMsIExQVk9JRCBhcmc0LAogICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGFyZzUpCnsKICBHRVRfRlVOQyhwV05ldEdldExhc3RFcnJvclcsIG1wciwgIldOZXRHZXRMYXN0RXJyb3JXIiwgMCk7CiAgcmV0dXJuIHBXTmV0R2V0TGFzdEVycm9yVyhhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQwMV0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIGNvbWRsZzMyLlBhZ2VTZXR1cERsZ1cKICovCkJPT0wgV0lOQVBJIFNITFdBUElfNDAxKExQUEFHRVNFVFVQRExHVyBwYWdlZGxnKQp7CiAgR0VUX0ZVTkMocFBhZ2VTZXR1cERsZ1csIGNvbWRsZzMyLCAiUGFnZVNldHVwRGxnVyIsIEZBTFNFKTsKICByZXR1cm4gcFBhZ2VTZXR1cERsZ1cocGFnZWRsZyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS40MDJdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBjb21kbGczMi5QcmludERsZ1cKICovCkJPT0wgV0lOQVBJIFNITFdBUElfNDAyKExQUFJJTlRETEdXIHByaW50ZGxnKQp7CiAgR0VUX0ZVTkMocFByaW50RGxnVywgY29tZGxnMzIsICJQcmludERsZ1ciLCBGQUxTRSk7CiAgcmV0dXJuIHBQcmludERsZ1cocHJpbnRkbGcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDAzXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gY29tZGxnMzIuR2V0T3BlbkZpbGVOYW1lVwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV80MDMoTFBPUEVORklMRU5BTUVXIG9mbikKewogIEdFVF9GVU5DKHBHZXRPcGVuRmlsZU5hbWVXLCBjb21kbGczMiwgIkdldE9wZW5GaWxlTmFtZVciLCBGQUxTRSk7CiAgcmV0dXJuIHBHZXRPcGVuRmlsZU5hbWVXKG9mbik7Cn0KCi8qIElOVEVSTkFMOiBNYXAgZnJvbSBITFMgY29sb3Igc3BhY2UgdG8gUkdCICovCnN0YXRpYyBXT1JEIENvbnZlcnRIdWUoaW50IHdIdWUsIFdPUkQgd01pZDEsIFdPUkQgd01pZDIpCnsKICB3SHVlID0gd0h1ZSA+IDI0MCA/IHdIdWUgLSAyNDAgOiB3SHVlIDwgMCA/IHdIdWUgKyAyNDAgOiB3SHVlOwoKICBpZiAod0h1ZSA+IDE2MCkKICAgIHJldHVybiB3TWlkMTsKICBlbHNlIGlmICh3SHVlID4gMTIwKQogICAgd0h1ZSA9IDE2MCAtIHdIdWU7CiAgZWxzZSBpZiAod0h1ZSA+IDQwKQogICAgcmV0dXJuIHdNaWQyOwoKICByZXR1cm4gKCh3SHVlICogKHdNaWQyIC0gd01pZDEpICsgMjApIC8gNDApICsgd01pZDE7Cn0KCi8qIENvbnZlcnQgdG8gUkdCIGFuZCBzY2FsZSBpbnRvIFJHQiByYW5nZSAoMC4uMjU1KSAqLwojZGVmaW5lIEdFVF9SR0IoaCkgKENvbnZlcnRIdWUoaCwgd01pZDEsIHdNaWQyKSAqIDI1NSArIDEyMCkgLyAyNDAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQ29sb3JITFNUb1JHQglbU0hMV0FQSS40MDRdCiAqCiAqIENvbnZlcnQgZnJvbSBITFMgY29sb3Igc3BhY2UgaW50byBhbiBSR0IgQ09MT1JSRUYuCiAqCiAqIE5PVEVTCiAqIElucHV0IEhMUyB2YWx1ZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAoMC4uMjQwKS4KICovCkNPTE9SUkVGIFdJTkFQSSBDb2xvckhMU1RvUkdCKFdPUkQgd0h1ZSwgV09SRCB3THVtaW5vc2l0eSwgV09SRCB3U2F0dXJhdGlvbikKewogIFdPUkQgd1JlZDsKCiAgaWYgKHdTYXR1cmF0aW9uKQogIHsKICAgIFdPUkQgd0dyZWVuLCB3Qmx1ZSwgd01pZDEsIHdNaWQyOwoKICAgIGlmICh3THVtaW5vc2l0eSA+IDEyMCkKICAgICAgd01pZDIgPSB3U2F0dXJhdGlvbiArIHdMdW1pbm9zaXR5IC0gKHdTYXR1cmF0aW9uICogd0x1bWlub3NpdHkgKyAxMjApIC8gMjQwOwogICAgZWxzZQogICAgICB3TWlkMiA9ICgod1NhdHVyYXRpb24gKyAyNDApICogd0x1bWlub3NpdHkgKyAxMjApIC8gMjQwOwoKICAgIHdNaWQxID0gd0x1bWlub3NpdHkgKiAyIC0gd01pZDI7CgogICAgd1JlZCAgID0gR0VUX1JHQih3SHVlICsgODApOwogICAgd0dyZWVuID0gR0VUX1JHQih3SHVlKTsKICAgIHdCbHVlICA9IEdFVF9SR0Iod0h1ZSAtIDgwKTsKCiAgICByZXR1cm4gUkdCKHdSZWQsIHdHcmVlbiwgd0JsdWUpOwogIH0KCiAgd1JlZCA9IHdMdW1pbm9zaXR5ICogMjU1IC8gMjQwOwogIHJldHVybiBSR0Iod1JlZCwgd1JlZCwgd1JlZCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS40MTNdCiAqCiAqIEZ1bmN0aW9uIHVua25vd24gc2VlbXMgdG8gYWx3YXlzIHRvIHJldHVybiAwCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV80MTMgKERXT1JEIHgpCnsKCUZJWE1FKCIoMHglMDhseClzdHViXG4iLCB4KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDE4XQogKgogKiBGdW5jdGlvbiBzZWVtcyB0byBkbyBGcmVlTGlicmFyeSBwbHVzIG90aGVyIHRoaW5ncy4KICoKICogRklYTUUgbmF0aXZlIHNob3dzIHRoZSBmb2xsb3dpbmcgY2FsbHM6CiAqICAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24KICogICBMb2NhbEZyZWUKICogICBHZXRQcm9jQWRkcmVzcyhDb21jdGwzMj8/LCAxNTBMKQogKiAgIERQQV9EZWxldGVQdHIKICogICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbgogKiAgZm9sbG93ZWQgYnkgdGhlIEZyZWVMaWJyYXJ5LgogKiAgVGhlIGFib3ZlIGNvZGUgbWF5IGJlIHJlbGF0ZWQgdG8gLjM3NyBhYm92ZS4KICovCkJPT0wgIFdJTkFQSSBTSExXQVBJXzQxOCAoSE1PRFVMRSB4KQp7CglGSVhNRSgiKDB4JTA4bHgpIHBhcnRpYWwgc3R1YlxuIiwgKExPTkcpeCk7CglyZXR1cm4gRnJlZUxpYnJhcnkoeCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS40MzFdCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV80MzEgKERXT1JEIHgpCnsKCUZJWE1FKCIoMHglMDhseClzdHViXG4iLCB4KTsKCXJldHVybiAweGFiYmExMjQ3Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDM2XQogKgogKiAgVGhpcyBpcyByZWFsbHkgQ0xTSURGcm9tU3RyaW5nIHdoaWNoIGlzIGV4cG9ydGVkIGJ5IG9sZTMyLmRsbCwKICogIGhvd2V2ZXIgdGhlIG5hdGl2ZSBzaGx3YXBpLmRsbCBkb2VzICpub3QqIGltcG9ydCBvbGUzMi4gTm9yIGRvZXMKICogIG9sZTMyLmRsbCBpbXBvcnQgdGhpcyBvcmRpbmFsIGZyb20gc2hsd2FwaS4gVGhlcmVmb3JlIHdlIG11c3QgY29uY2x1ZGUKICogIHRoYXQgTVMgZHVwbGljYXRlZCB0aGUgY29kZSBmb3IgQ0xTSURGcm9tU3RyaW5nLgogKgogKiAgVGhpcyBpcyBhIGR1cGxpY2F0ZSAod2l0aCBjaGFuZ2VzIGZvciBVTklDT0RFKSBvZiBDTFNJREZyb21TdHJpbmcxNgogKiAgaW4gZGxscy9vbGUzMi9jb21wb2JqLmMKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzQzNiAoTFBXU1RSIGlkc3RyLCBDTFNJRCAqaWQpCnsKICAgIExQV1NUUiBzID0gaWRzdHI7CiAgICBCWVRFICpwOwogICAgSU5UIGk7CiAgICBXQ0hBUiB0YWJsZVsyNTZdOwoKICAgIGlmICghcykgewoJbWVtc2V0KHMsIDAsIHNpemVvZihDTFNJRCkpOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBlbHNlIHsgIC8qIHZhbGlkYXRlIHRoZSBDTFNJRCBzdHJpbmcgKi8KCglpZiAoc3RybGVuVyhzKSAhPSAzOCkKCSAgICByZXR1cm4gQ09fRV9DTEFTU1NUUklORzsKCglpZiAoKHNbMF0hPUwneycpIHx8IChzWzldIT1MJy0nKSB8fCAoc1sxNF0hPUwnLScpIHx8IChzWzE5XSE9TCctJykgfHwgKHNbMjRdIT1MJy0nKSB8fCAoc1szN10hPUwnfScpKQoJICAgIHJldHVybiBDT19FX0NMQVNTU1RSSU5HOwoKCWZvciAoaT0xOyBpPDM3OyBpKyspCgkgICAgewoJCWlmICgoaSA9PSA5KXx8KGkgPT0gMTQpfHwoaSA9PSAxOSl8fChpID09IDI0KSkgY29udGludWU7CgkJaWYgKCEoKChzW2ldID49IEwnMCcpICYmIChzW2ldIDw9IEwnOScpKSAgfHwKCQkgICAgICAoKHNbaV0gPj0gTCdhJykgJiYgKHNbaV0gPD0gTCdmJykpICB8fAoJCSAgICAgICgoc1tpXSA+PSBMJ0EnKSAmJiAoc1tpXSA8PSBMJ0YnKSkpCgkJICAgICkKCQkgICAgcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CgkgICAgfQogICAgfQoKICAgIFRSQUNFKCIlcyAtPiAlcFxuIiwgZGVidWdzdHJfdyhzKSwgaWQpOwoKICAvKiBxdWljayBsb29rdXAgdGFibGUgKi8KICAgIG1lbXNldCh0YWJsZSwgMCwgMjU2KnNpemVvZihXQ0hBUikpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Cgl0YWJsZVsnMCcgKyBpXSA9IGk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Cgl0YWJsZVsnQScgKyBpXSA9IGkrMTA7Cgl0YWJsZVsnYScgKyBpXSA9IGkrMTA7CiAgICB9CgogICAgLyogaW4gZm9ybSB7WFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYfSAqLwoKICAgIHAgPSAoQllURSAqKSBpZDsKCiAgICBzKys7CS8qIHNraXAgbGVhZGluZyBicmFjZSAgKi8KICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCXBbMyAtIGldID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKCXMgKz0gMjsKICAgIH0KICAgIHAgKz0gNDsKICAgIHMrKzsJLyogc2tpcCAtICovCgogICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewoJcFsxLWldID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKCXMgKz0gMjsKICAgIH0KICAgIHAgKz0gMjsKICAgIHMrKzsJLyogc2tpcCAtICovCgogICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewoJcFsxLWldID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKCXMgKz0gMjsKICAgIH0KICAgIHAgKz0gMjsKICAgIHMrKzsJLyogc2tpcCAtICovCgogICAgLyogdGhlc2UgYXJlIGp1c3Qgc2VxdWVudGlhbCBieXRlcyAqLwogICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewoJKnArKyA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CglzICs9IDI7CiAgICB9CiAgICBzKys7CS8qIHNraXAgLSAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKCSpwKysgPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwoJcyArPSAyOwogICAgfQoKICAgIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDM3XQogKgogKiBOT1RFUwogKiAgSW4gdGhlIHJlYWwgc2hsd2FwaSwgT25lIHRpbWUgaW5pdGlhbGlzYXRpb24gY2FsbHMgR2V0VmVyc2lvbkV4IGFuZCByZWFkcwogKiAgdGhlIHJlZ2lzdHJ5IHRvIGRldGVybWluZSB3aGF0IE8vUyAmIFNlcnZpY2UgUGFjayBsZXZlbCBpcyBydW5uaW5nLCBhbmQKICogIHRoZXJlZm9yZSB3aGljaCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZS4gQ3VycmVudGx5IHdlIGFsd2F5cyBydW4gYXMgTlQsCiAqICBzaW5jZSB0aGlzIG1lYW5zIHRoYXQgd2UgZG9uJ3QgbmVlZCBleHRyYSBjb2RlIHRvIGVtdWxhdGUgVW5pY29kZSBjYWxscywKICogIHRoZXkgYXJlIGZvcndhcmRlZCBkaXJlY3RseSB0byB0aGUgYXBwcm9wcmlhdGUgQVBJIGNhbGwgaW5zdGVhZC4KICogIFNpbmNlIHRoZSBmbGFncyBmb3Igd2hldGhlciB0byBjYWxsIG9yIGVtdWxhdGUgVW5pY29kZSBhcmUgaW50ZXJuYWwgdG8KICogIHRoZSBkbGwsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbmVlZCBhIGZ1bGwgaW1wbGVtZW50YXRpb24uCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV80MzcgKERXT1JEIGZ1bmN0aW9uVG9DYWxsKQp7CglGSVhNRSgiKDB4JTA4bHgpc3R1YlxuIiwgZnVuY3Rpb25Ub0NhbGwpOwoJcmV0dXJuIC8qIDB4YWJiYTEyNDcgKi8gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDb2xvclJHQlRvSExTCVtTSExXQVBJLjQ0NV0KICoKICogQ29udmVydCBmcm9tIFJHQiBDT0xPUlJFRiBpbnRvIHRoZSBITFMgY29sb3Igc3BhY2UuCiAqCiAqIE5PVEVTCiAqIElucHV0IEhMUyB2YWx1ZXMgYXJlIGNvbnN0cmFpbmVkIHRvIHRoZSByYW5nZSAoMC4uMjQwKS4KICovClZPSUQgV0lOQVBJIENvbG9yUkdCVG9ITFMoQ09MT1JSRUYgZHJSR0IsIExQV09SRCBwd0h1ZSwgCgkJCSAgTFBXT1JEIHdMdW1pbmFuY2UsIExQV09SRCBwd1NhdHVyYXRpb24pCnsKICAgIEZJWE1FKCJzdHViXG4iKTsKICAgIHJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSENyZWF0ZVNoZWxsUGFsZXR0ZQlbU0hMV0FQSS5AXQogKi8KSFBBTEVUVEUgV0lOQVBJIFNIQ3JlYXRlU2hlbGxQYWxldHRlKEhEQyBoZGMpCnsKCUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiBDcmVhdGVIYWxmdG9uZVBhbGV0dGUoaGRjKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU0hHZXRJbnZlcnNlQ01BUCAoU0hMV0FQSS5AKQogKi8KRFdPUkQgV0lOQVBJIFNIR2V0SW52ZXJzZUNNQVAgKExQRFdPUkQqIHgsIERXT1JEIHdoeSkKewogICAgaWYgKHdoeSA9PSA0KSB7CglGSVhNRSgiIC0gcmV0dXJuaW5nIGJvZ3VzIGFkZHJlc3MgZm9yIFNIR2V0SW52ZXJzZUNNQVBcbiIpOwoJKnggPSAoTFBEV09SRCkweGFiYmExMjQ5OwoJcmV0dXJuIDA7CiAgICB9CiAgICBGSVhNRSgiKCVwLCAlI2x4KXN0dWJcbiIsIHgsIHdoeSk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSElzTG93TWVtb3J5TWFjaGluZQlbU0hMV0FQSS5AXQogKi8KRFdPUkQgV0lOQVBJIFNISXNMb3dNZW1vcnlNYWNoaW5lIChEV09SRCB4KQp7CglGSVhNRSgiMHglMDhseFxuIiwgeCk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBHZXRNZW51UG9zRnJvbUlECVtTSExXQVBJLkBdCiAqLwpJTlQgV0lOQVBJIEdldE1lbnVQb3NGcm9tSUQoSE1FTlUgaE1lbnUsIFVJTlQgd0lEKQp7CiBNRU5VSVRFTUlORk9BIG1pOwogSU5UIG5Db3VudCA9IEdldE1lbnVJdGVtQ291bnQoaE1lbnUpLCBuSXRlciA9IDA7Cgogd2hpbGUgKG5JdGVyIDwgbkNvdW50KQogewogICBtaS53SUQgPSAwOwogICBpZiAoIUdldE1lbnVJdGVtSW5mb0EoaE1lbnUsIG5JdGVyLCBUUlVFLCAmbWkpICYmIG1pLndJRCA9PSB3SUQpCiAgICAgcmV0dXJuIG5JdGVyOwogICBuSXRlcisrOwogfQogcmV0dXJuIC0xOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIF9TSEdldEluc3RhbmNlRXhwbG9yZXJANAlbU0hMV0FQSS5AXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEdldEluc3RhbmNlRXhwbG9yZXIuCiAqLwpIUkVTVUxUIFdJTkFQSSBfU0hHZXRJbnN0YW5jZUV4cGxvcmVyIChMUFVOS05PV04gKmxwVW5rbm93bikKewogIEdFVF9GVU5DKHBTSEdldEluc3RhbmNlRXhwbG9yZXIsIHNoZWxsMzIsICJTSEdldEluc3RhbmNlRXhwbG9yZXIiLCBFX0ZBSUwpOwogIHJldHVybiBwU0hHZXRJbnN0YW5jZUV4cGxvcmVyKGxwVW5rbm93bik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hHZXRUaHJlYWRSZWYJW1NITFdBUEkuQF0KICoKICogUmV0cmlldmVzIHRoZSBwZXItdGhyZWFkIG9iamVjdCByZWZlcmVuY2Ugc2V0IGJ5IFNIU2V0VGhyZWFkUmVmCiAqICJwdW5rIiAtIEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRvIHRoZSBJVW5rbm93biBpbnRlcmZhY2UuIFJldHVybnMgU19PSyBpZgogKiAgICAgICAgICBzdWNjZXNzZnVsIG9yIEVfTk9JTlRFUkZBQ0Ugb3RoZXJ3aXNlLgogKi8KSFJFU1VMVCBXSU5BUEkgU0hHZXRUaHJlYWRSZWYgKElVbmtub3duICoqIHBwdW5rKQp7CiAgICBpZiAoU0hMV0FQSV9UaHJlYWRSZWZfaW5kZXggPCAwKSByZXR1cm4gRV9OT0lOVEVSRkFDRTsKICAgICpwcHVuayA9IChJVW5rbm93biAqKVRsc0dldFZhbHVlKFNITFdBUElfVGhyZWFkUmVmX2luZGV4KTsKICAgIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNIU2V0VGhyZWFkUmVmCVtTSExXQVBJLkBdCiAqCiAqIFN0b3JlcyBhIHBlci10aHJlYWQgcmVmZXJlbmNlIHRvIGEgQ09NIG9iamVjdAogKiAicHVuayIgLSBQb2ludGVyIHRvIHRoZSBJVW5rbm93biBpbnRlcmZhY2Ugb2YgdGhlIG9iamVjdCB0bwogKiAgICAgICAgICB3aGljaCB5b3Ugd2FudCB0byBzdG9yZSBhIHJlZmVyZW5jZS4gUmV0dXJucyBTX09LIGlmIHN1Y2Nlc3NmdWwKICogICAgICAgICAgb3IgYW4gT0xFIGVycm9yIHZhbHVlLgogKi8KSFJFU1VMVCBXSU5BUEkgU0hTZXRUaHJlYWRSZWYgKElVbmtub3duICogcHVuaykKewogICAgaWYgKFNITFdBUElfVGhyZWFkUmVmX2luZGV4IDwgMCkgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiAgICBUbHNTZXRWYWx1ZShTSExXQVBJX1RocmVhZFJlZl9pbmRleCwgKExQVk9JRCkgcHVuayk7CiAgICByZXR1cm4gU19PSzsKfQo=