From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.120; helo=mga04.intel.com; envelope-from=bob.c.feng@intel.com; receiver=edk2-devel@lists.01.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 D7F6A2119682A for ; Tue, 4 Dec 2018 18:52:02 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Dec 2018 18:52:02 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,316,1539673200"; d="scan'208";a="125154621" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga004.fm.intel.com with ESMTP; 04 Dec 2018 18:52:02 -0800 Received: from fmsmsx113.amr.corp.intel.com (10.18.116.7) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 4 Dec 2018 18:52:02 -0800 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by FMSMSX113.amr.corp.intel.com (10.18.116.7) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 4 Dec 2018 18:52:01 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.201]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.203]) with mapi id 14.03.0415.000; Wed, 5 Dec 2018 10:51:59 +0800 From: "Feng, Bob C" To: "edk2-devel@lists.01.org" CC: Leif Lindholm , "Carsey, Jaben" , "Gao, Liming" , "Feng, Bob C" Thread-Topic: [edk2] [Patch] BaseTools: Optimize string concatenation Thread-Index: AQHUd0w33kqZL81XV0agjUNN2Boo7KVFkjQAgAEi7jCAABp5AIAC7bJwgCXdNxA= Date: Wed, 5 Dec 2018 02:51:58 +0000 Message-ID: <08650203BA1BD64D8AD9B6D5D74A85D1600264F9@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> <08650203BA1BD64D8AD9B6D5D74A85D15FFFCFF1@SHSMSX101.ccr.corp.intel.com> In-Reply-To: <08650203BA1BD64D8AD9B6D5D74A85D15FFFCFF1@SHSMSX101.ccr.corp.intel.com> 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: Wed, 05 Dec 2018 02:52:03 -0000 Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGksDQoNCkkgaGF2ZSBhZGRlZCB0aGUgcGVyZm9ybWFuY2UgZGF0YSBpbiBCWiBodHRwczovL2J1 Z3ppbGxhLnRpYW5vY29yZS5vcmcvc2hvd19idWcuY2dpP2lkPTEyODggLiBQbGVhc2UgaGF2ZSBh IHJldmlldy4NCg0KVGhhbmtzLA0KQm9iDQoNCg0KLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0N CkZyb206IGVkazItZGV2ZWwgW21haWx0bzplZGsyLWRldmVsLWJvdW5jZXNAbGlzdHMuMDEub3Jn XSBPbiBCZWhhbGYgT2YgRmVuZywgQm9iIEMNClNlbnQ6IFN1bmRheSwgTm92ZW1iZXIgMTEsIDIw MTggODo0MSBBTQ0KVG86IExlaWYgTGluZGhvbG0gPGxlaWYubGluZGhvbG1AbGluYXJvLm9yZz4N CkNjOiBDYXJzZXksIEphYmVuIDxqYWJlbi5jYXJzZXlAaW50ZWwuY29tPjsgZWRrMi1kZXZlbEBs aXN0cy4wMS5vcmc7IEdhbywgTGltaW5nIDxsaW1pbmcuZ2FvQGludGVsLmNvbT4NClN1YmplY3Q6 IFJlOiBbZWRrMl0gW1BhdGNoXSBCYXNlVG9vbHM6IE9wdGltaXplIHN0cmluZyBjb25jYXRlbmF0 aW9uDQoNCkhpIExlaWYsDQoNCkkgdXNlIG15IGRlc2t0b3AgdG8gZG8gdGhlIGJlbmNobWFyay4N CkNQVTogSW50ZWwoUikgQ29yZShUTSkgaTctNjcwMCBDUFUgQCAzLjQwR0h6DQpNZW1vcnk6IDE2 Rw0KT1M6IFdpbjEwDQoNCkknbGwgYWRkIHRoZSBwZXJmb3JtYW5jZSBkZXRhaWxlZCBkYXRhIHRv IEJaLg0KDQotQm9iDQoNCi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQpGcm9tOiBMZWlmIExp bmRob2xtIFttYWlsdG86bGVpZi5saW5kaG9sbUBsaW5hcm8ub3JnXQ0KU2VudDogRnJpZGF5LCBO b3ZlbWJlciA5LCAyMDE4IDc6NDkgUE0NClRvOiBGZW5nLCBCb2IgQyA8Ym9iLmMuZmVuZ0BpbnRl bC5jb20+DQpDYzogZWRrMi1kZXZlbEBsaXN0cy4wMS5vcmc7IENhcnNleSwgSmFiZW4gPGphYmVu LmNhcnNleUBpbnRlbC5jb20+OyBHYW8sIExpbWluZyA8bGltaW5nLmdhb0BpbnRlbC5jb20+DQpT dWJqZWN0OiBSZTogW2VkazJdIFtQYXRjaF0gQmFzZVRvb2xzOiBPcHRpbWl6ZSBzdHJpbmcgY29u Y2F0ZW5hdGlvbg0KDQpIaSBCb2IsDQoNCk9uIEZyaSwgTm92IDA5LCAyMDE4IGF0IDAzOjI1OjA0 QU0gKzAwMDAsIEZlbmcsIEJvYiBDIHdyb3RlOg0KPiBZZXMuIEkgc2hvdWxkIHNob3cgdGhlIGRh dGEuDQo+IA0KPiBNeSB1bml0ZXMgc2NyaXB0cyBpcyBhcyBiZWxvdy4gVGhlIHBhcmFtZXRlciBs aW5lcyBpcyBhIHN0cmluZyBsaXN0IA0KPiB3aGljaCBzaXplIGlzIDQzMzk1LiBUaGUgdGVzdCBy ZXN1bHQgaXMNCj4gDQo+ICcnLmpvaW4oU3RyaW5nIGxpc3QpIHRpbWU6ICAwLjA0MjI2Mg0KPiBT dHJpbmcgKz0gU3RyaW5nIHRpbWUgIDogIDMuODIyNjk5DQo+IA0KPiBkZWYgVGVzdFBsdXMobGlu ZXMpOg0KPiAgICAgc3RyX3RhcmdldCA9ICIiDQo+ICAgICANCj4gICAgIGZvciBsaW5lIGluIGxp bmVzOg0KPiAgICAgICAgIHN0cl90YXJnZXQgKz0gbGluZQ0KPiAgICAgICAgIA0KPiAgICAgcmV0 dXJuIHN0cl90YXJnZXQNCj4gDQo+IGRlZiBUZXN0Sm9pbihsaW5lcyk6DQo+ICAgICBzdHJfdGFy Z2V0ID0gW10NCj4gICAgIA0KPiAgICAgZm9yIGxpbmUgaW4gbGluZXM6DQo+ICAgICAgICAgc3Ry X3RhcmdldC5hcHBlbmQobGluZSkNCj4gICAgICAgICANCj4gICAgIHJldHVybiAiIi5qb2luKHN0 cl90YXJnZXQpDQo+IA0KPiBkZWYgQ29tcGFyZVN0ckNhdCgpOg0KPiAgICAgbGluZXMgPSBHZXRT dHJpbmdzKCkNCj4gICAgIHByaW50IChsZW4obGluZXMpKQ0KPiAgICAgDQo+ICAgICBiZWdpbiA9 IHRpbWUucGVyZl9jb3VudGVyKCkNCj4gICAgIGZvciBfIGluIHJhbmdlKDEwKToNCj4gICAgICAg ICBUZXN0Sm9pbihsaW5lcykNCj4gICAgIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyKCkgLSBiZWdp bg0KPiAgICAgcHJpbnQgKCInJy5qb2luKFN0cmluZyBsaXN0KSB0aW1lOiAlZiIgJSBlbmQpDQo+ ICAgICANCj4gICAgIGJlZ2luID0gdGltZS5wZXJmX2NvdW50ZXIoKQ0KPiAgICAgZm9yIF8gaW4g cmFuZ2UoMTApOg0KPiAgICAgICAgIFRlc3RQbHVzKGxpbmVzKQ0KPiAgICAgZW5kID0gdGltZS5w ZXJmX2NvdW50ZXIoKSAtIGJlZ2luDQo+ICAgICBwcmludCAoIlN0cmluZyArPSBTdHJpbmcgdGlt ZTogJWYiICUgZW5kKQ0KPiANCj4gRm9yIGJ1aWxkIE92bWZYNjQsIGl0J3Mgbm90IHZlcnkgZWZm ZWN0aXZlLCBpdCBzYXZlcyAyfjMgc2Vjb25kIGluIA0KPiBQYXJzZS9BdXRvR2VuIHBoYXNlLCBi ZWNhdXNlIE92bWZYNjQgaXMgcmVsYXRpdmVseSBzaW1wbGUuIEl0IGRvZXMgbm90IA0KPiBlbmFi bGUgbXVjaCBmZWF0dXJlcyBzdWNoIGFzIE11bHRpcGxlIFNLVSBhbmQgc3RydWN0dXJlIFBDRCBi eSBkZWZhdWx0IA0KPiBhbmQgdGhlcmUgaXMgbm8gYmlnIHNpemUgQXV0b2dlbi5jL0F1dG9nZW4u aC9NYWtlZmlsZSBnZW5lcmF0ZWQgDQo+IGVpdGhlci4gYnV0IGZvciB0aGUgY29tcGxleCBwbGF0 Zm9ybSwgdGhpcyBwYXRjaCB3aWxsIGJlIG11Y2ggDQo+IGVmZmVjdGl2ZS4gVGhlIHVuaXRlcyBh Ym92ZSBzaW11bGF0ZXMgYSByZWFsIGNhc2UgdGhhdCB0aGVyZSBpcyBhDQo+IDQzMzk1IGxpbmVz IG9mIEF1dG9nZW4uYyBnZW5lcmF0ZWQuDQoNCkkgYmVnIHRvIGRpZmZlci4gU2hhdmluZyAyLTMg c2Vjb25kcyBvZmYgdGhlIGF1dG9nZW4gcGhhc2UgaXMgYSBzdWJzdGFudGlhbCBpbXByb3ZlbWVu dC4NCg0KSG93ZXZlciwgb24gbXkgd2ltcHkgMjQtY29yZSBDb3J0ZXgtQTUzIHN5c3RlbSwgdGhl IGVmZmVjdCBpcyBub3Qgbm90aWNlYWJsZSAoZmx1Y3R1YXRlcyBiZXR3ZWVuIDE6NTYtMTo1OCB3 aGV0aGVyIHdpdGggb3Igd2l0aG91dCB0aGlzIHBhdGNoKS4NCg0KQW5kIGV2ZW4gb24gbXkgeDg2 IHdvcmtzdGF0aW9uLCBJIHNlZSBubyBtZWFzdXJhYmxlIGRpZmZlcmVuY2UgKDEyLTEzcykuDQpX aGF0IGlzIHRoZSBoYXJkd2FyZSB5b3UgYXJlIGJlbmNobWFya2luZyBvbj8NCg0KSXQgZG9lcyBu b3QgYXBwZWFyIHRvIGJlIGRldHJpbWVudGFsIHRvIHBlcmZvcm1hbmNlIG9uIGFueSBvZiBteSBw bGF0Zm9ybXMsIGJ1dCBJIHdvdWxkIGxpa2UgdG8gc2VlIHNvbWUgbW9yZSBtZWFzdXJlbWVudHMs IGFuZCBJIHdvdWxkIGxpa2UgdG8gc2VlIHRoYXQgbG9nZ2VkIHdpdGggc29tZSBtb3JlIGRldGFp bCBpbiBidWd6aWxsYS4NCg0KUmVnYXJkcywNCg0KTGVpZg0KDQo+IFNpbmNlIHRoaXMgcGF0Y2gg bW9zdGx5IGVmZmVjdCB0aGUgUGFyc2VyL0F1dG9HZW4gcGhhc2UsIEkganVzdCB1c2UgDQo+ICJi dWlsZCBnZW5tYWtlIiB0byBzaG93IHRoZSBpbXByb3ZlbWVudCBkYXRhLg0KPiBUaGUgZmluYWwg cmVzdWx0IGZvciBjbGVhbiBidWlsZCBpczoNCj4gQ3VycmVudCBjb2RlOiAgMTcgc2Vjb25kcw0K PiBBZnRlciBwYXRjaDogICAgICAxNSBzZWNvbmRzDQo+IA0KPiBEZXRhaWxzOg0KPiBDdXJyZW50 IGRhdGE6DQo+IA0KPiBkOlxlZGsyIChtYXN0ZXIgLT4gb3JpZ2luKQ0KPiDOuyBidWlsZCBnZW5t YWtlIC1wIE92bWZQa2dcT3ZtZlBrZ0lhMzJYNjQuZHNjIC1hIElBMzIgLWEgWDY0IC10DQo+IFZT MjAxNXg4NiBCdWlsZCBlbnZpcm9ubWVudDogV2luZG93cy0xMC0xMC4wLjEwMjQwIEJ1aWxkIHN0 YXJ0IHRpbWU6IA0KPiAxMDoxMjozMiwgTm92LjA5IDIwMTgNCj4gDQo+IFdPUktTUEFDRSAgICAg ICAgPSBkOlxlZGsyDQo+IEVDUF9TT1VSQ0UgICAgICAgPSBkOlxlZGsyXGVka2NvbXBhdGliaWxp dHlwa2cNCj4gRURLX1NPVVJDRSAgICAgICA9IGQ6XGVkazJcZWRrY29tcGF0aWJpbGl0eXBrZw0K PiBFRklfU09VUkNFICAgICAgID0gZDpcZWRrMlxlZGtjb21wYXRpYmlsaXR5cGtnDQo+IEVES19U T09MU19QQVRIICAgPSBkOlxlZGsyXGJhc2V0b29scw0KPiBFREtfVE9PTFNfQklOICAgID0gZDpc ZWRrMlxiYXNldG9vbHNcYmluXHdpbjMyDQo+IENPTkZfUEFUSCAgICAgICAgPSBkOlxlZGsyXGNv bmYNCj4gDQo+IEFyY2hpdGVjdHVyZShzKSAgPSBJQTMyIFg2NA0KPiBCdWlsZCB0YXJnZXQgICAg ID0gREVCVUcNCj4gVG9vbGNoYWluICAgICAgICA9IFZTMjAxNXg4Ng0KPiANCj4gQWN0aXZlIFBs YXRmb3JtICAgICAgICAgID0gZDpcZWRrMlxPdm1mUGtnXE92bWZQa2dJYTMyWDY0LmRzYw0KPiBG bGFzaCBJbWFnZSBEZWZpbml0aW9uICAgPSBkOlxlZGsyXE92bWZQa2dcT3ZtZlBrZ0lhMzJYNjQu ZmRmDQo+IA0KPiBQcm9jZXNzaW5nIG1ldGEtZGF0YSAuLi4uLi4uIGRvbmUhDQo+IEdlbmVyYXRp bmcgY29kZSAuIGRvbmUhDQo+IEdlbmVyYXRpbmcgbWFrZWZpbGUgLiBkb25lIQ0KPiBHZW5lcmF0 aW5nIGNvZGUgLi4gZG9uZSENCj4gR2VuZXJhdGluZyBtYWtlZmlsZSAuLi4uLi4gZG9uZSENCj4g DQo+IC0gRG9uZSAtDQo+IEJ1aWxkIGVuZCB0aW1lOiAxMDoxMjo0OSwgTm92LjA5IDIwMTgNCj4g QnVpbGQgdG90YWwgdGltZTogMDA6MDA6MTcNCj4gDQo+IEFmdGVyIGFwcGx5aW5nIHRoaXMgcGF0 Y2g6DQo+IA0KPiBkOlxlZGsyIChtYXN0ZXIgLT4gb3JpZ2luKSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIA0KPiDOuyBidWlsZCBnZW5tYWtlIC1wIE92bWZQa2dcT3ZtZlBrZ0lh MzJYNjQuZHNjIC1hIElBMzIgLWEgWDY0IC0NCj4gQnVpbGQgZW52aXJvbm1lbnQ6IFdpbmRvd3Mt MTAtMTAuMC4xMDI0MCAgICAgICAgICAgICAgICAgICAgICANCj4gQnVpbGQgc3RhcnQgdGltZTog MTA6MTE6NDEsIE5vdi4wOSAyMDE4ICAgICAgICAgICAgICAgICAgICAgICANCj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4g V09SS1NQQUNFICAgICAgICA9IGQ6XGVkazIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICANCj4gRUNQX1NPVVJDRSAgICAgICA9IGQ6XGVkazJcZWRrY29tcGF0aWJpbGl0eXBrZyAg ICAgICAgICAgICAgICANCj4gRURLX1NPVVJDRSAgICAgICA9IGQ6XGVkazJcZWRrY29tcGF0aWJp bGl0eXBrZyAgICAgICAgICAgICAgICANCj4gRUZJX1NPVVJDRSAgICAgICA9IGQ6XGVkazJcZWRr Y29tcGF0aWJpbGl0eXBrZyAgICAgICAgICAgICAgICANCj4gRURLX1RPT0xTX1BBVEggICA9IGQ6 XGVkazJcYmFzZXRvb2xzICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gRURLX1RPT0xTX0JJ TiAgICA9IGQ6XGVkazJcYmFzZXRvb2xzXGJpblx3aW4zMiAgICAgICAgICAgICAgICANCj4gQ09O Rl9QQVRIICAgICAgICA9IGQ6XGVkazJcY29uZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICANCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICANCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICANCj4gQXJjaGl0ZWN0dXJlKHMpICA9IElBMzIgWDY0ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gQnVpbGQgdGFyZ2V0ICAgICA9IERFQlVH ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gVG9vbGNoYWluICAgICAg ICA9IFZTMjAxNXg4NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAN Cj4gQWN0aXZlIFBsYXRmb3JtICAgICAgICAgID0gZDpcZWRrMlxPdm1mUGtnXE92bWZQa2dJYTMy WDY0LmRzYyANCj4gRmxhc2ggSW1hZ2UgRGVmaW5pdGlvbiAgID0gZDpcZWRrMlxPdm1mUGtnXE92 bWZQa2dJYTMyWDY0LmZkZiANCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gUHJvY2Vzc2luZyBtZXRhLWRhdGEgLi4uLi4g ZG9uZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gR2VuZXJhdGluZyBjb2RlIC4g ZG9uZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gR2VuZXJhdGlu ZyBtYWtlZmlsZSAuIGRvbmUhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4g R2VuZXJhdGluZyBjb2RlIC4uIGRvbmUhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICANCj4gR2VuZXJhdGluZyBtYWtlZmlsZSAuLi4uLi4gZG9uZSEgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICANCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICANCj4gLSBEb25lIC0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gQnVpbGQgZW5kIHRpbWU6IDEwOjEx OjU2LCBOb3YuMDkgMjAxOCAgICAgICAgICAgICAgICAgICAgICAgICANCj4gQnVpbGQgdG90YWwg dGltZTogMDA6MDA6MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj4gDQo+ IA0KPiBUaGFua3MsDQo+IEJvYg0KPiANCj4gDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0t DQo+IEZyb206IExlaWYgTGluZGhvbG0gW21haWx0bzpsZWlmLmxpbmRob2xtQGxpbmFyby5vcmdd DQo+IFNlbnQ6IEZyaWRheSwgTm92ZW1iZXIgOSwgMjAxOCAxMjo1MyBBTQ0KPiBUbzogRmVuZywg Qm9iIEMgPGJvYi5jLmZlbmdAaW50ZWwuY29tPg0KPiBDYzogZWRrMi1kZXZlbEBsaXN0cy4wMS5v cmc7IENhcnNleSwgSmFiZW4gPGphYmVuLmNhcnNleUBpbnRlbC5jb20+OyANCj4gR2FvLCBMaW1p bmcgPGxpbWluZy5nYW9AaW50ZWwuY29tPg0KPiBTdWJqZWN0OiBSZTogW2VkazJdIFtQYXRjaF0g QmFzZVRvb2xzOiBPcHRpbWl6ZSBzdHJpbmcgY29uY2F0ZW5hdGlvbg0KPiANCj4gT24gVGh1LCBO b3YgMDgsIDIwMTggYXQgMDY6MTY6MjVQTSArMDgwMCwgQm9iQ0Ygd3JvdGU6DQo+ID4gaHR0cHM6 Ly9idWd6aWxsYS50aWFub2NvcmUub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjg4DQo+ID4gDQo+ID4g VGhpcyBwYXRjaCBpcyBvbmUgb2YgYnVpbGQgdG9vbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBz ZXJpZXMgDQo+ID4gcGF0Y2hlcy4NCj4gPiANCj4gPiBUaGlzIHBhdGNoIGlzIGdvaW5nIHRvIHVz ZSBqb2luIGZ1bmN0aW9uIGluc3RlYWQgb2Ygc3RyaW5nICs9DQo+ID4gc3RyaW5nMiBzdGF0ZW1l bnQuDQo+ID4gDQo+ID4gQ3VycmVudCBjb2RlIHVzZSBzdHJpbmcgKz0gc3RyaW5nMiBpbiBhIGxv b3AgdG8gY29tYmluZSBhIHN0cmluZy4gDQo+ID4gd2hpbGUgY3JlYXRpbmcgYSBzdHJpbmcgbGlz dCBpbiBhIGxvb3AgYW5kIHVzaW5nDQo+ID4gIiIuam9pbihzdHJpbmdsaXN0KSBhZnRlciB0aGUg bG9vcCB3aWxsIGJlIG11Y2ggZmFzdGVyLg0KPiANCj4gRG8geW91IGhhdmUgYW55IG51bWJlcnMg b24gdGhlIGxldmVsIG9mIGltcHJvdmVtZW50IHNlZW4/DQo+IA0KPiBFaXRoZXIgZm9yIHRoZSBp bmRpdmlkdWFsIHNjcmlwdHMgd2hlbiBjYWxsZWQgaWRlbnRpY2FsbHksIG9yIChpZg0KPiBtZWFz dXJhYmxlKSBvbiB0aGUgYnVpbGQgb2YgYW4gZW50aXJlIHBsYXRmb3JtIChzYXkgT3ZtZlg2ND8p Lg0KPiANCj4gUmVnYXJkcywNCj4gDQo+IExlaWYNCj4gDQo+ID4gQ29udHJpYnV0ZWQtdW5kZXI6 IFRpYW5vQ29yZSBDb250cmlidXRpb24gQWdyZWVtZW50IDEuMQ0KPiA+IFNpZ25lZC1vZmYtYnk6 IEJvYkNGIDxib2IuYy5mZW5nQGludGVsLmNvbT4NCj4gPiBDYzogTGltaW5nIEdhbyA8bGltaW5n Lmdhb0BpbnRlbC5jb20+DQo+ID4gQ2M6IEphYmVuIENhcnNleSA8amFiZW4uY2Fyc2V5QGludGVs LmNvbT4NCj4gPiAtLS0NCj4gPiAgQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9TdHJH YXRoZXIucHkgIHwgMzkgKysrKysrKysrKysrKy0tLS0tLQ0KPiA+ICBCYXNlVG9vbHMvU291cmNl L1B5dGhvbi9Db21tb24vTWlzYy5weSAgICAgICAgfCAyMSArKysrKy0tLS0tDQo+ID4gIC4uLi9T b3VyY2UvUHl0aG9uL1dvcmtzcGFjZS9JbmZCdWlsZERhdGEucHkgICB8ICA0ICstDQo+ID4gIC4u Li9QeXRob24vV29ya3NwYWNlL1dvcmtzcGFjZUNvbW1vbi5weSAgICAgICB8IDExICsrLS0tLQ0K PiA+ICA0IGZpbGVzIGNoYW5nZWQsIDQ0IGluc2VydGlvbnMoKyksIDMxIGRlbGV0aW9ucygtKQ0K PiA+IA0KPiA+IGRpZmYgLS1naXQgYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9BdXRvR2VuL1N0 ckdhdGhlci5weQ0KPiA+IGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9TdHJHYXRo ZXIucHkNCj4gPiBpbmRleCAzNjFkNDk5MDc2Li5kMzRhOWU5NDQ3IDEwMDY0NA0KPiA+IC0tLSBh L0Jhc2VUb29scy9Tb3VyY2UvUHl0aG9uL0F1dG9HZW4vU3RyR2F0aGVyLnB5DQo+ID4gKysrIGIv QmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9TdHJHYXRoZXIucHkNCj4gPiBAQCAtMTM1 LDExICsxMzUsMTEgQEAgZGVmIEFzY1RvSGV4TGlzdChBc2NpaSk6DQo+ID4gICMgQHBhcmFtIFVu aUdlbkNGbGFnICAgICAgVW5pU3RyaW5nIGlzIGdlbmVyYXRlZCBpbnRvIEF1dG9HZW4gQyBmaWxl IHdoZW4gaXQgaXMgc2V0IHRvIFRydWUNCj4gPiAgIw0KPiA+ICAjIEByZXR2YWwgU3RyOiAgICAg ICAgICAgQSBzdHJpbmcgb2YgLmggZmlsZSBjb250ZW50DQo+ID4gICMNCj4gPiAgZGVmIENyZWF0 ZUhGaWxlQ29udGVudChCYXNlTmFtZSwgVW5pT2JqZWN0Q2xhc3MsIElzQ29tcGF0aWJsZU1vZGUs IFVuaUdlbkNGbGFnKToNCj4gPiAtICAgIFN0ciA9ICcnDQo+ID4gKyAgICBTdHIgPSBbXQ0KPiA+ ICAgICAgVmFsdWVTdGFydFB0ciA9IDYwDQo+ID4gICAgICBMaW5lID0gQ09NTUVOVF9ERUZJTkVf U1RSICsgJyAnICsgTEFOR1VBR0VfTkFNRV9TVFJJTkdfTkFNRSArICcgJyAqIChWYWx1ZVN0YXJ0 UHRyIC0gbGVuKERFRklORV9TVFIgKyBMQU5HVUFHRV9OQU1FX1NUUklOR19OQU1FKSkgKyBEZWNU b0hleFN0cigwLCA0KSArIENPTU1FTlRfTk9UX1JFRkVSRU5DRUQNCj4gPiAgICAgIFN0ciA9IFdy aXRlTGluZShTdHIsIExpbmUpDQo+ID4gICAgICBMaW5lID0gQ09NTUVOVF9ERUZJTkVfU1RSICsg JyAnICsgUFJJTlRBQkxFX0xBTkdVQUdFX05BTUVfU1RSSU5HX05BTUUgKyAnICcgKiAoVmFsdWVT dGFydFB0ciAtIGxlbihERUZJTkVfU1RSICsgUFJJTlRBQkxFX0xBTkdVQUdFX05BTUVfU1RSSU5H X05BTUUpKSArIERlY1RvSGV4U3RyKDEsIDQpICsgQ09NTUVOVF9OT1RfUkVGRVJFTkNFRA0KPiA+ ICAgICAgU3RyID0gV3JpdGVMaW5lKFN0ciwgTGluZSkNCj4gPiBAQCAtMTY0LDE2ICsxNjQsMTYg QEAgZGVmIENyZWF0ZUhGaWxlQ29udGVudChCYXNlTmFtZSwgVW5pT2JqZWN0Q2xhc3MsIElzQ29t cGF0aWJsZU1vZGUsIFVuaUdlbkNGbGFnKToNCj4gPiAgICAgICAgICAgICAgICAgICAgICBMaW5l ID0gQ09NTUVOVF9ERUZJTkVfU1RSICsgJyAnICsgTmFtZSArICcgJyArIERlY1RvSGV4U3RyKFRv a2VuLCA0KSArIENPTU1FTlRfTk9UX1JFRkVSRU5DRUQNCj4gPiAgICAgICAgICAgICAgICAgIGVs c2U6DQo+ID4gICAgICAgICAgICAgICAgICAgICAgTGluZSA9IENPTU1FTlRfREVGSU5FX1NUUiAr ICcgJyArIE5hbWUgKyAnICcgKiAoVmFsdWVTdGFydFB0ciAtIGxlbihERUZJTkVfU1RSICsgTmFt ZSkpICsgRGVjVG9IZXhTdHIoVG9rZW4sIDQpICsgQ09NTUVOVF9OT1RfUkVGRVJFTkNFRA0KPiA+ ICAgICAgICAgICAgICAgICAgVW51c2VkU3RyID0gV3JpdGVMaW5lKFVudXNlZFN0ciwgTGluZSkN Cj4gPiAgDQo+ID4gLSAgICBTdHIgPSAnJy5qb2luKFtTdHIsIFVudXNlZFN0cl0pDQo+ID4gKyAg ICBTdHIuZXh0ZW5kKCBVbnVzZWRTdHIpDQo+ID4gIA0KPiA+ICAgICAgU3RyID0gV3JpdGVMaW5l KFN0ciwgJycpDQo+ID4gICAgICBpZiBJc0NvbXBhdGlibGVNb2RlIG9yIFVuaUdlbkNGbGFnOg0K PiA+ICAgICAgICAgIFN0ciA9IFdyaXRlTGluZShTdHIsICdleHRlcm4gdW5zaWduZWQgY2hhciAn ICsgQmFzZU5hbWUgKyAnU3RyaW5nc1tdOycpDQo+ID4gLSAgICByZXR1cm4gU3RyDQo+ID4gKyAg ICByZXR1cm4gIiIuam9pbihTdHIpDQo+ID4gIA0KPiA+ICAjIyBDcmVhdGUgYSBjb21wbGV0ZSAu aCBmaWxlDQo+ID4gICMNCj4gPiAgIyBDcmVhdGUgYSBjb21wbGV0IC5oIGZpbGUgd2l0aCBmaWxl IGhlYWRlciBhbmQgZmlsZSBjb250ZW50ICAjIEBADQo+ID4gLTE4NSwxMSArMTg1LDExIEBAIGRl ZiBDcmVhdGVIRmlsZUNvbnRlbnQoQmFzZU5hbWUsIFVuaU9iamVjdENsYXNzLCBJc0NvbXBhdGli bGVNb2RlLCBVbmlHZW5DRmxhZyk6DQo+ID4gICMgQHJldHZhbCBTdHI6ICAgICAgICAgICBBIHN0 cmluZyBvZiBjb21wbGV0ZSAuaCBmaWxlDQo+ID4gICMNCj4gPiAgZGVmIENyZWF0ZUhGaWxlKEJh c2VOYW1lLCBVbmlPYmplY3RDbGFzcywgSXNDb21wYXRpYmxlTW9kZSwgVW5pR2VuQ0ZsYWcpOg0K PiA+ICAgICAgSEZpbGUgPSBXcml0ZUxpbmUoJycsIENyZWF0ZUhGaWxlQ29udGVudChCYXNlTmFt ZSwgDQo+ID4gVW5pT2JqZWN0Q2xhc3MsIElzQ29tcGF0aWJsZU1vZGUsIFVuaUdlbkNGbGFnKSkN Cj4gPiAgDQo+ID4gLSAgICByZXR1cm4gSEZpbGUNCj4gPiArICAgIHJldHVybiAiIi5qb2luKEhG aWxlKQ0KPiA+ICANCj4gPiAgIyMgQ3JlYXRlIGEgYnVmZmVyIHRvIHN0b3JlIGFsbCBpdGVtcyBp biBhbiBhcnJheSAgIw0KPiA+ICAjIEBwYXJhbSBCaW5CdWZmZXIgICBCdWZmZXIgdG8gY29udGFp biBCaW5hcnkgZGF0YS4NCj4gPiAgIyBAcGFyYW0gQXJyYXk6ICAgICAgVGhlIGFycmF5IG5lZWQg dG8gYmUgZm9ybWF0dGVkDQo+ID4gQEAgLTIwOSwxMSArMjA5LDExIEBAIGRlZiBDcmVhdGVCaW5C dWZmZXIoQmluQnVmZmVyLCBBcnJheSk6DQo+ID4gICMNCj4gPiAgZGVmIENyZWF0ZUFycmF5SXRl bShBcnJheSwgV2lkdGggPSAxNik6DQo+ID4gICAgICBNYXhMZW5ndGggPSBXaWR0aA0KPiA+ICAg ICAgSW5kZXggPSAwDQo+ID4gICAgICBMaW5lID0gJyAgJw0KPiA+IC0gICAgQXJyYXlJdGVtID0g JycNCj4gPiArICAgIEFycmF5SXRlbSA9IFtdDQo+ID4gIA0KPiA+ICAgICAgZm9yIEl0ZW0gaW4g QXJyYXk6DQo+ID4gICAgICAgICAgaWYgSW5kZXggPCBNYXhMZW5ndGg6DQo+ID4gICAgICAgICAg ICAgIExpbmUgPSBMaW5lICsgSXRlbSArICcsICAnDQo+ID4gICAgICAgICAgICAgIEluZGV4ID0g SW5kZXggKyAxDQo+ID4gQEAgLTIyMSwxMSArMjIxLDExIEBAIGRlZiBDcmVhdGVBcnJheUl0ZW0o QXJyYXksIFdpZHRoID0gMTYpOg0KPiA+ICAgICAgICAgICAgICBBcnJheUl0ZW0gPSBXcml0ZUxp bmUoQXJyYXlJdGVtLCBMaW5lKQ0KPiA+ICAgICAgICAgICAgICBMaW5lID0gJyAgJyArIEl0ZW0g KyAnLCAgJw0KPiA+ICAgICAgICAgICAgICBJbmRleCA9IDENCj4gPiAgICAgIEFycmF5SXRlbSA9 IFdyaXRlKEFycmF5SXRlbSwgTGluZS5yc3RyaXAoKSkNCj4gPiAgDQo+ID4gLSAgICByZXR1cm4g QXJyYXlJdGVtDQo+ID4gKyAgICByZXR1cm4gIiIuam9pbihBcnJheUl0ZW0pDQo+ID4gIA0KPiA+ ICAjIyBDcmVhdGVDRmlsZVN0cmluZ1ZhbHVlDQo+ID4gICMNCj4gPiAgIyBDcmVhdGUgYSBsaW5l IHdpdGggc3RyaW5nIHZhbHVlDQo+ID4gICMNCj4gPiBAQCAtMjM2LDExICsyMzYsMTEgQEAgZGVm IENyZWF0ZUFycmF5SXRlbShBcnJheSwgV2lkdGggPSAxNik6DQo+ID4gIA0KPiA+ICBkZWYgQ3Jl YXRlQ0ZpbGVTdHJpbmdWYWx1ZShWYWx1ZSk6DQo+ID4gICAgICBWYWx1ZSA9IFtTdHJpbmdCbG9j a1R5cGVdICsgVmFsdWUNCj4gPiAgICAgIFN0ciA9IFdyaXRlTGluZSgnJywgQ3JlYXRlQXJyYXlJ dGVtKFZhbHVlKSkNCj4gPiAgDQo+ID4gLSAgICByZXR1cm4gU3RyDQo+ID4gKyAgICByZXR1cm4g IiIuam9pbihTdHIpDQo+ID4gIA0KPiA+ICAjIyBHZXRGaWx0ZXJlZExhbmd1YWdlDQo+ID4gICMN Cj4gPiAgIyBhcHBseSBnZXQgYmVzdCBsYW5ndWFnZSBydWxlcyB0byB0aGUgVU5JIGxhbmd1YWdl IGNvZGUgbGlzdCAgIyBAQA0KPiA+IC00MzgsMTEgKzQzOCwxMSBAQCBkZWYgQ3JlYXRlQ0ZpbGVD b250ZW50KEJhc2VOYW1lLCBVbmlPYmplY3RDbGFzcywgSXNDb21wYXRpYmxlTW9kZSwgVW5pQmlu QnVmZmVyLA0KPiA+ICAgICAgIw0KPiA+ICAgICAgIyBKb2luIHBhY2thZ2UgZGF0YQ0KPiA+ICAg ICAgIw0KPiA+ICAgICAgQWxsU3RyID0gV3JpdGUoQWxsU3RyLCBTdHIpDQo+ID4gIA0KPiA+IC0g ICAgcmV0dXJuIEFsbFN0cg0KPiA+ICsgICAgcmV0dXJuICIiLmpvaW4oQWxsU3RyKQ0KPiA+ICAN Cj4gPiAgIyMgQ3JlYXRlIGVuZCBvZiAuYyBmaWxlDQo+ID4gICMNCj4gPiAgIyBDcmVhdGUgZW5k IG9mIC5jIGZpbGUNCj4gPiAgIw0KPiA+IEBAIC00NjUsMTEgKzQ2NSwxMSBAQCBkZWYgQ3JlYXRl Q0ZpbGVFbmQoKToNCj4gPiAgIw0KPiA+ICBkZWYgQ3JlYXRlQ0ZpbGUoQmFzZU5hbWUsIFVuaU9i amVjdENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBGaWx0ZXJJbmZvKToNCj4gPiAgICAgIENGaWxl ID0gJycNCj4gPiAgICAgIENGaWxlID0gV3JpdGVMaW5lKENGaWxlLCBDcmVhdGVDRmlsZUNvbnRl bnQoQmFzZU5hbWUsIFVuaU9iamVjdENsYXNzLCBJc0NvbXBhdGlibGVNb2RlLCBOb25lLCBGaWx0 ZXJJbmZvKSkNCj4gPiAgICAgIENGaWxlID0gV3JpdGVMaW5lKENGaWxlLCBDcmVhdGVDRmlsZUVu ZCgpKQ0KPiA+IC0gICAgcmV0dXJuIENGaWxlDQo+ID4gKyAgICByZXR1cm4gIiIuam9pbihDRmls ZSkNCj4gPiAgDQo+ID4gICMjIEdldEZpbGVMaXN0DQo+ID4gICMNCj4gPiAgIyBHZXQgYSBsaXN0 IGZvciBhbGwgZmlsZXMNCj4gPiAgIw0KPiA+IEBAIC01NzIsMTcgKzU3MiwzNCBAQCBkZWYgR2V0 U3RyaW5nRmlsZXMoVW5pRmlsTGlzdCwgU291cmNlRmlsZUxpc3QsIA0KPiA+IEluY2x1ZGVMaXN0 LCBJbmNsdWRlUGF0aExpc3QsIFNraQ0KPiA+ICANCj4gPiAgIw0KPiA+ICAjIFdyaXRlIGFuIGl0 ZW0NCj4gPiAgIw0KPiA+ICBkZWYgV3JpdGUoVGFyZ2V0LCBJdGVtKToNCj4gPiAtICAgIHJldHVy biAnJy5qb2luKFtUYXJnZXQsIEl0ZW1dKQ0KPiA+ICsgICAgaWYgaXNpbnN0YW5jZShUYXJnZXQs c3RyKToNCj4gPiArICAgICAgICBUYXJnZXQgPSBbVGFyZ2V0XQ0KPiA+ICsgICAgaWYgbm90IFRh cmdldDoNCj4gPiArICAgICAgICBUYXJnZXQgPSBbXQ0KPiA+ICsgICAgaWYgaXNpbnN0YW5jZShJ dGVtLGxpc3QpOg0KPiA+ICsgICAgICAgIFRhcmdldC5leHRlbmQoSXRlbSkNCj4gPiArICAgIGVs c2U6DQo+ID4gKyAgICAgICAgVGFyZ2V0LmFwcGVuZChJdGVtKQ0KPiA+ICsgICAgcmV0dXJuIFRh cmdldA0KPiA+ICANCj4gPiAgIw0KPiA+ICAjIFdyaXRlIGFuIGl0ZW0gd2l0aCBhIGJyZWFrIGxp bmUNCj4gPiAgIw0KPiA+ICBkZWYgV3JpdGVMaW5lKFRhcmdldCwgSXRlbSk6DQo+ID4gLSAgICBy ZXR1cm4gJycuam9pbihbVGFyZ2V0LCBJdGVtLCAnXG4nXSkNCj4gPiArICAgIGlmIGlzaW5zdGFu Y2UoVGFyZ2V0LHN0cik6DQo+ID4gKyAgICAgICAgVGFyZ2V0ID0gW1RhcmdldF0NCj4gPiArICAg IGlmIG5vdCBUYXJnZXQ6DQo+ID4gKyAgICAgICAgVGFyZ2V0ID0gW10NCj4gPiArICAgIGlmIGlz aW5zdGFuY2UoSXRlbSwgbGlzdCk6DQo+ID4gKyAgICAgICAgVGFyZ2V0LmV4dGVuZChJdGVtKQ0K PiA+ICsgICAgZWxzZToNCj4gPiArICAgICAgICBUYXJnZXQuYXBwZW5kKEl0ZW0pDQo+ID4gKyAg ICBUYXJnZXQuYXBwZW5kKCdcbicpDQo+ID4gKyAgICByZXR1cm4gVGFyZ2V0DQo+ID4gIA0KPiA+ ICAjIFRoaXMgYWN0cyBsaWtlIHRoZSBtYWluKCkgZnVuY3Rpb24gZm9yIHRoZSBzY3JpcHQsIHVu bGVzcyBpdCBpcyANCj4gPiAnaW1wb3J0J2VkIGludG8gYW5vdGhlciAgIyBzY3JpcHQuDQo+ID4g IGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6DQo+ID4gICAgICBFZGtMb2dnZXIuaW5mbygnc3Rh cnQnKQ0KPiA+IGRpZmYgLS1naXQgYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Db21tb24vTWlz Yy5weQ0KPiA+IGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQ29tbW9uL01pc2MucHkNCj4gPiBp bmRleCA4MDIzNmRiMTYwLi44ZGNiZTE0MWFlIDEwMDY0NA0KPiA+IC0tLSBhL0Jhc2VUb29scy9T b3VyY2UvUHl0aG9uL0NvbW1vbi9NaXNjLnB5DQo+ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9Q eXRob24vQ29tbW9uL01pc2MucHkNCj4gPiBAQCAtNzc3LDIxICs3NzcsMjEgQEAgY2xhc3MgVGVt cGxhdGVTdHJpbmcob2JqZWN0KToNCj4gPiAgDQo+ID4gICAgICAgICAgICAgIHJldHVybiAiIi5q b2luKFN0cmluZ0xpc3QpDQo+ID4gIA0KPiA+ICAgICAgIyMgQ29uc3RydWN0b3INCj4gPiAgICAg IGRlZiBfX2luaXRfXyhzZWxmLCBUZW1wbGF0ZT1Ob25lKToNCj4gPiAtICAgICAgICBzZWxmLlN0 cmluZyA9ICcnDQo+ID4gKyAgICAgICAgc2VsZi5TdHJpbmcgPSBbXQ0KPiA+ICAgICAgICAgIHNl bGYuSXNCaW5hcnkgPSBGYWxzZQ0KPiA+ICAgICAgICAgIHNlbGYuX1RlbXBsYXRlID0gVGVtcGxh dGUNCj4gPiAgICAgICAgICBzZWxmLl9UZW1wbGF0ZVNlY3Rpb25MaXN0ID0gc2VsZi5fUGFyc2Uo VGVtcGxhdGUpDQo+ID4gIA0KPiA+ICAgICAgIyMgc3RyKCkgb3BlcmF0b3INCj4gPiAgICAgICMN Cj4gPiAgICAgICMgICBAcmV0dmFsICAgICBzdHJpbmcgIFRoZSBzdHJpbmcgcmVwbGFjZWQNCj4g PiAgICAgICMNCj4gPiAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOg0KPiA+IC0gICAgICAgIHJldHVy biBzZWxmLlN0cmluZw0KPiA+ICsgICAgICAgIHJldHVybiAiIi5qb2luKHNlbGYuU3RyaW5nKQ0K PiA+ICANCj4gPiAgICAgICMjIFNwbGl0IHRoZSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBmcmFnbWVu dHMgcGVyIHRoZSAke0JFR0lOfSBhbmQgJHtFTkR9IGZsYWdzDQo+ID4gICAgICAjDQo+ID4gICAg ICAjICAgQHJldHZhbCAgICAgbGlzdCAgICBBIGxpc3Qgb2YgVGVtcGxhdGVTdHJpbmcuU2VjdGlv biBvYmplY3RzDQo+ID4gICAgICAjDQo+ID4gQEAgLTgzNSwxMyArODM1LDE2IEBAIGNsYXNzIFRl bXBsYXRlU3RyaW5nKG9iamVjdCk6DQo+ID4gICAgICAjICAgQHBhcmFtICAgICAgRGljdGlvbmFy eSAgICAgIFRoZSBwbGFjZWhvbGRlciBkaWN0aW9uYXJpZXMNCj4gPiAgICAgICMNCj4gPiAgICAg IGRlZiBBcHBlbmQoc2VsZiwgQXBwZW5kU3RyaW5nLCBEaWN0aW9uYXJ5PU5vbmUpOg0KPiA+ICAg ICAgICAgIGlmIERpY3Rpb25hcnk6DQo+ID4gICAgICAgICAgICAgIFNlY3Rpb25MaXN0ID0gc2Vs Zi5fUGFyc2UoQXBwZW5kU3RyaW5nKQ0KPiA+IC0gICAgICAgICAgICBzZWxmLlN0cmluZyArPSAi Ii5qb2luKFMuSW5zdGFudGlhdGUoRGljdGlvbmFyeSkgZm9yIFMgaW4gU2VjdGlvbkxpc3QpDQo+ ID4gKyAgICAgICAgICAgIHNlbGYuU3RyaW5nLmFwcGVuZCggIiIuam9pbihTLkluc3RhbnRpYXRl KERpY3Rpb25hcnkpIA0KPiA+ICsgZm9yIFMgaW4gU2VjdGlvbkxpc3QpKQ0KPiA+ICAgICAgICAg IGVsc2U6DQo+ID4gLSAgICAgICAgICAgIHNlbGYuU3RyaW5nICs9IEFwcGVuZFN0cmluZw0KPiA+ ICsgICAgICAgICAgICBpZiBpc2luc3RhbmNlKEFwcGVuZFN0cmluZyxsaXN0KToNCj4gPiArICAg ICAgICAgICAgICAgIHNlbGYuU3RyaW5nLmV4dGVuZChBcHBlbmRTdHJpbmcpDQo+ID4gKyAgICAg ICAgICAgIGVsc2U6DQo+ID4gKyAgICAgICAgICAgICAgICBzZWxmLlN0cmluZy5hcHBlbmQoQXBw ZW5kU3RyaW5nKQ0KPiA+ICANCj4gPiAgICAgICMjIFJlcGxhY2UgdGhlIHN0cmluZyB0ZW1wbGF0 ZSB3aXRoIGRpY3Rpb25hcnkgb2YgcGxhY2Vob2xkZXJzDQo+ID4gICAgICAjDQo+ID4gICAgICAj ICAgQHBhcmFtICAgICAgRGljdGlvbmFyeSAgICAgIFRoZSBwbGFjZWhvbGRlciBkaWN0aW9uYXJp ZXMNCj4gPiAgICAgICMNCj4gPiBAQCAtMTc0MSwyNyArMTc0NCwyMSBAQCBjbGFzcyBQYXRoQ2xh c3Mob2JqZWN0KToNCj4gPiAgICAgICMNCj4gPiAgICAgICMgQHJldHZhbCBGYWxzZSBUaGUgdHdv IFBhdGhDbGFzcyBhcmUgZGlmZmVyZW50DQo+ID4gICAgICAjIEByZXR2YWwgVHJ1ZSAgVGhlIHR3 byBQYXRoQ2xhc3MgYXJlIHRoZSBzYW1lDQo+ID4gICAgICAjDQo+ID4gICAgICBkZWYgX19lcV9f KHNlbGYsIE90aGVyKToNCj4gPiAtICAgICAgICBpZiBpc2luc3RhbmNlKE90aGVyLCB0eXBlKHNl bGYpKToNCj4gPiAtICAgICAgICAgICAgcmV0dXJuIHNlbGYuUGF0aCA9PSBPdGhlci5QYXRoDQo+ ID4gLSAgICAgICAgZWxzZToNCj4gPiAtICAgICAgICAgICAgcmV0dXJuIHNlbGYuUGF0aCA9PSBz dHIoT3RoZXIpDQo+ID4gKyAgICAgICAgcmV0dXJuIHNlbGYuUGF0aCA9PSBzdHIoT3RoZXIpDQo+ ID4gIA0KPiA+ICAgICAgIyMgT3ZlcnJpZGUgX19jbXBfXyBmdW5jdGlvbg0KPiA+ICAgICAgIw0K PiA+ICAgICAgIyBDdXN0b21pemUgdGhlIGNvbXBhcnNpb24gb3BlcmF0aW9uIG9mIHR3byBQYXRo Q2xhc3MNCj4gPiAgICAgICMNCj4gPiAgICAgICMgQHJldHZhbCAwICAgICBUaGUgdHdvIFBhdGhD bGFzcyBhcmUgZGlmZmVyZW50DQo+ID4gICAgICAjIEByZXR2YWwgLTEgICAgVGhlIGZpcnN0IFBh dGhDbGFzcyBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZCBQYXRoQ2xhc3MNCj4gPiAgICAgICMgQHJl dHZhbCAxICAgICBUaGUgZmlyc3QgUGF0aENsYXNzIGlzIEJpZ2dlciB0aGFuIHRoZSBzZWNvbmQg UGF0aENsYXNzDQo+ID4gICAgICBkZWYgX19jbXBfXyhzZWxmLCBPdGhlcik6DQo+ID4gLSAgICAg ICAgaWYgaXNpbnN0YW5jZShPdGhlciwgdHlwZShzZWxmKSk6DQo+ID4gLSAgICAgICAgICAgIE90 aGVyS2V5ID0gT3RoZXIuUGF0aA0KPiA+IC0gICAgICAgIGVsc2U6DQo+ID4gLSAgICAgICAgICAg IE90aGVyS2V5ID0gc3RyKE90aGVyKQ0KPiA+ICsgICAgICAgIE90aGVyS2V5ID0gc3RyKE90aGVy KQ0KPiA+ICANCj4gPiAgICAgICAgICBTZWxmS2V5ID0gc2VsZi5QYXRoDQo+ID4gICAgICAgICAg aWYgU2VsZktleSA9PSBPdGhlcktleToNCj4gPiAgICAgICAgICAgICAgcmV0dXJuIDANCj4gPiAg ICAgICAgICBlbGlmIFNlbGZLZXkgPiBPdGhlcktleToNCj4gPiBkaWZmIC0tZ2l0IGEvQmFzZVRv b2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weQ0KPiA+IGIvQmFzZVRv b2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weQ0KPiA+IGluZGV4IDQ0 ZDQ0ZDI0ZWIuLmQ2MTVjY2NkZjcgMTAwNjQ0DQo+ID4gLS0tIGEvQmFzZVRvb2xzL1NvdXJjZS9Q eXRob24vV29ya3NwYWNlL0luZkJ1aWxkRGF0YS5weQ0KPiA+ICsrKyBiL0Jhc2VUb29scy9Tb3Vy Y2UvUHl0aG9uL1dvcmtzcGFjZS9JbmZCdWlsZERhdGEucHkNCj4gPiBAQCAtNjEyLDExICs2MTIs MTMgQEAgY2xhc3MgSW5mQnVpbGREYXRhKE1vZHVsZUJ1aWxkQ2xhc3NPYmplY3QpOg0KPiA+ICAg ICAgICAgIGZvciBSZWNvcmQgaW4gUmVjb3JkTGlzdDoNCj4gPiAgICAgICAgICAgICAgTGliID0g UmVjb3JkWzBdDQo+ID4gICAgICAgICAgICAgIEluc3RhbmNlID0gUmVjb3JkWzFdDQo+ID4gICAg ICAgICAgICAgIGlmIEluc3RhbmNlOg0KPiA+ICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgPSBO b3JtUGF0aChJbnN0YW5jZSwgc2VsZi5fTWFjcm9zKQ0KPiA+IC0gICAgICAgICAgICBSZXRWYWxb TGliXSA9IEluc3RhbmNlDQo+ID4gKyAgICAgICAgICAgICAgICBSZXRWYWxbTGliXSA9IEluc3Rh bmNlDQo+ID4gKyAgICAgICAgICAgIGVsc2U6DQo+ID4gKyAgICAgICAgICAgICAgICBSZXRWYWxb TGliXSA9IE5vbmUNCj4gPiAgICAgICAgICByZXR1cm4gUmV0VmFsDQo+ID4gIA0KPiA+ICAgICAg IyMgUmV0cmlldmUgbGlicmFyeSBuYW1lcyAoZm9yIEVkay54IHN0eWxlIG9mIG1vZHVsZXMpDQo+ ID4gICAgICBAY2FjaGVkX3Byb3BlcnR5DQo+ID4gICAgICBkZWYgTGlicmFyaWVzKHNlbGYpOg0K PiA+IGRpZmYgLS1naXQgYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvV29ya3Nw YWNlQ29tbW9uLnB5DQo+ID4gYi9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvV29y a3NwYWNlQ29tbW9uLnB5DQo+ID4gaW5kZXggOGQ4YTNlMjc4OS4uNTVkMDFmYTRiMiAxMDA2NDQN Cj4gPiAtLS0gYS9CYXNlVG9vbHMvU291cmNlL1B5dGhvbi9Xb3Jrc3BhY2UvV29ya3NwYWNlQ29t bW9uLnB5DQo+ID4gKysrIGIvQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vV29ya3NwYWNlL1dvcmtz cGFjZUNvbW1vbi5weQ0KPiA+IEBAIC0xMjYsMTcgKzEyNiwxNCBAQCBkZWYgR2V0TW9kdWxlTGli SW5zdGFuY2VzKE1vZHVsZSwgUGxhdGZvcm0sIEJ1aWxkRGF0YWJhc2UsIEFyY2gsIFRhcmdldCwg VG9vbGNoYQ0KPiA+ICAgICAgd2hpbGUgbGVuKExpYnJhcnlDb25zdW1lckxpc3QpID4gMDoNCj4g PiAgICAgICAgICBNID0gTGlicmFyeUNvbnN1bWVyTGlzdC5wb3AoKQ0KPiA+ICAgICAgICAgIGZv ciBMaWJyYXJ5Q2xhc3NOYW1lIGluIE0uTGlicmFyeUNsYXNzZXM6DQo+ID4gICAgICAgICAgICAg IGlmIExpYnJhcnlDbGFzc05hbWUgbm90IGluIExpYnJhcnlJbnN0YW5jZToNCj4gPiAgICAgICAg ICAgICAgICAgICMgb3ZlcnJpZGUgbGlicmFyeSBpbnN0YW5jZSBmb3IgdGhpcyBtb2R1bGUNCj4g PiAtICAgICAgICAgICAgICAgIGlmIExpYnJhcnlDbGFzc05hbWUgaW4gUGxhdGZvcm0uTW9kdWxl c1tzdHIoTW9kdWxlKV0uTGlicmFyeUNsYXNzZXM6DQo+ID4gLSAgICAgICAgICAgICAgICAgICAg TGlicmFyeVBhdGggPSBQbGF0Zm9ybS5Nb2R1bGVzW3N0cihNb2R1bGUpXS5MaWJyYXJ5Q2xhc3Nl c1tMaWJyYXJ5Q2xhc3NOYW1lXQ0KPiA+IC0gICAgICAgICAgICAgICAgZWxzZToNCj4gPiAtICAg ICAgICAgICAgICAgICAgICBMaWJyYXJ5UGF0aCA9IFBsYXRmb3JtLkxpYnJhcnlDbGFzc2VzW0xp YnJhcnlDbGFzc05hbWUsIE1vZHVsZVR5cGVdDQo+ID4gLSAgICAgICAgICAgICAgICBpZiBMaWJy YXJ5UGF0aCBpcyBOb25lIG9yIExpYnJhcnlQYXRoID09ICIiOg0KPiA+IC0gICAgICAgICAgICAg ICAgICAgIExpYnJhcnlQYXRoID0gTS5MaWJyYXJ5Q2xhc3Nlc1tMaWJyYXJ5Q2xhc3NOYW1lXQ0K PiA+IC0gICAgICAgICAgICAgICAgICAgIGlmIExpYnJhcnlQYXRoIGlzIE5vbmUgb3IgTGlicmFy eVBhdGggPT0gIiI6DQo+ID4gKyAgICAgICAgICAgICAgICBMaWJyYXJ5UGF0aCA9IFBsYXRmb3Jt Lk1vZHVsZXNbc3RyKE1vZHVsZSldLkxpYnJhcnlDbGFzc2VzLmdldChMaWJyYXJ5Q2xhc3NOYW1l LFBsYXRmb3JtLkxpYnJhcnlDbGFzc2VzW0xpYnJhcnlDbGFzc05hbWUsIE1vZHVsZVR5cGVdKQ0K PiA+ICsgICAgICAgICAgICAgICAgaWYgTGlicmFyeVBhdGggaXMgTm9uZToNCj4gPiArICAgICAg ICAgICAgICAgICAgICBMaWJyYXJ5UGF0aCA9IE0uTGlicmFyeUNsYXNzZXMuZ2V0KExpYnJhcnlD bGFzc05hbWUpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgaWYgTGlicmFyeVBhdGggaXMgTm9u ZToNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgRmlsZU5hbWU6DQo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBFZGtMb2dnZXIuZXJyb3IoImJ1aWxkIiwgUkVTT1VSQ0Vf Tk9UX0FWQUlMQUJMRSwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAiSW5zdGFuY2Ugb2YgbGlicmFyeSBjbGFzcyBbJXNdIGlzIG5vdCBmb3VuZCIgJSBM aWJyYXJ5Q2xhc3NOYW1lLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEZpbGU9RmlsZU5hbWUsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgRXh0cmFEYXRhPSJpbiBbJXNdIA0KPiA+IFslc11cblx0Y29uc3Vt ZWQgYnkgbW9kdWxlIFslc10iICUgKHN0cihNKSwgQXJjaCwgc3RyKE1vZHVsZSkpKQ0KPiA+IC0t DQo+ID4gMi4xOS4xLndpbmRvd3MuMQ0KPiA+IA0KPiA+IF9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fDQo+ID4gZWRrMi1kZXZlbCBtYWlsaW5nIGxpc3QNCj4g PiBlZGsyLWRldmVsQGxpc3RzLjAxLm9yZw0KPiA+IGh0dHBzOi8vbGlzdHMuMDEub3JnL21haWxt YW4vbGlzdGluZm8vZWRrMi1kZXZlbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18NCmVkazItZGV2ZWwgbWFpbGluZyBsaXN0DQplZGsyLWRldmVsQGxpc3Rz LjAxLm9yZw0KaHR0cHM6Ly9saXN0cy4wMS5vcmcvbWFpbG1hbi9saXN0aW5mby9lZGsyLWRldmVs DQo=