CVRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIFdpbmUgZGVidWdnZXIuICBUaGUgcmV2ZXJzZSBhc3NlbWJlcgp3YXMgc3RvbGVuIGZyb20gTWFjaCBtb3JlIG9yIGxlc3MgaW50YWN0LiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlCnR3byB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGRpZmZlcmVudGx5IGlmIHlvdSBhcmUgcmV2ZXJzZSBhc3NlbWJsaW5nCjE2IGJpdCBjb2RlLCBhbmQgb24gdGhlIHdob2xlIGl0IHNlZW1zIHRvIHdvcmsuCgpORVdTOgoKCVRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBoYXMgKnRvbnMqIG1vcmUgY2FwYWJpbGl0eSB0aGFuIGl0IGRpZCBiZWZvcmUuCkkgaGF2ZSBlbmNsb3NlZCBzb21lIGV4YW1wbGVzIHRoYXQgc2hvdyB1c2FnZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KTmV3IGZlYXR1cmVzIGluY2x1ZGU6CgoJMSkgQWJpbGl0eSBvZiBkZWJ1Z2dlciB0byByZWFkIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gd2luZSBleGVjdXRhYmxlCiphbmQqIGZyb20gV2luMzIgZXhlY3V0YWJsZXMuICBMb2NhbCB2YXJpYWJsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaXMKYWxzbyByZWFkIGFuZCBwcm9jZXNzZWQuCgoJMikgVGhlIGludGVybmFsIGRlYnVnZ2VyIGlzIGNhcGFibGUgb2YgJ3N0ZXBwaW5nJyB0byB0aGUgbmV4dApsaW5lIG51bWJlciwganVzdCBsaWtlIGdkYi4gIEV4YW1wbGVzIG9mIHRoZSBjb21tYW5kcyBhcmU6CgoJc3RlcAoJc3RlcGkKCXNpCglzdGVwIDMKCXNpIDUKCW5leHQKCW5leHRpCgljb250IDQKCWZpbmlzaAoKQWxsIG9mIHRoZXNlIHNob3VsZCBiZSBleGFjdGx5IGxpa2UgaG93IGdkYiBkb2VzIHRoaW5ncy4KCgkzKSBUaGUgaW50ZXJuYWwgZGVidWdnZXIgbm93IGhhcyBhIHNlbnNlIG9mIHdoYXQgc291cmNlIGZpbGUgYW5kIGxpbmUKbnVtYmVyIGEgZ2l2ZW4gUEMgaXMgYXQuICBOZXcgY29tbWFuZHMgdG8gc3VwcG9ydCB0aGlzIGFyZSBqdXN0IGxpa2UgZ2RiLAphbmQgaW5jbHVkZToKCglsaXN0CglkaXIKCXNob3cgZGlyCgp0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIGZvcm1hdHMgb2YgYXJndW1lbnRzIGZvciB0aGUgbGlzdCBjb21tYW5kLiAgQWxsCnBlcm11dGF0aW9ucyBzdXBwb3J0ZWQgYnkgZ2RiIHNob3VsZCBhbHNvIGJlIHN1cHBvcnRlZC4KCgk0KSBUaGUgaW50ZXJuYWwgZGVidWdnZXIga25vd3MgYWJvdXQgZGF0YXR5cGVzIG9mIHZhcmlvdXMgb2JqZWN0cywKZm9yIGJvdGggV2luMzIgKmFuZCogdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgd2luZSBleGVjdXRhYmxlIGl0c2VsZi4KSSBoYXZlIGVuY2xvc2VkIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgd29ya3MgYXQgdGhlIGVuZC4KCgk1KSBUaGVyZSBhcmUgbW9yZSB3YXlzIHRoZSAnYicgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBzZXQgYnJlYWtwb2ludHMuCkV4YW1wbGVzIGFyZToKCgliICoweDgxOTAwMDAKCWIgMTEwMAoJYiBVc2FnZQoJYgoKSSBkb24ndCB0aGluayB0aGlzIGNvdmVycyBhbGwgb2YgdGhlIHBlcm11dGF0aW9ucyB0aGF0IGdkYiBhY2NlcHRzICh0aGlzIHNob3VsZApiZSBjbGVhbmVkIHVwIHNvbWVkYXkgc28gdGhhdCBhbGwgcG9zc2liaWxpdGllcyBhcmUgYWNjZXB0YWJsZSkuCgoJNikgIFRoZSAncHJpbnQnIGFuZCAneCcgY29tbWFuZHMgc2hvdWxkIGJlaGF2ZSBtb3JlIG9yIGxlc3MgZXhhY3RseQphcyB0aGV5IGRvIHVuZGVyIGdkYi4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIHdheSB0aGUgZGF0YSBpcyBwcmVzZW50ZWQKd2lsbCBiZSBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCB0aGUgY29udGVudCBzaG91bGQgYmUgZnVuZGFtZW50YWxseSB0aGUgc2FtZS4KCgk3KSBUaGUgaW50ZXJuYWwgZGVidWdnZXIgbm93IHN1cHBvcnRzIGNvbmRpdGlvbmFsIGJyZWFrcG9pbnRzLCBhbmQKYXV0b21hdGljIGRpc3BsYXkgZXhwcmVzc2lvbnMuICBBbiBleGFtcGxlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLiAgVGhlCnN5bnRheCBhbmQgdXNhZ2Ugc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGF0IG9mIGdkYi4KCgk4KSBUeXBlIGNhc3RzIGNhbiBiZSBtYWRlIGZyb20gd2l0aGluIHRoZSBkZWJ1Z2dlciwgYnV0IHRoZXkgY3VycmVudGx5CmRvbid0IHdvcmsgd2l0aCB0eXBlZGVmJ2VkIHR5cGVzLiAgVGhleSBvbmx5IHdvcmsgd2l0aCBidWlsdGluIHR5cGVzIGFuZApuYW1lZCBzdHJ1Y3R1cmVzIHVuaW9ucywgZXRjLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBpbnRlcm5hbGx5IHdlIGRvbid0IGFsd2F5cwpyZWNvcmQgdGhlIHR5cGVkZWZlZCBuYW1lcyBvZiBzdHJ1Y3R1cmVzLCBzbyB3ZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IHdlCndvdWxkIGtub3cgd2hhdCBlYWNoIHR5cGUgaXMuICBUaGlzIGNhbiBiZSBmaXhlZCwgb2YgY291cnNlIC0gIGl0IGp1c3QgdGFrZXMKbW9yZSBtZW1vcnkuICBOb3RlIHRoYXQgaW4gc29tZSBjYXNlcywgdHlwZWRlZmVkIHN0cnVjdHVyZXMgY291bGQgYmUgY2FzdAp1c2luZyAnKHN0cnVjdCB0eXBlZGZuYW1lKScgaW5zdGVhZCBvZiAnKHR5cGVkZm5hbWUpJy4gICBUZWNobmljYWxseSB0aGlzCmlzbid0IHF1aXRlIGNvcnJlY3QsIGJ1dCBpZiBhbmQgd2hlbiB0aGUgcmVzdCBvZiB0aGlzIHN0dWZmIGdldHMgZml4ZWQsCnRoaXMgd291bGQgbmVlZCB0byBnZXQgY29ycmVjdGVkIHRvby4KCk5PVEVTOgoKCUlmIGl0IHdlcmVuJ3QgZm9yIHRoZSBmYWN0IHRoYXQgZ2RiIGRvZXNuJ3QgZ3JvayB0aGUgV2luMzIgZGVidWcKaW5mb3JtYXRpb24sIHlvdSBjb3VsZCBqdXN0IHVzZSBnZGIuICBUaGUgaW50ZXJuYWwgZGVidWdnZXIgc2hvdWxkIGJlIGFibGUKdG8gcmVhZCBhbmQgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYm90aCBXaW4zMiBhbmQgYWxzbyBmb3IgdGhlCldpbmUgZXhlY3V0YWJsZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGRlYnVnIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvCnRvZ2V0aGVyIGFzIGlmIGl0IHdlcmUgb25lIGxhcmdlICh2ZXJ5IGxhcmdlKSBlbnRpdHkuCgpMSU1JVEFUSU9OUyBBTkQgRElGRkVSRU5DRVMgRlJPTSBHREI6CgoJWW91IGNhbm5vdCBzZXQgYSBicmVha3BvaW50IGJ5IGZpbGUgYW5kIGxpbmUgbnVtYmVyIGFzIHlvdSBjYW4Kd2l0aCBnZGIuICBBZGRpbmcgc3VwcG9ydCBmb3IgdGhpcyB3b3VsZG4ndCBiZSBhbGwgdGhhdCB0b3VnaCwgSSBndWVzcywgYnV0Cml0IHdvdWxkIGJlIGEgbnVpc2FuY2UuICAgWW91IGNhbiBzZXQgYSBicmVha3BvaW50IGdpdmVuIGEgZnVuY3Rpb24gYW5kCmxpbmUgbnVtYmVyLCBob3dldmVyLiAgQW4gZXhhbXBsZSB3b3VsZCBiZSAnYiBtYWluOjI5OTMnLiAgSXQgdHVybnMgb3V0CnRoYXQgdGhlIHdheSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhcnJhbmdlZCBpdCBpcyBhIHdob2xlIGxvdAplYXNpZXIgdG8gZG8gdGhpbmdzIGluIHRoaXMgd2F5IHRoYW4gaXQgd291bGQgYmUgdG8gdHJ5IGFuZCBnZXQgdGhlCnNvdXJjZTpsaW5lIHR5cGUgb2YgYnJlYWtwb2ludCB3b3JraW5nLCBidXQgaXQgd291bGQgcHJvYmFibHkgYmUgd29ydGggaXQKdG8gdHJ5LgoKCUdldHRpbmcgc3RhY2sgdHJhY2VzIHRocm91Z2ggV2luZSBpdHNlbGYgY2FuIGJlIGEgYml0IHRyaWNreS4KVGhpcyBpcyBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIHRoaW5nIGlzIGJ1aWx0IHdpdGggb3B0aW1pemF0aW9uCmVuYWJsZWQsIGFuZCBhcyBhIHJlc3VsdCBzb21ldGltZXMgZnVuY3Rpb25zIGRvbid0IGdldCBmcmFtZXMsIGFuZApsb3RzIG9mIHZhcmlhYmxlcyBhcmUgb3B0aW1pemVkIGludG8gcmVnaXN0ZXJzLiAgWW91IGNhbiB0dXJuIG9mZgpvcHRpbWl6YXRpb24gZm9yIGEgZmV3IGtleSBzb3VyY2UgZmlsZXMgaWYgaXQgd2lsbCBoZWxwIHlvdS4KCglNZW1vcnkgY29uc3VtcHRpb24gaXMgZ2V0dGluZyB0byBiZSBhIHJlYWwgcHJvYmxlbS4gIEkgdGhpbmsgMzJNYiBpcwpubyBsb25nZXIgc3VmZmljaWVudCB0byBkZWJ1ZyB3aW5lIC0gNDggb3IgNjQgaXMgcHJvYmFibHkgYSB3aG9sZSBsb3QgYmV0dGVyLgpVbmZvcnR1bmF0ZWx5IEkgY2Fubm90IHNodXQgZG93biBYIHRvIHNhdmUgbWVtb3J5IDotKS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRVhBTVBMRVM6CgoJSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyBJIHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBXaW5lLiAgVGhlIHByb2dyYW0KaXMgc29tZXRoaW5nIHRoYXQganVzdCBtYXBzIGFuZCBkdW1wcyB0aGUgY29udGVudHMgb2YgYSBXaW4zMiBleGVjdXRhYmxlLgpJdCB3YXMgZHlpbmcgZm9yIHNvbWUgcmVhc29uLgpOb3RlIHRoYXQgdGhpcyBleGFtcGxlIGlzIHJhdGhlciBvbGQgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHVzZSBjdXJyZW50CnN5bnRheCAhCgpTdGFydCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLgoKYmFzaCQgbHMgLWwgZHVtcGV4ZS5leGUgCi1ydy1ydy1yLS0gICAxIGVyaWMgICAgIGRldmVsICAgICAgMTY4NDQ4IEphbiAgNCAxMzo1MSBkdW1wZXhlLmV4ZQpiYXNoJCAuL3dpbmUgLWRlYnVnICcuL2R1bXBleGUuZXhlIC1zeW1ib2wgLi9kdW1wZXhlLmV4ZScKV2FybmluZzogaW52YWxpZCBkaXIgJ2U6XHRlc3QnIGluIHBhdGgsIGRlbGV0aW5nIGl0LgpXaW4zMiB0YXNrICdXMzJTWFhYWCc6IEJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC4vd2luZS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYcG0uc28uNC42Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlNNLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJJQ0Uuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlhleHQuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlgxMS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9saWJtLnNvLjUuMC41Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGliYy5zby41LjIuMTguLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9sZC1saW51eC5zby4xLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIFdpbjMyIGZpbGUgLi9kdW1wZXhlLmV4ZS4uLgpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwIChfbWFpbkNSVFN0YXJ0dXApCkluIDMyIGJpdCBtb2RlLgoqKiogSW52YWxpZCBhZGRyZXNzIDB4NDE0YzVmZjggKH9LRVJORUwzMl9OVUxMX1RIVU5LX0RBVEErMHgzOTMwZWU2YykKMHgwODFhMzQ1MCAoX21haW5DUlRTdGFydHVwKTogIG1vdmwJJWZzOjAsJWVheApXaW5lLWRiZz5iIER1bXBGaWxlCkJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMDc4IChEdW1wRmlsZSsweDkgW2R1bXBleGUuYzoyNzIzXSkKV2luZS1kYmc+YwpEdW1wIEZpbGU6IC4vZHVtcGV4ZS5leGUKU3RvcHBlZCBvbiBicmVha3BvaW50IDIgYXQgMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pCkVudGVyIHBhdGggdG8gZmlsZSBkdW1wZXhlLmM6IC4uL2RlCjI3MjMJCUhBTkRMRQkJCSAgaEZpbGUgPSBOVUxMOwoweDA4MWEwMDc4IChEdW1wRmlsZSsweDkgW2R1bXBleGUuYzoyNzIzXSk6ICBtb3ZsCSQweDAsMHhmZmZmZmZmNCglZWJwKQpXaW5lLWRiZz5saXN0CjI3MjMJCUhBTkRMRQkJCSAgaEZpbGUgPSBOVUxMOwoyNzI0CQlIQU5ETEUJCQkgIGhNYXAgID0gTlVMTDsKMjcyNQkJUFNUUgkJCSAgbHBNYXAgPSBOVUxMOwoyNzI2CQlEV09SRAkJCSAgZHdGaWxlU2l6ZSAgICAgPSAwOwoyNzI3CQlEV09SRAkJCSAgZHdGaWxlU2l6ZUhpZ2ggPSAwOwoyNzI4CQoyNzI5CQlQSU1BR0VfRE9TX0hFQURFUgkgIGxwSW1hZ2VET1MgID0gTlVMTDsKMjczMAkJUElNQUdFX0ZJTEVfSEVBREVSCSAgbHBJbWFnZUZpbGUgPSBOVUxMOwoyNzMxCQlQSU1BR0VfTlRfSEVBREVSUwkgIGxwSW1hZ2VOVCAgID0gTlVMTDsKMjczMgkKMjczMwkJLyoKV2luZS1kYmc+biAxMAoyNzQ3CQlkd0ZpbGVTaXplID0gR2V0RmlsZVNpemUoaEZpbGUsICZkd0ZpbGVTaXplSGlnaCk7CjB4MDgxYTAwZWEgKER1bXBGaWxlKzB4N2IgW2R1bXBleGUuYzoyNzQ3XSk6ICBsZWFsCTB4ZmZmZmZmZjAoJWVicCksJWVheApXaW5lLWRiZz5uCjI3NDkJCSAgICAmJiAoR2V0TGFzdEVycm9yKCkgIT0gTk9fRVJST1IpICkKMHgwODFhMDBmYiAoRHVtcEZpbGUrMHg4YyBbZHVtcGV4ZS5jOjI3NDldKTogIGNtcGwJJC0xLDB4ZmZmZmZmZTgoJWVicCkKV2luZS1kYmc+eC9kIGR3RmlsZVNpemUKeC9kIGR3RmlsZVNpemUKIDE2ODQ0OApXaW5lLWRiZz5uCjI3NTgJCQkJCSBQQUdFX1JFQURPTkxZLCAwLCAwLCAoTFBTVFIpIE5VTEwpOwoweDA4MWEwMTI0IChEdW1wRmlsZSsweGI1IFtkdW1wZXhlLmM6Mjc1OF0pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5saXN0IDI3NTAKbGlzdCAyNzUwCjI3NTAJCXsKMjc1MQkJCUZhdGFsKCJDYW5ub3QgZ2V0IHNpemUgb2YgZmlsZSAlcyIsIGxwRmlsZU5hbWUpOwoyNzUyCQl9CjI3NTMJCQoyNzU0CQkvKgoyNzU1CQkgKiBtYXAgdGhlIGZpbGUKMjc1NgkJICovCjI3NTcJCWhNYXAgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwgKExQU0VDVVJJVFlfQVRUUklCVVRFUykgTlVMTCwKMjc1OAkJCQkJIFBBR0VfUkVBRE9OTFksIDAsIDAsIChMUFNUUikgTlVMTCk7CjI3NTkJCWlmKCBoTWFwID09IE5VTEwgKQoyNzYwCQl7CldpbmUtZGJnPm4KMjc1OQkJaWYoIGhNYXAgPT0gTlVMTCApCjB4MDgxYTAxM2IgKER1bXBGaWxlKzB4Y2MgW2R1bXBleGUuYzoyNzU5XSk6ICBjbXBsCSQwLDB4ZmZmZmZmZmMoJWVicCkKV2luZS1kYmc+eCBoTWFwCiAwOGU0OGMzMApXaW5lLWRiZz5uCjI3NjcJCWxwTWFwID0gKExQU1RSKSBNYXBWaWV3T2ZGaWxlKGhNYXAsIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOwoweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5uCjI3NjgJCWlmKCBscE1hcCA9PSBOVUxMICkKMHgwODFhMDE2YiAoRHVtcEZpbGUrMHhmYyBbZHVtcGV4ZS5jOjI3NjhdKTogIGNtcGwJJDAsMHhmZmZmZmZlMCglZWJwKQpXaW5lLWRiZz5wcmludCBscE1hcAoweDQxNGM1ZjQwCldpbmUtZGJnPnggbHBNYXAKIDQwMDA3MDAwCldpbmUtZGJnPiB4LzEweCAweDQwMDA3MDAwCiB4LzEweCAweDQwMDA3MDAwCjB4NDAwMDcwMDAgKH9LRVJORUwzMl9OVUxMX1RIVU5LX0RBVEErMHgzN2U0ZmU3NCk6ICoqKiBJbnZhbGlkIGFkZHJlc3MgMHg0MDAwNzAwMCAof0tFUk5FTDMyX05VTExfVEhVTktfREFUQSsweDM3ZTRmZTc0KQpXaW5lLWRiZz5xdWl0CiQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgd2UgZmluZCB0aGF0IE1hcFZpZXdPZkZpbGUgaXNuJ3QgbWFwcGluZyB0aGUgZmlsZQpjb3JyZWN0bHkgaW50byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLiAgVHJ5IHJ1bm5pbmcgYWdhaW4sIGFuZCBzdGVwIGludG8KTWFwVmlld09mRmlsZSB0byBmaWd1cmUgb3V0IHdoYXQgd2VudCB3cm9uZy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCmJhc2gkIC4vd2luZSAtZGVidWcgJy4vZHVtcGV4ZS5leGUgLXN5bWJvbCAuL2R1bXBleGUuZXhlJwpXYXJuaW5nOiBpbnZhbGlkIGRpciAnZTpcdGVzdCcgaW4gcGF0aCwgZGVsZXRpbmcgaXQuCldpbjMyIHRhc2sgJ1czMlNYWFhYJzogQnJlYWtwb2ludCAxIGF0IDB4MDgxYTM0NTAKTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgLi93aW5lLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlhwbS5zby40LjYuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliU00uc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYklDRS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWGV4dC5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWDExLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvbGliL2xpYm0uc28uNS4wLjUuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9saWJjLnNvLjUuMi4xOC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvbGliL2xkLWxpbnV4LnNvLjEuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gV2luMzIgZmlsZSAuL2R1bXBleGUuZXhlLi4uClN0b3BwZWQgb24gYnJlYWtwb2ludCAxIGF0IDB4MDgxYTM0NTAgKF9tYWluQ1JUU3RhcnR1cCkKSW4gMzIgYml0IG1vZGUuCioqKiBJbnZhbGlkIGFkZHJlc3MgMHg0MTRjNWZmOCAof0tFUk5FTDMyX05VTExfVEhVTktfREFUQSsweDM5MzBlZTZjKQoweDA4MWEzNDUwIChfbWFpbkNSVFN0YXJ0dXApOiAgbW92bAklZnM6MCwlZWF4CldpbmUtZGJnPmIgRHVtcEZpbGU6Mjc2NwpCcmVha3BvaW50IDIgYXQgMHgwODFhMDE1NiAoRHVtcEZpbGUrMHhlNyBbZHVtcGV4ZS5jOjI3NjddKQpXaW5lLWRiZz5jCkR1bXAgRmlsZTogLi9kdW1wZXhlLmV4ZQpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pCkVudGVyIHBhdGggdG8gZmlsZSBkdW1wZXhlLmM6IC4uL2RlCjI3NjcJCWxwTWFwID0gKExQU1RSKSBNYXBWaWV3T2ZGaWxlKGhNYXAsIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOwoweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5zdGVwCjM5MAkwMzg1IHN0ZGNhbGwgTWFwVmlld09mRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1hcFZpZXdPZkZpbGUKMHgwODBkNzkzYyAoS0VSTkVMMzJfMzg1IFtrZXJuZWwzMi5zcGVjOjM5MF0pOiAgcHVzaGwJJWVicApXaW5lLWRiZz5zdGVwCjIyMwkgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKMHgwODBjODNkYyAoUkVMQVlfRGVidWdDYWxsRnJvbTMyKzB4YyBbcmVsYXkuYzoyMjNdKTogIGNtcHcJJDAsMHg2NDRhCldpbmUtZGJnPgoyNDQJfQoweDA4MGM4NDhlIChSRUxBWV9EZWJ1Z0NhbGxGcm9tMzIrMHhiZSBbcmVsYXkuYzoyNDRdKTogIGxlYWwJMHhmZmZmZmZmNCglZWJwKSwlZXNwCldpbmUtZGJnPgoxMDMJICAgIHJldHVybiBNYXBWaWV3T2ZGaWxlRXgoaGFuZGxlLGFjY2VzcyxvZmZoaSxvZmZsbyxzaXplLDApOwoweDA4MDkxMWE0IChNYXBWaWV3T2ZGaWxlKzB4MTQgW2ZpbGUuYzoxMDNdKTogIHB1c2hsCSQweDAKV2luZS1kYmc+CjExMwkgICAgRklMRU1BUF9PQkpFQ1QgKmZtYXAgPSAoRklMRU1BUF9PQkpFQ1QqKWhhbmRsZTsKMHgwODA5MTFjZiAoTWFwVmlld09mRmlsZUV4KzB4ZiBbZmlsZS5jOjExM10pOiAgbW92bAkweDgoJWVicCksJWVzaQpXaW5lLWRiZz5uCjExNQkgICAgaWYgKCFzaXplKSBzaXplID0gZm1hcC0+c2l6ZTsKMHgwODA5MTFkMiAoTWFwVmlld09mRmlsZUV4KzB4MTIgW2ZpbGUuYzoxMTVdKTogIHRlc3RsCSVlYngsJWVieApXaW5lLWRiZz5saXN0Cmxpc3QKMTE1CSAgICBpZiAoIXNpemUpIHNpemUgPSBmbWFwLT5zaXplOwoxMTYJICAgIGlmICghc2l6ZSkgc2l6ZSA9IDE7CjExNwkgICAgcmV0dXJuIG1tYXAgKChjYWRkcl90KXN0LCBzaXplLCBmbWFwLT5wcm90LCAKMTE4CSAgICAgICAgICAgICAgICAgTUFQX0FOT058TUFQX1BSSVZBVEUsIAoxMTkJCQkgRklMRV9HZXRVbml4SGFuZGxlKGZtYXAtPmhmaWxlKSwKMTIwCQkJIG9mZmxvKTsKMTIxCX0KMTIyCQoxMjMJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCjEyNAkgKiAgICAgICAgICAgVW5tYXBWaWV3T2ZGaWxlICAgICAgICAgICAgICAgICAgKEtFUk5FTDMyLjM4NSkKMTI1CSAqLwpXaW5lLWRiZz54IHNpemUKIDAwMDAwMDAwCldpbmUtZGJnPm4KMTE2CSAgICBpZiAoIXNpemUpIHNpemUgPSAxOwoweDA4MDkxMWQ5IChNYXBWaWV3T2ZGaWxlRXgrMHgxOSBbZmlsZS5jOjExNl0pOiAgdGVzdGwJJWVieCwlZWJ4CldpbmUtZGJnPnggc2l6ZQogMDAwMDAwMDAKV2luZS1kYmc+bgoxMTcJICAgIHJldHVybiBtbWFwICgoY2FkZHJfdClzdCwgc2l6ZSwgZm1hcC0+cHJvdCwgCjB4MDgwOTExZTIgKE1hcFZpZXdPZkZpbGVFeCsweDIyIFtmaWxlLmM6MTE3XSk6ICBwdXNobAklZWF4CldpbmUtZGJnPnggc2l6ZQogMDAwMDAwMDAKV2luZS1kYmc+aW5mbyBsb2NhbApNYXBWaWV3T2ZGaWxlRXg6aGFuZGxlID09IDB4MDhlNDhjOTAKTWFwVmlld09mRmlsZUV4OmFjY2VzcyA9PSAweDAwMDAwMDA0Ck1hcFZpZXdPZkZpbGVFeDpvZmZoaSA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpvZmZsbyA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpzaXplID09IDB4MDAwMDAwMDAKTWFwVmlld09mRmlsZUV4OnN0ID09IDB4MDAwMDAwMDAKTWFwVmlld09mRmlsZUV4Om9mZmxvIG9wdGltaXplZCBpbnRvIHJlZ2lzdGVyICRlYXggCk1hcFZpZXdPZkZpbGVFeDpzaXplIG9wdGltaXplZCBpbnRvIHJlZ2lzdGVyICRlYnggCk1hcFZpZXdPZkZpbGVFeDpzdCBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWRpIApNYXBWaWV3T2ZGaWxlRXg6Zm1hcCBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZXNpIApXaW5lLWRiZz5wcmludCAkZWJ4CjB4MDAwMQpXaW5lLWRiZz5idApidApCYWNrdHJhY2U6Cj0+MCAweDA4MDkxMWUyIChNYXBWaWV3T2ZGaWxlRXgrMHgyMiBbZmlsZS5jOjExN10pCiAgMSAweDA4MDkxMWIwIChNYXBWaWV3T2ZGaWxlKzB4MjAoaGFuZGxlPTB4OGU0OGM5MCwgYWNjZXNzPTB4NCwgb2ZmaGk9MHgwLCBvZmZsbz0weDAsIHNpemU9MHgwKSBbZmlsZS5jOjEwNF0pCiAgMiAweDA4MTA0YWI1IChDYWxsRnJvbTMyX3N0ZGNhbGxfNSsweDI1IFtjYWxsZnJvbTMyLnNdKQogIDMgMHgwODFhMDE2OCAoRHVtcEZpbGUrMHhmOShscEZpbGVOYW1lPTB4NDE0YzYxZWQpIFtkdW1wZXhlLmM6Mjc2N10pCiAgNCAweDA4MWEwYzM1IChtYWluKzB4NDEwKGFyZ2M9MHgzLCBhcmd2PTB4NDE0YzYxY2MpIFtkdW1wZXhlLmM6MzA3OF0pCiAgNSAweDA4MWEzNTE0IChfbWFpbkNSVFN0YXJ0dXArMHhjNCkKICA2IDB4MDgxMDU0OWYgKENvZGVfU3RhcnQrMHgxMyBbY2FsbHRvMzIuc10pCiAgNyAweDA4MDJmZGFjIChUQVNLX0NhbGxUb1N0YXJ0KzB4OGMgW3Rhc2suYzozNzNdKQoKV2luZS1kYmc+CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCk5vdGljZSB0aGF0IHlvdSBjYW4gc3RlcCB0aHJvdWdoIHRoZSB0aHVua3MgaW50byBvdXIgb3duIHRyYW5zZmVyCnJvdXRpbmVzLiAgIFlvdSB3aWxsIG5vdGljZSB0aGF0IHRoZSBzb3VyY2UgbGluZSBkaXNwbGF5cyBhcyBzb21ldGhpbmcKbGlrZToKCjM5MAkwMzg1IHN0ZGNhbGwgTWFwVmlld09mRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1hcFZpZXdPZkZpbGUKClRoaXMgaXMganVzdCB0aGUgc291cmNlIGxpbmUgZnJvbSB0aGUgc3BlYyBmaWxlIHRoYXQgY2F1c2VkIHRoZSB0cmFuc2Zlcgpyb3V0aW5lIHRvIGJlIGdlbmVyYXRlZC4gIEZyb20gdGhpcyB5b3UgY2FuIHN0ZXAgYWdhaW4sIGFuZCB5b3Ugc3RlcAppbnRvIHRoZSByZWxheSBsb2dnaW5nIGNvZGUgLSBrZWVwIHN0ZXBwaW5nIGFuZCB5b3UgZXZlbnR1YWxseSBzdGVwIGludG8KdGhlIGFjdHVhbCBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGRpcnR5IHdvcmsuCgoJQXQgdGhpcyBwb2ludCBhbiBleGFtaW5hdGlvbiBvZiB0aGUgc291cmNlIHRvIHRoZSBXaW4zMiBwcm9ncmFtCmFuZCBhbiBleGFtaW5hdGlvbiBvZiB0aGUgc291cmNlIHRvIHdpbjMyL2ZpbGUucyBzaG93ZWQgd2hlcmUgdGhlIHByb2JsZW0Kd2FzLiAgV2hlbiB5b3Ugc3BlY2lmeSAwIGZvciB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGluIENyZWF0ZUZpbGVNYXBwaW5nLAppdCBpcyBzdXBwb3NlZCB0byB1c2UgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBmaWxlIGFzIHRoZSBzaXplIG9mIHRoZQpvYmplY3QuICBJbnN0ZWFkIHdlIHdlcmUganVzdCBibGluZGx5IGNvcHlpbmcgdGhlIG51bWJlciBvdmVyLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKV2luZS1kYmc+YiBtYWluCkJyZWFrcG9pbnQgMSBhdCAweDA4MDEwOGMwIChtYWluIFtkYmdtYWluLmM6MjEzXSkKV2luZS1kYmc+cHJpbnQgYnJlYWtwb2ludHNbMV0Ke2FkZHI9e3R5cGU9MHgwODA0MzAwMCwgc2VnPTAsIG9mZj0xMzQyODU1MDR9LCBhZGRybGVuPScgJywgb3Bjb2RlPSdVJywgZW5hYmxlZD0xLCBza2lwY291bnQ9MCwgaW5fdXNlPTF9CgpXaW5lLWRiZz4gcHJpbnQgYnJlYWtwb2ludHNbMV0uZW5hYmxlZAoxCldpbmUtZGJnPnNldCBicmVha3BvaW50c1swXS5lbmFibGVkID0gMApXaW5lLWRiZz5wcmludCBicmVha3BvaW50c1swXS5lbmFibGVkCjAKCldpbmUtZGJnPnByaW50IHR5cGVfaGFzaF90YWJsZVsxXS0+dHlwZQpTVFJVQ1QKCldpbmUtZGJnPnByaW50IHR5cGVfaGFzaF90YWJsZVsxXQoweDA4MDcyMDIwCldpbmUtZGJnPnByaW50ICp0eXBlX2hhc2hfdGFibGVbMV0KcHJpbnQgKnR5cGVfaGFzaF90YWJsZVsxXQp7dHlwZT1TVFJVQ1QsIG5leHQ9MHgwMDAwMDAwMCwgbmFtZT0iTE9HUEFMRVRURSIsIHVuPXtiYXNpYz17YmFzaWNfdHlwZT04LCBvdXRwdXRfZm9ybWF0PSKgVh0IoE0dCCIsIGJhc2ljX3NpemU9LTEyOCwgYl9zaWduZWQ9MH0sIGJpdGZpZWxkPXtiaXRvZmY9OCwgbmJpdHM9MCwgYmFzZXR5cGU9MHgwODFkNTZjMH0sIHBvaW50ZXI9e3BvaW50c3RvPTB4MDAwMDAwMDh9LCBmdW5jdD17cmV0dHlwZT0weDAwMDAwMDA4fSwgYXJyYXk9e3N0YXJ0PTgsIGVuZD0xMzYxNDA0ODAsIGJhc2ljdHlwZT0weDA4MDQzZTgwfSwgc3RydWN0dXJlPXtzaXplPTgsIG1lbWJlcnM9MHgwODFkNTZjMH0sIGVudW1lcmF0aW9uPXttZW1iZXJzPTB4MDAwMDAwMDh9fX0KV2luZS1kYmc+CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJVGhpcyBleGFtcGxlIHNob3dzIGhvdyB5b3UgY2FuIHByaW50IG91dCB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4KTm90ZSB0aGF0IGVudW1lcmF0ZWQgdHlwZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgc3ltYm9saWMgZm9ybSwgYW5kIHN0cmluZ3MKYXJlIGRpc3BsYXllZCBpbiB0aGUgZXhwZWN0ZWQgbWFubmVyLgoKCVlvdSBjYW4gdXNlIHRoZSBzZXQgY29tbWFuZCB0byBzZXQgbW9yZSBvciBsZXNzIGFueXRoaW5nLiAgTm90ZQpob3dldmVyIHRoYXQgeW91IGNhbm5vdCB1c2UgZW51bWVyYXRlZCB0eXBlcyBvbiB0aGUgUkhTIG9mIHRoZSBleHByZXNzaW9uLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCldpbmUtZGJnPmxpc3QKMjk4NiAgICAgICAgICAgIGlmKCBhcmdjIDw9IDEgKQoyOTg3ICAgICAgICAgICAgewoyOTg4ICAgICAgICAgICAgICAgICAgICBVc2FnZShhcmd2WzBdKTsKMjk4OSAgICAgICAgICAgIH0KMjk5MAoyOTkxICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IGFyZ2M7IGkrKyApCjI5OTIgICAgICAgICAgICB7CjI5OTMgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJuY21wKGFyZ3ZbaV0sICItZG9zIiwgc2l6ZW9mKCItZG9zIikgLSAxKSA9PSAwICkKMjk5NCAgICAgICAgICAgICAgICAgICAgewoyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIERtcEN0cmwuYkR1bXBET1NIZWFkZXIgPSBUUlVFOwoyOTk2ICAgICAgICAgICAgICAgICAgICB9CldpbmUtZGJnPmIgMjk5MwpCcmVha3BvaW50IDMgYXQgMHgwODFhODg2MSAobWFpbisweDNjIFtkdW1wZXhlLmM6Mjk5M10pCldpbmUtZGJnPmNvbmRpdGlvbiAzIGkgPT0gMgpXaW5lLWRiZz5jClN0b3BwZWQgb24gYnJlYWtwb2ludCAzIGF0IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQoyOTkzICAgICAgICAgICAgICAgICAgICBpZiggc3RybmNtcChhcmd2W2ldLCAiLWRvcyIsIHNpemVvZigiLWRvcyIpIC0gMSkgPT0gMCApCjB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKTogIHB1c2hsICQweDQKV2luZS1kYmc+cHJpbnQgaQoyCldpbmUtZGJnPnByaW50IGFyZ3ZbaV0KIi4vZHVtcGV4ZS5leGUiCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgY29uZGl0aW9uYWwgYnJlYWtwb2ludHMuCglIZXJlIGlzIGFub3RoZXIgb25lIHRoYXQgZGVtb25zdHJhdGVzIGFub3RoZXIgY29vbCBmZWF0dXJlCgljb25kaXRpb25hbCBicmVha3BvaW50cyB0aGF0IGludm9sdmUgYSBmdW5jdGlvbiBjYWxsOgoKCQljb25kaXRpb24gMyBzdHJjbXAoYXJndltpXSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKV2luZS1kYmc+bGlzdAoyOTg2ICAgICAgICAgICAgaWYoIGFyZ2MgPD0gMSApCjI5ODcgICAgICAgICAgICB7CjI5ODggICAgICAgICAgICAgICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwoyOTg5ICAgICAgICAgICAgfQoyOTkwCjI5OTEgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgYXJnYzsgaSsrICkKMjk5MiAgICAgICAgICAgIHsKMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQoyOTk0ICAgICAgICAgICAgICAgICAgICB7CjI5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG1wQ3RybC5iRHVtcERPU0hlYWRlciA9IFRSVUU7CjI5OTYgICAgICAgICAgICAgICAgICAgIH0KV2luZS1kYmc+YiAyOTkzCkJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKV2luZS1kYmc+Y29uZGl0aW9uIDMgc3RyY21wKGFyZ3ZbaV0sICIuL2R1bXBleGUuZXhlIikgPT0gMApXaW5lLWRiZz5pbmZvIGJyZWFrCkJyZWFrcG9pbnRzOgoxOiB5IDB4MDgxYWI0NTAgKF9tYWluQ1JUU3RhcnR1cCkKMjogeSAweDA4MWE4ODJlIChtYWluKzB4OSBbZHVtcGV4ZS5jOjI5ODZdKQozOiB5IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQogICAgICAgICAgICAgICAgc3RvcCB3aGVuICAoIHN0cmNtcCgoIGFyZ3ZbaV0gKSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwICkKV2luZS1kYmc+YwpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQoweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSk6ICBwdXNobCAkMHg0CldpbmUtZGJnPnByaW50IGkKMgpXaW5lLWRiZz5wcmludCBhcmd2W2ldICAKIi4vZHVtcGV4ZS5leGUiCldpbmUtZGJnPgo=