Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wEfae-004Gvd-1C for pgsql-hackers@arkaria.postgresql.org; Mon, 20 Apr 2026 03:46:29 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wEfad-000QAB-0h for pgsql-hackers@arkaria.postgresql.org; Mon, 20 Apr 2026 03:46:27 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wEfac-000QA3-28 for pgsql-hackers@lists.postgresql.org; Mon, 20 Apr 2026 03:46:26 +0000 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wEfaa-00000001rbY-2NLK for pgsql-hackers@postgresql.org; Mon, 20 Apr 2026 03:46:25 +0000 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-488a88aeec9so38866245e9.2 for ; Sun, 19 Apr 2026 20:46:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776656783; cv=none; d=google.com; s=arc-20240605; b=G6MK6Nu0wrGFBFTxXMM15ErmObIGs58wjUF5uI+/KOD5+G9kxG2SxqDYAUHXPvYZLL CPZgwmG29HC4VIYXkqNwk/+/d13srpuWUiLGIlH5wH/2ABS7vWTf5qw/auqJhoKT5E4y i7qNohd7Cc11zqLAbe+qanz3VNlCluu7ARg0pjF9DEpgs8CGjfAxsVU0IXmw2HXpGUmL Bt7zhwqx63YfjptNHDylY1Y/ehyscE7dLiYgC7Z4Zdo0IqIeqUzrwMLC8jilkMqOKnVH Npm35Up/peVgX0prSMIRiLYonR6hzQBnRAdyYXk/w5Ydv2sz6zErWP4tIxryqvPsKEEt 1rKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=JWaiCgjReYvxnn73rUBSU3HbRHuna0ZheFzwZe4Z/10=; fh=w3pee8IDyHfSqhNS9OCHuPVZbcEtPNOuZa9frb3/zc0=; b=ZPl0ZDhSDz3y0Emp36Qz3XGKRlVmkqPYmEIn4h2fUz/KGc1jI+aG0iw+cKJDvAv9pY INjeqUO3XG85FgYhwp8JyxM0Oa2qGbIVkCe8CX+5gABrhVW3dvFLlgGU1As3jS3Gwzd6 ktX+KLxZAjXal+9vIxtf6bVgN5vCk6axuketHoCnquu1WpDDTOotByCbH+qMmc2lSypC IZpmMwjlqMeUoemPTt58t/0dx+7oELuD2gLaX1H1wqhvaG2si6UluvTwjaYh9o/G7evW hL4VlVp/ZdzrBIsJekND3frAipGkJfwtVRf09u+vaXALU7bNb0cLSVeYJwTiS8sBRPe2 iYyg==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776656783; x=1777261583; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=JWaiCgjReYvxnn73rUBSU3HbRHuna0ZheFzwZe4Z/10=; b=L8BORr/+1BJgexjMhd/SsH8qMduWxiFCesBhf290iID+GCA6R1inxqwUgwKcsMa50Q W2PTMmxTkqpNKtLBeYTNUaE5Qn4H2/Ly38iXi/Q9Y6q4xdey4R2pZC7e8F4BXOV6U3aD U2POwopAuOf3I3Zo0cDqG8k4/j3NxpG6JowyHSThHlaTAIFXETrju9lHW4uvAo3FIawm N1sqGN9A39AsSUFpbqz7NB4xHc6FeJpJDBjgdjHJWPDzMFUuBs4jaU4C3DNW4x6Ab5jT iFR1wosmh4cWR/INopxwAers69CejyRHsT9dYmISlZQVpMFOZHsCL7OQ66Nrxe+ph1H5 h/XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776656783; x=1777261583; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=JWaiCgjReYvxnn73rUBSU3HbRHuna0ZheFzwZe4Z/10=; b=kzKNoS7HLEjtrYA+z3VrzBkabbg5ExTv0yV91eH2DywKGSVLrsbuQ4Bz86abhIXz98 Axcyhn7q6DnHJigacLgk3t0RuWD/6cELgcFAHdM28f0wdDD3Ai0Ryhazkep1IKl/wC5J iC/zLOEh4ue8vbvaufEV/nNtW6Jt+PYBvHooLrCZhiyacr/KiwOXTwxoR5vB/+5twyxE daJBOluHeec6qSAWLXyULUDfkd5iXDxQgCRazL5etf7uKQfolUJtv02ZbaBnDbiCjIT8 FfjDuN+qWd+JUZguXtQoKQHQhWPr5YP4y0xovgGd7S04TciLR6m5vz0r8ljFWLZjqoOk kMIQ== X-Gm-Message-State: AOJu0YwdJMMCyvuBonxnDsp2e29FX/K9mEM0ap/hu+abMtto8y04i0E0 mpniZumqsOeFy2xUZb0UVu0/XsZnmHmgGAeXdlalTmnApF41tFpvlkr7WL0ru5wXVKB4rxizaC8 kdV32gKp2OKUxV/MTSzzQJNx5Fda1GWA= X-Gm-Gg: AeBDietKQzqMaJ9/XvM3NE0RDdtnjc68enACKakkSFROtOzSTRUST1K5QPfEyzIcP3N HudA9F6QYuJf7+g7u6raXOPZkiAu10hs6E4p4huzZe4L6KnQDOpBpDJSLjEqOz7zL6MVV9lUsBF i7G7rZMc9qX5EqlTLpVa7mjPKEz4nyDWZBITvqFatMW+eT1tasOmRLwCu2veeyMGoqvRQ8K2bk7 yzGZjbqQ23fpAWhVWHkZY50N5U8P7aAxFh7PYudtT33kyhyLfwe0vaOf1oy3pvE0CMl7mMZ5Imy Jv2A08L3otyc4vBhfddgLxgPUUHL4CAPoCU4fzjSzu+qK5gZdnjGJ3r2+syARO3bTzobwfDQILh v+bVdREmifhzz6B49bvE= X-Received: by 2002:a05:600c:888b:b0:480:1d0b:2d32 with SMTP id 5b1f17b1804b1-488fb74bccbmr136893645e9.12.1776656783118; Sun, 19 Apr 2026 20:46:23 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: David Rowley Date: Mon, 20 Apr 2026 15:46:10 +1200 X-Gm-Features: AQROBzAkyuk7dpu2OV0vzBaHnpDEUqYDoD_Z02p5X_28B73Vc9d-s-WTP4-OK7I Message-ID: Subject: Re: [PATCH] Fix hashed ScalarArrayOp semantics for NULL LHS with non-strict comparators To: Chengpeng Yan Cc: PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000722c02064fdc24cf" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000722c02064fdc24cf Content-Type: text/plain; charset="UTF-8" On Mon, 20 Apr 2026 at 01:06, David Rowley wrote: > If we need to assume the non-strict function could return false on > NULL = non-NULL, then we could test for that when inserting the first > datum into the hash table and store the behaviour in the expression. > It may also be worth doing that check for NULL = NULL so that we don't > need to call the equals function every time we see a NULL. > > I'll need to dig a bit deeper to see if we've written down any rules > about non-strict equality functions anywhere... Of course, it is possible to make the strict function do that, and non-hashed IN / NOT IN handles it, so the hashed version shouldn't have an excuse to not do the right thing. I've attached a version that "probes" the equality function for its NULL = NULL behaviour and its NULL = non-NULL behaviour and returns whatever the result of the probe was at the appropriate time. What I came up with does feel quite elaborate, so I'd quite like a 2nd opinion. The patch does assume that the non-strict function will return the same thing for NULL = non-NULL as it will for non-NULL = NULL. Technically, if you coded the function to do something different there, the hashed vs non-hashed could differ in their result. My thoughts there, if someone is expecting anything sane out of such an equality function, then they're probably going to be disappointed due to various other optimisations we have. David --000000000000722c02064fdc24cf Content-Type: application/octet-stream; name="v3-0001-Fix-incorrect-logic-for-hashed-IN-NOT-IN-with-non.patch" Content-Disposition: attachment; filename="v3-0001-Fix-incorrect-logic-for-hashed-IN-NOT-IN-with-non.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo6nbq3d0 RnJvbSAzNWM4NGZmYmJjMGZlN2IwOWM3ZWRlYTc1NzBmZjIxOTYzODIxYzA3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBSb3dsZXkgPGRncm93bGV5QGdtYWlsLmNvbT4KRGF0 ZTogU3VuLCAxOSBBcHIgMjAyNiAxNToyNDozOSArMTIwMApTdWJqZWN0OiBbUEFUQ0ggdjNdIEZp eCBpbmNvcnJlY3QgbG9naWMgZm9yIGhhc2hlZCBJTiAvIE5PVCBJTiB3aXRoIG5vbi1zdHJpY3QK IG9wZXJhdG9ycwoKVGhpcyBmaXhlcyB0aGUgaW5jb3JyZWN0IGxvZ2ljIGZvciBoYXNoZWQgSU4g YW5kIE5PVCBJTiBjbGF1c2VzIHdoaWNoCnRyaWdnZXJzIHdoZW4gdGhlcmUgYXJlIDkgb3IgbW9y ZSBjb25zdGFudCBlbGVtZW50cyBpbiB0aGUgY2xhdXNlIGFuZAp0aGUgZGF0YXR5cGUgc3VwcG9y dHMgaGFzaGluZy4KCldoZW4gdGhlIHZhbHVlIGJlaW5nIGxvb2tlZCB1cCB3YXMgTlVMTCwgaW4g c29tZSBjYXNlcyBpdCB3YXMgcG9zc2libGUKdGhhdCB0aGUgaGFzaGVkIHZlcnNpb24gZXZhbHVh dGVkIHRvIGZhbHNlIHJhdGhlciB0aGFuIE5VTEwsIGFuZCBpbiBtdWNoCm1vcmUgcmFyZSBjYXNl cywgdHJ1ZSBpbnN0ZWFkIG9mIE5VTEwuICBUaGUgZm9ybWVyIHRlY2huaWNhbGx5IHdvdWxkbid0 CmNhdXNlIGFuIGlzc3VlIGZvciBhbiBJTiBvciBOT1QgSU4gaW4gYSBXSEVSRSBjbGF1c2UgYXMg ZmFsc2UgYW5kIE5VTEwKbWVhbiB0aGUgc2FtZSB0aGluZyB0aGVyZSwgaG93ZXZlciwgdGhlIGxh dHRlciBjb3VsZCBjYXVzZSByb3dzIHRvIG1hdGNoCnRoZSBXSEVSRSBjbGF1c2UgdGhhdCBzaG91 bGRuJ3QuCgpTaW5jZSBhbGwgYnVpbHQtaW4gb3BlcmF0b3JzIGFyZSBzdHJpY3QsIHRoaXMgY291 bGQgb25seSBhZmZlY3QgY3VzdG9tCnR5cGVzLgoKUmVwb3J0ZWQtYnk6IENoZW5ncGVuZyBZYW4g PGNoZW5ncGVuZ195YW5Ab3V0bG9vay5jb20+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVz L20vQTE2MTg3QUUtMjM1OS00MjY1LTlGNUUtNzFEMDE1RUMyQjJEQG91dGxvb2suY29tCi0tLQog c3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0V4cHJJbnRlcnAuYyAgICAgfCAxNjEgKysrKysrKysr KysrLS0tLS0KIHNyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWNFeHByLmggICAgICAgICAgIHwgICA0 ICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwcmVzc2lvbnMub3V0IHwgMjAzICsrKysr KysrKysrKysrKysrKy0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2V4cHJlc3Npb25zLnNxbCAg ICAgIHwgMTE0ICsrKysrKysrKystLQogNCBmaWxlcyBjaGFuZ2VkLCAzOTUgaW5zZXJ0aW9ucygr KSwgODcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhl Y0V4cHJJbnRlcnAuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNFeHBySW50ZXJwLmMKaW5k ZXggM2M0ODQzY2RlODYuLmQ3YzYxYjViZDA2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVj dXRvci9leGVjRXhwckludGVycC5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNFeHBy SW50ZXJwLmMKQEAgLTQyNDYsOSArNDI0NiwxMCBAQCBFeGVjRXZhbEhhc2hlZFNjYWxhckFycmF5 T3AoRXhwclN0YXRlICpzdGF0ZSwgRXhwckV2YWxTdGVwICpvcCwgRXhwckNvbnRleHQgKmVjbwog CSAqIElmIHRoZSBzY2FsYXIgaXMgTlVMTCwgYW5kIHRoZSBmdW5jdGlvbiBpcyBzdHJpY3QsIHJl dHVybiBOVUxMOyBubwogCSAqIHBvaW50IGluIGV4ZWN1dGluZyB0aGUgc2VhcmNoLgogCSAqLwot CWlmIChmY2luZm8tPmFyZ3NbMF0uaXNudWxsICYmIHN0cmljdGZ1bmMpCisJaWYgKHNjYWxhcl9p c251bGwgJiYgc3RyaWN0ZnVuYykKIAl7CiAJCSpvcC0+cmVzbnVsbCA9IHRydWU7CisJCSpvcC0+ cmVzdmFsdWUgPSAoRGF0dW0pIDA7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQyNjcsNiArNDI2OCw3 IEBAIEV4ZWNFdmFsSGFzaGVkU2NhbGFyQXJyYXlPcChFeHByU3RhdGUgKnN0YXRlLCBFeHByRXZh bFN0ZXAgKm9wLCBFeHByQ29udGV4dCAqZWNvCiAJCWludAkJCWJpdG1hc2s7CiAJCU1lbW9yeUNv bnRleHQgb2xkY29udGV4dDsKIAkJQXJyYXlUeXBlICAqYXJyOworCQlib29sCQljaGVja2VkX251 bGxfZXFfbm9ubnVsbCA9IHN0cmljdGZ1bmM7CiAKIAkJc2FvcCA9IG9wLT5kLmhhc2hlZHNjYWxh cmFycmF5b3Auc2FvcDsKIApAQCAtNDMyNyw2ICs0MzI5LDIzIEBAIEV4ZWNFdmFsSGFzaGVkU2Nh bGFyQXJyYXlPcChFeHByU3RhdGUgKnN0YXRlLCBFeHByRXZhbFN0ZXAgKm9wLCBFeHByQ29udGV4 dCAqZWNvCiAJCQkJcyA9IChjaGFyICopIGF0dF9ub21pbmFsX2FsaWduYnkocywgdHlwYWxpZ25i eSk7CiAKIAkJCQlzYW9waGFzaF9pbnNlcnQoZWxlbWVudHNfdGFiLT5oYXNodGFiLCBlbGVtZW50 LCAmaGFzaGZvdW5kKTsKKworCQkJCS8qCisJCQkJICogRm9yIG5vbi1zdHJpY3QgZnVuY3Rpb25z LCBjaGVjayB3aGF0IE5VTEwgPSBub24tTlVMTCBkb2VzLgorCQkJCSAqIFdlIGRvIGFzc3VtZSB0 aGF0IHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBmb3IgZXZlcnkgRGF0dW0KKwkJCQkgKiB2YWx1ZS4K KwkJCQkgKi8KKwkJCQlpZiAoIWNoZWNrZWRfbnVsbF9lcV9ub25udWxsKQorCQkJCXsKKwkJCQkJ ZmNpbmZvLT5hcmdzWzBdLnZhbHVlID0gKERhdHVtKSAwOworCQkJCQlmY2luZm8tPmFyZ3NbMF0u aXNudWxsID0gdHJ1ZTsKKwkJCQkJZmNpbmZvLT5hcmdzWzFdLnZhbHVlID0gZWxlbWVudDsKKwkJ CQkJZmNpbmZvLT5hcmdzWzFdLmlzbnVsbCA9IGZhbHNlOworCisJCQkJCW9wLT5kLmhhc2hlZHNj YWxhcmFycmF5b3AubnVsbF9lcV9ub25udWxsID0gRGF0dW1HZXRCb29sKG9wLT5kLmhhc2hlZHNj YWxhcmFycmF5b3AuZmluZm8tPmZuX2FkZHIoZmNpbmZvKSk7CisJCQkJCW9wLT5kLmhhc2hlZHNj YWxhcmFycmF5b3AubnVsbF9lcV9ub25udWxsX2lzbnVsbCA9IGZjaW5mby0+aXNudWxsOworCQkJ CQljaGVja2VkX251bGxfZXFfbm9ubnVsbCA9IHRydWU7CisJCQkJfQogCQkJfQogCiAJCQkvKiBB ZHZhbmNlIGJpdG1hcCBwb2ludGVyIGlmIGFueS4gKi8KQEAgLTQzNDYsNjEgKzQzNjUsMTE5IEBA IEV4ZWNFdmFsSGFzaGVkU2NhbGFyQXJyYXlPcChFeHByU3RhdGUgKnN0YXRlLCBFeHByRXZhbFN0 ZXAgKm9wLCBFeHByQ29udGV4dCAqZWNvCiAJCSAqIG5vbi1zdHJpY3QgZnVuY3Rpb25zIHdpdGgg YSBudWxsIGxocyB2YWx1ZSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KIAkJICovCiAJCW9wLT5kLmhh c2hlZHNjYWxhcmFycmF5b3AuaGFzX251bGxzID0gaGFzX251bGxzOwotCX0KIAotCS8qIENoZWNr IHRoZSBoYXNoIHRvIHNlZSBpZiB3ZSBoYXZlIGEgbWF0Y2guICovCi0JaGFzaGZvdW5kID0gTlVM TCAhPSBzYW9waGFzaF9sb29rdXAoZWxlbWVudHNfdGFiLT5oYXNodGFiLCBzY2FsYXIpOworCQlp ZiAoaGFzX251bGxzICYmICFzdHJpY3RmdW5jKQorCQl7CisJCQlmY2luZm8tPmFyZ3NbMF0udmFs dWUgPSAoRGF0dW0pIDA7CisJCQlmY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gdHJ1ZTsKKwkJCWZj aW5mby0+YXJnc1sxXS52YWx1ZSA9IChEYXR1bSkgMDsKKwkJCWZjaW5mby0+YXJnc1sxXS5pc251 bGwgPSB0cnVlOwogCi0JLyogdGhlIHJlc3VsdCBkZXBlbmRzIG9uIGlmIHRoZSBjbGF1c2UgaXMg YW4gSU4gb3IgTk9UIElOIGNsYXVzZSAqLwotCWlmIChpbmNsYXVzZSkKLQkJcmVzdWx0ID0gQm9v bEdldERhdHVtKGhhc2hmb3VuZCk7CS8qIElOICovCi0JZWxzZQotCQlyZXN1bHQgPSBCb29sR2V0 RGF0dW0oIWhhc2hmb3VuZCk7CS8qIE5PVCBJTiAqLworCQkJb3AtPmQuaGFzaGVkc2NhbGFyYXJy YXlvcC5udWxsX2VxX251bGwgPSBEYXR1bUdldEJvb2wob3AtPmQuaGFzaGVkc2NhbGFyYXJyYXlv cC5maW5mby0+Zm5fYWRkcihmY2luZm8pKTsKKwkJCW9wLT5kLmhhc2hlZHNjYWxhcmFycmF5b3Au bnVsbF9lcV9udWxsX2lzbnVsbCA9IGZjaW5mby0+aXNudWxsOwogCi0JcmVzdWx0bnVsbCA9IGZh bHNlOworCQl9CisJfQogCi0JLyoKLQkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoIGluIHRo ZSBhcnJheSwgd2Ugc3RpbGwgbWlnaHQgbmVlZCB0byBoYW5kbGUKLQkgKiB0aGUgcG9zc2liaWxp dHkgb2YgbnVsbCB2YWx1ZXMuICBXZSBkaWRuJ3QgcHV0IGFueSBOVUxMcyBpbnRvIHRoZQotCSAq IGhhc2h0YWJsZSwgYnV0IGluc3RlYWQgbWFya2VkIGlmIHdlIGZvdW5kIGFueSB3aGVuIGJ1aWxk aW5nIHRoZSB0YWJsZQotCSAqIGluIGhhc19udWxscy4KLQkgKi8KLQlpZiAoIWhhc2hmb3VuZCAm JiBvcC0+ZC5oYXNoZWRzY2FsYXJhcnJheW9wLmhhc19udWxscykKKwlpZiAobGlrZWx5KCFzY2Fs YXJfaXNudWxsKSkKIAl7Ci0JCWlmIChzdHJpY3RmdW5jKQotCQl7CisJCS8qIHBlcmZvcm0gaGFz aCBsb29rdXAgb24gdGhlIG5vbi1OVUxMIHZhbHVlICovCisJCWhhc2hmb3VuZCA9IE5VTEwgIT0g c2FvcGhhc2hfbG9va3VwKGVsZW1lbnRzX3RhYi0+aGFzaHRhYiwgc2NhbGFyKTsKIAorCQkvKgor CQkgKiBJZiB3ZSBkaWRuJ3QgZmluZCB0aGUgdmFsdWUgYW5kIHRoZSBhcnJheSBjb250YWlucyBh IE5VTEwsIHRoZQorCQkgKiByZXN1bHQgaXMgTlVMTAorCQkgKi8KKwkJaWYgKCFoYXNoZm91bmQg JiYgb3AtPmQuaGFzaGVkc2NhbGFyYXJyYXlvcC5oYXNfbnVsbHMpCisJCXsKIAkJCS8qCi0JCQkg KiBXZSBoYXZlIG51bGxzIGluIHRoZSBhcnJheSBzbyBhIG5vbi1udWxsIGxocyBhbmQgbm8gbWF0 Y2ggbXVzdAotCQkJICogeWllbGQgTlVMTC4KKwkJCSAqIEZvciBzdHJpY3QgZnVuY3Rpb25zLCBh IGZhaWxlZCBsb29rdXAgZm9yIGFycmF5cyBjb250YWluaW5nIGEKKwkJCSAqIE5VTEwgbWVhbnMg YSBOVUxMIHJlc3VsdC4gIEZvciBub24tc3RyaWN0IGl0IGRlcGVuZHMgb24gaWYgdGhlCisJCQkg KiBhcnJheSBjb250YWlucyBhbnkgbm9uLW51bGwgdmFsdWVzIGFuZCB3aGF0IHRoZSBzdHJpY3Qg ZnVuY3Rpb24KKwkJCSAqIHJlc3VsdHMgZm9yIG5vbi1OVUxMID0gTlVMTC4KIAkJCSAqLwotCQkJ cmVzdWx0ID0gKERhdHVtKSAwOwotCQkJcmVzdWx0bnVsbCA9IHRydWU7CisJCQlpZiAobGlrZWx5 KHN0cmljdGZ1bmMpIHx8CisJCQkJb3AtPmQuaGFzaGVkc2NhbGFyYXJyYXlvcC5lbGVtZW50c190 YWItPmhhc2h0YWItPm1lbWJlcnMgPT0gMCkKKwkJCXsKKwkJCQlyZXN1bHQgPSAoRGF0dW0pIDA7 CisJCQkJcmVzdWx0bnVsbCA9IHRydWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyoKKwkJ CQkgKiBVc2UgdGhlIGNhY2hlZCB2YWx1ZSBmb3IgTlVMTCA9IG5vbi1OVUxMLiAgTGV0J3MganVz dAorCQkJCSAqIGFzc3VtZSB0aGlzIGlzIHRoZSBzYW1lIGFzIG5vbi1OVUxMID0gTlVMTC4gIEFu eSBub24tc3RyaWN0CisJCQkJICogZnVuY3Rpb24gd2hlcmUgdGhhdCBkb2Vzbid0IGhvbGQgdHJ1 ZSB3aWxsIG9mdGVuIHJlc3VsdCBpbgorCQkJCSAqIHN1cnByaXNpbmcgYmVoYXZpb3IuCisJCQkJ ICovCisJCQkJcmVzdWx0ID0gQm9vbEdldERhdHVtKG9wLT5kLmhhc2hlZHNjYWxhcmFycmF5b3Au bnVsbF9lcV9ub25udWxsKTsKKwkJCQlyZXN1bHRudWxsID0gb3AtPmQuaGFzaGVkc2NhbGFyYXJy YXlvcC5udWxsX2VxX25vbm51bGxfaXNudWxsOworCisJCQkJLyogUmV2ZXJzZSBhbnkgbm9uLW51 bGwgcmVzdWx0IGZvciBOT1QgSU4gY2xhdXNlcyAqLworCQkJCWlmICghcmVzdWx0bnVsbCAmJiAh aW5jbGF1c2UpCisJCQkJCXJlc3VsdCA9IEJvb2xHZXREYXR1bSghRGF0dW1HZXRCb29sKHJlc3Vs dCkpOworCQkJfQogCQl9CiAJCWVsc2UKIAkJewotCQkJLyoKLQkJCSAqIEV4ZWN1dGUgZnVuY3Rp b24gd2lsbCBudWxsIHJocyBqdXN0IG9uY2UuCi0JCQkgKgotCQkJICogVGhlIGhhc2ggbG9va3Vw IHBhdGggd2lsbCBoYXZlIHNjcmliYmxlZCBvbiB0aGUgbGhzIGFyZ3VtZW50IHNvCi0JCQkgKiB3 ZSBuZWVkIHRvIHNldCBpdCB1cCBhbHNvIChldmVuIHRob3VnaCB3ZSBlbnRlcmVkIHRoaXMgZnVu Y3Rpb24KLQkJCSAqIHdpdGggaXQgYWxyZWFkeSBzZXQpLgotCQkJICovCi0JCQlmY2luZm8tPmFy Z3NbMF0udmFsdWUgPSBzY2FsYXI7Ci0JCQlmY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gc2NhbGFy X2lzbnVsbDsKLQkJCWZjaW5mby0+YXJnc1sxXS52YWx1ZSA9IChEYXR1bSkgMDsKLQkJCWZjaW5m by0+YXJnc1sxXS5pc251bGwgPSB0cnVlOworCQkJLyogdGhlIHJlc3VsdCBkZXBlbmRzIG9uIGlm IHRoZSBjbGF1c2UgaXMgYW4gSU4gb3IgTk9UIElOIGNsYXVzZSAqLworCQkJaWYgKGluY2xhdXNl KQorCQkJCXJlc3VsdCA9IEJvb2xHZXREYXR1bShoYXNoZm91bmQpOwkvKiBJTiAqLworCQkJZWxz ZQorCQkJCXJlc3VsdCA9IEJvb2xHZXREYXR1bSghaGFzaGZvdW5kKTsJLyogTk9UIElOICovCiAK LQkJCXJlc3VsdCA9IG9wLT5kLmhhc2hlZHNjYWxhcmFycmF5b3AuZmluZm8tPmZuX2FkZHIoZmNp bmZvKTsKLQkJCXJlc3VsdG51bGwgPSBmY2luZm8tPmlzbnVsbDsKKwkJCXJlc3VsdG51bGwgPSBm YWxzZTsKKwkJfQorCX0KKwllbHNlIGlmIChvcC0+ZC5oYXNoZWRzY2FsYXJhcnJheW9wLmhhc19u dWxscykKKwl7CisJCS8qCisJCSAqIFRoZSBzaG9ydC1jaXJjdWl0IGVhcmxpZXIgbWVhbnMgd2Ug c2hvdWxkIG5ldmVyIGdldCBoZXJlIHdpdGggYQorCQkgKiBOVUxMIExIUyBhbmQgYSBzdHJpY3Qg ZnVuY3Rpb24uCisJCSAqLworCQlBc3NlcnQoIXN0cmljdGZ1bmMpOwogCi0JCQkvKgotCQkJICog UmV2ZXJzZSB0aGUgcmVzdWx0IGZvciBOT1QgSU4gY2xhdXNlcyBzaW5jZSB0aGUgYWJvdmUgZnVu Y3Rpb24KLQkJCSAqIGlzIHRoZSBlcXVhbGl0eSBmdW5jdGlvbiBhbmQgd2UgbmVlZCBub3QtZXF1 YWxzLgotCQkJICovCi0JCQlpZiAoIWluY2xhdXNlKQotCQkJCXJlc3VsdCA9IEJvb2xHZXREYXR1 bSghRGF0dW1HZXRCb29sKHJlc3VsdCkpOworCQlyZXN1bHQgPSBCb29sR2V0RGF0dW0ob3AtPmQu aGFzaGVkc2NhbGFyYXJyYXlvcC5udWxsX2VxX251bGwpOworCQlyZXN1bHRudWxsID0gb3AtPmQu aGFzaGVkc2NhbGFyYXJyYXlvcC5udWxsX2VxX251bGxfaXNudWxsOworCisJCS8qCisJCSAqIElm IHRoZSBub24tc3RyaWN0IGZ1bmN0aW9uIHJldHVybmVkIGZhbHNlIGZvciBOVUxMID0gTlVMTCB0 aGVuIHdlCisJCSAqIG11c3Qgc3RpbGwgY29uc2lkZXIgb3RoZXIgYXJyYXkgbWVtYmVycy4gIFdo YXQgd2UgcmV0dXJuIGhlcmUgbXVzdAorCQkgKiBkZXBlbmQgb24gYm90aCBpZiB0aGVyZSBhcmUg YW55IG5vbi1udWxscyBpbiB0aGUgYXJyYXkgYW5kIHdoYXQgdGhlCisJCSAqIGZ1bmN0aW9uIHJl dHVybnMgZm9yIG51bGwgPSBub24tbnVsbC4gIElmIG51bGwgPSBub24tbnVsbCB5aWVsZHMKKwkJ ICogTlVMTCB0aGVuIHRoYXQncyB3aGF0IHdlIHJldHVybiBzbyB0aGF0IHdlIGJlaGF2ZSB0aGUg c2FtZSB3YXkgYXMKKwkJICogRUVPUF9TQ0FMQVJBUlJBWU9QLgorCQkgKi8KKwkJaWYgKCFyZXN1 bHRudWxsICYmICFEYXR1bUdldEJvb2wocmVzdWx0KSAmJgorCQkJb3AtPmQuaGFzaGVkc2NhbGFy YXJyYXlvcC5udWxsX2VxX25vbm51bGxfaXNudWxsICYmCisJCQlvcC0+ZC5oYXNoZWRzY2FsYXJh cnJheW9wLmVsZW1lbnRzX3RhYi0+aGFzaHRhYi0+bWVtYmVycyA+IDApCisJCXsKKwkJCXJlc3Vs dCA9IChEYXR1bSkgMDsKKwkJCXJlc3VsdG51bGwgPSB0cnVlOwogCQl9CisKKwkJLyoKKwkJICog UmV2ZXJzZSB0aGUgcmVzdWx0IGZvciBOT1QgSU4gY2xhdXNlcyBzaW5jZSB0aGUgYWJvdmUgZnVu Y3Rpb24gaXMKKwkJICogdGhlIGVxdWFsaXR5IGZ1bmN0aW9uIGFuZCB3ZSBuZWVkIG5vdC1lcXVh bHMuCisJCSAqLworCQllbHNlIGlmICghaW5jbGF1c2UpCisJCQlyZXN1bHQgPSBCb29sR2V0RGF0 dW0oIURhdHVtR2V0Qm9vbChyZXN1bHQpKTsKKwl9CisJZWxzZQorCXsKKwkJQXNzZXJ0KCFzdHJp Y3RmdW5jKTsKKworCQkvKgorCQkgKiBOVUxMIExIUyBhbmQgYXJyYXkgaGFzIG5vIE5VTExzLiAg VXNlIHRoZSB2YWx1ZSB0aGF0IHdlIGNhY2hlZCBmcm9tCisJCSAqIHRoZSB0ZXN0IGNhbGwgb2Yg dGhlIGZ1bmN0aW9uIHdlIGRpZCB3aGVuIGluc2VydGluZyB0aGUgZmlyc3QKKwkJICogbm9uLW51 bGwgaW50byB0aGUgaGFzaCB0YWJsZSBhYm92ZS4KKwkJICovCisJCXJlc3VsdCA9IG9wLT5kLmhh c2hlZHNjYWxhcmFycmF5b3AubnVsbF9lcV9ub25udWxsOworCQlyZXN1bHRudWxsID0gb3AtPmQu aGFzaGVkc2NhbGFyYXJyYXlvcC5udWxsX2VxX25vbm51bGxfaXNudWxsOworCisJCS8qIFJldmVy c2UgYW55IG5vbi1udWxsIHJlc3VsdCBmb3IgTk9UIElOIGNsYXVzZXMgKi8KKwkJaWYgKCFyZXN1 bHRudWxsICYmICFpbmNsYXVzZSkKKwkJCXJlc3VsdCA9IEJvb2xHZXREYXR1bSghRGF0dW1HZXRC b29sKHJlc3VsdCkpOwogCX0KIAogCSpvcC0+cmVzdmFsdWUgPSByZXN1bHQ7CmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9leGVjdXRvci9leGVjRXhwci5oIGIvc3JjL2luY2x1ZGUvZXhlY3V0b3Iv ZXhlY0V4cHIuaAppbmRleCBhYTliMzYxZmEzMS4uNTZlNmJiNWQyMzkgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWNFeHByLmgKKysrIGIvc3JjL2luY2x1ZGUvZXhlY3V0b3Iv ZXhlY0V4cHIuaApAQCAtNjQxLDYgKzY0MSwxMCBAQCB0eXBlZGVmIHN0cnVjdCBFeHByRXZhbFN0 ZXAKIAkJewogCQkJYm9vbAkJaGFzX251bGxzOwogCQkJYm9vbAkJaW5jbGF1c2U7CS8qIHRydWUg Zm9yIElOIGFuZCBmYWxzZSBmb3IgTk9UIElOICovCisJCQlib29sCQludWxsX2VxX25vbm51bGw7 CS8qIG5vbiBzdHJpY3QgZnVuYyBudWxsIGJlaGF2aW9yICovCisJCQlib29sCQludWxsX2VxX25v bm51bGxfaXNudWxsOyAvKiB0aGUgaXNudWxsIGZvciB0aGUgYWJvdmUgKi8KKwkJCWJvb2wJCW51 bGxfZXFfbnVsbDsJLyogbm9uIHN0cmljdCBmdW5jIG51bGwgYmVoYXZpb3IgKi8KKwkJCWJvb2wJ CW51bGxfZXFfbnVsbF9pc251bGw7CS8qIHRoZSBpc251bGwgZm9yIHRoZSBhYm92ZSAqLwogCQkJ c3RydWN0IFNjYWxhckFycmF5T3BFeHBySGFzaFRhYmxlICplbGVtZW50c190YWI7CiAJCQlGbWdy SW5mbyAgICpmaW5mbzsJLyogZnVuY3Rpb24ncyBsb29rdXAgZGF0YSAqLwogCQkJRnVuY3Rpb25D YWxsSW5mbyBmY2luZm9fZGF0YTsJLyogYXJndW1lbnRzIGV0YyAqLwpkaWZmIC0tZ2l0IGEvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9leHByZXNzaW9ucy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL2V4cHJlc3Npb25zLm91dAppbmRleCA5YTNjOTdiMTVhMy4uNTc2MTZhMDJjM2Mg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwcmVzc2lvbnMub3V0Cisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwcmVzc2lvbnMub3V0CkBAIC0zODcsNDIg KzM4NywxNzcgQEAgZGVmYXVsdCBmb3IgdHlwZSBteWludCB1c2luZyBoYXNoIGFzCiAgIG9wZXJh dG9yICAgIDEgICA9ICAobXlpbnQsIG15aW50KSwKICAgZnVuY3Rpb24gICAgMSAgIG15aW50aGFz aChteWludCk7CiBjcmVhdGUgdGFibGUgaW50dGVzdCAoYSBteWludCk7Ci1pbnNlcnQgaW50byBp bnR0ZXN0IHZhbHVlcygxOjpteWludCksKG51bGwpOwotLS0gdHJ5IGFuIGFycmF5IHdpdGggZW5v dWdoIGVsZW1lbnRzIHRvIGNhdXNlIGhhc2hpbmcKLXNlbGVjdCAqIGZyb20gaW50dGVzdCB3aGVy ZSBhIGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2Ojpt eWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCwgbnVsbCk7Ci0gYSAKLS0tLQotIDEKLSAK LSgyIHJvd3MpCitpbnNlcnQgaW50byBpbnR0ZXN0IHZhbHVlcyAoMTo6bXlpbnQpLCAoMjo6bXlp bnQpLCAobnVsbCk7CistLSBUZXN0IEVFT1BfSEFTSEVEX1NDQUxBUkFSUkFZT1AgYWdhaW5zdCBF RU9QX1NDQUxBUkFSUkFZT1AuICBFbnN1cmUgdGhlCistLSByZXN1bHQgb2Ygbm9uLWhhc2hlZCB2 cyBoYXNoZWQgaXMgdGhlIHNhbWUuCitzZWxlY3QKKyAgYSwKKyAgYSBpbiAoMTo6bXlpbnQsMjo6 bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlp bnQpIGFzIG5vdF9oYXNoZWQsCisgIGEgaW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6 Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBo YXNoZWQKK2Zyb20gaW50dGVzdDsKKyBhIHwgbm90X2hhc2hlZCB8IGhhc2hlZCAKKy0tLSstLS0t LS0tLS0tLS0rLS0tLS0tLS0KKyAxIHwgdCAgICAgICAgICB8IHQKKyAyIHwgdCAgICAgICAgICB8 IHQKKyAgIHwgICAgICAgICAgICB8IAorKDMgcm93cykKIAotc2VsZWN0ICogZnJvbSBpbnR0ZXN0 IHdoZXJlIGEgbm90IGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1Ojpt eWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCwgbnVsbCk7Ci0gYSAKLS0t LQotKDAgcm93cykKLQotc2VsZWN0ICogZnJvbSBpbnR0ZXN0IHdoZXJlIGEgbm90IGluICgwOjpt eWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWlu dCw4OjpteWludCw5OjpteWludCwgbnVsbCk7Ci0gYSAKLS0tLQotKDAgcm93cykKLQotLS0gZW5z dXJlIHRoZSByZXN1bHQgbWF0Y2hlZCB3aXRoIHRoZSBub24taGFzaGVkIHZlcnNpb24uICBXZSBz aW1wbHkgcmVtb3ZlCi0tLSBzb21lIGFycmF5IGVsZW1lbnRzIHNvIHRoYXQgd2UgZG9uJ3QgcmVh Y2ggdGhlIGhhc2hpbmcgdGhyZXNob2xkLgotc2VsZWN0ICogZnJvbSBpbnR0ZXN0IHdoZXJlIGEg aW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LCBudWxsKTsK LSBhIAotLS0tCi0gMQotIAotKDIgcm93cykKK3NlbGVjdAorICBhLAorICBhIGluIChudWxsOjpt eWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWlu dCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwKKyAgYSBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQs Mzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6 bXlpbnQpIGFzIGhhc2hlZAorIGZyb20gaW50dGVzdDsKKyBhIHwgbm90X2hhc2hlZCB8IGhhc2hl ZCAKKy0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAxIHwgICAgICAgICAgICB8IAorIDIgfCB0 ICAgICAgICAgIHwgdAorICAgfCB0ICAgICAgICAgIHwgdAorKDMgcm93cykKKworc2VsZWN0Cisg IGEsCisgIGEgbm90IGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1Ojpt eWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwKKyAgYSBub3Qg aW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50 LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKK2Zyb20gaW50dGVzdDsKKyBh IHwgbm90X2hhc2hlZCB8IGhhc2hlZCAKKy0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAxIHwg ZiAgICAgICAgICB8IGYKKyAyIHwgZiAgICAgICAgICB8IGYKKyAgIHwgICAgICAgICAgICB8IAor KDMgcm93cykKKworc2VsZWN0CisgIGEsCisgIGEgbm90IGluIChudWxsOjpteWludCwyOjpteWlu dCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkg YXMgbm90X2hhc2hlZCwKKyAgYSBub3QgaW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50 LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBh cyBoYXNoZWQKK2Zyb20gaW50dGVzdDsKKyBhIHwgbm90X2hhc2hlZCB8IGhhc2hlZCAKKy0tLSst LS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAxIHwgICAgICAgICAgICB8IAorIDIgfCBmICAgICAgICAg IHwgZgorICAgfCBmICAgICAgICAgIHwgZgorKDMgcm93cykKKworLS0gTm93IG1ha2UgdGhlIGVx dWFsIGZ1bmN0aW9uIHJldHVybiBmYWxzZSB3aGVuIGdpdmVuIHR3byBOVUxMcworY3JlYXRlIG9y IHJlcGxhY2UgZnVuY3Rpb24gbXlpbnRlcShteWludCwgbXlpbnQpIHJldHVybnMgYm9vbCBhcyAk JAorYmVnaW4KKyAgaWYgJDEgaXMgbnVsbCBhbmQgJDIgaXMgbnVsbCB0aGVuCisgICAgcmV0dXJu IGZhbHNlOworICBlbHNlCisgICAgcmV0dXJuICQxOjppbnQgPSAkMjo6aW50OworICBlbmQgaWY7 CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBnc3FsIGltbXV0YWJsZTsKKy0tIEFuZCB0cnkgdGhlIHNh bWUgYWdhaW4gdG8gZW5zdXJlIEVFT1BfSEFTSEVEX1NDQUxBUkFSUkFZT1AgZG9lcyB0aGUgc2Ft ZQorLS0gdGhpbmcgYXMgRUVPUF9TQ0FMQVJBUlJBWU9QLgorc2VsZWN0CisgIGEsCisgIGEgaW4g KDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6 Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIGluICgxOjpteWludCwyOjpteWlu dCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5 OjpteWludCkgYXMgaGFzaGVkCitmcm9tIGludHRlc3Q7CisgYSB8IG5vdF9oYXNoZWQgfCBoYXNo ZWQgCistLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tCisgMSB8IHQgICAgICAgICAgfCB0CisgMiB8 IHQgICAgICAgICAgfCB0CisgICB8ICAgICAgICAgICAgfCAKKygzIHJvd3MpCiAKLXNlbGVjdCAq IGZyb20gaW50dGVzdCB3aGVyZSBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQs NDo6bXlpbnQsNTo6bXlpbnQsIG51bGwpOwotIGEgCi0tLS0KLSgwIHJvd3MpCitzZWxlY3QKKyAg YSwKKyAgYSBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlp bnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFzIG5vdF9oYXNoZWQsCisgIGEgaW4gKG51 bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6 Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKKyBmcm9tIGludHRlc3Q7CisgYSB8 IG5vdF9oYXNoZWQgfCBoYXNoZWQgCistLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tCisgMSB8ICAg ICAgICAgICAgfCAKKyAyIHwgdCAgICAgICAgICB8IHQKKyAgIHwgICAgICAgICAgICB8IAorKDMg cm93cykKKworc2VsZWN0CisgIGEsCisgIGEgbm90IGluICgxOjpteWludCwyOjpteWludCwzOjpt eWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkgYXMgbm90 X2hhc2hlZCwKKyAgYSBub3QgaW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50 LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQK K2Zyb20gaW50dGVzdDsKKyBhIHwgbm90X2hhc2hlZCB8IGhhc2hlZCAKKy0tLSstLS0tLS0tLS0t LS0rLS0tLS0tLS0KKyAxIHwgZiAgICAgICAgICB8IGYKKyAyIHwgZiAgICAgICAgICB8IGYKKyAg IHwgICAgICAgICAgICB8IAorKDMgcm93cykKKworc2VsZWN0CisgIGEsCisgIGEgbm90IGluIChu dWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3 OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwKKyAgYSBub3QgaW4gKG51bGw6Om15aW50 LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6 Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKK2Zyb20gaW50dGVzdDsKKyBhIHwgbm90X2hhc2hl ZCB8IGhhc2hlZCAKKy0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAxIHwgICAgICAgICAgICB8 IAorIDIgfCBmICAgICAgICAgIHwgZgorICAgfCAgICAgICAgICAgIHwgCisoMyByb3dzKQogCi1z ZWxlY3QgKiBmcm9tIGludHRlc3Qgd2hlcmUgYSBub3QgaW4gKDA6Om15aW50LDI6Om15aW50LDM6 Om15aW50LDQ6Om15aW50LDU6Om15aW50LCBudWxsKTsKLSBhIAotLS0tCi0oMCByb3dzKQorLS0g VHJ5IG9uZSBtb3JlIHRpbWUgd2l0aCBzb21ldGhpbmcgZXZlbiBtb3JlIGJpemFycmUKK2NyZWF0 ZSBvciByZXBsYWNlIGZ1bmN0aW9uIG15aW50ZXEobXlpbnQsIG15aW50KSByZXR1cm5zIGJvb2wg YXMgJCQKK2JlZ2luCisgIGlmICQxIGlzIG51bGwgYW5kICQyIGlzIG51bGwgdGhlbgorICAgIHJl dHVybiBmYWxzZTsKKyAgZWxzaWYgICQxIGlzIG51bGwgYW5kICQyIGlzIG5vdCBudWxsIHRoZW4K KyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2lmICAkMSBpcyBub3QgbnVsbCBhbmQgJDIgaXMgbnVs bCB0aGVuCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlCisgICAgcmV0dXJuICQxOjppbnQgPSAk Mjo6aW50OworICBlbmQgaWY7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBnc3FsIGltbXV0YWJsZTsK K3NlbGVjdAorICBhLAorICBhIGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWlu dCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwKKyAg YSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlp bnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorZnJvbSBpbnR0ZXN0Owor IGEgfCBub3RfaGFzaGVkIHwgaGFzaGVkIAorLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLQorIDEg fCB0ICAgICAgICAgIHwgdAorIDIgfCB0ICAgICAgICAgIHwgdAorICAgfCBmICAgICAgICAgIHwg ZgorKDMgcm93cykKKworc2VsZWN0CisgIGEsCisgIGEgaW4gKG51bGw6Om15aW50LDI6Om15aW50 LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBh cyBub3RfaGFzaGVkLAorICBhIGluIChudWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0Ojpt eWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCkgYXMgaGFz aGVkCisgZnJvbSBpbnR0ZXN0OworIGEgfCBub3RfaGFzaGVkIHwgaGFzaGVkIAorLS0tKy0tLS0t LS0tLS0tLSstLS0tLS0tLQorIDEgfCBmICAgICAgICAgIHwgZgorIDIgfCB0ICAgICAgICAgIHwg dAorICAgfCBmICAgICAgICAgIHwgZgorKDMgcm93cykKKworc2VsZWN0CisgIGEsCisgIGEgbm90 IGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWlu dCw3OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwKKyAgYSBub3QgaW4gKDE6Om15aW50 LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6 Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKK2Zyb20gaW50dGVzdDsKKyBhIHwgbm90X2hhc2hl ZCB8IGhhc2hlZCAKKy0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAxIHwgZiAgICAgICAgICB8 IGYKKyAyIHwgZiAgICAgICAgICB8IGYKKyAgIHwgdCAgICAgICAgICB8IHQKKygzIHJvd3MpCisK K3NlbGVjdAorICBhLAorICBhIG5vdCBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQs NDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFzIG5vdF9oYXNo ZWQsCisgIGEgbm90IGluIChudWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1 OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCkgYXMgaGFzaGVkCitm cm9tIGludHRlc3Q7CisgYSB8IG5vdF9oYXNoZWQgfCBoYXNoZWQgCistLS0rLS0tLS0tLS0tLS0t Ky0tLS0tLS0tCisgMSB8IHQgICAgICAgICAgfCB0CisgMiB8IGYgICAgICAgICAgfCBmCisgICB8 IHQgICAgICAgICAgfCB0CisoMyByb3dzKQogCiByb2xsYmFjazsKZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL2V4cHJlc3Npb25zLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2V4 cHJlc3Npb25zLnNxbAppbmRleCBlMDJjMjFmMzM2OC4uZTQ4ZDZiMzE4NGEgMTAwNjQ0Ci0tLSBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2V4cHJlc3Npb25zLnNxbAorKysgYi9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9leHByZXNzaW9ucy5zcWwKQEAgLTE5NiwxNiArMTk2LDEwOCBAQCBkZWZhdWx0IGZv ciB0eXBlIG15aW50IHVzaW5nIGhhc2ggYXMKICAgZnVuY3Rpb24gICAgMSAgIG15aW50aGFzaCht eWludCk7CiAKIGNyZWF0ZSB0YWJsZSBpbnR0ZXN0IChhIG15aW50KTsKLWluc2VydCBpbnRvIGlu dHRlc3QgdmFsdWVzKDE6Om15aW50KSwobnVsbCk7Ci0KLS0tIHRyeSBhbiBhcnJheSB3aXRoIGVu b3VnaCBlbGVtZW50cyB0byBjYXVzZSBoYXNoaW5nCi1zZWxlY3QgKiBmcm9tIGludHRlc3Qgd2hl cmUgYSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6 bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQsIG51bGwpOwotc2VsZWN0ICogZnJvbSBp bnR0ZXN0IHdoZXJlIGEgbm90IGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWlu dCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCwgbnVsbCk7Ci1z ZWxlY3QgKiBmcm9tIGludHRlc3Qgd2hlcmUgYSBub3QgaW4gKDA6Om15aW50LDI6Om15aW50LDM6 Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15 aW50LCBudWxsKTsKLS0tIGVuc3VyZSB0aGUgcmVzdWx0IG1hdGNoZWQgd2l0aCB0aGUgbm9uLWhh c2hlZCB2ZXJzaW9uLiAgV2Ugc2ltcGx5IHJlbW92ZQotLS0gc29tZSBhcnJheSBlbGVtZW50cyBz byB0aGF0IHdlIGRvbid0IHJlYWNoIHRoZSBoYXNoaW5nIHRocmVzaG9sZC4KLXNlbGVjdCAqIGZy b20gaW50dGVzdCB3aGVyZSBhIGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWlu dCw1OjpteWludCwgbnVsbCk7Ci1zZWxlY3QgKiBmcm9tIGludHRlc3Qgd2hlcmUgYSBub3QgaW4g KDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LCBudWxsKTsKLXNl bGVjdCAqIGZyb20gaW50dGVzdCB3aGVyZSBhIG5vdCBpbiAoMDo6bXlpbnQsMjo6bXlpbnQsMzo6 bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsIG51bGwpOworaW5zZXJ0IGludG8gaW50dGVzdCB2YWx1 ZXMgKDE6Om15aW50KSwgKDI6Om15aW50KSwgKG51bGwpOworCistLSBUZXN0IEVFT1BfSEFTSEVE X1NDQUxBUkFSUkFZT1AgYWdhaW5zdCBFRU9QX1NDQUxBUkFSUkFZT1AuICBFbnN1cmUgdGhlCist LSByZXN1bHQgb2Ygbm9uLWhhc2hlZCB2cyBoYXNoZWQgaXMgdGhlIHNhbWUuCitzZWxlY3QKKyAg YSwKKyAgYSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQs Njo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFzIG5vdF9oYXNoZWQsCisgIGEgaW4gKDE6Om15 aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50 LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKK2Zyb20gaW50dGVzdDsKKworc2VsZWN0Cisg IGEsCisgIGEgaW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15 aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIGluIChu dWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3 OjpteWludCw4OjpteWludCw5OjpteWludCkgYXMgaGFzaGVkCisgZnJvbSBpbnR0ZXN0OworCitz ZWxlY3QKKyAgYSwKKyAgYSBub3QgaW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15 aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAor ICBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQs Njo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorZnJvbSBpbnR0 ZXN0OworCitzZWxlY3QKKyAgYSwKKyAgYSBub3QgaW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6 Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBhcyBu b3RfaGFzaGVkLAorICBhIG5vdCBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6 bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhh c2hlZAorZnJvbSBpbnR0ZXN0OworCistLSBOb3cgbWFrZSB0aGUgZXF1YWwgZnVuY3Rpb24gcmV0 dXJuIGZhbHNlIHdoZW4gZ2l2ZW4gdHdvIE5VTExzCitjcmVhdGUgb3IgcmVwbGFjZSBmdW5jdGlv biBteWludGVxKG15aW50LCBteWludCkgcmV0dXJucyBib29sIGFzICQkCitiZWdpbgorICBpZiAk MSBpcyBudWxsIGFuZCAkMiBpcyBudWxsIHRoZW4KKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UK KyAgICByZXR1cm4gJDE6OmludCA9ICQyOjppbnQ7CisgIGVuZCBpZjsKK2VuZDsKKyQkIGxhbmd1 YWdlIHBscGdzcWwgaW1tdXRhYmxlOworCistLSBBbmQgdHJ5IHRoZSBzYW1lIGFnYWluIHRvIGVu c3VyZSBFRU9QX0hBU0hFRF9TQ0FMQVJBUlJBWU9QIGRvZXMgdGhlIHNhbWUKKy0tIHRoaW5nIGFz IEVFT1BfU0NBTEFSQVJSQVlPUC4KK3NlbGVjdAorICBhLAorICBhIGluICgxOjpteWludCwyOjpt eWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWlu dCkgYXMgbm90X2hhc2hlZCwKKyAgYSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6 bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhh c2hlZAorZnJvbSBpbnR0ZXN0OworCitzZWxlY3QKKyAgYSwKKyAgYSBpbiAobnVsbDo6bXlpbnQs Mjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6 bXlpbnQpIGFzIG5vdF9oYXNoZWQsCisgIGEgaW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15 aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50 KSBhcyBoYXNoZWQKKyBmcm9tIGludHRlc3Q7CisKK3NlbGVjdAorICBhLAorICBhIG5vdCBpbiAo MTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6 bXlpbnQsODo6bXlpbnQpIGFzIG5vdF9oYXNoZWQsCisgIGEgbm90IGluICgxOjpteWludCwyOjpt eWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWlu dCw5OjpteWludCkgYXMgaGFzaGVkCitmcm9tIGludHRlc3Q7CisKK3NlbGVjdAorICBhLAorICBh IG5vdCBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQs Njo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFzIG5vdF9oYXNoZWQsCisgIGEgbm90IGluIChu dWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3 OjpteWludCw4OjpteWludCw5OjpteWludCkgYXMgaGFzaGVkCitmcm9tIGludHRlc3Q7CisKKy0t IFRyeSBvbmUgbW9yZSB0aW1lIHdpdGggc29tZXRoaW5nIGV2ZW4gbW9yZSBiaXphcnJlCitjcmVh dGUgb3IgcmVwbGFjZSBmdW5jdGlvbiBteWludGVxKG15aW50LCBteWludCkgcmV0dXJucyBib29s IGFzICQkCitiZWdpbgorICBpZiAkMSBpcyBudWxsIGFuZCAkMiBpcyBudWxsIHRoZW4KKyAgICBy ZXR1cm4gZmFsc2U7CisgIGVsc2lmICAkMSBpcyBudWxsIGFuZCAkMiBpcyBub3QgbnVsbCB0aGVu CisgICAgcmV0dXJuIGZhbHNlOworICBlbHNpZiAgJDEgaXMgbm90IG51bGwgYW5kICQyIGlzIG51 bGwgdGhlbgorICAgIHJldHVybiBmYWxzZTsKKyAgZWxzZQorICAgIHJldHVybiAkMTo6aW50ID0g JDI6OmludDsKKyAgZW5kIGlmOworZW5kOworJCQgbGFuZ3VhZ2UgcGxwZ3NxbCBpbW11dGFibGU7 CisKK3NlbGVjdAorICBhLAorICBhIGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0Ojpt eWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwK KyAgYSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6 bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorZnJvbSBpbnR0ZXN0 OworCitzZWxlY3QKKyAgYSwKKyAgYSBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQs NDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFzIG5vdF9oYXNo ZWQsCisgIGEgaW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15 aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKKyBmcm9t IGludHRlc3Q7CisKK3NlbGVjdAorICBhLAorICBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6bXlpbnQs Mzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFz IG5vdF9oYXNoZWQsCisgIGEgbm90IGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0Ojpt eWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCkgYXMgaGFz aGVkCitmcm9tIGludHRlc3Q7CisKK3NlbGVjdAorICBhLAorICBhIG5vdCBpbiAobnVsbDo6bXlp bnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQs ODo6bXlpbnQpIGFzIG5vdF9oYXNoZWQsCisgIGEgbm90IGluIChudWxsOjpteWludCwyOjpteWlu dCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5 OjpteWludCkgYXMgaGFzaGVkCitmcm9tIGludHRlc3Q7CiAKIHJvbGxiYWNrOwotLSAKMi41MS4w Cgo= --000000000000722c02064fdc24cf--