From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46738) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dwpug-0001dT-LQ for qemu-devel@nongnu.org; Tue, 26 Sep 2017 09:28:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dwpuc-0001nf-HT for qemu-devel@nongnu.org; Tue, 26 Sep 2017 09:28:38 -0400 Received: from mga06.intel.com ([134.134.136.31]:62778) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dwpub-0001ms-W1 for qemu-devel@nongnu.org; Tue, 26 Sep 2017 09:28:34 -0400 From: "Valluri, Amarnath" Date: Tue, 26 Sep 2017 13:28:28 +0000 Message-ID: <1506432594.5843.107.camel@intel.com> References: <1506083624-20621-1-git-send-email-amarnath.valluri@intel.com> <1506083624-20621-9-git-send-email-amarnath.valluri@intel.com> <1506427596.5843.104.camel@intel.com> In-Reply-To: Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-ID: <09372A59DE5A4546A5DF187E9058DF03@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "marcandre.lureau@gmail.com" Cc: "stefanb@linux.vnet.ibm.com" , "dgilbert@redhat.com" , "qemu-devel@nongnu.org" , "armbru@redhat.com" , "eblake@redhat.com" T24gVHVlLCAyMDE3LTA5LTI2IGF0IDE0OjI0ICswMjAwLCBNYXJjLUFuZHLDqSBMdXJlYXUgd3Jv dGU6DQo+IEhpDQo+IA0KPiBPbiBUdWUsIFNlcCAyNiwgMjAxNyBhdCAyOjA1IFBNLCBWYWxsdXJp LCBBbWFybmF0aA0KPiA8YW1hcm5hdGgudmFsbHVyaUBpbnRlbC5jb20+IHdyb3RlOg0KPiA+IA0K PiA+IEhpIE1hcmMsDQo+ID4gDQo+ID4gVGhhbmtzIGZvciB5b3VyIHRpbWUgcmV2aWV3aW5nIHRo aXMgcGF0Y2hzZXQuIFBsZWFzZSBmaW5kIG15IGlubGluZQ0KPiA+IGNvbW1lbnRzLg0KPiA+IA0K PiA+IE9uIFN1biwgMjAxNy0wOS0yNCBhdCAyMDo1MiArMDIwMCwgTWFyYy1BbmRyw6kgTHVyZWF1 IHdyb3RlOg0KPiA+ID4gDQo+ID4gPiBIaQ0KPiA+ID4gDQo+ID4gPiBUaGFua3MgZm9yIHRoZSBu aWNlIHVwZGF0ZSwgcmVtb3ZpbmcgdGhlIGV4ZWMoKSBjb2RlLCB1c2luZw0KPiA+ID4gY2hhcmRl dg0KPiA+ID4gYW5kIGEgcHJpdmF0ZSBzb2NrZXRwYWlyLiBTb21lIGNvbW1lbnRzIGJlbG93Og0K PiA+ID4gDQo+ID4gPiBPbiBGcmksIFNlcCAyMiwgMjAxNyBhdCAyOjMzIFBNLCBBbWFybmF0aCBW YWxsdXJpDQo+ID4gPiA8YW1hcm5hdGgudmFsbHVyaUBpbnRlbC5jb20+IHdyb3RlOg0KPiA+ID4g PiANCj4gPiA+ID4gDQo+ID4gPiA+IFRoaXMgY2hhbmdlIGludHJvZHVjZXMgYSBuZXcgVFBNIGJh Y2tlbmQgZHJpdmVyIHRoYXQgY2FuDQo+ID4gPiA+IGNvbW11bmljYXRlIHdpdGgNCj4gPiA+ID4g c3d0cG0oc29mdHdhcmUgVFBNIGVtdWxhdG9yKSB1c2luZyB1bml4IGRvbWFpbiBzb2NrZXQNCj4g PiA+ID4gaW50ZXJmYWNlLg0KPiA+ID4gPiBRRU1VIHRhbGtzIHRvDQo+ID4gPiA+IFRQTSBlbXVs YXRvciB1c2luZyBzb2NrZXQgYmFzZWQgY2hhcmRldiBiYWNrZW5kIGRldmljZS4NCj4gPiA+ID4g DQo+ID4gPiA+IFN3dHBtIHVzZXMgdHdvIFVuaXggc29ja2V0cyBmb3IgY29tbXVuaWNhdGlvbnMs IG9uZSBmb3IgcGxhaW4NCj4gPiA+ID4gVFBNDQo+ID4gPiA+IGNvbW1hbmRzIGFuZA0KPiA+ID4g PiByZXNwb25zZXMsIGFuZCBvbmUgZm9yIG91dC1vZi1iYW5kIGNvbnRyb2wgbWVzc2FnZXMuIFFF TVUNCj4gPiA+ID4gcGFzc2VzDQo+ID4gPiA+IGRhdGEgc29ja2V0DQo+ID4gPiA+IGJlZW4gdXNl ZCBvdmVyIHRoZSBjb250cm9sIGNoYW5uZWwuDQo+ID4gPiA+IA0KPiA+ID4gPiBUaGUgc3d0cG0g YW5kIGFzc29jaWF0ZWQgdG9vbHMgY2FuIGJlIGZvdW5kIGhlcmU6DQo+ID4gPiA+IMKgwqDCoMKg aHR0cHM6Ly9naXRodWIuY29tL3N0ZWZhbmJlcmdlci9zd3RwbQ0KPiA+ID4gPiANCj4gPiA+ID4g VGhlIHN3dHBtJ3MgY29udHJvbCBjaGFubmVsIHByb3RvY29sIHNwZWNpZmljYXRpb24gY2FuIGJl IGZvdW5kDQo+ID4gPiA+IGhlcmU6DQo+ID4gPiA+IMKgwqDCoMKgaHR0cHM6Ly9naXRodWIuY29t L3N0ZWZhbmJlcmdlci9zd3RwbS93aWtpL0NvbnRyb2wtQ2hhbm5lbC0NCj4gPiA+ID4gU3BlYw0K PiA+ID4gPiBpZmljYXRpb24NCj4gPiA+ID4gDQo+ID4gPiA+IFVzYWdlOg0KPiA+ID4gPiDCoMKg wqDCoCMgc2V0dXAgVFBNIHN0YXRlIGRpcmVjdG9yeQ0KPiA+ID4gPiDCoMKgwqDCoG1rZGlyIC90 bXAvbXl0cG0NCj4gPiA+ID4gwqDCoMKgwqBjaG93biAtUiB0c3M6cm9vdCAvdG1wL215dHBtDQo+ ID4gPiA+IMKgwqDCoMKgL3Vzci9iaW4vc3d0cG1fc2V0dXAgLS10cG0tc3RhdGUgL3RtcC9teXRw bSAtLWNyZWF0ZWVrDQo+ID4gPiA+IA0KPiA+ID4gPiDCoMKgwqDCoCMgQXNrIHFlbXUgdG8gdXNl IFRQTSBlbXVsYXRvciB3aXRoIGdpdmVuIHRwbSBzdGF0ZQ0KPiA+ID4gPiBkaXJlY3RvcnkNCj4g PiA+ID4gwqDCoMKgwqBxZW11LXN5c3RlbS14ODZfNjQgXA0KPiA+ID4gPiDCoMKgwqDCoMKgwqDC oMKgWy4uLl0gXA0KPiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKgLWNoYXJkZXYgc29ja2V0LGlkPWNo cnRwbSxwYXRoPS90bXAvc3d0cG0tc29jayBcDQo+ID4gPiA+IMKgwqDCoMKgwqDCoMKgwqAtdHBt ZGV2IGVtdWxhdG9yLGlkPXRwbTAsY2hhcmRldj1jaHJ0cG0gXA0KPiA+ID4gPiDCoMKgwqDCoMKg wqDCoMKgLWRldmljZSB0cG0tdGlzLHRwbWRldj10cG0wIFwNCj4gPiA+ID4gwqDCoMKgwqDCoMKg wqDCoFsuLi5dDQo+ID4gPiA+IA0KPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBBbWFybmF0aCBWYWxs dXJpIDxhbWFybmF0aC52YWxsdXJpQGludGVsLmNvbT4NCj4gPiA+ID4gLS0tDQo+ID4gPiA+IMKg Y29uZmlndXJlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoDE1ICstDQo+ID4gPiA+IMKg aG1wLmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoDUgKw0KPiA+ID4g PiDCoGh3L3RwbS9NYWtlZmlsZS5vYmpzwqDCoHzCoMKgwqAxICsNCj4gPiA+ID4gwqBody90cG0v dHBtX2VtdWxhdG9yLmMgfCA2NDkNCj4gPiA+ID4gKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysNCj4gPiA+ID4gwqBody90cG0vdHBtX2lvY3RsLmjCoMKg wqDCoHwgMjQ2ICsrKysrKysrKysrKysrKysrKysNCj4gPiA+ID4gwqBxYXBpL3RwbS5qc29uwqDC oMKgwqDCoMKgwqDCoMKgfMKgwqAyMSArLQ0KPiA+ID4gPiDCoHFlbXUtb3B0aW9ucy5oeMKgwqDC oMKgwqDCoMKgfMKgwqAyMiArLQ0KPiA+ID4gPiDCoDcgZmlsZXMgY2hhbmdlZCwgOTUwIGluc2Vy dGlvbnMoKyksIDkgZGVsZXRpb25zKC0pDQo+ID4gPiA+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGh3 L3RwbS90cG1fZW11bGF0b3IuYw0KPiA+ID4gPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBody90cG0v dHBtX2lvY3RsLmgNCj4gPiA+ID4gDQo+ID4gPiA+IGRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9j b25maWd1cmUNCj4gPiA+ID4gaW5kZXggY2IwZjdlZC4uY2UyZGYyZCAxMDA3NTUNCj4gPiA+ID4g LS0tIGEvY29uZmlndXJlDQo+ID4gPiA+ICsrKyBiL2NvbmZpZ3VyZQ0KPiA+ID4gPiBAQCAtMzQ2 MSwxMCArMzQ2MSwxNSBAQCBmaQ0KPiA+ID4gPiDCoCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIw0KPiA+ID4gPiDCoCMgVFBNIHBhc3N0aHJvdWdoIGlzIG9ubHkgb24g eDg2IExpbnV4DQo+ID4gPiA+IA0KPiA+ID4gPiAtaWYgdGVzdCAiJHRhcmdldG9zIiA9IExpbnV4 ICYmIHRlc3QgIiRjcHUiID0gaTM4NiAtbyAiJGNwdSIgPQ0KPiA+ID4gPiB4ODZfNjQ7IHRoZW4N Cj4gPiA+ID4gLcKgwqB0cG1fcGFzc3Rocm91Z2g9JHRwbQ0KPiA+ID4gPiAraWYgdGVzdCAiJHRh cmdldG9zIiA9IExpbnV4OyB0aGVuDQo+ID4gPiA+ICvCoMKgdHBtX2VtdWxhdG9yPSR0cG0NCj4g PiA+ID4gK8KgwqBpZiB0ZXN0ICIkY3B1IiA9IGkzODYgLW8gIiRjcHUiID0geDg2XzY0OyB0aGVu DQo+ID4gPiA+ICvCoMKgwqDCoHRwbV9wYXNzdGhyb3VnaD0kdHBtDQo+ID4gPiA+ICvCoMKgZWxz ZQ0KPiA+ID4gPiArwqDCoMKgwqB0cG1fcGFzc3Rocm91Z2g9bm8NCj4gPiA+ID4gK8KgwqBmaQ0K PiA+ID4gPiDCoGVsc2UNCj4gPiA+ID4gLcKgwqB0cG1fcGFzc3Rocm91Z2g9bm8NCj4gPiA+ID4g K8KgwqB0cG1fZW11bGF0b3I9bm8NCj4gPiA+ID4gwqBmaQ0KPiA+ID4gPiANCj4gPiA+ID4gwqAj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCj4gPiA+ID4gQEAgLTUz NTksNiArNTM2NCw3IEBAIGVjaG8gImdjb3YgZW5hYmxlZMKgwqDCoMKgwqDCoCRnY292Ig0KPiA+ ID4gPiDCoGVjaG8gIlRQTSBzdXBwb3J0wqDCoMKgwqDCoMKgwqAkdHBtIg0KPiA+ID4gPiDCoGVj aG8gImxpYnNzaDIgc3VwcG9ydMKgwqDCoCRsaWJzc2gyIg0KPiA+ID4gPiDCoGVjaG8gIlRQTSBw YXNzdGhyb3VnaMKgwqDCoCR0cG1fcGFzc3Rocm91Z2giDQo+ID4gPiA+ICtlY2hvICJUUE0gZW11 bGF0b3LCoMKgwqDCoMKgwqAkdHBtX2VtdWxhdG9yIg0KPiA+ID4gPiDCoGVjaG8gIlFPTSBkZWJ1 Z2dpbmfCoMKgwqDCoMKgJHFvbV9jYXN0X2RlYnVnIg0KPiA+ID4gPiDCoGVjaG8gIkxpdmUgYmxv Y2sgbWlncmF0aW9uICRsaXZlX2Jsb2NrX21pZ3JhdGlvbiINCj4gPiA+ID4gwqBlY2hvICJsem8g c3VwcG9ydMKgwqDCoMKgwqDCoMKgJGx6byINCj4gPiA+ID4gQEAgLTU5NDMsNiArNTk0OSw5IEBA IGlmIHRlc3QgIiR0cG0iID0gInllcyI7IHRoZW4NCj4gPiA+ID4gwqDCoMKgaWYgdGVzdCAiJHRw bV9wYXNzdGhyb3VnaCIgPSAieWVzIjsgdGhlbg0KPiA+ID4gPiDCoMKgwqDCoMKgZWNobyAiQ09O RklHX1RQTV9QQVNTVEhST1VHSD15IiA+PiAkY29uZmlnX2hvc3RfbWFrDQo+ID4gPiA+IMKgwqDC oGZpDQo+ID4gPiA+ICvCoMKgaWYgdGVzdCAiJHRwbV9lbXVsYXRvciIgPSAieWVzIjsgdGhlbg0K PiA+ID4gPiArwqDCoMKgwqBlY2hvICJDT05GSUdfVFBNX0VNVUxBVE9SPXkiID4+ICRjb25maWdf aG9zdF9tYWsNCj4gPiA+IEl0IHNob3VsZG4ndCByZXF1aXJlIExpbnV4LCBidXQgcG9zaXggKGFu ZCBJIGFzc3VtZSBhIHBvcnQgdG8NCj4gPiA+IG90aGVyDQo+ID4gPiBzeXN0ZW1zIGlzbid0IGlt cG9zc2libGUpLiBzYW1lIGZvciBidWlsZC1zeXMgLyBoZWxwIC8gY29tbWVudHMuDQo+ID4gSSBh Z3JlZSwgQ2FuIHlvdSBzdWdnZXN0LCB3aGF0IGlzIHRoZSBRZW11IHdheSBvZiBsaW1pdGluZyB0 aGlzIHRvDQo+ID4gJ3Bvc2l4Jy4NCj4gPiA+IA0KPiA+ID4gDQo+IHRoZXJlIGlzIENPTkZJR19Q T1NJWA0KT2ssIHRoYW5rcy4gSSB3aWxsIGNoZWNrDQo+IA0KPiA+IA0KPiA+ID4gDQo+ID4gPiA+ IA0KPiA+ID4gPiANCj4gPiA+ID4gK8KgwqBmaQ0KPiA+ID4gPiDCoGZpDQo+ID4gPiA+IA0KPiA+ ID4gPiDCoGVjaG8gIlRSQUNFX0JBQ0tFTkRTPSR0cmFjZV9iYWNrZW5kcyIgPj4gJGNvbmZpZ19o b3N0X21haw0KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvaG1wLmMgYi9obXAuYw0KPiA+ID4gPiBpbmRl eCBjZjYyYjJlLi43ZTY5ZWNhIDEwMDY0NA0KPiA+ID4gPiAtLS0gYS9obXAuYw0KPiA+ID4gPiAr KysgYi9obXAuYw0KPiA+ID4gPiBAQCAtOTk1LDYgKzk5NSw3IEBAIHZvaWQgaG1wX2luZm9fdHBt KE1vbml0b3IgKm1vbiwgY29uc3QgUURpY3QNCj4gPiA+ID4gKnFkaWN0KQ0KPiA+ID4gPiDCoMKg wqDCoMKgRXJyb3IgKmVyciA9IE5VTEw7DQo+ID4gPiA+IMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQg YyA9IDA7DQo+ID4gPiA+IMKgwqDCoMKgwqBUUE1QYXNzdGhyb3VnaE9wdGlvbnMgKnRwbzsNCj4g PiA+ID4gK8KgwqDCoMKgVFBNRW11bGF0b3JPcHRpb25zICp0ZW87DQo+ID4gPiA+IA0KPiA+ID4g PiDCoMKgwqDCoMKgaW5mb19saXN0ID0gcW1wX3F1ZXJ5X3RwbSgmZXJyKTsNCj4gPiA+ID4gwqDC oMKgwqDCoGlmIChlcnIpIHsNCj4gPiA+ID4gQEAgLTEwMjQsNiArMTAyNSwxMCBAQCB2b2lkIGht cF9pbmZvX3RwbShNb25pdG9yICptb24sIGNvbnN0DQo+ID4gPiA+IFFEaWN0DQo+ID4gPiA+ICpx ZGljdCkNCj4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqB0cG8tPmhhc19jYW5jZWxfcGF0aCA/ICIsY2FuY2VsLQ0KPiA+ID4gPiBw YXRoPSINCj4gPiA+ID4gOiAiIiwNCj4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0cG8tPmhhc19jYW5jZWxfcGF0aCA/IHRwby0N Cj4gPiA+ID4gPmNhbmNlbF9wYXRoDQo+ID4gPiA+IDogIiIpOw0KPiA+ID4gPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGJyZWFrOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGNhc2UgVFBN X1RZUEVfRU1VTEFUT1I6DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0ZW8gPSB0 aS0+b3B0aW9ucy0+dS5lbXVsYXRvci5kYXRhOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgbW9uaXRvcl9wcmludGYobW9uLCAiLGNoYXJkZXY9JXMiLCB0ZW8tPmNoYXJkZXYpOw0K PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnJlYWs7DQo+ID4gPiA+IMKgwqDCoMKg wqDCoMKgwqDCoGNhc2UgVFBNX1RZUEVfX01BWDoNCj4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBicmVhazsNCj4gPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgfQ0KPiA+ID4gPiBkaWZm IC0tZ2l0IGEvaHcvdHBtL01ha2VmaWxlLm9ianMgYi9ody90cG0vTWFrZWZpbGUub2Jqcw0KPiA+ ID4gPiBpbmRleCA2NGNlY2MzLi40MWYwYjdhIDEwMDY0NA0KPiA+ID4gPiAtLS0gYS9ody90cG0v TWFrZWZpbGUub2Jqcw0KPiA+ID4gPiArKysgYi9ody90cG0vTWFrZWZpbGUub2Jqcw0KPiA+ID4g PiBAQCAtMSwyICsxLDMgQEANCj4gPiA+ID4gwqBjb21tb24tb2JqLSQoQ09ORklHX1RQTV9USVMp ICs9IHRwbV90aXMubw0KPiA+ID4gPiDCoGNvbW1vbi1vYmotJChDT05GSUdfVFBNX1BBU1NUSFJP VUdIKSArPSB0cG1fcGFzc3Rocm91Z2gubw0KPiA+ID4gPiB0cG1fdXRpbC5vDQo+ID4gPiA+ICtj b21tb24tb2JqLSQoQ09ORklHX1RQTV9FTVVMQVRPUikgKz0gdHBtX2VtdWxhdG9yLm8gdHBtX3V0 aWwubw0KPiA+ID4gPiBkaWZmIC0tZ2l0IGEvaHcvdHBtL3RwbV9lbXVsYXRvci5jIGIvaHcvdHBt L3RwbV9lbXVsYXRvci5jDQo+ID4gPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gPiA+IGlu ZGV4IDAwMDAwMDAuLmMwMmJiZTINCj4gPiA+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ID4gPiArKysg Yi9ody90cG0vdHBtX2VtdWxhdG9yLmMNCj4gPiA+ID4gQEAgLTAsMCArMSw2NDkgQEANCj4gPiA+ ID4gKy8qDQo+ID4gPiA+ICsgKsKgwqBlbXVsYXRvciBUUE0gZHJpdmVyDQo+ID4gPiA+ICsgKg0K PiA+ID4gPiArICrCoMKgQ29weXJpZ2h0IChjKSAyMDE3IEludGVsIENvcnBvcmF0aW9uDQo+ID4g PiA+ICsgKsKgwqBBdXRob3I6IEFtYXJuYXRoIFZhbGx1cmkgPGFtYXJuYXRoLnZhbGx1cmlAaW50 ZWwuY29tPg0KPiA+ID4gPiArICoNCj4gPiA+ID4gKyAqwqDCoENvcHlyaWdodCAoYykgMjAxMCAt IDIwMTMgSUJNIENvcnBvcmF0aW9uDQo+ID4gPiA+ICsgKsKgwqBBdXRob3JzOg0KPiA+ID4gPiAr ICrCoMKgwqDCoFN0ZWZhbiBCZXJnZXIgPHN0ZWZhbmJAdXMuaWJtLmNvbT4NCj4gPiA+ID4gKyAq DQo+ID4gPiA+ICsgKsKgwqBDb3B5cmlnaHQgKEMpIDIwMTEgSUFJSywgR3JheiBVbml2ZXJzaXR5 IG9mIFRlY2hub2xvZ3kNCj4gPiA+ID4gKyAqwqDCoMKgwqBBdXRob3I6IEFuZHJlYXMgTmllZGVy bA0KPiA+ID4gPiArICoNCj4gPiA+ID4gKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdA0KPiA+ID4gPiBhbmQvb3INCj4gPiA+ID4gKyAqIG1v ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMN Cj4gPiA+ID4gKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247DQo+ID4gPiA+IGVpdGhlcg0KPiA+ID4gPiArICogdmVyc2lvbiAyIG9mIHRoZSBM aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPiA+ID4gPiB2ZXJzaW9uLg0K PiA+ID4gPiArICoNCj4gPiA+ID4gKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUNCj4gPiA+ID4gdXNlZnVsLA0KPiA+ID4gPiArICogYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkN Cj4gPiA+ID4gb2YNCj4gPiA+ID4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS7CoMKgU2VlDQo+ID4gPiA+IHRoZQ0KPiA+ID4gPiBHTlUNCj4g PiA+ID4gKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu DQo+ID4gPiA+ICsgKg0KPiA+ID4gPiArICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsDQo+ID4gPiA+IFB1YmxpYw0KPiA+ID4gPiArICog TGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z24NCj4gPiA+ID4gdS5vcg0KPiA+ID4gPiBnL2xpY2Vuc2VzLz4NCj4gPiA+ID4gKyAqDQo+ID4g PiA+ICsgKi8NCj4gPiA+ID4gKw0KPiA+ID4gPiArI2luY2x1ZGUgInFlbXUvb3NkZXAuaCINCj4g PiA+ID4gKyNpbmNsdWRlICJxZW11L2Vycm9yLXJlcG9ydC5oIg0KPiA+ID4gPiArI2luY2x1ZGUg InFlbXUvc29ja2V0cy5oIg0KPiA+ID4gPiArI2luY2x1ZGUgImlvL2NoYW5uZWwtc29ja2V0Lmgi DQo+ID4gPiA+ICsjaW5jbHVkZSAic3lzZW11L3RwbV9iYWNrZW5kLmgiDQo+ID4gPiA+ICsjaW5j bHVkZSAidHBtX2ludC5oIg0KPiA+ID4gPiArI2luY2x1ZGUgImh3L2h3LmgiDQo+ID4gPiA+ICsj aW5jbHVkZSAiaHcvaTM4Ni9wYy5oIg0KPiA+ID4gPiArI2luY2x1ZGUgInRwbV91dGlsLmgiDQo+ ID4gPiA+ICsjaW5jbHVkZSAidHBtX2lvY3RsLmgiDQo+ID4gPiA+ICsjaW5jbHVkZSAibWlncmF0 aW9uL2Jsb2NrZXIuaCINCj4gPiA+ID4gKyNpbmNsdWRlICJxYXBpL2Vycm9yLmgiDQo+ID4gPiA+ ICsjaW5jbHVkZSAiY2hhcmRldi9jaGFyLWZlLmgiDQo+ID4gPiA+ICsNCj4gPiA+ID4gKyNpbmNs dWRlIDxmY250bC5oPg0KPiA+ID4gPiArI2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KPiA+ID4gPiAr I2luY2x1ZGUgPHN5cy9zdGF0Lmg+DQo+ID4gPiA+ICsjaW5jbHVkZSA8c3RkaW8uaD4NCj4gPiA+ ID4gKw0KPiA+ID4gPiArI2RlZmluZSBERUJVR19UUE0gMA0KPiA+ID4gPiArDQo+ID4gPiA+ICsj ZGVmaW5lIERQUklOVChmbXQsIC4uLikgZG8geyBcDQo+ID4gPiA+ICvCoMKgwqDCoGlmIChERUJV R19UUE0pIHsgXA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGZwcmludGYoc3RkZXJyLCBmbXQs ICMjIF9fVkFfQVJHU19fKTsgXA0KPiA+ID4gPiArwqDCoMKgwqB9IFwNCj4gPiA+ID4gK30gd2hp bGUgKDApOw0KPiA+ID4gPiArDQo+ID4gPiA+ICsjZGVmaW5lIERQUklOVEYoZm10LCAuLi4pIERQ UklOVCgidHBtLWVtdWxhdG9yOiAiZm10IlxuIiwNCj4gPiA+ID4gX19WQV9BUkdTX18pDQo+ID4g PiBJIHdvdWxkIGRlZmluZSBhIHNpbmdsZSBEUFJJTlRGKCkgKCYgZHJvcCBEUFJJTlQgdXNhZ2Ug YmVsb3cpDQo+ID4gT2ssIHdpbGwgZG8NCj4gPiA+IA0KPiA+ID4gDQo+ID4gPiANCj4gPiA+ID4g DQo+ID4gPiA+IA0KPiA+ID4gPiArDQo+ID4gPiA+ICsjZGVmaW5lIFRZUEVfVFBNX0VNVUxBVE9S ICJ0cG0tZW11bGF0b3IiDQo+ID4gPiA+ICsjZGVmaW5lIFRQTV9FTVVMQVRPUihvYmopIFwNCj4g PiA+ID4gK8KgwqDCoMKgT0JKRUNUX0NIRUNLKFRQTUVtdWxhdG9yLCAob2JqKSwgVFlQRV9UUE1f RU1VTEFUT1IpDQo+ID4gPiA+ICsNCj4gPiA+ID4gKyNkZWZpbmUgVFBNX0VNVUxBVE9SX0lNUExF TUVOVFNfQUxMX0NBUFMoUywgY2FwKSAoKChTKS0+Y2FwcyAmDQo+ID4gPiA+IChjYXApKSA9PSAo Y2FwKSkNCj4gPiA+ID4gKw0KPiA+ID4gPiArc3RhdGljIGNvbnN0IFRQTURyaXZlck9wcyB0cG1f ZW11bGF0b3JfZHJpdmVyOw0KPiA+ID4gPiArDQo+ID4gPiA+ICsvKiBkYXRhIHN0cnVjdHVyZXMg Ki8NCj4gPiA+ID4gK3R5cGVkZWYgc3RydWN0IFRQTUVtdWxhdG9yIHsNCj4gPiA+ID4gK8KgwqDC oMKgVFBNQmFja2VuZCBwYXJlbnQ7DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgVFBNRW11 bGF0b3JPcHRpb25zICpvcHRpb25zOw0KPiA+ID4gQ29udHJhcnkgdG8gbXkgY29tbWVudCBvbiBw cmV2aW91cyBwYXRjaCwgSSByZWFsaXplIGl0IGlzDQo+ID4gPiBjb252ZW5pZW50DQo+ID4gPiB0 byBoYXZlIGEgcWFwaSBwb2ludGVyIGhlcmUsIHNvIHlvdSBjYW4gdXNlIHRoZSBmcmVlIHZpc2l0 b3INCj4gPiA+IGxhdGVyLg0KPiA+ID4gDQo+ID4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gK8Kg wqDCoMKgQ2hhckJhY2tlbmQgY3RybF9kZXY7DQo+ID4gPiBjdHJsX2NociBwZXJoYXBzPyBvciBq dXN0IGNociBvciBiZSAodGhlIG1vc3QgY29tbW9uIG5hbWUgaW4NCj4gPiA+IG90aGVyDQo+ID4g PiBkZXZpY2VzKS4NCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDC oFFJT0NoYW5uZWwgKmRhdGFfaW9jOw0KPiA+ID4gPiArwqDCoMKgwqBib29sIG9wX2V4ZWN1dGlu ZzsNCj4gPiA+ID4gK8KgwqDCoMKgYm9vbCBvcF9jYW5jZWxlZDsNCj4gPiA+IEkgdGhpbmsgdGhv c2UgMiBmaWVsZHMgY2FuIGJlIGRyb3BwZWQsIHNlZSBiZWxvdy4NCj4gPiA+IA0KPiA+ID4gPiAN Cj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoGJvb2wgaGFkX3N0YXJ0dXBfZXJyb3I7DQo+ID4g PiBJIHRoaW5rIHNvbWUgbGl0dGxlIHJlZmFjdG9yaW5nIGNvdWxkIHJlbW92ZSB0aGUgd2hvbGUN Cj4gPiA+IGhhZF9zdGFydHVwX2Vycm9yKCkgYmFja2VuZCAmIGNhbGxiYWNrIGJlZm9yZSBvciBh ZnRlciB0aGUNCj4gPiA+IHNlcmllcy4NCj4gPiA+IHRwbV9iYWNrZW5kX3N0YXJ0dXBfdHBtKCkg YWxyZWFkeSByZXR1cm5zIGFuIGVycm9yIGNvZGUuwqDCoGRldmljZQ0KPiA+ID4gb3INCj4gPiA+ IGNvbW1vbiBiYWNrZW5kIGNvZGUgY291bGQgaGFuZGxlICYgcmVtZW1iZXIgdGhhdC4NCj4gPiBZ ZXMsIGkgYWdyZWUsIHdlIGNhbiBhdm9pZCBoYWRfc3RhcnR1cF9lcnJvcigpIGZyb20gRHJpdmVy T3BzLCBpDQo+ID4gd2lsbA0KPiA+IGRvIHRoaXMuDQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gPiAN Cj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoFRQTVZlcnNpb24gdHBtX3ZlcnNpb247DQo+ID4g PiBUaGlzIGlzIHByb2JhYmx5IHdvcnRoIHRvIGNvbnNpZGVyIGluIGNvbW1vbiBjb2RlIGluc3Rl YWQsIGJ1dA0KPiA+ID4gbGV0J3MNCj4gPiA+IG5vdCB3b3JyeSBhYm91dCBpdC4NCj4gPiA+IA0K PiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoHB0bV9jYXAgY2FwczsgLyogY2Fw YWJpbGl0aWVzIG9mIHRoZSBUUE0gKi8NCj4gPiA+ID4gK8KgwqDCoMKgdWludDhfdCBjdXJfbG9j dHlfbnVtYmVyOyAvKiBsYXN0IHNldCBsb2NhbGl0eSAqLw0KPiA+ID4gPiArwqDCoMKgwqBRZW11 TXV0ZXggc3RhdGVfbG9jazsNCj4gPiA+ID4gK8KgwqDCoMKgRXJyb3IgKm1pZ3JhdGlvbl9ibG9j a2VyOw0KPiA+ID4gPiArfSBUUE1FbXVsYXRvcjsNCj4gPiA+ID4gKw0KPiA+ID4gPiArDQo+ID4g PiA+ICtzdGF0aWMgaW50IHRwbV9lbXVsYXRvcl9jdHJsY21kKENoYXJCYWNrZW5kICpkZXYsIHVu c2lnbmVkDQo+ID4gPiA+IGxvbmcNCj4gPiA+ID4gY21kLCB2b2lkICptc2csDQo+ID4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgc2l6ZV90IG1zZ19sZW5faW4sIHNpemVfdA0KPiA+ID4gPiBtc2dfbGVuX291dCkNCj4g PiA+ID4gK3sNCj4gPiA+ID4gK8KgwqDCoMKgdWludDMyX3QgY21kX25vID0gY3B1X3RvX2JlMzIo Y21kKTsNCj4gPiA+ID4gK8KgwqDCoMKgc3NpemVfdCBuID0gc2l6ZW9mKHVpbnQzMl90KSArIG1z Z19sZW5faW47DQo+ID4gPiA+ICvCoMKgwqDCoHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7DQo+ID4gPiA+ ICsNCj4gPiA+ID4gK8KgwqDCoMKgYnVmID0gKHVpbnQ4X3QgKiltYWxsb2Mobik7DQo+ID4gPiBj b3VsZCBiZSBnX2FsbG9jYSgpIGluc3RlYWQuIEFsdGVybmF0aXZlbHksIHdoeSBub3QgY2FsbCAy DQo+ID4gPiB3cml0ZSgpDQo+ID4gPiBpbnN0ZWFkPw0KPiA+ID4gDQo+ID4gPiBub25lIG9mIHRo ZSBjYXN0cyBpbiB0aGlzIGZ1bmN0aW9uIGFyZSBuZWNlc3NhcnksIHBsZWFzZSByZW1vdmUNCj4g PiA+IHRoZW0uDQo+ID4gT2ssIHdpbGwgY2hhbmdlIHRvIGFjbGxvY2EoKQ0KPiBJIGp1c3QgcmVh bGl6ZWQgdGhpcyBpcyBTT0NLX1NFUVBBQ0tFVCwgb2sNCj4gDQo+ID4gDQo+ID4gPiANCj4gPiA+ IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoG1lbWNweShidWYsICZjbWRf bm8sIHNpemVvZihjbWRfbm8pKTsNCj4gPiA+ID4gK8KgwqDCoMKgbWVtY3B5KGJ1ZiArIHNpemVv ZihjbWRfbm8pLCBtc2csIG1zZ19sZW5faW4pOw0KPiA+ID4gPiArDQo+ID4gPiA+ICvCoMKgwqDC oG4gKz0gcWVtdV9jaHJfZmVfd3JpdGVfYWxsKGRldiwgKGNvbnN0IHVpbnQ4X3QgKilidWYsIG4p Ow0KPiA+ID4gd2VpcmQNCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKg wqDCoGZyZWUoYnVmKTsNCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqBpZiAobiA+IDApIHsN Cj4gPiA+IHdpdGggdGhlIG4gKz0gYWJvdmUsIHlvdSdsbCBnZXQgaW50ZXJlc3RpbmcgYmVoYXZp b3VyIDopDQo+ID4gWWEsIGl0IHdhcyB0eXBvIDopDQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gWW91 IHByb2JhYmx5IHdhbnQgdG8gY2hlY2sgaWYgYW55IHdyaXRlIGFib3ZlIGZhaWxlZCwgYW5kIHJl dHVybg0KPiA+ID4gZWFybHkNCj4gPiA+IGZvciB0aGUgZXJyb3IgY2FzZS4NCj4gPiA+IA0KPiA+ ID4gUGxlYXNlIGltcHJvdmUgdGhlIGVycm9yIGhhbmRsaW5nIGluIHRoaXMgZnVuY3Rpb24NCj4g PiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgaWYgKG1z Z19sZW5fb3V0ID4gMCkgew0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbiA9IHFl bXVfY2hyX2ZlX3JlYWRfYWxsKGRldiwgKHVpbnQ4X3QgKiltc2csDQo+ID4gPiA+IG1zZ19sZW5f b3V0KTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIHNpbXVsYXRlIGlvY3Rs IHJldHVybiB2YWx1ZSAqLw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKG4g PiAwKSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG4gPSAwOw0K PiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQ0KPiA+ID4gPiArwqDCoMKgwqDCoMKg wqDCoH0gZWxzZSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuID0gMDsNCj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqB9DQo+ID4gPiA+ICvCoMKgwqDCoH0NCj4gPiA+ID4gK8Kg wqDCoMKgcmV0dXJuIG47DQo+ID4gPiA+ICt9DQo+ID4gPiA+ICsNCj4gPiA+ID4gK3N0YXRpYyBp bnQgdHBtX2VtdWxhdG9yX3VuaXhfdHhfYnVmcyhUUE1FbXVsYXRvciAqdHBtX3B0LA0KPiA+ID4g dHBtX3B0IHdhcyB0cG1fcGFzc3Rocm91Z2ggSSBzdXBwb3NlLg0KPiA+ID4gDQo+ID4gPiBQbGVh c2UgcmVuYW1lIHRwbV9wdCB0cG1fZW11IChvciBJIHdvdWxkIHN1Z2dlc3QgInNlbGYiLCBidXQg dGhpcw0KPiA+ID4gaXNuJ3QgY29tbW9uIG5hbWUgaW4gcWVtdSBjb2RlIC0gaXQncyBhY3R1YWxs eSBjb21tb24gaW4gYSBjbG9zZQ0KPiA+ID4gYy1vYmplY3Qgd29ybGQuLCBhbmQgaXQgaXMgcXVp dGUgY29udmVuaWVudC4uLikNCj4gPiBNeSBpbnRlcnByZXRhdGlvbiBhYm91dCBfcHQgd2FzICdw b2ludGVyJyA7LSkgaSB3aWxsIGNvbnNpZGVyIHlvdXINCj4gPiBzdWdnZXRpb24uDQo+ID4gPiAN Cj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNv bnN0IHVpbnQ4X3QgKmluLA0KPiA+ID4gPiB1aW50MzJfdA0KPiA+ID4gPiBpbl9sZW4sDQo+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVpbnQ4X3QgKm91dCwgdWludDMyX3QNCj4gPiA+ID4gb3V0 X2xlbiwNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYm9vbCAqc2VsZnRlc3RfZG9uZSkNCj4g PiA+ID4gK3sNCj4gPiA+ID4gK8KgwqDCoMKgc3NpemVfdCByZXQ7DQo+ID4gPiA+ICvCoMKgwqDC oGJvb2wgaXNfc2VsZnRlc3QgPSBmYWxzZTsNCj4gPiA+ID4gK8KgwqDCoMKgY29uc3Qgc3RydWN0 IHRwbV9yZXNwX2hkciAqaGRyID0gTlVMTDsNCj4gPiA+ID4gK8KgwqDCoMKgRXJyb3IgKmVyciA9 IE5VTEw7DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgdHBtX3B0LT5vcF9jYW5jZWxlZCA9 IGZhbHNlOw0KPiA+ID4gPiArwqDCoMKgwqB0cG1fcHQtPm9wX2V4ZWN1dGluZyA9IHRydWU7DQo+ ID4gPiA+ICvCoMKgwqDCoGlmIChzZWxmdGVzdF9kb25lKSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgKnNlbGZ0ZXN0X2RvbmUgPSBmYWxzZTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBp c19zZWxmdGVzdCA9IHRwbV91dGlsX2lzX3NlbGZ0ZXN0KGluLCBpbl9sZW4pOw0KPiA+ID4gPiAr wqDCoMKgwqB9DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgcmV0ID0gcWlvX2NoYW5uZWxf d3JpdGUodHBtX3B0LT5kYXRhX2lvYywgKGNoYXIgKilpbiwNCj4gPiA+ID4gaW5fbGVuLA0KPiA+ ID4gPiAmZXJyKTsNCj4gPiA+IGhtbSwgdG9vIGJhZCBxaW9fY2hhbm5lbF93cml0ZSgpIGRvZXNu J3QgdGFrZSBhIHZvaWQgKg0KPiA+ID4gDQo+ID4gPiB3aHkgbm90IHdyaXRlX2FsbCgpPw0KPiA+ IEFncmVlZA0KPiA+ID4gDQo+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+IA0KPiA+ID4gPiArwqDC oMKgwqBpZiAocmV0ICE9IGluX2xlbiB8fCBlcnIpIHsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqBpZiAoIXRwbV9wdC0+b3BfY2FuY2VsZWQgfHwgZXJybm8gIT0gRUNBTkNFTEVEKSB7DQo+ID4g PiBJIGRvbid0IHRoaW5rIEVDQU5DRUxFRCBtYWtlIHNlbnNlIGZvciBlbXVsYXRvciBjb2RlLg0K PiA+ID4gDQo+ID4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGVycm9yX3JlcG9ydCgidHBtLWVtdWxhdG9yOiBlcnJvciB3aGlsZQ0KPiA+ID4gPiB0cmFu c21pdHRpbmcNCj4gPiA+ID4gZGF0YSAiDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCJ0byBUUE06ICVzIiwgZXJyID8NCj4gPiA+ID4g ZXJyb3JfZ2V0X3ByZXR0eShlcnIpDQo+ID4gPiA+IDogIiIpOw0KPiA+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgZXJyb3JfZnJlZShlcnIpOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oH0NCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBnb3RvIGVycl9leGl0Ow0KPiA+ID4gPiArwqDC oMKgwqB9DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgdHBtX3B0LT5vcF9leGVjdXRpbmcg PSBmYWxzZTsNCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqByZXQgPSBxaW9fY2hhbm5lbF9y ZWFkKHRwbV9wdC0+ZGF0YV9pb2MsIChjaGFyICopb3V0LA0KPiA+ID4gPiBvdXRfbGVuLA0KPiA+ ID4gPiAmZXJyKTsNCj4gPiA+ID4gK8KgwqDCoMKgaWYgKHJldCA8IDAgfHwgZXJyKSB7DQo+ID4g PiByZWFkX2FsbCgpID8NCj4gPiBUaGUgaXNzdWUgd2l0aCByZWFkX2FsbCgpIGlzIGl0IGRvZXMg bm90IHJldHVybiB0aGUgbm8gb2YgYnl0ZXMgaXQNCj4gPiByZWFkLCBzbyBpIHdvdWxkIGxpa2Ug dG8gc3RpY3QgdG8gX3JlYWQoKQ0KPiBvaw0KPiANCj4gPiANCj4gPiA+IA0KPiA+ID4gDQo+ID4g PiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBpZiAoIXRwbV9wdC0+b3Bf Y2FuY2VsZWQgfHwgZXJybm8gIT0gRUNBTkNFTEVEKSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBlcnJvcl9yZXBvcnQoInRwbS1lbXVsYXRvcjogZXJyb3Igd2hpbGUgcmVhZGlu Zw0KPiA+ID4gPiBkYXRhDQo+ID4gPiA+IGZyb20gIg0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAiVFBNOiAlcyIsIGVyciA/DQo+ID4g PiA+IGVycm9yX2dldF9wcmV0dHkoZXJyKSA6DQo+ID4gPiA+ICIiKTsNCj4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGVycm9yX2ZyZWUoZXJyKTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqB9DQo+ID4gPiA+ICvCoMKgwqDCoH0gZWxzZSBpZiAocmV0ID49IHNpemVvZigqaGRyKSkg ew0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGhkciA9IChzdHJ1Y3QgdHBtX3Jlc3BfaGRyICop b3V0Ow0KPiA+ID4gPiArwqDCoMKgwqB9DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgaWYg KCFoZHIgfHwgYmUzMl90b19jcHUoaGRyLT5sZW4pICE9IHJldCkgew0KPiA+ID4gPiArwqDCoMKg wqDCoMKgwqDCoGVycm9yX3JlcG9ydCgidHBtLWVtdWxhdG9yOiByZWNlaXZlZCBpbnZhbGlkIHJl c3BvbnNlDQo+ID4gPiA+ICINCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCJwYWNrZXQgZnJvbSBUUE0gd2l0aCBsZW5ndGggOiVsZCIsIHJldCk7DQo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgcmV0ID0gLTE7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgZ290byBlcnJfZXhpdDsNCj4gPiA+ID4gK8KgwqDCoMKgfQ0KPiA+ID4gPiArDQo+ID4gPiA+ ICvCoMKgwqDCoGlmIChpc19zZWxmdGVzdCkgew0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoCpz ZWxmdGVzdF9kb25lID0gKGJlMzJfdG9fY3B1KGhkci0+ZXJyY29kZSkgPT0gMCk7DQo+ID4gPiA+ ICvCoMKgwqDCoH0NCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqByZXR1cm4gMDsNCj4gPiA+ ID4gKw0KPiA+ID4gPiArZXJyX2V4aXQ6DQo+ID4gPiA+ICvCoMKgwqDCoGlmIChyZXQgPCAwKSB7 DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgdHBtX3V0aWxfd3JpdGVfZmF0YWxfZXJyb3JfcmVz cG9uc2Uob3V0LCBvdXRfbGVuKTsNCj4gPiA+ID4gK8KgwqDCoMKgfQ0KPiA+ID4gPiArDQo+ID4g PiA+ICvCoMKgwqDCoHRwbV9wdC0+b3BfZXhlY3V0aW5nID0gZmFsc2U7DQo+ID4gPiA+ICsNCj4g PiA+ID4gK8KgwqDCoMKgcmV0dXJuIHJldDsNCj4gPiA+ID4gK30NCj4gPiA+ID4gKw0KPiA+ID4g PiArc3RhdGljIGludCB0cG1fZW11bGF0b3Jfc2V0X2xvY2FsaXR5KFRQTUVtdWxhdG9yICp0cG1f cHQsDQo+ID4gPiA+IHVpbnQ4X3QNCj4gPiA+ID4gbG9jdHlfbnVtYmVyKQ0KPiA+ID4gPiArew0K PiA+ID4gPiArwqDCoMKgwqBwdG1fbG9jIGxvYzsNCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKg wqBEUFJJTlRGKCIlcyA6IGxvY2FsaXR5OiAweCV4IiwgX19mdW5jX18sIGxvY3R5X251bWJlcik7 DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgaWYgKHRwbV9wdC0+Y3VyX2xvY3R5X251bWJl ciAhPSBsb2N0eV9udW1iZXIpIHsNCj4gPiA+IHJldHVybiBlYXJseSBpbnN0ZWFkIGlmID09LCB0 byBhdm9pZCBjb2RlIGluZGVudCBldGMNCj4gPiBPaw0KPiA+ID4gDQo+ID4gPiANCj4gPiA+ID4g DQo+ID4gPiA+IA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoERQUklOVEYoInNldHRpbmcgbG9j YWxpdHkgOiAweCV4IiwgbG9jdHlfbnVtYmVyKTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBs b2MudS5yZXEubG9jID0gbG9jdHlfbnVtYmVyOw0KPiA+ID4gVGhpcyBudW1iZXIgaXNuJ3Qgc2V0 IGluIGJlIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHByb3RvY29sPw0KPiA+IEkgZG91YnQgaWYgaSBn ZXQgdXIgcG9pbnQgOigsIGNhbiB5b3UgcGxlYXNlIGVsYWJvcmF0ZS4NCj4gSW4gdGhlIHJlc3Qg b2YgdGhlIHByb3RvY29sLCBpdCB1c2VzIGJpZy1lbmRpYW4uIEkgc3VwcG9zZSB5b3Ugc2hvdWxk DQo+IGNwdV90b19iZTMyKGxvY3R5X251bWJlcikuDQo+IA0KPiA+IA0KPiA+ID4gDQo+ID4gPiAN Cj4gPiA+ID4gDQo+ID4gPiA+IA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGlmICh0cG1fZW11 bGF0b3JfY3RybGNtZCgmdHBtX3B0LT5jdHJsX2RldiwNCj4gPiA+ID4gQ01EX1NFVF9MT0NBTElU WSwgJmxvYywNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBzaXplb2YobG9jKSwgc2l6ZW9mKGxvYykpIDwgMCkgew0KPiA+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZXJyb3JfcmVwb3J0KCJ0cG0tZW11bGF0b3I6 IGNvdWxkIG5vdCBzZXQgbG9jYWxpdHkNCj4gPiA+ID4gOg0KPiA+ID4gPiAlcyIsDQo+ID4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cmVy cm9yKGVycm5vKSk7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLTE7 DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgfQ0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGxv Yy51LnJlc3AudHBtX3Jlc3VsdCA9DQo+ID4gPiA+IGJlMzJfdG9fY3B1KGxvYy51LnJlc3AudHBt X3Jlc3VsdCk7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgaWYgKGxvYy51LnJlc3AudHBtX3Jl c3VsdCAhPSAwKSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlcnJvcl9yZXBv cnQoInRwbS1lbXVsYXRvcjogVFBNIHJlc3VsdCBmb3Igc2V0DQo+ID4gPiA+IGxvY2FsaXR5IDog MHgleCIsDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGxvYy51LnJlc3AudHBtX3Jlc3VsdCk7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gLTE7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgfQ0KPiA+ID4g PiArwqDCoMKgwqDCoMKgwqDCoHRwbV9wdC0+Y3VyX2xvY3R5X251bWJlciA9IGxvY3R5X251bWJl cjsNCj4gPiA+ID4gK8KgwqDCoMKgfQ0KPiA+ID4gPiArwqDCoMKgwqByZXR1cm4gMDsNCj4gPiA+ ID4gK30NCj4gPiA+ID4gKw0KPiA+ID4gPiArc3RhdGljIHZvaWQgdHBtX2VtdWxhdG9yX2hhbmRs ZV9yZXF1ZXN0KFRQTUJhY2tlbmQgKnRiLA0KPiA+ID4gPiBUUE1CYWNrZW5kQ21kIGNtZCkNCj4g PiA+ID4gK3sNCj4gPiA+ID4gK8KgwqDCoMKgVFBNRW11bGF0b3IgKnRwbV9wdCA9IFRQTV9FTVVM QVRPUih0Yik7DQo+ID4gPiA+ICvCoMKgwqDCoFRQTUxvY2FsaXR5ICpsb2N0eSA9IE5VTEw7DQo+ ID4gPiA+ICvCoMKgwqDCoGJvb2wgc2VsZnRlc3RfZG9uZSA9IGZhbHNlOw0KPiA+ID4gPiArDQo+ ID4gPiA+ICvCoMKgwqDCoERQUklOVEYoInByb2Nlc3NpbmcgY29tbWFuZCB0eXBlICVkIiwgY21k KTsNCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqBzd2l0Y2ggKGNtZCkgew0KPiA+ID4gPiAr wqDCoMKgwqBjYXNlIFRQTV9CQUNLRU5EX0NNRF9QUk9DRVNTX0NNRDoNCj4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqBxZW11X211dGV4X2xvY2soJnRwbV9wdC0+c3RhdGVfbG9jayk7DQo+ID4gPiA+ ICvCoMKgwqDCoMKgwqDCoMKgbG9jdHkgPSB0Yi0+dHBtX3N0YXRlLT5sb2N0eV9kYXRhOw0KPiA+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoGlmICh0cG1fZW11bGF0b3Jfc2V0X2xvY2FsaXR5KHRwbV9w dCwNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0Yi0+dHBtX3N0YXRlLQ0KPiA+ID4gPiA+ bG9jdHlfbnVtYmVyKQ0KPiA+ID4gPiA8IDApIHsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHRwbV91dGlsX3dyaXRlX2ZhdGFsX2Vycm9yX3Jlc3BvbnNlKGxvY3R5LQ0KPiA+ID4g PiA+IA0KPiA+ID4gPiA+IHJfYnVmZmVyLmJ1ZmZlciwNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgbG9jdHktDQo+ID4gPiA+ID5yX2J1ZmZlci5zaXplKTsNCj4gPiA+IHJl dHVybiAvIGdvdG8gaGVyZSBpbnN0ZWFkIG9mIGVsc2UuDQo+ID4gV2Ugc2hvdWxkIG5vdCByZXRy dW4gZnJvbSBoZXJlLCB3ZSBoYXZlIHRvIHByb3BhZ3RlIHRoZSBlcnJvcg0KPiA+IHJlc3BvbnNl DQo+ID4gdG8gZGV2aWNlLCBhbmQgdW5sb2NrIHRoZSBzdGF0ZS4NCj4gPiA+IA0KPiA+ID4gDQo+ ID4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqB9IGVsc2Ugew0KPiA+ ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHBtX2VtdWxhdG9yX3VuaXhfdHhfYnVmcyh0 cG1fcHQsIGxvY3R5LQ0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+IHdfYnVmZmVyLmJ1ZmZlciwNCj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbG9jdHktPndfb2Zmc2V0 LA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsb2N0eS0NCj4g PiA+ID4gPiANCj4gPiA+ID4gPiByX2J1ZmZlci5idWZmZXIsDQo+ID4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGxvY3R5LQ0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+IHJf YnVmZmVyLnNpemUsDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCZzZWxmdGVzdF9kb25lKTsNCj4gPiA+IG5vIGVycm9yIGhhbmRsaW5nPw0KPiA+IFRoZSBlcnJv ciBjYXNlIGlzIHN1cHBvc2VkIHRvIGhhbmRsZSBieSBkZXZpY2UsIHdoZXJlIHdlIGFyZQ0KPiA+ IGZpbGxpbmcNCj4gPiBpbnRvIG91dCBidWZmZXIsIHVzaW5nIHRwbV91dGlsX3dyaXRlX2ZhdGFs X2Vycm9yX3Jlc3BvbnNlKCkuDQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgfQ0KPiA+ID4gPiArDQo+ID4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgdGItPnJlY3ZfZGF0YV9jYWxsYmFjayh0Yi0+dHBtX3N0YXRlLCB0Yi0+dHBtX3N0YXRl LQ0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+IGxvY3R5X251bWJlciwNCj4gPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2Vs ZnRlc3RfZG9uZSk7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgcWVtdV9tdXRleF91bmxvY2so JnRwbV9wdC0+c3RhdGVfbG9jayk7DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKg wqBicmVhazsNCj4gPiA+ID4gK8KgwqDCoMKgY2FzZSBUUE1fQkFDS0VORF9DTURfSU5JVDoNCj4g PiA+ID4gK8KgwqDCoMKgY2FzZSBUUE1fQkFDS0VORF9DTURfRU5EOg0KPiA+ID4gPiArwqDCoMKg wqBjYXNlIFRQTV9CQUNLRU5EX0NNRF9UUE1fUkVTRVQ6DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgLyogbm90aGluZyB0byBkbyAqLw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGJyZWFrOw0K PiA+ID4gPiArwqDCoMKgwqB9DQo+ID4gPiA+ICt9DQo+ID4gPiA+ICsNCj4gPiA+ID4gKy8qDQo+ ID4gPiA+ICsgKiBHcmFjZWZ1bGx5IHNodXQgZG93biB0aGUgZXh0ZXJuYWwgdW5peGlvIFRQTQ0K PiA+ID4gPiArICovDQo+ID4gPiA+ICtzdGF0aWMgdm9pZCB0cG1fZW11bGF0b3Jfc2h1dGRvd24o VFBNRW11bGF0b3IgKnRwbV9wdCkNCj4gPiA+ID4gK3sNCj4gPiA+ID4gK8KgwqDCoMKgcHRtX3Jl cyByZXM7DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgaWYgKHRwbV9lbXVsYXRvcl9jdHJs Y21kKCZ0cG1fcHQtPmN0cmxfZGV2LCBDTURfU0hVVERPV04sDQo+ID4gPiA+ICZyZXMsIDAsDQo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHNpemVvZihyZXMpKSA8IDApIHsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBlcnJvcl9yZXBv cnQoInRwbS1lbXVsYXRvcjogQ291bGQgbm90IGNsZWFubHkgc2h1dGRvd24NCj4gPiA+ID4gdGhl DQo+ID4gPiA+IFRQTTogJXMiLA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgc3RyZXJyb3IoZXJybm8pKTsNCj4gPiA+ID4gK8KgwqDCoMKgfSBlbHNl IGlmIChyZXMgIT0gMCkgew0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGVycm9yX3JlcG9ydCgi dHBtLWVtdWxhdG9yOiBUUE0gcmVzdWx0IGZvciBzdXRkb3duOg0KPiA+ID4gPiAweCV4IiwNCj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJlMzJfdG9f Y3B1KHJlcykpOw0KPiA+ID4gPiArwqDCoMKgwqB9DQo+ID4gPiA+ICt9DQo+ID4gPiA+ICsNCj4g PiA+ID4gK3N0YXRpYyBpbnQgdHBtX2VtdWxhdG9yX3Byb2JlX2NhcHMoVFBNRW11bGF0b3IgKnRw bV9wdCkNCj4gPiA+ID4gK3sNCj4gPiA+ID4gK8KgwqDCoMKgRFBSSU5URigiJXMiLCBfX2Z1bmNf Xyk7DQo+ID4gPiA+ICvCoMKgwqDCoGlmICh0cG1fZW11bGF0b3JfY3RybGNtZCgmdHBtX3B0LT5j dHJsX2RldiwNCj4gPiA+ID4gQ01EX0dFVF9DQVBBQklMSVRZLA0KPiA+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAmdHBtX3B0LT5jYXBzLCAw LCBzaXplb2YodHBtX3B0LQ0KPiA+ID4gPiA+Y2FwcykpIDwNCj4gPiA+ID4gMCkgew0KPiA+ID4g PiArwqDCoMKgwqDCoMKgwqDCoGVycm9yX3JlcG9ydCgidHBtLWVtdWxhdG9yOiBwcm9iaW5nIGZh aWxlZCA6ICVzIiwNCj4gPiA+ID4gc3RyZXJyb3IoZXJybm8pKTsNCj4gPiA+ID4gK8KgwqDCoMKg wqDCoMKgwqByZXR1cm4gLTE7DQo+ID4gPiA+ICvCoMKgwqDCoH0NCj4gPiA+ID4gKw0KPiA+ID4g PiArwqDCoMKgwqB0cG1fcHQtPmNhcHMgPSBiZTY0X3RvX2NwdSh0cG1fcHQtPmNhcHMpOw0KPiA+ ID4gPiArDQo+ID4gPiA+ICvCoMKgwqDCoERQUklOVEYoImNhcGJpbGl0aWVzIDogMHglbHgiLCB0 cG1fcHQtPmNhcHMpOw0KPiA+ID4gPiArDQo+ID4gPiA+ICvCoMKgwqDCoHJldHVybiAwOw0KPiA+ ID4gPiArfQ0KPiA+ID4gPiArDQo+ID4gPiA+ICtzdGF0aWMgaW50IHRwbV9lbXVsYXRvcl9jaGVj a19jYXBzKFRQTUVtdWxhdG9yICp0cG1fcHQpDQo+ID4gPiA+ICt7DQo+ID4gPiA+ICvCoMKgwqDC oHB0bV9jYXAgY2FwcyA9IDA7DQo+ID4gPiA+ICvCoMKgwqDCoGNvbnN0IGNoYXIgKnRwbSA9IE5V TEw7DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgLyogY2hlY2sgZm9yIG1pbi4gcmVxdWly ZWQgY2FwYWJpbGl0aWVzICovDQo+ID4gPiA+ICvCoMKgwqDCoHN3aXRjaCAodHBtX3B0LT50cG1f dmVyc2lvbikgew0KPiA+ID4gPiArwqDCoMKgwqBjYXNlIFRQTV9WRVJTSU9OXzFfMjoNCj4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqBjYXBzID0gUFRNX0NBUF9JTklUIHwgUFRNX0NBUF9TSFVURE9X TiB8DQo+ID4gPiA+IFBUTV9DQVBfR0VUX1RQTUVTVEFCTElTSEVEIHwNCj4gPiA+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFBUTV9DQVBfU0VUX0xPQ0FMSVRZOw0KPiA+ID4gPiAr wqDCoMKgwqDCoMKgwqDCoHRwbSA9ICIxLjIiOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGJy ZWFrOw0KPiA+ID4gPiArwqDCoMKgwqBjYXNlIFRQTV9WRVJTSU9OXzJfMDoNCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqBjYXBzID0gUFRNX0NBUF9JTklUIHwgUFRNX0NBUF9TSFVURE9XTiB8DQo+ ID4gPiA+IFBUTV9DQVBfR0VUX1RQTUVTVEFCTElTSEVEIHwNCj4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoFBUTV9DQVBfU0VUX0xPQ0FMSVRZIHwNCj4gPiA+ID4gUFRNX0NB UF9SRVNFVF9UUE1FU1RBQkxJU0hFRDsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqB0cG0gPSAi MiI7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgYnJlYWs7DQo+ID4gPiA+ICvCoMKgwqDCoGNh c2UgVFBNX1ZFUlNJT05fVU5TUEVDOg0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGVycm9yX3Jl cG9ydCgidHBtLWVtdWxhdG9yOiBUUE0gdmVyc2lvbiBoYXMgbm90IGJlZW4NCj4gPiA+ID4gc2V0 Iik7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC0xOw0KPiA+ID4gPiArwqDCoMKg wqB9DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgaWYgKCFUUE1fRU1VTEFUT1JfSU1QTEVN RU5UU19BTExfQ0FQUyh0cG1fcHQsIGNhcHMpKSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg ZXJyb3JfcmVwb3J0KCJ0cG0tZW11bGF0b3I6IFRQTSBkb2VzIG5vdCBpbXBsZW1lbnQNCj4gPiA+ ID4gbWluaW11bQ0KPiA+ID4gPiBzZXQgb2YgIg0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgInJlcXVpcmVkIGNhcGFiaWxpdGllcyBmb3IgVFBNICVz DQo+ID4gPiA+ICgweCV4KSIsDQo+ID4gPiA+IHRwbSwgKGludCljYXBzKTsNCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqByZXR1cm4gLTE7DQo+ID4gPiA+ICvCoMKgwqDCoH0NCj4gPiA+ID4gKw0K PiA+ID4gPiArwqDCoMKgwqByZXR1cm4gMDsNCj4gPiA+ID4gK30NCj4gPiA+ID4gKw0KPiA+ID4g PiArc3RhdGljIGludCB0cG1fZW11bGF0b3Jfc3RhcnR1cF90cG0oVFBNQmFja2VuZCAqdGIpDQo+ ID4gPiA+ICt7DQo+ID4gPiA+ICvCoMKgwqDCoFRQTUVtdWxhdG9yICp0cG1fcHQgPSBUUE1fRU1V TEFUT1IodGIpOw0KPiA+ID4gPiArwqDCoMKgwqBwdG1faW5pdCBpbml0Ow0KPiA+ID4gPiArwqDC oMKgwqBwdG1fcmVzIHJlczsNCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqBEUFJJTlRGKCIl cyIsIF9fZnVuY19fKTsNCj4gPiA+ID4gK8KgwqDCoMKgaWYgKHRwbV9lbXVsYXRvcl9jdHJsY21k KCZ0cG1fcHQtPmN0cmxfZGV2LCBDTURfSU5JVCwNCj4gPiA+ID4gJmluaXQsDQo+ID4gPiA+IHNp emVvZihpbml0KSwNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgc2l6ZW9mKGluaXQpKSA8IDApIHsNCj4gPiA+ID4gK8KgwqDCoMKgwqDC oMKgwqBlcnJvcl9yZXBvcnQoInRwbS1lbXVsYXRvcjogY291bGQgbm90IHNlbmQgSU5JVDogJXMi LA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3Ry ZXJyb3IoZXJybm8pKTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBnb3RvIGVycl9leGl0Ow0K PiA+ID4gPiArwqDCoMKgwqB9DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgcmVzID0gYmUz Ml90b19jcHUoaW5pdC51LnJlc3AudHBtX3Jlc3VsdCk7DQo+ID4gPiA+ICvCoMKgwqDCoGlmIChy ZXMpIHsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBlcnJvcl9yZXBvcnQoInRwbS1lbXVsYXRv cjogVFBNIHJlc3VsdCBmb3IgQ01EX0lOSVQ6DQo+ID4gPiA+IDB4JXgiLCByZXMpOw0KPiA+ID4g PiArwqDCoMKgwqDCoMKgwqDCoGdvdG8gZXJyX2V4aXQ7DQo+ID4gPiA+ICvCoMKgwqDCoH0NCj4g PiA+ID4gK8KgwqDCoMKgcmV0dXJuIDA7DQo+ID4gPiA+ICsNCj4gPiA+ID4gK2Vycl9leGl0Og0K PiA+ID4gPiArwqDCoMKgwqB0cG1fcHQtPmhhZF9zdGFydHVwX2Vycm9yID0gdHJ1ZTsNCj4gPiA+ ID4gK8KgwqDCoMKgcmV0dXJuIC0xOw0KPiA+ID4gPiArfQ0KPiA+ID4gPiArDQo+ID4gPiA+ICtz dGF0aWMgYm9vbCB0cG1fZW11bGF0b3JfZ2V0X3RwbV9lc3RhYmxpc2hlZF9mbGFnKFRQTUJhY2tl bmQNCj4gPiA+ID4gKnRiKQ0KPiA+ID4gPiArew0KPiA+ID4gPiArwqDCoMKgwqBUUE1FbXVsYXRv ciAqdHBtX3B0ID0gVFBNX0VNVUxBVE9SKHRiKTsNCj4gPiA+ID4gK8KgwqDCoMKgcHRtX2VzdCBl c3Q7DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgRFBSSU5URigiJXMiLCBfX2Z1bmNfXyk7 DQo+ID4gPiA+ICvCoMKgwqDCoGlmICh0cG1fZW11bGF0b3JfY3RybGNtZCgmdHBtX3B0LT5jdHJs X2RldiwNCj4gPiA+ID4gQ01EX0dFVF9UUE1FU1RBQkxJU0hFRCwgJmVzdCwgMCwNCj4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2l6ZW9m KGVzdCkpIDwgMCkgew0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGVycm9yX3JlcG9ydCgidHBt LWVtdWxhdG9yOiBDb3VsZCBub3QgZ2V0IHRoZSBUUE0NCj4gPiA+ID4gZXN0YWJsaXNoZWQgZmxh ZzogJXMiLA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgc3RyZXJyb3IoZXJybm8pKTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqByZXR1cm4gZmFs c2U7DQo+ID4gPiA+ICvCoMKgwqDCoH0NCj4gPiA+ID4gK8KgwqDCoMKgRFBSSU5URigiZXN0YWJs aXNoZWQgZmxhZzogJTB4IiwgZXN0LnUucmVzcC5iaXQpOw0KPiA+ID4gPiArDQo+ID4gPiA+ICvC oMKgwqDCoHJldHVybiAoZXN0LnUucmVzcC5iaXQgIT0gMCk7DQo+ID4gPiA+ICt9DQo+ID4gPiA+ ICsNCj4gPiA+ID4gK3N0YXRpYyBpbnQgdHBtX2VtdWxhdG9yX3Jlc2V0X3RwbV9lc3RhYmxpc2hl ZF9mbGFnKFRQTUJhY2tlbmQNCj4gPiA+ID4gKnRiLA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdWludDhfdA0KPiA+ID4gPiBsb2N0eSkNCj4g PiA+ID4gK3sNCj4gPiA+ID4gK8KgwqDCoMKgVFBNRW11bGF0b3IgKnRwbV9wdCA9IFRQTV9FTVVM QVRPUih0Yik7DQo+ID4gPiA+ICvCoMKgwqDCoHB0bV9yZXNldF9lc3QgcmVzZXRfZXN0Ow0KPiA+ ID4gPiArwqDCoMKgwqBwdG1fcmVzIHJlczsNCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqAv KiBvbmx5IGEgVFBNIDIuMCB3aWxsIHN1cHBvcnQgdGhpcyAqLw0KPiA+ID4gPiArwqDCoMKgwqBp ZiAodHBtX3B0LT50cG1fdmVyc2lvbiA9PSBUUE1fVkVSU0lPTl8yXzApIHsNCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqByZXNldF9lc3QudS5yZXEubG9jID0gdHBtX3B0LT5jdXJfbG9jdHlfbnVt YmVyOw0KPiA+ID4gPiArDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgaWYgKHRwbV9lbXVsYXRv cl9jdHJsY21kKCZ0cG1fcHQtPmN0cmxfZGV2LA0KPiA+ID4gPiBDTURfUkVTRVRfVFBNRVNUQUJM SVNIRUQsDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAmcmVzZXRfZXN0LA0KPiA+ID4gPiBzaXplb2YocmVz ZXRfZXN0KSwNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNpemVvZihyZXNldF9lc3QpKSA8IDApIHsNCj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVycm9yX3JlcG9ydCgidHBtLWVtdWxhdG9y OiBDb3VsZCBub3QgcmVzZXQgdGhlDQo+ID4gPiA+IGVzdGFibGlzaG1lbnQgYml0OiAiDQo+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IiVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiAtMTsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqB9DQo+ID4gPiA+ICsNCj4gPiA+ ID4gK8KgwqDCoMKgwqDCoMKgwqByZXMgPSBiZTMyX3RvX2NwdShyZXNldF9lc3QudS5yZXNwLnRw bV9yZXN1bHQpOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGlmIChyZXMpIHsNCj4gPiA+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVycm9yX3JlcG9ydCgidHBtLWVtdWxhdG9yOiBUUE0g cmVzdWx0IGZvciByZXN0DQo+ID4gPiA+IGVzdGFibGl4aGVkIGZsYWc6ICINCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIjB4JXgiLCBy ZXMpOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC0xOw0KPiA+ID4g PiArwqDCoMKgwqDCoMKgwqDCoH0NCj4gPiA+ID4gK8KgwqDCoMKgfQ0KPiA+ID4gPiArDQo+ID4g PiA+ICvCoMKgwqDCoHJldHVybiAwOw0KPiA+ID4gPiArfQ0KPiA+ID4gPiArDQo+ID4gPiA+ICtz dGF0aWMgYm9vbCB0cG1fZW11bGF0b3JfaGFkX3N0YXJ0dXBfZXJyb3IoVFBNQmFja2VuZCAqdGIp DQo+ID4gPiA+ICt7DQo+ID4gPiA+ICvCoMKgwqDCoFRQTUVtdWxhdG9yICp0cG1fcHQgPSBUUE1f RU1VTEFUT1IodGIpOw0KPiA+ID4gPiArDQo+ID4gPiA+ICvCoMKgwqDCoHJldHVybiB0cG1fcHQt PmhhZF9zdGFydHVwX2Vycm9yOw0KPiA+ID4gPiArfQ0KPiA+ID4gPiArDQo+ID4gPiA+ICtzdGF0 aWMgdm9pZCB0cG1fZW11bGF0b3JfY2FuY2VsX2NtZChUUE1CYWNrZW5kICp0YikNCj4gPiA+ID4g K3sNCj4gPiA+ID4gK8KgwqDCoMKgVFBNRW11bGF0b3IgKnRwbV9wdCA9IFRQTV9FTVVMQVRPUih0 Yik7DQo+ID4gPiA+ICvCoMKgwqDCoHB0bV9yZXMgcmVzOw0KPiA+ID4gPiArDQo+ID4gPiA+ICvC oMKgwqDCoC8qDQo+ID4gPiA+ICvCoMKgwqDCoMKgKiBBcyBvZiBMaW51eCAzLjcgdGhlIHRwbV90 aXMgZHJpdmVyIGRvZXMgbm90IHByb3Blcmx5DQo+ID4gPiA+IGNhbmNlbA0KPiA+ID4gPiArwqDC oMKgwqDCoCogY29tbWFuZHMgb24gYWxsIFRQTSBtYW51ZmFjdHVyZXJzJyBUUE1zLg0KPiA+ID4g PiArwqDCoMKgwqDCoCogT25seSBjYW5jZWwgaWYgd2UncmUgYnVzeSBzbyB3ZSBkb24ndCBjYW5j ZWwgc29tZW9uZQ0KPiA+ID4gPiBlbHNlJ3MNCj4gPiA+ID4gK8KgwqDCoMKgwqAqIGNvbW1hbmQs IGUuZy4sIGEgY29tbWFuZCBleGVjdXRlZCBvbiB0aGUgaG9zdC4NCj4gPiA+ID4gK8KgwqDCoMKg wqAqLw0KPiA+ID4gPiArwqDCoMKgwqBpZiAodHBtX3B0LT5vcF9leGVjdXRpbmcpIHsNCj4gPiA+ IFRoZSBmaWVsZCBpcyBzZXQgaW4gdGhlIHdvcmtlciB0aHJlYWQuIFRoaXMgaXMgcmFjeS4gRm9y dHVuYXRlbHkNCj4gPiA+IHRoaXMNCj4gPiA+IGlzIG5vdCByZWxldmFudCBmb3IgZW11bGF0b3Is IEkgdGhpbmsgeW91IGNhbiBzaW1wbHkgZHJvcCB0aGF0DQo+ID4gPiBjaGVjaw0KPiA+ID4gYW5k IHRoZSB2YXJpYWJsZS4gU3RlZmFuIHNob3VsZCBjb25maXJtIHRob3VnaC4NCj4gPiA+IA0KPiA+ ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgaWYgKFRQTV9FTVVMQVRP Ul9JTVBMRU1FTlRTX0FMTF9DQVBTKHRwbV9wdCwNCj4gPiA+ID4gUFRNX0NBUF9DQU5DRUxfVFBN X0NNRCkpIHsNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICh0cG1fZW11bGF0 b3JfY3RybGNtZCgmdHBtX3B0LT5jdHJsX2RldiwNCj4gPiA+ID4gQ01EX0NBTkNFTF9UUE1fQ01E LA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAmcmVzLCAwLCBzaXplb2YocmVzKSkgPA0KPiA+ ID4gPiAwKSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVycm9y X3JlcG9ydCgidHBtLWVtdWxhdG9yOiBDb3VsZCBub3QgY2FuY2VsDQo+ID4gPiA+IGNvbW1hbmQ6 ICVzIiwNCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBzdHJlcnJvcihlcnJubykpOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgfSBlbHNlIGlmIChyZXMgIT0gMCkgew0KPiA+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBlcnJvcl9yZXBvcnQoInRwbS1lbXVsYXRvcjogRmFpbGVkIHRv IGNhbmNlbA0KPiA+ID4gPiBUUE06DQo+ID4gPiA+IDB4JXgiLA0KPiA+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJlMzJfdG9f Y3B1KHJlcykpOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfSBlbHNlIHsNCj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHBtX3B0LT5vcF9jYW5jZWxl ZCA9IHRydWU7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9DQo+ID4gPiA+ICvC oMKgwqDCoMKgwqDCoMKgfQ0KPiA+ID4gPiArwqDCoMKgwqB9DQo+ID4gPiA+ICt9DQo+ID4gPiA+ ICsNCj4gPiA+ID4gK3N0YXRpYyB2b2lkIHRwbV9lbXVsYXRvcl9yZXNldChUUE1CYWNrZW5kICp0 YikNCj4gPiA+ID4gK3sNCj4gPiA+ID4gK8KgwqDCoMKgRFBSSU5URigiJXMiLCBfX2Z1bmNfXyk7 DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgdHBtX2VtdWxhdG9yX2NhbmNlbF9jbWQodGIp Ow0KPiA+ID4gPiArfQ0KPiA+ID4gPiArDQo+ID4gPiA+ICtzdGF0aWMgVFBNVmVyc2lvbiB0cG1f ZW11bGF0b3JfZ2V0X3RwbV92ZXJzaW9uKFRQTUJhY2tlbmQgKnRiKQ0KPiA+ID4gPiArew0KPiA+ ID4gPiArwqDCoMKgwqBUUE1FbXVsYXRvciAqdHBtX3B0ID0gVFBNX0VNVUxBVE9SKHRiKTsNCj4g PiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqByZXR1cm4gdHBtX3B0LT50cG1fdmVyc2lvbjsNCj4g PiA+ID4gK30NCj4gPiA+ID4gKw0KPiA+ID4gPiArc3RhdGljIHZvaWQgdHBtX2VtdWxhdG9yX2Js b2NrX21pZ3JhdGlvbihUUE1FbXVsYXRvciAqdHBtX3B0KQ0KPiA+ID4gPiArew0KPiA+ID4gPiAr wqDCoMKgwqBFcnJvciAqZXJyID0gTlVMTDsNCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqBl cnJvcl9zZXRnKCZ0cG1fcHQtPm1pZ3JhdGlvbl9ibG9ja2VyLA0KPiA+ID4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIk1pZ3JhdGlvbiBkaXNhYmxlZDogVFBNIGVtdWxhdG9yIG5v dCB5ZXQNCj4gPiA+ID4gbWlncmF0YWJsZSIpOw0KPiA+ID4gPiArwqDCoMKgwqBtaWdyYXRlX2Fk ZF9ibG9ja2VyKHRwbV9wdC0+bWlncmF0aW9uX2Jsb2NrZXIsICZlcnIpOw0KPiA+ID4gPiArwqDC oMKgwqBpZiAoZXJyKSB7DQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgZXJyb3JfZnJlZShlcnIp Ow0KPiA+ID4gcHJvYmFibHkgYmV0dGVyIHRvIHJlcG9ydF9lcnIgaXQgaW5zdGVhZA0KPiA+IE9r DQo+ID4gPiANCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoMKg wqDCoMKgZXJyb3JfZnJlZSh0cG1fcHQtPm1pZ3JhdGlvbl9ibG9ja2VyKTsNCj4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqB0cG1fcHQtPm1pZ3JhdGlvbl9ibG9ja2VyID0gTlVMTDsNCj4gPiA+IGFu ZCByZXR1cm4gYW4gZXJyb3IgY29kZS4NCj4gPiBXaWxsIGRvDQo+ID4gPiANCj4gPiA+IA0KPiA+ ID4gPiANCj4gPiA+ID4gDQo+ID4gPiA+ICvCoMKgwqDCoH0NCj4gPiA+ID4gK30NCj4gPiA+ID4g Kw0KPiA+ID4gPiArc3RhdGljIGludCB0cG1fZW11bGF0b3JfcHJlcGFyZV9kYXRhX2ZkKFRQTUVt dWxhdG9yICp0cG1fcHQpDQo+ID4gPiA+ICt7DQo+ID4gPiA+ICvCoMKgwqDCoHB0bV9yZXMgcmVz Ow0KPiA+ID4gPiArwqDCoMKgwqBFcnJvciAqZXJyID0gTlVMTDsNCj4gPiA+ID4gK8KgwqDCoMKg aW50IGZkc1syXSA9IHsgLTEsIC0xIH07DQo+ID4gPiA+ICsNCj4gPiA+ID4gK8KgwqDCoMKgaWYg KHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TRVFQQUNLRVQsIDAsIGZkcykgPCAwKSB7DQo+ID4g PiA+ICvCoMKgwqDCoMKgwqDCoMKgZXJyb3JfcmVwb3J0KCJ0cG0tZW11bGF0b3I6IEZhaWxlZCB0 byBjcmVhdGUNCj4gPiA+ID4gc29ja2V0cGFpciIpOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oHJldHVybiAtMTsNCj4gPiA+ID4gK8KgwqDCoMKgfQ0KPiA+ID4gPiArDQo+ID4gPiA+ICvCoMKg wqDCoHFlbXVfY2hyX2ZlX3NldF9tc2dmZHMoJnRwbV9wdC0+Y3RybF9kZXYsIGZkcyArIDEsIDEp Ow0KPiA+ID4gPiArDQo+ID4gPiA+ICvCoMKgwqDCoGlmICh0cG1fZW11bGF0b3JfY3RybGNtZCgm dHBtX3B0LT5jdHJsX2RldiwNCj4gPiA+ID4gQ01EX1NFVF9EQVRBRkQsDQo+ID4gPiA+ICZyZXMs IDAsDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2l6 ZW9mKHJlcykpIHx8IHJlcyAhPSAwKSB7DQo+ID4gPiBZYXkhIGZvciBtYWtpbmcgbGlmZSBlYXNp ZXIgYW5kIGhpZGluZyBhIHByb3RvY29sIGRldGFpbC4NCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ ID4gDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgZXJyb3JfcmVwb3J0KCJ0cG0tZW11bGF0b3I6 IEZhaWxlZCB0byBzZW5kDQo+ID4gPiA+IENNRF9TRVRfREFUQUZEOg0KPiA+ID4gPiAlcyIsDQo+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJlcnJv cihlcnJubykpOw0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGdvdG8gZXJyX2V4aXQ7DQo+ID4g PiA+ICvCoMKgwqDCoH0NCj4gPiA+ID4gKw0KPiA+ID4gPiArwqDCoMKgwqB0cG1fcHQtPmRhdGFf aW9jID0NCj4gPiA+ID4gUUlPX0NIQU5ORUwocWlvX2NoYW5uZWxfc29ja2V0X25ld19mZChmZHNb MF0sICZlcnIpKTsNCj4gPiA+ID4gK8KgwqDCoMKgaWYgKGVycikgew0KPiA+ID4gPiArwqDCoMKg wqDCoMKgwqDCoGVycm9yX3JlcG9ydCgidHBtLWVtdWxhdG9yOiBGYWlsZWQgdG8gY3JlYXRlIGlv DQo+ID4gPiA+IGNoYW5uZWwgOg0KPiA+ID4gPiAlcyIsDQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZXJyb3JfZ2V0X3ByZXR0eShlcnIpKTsN Cj4gPiA+IGVycm9yX3ByZXBlbmQoKT8NCj4gPiBPaw0KPiA+ID4gDQo+ID4gPiANCj4gPiA+ID4g DQo+ID4gPiA+IA0KPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoGVycm9yX2ZyZWUoZXJyKTsNCj4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqBnb3RvIGVycl9leGl0Ow0KPiA+ID4gPiArwqDCoMKgwqB9 DQo+ID4gPiBjbG9zZSBmZHNbMV0gPw0KPiA+IEkgZ3Vlc3Mgd2UgYXJlIG5vdCBzdXBwb3NlZCB0 byBjbG9zZSB0aGUgb3RoZXIgZW5kIG9mIHRoZQ0KPiA+IHNvY2tldHBhaXIvcGlwZSwgYXMgaXQg aXMgbm90IGZvcmtlZCBwcm9jZXNzLg0KPiBZb3Ugd2lsbCBjbG9zZSB0aGlzIGVuZCwgbm90IHRo ZSBvdGhlciBlbmQuDQpmZHNbMV0gaXMgaGFuZGVkIG92ZXIgdG8gb3RoZXIgZW5kLCBmZHNbMF0g aXMgdXNlZCBieSBxZW11LCBzbyB3ZQ0KY2Fubm90IGNsb3NlIHVubGVzcyBlcnJvciBjYXNlIGkg Z3Vlc3MuDQoNCi0gQW1hcm5hdGgNCg==