From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id A65974F159 for ; Sat, 17 May 2025 02:57:10 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id D189F68D0FE; Sat, 17 May 2025 05:57:04 +0300 (EEST) Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 1C18568D08F for ; Sat, 17 May 2025 05:56:58 +0300 (EEST) Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-22e661313a3so30925765ad.3 for ; Fri, 16 May 2025 19:56:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747450616; x=1748055416; darn=ffmpeg.org; h=to:date:message-id:subject:mime-version:content-transfer-encoding :from:from:to:cc:subject:date:message-id:reply-to; bh=UaK2qLZPJmrVLpscyvIb7GU7zKrFcWAgiGajBXuTK98=; b=if3JG7R8X7V70s/bcboP5hX4j/7EOKI75tIEL2ieMWUF++JXlrAjw+K9agAFfpryQ6 QAmIF35ihjCZhWEzQiVh1Nc7Tup6TXtMZ626gfR1URR6Wb1l6U+qTpexejDhm6eMEO4i gEJgzsVfY06/Dq/lmWCgsS6rroy40FhD1wEHHYnCRvlENDcVvPDJUoDOGXf80rLRur2y 0o1b3dPCjogAA2iykFW0LETexuYX274lvWy8kMp/+GTIC2RuDEceg8iYSHdUbY5nMiv7 x77DQV0T6VkmZj+ZyQB1YyiurRbDv1/JCh2UQ/vS1acGFdRnRbuc3AW0qrZEmtUO8d52 Otow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747450616; x=1748055416; h=to:date:message-id:subject:mime-version:content-transfer-encoding :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=UaK2qLZPJmrVLpscyvIb7GU7zKrFcWAgiGajBXuTK98=; b=NIi973U5UQVylfosGS+4LMGHRNayVQtIUyds8lszSpB2mN6VqF/lRsdpy5pixIXsuB DqwAny0xszluI1yaFHkKXigEslCNXV5o7QwrwjTgmNGJ35MHpKBQPo9rCXpyiJr2sOb3 gkn0Yh+wgK4QYWerNQGvJPXrkxEPNo5Aw1NZoDki3iTtgtyQ1/28xY9mtzAJ93zujuBP PqDnAkLSHTP57CROsuuUJiq4ArtcklruzHTrrU7K3SbvfFoHnmBoW9kOufooZYPmYyeb qPqqrnVNS4EIhybDFsRW/pXQMYjw5eIE6XaB/Bb0SPsUo3NFASfkUpWcos096dTuM1Ap 3kXQ== X-Gm-Message-State: AOJu0YzjHNdF12YCIDRcmszY9TA7/nwZ1jejP7kfMhUsO9Ex/HIIqn1i uuhc7EyqAD/67gpvvoqTJRHE4rC8dQy3zJfqfuANPaZbBPmnCXUYdvVfAjiQ9lh9Cow= X-Gm-Gg: ASbGncvONlc4Fih6MZAKn1TcYMSlQI21jFtbp05U0H2HkOTInnh8FSrIentH3oQurWh 2GAjKwUXAGhzzLDdIemDKofn/SAC4preP4RDt1VSCeQO7G+CyeA+tyt+zbblXjVhu/fYla7WqzR RLhgguYt8v9nHm/EuRh6EWgepw5NBta5TZsK61eZioE3/77+EvRHoOtO6EKibk+3aaIQ66Hju+0 Qj9IrcHw1OnzSdYNFEl3Vi/5UVmeWA90QDgqyC8Uuvn/fu2F8YZvp0k7hHRDkjBR4LAwLVba7p5 /Lj8RoBkbRpQfZc666JYKW3lChgnJg/mQwS+pPLrNZQefspU7G3tivymMY1Rudjd X-Google-Smtp-Source: AGHT+IFCO+UqFJvYpu8iVJ9AZ3Qrfhl55OMxbuN+1iyvwpa5yvxxKrfFXaoJaLiHxlK09Z9pxJ4OJw== X-Received: by 2002:a17:902:f54a:b0:224:1eab:97b2 with SMTP id d9443c01a7336-231de3baf53mr71066115ad.53.1747450613584; Fri, 16 May 2025 19:56:53 -0700 (PDT) Received: from smtpclient.apple ([23.247.137.216]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-231d4eba368sm21303935ad.200.2025.05.16.19.56.51 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 May 2025 19:56:53 -0700 (PDT) From: Jack Lau Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.1\)) Message-Id: <94BAB6CD-E8E9-4A9D-97E2-A539AE5F98FF@gmail.com> Date: Sat, 17 May 2025 10:56:39 +0800 To: FFmpeg development discussions and patches X-Mailer: Apple Mail (2.3776.700.51.11.1) Subject: [FFmpeg-devel] WHIP Feature latest patch Preparation Notes X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: SGkgZXZlcnlvbmUsCknigJltIGV4Y2l0ZWQgdG8gYmUgYSBHU29DIHN0dWRlbnQgdGhpcyB5ZWFy LCB3b3JraW5nIG9uIHN1cHBvcnRpbmcgdGhlIFdISVAgZmVhdHVyZSBpbiBGRm1wZWcgd2l0aCBt eSBtZW50b3JzIFN0ZXZlbiBMaXUgYW5kIFpoYW8gSnVuLgpUd28geWVhcnMgYWdvLCBteSBtZW50 b3IgU3RldmVuIExpdSBzZW50IGEgd2hpcCBwYXRjaChodHRwczovL3BhdGNod29yay5mZm1wZWcu b3JnL3Byb2plY3QvZmZtcGVnL3BhdGNoLzIwMjMwNTI5MTE1MDM5LjE3NDA5LTEtbHFAY2hpbmFm Zm1wZWcub3JnLykgYW5kIGdvdCBzb21lIHJldmlld3MsIG1vc3Qgb2YgdGhlc2UgcmV2aWV3cyB3 ZXJlIGZpeGVkIGV4Y2VwdCBEVExTLiBTbyBJIHJlZmFjdG9yZWQgdGhlIERUTFMgaW1wbGVtZW50 YXRpb24gYW5kIG1lcmdlZCBpdCBpbnRvIHRsc19vcGVuc3NsLmMuIApCZWZvcmUgSSBzZW5kIG91 dCB0aGUgbGF0ZXN0IHBhdGNoLCBJIHBsYW4gdG8gcmVzcG9uZCB0byB0aGUgcHJldmlvdXMgcmV2 aWV3cyBvbmUgYnkgb25lLiBCVFcsIG1vc3Qgb2YgcmVzcG9uc2UgZnJvbSBXaW5saW4gKGh0dHBz Oi8vZ2l0aHViLmNvbS9vc3Nycy9mZm1wZWctd2VicnRjL2Rpc2N1c3Npb25zKQoKIE9uIE1vbiBN YXkgMjkgMTY6MDA6MzMgRUVTVCAyMDIzLCBNaWNoYWVsIE5pZWRlcm1heWVyIHdyb3RlOgo+IAo+ IE9uIE1vbiwgTWF5IDI5LCAyMDIzIGF0IDA3OjUwOjM5UE0gKzA4MDAsIFN0ZXZlbiBMaXUgd3Jv dGU6Cj4gPiBDby1hdXRob3JlZC1ieTogd2lubGluIDx3aW5saW52aXAgYXQgZ21haWwuY29tPgo+ ID4gQ28tYXV0aG9yZWQtYnk6IHlhbmdydGMgPHlhbmdydGMgYXQgYWxpeXVuLmNvbT4KPiA+IENv LWF1dGhvcmVkLWJ5OiBjbG91ZHdlYnJ0YyA8ZHVhbndlaXdlaTE5ODIgYXQgZ21haWwuY29tPgo+ ID4gQ28tYXV0aG9yZWQtYnk6IEhhaWJvIENoZW4gPDQ5NTgxMDI0MiBhdCBxcS5jb20+Cj4gPiBT aWduZWQtb2ZmLWJ5OiBTdGV2ZW4gTGl1IDxscSBhdCBjaGluYWZmbXBlZy5vcmc+Cj4gPiAtLS0K PiA+IGNvbmZpZ3VyZSB8IDEgKwo+ID4gZG9jL211eGVycy50ZXhpIHwgNTAgKwo+ID4gbGliYXZm b3JtYXQvTWFrZWZpbGUgfCAxICsKPiA+IGxpYmF2Zm9ybWF0L2FsbGZvcm1hdHMuYyB8IDEgKwo+ ID4gbGliYXZmb3JtYXQvaHR0cC5jIHwgNiArCj4gPiBsaWJhdmZvcm1hdC9odHRwLmggfCAyICsK PiA+IGxpYmF2Zm9ybWF0L3J0Y2VuYy5jIHwgMjIwOCArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwo+ID4gNyBmaWxlcyBjaGFuZ2VkLCAyMjY5IGluc2VydGlvbnMoKykKPiA+ IGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJhdmZvcm1hdC9ydGNlbmMuYwo+IAo+IGJyZWFrcyBidWls ZDoKPiAKPiBDQyBsaWJhdmZvcm1hdC9ydGNlbmMubwo+IGxpYmF2Zm9ybWF0L3J0Y2VuYy5jOjMw OjI6IGVycm9yOiAjZXJyb3IgIk9wZW5TU0wgdmVyc2lvbiAxLjEuMWIgb3IgbmV3ZXIgaXMgcmVx dWlyZWQiCj4gI2Vycm9yICJPcGVuU1NMIHZlcnNpb24gMS4xLjFiIG9yIG5ld2VyIGlzIHJlcXVp cmVkIgo+IF5+fn5+Cj4gbGliYXZmb3JtYXQvcnRjZW5jLmM6IEluIGZ1bmN0aW9uIOKAmGR0bHNf Y29udGV4dF9pbml04oCZOgo+IGxpYmF2Zm9ybWF0L3J0Y2VuYy5jOjIxMDozNDogZXJyb3I6IGlt cGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uIOKAmEVWUF9FQ19nZW7igJk7IGRpZCB5b3Ug bWVhbiDigJhFVlBfUEJFX2dldOKAmT8gWy1XZXJyb3I9aW1wbGljaXQtZnVuY3Rpb24tZGVjbGFy YXRpb25dCj4gY3R4LT5kdGxzX3BrZXkgPSBkdGxzX3BrZXkgPSBFVlBfRUNfZ2VuKGN1cnZlKTsK PiBefn5+fn5+fn5+Cj4gRVZQX1BCRV9nZXQKV2lubGluOiBUaGlzIGlzc3VlIHdhcyBjYXVzZWQg YnkgYSBjb21iaW5hdGlvbiBvZiBPcGVuU1NMIHZlcnNpb24gY2hlY2sgYW5kIEFQSSB1c2FnZS4g SSB0ZXN0ZWQgYSBzZXQgb2YgT3BlblNTTCB2ZXJzaW9ucywgZml4ZWQgdGhlIGlzc3VlLCBhbmQg Zm91bmQgdGhhdCBPcGVuU1NMIDEuMC4xayBhbmQgbmV3ZXIgdmVyc2lvbnMgc2hvdWxkIHdvcmsg bm93LgpPcGVuU1NMIDEuMC4xayBvciBuZXdlciB2ZXJzaW9ucyBhcmUgc3VwcG9ydGVkLgpGaXhl ZC4KPiBsaWJhdmZvcm1hdC9ydGNlbmMuYzoyMTA6MzI6IHdhcm5pbmc6IGFzc2lnbm1lbnQgbWFr ZXMgcG9pbnRlciBmcm9tIGludGVnZXIgd2l0aG91dCBhIGNhc3QgWy1XaW50LWNvbnZlcnNpb25d Cj4gY3R4LT5kdGxzX3BrZXkgPSBkdGxzX3BrZXkgPSBFVlBfRUNfZ2VuKGN1cnZlKTsKPiBeCj4g Y2MxOiBzb21lIHdhcm5pbmdzIGJlaW5nIHRyZWF0ZWQgYXMgZXJyb3JzCj4gZmZidWlsZC9jb21t b24ubWFrOjgxOiByZWNpcGUgZm9yIHRhcmdldCAnbGliYXZmb3JtYXQvcnRjZW5jLm8nIGZhaWxl ZAo+IG1ha2U6ICoqKiBbbGliYXZmb3JtYXQvcnRjZW5jLm9dIEVycm9yIDEKPiAKPiBbLi4uXQo+ IC0tIAo+IE1pY2hhZWwgR251UEcgZmluZ2VycHJpbnQ6IDlGRjIxMjhCMTQ3RUY2NzMwQkFERjEz MzYxMUVDNzg3MDQwQjBGQUIKCgoKCk9uIFR1ZSBNYXkgMzAgMTE6NDQ6MDYgRUVTVCAyMDIzLCBL aWVyYW4gS3VuaHlhIHdyb3RlOgoKCj4gT24gTW9uLCAyOSBNYXkgMjAyMyBhdCAxMjo1MSwgU3Rl dmVuIExpdSA8bHEgYXQgY2hpbmFmZm1wZWcub3JnPiB3cm90ZToKPiAKPiA+IENvLWF1dGhvcmVk LWJ5OiB3aW5saW4gPHdpbmxpbnZpcCBhdCBnbWFpbC5jb20+Cj4gPiBDby1hdXRob3JlZC1ieTog eWFuZ3J0YyA8eWFuZ3J0YyBhdCBhbGl5dW4uY29tPgo+ID4gQ28tYXV0aG9yZWQtYnk6IGNsb3Vk d2VicnRjIDxkdWFud2Vpd2VpMTk4MiBhdCBnbWFpbC5jb20+Cj4gPiBDby1hdXRob3JlZC1ieTog SGFpYm8gQ2hlbiA8NDk1ODEwMjQyIGF0IHFxLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IFN0ZXZl biBMaXUgPGxxIGF0IGNoaW5hZmZtcGVnLm9yZz4KPiA+IC0tLQo+ID4gY29uZmlndXJlIHwgMSAr Cj4gPiBkb2MvbXV4ZXJzLnRleGkgfCA1MCArCj4gPiBsaWJhdmZvcm1hdC9NYWtlZmlsZSB8IDEg Kwo+ID4gbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jIHwgMSArCj4gPiBsaWJhdmZvcm1hdC9odHRw LmMgfCA2ICsKPiA+IGxpYmF2Zm9ybWF0L2h0dHAuaCB8IDIgKwo+ID4gbGliYXZmb3JtYXQvcnRj ZW5jLmMgfCAyMjA4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gPiA3 IGZpbGVzIGNoYW5nZWQsIDIyNjkgaW5zZXJ0aW9ucygrKQo+ID4gY3JlYXRlIG1vZGUgMTAwNjQ0 IGxpYmF2Zm9ybWF0L3J0Y2VuYy5jCj4gPgo+ID4gZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2Nv bmZpZ3VyZQo+ID4gaW5kZXggNDk1NDkzYWEwZS4uNTI2ZGRjMGJkNiAxMDA3NTUKPiA+IC0tLSBh L2NvbmZpZ3VyZQo+ID4gKysrIGIvY29uZmlndXJlCj4gPiBAQCAtMzQ4Myw2ICszNDgzLDcgQEAg b2dnX2RlbXV4ZXJfc2VsZWN0PSJkaXJhY19wYXJzZSIKPiA+IG9ndl9tdXhlcl9zZWxlY3Q9Im9n Z19tdXhlciIKPiA+IG9wdXNfbXV4ZXJfc2VsZWN0PSJvZ2dfbXV4ZXIiCj4gPiBwc3BfbXV4ZXJf c2VsZWN0PSJtb3ZfbXV4ZXIiCj4gPiArcnRjX211eGVyX2RlcHNfYW55PSJvcGVuc3NsIgo+ID4g cnRwX2RlbXV4ZXJfc2VsZWN0PSJzZHBfZGVtdXhlciIKPiA+IHJ0cF9tcGVndHNfbXV4ZXJfc2Vs ZWN0PSJtcGVndHNfbXV4ZXIgcnRwX211eGVyIgo+ID4gcnRwZGVjX3NlbGVjdD0iYXNmX2RlbXV4 ZXIgbW92X2RlbXV4ZXIgbXBlZ3RzX2RlbXV4ZXIgcm1fZGVtdXhlcgo+ID4gcnRwX3Byb3RvY29s IHNydHAiCj4gPiBkaWZmIC0tZ2l0IGEvZG9jL211eGVycy50ZXhpIGIvZG9jL211eGVycy50ZXhp Cj4gPiBpbmRleCAzMWZjYTE3ZGQ2Li4wMDA1MmY1MWI0IDEwMDY0NAo+ID4gLS0tIGEvZG9jL211 eGVycy50ZXhpCj4gPiArKysgYi9kb2MvbXV4ZXJzLnRleGkKPiA+IEBAIC0xMzMzLDYgKzEzMzMs NTYgQEAgU2V0IGN1c3RvbSBIVFRQIGhlYWRlcnMsIGNhbiBvdmVycmlkZSBidWlsdCBpbgo+ID4g ZGVmYXVsdCBoZWFkZXJzLiBBcHBsaWNhYmxlIG9ubHkKPiA+Cj4gPiBAZW5kIHRhYmxlCj4gPgo+ ID4gKyBhdCBhbmNob3J7cnRjfQo+ID4gKyBhdCBzZWN0aW9uIHJ0Ywo+ID4gKwo+ID4gK1dlYlJU QyAoUmVhbC1UaW1lIENvbW11bmljYXRpb24pIG11eGVyIHRoYXQgc3VwcG9ydHMgc3ViLXNlY29u ZCBsYXRlbmN5Cj4gPiBzdHJlYW1pbmcgYWNjb3JkaW5nIHRvCj4gPiArdGhlIFdISVAgKFdlYlJU Qy1IVFRQIGluZ2VzdGlvbiBwcm90b2NvbCkgc3BlY2lmaWNhdGlvbi4KPiA+ICsKPiA+ICtJdCB1 c2VzIEhUVFAgYXMgYSBzaWduYWxpbmcgcHJvdG9jb2wgdG8gZXhjaGFuZ2UgU0RQIGNhcGFiaWxp dGllcyBhbmQgSUNFCj4gPiBsaXRlIGNhbmRpZGF0ZXMuIFRoZW4sCj4gPiAraXQgdXNlcyBTVFVO IGJpbmRpbmcgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyB0byBlc3RhYmxpc2ggYSBzZXNzaW9uIG92 ZXIKPiA+IFVEUC4gU3Vic2VxdWVudGx5LCBpdAo+ID4gK2luaXRpYXRlcyBhIERUTFMgaGFuZHNo YWtlIHRvIGV4Y2hhbmdlIHRoZSBTUlRQIGVuY3J5cHRpb24ga2V5cy4gTGFzdGx5LAo+ID4gaXQg c3BsaXRzIHZpZGVvIGFuZAo+ID4gK2F1ZGlvIGZyYW1lcyBpbnRvIFJUUCBwYWNrZXRzIGFuZCBl bmNyeXB0cyB0aGVtIHVzaW5nIFNSVFAuCj4gPiArCj4gPiArRW5zdXJlIHRoYXQgeW91IHVzZSBI LjI2NCB3aXRob3V0IEIgZnJhbWVzIGFuZCBPcHVzIGZvciB0aGUgYXVkaW8gY29kZWMuCj4gPiBG b3IgZXhhbXBsZSwgdG8gY29udmVydAo+ID4gK2FuIGlucHV0IGZpbGUgd2l0aCBAY29tbWFuZHtm Zm1wZWd9IHRvIFdlYlJUQzoKPiA+ICsgYXQgZXhhbXBsZQo+ID4gK2ZmbXBlZyAtcmUgLWkgaW5w dXQubXA0IC1hY29kZWMgbGlib3B1cyAtYXIgNDgwMDAgLWFjIDIgXAo+ID4gKyAtdmNvZGVjIGxp YngyNjQgLXByb2ZpbGU6diBiYXNlbGluZSAtdHVuZSB6ZXJvbGF0ZW5jeSAtdGhyZWFkcyAxIC1i ZiAwIFwKPiA+ICsgLWYgcnRjICJodHRwOi8vbG9jYWxob3N0OjE5ODUvcnRjL3YxL3doaXAvP2Fw cD1saXZlJnN0cmVhbT1saXZlc3RyZWFtIgo+ID4gKyBhdCBlbmQgZXhhbXBsZQo+ID4gKwo+ID4g K0ZvciB0aGlzIGV4YW1wbGUsIHdlIGhhdmUgZW1wbG95ZWQgbG93IGxhdGVuY3kgb3B0aW9ucywg cmVzdWx0aW5nIGluIGFuCj4gPiBlbmQtdG8tZW5kIGxhdGVuY3kgb2YKPiA+ICthcHByb3hpbWF0 ZWx5IDE1MG1zLgo+ID4gKwo+ID4gKyBhdCBzdWJzZWN0aW9uIE9wdGlvbnMKPiA+ICsKPiA+ICtU aGlzIG11eGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKPiA+ICsKPiA+ICsgYXQg dGFibGUgQG9wdGlvbgo+ID4gKwo+ID4gKyBhdCBpdGVtIGljZV9hcnFfbWF4IEB2YXJ7c2l6ZX0K PiA+ICtTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBmb3IgdGhlIElD RSBBUlEgbWVjaGFuaXNtLgo+ID4gK0RlZmF1bHQgdmFsdWUgaXMgNS4KPiA+ICsKPiA+ICsgYXQg aXRlbSBpY2VfYXJxX3RpbWVvdXQgQHZhcntzaXplfQo+ID4gK1NldCB0aGUgc3RhcnQgdGltZW91 dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBJQ0UgQVJRIG1lY2hhbmlzbS4KPiA+ICtEZWZhdWx0 IHZhbHVlIGlzIDMwLgo+ID4gKwo+ID4gKyBhdCBpdGVtIGR0bHNfYXJxX21heCBAdmFye3NpemV9 Cj4gPiArU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgZm9yIHRoZSBE VExTIEFSUSBtZWNoYW5pc20uCj4gPiArRGVmYXVsdCB2YWx1ZSBpcyA1Lgo+ID4gKwo+ID4gKyBh dCBpdGVtIGR0bHNfYXJxX3RpbWVvdXQgQHZhcntzaXplfQo+ID4gK1NldCB0aGUgc3RhcnQgdGlt ZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBEVExTIEFSUSBtZWNoYW5pc20uCj4gPiArRGVm YXVsdCB2YWx1ZSBpcyA1MC4KPiA+ICsKPiA+ICsgYXQgaXRlbSBwa3Rfc2l6ZSBAdmFye3NpemV9 Cj4gPiArU2V0IHRoZSBtYXhpbXVtIHNpemUsIGluIGJ5dGVzLCBvZiBSVFAgcGFja2V0cyB0aGF0 IHNlbmQgb3V0Lgo+ID4gK0RlZmF1bHQgdmFsdWUgaXMgMTUwMC4KPiA+ICsKPiA+ICsgYXQgZW5k IHRhYmxlCj4gPiArCj4gPiBAYW5jaG9ye2ljb30KPiA+IEBzZWN0aW9uIGljbwo+ID4KPiA+IGRp ZmYgLS1naXQgYS9saWJhdmZvcm1hdC9NYWtlZmlsZSBiL2xpYmF2Zm9ybWF0L01ha2VmaWxlCj4g PiBpbmRleCBmOGFkN2M2YTExLi4yYTc2ZTYxM2IwIDEwMDY0NAo+ID4gLS0tIGEvbGliYXZmb3Jt YXQvTWFrZWZpbGUKPiA+ICsrKyBiL2xpYmF2Zm9ybWF0L01ha2VmaWxlCj4gPiBAQCAtNDkzLDYg KzQ5Myw3IEBAIE9CSlMtJChDT05GSUdfUlNEX0RFTVVYRVIpICs9IHJzZC5vCj4gPiBPQkpTLSQo Q09ORklHX1JQTF9ERU1VWEVSKSArPSBycGwubwo+ID4gT0JKUy0kKENPTkZJR19SU09fREVNVVhF UikgKz0gcnNvZGVjLm8gcnNvLm8gcGNtLm8KPiA+IE9CSlMtJChDT05GSUdfUlNPX01VWEVSKSAr PSByc29lbmMubyByc28ubyByYXdlbmMubwo+ID4gK09CSlMtJChDT05GSUdfUlRDX01VWEVSKSAr PSBydGNlbmMubyBhdmMubyBodHRwLm8gc3J0cC5vCj4gPiBPQkpTLSQoQ09ORklHX1JUUF9NUEVH VFNfTVVYRVIpICs9IHJ0cGVuY19tcGVndHMubwo+ID4gT0JKUy0kKENPTkZJR19SVFBfTVVYRVIp ICs9IHJ0cC5vIFwKPiA+IHJ0cGVuY19hYWMubyBcCj4gPiBkaWZmIC0tZ2l0IGEvbGliYXZmb3Jt YXQvYWxsZm9ybWF0cy5jIGIvbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jCj4gPiBpbmRleCBlZmRi MzRlMjlkLi41NmU4NTJlNWVhIDEwMDY0NAo+ID4gLS0tIGEvbGliYXZmb3JtYXQvYWxsZm9ybWF0 cy5jCj4gPiArKysgYi9saWJhdmZvcm1hdC9hbGxmb3JtYXRzLmMKPiA+IEBAIC0zOTIsNiArMzky LDcgQEAgZXh0ZXJuIGNvbnN0IEFWSW5wdXRGb3JtYXQgZmZfcnBsX2RlbXV4ZXI7Cj4gPiBleHRl cm4gY29uc3QgQVZJbnB1dEZvcm1hdCBmZl9yc2RfZGVtdXhlcjsKPiA+IGV4dGVybiBjb25zdCBB VklucHV0Rm9ybWF0IGZmX3Jzb19kZW11eGVyOwo+ID4gZXh0ZXJuIGNvbnN0IEZGT3V0cHV0Rm9y bWF0IGZmX3Jzb19tdXhlcjsKPiA+ICtleHRlcm4gY29uc3QgRkZPdXRwdXRGb3JtYXQgZmZfcnRj X211eGVyOwo+ID4gZXh0ZXJuIGNvbnN0IEFWSW5wdXRGb3JtYXQgZmZfcnRwX2RlbXV4ZXI7Cj4g PiBleHRlcm4gY29uc3QgRkZPdXRwdXRGb3JtYXQgZmZfcnRwX211eGVyOwo+ID4gZXh0ZXJuIGNv bnN0IEZGT3V0cHV0Rm9ybWF0IGZmX3J0cF9tcGVndHNfbXV4ZXI7Cj4gPiBkaWZmIC0tZ2l0IGEv bGliYXZmb3JtYXQvaHR0cC5jIGIvbGliYXZmb3JtYXQvaHR0cC5jCj4gPiBpbmRleCAwODE3YWFm YjViLi42ZjUwOTY1NmI1IDEwMDY0NAo+ID4gLS0tIGEvbGliYXZmb3JtYXQvaHR0cC5jCj4gPiAr KysgYi9saWJhdmZvcm1hdC9odHRwLmMKPiA+IEBAIC01MzAsNiArNTMwLDEyIEBAIGludCBmZl9o dHRwX2F2ZXJyb3IoaW50IHN0YXR1c19jb2RlLCBpbnQKPiA+IGRlZmF1bHRfYXZlcnJvcikKPiA+ IHJldHVybiBkZWZhdWx0X2F2ZXJyb3I7Cj4gPiB9Cj4gPgo+ID4gK2NvbnN0IGNoYXIqIGZmX2h0 dHBfZ2V0X25ld19sb2NhdGlvbihVUkxDb250ZXh0ICpoKQo+ID4gK3sKPiA+ICsgSFRUUENvbnRl eHQgKnMgPSBoLT5wcml2X2RhdGE7Cj4gPiArIHJldHVybiBzLT5uZXdfbG9jYXRpb247Cj4gPiAr fQo+ID4gKwo+ID4gc3RhdGljIGludCBodHRwX3dyaXRlX3JlcGx5KFVSTENvbnRleHQqIGgsIGlu dCBzdGF0dXNfY29kZSkKPiA+IHsKPiA+IGludCByZXQsIGJvZHkgPSAwLCByZXBseV9jb2RlLCBt ZXNzYWdlX2xlbjsKPiA+IGRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9odHRwLmggYi9saWJhdmZv cm1hdC9odHRwLmgKPiA+IGluZGV4IDVmNjUwZWYxNDMuLmQxYjY5MTgyNmIgMTAwNjQ0Cj4gPiAt LS0gYS9saWJhdmZvcm1hdC9odHRwLmgKPiA+ICsrKyBiL2xpYmF2Zm9ybWF0L2h0dHAuaAo+ID4g QEAgLTYyLDQgKzYyLDYgQEAgaW50IGZmX2h0dHBfZG9fbmV3X3JlcXVlc3QyKFVSTENvbnRleHQg KmgsIGNvbnN0IGNoYXIKPiA+ICp1cmksIEFWRGljdGlvbmFyeSAqKm9wdGlvCj4gPgo+ID4gaW50 IGZmX2h0dHBfYXZlcnJvcihpbnQgc3RhdHVzX2NvZGUsIGludCBkZWZhdWx0X2F2ZXJyb3IpOwo+ ID4KPiA+ICtjb25zdCBjaGFyKiBmZl9odHRwX2dldF9uZXdfbG9jYXRpb24oVVJMQ29udGV4dCAq aCk7Cj4gPiArCj4gPiAjZW5kaWYgLyogQVZGT1JNQVRfSFRUUF9IICovCj4gPiBkaWZmIC0tZ2l0 IGEvbGliYXZmb3JtYXQvcnRjZW5jLmMgYi9saWJhdmZvcm1hdC9ydGNlbmMuYwo+ID4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAuLjY1MTczZDAwNzMKPiA+IC0tLSAv ZGV2L251bGwKPiA+ICsrKyBiL2xpYmF2Zm9ybWF0L3J0Y2VuYy5jCj4gPiBAQCAtMCwwICsxLDIy MDggQEAKPiA+ICsvKgo+ID4gKyAqIFdlYlJUQy1IVFRQIGluZ2VzdGlvbiBwcm90b2NvbCAoV0hJ UCkgbXV4ZXIKPiA+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMjMgVGhlIEZGbXBlZyBQcm9qZWN0Cj4g PiArICoKPiA+ICsgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCj4gPiArICoKPiA+ICsg KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y Cj4gPiArICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l cmFsIFB1YmxpYwo+ID4gKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IGVpdGhlcgo+ID4gKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+ID4gKyAqCj4gPiArICog RkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws Cj4gPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YKPiA+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCj4gPiArICogTGVzc2VyIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiA+ICsgKgo+ID4gKyAqIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKPiA+ ICsgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl IFNvZnR3YXJlCj4gPiArICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG aWZ0aCBGbG9vciwgQm9zdG9uLCBNQQo+ID4gMDIxMTAtMTMwMSBVU0EKPiA+ICsgKi8KPiA+ICsK PiA+ICsjaW5jbHVkZSAiY29uZmlnLmgiCj4gPiArCj4gPiArI2lmbmRlZiBDT05GSUdfT1BFTlNT TAo+ID4gKyNlcnJvciAiRFRMUyBpcyBub3Qgc3VwcG9ydGVkLCBwbGVhc2UgZW5hYmxlIG9wZW5z c2wiCj4gPiArI2Vsc2UKPiA+ICsjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KPiA+ICsjaW5jbHVk ZSA8b3BlbnNzbC9lcnIuaD4KPiA+ICsjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAx MDEwMmZMCj4gPiArI2Vycm9yICJPcGVuU1NMIHZlcnNpb24gMS4xLjFiIG9yIG5ld2VyIGlzIHJl cXVpcmVkIgo+ID4gKyNlbmRpZgo+ID4gKyNlbmRpZgo+ID4gKwo+ID4gKyNpbmNsdWRlICJsaWJh dmNvZGVjL2F2Y29kZWMuaCIKPiA+ICsjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgo+ID4g KyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCj4gPiArI2luY2x1ZGUgImxpYmF2dXRpbC9j cmMuaCIKPiA+ICsjaW5jbHVkZSAibGliYXZ1dGlsL2htYWMuaCIKPiA+ICsjaW5jbHVkZSAibGli YXZ1dGlsL29wdC5oIgo+ID4gKyNpbmNsdWRlICJsaWJhdnV0aWwvcmFuZG9tX3NlZWQuaCIKPiA+ ICsjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKPiA+ICsjaW5jbHVkZSAiYXZjLmgiCj4gPiAr I2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKPiA+ICsjaW5jbHVkZSAiaHR0cC5oIgo+ID4gKyNp bmNsdWRlICJpbnRlcm5hbC5oIgo+ID4gKyNpbmNsdWRlICJtdXguaCIKPiA+ICsjaW5jbHVkZSAi bmV0d29yay5oIgo+ID4gKyNpbmNsdWRlICJzcnRwLmgiCj4gPiArCj4gPiArLyoqCj4gPiArICog TWF4aW11bSBzaXplIGxpbWl0IG9mIGEgU2Vzc2lvbiBEZXNjcmlwdGlvbiBQcm90b2NvbCAoU0RQ KSwKPiA+ICsgKiBiZSBpdCBhbiBvZmZlciBvciBhbnN3ZXIuCj4gPiArICovCj4gPiArI2RlZmlu ZSBNQVhfU0RQX1NJWkUgODE5Mgo+ID4KPiAKPiA/Cj4gCj4gCldpbmxpbjogV2hlbiBnZW5lcmF0 aW5nIGFuIFNEUCBvZmZlciBvciBwYXJzaW5nIGFuIFNEUCBhbnN3ZXIsIGEgbWF4aW11bSBsZW5n dGggZm9yIHRoZSBTRFAgaXMgZXN0YWJsaXNoZWQuCkkgZG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQg d2hhdCB0aGUgcXVlc3Rpb24gaXMgYWJvdXQuIFdvbid0IGZpeC4KPiAKPiAKPiAKPiAKPiA+ICsv KioKPiA+ICsgKiBNYXhpbXVtIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3Igc2VuZGluZyBhbmQgcmVj ZWl2aW5nIFVEUCBwYWNrZXRzLgo+ID4gKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzaXplIGRv ZXMgbm90IGxpbWl0IHRoZSBzaXplIG9mIHRoZSBVRFAgcGFja2V0Cj4gPiB0aGF0IGNhbiBiZSBz ZW50Lgo+ID4gKyAqIFRvIHNldCB0aGUgbGltaXQgZm9yIHBhY2tldCBzaXplLCBtb2RpZnkgdGhl IGBwa3Rfc2l6ZWAgcGFyYW1ldGVyLgo+ID4gKyAqIEZvciBpbnN0YW5jZSwgaXQgaXMgcG9zc2li bGUgdG8gc2V0IHRoZSBVRFAgYnVmZmVyIHRvIDQwOTYgdG8gc2VuZCBvcgo+ID4gcmVjZWl2ZSBw YWNrZXRzLAo+ID4gKyAqIGJ1dCBwbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGBwa3Rfc2l6 ZWAgb3B0aW9uIGxpbWl0cyB0aGUgcGFja2V0Cj4gPiBzaXplIHRvIDE0MDAuCj4gPiArICovCj4g PiArI2RlZmluZSBNQVhfVURQX0JVRkZFUl9TSVpFIDQwOTYKPiA+ICsvKgo+ID4KPiA+Cj4gCj4g Cj4gPiArCj4gPiArLyoqCj4gPiArICogUGFyc2VzIHRoZSBJU09NIEFWQ0MgZm9ybWF0IG9mIGV4 dHJhZGF0YSBhbmQgZXh0cmFjdHMgU1BTL1BQUy4KPiA+ICsgKgo+ID4gKyAqIFRoaXMgZnVuY3Rp b24gaXMgdXNlZCB0byBwYXJzZSBTUFMvUFBTIGZyb20gdGhlIGV4dHJhZGF0YSBpbiBJU09NIEFW Q0MKPiA+IGZvcm1hdC4KPiA+ICsgKiBJdCBjYW4gaGFuZGxlIGJvdGggSVNPTSBhbmQgYW5uZXhi IGZvcm1hdHMgYnV0IG9ubHkgcGFyc2VzIGRhdGEgaW4KPiA+IElTT00gZm9ybWF0Lgo+ID4gKyAq IElmIHRoZSBleHRyYWRhdGEgaXMgaW4gYW5uZXhiIGZvcm1hdCwgdGhpcyBmdW5jdGlvbiBpZ25v cmVzIGl0LCBhbmQKPiA+IHVzZXMgdGhlIGVudGlyZQo+ID4gKyAqIGV4dHJhZGF0YSBhcyBhIHNl cXVlbmNlIGhlYWRlciB3aXRoIFNQUy9QUFMuIFJlZmVyIHRvCj4gPiBmZl9pc29tX3dyaXRlX2F2 Y2MuCj4gPiArICoKPiA+ICsgKiBAcGFyYW0gcyBQb2ludGVyIHRvIHRoZSBBVkZvcm1hdENvbnRl eHQKPiA+ICsgKiBAcGFyYW0gZXh0cmFkYXRhIFBvaW50ZXIgdG8gdGhlIGV4dHJhZGF0YQo+ID4g KyAqIEBwYXJhbSBleHRyYWRhdGFfc2l6ZSBTaXplIG9mIHRoZSBleHRyYWRhdGEKPiA+ICsgKiBA cmV0dXJucyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCBvciBBVkVSUk9SX3h4eCBpbiBjYXNlCj4g PiBvZiBhbiBlcnJvci4KPiA+ICsgKi8KPiA+ICtzdGF0aWMgaW50IGlzb21fcmVhZF9hdmNjKEFW Rm9ybWF0Q29udGV4dCAqcywgdWludDhfdCAqZXh0cmFkYXRhLCBpbnQKPiA+IGV4dHJhZGF0YV9z aXplKQo+ID4gK3sKPiA+ICsgaW50IHJldCA9IDA7Cj4gPiArIHVpbnQ4X3QgdmVyc2lvbiwgbmFs X2xlbmd0aF9zaXplLCBuYl9zcHMsIG5iX3BwczsKPiA+ICsgQVZJT0NvbnRleHQgKnBiOwo+ID4g KyBSVENDb250ZXh0ICpydGMgPSBzLT5wcml2X2RhdGE7Cj4gPiArCj4gPiArIGlmICghZXh0cmFk YXRhIHx8ICFleHRyYWRhdGFfc2l6ZSkKPiA+ICsgcmV0dXJuIDA7Cj4gPiArCj4gPiArIC8qIE5v dCBILjI2NCBJU09NIGZvcm1hdCwgbWF5IGJlIGFubmV4YiBldGMuICovCj4gPiArIGlmIChleHRy YWRhdGFfc2l6ZSA8IDQgfHwgZXh0cmFkYXRhWzBdICE9IDEpIHsKPiA+ICsgaWYgKCFmZl9hdmNf ZmluZF9zdGFydGNvZGUoZXh0cmFkYXRhLCBleHRyYWRhdGEgKwo+ID4gZXh0cmFkYXRhX3NpemUp KSB7Cj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGb3JtYXQgbXVzdCBiZSBJU09NIG9y IGFubmV4YlxuIik7Cj4gPiArIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ID4gKyB9Cj4g PiArIHJldHVybiAwOwo+ID4gKyB9Cj4gPiArCj4gPiArIC8qIFBhcnNlIHRoZSBTUFMvUFBTIGlu IElTT00gZm9ybWF0IGluIGV4dHJhZGF0YS4gKi8KPiA+ICsgcGIgPSBhdmlvX2FsbG9jX2NvbnRl eHQoZXh0cmFkYXRhLCBleHRyYWRhdGFfc2l6ZSwgMCwgTlVMTCwgTlVMTCwKPiA+IE5VTEwsIE5V TEwpOwo+ID4gKyBpZiAoIXBiKQo+ID4gKyByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ID4gKwo+ ID4gKyB2ZXJzaW9uID0gYXZpb19yOChwYik7IC8qIHZlcnNpb24gKi8KPiA+ICsgYXZpb19yOChw Yik7IC8qIGF2YyBwcm9maWxlICovCj4gPiArIGF2aW9fcjgocGIpOyAvKiBhdmMgcHJvZmlsZSBj b21wYXQgKi8KPiA+ICsgYXZpb19yOChwYik7IC8qIGF2YyBsZXZlbCAqLwo+ID4gKyBuYWxfbGVu Z3RoX3NpemUgPSBhdmlvX3I4KHBiKTsgLyogNiBiaXRzIHJlc2VydmVkICgxMTExMTEpICsgMiBi aXRzCj4gPiBuYWwgc2l6ZSBsZW5ndGggLSAxICgxMSkgKi8KPiA+ICsgbmJfc3BzID0gYXZpb19y OChwYik7IC8qIDMgYml0cyByZXNlcnZlZCAoMTExKSArIDUgYml0cyBudW1iZXIgb2Ygc3BzCj4g PiAqLwo+ID4gKwo+ID4gKyBpZiAodmVyc2lvbiAhPSAxKSB7Cj4gPiArIGF2X2xvZyhzLCBBVl9M T0dfRVJST1IsICJJbnZhbGlkIHZlcnNpb249JWRcbiIsIHZlcnNpb24pOwo+ID4gKyByZXQgPSBB VkVSUk9SX0lOVkFMSUREQVRBOwo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyBy dGMtPmF2Y19uYWxfbGVuZ3RoX3NpemUgPSAobmFsX2xlbmd0aF9zaXplICYgMHgwMykgKyAxOwo+ ID4gKyBpZiAocnRjLT5hdmNfbmFsX2xlbmd0aF9zaXplID09IDMpIHsKPiA+ICsgYXZfbG9nKHMs IEFWX0xPR19FUlJPUiwgIkludmFsaWQgbmFsIGxlbmd0aCBzaXplPSVkXG4iLAo+ID4gcnRjLT5h dmNfbmFsX2xlbmd0aF9zaXplKTsKPiA+ICsgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKPiA+ ICsgZ290byBlbmQ7Cj4gPiArIH0KPiA+ICsKPiA+ICsgLyogUmVhZCBTUFMgKi8KPiA+ICsgbmJf c3BzICY9IDB4MWY7Cj4gPiArIGlmIChuYl9zcHMgIT0gMSB8fCBhdmlvX2Zlb2YocGIpKSB7Cj4g PiArIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBzcHM9JWQsIGVv Zj0lZFxuIiwKPiA+IG5iX3NwcywgYXZpb19mZW9mKHBiKSk7Cj4gPiArIHJldCA9IEFWRVJST1Jf SU5WQUxJRERBVEE7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4gPiArIHJ0Yy0+YXZj X3Nwc19zaXplID0gYXZpb19yYjE2KHBiKTsgLyogc3BzIHNpemUgKi8KPiA+ICsgaWYgKHJ0Yy0+ YXZjX3Nwc19zaXplIDw9IDAgfHwgYXZpb19mZW9mKHBiKSkgewo+ID4gKyBhdl9sb2cocywgQVZf TE9HX0VSUk9SLCAiSW52YWxpZCBzcHMgc2l6ZT0lZCwgZW9mPSVkXG4iLAo+ID4gcnRjLT5hdmNf c3BzX3NpemUsIGF2aW9fZmVvZihwYikpOwo+ID4gKyByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRB Owo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyBydGMtPmF2Y19zcHMgPSBhdl9t YWxsb2MocnRjLT5hdmNfc3BzX3NpemUpOwo+ID4gKyBpZiAoIXJ0Yy0+YXZjX3Nwcykgewo+ID4g KyByZXQgPSBBVkVSUk9SKEVOT01FTSk7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4g PiArIHJldCA9IGF2aW9fcmVhZChwYiwgcnRjLT5hdmNfc3BzLCBydGMtPmF2Y19zcHNfc2l6ZSk7 IC8qIHNwcyAqLwo+ID4gKyBpZiAocmV0IDwgMCkgewo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VS Uk9SLCAiRmFpbGVkIHRvIHJlYWQgc3BzLCBzaXplPSVkXG4iLAo+ID4gcnRjLT5hdmNfc3BzX3Np emUpOwo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyAvKiBSZWFkIFBQUyAqLwo+ ID4gKyBuYl9wcHMgPSBhdmlvX3I4KHBiKTsgLyogbnVtYmVyIG9mIHBwcyAqLwo+ID4gKyBpZiAo bmJfcHBzICE9IDEgfHwgYXZpb19mZW9mKHBiKSkgewo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VS Uk9SLCAiSW52YWxpZCBudW1iZXIgb2YgcHBzPSVkLCBlb2Y9JWRcbiIsCj4gPiBuYl9wcHMsIGF2 aW9fZmVvZihwYikpOwo+ID4gKyByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ID4gKyBnb3Rv IGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyBydGMtPmF2Y19wcHNfc2l6ZSA9IGF2aW9fcmIxNihw Yik7IC8qIHBwcyBzaXplICovCj4gPiArIGlmIChydGMtPmF2Y19wcHNfc2l6ZSA8PSAwIHx8IGF2 aW9fZmVvZihwYikpIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcHBz IHNpemU9JWQsIGVvZj0lZFxuIiwKPiA+IHJ0Yy0+YXZjX3Bwc19zaXplLCBhdmlvX2Zlb2YocGIp KTsKPiA+ICsgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKPiA+ICsgZ290byBlbmQ7Cj4gPiAr IH0KPiA+ICsKPiA+ICsgcnRjLT5hdmNfcHBzID0gYXZfbWFsbG9jKHJ0Yy0+YXZjX3Bwc19zaXpl KTsKPiA+ICsgaWYgKCFydGMtPmF2Y19wcHMpIHsKPiA+ICsgcmV0ID0gQVZFUlJPUihFTk9NRU0p Owo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyByZXQgPSBhdmlvX3JlYWQocGIs IHJ0Yy0+YXZjX3BwcywgcnRjLT5hdmNfcHBzX3NpemUpOyAvKiBwcHMgKi8KPiA+ICsgaWYgKHJl dCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWFkIHBw cywgc2l6ZT0lZFxuIiwKPiA+IHJ0Yy0+YXZjX3Bwc19zaXplKTsKPiA+ICsgZ290byBlbmQ7Cj4g PiArIH0KPiA+ICsKPiA+ICtlbmQ6Cj4gPiArIGF2aW9fY29udGV4dF9mcmVlKCZwYik7Cj4gPiAr IHJldHVybiByZXQ7Cj4gPiArfQo+ID4KPiAKPiBUaGlzIGNvZGUgaXMgZHVwbGljYXRlZCBmcm9t IG90aGVyIHBhcnRzIG9mIEZGbXBlZwpXaW5saW46IFV0aWxpemUgdGhlIGgyNjRfbXA0dG9hbm5l eGIgQlNGIGFuZCByZW1vdmUgdGhpcyBmdW5jdGlvbi4KPiAKPiArLyoqCj4gCj4gPiArICogR2Vu ZXJhdGUgU0RQIG9mZmVyIGFjY29yZGluZyB0byB0aGUgY29kZWMgcGFyYW1ldGVycywgRFRMUyBh bmQgSUNFCj4gPiBpbmZvcm1hdGlvbi4KPiA+ICsgKiBUaGUgYmVsb3cgaXMgYW4gZXhhbXBsZSBv ZiBTRFAgb2ZmZXI6Cj4gPiArICoKPiA+ICsgKiB2PTAKPiA+ICsgKiBvPUZGbXBlZyA0NDg5MDQ1 MTQxNjkyNzk5MzU5IDIgSU4gSVA0IDEyNy4wLjAuMQo+ID4gKyAqIHM9RkZtcGVnUHVibGlzaFNl c3Npb24KPiA+ICsgKiB0PTAgMAo+ID4gKyAqIGE9Z3JvdXA6QlVORExFIDAgMQo+ID4gKyAqIGE9 ZXh0bWFwLWFsbG93LW1peGVkCj4gPiArICogYT1tc2lkLXNlbWFudGljOiBXTVMKPiA+ICsgKgo+ ID4gKyAqIG09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTEKPiA+ICsgKiBjPUlOIElQNCAw LjAuMC4wCj4gPiArICogYT1pY2UtdWZyYWc6YTE3NEIKPiA+ICsgKiBhPWljZS1wd2Q6d1k4ckoz Z05MeEwzZVdaczZVUE94eQo+ID4gKyAqIGE9ZmluZ2VycHJpbnQ6c2hhLTI1Ngo+ID4gRUU6RkU6 QTI6RTU6NkE6MjE6Nzg6NjA6NzE6MkM6MjE6REM6MUE6MkM6OTg6MTI6MEM6RTg6QUQ6Njg6MDc6 NjE6MUI6MEU6RkM6NDY6OTc6MUU6QkM6OTc6NEE6NTQKPiA+ICsgKiBhPXNldHVwOmFjdHBhc3MK PiA+ICsgKiBhPW1pZDowCj4gPiArICogYT1zZW5kb25seQo+ID4gKyAqIGE9bXNpZDpGRm1wZWcg YXVkaW8KPiA+ICsgKiBhPXJ0Y3AtbXV4Cj4gPiArICogYT1ydHBtYXA6MTExIG9wdXMvNDgwMDAv Mgo+ID4gKyAqIGE9c3NyYzo0MjY3NjQ3MDg2IGNuYW1lOkZGbXBlZwo+ID4gKyAqIGE9c3NyYzo0 MjY3NjQ3MDg2IG1zaWQ6RkZtcGVnIGF1ZGlvCj4gPiArICoKPiA+ICsgKiBtPXZpZGVvIDkgVURQ L1RMUy9SVFAvU0FWUEYgMTA2Cj4gPiArICogYz1JTiBJUDQgMC4wLjAuMAo+ID4gKyAqIGE9aWNl LXVmcmFnOmExNzRCCj4gPiArICogYT1pY2UtcHdkOndZOHJKM2dOTHhMM2VXWnM2VVBPeHkKPiA+ ICsgKiBhPWZpbmdlcnByaW50OnNoYS0yNTYKPiA+IEVFOkZFOkEyOkU1OjZBOjIxOjc4OjYwOjcx OjJDOjIxOkRDOjFBOjJDOjk4OjEyOjBDOkU4OkFEOjY4OjA3OjYxOjFCOjBFOkZDOjQ2Ojk3OjFF OkJDOjk3OjRBOjU0Cj4gPiArICogYT1zZXR1cDphY3RwYXNzCj4gPiArICogYT1taWQ6MQo+ID4g KyAqIGE9c2VuZG9ubHkKPiA+ICsgKiBhPW1zaWQ6RkZtcGVnIHZpZGVvCj4gPiArICogYT1ydGNw LW11eAo+ID4gKyAqIGE9cnRjcC1yc2l6ZQo+ID4gKyAqIGE9cnRwbWFwOjEwNiBIMjY0LzkwMDAw Cj4gPiArICogYT1mbXRwOjEwNgo+ID4gbGV2ZWwtYXN5bW1ldHJ5LWFsbG93ZWQ9MTtwYWNrZXRp emF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyZTAxZgo+ID4gKyAqIGE9c3NyYzoxMDcx NjkxMTAgY25hbWU6RkZtcGVnCj4gPiArICogYT1zc3JjOjEwNzE2OTExMCBtc2lkOkZGbXBlZyB2 aWRlbwo+ID4gKyAqCj4gPgo+IAo+IFRoaXMgaXMgbm90IGEgbGVnYWwgU0RQLCBlYWNoIGxpbmUg bXVzdCBlbmQgb25seSB3aXRoIG9uZSBzcGFjZSAoeWVzLCB0aGlzCj4gaXMgcmVndWxhcmx5IHdy b25nKS4KV2lubGluOiBJJ20gc29ycnksIHRoaXMgU0RQIGV4YW1wbGUgaXMgbm90IHNwZWNpZmlj IGFuZCBjb3JyZWN0IFNEUCBkYXRhIGZyb20gdGhlIHJlYWwgd29ybGQuIEkgYWRkZWQgYW4gZW1w dHkgbGluZSBiZXR3ZWVuIG0gbGluZXMgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIG90aGVyIHVzZXJz IHRvIHJlYWQuIEkgaGF2ZSBhbHNvIHJlbW92ZWQgdW5uY2Vzc2FyeSBTRFAgZXhhbXBsZXMgaW4g dGhlIGNvbW1lbnRzLgo+IAo+IAo+ID4KPiA+Cj4gPiArCj4gPiArLyoqCj4gPiArICogT3BlbnMg dGhlIFVEUCB0cmFuc3BvcnQgYW5kIGNvbXBsZXRlcyB0aGUgSUNFIGhhbmRzaGFrZSwgdXNpbmcg ZmFzdAo+ID4gcmV0cmFuc21pdCB0bwo+ID4gKyAqIGhhbmRsZSBwYWNrZXQgbG9zcyBmb3IgdGhl IGJpbmRpbmcgcmVxdWVzdC4KPiA+ICsgKgo+ID4gKyAqIFRvIGluaXRpYXRlIGEgZmFzdCByZXRy YW5zbWlzc2lvbiBvZiB0aGUgU1RVTiBiaW5kaW5nIHJlcXVlc3QgZHVyaW5nCj4gPiBJQ0UsIHdl IHdhaXQgb25seQo+ID4gKyAqIGZvciBhIHN1Y2Nlc3NmdWwgbG9jYWwgSUNFIHByb2Nlc3MgaS5l Liwgd2hlbiBhIGJpbmRpbmcgcmVzcG9uc2UgaXMKPiA+IHJlY2VpdmVkIGZyb20gdGhlCj4gPiAr ICogc2VydmVyLiBTaW5jZSB0aGUgc2VydmVyJ3MgYmluZGluZyByZXF1ZXN0IG1heSBub3QgYXJy aXZlLCB3ZSBkbyBub3QKPiA+IGFsd2F5cyB3YWl0IGZvciBpdC4KPiA+ICsgKiBIb3dldmVyLCB3 ZSB3aWxsIGFsd2F5cyByZXNwb25kIHRvIHRoZSBzZXJ2ZXIncyBiaW5kaW5nIHJlcXVlc3QgZHVy aW5nCj4gPiBJQ0UsIERUTFMgb3IKPiA+ICsgKiBSVFAgc3RyZWFtaW5nLgo+ID4gKyAqCj4gPiAr ICogQHBhcmFtIHMgUG9pbnRlciB0byB0aGUgQVZGb3JtYXRDb250ZXh0Cj4gPiArICogQHJldHVy biBSZXR1cm5zIDAgaWYgdGhlIGhhbmRzaGFrZSB3YXMgc3VjY2Vzc2Z1bCBvciBBVkVSUk9SX3h4 eCBpbgo+ID4gY2FzZSBvZiBhbiBlcnJvcgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBpbnQgaWNlX2hh bmRzaGFrZShBVkZvcm1hdENvbnRleHQgKnMpCj4gPiArewo+ID4gKyBpbnQgcmV0LCBzaXplOwo+ ID4gKyBjaGFyIHVybFsyNTZdLCB0bXBbMTZdOwo+ID4gKyBjaGFyIHJlcV9idWZbTUFYX1VEUF9C VUZGRVJfU0laRV0sIHJlc19idWZbTUFYX1VEUF9CVUZGRVJfU0laRV07Cj4gPiArIFJUQ0NvbnRl eHQgKnJ0YyA9IHMtPnByaXZfZGF0YTsKPiA+ICsgaW50IGZhc3RfcmV0cmllcyA9IHJ0Yy0+aWNl X2FycV9tYXgsIHRpbWVvdXQgPSBydGMtPmljZV9hcnFfdGltZW91dDsKPiA+ICsKPiA+ICsgLyog QnVpbGQgVURQIFVSTCBhbmQgY3JlYXRlIHRoZSBVRFAgY29udGV4dCBhcyB0cmFuc3BvcnQuICov Cj4gPiArIGZmX3VybF9qb2luKHVybCwgc2l6ZW9mKHVybCksICJ1ZHAiLCBOVUxMLCBydGMtPmlj ZV9ob3N0LAo+ID4gcnRjLT5pY2VfcG9ydCwgTlVMTCk7Cj4gPiArIHJldCA9IGZmdXJsX2FsbG9j KCZydGMtPnVkcF91YywgdXJsLCBBVklPX0ZMQUdfV1JJVEUsCj4gPiAmcy0+aW50ZXJydXB0X2Nh bGxiYWNrKTsKPiA+ICsgaWYgKHJldCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJP UiwgIkZhaWxlZCB0byBvcGVuIHVkcDovLyVzOiVkXG4iLAo+ID4gcnRjLT5pY2VfaG9zdCwgcnRj LT5pY2VfcG9ydCk7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4gPiArIGF2X29wdF9z ZXQocnRjLT51ZHBfdWMtPnByaXZfZGF0YSwgImNvbm5lY3QiLCAiMSIsIDApOwo+ID4gKyBhdl9v cHRfc2V0KHJ0Yy0+dWRwX3VjLT5wcml2X2RhdGEsICJmaWZvX3NpemUiLCAiMCIsIDApOwo+ID4g KyAvKiBTZXQgdGhlIG1heCBwYWNrZXQgc2l6ZSB0byB0aGUgYnVmZmVyIHNpemUuICovCj4gPiAr IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIlZCIsIHJ0Yy0+cGt0X3NpemUpOwo+ID4gKyBh dl9vcHRfc2V0KHJ0Yy0+dWRwX3VjLT5wcml2X2RhdGEsICJwa3Rfc2l6ZSIsIHRtcCwgMCk7Cj4g PiArCj4gPiArIHJldCA9IGZmdXJsX2Nvbm5lY3QocnRjLT51ZHBfdWMsIE5VTEwpOwo+ID4gKyBp ZiAocmV0IDwgMCkgewo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNv bm5lY3QgdWRwOi8vJXM6JWRcbiIsCj4gPiBydGMtPmljZV9ob3N0LCBydGMtPmljZV9wb3J0KTsK PiA+ICsgZ290byBlbmQ7Cj4gPiArIH0KPiA+ICsKPiA+ICsgLyogTWFrZSB0aGUgc29ja2V0IG5v bi1ibG9ja2luZywgc2V0IHRvIFJFQUQgYW5kIFdSSVRFIG1vZGUgYWZ0ZXIKPiA+IGNvbm5lY3Rl ZCAqLwo+ID4gKyBmZl9zb2NrZXRfbm9uYmxvY2soZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKHJ0Yy0+ dWRwX3VjKSwgMSk7Cj4gPiArIHJ0Yy0+dWRwX3VjLT5mbGFncyB8PSBBVklPX0ZMQUdfUkVBRCB8 IEFWSU9fRkxBR19OT05CTE9DSzsKPiA+ICsKPiA+ICsgLyogQnVpbGQgdGhlIFNUVU4gYmluZGlu ZyByZXF1ZXN0LiAqLwo+ID4gKyByZXQgPSBpY2VfY3JlYXRlX3JlcXVlc3QocywgcmVxX2J1Ziwg c2l6ZW9mKHJlcV9idWYpLCAmc2l6ZSk7Cj4gPiArIGlmIChyZXQgPCAwKSB7Cj4gPiArIGF2X2xv ZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFNUVU4gYmluZGluZyByZXF1ZXN0 LAo+ID4gc2l6ZT0lZFxuIiwgc2l6ZSk7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4g PiArIC8qIEZhc3QgcmV0cmFuc21pdCB0aGUgU1RVTiBiaW5kaW5nIHJlcXVlc3QuICovCj4gPiAr IHdoaWxlICgxKSB7Cj4gPiArIHJldCA9IGZmdXJsX3dyaXRlKHJ0Yy0+dWRwX3VjLCByZXFfYnVm LCBzaXplKTsKPiA+ICsgaWYgKHJldCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJP UiwgIkZhaWxlZCB0byBzZW5kIFNUVU4gYmluZGluZyByZXF1ZXN0LAo+ID4gc2l6ZT0lZFxuIiwg c2l6ZSk7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4gPiArIC8qIFdhaXQgc28gdGhh dCB0aGUgc2VydmVyIGNhbiBwcm9jZXNzIHRoZSByZXF1ZXN0IGFuZCBubyBuZWVkCj4gPiBBUlEg dGhlbi4gKi8KPiA+ICsjaWYgSUNFX1BST0NFU1NJTkdfVElNRU9VVCA+IDAKPiA+ICsgYXZfdXNs ZWVwKElDRV9QUk9DRVNTSU5HX1RJTUVPVVQgKiAxMDAwMCk7Cj4gPiArI2VuZGlmCj4gPiArCj4g PiArIC8qIFJlYWQgdGhlIFNUVU4gYmluZGluZyByZXNwb25zZS4gKi8KPiA+ICsgcmV0ID0gZmZ1 cmxfcmVhZChydGMtPnVkcF91YywgcmVzX2J1Ziwgc2l6ZW9mKHJlc19idWYpKTsKPiA+ICsgaWYg KHJldCA8IDApIHsKPiA+ICsgLyogSWYgbWF4IHJldHJpZXMgaXMgNiBhbmQgc3RhcnQgdGltZW91 dCBpcyAyMW1zLCB0aGUgdG90YWwKPiA+IHRpbWVvdXQKPiA+ICsgKiBpcyBhYm91dCAyMSArIDQy ICsgODQgKyAxNjggKyAzMzYgKyA2NzIgPSAxMjYzbXMuICovCj4gPiArIGF2X3VzbGVlcCh0aW1l b3V0ICogMTAwMCk7Cj4gPiArIHRpbWVvdXQgKj0gMjsKPiA+ICsKPiA+ICsgaWYgKHJldCA9PSBB VkVSUk9SKEVBR0FJTikgJiYgZmFzdF9yZXRyaWVzKSB7Cj4gPiArIGZhc3RfcmV0cmllcy0tOwo+ ID4gKyBjb250aW51ZTsKPiA+ICsgfQo+ID4gKwo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VSUk9S LCAiRmFpbGVkIHRvIHJlYWQgU1RVTiBiaW5kaW5nCj4gPiByZXNwb25zZSwgcmV0cmllcz0lZFxu IiwgcnRjLT5pY2VfYXJxX21heCk7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4gPiAr IC8qIElmIGdvdCBhbnkgYmluZGluZyByZXNwb25zZSwgdGhlIGZhc3QgcmV0cmFuc21pc3Npb24g aXMgZG9uZS4KPiA+ICovCj4gPiArIGlmIChpY2VfaXNfYmluZGluZ19yZXNwb25zZShyZXNfYnVm LCByZXQpKQo+ID4gKyBicmVhazsKPiA+ICsKPiA+ICsgLyogV2hlbiBhIGJpbmRpbmcgcmVxdWVz dCBpcyByZWNlaXZlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlc3BvbmQKPiA+IGltbWVkaWF0ZWx5 LiAqLwo+ID4gKyBpZiAoaWNlX2lzX2JpbmRpbmdfcmVxdWVzdChyZXNfYnVmLCByZXQpICYmIChy ZXQgPQo+ID4gaWNlX2hhbmRsZV9iaW5kaW5nX3JlcXVlc3QocywgcmVzX2J1ZiwgcmV0KSkgPCAw KQo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyAvKiBXYWl0IGp1c3QgZm9yIGEg c21hbGwgd2hpbGUgdG8gZ2V0IHRoZSBwb3NzaWJsZSBiaW5kaW5nIHJlcXVlc3QKPiA+IGZyb20g c2VydmVyLiAqLwo+ID4gKyBmYXN0X3JldHJpZXMgPSBydGMtPmljZV9hcnFfbWF4IC8gMjsKPiA+ ICsgdGltZW91dCA9IHJ0Yy0+aWNlX2FycV90aW1lb3V0Owo+ID4gKyB3aGlsZSAoZmFzdF9yZXRy aWVzKSB7Cj4gPiArIHJldCA9IGZmdXJsX3JlYWQocnRjLT51ZHBfdWMsIHJlc19idWYsIHNpemVv ZihyZXNfYnVmKSk7Cj4gPiArIGlmIChyZXQgPCAwKSB7Cj4gPiArIC8qIElmIG1heCByZXRyaWVz IGlzIDYgYW5kIHN0YXJ0IHRpbWVvdXQgaXMgMjFtcywgdGhlIHRvdGFsCj4gPiB0aW1lb3V0Cj4g PiArICogaXMgYWJvdXQgMjEgKyA0MiArIDg0ID0gMTQ3bXMuICovCj4gPiArIGF2X3VzbGVlcCh0 aW1lb3V0ICogMTAwMCk7Cj4gPiArIHRpbWVvdXQgKj0gMjsKPiA+ICsKPiA+ICsgaWYgKHJldCA9 PSBBVkVSUk9SKEVBR0FJTikpIHsKPiA+ICsgZmFzdF9yZXRyaWVzLS07Cj4gPiArIGNvbnRpbnVl Owo+ID4gKyB9Cj4gPiArCj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8g cmVhZCBTVFVOIGJpbmRpbmcgcmVxdWVzdCwKPiA+IHJldHJpZXM9JWRcbiIsIHJ0Yy0+aWNlX2Fy cV9tYXgpOwo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyAvKiBXaGVuIGEgYmlu ZGluZyByZXF1ZXN0IGlzIHJlY2VpdmVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVzcG9uZAo+ID4g aW1tZWRpYXRlbHkuICovCj4gPiArIGlmIChpY2VfaXNfYmluZGluZ19yZXF1ZXN0KHJlc19idWYs IHJldCkpIHsKPiA+ICsgaWYgKChyZXQgPSBpY2VfaGFuZGxlX2JpbmRpbmdfcmVxdWVzdChzLCBy ZXNfYnVmLCByZXQpKSA8IDApCj4gPiArIGdvdG8gZW5kOwo+ID4gKyBicmVhazsKPiA+ICsgfQo+ ID4gKyB9Cj4gPiArCj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIldISVA6IElDRSBTVFVO IG9rLCB1cmw9dWRwOi8vJXM6JWQsCj4gPiBsb2NhdGlvbj0lcywgdXNlcm5hbWU9JXM6JXMsIHJl cT0lZEIsIHJlcz0lZEIsIGFycT0lZFxuIiwKPiA+ICsgcnRjLT5pY2VfaG9zdCwgcnRjLT5pY2Vf cG9ydCwgcnRjLT53aGlwX3Jlc291cmNlX3VybCA/Cj4gPiBydGMtPndoaXBfcmVzb3VyY2VfdXJs IDogIiIsCj4gPiArIHJ0Yy0+aWNlX3VmcmFnX3JlbW90ZSwgcnRjLT5pY2VfdWZyYWdfbG9jYWws IHNpemUsIHJldCwKPiA+ICsgcnRjLT5pY2VfYXJxX21heCAtIGZhc3RfcmV0cmllcyk7Cj4gPiAr IHJldCA9IDA7Cj4gPiArCj4gPiArZW5kOgo+ID4gKyByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsK PiA+ICsvKioKPiA+ICsgKiBFc3RhYmxpc2ggdGhlIFNSVFAgY29udGV4dCB1c2luZyB0aGUga2V5 aW5nIG1hdGVyaWFsIGV4cG9ydGVkIGZyb20KPiA+IERUTFMuCj4gPiArICoKPiA+ICsgKiBDcmVh dGUgc2VwYXJhdGUgU1JUUCBjb250ZXh0cyBmb3Igc2VuZGluZyB2aWRlbyBhbmQgYXVkaW8sIGFz IHRoZWlyCj4gPiBzZXF1ZW5jZXMgZGlmZmVyCj4gPiArICogYW5kIHNob3VsZCBub3Qgc2hhcmUg YSBzaW5nbGUgY29udGV4dC4gR2VuZXJhdGUgYSBzaW5nbGUgU1JUUCBjb250ZXh0Cj4gPiBmb3Ig cmVjZWl2aW5nCj4gPiArICogUlRDUCBvbmx5Lgo+ID4gKyAqCj4gPiArICogQHJldHVybiAwIGlm IE9LLCBBVkVSUk9SX3h4eCBvbiBlcnJvcgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBpbnQgc2V0dXBf c3J0cChBVkZvcm1hdENvbnRleHQgKnMpCj4gPiArewo+ID4gKyBpbnQgcmV0Owo+ID4gKyBjaGFy IHJlY3Zfa2V5W0RUTFNfU1JUUF9NQVNURVJfS0VZX0xFTl0sCj4gPiBzZW5kX2tleVtEVExTX1NS VFBfTUFTVEVSX0tFWV9MRU5dOwo+ID4gKyBjaGFyIGJ1ZltBVl9CQVNFNjRfU0laRShEVExTX1NS VFBfTUFTVEVSX0tFWV9MRU4pXTsKPiA+ICsgY29uc3QgY2hhciogc3VpdGUgPSAiQUVTX0NNXzEy OF9ITUFDX1NIQTFfODAiOwo+ID4gKyBSVENDb250ZXh0ICpydGMgPSBzLT5wcml2X2RhdGE7Cj4g PiArCj4gPiArIC8qIEFzIERUTFMgY2xpZW50LCB0aGUgc2VuZCBrZXkgaXMgY2xpZW50IG1hc3Rl ciBrZXkgcGx1cyBzYWx0LiAqLwo+ID4gKyBtZW1jcHkoc2VuZF9rZXksIHJ0Yy0+ZHRsc19jdHgu ZHRsc19zcnRwX21hdGVyaWFsLCAxNik7Cj4gPiArIG1lbWNweShzZW5kX2tleSArIDE2LCBydGMt PmR0bHNfY3R4LmR0bHNfc3J0cF9tYXRlcmlhbCArIDMyLCAxNCk7Cj4gPiArCj4gPiArIC8qIEFz IERUTFMgY2xpZW50LCB0aGUgcmVjdiBrZXkgaXMgc2VydmVyIG1hc3RlciBrZXkgcGx1cyBzYWx0 LiAqLwo+ID4gKyBtZW1jcHkocmVjdl9rZXksIHJ0Yy0+ZHRsc19jdHguZHRsc19zcnRwX21hdGVy aWFsICsgMTYsIDE2KTsKPiA+ICsgbWVtY3B5KHJlY3Zfa2V5ICsgMTYsIHJ0Yy0+ZHRsc19jdHgu ZHRsc19zcnRwX21hdGVyaWFsICsgNDYsIDE0KTsKPiA+ICsKPiA+ICsgLyogU2V0dXAgU1JUUCBj b250ZXh0IGZvciBvdXRnb2luZyBwYWNrZXRzICovCj4gPiArIGlmICghYXZfYmFzZTY0X2VuY29k ZShidWYsIHNpemVvZihidWYpLCBzZW5kX2tleSwgc2l6ZW9mKHNlbmRfa2V5KSkpIHsKPiA+ICsg YXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBlbmNvZGUgc2VuZCBrZXlcbiIpOwo+ ID4gKyByZXQgPSBBVkVSUk9SKEVJTyk7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4g PiArIHJldCA9IGZmX3NydHBfc2V0X2NyeXB0bygmcnRjLT5zcnRwX2F1ZGlvX3NlbmQsIHN1aXRl LCBidWYpOwo+ID4gKyBpZiAocmV0IDwgMCkgewo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VSUk9S LCAiRmFpbGVkIHRvIHNldCBjcnlwdG8gZm9yIGF1ZGlvIHNlbmRcbiIpOwo+ID4gKyBnb3RvIGVu ZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyByZXQgPSBmZl9zcnRwX3NldF9jcnlwdG8oJnJ0Yy0+c3J0 cF92aWRlb19zZW5kLCBzdWl0ZSwgYnVmKTsKPiA+ICsgaWYgKHJldCA8IDApIHsKPiA+ICsgYXZf bG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQgY3J5cHRvIGZvciB2aWRlbyBzZW5k XG4iKTsKPiA+ICsgZ290byBlbmQ7Cj4gPiArIH0KPiA+ICsKPiA+ICsgcmV0ID0gZmZfc3J0cF9z ZXRfY3J5cHRvKCZydGMtPnNydHBfcnRjcF9zZW5kLCBzdWl0ZSwgYnVmKTsKPiA+ICsgaWYgKHJl dCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQgY3J5 cHRvIGZvciBydGNwIHNlbmRcbiIpOwo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4g KyAvKiBTZXR1cCBTUlRQIGNvbnRleHQgZm9yIGluY29taW5nIHBhY2tldHMgKi8KPiA+ICsgaWYg KCFhdl9iYXNlNjRfZW5jb2RlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHJlY3Zfa2V5LCBzaXplb2YocmVj dl9rZXkpKSkgewo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVuY29k ZSByZWN2IGtleVxuIik7Cj4gPiArIHJldCA9IEFWRVJST1IoRUlPKTsKPiA+ICsgZ290byBlbmQ7 Cj4gPiArIH0KPiA+ICsKPiA+ICsgcmV0ID0gZmZfc3J0cF9zZXRfY3J5cHRvKCZydGMtPnNydHBf cmVjdiwgc3VpdGUsIGJ1Zik7Cj4gPiArIGlmIChyZXQgPCAwKSB7Cj4gPiArIGF2X2xvZyhzLCBB Vl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGNyeXB0byBmb3IgcmVjdlxuIik7Cj4gPiArIGdv dG8gZW5kOwo+ID4gKyB9Cj4gPiArCj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIldISVA6 IFNSVFAgc2V0dXAgZG9uZSwgc3VpdGU9JXMsIGtleT0lbHVCXG4iLAo+ID4gc3VpdGUsIHNpemVv ZihzZW5kX2tleSkpOwo+ID4gKwo+ID4gK2VuZDoKPiA+ICsgcmV0dXJuIHJldDsKPiA+ICt9Cj4g PiArCj4gPiArLyoqCj4gPiArICogQ3JlYXRlcyBkZWRpY2F0ZWQgUlRQIG11eGVycyBmb3IgZWFj aCBzdHJlYW0gaW4gdGhlIEFWRm9ybWF0Q29udGV4dCB0bwo+ID4gYnVpbGQgUlRQCj4gPiArICog cGFja2V0cyBmcm9tIHRoZSBlbmNvZGVkIGZyYW1lcy4KPiA+ICsgKgo+ID4gKyAqIFRoZSBjb3Jy ZXNwb25kaW5nIFNSVFAgY29udGV4dCBpcyB1dGlsaXplZCB0byBlbmNyeXB0IGVhY2ggc3RyZWFt J3MKPiA+IFJUUCBwYWNrZXRzLiBGb3IKPiA+ICsgKiBleGFtcGxlLCBhIHZpZGVvIFNSVFAgY29u dGV4dCBpcyB1c2VkIGZvciB0aGUgdmlkZW8gc3RyZWFtLgo+ID4gQWRkaXRpb25hbGx5LCB0aGUK PiA+ICsgKiAib25fcnRwX3dyaXRlX3BhY2tldCIgY2FsbGJhY2sgZnVuY3Rpb24gaXMgc2V0IGFz IHRoZSB3cml0ZSBmdW5jdGlvbgo+ID4gZm9yIGVhY2ggUlRQCj4gPiArICogbXV4ZXIgdG8gc2Vu ZCBvdXQgZW5jcnlwdGVkIFJUUCBwYWNrZXRzLgo+ID4gKyAqCj4gPiArICogQHJldHVybiAwIGlm IE9LLCBBVkVSUk9SX3h4eCBvbiBlcnJvcgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBpbnQgY3JlYXRl X3J0cF9tdXhlcihBVkZvcm1hdENvbnRleHQgKnMpCj4gPiArewo+ID4gKyBpbnQgcmV0LCBpLCBp c192aWRlbywgYnVmZmVyX3NpemUsIG1heF9wYWNrZXRfc2l6ZTsKPiA+ICsgQVZGb3JtYXRDb250 ZXh0ICpydHBfY3R4ID0gTlVMTDsKPiA+ICsgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKPiA+ ICsgdWludDhfdCAqYnVmZmVyID0gTlVMTDsKPiA+ICsgY2hhciBidWZbNjRdOwo+ID4gKyBSVEND b250ZXh0ICpydGMgPSBzLT5wcml2X2RhdGE7Cj4gPiArCj4gPiArIGNvbnN0IEFWT3V0cHV0Rm9y bWF0ICpydHBfZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJydHAiLCBOVUxMLCBOVUxMKTsKPiA+ ICsgaWYgKCFydHBfZm9ybWF0KSB7Cj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWls ZWQgdG8gZ3Vlc3MgcnRwIG11eGVyXG4iKTsKPiA+ICsgcmV0ID0gQVZFUlJPUihFTk9TWVMpOwo+ ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyAvKiBUaGUgVURQIGJ1ZmZlciBzaXpl LCBtYXkgZ3JlYXRlciB0aGFuIE1UVS4gKi8KPiA+ICsgYnVmZmVyX3NpemUgPSBNQVhfVURQX0JV RkZFUl9TSVpFOwo+ID4gKyAvKiBUaGUgUlRQIHBheWxvYWQgbWF4IHNpemUuIFJlc2VydmVkIHNv bWUgYnl0ZXMgZm9yIFNSVFAgY2hlY2tzdW0KPiA+IGFuZCBwYWRkaW5nLiAqLwo+ID4gKyBtYXhf cGFja2V0X3NpemUgPSBydGMtPnBrdF9zaXplIC0gRFRMU19TUlRQX0NIRUNLU1VNX0xFTjsKPiA+ ICsKPiA+ICsgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewo+ID4gKyBydHBf Y3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOwo+ID4gKyBpZiAoIXJ0cF9jdHgpIHsKPiA+ ICsgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ ID4gKyBydHBfY3R4LT5vZm9ybWF0ID0gcnRwX2Zvcm1hdDsKPiA+ICsgaWYgKCFhdmZvcm1hdF9u ZXdfc3RyZWFtKHJ0cF9jdHgsIE5VTEwpKSB7Cj4gPiArIHJldCA9IEFWRVJST1IoRU5PTUVNKTsK PiA+ICsgZ290byBlbmQ7Cj4gPiArIH0KPiA+ICsgLyogUGFzcyB0aGUgaW50ZXJydXB0IGNhbGxi YWNrIG9uICovCj4gPiArIHJ0cF9jdHgtPmludGVycnVwdF9jYWxsYmFjayA9IHMtPmludGVycnVw dF9jYWxsYmFjazsKPiA+ICsgLyogQ29weSB0aGUgbWF4IGRlbGF5IHNldHRpbmc7IHRoZSBydHAg bXV4ZXIgcmVhZHMgdGhpcy4gKi8KPiA+ICsgcnRwX2N0eC0+bWF4X2RlbGF5ID0gcy0+bWF4X2Rl bGF5Owo+ID4gKyAvKiBDb3B5IG90aGVyIHN0cmVhbSBwYXJhbWV0ZXJzLiAqLwo+ID4gKyBydHBf Y3R4LT5zdHJlYW1zWzBdLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0KPiA+IHMtPnN0cmVhbXNbaV0t PnNhbXBsZV9hc3BlY3RfcmF0aW87Cj4gPiArIHJ0cF9jdHgtPmZsYWdzIHw9IHMtPmZsYWdzICYg QVZGTVRfRkxBR19CSVRFWEFDVDsKPiA+ICsgcnRwX2N0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNl ID0gcy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlOwo+ID4gKwo+ID4gKyAvKiBTZXQgdGhlIHN5bmNo cm9uaXplZCBzdGFydCB0aW1lLiAqLwo+ID4gKyBydHBfY3R4LT5zdGFydF90aW1lX3JlYWx0aW1l ID0gcy0+c3RhcnRfdGltZV9yZWFsdGltZTsKPiA+ICsKPiA+ICsgYXZjb2RlY19wYXJhbWV0ZXJz X2NvcHkocnRwX2N0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXIsCj4gPiBzLT5zdHJlYW1zW2ldLT5j b2RlY3Bhcik7Cj4gPiArIHJ0cF9jdHgtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZSA9IHMtPnN0cmVh bXNbaV0tPnRpbWVfYmFzZTsKPiA+ICsKPiA+ICsgYnVmZmVyID0gYXZfbWFsbG9jKGJ1ZmZlcl9z aXplKTsKPiA+ICsgaWYgKCFidWZmZXIpIHsKPiA+ICsgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwo+ ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyBydHBfY3R4LT5wYiA9IGF2aW9fYWxs b2NfY29udGV4dChidWZmZXIsIGJ1ZmZlcl9zaXplLCAxLCBzLCBOVUxMLAo+ID4gb25fcnRwX3dy aXRlX3BhY2tldCwgTlVMTCk7Cj4gPiArIGlmICghcnRwX2N0eC0+cGIpIHsKPiA+ICsgcmV0ID0g QVZFUlJPUihFTk9NRU0pOwo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKyBydHBfY3R4LT5w Yi0+bWF4X3BhY2tldF9zaXplID0gbWF4X3BhY2tldF9zaXplOwo+ID4gKyBydHBfY3R4LT5wYi0+ YXZfY2xhc3MgPSAmZmZfYXZpb19jbGFzczsKPiA+ICsKPiA+ICsgaXNfdmlkZW8gPSBzLT5zdHJl YW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PQo+ID4gQVZNRURJQV9UWVBFX1ZJREVPOwo+ ID4gKyBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBpc192aWRlbz8KPiA+IHJ0Yy0+ dmlkZW9fcGF5bG9hZF90eXBlIDogcnRjLT5hdWRpb19wYXlsb2FkX3R5cGUpOwo+ID4gKyBhdl9k aWN0X3NldCgmb3B0cywgInBheWxvYWRfdHlwZSIsIGJ1ZiwgMCk7Cj4gPiArIHNucHJpbnRmKGJ1 Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIGlzX3ZpZGVvPyBydGMtPnZpZGVvX3NzcmMgOgo+ID4gcnRj LT5hdWRpb19zc3JjKTsKPiA+ICsgYXZfZGljdF9zZXQoJm9wdHMsICJzc3JjIiwgYnVmLCAwKTsK PiA+ICsKPiA+ICsgcmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKHJ0cF9jdHgsICZvcHRzKTsK PiA+ICsgaWYgKHJldCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxl ZCB0byB3cml0ZSBydHAgaGVhZGVyXG4iKTsKPiA+ICsgZ290byBlbmQ7Cj4gPiArIH0KPiA+ICsK PiA+ICsgZmZfZm9ybWF0X3NldF91cmwocnRwX2N0eCwgYXZfc3RyZHVwKHMtPnVybCkpOwo+ID4g KyBzLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2UgPSBydHBfY3R4LT5zdHJlYW1zWzBdLT50aW1lX2Jh c2U7Cj4gPiArIHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YSA9IHJ0cF9jdHg7Cj4gPiArIHJ0cF9j dHggPSBOVUxMOwo+ID4gKyB9Cj4gPiArCj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIldI SVA6IENyZWF0ZSBSVFAgbXV4ZXIgT0ssIGJ1ZmZlcl9zaXplPSVkLAo+ID4gbWF4X3BhY2tldF9z aXplPSVkXG4iLAo+ID4gKyBidWZmZXJfc2l6ZSwgbWF4X3BhY2tldF9zaXplKTsKPiA+ICsKPiA+ ICtlbmQ6Cj4gPiArIGlmIChydHBfY3R4KQo+ID4gKyBhdmlvX2NvbnRleHRfZnJlZSgmcnRwX2N0 eC0+cGIpOwo+ID4gKyBhdmZvcm1hdF9mcmVlX2NvbnRleHQocnRwX2N0eCk7Cj4gPiArIGF2X2Rp Y3RfZnJlZSgmb3B0cyk7Cj4gPiArIHJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ ID4gKyAqIENhbGxiYWNrIHRyaWdnZXJlZCBieSB0aGUgUlRQIG11eGVyIHdoZW4gaXQgY3JlYXRl cyBhbmQgc2VuZHMgb3V0IGFuCj4gPiBSVFAgcGFja2V0Lgo+ID4gKyAqCj4gPiArICogVGhpcyBm dW5jdGlvbiBtb2RpZmllcyB0aGUgdmlkZW8gU1RBUCBwYWNrZXQsIHJlbW92aW5nIHRoZSBtYXJr ZXJzLAo+ID4gYW5kIHVwZGF0aW5nIHRoZQo+ID4gKyAqIE5SSSBvZiB0aGUgZmlyc3QgTkFMVS4g QWRkaXRpb25hbGx5LCBpdCB1c2VzIHRoZSBjb3JyZXNwb25kaW5nIFNSVFAKPiA+IGNvbnRleHQg dG8gZW5jcnlwdAo+ID4gKyAqIHRoZSBSVFAgcGFja2V0LCB3aGVyZSB0aGUgdmlkZW8gcGFja2V0 IGlzIGhhbmRsZWQgYnkgdGhlIHZpZGVvIFNSVFAKPiA+IGNvbnRleHQuCj4gPiArICovCj4gPiAr c3RhdGljIGludCBvbl9ydHBfd3JpdGVfcGFja2V0KHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVm LCBpbnQgYnVmX3NpemUpCj4gPiArewo+ID4gKyBpbnQgcmV0LCBjaXBoZXJfc2l6ZSwgaXNfcnRj cCwgaXNfdmlkZW87Cj4gPiArIHVpbnQ4X3QgcGF5bG9hZF90eXBlLCBuYWx1X2hlYWRlcjsKPiA+ ICsgY2hhciBjaXBoZXJbTUFYX1VEUF9CVUZGRVJfU0laRV07Cj4gPiArIEFWRm9ybWF0Q29udGV4 dCAqcyA9IG9wYXF1ZTsKPiA+ICsgUlRDQ29udGV4dCAqcnRjID0gcy0+cHJpdl9kYXRhOwo+ID4g KyBzdHJ1Y3QgU1JUUENvbnRleHQgKnNydHA7Cj4gPiArCj4gPiArIC8qIElnbm9yZSBpZiBub3Qg UlRQIG9yIFJUQ1AgcGFja2V0LiAqLwo+ID4gKyBpZiAoYnVmX3NpemUgPCAxMiB8fCAoYnVmWzBd ICYgMHhDMCkgIT0gMHg4MCkKPiA+ICsgcmV0dXJuIDA7Cj4gPiArCj4gPiArIC8qIE9ubHkgc3Vw cG9ydCBhdWRpbywgdmlkZW8gYW5kIHJ0Y3AuICovCj4gPiArIGlzX3J0Y3AgPSBidWZbMV0gPj0g MTkyICYmIGJ1ZlsxXSA8PSAyMjM7Cj4gPiArIHBheWxvYWRfdHlwZSA9IGJ1ZlsxXSAmIDB4N2Y7 Cj4gPiArIGlzX3ZpZGVvID0gcGF5bG9hZF90eXBlID09IHJ0Yy0+dmlkZW9fcGF5bG9hZF90eXBl Owo+ID4gKyBpZiAoIWlzX3J0Y3AgJiYgcGF5bG9hZF90eXBlICE9IHJ0Yy0+dmlkZW9fcGF5bG9h ZF90eXBlICYmCj4gPiBwYXlsb2FkX3R5cGUgIT0gcnRjLT5hdWRpb19wYXlsb2FkX3R5cGUpCj4g PiArIHJldHVybiAwOwo+ID4gKwo+ID4gKyAvKioKPiA+ICsgKiBGb3IgdmlkZW8sIHRoZSBTVEFQ LUEgd2l0aCBTUFMvUFBTIHNob3VsZDoKPiA+ICsgKiAxLiBUaGUgbWFya2VyIGJpdCBzaG91bGQg YmUgMCwgbmV2ZXIgYmUgMS4KPiA+ICsgKiAyLiBUaGUgTlJJIHNob3VsZCBlcXVhbCB0byB0aGUg Zmlyc3QgTkFMVSdzLgo+ID4gKyAqLwo+ID4gKyBpZiAoaXNfdmlkZW8gJiYgYnVmX3NpemUgPiAx Mikgewo+ID4gKyBuYWx1X2hlYWRlciA9IGJ1ZlsxMl0gJiAweDFmOwo+ID4gKyBpZiAobmFsdV9o ZWFkZXIgPT0gTkFMVV9UWVBFX1NUQVBfQSkgewo+ID4gKyAvKiBSZXNldCB0aGUgbWFya2VyIGJp dCB0byAwLiAqLwo+ID4gKyBpZiAoYnVmWzFdICYgMHg4MCkKPiA+ICsgYnVmWzFdICY9IDB4N2Y7 Cj4gPiArCj4gPiArIC8qIFJlc2V0IHRoZSBOUkkgdG8gdGhlIGZpcnN0IE5BTFUncyBOUkkuICov Cj4gPiArIGlmIChidWZfc2l6ZSA+IDE1ICYmIChidWZbMTVdJjB4NjApICE9IChidWZbMTJdJjB4 NjApKQo+ID4gKyBidWZbMTJdID0gKGJ1ZlsxMl0mMHg4MCkgfCAoYnVmWzE1XSYweDYwKSB8Cj4g PiAoYnVmWzEyXSYweDFmKTsKPiA+ICsgfQo+ID4gKyB9Cj4gPiArCj4gPiArIC8qIEdldCB0aGUg Y29ycmVzcG9uZGluZyBTUlRQIGNvbnRleHQuICovCj4gPiArIHNydHAgPSBpc19ydGNwID8gJnJ0 Yy0+c3J0cF9ydGNwX3NlbmQgOiAoaXNfdmlkZW8/Cj4gPiAmcnRjLT5zcnRwX3ZpZGVvX3NlbmQg OiAmcnRjLT5zcnRwX2F1ZGlvX3NlbmQpOwo+ID4gKwo+ID4gKyAvKiBFbmNyeXB0IGJ5IFNSVFAg YW5kIHNlbmQgb3V0LiAqLwo+ID4gKyBjaXBoZXJfc2l6ZSA9IGZmX3NydHBfZW5jcnlwdChzcnRw LCBidWYsIGJ1Zl9zaXplLCBjaXBoZXIsCj4gPiBzaXplb2YoY2lwaGVyKSk7Cj4gPiArIGlmIChj aXBoZXJfc2l6ZSA8PSAwIHx8IGNpcGhlcl9zaXplIDwgYnVmX3NpemUpIHsKPiA+ICsgYXZfbG9n KHMsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIGVuY3J5cHQgcGFja2V0PSVkQiwKPiA+IGNp cGhlcj0lZEJcbiIsIGJ1Zl9zaXplLCBjaXBoZXJfc2l6ZSk7Cj4gPiArIHJldHVybiAwOwo+ID4g KyB9Cj4gPiArCj4gPiArIHJldCA9IGZmdXJsX3dyaXRlKHJ0Yy0+dWRwX3VjLCBjaXBoZXIsIGNp cGhlcl9zaXplKTsKPiA+ICsgaWYgKHJldCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19F UlJPUiwgIkZhaWxlZCB0byB3cml0ZSBwYWNrZXQ9JWRCLCByZXQ9JWRcbiIsCj4gPiBjaXBoZXJf c2l6ZSwgcmV0KTsKPiA+ICsgcmV0dXJuIHJldDsKPiA+ICsgfQo+ID4gKwo+ID4gKyByZXR1cm4g cmV0Owo+ID4gK30KPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBJbnNlcnRzIHRoZSBTUFMvUFBTIGRh dGEgYmVmb3JlIGVhY2ggSURSIChJbnN0YW50YW5lb3VzIERlY29kZXIKPiA+IFJlZnJlc2gpIGZy YW1lLgo+ID4gKyAqCj4gPiArICogVGhlIFNQUy9QUFMgaXMgcGFyc2VkIGZyb20gdGhlIGV4dHJh ZGF0YS4gSWYgaXQncyBpbiBJU09NIGZvcm1hdCwgdGhlCj4gPiBTUFMvUFBTIGlzCj4gPiArICog bXVsdGlwbGV4ZWQgdG8gdGhlIGRhdGEgZmllbGQgb2YgdGhlIHBhY2tldC4gSWYgaXQncyBpbiBh bm5leGIgZm9ybWF0LAo+ID4gdGhlbiB0aGUgZW50aXJlCj4gPiArICogZXh0cmFkYXRhIGlzIHNl dCB0byB0aGUgZGF0YSBmaWVsZCBvZiB0aGUgcGFja2V0Lgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBp bnQgaW5zZXJ0X3Nwc19wcHNfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBr dCkKPiA+ICt7Cj4gPiArIGludCByZXQsIGlzX2lkciwgc2l6ZSwgaTsKPiA+ICsgdWludDhfdCAq cDsKPiA+ICsgQVZQYWNrZXQqIGV4dHJhID0gTlVMTDsKPiA+ICsgQVZTdHJlYW0gKnN0ID0gcy0+ c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07Cj4gPiArIEFWRm9ybWF0Q29udGV4dCAqcnRwX2N0 eCA9IHN0LT5wcml2X2RhdGE7Cj4gPiArIFJUQ0NvbnRleHQgKnJ0YyA9IHMtPnByaXZfZGF0YTsK PiA+ICsKPiA+ICsgaXNfaWRyID0gKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpICYmIHN0 LT5jb2RlY3Bhci0+Y29kZWNfdHlwZQo+ID4gPT0gQVZNRURJQV9UWVBFX1ZJREVPOwo+ID4gKyBp ZiAoIWlzX2lkciB8fCAhc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpCj4gPiArIHJldHVybiAwOwo+ ID4gKwo+ID4gKyBleHRyYSA9IGF2X3BhY2tldF9hbGxvYygpOwo+ID4gKyBpZiAoIWV4dHJhKQo+ ID4gKyByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ID4gKwo+ID4gKyBzaXplID0gIXJ0Yy0+YXZj X25hbF9sZW5ndGhfc2l6ZSA/IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgOgo+ID4gKyBy dGMtPmF2Y19uYWxfbGVuZ3RoX3NpemUgKiAyICsgcnRjLT5hdmNfc3BzX3NpemUgKwo+ID4gcnRj LT5hdmNfcHBzX3NpemU7Cj4gPiArIHJldCA9IGF2X25ld19wYWNrZXQoZXh0cmEsIHNpemUpOwo+ ID4gKyBpZiAocmV0IDwgMCkgewo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVk IHRvIGFsbG9jYXRlIGV4dHJhIHBhY2tldFxuIik7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4g PiArCj4gPiArIC8qIEVuY29kZSBTUFMvUFBTIGluIGFubmV4YiBmb3JtYXQuICovCj4gPiArIGlm ICghcnRjLT5hdmNfbmFsX2xlbmd0aF9zaXplKSB7Cj4gPiArIG1lbWNweShleHRyYS0+ZGF0YSwg c3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHNpemUpOwo+ID4gKyB9IGVsc2Ugewo+ID4gKyAvKiBF bmNvZGUgU1BTL1BQUyBpbiBJU09NIGZvcm1hdC4gKi8KPiA+ICsgcCA9IGV4dHJhLT5kYXRhOwo+ ID4gKyBmb3IgKGkgPSAwOyBpIDwgcnRjLT5hdmNfbmFsX2xlbmd0aF9zaXplOyBpKyspIHsKPiA+ ICsgKnArKyA9IHJ0Yy0+YXZjX3Nwc19zaXplID4+ICg4ICogKHJ0Yy0+YXZjX25hbF9sZW5ndGhf c2l6ZSAtCj4gPiBpIC0gMSkpOwo+ID4gKyB9Cj4gPiArIG1lbWNweShwLCBydGMtPmF2Y19zcHMs IHJ0Yy0+YXZjX3Nwc19zaXplKTsKPiA+ICsgcCArPSBydGMtPmF2Y19zcHNfc2l6ZTsKPiA+ICsK PiA+ICsgLyogRW5jb2RlIFBQUyBpbiBJU09NIGZvcm1hdC4gKi8KPiA+ICsgZm9yIChpID0gMDsg aSA8IHJ0Yy0+YXZjX25hbF9sZW5ndGhfc2l6ZTsgaSsrKSB7Cj4gPiArICpwKysgPSBydGMtPmF2 Y19wcHNfc2l6ZSA+PiAoOCAqIChydGMtPmF2Y19uYWxfbGVuZ3RoX3NpemUgLQo+ID4gaSAtIDEp KTsKPiA+ICsgfQo+ID4gKyBtZW1jcHkocCwgcnRjLT5hdmNfcHBzLCBydGMtPmF2Y19wcHNfc2l6 ZSk7Cj4gPiArIHAgKz0gcnRjLT5hdmNfcHBzX3NpemU7Cj4gPiArIH0KPiA+ICsKPiA+ICsgLyog U2V0dXAgcGFja2V0IGFuZCBmZWVkIGl0IHRvIGNoYWluLiAqLwo+ID4gKyBleHRyYS0+cHRzID0g cGt0LT5wdHM7Cj4gPiArIGV4dHJhLT5kdHMgPSBwa3QtPmR0czsKPiA+ICsgZXh0cmEtPnN0cmVh bV9pbmRleCA9IHBrdC0+c3RyZWFtX2luZGV4Owo+ID4gKyBleHRyYS0+dGltZV9iYXNlID0gcGt0 LT50aW1lX2Jhc2U7Cj4gPiArCj4gPiArIHJldCA9IGZmX3dyaXRlX2NoYWluZWQocnRwX2N0eCwg MCwgZXh0cmEsIHMsIDApOwo+ID4gKyBpZiAocmV0IDwgMCkKPiA+ICsgZ290byBlbmQ7Cj4gPiAr Cj4gPiArZW5kOgo+ID4gKyBhdl9wYWNrZXRfZnJlZSgmZXh0cmEpOwo+ID4gKyByZXR1cm4gcmV0 Owo+ID4gK30KPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBSVEMgaXMgY29ubmVjdGlvbmxlc3MsIGZv ciBpdCdzIGJhc2VkIG9uIFVEUCwgc28gaXQgY2hlY2sgd2hldGhlcgo+ID4gc2VzaXNvbiBpcwo+ ID4gKyAqIHRpbWVvdXQuIEluIHN1Y2ggY2FzZSwgcHVibGlzaGVycyBjYW4ndCByZXB1Ymxpc2gg dGhlIHN0cmVhbSB1dGlsIHRoZQo+ID4gc2Vzc2lvbgo+ID4gKyAqIGlzIHRpbWVvdXQuCj4gPiAr ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbm90aWZ5IHRoZSBzZXJ2ZXIgdGhhdCB0aGUg c3RyZWFtIGlzIGVuZGVkLAo+ID4gc2VydmVyCj4gPiArICogc2hvdWxkIGV4cGlyZSBhbmQgY2xv c2UgdGhlIHNlc3Npb24gaW1tZWRpYXRlbHksIHNvIHRoYXQgcHVibGlzaGVycwo+ID4gY2FuIHJl cHVibGlzaAo+ID4gKyAqIHRoZSBzdHJlYW0gcXVpY2tseS4KPiA+ICsgKi8KPiA+ICtzdGF0aWMg aW50IHdoaXBfZGlzcG9zZShBVkZvcm1hdENvbnRleHQgKnMpCj4gPiArewo+ID4gKyBpbnQgcmV0 Owo+ID4gKyBjaGFyIGJ1ZltNQVhfVVJMX1NJWkVdOwo+ID4gKyBVUkxDb250ZXh0ICp3aGlwX3Vj ID0gTlVMTDsKPiA+ICsgUlRDQ29udGV4dCAqcnRjID0gcy0+cHJpdl9kYXRhOwo+ID4gKwo+ID4g KyBpZiAoIXJ0Yy0+d2hpcF9yZXNvdXJjZV91cmwpCj4gPiArIHJldHVybiAwOwo+ID4gKwo+ID4g KyByZXQgPSBmZnVybF9hbGxvYygmd2hpcF91YywgcnRjLT53aGlwX3Jlc291cmNlX3VybCwKPiA+ IEFWSU9fRkxBR19SRUFEX1dSSVRFLCAmcy0+aW50ZXJydXB0X2NhbGxiYWNrKTsKPiA+ICsgaWYg KHJldCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxv YyBXSElQIGRlbGV0ZSBjb250ZXh0Ogo+ID4gJXNcbiIsIHMtPnVybCk7Cj4gPiArIGdvdG8gZW5k Owo+ID4gKyB9Cj4gPiArCj4gPiArIGF2X29wdF9zZXQod2hpcF91Yy0+cHJpdl9kYXRhLCAiY2h1 bmtlZF9wb3N0IiwgIjAiLCAwKTsKPiA+ICsgYXZfb3B0X3NldCh3aGlwX3VjLT5wcml2X2RhdGEs ICJtZXRob2QiLCAiREVMRVRFIiwgMCk7Cj4gPiArIHJldCA9IGZmdXJsX2Nvbm5lY3Qod2hpcF91 YywgTlVMTCk7Cj4gPiArIGlmIChyZXQgPCAwKSB7Cj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfRVJS T1IsICJGYWlsZWQgdG8gREVMRVRFIHVybD0lc1xuIiwKPiA+IHJ0Yy0+d2hpcF9yZXNvdXJjZV91 cmwpOwo+ID4gKyBnb3RvIGVuZDsKPiA+ICsgfQo+ID4gKwo+ID4gKyB3aGlsZSAoMSkgewo+ID4g KyByZXQgPSBmZnVybF9yZWFkKHdoaXBfdWMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwo+ID4gKyBpZiAo cmV0ID09IEFWRVJST1JfRU9GKSB7Cj4gPiArIHJldCA9IDA7Cj4gPiArIGJyZWFrOwo+ID4gKyB9 Cj4gPiArIGlmIChyZXQgPCAwKSB7Cj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWls ZWQgdG8gcmVhZCByZXNwb25zZSBmcm9tIERFTEVURQo+ID4gdXJsPSVzXG4iLCBydGMtPndoaXBf cmVzb3VyY2VfdXJsKTsKPiA+ICsgZ290byBlbmQ7Cj4gPiArIH0KPiA+ICsgfQo+ID4gKwo+ID4g KyBhdl9sb2cocywgQVZfTE9HX0lORk8sICJXSElQOiBEaXNwb3NlIHJlc291cmNlICVzIG9rXG4i LAo+ID4gcnRjLT53aGlwX3Jlc291cmNlX3VybCk7Cj4gPiArCj4gPiArZW5kOgo+ID4gKyBmZnVy bF9jbG9zZXAoJndoaXBfdWMpOwo+ID4gKyByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgYXZfY29sZCBpbnQgcnRjX2luaXQoQVZGb3JtYXRDb250ZXh0ICpzKQo+ID4gK3sKPiA+ ICsgaW50IHJldDsKPiA+ICsgUlRDQ29udGV4dCAqcnRjID0gcy0+cHJpdl9kYXRhOwo+ID4gKwo+ ID4gKyBpZiAoKHJldCA9IHdoaXBfaW5pdChzKSkgPCAwKQo+ID4gKyByZXR1cm4gcmV0Owo+ID4g Kwo+ID4gKyBpZiAoKHJldCA9IHBhcnNlX2NvZGVjKHMpKSA8IDApCj4gPiArIHJldHVybiByZXQ7 Cj4gPiArCj4gPiArIGlmICgocmV0ID0gZ2VuZXJhdGVfc2RwX29mZmVyKHMpKSA8IDApCj4gPiAr IHJldHVybiByZXQ7Cj4gPiArCj4gPiArIGlmICgocmV0ID0gZXhjaGFuZ2Vfc2RwKHMpKSA8IDAp Cj4gPiArIHJldHVybiByZXQ7Cj4gPiArCj4gPiArIGlmICgocmV0ID0gcGFyc2VfYW5zd2VyKHMp KSA8IDApCj4gPiArIHJldHVybiByZXQ7Cj4gPiArCj4gPiArIGlmICgocmV0ID0gaWNlX2hhbmRz aGFrZShzKSkgPCAwKQo+ID4gKyByZXR1cm4gcmV0Owo+ID4gKwo+ID4gKyAvKiBOb3cgVURQIFVS TCBjb250ZXh0IGlzIHJlYWR5LCBzZXR1cCB0aGUgRFRMUyB0cmFuc3BvcnQuICovCj4gPiArIHJ0 Yy0+ZHRsc19jdHgudWRwX3VjID0gcnRjLT51ZHBfdWM7Cj4gPiArCj4gPiArIGlmICgocmV0ID0g ZHRsc19jb250ZXh0X2hhbmRzaGFrZSgmcnRjLT5kdGxzX2N0eCkpIDwgMCkKPiA+ICsgcmV0dXJu IHJldDsKPiA+ICsKPiA+ICsgaWYgKChyZXQgPSBzZXR1cF9zcnRwKHMpKSA8IDApCj4gPiArIHJl dHVybiByZXQ7Cj4gPiArCj4gPiArIGlmICgocmV0ID0gY3JlYXRlX3J0cF9tdXhlcihzKSkgPCAw KQo+ID4gKyByZXR1cm4gcmV0Owo+ID4gKwo+ID4gKyByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsK PiA+ICtzdGF0aWMgaW50IHJ0Y193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBh Y2tldCAqcGt0KQo+ID4gK3sKPiA+ICsgaW50IHJldDsKPiA+ICsgUlRDQ29udGV4dCAqcnRjID0g cy0+cHJpdl9kYXRhOwo+ID4gKyBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFt X2luZGV4XTsKPiA+ICsgQVZGb3JtYXRDb250ZXh0ICpydHBfY3R4ID0gc3QtPnByaXZfZGF0YTsK PiA+ICsKPiA+ICsgLyogVE9ETzogU2VuZCBiaW5kaW5nIHJlcXVlc3QgZXZlcnkgMXMgYXMgV2Vi UlRDIGhlYXJ0YmVhdC4gKi8KPiA+ICsgLyogVE9ETzogUmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhl IHNlcnZlciBzdWNoIGFzIElDRSBiaW5kaW5nCj4gPiByZXF1ZXN0cywgRFRMUyBtZXNzYWdlcywK PiA+ICsgKiBhbmQgUlRDUCBsaWtlIFBMSSByZXF1ZXN0cywgdGhlbiByZXNwb25kIHRvIHRoZW0u Ki8KPiA+ICsKPiA+ICsgLyogRm9yIGF1ZGlvIE9QVVMgc3RyZWFtLCBjb3JyZWN0IHRoZSB0aW1l c3RhbXAuICovCj4gPiArIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9U WVBFX0FVRElPKSB7Cj4gPiArIHBrdC0+ZHRzID0gcGt0LT5wdHMgPSBydGMtPmF1ZGlvX2ppdHRl cl9iYXNlOwo+ID4gKyBydGMtPmF1ZGlvX2ppdHRlcl9iYXNlICs9IDk2MDsKPiA+ICsgfQo+ID4K PiAKPiBDb3JyZWN0IGhvdz8KV2lubGluOiBPY2Nhc2lvbmFsbHksIHRoZSB0aW1lc3RhbXAgb2Yg T1BVUyBhdWRpbyBtYXkgYmUgaW5hY2N1cmF0ZSwgcGFydGljdWxhcmx5IHdoZW4gdGhlIGlucHV0 IGlzIGFuIE1QNCBmaWxlLgoKU3VtbWFyeSBvZiB0aGUgaXNzdWVzOgoKMS4gV2hlbiBwbGF5aW5n IGFuIE1QNCBmaWxlICgyNjQrT3B1cykgZGlyZWN0bHkgaW4gQ2hyb21lLCB0aGVyZSBhcmUgbm8g YXVkaW8gaXNzdWVzLgoyLiBXaGVuIGNvcHlpbmcgdGhlIE1QNCBmaWxlIHVzaW5nIGAtYyBjb3B5 YCBhbmQgcHVzaGluZyBpdCB0byBXSElQLCBwbGF5aW5nIGl0IGluIENocm9tZSByZXN1bHRzIGlu IGF1ZGlvIG5vaXNlIGlzc3Vlcy4KMy4gV2hlbiBjb3B5aW5nIHRoZSBNUDQgZmlsZSB1c2luZyBg LXJlIC1jIGNvcHlgIGFuZCBwdXNoaW5nIGl0IHRvIFdISVAsIHRoZXJlIGFyZSBubyBhdWRpbyBp c3N1ZXMuCjQuIEFmdGVyIHJlLWVuY29kaW5nIHRoZSBNUDQgZmlsZSB3aXRoIGAtYWNvZGVjIGxp Ym9wdXNgLCBwdXNoaW5nIGl0IHRvIFdISVAsIGFuZCBwbGF5aW5nIGl0IGluIENocm9tZSwgdGhl cmUgYXJlIG5vIGF1ZGlvIGlzc3Vlcy4KNS4gV2hlbiBjb3B5aW5nIGFuIE1LViBmaWxlIHVzaW5n IGAtYyBjb3B5YCBhbmQgcHVzaGluZyBpdCB0byBXSElQLCBwbGF5aW5nIGl0IGluIENocm9tZSBy ZXN1bHRzIGluIG5vIGF1ZGlvIGlzc3Vlcy4KCkZvciBvcHVzIDQ4a2h6LCBlYWNoIGZyYW1lIGlz IDIwbXMgd2hpY2ggaXMgNDgwMDAqMjAvMTAwMCA9IDk2MC4gSXQgYXBwZWFycyB0aGF0IHRoZXJl IGlzIGEgYnVnIGludHJvZHVjZWQgYnkgbGlib3B1cyByZWdhcmRpbmcgdGhlIHRpbWVzdGFtcC4g SW5zdGVhZCBvZiBiZWluZyBleGFjdGx5IDk2MCwgdGhlcmUgaXMgYSBzbGlnaHQgZGV2aWF0aW9u LCBzdWNoIGFzIDk1NiBvciA5NzAuIFRoaXMgZGV2aWF0aW9uIGNhbiBjYXVzZSBDaHJvbWUgdG8g cGxheSB0aGUgYXVkaW8gc3RyZWFtIHdpdGggbm9pc2UuCgpUbyByZXBsaWNhdGUgdGhlIGlzc3Vl LCBzdGFydCBieSB0cmFuc2NvZGluZyB0aGUgW2ZpbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vc3Ny cy9zcnMvYmxvYi9kZXZlbG9wL3RydW5rL2RvYy9zb3VyY2UuMjAwa2Jwcy43Njh4MzIwLmZsdikg aW50byBhbiBNUDQgZm9ybWF0IHRoZW4gcHVibGlzaCBieSBXSElQIG11eGVyOgoKYGBgYmFzaApm Zm1wZWcgLWkgfi9naXQvc3JzL3RydW5rL2RvYy9zb3VyY2UuMjAwa2Jwcy43Njh4MzIwLmZsdiBc CiAgLXZjb2RlYyBsaWJ4MjY0IC1wcm9maWxlOnYgYmFzZWxpbmUgLXIgMjUgLWcgNTAgXAogIC1h Y29kZWMgbGlib3B1cyAtYXIgNDgwMDAgLWFjIDIgXAogIC15IHQubXA0CgpmZm1wZWcgLXJlIC1p IHQubXA0IC1jIGNvcHkgXAogIC1mIHJ0YyAiaHR0cDovL2xvY2FsaG9zdDoxOTg1L3J0Yy92MS93 aGlwLz9hcHA9bGl2ZSZzdHJlYW09bGl2ZXN0cmVhbSIKYGBgCgpXaGVuIGFkZGluZyBgLXJlYCwg dGhlIHRpbWVzdGFtcCBpcyBhY2N1cmF0ZSwgYW5kIHRoZXJlIGlzIG5vIHN1Y2ggaXNzdWU6Cgpg YGBiYXNoCmZmbXBlZyAtcmUgLWkgfi9naXQvc3JzL3RydW5rL2RvYy9zb3VyY2UuMjAwa2Jwcy43 Njh4MzIwLmZsdiBcCiAgLXZjb2RlYyBsaWJ4MjY0IC1wcm9maWxlOnYgYmFzZWxpbmUgLXIgMjUg LWcgNTAgXAogIC1hY29kZWMgbGlib3B1cyAtYXIgNDgwMDAgLWFjIDIgXAogIC15IHQubXA0Cgpm Zm1wZWcgLXJlIC1pIHQubXA0IC1jIGNvcHkgXAogIC1mIHJ0YyAiaHR0cDovL2xvY2FsaG9zdDox OTg1L3J0Yy92MS93aGlwLz9hcHA9bGl2ZSZzdHJlYW09bGl2ZXN0cmVhbSIKYGBgCgpUaGUgcHJv Y2VzcyBhbHNvIGZ1bmN0aW9ucyBzbW9vdGhseSB3aXRob3V0IGFueSBpc3N1ZXMgd2hlbiBjb252 ZXJ0aW5nIHRvIE1LViBmb3JtYXQgYW5kIHRoZW4gcHVibGlzaGluZyBhcyBhIFdISVAgc3RyZWFt OgoKYGBgYmFzaApmZm1wZWcgLWkgfi9naXQvc3JzL3RydW5rL2RvYy9zb3VyY2UuMjAwa2Jwcy43 Njh4MzIwLmZsdiBcCiAgLXZjb2RlYyBsaWJ4MjY0IC1wcm9maWxlOnYgYmFzZWxpbmUgLXIgMjUg LWcgNTAgXAogIC1hY29kZWMgbGlib3B1cyAtYXIgNDgwMDAgLWFjIDIKICAteSB0Lm1rdgoKZmZt cGVnIC1yZSAtaSB0Lm1rdiAtYyBjb3B5IFwKICAtZiBydGMgImh0dHA6Ly9sb2NhbGhvc3Q6MTk4 NS9ydGMvdjEvd2hpcC8/YXBwPWxpdmUmc3RyZWFtPWxpdmVzdHJlYW0iCmBgYAoKTm9uZXRoZWxl c3MsIHdoZW4gZGlyZWN0bHkgdHJhbnNjb2RpbmcgYW5kIHB1Ymxpc2hpbmcgdGhyb3VnaCB0aGUg V0hJUCBtdXhlciwgdGhpcyBwcm9ibGVtIGlzIGFic2VudCwgYW5kIHRoZSBkaWZmZXJlbmNlIGlu IGF1ZGlvIHB0cyBjb25zaXN0ZW50bHkgcmVtYWlucyBhdCA5NjA6CgpgYGBiYXNoCn4vZ2l0L0ZG bXBlZy9mZm1wZWdfZyAtcmUgLWkgfi9naXQvc3JzL3RydW5rL2RvYy9zb3VyY2UuMjAwa2Jwcy43 Njh4MzIwLmZsdiBcCiAgLXZjb2RlYyBsaWJ4MjY0IC1wcm9maWxlOnYgYmFzZWxpbmUgLXIgMjUg LWcgNTAgXAogIC1hY29kZWMgbGlib3B1cyAtYXIgNDgwMDAgLWFjIDIgXAogIC1mIHJ0YyAiaHR0 cDovL2xvY2FsaG9zdDoxOTg1L3J0Yy92MS93aGlwLz9hcHA9bGl2ZSZzdHJlYW09bGl2ZXN0cmVh bSIKYGBgCgpBbHRob3VnaCB3ZSBhcmUgdW5zdXJlIG9mIHRoZSByb290IGNhdXNlLCBJIGhhdmUg aW5jbHVkZWQgYSAiVE9ETyIgY29tbWVudCByZWdhcmRpbmcgdGhpcyBpc3N1ZS4gV2UgbmVlZCB0 byBjb25kdWN0IGZ1cnRoZXIgcmVzZWFyY2ggYW5kIHJlbW92ZSB0aGlzIGxpbmUuCgpgYGBjCi8q KgogKiBUT0RPOiBGSVhNRTogVGhlcmUgaXMgYW4gaXNzdWUgd2l0aCB0aGUgdGltZXN0YW1wIG9m IE9QVVMgYXVkaW8sIGVzcGVjaWFsbHkgd2hlbgogKiAgdGhlIGlucHV0IGlzIGFuIE1QNCBmaWxl LiBUaGUgdGltZXN0YW1wIGRldmlhdGVzIGZyb20gdGhlIGV4cGVjdGVkIHZhbHVlIG9mIDk2MCwK ICogIGNhdXNpbmcgQ2hyb21lIHRvIHBsYXkgdGhlIGF1ZGlvIHN0cmVhbSB3aXRoIG5vaXNlLiBU aGlzIHByb2JsZW0gY2FuIGJlIHJlcGxpY2F0ZWQKICogIGJ5IHRyYW5zY29kaW5nIGEgc3BlY2lm aWMgZmlsZSBpbnRvIE1QNCBmb3JtYXQgYW5kIHB1Ymxpc2hpbmcgaXQgdXNpbmcgdGhlIFdISVAK ICogIG11eGVyLiBIb3dldmVyLCB3aGVuIGRpcmVjdGx5IHRyYW5zY29kaW5nIGFuZCBwdWJsaXNo aW5nIHRocm91Z2ggdGhlIFdISVAgbXV4ZXIsCiAqICB0aGUgaXNzdWUgaXMgbm90IHByZXNlbnQs IGFuZCB0aGUgYXVkaW8gdGltZXN0YW1wIHJlbWFpbnMgY29uc2lzdGVudC4gVGhlIHJvb3QKICog IGNhdXNlIGlzIHN0aWxsIHVua25vd24sIGFuZCB0aGlzIGNvbW1lbnQgaGFzIGJlZW4gYWRkZWQg dG8gYWRkcmVzcyB0aGlzIGlzc3VlCiAqICBpbiB0aGUgZnV0dXJlLiBGdXJ0aGVyIHJlc2VhcmNo IGlzIG5lZWRlZCB0byByZXNvbHZlIHRoZSBwcm9ibGVtLgogKi8Kc3RhdGljIGludCBwYXJzZV9j b2RlYyhBVkZvcm1hdENvbnRleHQgKnMpCmBgYAoKVGhlIGxvZyBpbmRpY2F0ZXMgdGhhdCB0aGUg cHRzIGRvZXMgbm90IGVxdWFsIDk2MCwgYnV0IHJhdGhlciBoYXMgYSBkZXZpYXRpb246CgpgYGB0 ZXh0Cj4+PiBhdWRpbyBkaWZmPTk2MAo+Pj4gYXVkaW8gZGlmZj05NTQKPj4+IGF1ZGlvIGRpZmY9 OTczCj4+PiBhdWRpbyBkaWZmPTk2MAo+Pj4gYXVkaW8gZGlmZj05NjAKPj4+IGF1ZGlvIGRpZmY9 OTYwCj4+PiBhdWRpbyBkaWZmPTk1MgpgYGAKClNlZSBodHRwczovL2dpdGh1Yi5jb20vd2lubGlu dmlwL2ZmbXBlZy13ZWJydGMvY29tbWl0Lzk2MWM5NWNjNGYKClNpbmNlIHRoaXMgcHJvYmxlbSBp cyB1bnJlbGF0ZWQgdG8gV0hJUCBhbmQgYXBwZWFycyB0byBiZSBhIGJ1ZyB3aGVuIGNvbnZlcnRp bmcgRkxWIHRvIE1QNCB3aXRob3V0IHVzaW5nIHRoZSAtcmUgb3B0aW9uLCByZXN1bHRpbmcgaW4g YSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSB0aW1lc3RhbXAgYW5kIE9QVVMgZnJhbWUgc2l6ZSB0aGF0 IGNhdXNlcyBhdWRpbyBkaXN0b3J0aW9uLCB3ZSB3aWxsIG5vdCBmaXggdGhpcyBpc3N1ZS4KPiAK PiAKPiAKPiArIHJldCA9IGluc2VydF9zcHNfcHBzX3BhY2tldChzLCBwa3QpOwo+ID4gKyBpZiAo cmV0IDwgMCkgewo+ID4gKyBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluc2Vy dCBTUFMvUFBTIHBhY2tldFxuIik7Cj4gPiArIHJldHVybiByZXQ7Cj4gPiArIH0KPiA+ICsKPiA+ ICsgcmV0ID0gZmZfd3JpdGVfY2hhaW5lZChydHBfY3R4LCAwLCBwa3QsIHMsIDApOwo+ID4gKyBp ZiAocmV0IDwgMCkgewo+ID4gKyBpZiAocmV0ID09IEFWRVJST1IoRUlOVkFMKSkgewo+ID4gKyBh dl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJZ25vcmUgZmFpbGVkIHRvIHdyaXRlIHBhY2tldD0l ZEIsCj4gPiByZXQ9JWRcbiIsIHBrdC0+c2l6ZSwgcmV0KTsKPiA+ICsgcmV0ID0gMDsKPiA+ICsg fSBlbHNlCj4gPiArIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgcGFj a2V0LCBzaXplPSVkXG4iLAo+ID4gcGt0LT5zaXplKTsKPiA+ICsgcmV0dXJuIHJldDsKPiA+ICsg fQo+ID4gKwo+ID4gKyByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgYXZfY29s ZCB2b2lkIHJ0Y19kZWluaXQoQVZGb3JtYXRDb250ZXh0ICpzKQo+ID4gK3sKPiA+ICsgaW50IGks IHJldDsKPiA+ICsgUlRDQ29udGV4dCAqcnRjID0gcy0+cHJpdl9kYXRhOwo+ID4gKwo+ID4gKyBy ZXQgPSB3aGlwX2Rpc3Bvc2Uocyk7Cj4gPiArIGlmIChyZXQgPCAwKQo+ID4gKyBhdl9sb2cocywg QVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gZGlzcG9zZSByZXNvdXJjZSwgcmV0PSVkXG4iLAo+ ID4gcmV0KTsKPiA+ICsKPiA+ICsgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykg ewo+ID4gKyBBVkZvcm1hdENvbnRleHQqIHJ0cF9jdHggPSBzLT5zdHJlYW1zW2ldLT5wcml2X2Rh dGE7Cj4gPiArIGlmICghcnRwX2N0eCkKPiA+ICsgY29udGludWU7Cj4gPiArCj4gPiArIGF2X3dy aXRlX3RyYWlsZXIocnRwX2N0eCk7Cj4gPiArIGF2aW9fY29udGV4dF9mcmVlKCZydHBfY3R4LT5w Yik7Cj4gPiArIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChydHBfY3R4KTsKPiA+ICsgcy0+c3RyZWFt c1tpXS0+cHJpdl9kYXRhID0gTlVMTDsKPiA+ICsgfQo+ID4gKwo+ID4gKyBhdl9mcmVlcCgmcnRj LT5hdmNfc3BzKTsKPiA+ICsgYXZfZnJlZXAoJnJ0Yy0+YXZjX3Bwcyk7Cj4gPiArIGF2X2ZyZWVw KCZydGMtPnNkcF9vZmZlcik7Cj4gPiArIGF2X2ZyZWVwKCZydGMtPnNkcF9hbnN3ZXIpOwo+ID4g KyBhdl9mcmVlcCgmcnRjLT53aGlwX3Jlc291cmNlX3VybCk7Cj4gPiArIGF2X2ZyZWVwKCZydGMt PmljZV91ZnJhZ19yZW1vdGUpOwo+ID4gKyBhdl9mcmVlcCgmcnRjLT5pY2VfcHdkX3JlbW90ZSk7 Cj4gPiArIGF2X2ZyZWVwKCZydGMtPmljZV9wcm90b2NvbCk7Cj4gPiArIGF2X2ZyZWVwKCZydGMt PmljZV9ob3N0KTsKPiA+ICsgZmZ1cmxfY2xvc2VwKCZydGMtPnVkcF91Yyk7Cj4gPiArIGZmX3Ny dHBfZnJlZSgmcnRjLT5zcnRwX2F1ZGlvX3NlbmQpOwo+ID4gKyBmZl9zcnRwX2ZyZWUoJnJ0Yy0+ c3J0cF92aWRlb19zZW5kKTsKPiA+ICsgZmZfc3J0cF9mcmVlKCZydGMtPnNydHBfcnRjcF9zZW5k KTsKPiA+ICsgZmZfc3J0cF9mcmVlKCZydGMtPnNydHBfcmVjdik7Cj4gPiArIGR0bHNfY29udGV4 dF9kZWluaXQoJnJ0Yy0+ZHRsc19jdHgpOwo+ID4gK30KPiA+ICsKPiA+ICsjZGVmaW5lIE9GRlNF VCh4KSBvZmZzZXRvZihSVENDb250ZXh0LCB4KQo+ID4gKyNkZWZpbmUgREVDIEFWX09QVF9GTEFH X0RFQ09ESU5HX1BBUkFNCj4gPiArc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsK PiA+ICsgeyAiaWNlX2FycV9tYXgiLCAiTWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25z IGZvciB0aGUKPiA+IElDRSBBUlEgbWVjaGFuaXNtIiwgT0ZGU0VUKGljZV9hcnFfbWF4KSwgQVZf T1BUX1RZUEVfSU5ULCB7Cj4gPiAuaTY0ID0gNSB9LCAtMSwgSU5UX01BWCwgREVDIH0sCj4gPiAr IHsgImljZV9hcnFfdGltZW91dCIsICJTdGFydCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Ig dGhlIElDRQo+ID4gQVJRIG1lY2hhbmlzbSIsIE9GRlNFVChpY2VfYXJxX3RpbWVvdXQpLCBBVl9P UFRfVFlQRV9JTlQsIHsKPiA+IC5pNjQgPSAzMCB9LCAtMSwgSU5UX01BWCwgREVDIH0sCj4gPiAr IHsgImR0bHNfYXJxX21heCIsICJNYXhpbXVtIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgZm9y IHRoZQo+ID4gRFRMUyBBUlEgbWVjaGFuaXNtIiwgT0ZGU0VUKGR0bHNfYXJxX21heCksIEFWX09Q VF9UWVBFX0lOVCwgewo+ID4gLmk2NCA9IDUgfSwgLTEsIElOVF9NQVgsIERFQyB9LAo+ID4gKyB7 ICJkdGxzX2FycV90aW1lb3V0IiwgIlN0YXJ0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0 aGUgRFRMUwo+ID4gQVJRIG1lY2hhbmlzbSIsIE9GRlNFVChkdGxzX2FycV90aW1lb3V0KSwgQVZf T1BUX1RZUEVfSU5ULCB7Cj4gPiAuaTY0ID0gNTAgfSwgLTEsIElOVF9NQVgsIERFQyB9LAo+ID4g KyB7ICJwa3Rfc2l6ZSIsICJUaGUgbWF4aW11bSBzaXplLCBpbiBieXRlcywgb2YgUlRQIHBhY2tl dHMKPiA+IHRoYXQgc2VuZCBvdXQiLCBPRkZTRVQocGt0X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQs IHsKPiA+IC5pNjQgPSAxNTAwIH0sIC0xLCBJTlRfTUFYLCBERUMgfSwKPiA+ICsgeyBOVUxMIH0s Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgQVZDbGFzcyBydGNfbXV4ZXJfY2xhc3Mg PSB7Cj4gPiArIC5jbGFzc19uYW1lID0gIldlYlJUQyBtdXhlciIsCj4gPiArIC5pdGVtX25hbWUg PSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKPiA+ICsgLm9wdGlvbiA9IG9wdGlvbnMsCj4gPiArIC52 ZXJzaW9uID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAo+ID4gK307Cj4gPiArCj4gPiArY29uc3Qg RkZPdXRwdXRGb3JtYXQgZmZfcnRjX211eGVyID0gewo+ID4gKyAucC5uYW1lID0gInJ0YyIsCj4g PiArIC5wLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXSElQIFdlYlJUQyBtdXhl ciIpLAo+ID4gKyAucC5hdWRpb19jb2RlYyA9IEFWX0NPREVDX0lEX09QVVMsCj4gPiArIC5wLnZp ZGVvX2NvZGVjID0gQVZfQ09ERUNfSURfSDI2NCwKPiA+ICsgLnAuZmxhZ3MgPSBBVkZNVF9HTE9C QUxIRUFERVIgfCBBVkZNVF9OT0ZJTEUsCj4gPiArIC5wLnByaXZfY2xhc3MgPSAmcnRjX211eGVy X2NsYXNzLAo+ID4gKyAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUlRDQ29udGV4dCksCj4gPiAr IC5pbml0ID0gcnRjX2luaXQsCj4gPiArIC53cml0ZV9wYWNrZXQgPSBydGNfd3JpdGVfcGFja2V0 LAo+ID4gKyAuZGVpbml0ID0gcnRjX2RlaW5pdCwKPiA+ICt9Owo+ID4gLS0KPiA+IDIuNDAuMAo+ ID4KPiAKPiBUaGlzIHBhdGNoc2V0IGlzIG1hc3NpdmUgYW5kIHVubWFpbnRhaW5hYmxlLiBOb3Qg dG8gbWVudGlvbiBvbmx5IGltcGxlbWVudHMKPiBhIHNtYWxsIHBvcnRpb24gb2Ygd2VicnRjLCB0 aGF0IHdpbGwgaW5ldml0YWJseSBnZXQgcGF0Y2hlZCB0byBhZGQgbW9yZQo+IGZlYXR1cmVzIGFu ZCBiZWNvbWUgYSBnaWFudCBzcHJhd2wuCldpbmxpbjogSWYgd2UgYWltIHRvIHN1cHBvcnQgYWxs IHRoZSBmdWxsIGZlYXR1cmVzIG9mIFdlYlJUQywgdGhlIHBhdGNoIHdpbGwgYmVjb21lIGEgc3By YXdsaW5nIGdpYW50IGFuZCBkaWZmaWN1bHQgdG8gbWFpbnRhaW4uIEhvd2V2ZXIsIEkgYmVsaWV2 ZSB0aGF0IFdISVAgaXMgb25seSBhIHNtYWxsIHN1YnNldCBvZiBXZWJSVEMsIGFzIHRoZXJlIGFy ZSBzb21lIHVzZWZ1bGwgZmVhdHVyZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCB0byBzdXBwb3J0LiBG b3IgZXhhbXBsZToKCiogUDJQIGFuZCBJQ0Ugd2lsbCByZXF1aXJlIHRoZSBpbmNsdXNpb24gb2Yg bnVtZXJvdXMgdHJhbnNwb3J0IGFsZ29yaXRobXMgYW5kIGxpYnJhcmllcy4gSG93ZXZlciwgd2Ug b25seSBuZWVkIHRvIHN1cHBvcnQgSUNFIExpdGUsIHdoaWNoIGZ1bmN0aW9ucyBhcyBhIFVEUCBj bGllbnQgYW5kIHNlcnZlciwgc2ltaWxhciB0byBvdGhlciBwcm90b2NvbHMgbGlrZSBTUlQsIFJU TVAsIG9yIFJUU1AgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IEZGbXBlZy4KKiBTaW11bGNhc3QgYW5k IFNWQyBhcmUgYWxzbyBzaWduaWZpY2FudCBnaXRhbnQgZmVhdHVyZXMsIGFuZCBJIGRvIG5vdCBy ZWNvbW1lbmQgc3VwcG9ydGluZyB0aGVtIGltbWVkaWF0ZWx5LiBUaGVzZSBhZHZhbmNlZCBmZWF0 dXJlcyBhcmUgbm90IG5lY2Vzc2FyeSwgYW5kIHRoZXkgYXJlIG5vdCBjb21tb25seSB1c2VkIGlu IFdlYlJUQyBzY2VuYXJpb3MuCiogQ29uZ2VzdGlvbiBjb250cm9sIGFuZCBhbGdvcml0aG1zLCBz dWNoIGFzIEFSUSBhbmQgRkVDLCBjYW4gYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHdlIG9ubHkgc3Vw cG9ydCBOQUNLIGZvciBBUlEgYW5kIHNpbXBsZSBGRUMgbGlrZSBSRUQuIEhvd2V2ZXIsIHN1cHBv cnRpbmcgR0NDIG9yIFJTRkVDLCBldGMuLCBjYW4gYmUgY29tcGxleC4gSSBhbHNvIHN1Z2dlc3Qg bm90IHN1cHBvcnRpbmcgdGhlbSBpbW1lZGlhdGVseSBiZWNhdXNlLCBpbiBzb21lIHVzZSBzY2Vu YXJpb3MsIHRoZSBuZXR3b3JrIGNvbmRpdGlvbnMgYXJlIGdvb2QuCiogU2lnbmFsaW5nIGFuZCBy b29tIG1hbmFnZW1lbnQgYXJlIG5vdCBuZWNlc3NhcnkgdG8gdG91Y2ggYXMgV0hJUCBpcyBhIHN0 cmFpZ2h0Zm9yd2FyZCBzaWduYWxpbmcgbWV0aG9kIGZvciBXZWJSVEMuIEZGbXBlZyBvbmx5IG5l ZWRzIHRvIHB1Ymxpc2ggYSBXZWJSVEMgc3RyZWFtIGZvciB1c2UgY2FzZXMgc3VjaCBhcyByb2Jv dCBjb250cm9sIG9yIHNpbWlsYXIgc2NlbmFyaW9zLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIG5l ZWQgdG8gaW50cm9kdWNlIHJvb21zIG9yIG11bHRpcGxlIHN0cmVhbXMgaW4gYSBXZWJSVEMgc2Vz c2lvbi4KKiBBdWRpbyBwcm9jZXNzaW5nLCBzdWNoIGFzIDNBLCBpcyBub3QgcmVxdWlyZWQgZm9y IEZGbXBlZyBhcyBpdCBpcyBhIGZlYXR1cmUgZm9yIHBsYXllcnMgbGlrZSBDaHJvbWUuCgpUaGlz IHBhdGNoIGlzIHNpbXBsZSBub3Qgb25seSBiZWNhdXNlIFdISVAgaXMgYSBzdWJzZXQgb2YgV2Vi UlRDLCBidXQgYWxzbyBiZWNhdXNlIGl0IHJldXNlcyBtYW55IG9mIEZGbXBlZydzIHBvd2VyZnVs IGNhcGFiaWxpdGllcywgc3VjaCBhcyBjb2RlYyBhbmQgZm9ybWF0LCBTUlRQLCBIVFRQLCBIVFRQ UywgT3BlblNTTCwgYW5kIG1vcmUuCj4gCj4gCj4gCj4gS2llcmFuCj4gCj4gCj4gCgoKT24gV2Vk IE1heSAzMSAyMzo0NjowNyBFRVNUIDIwMjMsIERlcmVrIEJ1aXRlbmh1aXMgd3JvdGUKPiAKPiBI ZWxsbywgcXVpY2sgc2tpbSBiZWxvdywgZm9sbG93ZSBieSBzb21lIHdhZmZsaW5nIGF0IHRoZSBl bmQuCj4gCj4gSSBoYXZlIG5vdCBib3RoZXJlIHRvIG1lbnRpb24gYW55IGNvZGUgc3R5bGUgbml0 cywgdG8ga2VlcCBpdCB0ZWNobmljYWwuCj4gCj4gT24gNS8yOS8yMDIzIDEyOjUwIFBNLCBTdGV2 ZW4gTGl1IHdyb3RlOgo+ID4gQEAgLTM0ODMsNiArMzQ4Myw3IEBAIG9nZ19kZW11eGVyX3NlbGVj dD0iZGlyYWNfcGFyc2UiCj4gPiBvZ3ZfbXV4ZXJfc2VsZWN0PSJvZ2dfbXV4ZXIiCj4gPiBvcHVz X211eGVyX3NlbGVjdD0ib2dnX211eGVyIgo+ID4gcHNwX211eGVyX3NlbGVjdD0ibW92X211eGVy Igo+ID4gK3J0Y19tdXhlcl9kZXBzX2FueT0ib3BlbnNzbCIKPiAKPiBHaXZlbiB3ZSBzdXBwb3J0 IGEgYnVuY2ggb2YgU1NMIGxpYnJhcmllcywgaG93IGV4YWN0bHkgZG9lcyB0aGlzIHdvcmsgd2l0 aCB0aGF0PyBDYW4KPiBpdCBiZSBhYnN0cmFjdGVkIG91dD8gT3BlblNTTCBwb3NlcyBsaWNlbnNp bmcgaXNzdWVzIGZvciBtYW55Lgo+IApXaW5saW46IEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0 IE9wZW5TU0wsIGJ1dCBhZnRlciBtZXJnaW5nIHRoaXMgcGF0Y2gsIHdlIGludGVuZCB0byBhZGQg c3VwcG9ydCBmb3Igb3RoZXIgU1NMIGxpYnJhcmllcy4gVGhpcyBpcyBiZWNhdXNlIGluY2x1ZGlu ZyBzdXBwb3J0IGZvciBhbGwgU1NMIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBwYXRjaCB3b3VsZCBt YWtlIGl0IG92ZXJseSBjb21wbGV4IGFuZCBkaWZmaWN1bHQgZm9yIG90aGVycyB0byBmb2xsb3cu IElzIHRoaXMgcGxhbiBhY2NlcHRhYmxlLCBvciBkbyB3ZSBuZWVkIHRvIHN1cHBvcnQgYWxsIFNT TCBsaWJyYXJpZXMgd2l0aGluIHRoaXMgcGF0Y2g/CkFkZCBhIFRPRE8gdG8gY29uZmlndXJlLgoK YGBgYmFzaAorIyBUT0RPOiBTdXBwb3J0IGxpYnRscywgbWJlZHRscywgYW5kIGdudXRscy4KIHJ0 Y19tdXhlcl9kZXBzX2FueT0ib3BlbnNzbCIKYGBgCgo+IEZ1cnRoZXIsIEkgdGhpbmsgdGhpcyBp cyBtaXNzaW5nIGEgYnVuY2ggb2YgZGVwZW5kZW5jaWVzIGxpa2UgSFRUUCBhbmQgQVZDPwpXaW5s aW46IEluIHRoZSBNYWtlZmlsZSwgd2UgYWRkIGRlcGVuZGVuY2llcyBhdCB0aGlzIGxpbmU6IAoK YGBgCk9CSlMtJChDT05GSUdfUlRDX01VWEVSKSArPSBydGNlbmMubyBhdmMubyBodHRwLm8gc3J0 cC5vCmBgYAoKSSdtIG5vdCBjZXJ0YWluIGlmIHdlIHNob3VsZCBhbHNvIGluY2x1ZGUgYXZjIGFu ZCBodHRwIGFzIGRlcGVuZGVuY3kgbGlicmFyaWVzIGxpa2UgdGhpczogCgpgYGAKcnRjX211eGVy X2RlcHNfYW55PSJvcGVuc3NsIGF2YyBodHRwIgpgYGAKPiAKPiAKPiA+ICsjaWZuZGVmIENPTkZJ R19PUEVOU1NMCj4gPiArI2Vycm9yICJEVExTIGlzIG5vdCBzdXBwb3J0ZWQsIHBsZWFzZSBlbmFi bGUgb3BlbnNzbCIKPiA+ICsjZWxzZQo+ID4gKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgo+ID4g KyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgo+ID4gKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVS IDwgMHgxMDEwMTAyZkwKPiA+ICsjZXJyb3IgIk9wZW5TU0wgdmVyc2lvbiAxLjEuMWIgb3IgbmV3 ZXIgaXMgcmVxdWlyZWQiCj4gPiArI2VuZGlmCj4gPiArI2VuZGlmCj4gCj4gVGhpcyBzaG91bGQg YmUgaW4gY29uZmlndXJlLgpXaW5saW46IEkgZWxsaW1pbmF0ZWQgdGhlIGxpbmVzIG9mIGNvZGUg dGhhdCB1c2VkIG1hY3JvcyBmb3IgY2hlY2tpbmcsIGFuZCBpbnN0ZWFkLCBJIG9ubHkgcGVyZm9y bSB0aGUgY2hlY2sgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbGlrZSB0aGlzOgoKYGBgYmFzaApl bmFibGVkIG9wZW5zc2wgICAgICAgICAgICAmJiB7CiAgICBlbmFibGVkIHJ0Y19tdXhlciAmJiB7 CiAgICAgICAgJHBrZ19jb25maWcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgIm9wZW5zc2wgPj0g MS4wLjFrIiB8fAogICAgICAgIHJlcXVpcmVfcGtnX2NvbmZpZyBvcGVuc3NsICJvcGVuc3NsID49 IDEuMC4xayIgb3BlbnNzbC9zc2wuaCBTU0xfbGlicmFyeV9pbml0IHx8CiAgICAgICAgcmVxdWly ZV9wa2dfY29uZmlnIG9wZW5zc2wgIm9wZW5zc2wgPj0gMS4wLjFrIiBvcGVuc3NsL3NzbC5oIE9Q RU5TU0xfaW5pdF9zc2wKICAgIH0KfQpgYGAKCkZpeGVkLgo+IAo+IAo+IAo+ID4gKy8qCj4gPiAr ICogU3VwcG9ydGVkIERUTFMgY2lwaGVyIHN1aXRlcyBmb3IgRkZtcGVnIGFzIGEgRFRMUyBjbGll bnQuCj4gPiArICogVGhlc2UgY2lwaGVyIHN1aXRlcyBhcmUgdXNlZCB0byBuZWdvdGlhdGUgd2l0 aCBEVExTIHNlcnZlcnMuCj4gPiArICoKPiA+ICsgKiBJdCBpcyBhZHZpc2FibGUgdG8gdXNlIGEg bGltaXRlZCBudW1iZXIgb2YgY2lwaGVyIHN1aXRlcyB0byByZWR1Y2UKPiA+ICsgKiB0aGUgc2l6 ZSBvZiBEVExTIFVEUCBwYWNrZXRzLgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUgRFRMU19DSVBIRVJf U1VURVMgIkVDREhFLUVDRFNBLUFFUzEyOC1HQ00tU0hBMjU2IlwKPiA+ICsgIjpFQ0RIRS1SU0Et QUVTMTI4LUdDTS1TSEEyNTYiXAo+ID4gKyAiOkVDREhFLUVDRFNBLUFFUzEyOC1TSEEiXAo+ID4g KyAiOkVDREhFLVJTQS1BRVMxMjgtU0hBIlwKPiA+ICsgIjpFQ0RIRS1FQ0RTQS1BRVMyNTYtU0hB IlwKPiA+ICsgIjpFQ0RIRS1SU0EtQUVTMjU2LVNIQSIKPiAKPiBUaGUgcmVhc29uIGZvciB0aGlz IHNwZWNpZmljIHN1YnNldCBzaG91bGQgYmUgZG9jdW1lbnRlZC4KV2lubGluOiBSZXNvbHZlZCBi eSBlbXBsb3lpbmcgIkFMTCIgY2lwaGVyIHN1aXRlIHRvIGF0dGFpbiB0aGUgbWF4aW11bSBjb21w YXRpYmlsaXR5LgoKYGBgYwogICAgLyoqCiAgICAgKiBXZSBhY3RpdmF0ZSAiQUxMIiBjaXBoZXIg c3VpdGVzIHRvIGFsaWduIHdpdGggdGhlIHBlZXIncyBjYXBhYmlsaXRpZXMsCiAgICAgKiBlbnN1 cmluZyBtYXhpbXVtIGNvbXBhdGliaWxpdHkuCiAgICAgKi8KICAgIGlmIChTU0xfQ1RYX3NldF9j aXBoZXJfbGlzdChkdGxzX2N0eCwgIkFMTCIpICE9IDEpIHsKYGBgCgpGaXhlZC4KPiAKPiAKPiAK PiA+ICsvKioKPiA+ICsgKiBTVEFQLUEgc3RhbmRzIGZvciBTaW5nbGUtVGltZSBBZ2dyZWdhdGlv biBQYWNrZXQuCj4gPiArICogVGhlIE5BTFUgdHlwZSBmb3IgU1RBUC1BIGlzIDI0ICgweDE4KS4K PiA+ICsgKi8KPiA+ICsjZGVmaW5lIE5BTFVfVFlQRV9TVEFQX0EgMjQKPiAKPiBXaHkgaXMgYSBO QUxVIHR5cGUgYmVpbmcgZGVmaW5lZCBpbiBhIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZpbGU/ CldpbmxpbjogVGhlcmUgbWlnaHQgYmUgYW4gaXNzdWUgaW4gcnRwZW5jLmMsIHdoZXJlIHRoZSBS VFAgbWFya2VyIGZvciBTVEFQLUEgc2hvdWxkIGJlIHNldCB0byAwLCBidXQgaXQgaXMgY3VycmVu dGx5IHNldCB0byAxLiBUaGlzIHByb2JsZW0gbGVhZHMgdG8gQ2hyb21lJ3MgaW5hYmlsaXR5IHRv IGRlY29kZSB0aGUgdmlkZW8gc3RyZWFtLiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IFNU QVAtQSBpbmNsdWRlcyBTUFMvUFBTLiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gZGVmaW5lIHRoaXMg bWFjcm8gdG8gcGFyc2UgdGhlIFJUUCBwYWNrZXQgYW5kIGZpeCB0aGUgaXNzdWUuCgpgYGBjCiAg ICAvKioKICAgICAqIEZvciB2aWRlbywgdGhlIFNUQVAtQSB3aXRoIFNQUy9QUFMgc2hvdWxkOgog ICAgICogMS4gVGhlIG1hcmtlciBiaXQgc2hvdWxkIGJlIDAsIG5ldmVyIGJlIDEuCiAgICAgKiAy LiBUaGUgTlJJIHNob3VsZCBlcXVhbCB0byB0aGUgZmlyc3QgTkFMVSdzLgogICAgICogVE9ETzog RklYTUU6IFNob3VsZCBmaXggaXQgaW4gcnRwZW5jLmMKICAgICAqLwogICAgaWYgKGlzX3ZpZGVv ICYmIGJ1Zl9zaXplID4gMTIpIHsKICAgICAgICBuYWx1X2hlYWRlciA9IGJ1ZlsxMl0gJiAweDFm OwogICAgICAgIGlmIChuYWx1X2hlYWRlciA9PSBOQUxVX1RZUEVfU1RBUF9BKSB7CiAgICAgICAg ICAgIC8qIFJlc2V0IHRoZSBtYXJrZXIgYml0IHRvIDAuICovCiAgICAgICAgICAgIGlmIChidWZb MV0gJiAweDgwKQogICAgICAgICAgICAgICAgYnVmWzFdICY9IDB4N2Y7CgogICAgICAgICAgICAv KiBSZXNldCB0aGUgTlJJIHRvIHRoZSBmaXJzdCBOQUxVJ3MgTlJJLiAqLwogICAgICAgICAgICBp ZiAoYnVmX3NpemUgPiAxNSAmJiAoYnVmWzE1XSYweDYwKSAhPSAoYnVmWzEyXSYweDYwKSkKICAg ICAgICAgICAgICAgIGJ1ZlsxMl0gPSAoYnVmWzEyXSYweDgwKSB8IChidWZbMTVdJjB4NjApIHwg KGJ1ZlsxMl0mMHgxZik7CiAgICAgICAgfQogICAgfQpgYGAKCkFmdGVyIHV0aWxpemluZyBCU0Ys IHRoZSBtYXJrZXIgaXMgY29ycmVjdGx5IHNldCB0byBmYWxzZSwgc28gdGhlcmUgaXMgbm8gbmVl ZCB0byByZXNldCBpdC4gUmVnYXJkaW5nIHRoZSBOUkksIGl0IGFwcGVhcnMgdG8gYmUgZnVuY3Rp b25pbmcgcHJvcGVybHkgYW5kIGRvZXMgbm90IHJlcXVpcmUgcmVzZXR0aW5nIGF0IHRoaXMgdGlt ZS4gVGh1cywgSSBlbGltaW5hdGVkIHRoaXMgY29kZSBhbmQgbWFjcm8uCj4gCj4gCj4gCj4gPiAr LyoqCj4gPiArICogV2FpdCBmb3IgYSBzbWFsbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBh bGxvdyBmb3IgdGhlIHNlcnZlciB0byBwcm9jZXNzCj4gPiArICogdGhlIEludGVyYWN0aXZlIENv bm5lY3Rpdml0eSBFc3RhYmxpc2htZW50IChJQ0UpIHJlcXVlc3QuIElmIHdlIGltbWVkaWF0ZWx5 Cj4gPiArICogcmVhZCB0aGUgcmVzcG9uc2UgYWZ0ZXIgc2VuZGluZyB0aGUgcmVxdWVzdCwgd2Ug bWF5IHJlY2VpdmUgbm90aGluZyBhbmQgbmVlZAo+ID4gKyAqIHRvIGltbWVkaWF0ZWx5IHJldHJ5 LiBUbyBsZXNzZW4gdGhlIGxpa2VsaWhvb2Qgb2YgcmV0cmllcywgd2UgY2FuIHNlbmQgdGhlCj4g PiArICogcmVxdWVzdCBhbmQgd2FpdCBmb3IgYSBzbWFsbCBhbW91bnQgb2YgdGltZSBmb3IgdGhl IHNlcnZlciB0byBwcm9jZXNzIGl0Cj4gPiArICogYmVmb3JlIHJlYWRpbmcgdGhlIHJlc3BvbnNl Lgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUgSUNFX1BST0NFU1NJTkdfVElNRU9VVCAxMAo+IAo+IEFy ZSB3ZSByZWFsbHkgaGFyZGNvZGluZyBzbGVlcHM/IFN1cmVseSBhIGJldHRlciB3YXkgZXhpc3Rz LiBXaGF0IGRvIG90aGVyIGltcGxlbWVudGF0aW9ucwo+IGRvIGhlcmU/CldpbmxpbjogV2UgaGF2 ZSBpbXByb3ZlZCB0aGUgSUNFIGFuZCBEVExTIGNvZGUsIGFuZCByZW1vdmVkIHRoaXMgbWFjcm8g YXMgaXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4gQ3VycmVudGx5LCBvbmx5IGEgaGFuZHNoYWtl X3RpbWVvdXQgb3B0aW9uIGlzIHV0aWxpemVkLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiA1IHNl Y29uZHMsIHRvIHJlc3RyaWN0IHRoZSBJQ0UgYW5kIERUTFMgdGltZW91dCBkdXJhdGlvbi4KPiAK PiA+ICsvKioKPiA+ICsgKiBXYWl0IGZvciBhIHNob3J0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRz IHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gcHJvY2Vzcwo+ID4gKyAqIHRoZSBEYXRhZ3JhbSBUcmFu c3BvcnQgTGF5ZXIgU2VjdXJpdHkgKERUTFMpIHJlcXVlc3QuIElmIHdlIGltbWVkaWF0ZWx5Cj4g PiArICogcmVhZCB0aGUgcmVzcG9uc2UgYWZ0ZXIgc2VuZGluZyB0aGUgcmVxdWVzdCwgd2UgbWF5 IHJlY2VpdmUgbm90aGluZyBhbmQKPiA+ICsgKiBuZWVkIHRvIGltbWVkaWF0ZWx5IHJldHJ5LiBU byByZWR1Y2UgdGhlIGxpa2VsaWhvb2Qgb2YgcmV0cmllcywgd2UgY2FuCj4gPiArICogc2VuZCB0 aGUgcmVxdWVzdCBhbmQgd2FpdCBhIHNob3J0IGFtb3VudCBvZiB0aW1lIGZvciB0aGUgc2VydmVy IHRvCj4gPiArICogcHJvY2VzcyBpdCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWFkIHRoZSByZXNw b25zZS4KPiA+ICsgKi8KPiA+ICsjZGVmaW5lIERUTFNfUFJPQ0VTU0lOR19USU1FT1VUIDMwCj4g Cj4gU2FtZSBjb21tZW50IGFzIGFib3ZlLgo+IAo+ID4gKy8qKgo+ID4gKyAqIFRoZSBtYXhpbXVt IG51bWJlciBvZiByZXRyaWVzIGZvciBEYXRhZ3JhbSBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkg KERUTFMpIEVBR0FJTiBlcnJvcnMuCj4gPiArICogV2hlbiB3ZSBzZW5kIGEgRFRMUyByZXF1ZXN0 IGFuZCByZWNlaXZlIG5vIHJlc3BvbnNlLCB3ZSBtYXkgZW5jb3VudGVyIGFuIEVBR0FJTiBlcnJv ci4KPiA+ICsgKiBJbiB0aGlzIHNpdHVhdGlvbiwgd2Ugd2FpdCBicmllZmx5IGFuZCBhdHRlbXB0 IHRvIHJlYWQgdGhlIHJlc3BvbnNlIGFnYWluLgo+ID4gKyAqIFdlIGxpbWl0IHRoZSBtYXhpbXVt IG51bWJlciBvZiB0aW1lcyB3ZSByZXRyeSB0aGlzIGxvb3AuCj4gPiArICovCj4gPiArI2RlZmlu ZSBEVExTX0VBR0FJTl9SRVRSSUVTX01BWCA1Cj4gCj4gU2hvdWxkIHRoaXMgYmUgYW4gb3B0aW9u PwpXaW5saW46IFdlIGhhdmUgaW1wcm92ZWQgdGhlIElDRSBhbmQgRFRMUyBjb2RlLCBhbmQgcmVt b3ZlZCB0aGlzIG1hY3JvIGFzIGl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuIEN1cnJlbnRseSwg b25seSBhIGhhbmRzaGFrZV90aW1lb3V0IG9wdGlvbiBpcyB1dGlsaXplZCwgd2l0aCBhIGRlZmF1 bHQgdmFsdWUgb2YgNSBzZWNvbmRzLCB0byByZXN0cmljdCB0aGUgSUNFIGFuZCBEVExTIHRpbWVv dXQgZHVyYXRpb24uCj4gCj4gPiArLyoqCj4gPiArICogVGhlIERUTFMgdGltZXIncyBiYXNlIHRp bWVvdXQgaW4gbWljcm9zZWNvbmRzLiBJdHMgcHVycG9zZSBpcyB0byBtaW5pbWl6ZSB0aGUgdW5u ZWNlc3NhcnkKPiA+ICsgKiByZXRyYW5zbWlzc2lvbiBvZiBDbGllbnRIZWxsby4KPiA+ICsgKi8K PiA+ICsjZGVmaW5lIERUTFNfU1NMX1RJTUVSX0JBU0UgNDAwICogMTAwMAo+IAo+IElzIHRoaXMg ZnJvbSBhIHNwZWMgb3IgYXJiaXRyYXJ5PwpXaW5saW46IFdlIGhhdmUgaW1wcm92ZWQgdGhlIElD RSBhbmQgRFRMUyBjb2RlLCBhbmQgcmVtb3ZlZCB0aGlzIG1hY3JvIGFzIGl0IGlzIG5vIGxvbmdl ciBuZWNlc3NhcnkuIEN1cnJlbnRseSwgb25seSBhIGhhbmRzaGFrZV90aW1lb3V0IG9wdGlvbiBp cyB1dGlsaXplZCwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgNSBzZWNvbmRzLCB0byByZXN0cmlj dCB0aGUgSUNFIGFuZCBEVExTIHRpbWVvdXQgZHVyYXRpb24uCj4gCj4gPiArdHlwZWRlZiBzdHJ1 Y3QgRFRMU0NvbnRleHQgewo+ID4gKyAvKiBGb3IgYXZfbG9nIHRvIHdyaXRlIGxvZyB0byB0aGlz IGNhdGVnb3J5LiAqLwo+ID4gKyB2b2lkICpsb2dfYXZjbDsKPiAKPiBXaHkgaXMgdGhpcyB2b2lk ICo/CldpbmxpbjogVGhlIGBsb2dfYXZjbGAgaXMgdXRpbGl6ZWQgZm9yIGBhdl9sb2codm9pZCog YXZjbClgLCB3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQgaXMgb2YgYHZvaWQqYCB0eXBlLiBXZSBo YXZlIGNoYW5nZSB0aGUgYHZvaWQqYCB0byBgQVZDbGFzcypgLgoKYGBgYwogICAgUlRDQ29udGV4 dCAqcnRjID0gcy0+cHJpdl9kYXRhOwogICAgcnRjLT5kdGxzX2N0eC5hdl9jbGFzcyA9IHJ0Yy0+ YXZfY2xhc3M7CgogICAgRFRMU0NvbnRleHQgKmN0eDsKICAgIGF2X2xvZyhjdHgsIEFWX0xPR19F UlJPUiwgIkRUTFM6IFVuYWJsZSB0byBnZW5lcmF0ZSBwcml2YXRlIGtleSwgRUNfS0VZX3NldF9n cm91cCBmYWlsdXJlXG4iKTsKYGBgCgpKYWNrIExhdTogSW4gbGF0ZXN0IGNvZGUsIHRoZSBsb2df YXZjbCBpcyByZW1vdmVkLCBiZWNhdXNlIERUTFMgaGFzIGl0cyBvd24gY2xhc3MuCj4gCj4gCj4g Cj4gPiArIC8qKgo+ID4gKyAqIFRoaXMgcmVwcmVzZW50cyB0aGUgbWF0ZXJpYWwgdXNlZCB0byBi dWlsZCB0aGUgU1JUUCBtYXN0ZXIga2V5LiBJdCBpcwo+ID4gKyAqIGdlbmVyYXRlZCBieSBEVExT IGFuZCBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQ6Cj4gPiArICogMTZCIDE2QiAxNEIgMTRCCj4g PiArICogY2xpZW50X2tleSB8IHNlcnZlcl9rZXkgfCBjbGllbnRfc2FsdCB8IHNlcnZlcl9zYWx0 Cj4gPiArICovCj4gPiArIHVpbnQ4X3QgZHRsc19zcnRwX21hdGVyaWFsW0RUTFNfU1JUUF9NQVNU RVJfS0VZX0xFTiAqIDJdOwo+IAo+ICoyPwpXaW5saW46IFRoZSBkdGxzX3NydHBfbWF0ZXJpYWxz IGNvbnNpc3Qgb2YgcGFpcnMgb2Yga2V5cyBhbmQgc2FsdHMsIHdpdGggZWFjaCBwYWlyIGNvbnRh aW5pbmcgYSBrZXkgYW5kIGEgc2FsdCwgc3VjaCBhcyB0aGUgY2xpZW50IGtleSBhbmQgc2FsdC4g VGhlIGxheW91dCBpcyBhcyBmb2xsb3dzOgoKYGBgCiAgICAgMTZCICAgICAgICAgMTZCICAgICAg ICAgMTRCICAgICAgICAgICAgIDE0QgpjbGllbnRfa2V5IHwgc2VydmVyX2tleSB8IGNsaWVudF9z YWx0IHwgc2VydmVyX3NhbHQKYGBgCgpUaGF0J3MgdGhlIHJlYXNvbiBmb3IgbXVsdGlwbHlpbmcg aXQgYnkgMi4gSG93ZXZlciwgd2UgaGF2ZSByZWZpbmVkIGl0IHRvIG1ha2UgaXQgY2xlYXIuCgpg YGBjCi8vIFRoaXMgbWF0ZXJpYWwgY29uc2lzdHMgb2YgYSBrZXkgb2YgMTYgYnl0ZXMgYW5kIGEg c2FsdCBvZiAxNCBieXRlcy4KI2RlZmluZSBEVExTX1NSVFBfTUFTVEVSX0tFWV9MRU4gMzAKdWlu dDhfdCBkdGxzX3NydHBfbWF0ZXJpYWxzW0RUTFNfU1JUUF9NQVNURVJfS0VZX0xFTl07CmBgYAoK UmVmaW5lZCB0bzoKCmBgYGMKI2RlZmluZSBEVExTX1NSVFBfS0VZX0xFTiAxNgojZGVmaW5lIERU TFNfU1JUUF9TQUxUX0xFTiAxNAovKioKICogVGhpcyByZXByZXNlbnRzIHRoZSBtYXRlcmlhbCB1 c2VkIHRvIGJ1aWxkIHRoZSBTUlRQIG1hc3RlciBrZXkuIEl0IGlzCiAqIGdlbmVyYXRlZCBieSBE VExTIGFuZCBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQ6CiAqICAgICAgICAgIDE2QiAgICAgICAg IDE2QiAgICAgICAgIDE0QiAgICAgICAgICAgICAxNEIKICogICAgICBjbGllbnRfa2V5IHwgc2Vy dmVyX2tleSB8IGNsaWVudF9zYWx0IHwgc2VydmVyX3NhbHQKICovCnVpbnQ4X3QgZHRsc19zcnRw X21hdGVyaWFsc1soRFRMU19TUlRQX0tFWV9MRU4gKyBEVExTX1NSVFBfU0FMVF9MRU4pICogMl07 CmBgYAoKRml4ZWQuCj4gCj4gCj4gCj4gPiArLyoqCj4gPiArICogR2VuZXJhdGUgYSBzZWxmLXNp Z25lZCBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZSBrZXkgZm9yIERUTFMuCj4gPiArICovCj4gCj4g RG9lcyBXSElQIGFsbG93IHVzZSBvZiBhcmJpdHJhcnkgY2VydHMgKGkuZS4gbm9uLXNlbGYtc2ln bmVkKT8KV2lubGluOiBTdXBwb3J0ZWQgYm90aCBzZWxmLXNpZ25lZCBhbmQgbm9uLXNlbGYtc2ln bmVkIGNlcnRpZmljYXRlcyBub3cuCj4gCj4gPiArc3RhdGljIGF2X2NvbGQgaW50IGR0bHNfY29u dGV4dF9pbml0KERUTFNDb250ZXh0ICpjdHgpCj4gPiArewo+ID4gKyBpbnQgcmV0ID0gMCwgc2Vy aWFsLCBleHBpcmVfZGF5LCBpLCBuID0gMDsKPiA+ICsgQVZCUHJpbnQgZmluZ2VycHJpbnQ7Cj4g PiArIHVuc2lnbmVkIGNoYXIgbWRbRVZQX01BWF9NRF9TSVpFXTsKPiA+ICsgY29uc3QgY2hhciAq YW9yID0gImZmbXBlZy5vcmciLCAqY3VydmUgPSBOVUxMOwo+IAo+IEkgYW0gbm90IHN1cmUgdGhl IHRoZSBGRm1wZWcgY29tbXVuaXR5IHdhbnRzIHRvIGFkdmVydGlzZSBpdHNlbGYgYXMgYSBDTi4K PiAKPiBNYXliIGxhdmY/CkNoYW5nZWQgdGhlIENvbW1vbk5hbWUgZnJvbSBmZm1wZWcub3JnIHRv IGxhdmYuCj4gCj4gPiArIGN1cnZlID0gInByaW1lMjU2djEiOwo+IAo+IEZvciB0aGlzIGFuZCBh bGwgb3RoZXIgb2NjdXJyZW5jZXM6IFRoZXkgc2hvdWxkIGJlIGludGlhbGl6ZWQgYXQgZGVjbGFy YXRpb24KPiB0aW1lLCBsaWtlIHRoZSByZXN0IG9mIHRoZSBjb2RlYmFzZS4KRml4ZWQKPiAKPiAK PiA+ICsgY3R4LT5kdGxzX3BrZXkgPSBkdGxzX3BrZXkgPSBFVlBfRUNfZ2VuKGN1cnZlKTsKPiA+ ICsgaWYgKCFkdGxzX3BrZXkpIHsKPiA+ICsgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJEVExT OiBFVlBfRUNfZ2VuIGN1cnZlPSVzIGZhaWxlZFxuIiwgY3VydmUpOwo+IAo+IEZvciB0aGlzIGFu ZCBhbGwgdGhlciBsb2dzOiBTb21ldGhpbmcgbW9yZSBkZXNjcmlwdGl2ZSB0aGFuICJmdW5jdGlv bl9uYW1lIGZhaWxlZDoiCj4gc2hvdWxkIGJlIHVzZWQuCldpbmxpbjogSSBoYXZlIGluY2x1ZGVk IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGxvZyBtZXNzYWdlLCBiZXlvbmQganVzdCB0 aGUgZmFpbGVkIGZ1bmN0aW9uIG5hbWUuCj4gCj4gPiArIHNlcmlhbCA9IChpbnQpYXZfZ2V0X3Jh bmRvbV9zZWVkKCk7Cj4gCj4gRm9yIGFsbCB1c2VzIG9mIGF2X2dldF9yYW5kb21fc2VlZDogV2h5 IGFyZSB3ZSB1c2luZyBhIHNlZWQgYW5kIG5vdCBhIFBSTkc/CkdvdCBpdCEgUmVwbGFjZSBhdl9n ZXRfcmFuZG9tX3NlZWQgYnkgQVZMRkcuCj4gCj4gPiArIGlmICghYXZfYnByaW50X2lzX2NvbXBs ZXRlKCZmaW5nZXJwcmludCkpIHsKPiA+ICsgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJGaW5n ZXJwcmludCAlZCBleGNlZWQgbWF4ICVkLCAlc1xuIiwgcmV0LCBNQVhfU0RQX1NJWkUsIGZpbmdl cnByaW50LnN0cik7Cj4gPiArIHJldCA9IEFWRVJST1IoRUlPKTsKPiA+ICsgZ290byBlbmQ7Cj4g PiArIH0KPiAKPiBJcyB0aGlzIGFjdHVhbGx5IHBvc3NpYmxlIHRvIHRyaWdnZXI/Cldpbmxpbjog UmVtb3ZlIHRoaXMgdW5uZWNlc3NhcnkgY29kZS4KPiAKPiA+ICsgaWYgKCFmaW5nZXJwcmludC5z dHIgfHwgIXN0cmxlbihmaW5nZXJwcmludC5zdHIpKSB7Cj4gPiArIGF2X2xvZyhzMSwgQVZfTE9H X0VSUk9SLCAiRmluZ2VycHJpbnQgaXMgZW1wdHlcbiIpOwo+ID4gKyByZXQgPSBBVkVSUk9SKEVJ TlZBTCk7Cj4gPiArIGdvdG8gZW5kOwo+ID4gKyB9Cj4gCj4gU2FtZSBhcyBhYm92ZS4KPiAKPiA+ ICsgLyogbmV2ZXIgZXhjZWVkIHRoZSBtYXggdGltZW91dC4gKi8KPiA+ICsgdGltZW91dF91cyA9 IEZGTUlOKHRpbWVvdXRfdXMsIDMwICogMTAwMCAqIDEwMDApOyAvKiBpbiB1cyAqLwo+IAo+IElz IHRoaXMgbWF4IGJhc2VkIG9uIGFueXRoaW5nPwpXaW5saW46IFJlbW92ZSB0aGlzIHVubmVjZXNz YXJ5IGNvZGUuCj4gCj4gPiArIC8qIENoYW5nZV9jaXBoZXJfc3BlYygyMCksIGFsZXJ0KDIxKSwg aGFuZHNoYWtlKDIyKSwgYXBwbGljYXRpb25fZGF0YSgyMykgKi8KPiA+ICsgaWYgKGxlbmd0aCA+ PSAxKQo+ID4gKyBjb250ZW50X3R5cGUgPSAodWludDhfdClkYXRhWzBdOwo+ID4gKyBpZiAobGVu Z3RoID49IDEzKQo+ID4gKyBzaXplID0gKHVpbnQxNl90KShkYXRhWzExXSk8PDggfCAodWludDE2 X3QpZGF0YVsxMl07Cj4gCj4gbml0OiBBVl9XQjE2PwpXaW5saW46IFVzZSBBVl9SQjE2IHRvIHBh cnNlIHRoZSBkYXRhLgpgYGAKc2l6ZSA9ICh1aW50MTZfdCkoZGF0YVsxMV0pPDw4IHwgKHVpbnQx Nl90KWRhdGFbMTJdOwovLyBDaGFuZ2UgdG86CnNpemUgPSBBVl9SQjE2KCZkYXRhWzExXSk7CmBg YAoKRml4ZWQuCj4gCj4gCj4gCj4gPiArIGlmIChsZW5ndGggPj0gMTQpCj4gPiArIGhhbmRzaGFr ZV90eXBlID0gKHVpbnQ4X3QpZGF0YVsxM107Cj4gCj4gQ2FzdGluZyB1aW50OF90IHRvIHVpbnQ4 X3Q/IEFib3ZlLCBhbHNvLgpXaW5saW46IFVzZSBBVl9SQiBpbnN0ZWFkLgo+IAo+ID4gKyBhdl9s b2coczEsIEFWX0xPR19WRVJCT1NFLCAiV0hJUDogRFRMUyBzdGF0ZSAlcyAlcywgZG9uZT0ldSwg YXJxPSV1LCByMD0lZCwgcjE9JWQsIGxlbj0ldSwgY250PSV1LCBzaXplPSV1LCBocz0ldVxuIiwK PiA+ICsgIkFjdGl2ZSIsIChpbmNvbWluZz8gIlJFQ1YiOiJTRU5EIiksIGN0eC0+ZHRsc19kb25l X2Zvcl91cywgY3R4LT5kdGxzX2FycV9wYWNrZXRzLCByMCwgcjEsIGxlbmd0aCwKPiA+ICsgY29u dGVudF90eXBlLCBzaXplLCBoYW5kc2hha2VfdHlwZSk7Cj4gCj4gRG9lcyB0aGUgdXNlIG9mIHRo aXMgdHJhY2UgY2FsbGJhY2sgYWZmZWMgcGVyZiBpbiBhbnkgd2F5PyBJIGhhdmUgdG8gYXNzdW1l IG5vdCwKPiBidXQgdGhvdWdodCBJIHdvdWxkIGNoZWNrLgpXaW5saW46IE5vLCBpdCBkb2Vzbid0 IG5lZ2F0aXZlbHkgaW1wYWN0IHBlcmZvcm1hbmNlLCBhcyB0aGUgRFRMUyBoYW5kc2hha2UgY29u c2lzdHMgb2Ygb25seSA0IG1lc3NhZ2VzIGluIDIgcm91bmR0cmlwcy4gSXQgZGlzcGxheXMgaW1w b3J0YW50IHN0YXRlIGNoYW5nZXMgaW4gRFRMUyB3aXRoIG9ubHkgYSBtaW5pbWFsIG51bWJlciBv ZiBtZXNzYWdlcy4KSmFjayBMYXU6IHRoaXMgY2FsbGJhY2sgd2FzIHJlbW92ZWQgYWxyZWFkeSBi ZWNhdXNlIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBoYWQgdG9vIGhpZ2ggY291cGxpbmcs IGFuZCBzaW5jZSBkdGxzIGhhcyBiZWVuIGFic3RyYWN0ZWQgYXdheSwgcmVpbXBsZW1lbnRpbmcg aXQgd291bGQgcmVxdWlyZSBtb3JlIHdvcmssIHdoaWNoIEkgZmVsdCB3YXMgdW5uZWNlc3Nhcnku Cj4gCj4gPiArIC8qIEZvciBFQ0RTQSwgd2UgY291bGQgc2V0IHRoZSBjdXJ2ZXMgbGlzdC4gKi8K PiA+ICsgaWYgKFNTTF9DVFhfc2V0MV9jdXJ2ZXNfbGlzdChkdGxzX2N0eCwgIlAtNTIxOlAtMzg0 OlAtMjU2IikgIT0gMSkgewo+IAo+IFdoZXJlIGRpZCB0aGlzIGxpc3QgY29tZSBmcm9tPwpXaW5s aW46IEluIHRoZSB0ZXN0IGNhc2VzIGluY2x1ZGUgYWRkaXRpb25hbCBjdXJ2ZXMsIHN1Y2ggYXMg IlgyNTUxOSIsICJQLTI1NiIsICJQLTM4NCIsIGFuZCAiUC01MjEiIGZvciBldmFsdWF0aW9uLgoK YGBgCi8vIHdlYnJ0Yy1jaGVja291dC9zcmMvcnRjX2Jhc2Uvc3NsX2FkYXB0ZXJfdW5pdHRlc3Qu Y2MKLy8gVGVzdCB0cmFuc2ZlciB3aXRoIFRMUyBFbGxpcHRpYyBjdXJ2ZXMgc2V0IHRvICJYMjU1 MTk6UC0yNTY6UC0zODQ6UC01MjEiClRFU1RfRihTU0xBZGFwdGVyVGVzdFRMU19FQ0RTQSwgVGVz dFRMU0VsbGlwdGljQ3VydmVzKSB7CmBgYAoKSXQgaXMgcG9zc2libGUgdG8gaW5jbHVkZSB0aGVz ZSBhZGRpdGlvbmFsIGN1cnZlIGxpc3RzLCBhcyB0aGV5IHdpbGwgYmUgbmVnb3RpYXRlZCBkdXJp bmcgdGhlIERUTFMgaGFuZHNoYWtlIHByb2Nlc3MuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRo YXQgWDI1NTE5IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IE9wZW5TU0wgdmVyc2lvbiAxLjEuMCBhbmQg bGF0ZXIgdmVyc2lvbnMuCgpgYGBjCiAgICAvKiBSZWZlciB0byB0aGUgdGVzdCBjYXNlcyByZWdh cmRpbmcgdGhlc2UgY3VydmVzIGluIHRoZSBXZWJSVEMgY29kZS4gKi8KI2lmIE9QRU5TU0xfVkVS U0lPTl9OVU1CRVIgPj0gMHgxMDEwMDAwMEwgLyogT3BlblNTTCAxLjEuMCAqLwogICAgY29uc3Qg Y2hhciogY3VydmVzID0gIlgyNTUxOTpQLTI1NjpQLTM4NDpQLTUyMSI7CiNlbGlmIE9QRU5TU0xf VkVSU0lPTl9OVU1CRVIgPj0gMHgxMDAwMjAwMEwgLyogT3BlblNTTCAxLjAuMiAqLwogICAgY29u c3QgY2hhciogY3VydmVzID0gIlAtMjU2OlAtMzg0OlAtNTIxIjsKI2VuZGlmCmBgYAoKRml4ZWQu Cj4gCj4gCj4gCj4gCj4gPiArIC8qIE9ubHkgc3VwcG9ydCBTUlRQX0FFUzEyOF9DTV9TSEExXzgw LCBwbGVhc2UgcmVhZCBzc2wvZDFfc3J0cC5jICo+ICsgaWYgKFNTTF9DVFhfc2V0X3Rsc2V4dF91 c2Vfc3J0cChkdGxzX2N0eCwgIlNSVFBfQUVTMTI4X0NNX1NIQTFfODAiKSkgewo+IAo+IFdoYXQg aXMgc3NsL2QxX3NydHAuYz8gSXQgaXMgbm90IGZyb20gRkZtcGVnLgpXaW5saW46IFJlZmluZWQg dGhlIGNvbW1lbnRzLgoKYGBgYwogICAgLyoqCiAgICAgKiBUaGUgcHJvZmlsZSBmb3IgT3BlblNT TCdzIFNSVFAgaXMgU1JUUF9BRVMxMjhfQ01fU0hBMV84MCwgc2VlIHNzbC9kMV9zcnRwLmMuCiAg ICAgKiBUaGUgcHJvZmlsZSBmb3IgRkZtcGVnJ3MgU1JUUCBpcyBTUlRQX0FFUzEyOF9DTV9ITUFD X1NIQTFfODAsIHNlZSBsaWJhdmZvcm1hdC9zcnRwLmMuCiAgICAgKi8KICAgIGNvbnN0IGNoYXIq IHByb2ZpbGVzID0gIlNSVFBfQUVTMTI4X0NNX1NIQTFfODAiOwpgYGAKCkZpeGVkLgo+IAo+IAo+ IAo+ID4gKyAvKiBXYWl0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gcHJvY2VzcyB0aGUgcmVxdWVz dCBhbmQgbm8gbmVlZCBBUlEgdGhlbi4gKi8KPiA+ICsjaWYgRFRMU19QUk9DRVNTSU5HX1RJTUVP VVQgPiAwCj4gPiArIGF2X3VzbGVlcChEVExTX1BST0NFU1NJTkdfVElNRU9VVCAqIDEwMDAwKTsK PiA+ICsjZW5kaWYKPiAKPiBUaGlzICNpZiBpcyBhIG5vLW9wLgpXaW5saW46IFdlIGhhdmUgaW1w cm92ZWQgdGhlIElDRSBhbmQgRFRMUyBjb2RlLCBhbmQgcmVtb3ZlZCB0aGlzIGNvZGUgYXMgaXQg aXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4gQ3VycmVudGx5LCBvbmx5IGEgaGFuZHNoYWtlX3RpbWVv dXQgb3B0aW9uIGlzIHV0aWxpemVkLCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiA1IHNlY29uZHMs IHRvIHJlc3RyaWN0IHRoZSBJQ0UgYW5kIERUTFMgdGltZW91dCBkdXJhdGlvbi4KPiAKPiA+ICsK PiA+ICsgZm9yIChqID0gMDsgaiA8PSBEVExTX0VBR0FJTl9SRVRSSUVTX01BWCAmJiAhcmVzX3Np emU7IGorKykgewo+IAo+IERvZXMgdGhpcyBub3QgbWFrZSBEVExTX0VBR0FJTl9SRVRSSUVTX01B WCBhIG1pc25vbWVyIChkdWUgdG8gdXNlIG9mIDw9KT8KV2lubGluOiBXZSBoYXZlIGltcHJvdmVk IHRoZSBJQ0UgYW5kIERUTFMgY29kZSwgYW5kIHJlbW92ZWQgdGhpcyBjb2RlIGFzIGl0IGlzIG5v IGxvbmdlciBuZWNlc3NhcnkuIEN1cnJlbnRseSwgb25seSBhIGhhbmRzaGFrZV90aW1lb3V0IG9w dGlvbiBpcyB1dGlsaXplZCwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgNSBzZWNvbmRzLCB0byBy ZXN0cmljdCB0aGUgSUNFIGFuZCBEVExTIHRpbWVvdXQgZHVyYXRpb24uCj4gCj4gPiArIC8qIEln bm9yZSBvdGhlciBwYWNrZXRzLCBzdWNoIGFzIElDRSBpbmRpY2F0aW9uLCBleGNlcHQgRFRMUy4g Ki8KPiA+ICsgaWYgKHJldCA+IDAgJiYgKHJldCA8IDEzIHx8IGJ1ZlswXSA8PSAxOSB8fCBidWZb MF0gPj0gNjQpKQo+ID4gKyBjb250aW51ZTsKPiAKPiBNYWdpYyBudW1iZXJzPwpXaW5saW46IFJl cGxhY2UgdGhlIG1hZ2ljIG51bWJlciB0byBhIG1hY3JvIGFuZCBleHRyYWN0IHRvIGEgZnVuY3Rp b24gaXNfZHRsc19wYWNrZXQuCgpgYGBjCi8qKgogKiBUaGUgRFRMUyBjb250ZW50IHR5cGUuCiAq IFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjI0NiNzZWN0aW9uLTYuMi4xCiAq IGNoYW5nZV9jaXBoZXJfc3BlYygyMCksIGFsZXJ0KDIxKSwgaGFuZHNoYWtlKDIyKSwgYXBwbGlj YXRpb25fZGF0YSgyMykKICovCiNkZWZpbmUgRFRMU19DT05URU5UX1RZUEVfQ0hBTkdFX0NJUEhF Ul9TUEVDIDIwCgovKioKICogVGhlIERUTFMgcmVjb3JkIGxheWVyIGhlYWRlciBoYXMgYSB0b3Rh bCBzaXplIG9mIDEzIGJ5dGVzLCBjb25zaXN0aW5nIG9mCiAqIENvbnRlbnRUeXBlICgxIGJ5dGUp LCBQcm90b2NvbFZlcnNpb24gKDIgYnl0ZXMpLCBFcG9jaCAoMiBieXRlcyksCiAqIFNlcXVlbmNl TnVtYmVyICg2IGJ5dGVzKSwgYW5kIExlbmd0aCAoMiBieXRlcykuCiAqIFNlZSBodHRwczovL2Rh dGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzkxNDcjc2VjdGlvbi00CiAqLwojZGVmaW5l IERUTFNfUkVDT1JEX0xBWUVSX0hFQURFUl9MRU4gMTMKCi8qKgogKiBUaGUgRFRMUyB2ZXJzaW9u IG51bWJlciwgd2hpY2ggaXMgMHhmZWZmIGZvciBEVExTIDEuMCwgb3IgMHhmZWZkIGZvciBEVExT IDEuMi4KICogU2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjOTE0 NyNuYW1lLXRoZS1kdGxzLXJlY29yZC1sYXllcgogKi8KI2RlZmluZSBEVExTX1ZFUlNJT05fMTAg MHhmZWZmCiNkZWZpbmUgRFRMU19WRVJTSU9OXzEyIDB4ZmVmZAoKLyoqCiAqIFdoZXRoZXIgdGhl IHBhY2tldCBpcyBhIERUTFMgcGFja2V0LgogKi8Kc3RhdGljIGludCBpc19kdGxzX3BhY2tldChj aGFyICpiLCBpbnQgc2l6ZSkgewogICAgdWludDE2X3QgdmVyc2lvbiA9IEFWX1JCMTYoJmJbMV0p OwogICAgcmV0dXJuIHNpemUgPiBEVExTX1JFQ09SRF9MQVlFUl9IRUFERVJfTEVOICYmCiAgICAg ICAgYlswXSA+PSBEVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUMgJiYKICAgICAg ICAodmVyc2lvbiA9PSBEVExTX1ZFUlNJT05fMTAgfHwgdmVyc2lvbiA9PSBEVExTX1ZFUlNJT05f MTIpOwp9CmBgYAoKRml4ZWQuCgo+IAo+ID4gKyBpZiAoIWN0eC0+dWRwX3VjKSB7Cj4gPiArIGF2 X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiRFRMUzogTm8gVURQIGNvbnRleHRcbiIpOwo+IAo+IEtp bmQgb2Ygb2RkIHRoaXMgd291bGQgYmUgcG9zc2libGU/CldpbmxpbjogRWxpbWluYXRlIHRoZSBj b2RlIHRoYXQgaXMgbm90IHVzZWQuCj4gCj4gPiArIGF2X2xvZyhzMSwgQVZfTE9HX0lORk8sICJX SElQOiBEVExTIGhhbmRzaGFrZSBkb25lPSVkLCBhcnE9JWQsIHNydHBfbWF0ZXJpYWw9JWx1Qiwg Y29zdD0lZG1zXG4iLAo+ID4gKyBjdHgtPmR0bHNfZG9uZV9mb3JfdXMsIGN0eC0+ZHRsc19hcnFf cGFja2V0cywgc2l6ZW9mKGN0eC0+ZHRsc19zcnRwX21hdGVyaWFsKSwKPiA+ICsgKGludCkoYXZf Z2V0dGltZSgpIC0gc3RhcnR0aW1lKSAvIDEwMDApOwo+IAo+IEJpdCB2ZXJib3NlIChoZXJlIGFu ZCBvdGhlciB1c2VzIG9mIElORk8pPwo+IAo+IFdoeSBhcmUgd2UgbG9nZ2luZyB0aGUgY29zdC90 aW1lIGRpZmY/Cj4gCj4gQWxzbyB3ZSBkbyBub3QgdXNlICVsdSwgSSB0aGluay4KV2lubGluOiBJ IGhhdmUgYWx0ZXJlZCBhbGwgbG9nIGxldmVscyBmcm9tIElORk8gdG8gVkVSQk9TRSwgZXhjZXB0 IGZvciB0aGUgZmluYWwgb25lLCB3aGljaCBnYXRoZXJzIHRoZSB0aW1lIGNvc3QgZm9yIGVhY2gg c3RlcC4gU2luY2UgdGhlcmUgYXJlIG51bWVyb3VzIHN0ZXBzIHRoYXQgbWF5IGNvbnN1bWUgYSBz aWduaWZpY2FudCBhbW91bnQgb2YgdGltZSwgcG90ZW50aWFsbHkgY2F1c2luZyBhIHNsb3cgaGFu ZHNoYWtlLCBpdCBpcyBjcnVjaWFsIHRvIHRyYWNrIGFuZCBvcHRpbWl6ZSB0aGVtLiBGb3IgaW5z dGFuY2UsIHRoZSBmb2xsb3dpbmcgbG9nIGRpc3BsYXlzIGEgdG90YWwgY29zdCBvZiA0N21zOgoK YGBgdGV4dApXSElQOiBNdXhlciBzdGF0ZT0xMCwgYnVmZmVyX3NpemU9NDA5NiwgbWF4X3BhY2tl dF9zaXplPTExODQsCmVsYXBzZWQ9NDdtcyhpbml0Ojcsb2ZmZXI6MCxhbnN3ZXI6Nyx1ZHA6MCxp Y2U6NixkdGxzOjI1LHNydHA6MCkKYGBgCj4gCj4gCj4gPiArIC8qIFRoZSBTUFMvUFBTIG9mIEFW QyB2aWRlbyAqLwo+ID4gKyB1aW50OF90ICphdmNfc3BzOwo+ID4gKyBpbnQgYXZjX3Nwc19zaXpl Owo+ID4gKyB1aW50OF90ICphdmNfcHBzOwo+ID4gKyBpbnQgYXZjX3Bwc19zaXplOwo+ID4gKyAv KiBUaGUgc2l6ZSBvZiBOQUxVIGluIElTT00gZm9ybWF0LiAqLwo+ID4gKyBpbnQgYXZjX25hbF9s ZW5ndGhfc2l6ZTsKPiA+ICsKPiAKPiBXaWxsIGdldCBpbnRvIHRoaXMgaW4gbXkgd2FmZmxpbmcg YXQgdGhlIGVuZC4uLgo+IAo+ID4gKyAvKiBUaGUgU1JUUCBzZW5kIGNvbnRleHQsIHRvIGVuY3J5 cHQgb3V0Z29pbmcgcGFja2V0cy4gKi8KPiA+ICsgc3RydWN0IFNSVFBDb250ZXh0IHNydHBfYXVk aW9fc2VuZDsKPiA+ICsgc3RydWN0IFNSVFBDb250ZXh0IHNydHBfdmlkZW9fc2VuZDsKPiA+ICsg c3RydWN0IFNSVFBDb250ZXh0IHNydHBfcnRjcF9zZW5kOwo+ID4gKyAvKiBUaGUgU1JUUCByZWNl aXZlIGNvbnRleHQsIHRvIGRlY3J5cHQgaW5jb21pbmcgcGFja2V0cy4gKi8KPiA+ICsgc3RydWN0 IFNSVFBDb250ZXh0IHNydHBfcmVjdjsKPiAKPiBOb3QgdHlwZWRlZmVkPwpXaW5saW46IEkgaGF2 ZSBhbHRlcmVkIGFsbCBsb2cgbGV2ZWxzIGZyb20gSU5GTyB0byBWRVJCT1NFLCBleGNlcHQgZm9y IHRoZSBmaW5hbCBvbmUsIHdoaWNoIGdhdGhlcnMgdGhlIHRpbWUgY29zdCBmb3IgZWFjaCBzdGVw LiBTaW5jZSB0aGVyZSBhcmUgbnVtZXJvdXMgc3RlcHMgdGhhdCBtYXkgY29uc3VtZSBhIHNpZ25p ZmljYW50IGFtb3VudCBvZiB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGEgc2xvdyBoYW5kc2hh a2UsIGl0IGlzIGNydWNpYWwgdG8gdHJhY2sgYW5kIG9wdGltaXplIHRoZW0uIEZvciBpbnN0YW5j ZSwgdGhlIGZvbGxvd2luZyBsb2cgZGlzcGxheXMgYSB0b3RhbCBjb3N0IG9mIDQ3bXM6CgpgYGB0 ZXh0CldISVA6IE11eGVyIHN0YXRlPTEwLCBidWZmZXJfc2l6ZT00MDk2LCBtYXhfcGFja2V0X3Np emU9MTE4NCwKZWxhcHNlZD00N21zKGluaXQ6NyxvZmZlcjowLGFuc3dlcjo3LHVkcDowLGljZTo2 LGR0bHM6MjUsc3J0cDowKQpgYGAKPiAKPiAKPiAKPiA+ICtzdGF0aWMgaW50IG9uX3J0cF93cml0 ZV9wYWNrZXQodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7Cj4gCj4g V2h5IG5vdCByZW9yZGVyIHRoZSBmaWxlIGluc3RlYWQgb2YgYSBzYW1lLWZpbGUgcHJvdG8/Cldp bmxpbjogUmVwb3NpdGlvbiB0aGUgb25fcnRwX3dyaXRlX3BhY2tldCBmdW5jdGlvbiBzbGlnaHRs eSBlYXJsaWVyIGluIHRoZSBmaWxlIHRvIHByZXZlbnQgdGhlIHNhbWUgZmlsZSBwcm90by4KCkZp eGVkLgo+IAo+IAo+IAo+ID4gKyBydGMtPmR0bHNfY3R4LmR0bHNfYXJxX21heCA9IHJ0Yy0+ZHRs c19hcnFfbWF4Owo+ID4gKyBydGMtPmR0bHNfY3R4LmR0bHNfYXJxX3RpbWVvdXQgPSBydGMtPmR0 bHNfYXJxX3RpbWVvdXQ7Cj4gPiArIHJ0Yy0+ZHRsc19jdHgucGt0X3NpemUgPSBydGMtPnBrdF9z aXplOwo+IAo+IFdoeSBhcmUgdGhlc2UgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIHRoZSBzdHJ1Y3Qg cG9pbnRlciBlbWJlZGRlZD8KV2lubGluOiBFbGltaW5hdGUgdGhlIGR0bHNfYXJxX21heCBhcyBp dCdzIG5vdCB1c2VkLiBJbnRyb2R1Y2UgYSBuZXcgZmllbGQgY2FsbGVkIG10dSBpbiB0aGUgRFRM U0NvbnRleHQgc3RydWN0dXJlLiBUaGUgbXR1IGlzIGdlbmVyYWxseSBlcXVpdmFsZW50IHRvIHBr dF9zaXplLCBidXQgc2luY2UgcGt0X3NpemUgaXMgdXRpbGl6ZWQgbm90IG9ubHkgZm9yIERUTFMg YnV0IGFsc28gZm9yIHRoZSBVRFAgcHJvdG9jb2wgYW5kIFNSVFAgcGFja2V0IHJlc3RyaWN0aW9u cywgaXQgd2lsbCBiZSByZXRhaW5lZCBpbiB0aGUgUlRDQ29udGV4dCBzdHJ1Y3R1cmUgYW5kIHBh c3NlZCB0byB0aGUgRFRMU0NvbnRleHQuCgpgYGBjCnR5cGVkZWYgc3RydWN0IFJUQ0NvbnRleHQg ewogICAgaW50IHBrdF9zaXplOwp9IFJUQ0NvbnRleHQ7Cgp0eXBlZGVmIHN0cnVjdCBEVExTQ29u dGV4dCB7CiAgICBpbnQgbXR1Owp9IERUTFNDb250ZXh0OwoKc3RhdGljIGF2X2NvbGQgaW50IHdo aXBfaW5pdChBVkZvcm1hdENvbnRleHQgKnMpCiAgICBSVENDb250ZXh0ICpydGMgPSBzLT5wcml2 X2RhdGE7CiAgICBydGMtPmR0bHNfY3R4Lm10dSA9IHJ0Yy0+cGt0X3NpemU7CmBgYAoKRml4ZWQu Cj4gCj4gCj4gCj4gCj4gCj4gPiArc3RhdGljIGludCBpc29tX3JlYWRfYXZjYyhBVkZvcm1hdENv bnRleHQgKnMsIHVpbnQ4X3QgKmV4dHJhZGF0YSwgaW50IGV4dHJhZGF0YV9zaXplKQo+IAo+IEFT IEtpZXJhbiBub3RlZCwgZHVwbGljYXRlZCBjb2RlLgo+ID4gKy8qKgo+ID4gKyAqIEdlbmVyYXRl IFNEUCBvZmZlciBhY2NvcmRpbmcgdG8gdGhlIGNvZGVjIHBhcmFtZXRlcnMsIERUTFMgYW5kIElD RSBpbmZvcm1hdGlvbi4KPiA+ICsgKiBUaGUgYmVsb3cgaXMgYW4gZXhhbXBsZSBvZiBTRFAgb2Zm ZXI6Cj4gCj4gVGhpcyBjb21tZW50IGFuZCBmdW5jdGlvbiBuZWVkIHNvbWUgc2VyaW91cyB3b3Jr Ogo+ICogVGhlIGV4YW1wbGUgYW5kIGNvbW1lbnQgZXhwbGFpbiBleGFjdGx5IG5vdGhpbmcgYWJv dXQgdGhlIFNEUCB0ZXh0IGJlaW5nIGdlbmVyYXRlZC4gSXQKPiBpcyBhbiBvcGFxdWUgYmxvYi4K PiAqIEl0IGlzIGlsbGVnYWwgU0RQLgo+ICogV2UgYWxyZWFkeSBoYXZlIFNEUCBmYWNpbHRpZXMg eW91IHNob3VsZCB1c2UuCldpbmxpbjogRHVwIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9vc3Nycy9m Zm1wZWctd2VicnRjL2Rpc2N1c3Npb25zLzUjZGlzY3Vzc2lvbmNvbW1lbnQtNjA5NjIwMgo+IAo+ IAo+ID4gKyBzbnByaW50ZihydGMtPmljZV91ZnJhZ19sb2NhbCwgc2l6ZW9mKHJ0Yy0+aWNlX3Vm cmFnX2xvY2FsKSwgIiUwOHgiLAo+ID4gKyBhdl9nZXRfcmFuZG9tX3NlZWQoKSk7Cj4gPiArIHNu cHJpbnRmKHJ0Yy0+aWNlX3B3ZF9sb2NhbCwgc2l6ZW9mKHJ0Yy0+aWNlX3B3ZF9sb2NhbCksICIl MDh4JTA4eCUwOHglMDh4IiwKPiA+ICsgYXZfZ2V0X3JhbmRvbV9zZWVkKCksIGF2X2dldF9yYW5k b21fc2VlZCgpLCBhdl9nZXRfcmFuZG9tX3NlZWQoKSwKPiA+ICsgYXZfZ2V0X3JhbmRvbV9zZWVk KCkpOwo+IAo+IFVzZSB0aGUgUFJORy4uLiBjYWxsaW5nIGF2X2dldF9yYW5kb21fc2VlZCA1IHRp bWVzIGlzIGEgYml0IHdoYWNrLgo+IAo+IEFsc28sIGlzIGl0IGxpbWl0ZWQgdG8gaGV4IGNoYXJh Y3RlcnM/CldpbmxpbjogRHVwIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9vc3Nycy9mZm1wZWctd2Vi cnRjL2Rpc2N1c3Npb25zLzUjZGlzY3Vzc2lvbmNvbW1lbnQtNjA5NjIwMgo+IAo+ID4gKyBydGMt PmF1ZGlvX3NzcmMgPSBhdl9nZXRfcmFuZG9tX3NlZWQoKTsKPiA+ICsgcnRjLT52aWRlb19zc3Jj ID0gYXZfZ2V0X3JhbmRvbV9zZWVkKCk7Cj4gCj4gU2FtZSBhcyBhYm92ZS4KPiAKPiA+ICsgcnRj LT5hdWRpb19wYXlsb2FkX3R5cGUgPSAxMTE7Cj4gPiArIHJ0Yy0+dmlkZW9fcGF5bG9hZF90eXBl ID0gMTA2Owo+IAo+IE1hZ2ljIG51bWJlcnMuIEkgYXNzdW1lIHRoaXMgaXMgSC4yNjQgYW5kIE9w dXM/IERvIG5vdCBoYXJjb2RlLgpXaW5saW46IFJlcGxhY2UgYnkgbWFjcm9zLgoKYGBgYwovKiBS ZWZlcnJpbmcgdG8gQ2hyb21lJ3MgZGVmaW5pdGlvbiBvZiBSVFAgcGF5bG9hZCB0eXBlcy4gKi8K I2RlZmluZSBSVENfUlRQX1BBWUxPQURfVFlQRV9IMjY0IDEwNgojZGVmaW5lIFJUQ19SVFBfUEFZ TE9BRF9UWVBFX09QVVMgMTExCmBgYAo+IAo+IAo+IAo+ID4gKwo+ID4gKyBhdl9icHJpbnRmKCZi cCwgIiIKPiA+ICsgInY9MFxyXG4iCj4gPiArICJvPUZGbXBlZyA0NDg5MDQ1MTQxNjkyNzk5MzU5 IDIgSU4gSVA0IDEyNy4wLjAuMVxyXG4iCj4gCj4gSGFyZGNvZGluZyAxMjcuMC4wLjE/Cj4gCj4g NDQ4OTA0NTE0MTY5Mjc5OTM1OT8KV2lubGluOiBJbiB0aGUgY2FzZSBvZiBJQ0UtTElURSwgdGhl c2UgZmllbGRzIGFyZSBub3QgdXNlZDsgaW5zdGVhZCwgdGhleSBhcmUgZGVmaW5lZCBhcyBjb25z dGFudCB2YWx1ZXMuCgpgYGBjCi8qKgogKiBJbiB0aGUgY2FzZSBvZiBJQ0UtTElURSwgdGhlc2Ug ZmllbGRzIGFyZSBub3QgdXNlZDsgaW5zdGVhZCwgdGhleSBhcmUgZGVmaW5lZAogKiBhcyBjb25z dGFudCB2YWx1ZXMuCiAqLwojZGVmaW5lIFJUQ19TRFBfU0VTU0lPTl9JRCAiNDQ4OTA0NTE0MTY5 Mjc5OTM1OSIKI2RlZmluZSBSVENfU0RQX0NSRUFUT1JfSVAgIjEyNy4wLjAuMSIKYGBgCgo+IAo+ ID4gKyBpZiAocnRjLT52aWRlb19wYXIpIHsKPiA+ICsgcHJvZmlsZSA9IHJ0Yy0+dmlkZW9fcGFy LT5wcm9maWxlIDwgMCA/IDB4NDIgOiBydGMtPnZpZGVvX3Bhci0+cHJvZmlsZTsKPiA+ICsgbGV2 ZWwgPSBydGMtPnZpZGVvX3Bhci0+bGV2ZWwgPCAwID8gMzAgOiBydGMtPnZpZGVvX3Bhci0+bGV2 ZWw7Cj4gPiArIHByb2ZpbGVfaW9wID0gcHJvZmlsZSAmIEZGX1BST0ZJTEVfSDI2NF9DT05TVFJB SU5FRDsKPiAKPiBEbyBub3QgaGFyZGNvZGUgSDI2NC4KV2lubGluOiBGaXhlZC4KPiAKPiA+ICsg YXZfYnByaW50ZigmYnAsICIiCj4gPiArICJtPXZpZGVvIDkgVURQL1RMUy9SVFAvU0FWUEYgJXVc clxuIgo+ID4gKyAiYz1JTiBJUDQgMC4wLjAuMFxyXG4iCj4gPiArICJhPWljZS11ZnJhZzolc1xy XG4iCj4gPiArICJhPWljZS1wd2Q6JXNcclxuIgo+ID4gKyAiYT1maW5nZXJwcmludDpzaGEtMjU2 ICVzXHJcbiIKPiA+ICsgImE9c2V0dXA6YWN0aXZlXHJcbiIKPiA+ICsgImE9bWlkOjFcclxuIgo+ ID4gKyAiYT1zZW5kb25seVxyXG4iCj4gPiArICJhPW1zaWQ6RkZtcGVnIHZpZGVvXHJcbiIKPiA+ ICsgImE9cnRjcC1tdXhcclxuIgo+ID4gKyAiYT1ydGNwLXJzaXplXHJcbiIKPiA+ICsgImE9cnRw bWFwOiV1IEgyNjQvOTAwMDBcclxuIgo+IAo+IFNhbWUuCj4gCj4gPiArICJhPWZtdHA6JXUgbGV2 ZWwtYXN5bW1ldHJ5LWFsbG93ZWQ9MTtwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVs LWlkPSUwMnglMDJ4JTAyeFxyXG4iCj4gCj4gU2FtZS4KPiAKPiA+ICsgImE9c3NyYzoldSBjbmFt ZTpGRm1wZWdcclxuIgo+ID4gKyAiYT1zc3JjOiV1IG1zaWQ6RkZtcGVnIHZpZGVvXHJcbiIsCj4g PiArIHJ0Yy0+dmlkZW9fcGF5bG9hZF90eXBlLAo+ID4gKyBydGMtPmljZV91ZnJhZ19sb2NhbCwK PiA+ICsgcnRjLT5pY2VfcHdkX2xvY2FsLAo+ID4gKyBydGMtPmR0bHNfY3R4LmR0bHNfZmluZ2Vy cHJpbnQsCj4gPiArIHJ0Yy0+dmlkZW9fcGF5bG9hZF90eXBlLAo+ID4gKyBydGMtPnZpZGVvX3Bh eWxvYWRfdHlwZSwKPiA+ICsgcHJvZmlsZSAmICh+RkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVE KSwKPiAKPiBTYW1lLgo+IAo+ID4gKyAqIEV4Y2hhbmdlIFNEUCBvZmZlciB3aXRoIFdlYlJUQyBw ZWVyIHRvIGdldCB0aGUgYW5zd2VyLgo+ID4gKyAqIFRoZSBiZWxvdyBpcyBhbiBleGFtcGxlIG9m IFNEUCBhbnN3ZXI6Cj4gCj4gU2FtZSBjb21tZW50IGFzIG15IGJlZm9yZTogVGhpcyBpcyBhbiBv cGFxdWUgYmxvYi4gCj4gCj4gPiArLyoqCj4gPiArICogUGFyc2VzIHRoZSBJQ0UgdWZyYWcsIHB3 ZCwgYW5kIGNhbmRpZGF0ZXMgZnJvbSB0aGUgU0RQIGFuc3dlci4KPiAKPiBXZSBoYXZlIFNEUCBm YWNpbGl0aWVzIGFscmVhZHkuCldpbmxpbjogSSBoYXZlIGV4cGVyaW1lbnRlZCB3aXRoIHRoZSBT RFAgZnVuY3Rpb25hbGl0eSBpbiBGRm1wZWcgYnkgdXRpbGl6aW5nIHRoZSBhdl9zZHBfY3JlYXRl IGZ1bmN0aW9uLiBJIGRpc2NvdmVyZWQgdGhhdCB0aGUgU0RQIGdlbmVyYXRlZCBieSBhdl9zZHBf Y3JlYXRlIGlzIHRhaWxvcmVkIGZvciBSVFNQLCB3aGljaCBzaWduaWZpY2FudGx5IGRpZmZlcnMg ZnJvbSBXZWJSVEMuIEJlbG93IGlzIGEgY29tcGFyaXNvbiBvZiB0aGUgdGVzdCBjb2RlIGFuZCB0 aGUgU0RQLgoKYGBgYwogICAgaW50IGk7CiAgICBjaGFyIHVybFtNQVhfVVJMX1NJWkVdOwogICAg Y2hhciBzZHBbTUFYX1NEUF9TSVpFXTsKICAgIEFWRm9ybWF0Q29udGV4dCBzZHBfY3R4LCAqY3R4 X2FycmF5WzFdOwogICAgc2RwX2N0eCA9ICpzOwogICAgc2RwX2N0eC51cmwgPSB1cmw7CiAgICBm b3IgKGkgPSAwOyBpIDwgc2RwX2N0eC5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAvKiBFeGNs dWRlIHRoZSBzdHJlYW0ncyBiaXRyYXRlIGluZm9ybWF0aW9uIHRvIHByZXZlbnQgd3JpdGluZyBh IGxpbmUgaW4gdGhlIFNEUCBsaWtlIGI9QVM6OTYuICovCiAgICAgICAgc2RwX2N0eC5zdHJlYW1z W2ldLT5jb2RlY3Bhci0+Yml0X3JhdGUgPSAwOwogICAgICAgIC8qIERvIG5vdCB3cml0ZSBhIHNw cm9wLXN0ZXJlbz0xIGxpbmUuICovCiAgICAgICAgaWYgKHNkcF9jdHguc3RyZWFtc1tpXS0+Y29k ZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpCiAgICAgICAgICAgIHNkcF9jdHgu c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNoX2xheW91dC5uYl9jaGFubmVscyA9IDE7CiAgICB9CiAg ICBmZl91cmxfam9pbih1cmwsIHNpemVvZih1cmwpLCAicnRwIiwgTlVMTCwgIjAuMC4wLjAiLCA5 LCBOVUxMKTsKICAgIGN0eF9hcnJheVswXSA9ICZzZHBfY3R4OwogICAgaWYgKGF2X3NkcF9jcmVh dGUoY3R4X2FycmF5LCAxLCBzZHAsIE1BWF9TRFBfU0laRSkpIHsKICAgICAgICBhdl9mcmVlKHNk cCk7CiAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICB9CiAgICBhdl9sb2co cywgQVZfTE9HX0lORk8sICJTRFA6XG4lc1xuIiwgc2RwKTsKYGBgCgpCZWxvdyBpcyB0aGUgU0RQ IHByb2R1Y2VkIGJ5IGF2X3NkcF9jcmVhdGUgZm9yIFJUU1AuCgpgYGBzZHAKdj0wCm89LSAwIDAg SU4gSVA0IDEyNy4wLjAuMQpzPU5vIE5hbWUKYz1JTiBJUDQgMC4wLjAuMAp0PTAgMAphPXRvb2w6 bGliYXZmb3JtYXQgNjAuNS4xMDAKbT12aWRlbyA5IFJUUC9BVlAgOTYKYT1ydHBtYXA6OTYgSDI2 NC85MDAwMAphPWZtdHA6OTYgcGFja2V0aXphdGlvbi1tb2RlPTE7IHNwcm9wLXBhcmFtZXRlci1z ZXRzPVowTEFIdGtBd0Ntd0VRQUFBd0FCQUFBREFESVBGaTVJLGFNdUR5eUE9OyBwcm9maWxlLWxl dmVsLWlkPTQyQzAxRQptPWF1ZGlvIDExIFJUUC9BVlAgOTcKYT1ydHBtYXA6OTcgb3B1cy80ODAw MC8yCmBgYAoKQmVsb3cgaXMgdGhlIFNEUCBwcm9kdWNlZCBieSBXSElQIG11eGVyIGZvciBXZWJS VEMuCgpgYGBzZHAKdj0wCm89RkZtcGVnIDQ0ODkwNDUxNDE2OTI3OTkzNTkgMiBJTiBJUDQgMTI3 LjAuMC4xCnM9RkZtcGVnUHVibGlzaFNlc3Npb24KdD0wIDAKYT1ncm91cDpCVU5ETEUgMCAxCmE9 ZXh0bWFwLWFsbG93LW1peGVkCmE9bXNpZC1zZW1hbnRpYzogV01TCm09YXVkaW8gOSBVRFAvVExT L1JUUC9TQVZQRiAxMTEKYz1JTiBJUDQgMC4wLjAuMAphPWljZS11ZnJhZzpmMDdhMTE5NQphPWlj ZS1wd2Q6NWM0YjNmZTNhN2ZmZWQ5MjYyYzcxMmZkYzc3ZmUyMzIKYT1maW5nZXJwcmludDpzaGEt MjU2IENEOkVFOkNFOjQ1OjRDOkQ3OjNDOjU3OjdCOjc5OjM4OjdGOjgzOjNFOjNEOjJGOjNFOjM4 OjkyOjg3OkVDOjU3OjRDOjZEOjIxOjI2Ojk3OkI4OkZBOjU4OkVDOkUxCmE9c2V0dXA6cGFzc2l2 ZQphPW1pZDowCmE9c2VuZG9ubHkKYT1tc2lkOkZGbXBlZyBhdWRpbwphPXJ0Y3AtbXV4CmE9cnRw bWFwOjExMSBvcHVzLzQ4MDAwLzEKYT1zc3JjOjM1OTE5MTk2OTcgY25hbWU6RkZtcGVnCmE9c3Ny YzozNTkxOTE5Njk3IG1zaWQ6RkZtcGVnIGF1ZGlvCm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQ RiAxMDYKYz1JTiBJUDQgMC4wLjAuMAphPWljZS11ZnJhZzpmMDdhMTE5NQphPWljZS1wd2Q6NWM0 YjNmZTNhN2ZmZWQ5MjYyYzcxMmZkYzc3ZmUyMzIKYT1maW5nZXJwcmludDpzaGEtMjU2IENEOkVF OkNFOjQ1OjRDOkQ3OjNDOjU3OjdCOjc5OjM4OjdGOjgzOjNFOjNEOjJGOjNFOjM4OjkyOjg3OkVD OjU3OjRDOjZEOjIxOjI2Ojk3OkI4OkZBOjU4OkVDOkUxCmE9c2V0dXA6cGFzc2l2ZQphPW1pZDox CmE9c2VuZG9ubHkKYT1tc2lkOkZGbXBlZyB2aWRlbwphPXJ0Y3AtbXV4CmE9cnRjcC1yc2l6ZQph PXJ0cG1hcDoxMDYgSDI2NC85MDAwMAphPWZtdHA6MTA2IGxldmVsLWFzeW1tZXRyeS1hbGxvd2Vk PTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MjAwMWUKYT1zc3JjOjEz MDA2MDkwODUgY25hbWU6RkZtcGVnCmE9c3NyYzoxMzAwNjA5MDg1IG1zaWQ6RkZtcGVnIHZpZGVv CmBgYAoKVGhlIHByaW1hcnkgZGlzdGluY3Rpb24gaXMgb3V0bGluZWQgYmVsb3c6Cgp8IC0gfCBS VFNQIHwgV0hJUCBNdXhlciB8IERlc2NyaXB0aW9uIHwgCnwtLS18LS0tfC0tLXwtLS18CnwgY29u bmVjdGlvbiB8IGM9SU4gSVA0IDAuMC4wLjAgfCBjPUlOIElQNCAwLjAuMC4wIHwgUlRTUCB1c2Ug Z2xvYmFsIGNvbm5lY3Rpb24uIFdISVAgdXNlIGl0IGZvciBlYWNoIG0gbGluZS4gfAp8IG0gbGlu ZSB8IG09dmlkZW8gOSBSVFAvQVZQIDk2IHwgbT12aWRlbyA5IFVEUC9UTFMvUlRQL1NBVlBGIDEw NiB8IFRoZSBwcm90b2NvbHMgYXJlIGRpZmZlcmVuY2UuIHwKfCBtIGxpbmUgfCBtPWF1ZGlvIDEx IFJUUC9BVlAgOTcgfCBtPWF1ZGlvIDkgVURQL1RMUy9SVFAvU0FWUEYgMTExIHwgUlRTUCBoYXMg YSBwb3J0IDExLCB3aGlsZSBXSElQIGlnbm9yZXMgcG9ydC4gfAp8IHNzcmMgfCAtIHwgYT1zc3Jj OjM1OTE5MTk2OTcgY25hbWU6RkZtcGVnIHwgTm8gU1NSQyBpbiBSVFNQLiB8CnwgZHRscyB8IC0g fCBhPXNldHVwOnBhc3NpdmUgfCBObyBEVExTIHJvbGUgaW4gUlRTUC4gfAp8IHN0cmVhbSBpZCB8 IC0gfCBhPW1pZDoxIHwgTm8gc3RyZWFtIGlkIGluIFJUU1AuIHwKfCBkaXJlY3Rpb24gfCAtIHwg YT1zZW5kb25seSB8IE5vIHN0cmVhbSBkaXJlY3Rpb24gaW4gUlRTUC4gfAp8IHJ0Y3AgfCAtIHwg YT1ydGNwLW11eCB8IE5vIHJ0Y3AgcGFtYW1ldGVycyBpbiBSVFNQLiB8CnwgaWNlIHwgLSB8IGE9 aWNlLXVmcmFnOmYwN2ExMTk1IHwgTm8gSUNFIGNvbmZpZyBpbiBSVFNQLiB8CgpUaGUgZGlmZmVy ZW5jZSBpcyBzaWduaWZpY2FudCwgYW5kIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBpbXBy b3ZlIHRoZSBTRFAgZnVuY3Rpb25hbGl0eSBpbiB0aGUgZnV0dXJlIG9uY2UgdGhpcyBwYXRjaCBo YXMgYmVlbiBtZXJnZWQuCgpXaW5saW46IEkgYXR0ZW1wdGVkIHRvIHV0aWxpemUgYXZfc2RwX2Ny ZWF0ZSBmb3IgU0RQIGNyZWF0aW9uLCBidXQgaXQgcmVxdWlyZWQgZXh0ZW5zaXZlIG1vZGlmaWNh dGlvbiBvZiB0aGUgZXhpc3RpbmcgY29kZSwgbWFraW5nIGl0IGRpZmZpY3VsdCB0byBtYWludGFp biBkdWUgdG8gdGhlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLiBUaGVyZWZvcmUsIGl0IGlzIHJl Y29tbWVuZGVkIHRvIGltcHJvdmUgdGhpcyBhcHByb2FjaCBpbiB0aGUgZnV0dXJlLiBTZWUgW1dI SVA6IFVzZSBhdl9zZHBfY3JlYXRlIHRvIGNyZWF0ZSBTRFAuXShodHRwczovL2dpdGh1Yi5jb20v d2lubGludmlwL2ZmbXBlZy13ZWJydGMvY29tbWl0LzBmMDI1OWJmMzkyMDhhY2E3OWU5MDcwOWU0 YjdhZDQ1YTg1ZGU4MzUpIGZvciBkZXRhaWwuCj4gCj4gCj4gCj4gPiArIC8qIFdyaXRlIDIwIGJ5 dGVzIGhlYWRlciAqLwo+ID4gKyBhdmlvX3diMTYocGIsIDB4MDAwMSk7IC8qIFNUVU4gYmluZGlu ZyByZXF1ZXN0ICovCj4gPiArIGF2aW9fd2IxNihwYiwgMCk7IC8qIGxlbmd0aCAqLwo+ID4gKyBh dmlvX3diMzIocGIsIFNUVU5fTUFHSUNfQ09PS0lFKTsgLyogbWFnaWMgY29va2llICovCj4gPiAr IGF2aW9fd2IzMihwYiwgYXZfZ2V0X3JhbmRvbV9zZWVkKCkpOyAvKiB0cmFuc2FjdGlvbiBJRCAq Lwo+ID4gKyBhdmlvX3diMzIocGIsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsgLyogdHJhbnNhY3Rp b24gSUQgKi8KPiA+ICsgYXZpb193YjMyKHBiLCBhdl9nZXRfcmFuZG9tX3NlZWQoKSk7IC8qIHRy YW5zYWN0aW9uIElEICovCj4gCj4gVXNlIHRoZSBQUk5HLgpXaW5saW46IER1cCB0byBodHRwczov L2dpdGh1Yi5jb20vb3NzcnMvZmZtcGVnLXdlYnJ0Yy9kaXNjdXNzaW9ucy81I2Rpc2N1c3Npb25j b21tZW50LTYwOTYxNzMKPiA+ICsgYXZfb3B0X3NldChydGMtPnVkcF91Yy0+cHJpdl9kYXRhLCAi Y29ubmVjdCIsICIxIiwgMCk7Cj4gPiArIGF2X29wdF9zZXQocnRjLT51ZHBfdWMtPnByaXZfZGF0 YSwgImZpZm9fc2l6ZSIsICIwIiwgMCk7Cj4gPiArIC8qIFNldCB0aGUgbWF4IHBhY2tldCBzaXpl IHRvIHRoZSBidWZmZXIgc2l6ZS4gKi8KPiA+ICsgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwg IiVkIiwgcnRjLT5wa3Rfc2l6ZSk7Cj4gPiArIGF2X29wdF9zZXQocnRjLT51ZHBfdWMtPnByaXZf ZGF0YSwgInBrdF9zaXplIiwgdG1wLCAwKTsKPiAKPiBUaGlzIGlzIGFzIGdvb2Qgb2YgYSBwbGFj ZSBhcyBhbnkgdG8gYXNrOiBEbyB3ZSBwbGFuIHRvIGhhbmRsZSBwYXNzaW5nCj4gQVZPcHRpb25z IGRvd24gdG8gc3ViY29udGV4dHM/CldpbmxpbjogRml4ZWQgCj4gCj4gPiArc3RhdGljIGludCBz ZXR1cF9zcnRwKEFWRm9ybWF0Q29udGV4dCAqcykKPiAKPiA+ICsgY29uc3QgY2hhciogc3VpdGUg PSAiQUVTX0NNXzEyOF9ITUFDX1NIQTFfODAiOwo+IAo+IFNvdXJjZT8KPiAKPiBTYW1lIGFzIGJl Zm9yZSwgcmU6IHN1YmNvbnRleHQgQVZPcHRpb25zPwpXaW5saW46IER1cCB0byBodHRwczovL2dp dGh1Yi5jb20vb3NzcnMvZmZtcGVnLXdlYnJ0Yy9kaXNjdXNzaW9ucy81I2Rpc2N1c3Npb25jb21t ZW50LTYwOTYxODIKCkZpeGVkLgo+IAo+IAo+ID4gKyAvKiBJZ25vcmUgaWYgbm90IFJUUCBvciBS VENQIHBhY2tldC4gKi8KPiA+ICsgaWYgKGJ1Zl9zaXplIDwgMTIgfHwgKGJ1ZlswXSAmIDB4QzAp ICE9IDB4ODApCj4gPiArIHJldHVybiAwOwo+ID4gKwo+ID4gKyAvKiBPbmx5IHN1cHBvcnQgYXVk aW8sIHZpZGVvIGFuZCBydGNwLiAqLwo+ID4gKyBpc19ydGNwID0gYnVmWzFdID49IDE5MiAmJiBi dWZbMV0gPD0gMjIzOwo+IAo+IE1hZ2ljIG51bWJlcnMuCldpbmxpbjogUmVwbGFjZSB0aGUgbWFn aWMgbnVtYmVyIHdpdGggYSBtYWNybyBmb3IgYm90aCBSVFAgYW5kIFJUQ1AgcGF5bG9hZCB0eXBl cy4KCmBgYGMKLyoqCiAqIEZvciBSVENQLCBQVCBpcyBbMTI4LCAyMjNdIChvciB3aXRob3V0IG1h cmtlciBbMCwgOTVdKS4gTGl0ZXJhbGx5LCBSVENQIHN0YXJ0cwogKiBmcm9tIDY0IG5vdCAwLCBz byBQVCBpcyBbMTkyLCAyMjNdIChvciB3aXRob3V0IG1hcmtlciBbNjQsIDk1XSksIHNlZSAiUlRD UCBDb250cm9sCiAqIFBhY2tldCBUeXBlcyAoUFQpIiBhdAogKiBodHRwczovL3d3dy5pYW5hLm9y Zy9hc3NpZ25tZW50cy9ydHAtcGFyYW1ldGVycy9ydHAtcGFyYW1ldGVycy54aHRtbCNydHAtcGFy YW1ldGVycy00CiAqCiAqIEZvciBSVFAsIHRoZSBQVCBpcyBbOTYsIDEyN10sIG9yIFsyMjQsIDI1 NV0gd2l0aCBtYXJrZXIuIFNlZSAiUlRQIFBheWxvYWQgVHlwZXMgKFBUKQogKiBmb3Igc3RhbmRh cmQgYXVkaW8gYW5kIHZpZGVvIGVuY29kaW5ncyIgYXQKICogaHR0cHM6Ly93d3cuaWFuYS5vcmcv YXNzaWdubWVudHMvcnRwLXBhcmFtZXRlcnMvcnRwLXBhcmFtZXRlcnMueGh0bWwjcnRwLXBhcmFt ZXRlcnMtMQogKi8KI2RlZmluZSBSVENfUlRDUF9QVF9TVEFSVCAxOTIKI2RlZmluZSBSVENfUlRD UF9QVF9FTkQgICAyMjMKYGBgCgpGaXhlZC4KPiAKPiA+ICsgLyoqCj4gPiArICogRm9yIHZpZGVv LCB0aGUgU1RBUC1BIHdpdGggU1BTL1BQUyBzaG91bGQ6Cj4gPiArICogMS4gVGhlIG1hcmtlciBi aXQgc2hvdWxkIGJlIDAsIG5ldmVyIGJlIDEuCj4gPiArICogMi4gVGhlIE5SSSBzaG91bGQgZXF1 YWwgdG8gdGhlIGZpcnN0IE5BTFUncy4KPiA+ICsgKi8KPiA+ICsgaWYgKGlzX3ZpZGVvICYmIGJ1 Zl9zaXplID4gMTIpIHsKPiA+ICsgbmFsdV9oZWFkZXIgPSBidWZbMTJdICYgMHgxZjsKPiA+ICsg aWYgKG5hbHVfaGVhZGVyID09IE5BTFVfVFlQRV9TVEFQX0EpIHsKPiA+ICsgLyogUmVzZXQgdGhl IG1hcmtlciBiaXQgdG8gMC4gKi8KPiA+ICsgaWYgKGJ1ZlsxXSAmIDB4ODApCj4gPiArIGJ1Zlsx XSAmPSAweDdmOwo+ID4gKwo+ID4gKyAvKiBSZXNldCB0aGUgTlJJIHRvIHRoZSBmaXJzdCBOQUxV J3MgTlJJLiAqLwo+ID4gKyBpZiAoYnVmX3NpemUgPiAxNSAmJiAoYnVmWzE1XSYweDYwKSAhPSAo YnVmWzEyXSYweDYwKSkKPiA+ICsgYnVmWzEyXSA9IChidWZbMTJdJjB4ODApIHwgKGJ1ZlsxNV0m MHg2MCkgfCAoYnVmWzEyXSYweDFmKTsKPiA+ICsgfQo+ID4gKyB9Cj4gCj4gVGhpcyBzZWVtcyBo YXJkY29kZWQgdG8gSC4yNjQuCldpbmxpbjogRHVwIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9vc3Ny cy9mZm1wZWctd2VicnRjL2Rpc2N1c3Npb25zLzUjZGlzY3Vzc2lvbmNvbW1lbnQtNjA5NjE1NwoK Rml4ZWQuCj4gCj4gCj4gPiArLyoqCj4gPiArICogSW5zZXJ0cyB0aGUgU1BTL1BQUyBkYXRhIGJl Zm9yZSBlYWNoIElEUiAoSW5zdGFudGFuZW91cyBEZWNvZGVyIFJlZnJlc2gpIGZyYW1lLgo+ID4g KyAqCj4gPiArICogVGhlIFNQUy9QUFMgaXMgcGFyc2VkIGZyb20gdGhlIGV4dHJhZGF0YS4gSWYg aXQncyBpbiBJU09NIGZvcm1hdCwgdGhlIFNQUy9QUFMgaXMKPiA+ICsgKiBtdWx0aXBsZXhlZCB0 byB0aGUgZGF0YSBmaWVsZCBvZiB0aGUgcGFja2V0LiBJZiBpdCdzIGluIGFubmV4YiBmb3JtYXQs IHRoZW4gdGhlIGVudGlyZQo+ID4gKyAqIGV4dHJhZGF0YSBpcyBzZXQgdG8gdGhlIGRhdGEgZmll bGQgb2YgdGhlIHBhY2tldC4KPiAKPiBXaHkgZG8gd2UgZG8gaXQgZGlmZmVyZW50IHdheXMgaW5z dGVhIG9mIGFsd2F5cyBtdW5naW5nIGl0IGludG8gdGhlIHNhbWUgd2F5Pwo+IAo+IEFsc28sIGRv IHdlIGhhdmUgYSBCU0YgZm9yIHRoaXM/CldpbmxpbjogSXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0 aGUgc2l0dWF0aW9uLiBXaGVuIGNvcHlpbmcsIHRoZSBwYWNrZXQgaXMgaW4gdGhlIE1QNC9JU09N IGZvcm1hdC4gSW4gdGhpcyBjYXNlLCB1c2UgdGhlIGgyNjRfbXA0dG9hbm5leGIgQlNGIGFuZCBl bGltaW5hdGUgdGhpcyBmdW5jdGlvbi4gSG93ZXZlciwgd2hlbiBlbmNvZGluZywgdGhlIHBhY2tl dCBpcyBpbiB0aGUgQU5ORVhCIGZvcm1hdCwgYW5kIGl0IGJlY29tZXMgZXNzZW50aWFsIHRvIG1h bnVhbGx5IGluc2VydCBlbmNvZGVyIG1ldGFkYXRhIGJlZm9yZSBlYWNoIElEUiB3aGlsZSBoYW5k bGluZyBhbm5leGIgZm9ybWF0IHBhY2tldHMuCgojIyBJU09NCgpXaGVuIHRyYW5zY29kaW5nIHRo ZW4gY29weWluZywgdGhlIHBhY2tldCBpcyBpbiB0aGUgTVA0L0lTT00gZm9ybWF0LgoKYGBgYmFz aAp+L2dpdC9GRm1wZWcvZmZtcGVnX2cgLXJlIC1pIH4vZ2l0L3Nycy90cnVuay9kb2Mvc291cmNl LmZsdiBcCiAgICAtdmNvZGVjIGxpYngyNjQgLXByb2ZpbGU6diBiYXNlbGluZSAtciAyNSAtZyA1 MCAtYWNvZGVjIGxpYm9wdXMgLWFyIDQ4MDAwIC1hYyAyIFwKICAgIC15IHQubXA0Cgp+L2dpdC9G Rm1wZWcvZmZtcGVnX2cgLXJlIC1pIHQubXA0IFwKICAgIC1mIHJ0YyAiaHR0cDovL2xvY2FsaG9z dDoxOTg1L3J0Yy92MS93aGlwLz9hcHA9bGl2ZSZzdHJlYW09bGl2ZXN0cmVhbSIKYGBgCgpVdGls aXplIHRoZSBoMjY0X21wNHRvYW5uZXhiIEJTRiBhbmQgcmVtb3ZlIHRoaXMgZnVuY3Rpb24uCgpg YGBjCmNvbnN0IEZGT3V0cHV0Rm9ybWF0IGZmX3J0Y19tdXhlciA9IHsKICAgIC5wLm5hbWUgICAg ICAgICAgICAgPSAicnRjIiwKICAgIC8qKgogICAgICogQXZvaWQgdXNpbmcgQVZGTVRfR0xPQkFM SEVBREVSLCBmb3IgYW5uZXhiIGZvcm1hdCwgaXQncyBuZWNlc3NhcnkgZm9yIHRoZQogICAgICog ZW5jb2RlciB0byBpbnNlcnQgbWV0YWRhdGEgaGVhZGVycyAoZS5nLiwgU1BTL1BQUyBmb3IgSC4y NjQpIGJlZm9yZSBlYWNoCiAgICAgKiBJRFIgZnJhbWUuCiAgICAgKi8KICAgIC5wLmZsYWdzICAg ICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCiAgICAuY2hlY2tfYml0c3RyZWFtICAgID0gcnRjX2No ZWNrX2JpdHN0cmVhbSwKCnN0YXRpYyBpbnQgcnRjX2NoZWNrX2JpdHN0cmVhbShBVkZvcm1hdENv bnRleHQgKnMsIEFWU3RyZWFtICpzdCwgY29uc3QgQVZQYWNrZXQgKnBrdCkgewogICAgaWYgKHN0 LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewogICAgICAgIGlmIChw a3QtPnNpemUgPj0gNSAmJiBBVl9SQjMyKHBrdC0+ZGF0YSkgIT0gMHgwMDAwMDAxICYmCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKEFWX1JCMjQocGt0LT5kYXRhKSAhPSAweDAwMDAwMSB8 fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFf c2l6ZSA+IDAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ ZXh0cmFkYXRhWzBdID09IDEpKSkKICAgICAgICAgICAgcmV0ID0gZmZfc3RyZWFtX2FkZF9iaXRz dHJlYW1fZmlsdGVyKHN0LCAiaDI2NF9tcDR0b2FubmV4YiIsIE5VTEwpOwpgYGAKCkZpeGVkIGJ5 IGh0dHBzOi8vZ2l0aHViLmNvbS93aW5saW52aXAvZmZtcGVnLXdlYnJ0Yy9jb21taXQvNjU5OGZm Y2U2NjlhNDAzY2MzOWZiNzM5NDg1NDg0OGI1MTNhMzY4MwoKS2VlcCBpbiBtaW5kIHRoYXQgaWYg dGhlIHBhY2tldCBpcyBhbHJlYWR5IGluIGFubmV4YiBmb3JtYXQsIHRoaXMgQlNGIHdpbGwgYnlw YXNzIHRoZSBwYWNrZXQ6CgpgYGBjCnN0YXRpYyBpbnQgaDI2NF9tcDR0b2FubmV4Yl9pbml0KEFW QlNGQ29udGV4dCAqY3R4KQogICAgaWYgKCFleHRyYV9zaXplICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgIChleHRyYV9zaXplID49IDMgJiYg QVZfUkIyNChjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhKSA9PSAxKSB8fAogICAgICAgIChleHRyYV9z aXplID49IDQgJiYgQVZfUkIzMihjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhKSA9PSAxKSkgewogICAg ICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAogICAgICAgICAgICAgICAiVGhlIGlucHV0 IGxvb2tzIGxpa2UgaXQgaXMgQW5uZXggQiBhbHJlYWR5XG4iKTsKCi8vIHMtPmV4dHJhZGF0YV9w YXJzZWQgaXMgMC4Kc3RhdGljIGludCBoMjY0X21wNHRvYW5uZXhiX2ZpbHRlcihBVkJTRkNvbnRl eHQgKmN0eCwgQVZQYWNrZXQgKm9wa3QpCiAgICAvKiBub3RoaW5nIHRvIGZpbHRlciAqLwogICAg aWYgKCFzLT5leHRyYWRhdGFfcGFyc2VkKSB7CiAgICAgICAgYXZfcGFja2V0X21vdmVfcmVmKG9w a3QsIGluKTsKICAgICAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOwogICAgICAgIHJldHVybiAwOwog ICAgfQpgYGAKCkluIHRoaXMgc2NlbmFyaW8sIHdlIG11c3QgbWFudWFsbHkgaW5zZXJ0IHRoZSBT UFMvUFBTLgoKIyMgQU5ORVhCCgpXaGVuIGVuY29kaW5nLCB0aGUgcGFja2V0IGlzIGluIHRoZSBB Tk5FWEIgZm9ybWF0LgoKYGBgYmFzaAp+L2dpdC9GRm1wZWcvZmZtcGVnX2cgLXJlIC1pIH4vZ2l0 L3Nycy90cnVuay9kb2Mvc291cmNlLmZsdiBcCiAgICAtdmNvZGVjIGxpYngyNjQgLXByb2ZpbGU6 diBiYXNlbGluZSAtciAyNSAtZyA1MCAtYWNvZGVjIGxpYm9wdXMgLWFyIDQ4MDAwIC1hYyAyIFwK ICAgIC1mIHJ0YyAiaHR0cDovL2xvY2FsaG9zdDoxOTg1L3J0Yy92MS93aGlwLz9hcHA9bGl2ZSZz dHJlYW09bGl2ZXN0cmVhbSIKYGBgCgpTaW5jZSB0aGUgaDI2NF9tcDR0b2FubmV4YiBmaWx0ZXIg b25seSBwcm9jZXNzZXMgdGhlIE1QNCBJU09NIGZvcm1hdCBhbmQgYnlwYXNzZXMgdGhlIGFubmV4 YiBmb3JtYXQsIGl0IGlzIG5lY2Vzc2FyeSB0byBtYW51YWxseSBpbnNlcnQgZW5jb2RlciBtZXRh ZGF0YSBiZWZvcmUgZWFjaCBJRFIgd2hlbiBkZWFsaW5nIHdpdGggYW5uZXhiIGZvcm1hdCBwYWNr ZXRzLiBGb3IgaW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIEguMjY0LCB3ZSBtdXN0IGluc2VydCBT UFMgYW5kIFBQUyBiZWZvcmUgdGhlIElEUiBmcmFtZS4KCmBgYGMKc3RhdGljIGludCBydGNfY2hl Y2tfYml0c3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBjb25zdCBBVlBh Y2tldCAqcGt0KSB7CiAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19J RF9IMjY0KSB7CiAgICAgICAgZXh0cmFkYXRhX2lzb20gPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0 YV9zaXplID4gMCAmJiBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVswXSA9PSAxOwogICAgICAgIGlm IChwa3QtPnNpemUgPj0gNSAmJiBBVl9SQjMyKGIpICE9IDB4MDAwMDAwMSAmJiAoQVZfUkIyNChi KSAhPSAweDAwMDAwMSB8fCBleHRyYWRhdGFfaXNvbSkpCiAgICAgICAgICAgIHJldCA9IGZmX3N0 cmVhbV9hZGRfYml0c3RyZWFtX2ZpbHRlcihzdCwgImgyNjRfbXA0dG9hbm5leGIiLCBOVUxMKTsK ICAgICAgICBlbHNlCiAgICAgICAgICAgIHJ0Yy0+aDI2NF9hbm5leGJfaW5zZXJ0X3Nwc19wcHMg PSAxOwogICAgfQoKc3RhdGljIGludCBydGNfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAq cywgQVZQYWNrZXQgKnBrdCkgewogICAgaWYgKHJ0Yy0+aDI2NF9hbm5leGJfaW5zZXJ0X3Nwc19w cHMgJiYgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CiAgICAg ICAgaWYgKChyZXQgPSBoMjY0X2FubmV4Yl9pbnNlcnRfc3BzX3BwcyhzLCBwa3QpKSA8IDApIHsK Ci8qKgogKiBTaW5jZSB0aGUgaDI2NF9tcDR0b2FubmV4YiBmaWx0ZXIgb25seSBwcm9jZXNzZXMg dGhlIE1QNCBJU09NIGZvcm1hdCBhbmQgYnlwYXNzZXMKICogdGhlIGFubmV4YiBmb3JtYXQsIGl0 IGlzIG5lY2Vzc2FyeSB0byBtYW51YWxseSBpbnNlcnQgZW5jb2RlciBtZXRhZGF0YSBiZWZvcmUg ZWFjaAogKiBJRFIgd2hlbiBkZWFsaW5nIHdpdGggYW5uZXhiIGZvcm1hdCBwYWNrZXRzLiBGb3Ig aW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIEguMjY0LAogKiB3ZSBtdXN0IGluc2VydCBTUFMgYW5k IFBQUyBiZWZvcmUgdGhlIElEUiBmcmFtZS4KICovCnN0YXRpYyBpbnQgaDI2NF9hbm5leGJfaW5z ZXJ0X3Nwc19wcHMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQpgYGAKClNlZSBo dHRwczovL2dpdGh1Yi5jb20vb3NzcnMvZmZtcGVnLXdlYnJ0Yy9wdWxsLzEvY29tbWl0cy85ODFh MDk4NzZjMDc5ODY2MTJhOTQ2MTc3NTFkZDU2YmZkOTUwODllCgpGaXhlZC4KPiAKPiA+ICsgLyog Rm9yIGF1ZGlvIE9QVVMgc3RyZWFtLCBjb3JyZWN0IHRoZSB0aW1lc3RhbXAuICovCj4gPiArIGlm IChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Cj4gPiAr IHBrdC0+ZHRzID0gcGt0LT5wdHMgPSBydGMtPmF1ZGlvX2ppdHRlcl9iYXNlOwo+ID4gKyBydGMt PmF1ZGlvX2ppdHRlcl9iYXNlICs9IDk2MDsKPiA+ICsgfQo+IAo+IDEuIERvIG5vdCBoYXJkY29k ZSBvcHVzLgo+IDIuIDk2MCBpcyBub3QgYWx3YXlzIHRydWUgZm9yIG9wdXMsIGl0IGp1c3QgaGFw cGVucyB0byBiZSB0aGUgbGlib3B1cyBkZWZhdWx0LgpXaW5saW46IER1cCB0byBodHRwczovL2dp dGh1Yi5jb20vb3NzcnMvZmZtcGVnLXdlYnJ0Yy9kaXNjdXNzaW9ucy80I2Rpc2N1c3Npb25jb21t ZW50LTYwOTYxMjkKCkZpeGVkLgo+IAo+ID4gKyByZXQgPSBpbnNlcnRfc3BzX3Bwc19wYWNrZXQo cywgcGt0KTsKPiA+ICsgaWYgKHJldCA8IDApIHsKPiA+ICsgYXZfbG9nKHMsIEFWX0xPR19FUlJP UiwgIkZhaWxlZCB0byBpbnNlcnQgU1BTL1BQUyBwYWNrZXRcbiIpOwo+ID4gKyByZXR1cm4gcmV0 Owo+ID4gKyB9Cj4gCj4gRG8gbm90IGhhcmRjb2RlIEgyNjQuCldpbmxpbjogUmVmaW5lIHRoZSBj b21tZW50cyB0bzoKCmBgYGMKICAgICAgICBhdl9sb2cocnRjLCBBVl9MT0dfRVJST1IsICJXSElQ OiBGYWlsZWQgdG8gaW5zZXJ0IGNvZGVjIG1ldGFkYXRhIHBhY2tldFxuIik7CmBgYAoKRml4ZWQu Cj4gCj4gPiArc3RhdGljIGNvbnN0IEFWQ2xhc3MgcnRjX211eGVyX2NsYXNzID0gewo+ID4gKyAu Y2xhc3NfbmFtZSA9ICJXZWJSVEMgbXV4ZXIiLAo+IAo+IFdISVAgb3IgV2ViUlRDPwpXaW5saW46 IFJlbmFtZSB0byBgV0hJUCBtdXhlcmAKCmBgYGMKc3RhdGljIGNvbnN0IEFWQ2xhc3MgcnRjX211 eGVyX2NsYXNzID0gewogICAgLmNsYXNzX25hbWUgPSAiV0hJUCBtdXhlciIsCgpjb25zdCBGRk91 dHB1dEZvcm1hdCBmZl9ydGNfbXV4ZXIgPSB7CiAgICAucC5sb25nX25hbWUgICAgICAgID0gTlVM TF9JRl9DT05GSUdfU01BTEwoIldISVAoV2ViUlRDLUhUVFAgaW5nZXN0aW9uIHByb3RvY29sKSBt dXhlciIpLApgYGAKCkZpeGVkLgo+IAo+IFsuLi5dCj4gCj4gT0suIFNvIG5vdyBvbiB0byBteSB3 YWZmbGluZy4KPiAKPiBUaGlzIHBhdGNoLCB0byBtZSwgc2VlbXMgYWxtb3N0IGxpa2UgYSBwcm9v ZiBvZiBjb25jZXB0IHJhdGhlciB0aGFuIGEgZnVsbHkgZmxlc2hlZCBvdXQKPiAocmVhZDogcHVz aGFibGUpIHBhdGNoLiBJIGhhdmUgZmV3IGNvbmNlcm5zOgo+IAo+IDEuIElmIGl0IGlzIHB1c2hl ZCBpbiBzdWNoIGEgc3RhdGUsIGxhY2tpbmcgc28gbWFueSB0aGluZ3MsIG15IGh1bmNoLCBiYXNl ZCBvbiBleHBlcmllbmNlLAo+IGlzIHRoYXQgaXQgd2lsbCBzdGF5IHRoYXQgd2F5OiBpbmNvbXBs ZXRlLCBqdXN0IGJlaW5nIG1haW50YWluZWQsIHJhdGhlciB0aGFuIGZpbmlzaGVkLgo+IFVzZXJz IHdpbGwgcmlnaHRmdWxseSBhc2sgd2h5IGl0IGlzIGxpa2UgdGhpcywgYW5kIHdpbGwgYXNrIGZv ciBpdCB0byBiZSBjb21wbGV0ZWQsIGJ1dAo+IEkgZXhwZWN0IG5vYm9keSB3aWxsLiBCdXQgdGhl cmUgd2lsbCBiZSBhIGJsb2cgcG9zdCBhYm91dCBob3cgIkZGbXBlZyBoYXMgV2ViUlRDIG5vdyIs Cj4gbGlrZSB3ZSBzYXcgd2l0aCBJUEZTLgo+IDIuIEl0IGlzIG1vbm9saXRoaWMgLSBXSElQLCBE VExTLCBJQ0UsIFNUVU4sIFNSVFAsIFJUUCwgYW5kIFNQRCBzaG91bGQgcmVhbGx5IGFsbCBiZSBz ZXBhcmF0ZQo+IGxheWVycy4gVHlwaW5nIHRoYXQgb3V0IHJlYWxseSBkb2VzIG1ha2Ugb25lIHJl YWxpemUgV2ViUlRDIHN1ZmZlcnMgZnJvbSBkZWVwIElFVEYKPiBjb21taXR0ZWUtbmVzcy4uLgo+ IDMuIFRoZSBjb2RlYyBwYXJ0cyBzaG91bGQgcHJvYmFibHkgYmUgc2VwYXJhdGVkIG91dCBsaWtl IHRoZXkgYXJlIGZvciBSVFAuCj4gNC4gSWYgb3VyIFNEUCBmYWNpbGl0aWVzIGFyZSBub3QgZ29v ZCBlbm91Z2ggZm9yIFdISVAsIHRoZXkgc2hvdWxkIGJlIGltcHJvdmVkIHNvIHRoYXQgdGhleQo+ IGFyZS4KV2lubGluOiBUaGlzIHBhdGNoIGdvZXMgYmV5b25kIGJlaW5nIGEgbWVyZSBwcm90b3R5 cGUgZm9yIHByb29mIG9mIGNvbmNlcHQ7IGl0IGlzIGEgZnVsbHkgZnVuY3Rpb25hbCBwYXRjaC4g U2luY2UgV0hJUCBpcyBzaWduaWZpY2FudGx5IHNpbXBsZXIgYW5kIG9ubHkgYSBzdWJzZXQgb2Yg V2ViUlRDLCB0aGVyZSBpcyBubyBuZWVkIHRvIGltcGxlbWVudCB0aGUgZW50aXJlIFdlYlJUQyBz dGFjaywgbWFraW5nIHRoaXMgcGF0Y2ggdHJ1bHkgd29ya2FibGUuCgpBdCBwcmVzZW50LCB3ZSBv bmx5IGhhdmUgc3VwcG9ydCBmb3IgT3BlblNTTCwgYnV0IGFkZGluZyBzdXBwb3J0IGZvciBvdGhl ciBUTFMgbGlicmFyaWVzIGxpa2UgR251VExTIGlzIG5vdCBkaWZmaWN1bHQuIFRvIG1haW50YWlu IHRoZSBzaW1wbGljaXR5IG9mIHRoaXMgcGF0Y2gsIHdlIHN1Z2dlc3QgaW5jb3Jwb3JhdGluZyB0 aGlzIGFkZGl0aW9uYWwgc3VwcG9ydCBpbiB0aGUgZnV0dXJlLgoKSSBiZWxpZXZlIHRoYXQgZXh0 cmFjdGluZyBXSElQLCBEVExTLCBJQ0UsIGFuZCBTVFVOIGludG8gc2VwYXJhdGUgbGF5ZXJzIG1h eSBub3QgYmUgbmVjZXNzYXJ5LCBhcyBpdCByZXByZXNlbnRzIGEgY29tcGxldGUgV2ViUlRDIHN0 YWNrLiBXSElQIGludm9sdmVzIGEgc2luZ2xlIEhUVFAgcmVxdWVzdCBhbmQgcmVzcG9uc2UsIHNv IGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgQVBJIGxheWVyIGlzIG5vdCByZXF1aXJlZC4gU2ltaWxh cmx5LCBmb3IgSUNFIGFuZCBTVFVOLCB3ZSB1dGlsaXplIElDRS1MSVRFIG1vZGUgaW5zdGVhZCBv ZiBJQ0UtRlVMTCBtb2RlLCB3aGljaCBjb25zaXN0cyBvZiBhIHN0cmFpZ2h0Zm9yd2FyZCBVRFAg YmluZGluZyByZXF1ZXN0IGFuZCByZXNwb25zZSwgbWFraW5nIGFuIGV4dHJhIEFQSSBsYXllciBy ZWR1bmRhbnQuIEhvd2V2ZXIsIGZvciBEVExTLCBpdCBtaWdodCBiZSBiZW5lZmljaWFsIHRvIGlu dHJvZHVjZSBhbiBBUEkgbGF5ZXIuIFJlZ2FyZGluZyBTUlRQIGFuZCBSVFAsIEZGbXBlZyBhbHJl YWR5IHByb3ZpZGVzIGFuIEFQSSBsYXllciwgd2hpY2ggb25seSBuZWVkcyBzb21lIHJlZmluZW1l bnQuCgpUaGUgaXNzdWUgd2l0aCB0aGUgU0RQIGlzIHNvbWV3aGF0IGNvbXBsaWNhdGVkLCBhcyB0 aGUgV0hJUCdzIFNEUCBpcyBxdWl0ZSBzdHJhaWdodGZvcndhcmQsIHJlcXVpcmluZyBvbmx5IHRo ZSBnZW5lcmF0aW9uIG9mIGEgc2luZ2xlIFNEUC4gSG93ZXZlciwgaWYgd2Ugd2FudCB0byB1dGls aXplIGZmbXBlZydzIFNEUCBBUEksIGl0IGJlY29tZXMgbW9yZSBjb21wbGV4IGFuZCBuZWNlc3Np dGF0ZXMgY29kZSBtb2RpZmljYXRpb25zIHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBJIHN1Z2dlc3Qg YWRkcmVzc2luZyB0aGlzIGluIGEgZnV0dXJlIHVwZGF0ZSByYXRoZXIgdGhhbiBpbiB0aGUgY3Vy cmVudCBwYXRjaC4KCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IEguMjY0IGFuZCBPUFVTIGNv ZGVjcywgYnV0IHdlIG1heSBuZWVkIHRvIGFkZCBBVjEgc3VwcG9ydCBpbiB0aGUgZnV0dXJlLiBJ bmNvcnBvcmF0aW5nIGEgbmV3IGNvZGVjIGlzIHN0cmFpZ2h0Zm9yd2FyZDsgaXQgc2ltcGx5IHJl cXVpcmVzIHVwZGF0aW5nIHRoZSBTRFAgYW5kIGNvZGVjIG1ldGFkYXRhLCBzdWNoIGFzIHRoZSBI LjI2NCdzIFNQUy9QUFMuCgpKYWNrIExhdTogU2luY2UgSSByZWZhY3RvcmVkIHRoZSBEVExTIGFu ZCBtZXJnZWQgaXQgaW50byB0bHMsIHdlIGNhbiBlYXNpbHkgYWRkIHN1cHBvcnQgZm9yIG90aGVy IHRscyBsaWJzLgo+IAo+IC0gRGVyZWsKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdApmZm1wZWctZGV2ZWxA ZmZtcGVnLm9yZwpodHRwczovL2ZmbXBlZy5vcmcvbWFpbG1hbi9saXN0aW5mby9mZm1wZWctZGV2 ZWwKClRvIHVuc3Vic2NyaWJlLCB2aXNpdCBsaW5rIGFib3ZlLCBvciBlbWFpbApmZm1wZWctZGV2 ZWwtcmVxdWVzdEBmZm1wZWcub3JnIHdpdGggc3ViamVjdCAidW5zdWJzY3JpYmUiLgo=