From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=bob.c.feng@intel.com; receiver=edk2-devel@lists.01.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 9F4B3211575FE for ; Sat, 10 Nov 2018 16:41:12 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Nov 2018 16:41:11 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,489,1534834800"; d="scan'208";a="107580800" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga002.jf.intel.com with ESMTP; 10 Nov 2018 16:41:11 -0800 Received: from fmsmsx118.amr.corp.intel.com (10.18.116.18) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sat, 10 Nov 2018 16:41:10 -0800 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx118.amr.corp.intel.com (10.18.116.18) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sat, 10 Nov 2018 16:41:10 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.102]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.117]) with mapi id 14.03.0415.000; Sun, 11 Nov 2018 08:41:07 +0800 From: "Feng, Bob C" To: Leif Lindholm CC: "edk2-devel@lists.01.org" , "Carsey, Jaben" , "Gao, Liming" Thread-Topic: [edk2] [Patch] BaseTools: Optimize string concatenation Thread-Index: AQHUd0w33kqZL81XV0agjUNN2Boo7KVFkjQAgAEi7jCAABp5AIAC7bJw Date: Sun, 11 Nov 2018 00:41:07 +0000 Message-ID: <08650203BA1BD64D8AD9B6D5D74A85D15FFFCFF1@SHSMSX101.ccr.corp.intel.com> References: <20181108101625.41364-1-bob.c.feng@intel.com> <20181108165238.vhdbx2mc42kefvag@bivouac.eciton.net> <08650203BA1BD64D8AD9B6D5D74A85D15FFFBED5@SHSMSX101.ccr.corp.intel.com> <20181109114840.txogb6tz5u23o4ng@bivouac.eciton.net> In-Reply-To: <20181109114840.txogb6tz5u23o4ng@bivouac.eciton.net> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [Patch] BaseTools: Optimize string concatenation X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Nov 2018 00:41:14 -0000 Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgTGVpZiwNCg0KSSB1c2UgbXkgZGVza3RvcCB0byBkbyB0aGUgYmVuY2htYXJrLg0KQ1BVOiBJ bnRlbChSKSBDb3JlKFRNKSBpNy02NzAwIENQVSBAIDMuNDBHSHoNCk1lbW9yeTogMTZHDQpPUzog V2luMTANCg0KSSdsbCBhZGQgdGhlIHBlcmZvcm1hbmNlIGRldGFpbGVkIGRhdGEgdG8gQlouDQoN Ci1Cb2INCg0KLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCkZyb206IExlaWYgTGluZGhvbG0g W21haWx0bzpsZWlmLmxpbmRob2xtQGxpbmFyby5vcmddIA0KU2VudDogRnJpZGF5LCBOb3ZlbWJl ciA5LCAyMDE4IDc6NDkgUE0NClRvOiBGZW5nLCBCb2IgQyA8Ym9iLmMuZmVuZ0BpbnRlbC5jb20+ DQpDYzogZWRrMi1kZXZlbEBsaXN0cy4wMS5vcmc7IENhcnNleSwgSmFiZW4gPGphYmVuLmNhcnNl eUBpbnRlbC5jb20+OyBHYW8sIExpbWluZyA8bGltaW5nLmdhb0BpbnRlbC5jb20+DQpTdWJqZWN0 OiBSZTogW2VkazJdIFtQYXRjaF0gQmFzZVRvb2xzOiBPcHRpbWl6ZSBzdHJpbmcgY29uY2F0ZW5h dGlvbg0KDQpIaSBCb2IsDQoNCk9uIEZyaSwgTm92IDA5LCAyMDE4IGF0IDAzOjI1OjA0QU0gKzAw MDAsIEZlbmcsIEJvYiBDIHdyb3RlOg0KPiBZZXMuIEkgc2hvdWxkIHNob3cgdGhlIGRhdGEuDQo+ IA0KPiBNeSB1bml0ZXMgc2NyaXB0cyBpcyBhcyBiZWxvdy4gVGhlIHBhcmFtZXRlciBsaW5lcyBp cyBhIHN0cmluZyBsaXN0IA0KPiB3aGljaCBzaXplIGlzIDQzMzk1LiBUaGUgdGVzdCByZXN1bHQg aXMNCj4gDQo+ICcnLmpvaW4oU3RyaW5nIGxpc3QpIHRpbWU6ICAwLjA0MjI2Mg0KPiBTdHJpbmcg Kz0gU3RyaW5nIHRpbWUgIDogIDMuODIyNjk5DQo+IA0KPiBkZWYgVGVzdFBsdXMobGluZXMpOg0K PiAgICAgc3RyX3RhcmdldCA9ICIiDQo+ICAgICANCj4gICAgIGZvciBsaW5lIGluIGxpbmVzOg0K PiAgICAgICAgIHN0cl90YXJnZXQgKz0gbGluZQ0KPiAgICAgICAgIA0KPiAgICAgcmV0dXJuIHN0 cl90YXJnZXQNCj4gDQo+IGRlZiBUZXN0Sm9pbihsaW5lcyk6DQo+ICAgICBzdHJfdGFyZ2V0ID0g W10NCj4gICAgIA0KPiAgICAgZm9yIGxpbmUgaW4gbGluZXM6DQo+ICAgICAgICAgc3RyX3Rhcmdl dC5hcHBlbmQobGluZSkNCj4gICAgICAgICANCj4gICAgIHJldHVybiAiIi5qb2luKHN0cl90YXJn ZXQpDQo+IA0KPiBkZWYgQ29tcGFyZVN0ckNhdCgpOg0KPiAgICAgbGluZXMgPSBHZXRTdHJpbmdz KCkNCj4gICAgIHByaW50IChsZW4obGluZXMpKQ0KPiAgICAgDQo+ICAgICBiZWdpbiA9IHRpbWUu cGVyZl9jb3VudGVyKCkNCj4gICAgIGZvciBfIGluIHJhbmdlKDEwKToNCj4gICAgICAgICBUZXN0 Sm9pbihsaW5lcykNCj4gICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyKCkgLSBiZWdpbg0KPiAg ICAgcHJpbnQgKCInJy5qb2luKFN0cmluZyBsaXN0KSB0aW1lOiAlZiIgJSBlbmQpDQo+ICAgICAN Cj4gICAgIGJlZ2luID0gdGltZS5wZXJmX2NvdW50ZXIoKQ0KPiAgICAgZm9yIF8gaW4gcmFuZ2Uo MTApOg0KPiAgICAgICAgIFRlc3RQbHVzKGxpbmVzKQ0KPiAgICAgZW5kID0gdGltZS5wZXJmX2Nv dW50ZXIoKSAtIGJlZ2luDQo+ICAgICBwcmludCAoIlN0cmluZyArPSBTdHJpbmcgdGltZTogJWYi ICUgZW5kKQ0KPiANCj4gRm9yIGJ1aWxkIE92bWZYNjQsIGl0J3Mgbm90IHZlcnkgZWZmZWN0aXZl LCBpdCBzYXZlcyAyfjMgc2Vjb25kIGluIA0KPiBQYXJzZS9BdXRvR2VuIHBoYXNlLCBiZWNhdXNl IE92bWZYNjQgaXMgcmVsYXRpdmVseSBzaW1wbGUuIEl0IGRvZXMgbm90IA0KPiBlbmFibGUgbXVj aCBmZWF0dXJlcyBzdWNoIGFzIE11bHRpcGxlIFNLVSBhbmQgc3RydWN0dXJlIFBDRCBieSBkZWZh dWx0IA0KPiBhbmQgdGhlcmUgaXMgbm8gYmlnIHNpemUgQXV0b2dlbi5jL0F1dG9nZW4uaC9NYWtl ZmlsZSBnZW5lcmF0ZWQgDQo+IGVpdGhlci4gYnV0IGZvciB0aGUgY29tcGxleCBwbGF0Zm9ybSwg dGhpcyBwYXRjaCB3aWxsIGJlIG11Y2ggDQo+IGVmZmVjdGl2ZS4gVGhlIHVuaXRlcyBhYm92ZSBz aW11bGF0ZXMgYSByZWFsIGNhc2UgdGhhdCB0aGVyZSBpcyBhIA0KPiA0MzM5NSBsaW5lcyBvZiBB dXRvZ2VuLmMgZ2VuZXJhdGVkLg0KDQpJIGJlZyB0byBkaWZmZXIuIFNoYXZpbmcgMi0zIHNlY29u ZHMgb2ZmIHRoZSBhdXRvZ2VuIHBoYXNlIGlzIGEgc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnQuDQoN Ckhvd2V2ZXIsIG9uIG15IHdpbXB5IDI0LWNvcmUgQ29ydGV4LUE1MyBzeXN0ZW0sIHRoZSBlZmZl Y3QgaXMgbm90IG5vdGljZWFibGUgKGZsdWN0dWF0ZXMgYmV0d2VlbiAxOjU2LTE6NTggd2hldGhl ciB3aXRoIG9yIHdpdGhvdXQgdGhpcyBwYXRjaCkuDQoNCkFuZCBldmVuIG9uIG15IHg4NiB3b3Jr c3RhdGlvbiwgSSBzZWUgbm8gbWVhc3VyYWJsZSBkaWZmZXJlbmNlICgxMi0xM3MpLg0KV2hhdCBp cyB0aGUgaGFyZHdhcmUgeW91IGFyZSBiZW5jaG1hcmtpbmcgb24/DQoNCkl0IGRvZXMgbm90IGFw cGVhciB0byBiZSBkZXRyaW1lbnRhbCB0byBwZXJmb3JtYW5jZSBvbiBhbnkgb2YgbXkgcGxhdGZv cm1zLCBidXQgSSB3b3VsZCBsaWtlIHRvIHNlZSBzb21lIG1vcmUgbWVhc3VyZW1lbnRzLCBhbmQg SSB3b3VsZCBsaWtlIHRvIHNlZSB0aGF0IGxvZ2dlZCB3aXRoIHNvbWUgbW9yZSBkZXRhaWwgaW4g YnVnemlsbGEuDQoNClJlZ2FyZHMsDQoNCkxlaWYNCg0KPiBTaW5jZSB0aGlzIHBhdGNoIG1vc3Rs eSBlZmZlY3QgdGhlIFBhcnNlci9BdXRvR2VuIHBoYXNlLCBJIGp1c3QgdXNlIA0KPiAiYnVpbGQg Z2VubWFrZSIgdG8gc2hvdyB0aGUgaW1wcm92ZW1lbnQgZGF0YS4NCj4gVGhlIGZpbmFsIHJlc3Vs dCBmb3IgY2xlYW4gYnVpbGQgaXM6DQo+IEN1cnJlbnQgY29kZTogIDE3IHNlY29uZHMNCj4gQWZ0 ZXIgcGF0Y2g6ICAgICAgMTUgc2Vjb25kcw0KPiANCj4gRGV0YWlsczoNCj4gQ3VycmVudCBkYXRh Og0KPiANCj4gZDpcZWRrMiAobWFzdGVyIC0+IG9yaWdpbikNCj4gzrsgYnVpbGQgZ2VubWFrZSAt cCBPdm1mUGtnXE92bWZQa2dJYTMyWDY0LmRzYyAtYSBJQTMyIC1hIFg2NCAtdCANCj4gVlMyMDE1 eDg2IEJ1aWxkIGVudmlyb25tZW50OiBXaW5kb3dzLTEwLTEwLjAuMTAyNDAgQnVpbGQgc3RhcnQg dGltZTogDQo+IDEwOjEyOjMyLCBOb3YuMDkgMjAxOA0KPiANCj4gV09SS1NQQUNFICAgICAgICA9 IGQ6XGVkazINCj4gRUNQX1NPVVJDRSAgICAgICA9IGQ6XGVkazJcZWRrY29tcGF0aWJpbGl0eXBr Zw0KPiBFREtfU09VUkNFICAgICAgID0gZDpcZWRrMlxlZGtjb21wYXRpYmlsaXR5cGtnDQo+IEVG SV9TT1VSQ0UgICAgICAgPSBkOlxlZGsyXGVka2NvbXBhdGliaWxpdHlwa2cNCj4gRURLX1RPT0xT X1BBVEggICA9IGQ6XGVkazJcYmFzZXRvb2xzDQo+IEVES19UT09MU19CSU4gICAgPSBkOlxlZGsy XGJhc2V0b29sc1xiaW5cd2luMzINCj4gQ09ORl9QQVRIICAgICAgICA9IGQ6XGVkazJcY29uZg0K PiANCj4gQXJjaGl0ZWN0dXJlKHMpICA9IElBMzIgWDY0DQo+IEJ1aWxkIHRhcmdldCAgICAgPSBE RUJVRw0KPiBUb29sY2hhaW4gICAgICAgID0gVlMyMDE1eDg2DQo+IA0KPiBBY3RpdmUgUGxhdGZv cm0gICAgICAgICAgPSBkOlxlZGsyXE92bWZQa2dcT3ZtZlBrZ0lhMzJYNjQuZHNjDQo+IEZsYXNo IEltYWdlIERlZmluaXRpb24gICA9IGQ6XGVkazJcT3ZtZlBrZ1xPdm1mUGtnSWEzMlg2NC5mZGYN Cj4gDQo+IFByb2Nlc3NpbmcgbWV0YS1kYXRhIC4uLi4uLi4gZG9uZSENCj4gR2VuZXJhdGluZyBj b2RlIC4gZG9uZSENCj4gR2VuZXJhdGluZyBtYWtlZmlsZSAuIGRvbmUhDQo+IEdlbmVyYXRpbmcg Y29kZSAuLiBkb25lIQ0KPiBHZW5lcmF0aW5nIG1ha2VmaWxlIC4uLi4uLiBkb25lIQ0KPiANCj4g LSBEb25lIC0NCj4gQnVpbGQgZW5kIHRpbWU6IDEwOjEyOjQ5LCBOb3YuMDkgMjAxOA0KPiBCdWls ZCB0b3RhbCB0aW1lOiAwMDowMDoxNw0KPiANCj4gQWZ0ZXIgYXBwbHlpbmcgdGhpcyBwYXRjaDoN Cj4gDQo+IGQ6XGVkazIgKG1hc3RlciAtPiBvcmlnaW4pICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgDQo+IM67IGJ1aWxkIGdlbm1ha2UgLXAgT3ZtZlBrZ1xPdm1mUGtnSWEzMlg2 NC5kc2MgLWEgSUEzMiAtYSBYNjQgLQ0KPiBCdWlsZCBlbnZpcm9ubWVudDogV2luZG93cy0xMC0x MC4wLjEwMjQwICAgICAgICAgICAgICAgICAgICAgIA0KPiBCdWlsZCBzdGFydCB0aW1lOiAxMDox MTo0MSwgTm92LjA5IDIwMTggICAgICAgICAgICAgICAgICAgICAgIA0KPiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBXT1JL U1BBQ0UgICAgICAgID0gZDpcZWRrMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IA0KPiBFQ1BfU09VUkNFICAgICAgID0gZDpcZWRrMlxlZGtjb21wYXRpYmlsaXR5cGtnICAgICAg ICAgICAgICAgIA0KPiBFREtfU09VUkNFICAgICAgID0gZDpcZWRrMlxlZGtjb21wYXRpYmlsaXR5 cGtnICAgICAgICAgICAgICAgIA0KPiBFRklfU09VUkNFICAgICAgID0gZDpcZWRrMlxlZGtjb21w YXRpYmlsaXR5cGtnICAgICAgICAgICAgICAgIA0KPiBFREtfVE9PTFNfUEFUSCAgID0gZDpcZWRr MlxiYXNldG9vbHMgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBFREtfVE9PTFNfQklOICAg ID0gZDpcZWRrMlxiYXNldG9vbHNcYmluXHdpbjMyICAgICAgICAgICAgICAgIA0KPiBDT05GX1BB VEggICAgICAgID0gZDpcZWRrMlxjb25mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIA0KPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIA0KPiBBcmNoaXRlY3R1cmUocykgID0gSUEzMiBYNjQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBCdWlsZCB0YXJnZXQgICAgID0gREVCVUcgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBUb29sY2hhaW4gICAgICAgID0g VlMyMDE1eDg2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBB Y3RpdmUgUGxhdGZvcm0gICAgICAgICAgPSBkOlxlZGsyXE92bWZQa2dcT3ZtZlBrZ0lhMzJYNjQu ZHNjIA0KPiBGbGFzaCBJbWFnZSBEZWZpbml0aW9uICAgPSBkOlxlZGsyXE92bWZQa2dcT3ZtZlBr Z0lhMzJYNjQuZmRmIA0KPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIA0KPiBQcm9jZXNzaW5nIG1ldGEtZGF0YSAuLi4uLiBkb25l ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBHZW5lcmF0aW5nIGNvZGUgLiBkb25l ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBHZW5lcmF0aW5nIG1h a2VmaWxlIC4gZG9uZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBHZW5l cmF0aW5nIGNvZGUgLi4gZG9uZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IA0KPiBHZW5lcmF0aW5nIG1ha2VmaWxlIC4uLi4uLiBkb25lISAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIA0KPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIA0KPiAtIERvbmUgLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBCdWlsZCBlbmQgdGltZTogMTA6MTE6NTYs IE5vdi4wOSAyMDE4ICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiBCdWlsZCB0b3RhbCB0aW1l OiAwMDowMDoxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPiANCj4gDQo+ IFRoYW5rcywNCj4gQm9iDQo+IA0KPiANCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4g RnJvbTogTGVpZiBMaW5kaG9sbSBbbWFpbHRvOmxlaWYubGluZGhvbG1AbGluYXJvLm9yZ10NCj4g U2VudDogRnJpZGF5LCBOb3ZlbWJlciA5LCAyMDE4IDEyOjUzIEFNDQo+IFRvOiBGZW5nLCBCb2Ig QyA8Ym9iLmMuZmVuZ0BpbnRlbC5jb20+DQo+IENjOiBlZGsyLWRldmVsQGxpc3RzLjAxLm9yZzsg Q2Fyc2V5LCBKYWJlbiA8amFiZW4uY2Fyc2V5QGludGVsLmNvbT47IA0KPiBHYW8sIExpbWluZyA8 bGltaW5nLmdhb0BpbnRlbC5jb20+DQo+IFN1YmplY3Q6IFJlOiBbZWRrMl0gW1BhdGNoXSBCYXNl VG9vbHM6IE9wdGltaXplIHN0cmluZyBjb25jYXRlbmF0aW9uDQo+IA0KPiBPbiBUaHUsIE5vdiAw OCwgMjAxOCBhdCAwNjoxNjoyNVBNICswODAwLCBCb2JDRiB3cm90ZToNCj4gPiBodHRwczovL2J1 Z3ppbGxhLnRpYW5vY29yZS5vcmcvc2hvd19idWcuY2dpP2lkPTEyODgNCj4gPiANCj4gPiBUaGlz IHBhdGNoIGlzIG9uZSBvZiBidWlsZCB0b29sIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHNlcmll cyANCj4gPiBwYXRjaGVzLg0KPiA+IA0KPiA+IFRoaXMgcGF0Y2ggaXMgZ29pbmcgdG8gdXNlIGpv aW4gZnVuY3Rpb24gaW5zdGVhZCBvZiBzdHJpbmcgKz0gDQo+ID4gc3RyaW5nMiBzdGF0ZW1lbnQu DQo+ID4gDQo+ID4gQ3VycmVudCBjb2RlIHVzZSBzdHJpbmcgKz0gc3RyaW5nMiBpbiBhIGxvb3Ag dG8gY29tYmluZSBhIHN0cmluZy4gDQo+ID4gd2hpbGUgY3JlYXRpbmcgYSBzdHJpbmcgbGlzdCBp biBhIGxvb3AgYW5kIHVzaW5nDQo+ID4gIiIuam9pbihzdHJpbmdsaXN0KSBhZnRlciB0aGUgbG9v cCB3aWxsIGJlIG11Y2ggZmFzdGVyLg0KPiANCj4gRG8geW91IGhhdmUgYW55IG51bWJlcnMgb24g dGhlIGxldmVsIG9mIGltcHJvdmVtZW50IHNlZW4/DQo+IA0KPiBFaXRoZXIgZm9yIHRoZSBpbmRp dmlkdWFsIHNjcmlwdHMgd2hlbiBjYWxsZWQgaWRlbnRpY2FsbHksIG9yIChpZg0KPiBtZWFzdXJh YmxlKSBvbiB0aGUgYnVpbGQgb2YgYW4gZW50aXJlIHBsYXRmb3JtIChzYXkgT3ZtZlg2ND8pLg0K PiANCj4gUmVnYXJkcywNCj4gDQo+IExlaWYNCj4gDQo+ID4gQ29udHJpYnV0ZWQtdW5kZXI6IFRp YW5vQ29yZSBDb250cmlidXRpb24gQWdyZWVtZW50IDEuMQ0KPiA+IFNpZ25lZC1vZmYtYnk6IEJv YkNGIDxib2IuYy5mZW5nQGludGVsLmNvbT4NCj4gPiBDYzogTGltaW5nIEdhbyA8bGltaW5nLmdh b0BpbnRlbC5jb20+DQo+ID4gQ2M6IEphYmVuIENhcnNleSA8amFiZW4uY2Fyc2V5QGludGVsLmNv bT4NCj4gPiAtLS0NCj4gPiAgQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9TdHJHYXRo ZXIucHkgIHwgMzkgKysrKysrKysrKysrKy0tLS0tLQ0KPiA+ICBCYXNlVG9vbHMvU291cmNlL1B5 dGhvbi9Db21tb24vTWlzYy5weSAgICAgICAgfCAyMSArKysrKy0tLS0tDQo+ID4gIC4uLi9Tb3Vy Y2UvUHl0aG9uL1dvcmtzcGFjZS9JbmZCdWlsZERhdGEucHkgICB8ICA0ICstDQo+ID4gIC4uLi9Q eXRob24vV29ya3NwYWNlL1dvcmtzcGFjZUNvbW1vbi5weSAgICAgICB8IDExICsrLS0tLQ0KPiA+ ICA0IGZpbGVzIGNoYW5nZWQsIDQ0IGluc2VydGlvbnMoKyksIDMxIGRlbGV0aW9ucygtKQ0KPiA+ IA0KPiA+IGRpZmYgLS1naXQgYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9BdXRvR2VuL1N0ckdh dGhlci5weQ0KPiA+IGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9TdHJHYXRoZXIu cHkNCj4gPiBpbmRleCAzNjFkNDk5MDc2Li5kMzRhOWU5NDQ3IDEwMDY0NA0KPiA+IC0tLSBhL0Jh c2VUb29scy9Tb3VyY2UvUHl0aG9uL0F1dG9HZW4vU3RyR2F0aGVyLnB5DQo+ID4gKysrIGIvQmFz ZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9TdHJHYXRoZXIucHkNCj4gPiBAQCAtMTM1LDEx ICsxMzUsMTEgQEAgZGVmIEFzY1RvSGV4TGlzdChBc2NpaSk6DQo+ID4gICMgQHBhcmFtIFVuaUdl bkNGbGFnICAgICAgVW5pU3RyaW5nIGlzIGdlbmVyYXRlZCBpbnRvIEF1dG9HZW4gQyBmaWxlIHdo ZW4gaXQgaXMgc2V0IHRvIFRydWUNCj4gPiAgIw0KPiA+ICAjIEByZXR2YWwgU3RyOiAgICAgICAg ICAgQSBzdHJpbmcgb2YgLmggZmlsZSBjb250ZW50DQo+ID4gICMNCj4gPiAgZGVmIENyZWF0ZUhG aWxlQ29udGVudChCYXNlTmFtZSwgVW5pT2JqZWN0Q2xhc3MsIElzQ29tcGF0aWJsZU1vZGUsIFVu aUdlbkNGbGFnKToNCj4gPiAtICAgIFN0ciA9ICcnDQo+ID4gKyAgICBTdHIgPSBbXQ0KPiA+ICAg ICAgVmFsdWVTdGFydFB0ciA9IDYwDQo+ID4gICAgICBMaW5lID0gQ09NTUVOVF9ERUZJTkVfU1RS ICsgJyAnICsgTEFOR1VBR0VfTkFNRV9TVFJJTkdfTkFNRSArICcgJyAqIChWYWx1ZVN0YXJ0UHRy IC0gbGVuKERFRklORV9TVFIgKyBMQU5HVUFHRV9OQU1FX1NUUklOR19OQU1FKSkgKyBEZWNUb0hl eFN0cigwLCA0KSArIENPTU1FTlRfTk9UX1JFRkVSRU5DRUQNCj4gPiAgICAgIFN0ciA9IFdyaXRl TGluZShTdHIsIExpbmUpDQo+ID4gICAgICBMaW5lID0gQ09NTUVOVF9ERUZJTkVfU1RSICsgJyAn ICsgUFJJTlRBQkxFX0xBTkdVQUdFX05BTUVfU1RSSU5HX05BTUUgKyAnICcgKiAoVmFsdWVTdGFy dFB0ciAtIGxlbihERUZJTkVfU1RSICsgUFJJTlRBQkxFX0xBTkdVQUdFX05BTUVfU1RSSU5HX05B TUUpKSArIERlY1RvSGV4U3RyKDEsIDQpICsgQ09NTUVOVF9OT1RfUkVGRVJFTkNFRA0KPiA+ICAg ICAgU3RyID0gV3JpdGVMaW5lKFN0ciwgTGluZSkNCj4gPiBAQCAtMTY0LDE2ICsxNjQsMTYgQEAg ZGVmIENyZWF0ZUhGaWxlQ29udGVudChCYXNlTmFtZSwgVW5pT2JqZWN0Q2xhc3MsIElzQ29tcGF0 aWJsZU1vZGUsIFVuaUdlbkNGbGFnKToNCj4gPiAgICAgICAgICAgICAgICAgICAgICBMaW5lID0g Q09NTUVOVF9ERUZJTkVfU1RSICsgJyAnICsgTmFtZSArICcgJyArIERlY1RvSGV4U3RyKFRva2Vu LCA0KSArIENPTU1FTlRfTk9UX1JFRkVSRU5DRUQNCj4gPiAgICAgICAgICAgICAgICAgIGVsc2U6 DQo+ID4gICAgICAgICAgICAgICAgICAgICAgTGluZSA9IENPTU1FTlRfREVGSU5FX1NUUiArICcg JyArIE5hbWUgKyAnICcgKiAoVmFsdWVTdGFydFB0ciAtIGxlbihERUZJTkVfU1RSICsgTmFtZSkp ICsgRGVjVG9IZXhTdHIoVG9rZW4sIDQpICsgQ09NTUVOVF9OT1RfUkVGRVJFTkNFRA0KPiA+ICAg ICAgICAgICAgICAgICAgVW51c2VkU3RyID0gV3JpdGVMaW5lKFVudXNlZFN0ciwgTGluZSkNCj4g PiAgDQo+ID4gLSAgICBTdHIgPSAnJy5qb2luKFtTdHIsIFVudXNlZFN0cl0pDQo+ID4gKyAgICBT dHIuZXh0ZW5kKCBVbnVzZWRTdHIpDQo+ID4gIA0KPiA+ICAgICAgU3RyID0gV3JpdGVMaW5lKFN0 ciwgJycpDQo+ID4gICAgICBpZiBJc0NvbXBhdGlibGVNb2RlIG9yIFVuaUdlbkNGbGFnOg0KPiA+ ICAgICAgICAgIFN0ciA9IFdyaXRlTGluZShTdHIsICdleHRlcm4gdW5zaWduZWQgY2hhciAnICsg QmFzZU5hbWUgKyAnU3RyaW5nc1tdOycpDQo+ID4gLSAgICByZXR1cm4gU3RyDQo+ID4gKyAgICBy ZXR1cm4gIiIuam9pbihTdHIpDQo+ID4gIA0KPiA+ICAjIyBDcmVhdGUgYSBjb21wbGV0ZSAuaCBm aWxlDQo+ID4gICMNCj4gPiAgIyBDcmVhdGUgYSBjb21wbGV0IC5oIGZpbGUgd2l0aCBmaWxlIGhl YWRlciBhbmQgZmlsZSBjb250ZW50ICAjIEBADQo+ID4gLTE4NSwxMSArMTg1LDExIEBAIGRlZiBD cmVhdGVIRmlsZUNvbnRlbnQoQmFzZU5hbWUsIFVuaU9iamVjdENsYXNzLCBJc0NvbXBhdGlibGVN b2RlLCBVbmlHZW5DRmxhZyk6DQo+ID4gICMgQHJldHZhbCBTdHI6ICAgICAgICAgICBBIHN0cmlu ZyBvZiBjb21wbGV0ZSAuaCBmaWxlDQo+ID4gICMNCj4gPiAgZGVmIENyZWF0ZUhGaWxlKEJhc2VO YW1lLCBVbmlPYmplY3RDbGFzcywgSXNDb21wYXRpYmxlTW9kZSwgVW5pR2VuQ0ZsYWcpOg0KPiA+ ICAgICAgSEZpbGUgPSBXcml0ZUxpbmUoJycsIENyZWF0ZUhGaWxlQ29udGVudChCYXNlTmFtZSwg DQo+ID4gVW5pT2JqZWN0Q2xhc3MsIElzQ29tcGF0aWJsZU1vZGUsIFVuaUdlbkNGbGFnKSkNCj4g PiAgDQo+ID4gLSAgICByZXR1cm4gSEZpbGUNCj4gPiArICAgIHJldHVybiAiIi5qb2luKEhGaWxl KQ0KPiA+ICANCj4gPiAgIyMgQ3JlYXRlIGEgYnVmZmVyIHRvIHN0b3JlIGFsbCBpdGVtcyBpbiBh biBhcnJheSAgIw0KPiA+ICAjIEBwYXJhbSBCaW5CdWZmZXIgICBCdWZmZXIgdG8gY29udGFpbiBC aW5hcnkgZGF0YS4NCj4gPiAgIyBAcGFyYW0gQXJyYXk6ICAgICAgVGhlIGFycmF5IG5lZWQgdG8g YmUgZm9ybWF0dGVkDQo+ID4gQEAgLTIwOSwxMSArMjA5LDExIEBAIGRlZiBDcmVhdGVCaW5CdWZm ZXIoQmluQnVmZmVyLCBBcnJheSk6DQo+ID4gICMNCj4gPiAgZGVmIENyZWF0ZUFycmF5SXRlbShB cnJheSwgV2lkdGggPSAxNik6DQo+ID4gICAgICBNYXhMZW5ndGggPSBXaWR0aA0KPiA+ICAgICAg SW5kZXggPSAwDQo+ID4gICAgICBMaW5lID0gJyAgJw0KPiA+IC0gICAgQXJyYXlJdGVtID0gJycN Cj4gPiArICAgIEFycmF5SXRlbSA9IFtdDQo+ID4gIA0KPiA+ICAgICAgZm9yIEl0ZW0gaW4gQXJy YXk6DQo+ID4gICAgICAgICAgaWYgSW5kZXggPCBNYXhMZW5ndGg6DQo+ID4gICAgICAgICAgICAg IExpbmUgPSBMaW5lICsgSXRlbSArICcsICAnDQo+ID4gICAgICAgICAgICAgIEluZGV4ID0gSW5k ZXggKyAxDQo+ID4gQEAgLTIyMSwxMSArMjIxLDExIEBAIGRlZiBDcmVhdGVBcnJheUl0ZW0oQXJy YXksIFdpZHRoID0gMTYpOg0KPiA+ICAgICAgICAgICAgICBBcnJheUl0ZW0gPSBXcml0ZUxpbmUo QXJyYXlJdGVtLCBMaW5lKQ0KPiA+ICAgICAgICAgICAgICBMaW5lID0gJyAgJyArIEl0ZW0gKyAn LCAgJw0KPiA+ICAgICAgICAgICAgICBJbmRleCA9IDENCj4gPiAgICAgIEFycmF5SXRlbSA9IFdy aXRlKEFycmF5SXRlbSwgTGluZS5yc3RyaXAoKSkNCj4gPiAgDQo+ID4gLSAgICByZXR1cm4gQXJy YXlJdGVtDQo+ID4gKyAgICByZXR1cm4gIiIuam9pbihBcnJheUl0ZW0pDQo+ID4gIA0KPiA+ICAj IyBDcmVhdGVDRmlsZVN0cmluZ1ZhbHVlDQo+ID4gICMNCj4gPiAgIyBDcmVhdGUgYSBsaW5lIHdp dGggc3RyaW5nIHZhbHVlDQo+ID4gICMNCj4gPiBAQCAtMjM2LDExICsyMzYsMTEgQEAgZGVmIENy ZWF0ZUFycmF5SXRlbShBcnJheSwgV2lkdGggPSAxNik6DQo+ID4gIA0KPiA+ICBkZWYgQ3JlYXRl Q0ZpbGVTdHJpbmdWYWx1ZShWYWx1ZSk6DQo+ID4gICAgICBWYWx1ZSA9IFtTdHJpbmdCbG9ja1R5 cGVdICsgVmFsdWUNCj4gPiAgICAgIFN0ciA9IFdyaXRlTGluZSgnJywgQ3JlYXRlQXJyYXlJdGVt KFZhbHVlKSkNCj4gPiAgDQo+ID4gLSAgICByZXR1cm4gU3RyDQo+ID4gKyAgICByZXR1cm4gIiIu am9pbihTdHIpDQo+ID4gIA0KPiA+ICAjIyBHZXRGaWx0ZXJlZExhbmd1YWdlDQo+ID4gICMNCj4g PiAgIyBhcHBseSBnZXQgYmVzdCBsYW5ndWFnZSBydWxlcyB0byB0aGUgVU5JIGxhbmd1YWdlIGNv ZGUgbGlzdCAgIyBAQA0KPiA+IC00MzgsMTEgKzQzOCwxMSBAQCBkZWYgQ3JlYXRlQ0ZpbGVDb250 ZW50KEJhc2VOYW1lLCBVbmlPYmplY3RDbGFzcywgSXNDb21wYXRpYmxlTW9kZSwgVW5pQmluQnVm ZmVyLA0KPiA+ICAgICAgIw0KPiA+ICAgICAgIyBKb2luIHBhY2thZ2UgZGF0YQ0KPiA+ICAgICAg Iw0KPiA+ICAgICAgQWxsU3RyID0gV3JpdGUoQWxsU3RyLCBTdHIpDQo+ID4gIA0KPiA+IC0gICAg cmV0dXJuIEFsbFN0cg0KPiA+ICsgICAgcmV0dXJuICIiLmpvaW4oQWxsU3RyKQ0KPiA+ICANCj4g PiAgIyMgQ3JlYXRlIGVuZCBvZiAuYyBmaWxlDQo+ID4gICMNCj4gPiAgIyBDcmVhdGUgZW5kIG9m IC5jIGZpbGUNCj4gPiAgIw0KPiA+IEBAIC00NjUsMTEgKzQ2NSwxMSBAQCBkZWYgQ3JlYXRlQ0Zp bGVFbmQoKToNCj4gPiAgIw0KPiA+ICBkZWYgQ3JlYXRlQ0ZpbGUoQmFzZU5hbWUsIFVuaU9iamVj dENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBGaWx0ZXJJbmZvKToNCj4gPiAgICAgIENGaWxlID0g JycNCj4gPiAgICAgIENGaWxlID0gV3JpdGVMaW5lKENGaWxlLCBDcmVhdGVDRmlsZUNvbnRlbnQo QmFzZU5hbWUsIFVuaU9iamVjdENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBOb25lLCBGaWx0ZXJJ bmZvKSkNCj4gPiAgICAgIENGaWxlID0gV3JpdGVMaW5lKENGaWxlLCBDcmVhdGVDRmlsZUVuZCgp KQ0KPiA+IC0gICAgcmV0dXJuIENGaWxlDQo+ID4gKyAgICByZXR1cm4gIiIuam9pbihDRmlsZSkN Cj4gPiAgDQo+ID4gICMjIEdldEZpbGVMaXN0DQo+ID4gICMNCj4gPiAgIyBHZXQgYSBsaXN0IGZv ciBhbGwgZmlsZXMNCj4gPiAgIw0KPiA+IEBAIC01NzIsMTcgKzU3MiwzNCBAQCBkZWYgR2V0U3Ry aW5nRmlsZXMoVW5pRmlsTGlzdCwgU291cmNlRmlsZUxpc3QsIA0KPiA+IEluY2x1ZGVMaXN0LCBJ bmNsdWRlUGF0aExpc3QsIFNraQ0KPiA+ICANCj4gPiAgIw0KPiA+ICAjIFdyaXRlIGFuIGl0ZW0N Cj4gPiAgIw0KPiA+ICBkZWYgV3JpdGUoVGFyZ2V0LCBJdGVtKToNCj4gPiAtICAgIHJldHVybiAn Jy5qb2luKFtUYXJnZXQsIEl0ZW1dKQ0KPiA+ICsgICAgaWYgaXNpbnN0YW5jZShUYXJnZXQsc3Ry KToNCj4gPiArICAgICAgICBUYXJnZXQgPSBbVGFyZ2V0XQ0KPiA+ICsgICAgaWYgbm90IFRhcmdl dDoNCj4gPiArICAgICAgICBUYXJnZXQgPSBbXQ0KPiA+ICsgICAgaWYgaXNpbnN0YW5jZShJdGVt LGxpc3QpOg0KPiA+ICsgICAgICAgIFRhcmdldC5leHRlbmQoSXRlbSkNCj4gPiArICAgIGVsc2U6 DQo+ID4gKyAgICAgICAgVGFyZ2V0LmFwcGVuZChJdGVtKQ0KPiA+ICsgICAgcmV0dXJuIFRhcmdl dA0KPiA+ICANCj4gPiAgIw0KPiA+ICAjIFdyaXRlIGFuIGl0ZW0gd2l0aCBhIGJyZWFrIGxpbmUN Cj4gPiAgIw0KPiA+ICBkZWYgV3JpdGVMaW5lKFRhcmdldCwgSXRlbSk6DQo+ID4gLSAgICByZXR1 cm4gJycuam9pbihbVGFyZ2V0LCBJdGVtLCAnXG4nXSkNCj4gPiArICAgIGlmIGlzaW5zdGFuY2Uo VGFyZ2V0LHN0cik6DQo+ID4gKyAgICAgICAgVGFyZ2V0ID0gW1RhcmdldF0NCj4gPiArICAgIGlm IG5vdCBUYXJnZXQ6DQo+ID4gKyAgICAgICAgVGFyZ2V0ID0gW10NCj4gPiArICAgIGlmIGlzaW5z dGFuY2UoSXRlbSwgbGlzdCk6DQo+ID4gKyAgICAgICAgVGFyZ2V0LmV4dGVuZChJdGVtKQ0KPiA+ ICsgICAgZWxzZToNCj4gPiArICAgICAgICBUYXJnZXQuYXBwZW5kKEl0ZW0pDQo+ID4gKyAgICBU YXJnZXQuYXBwZW5kKCdcbicpDQo+ID4gKyAgICByZXR1cm4gVGFyZ2V0DQo+ID4gIA0KPiA+ICAj IFRoaXMgYWN0cyBsaWtlIHRoZSBtYWluKCkgZnVuY3Rpb24gZm9yIHRoZSBzY3JpcHQsIHVubGVz cyBpdCBpcyANCj4gPiAnaW1wb3J0J2VkIGludG8gYW5vdGhlciAgIyBzY3JpcHQuDQo+ID4gIGlm IF9fbmFtZV9fID09ICdfX21haW5fXyc6DQo+ID4gICAgICBFZGtMb2dnZXIuaW5mbygnc3RhcnQn KQ0KPiA+IGRpZmYgLS1naXQgYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Db21tb24vTWlzYy5w eQ0KPiA+IGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQ29tbW9uL01pc2MucHkNCj4gPiBpbmRl eCA4MDIzNmRiMTYwLi44ZGNiZTE0MWFlIDEwMDY0NA0KPiA+IC0tLSBhL0Jhc2VUb29scy9Tb3Vy Y2UvUHl0aG9uL0NvbW1vbi9NaXNjLnB5DQo+ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRo b24vQ29tbW9uL01pc2MucHkNCj4gPiBAQCAtNzc3LDIxICs3NzcsMjEgQEAgY2xhc3MgVGVtcGxh dGVTdHJpbmcob2JqZWN0KToNCj4gPiAgDQo+ID4gICAgICAgICAgICAgIHJldHVybiAiIi5qb2lu KFN0cmluZ0xpc3QpDQo+ID4gIA0KPiA+ICAgICAgIyMgQ29uc3RydWN0b3INCj4gPiAgICAgIGRl ZiBfX2luaXRfXyhzZWxmLCBUZW1wbGF0ZT1Ob25lKToNCj4gPiAtICAgICAgICBzZWxmLlN0cmlu ZyA9ICcnDQo+ID4gKyAgICAgICAgc2VsZi5TdHJpbmcgPSBbXQ0KPiA+ICAgICAgICAgIHNlbGYu SXNCaW5hcnkgPSBGYWxzZQ0KPiA+ICAgICAgICAgIHNlbGYuX1RlbXBsYXRlID0gVGVtcGxhdGUN Cj4gPiAgICAgICAgICBzZWxmLl9UZW1wbGF0ZVNlY3Rpb25MaXN0ID0gc2VsZi5fUGFyc2UoVGVt cGxhdGUpDQo+ID4gIA0KPiA+ICAgICAgIyMgc3RyKCkgb3BlcmF0b3INCj4gPiAgICAgICMNCj4g PiAgICAgICMgICBAcmV0dmFsICAgICBzdHJpbmcgIFRoZSBzdHJpbmcgcmVwbGFjZWQNCj4gPiAg ICAgICMNCj4gPiAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOg0KPiA+IC0gICAgICAgIHJldHVybiBz ZWxmLlN0cmluZw0KPiA+ICsgICAgICAgIHJldHVybiAiIi5qb2luKHNlbGYuU3RyaW5nKQ0KPiA+ ICANCj4gPiAgICAgICMjIFNwbGl0IHRoZSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBmcmFnbWVudHMg cGVyIHRoZSAke0JFR0lOfSBhbmQgJHtFTkR9IGZsYWdzDQo+ID4gICAgICAjDQo+ID4gICAgICAj ICAgQHJldHZhbCAgICAgbGlzdCAgICBBIGxpc3Qgb2YgVGVtcGxhdGVTdHJpbmcuU2VjdGlvbiBv YmplY3RzDQo+ID4gICAgICAjDQo+ID4gQEAgLTgzNSwxMyArODM1LDE2IEBAIGNsYXNzIFRlbXBs YXRlU3RyaW5nKG9iamVjdCk6DQo+ID4gICAgICAjICAgQHBhcmFtICAgICAgRGljdGlvbmFyeSAg ICAgIFRoZSBwbGFjZWhvbGRlciBkaWN0aW9uYXJpZXMNCj4gPiAgICAgICMNCj4gPiAgICAgIGRl ZiBBcHBlbmQoc2VsZiwgQXBwZW5kU3RyaW5nLCBEaWN0aW9uYXJ5PU5vbmUpOg0KPiA+ICAgICAg ICAgIGlmIERpY3Rpb25hcnk6DQo+ID4gICAgICAgICAgICAgIFNlY3Rpb25MaXN0ID0gc2VsZi5f UGFyc2UoQXBwZW5kU3RyaW5nKQ0KPiA+IC0gICAgICAgICAgICBzZWxmLlN0cmluZyArPSAiIi5q b2luKFMuSW5zdGFudGlhdGUoRGljdGlvbmFyeSkgZm9yIFMgaW4gU2VjdGlvbkxpc3QpDQo+ID4g KyAgICAgICAgICAgIHNlbGYuU3RyaW5nLmFwcGVuZCggIiIuam9pbihTLkluc3RhbnRpYXRlKERp Y3Rpb25hcnkpIA0KPiA+ICsgZm9yIFMgaW4gU2VjdGlvbkxpc3QpKQ0KPiA+ICAgICAgICAgIGVs c2U6DQo+ID4gLSAgICAgICAgICAgIHNlbGYuU3RyaW5nICs9IEFwcGVuZFN0cmluZw0KPiA+ICsg ICAgICAgICAgICBpZiBpc2luc3RhbmNlKEFwcGVuZFN0cmluZyxsaXN0KToNCj4gPiArICAgICAg ICAgICAgICAgIHNlbGYuU3RyaW5nLmV4dGVuZChBcHBlbmRTdHJpbmcpDQo+ID4gKyAgICAgICAg ICAgIGVsc2U6DQo+ID4gKyAgICAgICAgICAgICAgICBzZWxmLlN0cmluZy5hcHBlbmQoQXBwZW5k U3RyaW5nKQ0KPiA+ICANCj4gPiAgICAgICMjIFJlcGxhY2UgdGhlIHN0cmluZyB0ZW1wbGF0ZSB3 aXRoIGRpY3Rpb25hcnkgb2YgcGxhY2Vob2xkZXJzDQo+ID4gICAgICAjDQo+ID4gICAgICAjICAg QHBhcmFtICAgICAgRGljdGlvbmFyeSAgICAgIFRoZSBwbGFjZWhvbGRlciBkaWN0aW9uYXJpZXMN Cj4gPiAgICAgICMNCj4gPiBAQCAtMTc0MSwyNyArMTc0NCwyMSBAQCBjbGFzcyBQYXRoQ2xhc3Mo b2JqZWN0KToNCj4gPiAgICAgICMNCj4gPiAgICAgICMgQHJldHZhbCBGYWxzZSBUaGUgdHdvIFBh dGhDbGFzcyBhcmUgZGlmZmVyZW50DQo+ID4gICAgICAjIEByZXR2YWwgVHJ1ZSAgVGhlIHR3byBQ YXRoQ2xhc3MgYXJlIHRoZSBzYW1lDQo+ID4gICAgICAjDQo+ID4gICAgICBkZWYgX19lcV9fKHNl bGYsIE90aGVyKToNCj4gPiAtICAgICAgICBpZiBpc2luc3RhbmNlKE90aGVyLCB0eXBlKHNlbGYp KToNCj4gPiAtICAgICAgICAgICAgcmV0dXJuIHNlbGYuUGF0aCA9PSBPdGhlci5QYXRoDQo+ID4g LSAgICAgICAgZWxzZToNCj4gPiAtICAgICAgICAgICAgcmV0dXJuIHNlbGYuUGF0aCA9PSBzdHIo T3RoZXIpDQo+ID4gKyAgICAgICAgcmV0dXJuIHNlbGYuUGF0aCA9PSBzdHIoT3RoZXIpDQo+ID4g IA0KPiA+ICAgICAgIyMgT3ZlcnJpZGUgX19jbXBfXyBmdW5jdGlvbg0KPiA+ICAgICAgIw0KPiA+ ICAgICAgIyBDdXN0b21pemUgdGhlIGNvbXBhcnNpb24gb3BlcmF0aW9uIG9mIHR3byBQYXRoQ2xh c3MNCj4gPiAgICAgICMNCj4gPiAgICAgICMgQHJldHZhbCAwICAgICBUaGUgdHdvIFBhdGhDbGFz cyBhcmUgZGlmZmVyZW50DQo+ID4gICAgICAjIEByZXR2YWwgLTEgICAgVGhlIGZpcnN0IFBhdGhD bGFzcyBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZCBQYXRoQ2xhc3MNCj4gPiAgICAgICMgQHJldHZh bCAxICAgICBUaGUgZmlyc3QgUGF0aENsYXNzIGlzIEJpZ2dlciB0aGFuIHRoZSBzZWNvbmQgUGF0 aENsYXNzDQo+ID4gICAgICBkZWYgX19jbXBfXyhzZWxmLCBPdGhlcik6DQo+ID4gLSAgICAgICAg aWYgaXNpbnN0YW5jZShPdGhlciwgdHlwZShzZWxmKSk6DQo+ID4gLSAgICAgICAgICAgIE90aGVy S2V5ID0gT3RoZXIuUGF0aA0KPiA+IC0gICAgICAgIGVsc2U6DQo+ID4gLSAgICAgICAgICAgIE90 aGVyS2V5ID0gc3RyKE90aGVyKQ0KPiA+ICsgICAgICAgIE90aGVyS2V5ID0gc3RyKE90aGVyKQ0K PiA+ICANCj4gPiAgICAgICAgICBTZWxmS2V5ID0gc2VsZi5QYXRoDQo+ID4gICAgICAgICAgaWYg U2VsZktleSA9PSBPdGhlcktleToNCj4gPiAgICAgICAgICAgICAgcmV0dXJuIDANCj4gPiAgICAg ICAgICBlbGlmIFNlbGZLZXkgPiBPdGhlcktleToNCj4gPiBkaWZmIC0tZ2l0IGEvQmFzZVRvb2xz L1NvdXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weQ0KPiA+IGIvQmFzZVRvb2xz L1NvdXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weQ0KPiA+IGluZGV4IDQ0ZDQ0 ZDI0ZWIuLmQ2MTVjY2NkZjcgMTAwNjQ0DQo+ID4gLS0tIGEvQmFzZVRvb2xzL1NvdXJjZS9QeXRo b24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weQ0KPiA+ICsrKyBiL0Jhc2VUb29scy9Tb3VyY2Uv UHl0aG9uL1dvcmtzcGFjZS9JbmZCdWlsZERhdGEucHkNCj4gPiBAQCAtNjEyLDExICs2MTIsMTMg QEAgY2xhc3MgSW5mQnVpbGREYXRhKE1vZHVsZUJ1aWxkQ2xhc3NPYmplY3QpOg0KPiA+ICAgICAg ICAgIGZvciBSZWNvcmQgaW4gUmVjb3JkTGlzdDoNCj4gPiAgICAgICAgICAgICAgTGliID0gUmVj b3JkWzBdDQo+ID4gICAgICAgICAgICAgIEluc3RhbmNlID0gUmVjb3JkWzFdDQo+ID4gICAgICAg ICAgICAgIGlmIEluc3RhbmNlOg0KPiA+ICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgPSBOb3Jt UGF0aChJbnN0YW5jZSwgc2VsZi5fTWFjcm9zKQ0KPiA+IC0gICAgICAgICAgICBSZXRWYWxbTGli XSA9IEluc3RhbmNlDQo+ID4gKyAgICAgICAgICAgICAgICBSZXRWYWxbTGliXSA9IEluc3RhbmNl DQo+ID4gKyAgICAgICAgICAgIGVsc2U6DQo+ID4gKyAgICAgICAgICAgICAgICBSZXRWYWxbTGli XSA9IE5vbmUNCj4gPiAgICAgICAgICByZXR1cm4gUmV0VmFsDQo+ID4gIA0KPiA+ICAgICAgIyMg UmV0cmlldmUgbGlicmFyeSBuYW1lcyAoZm9yIEVkay54IHN0eWxlIG9mIG1vZHVsZXMpDQo+ID4g ICAgICBAY2FjaGVkX3Byb3BlcnR5DQo+ID4gICAgICBkZWYgTGlicmFyaWVzKHNlbGYpOg0KPiA+ IGRpZmYgLS1naXQgYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvV29ya3NwYWNl Q29tbW9uLnB5DQo+ID4gYi9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvV29ya3Nw YWNlQ29tbW9uLnB5DQo+ID4gaW5kZXggOGQ4YTNlMjc4OS4uNTVkMDFmYTRiMiAxMDA2NDQNCj4g PiAtLS0gYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvV29ya3NwYWNlQ29tbW9u LnB5DQo+ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL1dvcmtzcGFj ZUNvbW1vbi5weQ0KPiA+IEBAIC0xMjYsMTcgKzEyNiwxNCBAQCBkZWYgR2V0TW9kdWxlTGliSW5z dGFuY2VzKE1vZHVsZSwgUGxhdGZvcm0sIEJ1aWxkRGF0YWJhc2UsIEFyY2gsIFRhcmdldCwgVG9v bGNoYQ0KPiA+ICAgICAgd2hpbGUgbGVuKExpYnJhcnlDb25zdW1lckxpc3QpID4gMDoNCj4gPiAg ICAgICAgICBNID0gTGlicmFyeUNvbnN1bWVyTGlzdC5wb3AoKQ0KPiA+ICAgICAgICAgIGZvciBM aWJyYXJ5Q2xhc3NOYW1lIGluIE0uTGlicmFyeUNsYXNzZXM6DQo+ID4gICAgICAgICAgICAgIGlm IExpYnJhcnlDbGFzc05hbWUgbm90IGluIExpYnJhcnlJbnN0YW5jZToNCj4gPiAgICAgICAgICAg ICAgICAgICMgb3ZlcnJpZGUgbGlicmFyeSBpbnN0YW5jZSBmb3IgdGhpcyBtb2R1bGUNCj4gPiAt ICAgICAgICAgICAgICAgIGlmIExpYnJhcnlDbGFzc05hbWUgaW4gUGxhdGZvcm0uTW9kdWxlc1tz dHIoTW9kdWxlKV0uTGlicmFyeUNsYXNzZXM6DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgTGli cmFyeVBhdGggPSBQbGF0Zm9ybS5Nb2R1bGVzW3N0cihNb2R1bGUpXS5MaWJyYXJ5Q2xhc3Nlc1tM aWJyYXJ5Q2xhc3NOYW1lXQ0KPiA+IC0gICAgICAgICAgICAgICAgZWxzZToNCj4gPiAtICAgICAg ICAgICAgICAgICAgICBMaWJyYXJ5UGF0aCA9IFBsYXRmb3JtLkxpYnJhcnlDbGFzc2VzW0xpYnJh cnlDbGFzc05hbWUsIE1vZHVsZVR5cGVdDQo+ID4gLSAgICAgICAgICAgICAgICBpZiBMaWJyYXJ5 UGF0aCBpcyBOb25lIG9yIExpYnJhcnlQYXRoID09ICIiOg0KPiA+IC0gICAgICAgICAgICAgICAg ICAgIExpYnJhcnlQYXRoID0gTS5MaWJyYXJ5Q2xhc3Nlc1tMaWJyYXJ5Q2xhc3NOYW1lXQ0KPiA+ IC0gICAgICAgICAgICAgICAgICAgIGlmIExpYnJhcnlQYXRoIGlzIE5vbmUgb3IgTGlicmFyeVBh dGggPT0gIiI6DQo+ID4gKyAgICAgICAgICAgICAgICBMaWJyYXJ5UGF0aCA9IFBsYXRmb3JtLk1v ZHVsZXNbc3RyKE1vZHVsZSldLkxpYnJhcnlDbGFzc2VzLmdldChMaWJyYXJ5Q2xhc3NOYW1lLFBs YXRmb3JtLkxpYnJhcnlDbGFzc2VzW0xpYnJhcnlDbGFzc05hbWUsIE1vZHVsZVR5cGVdKQ0KPiA+ ICsgICAgICAgICAgICAgICAgaWYgTGlicmFyeVBhdGggaXMgTm9uZToNCj4gPiArICAgICAgICAg ICAgICAgICAgICBMaWJyYXJ5UGF0aCA9IE0uTGlicmFyeUNsYXNzZXMuZ2V0KExpYnJhcnlDbGFz c05hbWUpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgaWYgTGlicmFyeVBhdGggaXMgTm9uZToN Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgRmlsZU5hbWU6DQo+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBFZGtMb2dnZXIuZXJyb3IoImJ1aWxkIiwgUkVTT1VSQ0VfTk9U X0FWQUlMQUJMRSwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAiSW5zdGFuY2Ugb2YgbGlicmFyeSBjbGFzcyBbJXNdIGlzIG5vdCBmb3VuZCIgJSBMaWJy YXJ5Q2xhc3NOYW1lLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEZpbGU9RmlsZU5hbWUsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgRXh0cmFEYXRhPSJpbiBbJXNdIA0KPiA+IFslc11cblx0Y29uc3VtZWQg YnkgbW9kdWxlIFslc10iICUgKHN0cihNKSwgQXJjaCwgc3RyKE1vZHVsZSkpKQ0KPiA+IC0tDQo+ ID4gMi4xOS4xLndpbmRvd3MuMQ0KPiA+IA0KPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fDQo+ID4gZWRrMi1kZXZlbCBtYWlsaW5nIGxpc3QNCj4gPiBl ZGsyLWRldmVsQGxpc3RzLjAxLm9yZw0KPiA+IGh0dHBzOi8vbGlzdHMuMDEub3JnL21haWxtYW4v bGlzdGluZm8vZWRrMi1kZXZlbA0K