Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ojH0i-0005O9-AD for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Oct 2022 09:29:44 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1ojH0h-0007RB-6h for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Oct 2022 09:29:43 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ojH0g-0007PN-R4 for pgsql-hackers@lists.postgresql.org; Fri, 14 Oct 2022 09:29:42 +0000 Received: from esa19.fujitsucc.c3s2.iphmx.com ([216.71.158.62]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ojH0d-0003Nf-A8 for pgsql-hackers@lists.postgresql.org; Fri, 14 Oct 2022 09:29:41 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=fujitsu.com; i=@fujitsu.com; q=dns/txt; s=fj1; t=1665739779; x=1697275779; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=1QjNLT5Fp87s7StOYZoDrdZqEtWYFWP1+ExX323hrZE=; b=sf1cxrOXDMVUT5wXDU0cjknIUtP9jv/IYNYpcVRUy7jo/FpqQzKCb9sN 7ib/sVpoFVKA4uyMy+M4fNT9Iz1dMGm3VtlKmBxu/M75YuLhJ7blAU9iB smnNP58ybimwHBj3Z7w2bx4+IbBP7WgVLC3m5QxLK32n9/ZlUCUZBOXlN SimuE8PAuWy2I2ubJGlYVCRe8HH0sLp2SVhtUuKqA2vpfIwOJaNWji+Gm FuOqQGJFNqjUPqQnAzv6osC3h557FR1W3AMhJLAtP1fTR5qyza2f8p/rT 9kZhZLU9eKkqSQUC3CnQgZR/mpn8d4FWADy+Gzxrc1iAi0xIJTLw36Tnw A==; X-IronPort-AV: E=McAfee;i="6500,9779,10499"; a="67143821" X-IronPort-AV: E=Sophos;i="5.95,182,1661785200"; d="scan'208";a="67143821" Received: from mail-tycjpn01lp2169.outbound.protection.outlook.com (HELO JPN01-TYC-obe.outbound.protection.outlook.com) ([104.47.23.169]) by ob1.fujitsucc.c3s2.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Oct 2022 18:29:36 +0900 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NHDf1CiQdLzkH0aHn1dlz9YkGNM4VYTUJXpIhqsMA4yfWYZ0hV5tb5iKPLuZYdkyRyW6Gu14ERgmFKBsM5fPg+De10+XVGDWAjAhQiD22+r5kf72NqPcRVwUn32yr8Be9lDBPPj/gimPxqfleFELNGOZkvVCya662rvN7lzsbw1IYU+GK6YSMGMdvQKXo2zzjeWVljUx4lcbEx0/5M0YlBaPNg8PrkueFh0j8htGBsNg0wM2GpbRCZgTLR7ReseroscFzVAPURaF4Hd8Y2W/xrYKQdONtP03Kga6/kHw3UUXSQWAfAzRJ+Svu5z9BRAh1ii9PrrgrH9Vr87/eIWZUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1QjNLT5Fp87s7StOYZoDrdZqEtWYFWP1+ExX323hrZE=; b=SruQPiDEQ79OAsdeEZktdOAlH+DK5H/r7wsvQFK4+cAuc5GPnlGUDID67DXr9wtdvgaseCQdTeja8T520e+V3yBVf4ZfpS0EWYtLUTMMwpJ8PWADqVVdwaXvUz1Ne64pSDphCm5DT4Oxl7BmIQyF91ybr0MeTJJ5UGGR/xbJTG7cc4wcsZB8CAZXXSuovUv5mm5ocV5rXqCGQ2MO0ezkeUnMkmL8GHuyZRDbcujIL4A7mnBSKdvlGdGYC/LM839554BxJgQgCoRfJLb6S1GyvMhNqpvvR9LXlFaGXEV0dmkkIk33jodoO2AOuIMTAVVXYukMvFXZ61qTb/CgM7UEpQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=fujitsu.com; dmarc=pass action=none header.from=fujitsu.com; dkim=pass header.d=fujitsu.com; arc=none Received: from OS0PR01MB5716.jpnprd01.prod.outlook.com (2603:1096:604:bb::12) by OSZPR01MB7963.jpnprd01.prod.outlook.com (2603:1096:604:1bb::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.26; Fri, 14 Oct 2022 09:29:32 +0000 Received: from OS0PR01MB5716.jpnprd01.prod.outlook.com ([fe80::86d7:4009:43c3:7f83]) by OS0PR01MB5716.jpnprd01.prod.outlook.com ([fe80::86d7:4009:43c3:7f83%7]) with mapi id 15.20.5709.021; Fri, 14 Oct 2022 09:29:32 +0000 From: "houzj.fnst@fujitsu.com" To: Peter Smith CC: Amit Kapila , "wangw.fnst@fujitsu.com" , Dilip Kumar , Masahiko Sawada , "shiy.fnst@fujitsu.com" , PostgreSQL Hackers Subject: RE: Perform streaming logical transactions by background workers and parallel apply Thread-Topic: Perform streaming logical transactions by background workers and parallel apply Thread-Index: AQHYSXX5ZKpBKXxeUU2FhEhnmXQum6zlu9SQgAkSooCACBQ0gIABsTcwgAA1vECAAqHFgIAE/jVwgAXct9CAADkRgIALO/aAgAsRZICAB606AIAS+CyAgAAufICAAWQLgIABHxKAgAA3o4CAAeE3gIAJPr0AgAkxzACAAiJoAIAC0hUAgARvDICABQA2gIAAFvcAgAeBmICABO9ggIAJO+YAgABu1YCACQzpAIAJSy6AgAS+zICABq7mgIABSJUAgAAOtoCAACghoIAB8TqAgAqL+oCADJWRgIAGVm0AgAGAQICAAerMgIABYRWAgAgnZ+CAAXRdgIAGBUSQgAGFeoCAAFYagIABb5aggAGsWiCAATu3gIAEyyEAgABeLHCABFBngIAK5WIAgABrY4CABb89gIADiS0AgAEu2oCAAHBpgIADPWcAgAS/1gCABHgYgIAKpESAgAhU0YCAAuqDYA== Date: Fri, 14 Oct 2022 09:29:32 +0000 Message-ID: References: In-Reply-To: Accept-Language: ja-JP, en-US Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: =?utf-8?B?TVNJUF9MYWJlbF9hNzI5NWNjMS1kMjc5LTQyYWMtYWI0ZC0zYjBmNGZlY2Uw?= =?utf-8?B?NTBfQWN0aW9uSWQ9YTZiMTZmNDUtMjdlNC00YzliLTgzMjUtZjM0MjM1NDcx?= =?utf-8?B?ODkxO01TSVBfTGFiZWxfYTcyOTVjYzEtZDI3OS00MmFjLWFiNGQtM2IwZjRm?= =?utf-8?B?ZWNlMDUwX0NvbnRlbnRCaXRzPTA7TVNJUF9MYWJlbF9hNzI5NWNjMS1kMjc5?= =?utf-8?B?LTQyYWMtYWI0ZC0zYjBmNGZlY2UwNTBfRW5hYmxlZD10cnVlO01TSVBfTGFi?= =?utf-8?B?ZWxfYTcyOTVjYzEtZDI3OS00MmFjLWFiNGQtM2IwZjRmZWNlMDUwX01ldGhv?= =?utf-8?B?ZD1TdGFuZGFyZDtNU0lQX0xhYmVsX2E3Mjk1Y2MxLWQyNzktNDJhYy1hYjRk?= =?utf-8?B?LTNiMGY0ZmVjZTA1MF9OYW1lPUZVSklUU1UtUkVTVFJJQ1RFRO+/ou++gA==?= =?utf-8?B?776LO01TSVBfTGFiZWxfYTcyOTVjYzEtZDI3OS00MmFjLWFiNGQtM2IwZjRm?= =?utf-8?B?ZWNlMDUwX1NldERhdGU9MjAyMi0xMC0xNFQwNjo0MjozOVo7TVNJUF9MYWJl?= =?utf-8?B?bF9hNzI5NWNjMS1kMjc5LTQyYWMtYWI0ZC0zYjBmNGZlY2UwNTBfU2l0ZUlk?= =?utf-8?Q?=3Da19f121d-81e1-4858-a9d8-736e267fd4c7;?= authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=fujitsu.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: OS0PR01MB5716:EE_|OSZPR01MB7963:EE_ x-ms-office365-filtering-correlation-id: d4a5c87e-6fa8-46b8-ed2e-08daadc69a30 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: s8OOJF4hPARzieCv0gCP+l8y9AAjMjh3s2N0ffAhdLp5rpPb7xks1oEsiiA1ttWE8zZE1QE5hzkpPJhYWEWqr/la5o1kESTx5VAGLcxfsiWa3BHSHYhTHlKOhRwslf0FmgBiF+S2PO471DcoumOhp7Ru6E5aTKB7C/dJ/9VyYhiUR2EjH+nxZEQxvQgaxg7bJ9OrslUI+FvTmqCSij08bnVmWI6owob7SSwoseI02MOjwcR+Z5JmZorQdESUmaV2rD1JyEtTBejqv7cFVqEkn7vctLynv+ZWiZJ1F4xIhk88cGj2J2lc4vbFQLxhQ/Ch0alF7BMY9E5LvOA9Qeqb5aOTg1cKyYj8+ahxACWeaoWQIvcimQz+YtU4WqZLMGCcITvlHWNaQXao8e/g2XRzxNs3EvHvp44En3AHvV/+uYxLYKVmD/74MEklBRiQRxCBKBoeZkKMebIOGpe5AI1gOaOmu2q7+vX7llq6kuTmMYQd36JjCoETb6vTkmOjbvtcU9B/32cI1Cjm6PtoRXo7iz6/rcbhaaKQiCBMPoSnN1AmtDdK3gn0xNsM4n/WkzBO4byWnI8xL7H2eNk18kVdBlNyLawmzqiJ2Bf8SG40uYfdf+CPkSksz/s8uBwxr/Y8dYV2+R+7+sh+d+YaLnBGBp97iyRjcfTNr1sVa/OeLserSOfrhWX3MTo/iLCiHXgbbkRDGvVoiJLeSUFeYQR9152ap0/UrGAwx6M1rN/xupGoA/l++5i/DHq/mQCTWqpp6KbcATxkIKeafD5v9qWrAIn8IsQ/CdFqLgHEU7pcfUbuakBzVdHjK3vJG7daW/aQ x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OS0PR01MB5716.jpnprd01.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(396003)(376002)(346002)(136003)(366004)(39860400002)(451199015)(1590799012)(316002)(1580799009)(85182001)(54906003)(6916009)(4326008)(8936002)(33656002)(8676002)(55016003)(38100700002)(82960400001)(64756008)(83380400001)(86362001)(9686003)(5660300002)(186003)(66476007)(52536014)(66446008)(76116006)(66556008)(66946007)(26005)(2906002)(6506007)(7696005)(38070700005)(478600001)(71200400001)(41300700001)(53546011)(122000001)(30864003)(21314003);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?RHBObVRIQlhENGJBUThzWWwvRFI1WUxlYlppZUtSTG5lY3F1U052QXU2M1U0?= =?utf-8?B?NzlQazBmL05LczNTeTJrczVhWXc1VE1lWEtqTFZsQTBqSWdsaHRybnVrVUly?= =?utf-8?B?SVU1TVg0cklQQUlrclFVOGxPaWg0MVpIY2Q4a1UwVlRwSWYzSHM2eDFaRkxH?= =?utf-8?B?VnVXMVl1SGtvWG0zaUthUWJRbWh3S2pmc1dXVEVwZEZ3U1U3N1N1QjU4Tytk?= =?utf-8?B?aTNYZER0bGV5eXVXNkZUL1RBR25EZXgwTzB4emRLd3BrSmhWUEI4TThLTmFT?= =?utf-8?B?TGNWekoyN1JiUHRNTnUzSUpiMWo2cUlHclFnSnJFcnA5U2ExVnBmREFOWU5J?= =?utf-8?B?dk5FSEdqbWRkSm1YbnF4UFhReE10NkFmOFNXMUtaM0I3QnAzNnAvL01TeCtU?= =?utf-8?B?NURTdUZEK250YmJuZGZLVlVoMlpJZHNxc1gvbWpxbkROWkdXWHltNVpCNi82?= =?utf-8?B?UWZRY3puV093ak1aNjN6cG1Qd2lVQ1VRNVVId2Z3Mk1EK3BhV1lKUDZ0eTcw?= =?utf-8?B?YndYbHJEeVNXK1V4clhLU25KVEJGemVOLzJOSTg2a1ROeHdQQnhKWWM3Ykc0?= =?utf-8?B?M1V0QklRUGNUVkk5emo3bktoMzVNa1hIa0FscEMzRmIrNlJpZFErYXp6aWww?= =?utf-8?B?djV3SnIwcVVNS2NFdVBPNVpzRisvOUlKdDladEM5ZjdRLzh5REphMTZiVkJM?= =?utf-8?B?OHNmOHFPMjBzVkV2SlRDSkltSWZ5bi9hRXo1NCtaY1J6VEJ1enBHSVcyYi9o?= =?utf-8?B?emRXWHBXcTNXUmVuQ0VWamV3SmtpT282dVZaWkcvY3dScDF5VG5rdzhlcTdm?= =?utf-8?B?aUgzSUwwNjBody94UUVIbkhnTHRmQU1qSTlneHhhM283dXNUbHY0VEw0aXJC?= =?utf-8?B?MGVNWlZvVEFJYjRnOW5La0Z6NHJZZERuTlJDQWNBSmxXd3RxMHJsckZJTk9a?= =?utf-8?B?TGtFWCt3Z1EwK3F0WHhFazRQQzF1b0t2bndhL01nek5uUElrck5qTDRMZnRs?= =?utf-8?B?YXBMbHN2ZUtkaExkNkt5cnVlWnFrODZ1cEIzM3ZYWE9VeG44MWs4anBacnA3?= =?utf-8?B?L0x4Z2NhcGlSLzVJai9iZjU1WVRzQ0ZIU0Z4UHFLNlBidjM0enh1U2JneGlx?= =?utf-8?B?RW9GWW4ydjd0N1NqZ3Bld2hXSXpKUW81UkJCcDdzalErY0J0MXRpTUZoNXJr?= =?utf-8?B?YU8yM29WeExEaWxSQ0p4S0hINjFvaHM4YWlYWkVNUUNEQ2t4YmJJTFU0bmM5?= =?utf-8?B?VitROHdScDJSMnM2amVNem5DS2VIcXd5T2daZDlSUWFZTVgrMHFJNE1NTnBv?= =?utf-8?B?M3BHNFZJYnN4VnhpY0FUTXNDWXFKR3gxNUpFdHJ4cSt2TTh5T0ZPRFpDQUdl?= =?utf-8?B?dVN2UXB3TVhyVzBPeVcvL1hHSVV1NVZ1MkxpOTlLbDczV2NIOVRWR2txd2xt?= =?utf-8?B?eE8zYmtpdGJsWnpuRlQvSytQb2VUdmVHc3RQVW00dy9zdld0NXBRMi9peWNz?= =?utf-8?B?by8vRHZTNmlZYmlIYWhibmdDalVSZlQ1Y2ZCdThUck9MUVNMQXYvUy9PVFVE?= =?utf-8?B?VEZTSFhCMW8yeVZLZGFBN1NzTTdGK2lwTGxLUXZOeWUrdUZvMHNCTXNXRnhK?= =?utf-8?B?dEFyZkZYZTU3QzRIc3lxbW9mdXpET05SVFpzRUJ4V3VaQ3Nxc1RhL21IVlVH?= =?utf-8?B?MGlmSWxTc2R4bmRrMWZ6aE5FYjM2Tm56STc0d1JxclFBcEVrMnNxblBuVjRU?= =?utf-8?B?ZzN3R3R0eko1by9JYUhadFowNnlzdGZoRUFCUDQ3ZnNtU0xyWU9VdC85QTFK?= =?utf-8?B?WGp4WGllWk5ieVl5MDl0OXdBSVVJNG9EdDZnSnZpck15TlVYRDVxcUJKQ1ky?= =?utf-8?B?d2UrWTNZVytQYnlFYlZ6UTJMYTI2VkI1TFNiY0FxN1hTVkpyZFRsa01SdVhQ?= =?utf-8?B?cEJHTFo3UVF0S2J5ODlxckQvdUJLL3ZCYjZkRkViMUlPTWZLanlJbEtleUx3?= =?utf-8?B?L0FlVTZKOFZNeFBCdFRxZXVxVmtnY2R2cXBxc2taQkxKS1ZjOTVBUHRUcnpI?= =?utf-8?B?OEZvaklKd0VHdVh1ZTF1WW0vcm5BWWxteFN5ZDZLU0c3Q1dBc2hBUjdiUzV0?= =?utf-8?Q?pxRHfMQDvOx97OmoMj6HVg36D?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: fujitsu.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: OS0PR01MB5716.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d4a5c87e-6fa8-46b8-ed2e-08daadc69a30 X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Oct 2022 09:29:32.7592 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a19f121d-81e1-4858-a9d8-736e267fd4c7 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: sks470fDYaahhnaJm+L1YrHfvMZGkCxcPh1FMc6oOWXM4LsPsNXxCFO29HN1iQeFg4XWvXZ8wHiGTIs6ppuIYA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZPR01MB7963 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk T24gV2VkLCBPY3QgMTIsIDIwMjIgYXQgMTg6MTEgUE0gUGV0ZXIgU21pdGggPHNtaXRocGIyMjUw QGdtYWlsLmNvbT4gd3JvdGU6DQo+IEhlcmUgYXJlIHNvbWUgcmV2aWV3IGNvbW1lbnRzIGZvciB2 MzYtMDAwMS4NCg0KVGhhbmtzIGZvciB5b3VyIGNvbW1lbnRzLg0KDQo+ID09PT09PQ0KPiANCj4g MS4gR0VORVJBTA0KPiANCj4gSG91emogd3JvdGUgKFsxXSAjM2EpOg0KPiBUaGUgd29yZCAnc3Ry ZWFtaW5nJyBpcyB0aGUgc2FtZSBhcyB0aGUgYWN0dWFsIG9wdGlvbiBuYW1lLCBzbyANCj4gcGVy c29uYWxseSBJIHRoaW5rIGl0J3MgZmluZS4gQnV0IGlmIG90aGVycyBhbHNvIGFncmVlZCB0aGF0 IHRoZSBuYW1lIA0KPiBjYW4gYmUgaW1wcm92ZWQsIEkgY2FuIGNoYW5nZSBpdC4NCj4gDQo+IH4N Cj4gDQo+IFN1cmUsIEkgd2FzIG5vdCByZWFsbHkgY29tcGxhaW5pbmcgdGhhdCB0aGUgbmFtZSBp cyAid3JvbmciLiBPbmx5IEkgDQo+IGRpZCBub3QgdGhpbmsgaXQgd2FzIGEgZ29vZCBpZGVhIHRv IGhhdmUgbXVsdGlwbGUgc3RydWN0IG1lbWJlcnMgDQo+IGNhbGxlZCAnc3RyZWFtaW5nJyB3aGVu IHRoZXkgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nLiBlLmcuIG9uZSBpcyANCj4gdGhlIGlu dGVybmFsIGNoYXJhY3RlciBtb2RlIGVxdWl2YWxlbnQgb2YgdGhlIHBhcmFtZXRlciwgYW5kIG9u ZSBpcyANCj4gdGhlIHBhcmFtZXRlciB2YWx1ZSBhcyBhIHN0cmluZy4gVGhhdCdzIHdoeSBJIHRo b3VnaHQgdGhleSBzaG91bGQgYmUgDQo+IGRpZmZlcmVudCBuYW1lcy4gZS5nLiBNYWtlIHRoZSAy bmQgb25lICdzdHJlYW1pbmdfdmFsc3RyJyBvciANCj4gc29tZXRoaW5nLg0KDQpDaGFuZ2VkLg0K DQo+ID09PT09PQ0KPiANCj4gMi4gZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sDQo+IA0KPiBQcmV2 aW91c2x5IEkgc3VnZ2VzdGVkIHRoZXJlIHNob3VsZCBiZSB4cmVmc3RvIHRoZSAiQ29uZmlndXJh dGlvbiANCj4gU2V0dGluZ3MiIHBhZ2UgYnV0IEhvdXpqIHdyb3RlIChbMV0gIzQpOg0KPiBOb3Qg c3VyZSBhYm91dCB0aGlzIGFzIHdlIGRvbid0IGhhdmUgc2ltaWxhciB0aGluZyBpbiB0aGUgZG9j dW1lbnQgb2YgDQo+IG1heF9sb2dpY2FsX3JlcGxpY2F0aW9uX3dvcmtlcnMgYW5kIG1heF9zeW5j X3dvcmtlcnNfcGVyX3N1YnNjcmlwdGlvbi4NCj4gDQo+IH4NCj4gDQo+IEZhaXIgZW5vdWdoLCBi dXQgSU1PIHBlcmhhcHMgYWxsIHRob3NlIG90aGVycyBzaG91bGQgYWxzbyB4cmVmIHRvIHRoZSAN Cj4gIkNvbmZpZ3VyYXRpb24gU2V0dGluZ3MiIGNoYXB0ZXIuIFNvIGlmIHN1Y2ggYSBjaGFuZ2Ug ZG9lcyBub3QgYmVsb25nIA0KPiBpbiB0aGlzIHBhdGNoLCB0aGVuIGhvdyBhYm91dCBpZiBJIG1h a2UgYW5vdGhlciBpbmRlcGVuZGVudCB0aHJlYWQgdG8gDQo+IHBvc3QgdGhpcyBzdWdnZXN0aW9u Pw0KDQpTdXJlLCBJIGZlZWwgaXQgd291bGQgYmUgYmV0dGVyIHRvIGRvIGl0IGluIGEgc2VwYXJh dGUgdGhyZWFkLg0KDQo+ID09PT09PQ0KPiANCj4gLi4uL3JlcGxpY2F0aW9uL2xvZ2ljYWwvYXBw bHlwYXJhbGxlbHdvcmtlci5jDQo+IA0KPiANCj4gMy4gcGFyYWxsZWxfYXBwbHlfZmluZF93b3Jr ZXINCj4gDQo+ICtwYXJhbGxlbF9hcHBseV9maW5kX3dvcmtlcihUcmFuc2FjdGlvbklkIHhpZCkg eyAgYm9vbCBmb3VuZDsgIA0KPiArUGFyYWxsZWxBcHBseVdvcmtlckVudHJ5ICplbnRyeSA9IE5V TEw7DQo+ICsNCj4gKyBpZiAoIVRyYW5zYWN0aW9uSWRJc1ZhbGlkKHhpZCkpDQo+ICsgcmV0dXJu IE5VTEw7DQo+ICsNCj4gKyBpZiAoUGFyYWxsZWxBcHBseVdvcmtlcnNIYXNoID09IE5VTEwpIHJl dHVybiBOVUxMOw0KPiArDQo+ICsgLyogUmV0dXJuIHRoZSBjYWNoZWQgcGFyYWxsZWwgYXBwbHkg d29ya2VyIGlmIHZhbGlkLiAqLyBpZiANCj4gKyAoc3RyZWFtX2FwcGx5X3dvcmtlciAhPSBOVUxM KSByZXR1cm4gc3RyZWFtX2FwcGx5X3dvcmtlcjsNCj4gKw0KPiArIC8qDQo+ICsgKiBGaW5kIGVu dHJ5IGZvciByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24uDQo+ICsgKi8NCj4gKyBlbnRyeSA9IGhhc2hf c2VhcmNoKFBhcmFsbGVsQXBwbHlXb3JrZXJzSGFzaCwgJnhpZCwgSEFTSF9GSU5ELCANCj4gKyAm Zm91bmQpOw0KPiANCj4gSW4gZnVuY3Rpb24gcGFyYWxsZWxfYXBwbHlfc3RhcnRfd29ya2VyKCkg eW91IHJlbW92ZWQgdGhlIGVudHJ5IA0KPiBhc3NpZ25tZW50IHRvIE5VTEwgYmVjYXVzZSBpdCBp cyBuZXZlciBuZWVkZWQuIENhbiBkbyB0aGUgc2FtZSBoZXJlIA0KPiB0b28uDQoNCkNoYW5nZWQu DQoNCj4gNC4gcGFyYWxsZWxfYXBwbHlfZnJlZV93b3JrZXINCj4gDQo+ICsvKg0KPiArICogUmVt b3ZlIHRoZSBwYXJhbGxlbCBhcHBseSB3b3JrZXIgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZS4g QW5kIA0KPiArc3RvcCB0aGUNCj4gKyAqIHdvcmtlciBpZiB0aGVyZSBhcmUgZW5vdWdoIHdvcmtl cnMgaW4gdGhlIHBvb2wuIEZvciBtb3JlIA0KPiAraW5mb3JtYXRpb24gYWJvdXQNCj4gKyAqIHRo ZSB3b3JrZXIgcG9vbCwgc2VlIGNvbW1lbnRzIGF0b3Agd29ya2VyLmMuDQo+ICsgKi8NCj4gK3Zv aWQNCj4gK3BhcmFsbGVsX2FwcGx5X2ZyZWVfd29ya2VyKFBhcmFsbGVsQXBwbHlXb3JrZXJJbmZv ICp3aW5mbywgDQo+ICtUcmFuc2FjdGlvbklkDQo+IHhpZCkNCj4gDQo+ICJBbmQgc3RvcCIgLT4g IlN0b3AiDQoNCkNoYW5nZWQuDQoNCj4gNS4gcGFyYWxsZWxfYXBwbHlfZnJlZV93b3JrZXINCj4g DQo+ICsgKiBBbHRob3VnaCBzb21lIGVycm9yIG1lc3NhZ2VzIG1heSBiZSBsb3N0IGluIHJhcmUg c2NlbmFyaW9zLCBidXQNCj4gKyAqIHNpbmNlIHRoZSBwYXJhbGxlbCBhcHBseSB3b3JrZXIgaGFz IGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlDQo+ICsgKiB0cmFuc2FjdGlvbiwgYW5kIGVycm9yIG1l c3NhZ2VzIG1heSBiZSBsb3N0IGV2ZW4gaWYgd2UgZGV0YWNoIHRoZQ0KPiArICogZXJyb3IgcXVl dWUgYWZ0ZXIgdGVybWluYXRpbmcgdGhlIHByb2Nlc3MuIFNvIGl0IHNob3VsZCBiZSBvay4NCj4g KyAqLw0KPiANCj4gU1VHR0VTVElPTiAobWlub3IgcmV3b3JkaW5nKQ0KPiBTb21lIGVycm9yIG1l c3NhZ2VzIG1heSBiZSBsb3N0IGluIHJhcmUgc2NlbmFyaW9zLCBidXQgaXQgc2hvdWxkIGJlIE9L IA0KPiBiZWNhdXNlIHRoZSBwYXJhbGxlbCBhcHBseSB3b3JrZXIgaGFzIGZpbmlzaGVkIHByb2Nl c3NpbmcgdGhlIA0KPiB0cmFuc2FjdGlvbiwgYW5kIGVycm9yIG1lc3NhZ2VzIG1heSBiZSBsb3N0 IGV2ZW4gaWYgd2UgZGV0YWNoZWQgdGhlIA0KPiBlcnJvciBxdWV1ZSBhZnRlciB0ZXJtaW5hdGlu ZyB0aGUgcHJvY2Vzcy4NCg0KQ2hhbmdlZC4NCg0KDQo+IH5+fg0KPiANCj4gNy4gTG9naWNhbFBh cmFsbGVsQXBwbHlMb29wDQo+IA0KPiBQcmV2aW91cyBJIHN1Z2dlc3RlZCBtYXliZSB0aGUgbmFt ZSAoZS5nLiB0aGUgMm5kIHBhcmFtKSBzaG91bGQgYmUgDQo+IGNoYW5nZWQgdG8gIlBhcmFsbGVs QXBwbHlNZXNzYWdlQ29udGV4dCI/IEhvdXpqIHdyb3RlIChbMV0gIzEzKTogTm90IA0KPiBzdXJl IGFib3V0IHRoaXMsIGJlY2F1c2UgQXBwbHlNZXNzYWdlQ29udGV4dCBpcyB1c2VkIGluIGJvdGgg d29ya2VyLmMgDQo+IGFuZCBhcHBseXBhcmFsbGVsd29ya2VyLmMuDQo+IA0KPiB+DQo+IA0KPiBC dXQgSSB0aG91Z2h0IHRob3NlIGFyZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IEFwcGx5TWVzc2Fn ZUNvbnRleHQncyANCj4gaW4gZGlmZmVyZW50IHByb2Nlc3NlcyB0aGF0IGhhcHBlbiB0byBoYXZl IHRoZSBzYW1lIG5hbWUuIFNob3VsZG4ndCANCj4gdGhleSBoYXZlIGEgbmFtZSBhcHByb3ByaWF0 ZSB0byB3aG8gb3ducyB0aGVtPw0KDQpBcHBseU1lc3NhZ2VDb250ZXh0IGlzIHVzZWQgYnkgdGhl IGJlZ2luX3JlcGxpY2F0aW9uX3N0ZXAoKSBmdW5jdGlvbiB3aGljaCB3aWxsDQpiZSBpbnZva2Vk IGluIGJvdGggbGVhZGVyIGFuZCBwYXJhbGxlbCBhcHBseSB3b3JrZXIuIFNvLCB3ZSBuZWVkIHRv IG5hbWUgdGhlDQptZW1vcnkgY29udGV4dCB0aGUgc2FtZSBhcyBBcHBseU1lc3NhZ2VDb250ZXh0 LCBvdGhlcndpc2Ugd2Ugd291bGQgbmVlZCB0bw0KbW9kaWZ5IHRoZSBsb2dpYyBvZiBiZWdpbl9y ZXBsaWNhdGlvbl9zdGVwKCkgdG8gdXNlIGFub3RoZXIgbWVtb3J5IGNvbnRleHQgaWYNCmluIHBh cmFsbGVsIGFwcGx5IHdvcmtlci4NCg0KDQo+IH5+fg0KPiANCj4gOC4gUGFyYWxsZWxBcHBseVdv cmtlck1haW4NCj4gDQo+ICsgLyoNCj4gKyAqIEFsbG9jYXRlIHRoZSBvcmlnaW4gbmFtZSBpbiBh IGxvbmctbGl2ZWQgY29udGV4dCBmb3IgZXJyb3IgY29udGV4dA0KPiArICogbWVzc2FnZS4NCj4g KyAqLw0KPiArIHNucHJpbnRmKG9yaWdpbm5hbWUsIHNpemVvZihvcmlnaW5uYW1lKSwgInBnXyV1 IiwgDQo+ICsgTXlTdWJzY3JpcHRpb24tPm9pZCk7DQo+IA0KPiBOb3cgdGhhdCBSZXBsaWNhdGlv bk9yaWdpbk5hbWVGb3JMb2dpY2FsUmVwIHBhdGNoIGlzIHB1c2hlZCBbMl0gcGxlYXNlIA0KPiBt YWtlIHVzZSBvZiB0aGlzIGNvbW1vbiBmdW5jdGlvbi4NCg0KQ2hhbmdlZC4NCg0KPiB+fn4NCj4g DQo+IDkuIEhhbmRsZVBhcmFsbGVsQXBwbHlNZXNzYWdlDQo+IA0KPiArIGNhc2UgJ1gnOiAvKiBU ZXJtaW5hdGUsIGluZGljYXRpbmcgY2xlYW4gZXhpdCAqLyB7IA0KPiArIHNobV9tcV9kZXRhY2go d2luZm8tPmVycm9yX21xX2hhbmRsZSk7DQo+ICsgd2luZm8tPmVycm9yX21xX2hhbmRsZSA9IE5V TEw7DQo+ICsgYnJlYWs7DQo+ICsgfQ0KPiArDQo+ICsgLyoNCj4gKyAqIERvbid0IG5lZWQgdG8g ZG8gYW55dGhpbmcgYWJvdXQgTm90aWNlUmVzcG9uc2UgYW5kDQo+ICsgKiBOb3RpZnlSZXNwb25z ZSBhcyB0aGUgbG9naWNhbCByZXBsaWNhdGlvbiB3b3JrZXIgZG9lc24ndCBuZWVkDQo+ICsgKiB0 byBzZW5kIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQuDQo+ICsgKi8NCj4gKyBjYXNlICdOJzoNCj4g KyBjYXNlICdBJzoNCj4gKyBicmVhazsNCj4gKyBkZWZhdWx0Og0KPiArIHsNCj4gKyBlbG9nKEVS Uk9SLCAidW5yZWNvZ25pemVkIG1lc3NhZ2UgdHlwZSByZWNlaXZlZCBmcm9tIHBhcmFsbGVsIGFw cGx5DQo+IHdvcmtlcjogJWMgKG1lc3NhZ2UgbGVuZ3RoICVkIGJ5dGVzKSIsDQo+ICsgbXNndHlw ZSwgbXNnLT5sZW4pOw0KPiArIH0NCj4gDQo+IDlhLiBjYXNlICdYJzoNCj4gVGhlcmUgYXJlIG5v IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBoZXJlIHNvIHRoZSBzdGF0ZW1lbnQgYmxvY2sge30gaXMg DQo+IG5vdCBuZWVkZWQNCj4gDQo+IH4NCj4gDQo+IDliLiBkZWZhdWx0Og0KPiBUaGVyZSBhcmUg bm8gdmFyaWFibGUgZGVjbGFyYXRpb25zIGhlcmUgc28gdGhlIHN0YXRlbWVudCBibG9jayB7fSBp cyANCj4gbm90IG5lZWRlZA0KDQpDaGFuZ2VkLg0KDQo+IH5+fg0KPiANCj4gMTAuIHBhcmFsbGVs X2FwcGx5X3N0cmVhbV9hYm9ydA0KPiANCj4gKyBpbnQgaTsNCj4gKyBib29sIGZvdW5kID0gZmFs c2U7DQo+ICsgY2hhciBzcG5hbWVbTUFYUEdQQVRIXTsNCj4gKw0KPiArIHBhcmFsbGVsX2FwcGx5 X3NhdmVwb2ludF9uYW1lKE15U3Vic2NyaXB0aW9uLT5vaWQsIHN1YnhpZCwgc3BuYW1lLA0KPiAr ICAgc2l6ZW9mKHNwbmFtZSkpOw0KPiANCj4gSSBwb3N0ZWQgYWJvdXQgdXNpbmcgTkFNRURBVEFM RU4gaW4gYSBwcmV2aW91cyByZXZpZXcgKFszXSAjMjEpIGJ1dCBJIA0KPiB0aGluayBvbmx5IG9u ZSBwbGFjZSB3YXMgZml4ZWQgYW5kIHRoaXMgb25lIHdhcyBtaXNzZWQuDQoNCkNoYW5nZWQuDQoN Cj4gPT09PT09DQo+IA0KPiBzcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2xhdW5jaGVy LmMNCj4gDQo+IDEyLiBsb2dpY2FscmVwX3dvcmtlcl9sYXVuY2gNCj4gDQo+IFByZXZpb3VzbHkg SSBzdWdnZXN0ZWQgbWF5IHRoZSBhcHBseSBwcm9jZXNzIG5hbWUgc2hvdWxkIGNoYW5nZQ0KPiAN Cj4gRlJPTQ0KPiAibG9naWNhbCByZXBsaWNhdGlvbiB3b3JrZXIgZm9yIHN1YnNjcmlwdGlvbiAl dSINCj4gVE8NCj4gImxvZ2ljYWwgcmVwbGljYXRpb24gYXBwbHkgd29ya2VyIGZvciBzdWJzY3Jp cHRpb24gJXUiDQo+IA0KPiBhbmQgSG91eiB3cm90ZSAoWzFdICMxMykNCj4gSSBhbSBub3Qgc3Vy ZSBpZiBpdCdzIGEgZ29vZCBpZGVhIHRvIGNoYW5nZSBleGlzdGluZyBwcm9jZXNzIGRlc2NyaXB0 aW9uLg0KPiANCj4gfg0KPiANCj4gQnV0IHRoYXQgc2VlbXMgaW5jb25zaXN0ZW50IHRvIG1lIGJl Y2F1c2UgZWxzZXdoZXJlIHRoaXMgcGF0Y2ggaXMgDQo+IGFscmVhZHkgZXhwb3NpbmcgdGhlIG5h bWUgdG8gdGhlIHVzZXIgKGxpa2Ugd2hlbiBpdCBzYXlzICJsb2dpY2FsIA0KPiByZXBsaWNhdGlv biBhcHBseSB3b3JrZXIgZm9yIHN1YnNjcmlwdGlvbiBcIiVzXCIgaGFzIHN0YXJ0ZWQiLg0KPiBT aG91bGRu4oCZdCB0aGUgcHJvY2VzcyBuYW1lIG1hdGNoIHRoZXNlIGxvZ3M/DQoNCkNoYW5nZWQu DQoNCj4gPT09PT09DQo+IA0KPiBzcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3dvcmtl ci5jDQo+IA0KPiAxMy4gYXBwbHlfaGFuZGxlX3N0cmVhbV9zdGFydA0KPiANCj4gKyAqDQo+ICsg KiBYWFggV2UgY2FuIGF2b2lkIHNlbmRpbmcgcGFpcnMgb2YgdGhlIFNUQVJUIG1lc3NhZ2VzIHRv IHRoZSANCj4gKyBwYXJhbGxlbA0KPiB3b3JrZXINCj4gKyAqIGJlY2F1c2UgdW5saWtlIGFwcGx5 IHdvcmtlciBpdCB3aWxsIHByb2Nlc3Mgb25seSBvbmUgdHJhbnNhY3Rpb24tYXQtYS10aW1lLg0K PiArICogSG93ZXZlciwgaXQgaXMgbm90IGNsZWFyIHdoZXRoZXIgdGhhdCBpcyB3b3J0aCB0aGUg ZWZmb3J0IGJlY2F1c2UgDQo+ICsgaXQgaXMgc2VudA0KPiArICogYWZ0ZXIgbG9naWNhbF9kZWNv ZGluZ193b3JrX21lbSBjaGFuZ2VzLg0KPiAgICovDQo+ICBzdGF0aWMgdm9pZA0KPiAgYXBwbHlf aGFuZGxlX3N0cmVhbV9zdGFydChTdHJpbmdJbmZvIHMpDQo+IA0KPiAxM2EuDQo+ICJ0cmFuc2Fj dGlvbi1hdC1hLXRpbWUuIiAtPiAidHJhbnNhY3Rpb24gYXQgYSB0aW1lLiINCj4gDQo+IH4NCj4g DQo+IDEzYi4NCj4gSSB3YXMgbm90IHN1cmUgd2hhdCBkb2VzIHRoYXQgbGFzdCBzZW50ZW5jZSBt ZWFuPyBEb2VzIGl0IG1lYW4gc29tZXRoaW5nIGxpa2U6DQo+ICJIb3dldmVyLCBpdCBpcyBub3Qg Y2xlYXIgd2hldGhlciBkb2luZyB0aGlzIGlzIHdvcnRoIHRoZSBlZmZvcnQgDQo+IGJlY2F1c2Ug cGFpcnMgb2YgU1RBUlQgbWVzc2FnZXMgb2NjdXIgb25seSBhZnRlciANCj4gbG9naWNhbF9kZWNv ZGluZ193b3JrX21lbSBjaGFuZ2VzLiINCg0KPT4xM2EuDQpDaGFuZ2VkLg0KDQo+IH5+fg0KPiAN Cj4gMTQuIGFwcGx5X2hhbmRsZV9zdHJlYW1fc3RhcnQNCj4gDQo+ICsgUGFyYWxsZWxBcHBseVdv cmtlckluZm8gKndpbmZvID0gTlVMTDsNCj4gDQo+IFRoZSBkZWNsYXJhdGlvbiAqd2luZm8gYXNz aWdubWVudCB0byBOVUxMIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSANCj4gZ2V0X3RyYW5zYWN0aW9u X2FwcGx5X2FjdGlvbiB3aWxsIGFsd2F5cyBkbyB0aGlzIGFueXdheS4NCg0KQ2hhbmdlZC4NCg0K PiB+fn4NCj4gDQo+IDE1LiBhcHBseV9oYW5kbGVfc3RyZWFtX3N0YXJ0DQo+IA0KPiArDQo+ICsg Y2FzZSBUUkFOU19QQVJBTExFTF9BUFBMWToNCj4gKyBicmVhazsNCj4gDQo+IEkgaGFkIHByZXZp b3VzbHkgc3VnZ2VzdGVkIHRoaXMgaW5jbHVkZSBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgdGhl cmUgDQo+IGlzIG5vdGhpbmcgdG8gZG8gKFszXSAjNDQpLCBidXQgSSB0aGluayB0aGVyZSB3YXMg bm8gcmVwbHkuDQoNClRoZSBwYXJhbGxlbCBhcHBseSB3b3JrZXIgZG9lc24ndCBuZWVkIHNwZWNp YWwgaGFuZGxpbmcgZm9yIFNUUkVBTSBTVEFSVCwNCml0IG9ubHkgbmVlZHMgdG8gcnVuIHNvbWUg Y29tbW9uIGNvZGUgcGF0aCB0aGF0IGlzIHNoYXJlZCBieSBsZWFkZXIuDQpJIGFkZGVkIGEgc21h bGwgY29tbWVudCBhYm91dCB0aGlzLg0KDQo+IH5+fg0KPiANCj4gMjAuIEFwcGx5V29ya2VyTWFp bg0KPiANCj4gKyAvKg0KPiArICogV2UgZG9uJ3QgY3VycmVudGx5IG5lZWQgYW55IFJlc291cmNl T3duZXIgaW4gYSB3YWxyZWNlaXZlciANCj4gKyBwcm9jZXNzLCBidXQNCj4gKyAqIGlmIHdlIGRp ZCwgd2UgY291bGQgY2FsbCBDcmVhdGVBdXhQcm9jZXNzUmVzb3VyY2VPd25lciBoZXJlLg0KPiAr ICovDQo+IA0KPiBQcmV2aW91c2x5IEkgc3VnZ2VzdGVkIHByZWZpeGluZyB0aGlzIGFzICJYWFgi IGFuZCBIb3V6aiByZXBsaWVkIChbMV0gIzQ4KToNCj4gSSBhbSBub3Qgc3VyZSBhcyB0aGlzIGNv bW1lbnQgaXMganVzdCBhIHJlbWluZGVyLg0KPiANCj4gfg0KPiANCj4gT0ssIHRoZW4gbWF5YmUg c2luY2UgaXQgaXMgYSByZW1pbmRlciAiTm90ZSIgdGhlbiBpdCBzaG91bGQgYmUgY2hhbmdlZDoN Cj4gIldlIGRvbid0IGN1cnJlbnRseS4uLiIgLT4gIk5vdGU6IFdlIGRvbid0IGN1cnJlbnRseS4u LiINCg0KSSBmZWVsIGl0J3MgZmluZSB0byBsZWF2ZSB0aGUgY29tbWVudCBhcyB0aGF0J3MgdGhl IGV4aXN0aW5nIGNvbW1lbnQNCmluIEFwcGx5V29ya2VyTWFpbigpLg0KDQo+IH5+fg0KPiANCj4g MjEuIEFwcGx5V29ya2VyTWFpbg0KPiANCj4gKyBpZiAoc2VydmVyX3ZlcnNpb24gPj0gMTYwMDAw ICYmDQo+ICsgTXlTdWJzY3JpcHRpb24tPnN0cmVhbSA9PSBTVUJTVFJFQU1fUEFSQUxMRUwpDQo+ ICsgew0KPiArIG9wdGlvbnMucHJvdG8ubG9naWNhbC5zdHJlYW1pbmcgPSBwc3RyZHVwKCJwYXJh bGxlbCIpOw0KPiArIE15TG9naWNhbFJlcFdvcmtlci0+cGFyYWxsZWxfYXBwbHkgPSB0cnVlOw0K PiArIH0NCj4gKyBlbHNlIGlmIChzZXJ2ZXJfdmVyc2lvbiA+PSAxNDAwMDAgJiYNCj4gKyBNeVN1 YnNjcmlwdGlvbi0+c3RyZWFtICE9IFNVQlNUUkVBTV9PRkYpDQo+ICsgew0KPiArIG9wdGlvbnMu cHJvdG8ubG9naWNhbC5zdHJlYW1pbmcgPSBwc3RyZHVwKCJvbiIpOw0KPiArIE15TG9naWNhbFJl cFdvcmtlci0+cGFyYWxsZWxfYXBwbHkgPSBmYWxzZTsNCj4gKyB9DQo+ICsgZWxzZQ0KPiArIHsN Cj4gKyBvcHRpb25zLnByb3RvLmxvZ2ljYWwuc3RyZWFtaW5nID0gTlVMTDsNCj4gKyBNeUxvZ2lj YWxSZXBXb3JrZXItPnBhcmFsbGVsX2FwcGx5ID0gZmFsc2U7DQo+ICsgfQ0KPiANCj4gSSB0aGlu ayB0aGUgYmxvY2sgb2YgaWYvZWxzZSBpcyBvbmx5IGZvciBhc3NpZ25pbmcgdGhlIA0KPiBzdHJl YW1pbmcvcGFyYWxsZWwgbWVtYmVycyBzbyBzaG91bGQgaGF2ZSBzb21lIGNvbW1lbnQgdG8gc2F5 IHRoYXQ6DQo+IA0KPiBTVUdHRVNUSU9ODQo+IEFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgc3RyZWFt aW5nIGZsYWcgYWNjb3JkaW5nIHRvIHRoZSAnc3RyZWFtaW5nJw0KPiBtb2RlIGFuZCB0aGUgcHVi bGlzaGVyJ3MgYWJpbGl0eSB0byBzdXBwb3J0IHRoYXQgbW9kZS4NCg0KQWRkZWQgdGhlIGNvbW1l bnRzIGFzIHN1Z2dlc3RlZC4NCg0KPiB+fn4NCj4gDQo+IDIyLiBnZXRfdHJhbnNhY3Rpb25fYXBw bHlfYWN0aW9uDQo+IA0KPiArc3RhdGljIFRyYW5zQXBwbHlBY3Rpb24NCj4gK2dldF90cmFuc2Fj dGlvbl9hcHBseV9hY3Rpb24oVHJhbnNhY3Rpb25JZCB4aWQsDQo+IFBhcmFsbGVsQXBwbHlXb3Jr ZXJJbmZvICoqd2luZm8pDQo+ICt7DQo+ICsgKndpbmZvID0gTlVMTDsNCj4gKw0KPiArIGlmIChh bV9wYXJhbGxlbF9hcHBseV93b3JrZXIoKSkNCj4gKyB7DQo+ICsgcmV0dXJuIFRSQU5TX1BBUkFM TEVMX0FQUExZOw0KPiArIH0NCj4gKyBlbHNlIGlmIChpbl9yZW1vdGVfdHJhbnNhY3Rpb24pDQo+ ICsgew0KPiArIHJldHVybiBUUkFOU19MRUFERVJfQVBQTFk7DQo+ICsgfQ0KPiArDQo+ICsgLyoN Cj4gKyAqIENoZWNrIGlmIHdlIGFyZSBwcm9jZXNzaW5nIHRoaXMgdHJhbnNhY3Rpb24gdXNpbmcg YSBwYXJhbGxlbCBhcHBseQ0KPiArICogd29ya2VyIGFuZCBpZiBzbywgc2VuZCB0aGUgY2hhbmdl cyB0byB0aGF0IHdvcmtlci4NCj4gKyAqLw0KPiArIGVsc2UgaWYgKCgqd2luZm8gPSBwYXJhbGxl bF9hcHBseV9maW5kX3dvcmtlcih4aWQpKSkgIHsgIHJldHVybiANCj4gK1RSQU5TX0xFQURFUl9T RU5EX1RPX1BBUkFMTEVMOyAgfSAgZWxzZSAgeyAgcmV0dXJuIA0KPiArVFJBTlNfTEVBREVSX1NF UklBTElaRTsgIH0gfQ0KPiANCj4gMjJiLg0KPiBBbHNvIHByZXZpb3VzbHkgSSBoYWQgc3VnZ2Vz dGVkDQo+IA0KPiA+IENhbiBhIHRhYmxlc3luYyB3b3JrZXIgZXZlciBnZXQgaGVyZT8gSXQgbWln aHQgYmUgYmV0dGVyIHRvIA0KPiA+IEFzc2VydCghYW1fdGFibGVzeW5jX3dvcmtlcigpKTsgYXQg dG9wIG9mIHRoaXMgZnVuY3Rpb24/DQo+IA0KPiBhbmQgSG91emogKFsxXSAjNTJiKSByZXBsaWVk Og0KPiBOb3Qgc3VyZSBpZiBpdCdzIG5lY2Vzc2FyeSBvciBub3QuDQo+IA0KPiB+DQo+IA0KPiBP VE9IIHlvdSBjb3VsZCBzYXkgbm8gQXNzZXJ0IGlzIGV2ZXIgcmVhbGx5IG5lY2Vzc2FyeSwgYnV0 IElNTyBhZGRpbmcgDQo+IG9uZSBoZXJlIHdvdWxkIGF0IGxlYXN0IGJlIGEgc2FuaXR5IGNoZWNr IGFuZCBoZWxwIHRvIGRvY3VtZW50IHRoZSANCj4gZnVuY3Rpb24gYmV0dGVyLg0KDQpnZXRfdHJh bnNhY3Rpb25fYXBwbHlfYWN0aW9uIG1pZ2h0IGFsc28gYmUgaW52b2tlZCBpbiB0YWJsZSBzeW5j IHdvcmtlciBpbiBzb21lDQpyYXJlIGNhc2VzIHdoZW4gc29tZSBzdHJlYW1pbmcgdHJhbnNhY3Rp b24gY29tZXMgd2hpbGUgZG9pbmcgdGhlIHRhYmxlIHN5bmMuDQpBbmQgdGhlIGZ1bmN0aW9uIHdv cmtzIGZpbmUgaW4gdGhhdCBjYXNlLCBzbyBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCBhZGQgdGhl DQpBc3NlcnQoKSBoZXJlLg0KDQpCZXN0IHJlZ2FyZHMsDQpIb3UgemoNCg0K