LyoKICogQ29weXJpZ2h0IDE5OTkgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAyLTIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwojZGVmaW5lIENPTV9OT19XSU5ET1dTX0gKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCgojaW5jbHVkZSAib2xlMi5oIgojaW5jbHVkZSAic2hlbGxhcGkuaCIKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAidmZ3LmgiCiNpbmNsdWRlICJtc2FjbS5oIgoKI2luY2x1ZGUgImF2aWZpbGVfcHJpdmF0ZS5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoYXZpZmlsZSk7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGZvciBBVklCdWlsZEZpbHRlclcgLS0gdXNlcyBmaXhlZCBzaXplIHRhYmxlCiAqLwojZGVmaW5lIE1BWF9GSUxURVJTIDMwIC8qIDMwID0+IDdrQiAqLwoKdHlwZWRlZiBzdHJ1Y3QgX0FWSUZpbHRlciB7CiAgV0NIQVIgc3pDbHNpZFs0MF07CiAgV0NIQVIgc3pFeHRlbnNpb25zW01BWF9GSUxURVJTICogN107Cn0gQVZJRmlsdGVyOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGZvciBBVklTYXZlT3B0aW9ucwogKi8Kc3RhdGljIHN0cnVjdCB7CiAgVUlOVCAgICAgICAgICAgICAgICAgIHVGbGFnczsKICBJTlQgICAgICAgICAgICAgICAgICAgblN0cmVhbXM7CiAgUEFWSVNUUkVBTSAgICAgICAgICAgKnBwYXZpczsKICBMUEFWSUNPTVBSRVNTT1BUSU9OUyAqcHBPcHRpb25zOwogIElOVCAgICAgICAgICAgICAgICAgICBuQ3VycmVudDsKfSBTYXZlT3B0czsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBjb3BpZWQgZnJvbSBkbGxzL29sZTMyL2NvbXBvYmouYwogKi8Kc3RhdGljIEhSRVNVTFQgQVZJRklMRV9DTFNJREZyb21TdHJpbmcoTFBDU1RSIGlkc3RyLCBMUENMU0lEIGlkKQp7CiAgQllURSBjb25zdCAqczsKICBCWVRFICpwOwogIElOVCAgIGk7CiAgQllURSB0YWJsZVsyNTZdOwoKICBpZiAoIWlkc3RyKSB7CiAgICBtZW1zZXQoaWQsIDAsIHNpemVvZihDTFNJRCkpOwogICAgcmV0dXJuIFNfT0s7CiAgfQoKICAvKiB2YWxpZGF0ZSB0aGUgQ0xTSUQgc3RyaW5nICovCiAgaWYgKGxzdHJsZW5BKGlkc3RyKSAhPSAzOCkKICAgIHJldHVybiBDT19FX0NMQVNTU1RSSU5HOwoKICBzID0gKEJZVEUgY29uc3QqKWlkc3RyOwogIGlmICgoc1swXSE9J3snKSB8fCAoc1s5XSE9Jy0nKSB8fCAoc1sxNF0hPSctJykgfHwgKHNbMTldIT0nLScpIHx8CiAgICAgIChzWzI0XSE9Jy0nKSB8fCAoc1szN10hPSd9JykpCiAgICByZXR1cm4gQ09fRV9DTEFTU1NUUklORzsKCiAgZm9yIChpID0gMTsgaSA8IDM3OyBpKyspIHsKICAgIGlmICgoaSA9PSA5KSB8fCAoaSA9PSAxNCkgfHwgKGkgPT0gMTkpIHx8IChpID09IDI0KSkKICAgICAgY29udGludWU7CiAgICBpZiAoISgoKHNbaV0gPj0gJzAnKSAmJiAoc1tpXSA8PSAnOScpKSAgfHwKICAgICAgICAoKHNbaV0gPj0gJ2EnKSAmJiAoc1tpXSA8PSAnZicpKSAgfHwKICAgICAgICAoKHNbaV0gPj0gJ0EnKSAmJiAoc1tpXSA8PSAnRicpKSkKICAgICAgICkKICAgICAgcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CiAgfQoKICBUUkFDRSgiJXMgLT4gJXBcbiIsIHMsIGlkKTsKCiAgLyogcXVpY2sgbG9va3VwIHRhYmxlICovCiAgbWVtc2V0KHRhYmxlLCAwLCAyNTYpOwoKICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKICAgIHRhYmxlWycwJyArIGldID0gaTsKCiAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogICAgdGFibGVbJ0EnICsgaV0gPSBpKzEwOwogICAgdGFibGVbJ2EnICsgaV0gPSBpKzEwOwogIH0KCiAgLyogaW4gZm9ybSB7WFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYfSAqLwogIHAgPSAoQllURSAqKSBpZDsKCiAgcysrOwkvKiBza2lwIGxlYWRpbmcgYnJhY2UgICovCiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgcFszIC0gaV0gPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwogICAgcyArPSAyOwogIH0KICBwICs9IDQ7CiAgcysrOwkvKiBza2lwIC0gKi8KCiAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgcFsxLWldID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKICAgIHMgKz0gMjsKICB9CiAgcCArPSAyOwogIHMrKzsJLyogc2tpcCAtICovCgogIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgIHBbMS1pXSA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQogIHAgKz0gMjsKICBzKys7CS8qIHNraXAgLSAqLwoKICAvKiB0aGVzZSBhcmUganVzdCBzZXF1ZW50aWFsIGJ5dGVzICovCiAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgKnArKyA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQogIHMrKzsJLyogc2tpcCAtICovCgogIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICpwKysgPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwogICAgcyArPSAyOwogIH0KCiAgcmV0dXJuIFNfT0s7Cn0KCnN0YXRpYyBCT09MIEFWSUZJTEVfR2V0RmlsZUhhbmRsZXJCeUV4dGVuc2lvbihMUENXU1RSIHN6RmlsZSwgTFBDTFNJRCBscGNsc2lkKQp7CiAgQ0hBUiAgIHN6UmVnS2V5WzI1XTsKICBDSEFSICAgc3pWYWx1ZVsxMDBdOwogIExQV1NUUiBzekV4dCA9IHN0cnJjaHJXKHN6RmlsZSwgJy4nKTsKICBMT05HICAgbGVuID0gc2l6ZW9mKHN6VmFsdWUpIC8gc2l6ZW9mKHN6VmFsdWVbMF0pOwoKICBpZiAoc3pFeHQgPT0gTlVMTCkKICAgIHJldHVybiBGQUxTRTsKCiAgc3pFeHQrKzsKCiAgd3NwcmludGZBKHN6UmVnS2V5LCAiQVZJRmlsZVxcRXh0ZW5zaW9uc1xcJS4zbHMiLCBzekV4dCk7CiAgaWYgKFJlZ1F1ZXJ5VmFsdWVBKEhLRVlfQ0xBU1NFU19ST09ULCBzelJlZ0tleSwgc3pWYWx1ZSwgJmxlbikgIT0gRVJST1JfU1VDQ0VTUykKICAgIHJldHVybiBGQUxTRTsKCiAgcmV0dXJuIChBVklGSUxFX0NMU0lERnJvbVN0cmluZyhzelZhbHVlLCBscGNsc2lkKSA9PSBTX09LKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlSW5pdAkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlSW5pdAkJKEFWSUZJTEUuMTAwKQogKi8Kdm9pZCBXSU5BUEkgQVZJRmlsZUluaXQodm9pZCkgewogIE9sZUluaXRpYWxpemUoTlVMTCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUV4aXQJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUV4aXQJCShBVklGSUxFLjEwMSkKICovCnZvaWQgV0lOQVBJIEFWSUZpbGVFeGl0KHZvaWQpIHsKICAvKiBuZWVkIHRvIGZyZWUgb2xlMzIuZGxsIGlmIHdlIGFyZSB0aGUgbGFzdCBleGl0IGNhbGwgKi8KICAvKiBPbGVVbml0aWFsaXplKCkgKi8KICBGSVhNRSgiKCk6IHN0dWIhXG4iKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlT3BlbgkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlT3BlbkEJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZU9wZW4JCShBVklGSUxFLjEwMikKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVPcGVuQShQQVZJRklMRSAqcHBmaWxlLCBMUENTVFIgc3pGaWxlLCBVSU5UIHVNb2RlLAoJCQkgICAgTFBDTFNJRCBscEhhbmRsZXIpCnsKICBMUFdTVFIgIHdzekZpbGUgPSBOVUxMOwogIEhSRVNVTFQgaHI7CiAgaW50ICAgICBsZW47CgogIFRSQUNFKCIoJXAsJXMsMHglMDhYLCVzKVxuIiwgcHBmaWxlLCBkZWJ1Z3N0cl9hKHN6RmlsZSksIHVNb2RlLAoJZGVidWdzdHJfZ3VpZChscEhhbmRsZXIpKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChwcGZpbGUgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIC8qIGNvbnZlcnQgQVNDSUkgc3RyaW5nIHRvIFVuaWNvZGUgYW5kIGNhbGwgdW5pY29kZSBmdW5jdGlvbiAqLwogIGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzekZpbGUsIC0xLCBOVUxMLCAwKTsKICBpZiAobGVuIDw9IDApCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICB3c3pGaWxlID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbiAqIHNpemVvZihXQ0hBUikpOwogIGlmICh3c3pGaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHN6RmlsZSwgLTEsIHdzekZpbGUsIGxlbik7CgogIGhyID0gQVZJRmlsZU9wZW5XKHBwZmlsZSwgd3N6RmlsZSwgdU1vZGUsIGxwSGFuZGxlcik7CgogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdzekZpbGUpOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZU9wZW5XCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVPcGVuVyhQQVZJRklMRSAqcHBmaWxlLCBMUENXU1RSIHN6RmlsZSwgVUlOVCB1TW9kZSwKCQkJICAgIExQQ0xTSUQgbHBIYW5kbGVyKQp7CiAgSVBlcnNpc3RGaWxlICpwcGVyc2lzdCA9IE5VTEw7CiAgQ0xTSUQgICAgICAgICBjbHNpZEhhbmRsZXI7CiAgSFJFU1VMVCAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcywweCVYLCVzKVxuIiwgcHBmaWxlLCBkZWJ1Z3N0cl93KHN6RmlsZSksIHVNb2RlLAoJZGVidWdzdHJfZ3VpZChscEhhbmRsZXIpKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChwcGZpbGUgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGZpbGUgPSBOVUxMOwoKICAvKiBpZiBubyBoYW5kbGVyIHRoZW4gdHJ5IGd1ZXNzaW5nIGl0IGJ5IGV4dGVuc2lvbiAqLwogIGlmIChscEhhbmRsZXIgPT0gTlVMTCkgewogICAgaWYgKCEgQVZJRklMRV9HZXRGaWxlSGFuZGxlckJ5RXh0ZW5zaW9uKHN6RmlsZSwgJmNsc2lkSGFuZGxlcikpCiAgICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CiAgfSBlbHNlCiAgICBtZW1jcHkoJmNsc2lkSGFuZGxlciwgbHBIYW5kbGVyLCBzaXplb2YoY2xzaWRIYW5kbGVyKSk7CgogIC8qIGNyZWF0ZSBpbnN0YW5jZSBvZiBoYW5kbGVyICovCiAgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKCZjbHNpZEhhbmRsZXIsIE5VTEwsIENMU0NUWF9JTlBST0MsICZJSURfSUFWSUZpbGUsIChMUFZPSUQqKXBwZmlsZSk7CiAgaWYgKEZBSUxFRChocikgfHwgKnBwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIGhyOwoKICAvKiBhc2sgZm9yIElQZXJzaXN0RmlsZSBpbnRlcmZhY2UgZm9yIGxvYWRpbmcvY3JlYXRpbmcgdGhlIGZpbGUgKi8KICBociA9IElBVklGaWxlX1F1ZXJ5SW50ZXJmYWNlKCpwcGZpbGUsICZJSURfSVBlcnNpc3RGaWxlLCAoTFBWT0lEKikmcHBlcnNpc3QpOwogIGlmIChGQUlMRUQoaHIpIHx8IHBwZXJzaXN0ID09IE5VTEwpIHsKICAgIElBVklGaWxlX1JlbGVhc2UoKnBwZmlsZSk7CiAgICAqcHBmaWxlID0gTlVMTDsKICAgIHJldHVybiBocjsKICB9CgogIGhyID0gSVBlcnNpc3RGaWxlX0xvYWQocHBlcnNpc3QsIHN6RmlsZSwgdU1vZGUpOwogIElQZXJzaXN0RmlsZV9SZWxlYXNlKHBwZXJzaXN0KTsKICBpZiAoRkFJTEVEKGhyKSkgewogICAgSUFWSUZpbGVfUmVsZWFzZSgqcHBmaWxlKTsKICAgICpwcGZpbGUgPSBOVUxMOwogIH0KCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVBZGRSZWYJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUFkZFJlZgkJKEFWSUZJTEUuMTQwKQogKi8KVUxPTkcgV0lOQVBJIEFWSUZpbGVBZGRSZWYoUEFWSUZJTEUgcGZpbGUpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGZpbGUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkgewogICAgRVJSKCI6IGJhZCBoYW5kbGUgcGFzc2VkIVxuIik7CiAgICByZXR1cm4gMDsKICB9CgogIHJldHVybiBJQVZJRmlsZV9BZGRSZWYocGZpbGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVSZWxlYXNlCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVSZWxlYXNlCQkoQVZJRklMRS4xNDEpCiAqLwpVTE9ORyBXSU5BUEkgQVZJRmlsZVJlbGVhc2UoUEFWSUZJTEUgcGZpbGUpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGZpbGUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkgewogICAgRVJSKCI6IGJhZCBoYW5kbGUgcGFzc2VkIVxuIik7CiAgICByZXR1cm4gMDsKICB9CgogIHJldHVybiBJQVZJRmlsZV9SZWxlYXNlKHBmaWxlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlSW5mbwkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlSW5mb0EJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUluZm8JCShBVklGSUxFLjE0MikKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVJbmZvQShQQVZJRklMRSBwZmlsZSwgTFBBVklGSUxFSU5GT0EgYWZpLCBMT05HIHNpemUpCnsKICBBVklGSUxFSU5GT1cgYWZpdzsKICBIUkVTVUxUICAgICAgaHJlczsKCiAgVFJBQ0UoIiglcCwlcCwlbGQpXG4iLCBwZmlsZSwgYWZpLCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAoKERXT1JEKXNpemUgPCBzaXplb2YoQVZJRklMRUlORk9BKSkKICAgIHJldHVybiBBVklFUlJfQkFEU0laRTsKCiAgaHJlcyA9IElBVklGaWxlX0luZm8ocGZpbGUsICZhZml3LCBzaXplb2YoYWZpdykpOwoKICBtZW1jcHkoYWZpLCAmYWZpdywgc2l6ZW9mKCphZmkpIC0gc2l6ZW9mKGFmaS0+c3pGaWxlVHlwZSkpOwogIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBhZml3LnN6RmlsZVR5cGUsIC0xLCBhZmktPnN6RmlsZVR5cGUsCgkJICAgICAgc2l6ZW9mKGFmaS0+c3pGaWxlVHlwZSksIE5VTEwsIE5VTEwpOwogIGFmaS0+c3pGaWxlVHlwZVtzaXplb2YoYWZpLT5zekZpbGVUeXBlKSAtIDFdID0gMDsKCiAgcmV0dXJuIGhyZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUluZm9XCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVJbmZvVyhQQVZJRklMRSBwZmlsZSwgTFBBVklGSUxFSU5GT1cgYWZpdywgTE9ORyBzaXplKQp7CiAgVFJBQ0UoIiglcCwlcCwlbGQpXG4iLCBwZmlsZSwgYWZpdywgc2l6ZSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJRmlsZV9JbmZvKHBmaWxlLCBhZml3LCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlR2V0U3RyZWFtCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUdldFN0cmVhbQkoQVZJRklMRS4xNDMpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlR2V0U3RyZWFtKFBBVklGSUxFIHBmaWxlLCBQQVZJU1RSRUFNICphdmlzLAoJCQkJRFdPUkQgZmNjVHlwZSwgTE9ORyBsUGFyYW0pCnsKICBUUkFDRSgiKCVwLCVwLCclNC40cycsJWxkKVxuIiwgcGZpbGUsIGF2aXMsIChjaGFyKikmZmNjVHlwZSwgbFBhcmFtKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX0dldFN0cmVhbShwZmlsZSwgYXZpcywgZmNjVHlwZSwgbFBhcmFtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlQ3JlYXRlU3RyZWFtCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUNyZWF0ZVN0cmVhbUEJKEFWSUZJTDMyLkApCiAqICAgICAgICAgICAgICBBVklGaWxlQ3JlYXRlU3RyZWFtCShBVklGSUxFLjE0NCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVDcmVhdGVTdHJlYW1BKFBBVklGSUxFIHBmaWxlLCBQQVZJU1RSRUFNICpwcGF2aSwKCQkJCSAgICBMUEFWSVNUUkVBTUlORk9BIHBzaSkKewogIEFWSVNUUkVBTUlORk9XCXBzaXc7CgogIFRSQUNFKCIoJXAsJXAsJXApXG4iLCBwZmlsZSwgcHBhdmksIHBzaSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIC8qIE9ubHkgdGhlIHN6TmFtZSBhdCB0aGUgZW5kIGlzIGRpZmZlcmVudCAqLwogIG1lbWNweSgmcHNpdywgcHNpLCBzaXplb2YoKnBzaSkgLSBzaXplb2YocHNpLT5zek5hbWUpKTsKICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgcHNpLT5zek5hbWUsIC0xLCBwc2l3LnN6TmFtZSwKCQkgICAgICBzaXplb2YocHNpdy5zek5hbWUpIC8gc2l6ZW9mKHBzaXcuc3pOYW1lWzBdKSk7CgogIHJldHVybiBJQVZJRmlsZV9DcmVhdGVTdHJlYW0ocGZpbGUsIHBwYXZpLCAmcHNpdyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUNyZWF0ZVN0cmVhbVcJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlQ3JlYXRlU3RyZWFtVyhQQVZJRklMRSBwZmlsZSwgUEFWSVNUUkVBTSAqYXZpcywKCQkJCSAgICBMUEFWSVNUUkVBTUlORk9XIGFzaSkKewogIFRSQUNFKCIoJXAsJXAsJXApXG4iLCBwZmlsZSwgYXZpcywgYXNpKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX0NyZWF0ZVN0cmVhbShwZmlsZSwgYXZpcywgYXNpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlV3JpdGVEYXRhCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZVdyaXRlRGF0YQkoQVZJRklMRS4xNDYpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlV3JpdGVEYXRhKFBBVklGSUxFIHBmaWxlLERXT1JEIGZjYyxMUFZPSUQgbHAsTE9ORyBzaXplKQp7CiAgVFJBQ0UoIiglcCwnJTQuNHMnLCVwLCVsZClcbiIsIHBmaWxlLCAoY2hhciopJmZjYywgbHAsIHNpemUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfV3JpdGVEYXRhKHBmaWxlLCBmY2MsIGxwLCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlUmVhZERhdGEJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZVJlYWREYXRhCQkoQVZJRklMRS4xNDcpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlUmVhZERhdGEoUEFWSUZJTEUgcGZpbGUsRFdPUkQgZmNjLExQVk9JRCBscCxMUExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJyU0LjRzJywlcCwlcClcbiIsIHBmaWxlLCAoY2hhciopJmZjYywgbHAsIHNpemUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfUmVhZERhdGEocGZpbGUsIGZjYywgbHAsIHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVFbmRSZWNvcmQJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlRW5kUmVjb3JkCShBVklGSUxFLjE0OCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVFbmRSZWNvcmQoUEFWSUZJTEUgcGZpbGUpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGZpbGUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfRW5kUmVjb3JkKHBmaWxlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1BZGRSZWYJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtQWRkUmVmCQkoQVZJRklMRS4xNjApCiAqLwpVTE9ORyBXSU5BUEkgQVZJU3RyZWFtQWRkUmVmKFBBVklTVFJFQU0gcHN0cmVhbSkKewogIFRSQUNFKCIoJXApXG4iLCBwc3RyZWFtKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkgewogICAgRVJSKCI6IGJhZCBoYW5kbGUgcGFzc2VkIVxuIik7CiAgICByZXR1cm4gMDsKICB9CgogIHJldHVybiBJQVZJU3RyZWFtX0FkZFJlZihwc3RyZWFtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1SZWxlYXNlCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVsZWFzZQkoQVZJRklMRS4xNjEpCiAqLwpVTE9ORyBXSU5BUEkgQVZJU3RyZWFtUmVsZWFzZShQQVZJU1RSRUFNIHBzdHJlYW0pCnsKICBUUkFDRSgiKCVwKVxuIiwgcHN0cmVhbSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSVN0cmVhbV9SZWxlYXNlKHBzdHJlYW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUNyZWF0ZQkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1DcmVhdGUJCShBVklGSUxFLjEwNCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbUNyZWF0ZShQQVZJU1RSRUFNICpwcGF2aSwgTE9ORyBsUGFyYW0xLCBMT05HIGxQYXJhbTIsCgkJCSAgICAgICBMUENMU0lEIHBjbHNpZEhhbmRsZXIpCnsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLDB4JTA4bFgsMHglMDhsWCwlcylcbiIsIHBwYXZpLCBsUGFyYW0xLCBsUGFyYW0yLAoJZGVidWdzdHJfZ3VpZChwY2xzaWRIYW5kbGVyKSk7CgogIGlmIChwcGF2aSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwYXZpID0gTlVMTDsKICBpZiAocGNsc2lkSGFuZGxlciA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKCiAgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKHBjbHNpZEhhbmRsZXIsIE5VTEwsIENMU0NUWF9JTlBST0MsICZJSURfSUFWSVN0cmVhbSwgKExQVk9JRCopcHBhdmkpOwogIGlmIChGQUlMRUQoaHIpIHx8ICpwcGF2aSA9PSBOVUxMKQogICAgcmV0dXJuIGhyOwoKICBociA9IElBVklTdHJlYW1fQ3JlYXRlKCpwcGF2aSwgbFBhcmFtMSwgbFBhcmFtMik7CiAgaWYgKEZBSUxFRChocikpIHsKICAgIElBVklTdHJlYW1fUmVsZWFzZSgqcHBhdmkpOwogICAgKnBwYXZpID0gTlVMTDsKICB9CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1JbmZvCQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUluZm9BCQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUluZm8JCShBVklGSUxFLjE2MikKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbUluZm9BKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPQSBhc2ksCgkJCSAgICAgIExPTkcgc2l6ZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgSFJFU1VMVAkgaHJlczsKCiAgVFJBQ0UoIiglcCwlcCwlbGQpXG4iLCBwc3RyZWFtLCBhc2ksIHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKChEV09SRClzaXplIDwgc2l6ZW9mKEFWSVNUUkVBTUlORk9BKSkKICAgIHJldHVybiBBVklFUlJfQkFEU0laRTsKCiAgaHJlcyA9IElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKCiAgbWVtY3B5KGFzaSwgJmFzaXcsIHNpemVvZihhc2l3KSAtIHNpemVvZihhc2l3LnN6TmFtZSkpOwogIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBhc2l3LnN6TmFtZSwgLTEsIGFzaS0+c3pOYW1lLAoJCSAgICAgIHNpemVvZihhc2ktPnN6TmFtZSksIE5VTEwsIE5VTEwpOwogIGFzaS0+c3pOYW1lW3NpemVvZihhc2ktPnN6TmFtZSkgLSAxXSA9IDA7CgogIHJldHVybiBocmVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUluZm9XCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbUluZm9XKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPVyBhc2ksCgkJCSAgICAgIExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgcHN0cmVhbSwgYXNpLCBzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sIGFzaSwgc2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtRmluZFNhbXBsZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUZpbmRTYW1wbGUJKEFWSUZJTEUuMTYzKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtRmluZFNhbXBsZShQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgcG9zLCBEV09SRCBmbGFncykKewogIFRSQUNFKCIoJXAsJWxkLDB4JWxYKVxuIiwgcHN0cmVhbSwgcG9zLCBmbGFncyk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgogIHJldHVybiBJQVZJU3RyZWFtX0ZpbmRTYW1wbGUocHN0cmVhbSwgcG9zLCBmbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVhZEZvcm1hdAkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVJlYWRGb3JtYXQJKEFWSUZJTEUuMTY0KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZEZvcm1hdChQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgcG9zLAoJCQkJICAgTFBWT0lEIGZvcm1hdCwgTFBMT05HIGZvcm1hdHNpemUpCnsKICBUUkFDRSgiKCVwLCVsZCwlcCwlcClcbiIsIHBzdHJlYW0sIHBvcywgZm9ybWF0LCBmb3JtYXRzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9SZWFkRm9ybWF0KHBzdHJlYW0sIHBvcywgZm9ybWF0LCBmb3JtYXRzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1TZXRGb3JtYXQJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1TZXRGb3JtYXQJKEFWSUZJTEUuMTY5KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtU2V0Rm9ybWF0KFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBwb3MsCgkJCQkgIExQVk9JRCBmb3JtYXQsIExPTkcgZm9ybWF0c2l6ZSkKewogIFRSQUNFKCIoJXAsJWxkLCVwLCVsZClcbiIsIHBzdHJlYW0sIHBvcywgZm9ybWF0LCBmb3JtYXRzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9TZXRGb3JtYXQocHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVJlYWQJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVhZAkJKEFWSUZJTEUuMTY3KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZChQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgc3RhcnQsIExPTkcgc2FtcGxlcywKCQkJICAgICBMUFZPSUQgYnVmZmVyLCBMT05HIGJ1ZmZlcnNpemUsCgkJCSAgICAgTFBMT05HIGJ5dGVzcmVhZCwgTFBMT05HIHNhbXBsZXNyZWFkKQp7CiAgVFJBQ0UoIiglcCwlbGQsJWxkLCVwLCVsZCwlcCwlcClcbiIsIHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsCglidWZmZXJzaXplLCBieXRlc3JlYWQsIHNhbXBsZXNyZWFkKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9SZWFkKHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsIGJ1ZmZlcnNpemUsCgkJCSBieXRlc3JlYWQsIHNhbXBsZXNyZWFkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1Xcml0ZQkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1Xcml0ZQkJKEFWSUZJTEUuMTY4KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtV3JpdGUoUEFWSVNUUkVBTSBwc3RyZWFtLCBMT05HIHN0YXJ0LCBMT05HIHNhbXBsZXMsCgkJCSAgICAgIExQVk9JRCBidWZmZXIsIExPTkcgYnVmZmVyc2l6ZSwgRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQTE9ORyBzYW1wd3JpdHRlbiwgTFBMT05HIGJ5dGVzd3JpdHRlbikKewogIFRSQUNFKCIoJXAsJWxkLCVsZCwlcCwlbGQsMHglbFgsJXAsJXApXG4iLCBwc3RyZWFtLCBzdGFydCwgc2FtcGxlcywgYnVmZmVyLAoJYnVmZmVyc2l6ZSwgZmxhZ3MsIHNhbXB3cml0dGVuLCBieXRlc3dyaXR0ZW4pOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1dyaXRlKHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsIGJ1ZmZlcnNpemUsCgkJCSAgZmxhZ3MsIHNhbXB3cml0dGVuLCBieXRlc3dyaXR0ZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVJlYWREYXRhCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVhZERhdGEJKEFWSUZJTEUuMTY1KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZERhdGEoUEFWSVNUUkVBTSBwc3RyZWFtLCBEV09SRCBmY2MsIExQVk9JRCBscCwKCQkJCSBMUExPTkcgbHByZWFkKQp7CiAgVFJBQ0UoIiglcCwnJTQuNHMnLCVwLCVwKVxuIiwgcHN0cmVhbSwgKGNoYXIqKSZmY2MsIGxwLCBscHJlYWQpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1JlYWREYXRhKHBzdHJlYW0sIGZjYywgbHAsIGxwcmVhZCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtV3JpdGVEYXRhCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtV3JpdGVEYXRhCShBVklGSUxFLjE2NikKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbVdyaXRlRGF0YShQQVZJU1RSRUFNIHBzdHJlYW0sIERXT1JEIGZjYywgTFBWT0lEIGxwLAoJCQkJICBMT05HIHNpemUpCnsKICBUUkFDRSgiKCVwLCclNC40cycsJXAsJWxkKVxuIiwgcHN0cmVhbSwgKGNoYXIqKSZmY2MsIGxwLCBzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9Xcml0ZURhdGEocHN0cmVhbSwgZmNjLCBscCwgc2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtR2V0RnJhbWVPcGVuCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtR2V0RnJhbWVPcGVuCShBVklGSUxFLjExMikKICovClBHRVRGUkFNRSBXSU5BUEkgQVZJU3RyZWFtR2V0RnJhbWVPcGVuKFBBVklTVFJFQU0gcHN0cmVhbSwKCQkJCSAgICAgICBMUEJJVE1BUElORk9IRUFERVIgbHBiaVdhbnRlZCkKewogIFBHRVRGUkFNRSBwZyA9IE5VTEw7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBwc3RyZWFtLCBscGJpV2FudGVkKTsKCiAgaWYgKEZBSUxFRChJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBzdHJlYW0sICZJSURfSUdldEZyYW1lLCAoTFBWT0lEKikmcGcpKSB8fAogICAgICBwZyA9PSBOVUxMKSB7CiAgICBwZyA9IEFWSUZJTEVfQ3JlYXRlR2V0RnJhbWUocHN0cmVhbSk7CiAgICBpZiAocGcgPT0gTlVMTCkKICAgICAgcmV0dXJuIE5VTEw7CiAgfQoKICBpZiAoRkFJTEVEKElHZXRGcmFtZV9TZXRGb3JtYXQocGcsIGxwYmlXYW50ZWQsIE5VTEwsIDAsIDAsIC0xLCAtMSkpKSB7CiAgICBJR2V0RnJhbWVfUmVsZWFzZShwZyk7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIHJldHVybiBwZzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1HZXRGcmFtZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUdldEZyYW1lCShBVklGSUxFLjExMCkKICovCkxQVk9JRCBXSU5BUEkgQVZJU3RyZWFtR2V0RnJhbWUoUEdFVEZSQU1FIHBnLCBMT05HIHBvcykKewogIFRSQUNFKCIoJXAsJWxkKVxuIiwgcGcsIHBvcyk7CgogIGlmIChwZyA9PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CgogIHJldHVybiBJR2V0RnJhbWVfR2V0RnJhbWUocGcsIHBvcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtR2V0RnJhbWVDbG9zZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUdldEZyYW1lQ2xvc2UJKEFWSUZJTEUuMTExKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtR2V0RnJhbWVDbG9zZShQR0VURlJBTUUgcGcpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGcpOwoKICBpZiAocGcgIT0gTlVMTCkKICAgIHJldHVybiBJR2V0RnJhbWVfUmVsZWFzZShwZyk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJTWFrZUNvbXByZXNzZWRTdHJlYW0JKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklNYWtlQ29tcHJlc3NlZFN0cmVhbShQQVZJU1RSRUFNICpwcHNDb21wcmVzc2VkLAoJCQkJICAgICAgIFBBVklTVFJFQU0gcHNTb3VyY2UsCgkJCQkgICAgICAgTFBBVklDT01QUkVTU09QVElPTlMgYWNvLAoJCQkJICAgICAgIExQQ0xTSUQgcGNsc2lkSGFuZGxlcikKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgQ0hBUiAgICAgICAgICAgc3pSZWdLZXlbMjVdOwogIENIQVIgICAgICAgICAgIHN6VmFsdWVbMTAwXTsKICBDTFNJRCAgICAgICAgICBjbHNpZEhhbmRsZXI7CiAgSFJFU1VMVCAgICAgICAgaHI7CiAgTE9ORyAgICAgICAgICAgc2l6ZSA9IHNpemVvZihzelZhbHVlKTsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcylcbiIsIHBwc0NvbXByZXNzZWQsIHBzU291cmNlLCBhY28sCglkZWJ1Z3N0cl9ndWlkKHBjbHNpZEhhbmRsZXIpKTsKCiAgaWYgKHBwc0NvbXByZXNzZWQgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CiAgaWYgKHBzU291cmNlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgKnBwc0NvbXByZXNzZWQgPSBOVUxMOwoKICAvKiBpZiBubyBoYW5kbGVyIGdpdmVuIGdldCBkZWZhdWx0IG9uZXMgYmFzZWQgb24gc3RyZWFtdHlwZSAqLwogIGlmIChwY2xzaWRIYW5kbGVyID09IE5VTEwpIHsKICAgIGhyID0gSUFWSVN0cmVhbV9JbmZvKHBzU291cmNlLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKICAgIGlmIChGQUlMRUQoaHIpKQogICAgICByZXR1cm4gaHI7CgogICAgd3NwcmludGZBKHN6UmVnS2V5LCAiQVZJRmlsZVxcQ29tcHJlc3NvcnNcXCU0LjRzIiwgKGNoYXIqKSZhc2l3LmZjY1R5cGUpOwogICAgaWYgKFJlZ1F1ZXJ5VmFsdWVBKEhLRVlfQ0xBU1NFU19ST09ULCBzelJlZ0tleSwgc3pWYWx1ZSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MpCiAgICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CiAgICBpZiAoQVZJRklMRV9DTFNJREZyb21TdHJpbmcoc3pWYWx1ZSwgJmNsc2lkSGFuZGxlcikgIT0gU19PSykKICAgICAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKICB9IGVsc2UKICAgIG1lbWNweSgmY2xzaWRIYW5kbGVyLCBwY2xzaWRIYW5kbGVyLCBzaXplb2YoY2xzaWRIYW5kbGVyKSk7CgogIGhyID0gQ29DcmVhdGVJbnN0YW5jZSgmY2xzaWRIYW5kbGVyLCBOVUxMLCBDTFNDVFhfSU5QUk9DLCAmSUlEX0lBVklTdHJlYW0sIChMUFZPSUQqKXBwc0NvbXByZXNzZWQpOwogIGlmIChGQUlMRUQoaHIpIHx8ICpwcHNDb21wcmVzc2VkID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSVN0cmVhbV9DcmVhdGUoKnBwc0NvbXByZXNzZWQsIChMUEFSQU0pcHNTb3VyY2UsIChMUEFSQU0pYWNvKTsKICBpZiAoRkFJTEVEKGhyKSkgewogICAgSUFWSVN0cmVhbV9SZWxlYXNlKCpwcHNDb21wcmVzc2VkKTsKICAgICpwcHNDb21wcmVzc2VkID0gTlVMTDsKICB9CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklNYWtlRmlsZUZyb21TdHJlYW1zCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJTWFrZUZpbGVGcm9tU3RyZWFtcyhQQVZJRklMRSAqcHBmaWxlLCBpbnQgblN0cmVhbXMsCgkJCQkgICAgICBQQVZJU1RSRUFNICpwcFN0cmVhbXMpCnsKICBUUkFDRSgiKCVwLCVkLCVwKVxuIiwgcHBmaWxlLCBuU3RyZWFtcywgcHBTdHJlYW1zKTsKCiAgaWYgKG5TdHJlYW1zIDwgMCB8fCBwcGZpbGUgPT0gTlVMTCB8fCBwcFN0cmVhbXMgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGZpbGUgPSBBVklGSUxFX0NyZWF0ZUFWSVRlbXBGaWxlKG5TdHJlYW1zLCBwcFN0cmVhbXMpOwogIGlmICgqcHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgcmV0dXJuIEFWSUVSUl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1PcGVuRnJvbUZpbGUJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1PcGVuRnJvbUZpbGVBCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtT3BlbkZyb21GaWxlICAgKEFWSUZJTEUuMTAzKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtT3BlbkZyb21GaWxlQShQQVZJU1RSRUFNICpwcGF2aSwgTFBDU1RSIHN6RmlsZSwKCQkJCSAgICAgIERXT1JEIGZjY1R5cGUsIExPTkcgbFBhcmFtLAoJCQkJICAgICAgVUlOVCBtb2RlLCBMUENMU0lEIHBjbHNpZEhhbmRsZXIpCnsKICBQQVZJRklMRSBwZmlsZSA9IE5VTEw7CiAgSFJFU1VMVCAgaHI7CgogIFRSQUNFKCIoJXAsJXMsJyU0LjRzJywlbGQsMHglWCwlcylcbiIsIHBwYXZpLCBkZWJ1Z3N0cl9hKHN6RmlsZSksCgkoY2hhciopJmZjY1R5cGUsIGxQYXJhbSwgbW9kZSwgZGVidWdzdHJfZ3VpZChwY2xzaWRIYW5kbGVyKSk7CgogIGlmIChwcGF2aSA9PSBOVUxMIHx8IHN6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwYXZpID0gTlVMTDsKCiAgaHIgPSBBVklGaWxlT3BlbkEoJnBmaWxlLCBzekZpbGUsIG1vZGUsIHBjbHNpZEhhbmRsZXIpOwogIGlmIChGQUlMRUQoaHIpIHx8IHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSUZpbGVfR2V0U3RyZWFtKHBmaWxlLCBwcGF2aSwgZmNjVHlwZSwgbFBhcmFtKTsKICBJQVZJRmlsZV9SZWxlYXNlKHBmaWxlKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbU9wZW5Gcm9tRmlsZVcJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1PcGVuRnJvbUZpbGVXKFBBVklTVFJFQU0gKnBwYXZpLCBMUENXU1RSIHN6RmlsZSwKCQkJCSAgICAgIERXT1JEIGZjY1R5cGUsIExPTkcgbFBhcmFtLAoJCQkJICAgICAgVUlOVCBtb2RlLCBMUENMU0lEIHBjbHNpZEhhbmRsZXIpCnsKICBQQVZJRklMRSBwZmlsZSA9IE5VTEw7CiAgSFJFU1VMVCAgaHI7CgogIFRSQUNFKCIoJXAsJXMsJyU0LjRzJywlbGQsMHglWCwlcylcbiIsIHBwYXZpLCBkZWJ1Z3N0cl93KHN6RmlsZSksCgkoY2hhciopJmZjY1R5cGUsIGxQYXJhbSwgbW9kZSwgZGVidWdzdHJfZ3VpZChwY2xzaWRIYW5kbGVyKSk7CgogIGlmIChwcGF2aSA9PSBOVUxMIHx8IHN6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwYXZpID0gTlVMTDsKCiAgaHIgPSBBVklGaWxlT3BlblcoJnBmaWxlLCBzekZpbGUsIG1vZGUsIHBjbHNpZEhhbmRsZXIpOwogIGlmIChGQUlMRUQoaHIpIHx8IHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSUZpbGVfR2V0U3RyZWFtKHBmaWxlLCBwcGF2aSwgZmNjVHlwZSwgbFBhcmFtKTsKICBJQVZJRmlsZV9SZWxlYXNlKHBmaWxlKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUJlZ2luU3RyZWFtaW5nCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtQmVnaW5TdHJlYW1pbmcoUEFWSVNUUkVBTSBwYXZpLCBMT05HIGxTdGFydCwgTE9ORyBsRW5kLCBMT05HIGxSYXRlKQp7CiAgSUFWSVN0cmVhbWluZyogcHN0cmVhbSA9IE5VTEw7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlbGQsJWxkLCVsZClcbiIsIHBhdmksIGxTdGFydCwgbEVuZCwgbFJhdGUpOwoKICBpZiAocGF2aSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwYXZpLCAmSUlEX0lBVklTdHJlYW1pbmcsIChMUFZPSUQqKSZwc3RyZWFtKTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwc3RyZWFtICE9IE5VTEwpIHsKICAgIGhyID0gSUFWSVN0cmVhbWluZ19CZWdpbihwc3RyZWFtLCBsU3RhcnQsIGxFbmQsIGxSYXRlKTsKICAgIElBVklTdHJlYW1pbmdfUmVsZWFzZShwc3RyZWFtKTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX09LOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtRW5kU3RyZWFtaW5nCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtRW5kU3RyZWFtaW5nKFBBVklTVFJFQU0gcGF2aSkKewogIElBVklTdHJlYW1pbmcqIHBzdHJlYW0gPSBOVUxMOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXApXG4iLCBwYXZpKTsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBhdmksICZJSURfSUFWSVN0cmVhbWluZywgKExQVk9JRCopJnBzdHJlYW0pOwogIGlmIChTVUNDRUVERUQoaHIpICYmIHBzdHJlYW0gIT0gTlVMTCkgewogICAgSUFWSVN0cmVhbWluZ19FbmQocHN0cmVhbSk7CiAgICBJQVZJU3RyZWFtaW5nX1JlbGVhc2UocHN0cmVhbSk7CiAgfQoKIHJldHVybiBBVklFUlJfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtU3RhcnQJCShBVklGSUxFLjEzMCkKICoJCUFWSVN0cmVhbVN0YXJ0CQkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbVN0YXJ0KFBBVklTVFJFQU0gcHN0cmVhbSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CgogIFRSQUNFKCIoJXApXG4iLCBwc3RyZWFtKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiAwOwoKICBpZiAoRkFJTEVEKElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKSkpCiAgICByZXR1cm4gMDsKCiAgcmV0dXJuIGFzaXcuZHdTdGFydDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1MZW5ndGgJCShBVklGSUxFLjEzMSkKICoJCUFWSVN0cmVhbUxlbmd0aAkJKEFWSUZJTDMyLkApCiAqLwpMT05HIFdJTkFQSSBBVklTdHJlYW1MZW5ndGgoUEFWSVNUUkVBTSBwc3RyZWFtKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKCiAgVFJBQ0UoIiglcClcbiIsIHBzdHJlYW0pOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIDA7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAwOwoKICByZXR1cm4gYXNpdy5kd0xlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1TYW1wbGVUb1RpbWUJKEFWSUZJTEUuMTMzKQogKgkJQVZJU3RyZWFtU2FtcGxlVG9UaW1lCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtU2FtcGxlVG9UaW1lKFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBsU2FtcGxlKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKICBMT05HIHRpbWU7CgogIFRSQUNFKCIoJXAsJWxkKVxuIiwgcHN0cmVhbSwgbFNhbXBsZSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAtMTsKICBpZiAoYXNpdy5kd1JhdGUgPT0gMCkKICAgIHJldHVybiAtMTsKCiAgLyogbGltaXQgdG8gc3RyZWFtIGJvdW5kcyAqLwogIGlmIChsU2FtcGxlIDwgYXNpdy5kd1N0YXJ0KQogICAgbFNhbXBsZSA9IGFzaXcuZHdTdGFydDsKICBpZiAobFNhbXBsZSA+IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGgpCiAgICBsU2FtcGxlID0gYXNpdy5kd1N0YXJ0ICsgYXNpdy5kd0xlbmd0aDsKCiAgaWYgKGFzaXcuZHdSYXRlIC8gYXNpdy5kd1NjYWxlIDwgMTAwMCkKICAgIHRpbWUgPSAoTE9ORykoKChmbG9hdClsU2FtcGxlICogYXNpdy5kd1NjYWxlICogMTAwMCkgLyBhc2l3LmR3UmF0ZSk7CiAgZWxzZQogICAgdGltZSA9IChMT05HKSgoKGZsb2F0KWxTYW1wbGUgKiBhc2l3LmR3U2NhbGUgKiAxMDAwICsgKGFzaXcuZHdSYXRlIC0gMSkpIC8gYXNpdy5kd1JhdGUpOwoKICBUUkFDRSgiIC0+ICVsZFxuIix0aW1lKTsKICByZXR1cm4gdGltZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1UaW1lVG9TYW1wbGUJKEFWSUZJTEUuMTMyKQogKgkJQVZJU3RyZWFtVGltZVRvU2FtcGxlCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtVGltZVRvU2FtcGxlKFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBsVGltZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgVUxPTkcgc2FtcGxlOwoKICBUUkFDRSgiKCVwLCVsZClcbiIsIHBzdHJlYW0sIGxUaW1lKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCB8fCBsVGltZSA8IDApCiAgICByZXR1cm4gLTE7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAtMTsKICBpZiAoYXNpdy5kd1NjYWxlID09IDApCiAgICByZXR1cm4gLTE7CgogIGlmIChhc2l3LmR3UmF0ZSAvIGFzaXcuZHdTY2FsZSA8IDEwMDApCiAgICBzYW1wbGUgPSAoTE9ORykoKCgoZmxvYXQpYXNpdy5kd1JhdGUgKiBsVGltZSkgLyAoYXNpdy5kd1NjYWxlICogMTAwMCkpKTsKICBlbHNlCiAgICBzYW1wbGUgPSAoTE9ORykoKChmbG9hdClhc2l3LmR3UmF0ZSAqIGxUaW1lICsgKGFzaXcuZHdTY2FsZSAqIDEwMDAgLSAxKSkgLyAoYXNpdy5kd1NjYWxlICogMTAwMCkpOwoKICAvKiBsaW1pdCB0byBzdHJlYW0gYm91bmRzICovCiAgaWYgKHNhbXBsZSA8IGFzaXcuZHdTdGFydCkKICAgIHNhbXBsZSA9IGFzaXcuZHdTdGFydDsKICBpZiAoc2FtcGxlID4gYXNpdy5kd1N0YXJ0ICsgYXNpdy5kd0xlbmd0aCkKICAgIHNhbXBsZSA9IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGg7CgogIFRSQUNFKCIgLT4gJWxkXG4iLCBzYW1wbGUpOwogIHJldHVybiBzYW1wbGU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJQnVpbGRGaWx0ZXIJCShBVklGSUwzMi5AKQogKgkJQVZJQnVpbGRGaWx0ZXJBCQkoQVZJRklMMzIuQCkKICoJCUFWSUJ1aWxkRmlsdGVyCQkoQVZJRklMRS4xMjMpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklCdWlsZEZpbHRlckEoTFBTVFIgc3pGaWx0ZXIsIExPTkcgY2JGaWx0ZXIsIEJPT0wgZlNhdmluZykKewogIExQV1NUUiAgd3N6RmlsdGVyOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJWxkLCVkKVxuIiwgc3pGaWx0ZXIsIGNiRmlsdGVyLCBmU2F2aW5nKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChzekZpbHRlciA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKICBpZiAoY2JGaWx0ZXIgPCAyKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBzekZpbHRlclswXSA9IDA7CiAgc3pGaWx0ZXJbMV0gPSAwOwoKICB3c3pGaWx0ZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY2JGaWx0ZXIgKiBzaXplb2YoV0NIQVIpKTsKICBpZiAod3N6RmlsdGVyID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgaHIgPSBBVklCdWlsZEZpbHRlclcod3N6RmlsdGVyLCBjYkZpbHRlciwgZlNhdmluZyk7CiAgaWYgKFNVQ0NFRURFRChocikpIHsKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB3c3pGaWx0ZXIsIGNiRmlsdGVyLAoJCQlzekZpbHRlciwgY2JGaWx0ZXIsIE5VTEwsIE5VTEwpOwogIH0KCiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd3N6RmlsdGVyKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUJ1aWxkRmlsdGVyVwkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklCdWlsZEZpbHRlclcoTFBXU1RSIHN6RmlsdGVyLCBMT05HIGNiRmlsdGVyLCBCT09MIGZTYXZpbmcpCnsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pDbHNpZFtdID0geydDJywnTCcsJ1MnLCdJJywnRCcsMH07CiAgc3RhdGljIGNvbnN0IFdDSEFSIHN6RXh0ZW5zaW9uRm10W10gPSB7JzsnLCcqJywnLicsJyUnLCdzJywwfTsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pBVklGaWxlRXh0ZW5zaW9uc1tdID0KICAgIHsnQScsJ1YnLCdJJywnRicsJ2knLCdsJywnZScsJ1xcJywnRScsJ3gnLCd0JywnZScsJ24nLCdzJywnaScsJ28nLCduJywncycsMH07CgogIEFWSUZpbHRlciAqbHA7CiAgV0NIQVIgICAgICBzekFsbEZpbGVzWzQwXTsKICBXQ0hBUiAgICAgIHN6RmlsZUV4dFsxMF07CiAgV0NIQVIgICAgICBzelZhbHVlWzEyOF07CiAgSEtFWSAgICAgICBoS2V5OwogIERXT1JEICAgICAgbiwgaTsKICBMT05HICAgICAgIHNpemU7CiAgRFdPUkQgICAgICBjb3VudCA9IDA7CgogIFRSQUNFKCIoJXAsJWxkLCVkKVxuIiwgc3pGaWx0ZXIsIGNiRmlsdGVyLCBmU2F2aW5nKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChzekZpbHRlciA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKICBpZiAoY2JGaWx0ZXIgPCAyKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBscCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBNQVhfRklMVEVSUyAqIHNpemVvZihBVklGaWx0ZXIpKTsKICBpZiAobHAgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfTUVNT1JZOwoKICAvKgogICAqIDEuIGl0ZXJhdGUgb3ZlciBIS0VZX0NMQVNTRVNfUk9PVFxcQVZJRmlsZVxcRXh0ZW5zaW9ucyBhbmQgY29sbGVjdAogICAqICAgIGV4dGVuc2lvbnMgYW5kIENMU0lEJ3MKICAgKiAyLiBpdGVyYXRlIG92ZXIgY29sbGVjdGVkIENMU0lEJ3MgYW5kIGNvcHkgaXRzIGRlc2NyaXB0aW9uIGFuZCBpdHMKICAgKiAgICBleHRlbnNpb25zIHRvIHN6RmlsdGVyIGlmIGl0IGZpdHMKICAgKgogICAqIEZpcnN0IGZpbHRlciBpcyBuYW1lZCAiQWxsIG11bHRpbWVkaWEgZmlsZXMiIGFuZCBpdHMgZmlsdGVyIGlzIGEKICAgKiBjb2xsZWN0aW9uIG9mIGFsbCBwb3NzaWJsZSBleHRlbnNpb25zIGV4Y2VwdCAiKi4qIi4KICAgKi8KICBpZiAoUmVnT3BlbktleVcoSEtFWV9DTEFTU0VTX1JPT1QsIHN6QVZJRmlsZUV4dGVuc2lvbnMsICZoS2V5KSAhPSBTX09LKSB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscCk7CiAgICByZXR1cm4gQVZJRVJSX0VSUk9SOwogIH0KICBmb3IgKG4gPSAwO1JlZ0VudW1LZXlXKGhLZXksIG4sIHN6RmlsZUV4dCwgc2l6ZW9mKHN6RmlsZUV4dCkpID09IFNfT0s7bisrKSB7CiAgICAvKiBnZXQgQ0xTSUQgdG8gZXh0ZW5zaW9uICovCiAgICBzaXplID0gc2l6ZW9mKHN6VmFsdWUpL3NpemVvZihzelZhbHVlWzBdKTsKICAgIGlmIChSZWdRdWVyeVZhbHVlVyhoS2V5LCBzekZpbGVFeHQsIHN6VmFsdWUsICZzaXplKSAhPSBTX09LKQogICAgICBicmVhazsKCiAgICAvKiBzZWFyY2ggaWYgdGhlIENMU0lEIGlzIGFscmVhZHkga25vd24gKi8KICAgIGZvciAoaSA9IDE7IGkgPD0gY291bnQ7IGkrKykgewogICAgICBpZiAobHN0cmNtcFcobHBbaV0uc3pDbHNpZCwgc3pWYWx1ZSkgPT0gMCkKCWJyZWFrOyAvKiBhIG5ldyBvbmUgKi8KICAgIH0KCiAgICBpZiAoY291bnQgLSBpID09IC0xVSkgewogICAgICAvKiBpdCdzIGEgbmV3IENMU0lEICovCgogICAgICAvKiBGSVhNRTogSG93IGRvIHdlIGdldCBpbmZvJ3MgYWJvdXQgcmVhZC93cml0ZSBjYXBhYmlsaXRpZXM/ICovCgogICAgICBpZiAoY291bnQgPj0gTUFYX0ZJTFRFUlMpIHsKCS8qIHRyeSB0byBpbmZvcm0gdXNlciBvZiBvdXIgZnVsbCBmaXhlZCBzaXplIHRhYmxlICovCglFUlIoIjogTW9yZSB0aGFuICVkIGZpbHRlcnMgZm91bmQhIEFkanVzdCBNQVhfRklMVEVSUyBpbiBkbGxzL2F2aWZpbDMyL2FwaS5jXG4iLCBNQVhfRklMVEVSUyk7CglicmVhazsKICAgICAgfQoKICAgICAgbHN0cmNweVcobHBbaV0uc3pDbHNpZCwgc3pWYWx1ZSk7CgogICAgICBjb3VudCsrOwogICAgfQoKICAgIC8qIGFwcGVuZCBleHRlbnNpb24gdG8gdGhlIGZpbHRlciAqLwogICAgd3NwcmludGZXKHN6VmFsdWUsIHN6RXh0ZW5zaW9uRm10LCBzekZpbGVFeHQpOwogICAgaWYgKGxwW2ldLnN6RXh0ZW5zaW9uc1swXSA9PSAwKQogICAgICBsc3RyY2F0VyhscFtpXS5zekV4dGVuc2lvbnMsIHN6VmFsdWUgKyAxKTsKICAgIGVsc2UKICAgICAgbHN0cmNhdFcobHBbaV0uc3pFeHRlbnNpb25zLCBzelZhbHVlKTsKCiAgICAvKiBhbHNvIGFwcGVuZCB0byB0aGUgImFsbCBtdWx0aW1lZGlhIi1maWx0ZXIgKi8KICAgIGlmIChscFswXS5zekV4dGVuc2lvbnNbMF0gPT0gMCkKICAgICAgbHN0cmNhdFcobHBbMF0uc3pFeHRlbnNpb25zLCBzelZhbHVlICsgMSk7CiAgICBlbHNlCiAgICAgIGxzdHJjYXRXKGxwWzBdLnN6RXh0ZW5zaW9ucywgc3pWYWx1ZSk7CiAgfQogIFJlZ0Nsb3NlS2V5KGhLZXkpOwoKICAvKiAyLiBnZXQgZGVzY3JpcHRpb25zIGZvciB0aGUgQ0xTSURzIGFuZCBmaWxsIG91dCBzekZpbHRlciAqLwogIGlmIChSZWdPcGVuS2V5VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pDbHNpZCwgJmhLZXkpICE9IFNfT0spIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwKTsKICAgIHJldHVybiBBVklFUlJfRVJST1I7CiAgfQogIGZvciAobiA9IDA7IG4gPD0gY291bnQ7IG4rKykgewogICAgLyogZmlyc3QgdGhlIGRlc2NyaXB0aW9uICovCiAgICBpZiAobiAhPSAwKSB7CiAgICAgIHNpemUgPSBzaXplb2Yoc3pWYWx1ZSkvc2l6ZW9mKHN6VmFsdWVbMF0pOwogICAgICBpZiAoUmVnUXVlcnlWYWx1ZVcoaEtleSwgbHBbbl0uc3pDbHNpZCwgc3pWYWx1ZSwgJnNpemUpID09IFNfT0spIHsKCXNpemUgPSBsc3RybGVuVyhzelZhbHVlKTsKCWxzdHJjcHluVyhzekZpbHRlciwgc3pWYWx1ZSwgY2JGaWx0ZXIpOwogICAgICB9CiAgICB9IGVsc2UKICAgICAgc2l6ZSA9IExvYWRTdHJpbmdXKEFWSUZJTEVfaE1vZHVsZSxJRFNfQUxMTVVMVElNRURJQSxzekZpbHRlcixjYkZpbHRlcik7CgogICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqLwogICAgc2l6ZSsrOwogICAgaWYgKGNiRmlsdGVyIDwgc2l6ZSArIGxzdHJsZW5XKGxwW25dLnN6RXh0ZW5zaW9ucykgKyAyKSB7CiAgICAgIHN6RmlsdGVyWzBdID0gMDsKICAgICAgc3pGaWx0ZXJbMV0gPSAwOwogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscCk7CiAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOwogICAgICByZXR1cm4gQVZJRVJSX0JVRkZFUlRPT1NNQUxMOwogICAgfQogICAgY2JGaWx0ZXIgLT0gc2l6ZTsKICAgIHN6RmlsdGVyICs9IHNpemU7CgogICAgLyogYW5kIHRoZW4gdGhlIGZpbHRlciAqLwogICAgbHN0cmNweW5XKHN6RmlsdGVyLCBscFtuXS5zekV4dGVuc2lvbnMsIGNiRmlsdGVyKTsKICAgIHNpemUgPSBsc3RybGVuVyhscFtuXS5zekV4dGVuc2lvbnMpICsgMTsKICAgIGNiRmlsdGVyIC09IHNpemU7CiAgICBzekZpbHRlciArPSBzaXplOwogIH0KCiAgUmVnQ2xvc2VLZXkoaEtleSk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHApOwoKICAvKiBhZGQgIkFsbCBmaWxlcyIgIiouKiIgZmlsdGVyIGlmIGVub3VnaCBzcGFjZSBsZWZ0ICovCiAgc2l6ZSA9IExvYWRTdHJpbmdXKEFWSUZJTEVfaE1vZHVsZSwgSURTX0FMTEZJTEVTLAoJCSAgICAgc3pBbGxGaWxlcywgc2l6ZW9mKHN6QWxsRmlsZXMpKSArIDE7CiAgaWYgKGNiRmlsdGVyID4gc2l6ZSkgewogICAgaW50IGk7CgogICAgLyogcmVwbGFjZSAnQCcgd2l0aCBcMDAwIHRvIHNlcGFyYXRlIGRlc2NyaXB0aW9uIG9mIGZpbHRlciAqLwogICAgZm9yIChpID0gMDsgaSA8IHNpemUgJiYgc3pBbGxGaWxlc1tpXSAhPSAwOyBpKyspIHsKICAgICAgaWYgKHN6QWxsRmlsZXNbaV0gPT0gJ0AnKSB7CglzekFsbEZpbGVzW2ldID0gMDsKCWJyZWFrOwogICAgICB9CiAgICB9CiAgICAgIAogICAgbWVtY3B5KHN6RmlsdGVyLCBzekFsbEZpbGVzLCBzaXplICogc2l6ZW9mKHN6QWxsRmlsZXNbMF0pKTsKICAgIHN6RmlsdGVyICs9IHNpemU7CiAgICBzekZpbHRlclswXSA9IDA7CgogICAgcmV0dXJuIEFWSUVSUl9PSzsKICB9IGVsc2UgewogICAgc3pGaWx0ZXJbMF0gPSAwOwogICAgcmV0dXJuIEFWSUVSUl9CVUZGRVJUT09TTUFMTDsKICB9Cn0KCnN0YXRpYyBCT09MIEFWSVNhdmVPcHRpb25zRm10Q2hvb3NlKEhXTkQgaFduZCkKewogIExQQVZJQ09NUFJFU1NPUFRJT05TIHBPcHRpb25zID0gU2F2ZU9wdHMucHBPcHRpb25zW1NhdmVPcHRzLm5DdXJyZW50XTsKICBBVklTVFJFQU1JTkZPVyAgICAgICBzSW5mbzsKCiAgVFJBQ0UoIiglcClcbiIsIGhXbmQpOwoKICBpZiAocE9wdGlvbnMgPT0gTlVMTCB8fCBTYXZlT3B0cy5wcGF2aXNbU2F2ZU9wdHMubkN1cnJlbnRdID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgc3RhdGUhXG4iKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGlmIChGQUlMRUQoQVZJU3RyZWFtSW5mb1coU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwKCQkJICAgICZzSW5mbywgc2l6ZW9mKHNJbmZvKSkpKSB7CiAgICBFUlIoIjogQVZJU3RyZWFtSW5mb1cgZmFpbGVkIVxuIik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8pIHsKICAgIENPTVBWQVJTIGN2OwogICAgQk9PTCAgICAgcmV0OwoKICAgIG1lbXNldCgmY3YsIDAsIHNpemVvZihjdikpOwoKICAgIGlmICgocE9wdGlvbnMtPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfVkFMSUQpID09IDApIHsKICAgICAgbWVtc2V0KHBPcHRpb25zLCAwLCBzaXplb2YoQVZJQ09NUFJFU1NPUFRJT05TKSk7CiAgICAgIHBPcHRpb25zLT5mY2NUeXBlICAgID0gc3RyZWFtdHlwZVZJREVPOwogICAgICBwT3B0aW9ucy0+ZmNjSGFuZGxlciA9IGNvbXB0eXBlRElCOwogICAgICBwT3B0aW9ucy0+ZHdRdWFsaXR5ICA9IChEV09SRClJQ1FVQUxJVFlfREVGQVVMVDsKICAgIH0KCiAgICBjdi5jYlNpemUgICAgID0gc2l6ZW9mKGN2KTsKICAgIGN2LmR3RmxhZ3MgICAgPSBJQ01GX0NPTVBWQVJTX1ZBTElEOwogICAgLypjdi5mY2NUeXBlICAgID0gcE9wdGlvbnMtPmZjY1R5cGU7ICovCiAgICBjdi5mY2NIYW5kbGVyID0gcE9wdGlvbnMtPmZjY0hhbmRsZXI7CiAgICBjdi5sUSAgICAgICAgID0gcE9wdGlvbnMtPmR3UXVhbGl0eTsKICAgIGN2LmxwU3RhdGUgICAgPSBwT3B0aW9ucy0+bHBQYXJtczsKICAgIGN2LmNiU3RhdGUgICAgPSBwT3B0aW9ucy0+Y2JQYXJtczsKICAgIGlmIChwT3B0aW9ucy0+ZHdGbGFncyAmIEFWSUNPTVBSRVNTRl9LRVlGUkFNRVMpCiAgICAgIGN2LmxLZXkgPSBwT3B0aW9ucy0+ZHdLZXlGcmFtZUV2ZXJ5OwogICAgZWxzZQogICAgICBjdi5sS2V5ID0gMDsKICAgIGlmIChwT3B0aW9ucy0+ZHdGbGFncyAmIEFWSUNPTVBSRVNTRl9EQVRBUkFURSkKICAgICAgY3YubERhdGFSYXRlID0gcE9wdGlvbnMtPmR3Qnl0ZXNQZXJTZWNvbmQgLyAxMDI0OyAvKiBuZWVkIGtCeXRlcyAqLwogICAgZWxzZQogICAgICBjdi5sRGF0YVJhdGUgPSAwOwoKICAgIHJldCA9IElDQ29tcHJlc3NvckNob29zZShoV25kLCBTYXZlT3B0cy51RmxhZ3MsIE5VTEwsCgkJCSAgICAgU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwgJmN2LCBOVUxMKTsKCiAgICBpZiAocmV0KSB7CiAgICAgIHBPcHRpb25zLT5mY2NIYW5kbGVyID0gY3YuZmNjSGFuZGxlcjsKICAgICAgcE9wdGlvbnMtPmxwUGFybXMgICA9IGN2LmxwU3RhdGU7CiAgICAgIHBPcHRpb25zLT5jYlBhcm1zICAgPSBjdi5jYlN0YXRlOwogICAgICBwT3B0aW9ucy0+ZHdRdWFsaXR5ID0gY3YubFE7CiAgICAgIGlmIChjdi5sS2V5ICE9IDApIHsKCXBPcHRpb25zLT5kd0tleUZyYW1lRXZlcnkgPSBjdi5sS2V5OwoJcE9wdGlvbnMtPmR3RmxhZ3MgfD0gQVZJQ09NUFJFU1NGX0tFWUZSQU1FUzsKICAgICAgfSBlbHNlCglwT3B0aW9ucy0+ZHdGbGFncyAmPSB+QVZJQ09NUFJFU1NGX0tFWUZSQU1FUzsKICAgICAgaWYgKGN2LmxEYXRhUmF0ZSAhPSAwKSB7CglwT3B0aW9ucy0+ZHdCeXRlc1BlclNlY29uZCA9IGN2LmxEYXRhUmF0ZSAqIDEwMjQ7IC8qIG5lZWQgYnl0ZXMgKi8KCXBPcHRpb25zLT5kd0ZsYWdzIHw9IEFWSUNPTVBSRVNTRl9EQVRBUkFURTsKICAgICAgfSBlbHNlCglwT3B0aW9ucy0+ZHdGbGFncyAmPSB+QVZJQ09NUFJFU1NGX0RBVEFSQVRFOwogICAgICBwT3B0aW9ucy0+ZHdGbGFncyAgfD0gQVZJQ09NUFJFU1NGX1ZBTElEOwogICAgfQogICAgSUNDb21wcmVzc29yRnJlZSgmY3YpOwoKICAgIHJldHVybiByZXQ7CiAgfSBlbHNlIGlmIChzSW5mby5mY2NUeXBlID09IHN0cmVhbXR5cGVBVURJTykgewogICAgQUNNRk9STUFUQ0hPT1NFVyBhZm10YzsKICAgIE1NUkVTVUxUICAgICAgICAgcmV0OwogICAgTE9ORyAgICAgICAgICAgICBzaXplOwoKICAgIC8qIEZJWE1FOiBjaGVjayBBQ00gdmVyc2lvbiAtLSBXaGljaCB2ZXJzaW9uIGlzIG5lZWRlZD8gKi8KCiAgICBtZW1zZXQoJmFmbXRjLCAwLCBzaXplb2YoYWZtdGMpKTsKICAgIGFmbXRjLmNiU3RydWN0ICA9IHNpemVvZihhZm10Yyk7CiAgICBhZm10Yy5mZHdTdHlsZSAgPSAwOwogICAgYWZtdGMuaHduZE93bmVyID0gaFduZDsKCiAgICBhY21NZXRyaWNzKE5VTEwsIEFDTV9NRVRSSUNfTUFYX1NJWkVfRk9STUFULCAmc2l6ZSk7CiAgICBpZiAoKHBPcHRpb25zLT5jYkZvcm1hdCA9PSAwIHx8IHBPcHRpb25zLT5scEZvcm1hdCA9PSBOVUxMKSAmJiBzaXplICE9IDApIHsKICAgICAgcE9wdGlvbnMtPmxwRm9ybWF0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemUpOwogICAgICBwT3B0aW9ucy0+Y2JGb3JtYXQgPSBzaXplOwogICAgfSBlbHNlIGlmIChwT3B0aW9ucy0+Y2JGb3JtYXQgPCAoRFdPUkQpc2l6ZSkgewogICAgICBwT3B0aW9ucy0+bHBGb3JtYXQgPSBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBwT3B0aW9ucy0+bHBGb3JtYXQsIHNpemUpOwogICAgICBwT3B0aW9ucy0+Y2JGb3JtYXQgPSBzaXplOwogICAgfQogICAgaWYgKHBPcHRpb25zLT5scEZvcm1hdCA9PSBOVUxMKQogICAgICByZXR1cm4gRkFMU0U7CiAgICBhZm10Yy5wd2Z4ICA9IHBPcHRpb25zLT5scEZvcm1hdDsKICAgIGFmbXRjLmNid2Z4ID0gcE9wdGlvbnMtPmNiRm9ybWF0OwoKICAgIHNpemUgPSAwOwogICAgQVZJU3RyZWFtRm9ybWF0U2l6ZShTYXZlT3B0cy5wcGF2aXNbU2F2ZU9wdHMubkN1cnJlbnRdLAoJCQlzSW5mby5kd1N0YXJ0LCAmc2l6ZSk7CiAgICBpZiAoc2l6ZSA8IChMT05HKXNpemVvZihQQ01XQVZFRk9STUFUKSkKICAgICAgc2l6ZSA9IHNpemVvZihQQ01XQVZFRk9STUFUKTsKICAgIGFmbXRjLnB3ZnhFbnVtID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemUpOwogICAgaWYgKGFmbXRjLnB3ZnhFbnVtICE9IE5VTEwpIHsKICAgICAgQVZJU3RyZWFtUmVhZEZvcm1hdChTYXZlT3B0cy5wcGF2aXNbU2F2ZU9wdHMubkN1cnJlbnRdLAoJCQkgIHNJbmZvLmR3U3RhcnQsIGFmbXRjLnB3ZnhFbnVtLCAmc2l6ZSk7CiAgICAgIGFmbXRjLmZkd0VudW0gPSBBQ01fRk9STUFURU5VTUZfQ09OVkVSVDsKICAgIH0KCiAgICByZXQgPSBhY21Gb3JtYXRDaG9vc2VXKCZhZm10Yyk7CiAgICBpZiAocmV0ID09IFNfT0spCiAgICAgIHBPcHRpb25zLT5kd0ZsYWdzIHw9IEFWSUNPTVBSRVNTRl9WQUxJRDsKCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBhZm10Yy5wd2Z4RW51bSk7CiAgICByZXR1cm4gKHJldCA9PSBTX09LID8gVFJVRSA6IEZBTFNFKTsKICB9IGVsc2UgewogICAgRVJSKCI6IHVua25vd24gc3RyZWFtdHlwZSAweCUwOGxYXG4iLCBzSW5mby5mY2NUeXBlKTsKICAgIHJldHVybiBGQUxTRTsKICB9Cn0KCnN0YXRpYyB2b2lkIEFWSVNhdmVPcHRpb25zVXBkYXRlKEhXTkQgaFduZCkKewogIHN0YXRpYyBjb25zdCBXQ0hBUiBzelZpZGVvRm10W109eyclJywnbCcsJ2QnLCd4JywnJScsJ2wnLCdkJywneCcsJyUnLCdkJywwfTsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pBdWRpb0ZtdFtdPXsnJScsJ3MnLCcgJywnJScsJ3MnLDB9OwoKICBXQ0hBUiAgICAgICAgICBzekZvcm1hdFsxMjhdOwogIEFWSVNUUkVBTUlORk9XIHNJbmZvOwogIExQVk9JRCAgICAgICAgIGxwRm9ybWF0OwogIExPTkcgICAgICAgICAgIHNpemU7CgogIFRSQUNFKCIoJXApXG4iLCBoV25kKTsKCiAgU2F2ZU9wdHMubkN1cnJlbnQgPSBTZW5kRGxnSXRlbU1lc3NhZ2VXKGhXbmQsSURDX1NUUkVBTSxDQl9HRVRDVVJTRUwsMCwwKTsKICBpZiAoU2F2ZU9wdHMubkN1cnJlbnQgPCAwKQogICAgcmV0dXJuOwoKICBpZiAoRkFJTEVEKEFWSVN0cmVhbUluZm9XKFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSkpKQogICAgcmV0dXJuOwoKICBBVklTdHJlYW1Gb3JtYXRTaXplKFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sc0luZm8uZHdTdGFydCwmc2l6ZSk7CiAgaWYgKHNpemUgPiAwKSB7CiAgICBzekZvcm1hdFswXSA9IDA7CgogICAgLyogcmVhZCBmb3JtYXQgdG8gYnVpbGQgZm9ybWF0IGRlc2NyaXB0aW9uIHN0cmluZyAqLwogICAgbHBGb3JtYXQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSk7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkgewogICAgICBpZiAoU1VDQ0VFREVEKEFWSVN0cmVhbVJlYWRGb3JtYXQoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSxzSW5mby5kd1N0YXJ0LGxwRm9ybWF0LCAmc2l6ZSkpKSB7CglpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8pIHsKCSAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmkgPSBscEZvcm1hdDsKCSAgSUNJTkZPIGljaW5mbzsKCgkgIHdzcHJpbnRmVyhzekZvcm1hdCwgc3pWaWRlb0ZtdCwgbHBiaS0+YmlXaWR0aCwKCQkgICAgbHBiaS0+YmlIZWlnaHQsIGxwYmktPmJpQml0Q291bnQpOwoKCSAgaWYgKGxwYmktPmJpQ29tcHJlc3Npb24gIT0gQklfUkdCKSB7CgkgICAgSElDICAgIGhpYzsKCgkgICAgaGljID0gSUNMb2NhdGUoSUNUWVBFX1ZJREVPLCBzSW5mby5mY2NIYW5kbGVyLCBscEZvcm1hdCwKCQkJICAgTlVMTCwgSUNNT0RFX0RFQ09NUFJFU1MpOwoJICAgIGlmIChoaWMgIT0gTlVMTCkgewoJICAgICAgaWYgKElDR2V0SW5mbyhoaWMsICZpY2luZm8sIHNpemVvZihpY2luZm8pKSA9PSBTX09LKQoJCWxzdHJjYXRXKHN6Rm9ybWF0LCBpY2luZm8uc3pEZXNjcmlwdGlvbik7CgkgICAgICBJQ0Nsb3NlKGhpYyk7CgkgICAgfQoJICB9IGVsc2UgewoJICAgIExvYWRTdHJpbmdXKEFWSUZJTEVfaE1vZHVsZSwgSURTX1VOQ09NUFJFU1NFRCwKCQkJaWNpbmZvLnN6RGVzY3JpcHRpb24sIHNpemVvZihpY2luZm8uc3pEZXNjcmlwdGlvbikpOwoJICAgIGxzdHJjYXRXKHN6Rm9ybWF0LCBpY2luZm8uc3pEZXNjcmlwdGlvbik7CgkgIH0KCX0gZWxzZSBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlQVVESU8pIHsKCSAgQUNNRk9STUFUVEFHREVUQUlMU1cgYWZ0ZDsKCSAgQUNNRk9STUFUREVUQUlMU1cgICAgYWZkOwoKCSAgbWVtc2V0KCZhZnRkLCAwLCBzaXplb2YoYWZ0ZCkpOwoJICBtZW1zZXQoJmFmZCwgMCwgc2l6ZW9mKGFmZCkpOwoKCSAgYWZ0ZC5jYlN0cnVjdCAgICAgPSBzaXplb2YoYWZ0ZCk7CgkgIGFmdGQuZHdGb3JtYXRUYWcgID0gYWZkLmR3Rm9ybWF0VGFnID0KCSAgICAoKFBXQVZFRk9STUFURVgpbHBGb3JtYXQpLT53Rm9ybWF0VGFnOwoJICBhZnRkLmNiRm9ybWF0U2l6ZSA9IGFmZC5jYndmeCA9IHNpemU7CgoJICBhZmQuY2JTdHJ1Y3QgICAgICA9IHNpemVvZihhZmQpOwoJICBhZmQucHdmeCAgICAgICAgICA9IGxwRm9ybWF0OwoKCSAgaWYgKGFjbUZvcm1hdFRhZ0RldGFpbHNXKE5VTEwsICZhZnRkLAoJCQkJICAgQUNNX0ZPUk1BVFRBR0RFVEFJTFNGX0ZPUk1BVFRBRykgPT0gU19PSykgewoJICAgIGlmIChhY21Gb3JtYXREZXRhaWxzVyhOVUxMLCZhZmQsQUNNX0ZPUk1BVERFVEFJTFNGX0ZPUk1BVCkgPT0gU19PSykKCSAgICAgIHdzcHJpbnRmVyhzekZvcm1hdCwgc3pBdWRpb0ZtdCwgYWZkLnN6Rm9ybWF0LCBhZnRkLnN6Rm9ybWF0VGFnKTsKCSAgfQoJfQogICAgICB9CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwRm9ybWF0KTsKICAgIH0KCiAgICAvKiBzZXQgdGV4dCBmb3IgZm9ybWF0IGRlc2NyaXB0aW9uICovCiAgICBTZXREbGdJdGVtVGV4dFcoaFduZCwgSURDX0ZPUk1BVFRFWFQsIHN6Rm9ybWF0KTsKCiAgICAvKiBEaXNhYmxlIG9wdGlvbiBidXR0b24gZm9yIHVuc3VwcG9ydGVkIHN0cmVhbXR5cGVzICovCiAgICBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8gfHwKCXNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZUFVRElPKQogICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfT1BUSU9OUyksIFRSVUUpOwogICAgZWxzZQogICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfT1BUSU9OUyksIEZBTFNFKTsKICB9Cgp9CgpzdGF0aWMgSU5UX1BUUiBDQUxMQkFDSyBBVklTYXZlT3B0aW9uc0RsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHVNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiAgRFdPUkQgZHdJbnRlcmxlYXZlOwogIEJPT0wgIGJJc0ludGVybGVhdmVkOwogIElOVCAgIG47CgogIC8qVFJBQ0UoIiglcCwldSwweCUwNFgsMHglMDhsWClcbiIsIGhXbmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsqLwoKICBzd2l0Y2ggKHVNc2cpIHsKICBjYXNlIFdNX0lOSVRESUFMT0c6CiAgICBTYXZlT3B0cy5uQ3VycmVudCA9IDA7CiAgICBpZiAoU2F2ZU9wdHMublN0cmVhbXMgPT0gMSkgewogICAgICBFbmREaWFsb2coaFduZCwgQVZJU2F2ZU9wdGlvbnNGbXRDaG9vc2UoaFduZCkpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KCiAgICAvKiBhZGQgc3RyZWFtcyAqLwogICAgZm9yIChuID0gMDsgbiA8IFNhdmVPcHRzLm5TdHJlYW1zOyBuKyspIHsKICAgICAgQVZJU1RSRUFNSU5GT1cgc0luZm87CgogICAgICBBVklTdHJlYW1JbmZvVyhTYXZlT3B0cy5wcGF2aXNbbl0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgICAgIFNlbmREbGdJdGVtTWVzc2FnZVcoaFduZCwgSURDX1NUUkVBTSwgQ0JfQUREU1RSSU5HLAoJCQkgIDBMLCAoTFBBUkFNKXNJbmZvLnN6TmFtZSk7CiAgICB9CgogICAgLyogc2VsZWN0IGZpcnN0IHN0cmVhbSAqLwogICAgU2VuZERsZ0l0ZW1NZXNzYWdlVyhoV25kLCBJRENfU1RSRUFNLCBDQl9TRVRDVVJTRUwsIDAsIDApOwogICAgU2VuZE1lc3NhZ2VXKGhXbmQsIFdNX0NPTU1BTkQsIE1BS0VMT05HKElEQ19TVFJFQU0sIENCTl9TRUxDSEFOR0UpLCAoTFBBUkFNKWhXbmQpOwoKICAgIC8qIGluaXRpYWxpemUgaW50ZXJsZWF2ZSAqLwogICAgaWYgKFNhdmVPcHRzLnBwT3B0aW9uc1swXSAhPSBOVUxMICYmCgkoU2F2ZU9wdHMucHBPcHRpb25zWzBdLT5kd0ZsYWdzICYgQVZJQ09NUFJFU1NGX1ZBTElEKSkgewogICAgICBiSXNJbnRlcmxlYXZlZCA9IChTYXZlT3B0cy5wcE9wdGlvbnNbMF0tPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfSU5URVJMRUFWRSk7CiAgICAgIGR3SW50ZXJsZWF2ZSA9IFNhdmVPcHRzLnBwT3B0aW9uc1swXS0+ZHdJbnRlcmxlYXZlRXZlcnk7CiAgICB9IGVsc2UgewogICAgICBiSXNJbnRlcmxlYXZlZCA9IFRSVUU7CiAgICAgIGR3SW50ZXJsZWF2ZSAgID0gMDsKICAgIH0KICAgIENoZWNrRGxnQnV0dG9uKGhXbmQsIElEQ19JTlRFUkxFQVZFLCBiSXNJbnRlcmxlYXZlZCk7CiAgICBTZXREbGdJdGVtSW50KGhXbmQsIElEQ19JTlRFUkxFQVZFRVZFUlksIGR3SW50ZXJsZWF2ZSwgRkFMU0UpOwogICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaFduZCwgSURDX0lOVEVSTEVBVkVFVkVSWSksIGJJc0ludGVybGVhdmVkKTsKICAgIGJyZWFrOwogIGNhc2UgV01fQ09NTUFORDoKICAgIHN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIHsKICAgIGNhc2UgSURPSzoKICAgICAgLyogZ2V0IGRhdGEgZnJvbSBjb250cm9scyBhbmQgc2F2ZSB0aGVtICovCiAgICAgIGR3SW50ZXJsZWF2ZSAgID0gR2V0RGxnSXRlbUludChoV25kLCBJRENfSU5URVJMRUFWRUVWRVJZLCBOVUxMLCAwKTsKICAgICAgYklzSW50ZXJsZWF2ZWQgPSBJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgSURDX0lOVEVSTEVBVkUpOwogICAgICBmb3IgKG4gPSAwOyBuIDwgU2F2ZU9wdHMublN0cmVhbXM7IG4rKykgewoJaWYgKFNhdmVPcHRzLnBwT3B0aW9uc1tuXSAhPSBOVUxMKSB7CgkgIGlmIChiSXNJbnRlcmxlYXZlZCkgewoJICAgIFNhdmVPcHRzLnBwT3B0aW9uc1tuXS0+ZHdGbGFncyB8PSBBVklDT01QUkVTU0ZfSU5URVJMRUFWRTsKCSAgICBTYXZlT3B0cy5wcE9wdGlvbnNbbl0tPmR3SW50ZXJsZWF2ZUV2ZXJ5ID0gZHdJbnRlcmxlYXZlOwoJICB9IGVsc2UKCSAgICBTYXZlT3B0cy5wcE9wdGlvbnNbbl0tPmR3RmxhZ3MgJj0gfkFWSUNPTVBSRVNTRl9JTlRFUkxFQVZFOwoJfQogICAgICB9CiAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgY2FzZSBJRENBTkNFTDoKICAgICAgRW5kRGlhbG9nKGhXbmQsIExPV09SRCh3UGFyYW0pID09IElET0spOwogICAgICBicmVhazsKICAgIGNhc2UgSURDX0lOVEVSTEVBVkU6CiAgICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIElEQ19JTlRFUkxFQVZFRVZFUlkpLAoJCSAgIElzRGxnQnV0dG9uQ2hlY2tlZChoV25kLCBJRENfSU5URVJMRUFWRSkpOwogICAgICBicmVhazsKICAgIGNhc2UgSURDX1NUUkVBTToKICAgICAgaWYgKEhJV09SRCh3UGFyYW0pID09IENCTl9TRUxDSEFOR0UpIHsKCS8qIHVwZGF0ZSBjb250cm9sIGVsZW1lbnRzICovCglBVklTYXZlT3B0aW9uc1VwZGF0ZShoV25kKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgSURDX09QVElPTlM6CiAgICAgIEFWSVNhdmVPcHRpb25zRm10Q2hvb3NlKGhXbmQpOwogICAgICBicmVhazsKICAgIH07CiAgICByZXR1cm4gVFJVRTsKICB9OwoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZU9wdGlvbnMJCShBVklGSUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgQVZJU2F2ZU9wdGlvbnMoSFdORCBoV25kLCBVSU5UIHVGbGFncywgSU5UIG5TdHJlYW1zLAoJCQkgICBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBwT3B0aW9ucykKewogIExQQVZJQ09NUFJFU1NPUFRJT05TIHBTYXZlZE9wdGlvbnMgPSBOVUxMOwogIElOVCByZXQsIG47CgogIFRSQUNFKCIoJXAsMHglWCwlZCwlcCwlcClcbiIsIGhXbmQsIHVGbGFncywgblN0cmVhbXMsCglwcGF2aSwgcHBPcHRpb25zKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChuU3RyZWFtcyA8PSAwIHx8IHBwYXZpID09IE5VTEwgfHwgcHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAvKiBzYXZlIG9wdGlvbnMgaW4gY2FzZSB0aGUgdXNlciBwcmVzc2VzIGNhbmNlbCAqLwogIGlmIChwcE9wdGlvbnMgIT0gTlVMTCAmJiBuU3RyZWFtcyA+IDEpIHsKICAgIHBTYXZlZE9wdGlvbnMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgblN0cmVhbXMgKiBzaXplb2YoQVZJQ09NUFJFU1NPUFRJT05TKSk7CiAgICBpZiAocFNhdmVkT3B0aW9ucyA9PSBOVUxMKQogICAgICByZXR1cm4gRkFMU0U7CgogICAgZm9yIChuID0gMDsgbiA8IG5TdHJlYW1zOyBuKyspIHsKICAgICAgaWYgKHBwT3B0aW9uc1tuXSAhPSBOVUxMKQoJbWVtY3B5KHBTYXZlZE9wdGlvbnMgKyBuLCBwcE9wdGlvbnNbbl0sIHNpemVvZihBVklDT01QUkVTU09QVElPTlMpKTsKICAgIH0KICB9CgogIFNhdmVPcHRzLnVGbGFncyAgICA9IHVGbGFnczsKICBTYXZlT3B0cy5uU3RyZWFtcyAgPSBuU3RyZWFtczsKICBTYXZlT3B0cy5wcGF2aXMgICAgPSBwcGF2aTsKICBTYXZlT3B0cy5wcE9wdGlvbnMgPSBwcE9wdGlvbnM7CgogIHJldCA9IERpYWxvZ0JveFcoQVZJRklMRV9oTW9kdWxlLCBNQUtFSU5UUkVTT1VSQ0VXKElERF9TQVZFT1BUSU9OUyksCgkJICAgaFduZCwgQVZJU2F2ZU9wdGlvbnNEbGdQcm9jKTsKCiAgaWYgKHJldCA9PSAtMSkKICAgIHJldCA9IEZBTFNFOwoKICAvKiByZXN0b3JlIG9wdGlvbnMgd2hlbiB1c2VyIHByZXNzZWQgY2FuY2VsICovCiAgaWYgKHBTYXZlZE9wdGlvbnMgIT0gTlVMTCkgewogICAgaWYgKHJldCA9PSBGQUxTRSkgewogICAgICBmb3IgKG4gPSAwOyBuIDwgblN0cmVhbXM7IG4rKykgewoJaWYgKHBwT3B0aW9uc1tuXSAhPSBOVUxMKQoJICBtZW1jcHkocHBPcHRpb25zW25dLCBwU2F2ZWRPcHRpb25zICsgbiwgc2l6ZW9mKEFWSUNPTVBSRVNTT1BUSU9OUykpOwogICAgICB9CiAgICB9CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwU2F2ZWRPcHRpb25zKTsKICB9CgogIHJldHVybiAoQk9PTClyZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUwzMi5AKQogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUxFLjEyNCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVPcHRpb25zRnJlZShJTlQgblN0cmVhbXMsTFBBVklDT01QUkVTU09QVElPTlMqcHBPcHRpb25zKQp7CiAgVFJBQ0UoIiglZCwlcClcbiIsIG5TdHJlYW1zLCBwcE9wdGlvbnMpOwoKICBpZiAoblN0cmVhbXMgPCAwIHx8IHBwT3B0aW9ucyA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgZm9yICg7IG5TdHJlYW1zID4gMDsgblN0cmVhbXMtLSkgewogICAgaWYgKHBwT3B0aW9uc1tuU3RyZWFtc10gIT0gTlVMTCkgewogICAgICBwcE9wdGlvbnNbblN0cmVhbXNdLT5kd0ZsYWdzICY9IH5BVklDT01QUkVTU0ZfVkFMSUQ7CgogICAgICBpZiAocHBPcHRpb25zW25TdHJlYW1zXS0+bHBQYXJtcyAhPSBOVUxMKSB7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwcE9wdGlvbnNbblN0cmVhbXNdLT5scFBhcm1zKTsKCXBwT3B0aW9uc1tuU3RyZWFtc10tPmxwUGFybXMgPSBOVUxMOwoJcHBPcHRpb25zW25TdHJlYW1zXS0+Y2JQYXJtcyA9IDA7CiAgICAgIH0KICAgICAgaWYgKHBwT3B0aW9uc1tuU3RyZWFtc10tPmxwRm9ybWF0ICE9IE5VTEwpIHsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBwT3B0aW9uc1tuU3RyZWFtc10tPmxwRm9ybWF0KTsKCXBwT3B0aW9uc1tuU3RyZWFtc10tPmxwRm9ybWF0ID0gTlVMTDsKCXBwT3B0aW9uc1tuU3RyZWFtc10tPmNiRm9ybWF0ID0gMDsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIEFWSUVSUl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTYXZlVkEJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU2F2ZVZBKExQQ1NUUiBzekZpbGUsIENMU0lEICpwY2xzaWRIYW5kbGVyLAoJCQkgQVZJU0FWRUNBTExCQUNLIGxwZm5DYWxsYmFjaywgaW50IG5TdHJlYW0sCgkJCSBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBscE9wdGlvbnMpCnsKICBMUFdTVFIgIHdzekZpbGUgPSBOVUxMOwogIEhSRVNVTFQgaHI7CiAgaW50ICAgICBsZW47CgogIFRSQUNFKCIlcywlcCwlcCwlZCwlcCwlcClcbiIsIGRlYnVnc3RyX2Eoc3pGaWxlKSwgcGNsc2lkSGFuZGxlciwKCWxwZm5DYWxsYmFjaywgblN0cmVhbSwgcHBhdmksIHBscE9wdGlvbnMpOwoKICBpZiAoc3pGaWxlID09IE5VTEwgfHwgcHBhdmkgPT0gTlVMTCB8fCBwbHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAvKiBjb252ZXJ0IEFTQ0lJIHN0cmluZyB0byBVbmljb2RlIGFuZCBjYWxsIFVuaWNvZGUgZnVuY3Rpb24gKi8KICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgc3pGaWxlLCAtMSwgTlVMTCwgMCk7CiAgaWYgKGxlbiA8PSAwKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgd3N6RmlsZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpKTsKICBpZiAod3N6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzekZpbGUsIC0xLCB3c3pGaWxlLCBsZW4pOwoKICBociA9IEFWSVNhdmVWVyh3c3pGaWxlLCBwY2xzaWRIYW5kbGVyLCBscGZuQ2FsbGJhY2ssCgkJIG5TdHJlYW0sIHBwYXZpLCBwbHBPcHRpb25zKTsKCiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd3N6RmlsZSk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGSUxFX0FWSVNhdmVEZWZhdWx0Q2FsbGJhY2sJKGludGVybmFsKQogKi8Kc3RhdGljIEJPT0wgV0lOQVBJIEFWSUZJTEVfQVZJU2F2ZURlZmF1bHRDYWxsYmFjayhJTlQgcHJvZ3Jlc3MpCnsKICBUUkFDRSgiKCVkKVxuIiwgcHJvZ3Jlc3MpOwoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZVZXCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVWVyhMUENXU1RSIHN6RmlsZSwgQ0xTSUQgKnBjbHNpZEhhbmRsZXIsCgkJCSBBVklTQVZFQ0FMTEJBQ0sgbHBmbkNhbGxiYWNrLCBpbnQgblN0cmVhbXMsCgkJCSBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBscE9wdGlvbnMpCnsKICBMT05HICAgICAgICAgICBsU3RhcnRbTUFYX0FWSVNUUkVBTVNdOwogIFBBVklTVFJFQU0gICAgIHBPdXRTdHJlYW1zW01BWF9BVklTVFJFQU1TXTsKICBQQVZJU1RSRUFNICAgICBwSW5TdHJlYW1zW01BWF9BVklTVFJFQU1TXTsKICBBVklGSUxFSU5GT1cgICBmSW5mbzsKICBBVklTVFJFQU1JTkZPVyBzSW5mbzsKCiAgUEFWSUZJTEUgICAgICAgcGZpbGUgPSBOVUxMOyAvKiB0aGUgb3V0cHV0IEFWSSBmaWxlICovCiAgTE9ORyAgICAgICAgICAgbEZpcnN0VmlkZW8gPSAtMTsKICBpbnQgICAgICAgICAgICBjdXJTdHJlYW07CgogIC8qIGZvciBpbnRlcmxlYXZpbmcgLi4uICovCiAgRFdPUkQgICAgICAgICAgZHdJbnRlcmxlYXZlID0gMDsgLyogaW50ZXJsZWF2ZSByYXRlICovCiAgRFdPUkQgICAgICAgICAgZHdGaWxlSW5pdGlhbEZyYW1lczsKICBMT05HICAgICAgICAgICBsRmlsZUxlbmd0aDsKICBMT05HICAgICAgICAgICBsU2FtcGxlSW5jOwoKICAvKiBmb3IgcmVhZGluZy93cml0aW5nIHRoZSBkYXRhIC4uLiAqLwogIExQVk9JRCAgICAgICAgIGxwQnVmZmVyID0gTlVMTDsKICBMT05HICAgICAgICAgICBjYkJ1ZmZlcjsgICAgICAgIC8qIHJlYWwgc2l6ZSBvZiBscEJ1ZmZlciAqLwogIExPTkcgICAgICAgICAgIGxCdWZmZXJTaXplOyAgICAgLyogbmVlZGVkIGJ5dGVzIGZvciBmb3JtYXQocyksIGV0Yy4gKi8KICBMT05HICAgICAgICAgICBsUmVhZEJ5dGVzOwogIExPTkcgICAgICAgICAgIGxSZWFkU2FtcGxlczsKICBIUkVTVUxUICAgICAgICBocmVzOwoKICBUUkFDRSgiKCVzLCVwLCVwLCVkLCVwLCVwKVxuIiwgZGVidWdzdHJfdyhzekZpbGUpLCBwY2xzaWRIYW5kbGVyLAoJbHBmbkNhbGxiYWNrLCBuU3RyZWFtcywgcHBhdmksIHBscE9wdGlvbnMpOwoKICBpZiAoc3pGaWxlID09IE5VTEwgfHwgcHBhdmkgPT0gTlVMTCB8fCBwbHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwogIGlmIChuU3RyZWFtcyA+PSBNQVhfQVZJU1RSRUFNUykgewogICAgV0FSTigiQ2FuJ3Qgd3JpdGUgQVZJIHdpdGggJWQgc3RyZWFtcyBvbmx5IHN1cHBvcnRzICVkIC0tIGNoYW5nZSBNQVhfQVZJU1RSRUFNUyFcbiIsIG5TdHJlYW1zLCBNQVhfQVZJU1RSRUFNUyk7CiAgICByZXR1cm4gQVZJRVJSX0lOVEVSTkFMOwogIH0KCiAgaWYgKGxwZm5DYWxsYmFjayA9PSBOVUxMKQogICAgbHBmbkNhbGxiYWNrID0gQVZJRklMRV9BVklTYXZlRGVmYXVsdENhbGxiYWNrOwoKICAvKiBjbGVhciBsb2NhbCB2YXJpYWJsZShzKSAqLwogIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CiAgICBwSW5TdHJlYW1zW2N1clN0cmVhbV0gID0gTlVMTDsKICAgIHBPdXRTdHJlYW1zW2N1clN0cmVhbV0gPSBOVUxMOwogIH0KCiAgLyogb3BlbiBvdXRwdXQgQVZJIGZpbGUgKGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0KSAqLwogIGhyZXMgPSBBVklGaWxlT3BlblcoJnBmaWxlLCBzekZpbGUsIE9GX0NSRUFURXxPRl9TSEFSRV9FWENMVVNJVkV8T0ZfV1JJVEUsCgkJICAgICAgcGNsc2lkSGFuZGxlcik7CiAgaWYgKEZBSUxFRChocmVzKSkKICAgIHJldHVybiBocmVzOwogIEFWSUZpbGVJbmZvVyhwZmlsZSwgJmZJbmZvLCBzaXplb2YoZkluZm8pKTsgLyogZm9yIGR3Q2FwcyAqLwoKICAvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgcGFydCAxICovCiAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgIFBBVklTVFJFQU0gcEN1clN0cmVhbSA9IHBwYXZpW2N1clN0cmVhbV07CgogICAgaHJlcyA9IEFWSVN0cmVhbUluZm9XKHBDdXJTdHJlYW0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgICBpZiAoRkFJTEVEKGhyZXMpKQogICAgICBnb3RvIGVycm9yOwoKICAgIC8qIHNlYXJjaCBmaXJzdCB2aWRlbyBzdHJlYW0gYW5kIGNoZWNrIGZvciBpbnRlcmxlYXZpbmcgKi8KICAgIGlmIChzSW5mby5mY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTykgewogICAgICAvKiByZW1lbWJlciBmaXJzdCB2aWRlbyBzdHJlYW0gLS0gbmVlZGVkIGZvciBpbnRlcmxlYXZpbmcgKi8KICAgICAgaWYgKGxGaXJzdFZpZGVvIDwgMCkKCWxGaXJzdFZpZGVvID0gY3VyU3RyZWFtOwogICAgfSBlbHNlIGlmICghZHdJbnRlcmxlYXZlICYmIHBscE9wdGlvbnMgIT0gTlVMTCkgewogICAgICAvKiBjaGVjayBpZiBhbnkgbm9uLXZpZGVvIHN0cmVhbSB3YW50cyB0byBiZSBpbnRlcmxlYXZlZCAqLwogICAgICBXQVJOKCJvcHRpb25zLmZsYWdzPTB4JWxYIG9wdGlvbnMuZHdJbnRlcmxlYXZlPSVsdVxuIixwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3RmxhZ3MscGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0ludGVybGVhdmVFdmVyeSk7CiAgICAgIGlmIChwbHBPcHRpb25zW2N1clN0cmVhbV0gIT0gTlVMTCAmJgoJICBwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfSU5URVJMRUFWRSkKCWR3SW50ZXJsZWF2ZSA9IHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdJbnRlcmxlYXZlRXZlcnk7CiAgICB9CgogICAgLyogY3JlYXRlIGRlLS9jb21wcmVzc2VkIHN0cmVhbSBpbnRlcmZhY2UgaWYgbmVlZGVkICovCiAgICBwSW5TdHJlYW1zW2N1clN0cmVhbV0gPSBOVUxMOwogICAgaWYgKHBscE9wdGlvbnMgIT0gTlVMTCAmJiBwbHBPcHRpb25zW2N1clN0cmVhbV0gIT0gTlVMTCkgewogICAgICBpZiAocGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5mY2NIYW5kbGVyIHx8CgkgIHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+bHBGb3JtYXQgIT0gTlVMTCkgewoJRFdPUkQgZHdLZXlTYXZlID0gcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0tleUZyYW1lRXZlcnk7CgoJaWYgKGZJbmZvLmR3Q2FwcyAmIEFWSUZJTEVDQVBTX0FMTEtFWUZSQU1FUykKCSAgcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0tleUZyYW1lRXZlcnkgPSAxOwoKCWhyZXMgPSBBVklNYWtlQ29tcHJlc3NlZFN0cmVhbSgmcEluU3RyZWFtc1tjdXJTdHJlYW1dLCBwQ3VyU3RyZWFtLAoJCQkJICAgICAgIHBscE9wdGlvbnNbY3VyU3RyZWFtXSwgTlVMTCk7CglwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3S2V5RnJhbWVFdmVyeSA9IGR3S2V5U2F2ZTsKCWlmIChGQUlMRUQoaHJlcykgfHwgcEluU3RyZWFtc1tjdXJTdHJlYW1dID09IE5VTEwpIHsKCSAgcEluU3RyZWFtc1tjdXJTdHJlYW1dID0gTlVMTDsKCSAgZ290byBlcnJvcjsKCX0KCgkvKiB0ZXN0IHN0cmVhbSBpbnRlcmZhY2UgYW5kIHVwZGF0ZSBzdHJlYW0taW5mbyAqLwoJaHJlcyA9IEFWSVN0cmVhbUluZm9XKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKCWlmIChGQUlMRUQoaHJlcykpCgkgIGdvdG8gZXJyb3I7CiAgICAgIH0KICAgIH0KCiAgICAvKiBub3cgaGFuZGxlIHN0cmVhbXMgd2hpY2ggd2lsbCBvbmx5IGJlIGNvcGllZCAqLwogICAgaWYgKHBJblN0cmVhbXNbY3VyU3RyZWFtXSA9PSBOVUxMKSB7CiAgICAgIHBDdXJTdHJlYW0gPSBwSW5TdHJlYW1zW2N1clN0cmVhbV0gPSBwcGF2aVtjdXJTdHJlYW1dOwogICAgICBBVklTdHJlYW1BZGRSZWYocEN1clN0cmVhbSk7CiAgICB9IGVsc2UKICAgICAgcEN1clN0cmVhbSA9IHBJblN0cmVhbXNbY3VyU3RyZWFtXTsKCiAgICBsU3RhcnRbY3VyU3RyZWFtXSA9IHNJbmZvLmR3U3RhcnQ7CiAgfSAvKiBmb3IgYWxsIHN0cmVhbXMgKi8KCiAgLyogY2hlY2sgdGhhdCBmaXJzdCB2aWRlbyBzdHJlYW0gaXMgdGhlIGZpcnN0IHN0cmVhbSAqLwogIGlmIChsRmlyc3RWaWRlbyA+IDApIHsKICAgIFBBVklTVFJFQU0gcFRtcCA9IHBJblN0cmVhbXNbbEZpcnN0VmlkZW9dOwogICAgTE9ORyBsVG1wID0gbFN0YXJ0W2xGaXJzdFZpZGVvXTsKCiAgICBwSW5TdHJlYW1zW2xGaXJzdFZpZGVvXSA9IHBJblN0cmVhbXNbMF07CiAgICBwSW5TdHJlYW1zWzBdID0gcFRtcDsKICAgIGxTdGFydFtsRmlyc3RWaWRlb10gPSBsU3RhcnRbMF07CiAgICBsU3RhcnRbMF0gPSBsVG1wOwogICAgbEZpcnN0VmlkZW8gPSAwOwogIH0KCiAgLyogYWxsb2NhdGUgYnVmZmVyIGZvciBmb3JtYXRzLCBkYXRhLCBldGMuIG9mIGFuIGluaXRpYWwgc2l6ZSBvZiA2NCBrQnl0ZXMqLwogIGNiQnVmZmVyID0gMHgwMDAxMDAwMDsKICBscEJ1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBjYkJ1ZmZlcik7CiAgaWYgKGxwQnVmZmVyID09IE5VTEwpIHsKICAgIGhyZXMgPSBBVklFUlJfTUVNT1JZOwogICAgZ290byBlcnJvcjsKICB9CgogIEFWSVN0cmVhbUluZm9XKHBJblN0cmVhbXNbMF0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgbEZpbGVMZW5ndGggPSBzSW5mby5kd0xlbmd0aDsKICBkd0ZpbGVJbml0aWFsRnJhbWVzID0gMDsKICBpZiAobEZpcnN0VmlkZW8gPj0gMCkgewogICAgLyogY2hlY2sgZm9yIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgZm9ybWF0CiAgICAgKiAgLS0gbmVlZCBhdCBsZWFzdCBCSVRNQVBJTkZPSEVBREVSIG9yIG5ld2VyCiAgICAgKi8KICAgIGxTYW1wbGVJbmMgPSAxOwogICAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbbEZpcnN0VmlkZW9dLCBBVklTdHJlYW1TdGFydChwSW5TdHJlYW1zW2xGaXJzdFZpZGVvXSksIGxwQnVmZmVyLCAmbEJ1ZmZlclNpemUpOwogICAgaWYgKGxCdWZmZXJTaXplIDwgKExPTkcpc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKQogICAgICBocmVzID0gQVZJRVJSX0lOVEVSTkFMOwogICAgaWYgKEZBSUxFRChocmVzKSkKICAgICAgZ290byBlcnJvcjsKICB9IGVsc2UgLyogdXNlIG9uZSBzZWNvbmQgYmxvY2tzIGZvciBpbnRlcmxlYXZpbmcgaWYgbm8gdmlkZW8gcHJlc2VudCAqLwogICAgbFNhbXBsZUluYyA9IEFWSVN0cmVhbVRpbWVUb1NhbXBsZShwSW5TdHJlYW1zWzBdLCAxMDAwMDAwKTsKCiAgLyogY3JlYXRlIG91dHB1dCBzdHJlYW1zICovCiAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgIEFWSVN0cmVhbUluZm9XKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKCiAgICBzSW5mby5kd0luaXRpYWxGcmFtZXMgPSAwOwogICAgaWYgKGR3SW50ZXJsZWF2ZSAhPSAwICYmIGN1clN0cmVhbSA+IDAgJiYgc0luZm8uZmNjVHlwZSAhPSBzdHJlYW10eXBlVklERU8pIHsKICAgICAgLyogNzUwIG1zIGluaXRpYWwgZnJhbWVzIGZvciBub24tdmlkZW8gc3RyZWFtcyAqLwogICAgICBzSW5mby5kd0luaXRpYWxGcmFtZXMgPSBBVklTdHJlYW1UaW1lVG9TYW1wbGUocEluU3RyZWFtc1swXSwgNzUwKTsKICAgIH0KCiAgICBocmVzID0gQVZJRmlsZUNyZWF0ZVN0cmVhbVcocGZpbGUsICZwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAmc0luZm8pOwogICAgaWYgKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0gIT0gTlVMTCAmJiBTVUNDRUVERUQoaHJlcykpIHsKICAgICAgLyogY29weSBpbml0aWFsIGZvcm1hdCBmb3IgdGhpcyBzdHJlYW0gKi8KICAgICAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKICAgICAgaHJlcyA9IEFWSVN0cmVhbVJlYWRGb3JtYXQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkJIGxwQnVmZmVyLCAmbEJ1ZmZlclNpemUpOwogICAgICBpZiAoRkFJTEVEKGhyZXMpKQoJZ290byBlcnJvcjsKICAgICAgaHJlcyA9IEFWSVN0cmVhbVNldEZvcm1hdChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAwLCBscEJ1ZmZlciwgbEJ1ZmZlclNpemUpOwogICAgICBpZiAoRkFJTEVEKGhyZXMpKQoJZ290byBlcnJvcjsKCiAgICAgIC8qIHRyeSB0byBjb3B5IHN0cmVhbSBoYW5kbGVyIGRhdGEgKi8KICAgICAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKICAgICAgaHJlcyA9IEFWSVN0cmVhbVJlYWREYXRhKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgY2tpZFNUUkVBTUhBTkRMRVJEQVRBLAoJCQkgICAgICAgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CiAgICAgIGlmIChTVUNDRUVERUQoaHJlcykgJiYgbEJ1ZmZlclNpemUgPiAwKSB7CglocmVzID0gQVZJU3RyZWFtV3JpdGVEYXRhKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sY2tpZFNUUkVBTUhBTkRMRVJEQVRBLAoJCQkJICBscEJ1ZmZlciwgbEJ1ZmZlclNpemUpOwoJaWYgKEZBSUxFRChocmVzKSkKCSAgZ290byBlcnJvcjsKICAgICAgfQoKICAgICAgaWYgKGR3RmlsZUluaXRpYWxGcmFtZXMgPCBzSW5mby5kd0luaXRpYWxGcmFtZXMpCglkd0ZpbGVJbml0aWFsRnJhbWVzID0gc0luZm8uZHdJbml0aWFsRnJhbWVzOwogICAgICBsUmVhZEJ5dGVzID0KCUFWSVN0cmVhbVNhbXBsZVRvU2FtcGxlKHBPdXRTdHJlYW1zWzBdLCBwSW5TdHJlYW1zW2N1clN0cmVhbV0sCgkJCQlzSW5mby5kd0xlbmd0aCk7CiAgICAgIGlmIChsRmlsZUxlbmd0aCA8IGxSZWFkQnl0ZXMpCglsRmlsZUxlbmd0aCA9IGxSZWFkQnl0ZXM7CiAgICB9IGVsc2UgewogICAgICAvKiBjcmVhdGlvbiBvZiBkZS0vY29tcHJlc3Npb24gc3RyZWFtIGludGVyZmFjZSBmYWlsZWQgKi8KICAgICAgV0FSTigiY3JlYXRpb24gb2YgKGRlLSljb21wcmVzc2lvbiBzdHJlYW0gZmFpbGVkIGZvciBzdHJlYW0gJWRcbiIsY3VyU3RyZWFtKTsKICAgICAgQVZJU3RyZWFtUmVsZWFzZShwSW5TdHJlYW1zW2N1clN0cmVhbV0pOwogICAgICBpZiAoY3VyU3RyZWFtICsgMSA+PSBuU3RyZWFtcykgewoJLyogbW92ZSB0aGUgb3RoZXJzIG9uZSB1cCAqLwoJUEFWSVNUUkVBTSAqcHBhcyA9ICZwSW5TdHJlYW1zW2N1clN0cmVhbV07CglpbnQgICAgICAgICAgICBuID0gblN0cmVhbXMgLSAoY3VyU3RyZWFtICsgMSk7CgoJZG8gewoJICAqcHBhcyA9IHBJblN0cmVhbXNbY3VyU3RyZWFtICsgMV07Cgl9IHdoaWxlICgtLW4pOwogICAgICB9CiAgICAgIG5TdHJlYW1zLS07CiAgICAgIGN1clN0cmVhbS0tOwogICAgfQogIH0gLyogY3JlYXRlIG91dHB1dCBzdHJlYW1zIGZvciBhbGwgaW5wdXQgc3RyZWFtcyAqLwoKICAvKiBoYXZlIHdlIHN0aWxsIHNvbWV0aGluZyB0byB3cml0ZSwgb3IgbG9zdCBldmVyeXRoaW5nPyAqLwogIGlmIChuU3RyZWFtcyA8PSAwKQogICAgZ290byBlcnJvcjsKCiAgaWYgKGR3SW50ZXJsZWF2ZSkgewogICAgTE9ORyBsQ3VyRnJhbWUgPSAtZHdGaWxlSW5pdGlhbEZyYW1lczsKCiAgICAvKiBpbnRlcmxlYXZlZCBmaWxlICovCiAgICBpZiAoZHdJbnRlcmxlYXZlID09IDEpCiAgICAgIEFWSUZpbGVFbmRSZWNvcmQocGZpbGUpOwoKICAgIGZvciAoOyBsQ3VyRnJhbWUgPCBsRmlsZUxlbmd0aDsgbEN1ckZyYW1lICs9IGxTYW1wbGVJbmMpIHsKICAgICAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKCUxPTkcgbExhc3RTYW1wbGU7CgoJaHJlcyA9IEFWSVN0cmVhbUluZm9XKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CglpZiAoRkFJTEVEKGhyZXMpKQoJICBnb3RvIGVycm9yOwoKCS8qIGluaXRpYWwgZnJhbWVzIHBoYXNlIGF0IHRoZSBlbmQgZm9yIHRoaXMgc3RyZWFtPyAqLwoJaWYgKC0oTE9ORylzSW5mby5kd0luaXRpYWxGcmFtZXMgPiBsQ3VyRnJhbWUpCgkgIGNvbnRpbnVlOwoKCWlmICgobEZpbGVMZW5ndGggLSBsU2FtcGxlSW5jKSA8PSBsQ3VyRnJhbWUpIHsKCSAgbExhc3RTYW1wbGUgPSBBVklTdHJlYW1MZW5ndGgocEluU3RyZWFtc1tjdXJTdHJlYW1dKTsKCSAgbEZpcnN0VmlkZW8gPSBsTGFzdFNhbXBsZSArIEFWSVN0cmVhbVN0YXJ0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSk7Cgl9IGVsc2UgewoJICBpZiAoY3VyU3RyZWFtICE9IDApIHsKCSAgICBsRmlyc3RWaWRlbyA9CgkgICAgICBBVklTdHJlYW1TYW1wbGVUb1NhbXBsZShwSW5TdHJlYW1zW2N1clN0cmVhbV0sIHBJblN0cmVhbXNbMF0sCgkJCQkgICAgICAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8gPyAKCQkJCSAgICAgICAoTE9ORylkd0ludGVybGVhdmUgOiBsU2FtcGxlSW5jKSArCgkJCQkgICAgICBzSW5mby5kd0luaXRpYWxGcmFtZXMgKyBsQ3VyRnJhbWUpOwoJICB9IGVsc2UKCSAgICBsRmlyc3RWaWRlbyA9IGxTYW1wbGVJbmMgKyAoc0luZm8uZHdJbml0aWFsRnJhbWVzICsgbEN1ckZyYW1lKTsKCgkgIGxMYXN0U2FtcGxlID0gQVZJU3RyZWFtRW5kKHBJblN0cmVhbXNbY3VyU3RyZWFtXSk7CgkgIGlmIChsTGFzdFNhbXBsZSA8PSBsRmlyc3RWaWRlbykKCSAgICBsRmlyc3RWaWRlbyA9IGxMYXN0U2FtcGxlOwoJfQoKCS8qIGNvcHkgbmVlZGVkIHNhbXBsZXMgbm93ICovCglXQVJOKCJjb3B5IGZyb20gc3RyZWFtICVkIHNhbXBsZXMgJWxkIHRvICVsZC4uLlxuIixjdXJTdHJlYW0sCgkgICAgICBsU3RhcnRbY3VyU3RyZWFtXSxsRmlyc3RWaWRlbyk7Cgl3aGlsZSAobEZpcnN0VmlkZW8gPiBsU3RhcnRbY3VyU3RyZWFtXSkgewoJICBEV09SRCBmbGFncyA9IDA7CgoJICAvKiBjb3B5IGZvcm1hdCBpbiBjYXNlIGl0IGNhbiBjaGFuZ2UgKi8KCSAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKCSAgaHJlcyA9IEFWSVN0cmVhbVJlYWRGb3JtYXQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBsU3RhcnRbY3VyU3RyZWFtXSwKCQkJCSAgICAgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCSAgQVZJU3RyZWFtU2V0Rm9ybWF0KHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIGxTdGFydFtjdXJTdHJlYW1dLAoJCQkgICAgIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CgoJICAvKiB0cnkgdG8gcmVhZCBkYXRhIHVudGlsIHdlIGdvdCBpdCwgb3IgZXJyb3IgKi8KCSAgZG8gewoJICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgbFN0YXJ0W2N1clN0cmVhbV0sCgkJCQkgbEZpcnN0VmlkZW8gLSBsU3RhcnRbY3VyU3RyZWFtXSwgbHBCdWZmZXIsCgkJCQkgY2JCdWZmZXIsICZsUmVhZEJ5dGVzLCAmbFJlYWRTYW1wbGVzKTsKCSAgfSB3aGlsZSAoKGhyZXMgPT0gQVZJRVJSX0JVRkZFUlRPT1NNQUxMKSAmJgoJCSAgIChscEJ1ZmZlciA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQnVmZmVyLCBjYkJ1ZmZlciAqPSAyKSkgIT0gTlVMTCk7CgkgIGlmIChscEJ1ZmZlciA9PSBOVUxMKQoJICAgIGhyZXMgPSBBVklFUlJfTUVNT1JZOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgoJICBpZiAoQVZJU3RyZWFtSXNLZXlGcmFtZShwSW5TdHJlYW1zW2N1clN0cmVhbV0sIChMT05HKXNJbmZvLmR3U3RhcnQpKQoJICAgIGZsYWdzID0gQVZJSUZfS0VZRlJBTUU7CgkgIGhyZXMgPSBBVklTdHJlYW1Xcml0ZShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAtMSwgbFJlYWRTYW1wbGVzLAoJCQkJbHBCdWZmZXIsIGxSZWFkQnl0ZXMsIGZsYWdzLCBOVUxMLCBOVUxMKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoKCSAgbFN0YXJ0W2N1clN0cmVhbV0gKz0gbFJlYWRTYW1wbGVzOwoJfQoJbFN0YXJ0W2N1clN0cmVhbV0gPSBsRmlyc3RWaWRlbzsKICAgICAgfSAvKiBzdHJlYW0gYnkgc3RyZWFtICovCgogICAgICAvKiBuZWVkIHRvIGNsb3NlIHRoaXMgYmxvY2s/ICovCiAgICAgIGlmIChkd0ludGVybGVhdmUgPT0gMSkgewoJaHJlcyA9IEFWSUZpbGVFbmRSZWNvcmQocGZpbGUpOwoJaWYgKEZBSUxFRChocmVzKSkKCSAgYnJlYWs7CiAgICAgIH0KCiAgICAgIC8qIHNob3cgcHJvZ3Jlc3MgKi8KICAgICAgaWYgKGxwZm5DYWxsYmFjayhNdWxEaXYoZHdGaWxlSW5pdGlhbEZyYW1lcyArIGxDdXJGcmFtZSwgMTAwLAoJCQkgICAgICBkd0ZpbGVJbml0aWFsRnJhbWVzICsgbEZpbGVMZW5ndGgpKSkgewoJaHJlcyA9IEFWSUVSUl9VU0VSQUJPUlQ7CglicmVhazsKICAgICAgfQogICAgfSAvKiBjb3B5IGZyYW1lIGJ5IGZyYW1lICovCiAgfSBlbHNlIHsKICAgIC8qIG5vbi1pbnRlcmxlYXZlZCBmaWxlICovCgogICAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgICAgLyogc2hvdyBwcm9ncmVzcyAqLwogICAgICBpZiAobHBmbkNhbGxiYWNrKE11bERpdihjdXJTdHJlYW0sIDEwMCwgblN0cmVhbXMpKSkgewoJaHJlcyA9IEFWSUVSUl9VU0VSQUJPUlQ7Cglnb3RvIGVycm9yOwogICAgICB9CgogICAgICBBVklTdHJlYW1JbmZvVyhwSW5TdHJlYW1zW2N1clN0cmVhbV0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CgogICAgICBpZiAoc0luZm8uZHdTYW1wbGVTaXplICE9IDApIHsKCS8qIHNhbXBsZS1iYXNlZCBkYXRhIGxpa2UgYXVkaW8gKi8KCXdoaWxlIChzSW5mby5kd1N0YXJ0IDwgc0luZm8uZHdMZW5ndGgpIHsKCSAgTE9ORyBsU2FtcGxlcyA9IGNiQnVmZmVyIC8gc0luZm8uZHdTYW1wbGVTaXplOwoKCSAgLyogY29weSBmb3JtYXQgaW4gY2FzZSBpdCBjYW4gY2hhbmdlICovCgkgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CgkgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJCSAgICAgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgcmV0dXJuIGhyZXM7CgkgIEFWSVN0cmVhbVNldEZvcm1hdChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkgICAgIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CgoJICAvKiBsaW1pdCB0byBzdHJlYW0gYm91bmRhcmllcyAqLwoJICBpZiAobFNhbXBsZXMgIT0gKExPTkcpKHNJbmZvLmR3TGVuZ3RoIC0gc0luZm8uZHdTdGFydCkpCgkgICAgbFNhbXBsZXMgPSBzSW5mby5kd0xlbmd0aCAtIHNJbmZvLmR3U3RhcnQ7CgoJICAvKiBub3cgdHJ5IHRvIHJlYWQgdW50aWwgd2UgZ2V0IGl0LCBvciBhbiBlcnJvciBvY2N1cnMgKi8KCSAgZG8gewoJICAgIGxSZWFkQnl0ZXMgICA9IGNiQnVmZmVyOwoJICAgIGxSZWFkU2FtcGxlcyA9IDA7CgkgICAgaHJlcyA9IEFWSVN0cmVhbVJlYWQocEluU3RyZWFtc1tjdXJTdHJlYW1dLHNJbmZvLmR3U3RhcnQsbFNhbXBsZXMsCgkJCQkgbHBCdWZmZXIsY2JCdWZmZXIsJmxSZWFkQnl0ZXMsJmxSZWFkU2FtcGxlcyk7CgkgIH0gd2hpbGUgKChocmVzID09IEFWSUVSUl9CVUZGRVJUT09TTUFMTCkgJiYKCQkgICAobHBCdWZmZXIgPSBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEJ1ZmZlciwgY2JCdWZmZXIgKj0gMikpICE9IE5VTEwpOwoJICBpZiAobHBCdWZmZXIgPT0gTlVMTCkKCSAgICBocmVzID0gQVZJRVJSX01FTU9SWTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoJICBpZiAobFJlYWRTYW1wbGVzICE9IDApIHsKCSAgICBzSW5mby5kd1N0YXJ0ICs9IGxSZWFkU2FtcGxlczsKCSAgICBocmVzID0gQVZJU3RyZWFtV3JpdGUocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgLTEsIGxSZWFkU2FtcGxlcywKCQkJCSAgbHBCdWZmZXIsIGxSZWFkQnl0ZXMsIDAsIE5VTEwgLCBOVUxMKTsKCSAgICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgICAgZ290byBlcnJvcjsKCgkgICAgLyogc2hvdyBwcm9ncmVzcyAqLwoJICAgIGlmIChscGZuQ2FsbGJhY2soTXVsRGl2KHNJbmZvLmR3U3RhcnQsMTAwLG5TdHJlYW1zKnNJbmZvLmR3TGVuZ3RoKSsKCQkJICAgICBNdWxEaXYoY3VyU3RyZWFtLCAxMDAsIG5TdHJlYW1zKSkpIHsKCSAgICAgIGhyZXMgPSBBVklFUlJfVVNFUkFCT1JUOwoJICAgICAgZ290byBlcnJvcjsKCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgaWYgKChzSW5mby5kd0xlbmd0aCAtIHNJbmZvLmR3U3RhcnQpICE9IDEpIHsKCSAgICAgIGhyZXMgPSBBVklFUlJfRklMRVJFQUQ7CgkgICAgICBnb3RvIGVycm9yOwoJICAgIH0KCSAgfQoJfQogICAgICB9IGVsc2UgewoJLyogYmxvY2stYmFzZWQgZGF0YSBsaWtlIHZpZGVvICovCglmb3IgKDsgc0luZm8uZHdTdGFydCA8IHNJbmZvLmR3TGVuZ3RoOyBzSW5mby5kd1N0YXJ0KyspIHsKCSAgRFdPUkQgZmxhZ3MgPSAwOwoKCSAgLyogY29weSBmb3JtYXQgaW4gY2FzZSBpdCBjYW4gY2hhbmdlICovCgkgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CgkgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJCSAgICAgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCSAgQVZJU3RyZWFtU2V0Rm9ybWF0KHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIHNJbmZvLmR3U3RhcnQsCgkJCSAgICAgbHBCdWZmZXIsIGxCdWZmZXJTaXplKTsKCgkgIC8qIHRyeSB0byByZWFkIGJsb2NrIGFuZCByZXNpemUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwoJICBkbyB7CgkgICAgbFJlYWRTYW1wbGVzID0gMDsKCSAgICBsUmVhZEJ5dGVzICAgPSBjYkJ1ZmZlcjsKCSAgICBocmVzID0gQVZJU3RyZWFtUmVhZChwSW5TdHJlYW1zW2N1clN0cmVhbV0sIHNJbmZvLmR3U3RhcnQsIDEsCgkJCQkgbHBCdWZmZXIsIGNiQnVmZmVyLCZsUmVhZEJ5dGVzLCZsUmVhZFNhbXBsZXMpOwoJICB9IHdoaWxlICgoaHJlcyA9PSBBVklFUlJfQlVGRkVSVE9PU01BTEwpICYmCgkJICAgKGxwQnVmZmVyID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBCdWZmZXIsIGNiQnVmZmVyICo9IDIpKSAhPSBOVUxMKTsKCSAgaWYgKGxwQnVmZmVyID09IE5VTEwpCgkgICAgaHJlcyA9IEFWSUVSUl9NRU1PUlk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCSAgaWYgKGxSZWFkU2FtcGxlcyAhPSAxKSB7CgkgICAgaHJlcyA9IEFWSUVSUl9GSUxFUkVBRDsKCSAgICBnb3RvIGVycm9yOwoJICB9CgoJICBpZiAoQVZJU3RyZWFtSXNLZXlGcmFtZShwSW5TdHJlYW1zW2N1clN0cmVhbV0sIChMT05HKXNJbmZvLmR3U3RhcnQpKQoJICAgIGZsYWdzID0gQVZJSUZfS0VZRlJBTUU7CgkgIGhyZXMgPSBBVklTdHJlYW1Xcml0ZShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAtMSwgbFJlYWRTYW1wbGVzLAoJCQkJbHBCdWZmZXIsIGxSZWFkQnl0ZXMsIGZsYWdzLCBOVUxMLCBOVUxMKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoKCSAgLyogc2hvdyBwcm9ncmVzcyAqLwoJICBpZiAobHBmbkNhbGxiYWNrKE11bERpdihzSW5mby5kd1N0YXJ0LDEwMCxuU3RyZWFtcypzSW5mby5kd0xlbmd0aCkrCgkJCSAgIE11bERpdihjdXJTdHJlYW0sIDEwMCwgblN0cmVhbXMpKSkgewoJICAgIGhyZXMgPSBBVklFUlJfVVNFUkFCT1JUOwoJICAgIGdvdG8gZXJyb3I7CgkgIH0KCX0gLyogY29weSBhbGwgYmxvY2tzICovCiAgICAgIH0KICAgIH0gLyogY29weSBkYXRhIHN0cmVhbSBieSBzdHJlYW0gKi8KICB9CgogZXJyb3I6CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBCdWZmZXIpOwogIGlmIChwZmlsZSAhPSBOVUxMKSB7CiAgICBmb3IgKGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IG5TdHJlYW1zOyBjdXJTdHJlYW0rKykgewogICAgICBpZiAocE91dFN0cmVhbXNbY3VyU3RyZWFtXSAhPSBOVUxMKQoJQVZJU3RyZWFtUmVsZWFzZShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dKTsKICAgICAgaWYgKHBJblN0cmVhbXNbY3VyU3RyZWFtXSAhPSBOVUxMKQoJQVZJU3RyZWFtUmVsZWFzZShwSW5TdHJlYW1zW2N1clN0cmVhbV0pOwogICAgfQoKICAgIEFWSUZpbGVSZWxlYXNlKHBmaWxlKTsKICB9CgogIHJldHVybiBocmVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNyZWF0ZUVkaXRhYmxlU3RyZWFtCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRWRpdGFibGVTdHJlYW0oUEFWSVNUUkVBTSAqcHBFZGl0YWJsZSwgUEFWSVNUUkVBTSBwU291cmNlKQp7CiAgSUFWSUVkaXRTdHJlYW0gKnBFZGl0ID0gTlVMTDsKICBIUkVTVUxUCSAgaHI7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBwcEVkaXRhYmxlLCBwU291cmNlKTsKCiAgaWYgKHBwRWRpdGFibGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcEVkaXRhYmxlID0gTlVMTDsKCiAgaWYgKHBTb3VyY2UgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBTb3VyY2UsICZJSURfSUFWSUVkaXRTdHJlYW0sCgkJCQkgICAoTFBWT0lEKikmcEVkaXQpOwogICAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgICBociA9IElBVklFZGl0U3RyZWFtX0Nsb25lKHBFZGl0LCBwcEVkaXRhYmxlKTsKICAgICAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CgogICAgICByZXR1cm4gaHI7CiAgICB9CiAgfQoKICAvKiBuZWVkIG93biBpbXBsZW1lbnRhdGlvbiBvZiBJQVZJRWRpdFN0cmVhbSAqLwogIHBFZGl0ID0gQVZJRklMRV9DcmVhdGVFZGl0U3RyZWFtKHBTb3VyY2UpOwogIGlmIChwRWRpdCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIGhyID0gSUFWSUVkaXRTdHJlYW1fUXVlcnlJbnRlcmZhY2UocEVkaXQsICZJSURfSUFWSVN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQqKXBwRWRpdGFibGUpOwogIElBVklFZGl0U3RyZWFtX1JlbGVhc2UocEVkaXQpOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbUNsb25lCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1DbG9uZShQQVZJU1RSRUFNIHBTdHJlYW0sIFBBVklTVFJFQU0gKnBwUmVzdWx0KQp7CiAgUEFWSUVESVRTVFJFQU0gcEVkaXQgPSBOVUxMOwogIEhSRVNVTFQgICAgICAgIGhyOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgcFN0cmVhbSwgcHBSZXN1bHQpOwoKICBpZiAocFN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHBwUmVzdWx0ID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAqcHBSZXN1bHQgPSBOVUxMOwoKICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocFN0cmVhbSwgJklJRF9JQVZJRWRpdFN0cmVhbSwoTFBWT0lEKikmcEVkaXQpOwogIGlmIChTVUNDRUVERUQoaHIpICYmIHBFZGl0ICE9IE5VTEwpIHsKICAgIGhyID0gSUFWSUVkaXRTdHJlYW1fQ2xvbmUocEVkaXQsIHBwUmVzdWx0KTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbUNvcHkJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbUNvcHkoUEFWSVNUUkVBTSBwU3RyZWFtLCBMT05HICpwbFN0YXJ0LAoJCQkgICAgICBMT05HICpwbExlbmd0aCwgUEFWSVNUUkVBTSAqcHBSZXN1bHQpCnsKICBQQVZJRURJVFNUUkVBTSBwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVCAgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXAsJXAsJXApXG4iLCBwU3RyZWFtLCBwbFN0YXJ0LCBwbExlbmd0aCwgcHBSZXN1bHQpOwoKICBpZiAocFN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHBsU3RhcnQgPT0gTlVMTCB8fCBwbExlbmd0aCA9PSBOVUxMIHx8IHBwUmVzdWx0ID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAqcHBSZXN1bHQgPSBOVUxMOwoKICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocFN0cmVhbSwgJklJRF9JQVZJRWRpdFN0cmVhbSwoTFBWT0lEKikmcEVkaXQpOwogIGlmIChTVUNDRUVERUQoaHIpICYmIHBFZGl0ICE9IE5VTEwpIHsKICAgIGhyID0gSUFWSUVkaXRTdHJlYW1fQ29weShwRWRpdCwgcGxTdGFydCwgcGxMZW5ndGgsIHBwUmVzdWx0KTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbUN1dAkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtQ3V0KFBBVklTVFJFQU0gcFN0cmVhbSwgTE9ORyAqcGxTdGFydCwKCQkJICAgICBMT05HICpwbExlbmd0aCwgUEFWSVNUUkVBTSAqcHBSZXN1bHQpCnsKICBQQVZJRURJVFNUUkVBTSBwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVCAgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXAsJXAsJXApXG4iLCBwU3RyZWFtLCBwbFN0YXJ0LCBwbExlbmd0aCwgcHBSZXN1bHQpOwoKICBpZiAocHBSZXN1bHQgIT0gTlVMTCkKICAgICpwcFJlc3VsdCA9IE5VTEw7CiAgaWYgKHBTdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChwbFN0YXJ0ID09IE5VTEwgfHwgcGxMZW5ndGggPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwU3RyZWFtLCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9DdXQocEVkaXQsIHBsU3RhcnQsIHBsTGVuZ3RoLCBwcFJlc3VsdCk7CgogICAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CiAgfSBlbHNlCiAgICBociA9IEFWSUVSUl9VTlNVUFBPUlRFRDsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1QYXN0ZQkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtUGFzdGUoUEFWSVNUUkVBTSBwRGVzdCwgTE9ORyAqcGxTdGFydCwgTE9ORyAqcGxMZW5ndGgsCgkJCSAgICAgICBQQVZJU1RSRUFNIHBTb3VyY2UsIExPTkcgbFN0YXJ0LCBMT05HIGxFbmQpCnsKICBQQVZJRURJVFNUUkVBTSBwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVCAgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXAsJXAsJXAsJWxkLCVsZClcbiIsIHBEZXN0LCBwbFN0YXJ0LCBwbExlbmd0aCwKCXBTb3VyY2UsIGxTdGFydCwgbEVuZCk7CgogIGlmIChwRGVzdCA9PSBOVUxMIHx8IHBTb3VyY2UgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChwbFN0YXJ0ID09IE5VTEwgfHwgcGxMZW5ndGggPT0gTlVMTCB8fCBsU3RhcnQgPCAwKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBEZXN0LCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9QYXN0ZShwRWRpdCwgcGxTdGFydCwgcGxMZW5ndGgsIHBTb3VyY2UsIGxTdGFydCwgbEVuZCk7CgogICAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CiAgfSBlbHNlCiAgICBociA9IEFWSUVSUl9VTlNVUFBPUlRFRDsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1TZXRJbmZvQQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1TZXRJbmZvQShQQVZJU1RSRUFNIHBzdHJlYW0sIExQQVZJU1RSRUFNSU5GT0EgYXNpLAoJCQkJICBMT05HIHNpemUpCnsKICBBVklTVFJFQU1JTkZPVyBhc2l3OwoKICBUUkFDRSgiKCVwLCVwLCVsZClcbiIsIHBzdHJlYW0sIGFzaSwgc2l6ZSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAoKERXT1JEKXNpemUgPCBzaXplb2YoQVZJU1RSRUFNSU5GT0EpKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBtZW1jcHkoJmFzaXcsIGFzaSwgc2l6ZW9mKGFzaXcpIC0gc2l6ZW9mKGFzaXcuc3pOYW1lKSk7CiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFzaS0+c3pOYW1lLCAtMSwKCQkgICAgICBhc2l3LnN6TmFtZSwgc2l6ZW9mKGFzaXcuc3pOYW1lKSk7CgogIHJldHVybiBFZGl0U3RyZWFtU2V0SW5mb1cocHN0cmVhbSwgJmFzaXcsIHNpemVvZihhc2l3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVNldEluZm9XCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbVNldEluZm9XKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPVyBhc2ksCgkJCQkgIExPTkcgc2l6ZSkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlbGQpXG4iLCBwc3RyZWFtLCBhc2ksIHNpemUpOwoKICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocHN0cmVhbSwgJklJRF9JQVZJRWRpdFN0cmVhbSwoTFBWT0lEKikmcEVkaXQpOwogIGlmIChTVUNDRUVERUQoaHIpICYmIHBFZGl0ICE9IE5VTEwpIHsKICAgIGhyID0gSUFWSUVkaXRTdHJlYW1fU2V0SW5mbyhwRWRpdCwgYXNpLCBzaXplKTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVNldE5hbWVBCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbVNldE5hbWVBKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBDU1RSIHN6TmFtZSkKewogIEFWSVNUUkVBTUlORk9BIGFzaWE7CiAgSFJFU1VMVCAgICAgICAgaHJlczsKCiAgVFJBQ0UoIiglcCwlcylcbiIsIHBzdHJlYW0sIGRlYnVnc3RyX2Eoc3pOYW1lKSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAoc3pOYW1lID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICBocmVzID0gQVZJU3RyZWFtSW5mb0EocHN0cmVhbSwgJmFzaWEsIHNpemVvZihhc2lhKSk7CiAgaWYgKEZBSUxFRChocmVzKSkKICAgIHJldHVybiBocmVzOwoKICBtZW1zZXQoYXNpYS5zek5hbWUsIDAsIHNpemVvZihhc2lhLnN6TmFtZSkpOwogIGxzdHJjcHluQShhc2lhLnN6TmFtZSwgc3pOYW1lLCBzaXplb2YoYXNpYS5zek5hbWUpL3NpemVvZihhc2lhLnN6TmFtZVswXSkpOwoKICByZXR1cm4gRWRpdFN0cmVhbVNldEluZm9BKHBzdHJlYW0sICZhc2lhLCBzaXplb2YoYXNpYSkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1TZXROYW1lVwkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1TZXROYW1lVyhQQVZJU1RSRUFNIHBzdHJlYW0sIExQQ1dTVFIgc3pOYW1lKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKICBIUkVTVUxUICAgICAgICBocmVzOwoKICBUUkFDRSgiKCVwLCVzKVxuIiwgcHN0cmVhbSwgZGVidWdzdHJfdyhzek5hbWUpKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChzek5hbWUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIGhyZXMgPSBJQVZJU3RyZWFtX0luZm8ocHN0cmVhbSwgJmFzaXcsIHNpemVvZihhc2l3KSk7CiAgaWYgKEZBSUxFRChocmVzKSkKICAgIHJldHVybiBocmVzOwoKICBtZW1zZXQoYXNpdy5zek5hbWUsIDAsIHNpemVvZihhc2l3LnN6TmFtZSkpOwogIGxzdHJjcHluVyhhc2l3LnN6TmFtZSwgc3pOYW1lLCBzaXplb2YoYXNpdy5zek5hbWUpL3NpemVvZihhc2l3LnN6TmFtZVswXSkpOwoKICByZXR1cm4gRWRpdFN0cmVhbVNldEluZm9XKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUNsZWFyQ2xpcGJvYXJkCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJQ2xlYXJDbGlwYm9hcmQodm9pZCkKewogIFRSQUNFKCIoKVxuIik7CgogIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7IC8qIE9sZVNldENsaXBib2FyZChOVUxMKTsgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklHZXRGcm9tQ2xpcGJvYXJkCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJR2V0RnJvbUNsaXBib2FyZChQQVZJRklMRSAqcHBmaWxlKQp7CiAgRklYTUUoIiglcCksIHN0dWIhXG4iLCBwcGZpbGUpOwoKICAqcHBmaWxlID0gTlVMTDsKCiAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQVZJTWFrZVN0cmVhbUZyb21DbGlwYm9hcmQgKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklNYWtlU3RyZWFtRnJvbUNsaXBib2FyZChVSU5UIGNmRm9ybWF0LCBIQU5ETEUgaEdsb2JhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFWSVNUUkVBTSAqIHBwc3RyZWFtKQp7CiAgRklYTUUoIigweCUwOHgsJXAsJXApLCBzdHViIVxuIiwgY2ZGb3JtYXQsIGhHbG9iYWwsIHBwc3RyZWFtKTsKCiAgaWYgKHBwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklQdXRGaWxlT25DbGlwYm9hcmQJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklQdXRGaWxlT25DbGlwYm9hcmQoUEFWSUZJTEUgcGZpbGUpCnsKICBGSVhNRSgiKCVwKSwgc3R1YiFcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKfQoKSFJFU1VMVCBDREVDTCBBVklTYXZlQShMUENTVFIgc3pGaWxlLCBDTFNJRCAqIHBjbHNpZEhhbmRsZXIsIEFWSVNBVkVDQUxMQkFDSyBscGZuQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RyZWFtcywgUEFWSVNUUkVBTSBwYXZpLCBMUEFWSUNPTVBSRVNTT1BUSU9OUyBscE9wdGlvbnMsIC4uLikKewogICAgRklYTUUoIiglcywlcCwlcCwweCUwOHgsJXAsJXApLCBzdHViIVxuIiwgZGVidWdzdHJfYShzekZpbGUpLCBwY2xzaWRIYW5kbGVyLCBscGZuQ2FsbGJhY2ssCiAgICAgICAgICBuU3RyZWFtcywgcGF2aSwgbHBPcHRpb25zKTsKCiAgICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOwp9CgpIUkVTVUxUIENERUNMIEFWSVNhdmVXKExQQ1dTVFIgc3pGaWxlLCBDTFNJRCAqIHBjbHNpZEhhbmRsZXIsIEFWSVNBVkVDQUxMQkFDSyBscGZuQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RyZWFtcywgUEFWSVNUUkVBTSBwYXZpLCBMUEFWSUNPTVBSRVNTT1BUSU9OUyBscE9wdGlvbnMsIC4uLikKewogICAgRklYTUUoIiglcywlcCwlcCwweCUwOHgsJXAsJXApLCBzdHViIVxuIiwgZGVidWdzdHJfdyhzekZpbGUpLCBwY2xzaWRIYW5kbGVyLCBscGZuQ2FsbGJhY2ssCiAgICAgICAgICBuU3RyZWFtcywgcGF2aSwgbHBPcHRpb25zKTsKCiAgICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOwp9Cg==