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 1wDpQ3-003PHt-1a for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 20:04:04 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDpQ0-00B3Qj-1O for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 20:04:00 +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 1wDpPz-00B3Qa-2a for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 20:04:00 +0000 Received: from mail-ej1-x629.google.com ([2a00:1450:4864:20::629]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDpPx-00000001WTl-24On for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 20:03:58 +0000 Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-b9c280322e0so147361466b.0 for ; Fri, 17 Apr 2026 13:03:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776456230; cv=none; d=google.com; s=arc-20240605; b=LJNv1EyLQxkDnovFnc/fuVpAUTnzSLbtapiljSWinzzJxI/nQhiDM21nasbsrml+NL gmlT/0OOhjLu48CAZL45TEXOqJbD//c85yGNm28pXU9hpq1x9vX/AjDietDlOqHgU8lP dmVA2088TTIizSz5RU18V0Ts6UawqnLi8a7Ad1xiSi41b3eZEk5nfQeP+ZoQmY+hDnms 2gSEK011GCp0mum/mDn44wqK5ZJJZAsG5lt5z8hRswkXFWG1qcv2uDYyfbJ4IhMfYiYK j88w1CbggMkIuMp7Omtmdm6LOzNRMwvUwGKHqSRk2OhaHhSQxaW5hFLVwTk0/8SWviI5 0Xmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=4MlJJvgtztORRplrWtr/JT1ki4YqLcg81+MA+7e79lw=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=VkzOJHYLDr5eA6+6asimFBaaRe3zth9MEheVt71ZX0h8yyoT4RGy7FMMYkctupVgK/ Nv+rV9hqPtm7QsHy9FD1ZFUnrB+XQwwx3zPbnNUSRmH2DNmCxtDkLersQ8Nlj32iM6Lz Ut8cgqoQ+9dqXDGQmzChb+DYuQSQPbh1Fehh5FuBLAlcvBa71stssazJN9MFuGt6ggLP 7ZKjvH7OvQEur76IsDS8hvvmyvGCHZQtr5mxPxzsC7/ebkrOr451yD8jq+GqmsFdO1Ob Go4bZxcAoBtmsa1yF3MssFTLugeadvfrmXIVogb45/6aqLSQWOK8RDbxGp8k+HR9uuXQ CIsw==; darn=lists.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=1776456230; x=1777061030; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=4MlJJvgtztORRplrWtr/JT1ki4YqLcg81+MA+7e79lw=; b=Il1REJQFywO2Bi4PnlfrRLkQW+X0RDz/5TaNJC9ZnYMDsO1gPV4M8cOpqAteHW8Ogu HTRKxd2WfNitS7Tu8k9fu82Vzo6Z1Gy6/c5Rp/Ga8aKYlGK8S0oTRiSvTd0Zv4hLHk9J fLpAP/9c45In4HFdLKuqyiIDsOZKhwOHg/uGWlAJEPhztkP0IGC88aSLEKJLQmIkSJcV tlujGYx9Wb0tbyqki/oLaMJQtSV0AaMd9wOcKdpwmpzHCGIu7OL4teUhcimkWCA8qWYh R3rT/GHV0cN9Ly7ZglLc1TxiG0sBQWZOeclXZF46FTq5LhLn7uiRx72JhDlzzyqQ2RX9 pbjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776456230; x=1777061030; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4MlJJvgtztORRplrWtr/JT1ki4YqLcg81+MA+7e79lw=; b=SEVLLfOVgpkendQK0yugbC6ddOEdFdtAFY3//mMD80/CGb3tezAzD+0VRha0/zI1pI QbwUxNo1aogFwO+6Cx36SbSqLdKF+o8DZb7DbpdL4TREL1gMllHXESeSDD2d3iDkn5mJ raTrNWjxalGV9H3nRd3PBepTa6GvsIoS4nPc0yMAQMwtc7khND076/5r2Hq1FGeYRpYU MqfiphwGUDNo/myY0p+Jb0rHzk6z+gAEQ9ces3+VnfozkLvNKN3M7ewzppsJdOFhc8ku Is7OqQ9HhT3rjUGABf7EgR8SHPsylTUDnEZ/B0eY3aXXqhgBFqOMa4Sjov2GDX/kqpNm HCgA== X-Gm-Message-State: AOJu0YyCt0BYUkzP5ZWw+wZtYz6tJeUPVPMLT5fe+d4gopdeshDjEnEL zn4H2dGylws2B+90qomcXew86cdPhiAb+Ifn+eSA4Bnq3GrfijFax8w7t8u8mJIaLorFoNP+qWh do8K7L4g90qb/CySpi7c8sXB12DLnclGE6i9p X-Gm-Gg: AeBDietIU9vdCXqIG7kwieqURmgCWXi+INhIo2tt3WHqMcnAg4f1KI+ISgOW5g7b25g 73daM2GcvB1z4JjDKAKpT/+NqRqKz+QRLf/ZRjcKPfL8ig73bwa+kBeG7+rXpJi2rcBKWvV8BwB yDw94mkQAyVDHjqW9rgvfNSV9eIuLRUXEKqg4RnPCstwvqmUGa5m2fOt1JLEtR3BgsKt4qIaRTn zJ1Gclc+yTqqmJQfMO2RO08PNRlXRCHQFDY4SrHYeRI3YVc8/hzTnTDc+njQJHB7aj9TDgVlXxw T9R/XW25S8OGamgI8fzgZr7JThm4 X-Received: by 2002:a17:907:8992:b0:b98:36cd:7e11 with SMTP id a640c23a62f3a-ba41b9d6d3dmr222750366b.45.1776456229665; Fri, 17 Apr 2026 13:03:49 -0700 (PDT) MIME-Version: 1.0 From: SATYANARAYANA NARLAPURAM Date: Fri, 17 Apr 2026 13:03:36 -0700 X-Gm-Features: AQROBzDyGWkpYTLVhA99RKdaZY3Qazn-olsEWqeuJrROfyiVcp_62QPBXVT1EUU Message-ID: Subject: [BUG]: WHERE CURRENT OF cursor fail on tables that have virtual generated columns To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000877b14064fad72f6" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000877b14064fad72f6 Content-Type: multipart/alternative; boundary="000000000000877b12064fad72f4" --000000000000877b12064fad72f4 Content-Type: text/plain; charset="UTF-8" Hi hackers, UPDATE and DELETE with WHERE CURRENT OF cursor fail on tables that have virtual generated columns, erroring with "WHERE CURRENT OF on a view is not implemented" even though the target is a regular table, not a view. Repro: create table gtest_cursor (id int primary key, a int, b int generated always as (a * 2) virtual); insert into gtest_cursor values (1, 10), (2, 20), (3, 30); begin; declare cur1 cursor for select * from gtest_cursor order by id for update; fetch 1 from cur1; update gtest_cursor set a = 99 where current of cur1; select * from gtest_cursor order by id; commit; Analysis: The bug stems from replace_rte_variables_mutator() in rewriteManip.c, which unconditionally errors on any CurrentOfExpr referencing the target relation. This appears to a check designed for view rewriting, where WHERE CURRENT OF cannot be translated through a view. However, virtual generated column (VGC) expansion also routes through this mutator. The rewriter's expand_generated_columns_internal() calls ReplaceVarsFromTargetList(), and the planner's expand_virtual_generated_columns() calls pullup_replace_vars(), which calls replace_rte_variables(). Since virtual generated columns use same mutator, while expanding virtual generated columns returns the same error even though the table is not a view and the cursor position is perfectly valid. The fix adds bool error_on_current_of to replace_rte_variables_context. The existing replace_rte_variables() is refactored into a static replace_rte_variables_internal() that accepts the flag, with two public wrappers: replace_rte_variables() (passes true, preserving existing behavior) and replace_rte_variables_ext() (exposes the flag). The same pattern is applied to ReplaceVarsFromTargetList() / ReplaceVarsFromTargetListExtended(). In replace_rte_variables_mutator(), the CurrentOfExpr error is now conditional on context->error_on_current_of. The two VGC expansion call sites pass false; all other callers pass true. The down side of this approach is that it is adding additional public API. Alternative considered: RTE-lookup approach. Instead of a flag, the mutator could look up the target RTE in the query's range table and check rte->rtekind, if it is RTE_RELATION, skip the error. Since the mutator doesn't have access to the range table and threading an RTE or range table pointer through the context would be equally invasive I didn't pursue this further. Went with the flag approach because it is simpler, explicit, and keeps the mutator's contract clean. Thoughts or any other ideas how to fix this? Thanks, Satya --000000000000877b12064fad72f4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi hackers,

UPDATE and DELETE with WHER= E CURRENT OF cursor fail on tables that have virtual generated columns, err= oring with "WHERE CURRENT OF on a view is not implemented" even t= hough the target is a regular table, not a view.

R= epro:

create table gtest_cursor (id int primary ke= y, a int, b int generated always as (a * 2) virtual);
insert into gtest_= cursor values (1, 10), (2, 20), (3, 30);

begin;
declare cur1 curs= or for select * from gtest_cursor order by id for update;
fetch 1 from c= ur1;
update gtest_cursor set a =3D 99 where current of cur1;
select *= from gtest_cursor order by id;
commit;

Analysi= s:
The bug stems from replace_rte_variables_mutator() in rewriteM= anip.c, which unconditionally errors on any CurrentOfExpr referencing the t= arget relation. This appears to a check designed for view rewriting, where = WHERE CURRENT OF cannot be translated through a view. However, virtual gene= rated column (VGC) expansion also routes through this mutator. The rewriter= 's expand_generated_columns_internal() calls ReplaceVarsFromTargetList(= ), and the planner's expand_virtual_generated_columns() calls pullup_re= place_vars(), which calls replace_rte_variables(). Since virtual generated = columns use same mutator, while expanding virtual generated columns returns= the same error even though the table is not a view and the cursor position= is perfectly valid.

The fix adds bool error_on_current_of to replac= e_rte_variables_context. The existing replace_rte_variables() is refactored= into a static replace_rte_variables_internal() that accepts the flag, with= two public wrappers: replace_rte_variables() (passes true, preserving exis= ting behavior) and replace_rte_variables_ext() (exposes the flag). The same= pattern is applied to ReplaceVarsFromTargetList() / ReplaceVarsFromTargetL= istExtended(). In replace_rte_variables_mutator(), the CurrentOfExpr error = is now conditional on context->error_on_current_of. The two VGC expansio= n call sites pass false; all other callers pass true. The down side of this= approach is that it is adding additional public API.

Alternative co= nsidered: RTE-lookup approach. Instead of a flag, the mutator could look up= the target RTE in the query's range table and check rte->rtekind, i= f it is RTE_RELATION, skip the error. Since the mutator doesn't have ac= cess to the range table and threading an RTE or range table pointer through= the context would be equally invasive I didn't pursue this further. We= nt with the flag approach because it is simpler, explicit, and keeps the mu= tator's contract clean.

Thoughts or any other = ideas how to fix this?

Thanks,
Satya
--000000000000877b12064fad72f4-- --000000000000877b14064fad72f6 Content-Type: application/octet-stream; name="v1-0001-vgc-where-current-of-fix.patch" Content-Disposition: attachment; filename="v1-0001-vgc-where-current-of-fix.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo3c5afu0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wcmVwL3ByZXBqb2ludHJlZS5jIGIv c3JjL2JhY2tlbmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVlLmMKaW5kZXggOTViZjUxNjAu LjY1NGUzNzY4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJlcC9wcmVwam9p bnRyZWUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJlcC9wcmVwam9pbnRyZWUuYwpA QCAtODIsNiArODIsNyBAQCB0eXBlZGVmIHN0cnVjdCBwdWxsdXBfcmVwbGFjZV92YXJzX2NvbnRl eHQKIAlpbnQJCQl2YXJubzsJCQkvKiB2YXJubyBvZiBzdWJxdWVyeSAqLwogCVJlcGxhY2VXcmFw T3B0aW9uIHdyYXBfb3B0aW9uOwkvKiBkbyB3ZSBuZWVkIGNlcnRhaW4gb3V0cHV0cyB0byBiZSBQ SFZzPyAqLwogCU5vZGUJICAqKnJ2X2NhY2hlOwkJLyogY2FjaGUgZm9yIHJlc3VsdHMgd2l0aCBQ SFZzICovCisJYm9vbAkJZXJyb3Jfb25fY3VycmVudF9vZjsJLyogZXJyb3Igb24gQ3VycmVudE9m RXhwcj8gKi8KIH0gcHVsbHVwX3JlcGxhY2VfdmFyc19jb250ZXh0OwogCiB0eXBlZGVmIHN0cnVj dCByZWR1Y2Vfb3V0ZXJfam9pbnNfcGFzczFfc3RhdGUKQEAgLTU2Niw2ICs1NjcsMTIgQEAgZXhw YW5kX3ZpcnR1YWxfZ2VuZXJhdGVkX2NvbHVtbnMoUGxhbm5lckluZm8gKnJvb3QsIFF1ZXJ5ICpw YXJzZSwKIAkJaWYgKHBhcnNlLT5ncm91cGluZ1NldHMpCiAJCQlydmNvbnRleHQud3JhcF9vcHRp b24gPSBSRVBMQUNFX1dSQVBfQUxMOwogCisJCS8qCisJCSAqIERvbid0IGVycm9yIG9uIEN1cnJl bnRPZkV4cHIgZHVyaW5nIFZHQyBleHBhbnNpb247IHRoZSB0YWJsZSBpcworCQkgKiByZWFsLCBu b3QgYSB2aWV3LCBzbyBXSEVSRSBDVVJSRU5UIE9GIGlzIGxlZ2l0aW1hdGUuCisJCSAqLworCQly dmNvbnRleHQuZXJyb3Jfb25fY3VycmVudF9vZiA9IGZhbHNlOworCiAJCS8qCiAJCSAqIEFwcGx5 IHB1bGx1cCB2YXJpYWJsZSByZXBsYWNlbWVudCB0aHJvdWdob3V0IHRoZSBxdWVyeSB0cmVlLgog CQkgKi8KQEAgLTE1NzksNiArMTU4Niw3IEBAIHB1bGxfdXBfc2ltcGxlX3N1YnF1ZXJ5KFBsYW5u ZXJJbmZvICpyb290LCBOb2RlICpqdG5vZGUsIFJhbmdlVGJsRW50cnkgKnJ0ZSwKIAkvKiBpbml0 aWFsaXplIGNhY2hlIGFycmF5IHdpdGggaW5kZXhlcyAwIC4uIGxlbmd0aCh0bGlzdCkgKi8KIAly dmNvbnRleHQucnZfY2FjaGUgPSBwYWxsb2MwKChsaXN0X2xlbmd0aChzdWJxdWVyeS0+dGFyZ2V0 TGlzdCkgKyAxKSAqCiAJCQkJCQkJCSBzaXplb2YoTm9kZSAqKSk7CisJcnZjb250ZXh0LmVycm9y X29uX2N1cnJlbnRfb2YgPSB0cnVlOwogCiAJLyoKIAkgKiBJZiB0aGUgcGFyZW50IHF1ZXJ5IHVz ZXMgZ3JvdXBpbmcgc2V0cywgd2UgbmVlZCBhIFBsYWNlSG9sZGVyVmFyIGZvcgpAQCAtMjEyNCw2 ICsyMTMyLDcgQEAgcHVsbF91cF9zaW1wbGVfdmFsdWVzKFBsYW5uZXJJbmZvICpyb290LCBOb2Rl ICpqdG5vZGUsIFJhbmdlVGJsRW50cnkgKnJ0ZSkKIAkvKiBpbml0aWFsaXplIGNhY2hlIGFycmF5 IHdpdGggaW5kZXhlcyAwIC4uIGxlbmd0aCh0bGlzdCkgKi8KIAlydmNvbnRleHQucnZfY2FjaGUg PSBwYWxsb2MwKChsaXN0X2xlbmd0aCh0bGlzdCkgKyAxKSAqCiAJCQkJCQkJCSBzaXplb2YoTm9k ZSAqKSk7CisJcnZjb250ZXh0LmVycm9yX29uX2N1cnJlbnRfb2YgPSB0cnVlOwogCiAJLyoKIAkg KiBSZXBsYWNlIGFsbCBvZiB0aGUgdG9wIHF1ZXJ5J3MgcmVmZXJlbmNlcyB0byB0aGUgUlRFJ3Mg b3V0cHV0cyB3aXRoCkBAIC0yMjkyLDYgKzIzMDEsNyBAQCBwdWxsX3VwX2NvbnN0YW50X2Z1bmN0 aW9uKFBsYW5uZXJJbmZvICpyb290LCBOb2RlICpqdG5vZGUsCiAJLyogaW5pdGlhbGl6ZSBjYWNo ZSBhcnJheSB3aXRoIGluZGV4ZXMgMCAuLiBsZW5ndGgodGxpc3QpICovCiAJcnZjb250ZXh0LnJ2 X2NhY2hlID0gcGFsbG9jMCgobGlzdF9sZW5ndGgocnZjb250ZXh0LnRhcmdldGxpc3QpICsgMSkg KgogCQkJCQkJCQkgc2l6ZW9mKE5vZGUgKikpOworCXJ2Y29udGV4dC5lcnJvcl9vbl9jdXJyZW50 X29mID0gdHJ1ZTsKIAogCS8qCiAJICogSWYgdGhlIHBhcmVudCBxdWVyeSB1c2VzIGdyb3VwaW5n IHNldHMsIHdlIG5lZWQgYSBQbGFjZUhvbGRlclZhciBmb3IKQEAgLTI3NTQsMTEgKzI3NjQsMTIg QEAgcmVwbGFjZV92YXJzX2luX2pvaW50cmVlKE5vZGUgKmp0bm9kZSwKIHN0YXRpYyBOb2RlICoK IHB1bGx1cF9yZXBsYWNlX3ZhcnMoTm9kZSAqZXhwciwgcHVsbHVwX3JlcGxhY2VfdmFyc19jb250 ZXh0ICpjb250ZXh0KQogewotCXJldHVybiByZXBsYWNlX3J0ZV92YXJpYWJsZXMoZXhwciwKLQkJ CQkJCQkJIGNvbnRleHQtPnZhcm5vLCAwLAotCQkJCQkJCQkgcHVsbHVwX3JlcGxhY2VfdmFyc19j YWxsYmFjaywKLQkJCQkJCQkJIGNvbnRleHQsCi0JCQkJCQkJCSBjb250ZXh0LT5vdXRlcl9oYXNT dWJMaW5rcyk7CisJcmV0dXJuIHJlcGxhY2VfcnRlX3ZhcmlhYmxlc19leHQoZXhwciwKKwkJCQkJ CQkJCSBjb250ZXh0LT52YXJubywgMCwKKwkJCQkJCQkJCSBwdWxsdXBfcmVwbGFjZV92YXJzX2Nh bGxiYWNrLAorCQkJCQkJCQkJIGNvbnRleHQsCisJCQkJCQkJCQkgY29udGV4dC0+b3V0ZXJfaGFz U3ViTGlua3MsCisJCQkJCQkJCQkgY29udGV4dC0+ZXJyb3Jfb25fY3VycmVudF9vZik7CiB9CiAK IHN0YXRpYyBOb2RlICoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Jld3JpdGUvcmV3cml0ZUhh bmRsZXIuYyBiL3NyYy9iYWNrZW5kL3Jld3JpdGUvcmV3cml0ZUhhbmRsZXIuYwppbmRleCAwMjFj NzNmMS4uOTdmOTQ3MTUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Jld3JpdGUvcmV3cml0ZUhh bmRsZXIuYworKysgYi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmMKQEAgLTQ1 NzQsMTAgKzQ1NzQsMTIgQEAgZXhwYW5kX2dlbmVyYXRlZF9jb2x1bW5zX2ludGVybmFsKE5vZGUg Km5vZGUsIFJlbGF0aW9uIHJlbCwgaW50IHJ0X2luZGV4LAogCiAJCUFzc2VydChsaXN0X2xlbmd0 aCh0bGlzdCkgPiAwKTsKIAotCQlub2RlID0gUmVwbGFjZVZhcnNGcm9tVGFyZ2V0TGlzdChub2Rl LCBydF9pbmRleCwgMCwgcnRlLCB0bGlzdCwKLQkJCQkJCQkJCQkgcmVzdWx0X3JlbGF0aW9uLAot CQkJCQkJCQkJCSBSRVBMQUNFVkFSU19DSEFOR0VfVkFSTk8sIHJ0X2luZGV4LAotCQkJCQkJCQkJ CSBOVUxMKTsKKwkJbm9kZSA9IFJlcGxhY2VWYXJzRnJvbVRhcmdldExpc3RFeHRlbmRlZChub2Rl LCBydF9pbmRleCwgMCwKKwkJCQkJCQkJCQkJCXJ0ZSwgdGxpc3QsCisJCQkJCQkJCQkJCQlyZXN1 bHRfcmVsYXRpb24sCisJCQkJCQkJCQkJCQlSRVBMQUNFVkFSU19DSEFOR0VfVkFSTk8sCisJCQkJ CQkJCQkJCQlydF9pbmRleCwKKwkJCQkJCQkJCQkJCU5VTEwsIGZhbHNlKTsKIAl9CiAKIAlyZXR1 cm4gbm9kZTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Jld3JpdGUvcmV3cml0ZU1hbmlwLmMg Yi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVNYW5pcC5jCmluZGV4IDRiZjRhYTBkLi41YjY4 NzJlZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdyaXRlTWFuaXAuYworKysg Yi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVNYW5pcC5jCkBAIC0xNDQzLDExICsxNDQzLDEy IEBAIHJlbW92ZV9udWxsaW5nX3JlbGlkc19tdXRhdG9yKE5vZGUgKm5vZGUsCiAgKiBjb252ZW5p ZW50IHRvIHJlY3Vyc2UgZGlyZWN0bHkgdG8gdGhlIG11dGF0b3Igb24gc3ViLWV4cHJlc3Npb25z IG9mCiAgKiB3aGF0IHRoZXkgd2lsbCByZXR1cm4uCiAgKi8KLU5vZGUgKgotcmVwbGFjZV9ydGVf dmFyaWFibGVzKE5vZGUgKm5vZGUsIGludCB0YXJnZXRfdmFybm8sIGludCBzdWJsZXZlbHNfdXAs Ci0JCQkJCSAgcmVwbGFjZV9ydGVfdmFyaWFibGVzX2NhbGxiYWNrIGNhbGxiYWNrLAotCQkJCQkg IHZvaWQgKmNhbGxiYWNrX2FyZywKLQkJCQkJICBib29sICpvdXRlcl9oYXNTdWJMaW5rcykKK3N0 YXRpYyBOb2RlICoKK3JlcGxhY2VfcnRlX3ZhcmlhYmxlc19pbnRlcm5hbChOb2RlICpub2RlLCBp bnQgdGFyZ2V0X3Zhcm5vLCBpbnQgc3VibGV2ZWxzX3VwLAorCQkJCQkJCSAgIHJlcGxhY2VfcnRl X3ZhcmlhYmxlc19jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkJCQkgICB2b2lkICpjYWxsYmFja19h cmcsCisJCQkJCQkJICAgYm9vbCAqb3V0ZXJfaGFzU3ViTGlua3MsCisJCQkJCQkJICAgYm9vbCBl cnJvcl9vbl9jdXJyZW50X29mKQogewogCU5vZGUJICAgKnJlc3VsdDsKIAlyZXBsYWNlX3J0ZV92 YXJpYWJsZXNfY29udGV4dCBjb250ZXh0OwpAQCAtMTQ1Niw2ICsxNDU3LDcgQEAgcmVwbGFjZV9y dGVfdmFyaWFibGVzKE5vZGUgKm5vZGUsIGludCB0YXJnZXRfdmFybm8sIGludCBzdWJsZXZlbHNf dXAsCiAJY29udGV4dC5jYWxsYmFja19hcmcgPSBjYWxsYmFja19hcmc7CiAJY29udGV4dC50YXJn ZXRfdmFybm8gPSB0YXJnZXRfdmFybm87CiAJY29udGV4dC5zdWJsZXZlbHNfdXAgPSBzdWJsZXZl bHNfdXA7CisJY29udGV4dC5lcnJvcl9vbl9jdXJyZW50X29mID0gZXJyb3Jfb25fY3VycmVudF9v ZjsKIAogCS8qCiAJICogV2UgdHJ5IHRvIGluaXRpYWxpemUgaW5zZXJ0ZWRfc3VibGluayB0byB0 cnVlIGlmIHRoZXJlIGlzIG5vIG5lZWQgdG8KQEAgLTE0OTAsNiArMTQ5MiwzNyBAQCByZXBsYWNl X3J0ZV92YXJpYWJsZXMoTm9kZSAqbm9kZSwgaW50IHRhcmdldF92YXJubywgaW50IHN1YmxldmVs c191cCwKIAlyZXR1cm4gcmVzdWx0OwogfQogCitOb2RlICoKK3JlcGxhY2VfcnRlX3ZhcmlhYmxl cyhOb2RlICpub2RlLCBpbnQgdGFyZ2V0X3Zhcm5vLCBpbnQgc3VibGV2ZWxzX3VwLAorCQkJCQkg IHJlcGxhY2VfcnRlX3ZhcmlhYmxlc19jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkJICB2b2lkICpj YWxsYmFja19hcmcsCisJCQkJCSAgYm9vbCAqb3V0ZXJfaGFzU3ViTGlua3MpCit7CisJcmV0dXJu IHJlcGxhY2VfcnRlX3ZhcmlhYmxlc19pbnRlcm5hbChub2RlLCB0YXJnZXRfdmFybm8sIHN1Ymxl dmVsc191cCwKKwkJCQkJCQkJCQkgIGNhbGxiYWNrLCBjYWxsYmFja19hcmcsCisJCQkJCQkJCQkJ ICBvdXRlcl9oYXNTdWJMaW5rcywgdHJ1ZSk7Cit9CisKKy8qCisgKiByZXBsYWNlX3J0ZV92YXJp YWJsZXNfZXh0IC0KKyAqCQlBcyBhYm92ZSwgYnV0IHdpdGggY29udHJvbCBvdmVyIEN1cnJlbnRP ZkV4cHIgZXJyb3IgYmVoYXZpb3IuCisgKgorICogSWYgZXJyb3Jfb25fY3VycmVudF9vZiBpcyBm YWxzZSwgQ3VycmVudE9mRXhwciBub2RlcyByZWZlcmVuY2luZyB0aGUKKyAqIHRhcmdldCByZWxh dGlvbiB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkIHJhdGhlciB0aGFuIHJhaXNpbmcgYW4gZXJyb3Iu CisgKi8KK05vZGUgKgorcmVwbGFjZV9ydGVfdmFyaWFibGVzX2V4dChOb2RlICpub2RlLCBpbnQg dGFyZ2V0X3Zhcm5vLCBpbnQgc3VibGV2ZWxzX3VwLAorCQkJCQkJICByZXBsYWNlX3J0ZV92YXJp YWJsZXNfY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCQkgIHZvaWQgKmNhbGxiYWNrX2FyZywKKwkJ CQkJCSAgYm9vbCAqb3V0ZXJfaGFzU3ViTGlua3MsCisJCQkJCQkgIGJvb2wgZXJyb3Jfb25fY3Vy cmVudF9vZikKK3sKKwlyZXR1cm4gcmVwbGFjZV9ydGVfdmFyaWFibGVzX2ludGVybmFsKG5vZGUs IHRhcmdldF92YXJubywgc3VibGV2ZWxzX3VwLAorCQkJCQkJCQkJCSAgY2FsbGJhY2ssIGNhbGxi YWNrX2FyZywKKwkJCQkJCQkJCQkgIG91dGVyX2hhc1N1YkxpbmtzLAorCQkJCQkJCQkJCSAgZXJy b3Jfb25fY3VycmVudF9vZik7Cit9CisKIE5vZGUgKgogcmVwbGFjZV9ydGVfdmFyaWFibGVzX211 dGF0b3IoTm9kZSAqbm9kZSwKIAkJCQkJCQkgIHJlcGxhY2VfcnRlX3ZhcmlhYmxlc19jb250ZXh0 ICpjb250ZXh0KQpAQCAtMTUxOSw3ICsxNTUyLDggQEAgcmVwbGFjZV9ydGVfdmFyaWFibGVzX211 dGF0b3IoTm9kZSAqbm9kZSwKIAkJQ3VycmVudE9mRXhwciAqY2V4cHIgPSAoQ3VycmVudE9mRXhw ciAqKSBub2RlOwogCiAJCWlmIChjZXhwci0+Y3Zhcm5vID09IGNvbnRleHQtPnRhcmdldF92YXJu byAmJgotCQkJY29udGV4dC0+c3VibGV2ZWxzX3VwID09IDApCisJCQljb250ZXh0LT5zdWJsZXZl bHNfdXAgPT0gMCAmJgorCQkJY29udGV4dC0+ZXJyb3Jfb25fY3VycmVudF9vZikKIAkJewogCQkJ LyoKIAkJCSAqIFdlIGdldCBoZXJlIGlmIGEgV0hFUkUgQ1VSUkVOVCBPRiBleHByZXNzaW9uIHR1 cm5zIG91dCB0byBhcHBseQpAQCAtMTk3OCw2ICsyMDEyLDM3IEBAIFJlcGxhY2VWYXJzRnJvbVRh cmdldExpc3QoTm9kZSAqbm9kZSwKIAkJCQkJCSAgUmVwbGFjZVZhcnNOb01hdGNoT3B0aW9uIG5v bWF0Y2hfb3B0aW9uLAogCQkJCQkJICBpbnQgbm9tYXRjaF92YXJubywKIAkJCQkJCSAgYm9vbCAq b3V0ZXJfaGFzU3ViTGlua3MpCit7CisJcmV0dXJuIFJlcGxhY2VWYXJzRnJvbVRhcmdldExpc3RF eHRlbmRlZChub2RlLCB0YXJnZXRfdmFybm8sIHN1YmxldmVsc191cCwKKwkJCQkJCQkJCQkJdGFy Z2V0X3J0ZSwgdGFyZ2V0bGlzdCwKKwkJCQkJCQkJCQkJcmVzdWx0X3JlbGF0aW9uLCBub21hdGNo X29wdGlvbiwKKwkJCQkJCQkJCQkJbm9tYXRjaF92YXJubywgb3V0ZXJfaGFzU3ViTGlua3MsCisJ CQkJCQkJCQkJCXRydWUpOworfQorCisvKgorICogUmVwbGFjZVZhcnNGcm9tVGFyZ2V0TGlzdEV4 dGVuZGVkIC0KKyAqCQlBcyBhYm92ZSwgYnV0IHdpdGggYWRkaXRpb25hbCBjb250cm9sIG92ZXIg Q3VycmVudE9mRXhwciBoYW5kbGluZy4KKyAqCisgKiBJZiBlcnJvcl9vbl9jdXJyZW50X29mIGlz IHRydWUgKHRoZSBkZWZhdWx0IGZvciBSZXBsYWNlVmFyc0Zyb21UYXJnZXRMaXN0KSwKKyAqIGFu IGVycm9yIGlzIHJhaXNlZCBpZiBhIEN1cnJlbnRPZkV4cHIgaXMgZm91bmQgcmVmZXJlbmNpbmcg dGhlIHRhcmdldAorICogcmVsYXRpb24uICBUaGlzIGlzIGFwcHJvcHJpYXRlIGZvciB2aWV3IHJl d3JpdGluZywgd2hlcmUgV0hFUkUgQ1VSUkVOVCBPRgorICogY2Fubm90IGJlIHRyYW5zbGF0ZWQg dG8gdGhlIHVuZGVybHlpbmcgdGFibGUuCisgKgorICogSWYgZXJyb3Jfb25fY3VycmVudF9vZiBp cyBmYWxzZSwgQ3VycmVudE9mRXhwciBub2RlcyBhcmUgbGVmdCB1bmNoYW5nZWQuCisgKiBUaGlz IGlzIHVzZWQgYnkgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1uIGV4cGFuc2lvbiwgd2hlcmUgd2Ug YXJlIG9ubHkKKyAqIHJlcGxhY2luZyBjb2x1bW4gcmVmZXJlbmNlcywgbm90IGNoYW5naW5nIHRo ZSB0YXJnZXQgcmVsYXRpb24uCisgKi8KK05vZGUgKgorUmVwbGFjZVZhcnNGcm9tVGFyZ2V0TGlz dEV4dGVuZGVkKE5vZGUgKm5vZGUsCisJCQkJCQkJCSAgaW50IHRhcmdldF92YXJubywgaW50IHN1 YmxldmVsc191cCwKKwkJCQkJCQkJICBSYW5nZVRibEVudHJ5ICp0YXJnZXRfcnRlLAorCQkJCQkJ CQkgIExpc3QgKnRhcmdldGxpc3QsCisJCQkJCQkJCSAgaW50IHJlc3VsdF9yZWxhdGlvbiwKKwkJ CQkJCQkJICBSZXBsYWNlVmFyc05vTWF0Y2hPcHRpb24gbm9tYXRjaF9vcHRpb24sCisJCQkJCQkJ CSAgaW50IG5vbWF0Y2hfdmFybm8sCisJCQkJCQkJCSAgYm9vbCAqb3V0ZXJfaGFzU3ViTGlua3Ms CisJCQkJCQkJCSAgYm9vbCBlcnJvcl9vbl9jdXJyZW50X29mKQogewogCVJlcGxhY2VWYXJzRnJv bVRhcmdldExpc3RfY29udGV4dCBjb250ZXh0OwogCkBAIC0xOTg3LDggKzIwNTIsOSBAQCBSZXBs YWNlVmFyc0Zyb21UYXJnZXRMaXN0KE5vZGUgKm5vZGUsCiAJY29udGV4dC5ub21hdGNoX29wdGlv biA9IG5vbWF0Y2hfb3B0aW9uOwogCWNvbnRleHQubm9tYXRjaF92YXJubyA9IG5vbWF0Y2hfdmFy bm87CiAKLQlyZXR1cm4gcmVwbGFjZV9ydGVfdmFyaWFibGVzKG5vZGUsIHRhcmdldF92YXJubywg c3VibGV2ZWxzX3VwLAotCQkJCQkJCQkgUmVwbGFjZVZhcnNGcm9tVGFyZ2V0TGlzdF9jYWxsYmFj aywKLQkJCQkJCQkJICZjb250ZXh0LAotCQkJCQkJCQkgb3V0ZXJfaGFzU3ViTGlua3MpOworCXJl dHVybiByZXBsYWNlX3J0ZV92YXJpYWJsZXNfaW50ZXJuYWwobm9kZSwgdGFyZ2V0X3Zhcm5vLCBz dWJsZXZlbHNfdXAsCisJCQkJCQkJCQkJICBSZXBsYWNlVmFyc0Zyb21UYXJnZXRMaXN0X2NhbGxi YWNrLAorCQkJCQkJCQkJCSAgJmNvbnRleHQsCisJCQkJCQkJCQkJICBvdXRlcl9oYXNTdWJMaW5r cywKKwkJCQkJCQkJCQkgIGVycm9yX29uX2N1cnJlbnRfb2YpOwogfQpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvcmV3cml0ZS9yZXdyaXRlTWFuaXAuaCBiL3NyYy9pbmNsdWRlL3Jld3JpdGUvcmV3 cml0ZU1hbmlwLmgKaW5kZXggYTZkNGU4ODguLmViNjZiNzE0IDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS9yZXdyaXRlL3Jld3JpdGVNYW5pcC5oCisrKyBiL3NyYy9pbmNsdWRlL3Jld3JpdGUvcmV3 cml0ZU1hbmlwLmgKQEAgLTMyLDYgKzMyLDcgQEAgc3RydWN0IHJlcGxhY2VfcnRlX3ZhcmlhYmxl c19jb250ZXh0CiAJaW50CQkJdGFyZ2V0X3Zhcm5vOwkvKiBSVEUgaW5kZXggdG8gc2VhcmNoIGZv ciAqLwogCWludAkJCXN1YmxldmVsc191cDsJLyogKGN1cnJlbnQpIG5lc3RpbmcgZGVwdGggKi8K IAlib29sCQlpbnNlcnRlZF9zdWJsaW5rOwkvKiBoYXZlIHdlIGluc2VydGVkIGEgU3ViTGluaz8g Ki8KKwlib29sCQllcnJvcl9vbl9jdXJyZW50X29mOwkvKiBlcnJvciBvbiBDdXJyZW50T2ZFeHBy PyAqLwogfTsKIAogdHlwZWRlZiBlbnVtIFJlcGxhY2VWYXJzTm9NYXRjaE9wdGlvbgpAQCAtOTYs NiArOTcsMTIgQEAgZXh0ZXJuIE5vZGUgKnJlcGxhY2VfcnRlX3ZhcmlhYmxlcyhOb2RlICpub2Rl LAogCQkJCQkJCQkgICByZXBsYWNlX3J0ZV92YXJpYWJsZXNfY2FsbGJhY2sgY2FsbGJhY2ssCiAJ CQkJCQkJCSAgIHZvaWQgKmNhbGxiYWNrX2FyZywKIAkJCQkJCQkJICAgYm9vbCAqb3V0ZXJfaGFz U3ViTGlua3MpOworZXh0ZXJuIE5vZGUgKnJlcGxhY2VfcnRlX3ZhcmlhYmxlc19leHQoTm9kZSAq bm9kZSwKKwkJCQkJCQkJCSAgIGludCB0YXJnZXRfdmFybm8sIGludCBzdWJsZXZlbHNfdXAsCisJ CQkJCQkJCQkgICByZXBsYWNlX3J0ZV92YXJpYWJsZXNfY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJ CQkJCQkgICB2b2lkICpjYWxsYmFja19hcmcsCisJCQkJCQkJCQkgICBib29sICpvdXRlcl9oYXNT dWJMaW5rcywKKwkJCQkJCQkJCSAgIGJvb2wgZXJyb3Jfb25fY3VycmVudF9vZik7CiBleHRlcm4g Tm9kZSAqcmVwbGFjZV9ydGVfdmFyaWFibGVzX211dGF0b3IoTm9kZSAqbm9kZSwKIAkJCQkJCQkJ CQkgICByZXBsYWNlX3J0ZV92YXJpYWJsZXNfY29udGV4dCAqY29udGV4dCk7CiAKQEAgLTExOCw1 ICsxMjUsMTMgQEAgZXh0ZXJuIE5vZGUgKlJlcGxhY2VWYXJzRnJvbVRhcmdldExpc3QoTm9kZSAq bm9kZSwKIAkJCQkJCQkJCSAgIFJlcGxhY2VWYXJzTm9NYXRjaE9wdGlvbiBub21hdGNoX29wdGlv biwKIAkJCQkJCQkJCSAgIGludCBub21hdGNoX3Zhcm5vLAogCQkJCQkJCQkJICAgYm9vbCAqb3V0 ZXJfaGFzU3ViTGlua3MpOwotCitleHRlcm4gTm9kZSAqUmVwbGFjZVZhcnNGcm9tVGFyZ2V0TGlz dEV4dGVuZGVkKE5vZGUgKm5vZGUsCisJCQkJCQkJCQkJCSAgIGludCB0YXJnZXRfdmFybm8sIGlu dCBzdWJsZXZlbHNfdXAsCisJCQkJCQkJCQkJCSAgIFJhbmdlVGJsRW50cnkgKnRhcmdldF9ydGUs CisJCQkJCQkJCQkJCSAgIExpc3QgKnRhcmdldGxpc3QsCisJCQkJCQkJCQkJCSAgIGludCByZXN1 bHRfcmVsYXRpb24sCisJCQkJCQkJCQkJCSAgIFJlcGxhY2VWYXJzTm9NYXRjaE9wdGlvbiBub21h dGNoX29wdGlvbiwKKwkJCQkJCQkJCQkJICAgaW50IG5vbWF0Y2hfdmFybm8sCisJCQkJCQkJCQkJ CSAgIGJvb2wgKm91dGVyX2hhc1N1YkxpbmtzLAorCQkJCQkJCQkJCQkgICBib29sIGVycm9yX29u X2N1cnJlbnRfb2YpOwogI2VuZGlmCQkJCQkJCS8qIFJFV1JJVEVNQU5JUF9IICovCmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dlbmVyYXRlZF92aXJ0dWFsLm91dCBiL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZ2VuZXJhdGVkX3ZpcnR1YWwub3V0CmluZGV4IGZjNDFj NDgwLi5jMjM4ZWY4YSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9nZW5l cmF0ZWRfdmlydHVhbC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9nZW5lcmF0 ZWRfdmlydHVhbC5vdXQKQEAgLTE3MjMsMyArMTcyMyw0MyBAQCBzZWxlY3QgKiBmcm9tIGd0ZXN0 MzMgd2hlcmUgYiBpcyBudWxsOwogCiByZXNldCBjb25zdHJhaW50X2V4Y2x1c2lvbjsKIGRyb3Ag dGFibGUgZ3Rlc3QzMzsKK2NyZWF0ZSB0YWJsZSBndGVzdF9jdXJzb3IgKGlkIGludCBwcmltYXJ5 IGtleSwgYSBpbnQsIGIgaW50IGdlbmVyYXRlZCBhbHdheXMgYXMgKGEgKiAyKSB2aXJ0dWFsKTsK K2luc2VydCBpbnRvIGd0ZXN0X2N1cnNvciB2YWx1ZXMgKDEsIDEwKSwgKDIsIDIwKSwgKDMsIDMw KTsKKy0tIFVQREFURSB2aWEgY3Vyc29yCitiZWdpbjsKK2RlY2xhcmUgY3VyMSBjdXJzb3IgZm9y IHNlbGVjdCAqIGZyb20gZ3Rlc3RfY3Vyc29yIG9yZGVyIGJ5IGlkIGZvciB1cGRhdGU7CitmZXRj aCAxIGZyb20gY3VyMTsKKyBpZCB8IGEgIHwgYiAgCistLS0tKy0tLS0rLS0tLQorICAxIHwgMTAg fCAyMAorKDEgcm93KQorCit1cGRhdGUgZ3Rlc3RfY3Vyc29yIHNldCBhID0gOTkgd2hlcmUgY3Vy cmVudCBvZiBjdXIxOworc2VsZWN0ICogZnJvbSBndGVzdF9jdXJzb3Igb3JkZXIgYnkgaWQ7Cisg aWQgfCBhICB8ICBiICAKKy0tLS0rLS0tLSstLS0tLQorICAxIHwgOTkgfCAxOTgKKyAgMiB8IDIw IHwgIDQwCisgIDMgfCAzMCB8ICA2MAorKDMgcm93cykKKworY29tbWl0OworLS0gREVMRVRFIHZp YSBjdXJzb3IKK2JlZ2luOworZGVjbGFyZSBjdXIyIGN1cnNvciBmb3Igc2VsZWN0ICogZnJvbSBn dGVzdF9jdXJzb3Igb3JkZXIgYnkgaWQgZm9yIHVwZGF0ZTsKK2ZldGNoIDEgZnJvbSBjdXIyOwor IGlkIHwgYSAgfCAgYiAgCistLS0tKy0tLS0rLS0tLS0KKyAgMSB8IDk5IHwgMTk4CisoMSByb3cp CisKK2RlbGV0ZSBmcm9tIGd0ZXN0X2N1cnNvciB3aGVyZSBjdXJyZW50IG9mIGN1cjI7CitzZWxl Y3QgKiBmcm9tIGd0ZXN0X2N1cnNvciBvcmRlciBieSBpZDsKKyBpZCB8IGEgIHwgYiAgCistLS0t Ky0tLS0rLS0tLQorICAyIHwgMjAgfCA0MAorICAzIHwgMzAgfCA2MAorKDIgcm93cykKKworY29t bWl0OworZHJvcCB0YWJsZSBndGVzdF9jdXJzb3I7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9nZW5lcmF0ZWRfdmlydHVhbC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9nZW5l cmF0ZWRfdmlydHVhbC5zcWwKaW5kZXggOWIzMjQxM2UuLjViYWI3ZDM1IDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL3NxbC9nZW5lcmF0ZWRfdmlydHVhbC5zcWwKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvZ2VuZXJhdGVkX3ZpcnR1YWwuc3FsCkBAIC05MDYsMyArOTA2LDI0IEBAIHNl bGVjdCAqIGZyb20gZ3Rlc3QzMyB3aGVyZSBiIGlzIG51bGw7CiAKIHJlc2V0IGNvbnN0cmFpbnRf ZXhjbHVzaW9uOwogZHJvcCB0YWJsZSBndGVzdDMzOworCitjcmVhdGUgdGFibGUgZ3Rlc3RfY3Vy c29yIChpZCBpbnQgcHJpbWFyeSBrZXksIGEgaW50LCBiIGludCBnZW5lcmF0ZWQgYWx3YXlzIGFz IChhICogMikgdmlydHVhbCk7CitpbnNlcnQgaW50byBndGVzdF9jdXJzb3IgdmFsdWVzICgxLCAx MCksICgyLCAyMCksICgzLCAzMCk7CisKKy0tIFVQREFURSB2aWEgY3Vyc29yCitiZWdpbjsKK2Rl Y2xhcmUgY3VyMSBjdXJzb3IgZm9yIHNlbGVjdCAqIGZyb20gZ3Rlc3RfY3Vyc29yIG9yZGVyIGJ5 IGlkIGZvciB1cGRhdGU7CitmZXRjaCAxIGZyb20gY3VyMTsKK3VwZGF0ZSBndGVzdF9jdXJzb3Ig c2V0IGEgPSA5OSB3aGVyZSBjdXJyZW50IG9mIGN1cjE7CitzZWxlY3QgKiBmcm9tIGd0ZXN0X2N1 cnNvciBvcmRlciBieSBpZDsKK2NvbW1pdDsKKworLS0gREVMRVRFIHZpYSBjdXJzb3IKK2JlZ2lu OworZGVjbGFyZSBjdXIyIGN1cnNvciBmb3Igc2VsZWN0ICogZnJvbSBndGVzdF9jdXJzb3Igb3Jk ZXIgYnkgaWQgZm9yIHVwZGF0ZTsKK2ZldGNoIDEgZnJvbSBjdXIyOworZGVsZXRlIGZyb20gZ3Rl c3RfY3Vyc29yIHdoZXJlIGN1cnJlbnQgb2YgY3VyMjsKK3NlbGVjdCAqIGZyb20gZ3Rlc3RfY3Vy c29yIG9yZGVyIGJ5IGlkOworY29tbWl0OworCitkcm9wIHRhYmxlIGd0ZXN0X2N1cnNvcjsK --000000000000877b14064fad72f6--