ZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0NPTU1FTlRTIGIvZG9jL0tVUlMvQ09NTUVOVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmOWNhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0NPTU1FTlRTCkBAIC0wLDAgKzEsNzUgQEAKKwlCRU1FUktVTkdFTiBaVU0gVEhFTUEgU1BJRUxWRVJERVJCRVIKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUVpbmUga29uc2VxdWVudGUgVmVyd2VuZHVuZyBkZXIgV29ydGUgTW9lcmRlciwgVmVyYnJlY2hlciwKKwlvLmFlLiB2ZXJrZW5udCBkZW4gd2FocmVuIENoYXJha3RlcjoKKwlFcyBzaW5kIGVpbmZhY2ggbnVyIFNwaWVsdmVyZGVyYmVyLCB1bmQgc29sbHRlbiBhdWNoIAorCWRlbWVudHNwcmVjaGVuZCBiZWhhbmRlbHQgd2VyZGVuLgorCisJSW0gTW9tZW50IHdpcmQgbm9jaCBuaWNodCBnZXNwaWVsdC4KKwlFcmdvIGdpYnQgZXMgbm9jaCBrZWluZSBTcGllbHZlcmRlcmJlci4KKworCVdlbm4gZXMgZGVubiB3ZWxjaGUgZ2lidCwgd2llIGdlaHQgbWFuIG1pdCBpaG5lbiB1bSA/CisJLQlNYW4gc3BpZWx0IG5pY2h0IG1laHIgbWl0IElobmVuLgorCS0JTWFuIG5pbW10IGlobmVuIGRlbiBTcGFzcywgc29kYXNzIHNpZSB2b24gc2VsYmVyCisJCWF1ZmhvZXJlbiBtaXR6dXNwaWVsZW4sIGJ6dy4gYW5kZXJlbiBkYXMgU3BpZWwKKwkJenUgdmVyZGVyYmVuLgorCisJVm9yc2NobGFlZ2UoISkgZnVlciBNYXNzbmFobWVuOgorCQorCS0JQmVsZWdlbiBtaXQgRmx1ZWNoZW4uCisKKwkoekIgRXJrYWVsdHVuZ2VuLCBvZGVyIHplaXR3ZWlsaWdlciBWZXJsdXN0IGRlciBGYWVoaWdrZWl0LAorCVdhZmZlbiB6dSB0cmFnZW4sIFNjaGxlY2h0ZXMgR2V3aXNzZW4sIGRhc3MgbWFuIGltbWVyIHdpZWRlcgorCWRhcmFuIGVyaW5uZXJ0IHdpcmQsIHdhcyBtYW4gYm9lc2VzIGdldGFuIGhhdC4gZXRjLikKKwlXZXIgaGF0IHdlaXRlcmUgSWRlZW4gPz8KKworCVZvcnRlaWxlOgorCisJCSsJRGllIEJlc3RyYWZ1bmcgZXJmb2xndCBpbm5lcmhhbGIgZGVzIFNwaWVsZXMuCisJCSsJRHVyY2ggZGllIERhdWVyIGthbm4gZGllIFN0cmFmZSBmZWluIGRvc2llcnQKKwkJCXdlcmRlbi4KKworCU5hY2h0ZWlsOiAKKworCQkrCU1hZ2llciBzaW5kIGF1ZiBkaWVzZSBXZWlzZSBzY2h3ZXIgenUKKwkJCWJlc3RyYWZlbi4KKworCisJLQlHZWxkIG9kZXIgWFAgd2VnbmVobWVuLgorCisJLQlIZXJhYnN0dWZ1bmcuIE51ciBpbSBOT1RGQUxMCisKKwktCUF1c3NzY2hsdXNzIHZvbSBTcGllbC4gTnVyIGltIEFFVVNTRVJTVEVOIE5PVEZBTEwKKworCisJV2VyIGVpbiBTcGllbHZlcmRlcmJlciBpc3QsIGVudHNjaGVpZGV0IGltIGFsbGdlbWVpbmVuCisJZGllIEdlbWVpbnNjaGFmdCBkZXIgU3BpZWxlbmRlbi4gRGVzaGFsYiBkYXJmIGVzIGtlaW5lCisJZmF0YWxlbiBFaW5ncmlmZmUgaW4gZGFzIFNwaWVsIGR1cmNoIGRpZSBFbnRzY2hlaWR1bmcgCisJZWluemVsbmVyIFNwaWVsZXIgZ2ViZW4hCisKKwlCRU1FUktVTkdFTiBaVU0gVEhFTUEgRkxFSVNTIFZPTiBNQUdJRVJOCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJV2VubiBlaW4gTWFnaWVyIHNlbHRlbiBpbSBTcGllbCBpc3QsIGhlaXNzdCBkYXMgbmljaHQsCisJZGFzcyBlciBzaWNoLCB3ZW5uIGVyIGVpbm1hbCBkYSBpc3QsIHVtIHNvIHN0YWVya2VyCisJYmVtZXJrYmFyIG1hY2hlbiBtdXNzLgorCisKKwlCRU1FUktVTkdFTiBaVSBHRU5BVUVSRU4gUkVHRUxOCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJTWFuIHNvbGx0ZSBzaWNoIG5pY2h0IGFuIGlyZ2VuZHdlbGNoZW4gWmFobGVuICh3aXpfbGV2ZWxzKSwKKwlWZXJvcmRudW5nZW4sIEdlc2NoYWVmdHNvcmRudWduZW4gZXRjLiBmZXN0aGFsdGVuLCBzb25kZXJuIHNpY2gKKwlpbW1lciB2b3IgQXVnZW4gaGFsdGVuLCBkYXNzIGVzIHNpY2ggaW0gZWluIFNwaWVsIGhhbmRlbHQuCisJRXMgaGFiZW4gc2ljaCBMZXV0ZSB6dXNhbW1lbmdlZnVuZGVuLCB1bSBtaXRlaW5hbmRlciBTcGFzcyB6dQorCWhhYmVuLiBEaWVzZXMgU3BpZWwgaXN0IGtlaW5lIHNvIGtvbXBsZXhlIEdlc2VsbHNjaGFmdCB3aWUgZGllCisJcmVhbGU7IGRlc2hhbGIgc29sbHRlIGVzIGF1Y2gga2VpbmVyIHNvIGtvbXBsZXhlbiBSZWdlbG4KKwliZWR1ZXJmZW4uCisKKwlPbHBwLCBTaGVyaWZmIGRlcyBNb3JnZW5HcmF1ZW5zCisJUnVtYXRhLCBNdWRBZG0gZGVzIE1vcmdlbkdyYXVlbnMKKworCVAuUy46CisJCUtvbW1lbnRhcmUgdW5kIHdlaXRlcmUgVm9yc2NobGFlZ2Ugc2luZCBoZXJ6bGljaAorCQl3aWxsa29tbWVuLgpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMvQ29udGVudHMgYi9kb2MvS1VSUy9MUEMtS1VSUy9Db250ZW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ0ZWZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvQ29udGVudHMKQEAgLTAsMCArMSwxMyBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEMgQmFzaWNzCisgICAgICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzIGFwcmlsIDE5OTMKKworSW50cm9kdWN0aW9uCitDaGFwdGVyIDE6IEludHJvZHVjdGlvbiB0byB0aGUgQ29kaW5nIEVudmlyb25tZW50CitDaGFwdGVyIDI6IFRoZSBMUEMgUHJvZ3JhbQorQ2hhcHRlciAzOiBMUEMgRGF0YSBUeXBlcworQ2hhcHRlciA0OiBGdW5jdGlvbnMKK0NoYXB0ZXIgNTogVGhlIEJhc2ljcyBvZiBJbmhlcml0YW5jZQorQ2hhcHRlciA2OiBWYXJpYWJsZSBIYW5kbGluZworQ2hhcHRlciA3OiBGbG93IENvbnRyb2wKK0NoYXB0ZXIgODogVGhlIERhdGEgVHlwZSBPYmplY3QKZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTL0ludHJvZHVjdGlvbiBiL2RvYy9LVVJTL0xQQy1LVVJTL0ludHJvZHVjdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTNjN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvSW50cm9kdWN0aW9uCkBAIC0wLDAgKzEsMTA2IEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQyBCYXNpY3MKKyAgICAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMyBhcHJpbCAxOTkzCisgCisgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UUk9EVUNUSU9OCisgICAgICAgICAgICAgICBUaGlzIG1hbnVhbCwgaG93IHRvIHVzZSBpdCwgYW5kIGl0cyB0ZXJtcworIAorSSBoYXZlIHNlZW4gYSBsb3Qgb2YgcmVxdWVzdHMgbGF0ZWx5IG9uIFVTRU5FVCBmb3IgTFBDIG1hbnVhbHMuICBJbiBhZGRpdGlvbiwKK3RoZSBpbW1vcnRhbHMgb24gbXkgbXVkIGhhdmUgYmVlbiB0ZWxsaW5nIGhvdyBnb29kIHRoZSBidWlsZGluZyBkb2N1bWVudGF0aW9uCitvZiBOaWdodG1hcmUgaXMsIGJ1dCB0aGF0IHRoZXJlIHdhcyBqdXN0IG5vIGFkZXF1YXRlIGV4cGxhbmF0aW9uIG9mIHRoZQorTFBDIHByb2dyYW1taW5nIGxhbmd1YWdlLiAgU28gSSBkZWNpZGVkIHRvIHRyeSBteSBoYW5kIGF0IHdyaXRpbmcgYSBtYW51YWwuCitTb21lIHRoaW5ncyB5b3Ugc2hvdWxkIGtlZXAgaW4gbWluZC4KK0xQQyBpcyBhIHZlcnkgZWFzeSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0byBsZWFybiwgYW5kIGl0IGhhcyByZWFsCit2YWx1ZSBpbiB0aGF0IHBsYWNlIG1vc3Qgb2YgdXMga25vdyBhcyB0aGUgcmVhbCB3b3JsZC4gIEkgYmVnYW4gcGxheWluZworbXVkcyBpbiAxOTkxLCBhbmQgaW4gdGhlIHNwYWNlIG9mIGEgbW9udGggY3JlYXRlZCBhbiB1bmltcHJlc3NpdmUgYXJlYQorYW5kIG11c2ljaWFuJ3MgZ3VpbGQgb24gdGhlIG9yaWdpbmFsIEJhdGVzIENvbGxlZ2UgTVVEIGNhbGxlZCBPcmxpdGguCitBZnRlciB0aGF0LCBJIG1vdmVkIHRvIExvcyBBbmdlbGVzIGZvciBhIHllYXIgYW5kIGhhZCBubyBjb250YWN0IHdpdGgKK211ZGRpbmcgb3IgY29tcHV0ZXJzLiAgSW4gSnVuZSBvZiAxOTkyLCBJIHdhcyBiYWNrIG9uIHRoZSBpbnRlcm5ldCBhbmQKK2Egd2l6YXJkIG9mIElnb3IuICBJbiBTZXB0ZW1iZXIgb2YgMTk5MiBJIGJlZ2FuIGNvZGluZyB0aGUgTmlnaHRtYXJlCittdWRsaWIgZm9yIG91ciB1c2UsIGFuZCB0aGVuIGxhdGVyIGRlY2lkZWQgdG8gZGlzdHJpYnV0ZSBpdCBkdWUgdG8gdGhlcmUKK25vdCBiZWluZyBhbnkgbXVkbGlicyBmb3IgTXVkT1MgYXQgdGhlIHRpbWUgdGhhdCBhIHBlcnNvbiBjb3VsZCBqdXN0IHRocm93Cit1cCBhIHJ1bm5pbmcgbXVkIHdpdGggKG5vdywgdGhhdCBvZiBjb3Vyc2UgaXMgbm90IHRoZSBjYXNlIDopKS4KK1NvLCBJIGhhdmUgYmVlbiBkb2luZyBzZXJpb3VzIGNvZGluZyBmb3IgbGVzcyB0aGFuIGEgeWVhci4gIEFzIGEKK1BoaWxvc29waHkgbWFqb3IgaW4gYSB3b3JsZCBvZiBDb21wdXRlciBTY2llbmNlIG1ham9ycywgSSBqdXN0IHdhbnQgdG8KK21ha2UgY2xlYXIgdGhhdCBpdCBpcyBub3QgYXQgYWxsIHJlcXVpcmVkIHRoYXQgeW91IGhhdmUgZXZlciBkb25lIGFueXRoaW5nCit3aXRoIHlvdXIgY29tcHV0ZXIgdGhhbiBsb2cgaW50byBhIG11ZCBpbiBvcmRlciBmb3IgeW91IHRvIHJlYWxseSBjb21lCit0byB1bmRlcnN0YW5kIExQQyBjb2RpbmcuICBUaGlzIG1hbnVhbCBtYWtlcyB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgorU29tZW9uZSBoYXMgdGF1Z2h0IHlvdSBiYXNpYyBVTklYIGNvbW1hbmRzIGxpa2UgbHMsIGNkLCBta2RpciwgbXYsIHJtLCBldGMuCitZb3Uga25vdyBob3cgdG8gZW50ZXIgeW91ciBtdWQncyBlZGl0b3IgYW5kIHdyaXRlIGEgZmlsZS4gIE5vIG90aGVyCithc3N1bXB0aW9ucyBhcmUgbWFkZS4gIElmIHlvdSBrbm93IEMsIHlvdSBhcmUgaGFuZGljYXBwZWQgaW4gdGhhdCBMUEMKK2xvb2tzIGEgbG90IGxpa2UgQywgYnV0IGl0IGlzIG5vdCBDLiAgWW91ciBwcmVjb25jZXB0aW9ucyBhYm91dAorbW9kdWxhciBwcm9ncmFtbWluZyBkZXZlbG9wbWVudCB3aWxsIGJlIGEgaGluZGVyZW5jZSB5b3Ugd2lsbCBoYXZlIHRvCitvdmVyY29tZS4gIElmIHlvdSBoYXZlIG5ldmVyIGhlYXJkIG9mIHRoZSBDIHByb2dyYW1taW5nIGxhbmd1YWdlIChsaWtlCittZSBpbiBNYXkgb2YgMTk5MSksIHRoZW4geW91IGFyZSBvbmx5IG1pc3NpbmcgYW4gdW5kZXJzdGFuZGluZyBvZiB0aGUKK3NpbXBsZSBjb25zdHJ1Y3RzIG9mIEMgbGlrZSB0aGUgZmxvdyBvZiBwcm9ncmFtIGV4ZWN1dGlvbiBhbmQgbG9naWNhbAorb3BlcmF0b3JzIGFuZCBzdWNoLiAgU28gYSBDIGd1cnUgaGFzIG5vIHJlYWwgYWR2YW50YWdlIG92ZXIgeW91LCBzaW5jZQord2hhdCB0aGV5IGtub3cgZnJvbSBDIHdoaWNoIGlzIGFwcGxpY2FibGUgdG8gTFBDIGlzIGVhc3kgdG8gcGljayB1cC4KK1RoZSBzdHVmZiB0aGV5IGtub3cgYWJvdXQgQyB3aGljaCBtYWtlcyB0aGVtIGEgZ3VydSBpcyBpcnJlbGV2YW50IHRvCitMUEMuCisgCitUaGUgY2hhcHRlcnMgb2YgdGhpcyBtYW51YWwgYXJlIG1lYW50IHRvIGJlIHJlYWQgaW4gb3JkZXIuICBTdGFydGluZyB3aXRoCit0aGUgaW50cm9kdWN0aW9uLCBnb2luZyBzZXF1ZW50aWFsbHkgdGhyb3VnaCB0aGUgY2hhcHRlciBudW1iZXJzIGFzCitvcmRlcmVkIGluIHRoZSBjb250ZW50cyBmaWxlLiAgRWFjaCBjaGFwdGVyIGJlZ2lucyB3aXRoIGEgcGFyYWdyYXBoIG9yCit0d28gZXhwbGFpbmluZyB3aGF0IHlvdSBzaG91bGQgaGF2ZSBjb21lIHRvIHVuZGVyc3RhbmQgYnkgdGhhdCBwb2ludAoraW4geW91ciBzdHVkaWVzLiAgQWZ0ZXIgdGhvc2UgaW50cm9kdWN0b3J5IHBhcmFncmFwaHMsIHRoZSBjaGFwdGVyIHRoZW4KK2JlZ2lucyB0byBkaXNjdXNzIGl0cyBzdWJqZWN0IG1hdHRlciBpbiBuYXVzZWF0aW5nIGRldGFpbC4gIEF0IHRoZSBlbmQKK29mIHRoZSBjaGFwdGVyIGlzIGEgYnJpZWZseSB3b3JkZWQgc3VtbWFyeSBvZiB3aGF0IHlvdSBzaG91bGQgdW5kZXJzdGFuZAorZnJvbSB0aGF0IGNoYXB0ZXIgaWYgSSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bC4gIEZvbGxvd2luZyB0aGF0IG1heSBvciBtYXkKK25vdCBiZSBzb21lIHNpZGVub3RlcyByZWxldmFudCB0byB0aGUgc3ViamVjdCBhdCBoYW5kLCBidXQgbm90IG5lY2Vzc2FyeQordG8gaXRzIHVuZGVyc3RhbmRpbmcuCisgCitJZiBhdCBhbnkgdGltZSB5b3UgZ2V0IHRvIGEgY2hhcHRlciBpbnRybywgYW5kIHlvdSBoYXZlIHJlYWQgdGhlIHByZWNlZWRpbmcKK2NoYXB0ZXJzIHRob3JvdWdobHkgYW5kIHlvdSBkbyBub3QgdW5kZXJzdGFuZCB3aGF0IGl0IHNheXMgeW91IHNob3VsZAordW5kZXJzdGFuZCBieSB0aGF0IHBvaW50LCBwbGVhc2UgbWFpbCBtZSEgIENsZWFybHksIEkgaGF2ZSBmYWlsZWQgYXQgdGhhdAorcG9pbnQgYW5kIEkgbmVlZCB0byBrbm93IHdoZXJlIGl0IGlzIEkgaGF2ZSBnb25lIHdyb25nIHNvIEkgY2FuIHJldmlzZQoraXQgcHJvcGVybHkuICBTaW1pbGFybHksIGlmIHlvdSBkbyBub3QgdW5kZXJzdGFuZCB3aGF0IHRoZSBjaGFwdGVyIHN1bW1hcnkKK3NheXMgeW91IHNob3VsZCwgcGxlYXNlIG1haWwgbWUuICBJZiB5b3VyIG11bXVkIGlzIG9uIHRoZSBNdWRPUyBpbnRlcm11ZAorc3lzdGVtLCBtYWlsIGRlc2NhcnRlc0BuaWdodG1hcmUuICBPdGhlcndpc2UgbWFpbCBib3JnQGhlYnJvbi5jb25uZWN0ZWQuY29tLgorIAorU29tZSBiYXNpYyB0ZXJtcyB0aGlzIG1hbnVhbCB1c2VzOgorZHJpdmVyLQorVGhpcyBpcyB0aGUgQyBwcm9ncmFtIHdoaWNoIGlzIHRoZSBnYW1lLiAgSXQgYWNjZXB0cyBpbmNvbWluZyBzb2NrZXRzCisobGlua3MgdG8gb3RoZXIgY29tcHV0ZXJzKSwgaW50ZXJwcmV0cyBMUEMgY29kZSBkZWZpbmVkIGJ5IHRoZSBtdWRsaWIsCitrZWVwcyBtdWQgb2JqZWN0cyBpbiBtZW1vcnksIG1ha2VzIHBlcmlvZGljIGF0dGVtcHRzIHRvIGNsZWFuIHVudXNlZAorbXVkIG9iamVjdHMgZnJvbSBtZW1vcnksIG1ha2VzIHBlcmlvZGljIGNhbGxzIHRvIG9iamVjdHMsIGFuZCBzbyBvbi4KKyAKK211ZGxpYi0KK0xQQyBjb2RlIHdoaWNoIGRlZmluZXMgdGhlIHdvcmxkIGluIHdoaWNoIHlvdSBhcmUgaW4uICBUaGUgZHJpdmVyIG9mIGl0c2VsZgoraXMgbm90IGEgZ2FtZS4gIEl0IGlzIGp1c3QgYSBwcm9ncmFtIHdoaWNoIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYQorbXVsdGktdXNlciBlbnZpcm9ubWVudC4gIEluIHNvbWUgc2Vuc2UsIHRoZSBkcml2ZXIgaXMgbGlrZSBhbiBMUEMKK2NvbXBpbGVyLCBhbmQgdGhlIG11ZGxpYiBpcyBsaWtlIGEgY29tcGlsZXIncyBsaWJyYXJ5IChhIHZlcnkgbG9vc2UKK2FuYWxvZ3kpLiAgVGhlIG11ZGxpYiBkZWZpbmVzIGJhc2ljIG9iamVjdHMgd2hpY2ggd2lsbCBsaWtlbHkgYmUgdXNlZAorb3ZlciBhbmQgb3ZlciBhZ2FpbiBieSBwZW9wbGUgY3JlYXRpbmcgaW4gdGhlIG11ZCB3b3JsZC4gIEV4YW1wbGVzIG9mCitzdWNoIG9iamVjdHMgYXJlIC9zdGQvcm9vbSAob3IgL3Jvb20vcm9vbSksIC9zdGQvdXNlci5jIChvciAvb2JqL3BsYXllci5jKSwKK2FuZCBzbyBvbi4KKyAKK2FyZWEgb3IgY2FzdGxlOgorU3BlY2lmaWMgY3JlYXRvciBjb2RlZCBvYmplY3RzIHdoaWNoIG9mdGVuIHVzZSBhIGZlYXR1cmUgb2YgTFBDIGNhbGxlZAoraW5oZXJpdGFuY2UgdG8gbWFrZSB1c2Ugb2YgdGhlIHByb3BlcnRpZXMgb2YgYmFzaWMgbXVkbGliIG9iamVjdHMgYW5kCit0dXJuIHRoZW0gaW50byBzcGVjaWZpYyBvYmplY3RzIHRvIGJlIHVzZWQgYnkgcGxheWVycyBpbiB0aGUgZ2FtZQorIAorb2JqZWN0OgorYSByb29tLCBhIHdlYXBvbiwgYSBtb25zdGVyLCBhIHBsYXllciwgYSBiYWcsIGV0Yy4gIE1vcmUgaW1wb3J0YW50bHksCitldmVyeSBpbmRpdmlkdWFsIGZpbGUgd2l0aCBhIC5jIGV4dGVuc2lvbiBpcyBhbiBvYmplY3QuICBPYmplY3RzIGFyZQordXNlZCBpbiBkaWZmZXJlbnQgd2F5cy4gIE9iamVjdHMgbGlrZSAvc3RkL2xpdmluZy5jIGFyZSBpbmhlcml0ZWQgYnkKK29iamVjdHMgbGlrZSBtb25zdGVyLmMgYW5kIHVzZXIuYy4gIE90aGVycyBhcmUgY2xvbmVkLCB3aGljaCBtZWFucyBhCitkdXBsaWNhdGUgb2YgdGhhdCBjb2RlIGlzIGxvYWRlZCBpbnRvIG1lbW9yeS4gIEFuZCBzdGlsbCBvdGhlcnMgYXJlCitzaW1wbHkgbG9hZGVkIGludG8gbWVtb3J5IHRvIGJlIHJlZmVyZW5jZWQgYnkgb3RoZXIgb2JqZWN0cy4KKyAKK25hdGl2ZSBhbmQgY29tcGF0OgordGhlc2UgdHdvIHRlcm1zIHJlZmVyIHRvIHR3byBwb3B1bGFyIGZsYXZvdXJzIG9mIGRyaXZlcnMuICBOYXRpdmUgbW9kZQorbXVkbGlicyBtYWtlIHVzZSBvZiBvbiB0aGUgZGVzaWduIG9mIExQTXVkIGRyaXZlciAzLjAgYW5kIGxhdGVyLiAgWW91IG1heQoraGF2ZSBhIDMuMCBkcml2ZXIgaG93ZXZlciwgYnV0IGhhdmUgYSAyLjQuNSBzdHlsZSBtdWRsaWIuICBUaGlzIGlzIHdoYXQKK2lzIG1lYW50IGJ5IGNvbXBhdCBtb2RlLiAgTXVkbGlicyB3aGljaCBhcmUgbmF0aXZlIG1vZGUgYXJlIGFueSBmb3IKK011ZE9TLCBDRCwgYW5kIExQTXVkIG11ZGxpYnMgdGhhdAorYXJlIGxpc3RlZCBhcyBuYXRpdmUuICBDb21wYXQgbXVkbGlicyBhcmUgYW55IExQTXVkIG11ZGxpYiBiZWZvcmUgMy4wIGFuZAordGhvc2Ugd2hpY2ggYXJlIDMuKiBjb21wYXQgbXVkbGlicy4gIEkgYmVsaWV2ZSBBbXlsYWFyJ3MgaXMgY29tcGF0LgorWyBOb3QgdHJ1ZSwgQW15bGFhciBzdXBwb3J0cyBuYXRpdmUgYW5kIGNvbXBhdCBtdWRsaWJzLCBNb3JnZW5HcmF1ZW4KKyAgaXMgbmF0aXZlIC0gQm9pbmcgXQorCitHb29kIEx1Y2shCitHZW9yZ2UgUmVlc2UKKyhEZXNjYXJ0ZXMgb2YgQm9yZykKKzEyIGp1bHkgMTk5MworYm9yZ0BoZWJyb24uY29ubmVjdGVkLmNvbQpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjEgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjIzM2QwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjEKQEAgLTAsMCArMSw5MCBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgZmlyc3QgZWRpdGlvbjogMjMgYXByaWwgMTk5MworICAgICAgICAgICAgICAgICAgc2Vjb25kIGVkaXRpb246IDI1IG1heSAxOTkzCisKK0NIQVBURVIgMTogSW50cm9kdWN0aW9uIHRvIHRoZSBDb2RpbmcgRW52aXJvbm1lbnQKKworMS4xIFVOSVggZmlsZSBzdHJ1Y3R1cmUKK0xQTXVkcyB1c2UgYmFzaWMgVU5JWCBjb21tYW5kcyBhbmQgaXRzIGZpbGUgc3RydWN0dXJlLiAgSWYgeW91IGtub3cKK1VOSVggY29tbWFuZHMgYWxyZWFkeSwgdGhlbiBub3RlICh3aXRoIGEgZmV3IGV4Y2VwdGlvbnMpIG9wdGlvbnMgYXJlCitub3QgYXZhaWxhYmxlIHRvIHRoZSBjb21tYW5kcy4gIExpa2UgRE9TLCBVTklYIGlzIGhlaXJhcmNoaWNhbC4gIFRoZQorcm9vdCBkaXJlY3Rvcnkgb2Ygd2hpY2ggYWxsIGRpcmVjdG9yaWVzIGFyZSBzdWItZGlyZWN0b3JpZXMgaXMgY2FsbGVkCityb290KC8pLiAgQW5kIGZyb20gdGhvc2Ugc3ViLWRpcmVjdG9yaWVzIHlvdSBtYXkgaGF2ZSBmdXJ0aGVyCitzdWItZGlyZWN0b3JpZXMuICBBIGRpcmVjdG9yeSBtYXkgYmUgcmVmZXJyZWQgdG8gaW4gdHdvIGRpZmZlcmVudCB3YXlzOgorMSkgYnkgaXRzIGZ1bGwgbmFtZSwgb3IgYWJzb2x1dGUgbmFtZSwgb3IgMikgYnkgaXRzIHJlbGF0aXZlIG5hbWUuCitBYnNvbHV0ZSBuYW1lIHJlZmVycyB0byB0aGUgZGlyZWN0b3J5J3MgZnVsbCBwYXRoIHN0YXJ0aW5nIGZyb20gLyB3aW5kaW5nCitkb3duIHRoZSBkaXJlY3RvcnkgdHJlZSB1bnRpbCB5b3UgbmFtZSB0aGUgZGlyZWN0b3J5IGluIHF1ZXN0aW9uLiAgRm9yCitleGFtcGxlOgorCisgICAgL3BsYXllcnMvZGVzY2FydGVzL29iai9tb25zdGVyCisKK3JlZmVycyB0byB0aGUgZGlyZWN0b3J5IG1vbnN0ZXIgd2hpY2ggaXMgYSBzdWItZGlyZWN0b3J5IG9mIG9iaiB3aGljaAoraXMgYSBzdWItZGlyZWN0b3J5IG9mIGRlc2NhcnRlcyB3aGljaCBpcyBhIHN1Yi1kaXJlY3Rvcnkgb2YgcGxheWVycword2hpY2ggaXMgYSBzdWRpcmVjdG9yeSBvZiAvLgorCitUaGUgcmVsYXRpdmUgbmFtZSByZWZlcnMgdG8gdGhlIG5hbWUgcmVsYXRpdmUgdG8gYW5vdGhlciBkaXJlY3RvcnkuCitUaGUgYWJvdmUgZXhhbXBsZSBpcyBjYWxsZWQgbW9uc3RlciByZWxhdGl2ZSB0byAvcGxheWVycy9kZXNjYXJ0ZXMvb2JqLAorYnV0IGl0IGlzIGFsc28gY2FsbGVkIG9iai9tb25zdGVyIHJlbGF0aXZlIHRvIC9wbGF5ZXJzL2Rlc2NhcnRlcywKK2Rlc2NhcnRlcy9vYmovbW9uc3RlciByZWxhdGl2ZSB0byAvcGxheWVycywgYW5kIGZpbmFsbHkKK3BsYXllcnMvZGVzY2FydGVzL29iai9tb25zdGVyIHJlbGF0aXZlIHRvIC8uICBZb3UgY2FuIHRlbGwgdGhlCitkaWZmZXJlbmNlIGJldHdlZW4gYWJzb2x1dGUgbmFtZXMgYW5kIHJlbGF0aXZlIG5hbWVzIGJlY2F1c2UgYWJzb2x1dGUKK25hbWVzIGFsd2F5cyBzdGFydCB3aXRoIC8uICBJbiBvcmRlciB0byBrbm93IGV4YWN0bHkgd2hpY2ggZGlyZWN0b3J5CitpcyBiZWluZyBuYW1lZCBieSBhIHJlbGF0aXZlIG5hbWUsIHlvdSBuYXR1cmFsbHkgbXVzdCBrbm93IHdoYXQKK2RpcmVjdG9yeSBpdCBpcyByZWxhdGl2ZSB0by4KKworQSBkaXJlY3RvcnkgY29udGFpbnMgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcy4gIExQTXVkcyBvbmx5IHVzZSB0ZXh0IGZpbGVzCitpbnNpZGUgdGhlIG11ZGxpYi4gIExpa2UgZGlyZWN0b3JpZXMsIGZpbGVzIGhhdmUgYm90aCBhYnNvbHV0ZSBhbmQKK3JlbGF0aXZlIG5hbWVzLiAgVGhlIG1vc3QgYmFzaWMgcmVsYXRpdmUgbmFtZSBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgZmlsZQorbmFtZSwgd2l0aCB0aGUgcmVzdCBvZiB0aGUgYWJzb2x1dGUgbmFtZSBiZWluZyByZWZlcnJlZCB0byBhcyB0aGUgcGF0aC4gIFNvLAorZm9yIHRoZSBmaWxlOiAvcGxheWVycy9kZXNjYXJ0ZXMvY2FzdGxlLmMsIGNhc3RsZS5jIGlzIHRoZSBmaWxlIG5hbWUsIGFuZAorL3BsYXllcnMvZGVzY2FydGVzIGlzIHRoZSBwYXRoLgorCitPbiBzb21lIG11ZHMsIGEgZmlsZSB3aXRoIGEgZmlsZSBuYW1lIGJlZ2lubmluZyB3aXRoIGEgLiAobGlrZSAucGxhbikgaXMKK25vdCB2aXNpYmxlIHdoZW4geW91IGxpc3QgZmlsZXMgd2l0aCB0aGUgcmVndWxhciBmaWxlIGxpc3RpbmcgY29tbWFuZC4KKworMS4yIFVOSVggQ29tbWFuZHMKK0Fsb25nIHdpdGggdGhlIFVOSVggZmlsZSBzdHJ1Y3R1cmUsIExQTXVkcyB1c2UgbWFueSBVTklYIGNvbW1hbmRzLiAgVHlwaWNhbAorVU5JWCBjb21tYW5kcyBvbiBtb3N0IG11ZHMgYXJlOgorcHdkLCBjZCwgbHMsIHJtLCBtdiwgY3AsIG1rZGlyLCBybWRpciwgbW9yZSwgaGVhZCwgY2F0LCBlZAorSWYgeW91IGhhdmUgbmV2ZXIgYmVmb3JlIHNlZW4gVU5JWCBjb21tYW5kcywgeW91IHByb2JhYmx5IGFyZSB0aGlua2luZyB0aGlzCitpcyBhbGwgbm9uc2Vuc2UuICBXZWxsLCBpdCBpcywgYnV0IHlvdSBnb3QgdG8gdXNlIHRoZW0uICBCZWZvcmUgZ2V0dGluZworaW50byB3aGF0IHRoZXkgbWVhbiB0aG91Z2gsIGZpcnN0IGEgZGlzY3Vzc2lvbiBvZiBjdXJyZW50IGRpcmVjdG9yeS4KK0lmIHlvdSBrbm93IERPUywgdGhlbiB5b3Uga25vdyB3aGF0IGEgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcy4KK0F0IGFueSBnaXZlbiBwb2ludCwgeW91IGFyZSBjb25zaWRlcmVkIHRvIGJlICJpbiIgc29tZSBkaXJlY3RvcnkuICBUaGlzCittZWFucyB0aGF0IGFueSByZWxhdGl2ZSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcyB5b3UgZ2l2ZSBpbiBVTklYIGNvbW1hbmRzCithcmUgcmVsYXRpdmUgdG8gdGhhdCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSwgaWYgbXkgY3VycmVudCBkaXJlY3RvcnkgaXMKKy9wbGF5ZXJzL2Rlc2NhcnRlcyBhbmQgSSB0eXBlICJlZCBjYXN0bGUuYyIgKGVkIGlzIHRoZSBjb21tYW5kIHRvIGVkaXQpLAordGhlbiBpdCBhc3N1bWVzIEkgbWVhbiB0aGUgZmlsZSAvcGxheWVycy9kZXNjYXJ0ZXMvY2FzdGxlLmMKKworcHdkOiBzaG93cyB5b3UgeW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CitjZDogY2hhbmdlcyB5b3VyIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBZb3UgbWF5IGdpdmUgZWl0aGVyIHJlbGF0aXZlCisgICAgb3IgYWJzb2x1dGUgcGF0aCBuYW1lcy4gIFdpdGggbm8gYXJndW1lbnRzLCBpdCBjaGFuZ2VzIHRvIHlvdXIgaG9tZQorICAgIGRpcmVjdG9yeS4KK2xzOiBsaXN0cyBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBuYW1lZC4gIElmIG5vIGRpcmVjdG9yeSBpcyBuYW1lZCwKKyAgICBpdCBsaXN0cyB0aGUgZmlsZXMgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKK3JtOiBkZWxldGVzIHRoZSBmaWxlIG5hbWVkCittdjogcmVuYW1lcyB0aGUgZmlsZSBuYW1lZAorY3A6IGNvcGllcyB0aGUgZmlsZSBuYW1lZAorbWtkaXI6IG1ha2VzIGEgbmV3IGRpcmVjdG9yeQorcm1kaXI6IGRlbGV0ZXMgYSBkaXJlY3RvcnkuICBBbGwgZmlsZXMgbXVzdCBoYXZlIGJlZW4gZmlyc3QgcmVtb3ZlZC4KK21vcmU6IHBhZ2VzIHRoZSBmaWxlIG5hbWVkIHNvIHRoYXQgdGhlIGZpbGUgYXBwZWFycyBvbiB5b3VyIHNjcmVlbiBvbmUKKyAgICBwYWdlIGF0IGEgdGltZS4KK2NhdDogc2hvd3MgdGhlIHdob2xlIGZpbGUgdG8geW91IGF0IG9uY2UKK2hlYWQ6IHNob3dzIHlvdSB0aGUgZmlyc3Qgc2V2ZXJhbCBsaW5lcyBvZiBhIGZpbGUKK3RhaWw6IHNob3dzIHlvdSB0aGUgbGFzdCBzZXZlcmFsIGxpbmVzIG9mIGEgZmlsZQorZWQ6IGFsbG93cyB5b3UgdG8gZWRpdCBhIGZpbGUgdXNpbmcgdGhlIG11ZCBlZGl0b3IKKworMS4zIENoYXB0ZXIgU3VtbWFyeQorVU5JWCB1c2VzIGEgaGVpcmFyY2hpY2FsIGZpbGUgc3RydWN0dXJlIHdpdGggdGhlIHJvb3Qgb2YgdGhlIHRyZWUgYmVpbmcKK25hbWVkIC8uICBPdGhlciBkaXJlY3RvcmllcyBicmFuY2ggb2ZmIGZyb20gdGhhdCByb290IGRpcmVjdG9yeSBhbmQKK2luIHR1cm4gaGF2ZSB0aGVpciBvd24gc3ViLWRpcmVjdG9yaWVzLiAgQWxsIGRpcmVjdG9yaWVzIG1heSBjb250YWluCitkaXJlY3RvcmllcyBhbmQgZmlsZXMuICBEaXJlY3RvcmllcyBhbmQgZmlsZXMgYXJlIHJlZmVycmVkIHRvIGVpdGhlcgorYnkgdGhlaXIgYWJzb2x1dGUgbmFtZSwgd2hpY2ggYWx3YXlzIGJlZ2lucyB3aXRoIC8sIG9yIGJ5IHRoZWlyIHJlbGF0aXZlCituYW1lIHdoaWNoIGdpdmVzIHRoZSBmaWxlJ3MgbmFtZSByZWxhdGl2ZSB0byBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5LgorSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCBpbiB0aGUgVU5JWCBmaWxlcyBzdHJ1Y3R1cmUsIHlvdSBoYXZlIHRoZQordHlwaWNhbCBVTklYIGNvbW1hbmRzIGZvciBsaXN0aW5nIGZpbGVzLCB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5LCBldGMuCitPbiB5b3VyIG11ZCwgYWxsIG9mIHRoZSBhYm92ZSBjb21tYW5kcyBzaG91bGQgaGF2ZSBkZXRhaWxlZCBoZWxwIGNvbW1hbmRzCit0byBoZWxwIHlvdSBleHBsb3JlIGV4YWN0bHkgd2hhdCB0aGV5IGRvLiAgSW4gYWRkaXRpb24sIHRoZXJlIHNob3VsZAorYmUgYSB2ZXJ5IGRldGFpbGVkIGZpbGUgb24geW91ciBtdWQncyBlZGl0b3IuICBJZiB5b3UgYXJlIHVuZmFtaWxpYXIKK3dpdGggZWQsIHlvdSBzaG91bGQgZ28gb3ZlciB0aGlzIGNvbnZvbHV0ZWQgZmlsZS4KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXIyIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhZDU2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXIyCkBAIC0wLDAgKzEsMTk1IEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEMgQmFzaWNzCisgICAgICAgICAgICAgICAgICBXcml0dGVuIGJ5IERlc2NhcnRlcyBvZiBCb3JnCisgICAgICAgICAgICAgICAgICBmaXJzdCBlZGl0aW9uOiAyMyBhcHJpbCAxOTkzCisgICAgICAgICAgICAgICAgICBzZWNvbmQgZWRpdGlvbjogMTYganVuZSAxOTkzCisKK0NIQVBURVIgMjogVGhlIExQQyBQcm9ncmFtCisKKzIuMSBBYm91dCBwcm9ncmFtcworVGhlIHRpdGxlIG9mIHRoaXMgY2hhcHRlciBvZiB0aGUgdGV4dGJvb2sgaXMgYWN0dWFsbHkgcG9vcmx5IG5hbWVkLCBzaW5jZQorb25lIGRvZXMgbm90IHdyaXRlIHByb2dyYW1zIGluIExQQy4gIEFuIExQQyBjb2RlciBpbnN0ZWFkIHdyaXRlcyAqb2JqZWN0cyouCitXaGF0IGlzIHRoZSBkaWZmZXJlbmNlPyAgV2VsbCwgZm9yIG91ciBwdXJwb3NlcyBub3csIHRoZSBkaWZmZXJlbmNlIGlzCitpbiB0aGUgd2F5IHRoZSBmaWxlIGlzIGV4ZWN1dGVkLiAgV2hlbiB5b3UgInJ1biIgYSBwcm9ncmFtLCBleGVjdXRpb24KK2JlZ2lucyBhdCBhIGRlZmluaXRlIHBsYWNlIGluIHRoZSBwcm9ncmFtLiAgSW4gb3RoZXIgd29yZHMsIHRoZXJlCitpcyBhIHBsYWNlIGluIGFsbCBwcm9ncmFtcyB0aGF0IGlzIG5vdGVkIGFzIHRoZSBiZWdpbm5pbmcgd2hlcmUgcHJvZ3JhbQorZXhlY3V0aW9uIHN0YXJ0cy4gIEluIGFkZGl0aW9uLCBwcm9ncmFtcyBoYXZlIGRlZmluaXRlIGVuZCBwb2ludHMsCitzbyB0aGF0IHdoZW4gZXhlY3V0aW9uIHJlYWNoZXMgdGhhdCBwb2ludCwgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbQordGVybWluYXRlcy4gIFNvLCBpbiBzaG9ydCwgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbSBydW5zIGZyb20gYSBkZWZpbml0ZQorYmVnaW5uaW5nIHBvaW50IHRocm91Z2ggdG8gYSBkZWZpbml0ZSBlbmQgcG9pbnQuICBUaGlzIGlzIG5vdCBzbyB3aXRoCitMUEMgb2JqZWN0cy4KKworV2l0aCBtdWRzLCBMUEMgb2JqZWN0cyBhcmUgc2ltcGx5IGRpc3RpbmN0IHBhcnRzIG9mIHRoZSBDIHByb2dyYW0gd2hpY2gKK2lzIHJ1bm5pbmcgdGhlIGdhbWUgKHRoZSBkcml2ZXIpLiAgSW4gb3RoZXIgd29yZHMsIGV4ZWN1dGlvbiBvZiB0aGUgbXVkCitwcm9ncmFtIGJlZ2lucyBhbmQgZW5kcyBpbiB0aGUgZHJpdmVyLiAgQnV0IHRoZSBkcml2ZXIgaW4gZmFjdCBkb2VzCit2ZXJ5IGxpdHRsZSBpbiB0aGUgd2F5IG9mIGNyZWF0aW5nIHRoZSB3b3JsZCB5b3Uga25vdyB3aGVuIHlvdSBwbGF5CithIG11ZC4gIEluc3RlYWQsIHRoZSBkcml2ZXIgcmVsaWVzIGhlYXZpbHkgb24gdGhlIGNvZGUgY3JlYXRlZCBpbiBMUEMsCitleGVjdXRpbmcgbGluZXMgb2YgdGhlIG9iamVjdHMgaW4gdGhlIG11ZCBhcyBuZWVkZWQuICBMUEMgb2JqZWN0cyB0aHVzCitoYXZlIG5vIHBsYWNlIHRoYXQgaXMgbmVjZXNzYXJpbHkgdGhlIGJlZ2lubmluZyBwb2ludCwgbm9yIGRvIHRoZXkKK2hhdmUgYSBkZWZpbml0ZSBlbmRpbmcgcG9pbnQuCisKK0xpa2Ugb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBhbiBMUEMgInByb2dyYW0iIG1heSBiZSBtYWRlIHVwIG9mCitvbmUgb3IgbW9yZSBmaWxlcy4gIEZvciBhbiBMUEMgb2JqZWN0IHRvIGdldCBleGVjdXRlZCwgaXQgc2ltcGxlCituZWVkcyB0byBiZSBsb2FkZWQgaW50byB0aGUgZHJpdmVyJ3MgbWVtb3J5LiAgVGhlIGRyaXZlciB3aWxsIGNhbGwgbGluZXMKK2Zyb20gdGhlIG9iamVjdCBhcyBpdCBuZWVkcyBhY2NvcmRpbmcgdG8gYSBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZQorZGVmaW5lZCB0aHJvdWdob3V0IHRoaXMgdGV4dGJvb2suICBUaGUgaW1wb3J0YW50IHRoaW5nIHlvdSBuZWVkIHRvCit1bmRlcnN0YW5kIGF0IHRoaXMgcG9pbnQgaXMgdGhhdCB0aGVyZSBpcyBubyAiYmVnaW5uaW5nIiB0byBhbiBMUEMKK29iamVjdCBpbiB0ZXJtcyBvZiBleGVjdXRpb24sIGFuZCB0aGVyZSBpcyBubyAiZW5kIi4KKworMi4yIERyaXZlci1tdWRsaWIgaW50ZXJhY3Rpb24KK0FzIEkgaGF2ZSBtZW50aW9uZWQgZWFybGllciwgdGhlIGRyaXZlciBpcyB0aGUgQyBwcm9ncmFtIHRoYXQgcnVucyBvbgordGhlIGhvc3QgbWFjaGluZS4gIEl0IGNvbm5lY3RzIHlvdSBpbnRvIHRoZSBnYW1lIGFuZCBwcm9jZXNzZXMgTFBDIGNvZGUuCitOb3RlIHRoYXQgdGhpcyBpcyBvbmUgdGhlb3J5IG9mIG11ZCBwcm9ncmFtbWluZywgYW5kIG5vdCBuZWNlc3NhcmlseQorYmV0dGVyIHRoYW4gb3RoZXJzLiAgSXQgY291bGQgYmUgdGhhdCB0aGUgZW50aXJlIGdhbWUgaXMgd3JpdHRlbiBpbiBDLgorU3VjaCBhIGdhbWUgd291bGQgYmUgbXVjaCBmYXN0ZXIsIGJ1dCBpdCB3b3VsZCBiZSBsZXNzIGZsZXhpYmxlIGluCit0aGF0IHdpemFyZHMgY291bGQgbm90IGFkZCB0aGluZ3MgdG8gdGhlIGdhbWUgd2hpbGUgaXQgd2FzIHJ1bm5pbmcuIFRoaXMKK2lzIHRoZSB0aGVvcnkgYmVoaW5kIERpa3VNVURzLiAgSW5zdGVhZCwgTFBNVURzIHJ1biBvbiB0aGUgdGhlb3J5IHRoYXQKK3RoZSBkcml2ZXIgc2hvdWxkIGluIG5vIGRlZmluZSB0aGUgbmF0dXJlIG9mIHRoZSBnYW1lLCB0aGF0IHRoZSBuYXR1cmUKK29mIHRoZSBnYW1lIGlzIHRvIGJlIGRlY2lkZWQgYnkgdGhlIGluZGl2aWR1YWxzIGludm9sdmVkLCBhbmQgdGhhdAoreW91IHNob3VsZCBiZSBhYmxlIHRvIGFkZCB0byB0aGUgZ2FtZSAqYXMgaXQgaXMgYmVpbmcgcGxheWVkKi4gIFRoaXMKK2lzIHdoeSBMUE1VRHMgbWFrZSB1c2Ugb2YgdGhlIExQQyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIEl0IGFsbG93cworeW91IHRvIGRlZmluZSB0aGUgbmF0dXJlIG9mIHRoZSBnYW1lIGluIExQQyBmb3IgdGhlIGRyaXZlciB0byByZWFkIGFuZAorZXhlY3V0ZSBhcyBuZWVkZWQuICBJdCBpcyBhbHNvIGEgbXVjaCBzaW1wbGVyIGxhbmd1YWdlIHRvIHVuZGVyc3RhbmQKK3RoYW4gQywgdGh1cyBtYWtpbmcgdGhlIHByb2Nlc3Mgb2Ygd29ybGQgY3JlYXRpb24gb3BlbiB0byBhIGdyZWF0ZXIKK251bWJlciBvZiBwZW9wbGUuCisKK09uY2UgeW91IGhhdmUgd3JpdHRlbiBhIGZpbGUgaW4gTFBDIChhc3N1bWluZyBpdCBpcyBjb3JyZW50IExQQyApLCBpdCBqdXN0cworc2l0cyB0aGVyZSBvbiB0aGUgaG9zdCBtYWNoaW5lJ3MgaGFyZCBkcml2ZSB1bnRpbCBzb21ldGhpbmcgaW4gdGhlIGdhbWUKK21ha2VzIHJlZmVyZW5jZSB0byBpdC4gIFdoZW4gc29tZXRoaW5nIGluIHRoZSBnYW1lIGZpbmFsbHkgZG9lcyBtYWtlCityZWZlcmVuY2UgdG8gdGhlIG9iamVjdCwgYSBjb3B5IG9mIHRoZSBmaWxlIGlzIGxvYWRlZCBpbnRvIG1lbW9yeSBhbmQKK2Egc3BlY2lhbCAqZnVuY3Rpb24qIG9mIHRoYXQgb2JqZWN0IGlzIGNhbGxlZCBpbiBvcmRlciB0byBpbml0aWFsaXplCit0aGUgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIG9iamVjdC4gIE5vdywgZG8gbm90IGJlIGNvbmNlcm5lZAoraWYgdGhhdCBsYXN0IHNlbnRlbmNlIHdlbnQgcmlnaHQgb3ZlciB5b3VyIGhlYWQsIHNpbmNlIHNvbWVvbmUgYnJhbmQKK25ldyB0byBwcm9ncmFtbWluZyB3b3VsZCBub3Qga25vdyB3aGF0IHRoZSBoZWxsIGEgZnVuY3Rpb24gb3IgYSB2YXJpYWJsZQoraXMuICBUaGUgaW1wb3J0YW50IHRoaW5nIHRvIHVuZGVyc3RhbmQgcmlnaHQgbm93IGlzIHRoYXQgYSBjb3B5IG9mIHRoZQorb2JqZWN0IGZpbGUgaXMgdGFrZW4gYnkgdGhlIGRyaXZlciBmcm9tIHRoZSBtYWNoaW5lJ3MgaGFyZCBkcml2ZSBhbmQKK3N0b3JlZCBpbnRvIG1lbW9yeSAoc2luY2UgaXQgaXMgYSBjb3B5LCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGF0CitvYmplY3QgbWF5IGV4aXN0KS4gIFlvdSB3aWxsIGxhdGVyIHVuZGVyc3RhbmQgd2hhdCBhIGZ1bmN0aW9uIGlzLCB3aGF0CithIHZhcmlhYmxlIGlzLCBhbmQgZXhhY3RseSBob3cgaXQgaXMgc29tZXRoaW5nIGluIHRoZSBnYW1lIG1hZGUgcmVmZXJlbmNlCit0byB5b3VyIG9iamVjdC4KKworMi4zIExvYWRpbmcgYW4gb2JqZWN0IGludG8gbWVtb3J5CitBbHRob3VnaCB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIHBsYWNlIGluIGFuIG9iamVjdCBjb2RlIHRoYXQgbXVzdCBleGlzdAoraW4gb3JkZXIgZm9yIHRoZSBkcml2ZXIgdG8gYmVnaW4gZXhlY3V0aW5nIGl0LCB0aGVyZSBpcyBhIHBsYWNlIGZvciB3aGljaAordGhlIGRyaXZlciB3aWxsIHNlYXJjaCBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoZSBvYmplY3QuICBPbiBjb21wYXQgCitkcml2ZXJzLCBpdCBpcyB0aGUgZnVuY3Rpb24gY2FsbGVkIHJlc2V0KCkuICBPbiBuYXRpdmUgbXVkcyBpdCBpcyB0aGUKK2Z1bmN0aW9uIGNhbGxlZCBjcmVhdGUoKS4gWyBNb3JnZW5HcmF1ZW4gaXMgbmF0aXZlIC0gQm9pbmcgXQorCitMUEMgb2JqZWN0cyBhcmUgbWFkZSB1cCBvZiB2YXJpYWJsZXMgKHZhbHVlcyB3aGljaCBjYW4gY2hhbmdlKSBhbmQKK2Z1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCB0byBtYW5pcHVsYXRlIHRob3NlIHZhcmlhYmxlcy4gIEZ1bmN0aW9ucworbWFuaXB1bGF0ZSB2YXJpYWJsZXMgdGhyb3VnaCB0aGUgdXNlIG9mIExQQyBncmFtbWF0aWNhbCBzdHJ1Y3R1cmVzLAord2hpY2ggaW5jbHVkZSBjYWxsaW5nIG90aGVyIGZ1bmN0aW9ucywgdXNpbmcgZXh0ZXJuYWxseSBkZWZpbmVkCitmdW5jdGlvbnMgKGVmdW5zKSwgYW5kIGJhc2ljIExQQyBleHByZXNzaW9ucyBhbmQgZmxvdyBjb250cm9sIAorbWVjaGFuaXNtcy4KKworRG9lcyB0aGF0IHNvdW5kIGNvbnZvbHV0ZWQ/ICBGaXJzdCBsZXRzIHN0YXJ0IHdpdGggYSB2YXJpYWJsZS4gIEEKK3ZhcmlhYmxlIG1pZ2h0IGJlIHNvbWV0aGluZyBsaWtlOiBsZXZlbC4gIEl0IGNhbiAidmFyeSIgZnJvbSBzaXRhdGlvbgordG8gc2l0dWF0aW9uIGluIHZhbHVlLCBhbmQgZGlmZmVyZW50IHRoaW5ncyB1c2UgdGhlIHZhbHVlIG9mIHRoZSBwbGF5ZXIncworbGV2ZWwgdG8gbWFrZSBkaWZmZXJlbnQgdGhpbmdzIGhhcHBlbi4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGFyZSBhCitsZXZlbCAxOSBwbGF5ZXIsIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgbGV2ZWwgd2lsbCBiZSAxOS4gIE5vdworaWYgeW91ciBtdWQgaXMgb24gdGhlIG9sZCBMUE11ZCAyLjQuNSBzeXN0ZW0gd2hlcmUgbGV2ZWxzIDEtMTkgYXJlCitwbGF5ZXJzIGFuZCAyMCsgYXJlIHdpemFyZHMsIHRoaW5ncyBjYW4gYXNrIGZvciB5b3VyIGxldmVsIHZhbHVlIHRvCitzZWUgaWYgeW91IGNhbiBwZXJmb3JtIHdpemFyZCB0eXBlIGFjdGlvbnMuICBCYXNpY2FsbHksIGVhY2ggb2JqZWN0CitpbiBMUEMgaXMgYSBwaWxlIG9mIHZhcmlhYmxlcyB3aXRoIHZhbHVlcyB3aGljaCBjaGFuZ2Ugb3ZlciB0aW1lLgorVGhpbmdzIGhhcHBlbiB0byB0aGVzZSBvYmplY3RzIGJhc2VkIG9uIHdoYXQgdmFsdWVzIGl0cyB2YXJpYWJsZXMKK2hvbGQuICBPZnRlbiwgdGhlbiB0aGluZ3MgdGhhdCBoYXBwZW4gY2F1c2UgdGhlIHZhcmlhYmxlcyB0byBjaGFuZ2UuCisKK1NvLCB3aGVuZXZlciBhbiBvYmplY3QgaW4gTFBDIGlzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBvYmplY3QgY3VycmVudGx5CitpbiBtZW1vcnksIHRoZSBkcml2ZXIgc2VhcmNoZXMgdG8gc2VlIHdoYXQgcGxhY2VzIGZvciB2YWx1ZXMgdGhlCitvYmplY3QgaGFzIChidXQgdGhleSBoYXZlIG5vIHZhbHVlcyB5ZXQpLiAgT25jZSB0aGF0IGlzIGRvbmUsIHRoZSBkcml2ZXIKK2NhbGxzIGEgZnVuY3Rpb24gaW4gdGhlIG9iamVjdCBjYWxsZWQgcmVzZXQoKSBvciBjcmVhdGUoKSAoZGVwZW5kaW5nCitvbiB5b3VyIGRyaXZlcikgd2hpY2ggd2lsbCBzZXQgdXAgdGhlIHN0YXJ0aW5nIHZhbHVlcyBmb3IgdGhlIG9iamVjdCdzCit2YXJpYWJsZXMuICBJdCBpcyB0aHVzIHRocm91Z2ggKmNhbGxzKiB0byAqZnVuY3Rpb25zKiB0aGF0IHZhcmlhYmxlCit2YWx1ZXMgZ2V0IG1hbmlwdWxhdGVkLgorCitCdXQgY3JlYXRlKCkgb3IgcmVzZXQoKSBpcyBOT1QgdGhlIHN0YXJ0aW5nIHBsYWNlIG9mIExQQyBjb2RlLCBhbHRob3VnaAoraXQgaXMgd2hlcmUgbW9zdCBMUEMgY29kZSBleGVjdXRpb24gZG9lcyBiZWdpbi4gIFRoZSBmYWN0IGlzLCB0aG9zZQorZnVuY3Rpb25zIG5lZWQgbm90IGV4aXN0LiAgSWYgeW91ciBvYmplY3QgZG9lcyBqdXN0IGZpbmUgd2l0aCBpdHMKK3N0YXJ0aW5nIHZhbHVlcyBhbGwgYmVpbmcgTlVMTCBwb2ludGVycyAobWVhbmluZywgZm9yIG91ciBwdXJwb3NlcworaGVyZSwgMCksIHRoZW4geW91IGRvIG5vdCBuZWVkIGEgY3JlYXRlKCkgb3IgcmVzZXQoKSBmdW5jdGlvbi4gIFRodXMKK3RoZSBmaXJzdCBiaXQgb2YgZXhlY3V0aW9uIG9mIHRoZSBvYmplY3QncyBjb2RlIG1heSBiZWdpbiBzb21ld2hlcmUKK2NvbXBsZXRlbHkgZGlmZmVyZW50LgorCitOb3cgd2UgZ2V0IHRvIHdoYXQgdGhpcyBjaGFwdGVyIGlzIGFsbCBhYm91dC4gIFRoZSBxdWVzdGlvbjogV2hhdAorY29uc2lzdHMgYSBjb21wbGV0ZSBMUEMgb2JqZWN0PyAgV2VsbCwgYW4gTFBDIG9iamVjdCBpcyBzaW1wbHkKK29uZSBvciBtb3JlIGZ1bmN0aW9ucyBncm91cGVkIHRvZ2V0aGVyIG1hbmlwdWxhdGluZyAwIG9yIG1vcmUKK3ZhcmlhYmxlcy4gIFRoZSBvcmRlciBpbiB3aGljaCBmdW5jdGlvbnMgYXJlIHBsYWNlZCBpbiBhbiBvYmplY3QKK3JlbGF0aXZlIHRvIG9uZSBhbm90aGVyIGlzIGlycmVsZXZhbnQuICBJbiBvdGhlciB3b3JkczoKKworLS0tLS0KK3ZvaWQgaW5pdCgpIHsgYWRkX2FjdGlvbigic21pbGUiLCAic21pbGUiKTsgfQorCit2b2lkIGNyZWF0ZSgpIHsgcmV0dXJuOyB9CisKK2ludCBzbWlsZShzdHJpbmcgc3RyKSB7IHJldHVybiAwOyB9CistLS0tLQorCitpcyBleGFjdGx5IHRoZSBzYW1lIGFzOgorCistLS0tLQordm9pZCBjcmVhdGUoKSB7IHJldHVybjsgfQorCitpbnQgc21pbGUoc3RyaW5nIHN0cikgeyByZXR1cm4gMDsgfQorCit2b2lkIGluaXQoKSB7IGFkZF9hY3Rpb24oInNtaWxlIiwgInNtaWxlIik7IH0KK19fX19fCisKK0Fsc28gaW1wb3J0YW50IHRvIG5vdGUsIHRoZSBvYmplY3QgY29udGFpbmluZyBvbmx5OgorCistLS0tLQordm9pZCBub25zZW5zZSgpIHt9CistLS0tLQorCitpcyBhIHZhbGlkLCBidXQgdHJpdmlhbCBvYmplY3QsIGFsdGhvdWdoIGl0IHByb2JhYmx5IHdvdWxkIG5vdCBpbnRlcmFjdAorcHJvcGVybHkgd2l0aCBvdGhlciBvYmplY3RzIG9uIHlvdXIgbXVkIHNpbmNlIHN1Y2ggYW4gb2JqZWN0IGhhcyBubword2VpZ2h0LCBpcyBpbnZpc2libGUsIGV0Yy4uCisKKzIuNCBDaGFwdGVyIHN1bW1hcnkKK0xQQyBjb2RlIGhhcyBubyBiZWdpbm5pbmcgcG9pbnQgb3IgZW5kaW5nIHBvaW50LCBzaW5jZSBMUEMgY29kZSBpcyB1c2VkCit0byBjcmVhdGUgb2JqZWN0cyB0byBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgcHJvZ3JhbSByYXRoZXIgdGhhbiBjcmVhdGUKK2luZGl2aWR1YWwgcHJvZ3JhbXMuICBMUEMgb2JqZWN0cyBjb25zaXN0IG9mIG9uZSBvciBtb3JlIGZ1bmN0aW9ucyB3aG9zZQorb3JkZXIgaW4gdGhlIGNvZGUgaXMgaXJyZWxldmFudCwgYXMgd2VsbCBhcyBvZiB6ZXJvIG9yIG1vcmUgdmFyaWFibGVzIHdob3NlCit2YWx1ZXMgYXJlIG1hbmlwdWxhdGVkIGluc2lkZSB0aG9zZSBmdW5jdGlvbnMuICBMUEMgb2JqZWN0cyBzaW1wbHkgc2l0CitvbiB0aGUgaG9zdCBtYWNoaW5lJ3MgaGFyZCBkcml2ZXIgdW50aWwgcmVmZXJlbmNlZCBieSBhbm90aGVyIG9iamVjdCBpbgordGhlIGdhbWUgKGluIG90aGVyIHdvcmRzLCB0aGV5IGRvIG5vdCByZWFsbHkgZXhpc3QpLiAgT25jZSB0aGUgb2JqZWN0CitpcyByZWZlcmVuY2VkLCBpdCBpcyBsb2FkZWQgaW50byB0aGUgbWFjaGluZSdzIG1lbW9yeSB3aXRoIGVtcHR5Cit2YWx1ZXMgZm9yIHRoZSB2YXJpYWJsZXMuICBUaGUgZnVuY3Rpb24gcmVzZXQoKSBpbiBjb21wYXQgbXVkcyBvcgorY3JlYXRlKCkgaW4gbmF0aXZlIG11ZHMgaXMgY2FsbGVkIGluIHRoYXQgb2JqZWN0IGlmIGl0IGV4aXN0cyB0byBhbGxvdwordGhlIHZhcmlhYmxlcyB0byB0YWtlIG9uIGluaXRpYWwgdmFsdWVzLiAgT3RoZXIgZnVuY3Rpb25zIGluIHRoZSBvYmplY3QKK2FyZSB1c2VkIGJ5IHRoZSBkcml2ZXIgYW5kIG90aGVyIG9iamVjdHMgaW4gdGhlIGdhbWUgdG8gYWxsb3cgaW50ZXJhY3Rpb24KK2Ftb25nIG9iamVjdHMgYW5kIHRoZSBtYW5pcHVsYXRpb24gb2YgdGhlIExQQyB2YXJpYWJsZXMuCisKK0Egbm90ZSBvbiByZXNldCgpIGFuZCBjcmVhdGUoKToKK2NyZWF0ZSgpIGlzIG9ubHkgdXNlZCBieSBtdWRzIGluIG5hdGl2ZSBtb2RlIChzZWUgdGhlIHRleHRib29rIEludHJvZHVjdGlvbgorZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbmF0aXZlIG1vZGUgdnMuIGNvbXBhdCBtb2RlKS4gIEl0IGlzIG9ubHkgdXNlZAordG8gaW5pdGlhbGl6ZSBuZXdseSByZWZlcmVuY2VkIG9iamVjdHMuCisKK3Jlc2V0KCkgaXMgdXNlZCBieSBib3RoIG11ZHMgaW4gY29tcGF0IG1vZGUgYW5kIG5hdGl2ZSBtb2RlLiAgSW4gY29tcGF0Cittb2RlLCByZXNldCgpIHBlcmZvcm1zIHR3byBmdW5jdGlvbnMuICBGaXJzdCwgaXQgaXMgdXNlZCB0byBpbml0aWFsaXplCituZXdseSByZWZlcmVuY2VkIG9iamVjdHMuICBJbiBhZGRpdGlvbiwgaG93ZXZlciwgY29tcGF0IG1vZGUgbXVkcyB1c2UKK3Jlc2V0KCkgdG8gInJlc2V0IiB0aGUgb2JqZWN0LiAgSW4gb3RoZXIgd29yZHMsIHJldHVybiBpdCB0byBpdHMgaW5pdGlhbAorc3RhdGUgb2YgYWZmYWlycy4gIFRoaXMgYWxsb3dzIG1vbnN0ZXJzIHRvIHJlZ2VuZXJhdGUgaW4gYSByb29tIGFuZCBkb29ycwordG8gc3RhcnQgYmFjayBpbiB0aGUgc2h1dCBwb3NpdGlvbiwgZXRjLi4gIE5hdGl2ZSBtb2RlIG11ZHMgdXNlIHJlc2V0KCkKK3RvIHBlcmZvcm0gdGhlIHNlY29uZCBmdW5jdGlvbiAoYXMgaXRzIG5hbWUgaW1wbGllcykuCisKK1NvIHRoZXJlIGFyZSB0d28gaW1wb3J0YW50IHRoaW5ncyB3aGljaCBoYXBwZW4gaW4gTFAgc3R5bGUgbXVkcyB3aGljaAorY2F1c2UgdGhlIGRyaXZlciB0byBtYWtlIGNhbGxzIHRvIGZ1bmN0aW9ucyBpbiBvYmplY3RzLiAgVGhlIGZpcnN0IGlzCit0aGUgY3JlYXRpb24gb2YgdGhlIG9iamVjdC4gIEF0IHRoaXMgdGltZSwgdGhlIGRyaXZlciBjYWxscyBhIGZ1bmN0aW9uCit0byBpbml0YWxpemUgdGhlIHZhbHVlcyBpbiB0aGUgb2JqZWN0LiAgRm9yIGNvbXBhdCBtb2RlIG11ZHMsIHRoaXMKK2lzIHBlcmZvcm1lZCBieSB0aGUgZnVuY3Rpb24gbmFtZWQgcmVzZXQoKSAod2l0aCBhbiBhcmd1bWVudCBvZiAwLAorbW9yZSBvbiB0aGlzIGxhdGVyIHRob3VnaCkuICBGb3IgbXVkcyBydW5uaW5nIGluIG5hdGl2ZSBtb2RlLCB0aGlzIGlzCitwZXJmb3JtZWQgYnkgdGhlIGZ1bmN0aW9uIGNyZWF0ZSgpLgorCitUaGUgc2Vjb25kIGlzIHRoZSByZXR1cm5pbmcgb2YgdGhlIHJvb20gdG8gc29tZSBiYXNlIHN0YXRlIG9mIGFmZmFpcnMuCitUaGlzIGJhc2Ugc2V0IG9mIGFmZmFpcnMgbWF5IG9yIG1heSBub3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIGluaXRpYWwKK3N0YXRlIG9mIGFmZmFpcnMsIGFuZCBjZXJ0YWlubHkgeW91IHdvdWxkIG5vdCB3YW50IHRvIHRha2UgdXAgdGltZQorZG9pbmcgcmVkdW5kYW50IHRoaW5ncyAobGlrZSByZXNldHRpbmcgdmFyaWFibGVzIHRoYXQgbmV2ZXIgY2hhbmdlKS4KK0NvbXBhdCBtb2RlIG11ZHMgbmV2ZXJ0aGVsZXNzIHVzZSB0aGUgc2FtZSBmdW5jdGlvbiB0aGF0IHdhcyB1c2VkIHRvCitjcmVhdGUgdGhlIG9iamVjdCB0byByZXNldCBpdCwgdGhhdCBiZWluZyByZXNldCgpLiAgTmF0aXZlIG1vZGUgbXVkcywKK3dobyB1c2UgY3JlYXRlKCkgdG8gY3JlYXRlIHRoZSByb29tLCBpbnN0ZWFkIHVzZSByZXNldCgpIHRvIHJlc2V0IGl0LgorQWxsIGlzIG5vdCBsb3N0IGluIGNvbXBhdCBtb2RlIHRob3VnaCwgYXMgdGhlcmUgaXMgYSB3YXkgdG8gdGVsbCB0aGUKK2RpZmZlcmVuY2UgYmV0d2VlbiBjcmVhdGlvbiBhbmQgcmVzZXR0aW5nLiAgRm9yIHJlc2V0IHB1cnBvc2VzLCB0aGUKK2RyaXZlciBwYXNzZXMgZWl0aGVyIDEgb3IgdGhlIHJlc2V0IG51bWJlciBhcyBhbiBhcmd1bWVudCB0byByZXNldCgpCitpbiBjb21wYXQgbW9kZS4gIE5vdyB0aGlzIGlzIG1lYW5pbmdsZXNzIHRvIHlvdSBub3csIGJ1dCBqdXN0IGtlZXAgaW4KK21pbmQgdGhhdCB5b3UgY2FuIGluIGZhY3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBpbiBjb21wYXQgbW9kZS4gIEFsc28KK2tlZXAgaW4gbWluZCB0aGF0IHRoZSBhcmdtZW50IGluIHRoZSBjcmVhdGlvbiB1c2Ugb2YgcmVzZXQgaXMgMCBhbmQKK3RoZSBhcmd1bWVudCBpbiB0aGUgcmVzZXQgdXNlIGlzIGEgbm9uemVybyBudW1iZXIuCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyMyBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXIzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTg5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyMwpAQCAtMCwwICsxLDE4NSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgZmlyc3QgZWRpdGlvbjogMjMgYXByaWwgMTk5MworICAgICAgICAgICAgICAgICAgc2Vjb25kIGVkaXRpb246IDE3IGp1bmUgMTk5MworCitDSEFQVEVSIDM6IExQQyBEYXRhIFR5cGVzCisKKzMuMSBXaGF0IHlvdSBzaG91bGQga25vdyBieSBub3cKK0xQQyBvYmplY3QgYXJlIG1hZGUgdXAgb2YgemVybyBvciBtb3JlIHZhcmlhYmxlcyBtYW5pcHVsYXRlZCBieSBvbmUgb3IKK21vcmUgZnVuY3Rpb25zLiAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIGZ1bmN0aW9ucyBhcHBlYXIgaW4gY29kZSBpcworaXJyZWxldmFudC4gIFRoZSBkcml2ZXIgdXNlcyB0aGUgTFBDIGNvZGUgeW91IHdyaXRlIGJ5IGxvYWRpbmcgY29waWVzIG9mCitpdCBpbnRvIG1lbW9yeSB3aGVuZXZlciBpdCBpcyBmaXJzdCByZWZlcmVuY2VkIGFuZCBhZGRpdGlvbmFsIGNvcGllcwordGhyb3VnaCBjbG9uaW5nLiAgV2hlbiBlYWNoIG9iamVjdCBpcyBsb2FkZWQgaW50byBtZW1vcnksIGFsbCB0aGUgdmFyaWFibGVzCitpbml0aWFsbHkgcG9pbnQgdG8gbm8gdmFsdWUuICBUaGUgcmVzZXQoKSBmdW5jdGlvbiBpbiBjb21wYXQgbXVkcywgYW5kCitjcmVhdGUoKSBpbiBuYXRpdmUgbXVkcyBhcmUgdXNlZCB0byBnaXZlIGluaXRpYWwgdmFsdWVzIHRvIHZhcmlhYmxlcyBpbgorb2JqZWN0cy4gIFRoZSBmdW5jdGlvbiBmb3IgY3JlYXRpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvYmplY3QKK2lzIGxvYWRlZCBpbnRvIG1lbW9yeS4gIEhvd2V2ZXIsIGlmIHlvdSBhcmUgcmVhZGluZyB0aGlzIHRleHRib29rIHdpdGggbm8KK3ByaW9yIHByb2dyYW1taW5nIGV4cGVyaWVuY2UsIHlvdSBtYXkgbm90IGtub3cgd2hhdCBhIGZ1bmN0aW9uIGlzIG9yIGhvdworaXQgZ2V0cyBjYWxsZWQuICBBbmQgZXZlbiBpZiB5b3UgaGF2ZSBwcm9ncmFtbWluZyBleHBlcmllbmNlLCB5b3UgbWF5CitiZSB3b25kZXJpbmcgaG93IHRoZSBwcm9jZXNzIG9mIGZ1bmN0aW9ucyBjYWxsaW5nIGVhY2ggb3RoZXIgZ2V0cyBzdGFydGVkCitpbiBuZXdseSBjcmVhdGVkIG9iamVjdHMuICBCZWZvcmUgYW55IG9mIHRoZXNlIHF1ZXN0aW9ucyBnZXQgYW5zd2VyZWQsCitob3dldmVyLCB5b3UgbmVlZCB0byBrbm93IG1vcmUgYWJvdXQgd2hhdCBpdCBpcyB0aGUgZnVuY3Rpb25zIGFyZQorbWFuaXB1bGF0aW5nLiAgWW91IHRoZXJlZm9yZSBzaG91bGQgdGhvdXJvdWdobHkgY29tZSB0byBrbm93IHRoZSBjb25jZXB0CitiZWhpbmQgTFBDIGRhdGEgdHlwZXMuICBDZXJ0YWlubHkgdGhlIG1vc3QgYm9yaW5nIHN1YmplY3QgaW4gdGhpcyBtYW51YWwsCit5ZXQgaXQgaXMgdGhlIG1vc3QgY3J1Y2lhbCwgYXMgOTAlIG9mIGFsbCBlcnJvcnMgKGV4Y2VwdGluZyBtaXNwbGFjZWQKK3t9IGFuZCAoKSkgaW52b2x2ZSB0aGUgaW1wcm9wZXIgdXNhZ2Ugb2YgTFBDIGRhdGEgdHlwZXMuICBTbyBiZWFyIHRocm91Z2gKK3RoaXMgaW1wb3J0YW50IGNoYXB0ZXIsIGJlY2F1c2UgaXQgaXMgbXkgZmVlbGluZyB0aGF0IHVuZGVyc3RhbmRpbmcgdGhpcworY2hhcHRlciBhbG9uZSBjYW4gaGVscCB5b3UgZmluZCBjb2RpbmcgbXVjaCwgbXVjaCBlYXNpZXIuCisKKzMuMiBDb21tdW5pY2F0aW5nIHdpdGggdGhlIGNvbXB1dGVyCitZb3UgcG9zc2libHkgYWxyZWFkeSBrbm93IHRoYXQgY29tcHV0ZXJzIGNhbm5vdCB1bmRlcnN0YW5kIHRoZSBsZXR0ZXJzCithbmQgbnVtYmVycyB1c2VkIGJ5IGh1bWFucy4gIEluc3RlYWQsIHRoZSAibGFuZ3VhZ2UiIHNwb2tlbiBieSBjb21wdXRlcnMKK2NvbnNpc3RzIG9mIGFuICJhbHBoYWJldCIgb2YgMCdzIGFuZCAxJ3MuICBDZXJ0YWlubHkgeW91IGtub3cgY29tcHV0ZXJzCitkbyBub3QgdW5kZXJzdGFuZCBuYXR1cmFsIGh1bWFuIGxhbmd1YWdlcy4gIEJ1dCBpbiBmYWN0LCB0aGV5IGRvIG5vdAordW5kZXJzdGFuZCB0aGUgY29tcHV0ZXIgbGFuZ3VhZ2VzIHdlIHdyaXRlIGZvciB0aGVtIGVpdGhlci4gIENvbXB1dGVyCitsYW5ndWFnZXMgbGlrZSBCQVNJQywgQywgQysrLCBQYXNjYWwsIGV0Yy4gYXJlIGFsbCBpbnRlcm1lZGlhdGUKK2xhbmd1YWdlcy4gIFRoZXkgYWxsb3cgeW91IHRvIHN0cnVjdHVyZSB5b3VyIHRob3VnaHRzIG1vcmUgY29oZXJlbnRseQorZm9yIHRyYW5zbGF0aW9uIGludG8gdGhlIDAncyBhbmQgMSdzIG9mIHRoZSBjb21wdXRlcidzIGxhbmd1YWdlcy4KKworVGhlcmUgYXJlIHR3byBtZXRob2RzIGluIHdoaWNoIHRyYW5zbGF0aW9uIGlzIGRvbmU6IGNvbXBpbGF0aW9uIGFuZAoraW50ZXJwcmV0YXRpb24uICBUaGVzZSBzaW1wbHkgYXJlIGRpZmZlcmVuY2VzIGJldHdlZW0gd2hlbiB0aGUgCitwcm9ncmFtbWluZyBsYW5ndWFnZSBpcyB0cmFuc2xhdGVkIGludG8gY29tcHV0ZXIgbGFuZ3VhZ2UuICBXaXRoCitjb21waWxlZCBsYW5ndWFnZXMsIHRoZSBwcm9ncmFtbWVyIHdyaXRlcyB0aGUgY29kZSB0aGVuIHVzZXMgYSBwcm9ncmFtCitjYWxsZWQgYSBjb21waWxlciB0byB0cmFuc2xhdGUgdGhlIHByb2dyYW0gaW50byB0aGUgY29tcHV0ZXIncworbGFuZ3VhZ2UuICBUaGlzIHRyYW5zbGF0aW9uIG9jY3VycyBiZWZvcmUgdGhlIHByb2dyYW0gaXMgcnVuLiAgV2l0aAoraW50ZXJwcmV0ZWQgbGFuZ3VhZ2VzIGhvd2V2ZXIsIHRoZSBwcm9jZXNzIG9mIHRyYW5zbGF0aW9uIG9jY3VycyBhcwordGhlIHByb2dyYW0gaXMgYmVpbmcgcnVuLiAgU2luY2UgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBwcm9ncmFtIGlzCitvY2N1cnJpbmcgZHVyaW5nIHRoZSB0aW1lIG9mIHRoZSBwcm9ncmFtJ3MgcnVubmluZyBpbiBpbnRlcnByZXRlZAorbGFuZ3VhZ2VzLCBpbnRlcnByZXRlZCBsYW5ndWFnZXMgbWFrZSBtdWNoIHNsb3dlciBwcm9ncmFtcyB0aGFuCitjb21waWxlZCBsYW5ndWFnZXMuCisKK1RoZSBib3R0b20gbGluZSBpcywgbm8gbWF0dGVyIHdoYXQgbGFuZ3VhZ2UgeW91IGFyZSB3cml0aW5nIGluLCBhdAorc29tZSBwb2ludCB0aGlzIGhhcyB0byBiZSBjaGFuZ2VkIGludG8gMCdzIGFuZCAxJ3Mgd2hpY2ggY2FuIGJlCit1bmRlcnN0b29kIGJ5IHRoZSBjb21wdXRlci4gIEJ1dCB0aGUgdmFyaWFibGVzIHdoaWNoIHlvdSBzdG9yZSBpbgorbWVtb3J5IGFyZSBub3Qgc2ltcGx5IDAncyBhbmQgMSdzLiAgU28geW91IGhhdmUgdG8gaGF2ZSBhIHdheSBpbgoreW91ciBwcm9ncmFtbWluZyBsYW5ndWFnZXMgb2YgdGVsbGluZyB0aGUgY29tcHV0ZXIgd2hldGhlciBvciBub3QKK3RoZSAwJ3MgYW5kIDEncyBzaG91bGQgYmUgdHJlYXRlZCBhcyBkZWNpbWFsIG51bWJlcnMgb3IgY2hhcmFjdGVycyBvcgorc3RyaW5ncyBvciBhbnl0aGluZyBlbHNlLiAgWW91IGRvIHRoaXMgdGhyb3VnaCB0aGUgdXNlIG9mIGRhdGEgdHlwZXMuCisKK0ZvciBleGFtcGxlLCBzYXkgeW91IGhhdmUgYSB2YXJpYWJsZSB3aGljaCB5b3UgY2FsbCAneCcgYW5kIHlvdSBnaXZlCitpdCB0aGUgZGVjaW1hbCB3aG9sZSBudW1iZXIgdmFsdWUgNjUuICBJbiBMUEMgeW91IHdvdWxkIGRvIHRoaXMgdGhyb3VnaAordGhlIHN0YXRlbWVudDoKKworLS0tLS0KK3ggPSA2NTsKKy0tLS0tCisKK1lvdSBjYW4gbGF0ZXIgZG8gdGhpbmdzIGxpa2U6CisKK19fX19fCit3cml0ZSh4KyJcbiIpOyAgICAgICAgLyogXG4gaXMgc3ltYm9saWNhbGx5IHJlcHJlc2VudHMgYSBjYXJyaWFnZSByZXR1cm4gKi8KK3kgPSB4ICsgNTsKKy0tLS0tCisKK1RoZSBmaXJzdCBsaW5lIGFsbG93cyB5b3UgdG8gc2VuZCA2NSBhbmQgYSBjYXJyaWFnZSByZXR1cm4gdG8gc29tZW9uZSdzIHNjcmVlbi4KK1RoZSBzZWNvbmQgbGluZSBsZXRzIHlvdSBzZXQgdGhlIHZhbHVlIG9mIHkgdG8gNzAuCitUaGUgcHJvYmxlbSBmb3IgdGhlIGNvbXB1dGVyIGlzIHRoYXQgaXQgZG9lcyBub3Qga25vdyB3aGF0ICc2NScgbWVhbnMgd2hlbgoreW91IHRlbGwgaXQgeCA9IDY1Oy4gIFdoYXQgeW91IHRoaW5rIG9mIDY1LCBpdCBtaWdodCB0aGluayBvZiBhczoKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAxCitCdXQsIGFsc28sIHRvIHRoZSBjb21wdXRlciwgdGhlIGxldHRlciAnQScgaXMgcmVwcmVzZW50ZWQgYXM6CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMQorU28sIHdoZW5ldmVyIHlvdSBpbnN0cnVjdCB0aGUgY29tcHV0ZXIgd3JpdGUoeCsiXG4iKTssIGl0IG11c3QgaGF2ZSBzb21lCit3YXkgb2Yga25vd2luZyB0aGF0IHlvdSB3YW50IHRvIHNlZSAnNjUnIGFuZCBub3QgJ0EnLgorCitUaGUgY29tcHV0ZXIgY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAnNjUnIGFuZCAnQScgdGhyb3VnaCB0aGUgdXNlCitvZiBkYXRhIHR5cGVzLiAgQSBkYXRhIHR5cGVzIHNpbXBseSBzYXlzIHdoYXQgdHlwZSBvZiBkYXRhIGlzIGJlaW5nIHN0b3JlZAorYnkgdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IGEgZ2l2ZW4gdmFyaWFibGUuICBUaHVzLCBlYWNoIExQQwordmFyaWFibGUgaGFzIGEgdmFyaWFibGUgdHlwZSB3aGljaCBndWlkZXMgY29udmVyc2lvbnMuICBJbiB0aGUgZXhhbXBsZQorZ2l2ZW4gYWJvdmUsIHlvdSB3b3VsZCBoYXZlIGhhZCB0aGUgZm9sbG93aW5nIGxpbmUgc29tZXdoZXJlIGluIHRoZQorY29kZSAqYmVmb3JlKiB0aGUgbGluZXMgc2hvd24gYWJvdmU6CisKKy0tLS0tCitpbnQgeDsKKy0tLS0tCisKK1RoaXMgb25lIGxpbmUgdGVsbHMgdGhlIGRyaXZlciB0aGF0IHdoYXRldmVyIHZhbHVlIHggcG9pbnRzIHRvLCBpdCB3aWxsCitiZSB1c2VkIGFzIHRoZSBkYXRhIHR5cGUgImludCIsIHdoaWNoIGlzIHNob3J0IGZvciBpbnRlZ2VyLCBvciB3aG9sZQorbnVtYmVyLiAgU28geW91IGhhdmUgYSBiYXNpYyBpbnRyb2R1Y3Rpb24gaW50byB0aGUgcmVhc29uIHdoeSBkYXRhIHR5cGVzCitleGlzdC4gIFRoZXkgZXhpc3Qgc28gdGhlIGRyaXZlciBjYW4gbWFrZSBzZW5zZSBvZiB0aGUgMCdzIGFuZCAxJ3MgdGhhdAordGhlIGNvbXB1dGVyIGlzIHN0b3JpbmcgaW4gbWVtb3J5LgorCiszLjMgVGhlIGRhdGEgdHlwZXMgb2YgTFBDCitBbGwgTFBNdWQgZHJpdmVycyBoYXZlIHRoZSBmb2xsb3dpbmcgZGF0YSB0eXBlczoKKwordm9pZCwgc3RhdHVzLCBpbnQsIHN0cmluZywgb2JqZWN0LCBpbnQgKiwgc3RyaW5nICosIG9iamVjdCAqLCBtaXhlZCAqCisKK01hbnkgZHJpdmVycywgYnV0IG5vdCBhbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGltcG9ydGFudCBkYXRhIHR5cGVzIHdoaWNoCithcmUgaW1wb3J0YW50IHRvIGRpc2N1c3M6CisKK2Zsb2F0LCBtYXBwaW5nLCBmbG9hdCAqLCBtYXBwaW5nICoKKworQW5kIHRoZXJlIGFyZSBhIGZldyBkcml2ZXJzIHdpdGggdGhlIGZvbGxvd2luZyByYXJlbHkgdXNlZCBkYXRhIHR5cGVzCit3aGljaCBhcmUgbm90IGltcG9ydGFudCB0byBkaXNjdXNzOgorCitmdW5jdGlvbiwgZW51bSwgc3RydWN0LCBjaGFyCisKKzMuNCBTaW1wbGUgZGF0YSB0eXBlcworVGhpcyBpbnRyb2R1Y3RvcnkgdGV4dGJvb2sgd2lsbCBkZWFsIHdpdGggdGhlIGRhdGEgdHlwZXMgdm9pZCwgc3RhdHVzLAoraW50LCBmbG9hdCwgc3RyaW5nLCBvYmplY3QsIG1hbmQgbWl4ZWQuICBZb3UgY2FuIGZpbmQgb3V0IGFib3V0IHRoZQorbW9yZSBjb21wbGV4IGRhdGEgdHlwZXMgbGlrZSBtYXBwaW5ncyBhbmQgYXJyYXlzIGluIHRoZSBpbnRlcm1lZGlhdGUKK3RleHRib29rLiAgVGhpcyBjaGFwdGVyIGRlYWxzIHdpdGggdGhlIHR3byBzaW1wbGVzdCBkYXRhIHR5cGVzIChmcm9tIHRoZQorcG9pbnQgb2YgdmlldyBvZiB0aGUgTFBDIGNvZGVyKSwgaW50IGFuZCBzdHJpbmcuCisKK0FuIGludCBpcyBhbnkgd2hvbGUgbnVtYmVyLiAgVGh1cyAxLCA0MiwgLTE3LCAwLCAtMTAwMDAwMjMgYXJlIGFsbCB0eXBlIGludC4KK0Egc3RyaW5nIGlzIG9uZSBvciBtb3JlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAgVGh1cyAiYSIsICJ3ZSBhcmUgYm9yZyIsCisiNDIiLCAiVGhpcyBpcyBhIHN0cmluZyIgYXJlIGFsbCBzdHJpbmdzLiAgTm90ZSB0aGF0IHN0cmluZ3MgYXJlIGFsd2F5cworZW5jbG9zZWQgaW4gIiIgdG8gYWxsb3cgdGhlIGRyaXZlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBpbnQgNDIgYW5kCit0aGUgc3RyaW5nICI0MiIgYXMgd2VsbCBhcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhcmlhYmxlIG5hbWVzIChsaWtlIHgpCithbmQgc3RyaW5ncyBieSB0aGUgc2FtZSBuYW1lcyAobGlrZSAieCIpLgorCitXaGVuIHlvdSB1c2UgYSB2YXJpYWJsZSBpbiBjb2RlLCB5b3UgbXVzdCBmaXJzdCBsZXQgdGhlIGRyaXZlciBrbm93Cit3aGF0IHR5cGUgb2YgZGF0YSB0byB3aGljaCB0aGF0IHZhcmlhYmxlIHBvaW50cy4gIFRoaXMgcHJvY2VzcyBpcworY2FsbGVkICpkZWNsYXJhdGlvbiouICBZb3UgZG8gdGhpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbgorb3IgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0IGNvZGUgKG91dHNpZGUgb2YgZnVuY3Rpb25zIGJlZm9yZSBhbGwKK2Z1bmN0aW9ucyB3aGljaCB1c2UgaXQpLiAgVGhpcyBpcyBkb25lIGJ5IHBsYWNpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZQorYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBsaWtlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworLS0tLS0KK3ZvaWQgYWRkX3R3b19hbmRfdHdvKCkgeworICAgIGludCB4OworICAgIGludCB5OworCisgICAgeCA9IDI7CisgICAgeSA9IHggKyB4OworfQorLS0tLS0KKworTm93LCB0aGlzIGlzIGEgY29tcGxldGUgZnVuY3Rpb24uICBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaXMgCithZGRfdHdvX2FuZF90d28oKS4gIFRoZSBmdW5jdGlvbiBiZWdpbnMgd2l0aCB0aGUgZGVjbGFyYXRpb24gb2YgYW4KK2ludCB2YXJpYWJsZSBuYW1lZCB4IGZvbGxvd2VkIGJ5IHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBpbiB2YXJpYWJsZQorbmFtZWQgeS4gIFNvIG5vdywgYXQgdGhpcyBwb2ludCwgdGhlIGRyaXZlciBub3cgaGFzIHR3byB2YXJpYWJsZXMgd2hpY2gKK3BvaW50IHRvIE5VTEwgdmFsdWVzLCBhbmQgaXQgZXhwZWN0cyB3aGF0IGV2ZXIgdmFsdWVzIGVuZCB1cCB0aGVyZSB0byBiZQorb2YgdHlwZSBpbnQuCisKK0Egbm90ZSBhYm91dCB0aGUgZGF0YSB0eXBlcyB2b2lkIGFuZCBzdGF0dXM6CitWb2lkIGlzIGEgdHJpdmlhbCBkYXRhIHR5cGUgd2hpY2ggcG9pbnRzIHRvIG5vdGhpbmcuICBJdCBpcyBub3QgdXNlZAord2l0aCByZXNwZWN0IHRvIHZhcmlhYmxlcywgYnV0IGluc3RlYWQgd2l0aCByZXNwZWN0IHRvIGZ1bmN0aW9ucy4gIFlvdQord2lsbCBjb21lIHRvIHVuZGVyc3RhbmQgdGhpcyBiZXR0ZXIgbGF0ZXIuICBGb3Igbm93LCB5b3UgbmVlZCBvbmx5Cit1bmRlcnN0YW5kIHRoYXQgaXQgcG9pbnRzIHRvIG5vIHZhbHVlLiAgCisKK1RoZSBkYXRhIHR5cGUgc3RhdHVzIGlzIGEgYm9vbGVhbiBkYXRhIHR5cGUuICBUaGF0IGlzLCBpdCBjYW4gb25seSBoYXZlCisxIG9yIDAgYXMgYSB2YWx1ZS4gIFRoaXMgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYmVpbmcgdHJ1ZSBvciBmYWxzZS4KKworMy41IENoYXB0ZXIgc3VtbWFyeQorRm9yIHZhcmlhYmxlcywgdGhlIGRyaXZlciBuZWVkcyB0byBrbm93IGhvdyB0aGUgMCdzIGFuZCAxJ3MgdGhlIGNvbXB1dGVyCitzdG9yZXMgaW4gbWVtb3J5IGdldCBjb252ZXJ0ZWQgaW50byB0aGUgZm9ybXMgaW4gd2hpY2ggeW91IGludGVuZCB0aGVtCit0byBiZSB1c2VkLiAgVGhlIHNpbXBsZXN0IExQQyBkYXRhIHR5cGVzIGFyZSB2b2lkLCBzdGF0dXMsIGludCwgYW5kIHN0cmluZy4KK1lvdSBkbyBub3QgdXNlciB2YXJpYWJsZXMgb2YgdHlwZSB2b2lkLCBidXQgdGhlIGRhdGEgdHlwZSBkb2VzIGNvbWUKK2ludG8gcGxheSB3aXRoIHJlc3BlY3QgdG8gZnVuY3Rpb25zLiAgSW4gYWRkaXRpb24gdG8gYmVpbmcgdXNlZCBmb3IKK3RyYW5zbGF0aW9uIGZyb20gb25lIGZvcm0gdG8gdGhlIG5leHQsIGRhdGEgdHlwZXMgYXJlIHVzZWQgaW4gZGV0ZXJtaW5pbmcKK3doYXQgcnVsZXMgdGhlIGRyaXZlciB1c2VzIGZvciBzdWNoIG9wZXJhdGlvbnMgYXMgKywgLSwgZXRjLiAgRm9yIGV4YW1wbGUsCitpbiB0aGUgZXhwcmVzc2lvbiA1KzUsIHRoZSBkcml2ZXIga25vd3MgdG8gYWRkIHRoZSB2YWx1ZXMgb2YgNSBhbmQgNQordG9nZXRoZXIgdG8gbWFrZSAxMC4gIFdpdGggc3RyaW5ncyBob3dldmVyLCB0aGUgcnVsZXMgZm9yIGludCBhZGRpdGlvbgorbWFrZSBubyBzZW5zZS4gIFNvIGluc3RlYWQsIHdpdGggImEiKyJiIiwgaXQgYXBwZW5kcyAiYiIgdG8gdGhlIHN0cmluZyAiYSIKK3NvIHRoYXQgdGhlIGZpbmFsIHN0cmluZyBpcyAiYWIiLiAgRXJyb3JzIGNhbiB0aHVzIHJlc3VsdCBpZiB5b3UgbWlzdGFrZW5seQordHJ5IHRvIGFkZCAiNSIrNS4gIFNpbmNlIGludCBhZGRpdGlvbiBtYWtlcyBubyBzZW5zZSB3aXRoIHN0cmluZ3MsIHRoZQorZHJpdmVyIHdpbGwgY29udmVydCB0aGUgc2Vjb25kIDUgdG8gIjUiIGFuZCB1c2Ugc3RyaW5nIGFkZGl0aW9uLiAgVGhlIGZpbmFsCityZXN1bHQgd291bGQgYmUgIjU1Ii4gIElmIHlvdSB3ZXJlIGxvb2tpbmcgZm9yIDEwLCB5b3Ugd291bGQgdGhlcmVmb3JlCitoYXZlIGVuZGVkIHVwIHdpdGggZXJyb25lb3VzIGNvZGUuICBLZWVwIGluIG1pbmQsIGhvd2V2ZXIsIHRoYXQgaW4gbW9zdAoraW5zdGFuY2VzLCB0aGUgZHJpdmVyIHdpbGwgbm90IGRvIHNvbWV0aGluZyBzbyB1c2VmdWwgYXMgY29taW5nIHVwIHdpdGgKKyI1NSIuICBJdCBjb21lcyB1cCB3aXRoICI1NSIgY2F1c2UgaXQgaGFzIGEgcnVsZSBmb3IgYWRkaW5nIGEgc3RyaW5nCit0byBhbiBpbnQsIG5hbWVseSB0byB0cmVhdCB0aGUgaW50IGFzIGEgc3RyaW5nLiAgSW4gbW9zdCBjYXNlcywgaWYgeW91Cit1c2UgYSBkYXRhIHR5cGUgZm9yIHdoaWNoIGFuIG9wZXJhdGlvbiBvciBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZAorKGxpa2UgaWYgeW91IHRyaWVkIHRvIGRpdmlkZSAidGhpcyBpcyIgYnkgIm5vbnNlbnNlIiwgInRoaXMgaXMiLyJub25zZW5zZSIpLAordGhlIGRyaXZlciB3aWxsIGJhcmYgYW5kIHJlcG9ydCBhbiBlcnJvciB0byB5b3UuCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNCBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDRjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNApAQCAtMCwwICsxLDIyNSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgZmlyc3QgZWRpdGlvbjogMjMgYXByaWwgMTk5MworICAgICAgICAgICAgICAgICAgc2Vjb25kIGVkaXRpb246IDIyIGp1bmUgMTk5MworCitDSEFQVEVSIDQ6IEZ1bmN0aW9ucworCis0LjEgUmV2aWV3CitCeSB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgTFBDIG9iamVjdHMgY29uc2lzdCBvZiBmdW5jdGlvbnMKK3doaWNoIG1hbmlwdWxhdGUgdmFyaWFibGVzLiAgVGhlIGZ1bmN0aW9ucyBtYW5pcHVsYXRlIHZhcmlhYmxlcyB3aGVuIHRoZXkKK2FyZSBleGVjdXRlZCwgYW5kIHRoZXkgZ2V0IGV4ZWN1dGVkIHRocm91Z2ggKmNhbGxzKiB0byB0aG9zZSBmdW5jdGlvbnMuCitUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZ1bmN0aW9ucyBhcmUgcGxhY2VkIGluIGEgZmlsZSBkb2VzIG5vdCBtYXR0ZXIuCitJbnNpZGUgYSBmdW5jdGlvbiwgdGhlIHZhcmlhYmxlcyBnZXQgbWFuaXB1bGF0ZWQuICBUaGV5IGFyZSBzdG9yZWQgaW4KK2NvbXB1dGVyIG1lbW9yeSBhbmQgdXNlZCBieSB0aGUgY29tcHV0ZXIgYXMgMCdzIGFuZCAxJ3Mgd2hpY2gKK2dldCB0cmFuc2xhdGVkIHRvIGFuZCBmcm9tIHVzZWFibGUgb3V0cHV0IGFuZCBpbnB1dCB0aHJvdWdoIGEgZGV2aWNlCitjYWxsZWQgZGF0YSB0eXBpbmcuICBTdHJpbmcgZGF0YSB0eXBlcyB0ZWxsIHRoZSBkcml2ZXIgdGhhdCB0aGUKK2RhdGEgc2hvdWxkIGFwcGVhciB0byB5b3UgYW5kIGNvbWUgZnJvbSB5b3UgaW4gdGhlIGZvcm0gb2YgYWxwaGFudW1lcmljCitjaGFyYWN0ZXJzLiAgVmFyaWFibGVzIG9mIHR5cGUgaW50IGFyZSByZXByZXNlbnRlZCB0byB5b3UgYXMgd2hvbGUKK251bWJlciB2YWx1ZXMuICBUeXBlIHN0YXR1cyBpcyByZXByZXNlbnRlZCB0byB5b3UgYXMgZWl0aGVyIDEgb3IgMC4KK0FuZCBmaW5hbGx5IHR5cGUgdm9pZCBoYXMgbm8gdmFsdWUgdG8geW91IG9yIHRoZSBtYWNoaW5lLCBhbmQgaXMgbm90CityZWFsbHkgdXNlZCB3aXRoIHZhcmlhYmxlIGRhdGEgdHlwZXMuCisKKzQuMiBXaGF0IGlzIGEgZnVuY3Rpb24/CitMaWtlIG1hdGggZnVuY3Rpb25zLCBMUEMgZnVuY3Rpb25zIHRha2UgaW5wdXQgYW5kIHJldHVybiBvdXRwdXQuCitMYW5ndWFnZXMgbGlrZSBQYXNjYWwgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgY29uY2VwdCBvZiBwcm9jZWVkdXJlIGFiZAordGhlIGNvbmNlcHQgb2YgZnVuY3Rpb24uICBMUEMgZG9lcyBub3QsIGhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCB0bwordW5kZXJzdGFuZCB0aGlzIGRpc3RpbmN0aW9uLiAgV2hhdCBQYXNjYWwgY2FsbHMgYSBwcm9jZWVkdXJlLCBMUEMKK2NhbGxzIGEgZnVuY3Rpb24gb2YgdHlwZSB2b2lkLiAgSW4gb3RoZXIgd29yZHMsIGEgcHJvY2VlZHVyZSwgb3IgZnVuY3Rpb24KK29mIHR5cGUgdm9pZCByZXR1cm5zIG5vIG91dHB1dC4gIFdoYXQgUGFzY2FsIGNhbGxzIGEgZnVuY3Rpb24gZGlmZmVycworaW4gdGhhdCBpdCBkb2VzIHJldHVybiBvdXRwdXQuICBJbiBMUEMsIHRoZSBtb3N0IHRyaXZpYWwsIGNvcnJlY3QKK2Z1bmN0aW9uIGlzOgorCistLS0tLQordm9pZCBkb19ub3RoaW5nKCkgeyB9CistLS0tLQorCitUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgbm8gaW5wdXQsIHBlcmZvcm1zIG5vIGluc3RydWN0aW9ucywgYW5kIHJldHVybnMgbm8KK3ZhbHVlLgorCitUaGVyZSBhcmUgdGhyZWUgcGFydHMgdG8gZXZlcnkgcHJvcGVybHkgd3JpdHRlbiBMUEMgZnVuY3Rpb246CisxKSBUaGUgZGVjbGFyYXRpb24KKzIpIFRoZSBkZWZpbml0aW9uCiszKSBUaGUgY2FsbAorCitMaWtlIHdpdGggdmFyaWFibGVzLCBmdW5jdGlvbnMgbXVzdCBiZSBkZWNsYXJlZC4gIFRoaXMgd2lsbCBhbGxvdyB0aGUKK2RyaXZlciB0byBrbm93IDEpIHdoYXQgdHlwZSBvZiBkYXRhIHRoZSBmdW5jdGlvbiBpcyByZXR1cm5pbmcgYXMgb3V0cHV0LAorYW5kIDIpIGhvdyBtYW55IGlucHV0KHMpIGFuZCBvZiB3aGF0IHR5cGUgdGhvc2UgaW5wdXQocykgYXJlLiAgVGhlCittb3JlIGNvbW1vbiB3b3JkIGZvciBpbnB1dCBpcyBwYXJhbWV0ZXJzLgorQSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0aGVyZWZvcmUgY29uc2lzdHMgb2Y6Cit0eXBlIG5hbWUocGFyYW1ldGVyMSwgcGFyYW1ldGVyMiwgLi4uLCBwYXJhbWV0ZXJOKTsKK1RoZSBkZWNsYXJhdGlvbiBvZiBhIGZ1bmN0aW9uIGNhbGxlZCBkcmlua193YXRlcigpIHdoaWNoIGFjY2VwdHMgYSBzdHJpbmcgYXMKK2lucHV0IGFuZCBhbiBpbnQgYXMgb3V0cHV0IHdvdWxkIHRodXMgbG9vayBsaWtlIHRoaXM6CisKKy0tLS0tCitpbnQgZHJpbmtfd2F0ZXIoc3RyaW5nIHN0cik7CistLS0tLQorCit3aGVyZSBzdHIgaXMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGFzIGl0IHdpbGwgYmUgdXNlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLgorCitUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyB0aGUgY29kZSB3aGljaCBkZXNjcmliZXMgd2hhdCB0aGUgZnVuY3Rpb24gYWN0dWFsbHkKK2RvZXMgd2l0aCB0aGUgaW5wdXQgc2VudCB0byBpdC4gIAorVGhlIGNhbGwgaXMgYW55IHBsYWNlIGluIG90aGVyIGZ1bmN0aW9ucyB3aGljaCBpbnZva2VzIHRoZSBleGVjdXRpb24gb2YgdGhlCitmdW5jdGlvbiBpbiBxdWVzdGlvbi4gIEZvciB0d28gZnVuY3Rpb25zIHdyaXRlX3ZhbHMoKSBhbmQgYWRkKCksIHlvdSB0aHVzCittaWdodCBoYXZlIHRoZSBmb2xsb3dpbmcgYml0IG9mIGNvZGU6CisKKy0tLS0tCisvKiBGaXJzdCwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgVGhleSB1c3VhbGx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nCisgICBvZiBvYmplY3QgY29kZS4gCisqLwordm9pZCB3cml0ZV92YWxzKCk7CitpbnQgYWRkKGludCB4LCBpbnQgeSk7CisKKy8qIE5leHQsIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB3cml0ZV92YWxzKCkuICBXZSBhc3N1bWUgdGhhdAorICAgdGhpcyBmdW5jdGlvbiBpcyBnb2luZyB0byBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBvYmplY3QKKyovCit2b2lkIHdyaXRlX3ZhbHMoKSB7CisgICAgaW50IHg7CisKKyAgICAvKk4gTm93IHdlIGFzc2lnbiB4IHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IG9mIGFkZCgpIHRocm91Z2ggYSBjYWxsICovCisgICAgeCA9IGFkZCgyLCAyKTsKKyAgICB3cml0ZSh4KyJcbiIpOworfQorCisvKiBGaW5hbGx5LCB0aGUgZGVmaW5pdGlvbiBvZiBhZGQoKSAqLworaW50IGFkZChpbnQgeCwgaW50IHkpIHsKKyAgICByZXR1cm4gKHggKyB5KTsKK30KKy0tLS0tCisKK1JlbWVtYmVyLCBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hpY2ggZnVuY3Rpb24gZGVmaW5pdGlvbiBhcHBlYXJzIGZpcnN0IGluIHRoZQorY29kZS4gIFRoaXMgaXMgYmVjYXVzZSBmdW5jdGlvbnMgYXJlIG5vdCBleGVjdXRlZCBjb25zZWN1dGl2ZWx5LiAgSW5zdGVhZCwKK2Z1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgYXMgY2FsbGVkLiAgVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUKK2RlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24gYXBwZWFyIGJlZm9yZSBpdHMgZGVmaW5pdGlvbiBhbmQgYmVmb3JlIHRoZQorZGVmaW5pdGlvbiBvZiBhbnkgZnVuY3Rpb24gd2hpY2ggbWFrZXMgYSBjYWxsIHRvIGl0LgorCis0LjMgRWZ1bnMKK1BlcmhhcHMgeW91IGhhdmUgaGVhcmQgcGVvcGxlIHJlZmVyIHRvIGVmdW5zLiAgVGhleSBhcmUgZXh0ZXJuYWxseSBkZWZpbmVkCitmdW5jdGlvbnMuICBOYW1lbHksIHRoZXkgYXJlIGRlZmluZWQgYnkgdGhlIG11ZCBkcml2ZXIuICBJZiB5b3UgaGF2ZQorcGxheWVkIGFyb3VuZCBhdCBhbGwgd2l0aCBjb2RpbmcgaW4gTFBDLCB5b3UgaGF2ZSBwcm9iYWJseSBmb3VuZCBzb21lCitleHByZXNzaW9ucyB5b3Ugd2VyZSB0b2xkIHRvIHVzZSBsaWtlIHRoaXNfcGxheWVyKCksIHdyaXRlKCksIHNheSgpLAordGhpc19vYmplY3QoKSwgZXRjLiBsb29rIGEgbG90IGxpa2UgZnVuY3Rpb25zLiAgVGhhdCBpcyBiZWNhdXNlIHRoZXkgYXJlCitlZnVucy4gIFRoZSB2YWx1ZSBvZiBlZnVucyBpcyB0aGF0IHRoZXkgYXJlIG11Y2ggZmFzdGVyIHRoYW4gTFBDIGZ1bmN0aW9ucywKK3NpbmNlIHRoZXkgYWxyZWFkeSBleGlzdCBpbiB0aGUgYmluYXJ5IGZvcm0gdGhlIGNvbXB1dGVyIHVuZGVyc3RhbmRzLgorCitJbiB0aGUgZnVuY3Rpb24gd3JpdGVfdmFscygpIGFib3ZlLCB0d28gZnVuY3Rpb25zIGNhbGxzIHdlcmUgbWFkZS4gIFRoZSBmaXJzdCB3YXMgdG8KK3RoZSBmdW5jdGlvbnMgYWRkKCksIHdoaWNoIHlvdSBkZWNsYXJlZCBhbmQgZGVmaW5lZC4gIFRoZSBzZWNvbmQgY2FsbCwgaG93ZXZlciwKK3dhcyB0byBhIGZ1bmN0aW9uIGNhbGxlZCB3cml0ZSgpLCBhbmQgZWZ1bi4gIFRoZSBkcml2ZXIgaGFzIGFscmVhZHkgZGVjbGFyZWQKK2FuZCBkZWZpbmVkIHRoaXMgZnVuY3Rpb24gZm9yIHlvdS4gIFlvdSBuZWVkcyBvbmx5IHRvIG1ha2UgY2FsbHMgdG8gaXQuCisKK0VmdW5zIGFyZSBjcmVhdGVkIHRvIGhhbmxkbGUgY29tbW9uLCBldmVyeSBkYXkgZnVuY3Rpb24gY2FsbHMsIHRvIGhhbmRsZQoraW5wdXQvb3V0cHV0IHRvIHRoZSBpbnRlcm5ldCBzb2NrZXRzLCBhbmQgb3RoZXIgbWF0dGVycyBkaWZmaWN1bHQgdG8gYmUKK2RlYWx0IHdpdGggaW4gTFBDLiAgVGhleSBhcmUgd3JpdHRlbiBpbiBDIGluIHRoZSBnYW1lIGRyaXZlciBhbmQgY29tcGlsZWQKK2Fsb25nIHdpdGggdGhlIGRyaXZlciBiZWZvcmUgdGhlIG11ZCBjb21lcyB1cCwgbWFraW5nIHRoZW0gbXVjaCBmYXN0ZXIKK2luIGV4ZWN1dGlvbi4gIEJ1dCBmb3IgeW91ciBwdXJwb3NlcywgZWZ1biBjYWxscyBhcmUganVzdCBsaWtlIGNhbGxzCittYWRlIHRvIHlvdXIgZnVuY3Rpb25zLiAgU3RpbGwsIGl0IGlzIGltcG9ydGFudCB0byBrbm93IHR3byB0aGluZ3Mgb2YgYW55CitlZnVuOiAxKSB3aGF0IHJldHVybiB0eXBlIGRvZXMgaXQgaGF2ZSwgYW5kIDIpIHdoYXQgcGFyYW1ldGVycyBvZiB3aGF0Cit0eXBlcyBkb2VzIGl0IHRha2UuCisKK0luZm9ybWF0aW9uIG9uIGVmdW5zIHN1Y2ggYXMgaW5wdXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIGlzIG9mdGVuCitmb3VuZCBpbiBhIGRpcmVjdG9yeSBjYWxsZWQgL2RvYy9lZnVuIG9uIHlvdXIgbXVkLiAgSSBjYW5ub3QKK2RldGFpbCBlZnVucyBoZXJlLCBiZWNhdXNlIGVmdW5zIHZhcnkgZnJvbSBkcml2ZXIgdG8gZHJpdmVyLiAgSG93ZXZlciwKK3lvdSBjYW4gb2Z0ZW4gYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGNvbW1hbmRzICJtYW4iIG9yICJoZWxwIgorZGVwZW5kaW5nIG9uIHlvdXIgbXVkbGliLiAgRm9yIGluc3RhbmNlLCB0aGUgY29tbWFuZCAibWFuIHdyaXRlIiB3b3VsZAorZ2l2ZSB5b3UgaW5mb3JtYXRpb24gb24gdGhlIHdyaXRlIGVmdW4uICBCdXQgaWYgYWxsIGVsc2UgZmFpbHMsCisibW9yZSAvZG9jL2VmdW4vd3JpdGUiIHNob3VsZCB3b3JrLgorCitCeSBsb29raW5nIGl0IHVwLCB5b3Ugd2lsbCBmaW5kIHdyaXRlIGlzIGRlY2xhcmVkIGFzIGZvbGxvd3M6CisKKy0tLS0tCit2b2lkIHdyaXRlKHN0cmluZyk7CistLS0tLQorCitUaGlzIHRlbGxzIHlvdSBhbiBhcHByb3ByaWF0ZSBjYWxsIHRvIHdyaXRlIGV4cGVjdHMgbm8gcmV0dXJuIHZhbHVlIGFuZAorcGFzc2VzIGEgc2luZ2xlIHBhcmFtZXRlciBvZiB0eXBlIHN0cmluZy4KKworNC40IERlZmluaW5nIHlvdXIgb3duIGZ1bmN0aW9ucworQWx0aG91Z2ggb3JkZXJpbmcgeW91ciBmdW5jdGlvbnMgd2l0aGluIHRoZSBmaWxlIGRvZXMgbm90IG1hdHRlciwgb3JkZXJpbmcKK3RoZSBjb2RlIHdoaWNoIGRlZmluZXMgYSBmdW5jdGlvbiBpcyBtb3N0IGltcG9ydGFudC4gIE9uY2UgYSBmdW5jdGlvbgoraGFzIGJlZW4gY2FsbGVkLCBmdW5jdGlvbiBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBvcmRlciBpdCBhcHBlYXJzCitpbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIEluIHdyaXRlX3ZhbHMoKSBhYm92ZSwgdGhlIGluc3RydWN0aW9uOgorICAgIAorLS0tLS0KK3ggPSBhZGQoMiwgMik7CistLS0tLQorCitNdXN0IGNvbWUgYmVmb3JlIHRoZSB3cml0ZSgpIGVmdW4gY2FsbCBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIGFwcHJvcHJpYXRlCit2YWx1ZSBvZiB4IHVzZWQgaW4gd3JpdGUoKS4gIAorCitXaXRoIHJlc3BlY3QgdG8gdmFsdWVzIHJldHVybmVkIGJ5IGZ1bmN0aW9uLCB0aGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgInJldHVybiIKK2luc3RydWN0aW9uIGZvbGxvd2VkIGJ5IGEgdmFsdWUgb2YgdGhlIHNhbWUgZGF0YSB0eXBlIGFzIHRoZSBmdW5jdGlvbi4gIEluCithZGQoKSBhYm92ZSwgdGhlIGluc3RydWN0aW9uIGlzICJyZXR1cm4gKHgreSk7Iiwgd2hlcmUgdGhlIHZhbHVlIG9mICh4K3kpCitpcyB0aGUgdmFsdWUgcmV0dXJuZWQgdG8gd3JpdGVfdmFscygpIGFuZCBhc3NpZ25lZCB0byB4LiAgT24gYSBtb3JlCitnZW5lcmFsIGxldmVsLCAicmV0dXJuIiBoYWx0cyB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24gYW5kIHJldHVybnMKK2NvZGUgZXhlY3V0aW9uIHRvIHRoZSBmdW5jdGlvbiB3aGljaCBjYWxsZWQgdGhhdCBmdW5jdGlvbi4gIEluIGFkZGl0aW9uLAoraXQgcmV0dXJucyB0byB0aGUgY2FsbGluZyBmdW5jdGlvbiB0aGUgdmFsdWUgb2YgYW55IGV4cHJlc3Npb24gdGhhdCBmb2xsb3dzLgorVG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24gb2YgdHlwZSB2b2lkIG91dCBvZiBvcmRlciwgdXNlCisicmV0dXJuIjsgd2l0aG91dCBhbnkgdmFsdWUgZm9sbG93aW5nLiAgT25jZSBhZ2FpbiwgcmVtZW1iZXIsIHRoZSBkYXRhCit0eXBlIG9mIHRoZSB2YWx1ZSBvZiBhbnkgZXhwcmVzc2lvbiByZXR1cm5lZCB1c2luZyAicmV0dXJuIiBNVVNUIGJlIHRoZQorc2FtZSBhcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpdHNlbGYuCisKKzQuNSBDaGFwdGVyIFN1bW1hcnkKK1RoZSBmaWxlcyB3aGljaCBkZWZpbmUgTFBDIG9iamVjdHMgYXJlIG1hZGUgb2Ygb2YgZnVuY3Rpb25zLiAgRnVuY3Rpb25zLCBpbgordHVybiwgYXJlIG1hZGUgdXAgb2YgdGhyZWUgcGFydHM6CisgICAgMSkgVGhlIGRlY2xhcmF0aW9uCisgICAgMikgVGhlIGRlZmluaXRpb24KKyAgICAzKSBUaGUgY2FsbAorRnVuY3Rpb24gZGVjbGFyYXRpb25zIGdlbmVyYWxseSBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSBiZWZvcmUgYW55CitkZWZpbnRpb25zLCBhbHRob3VnaCB0aGUgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgZGVjbGFyYXRpb24gbXVzdCBhcHBlYXIKK2JlZm9yZSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBhbmQgYmVmb3JlIHRoZSBkZWZpbml0aW9uIG9mIGFueSBmdW5jdGlvbgord2hpY2ggY2FsbHMgaXQuCitGdW5jdGlvbiBkZWZpbml0aW9ucyBtYXkgYXBwZWFyIGluIHRoZSBmaWxlIGluIGFueSBvcmRlciBzbyBsb25nIGFzIHRoZXkKK2NvbWUgYWZ0ZXIgdGhlaXIgZGVjbGFyYXRpb24uICBJbiBhZGRpdGlvbiwgeW91IG1heSBub3QgZGVmaW5lIG9uZSBmdW5jdGlvbgoraW5zaWRlIGFub3RoZXIgZnVuY3Rpb24uCitGdW5jdGlvbiBjYWxscyBhcHBlYXIgaW5zaWRlIHRoZSBkZWZpbml0aW9uIG9mIG90aGVyIGZ1bmN0aW9ucyB3aGVyZSB5b3UKK3dhbnQgdGhlIGNvZGUgdG8gYmVnaW4gZXhlY3V0aW9uIG9mIHlvdXIgZnVuY3Rpb24uICBUaGV5IG1heSBhbHNvIGFwcGVhcgord2l0aGluIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiBpdHNlbGYsIGJ1dCB0aGlzIGlzIG5vdCByZWNvbW1lbmRlZAorZm9yIG5ldyBjb2RlcnMsIGFzIGl0IGNhbiBlYXNpbHkgbGVhZCB0byBpbmZpbml0ZSBsb29wcy4KKworVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBpbiB0aGlzIG9yZGVyOgorICAgIDEpIGZ1bmN0aW9uIHJldHVybiB0eXBlCisgICAgMikgZnVuY3Rpb24gbmFtZQorICAgIDMpIG9wZW5pbmcgKCBmb2xsb3dlZCBieSBhIHBhcmFtZXRlciBsaXN0IGFuZCBhIGNsb3NpbmcgKQorICAgIDQpIGFuIG9wZW5pbmcgeyBpbnN0cnVjdGluZyB0aGUgZHJpdmVyIHRoYXQgZXhlY3V0aW9uIGJlZ2lucyBoZXJlCisgICAgNSkgZGVjbGFyYXRpb25zIG9mIGFueSB2YXJpYWJsZXMgdG8gYmUgdXNlZCBvbmx5IGluIHRoYXQgZnVuY3Rpb24KKyAgICA2KSBpbnN0cnVjdGlvbnMsIGV4cHJlc3Npb25zLCBhbmQgY2FsbHMgdG8gb3RoZXIgZnVuY3Rpb25zIGFzIG5lZWRlZAorICAgIDcpIGEgY2xvc2luZyB9IHN0YXRpbmcgdGhhdCB0aGUgZnVuY3Rpb24gY29kZSBlbmRzIGhlcmUgYW5kLCBpZiBubworICAgICAgICJyZXR1cm4iIGluc3RydWN0aW9uIGhhcyBiZWVuIGdpdmVuIGF0IHRoaXMgcG9pbnQgKHR5cGUgdm9pZCBmdW5jdGlvbnMKKyAgICAgICBvbmx5KSwgZXhlY3V0aW9uIHJldHVybnMgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24gYXMgaWYgYSByInJldHVybiIKKyAgICAgICBpbnN0cnVjdGlvbiB3YXMgZ2l2ZW4KKworVGhlIHRyaXZpYWwgZnVuY3Rpb24gd291bGQgdGh1cyBiZToKKworLS0tLS0KK3ZvaWQgZG9fbm90aGluZygpIHt9CistLS0tLQorCitzaW5jZSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBhbnkgaW5wdXQsIHBlcmZvcm0gYW55IGluc3RydWN0aW9ucywgb3IKK3JldHVybiBhbnkgb3V0cHV0LgorCitBbnkgZnVuY3Rpb24gd2hpY2ggaXMgbm90IG9mIHR5cGUgdm9pZCBNVVNUIHJldHVybiBhIHZhbHVlIG9mIGEgZGF0YSB0eXBlCittYXRjaGluZyB0aGUgZnVuY3Rpb24ncyBkYXRhIHR5cGUuCisKK0VhY2ggZHJpdmVyIGhhcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxyZWFkeSBkZWZpbmVkIGZvciB5b3UgY2FsbGVkIGVmdW5zCitUaGVzZSB5b3UgbmVlZCBuZWl0aGVyIG5lZWQgdG8gZGVjbGFyZSBub3IgZGVmaW5lIHNpbmNlIGl0IGhhcyBhbHJlYWR5CitiZWVuIGRvbmUgZm9yIHlvdS4gIEZ1cnRoZXJtb3JlLCBleGVjdXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGZhc3RlcgordGhhbiB0aGUgZXhlY3V0aW9uIG9mIHlvdXIgZnVuY3Rpb25zIHNpbmNlIGVmdW5zIGFyZSBpbiB0aGUgZHJpdmVyLgorSW4gYWRkaXRpb24sIGVhY2ggbXVkbGliIGhhcyBzcGVjaWFsIGZ1bmN0aW9ucyBsaWtlIGVmdW5zIGluIHRoYXQgdGhleQorYXJlIGFscmVhZHkgZGVmaW5lZCBhbmQgZGVjbGFyZWQgZm9yIHlvdSwgYnV0IGRpZmZlcmVudCBpbiB0aGF0IHRoZXkKK2FyZSBkZWZpbmVkIGluIHRoZSBtdWRsaWIgYW5kIGluIExQQy4gIFRoZXkgYXJlIGNhbGxlZCBzaW11bF9lZnVucywgb3IKK3NpbXVsYXRlZCBlZnVucy4gIFlvdSBjYW4gZmluZCBvdXQgYWxsIGFib3V0IGVhY2ggb2YgdGhlc2UgYXMgdGhleSBhcmUKK2xpc3RlZCBpbiB0aGUgL2RvYy9lZnVuIGRpcmVjdG9yeSBvbiBtb3N0IG11ZHMuICBJbiBhZGRpdGlvbiBtYW55CittdWRzIGhhdmUgYSBjb21tYW5kIGNhbGxlZCAibWFuIiBvciBhICJoZWxwIiBjb21tYW5kIHdoaWNoIGFsbG93cyB5b3UKK3NpbXBseSB0byBjYWxsIHVwIHRoZSBpbmZvIGZpbGVzIG9uIHRoZW0uCisKK05vdGUgb24gc3R5bGU6CitTb21lIGRyaXZlcnMgbWF5IG5vdCByZXF1aXJlIHlvdSB0byBkZWNsYXJlIHlvdXIgZnVuY3Rpb25zLCBhbmQgc29tZQorbWF5IG5vdCByZXF1aXJlIHlvdSB0byBzcGVjaWZ5IHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaW4gaXRzCitkZWZpbml0aW9uLiAgUmVnYXJkbGVzcyBvZiB0aGlzIGZhY3QsIHlvdSBzaG91bGQgbmV2ZXIgb21pdCB0aGlzIGluZm9ybWF0aW9uCitmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOgorICAgIDEpIEl0IGlzIGVhc2llciBmb3Igb3RoZXIgcGVvcGxlIChhbmQgeW91IGF0IGxhdGVyIGRhdGVzKSB0byByZWFkIHlvdXIKKyAgICAgICBjb2RlIGFuZCB1bmRlcnN0YW5kIHdoYXQgaXMgbWVhbnQuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwKKyAgICAgICBmb3IgZGVidWdnaW5nLCB3aGVyZSBhIGxhcmdlIHBvcnRpb24gb2YgZXJyb3JzIChvdXRzaWRlIG9mIG1pc3BsYWNlZAorICAgICAgIHBhcmVudGhlc2VzIGFuZCBicmFja2V0cykgaW52b2x2ZSBwcm9ibGVtcyB3aXRoIGRhdGEgdHlwZXMgKEV2ZXIKKyAgICAgICBnb3R0ZW4gIkJhZCBhcmcgMSB0byBmb28oKSBsaW5lIDMyIj8pLgorICAgIDIpIEl0IGlzIHNpbXBseSBjb25zaWRlcmVkIGdvb2QgY29kaW5nIGZvcm0uCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNSBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDJhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNQpAQCAtMCwwICsxLDE2MSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgZmlyc3QgZWRpdGlvbjogMjMgYXByaWwgMTk5MworICAgICAgICAgICAgICAgICAgc2Vjb25kIGVkaXRpb246IDAxIGp1bHkgMTk5MworCitDSEFQVEVSIDU6IFRoZSBCYXNpY3Mgb2YgSW5oZXJpdGFuY2UKKworNS4xIFJldmlldworWW91IHNob3VsZCBub3cgdW5kZXJzdGFuZCB0aGUgYmFzaWMgd29ya2luZ3Mgb2YgZnVuY3Rpb25zLiAgWW91IHNob3VsZCBiZQorYWJsZSB0byBkZWNsYXJlIGFuZCBjYWxsIG9uZS4gIEluIGFkZGl0aW9uLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcmVjb2duaXplCitmdW5jdGlvbiBkZWZpbml0aW9ucywgYWx0aG91Z2gsIGlmIHRoaXMgaXMgeW91ciBmaXJzdCBleHBlcmllbmNlIHdpdGggTFBDLAoraXQgaXMgdW5saWtlbHkgdGhhdCB5b3Ugd2lsbCBhcyB5ZXQgYmUgYWJsZSB0byBkZWZpbmUgeW91ciBvd24gZnVuY3Rpb25zLgorVGhlcmUgZnVuY3Rpb25zIGZvcm0gdGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrcyBvZiBMUEMgb2JqZWN0cy4gIENvZGUKK2luIHRoZW0gaXMgZXhlY3V0ZWQgd2hlbiBhbm90aGVyIGZ1bmN0aW9uIG1ha2VzIGEgY2FsbCB0byB0aGVtLiAgSW4gbWFraW5nCithIGNhbGwsIGlucHV0IGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGludG8gdGhlIGV4ZWN1dGlvbiBvZgordGhlIGNhbGxlZCBvbmUuICBUaGUgY2FsbGVkIGZ1bmN0aW9uIHRoZW4gZXhlY3V0ZXMgYW5kIHJldHVybnMgYSB2YWx1ZQorb2YgYSBjZXJ0YWluIGRhdGEgdHlwZSB0byB0aGUgY2FsbGluZyBmdW5jdGlvbi4gIEZ1bmN0aW9ucyB3aGljaCByZXR1cm4KK25vIHZhbHVlIGFyZSBvZiB0eXBlIHZvaWQuCisKK0FmdGVyIGV4YW1pbmluZyB5b3VyIHdvcmtyb29tIGNvZGUsIGl0IG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcworKGRlcGVuZGluZyBvbiB0aGUgbXVkbGliKToKKworLS0tLS0KK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKK3ZvaWQgY3JlYXRlKCkgeworICAgIDo6Y3JlYXRlKCk7CisgICAgc2V0X3Byb3BlcnR5KCJsaWdodCIsIDIpOworICAgIHNldF9wcm9wZXJ0eSgiaW5kb29ycyIsIDEpOworICAgIHNldCgic2hvcnQiLCAiRGVzY2FydGVzJyBXb3Jrcm9vbSIpOworICAgIHNldCgibG9uZyIsICJUaGlzIGlzIHdoZXJlIERlc2NhcnRlcyB3b3Jrcy5cbkl0IGlzIGEgY3ViZS5cbiIpOworICAgIHNldF9leGl0cyggKHsgIi9kL3N0YW5kYXJkL3NxdWFyZSIgfSksICh7ICJzcXVhcmUiIH0pICk7Cit9CistLS0tLQorCitJZiB5b3UgdW5kZXJzdGFuZCB0aGUgZW50aXJlIHRleHRib29rIHRvIHRoaXMgcG9pbnQsIHlvdSBzaG91bGQgcmVjb2duaXplCitvZiB0aGUgY29kZSB0aGUgZm9sbG93aW5nOgorICAgIDEpIGNyZWF0ZSgpIGlzIHRoZSBkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24gKGhleSEgaGUgZGlkIG5vdCBkZWNsYXJlIGl0KQorICAgIDIpIEl0IG1ha2VzIGNhbGxzIHRvIHNldF9wcm9wZXJ0eSgpLCBzZXQoKSwgYW5kIHNldF9leGl0cygpLCBub25lCisgICAgICAgb2Ygd2hpY2ggYXJlIGRlY2xhcmVkIG9yIGRlZmluZWQgaW4gdGhlIGNvZGUuCisgICAgMykgVGhlcmUgaXMgYSBsaW5lIGF0IHRoZSB0b3AgdGhhdCBpcyBubyB2YXJpYWJsZSBvciBmdW5jdGlvbiBkZWNsYXJhdGlvbgorICAgICAgIG5vciBpcyBpdCBhIGZ1bmN0aW9uIGRlZmluaXRpb24hCisKK1RoaXMgY2hhcHRlciB3aWxsIHNlZWsgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbnMgdGhhdCBzaG91bGQgYmUgaW4geW91ciBoZWFkCithdCB0aGlzIHBvaW50OgorICAgIDEpIFdoeSBpcyB0aGVyZSBubyBkZWNsYXJhdGlvbiBvZiBjcmVhdGUoKT8KKyAgICAyKSBXaGVyZSBhcmUgdGhlIGZ1bmN0aW9ucyBzZXRfcHJvcGVydHkoKSwgc2V0KCksIGFuZCBzZXRfZXhpdHMoKSBkZWNsYXJlZAorICAgICAgIGFuZCBkZWZpbmVkPworICAgIDMpIFdoYXQgdGhlIGhlbGwgaXMgdGhhdCBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGU/CisKKzUuMiBPYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcKK0luaGVyaXRhbmNlIGlzIG9uZSBvZiB0aGUgcHJvcGVydGllcyB3aGljaCBkZWZpbmUgdHJ1ZSBvYmplY3Qgb3JpZW50ZWQKK3Byb2dyYW1taW5nIChPT1ApLiAgSXQgYWxsb3dzIHlvdSB0byBjcmVhdGUgZ2VuZXJpYyBjb2RlIHdoaWNoIGNhbiBiZSB1c2VkCitpbiBtYW55IGRpZmZlcmVudCB3YXlzIGJ5IG1hbnkgZGlmZmVyZW50IHByb2dyYW1zLiAgV2hhdCBhIG11ZGxpYiBkb2VzIGlzCitjcmVhdGUgdGhlc2UgZ2VuZXJhbGl6ZWQgZmlsZXMgKG9iamVjdHMpIHdoaWNoIHlvdSB1c2UgdG8gbWFrZSB2ZXJ5IHNwZWNpZmljCitvYmplY3RzLgorCitJZiB5b3UgaGFkIHRvIHdyaXRlIHRoZSBjb2RlIG5lY2Vzc2FyeSBmb3IgeW91IHRvIGRlZmluZSB0aGUgd29ya3Jvb20gYWJvdmUsCit5b3Ugd291bGQgaGF2ZSB0byB3cml0ZSBhYm91dCAxMDAwIGxpbmVzIG9mIGNvZGUgdG8gZ2V0IGFsbCB0aGUgZnVuY3Rpb25hbGl0eQorb2YgdGhlIHJvb20gYWJvdmUuICBDbGVhcmx5IHRoYXQgaXMgYSB3YXN0ZSBvZiBkaXNrIHNwYWNlLiAgSW4gYWRkaXRpb24sCitzdWNoIGNvZGUgZG9lcyBub3QgaW50ZXJhY3Qgd2VsbCB3aXRoIHBsYXllcnMgYW5kIG90aGVyIHJvb21zIHNpbmNlIGV2ZXJ5CitjcmVhdG9yIGlzIG1ha2luZyB1cCBoaXMgb3IgaGVyIG93biBmdW5jdGlvbnMgdG8gcGVyZm9ybSB0aGUgZnVuY3Rpb25hbGl0eQorb2YgYSByb29tLiAgVGh1cywgd2hhdCB5b3UgbWlnaHQgdXNlIHRvIHdyaXRlIG91dCB0aGUgcm9vbSdzIGxvbmcgZGVzY3JpcHRpb24sCitxdWVyeV9sb25nKCksIGFub3RoZXIgd2l6YXJkIG1pZ2h0IGJlIGNhbGxpbmcgbG9uZygpLiAgVGhpcyBpcyB0aGUgcHJpbWFyeQorcmVhc29uIG11ZGxpYnMgYXJlIG5vdCBjb21wYXRpYmxlLCBzaW5jZSB0aGV5IHVzZSBkaWZmZXJlbnQgcHJvdG9jb2xzIGZvcgorb2JqZWN0IGludGVyYWN0aW9uLgorCitPT1Agb3ZlcmNvbWVzIHRoZXNlIHByb2JsZW1zLiAgSW4gdGhlIGFib3ZlIHdvcmtyb29tLCB5b3UgaW5oZXJpdCB0aGUKK2Z1bmN0aW9ucyBhbHJlYWR5IGRlZmluZWQgaW4gYSBmaWxlIGNhbGxlZCAiL3N0ZC9yb29tLmMiLiAgSXQgaGFzIGFsbAordGhlIGZ1bmN0aW9ucyB3aGljaCBhcmUgY29tbW9ubHkgbmVlZGVkIGJ5IGFsbCByb29tcyBkZWZpbmVkIGluIGl0LiAgV2hlbgoreW91IGdldCB0byBtYWtlIGEgc3BlY2lmaWMgcm9vbSwgeW91IGFyZSB0YWtpbmcgdGhlIGdlbmVyYWwgZnVuY3Rpb25hbGl0eQorb2YgdGhhdCByb29tIGZpbGUgYW5kIG1ha2luZyBhIHVuaXF1ZSByb29tIGJ5IGFkZGluZyB5b3VyIG93biBmdW5jdGlvbiwKK2NyZWF0ZSgpLgorCis1LjMgSG93IGluaGVyaXRhbmNlIHdvcmtzCitBcyB5b3UgbWlnaHQgaGF2ZSBndWVzc2VkIGJ5IG5vdywgdGhlIGxpbmU6CisKKy0tLS0tCitpbmhlcml0ICIvc3RkL3Jvb20iOworLS0tLS0KKworaGFzIHlvdSBpbmhlcml0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSByb29tICIvc3RkL3Jvb20uYyIuICBCeSBpbmhlcml0aW5nCit0aGUgZnVuY3Rpb25hbGl0eSwgaXQgbWVhbnMgdGhhdCB5b3UgY2FuIHVzZSB0aGUgZnVuY3Rpb25zIHdoaWNoIGhhdmUKK2JlZW4gZGVjbGFyZWQgYW5kIGRlZmluZWQgaW4gdGhlIGZpbGUgIi9zdGQvcm9vbS5jIiAgSW4gdGhlIE5pZ2h0bWFyZSBNdWRsaWIsCisiL3N0ZC9yb29tLmMiIGhhcywgYW1vbmcgb3RoZXIgZnVuY3Rpb25zLCBzZXRfcHJvcGVydHkoKSwgc2V0KCksIGFuZAorc2V0X2V4aXRzKCkgZGVjbGFyZWQgYW5kIGRlZmluZWQuICBJbiB5b3VyIGZ1bmN0aW9uIGNyZWF0ZSgpLCB5b3UgYXJlCittYWtpbmcgY2FsbHMgdG8gdGhvc2UgZnVuY3Rpb25zIGluIG9yZGVyIHRvIHNldCB2YWx1ZXMgeW91IHdhbnQgeW91cgorcm9vbSB0byBzdGFydCB3aXRoLiAgVGhlc2UgdmFsdWVzIG1ha2UgeW91ciByb29tIGRpZmZlcmVudCBmcm9tIG90aGVycywgeWV0CithYmxlIHRvIGludGVyYWN0IHdlbGwgd2l0aCBvdGhlciBvYmplY3RzIGluIG1lbW9yeS4KKworSW4gYWN0dWFsIHByYWN0aWNlLCBlYWNoIG11ZGxpYiBpcyBkaWZmZXJlbnQsIGFuZCB0aHVzIHJlcXVpcmVzIHlvdSB0byB1c2UKK2EgZGlmZmVyZW50IHNldCBvZiBzdGFuZGFyZCBmdW5jdGlvbnMsIG9mdGVuIHRvIGRvIHRoZSBzYW1lIHRoaW5nLiAgSXQgaXMKK3RoZXJlZm9yZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgdGV4dGJvb2sgZXZlbiB0byBkZXNjcmliZSB3aGF0CitmdW5jdGlvbnMgZXhpc3QgYW5kIHdoYXQgdGhleSBkby4gIElmIHlvdXIgbXVkbGliIGlzIHdlbGwgZG9jdW1lbnRlZCwKK2hvd2V2ZXIsIHRoZW4gKHByb2JhYmx5IGluIC9kb2MvYnVpbGQpIHlvdSB3aWxsIGhhdmUgdHV0b3JpYWxzIG9uIGhvdwordG8gdXNlIHRoZSBpbmhlcml0YWJsZSBmaWxlcyB0byBjcmVhdGUgc3VjaCBvYmplY3RzLiAgVGhlc2UgdHV0b3JpYWxzCitzaG91bGQgdGVsbCB5b3Ugd2hhdCBmdW5jdGlvbnMgZXhpc3QsIHdoYXQgaW5wdXQgdGhleSB0YWtlLCB0aGUgZGF0YQordHlwZSBvZiB0aGVpciBvdXRwdXQsIGFuZCB3aGF0IHRoZXkgZG8uCisKKzUuNCBDaGFwdGVyIHN1bW1hcnkKK1RoaXMgaXMgZmFyIGZyb20gYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBvZiB0aGUgY29tcGxleCBzdWJqZWN0IG9mIGluaGVyaXRhbmNlLgorVGhlIGlkZWEgaGVyZSBpcyBmb3IgeW91IHRvIGJlIGFibGUgdG8gdW5kZXJzdGFuZCBob3cgdG8gdXNlIGluaGVyaXRhbmNlIGluCitjcmVhdGluZyB5b3VyIG9iamVjdHMuICBBIGZ1bGwgZGlzY3Vzc2lvbiB3aWxsIGZvbGxvdyBpbiBhIGxhdGVyIHRleHRib29rLgorUmlnaHQgbm93IHlvdSBzaG91bGQga25vdyB0aGUgZm9sbG93aW5nOgorICAgIDEpIEVhY2ggbXVkbGliIGhhcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBvYmplY3RzIHdpdGggdGhlaXIgb3duIGdlbmVyYWwKKyAgICAgICBmdW5jdGlvbnMgdXNlZCBieSBjcmVhdG9ycyB0aHJvdWdoIGluaGVyaXRhbmNlIHRvIG1ha2UgY29kaW5nIG9iamVjdHMKKyAgICAgICBlYXNpZXIgYW5kIHRvIG1ha2UgaW50ZXJhY3Rpb24gYmV0d2VlbiBvYmplY3RzIHNtb290aGVyLgorICAgIDIpIFRoZSBmdW5jdGlvbnMgaW4gdGhlIGluaGVyaXRhYmxlIGZpbGVzIG9mIGEgbXVkbGliIHZhcnkgZnJvbSBtdWRsaWIKKyAgICAgICB0byBtdWRsaWIuICBUaGVyZSBzaG91bGQgZXhpc3QgZG9jdW1lbnRhdGlvbiBvbiB5b3VyIG11ZCBvbiBob3cgdG8KKyAgICAgICB1c2UgZWFjaCBpbmhlcml0YWJsZSBmaWxlLiAgSWYgeW91IGFyZSB1bmF3YXJlIHdoYXQgZnVuY3Rpb25zIGFyZQorICAgICAgIGF2YWlsYWJsZSwgdGhlbiB0aGVyZSBpcyBzaW1wbHkgbm8gd2F5IGZvciB5b3UgdG8gdXNlIHRoZW0uICBBbHdheXMKKyAgICAgICBwYXkgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGhlIGRhdGEgdHlwZXMgb2YgdGhlIGlucHV0IGFuZCB0aGUgZGF0YQorICAgICAgIHR5cGVzIG9mIGF5IG91dHB1dC4KKyAgICAzKSBZb3UgaW5oZXJpdCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbm90aGVyIG9iamVjdCB0aHJvdWdoIHRoZSBsaW5lOgorCistLS0tLQoraW5oZXJpdCAiZmlsZW5hbWUiOworLS0tLS0KKyAgICAgICAKKyAgICAgICB3aGVyZSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGluaGVyaXRlZC4KKyAgICAgICBUaGlzIGxpbmUgZ29lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgY29kZS4KKworTm90ZToKK1lvdSBtYXkgc2VlIHRoZSBzeW50YXggOjpjcmVhdGUoKSBvciA6OmluaXQoKSBvciA6OnJlc2V0KCkgaW4gcGxhY2VzLgorWW91IGRvIG5vdCBuZWVkIGZ1bGx5IHRvIHVuZGVyc3RhbmQgYXQgdGhpcyBwb2ludCB0aGUgZnVsbCBudWFuY2VzIG9mIHRoaXMsCitidXQgeW91IHNob3VsZCBoYXZlIGEgY2x1ZSBhcyB0byB3aGF0IGl0IGlzLiBUaGUgIjo6IiBvcGVyYXRvciBpcyBhIHdheQordG8gY2FsbCBhIGZ1bmN0aW9uIHNwZWNpZmljYWxseSBpbiBhbiBpbmhlcml0ZWQgb2JqZWN0IChjYWxsZWQgdGhlIHNjb3BlCityZXNvbHV0aW9uIG9wZXJhdG9yKS4gIEZvciBpbnN0YW5jZSwgbW9zdCBtdWRzJyByb29tLmMgaGFzIGEgZnVuY3Rpb24KK2NhbGxlZCBjcmVhdGUoKS4gIFdoZW4geW91IGluaGVyaXQgcm9vbS5jIGFuZCBjb25maWd1cmUgaXQsIHlvdSBhcmUgZG9pbmcKK3doYXQgaXMgY2FsbGVkIG92ZXJyaWRpbmcgdGhlIGNyZWF0ZSgpIGZ1bmN0aW9uIGluIHJvb20uYy4gIFRoaXMgbWVhbnMKK3RoYXQgd2hlbmV2ZXIgQU5ZVEhJTkcgY2FsbHMgY3JlYXRlKCksIGl0IHdpbGwgY2FsbCAqeW91ciogdmVyc2lvbiBhbmQgbm90Cit0aGUgb25lIGluIHJvb20uYy4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBpbXBvcnRhbnQgc3R1ZmYgaW4gdGhlIHJvb20uYwordmVyc2lvbiBvZiBjcmVhdGUoKS4gIFRoZSA6OiBvcGVyYXRvciBhbGxvd3MgeW91IHRvIGNhbGwgdGhlIGNyZWF0ZSgpIGluCityb29tLmMgaW5zdGVhZCBvZiB5b3VyIGNyZWF0ZSgpLgorQW4gZXhhbXBsZToKKworLS0tLS0KKyMxCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKK3ZvaWQgY3JlYXRlKCkgeyBjcmVhdGUoKTsgfQorLS0tLS0KKworLS0tLS0KKyMyCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKK3ZvaWQgY3JlYXRlKCkgeyA6OmNyZWF0ZSgpOyB9CistLS0tLQorCitFeGFtcGxlIDEgaXMgYSBob3Jyb3IuICBXaGVuIGxvYWRlZCwgdGhlIGRyaXZlciBjYWxscyBjcmVhdGUoKSwgYW5kIHRoZW4KK2NyZWF0ZSgpIGNhbGxzIGNyZWF0ZSgpLCB3aGljaCBjYWxscyBjcmVhdGUoKSwgd2hpY2ggY2FsbHMgY3JlYXRlKCkuLi4KK0luIG90aGVyIHdvcmRzLCBhbGwgY3JlYXRlKCkgZG9lcyBpcyBrZWVwIGNhbGxpbmcgaXRzZWxmIHVudGlsIHRoZSBkcml2ZXIKK2RldGVjdHMgYSB0b28gZGVlcCByZWN1cnNpb24gYW5kIGV4aXRzLgorCitFeGFtcGxlIDIgaXMgYmFzaWNhbGx5IGp1c3QgYSB3YXN0ZSBvZiBSQU0sIGFzIGl0IGlzIG5vIGRpZmZlcmVudCBmcm9tIHJvb20uYworZnVuY3Rpb25hbGx5LiAgV2l0aCBpdCwgdGhlIGRyaXZlciBjYWxscyBpdHMgY3JlYXRlKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKzo6Y3JlYXRlKCksIHRoZSBjcmVhdGUoKSBpbiByb29tLmMuICBPdGhlcndpc2UgaXQgaXMgZnVuY3Rpb25hbGx5CitleGFjdGx5IHRoZSBzYW1lIGFzIHJvb20uYy4KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI2IGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2NDIxNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI2CkBAIC0wLDAgKzEsMzMzIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEMgQmFzaWNzCisgICAgICAgICAgICAgICAgICBXcml0dGVuIGJ5IERlc2NhcnRlcyBvZiBCb3JnCisgICAgICAgICAgICAgICAgICBmaXJzdCBlZGl0aW9uOiAyMyBhcHJpbCAxOTkzCisgICAgICAgICAgICAgICAgICBzZWNvbmQgZWRpdGlvbjoganVseSA1IDE5OTMKKworQ0hBUFRFUiA2OiBWYXJpYWJsZSBIYW5kbGluZworCis2LjEgUmV2aWV3CitCeSBub3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIGNvZGUgc29tZSBzaW1wbGUgb2JqZWN0cyB1c2luZyB5b3VyIG11ZHMgc3RhbmRhcmQKK29iamVjdCBsaWJyYXJ5LiAgSW5oZXJpdGFuY2UgYWxsb3dzIHlvdSB0byB1c2UgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhvc2UKK29iamVjdHMgd2l0aG91dCBoYXZpbmcgdG8gZ28gYW5kIGRlZmluZSB5b3Vyc2VsZi4gIEluIGFkZGl0aW9uLAoreW91IHNob3VsZCBrbm93IGhvdyB0byBkZWNsYXJlIHlvdXIgb3duIGZ1bmN0aW9ucy4gIFRoaXMKK2NoYXB0ZXIgd2lsbCB0ZWFjaCB5b3UgYWJvdXQgdGhlIGJhc2ljIGVsZW1lbnRzIG9mIExQQyB3aGljaCB3aWxsIGFsbG93IHlvdSB0bworZGVmaW5lIHlvdXIgb3duIGZ1bmN0aW9ucyB1c2luZyB0aGUgbWFuaXB1bGF0aW9uIG9mIHZhcmlhYmxlcy4KKworNi4yIFZhbHVlcyBhbmQgb2JqZWN0cworQmFzaWNhbGx5LCB3aGF0IG1ha2VzIG9iamVjdHMgb24gdGhlIG11ZCBkaWZmZXJlbnQgYXJlIHR3byB0aGluZ3M6CisxKSBTb21lIGhhdmUgZGlmZmVyZW50IGZ1bmN0aW9ucworMikgQWxsIGhhdmUgZGlmZmVyZW50IHZhbHVlcworCitOb3csIGFsbCBwbGF5ZXIgb2JqZWN0cyBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9ucy4gIFRoZXkgYXJlIHRoZXJlZm9yZQorZGlmZmVyZW50aWF0ZWQgYnkgdGhlIHZhbHVlcyB0aGV5IGhvbGQuICBGb3IgaW5zdGFuY2UsIHRoZSBwbGF5ZXIKK25hbWVkICJGb3Jsb2NrIiBpcyBkaWZmZXJlbnQgZnJvbSAiRGVzY2FydGVzIiAqYXQgbGVhc3QqIGluIHRoYXQgdGhleQoraGF2ZSBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgdmFyaWFibGUgdHJ1ZV9uYW1lLCB0aG9zZSBiZWluZworImRlc2NhcnRlcyIgYW5kICJmb3Jsb2NrIi4KKworVGhlcmVmb3JlLCBjaGFuZ2VzIGluIHRoZSBnYW1lIGludm9sdmUgY2hhbmdlcyBpbiB0aGUgdmFsdWVzIG9mIHRoZSBvYmplY3RzCitpbiB0aGUgZ2FtZS4gIEZ1bmN0aW9ucyBhcmUgdXNlZCB0byBuYW1lIHNwZWNpZmljIHByb2Nlc3MgZm9yIG1hbmlwdWxhdGluZwordmFsdWVzLiAgRm9yIGluc3RhbmNlLCB0aGUgY3JlYXRlKCkgZnVuY3Rpb24gaXMgdGhlIGZ1bmN0aW9uIHdob3NlCitwcm9jZXNzIGlzIHNwZWNpZmljYWxseSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0LgorV2l0aGluIGEgZnVuY3Rpb24sIGl0IGlzIHNwZWNpZmljYWxseSB0aGluZ3MgY2FsbGVkIGluc3RydWN0aW9ucyB3aGljaCBhcmUKK3Jlc3BvbnNpYmxlIGZvciB0aGUgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiB2YXJpYWJsZXMuCisKKzYuMyBMb2NhbCBhbmQgZ2xvYmFsIHZhcmlhYmxlcworTGlrZSB2YXJpYWJsZXMgaW4gbW9zdCBwcm9ncmFtbWluZyBsYW5ndWFnZSwgTFBDIHZhcmlhYmxlcyBtYXkgYmUgZGVjbGFyZWQKK2FzIHZhcmlhYmxlcyAibG9jYWwiIHRvIGEgc3BlY2lmaWMgZnVuY3Rpb24sIG9yICJnbG9iYWxseSIgYXZhaWxhYmxlCit0byBhbGwgZnVuY3Rpb25zLiAgTG9jYWwgdmFyaWFibGVzIGFyZSBkZWNsYXJlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uIHdoaWNoCit3aWxsIHVzZSB0aGVtLiAgTm8gb3RoZXIgZnVuY3Rpb24ga25vd3MgYWJvdXQgdGhlaXIgZXhpc3RlbmNlLCBzaW5jZQordGhlIHZhbHVlcyBhcmUgb25seSBzdG9yZWQgaW4gbWVtb3J5IHdoaWxlIHRoYXQgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuCitBIGdsb2JhbCB2YXJpYWJsZSBpcyBhdmFpbGFibGUgdG8gYW55IGZ1bmN0aW9uIHdoaWNoIGNvbWVzIGFmdGVyIGl0cworZGVjbGFyYXRpb24gaW4gdGhlIG9iamVjdCBjb2RlLiAgU2luY2UgZ2xvYmFsIHZhcmlhYmxlcyB0YWtlIHVwIFJBTSBmb3IKK3RoZSBlbnRpcmUgZXhpc3RlbmNlIG9mIHRoZSBvYmplY3QsIHlvdSBzaG91bGQgdXNlIHRoZW0gb25seSB3aGVuCit5b3UgbmVlZCBhIHZhbHVlIHN0b3JlZCBmb3IgdGhlIGVudGlyZSBleGlzdGVuY2Ugb2YgdGhlIG9iamVjdC4KK0hhdmUgYSBsb29rIGF0IHRoZSBmb2xsb3dpbmcgMiBiaXRzIG9mIGNvZGU6CisKKy0tLS0tCitpbnQgeDsKKworaW50IHF1ZXJ5X3goKSB7IHJldHVybiB4OyB9CisKK3ZvaWQgc2V0X3goaW50IHkpIHsgeCA9IHk7IH0KKy0tLS0tCisKKy0tLS0tCit2b2lkIHNldF94KGludCB5KSB7CisgICAgaW50IHg7CisKKyAgICB4ID0geTsKKyAgICB3cml0ZSgieCBpcyBzZXQgdG8geCIreCsiIGFuZCB3aWxsIG5vdyBiZSBmb3Jnb3R0ZW4uXG4iKTsKK30KKy0tLS0tCisKK0luIHRoZSBmaXJzdCBleGFtcGxlLCB4IGlzIGRlY2xhcmVkIG91dHNpZGUgb2YgYW55IGZ1bmN0aW9ucywgYW5kIHRoZXJlZm9yZQord2lsbCBiZSBhdmFpbGFibGUgdG8gYW55IGZ1bmN0aW9uIGRlY2xhcmVkIGFmdGVyIGl0LiAgSW4gdGhhdCBleGFtcGxlLAoreCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4KK0luIHRoZSBzZWNvbmQgZXhhbXBsZSwgeCBpcyBkZWNsYXJlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uIHNldF94KCkuICBJdAorb25seSBleGlzdHMgd2hpbGUgdGhlIGZ1bmN0aW9uIHNldF94KCkgaXMgYmVpbmcgZXhlY3V0ZWQuICBBZnRlcndhcmRzLAoraXQgY2Vhc2VzIHRvIGV4aXN0LiAgSW4gdGhhdCBleGFtcGxlLCB4IGlzIGEgbG9jYWwgdmFyaWFibGUuCisKKzYuNCBNYW5pcHVsYXRpbmcgdGhlIHZhbHVlcyBvZiB2YXJpYWJsZXMKK0luc3RydWN0aW9ucyB0byB0aGUgZHJpdmVyIGFyZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIHZhbHVlcyBvZiB2YXJpYWJsZXMuCitBbiBleGFtcGxlIG9mIGFuIGluc3RydWN0aW9uIHdvdWxkIGJlOgorCistLS0tLQoreCA9IDU7CistLS0tLQorCitUaGUgYWJvdmUgaW5zdHJ1Y3Rpb24gaXMgc2VsZi1leHBsYW5hdG9yeS4gIEl0IGFzc2lnbnMgdG8gdGhlIHZhcmlhYmxlCit4IHRoZSB2YWx1ZSA1LiAgSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgaW1wb3J0YW50IGNvbmNlcHRzIGluIGludm9sdmVkCitpbiB0aGF0IGluc3RydWN0aW9uIHdoaWNoIGFyZSBpbnZvbHZlZCBpbiBpbnN0cnVjdGlvbnMgaW4gZ2VuZXJhbC4KK1RoZSBmaXJzdCBpbnZvbHZlcyB0aGUgY29uY2VwdCBvZiBhbiBleHByZXNzaW9uLiAgQW4gZXhwcmVzc2lvbiBpcworYW55IHNlcmllcyBvZiBzeW1ib2xzIHdoaWNoIGhhdmUgYSB2YWx1ZS4gIEluIHRoZSBhYm92ZSBpbnN0cnVjdGlvbiwKK3RoZSB2YXJpYWJsZSB4IGlzIGFzc2lnbmVkIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiA1LiAgQ29uc3RhbnQKK3ZhbHVlcyBhcmUgdGhlIHNpbXBsZXN0IGZvcm1zIGluIHdoaWNoIGV4cHJlc3Npb25zIGNhbiBiZSBwdXQuICBBIGNvbnN0YW50CitpcyBhIHZhbHVlIHRoYXQgbmV2ZXIgY2hhbmdlcyBsaWtlIHRoZSBpbnQgNSBvciB0aGUgc3RyaW5nICJoZWxsbyIuCitUaGUgbGFzdCBjb25jZXB0IGlzIHRoZSBjb25jZXB0IG9mIGFuIG9wZXJhdG9yLiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsCit0aGUgYXNzaWdubWVudCBvcGVyYXRvciA9IGlzIHVzZWQuCisKK1RoZXJlIGFyZSBob3dldmVyIG1hbnkgbW9yZSBvcGVyYXRvcnMgaW4gTFBDLCBhbmQgZXhwcmVzc2lvbnMgY2FuIGdldAorcXVpdGUgY29tcGxleC4gIElmIHdlIGdvIHVwIG9uZSBsZXZlbCBvZiBjb21wbGV4aXR5LCB3ZSBnZXQ6CisKKy0tLS0tCit5ID0gNTsKK3ggPSB5ICsyOworLS0tLS0KKworVGhlIGZpcnN0IGluc3RydWN0aW9uIHVzZXMgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgdG8gYXNzaWduIHRoZSB2YWx1ZQorb2YgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gNSB0byB0aGUgdmFyaWFibGUgeS4gIFRoZSBzZWNvbmQgb25lCit1c2VzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGFzc2lnbiB0byB4IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgorKHkrMikgd2hpY2ggdXNlcyB0aGUgYWRkaXRpb24gb3BlcmF0b3IgdG8gY29tZSB1cCB3aXRoIGEgdmFsdWUgd2hpY2gKK2lzIHRoZSBzdW0gb2YgdGhlIHZhbHVlIG9mIHkgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiAyLgorU291bmQgbGlrZSBhIGxvdCBvZiBob3QgYWlyPworCitJbiBhbm90aGVyIG1hbm5lciBvZiBzcGVha2luZywgb3BlcmF0b3JzIGNhbiBiZSB1c2VkIHRvIGZvcm0gY29tcGxleAorZXhwcmVzc2lvbnMuICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlcmUgYXJlIHR3byBleHByZXNzaW9ucyBpbiB0aGUKK29uZSBpbnN0cnVjdGlvbiB4ID0geSArIDI7OgorICAgIDEpIHRoZSBleHByZXNzaW9uIHkrMgorICAgIDIpIHRoZSBleHByZXNzaW9uIHggPSB5ICsgMgorQXMgc3RhdGVkIGJlZm9yZSwgYWxsIGV4cHJlc3Npb25zIGhhdmUgYSB2YWx1ZS4gIFRoZSBleHByZXNzaW9uCit5KzIgaGFzIHRoZSB2YWx1ZSBvZiB0aGUgc3VtIG9mIHkgYW5kIDIgKGhlcmUsIDcpOworVGhlIGV4cHJlc3Npb24geCA9IHkgKyAyICphbHNvKiBoYXMgdGhlIHZhbHVlIG9mIDcuCitTbyBvcGVyYXRvcnMgaGF2ZSB0byBpbXBvcnRhbnQgdGFza3M6CisgICAgMSkgVGhleSAqbWF5KiBhY3QgdXBvbiBpbnB1dCBsaWtlIGEgZnVuY3Rpb24KKyAgICAyKSBUaGV5IGV2YWx1YXRlIGFzIGhhdmluZyBhIHZhbHVlIHRoZW1zZWx2ZXMuCitOb3csIG5vdCBhbGwgb3BlcmF0b3JzIGRvIHdoYXQgMSBkb2VzLiAgVGhlID0gb3BlcmF0b3JzIGRvZXMgYWN0IHVwb24KK3RoZSB2YWx1ZSBvZiA3IG9uIGl0cyByaWdodCBieSBhc3NpZ25pbmcgdGhhdCB2YWx1ZSB0byB4LiAgVGhlIG9wZXJhdG9yCisrIGhvd2V2ZXIgZG9lcyBub3RoaW5nLiAgVGhleSBib3RoLCBob3dldmVyLCBoYXZlIHRoZWlyIG93biB2YWx1ZXMuCisKKzYuNSBDb21wbGV4IGV4cHJlc3Npb25zCitBcyB5b3UgbWF5IGhhdmUgbm90aWNlZCBhYm92ZSwgdGhlIGV4cHJlc3Npb24geCA9IDUgKml0c2VsZiogaGFzIGEgdmFsdWUKK29mIDUuICBJbiBmYWN0LCBzaW5jZSBMUEMgb3BlcmF0b3JzIHRoZW1zZWx2ZXMgaGF2ZSB2YWx1ZSBhcyBleHByZXNzaW9ucywKK3RoZXkgY2FsIGFsbG93IHlvdSB0byB3cml0ZSBzb21lIHJlYWxseSBjb252b2x1dGVkIGxvb2tpbmcgbm9uc2Vuc2UgbGlrZToKKyAgICBpID0gKCAoeD1zaXplb2YodG1wPXVzZXJzKCkpKSA/IC0teCA6IHNpemVvZih0bXA9Y2hpbGRyZW4oIi9zdGQvbW9uc3RlciIpKS0xKQord2hpY2ggc2F5cyBiYXNpY2FsbHk6CisgICAgYXNzaW5nIHRvIHRtcCB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgdGhlIGVmdW4gdXNlcnMoKSwgdGhlbiBhc3NpZ24gdG8geAorICAgIHRoZSB2YWx1ZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRoYXQgYXJyYXkuICBJZiB0aGUgdmFsdWUKKyAgICBvZiB0aGUgZXhwcmVzc2lvbiBhc3NpZ25pbmcgdGhlIHZhbHVlIHRvIHggaXMgdHJ1ZSAobm90IDApLCB0aGVuIGFzc2lnbgorICAgIHggYnkgMSBhbmQgYXNzaWduIHRoZSB2YWx1ZSBvZiB4LTEgdG8gaS4gIElmIHggaXMgZmFsc2UgdGhvdWdoLAorICAgIHRoZW4gc2V0IHRtcCB0byB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgdGhlIGVmdW4gY2hpbGRyZW4oKSwgYW5kIHRoZW4KKyAgICBhc3NpZ24gdG8gaSB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBvZiBtZW1iZXJzIGluIHRoZSBhcnJheSB0bXAgLTEuCitXb3VsZCB5b3UgZXZlciB1c2UgdGhlIGFib3ZlIHN0YXRlbWVudD8gSSBkb3VidCBpdC4gIEhvd2V2ZXIgeW91IG1pZ2h0CitzZWUgb3IgdXNlIGV4cHJlc3Npb25zIHNpbWlsYXIgdG8gaXQsIHNpbmNlIHRoZSBhYmlsaXR5IHRvIGNvbnNvbGlkYXRlCitzbyBtdWNoIGluZm9ybWF0aW9uIGludG8gb25lIHNpbmdsZSBsaW5lIGhlbHBzIHRvIHNwZWVkIHVwIHRoZSBleGVjdXRpb24gb2YKK3lvdXIgY29kZS4gIEEgbW9yZSBvZnRlbiB1c2VkIHZlcnNpb24gb2YgdGhpcyBwcm9wZXJ0eSBvZiBMUEMgb3BlcmF0b3JzCit3b3VsZCBiZSBzb21ldGhpbmcgbGlrZToKKyAgICB4ID0gc2l6ZW9mKHRtcCA9IHVzZXJzKCkpOworICAgIHdoaWxlKGktLSkgd3JpdGUoKHN0cmluZyl0bXBbaV0tPnF1ZXJ5X25hbWUoKSsiXG4iKTsKK2luc3RlYWQgb2Ygd3JpdGluZyBzb21ldGhpbmcgbGlrZToKKyAgICB0bXAgPSB1c2VycygpOworICAgIHggPSBzaXplb2YodG1wKTsKKyAgICBmb3IoaT0wOyBpPHg7IGkrKykgd3JpdGUoKHN0cmluZyl0bXBbaV0tPnF1ZXJ5X25hbWUoKSsiXG4iKTsKK1RoaW5ncyBsaWtlIGZvcigpLCB3aGlsZSgpLCBhcnJheXMgYW5kIHN1Y2ggd2lsbCBiZSBleHBsYWluZWQgbGF0ZXIuCitCdXQgdGhlIGZpcnN0IGJpdCBvZiBjb2RlIGlzIG1vcmUgY29uY2lzZSBhbmQgaXQgZXhlY3V0ZWQgZmFzdGVyLgorCitOT1RFOiBBIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsbCBiYXNpYyBMUEMgb3BlcmF0b3JzIGZvbGxvd3MgdGhlIGNoYXB0ZXIKK3N1bW1hcnkuCisKKworNi42IENoYXB0ZXIgU3VtbWFyeQorWW91IG5vdyBrbm93IGhvdyB0byBkZWNsYXJlIHZhcmlhYmxlcyBhbmQgdW5kZXJzdGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCitkZWNsYXJpbmcgYW5kIHVzaW5nIHRoZW0gZ2xvYmFsbHkgb3IgbG9jYWxseS4gIE9uY2UgeW91IGJlY29tZSBmYW1pbGlhcgord2l0aCB5b3VyIGRyaXZlcidzIGVmdW5zLCB5b3UgY2FuIGRpc3BsYXkgdGhvc2UgdmFsdWVzIGluIG1hbnkgZGlmZmVyZW50Cit3YXlzLiAgSW4gYWRkaXRpb24sIHRocm91Z2ggdGhlIExQQyBvcGVyYXRvcnMsIHlvdSBrbm93IGhvdyB0byBjaGFuZ2UKK2FuZCBldmFsdWF0ZSB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB2YXJpYWJsZXMuICBUaGlzIGlzIHVzZWZ1bCBvZiBjb3Vyc2UKK2luIHRoYXQgaXQgYWxsb3dzIHlvdSB0byBkbyBzb21ldGhpbmcgbGlrZSBjb3VudCBob3cgbWFueSBhcHBsZXMgaGF2ZQorYmVlbiBwaWNrZWQgZnJvbSBhIHRyZWUsIHNvIHRoYXQgb25jZSBhbGwgYXBwbGVzIGhhdmUgYmVlbiBwaWNrZWQsIG5vCitwbGF5ZXJzIGNhbiBwaWNrIG1vcmUuICBVbmZvcnR1bmF0ZWx5LCB5b3UgZG8gbm90IGtub3cgaG93IHRvIGhhdmUKK2NvZGUgZXhlY3V0ZWQgaW4gYW55dGhpbmcgb3RoZXIgdGhhbiBhIGxpbmVyYSBmYXNoaW9uLiAgSW4gb3RoZXIgd29yZHMsCitob2xkIG9mZiBvbiB0aGF0IGFwcGxlIHVudGlsIHRoZSBuZXh0IGNoYXB0ZXIsIGNhdXNlIHlvdSBkbyBub3Qga25vdworaG93IHRvIGNoZWNrIGlmIHRoZSBhcHBsZXMgcGlja2VkIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYXBwbGVzIGluIHRoZQordHJlZS4gIFlvdSBhbHNvIGRvIG5vdCBrbm93IGFib3V0IHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGluaXQoKSB3aGVyZSB5b3UKK2dpdmUgbmV3IGNvbW1hbmRzIHRvIHBsYXllcnMuICBCdXQgeW91IGFyZSBhbG1vc3QgcmVhZHkgdG8gY29kZSBhIG5pY2UsCitmYWlybHkgY29tcGxleCBhcmVhLgorCis2LjcgTFBDIG9wZXJhdG9ycworVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgZGV0YWlsZWQgbGlzdGluZyBvZiB0aGUgc2ltcGxlciBMUEMgb3BlcmF0b3JzLAoraW5jbHVkaW5nIHdoYXQgdGhleSBkbyB0byB0aGUgdmFsdWVzIHRoZXkgdXNlIChpZiBhbnl0aGluZykgYW5kIHRoZSB2YWx1ZQordGhhdCB0aGV5IGhhdmUuCisKK1RoZSBvcGVyYXRvcnMgZGVzY3JpYmVkIGhlcmUgYXJlOgorPSAgICArICAgIC0gICAgKiAgICAvICAgICUgICAgKz0gICAgLT0gICAgKj0gICAgLz0gICAgJT0KKy0tICAgICsrICAgID09ICAgICE9ICAgID4gICAgPCAgICA+PSAgICA8PSAgICAhICAgICYmICAgIHx8CistPiAgICA/IDoKKworVGhvc2Ugb3BlcmF0b3JzIGFyZSBhbGwgZGVzY3JpYmVkIGluIGEgcmF0aGVyIGRyeSBtYW5uZXIgYmVsb3csIGJ1dCBpdCBpcyBiZXN0Cit0byBhdCBsZWFzdCBsb29rIGF0IGVhY2ggb25lLCBzaW5jZSBzb21lIG1heSBub3QgYmVoYXZlICpleGFjdGx5KiBhcworeW91IHRoaW5rLiAgQnV0IGl0IHNob3VsZCBtYWtlIGEgcmF0aGVyIGdvb2QgcmVmZXJlbmNlIGd1aWRlLgorCis9IGFzc2lnbm1lbnQgb3BlcmF0b3I6CisgICAgZXhhbXBsZTogeCA9IDU7CisgICAgdmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgb24gdGhlICpsZWZ0KiBhZnRlciBpdHMgZnVuY3Rpb24gaXMgZG9uZQorICAgIGV4cGxhbmF0aW9uOiBJdCB0YWtlcyB0aGUgdmFsdWUgb2YgYW55IGV4cHJlc3Npb24gb24gdGhlICpyaWdodCogYW5kCisgICAgICBhc3NpZ25zIGl0IHRvIHRoZSB2YXJpYWJsZSBvbiB0aGUgKmxlZnQqLiAgTm90ZSB0aGF0IHlvdSBtdXN0IHVzZQorICAgICAgYSBzaW5nbGUgdmFyaWFibGUgb24gdGhlIGxlZnQsIGFzIHlvdSBjYW5ub3QgYXNzaWduIHZhbHVlcyB0byAKKyAgICAgIGNvbnN0YW50cyBvciBjb21wbGV4IGV4cHJlc3Npb25zLgorCisrIGFkZGl0aW9uIG9wZXJhdG9yOgorICAgIGV4YW1wbGU6IHggKyA3CisgICAgdmFsdWU6IFRoZSBzdW0gb2YgdGhlIHZhbHVlIG9uIHRoZSBsZWZ0IGFuZCB0aGUgdmFsdWUgb24gdGhlIHJpZ2h0CisgICAgZXhhcGxhbmF0aW9uOiBJdCB0YWtlcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gb24gdGhlIHJpZ2h0IGFuZAorICAgICAgYWRkcyBpdCB0byB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gb24gdGhlIGxlZnQuIEZvciB2YWx1ZXMKKyAgICAgIG9mIHR5cGUgaW50LCB0aGlzIG1lYW5zIHRoZSBudW1lcmljYWwgc3VtLiAgRm9yIHN0cmluZ3MsCisgICAgICBpdCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBvbiB0aGUgcmlnaHQgaXMgc3R1Y2sgb250byB0aGUgdmFsdWUgb24KKyAgICAgIHRoZSBsZWZ0ICgiYWIiIGlzIHRoZSB2YWx1ZSBvZiAiYSIrImIiKS4gIFRoaXMgb3BlcmF0b3IgZG9lcyBub3QKKyAgICAgIG1vZGlmeSBhbnkgb2YgdGhlIG9yaWdpbmFsIHZhbHVlcyAoaS5lLiB0aGUgdmFyaWFibGUgeCBmcm9tCisgICAgICBhYm92ZSByZXRhaW5zIGl0cyBvbGQgdmFsdWUpLgorCistIHN1YnRyYWN0aW9uIG9wZXJhdG9yOgorICAgIGV4YW1wbGU6IHggLSA3CisgICAgdmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBvbiB0aGUgbGVmdCByZWR1Y2VkIGJ5IHRoZSByaWdodAorICAgIGV4cGxhbmF0aW9uOiAgU2FtZSBjaGFyYWN0ZXJpc3RpY3MgYXMgYWRkaXRpb24sIGV4Y2VwdCBpdCBzdWJ0cmFjdHMuCisgICAgICBXaXRoIHN0cmluZ3M6ICJhIiBpcyB0aGUgdmFsdWUgb2YgImFiIiAtICJiIgorCisqIG11bHRpcGxpY2F0aW9uIG9wZXJhdG9yOgorICAgIGV4YW1wbGU6IHgqNworICAgIHZhbHVlIGFuZCBleHBsYW5hdGlvbjogc2FtZSBhcyB3aXRoIGFkZGluZyBhbmQgc3VidHJhY3RpbmcgZXhjZXB0CisgICAgICB0aGlzIG9uZSBwZXJmb3JtcyB0aGUgbWF0aCBvZiBtdWx0aXBsaWNhdGlvbgorCisvIGRpdmlzaW9uIG9wZXJhdG9yOgorICAgIGV4YW1wbGU6IHgvNworICAgIHZhbHVlIGFuZCBleHBsYW5hdGlvbjogc2VlIGFib3ZlCisKKys9IGFkZGl0aXZlIGFzc2lnbm1lbnQgb3BlcmF0b3I6CisgICAgZXhhbXBsZTogeCArPSA1CisgICAgdmFsdWU6IHRoZSBzYW1lIGFzIHggKyA1CisgICAgZXhhcGxhbmF0aW9uOiBJdCB0YWtlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIG9uIHRoZSBsZWZ0CisgICAgICBhbmQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIG9uIHRoZSByaWdodCwgYWRkcyB0aGVtIHRvZ2V0aGVyCisgICAgICBhbmQgYXNzaWducyB0aGUgc3VtIHRvIHRoZSB2YXJpYWJsZSBvbiB0aGUgbGVmdC4KKyAgICAgIGV4YW1wbGU6IGlmIHggPSAyLi4uIHggKz0gNSBhc3NpZ25zIHRoZSB2YWx1ZQorICAgICAgICA3IHRvIHRoZSB2YXJpYWJsZSB4LiAgVGhlIHdob2xlIGV4cHJlc3Npb24KKyAgICAgICAgaGFzIHRoZSB2YWx1ZSBvZiA3LgorCistPSBzdWJ0cmFjdGlvbiBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgZXhhbXBsZTogeC09NworICAgIHZhbHVlOiB0aGUgdmFsdWUgb2YgdGhlIGxlZnQgdmFsdWUgcmVkdWNlZCBieSB0aGUgcmlnaHQgdmFsdWUKKyAgICBleGFtcGxhbmF0aW9uOiBUaGUgc2FtZSBhcyArPSBleGNlcHQgZm9yIHN1YnRyYWN0aW9uLgorCisqPSBtdWx0aXBsaWNhdGl2ZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgZXhhbXBsZTogeCAqPSA3CisgICAgdmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgbGVmdCB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHRoZSByaWdodAorICAgIGV4cGxhbmF0aW9uOiBTaW1pbGFyIHRvIC09IGFuZCArPSBleGNlcHQgZm9yIGFkZGl0aW9uLgorCisvPSBkaXZpc2lvbiBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgZXhhbXBsZTogeCAvPSA3CisgICAgdmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgb24gdGhlIGxlZnQgZGl2aWRlZCBieSB0aGUgcmlnaHQgdmFsdWUKKyAgICBleHBsYW5hdGlvbjogc2ltaWxhciB0byBhYm92ZSwgZXhjZXB0IHdpdGggZGl2aXNpb24KKworKysgcG9zdC9wcmUtaW5jcmVtZW50IG9wZXJhdG9ycworICAgIGV4YW1wbGVzOiBpKysgb3IgKytpCisgICAgdmFsdWVzOiAKKyAgICAgIGkrKyBoYXMgdGhlIHZhbHVlIG9mIGkKKyAgICAgICsraSBoYXMgdGhlIHZhbHVlIG9mIGkrMQorICAgIGV4cGxhbmF0aW9uOiArKyBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBpIGJ5IGluY3JlYXNpbmcgaXQgYnkgMS4KKyAgICAgIEhvd2V2ZXIsIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHdoZXJlIHlvdQorICAgICAgcGxhY2UgdGhlICsrLiAgKytpIGlzIHRoZSBwcmUtaW5jcmVtZW50IG9wZXJhdG9yLiAgVGhpcyBtZWFucworICAgICAgdGhhdCBpdCBwZXJmb3JtcyB0aGUgaW5jcmVtZW50ICpiZWZvcmUqIGdpdmluZyBhIHZhbHVlLgorICAgICAgaSsrIGlzIHRoZSBwb3N0LW5jcmVtZW50IG9wZXJhdG9yLiAgSXQgZXZhbHV0ZXMgYmVmb3JlIGluY3JlbWVudGluZworICAgICAgaS4gIFdoYXQgaXMgdGhlIHBvaW50PyAgV2VsbCwgaXQgZG9lcyBub3QgbXVjaCBtYXR0ZXIgdG8geW91IGF0CisgICAgICB0aGlzIHBvaW50LCBidXQgeW91IHNob3VsZCByZWNvZ25pemUgd2hhdCBpdCBtZWFucy4KKworLS0gcG9zdC9wcmUtZGVjcmVtZW50IG9wZXJhdG9ycworICAgIGV4YW1wbGVzOiBpLS0gb3IgLS1pCisgICAgdmFsdWVzOgorICAgICAgaS0tIHRoZSB2YWx1ZSBvZiBpCisgICAgICAtLWkgdGhlIHZhbHVlIG9mIGkgcmVkdWNlZCBieSAxCisgICAgZXhwbGFuYXRpb246IGxpa2UgKysgZXhjZXB0IGZvciBzdWJ0cmFjdGlvbgorCis9PSBlcXVhbGl0eSBvcGVyYXRvcgorICAgIGV4YW1wbGU6IHggPT0gNQorICAgIHZhbHVlOiB0cnVlIG9yIGZhbHNlIChub3QgMCBvciAwKQorICAgIGV4cGxhbmF0aW9uOiBpdCBkb2VzIG5vdGhpbmcgdG8gZWl0aGVyIHZhbHVlLCBidXQKKyAgICAgIGl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgMiB2YWx1ZXMgYXJlIHRoZSBzYW1lLgorICAgICAgSXQgcmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBub3QgZXF1YWwuCisKKyE9IGluZXF1YWxpdHkgb3BlcmF0b3IKKyAgICBleGFtcGxlOiB4ICE9IDUKKyAgICB2YWx1ZTogdHJ1ZSBvciBmYWxzZQorICAgIGV4cGxhbmF0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBleHByZXNzaW9uIGlzIG5vdCBlcXVhbCB0byB0aGUgcmlnaHQKKyAgICAgIGV4cHJlc3Npb24uICBJdCByZXR1cm5zIGZhbHMgaWYgdGhleSBhcmUgZXF1YWwKKworPiBncmVhdGVyIHRoYW4gb3BlcmF0b3IKKyAgICBleGFtcGxlOiB4ID4gNQorICAgIHZhbHVlOiB0cnVlIG9yIGZhbHNlCisgICAgZXhwbGFuYXRpb246IHRydWUgb25seSBpZiB4IGhhcyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA1CisgICAgICBmYWxzZSBpZiB0aGUgdmFsdWUgaXMgZXF1YWwgb3IgbGVzcworCis8IGxlc3MgdGhhbiBvcGVyYXRvcgorPj0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9wZXJhdG9yCis8PSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gb3BlcmF0b3IKKyAgICBleGFtcGxlczogeCA8IHkgICAgeCA+PSB5ICAgIHggPD0geQorICAgIHZhbHVlczogdHJ1ZSBvciBmYWxzZQorICAgIGV4cGxhbmF0aW9uOiBzaW1pbGFyIGFzIHRvID4gZXhjZXB0CisgICAgICA8IHRydWUgaWYgbGVmdCBpcyBsZXNzIHRoYW4gcmlnaHQKKyAgICAgID49IHRydWUgaWYgbGVmdCBpcyBncmVhdGVyIHRoYW4gKm9yIGVxdWFsIHRvKiByaWdodAorICAgICAgPD0gdHJ1ZSBpZiB0aGUgbGVmdCBpcyBsZXNzIHRoYW4gKm9yIGVxdWFsIHRvKiB0aGUgcmlnaHQKKworJiYgbG9naWNhbCBhbmQgb3BlcmF0b3IKK3x8IGxvZ2ljYWwgb3Igb3BlcmF0b3IKKyAgICBleGFtcGxlczogeCAmJiB5ICAgICAgeCB8fCB5CisgICAgdmFsdWVzOiB0cnVlIG9yIGZhbHNlCisgICAgZXhwbGFuYXRpb246IElmIHRoZSByaWdodCB2YWx1ZSBhbmQgbGVmdCB2YWx1ZSBhcmUgbm9uLXplcm8sICYmIGlzIHRydWUuCisgICAgICBJZiBlaXRoZXIgYXJlIGZhbHNlLCB0aGVuICYmIGlzIGZhbHNlLgorICAgICAgRm9yIHx8LCBvbmx5IG9uZSBvZiB0aGUgdmFsdWVzIG11c3QgYmUgdHJ1ZSBmb3IgaXQgdG8gZXZhbHVhdGUKKyAgICAgIGFzIHRydWUuICBJdCBpcyBvbmx5IGZhbHNlIGlmIGJvdGggdmFsdWVzIGluZGVlZAorICAgICAgYXJlIGZhbHNlCisKKyEgbmVnYXRpb24gb3BlcmF0b3IKKyAgICBleGFtcGxlOiAheAorICAgIHZhbHVlOiB0cnVlIG9yIGZhbHNlCisgICAgZXhwbGFuYXRpb246IElmIHggaXMgdHJ1ZSwgdGhlbiAheCBpcyBmYWxzZQorICAgICAgSWYgeCBpcyBmYWxzZSwgIXggaXMgdHJ1ZS4KKworQSBwYWlyIG9mIG1vcmUgY29tcGxpY2F0ZWQgb25lcyB0aGF0IGFyZSBoZXJlIGp1c3QgZm9yIHRoZSBzYWtlIG9mIGJlaW5nCitoZXJlLiAgRG8gbm90IHdvcnJ5IGlmIHRoZXkgdXR0ZXJseSBjb25mdXNlIHlvdS4KKworLT4gdGhlIGNhbGwgb3RoZXIgb3BlcmF0b3IKKyAgICBleGFtcGxlOiB0aGlzX3BsYXllcigpLT5xdWVyeV9uYW1lKCkKKyAgICB2YWx1ZTogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQKKyAgICBleHBsYW5hdGlvbjogIEl0IGNhbGxzIHRoZSBmdW5jdGlvbiB3aGljaCBpcyBvbiB0aGUgcmlnaHQgaW4gdGhlIG9iamVjdAorICAgICAgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgb3BlcmF0b3IuICBUaGUgbGVmdCBleHByZXNzaW9uICptdXN0KiBiZQorICAgICAgYW4gb2JqZWN0LCBhbmQgdGhlIHJpZ2h0IGV4cHJlc3Npb24gKm11c3QqIGJlIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24uCisgICAgICBJZiBub3Qgc3VjaCBmdW5jdGlvbiBleGlzdHMgaW4gdGhlIG9iamVjdCwgaXQgd2lsbCByZXR1cm4gMCAob3IKKyAgICAgIG1vcmUgY29ycmVjdGx5LCB1bmRlZmluZWQpLgorCis/IDogY29uZGl0aW9uYWwgb3BlcmF0b3IKKyAgICBleGFtcGxlOiB4ID8geSA6IHoKKyAgICB2YWx1ZXM6IGluIHRoZSBhYm92ZSBleGFtcGxlLCBpZiB4IGlzIHRyeSwgdGhlIHZhbHVlIGlzIHkKKyAgICAgIGlmIHggaXMgZmFsc2UsIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyB6CisgICAgZXhwbGFuYXRpb246IElmIHRoZSBsZWZ0bW9zdCB2YWx1ZSBpcyB0cnVlLCBpdCB3aWxsIGdpdmUgdGhlIGV4cHJlc3Npb24gYXMKKyAgICAgIGEgd2hvbGUgdGhlIHZhbHVlIG9mIHRoZSBtaWRkbGUgZXhwcmVzc2lvbi4gIEVsc2UsIGl0IHdpbGwgZ2l2ZSB0aGUKKyAgICAgIGV4cHJlc3Npb24gYXMgYSB3aG9sZSB0aGUgdmFsdWUgb2YgdGhlIHJpZ2h0bW9zdCBleHByZXNzaW9uLgorCitBIG5vdGUgb24gZXF1YWxpdHk6ICBBIHZlcnkgbmFzdHkgZXJyb3IgcGVvcGxlIG1ha2UgdGhhdCBpcyBWRVJZIGRpZmZpY3VsdAordG8gZGVidWcgaXMgdGhlIGVycm9yIG9mIHBsYWNpbmcgPSB3aGVyZSB5b3UgbWVhbiA9PS4gIFNpbmNlCitvcGVyYXRvcnMgcmV0dXJuIHZhbHVlcywgdGhleSBib3RoIG1ha2Ugc2Vuc2Ugd2hlbiBiZWluZyBldmFsdWF0ZWQuCitJbiBvdGhlciB3b3Jkcywgbm8gZXJyb3Igb2NjdXJzLiAgQnV0IHRoZXkgaGF2ZSB2ZXJ5IGRpZmZlcmVudCB2YWx1ZXMuICBGb3IgZXhhbXBsZToKKyAgaWYoeCA9PSA1KSAgICBpZih4ID0gNSkKK1RoZSB2YWx1ZSBvZiB4ID09IDUgaXMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgeCBpcyA1LCBmYWxzZSBvdGhld2lzZS4KK1RoZSB2YWx1ZSBvZiB4ID0gNSBpcyA1IChhbmQgdGhlcmVmb3JlIGFsd2F5cyB0cnVlKS4KK1RoZSBpZiBzdGF0ZW1lbnQgaXMgbG9va2luZyBmb3IgdGhlIGV4cHJlc3Npb24gaW4gKCkgdG8gYmUgZWl0aGVyIHRydWUgb3IgZmFsc2UsCitzbyBpZiB5b3UgaGFkID0gYW5kIG1lYW50ID09LCB5b3Ugd291bGQgZW5kIHVwIHdpdGggYW4gZXhwcmVzc2lvbiB0aGF0IGlzCithbHdheXMgdHJ1ZS4gIEFuZCB5b3Ugd291bGQgcHVsbCB5b3VyIGhhaXIgb3V0IHRyeWluZyB0byBmaWd1cmUgb3V0Cit3aHkgdGhpbmdzIHdlcmUgbm90IGhhcHBlbmluZyBsaWtlIHRoZXkgc2hvdWxkIDopCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNyBiL2RvYy9LVVJTL0xQQy1LVVJTL2NoYXB0ZXI3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjMxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyNwpAQCAtMCwwICsxLDQzMiBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDIEJhc2ljcworICAgICAgICAgICAgICAgICAgV3JpdHRlbiBieSBEZXNjYXJ0ZXMgb2YgQm9yZworICAgICAgICAgICAgICAgICAgZmlyc3QgZWRpdGlvbjogMjMgYXByaWwgMTk5MworICAgICAgICAgICAgICAgICAgc2Vjb25kIGVkaXRpb246IDEwIGp1bHkgMTk5MworCitDSEFQVEVSIDc6IEZsb3cgQ29udHJvbAorCis3LjEgUmV2aWV3IG9mIHZhcmlhYmxlcworVmFyaWFibGVzIG1heSBiZSBtYW5pcHVsYXRlZCBieSBhc3NpZ25pbmcgb3IgY2hhbmdpbmcgdmFsdWVzIHdpdGggdGhlCitleHByZXNzaW9ucyA9LCArPSwgLT0sICsrLCAtLS4gIFRob3NlIGV4cHJlc3Npb25zIG1heSBiZSBjb21iaW5lZCB3aXRoCit0aGUgZXhwcmVzc2lvbnMgLSwgKywgKiwgLywgJS4gIEhvd2V2ZXIsIHNvIGZhciwgeW91IGhhdmUgb25seSBiZWVuCitzaG93biBob3cgdG8gdXNlIGEgZnVuY3Rpb24gdG8gZG8gdGhlc2UgaW4gYSBsaW5lYXIgd2F5LiAgRm9yIGV4YW1wbGU6CisgCitpbnQgaGVsbG8oaW50IHgpIHsKKyAgICB4LS07CisgICAgd3JpdGUoIkhlbGxvLCB4IGlzICIreCsiLlxuIik7CisgICAgcmV0dXJuIHg7Cit9CisgCitpcyBhIGZ1bmN0aW9uIHlvdSBzaG91bGQga25vdyBob3cgdG8gd3JpdGUgYW5kIHVuZGVyc3RhbmQuICBCdXQgd2hhdAoraWYgeW91IHdhbnRlZCB0byB3cml0ZSB0aGUgdmFsdWUgb2YgeCBvbmx5IGlmIHggPSAxPyAgT3Igd2hhdCBpZgoreW91IHdhbnRlZCBpdCB0byBrZWVwIHdyaXRpbmcgeCBvdmVyIGFuZCBvdmVyIHVudGlsIHggPSAxIGJlZm9yZQorcmV0dXJuaW5nPyAgTFBDIHVzZXMgZmxvdyBjb250cm9sIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIEMgYW5kIEMrKy4KKworNy4yIFRoZSBMUEMgZmxvdyBjb250cm9sIHN0YXRlbWVudHMKK0xQQyB1c2VzIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnM6CisgCitpZihleHByZXNzaW9uKSBpbnN0cnVjdGlvbjsKKyAKK2lmKGV4cHJlc3Npb24pIGluc3RydWN0aW9uOworZWxzZSBpbnN0cnVjdGlvbjsKKyAKK2lmKGV4cHJlc3Npb24pIGluc3RydWN0aW9uOworZWxzZSBpZihleHByZXNzaW9uKSBpbnN0cnVjdGlvbjsKK2Vsc2UgaW5zdHJ1Y3Rpb247CisgCit3aGlsZShleHByZXNzaW9uKSBpbnN0cnVjdGlvbjsKKyAKK2RvIHsgaW5zdHJ1Y3Rpb247IH0gd2hpbGUoZXhwcmVzc2lvbik7CisgCitzd2l0Y2goZXhwcmVzc2lvbikgeworICAgIGNhc2UgKGV4cHJlc3Npb24pOiBpbnN0cnVjdGlvbjsgYnJlYWs7CisgICAgZGVmYXVsdDogaW5zdHJ1Y3Rpb247Cit9CisgCitCZWZvcmUgd2UgZGlzY3VzcyB0aGVzZSwgZmlyc3Qgc29tZXRoaW5nIG9uIHdoYXQgaXMgbWVhbnQgYnkgZXhwcmVzc2lvbiBhbmQKK2luc3RydWN0aW9uLiAgQW4gZXhwcmVzc2lvbiBpcyBhbnl0aGluZyB3aXRoIGEgdmFsdWUgbGlrZSBhIHZhcmlhYmxlLAorYSBjb21wYXJpc29uIChsaWtlIHg+NSwgd2hlcmUgaWYgeCBpcyA2IG9yIG1vcmUsIHRoZSB2YWx1ZSBpcyAxLCBlbHNlIHRoZQordmFsdWUgaXMgMCksIG9yIGFuIGFzc2lnbm1lbnQobGlrZSB4ICs9IDIpLiAgQW4gaW5zdHJ1Y3Rpb24gY2FuIGJlIGFueQorc2luZ2xlIGxpbmUgb2YgbHBjIGNvZGUgbGlrZSBhIGZ1bmN0aW9uIGNhbGwsIGEgdmFsdWUgYXNzaWdubWVudCBvcgorbW9kaWZpY2F0aW9uLCBldGMuCisgCitZb3Ugc2hvdWxkIGtub3cgYWxzbyB0aGUgb3BlcmF0b3JzICYmLCB8fCwgPT0sICE9LCBhbmQgIS4gIFRoZXNlIGFyZSB0aGUKK2xvZ2ljYWwgb3BlcmF0b3JzLiAgVGhleSByZXR1cm4gYSBub256ZXJvIHZhbHVlIHdoZW4gdHJ1ZSwgYW5kIDAgd2hlbiBmYWxzZS4KK01ha2Ugbm90ZSBvZiB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnM6CisgCisoMSAmJiAxKSB2YWx1ZTogMSAgICgxIGFuZCAxKQorKDEgJiYgMCkgdmFsdWU6IDAgICAoMSBhbmQgMCkKKygxIHx8IDApIHZhbHVlOiAxICAgKDEgb3IgMCkKKygxID09IDEpIHZhbHVlOiAxICAgKDEgaXMgZXF1YWwgdG8gMSkKKygxICE9IDEpIHZhbHVlOiAwICAgKDEgaXMgbm90IGVxdWFsIHRvIDEpCisoITEpIHZhbHVlOiAwICAgICAgIChub3QgMSkKKyghMCkgdmFsdWU6IDEgICAgICAgKG5vdCAwKQorIAorSW4gZXhwcmVzc2lvbnMgdXNpbmcgJiYsIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaXRlbSBiZWluZyBjb21wYXJlZAoraXMgMCwgdGhlIHNlY29uZCBpcyBuZXZlciB0ZXN0ZWQgZXZlbi4gIFdoZW4gdXNpbmcgfHwsIGlmIHRoZSBmaXJzdCBpcwordHJ1ZSAoMSksIHRoZW4gdGhlIHNlY29uZCBpcyBub3QgdGVzdGVkLgorIAorNy4zIGlmKCkKK1RoZSBmaXJzdCBleHByZXNzaW9uIHRvIGxvb2sgYXQgdGhhdCBhbHRlcnMgZmxvdyBjb250cm9sIGlzIGlmKCkuICBUYWtlCithIGxvb2sgYXQgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorIAorMSB2b2lkIHJlc2V0KCkgeworMiAgICAgaW50IHg7CiszCis0ICAgICA6OnJlc2V0KCk7Cis1ICAgICB4ID0gcmFuZG9tKDEwKTsKKzYgICAgIGlmKHggPiA1MCkgc2V0X3NlYXJjaF9mdW5jKCJmbG9vcmJvYXJkcyIsICJzZWFyY2hfZmxvb3IiKTsKKzcgfQorIAorVGhlIGxpbmUgbnVtYmVycyBhcmUgZm9yIHJlZmVyZW5jZSBvbmx5LgorSW4gbGluZSAyLCBvZiBjb3Vyc2Ugd2UgZGVjbGFyZSBhIHZhcmlhYmxlIG9mIHR5cGUgaW50IGNhbGxlZCB4LiAgTGluZSAzCitpcyBhZXRoZXRpYyB3aGl0ZXNwYWNlIHRvIGNsZWFybHkgc2hvdyB3aGVyZSB0aGUgZGVjbGFyYXRpb25zIGVuZCBhbmQgdGhlCitmdW5jdGlvbiBjb2RlIGJlZ2lucy4gIFRoZSB2YXJpYWJsZSB4IGlzIG9ubHkgYXZhaWxhYmxlIHRvIHRoZSBmdW5jdGlvbgorcmVzZXQoKS4KK0xpbmUgNCBtYWtlcyBhIGNhbGwgdG8gdGhlIHJvb20uYyB2ZXJzaW9uIG9mIHJlc2V0KCkuCitMaW5lIDUgdXNlcyB0aGUgZHJpdmVyIGVmdW4gcmFuZG9tKCkgdG8gcmV0dXJuIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuCiswIGFuZCB0aGUgcGFyYW1ldGVyIG1pbnVzIDEuICBTbyBoZXJlIHdlIGFyZSBsb29raW5nIGZvciBhIG51bWJlciBiZXR3ZWVuCiswIGFuZCA5OS4KK0luIGxpbmUgNiwgd2UgdGVzdCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gKHg+NTApIHRvIHNlZSBpZiBpdCBpcyB0cnVlCitvciBmYWxzZS4gIElmIGl0IGlzIHRydWUsIHRoZW4gaXQgbWFrZXMgYSBjYWxsIHRvIHRoZSByb29tLmMgZnVuY3Rpb24KK3NldF9zZWFyY2hfZnVuYygpLiAgSWYgaXQgaXMgZmFsc2UsIHRoZSBjYWxsIHRvIHNldF9zZWFyY2hfZnVuYygpIGlzIG5ldmVyCitleGVjdXRlZC4KK0luIGxpbmUgNywgdGhlIGZ1bmN0aW9uIHJldHVybnMgZHJpdmVyIGNvbnRyb2wgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24KKyh0aGUgZHJpdmVyIGl0c2VsZiBpbiB0aGlzIGNhc2UpIHdpdGhvdXQgcmV0dXJuaW5nIGFueSB2YWx1ZS4KKyAKK0lmIHlvdSBoYWQgd2FudGVkIHRvIGV4ZWN1dGUgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2YganVzdCB0aGUgb25lLAoreW91IHdvdWxkIGhhdmUgZG9uZSBpdCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKKyAKK2lmKHg+NTApIHsKKyAgICBzZXRfc2VhcmNoX2Z1bmMoImZsb29yYm9hcmRzIiwgInNlYXJjaF9mbG9vciIpOworICAgIGlmKCFwcmVzZW50KCJiZWdnYXIiLCB0aGlzX29iamVjdCgpKSkgbWFrZV9iZWdnYXIoKTsKK30KKyAKK05vdGljZSB0aGUge30gZW5jYXBzdWxhdGUgdGhlIGluc3RydWN0aW9ucyB0byBiZSBleGVjdXRlZCBpZiB0aGUgdGVzdAorZXhwcmVzc2lvbiBpcyB0cnVlLiAgSW4gdGhlIGV4YW1wbGUsIGFnYWluIHdlIGNhbGwgdGhlIHJvb20uYyBmdW5jdGlvbgord2hpY2ggc2V0cyBhIGZ1bmN0aW9uIChzZWFyY2hfZmxvb3IoKSkgdGhhdCB5b3Ugd2lsbCBsYXRlciBkZWZpbmUgeW91cnNlbGYKK3RvIGJlIGNhbGxlZCB3aGVuIHRoZSBwbGF5ZXIgdHlwZXMgInNlYXJjaCBmbG9vcmJvYXJkcyIgKE5PVEU6IFRoaXMgaXMKK2hpZ2hseSBtdWRsaWIgZGVwZW5kZW50LiAgTmlnaHRtYXJlIG11ZGxpYnMgaGF2ZSB0aGlzIGZ1bmN0aW9uIGNhbGwuCitPdGhlcnMgbWF5IGhhdmUgc29tZXRoaW5nIHNpbWlsYXIsIHdoaWxlIG90aGVycyBtYXkgbm90IGhhdmUgdGhpcyBmZWF0dXJlCit1bmRlciBhbnkgbmFtZSkuICBOZXh0LCB0aGVyZSBpcyBhbm90aGVyIGlmKCkgZXhwcmVzc2lvbiB0aGF0IHRlc3RzIHRoZQordHJ1dGggb2YgdGhlIGV4cHJlc3Npb24gKCFwcmVzZW50KCJiZWdnYXIiLHRoaXNfb2JqZWN0KCkpKS4gIFRoZSAhIGluIHRoZQordGVzdCBleHByZXNzaW9uIGNoYW5nZXMgdGhlIHRydXRoIG9mIHRoZSBleHByZXNzaW9uIHdoaWNoIGZvbGxvd3MgaXQuICBJbgordGhpcyBjYXNlLCBpdCBjaGFuZ2VzIHRoZSB0cnV0aCBvZiB0aGUgZWZ1biBwcmVzZW50KCksIHdoaWNoIHdpbGwgcmV0dXJuCit0aGUgb2JqZWN0IHRoYXQgaXMgYSBiZWdnYXIgaWYgaXQgaXMgaW4gdGhlIHJvb20gKHRoaXNfb2JqZWN0KCkpLCBvciBpdAord2lsbCByZXR1cm4gMCBpZiB0aGVyZSBpcyBubyBiZWdnYXIgaW4gdGhlIHJvb20uICBTbyBpZiB0aGVyZSBpcyBhIGJlZ2dhcgorc3RpbGwgbGl2aW5nIGluIHRoZSByb29tLCAocHJlc2VudCgiYmVnZ2FyIiwgdGhpc19vYmplY3QoKSkpIHdpbGwgaGF2ZQorYSB2YWx1ZSBlcXVhbCB0byB0aGUgYmVnZ2FyIG9iamVjdCAoZGF0YSB0eXBlIG9iamVjdCksIG90aGVyd2lzZSBpdCB3aWxsCitiZSAwLiAgVGhlICEgd2lsbCBjaGFuZ2UgYSAwIHRvIGEgMSwgb3IgYW55IG5vbnplcm8gdmFsdWUgKGxpa2UgdGhlCitiZWdnYXIgb2JqZWN0KSB0byBhIDAuICBUaGVyZWZvcmUsIHRoZSBleHByZXNzaW9uCisoIXByZXNlbnQoImJlZ2dhciIsIHRoaXNfb2JqZWN0KCkpKSBpcyB0cnVlIGlmIHRoZXJlIGlzIG5vIGJlZ2dhciBpbiB0aGUKK3Jvb20sIGFuZCBmYWxzZSBpZiB0aGVyZSBpcy4gIFNvLCBpZiB0aGVyZSBpcyBubyBiZWdnYXIgaW4gdGhlIHJvb20sCit0aGVuIGl0IGNhbGxzIHRoZSBmdW5jdGlvbiB5b3UgZGVmaW5lIGluIHlvdXIgcm9vbSBjb2RlIHRoYXQgbWFrZXMgYQorbmV3IGJlZ2dhciBhbmQgcHV0cyBpdCBpbiB0aGUgcm9vbS4gKElmIHRoZXJlIGlzIGEgYmVnZ2FyIGluIHRoZSByb29tLAord2UgZG8gbm90IHdhbnQgdG8gYWRkIHlldCBhbm90aGVyIG9uZSA6KSkKKyAKK09mIGNvdXJzZSwgaWYoKSdzIG9mdGVuIGNvbWVzIHdpdGggYW5kcyBvciBidXRzIDopLiAgSW4gTFBDLCB0aGUgZm9ybWFsCityZWFkaW5nIG9mIHRoZSBpZigpIHN0YXRlbWVudCBpczoKKyAKK2lmKGV4cHJlc3Npb24pIHsgc2V0IG9mIGludHJ1Y3Rpb25zIH0KK2Vsc2UgaWYoZXhwcmVzc2lvbikgeyBzZXQgb2YgaW5zdHJ1Y3Rpb25zIH0KK2Vsc2UgeyBzZXQgb2YgaW5zdHJ1Y3Rpb25zIH0KKyAKK1RoaXMgbWVhbnM6CisgCitJZiBleHByZXNzaW9uIGlzIHRydWUsIHRoZW4gZG8gdGhlc2UgaW5zdHJ1Y3Rpb25zLgorT3RoZXJpc2UsIGlmIHRoaXMgc2Vjb25kIGV4cHJlc3Npb24gaXMgdHJ1ZSwgZG8gdGhpcyBzZWNvbmQgc2V0LgorQW5kIGlmIG5vbmUgb2YgdGhvc2Ugd2VyZSB0cnVlLCB0aGVuIGRvIHRoaXMgbGFzdCBzZXQuCisgCitZb3UgY2FuIGhhdmUgaWYoKSBhbG9uZToKKyAKK2lmKHg+NSkgd3JpdGUoIkZvbyxcbiIpOworIAord2l0aCBhbiBlbHNlIGlmKCk6CisgCitpZih4ID4gNSkgd3JpdGUoIlggaXMgZ3JlYXRlciB0aGFuIDUuXG4iKTsKK2Vsc2UgaWYoeCA+Mikgd3JpdGUoIlggaXMgbGVzcyB0aGFuIDYsIGJ1dCBncmVhdGVyIHRoYW4gMi5cbiIpOworIAord2l0aCBhbiBlbHNlOgorIAoraWYoeD41KSB3cml0ZSgiWCBpcyBncmVhdGVyIHRoYW4gNS5cbiIpOworZWxzZSB3cml0ZSgiWCBpcyBsZXNzIHRoYW4gNi5cbiIpOworIAorb3IgdGhlIHdob2xlIGxvdCBvZiB0aGVtIGFzIGxpc3RlZCBhYm92ZS4gIFlvdSBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mCitlbHNlIGlmKCkncyBpbiB0aGUgZXhwcmVzc2lvbiwgYnV0IHlvdSBtdXN0IGhhdmUgb25lIGFuZCBvbmx5IG9uZQoraWYoKSBhbmQgYXQgbW9zdCBvbmUgZWxzZS4gIE9mIGNvdXJzZSwgYXMgd2l0aCB0aGUgYmVnZ2FyIGV4YW1wbGUsCit5b3UgbWF5IG5lc3QgaWYoKSBzdGF0ZW1lbnRzIGluc2lkZSBpZigpIGluc3RydWN0aW9ucy4gKEZvciBleGFtcGxlLAorICAgIGlmKHg+NSkgeworICAgICAgICBpZih4PT03KSB3cml0ZSgiTHVja3kgbnVtYmVyIVxuIik7CisgICAgICAgIGVsc2Ugd3JpdGUoIlJvbGwgYWdhaW4uXG4iKTsKKyAgICB9CisgICAgZWxzZSB3cml0ZSgiWW91IGxvc2UuXG4iKTsKKyAKKzcuNCBUaGUgc3RhdGVtZW50czogd2hpbGUoKSBhbmQgZG8ge30gd2hpbGUoKQorUHJvdG90eXBlOgord2hpbGUoZXhwcmVzc2lvbikgeyBzZXQgb2YgaW5zdHJ1Y3Rpb25zIH0KK2RvIHsgc2V0IG9mIGluc3RydWN0aW9ucyB9IHdoaWxlKGV4cHJlc3Npb24pOworIAorVGhlc2UgYWxsb3cgeW91IHRvIGNyZWF0ZSBhIHNldCBvZiBpbnN0cnVjdGlvbnMgd2hpY2ggY29udGludWUgdG8KK2V4ZWN1dGUgc28gbG9uZyBhcyBzb21lIGV4cHJlc3Npb24gaXMgdHJ1ZS4gIFN1cHBvc2UgeW91IHdhbnRlZCB0bworc2V0IGEgdmFyaWFibGUgZXF1YWwgdG8gYSBwbGF5ZXIncyBsZXZlbCBhbmQga2VlcCBzdWJ0cmFjdGluZyByYW5kb20KK2Ftb3VudHMgb2YgZWl0aGVyIG1vbmV5IG9yIGhwIGZyb20gYSBwbGF5ZXIgdW50aWwgdGhhdCB2YXJpYWJsZSBlcXVhbHMKKzAgKHNvIHRoYXQgcGxheWVyJ3Mgb2YgaGlnaGVyIGxldmVscyB3b3VsZCBsb3NlIG1vcmUpLiAgWW91IG1pZ2h0IGRvIGl0Cit0aGlzIHdheToKKyAKKzEgICAgaW50IHg7CisyCiszICAgIHggPSAoaW50KXRoaXNfcGxheWVyKCktPnF1ZXJ5X2xldmVsKCk7ICAvKiB0aGlzIGhhcyB5ZXQgdG8gYmUgZXhwbGFpbmVkICovCis0ICAgIHdoaWxlKHggPiAwKSB7Cis1ICAgICAgICBpZihyYW5kb20oMikpIHRoaXNfcGxheWVyKCktPmFkZF9tb25leSgic2lsdmVyIiwgLXJhbmRvbSg1MCkpOworNiAgICAgICAgZWxzZSB0aGlzX3BsYXllcigpLT5hZGRfaHAoLShyYW5kb20oMTApKTsKKzcgICAgICAgIHgtLTsKKzggICAgfQorIAorVGhlIGV4cHJlc3Npb24gdGhpc19wbGF5ZXIoKS0+cXVlcnlfbGV2ZWwoKSBjYWxJbiBsaW5lIDQsIHdlIHN0YXJ0IGEgbG9vcCB0aGF0IGV4ZWN1dGVzIHNvIGxvbmcgYXMgeCBpcyBncmVhdGVyIHRoYW4gMC4KKyAgICBBbm90aGVyIHdheSB3ZSBjb3VsZCBoYXZlIGRvbmUgdGhpcyBsaW5lIHdvdWxkIGJlOgorICAgICAgICB3aGlsZSh4KSB7CisgICAgVGhlIHByb2JsZW0gd2l0aCB0aGF0IHdvdWxkIGJlIGlmIHdlIGxhdGVyIG1hZGUgYSBjaGFuZ2UgdG8gdGhlIGZ1bnRpb24KK3kgYW55d2hlcmUgYmV0d2VlbiAwIGFuZCA0OSBjb2lucy4KK0luIGxpbmUgNiwgaWYgaW5zdGVhZCBpdCByZXR1cm5zIDAsIHdlIGNhbGwgdGhlIGFkZF9ocCgpIGZ1bmN0aW9uIGluIHRoZQorICAgIHBsYXllciB3aGljaCByZWR1Y2VzIHRoZSBwbGF5ZXIncyBoaXQgcG9pbnRzIGFueXdoZXJlIGJldHdlZW4gMCBhbmQgOSBocC4KK0luIGxpbmUgNywgd2UgcmVkdWNlIHggYnkgMS4KK0F0IGxpbmUgOCwgdGhlIGV4ZWN1dGlvbiBjb21lcyB0byB0aGUgZW5kIG9mIHRoZSB3aGlsZSgpIGluc3RydWN0aW9ucyBhbmQKKyAgICBnb2VzIGJhY2sgdXAgdG8gbGluZSA0IHRvIHNlZSBpZiB4IGlzIHN0aWxsIGdyZWF0ZXIgdGhhbiAwLiAgVGhpcworICAgIGxvb3Agd2lsbCBrZWVwIGV4ZWN1dGluZyB1bnRpbCB4IGlzIGZpbmFsbHkgbGVzcyB0aGFuIDEuCisgCitZb3UgbWlnaHQsIGhvd2V2ZXIsIHdhbnQgdG8gdGVzdCBhbiBleHByZXNzaW9uICphZnRlciogeW91IGV4ZWN1dGUgc29tZQoraW5zdHJ1Y3Rpb25zLiAgRm9yIGluc3RhbmNlLCBpbiB0aGUgYWJvdmUsIGlmIHlvdSB3YW50ZWQgdG8gZXhlY3V0ZQordGhlIGluc3RydWN0aW9ucyBhdCBsZWFzdCBvbmNlIGZvciBldmVyeW9uZSwgZXZlbiBpZiB0aGVpciBsZXZlbCBpcworYmVsb3cgdGhlIHRlc3QgbGV2ZWw6CisgCisgICAgaW50IHg7CisgCisgICAgeCA9IChpbnQpdGhpc19wbGF5ZXIoKS0+cXVlcnlfbGV2ZWwoKTsKKyAgICBkbyB7CisgICAgICAgIGlmKHJhbmRvbSgyKSkgdGhpc19wbGF5ZXIoKS0+YWRkX21vbmV5KCJzaWx2ZXIiLCAtcmFuZG9tKDUwKSk7CisgICAgICAgIGVsc2UgdGhpc19wbGF5ZXIoKS0+YWRkX2hwKC1yYW5kb20oMTApKTsKKyAgICAgICAgeC0tOworICAgIH0gd2hpbGUoeCA+IDApOworIAorVGhpcyBpcyBhIHJhdGhlciBiaXphcnJlIGV4YW1wbGUsIGJlaW5nIGFzIGZldyBtdWRzIGhhdmUgbGV2ZWwgMCBwbGF5ZXJzLgorQW5kIGV2ZW4gc3RpbGwsIHlvdSBjb3VsZCBoYXZlIGRvbmUgaXQgdXNpbmcgdGhlIG9yaWdpbmFsIGxvb3Agd2l0aAorYSBkaWZmZXJlbnQgdGVzdC4gIE5ldmVydGhlbGVzcywgaXQgaXMgaW50ZW5kZWQgdG8gc2hvdyBob3cgYSBkb3t9IHdoaWxlKCkKK3dvcmtzLiAgQXMgeW91IHNlZSwgaW5zdGVhZCBvZiBpbml0aWF0aW5nIHRoZSB0ZXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCitsb29wICh3aGljaCB3b3VsZCBpbW1lZGlhdGVseSBleGNsdWRlIHNvbWUgdmFsdWVzIG9mIHgpLCBpdCB0ZXN0cyBhZnRlcgordGhlIGxvb3AgaGFzIGJlZW4gZXhlY3V0ZWQuICBUaGlzIGFzc3VyZXMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIG9mIHRoZSBsb29wCitnZXQgZXhlY3V0ZWQgYXQgbGVhc3Qgb25lIHRpbWUsIG5vIG1hdHRlciB3aGF0IHggaXMuCisgCis3LjUgZm9yKCkgbG9vcHMKK1Byb3RvdHlwZToKK2Zvcihpbml0aWFsaXplIHZhbHVlcyA7IHRlc3QgZXhwcmVzc2lvbiA7IGluc3RydWN0aW9uKSB7IGluc3RydWN0aW9ucyB9CisgCitpbml0aWFsaXplIHZhbHVlczoKK1RoaXMgYWxsb3dzIHlvdSB0byBzZXQgc3RhcnRpbmcgdmFsdWVzIG9mIHZhcmlhYmxlcyB3aGljaCB3aWxsIGJlIHVzZWQKK2luIHRoZSBsb29wLiAgVGhpcyBwYXJ0IGlzIG9wdGlvbmFsLgorIAordGVzdCBleHByZXNzaW9uOgorU2FtZSBhcyB0aGUgZXhwcmVzc2lvbiBpbiBpZigpIGFuZCB3aGlsZSgpLiAgVGhlIGxvb3AgaXMgZXhlY3V0ZWQKK2FzIGxvbmcgYXMgdGhpcyBleHByZXNzaW9uIChvciBleHByZXNzaW9ucykgaXMgdHJ1ZS4gWW91IG11c3QgaGF2ZSBhCit0ZXN0IGV4cHJlc3Npb24uCisgCitpbnN0cnVjdGlvbjoKK0FuIGV4cHJlc3Npb24gKG9yIGV4cHJlc3Npb25zKSB3aGljaCBpcyB0byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2gKK2xvb3AuICBUaGlzIGlzIG9wdGlvbmFsLgorIAorTm90ZToKK2Zvcig7ZXhwcmVzc2lvbjspIHt9CitJUyBFWEFDVExZIFRIRSBTQU1FIEFTCit3aGlsZShleHByZXNzaW9uKSB7fQorIAorRXhhbXBsZToKKyAKKzEgICAgaW50IHg7CisyCiszICAgIGZvcih4PSAoaW50KXRoaXNfcGxheWVyKCktPnF1ZXJ5X2xldmVsKCk7IHg+MDsgeC0tKSB7Cis0ICAgICAgICBpZihyYW5kb20oMikpIHRoaXNfcGxheWVyKCktPmFkZF9tb25leSgic2lsdmVyIiwgLXJhbmRvbSg1MCkpOworNSAgICAgICAgZWxzZSB0aGlzX3BsYXllcigpLT5hZGRfaHAoLXJhbmRvbSgxMCkpOworNiAgICB9CisgCitUaGlzIGZvcigpIGxvb3AgYmVoYXZlcyBFWEFDVExZIGxpa2UgdGhlIHdoaWxlKCkgZXhhbXBsZS4KK0FkZGl0aW9uYWxseSwgaWYgeW91IHdhbnRlZCB0byBpbml0aWFsaXplIDIgdmFyaWFibGVzOgorIAorZm9yKHg9MCwgeT1yYW5kb20oMjApOyB4PHk7IHgrKykgeyB3cml0ZSh4KyJcbiIpOyB9CisgCitIZXJlLCB3ZSBpbml0aWFsaXplIDIgdmFyaWFibGVzLCB4IGFuZCB5LCBhbmQgd2Ugc2VwYXJhdGUgdGhlbSBieSBhCitjb21tYS4gIFlvdSBjYW4gZG8gdGhlIHNhbWUgd2l0aCBhbnkgb2YgdGhlIDMgcGFydHMgb2YgdGhlIGZvcigpCitleHByZXNzaW9uLgorIAorNy42IFRoZSBzdGF0ZW1lbnQ6IHN3aXRjaCgpCitQcm90b3R5cGU6Citzd2l0Y2goZXhwcmVzc2lvbikgeworICAgIGNhc2UgY29uc3RhbnQ6IGluc3RydWN0aW9ucworICAgIGNhc2UgY29uc3RhbnQ6IGluc3RydWN0aW9ucworICAgIC4uLgorICAgIGNhc2UgY29uc3RhbnQ6IGluc3RydWN0aW9ucworICAgIGRlZmF1bHQ6IGluc3RydWN0aW9ucworfQorIAorVGhpcyBpcyBmdW5jdGlvbmFsbHkgbXVjaCBsaWtlIGlmKCkgZXhwcmVzc2lvbnMsIGFuZCBtdWNoIG5pY2VyIHRvIHRoZQorQ1BVLCBob3dldmVyIG1vc3QgcmFyZWx5IHVzZWQgYmVjYXVzZSBpdCBsb29rcyBzbyBkYW1uIGNvbXBsaWNhdGVkLgorQnV0IGl0IGlzIG5vdC4KKyAKK0ZpcnN0IG9mZiwgdGhlIGV4cHJlc3Npb24gaXMgbm90IGEgdGVzdC4gIFRoZSBjYXNlcyBhcmUgdGVzdHMuICBBIEVuZ2xpc2gKK3NvdW5kaW5nIHdheSB0byByZWFkOgorIAorMSAgICBpbnQgeDsKKzIKKzMgICAgeCA9IHJhbmRvbSg1KTsKKzQgICAgc3dpdGNoKHgpIHsKKzUgICAgICAgIGNhc2UgMTogd3JpdGUoIlggaXMgMS5cbiIpOworNiAgICAgICAgY2FzZSAyOiB4Kys7Cis3ICAgICAgICBkZWZhdWx0OiB4LS07Cis4ICAgIH0KKzkgICAgd3JpdGUoeCsiXG4iKTsKKyAKK2lzOgorIAorc2V0IHZhcmlhYmxlIHggdG8gYSByYW5kb20gbnVtYmVyIGJldHdlZW4gMCBhbmQgNC4KK0luIGNhc2UgMSBvZiB2YXJpYWJsZSB4IHdyaXRlIGl0cyB2YWx1ZSBhZGQgMSB0byBpdCBhbmQgc3VidHJhY3QgMS4KK0luIGNhc2UgMiBvZiB2YXJpYWJsZSB4LCBhZGQgMSB0byBpdHMgdmFsdWUgYW5kIHRoZW4gc3VidHJhY3QgMS4KK0luIG90aGVyIGNhc2VzIHN1YnRyYWN0IDEuCitXcml0ZSB0aGUgdmFsdWUgb2YgeC4KKyAKK3N3aXRjaCh4KSBiYXNpY2FsbHkgdGVsbHMgdGhlIGRyaXZlciB0aGF0IHRoZSB2YXJpYWJsZSB4IGlzIHRoZSB2YWx1ZQord2UgYXJlIHRyeWluZyB0byBtYXRjaCB0byBhIGNhc2UuCitPbmNlIHRoZSBkcml2ZXIgZmluZHMgYSBjYXNlIHdoaWNoIG1hdGNoZXMsIHRoYXQgY2FzZSAqYW5kIGFsbCBmb2xsb3dpbmcKK2Nhc2VzKiB3aWxsIGJlIGFjdGVkIHVwb24uICBZb3UgbWF5IGJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudAorYXMgd2VsbCBhcyBhbnkgb3RoZXIgZmxvdyBjb250cm9sIHN0YXRlbWVudCB3aXRoIGEgYnJlYWsgaW5zdHJ1Y3Rpb24gaW4KK29yZGVyIG9ubHkgdG8gZXhlY3V0ZSBhIHNpbmdsZSBjYXNlLiAgQnV0IHRoYXQgd2lsbCBiZSBleHBsYWluZWQgbGF0ZXIuCitUaGUgZGVmYXVsdCBzdGF0ZW1lbnQgaXMgb25lIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBmb3IgYW55IHZhbHVlIG9mCit4IHNvIGxvbmcgYXMgdGhlIHN3aXRjaCgpIGZsb3cgaGFzIG5vdCBiZWVuIGJyb2tlbi4gIFlvdSBtYXkgdXNlIGFueQorZGF0YSB0eXBlIGluIGEgc3dpdGNoIHN0YXRlbWVudDoKKyAKK3N0cmluZyBuYW1lOworIAorbmFtZSA9IChzdHJpbmcpdGhpc19wbGF5ZXIoKS0+cXVlcnlfbmFtZSgpOworc3dpdGNoKG5hbWUpIHsKKyAgICBjYXNlICJkZXNjYXJ0ZXMiOiB3cml0ZSgiWW91IGJvcmcuXG4iKTsKKyAgICBjYXNlICJmbGFtbWUiOgorICAgIGNhc2UgImZvcmxvY2siOgorICAgIGNhc2UgInNoYWRvd3dvbGYiOiB3cml0ZSgiWW91IGFyZSBhIE5pZ2h0bWFyZSBoZWFkIGFyY2guXG4iKTsKKyAgICBkZWZhdWx0OiB3cml0ZSgiWW91IGV4aXN0LlxuIik7Cit9CisgCitGb3IgbWUsIEkgd291bGQgc2VlOgorWW91IGJvcmcuCitZb3UgYXJlIGEgTmlnaHRtYXJlIGhlYWQgYXJjaC4KK1lvdSBleGlzdC4KKyAKK0ZsYW1tZSwgRm9ybG9jaywgb3IgU2hhZG93d29sZiB3b3VsZCBzZWU6CitZb3UgYXJlIGEgTmlnaHRtYXJlIGhlYWQgYXJjaC4KK1lvdSBleGlzdC4KKyAKK0V2ZXJ5b25lIGVsc2Ugd291bGQgc2VlOgorWW91IGV4aXN0LgorIAorNy43IEFsdGVyaW5nIHRoZSBmbG93IG9mIGZ1bmN0aW9ucyBhbmQgZmxvdyBjb250cm9sIHN0YXRlbWVudHMKK1RoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOgorcmV0dXJuICAgIGNvbnRpbnVlICAgIGJyZWFrCisgCithbHRlciB0aGUgbmF0dXJhbCBmbG93IG9mIHRoaW5ncyBhcyBkZXNjcmliZWQgYWJvdmUuCitGaXJzdCBvZiBhbGwsCityZXR1cm4KK25vIG1hdHRlciB3aGVyZSBpdCBvY2N1cnMgaW4gYSBmdW5jdGlvbiwgd2lsbCBjZWFzZSB0aGUgZXhlY3V0aW9uIG9mIHRoYXQKK2Z1bmN0aW9uIGFuZCByZXR1cm4gY29udHJvbCB0byB0aGUgZnVuY3Rpb24gd2hpY2ggY2FsbGVkIHRoZSBvbmUgdGhlCityZXR1cm4gc3RhdGVtZW50IGlzIGluLiAgSWYgdGhlIGZ1bmN0aW9uIGlzIE5PVCBvZiB0eXBlIHZvaWQsIHRoZW4gYQordmFsdWUgbXVzdCBmb2xsb3cgdGhlIHJldHVybiBzdGF0ZW1lbnQsIGFuZCB0aGF0IHZhbHVlIG11c3QgYmUgb2YgYQordHlwZSBtYXRjaGluZyB0aGUgZnVuY3Rpb24uICBBbiBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiB3b3VsZCBsb29rCitsaWtlIHRoaXM6CisgCitpbnQgYWJzb2x1dGVfdmFsdWUoaW50IHgpIHsKKyAgICBpZih4Pi0xKSByZXR1cm4geDsKKyAgICBlbHNlIHJldHVybiAteDsKK30KKyAKK0luIHRoZSBzZWNvbmQgbGluZSwgdGhlIGZ1bmN0aW9uIGNlYXNlcyBleGVjdXRpb24gYW5kIHJldHVybnMgdG8gdGhlIGNhbGxpbmcKK2Z1bmN0aW9uIGJlY2F1c2UgdGhlIGRlc2lyZWQgdmFsdWUgaGFzIGJlZW4gZm91bmQgaWYgeCBpcyBhIHBvc2l0aXZlCitudW1iZXIuCisgCitjb250aW51ZSBpcyBtb3N0IG9mdGVuIHVzZWQgaW4gZm9yKCkgYW5kIHdoaWxlIHN0YXRlbWVudHMuICBJdCBzZXJ2ZXMKK3RvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCBsb29wIGFuZCBzZW5kIHRoZSBleGVjdXRpb24gYmFjawordG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcC4gIEZvciBpbnN0YW5jZSwgc2F5IHlvdSB3YW50ZWQgdG8gYXZvaWQKK2RpdmlzaW9uIGJ5IDA6CisgCit4PSA0Oword2hpbGUoIHggPiAtNSkgeworICAgIHgtLQorICAgIGlmKCF4KSBjb250aW51ZTsKKyAgICB3cml0ZSgoMTAwL3gpKyJcbiIpOworfQord3JpdGUoIkRvbmUuXG4iKQorIAorWW91IHdvdWxkIHNlZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKKzMzCis1MAorMTAwCistMTAwCistNTAKKy0zMworLTI1CitEb25lLgorVG8gYXZvaWQgYW4gZXJyb3IsIGl0IGNoZWNrcyBpbiBlYWNoIGxvb3AgdG8gbWFrZSBzdXJlIHggaXMgbm90IDAuCitJZiB4IGlzIHplcm8sIHRoZW4gaXQgc3RhcnRzIGJhY2sgd2l0aCB0aGUgdGVzdCBleHByZXNzaW9uIHdpdGhvdXQKK2ZpbmlzaGluZyBpdHMgY3VycmVudCBsb29wLgorIAorSW4gYSBmb3IoKSBleHByZXNzaW9uCisgZm9yKHg9MzsgeD4tNTsgeC0tKSB7CisgICAgaWYoIXgpIGNvbnRpbnVlOworICAgIHdyaXRlKCgxMDAveCkrIlxuIik7CisgfQorIHdyaXRlKCJEb25lLlxuIik7CitJdCB3b3JrcyBtdWNoIHRoZSBzYW1lIHdheS4gIE5vdGUgdGhpcyBnaXZlcyBleGFjdGx5IHRoZSBzYW1lIG91dHB1dAorYXMgYmVmb3JlLiBBdCB4PTEsIGl0IHRlc3RzIHRvIHNlZSBpZiB4IGlzIHplcm8sIGl0IGlzIG5vdCwgc28gaXQKK3dyaXRlcyAxMDAveCwgdGhlbiBnb2VzIGJhY2sgdG8gdGhlIHRvcCwgc3VidHJhY3RzIG9uZSBmcm9tIHgsIGNoZWNrcyB0bworc2VlIGlmIGl0IGlzIHplcm8gYWdhaW4sIGFuZCBpdCBpcyB6ZXJvLCBzbyBpdCBnb2VzIGJhY2sgdG8gdGhlIHRvcAorYW5kIHN1YnRyYWN0cyAxIGFnYWluLgorIAorYnJlYWsKK1RoaXMgb25lIGNlYXNlcyB0aGUgZnVuY3Rpb24gb2YgYSBmbG93IGNvbnRyb2wgc3RhdGVtZW50LiAgTm8gbWF0dGVyCit3aGVyZSB5b3UgYXJlIGluIHRoZSBzdGF0ZW1lbnQsIHRoZSBjb250cm9sIG9mIHRoZSBwcm9ncmFtIHdpbGwgZ28KK3RvIHRoZSBlbmQgb2YgdGhlIGxvb3AuICBTbywgaWYgaW4gdGhlIGFib3ZlIGV4YW1wbGVzLCB3ZSBoYWQKK3VzZWQgYnJlYWsgaW5zdGVhZCBvZiBjb250aW51ZSwgdGhlIG91dHB1dCB3b3VsZCBoYXZlIGxvb2tlZCBsaWtlIHRoaXM6CisgCiszMworNTAKKzEwMAorRG9uZS4KKyAKK2NvbnRpbnVlIGlzIG1vc3Qgb2Z0ZW4gdXNlZCB3aXRoIHRoZSBmb3IoKSBhbmQgd2hpbGUoKSBzdGF0ZW1lbnRzLgorYnJlYWsgaG93ZXZlciBpcyBtb3N0bHkgdXNlZCB3aXRoIHN3aXRjaCgpCisgCitzd2l0Y2gobmFtZSkgeworICAgIGNhc2UgImRlc2NhcnRlcyI6IHdyaXRlKCJZb3UgYXJlIGJvcmcuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAiZmxhbW1lIjogd3JpdGUoIllvdSBhcmUgZmxhbW1lLlxuIik7IGJyZWFrOworICAgIGNhc2UgImZvcmxvY2siOiB3cml0ZSgiWW91IGFyZSBmb3Jsb2NrLlxuIik7IGJyZWFrOworICAgIGNhc2UgInNoYWRvd3dvbGYiOiB3cml0ZSgiWW91IGFyZSBzaGFkb3d3b2xmLlxuIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHdyaXRlKCJZb3Ugd2lsbCBiZSBhc3NpbWlsYXRlZC5cbiIpOworfQorIAorVGhpcyBmdW5jdGlvbnMganVzdCBsaWtlOgorIAoraWYobmFtZSA9PSAiZGVzY2FydGVzIikgd3JpdGUoIllvdSBhcmUgYm9yZy5cbiIpOworZWxzZSBpZihuYW1lID09ICJmbGFtbWUiKSB3cml0ZSgiWW91IGFyZSBmbGFtbWUuXG4iKTsKK2Vsc2UgaWYobmFtZSA9PSAiZm9ybG9jayIpIHdyaXRlKCJZb3UgYXJlIGZvcmxvY2suXG4iKTsKK2Vsc2UgaWYobmFtZSA9PSAic2hhZG93d29sZiIpIHdyaXRlKCJZb3UgYXJlIHNoYWRvd3dvbGYuXG4iKTsKK2Vsc2Ugd3JpdGUoIllvdSB3aWxsIGJlIGFzc2ltaWxhdGVkLlxuIik7CisgCitleGNlcHQgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgaXMgbXVjaCBiZXR0ZXIgb24gdGhlIENQVS4KK0lmIGFueSBvZiB0aGVzZSBhcmUgcGxhY2VkIGluIG5lc3RlZCBzdGF0ZW1lbnRzLCB0aGVuIHRoZXkgYWx0ZXIgdGhlCitmbG93IG9mIHRoZSBtb3N0IGltbWVkaWF0ZSBzdGF0ZW1lbnQuCisgCis3LjggQ2hhcHRlciBzdW1tYXJ5CitUaGlzIGNoYXB0ZXIgY292ZXJlZCBvbmUgaGVsbCBvZiBhIGxvdCwgYnV0IGl0IHdhcyBzdHVmZiB0aGF0IG5lZWRlZCB0bworYmUgc2VlbiBhbGwgYXQgb25jZS4gIFlvdSBzaG91bGQgbm93IGNvbXBsZXRlbHkgdW5kZXJzdGFuZCBpZigpIGZvcigpCit3aGlsZSgpIGRve30gd2hpbGUoKSBhbmQgc3dpdGNoKCksIGFzIHdlbGwgYXMgaG93IHRvIGFsdGVyIHRoZWlyIGZsb3cKK3VzaW5nIHJldHVybiwgY29udGludWUsIGFuZCBicmVhay4gIEVmZmVjaWVuY3kgc2F5cyBpZiBpdCBjYW4gYmUgZG9uZSBpbgorYSBuYXR1cmFsIHdheSB1c2luZyBzd2l0Y2goKSBpbnN0ZWFkIG9mIGEgbG90IG9mIGlmKCkgZWxzZSBpZigpJ3MsIHRoZW4KK2J5IGFsbCBtZWFucyBkbyBpdC4gIFlvdSB3ZXJlIGFsc28gaW50cm9kdWNlZCB0byB0aGUgaWRlYSBvZiBjYWxsaW5nCitmdW5jdGlvbnMgaW4gb3RoZXIgb2JqZWN0cy4gIFRoYXQgaG93ZXZlciwgaXMgYSB0b3BpYyB0byBiZSBkZXRhaWxlZCBsYXRlci4KK1lvdSBub3cgc2hvdWxkIGJlIGNvbXBsZXRlbHkgYXQgZWFzZSB3cml0aW5nIHNpbXBsZSByb29tcyAoaWYgeW91IGhhdmUKK3JlYWQgeW91ciBtdWRsaWIncyByb29tIGJ1aWxkaW5nIGRvY3VtZW50KSwgc2ltcGxlIG1vbnN0ZXJzLCBhbmQKK290aGVyIHNvcnRzIG9mIHNpbXBsZSBvYmplY3RzLgpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjggYi9kb2MvS1VSUy9MUEMtS1VSUy9jaGFwdGVyOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzk0NzEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMvY2hhcHRlcjgKQEAgLTAsMCArMSwxOTUgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQyBCYXNpY3MKKyAgICAgICAgICAgICAgICAgIFdyaXR0ZW4gYnkgRGVzY2FydGVzIG9mIEJvcmcKKyAgICAgICAgICAgICAgICAgIGZpcnN0IGVkaXRpb246IDIzIGFwcmlsIDE5OTMKKyAgICAgICAgICAgICAgICAgIHNlY29uZCBlZGl0aW9uOiAxMiBqdWx5IDE5OTMKKworQ0hBUFRFUiA4OiBUaGUgZGF0YSB0eXBlICJvYmplY3QiCisKKzguMSBSZXZpZXcKK1lvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG8gYW55dGhpbmcgc28gbG9uZyBhcyB5b3Ugc3RpY2sgdG8gY2FsbGluZworZnVuY3Rpb25zIHdpdGhpbiB5b3VyIG93biBvYmplY3QuICBZb3Ugc2hvdWxkIGFsc28ga25vdywgdGhhdCBhdCB0aGUKK2JhcmUgbWluaW11bSB5b3UgY2FuIGdldCB0aGUgY3JlYXRlKCkgKG9yIHJlc2V0KCkpIGZ1bmN0aW9uIGluIHlvdXIgb2JqZWN0CitjYWxsZWQgdG8gc3RhcnQganVzdCBieSBsb2FkaW5nIGl0IGludG8gbWVtb3J5LCBhbmQgdGhhdCB5b3VyIHJlc2V0KCkKK2Z1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IG5vdyBhbmQgdGhlbiBzbyB0aGF0IHlvdSBtYXkgd3JpdGUgdGhlCitjb2RlIG5lY2Vzc2FyeSB0byByZWZyZXNoIHlvdXIgcm9vbS4gIE5vdGUgdGhhdCBuZWl0aGVyIG9mIHRoZXNlCitmdW5jdGlvbnMgTVVTVCBiZSBpbiB5b3VyIG9iamVjdC4gIFRoZSBkcml2ZXIgY2hlY2tzIHRvIHNlZSBpZiB0aGUKK2Z1bmN0aW9uIGV4aXN0cyBpbiB5b3VyIG9iamVjdCBmaXJzdC4gIElmIGl0IGRvZXMgbm90LCB0aGVuIGl0IGRvZXMgbm90Citib3RoZXIuICBZb3UgYXJlIGFsc28gYWNxdWFpbnRlZCB3aXRoIHRoZSBkYXRhIHR5cGVzIHZvaWQsIGludCwgYW5kIHN0cmluZy4KKyAKKzcuMiBPYmplY3RzIGFzIGRhdGEgdHlwZXMKK0luIHRoaXMgY2hhcHRlciB5b3Ugd2lsbCBiZSBhY3F1YWludGVkIHdpdGggYSBtb3JlIGNvbXBsZXggZGF0YSB0eXBlLAorb2JqZWN0LiAgQW4gb2JqZWN0IHZhcmlhYmxlIHBvaW50cyB0byBhIHJlYWwgb2JqZWN0IGxvYWRlZCBpbnRvIHRoZQorZHJpdmVyJ3MgbWVtb3J5LiAgWW91IGRlY2xhcmUgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIG90aGVyIGRhdGEgdHlwZXM6CisgICAgb2JqZWN0IG9iOworSXQgZGlmZmVycyBpbiB0aGF0IHlvdSBjYW5ub3QgdXNlICssIC0sICs9LCAtPSwgKiwgb3IgLyAod2hhdCB3b3VsZCBpdAorbWVhbiB0byBkaXZpZGUgYSBtb25zdGVyIGJ5IGFub3RoZXIgbW9uc3Rlcj8pLiAgQW5kIHNpbmNlIGVmdW5zIGxpa2UKK3NheSgpIGFuZCB3cml0ZSgpIG9ubHkgd2FudCBzdHJpbmdzIG9yIGludHMsIHlvdSBjYW5ub3Qgd3JpdGUoKSBvcgorc2F5KCkgdGhlbSAoYWdhaW4sIHdoYXQgd291bGQgaXQgbWVhbiB0byBzYXkgYSBtb25zdGVyPykuCitCdXQgeW91IGNhbiB1c2UgdGhlbSB3aXRoIHNvbWUgb3RoZXIgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGVmdW5zIG9uIGFueQorTFBNdWQuCisgCis4LjMgVGhlIGVmdW46IHRoaXNfb2JqZWN0KCkKK1RoaXMgaXMgYW4gZWZ1biB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBpbiB3aGljaCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQKK2V4aXN0cy4gIEluIG90aGVyIHdvcmRzLCBpbiBhIGZpbGUsIHRoaXNfb2JqZWN0KCkgcmVmZXJzIHRvIHRoZSBvYmplY3QgeW91cgorZmlsZSBpcyBpbiB3aGV0aGVyIHRoZSBmaWxlIGdldHMgY2xvbmVkIGl0c2VsZiBvciBpbmhlcnRlZCBieSBhbm90aGVyIGZpbGUuCitJdCBpcyBvZnRlbiB1c2VmdWwgd2hlbiB5b3UgYXJlIHdyaXRpbmcgYSBmaWxlIHdoaWNoIGlzIGdldHRpbmcgaW5oZXJpdGVkCitieSBhbm90aGVyIGZpbGUuICBTYXkgeW91IGFyZSB3cml0aW5nIHlvdXIgb3duIGxpdmluZy5jIHdoaWNoIGdldHMKK2luaGVyaXRlZCBieSB1c2VyLmMgYW5kIG1vbnN0ZXIuYywgYnV0IG5ldmVyIHVzZWQgYWxvbmUuICBZb3Ugd2FudCB0byBsb2cKK3RoZSBmdW5jdGlvbiBzZXRfbGV2ZWwoKSBpdCBpcyBhIHBsYXllcidzIGxldmVsIGJlaW5nIHNldCAoYnV0IHlvdSBkbyBub3QKK2NhcmUgaWYgaXQgaXMgYSBtb25zdGVyLgorWW91IG1pZ2h0IGRvIHRoaXM6CisgCit2b2lkIHNldF9sZXZlbChpbnQgeCkgeworICAgIGlmKHRoaXNfb2JqZWN0KCktPmlzX3BsYXllcigpKSBsb2dfZmlsZSgibGV2ZWxzIiwgImZvb1xuIik7CisgICAgbGV2ZWwgPSB4OworfQorIAorU2luY2UgaXNfcGxheWVyKCkgaXMgbm90IGRlZmluZWQgaW4gbGl2aW5nLmMgb3IgYW55dGhpbmcgaXQgaW5oZXJpdHMsCitqdXN0IHNheWluZyBpZihpc19wbGF5ZXIoKSkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc2luY2UgdGhlIGRyaXZlcgorZG9lcyBub3QgZmluZCB0aGF0IGZ1bmN0aW9uIGluIHlvdXIgZmlsZSBvciBhbnl0aGluZyBpdCBpbmhlcml0cy4KK3RoaXNfb2JqZWN0KCkgYWxsb3dzIHlvdSB0byBhY2Nlc3MgZnVuY3Rpb25zIHdoaWNoIG1heSBvciBtYXkgbm90IGJlCitwcmVzZW50IGluIGFueSBmaW5hbCBwcm9kdWN0cyBiZWNhdXNlIHlvdXIgZmlsZSBpcyBpbmhlcml0ZWQgYnkgb3RoZXJzCit3aXRob3V0IHJlc3VsdGluZyBpbiBhbiBlcnJvci4KKyAKKzguNCBDYWxsaW5nIGZ1bmN0aW9ucyBpbiBvdGhlciBvYmplY3RzCitUaGlzIG9mIGNvdXJzZSBpbnRyb2R1Y2VzIHVzIHRvIHRoZSBtb3N0IGltcG9ydGFudCBjaGFyYWN0ZXJpc3RpYyBvZgordGhlIG9iamVjdCBkYXRhIHR5cGUuICBJdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGZ1bmN0aW9ucyBpbiBvdGhlciBvYmplY3RzLgorSW4gcHJldmlvdXMgZXhhbXBsZXMgeW91IGhhdmUgYmVlbiBhYmxlIHRvIGZpbmQgb3V0IGFib3V0IGEgcGxheWVyJ3MgbGV2ZWwsCityZWR1Y2UgdGhlIG1vbmV5IHRoZXkgaGF2ZSwgYW5kIGhvdyBtdWNoIGhwIHRoZXkgaGF2ZS4KK0NhbGxzIHRvIGZ1bmN0aW9ucyBpbiBvdGhlciBvYmplY3RzIG1heSBiZSBkb25lIGluIHR3byB3YXlzOgorIAorb2JqZWN0LT5mdW5jdGlvbihwYXJhbWV0ZXJzKQorY2FsbF9vdGhlcihvYmplY3QsICJmdW5jdGlvbiIsIHBhcmFtZXRlcnMpOworIAorZXhhbXBsZToKK3RoaXNfcGxheWVyKCktPmFkZF9tb25leSgic2lsdmVyIiwgLTUpOworY2FsbF9vdGhlcih0aGlzX3BsYXllcigpLCAiYWRkX21vbmV5IiwgInNpbHZlciIsIC01KTsKKyAKK0luIHNvbWUgKHZlcnkgbG9vc2Ugc2Vuc2UpLCB0aGUgZ2FtZSBpcyBqdXN0IGEgY2hhaW4gcmVhY3Rpb24gb2YgZnVuY3Rpb24KK2NhbGxzIGluaXRpYXRlZCBieSBwbGF5ZXIgY29tbWFuZHMuICBXaGVuIGEgcGxheWVyIGluaXRpYXRlcyBhIGNoYWluIG9mCitmdW5jdGlvbiBjYWxscywgdGhhdCBwbGF5ZXIgaXMgdGhlIG9iamVjdCB3aGljaCBpcyByZXR1cm5lZCBieQordGhlIGVmdW4gdGhpc19wbGF5ZXIoKS4gIFNvLCBzaW5jZSB0aGlzX3BsYXllcigpIGNhbiBjaGFuZ2UgZGVwZW5kaW5nCitvbiB3aG8gaW5pdGlhdGVkIHRoZSBzZXF1ZW5jZSBvZiBldmVudHMsIHlvdSB3YW50IHRvIGJlIHZlcnkgY2FyZWZ1bAorYXMgdG8gd2hlcmUgeW91IHBsYWNlIGNhbGxzIHRvIGZ1bmN0aW9ucyBpbiB0aGlzX3BsYXllcigpLiAgVGhlIG1vc3QgY29tbW9uCitwbGFjZSB5b3UgZG8gdGhpcyBpcyB0aHJvdWdoIHRoZSBsYXN0IGltcG9ydGFudCBsZnVuICh3ZSBoYXZlIG1lbnRpb25lZAorY3JlYXRlKCkgYW5kIHJlc2V0KCkpIGluaXQoKS4KKyAKKzguNSBUaGUgbGZ1bjogaW5pdCgpCitBbnkgdGltZSBhIGxpdmluZyB0aGluZyBlbmNvdW50ZXJzIGFuIG9iamVjdCAoZW50ZXJzIGEgbmV3IHJvb20sIG9yIGVudGVycwordGhlIHNhbWUgcm9vbSBhcyBhIGNlcnRhaW4gb3RoZXIgb2JqZWN0KSwgaW5pdCgpIGlzIGNhbGxlZCBpbiBhbGwgb2YKK3RoZSBvYmplY3RzIHRoZSBsaXZpbmcgYmVpbmcgbmV3bHkgZW5jb3VudGVycy4gIEl0IGlzIGF0IHRoaXMgcG9pbnQKK3RoYXQgeW91IGNhbiBhZGQgY29tbWFuZHMgdGhlIHBsYXllciBjYW4gaXNzdWUgaW4gb3JkZXIgdG8gYWN0LgorSGVyZSBpcyBhIHNhbXBsZSBpbml0KCkgZnVuY3Rpb24gaW4gYSBmbG93ZXIuCisgCit2b2lkIGluaXQoKSB7CisgICAgOjppbml0KCk7CisgICAgYWRkX2FjdGlvbigic21lbGxfZmxvd2VyIiwgInNtZWxsIik7Cit9CisgCitJdG8gc21lbGxfZmxvd2VyKCkuICBTbyB5b3Ugc2hvdWxkIGhhdmUgc21lbGxfZmxvd2VyKCkgbG9vayBsaWtlIHRoaXM6CisgCisxIGludCBzbWVsbF9mbG93ZXIoc3RyaW5nIHN0cik7ICAgICAgICAvKiBhY3Rpb24gZnVuY3Rpb25zIGFyZSB0eXBlIGludCAqLworMgorMyBpbnQgc21lbGxfZmxvd2VyKHN0cmluZyBzdHIpIHsKKzQgICAgaWYoc3RyICE9ICJmbG93ZXIiKSByZXR1cm4gMDsgICAgIC8qIGl0IGlzIG5vdCB0aGUgZmxvd2VyIGJlaW5nIHNtZWxsZWQgKi8KKzUgICAgd3JpdGUoIllvdSBzbmlmZiB0aGUgZmxvd2VyLlxuIik7Cis2ICAgIHNheSgoc3RyaW5nKXRoaXNfcGxheWVyKCktPnF1ZXJ5X2NhcF9uYW1lKCkrIiBzbWVsbHMgdGhlIGZsb3dlci5cbiIpOworNyAgICB0aGlzX3BsYXllcigpLT5hZGRfaHAocmFuZG9tKDUpKTsKKzggICAgcmV0dXJuIDE7Cis5IH0KKyAKK0luIGxpbmUgMSwgd2UgaGF2ZSBvdXIgZnVuY3Rpb24gZGVjbGFyZWQuCitJbiBsaW5lIDMsIHNtZWxsX2Zsb3dlcigpIGJlZ2lucy4gIHN0ciBiZWNvbWVzIHdoYXRldmVyIGNvbWVzIGFmdGVyIHRoZQorICAgIHBsYXllcnMgY29tbWFuZCAobm90IGluY2x1ZGluZyB0aGUgZmlyc3Qgd2hpdGUgc3BhY2UpLgorSW4gbGluZSA0LCBpdCBjaGVja3MgdG8gc2VlIGlmIHRoZSBwbGF5ZXIgaGFkIHR5cGVkICJzbWVsbCBmbG93ZXIiLiAgSWYKKyAgICB0aGUgcGxheWVyIGhhZCB0eXBlZCAic21lbGwgY2hlZXNlIiwgdGhlbiBzdHIgd291bGQgYmUgImNoZWVzZSIuICBJZgorICAgIGl0IGlzIG5vdCBpbiBmYWN0ICJmbG93ZXIiIHdoaWNoIGlzIGJlaW5nIHNtZWxsZWQsIHRoZW4gMCBpcyByZXR1cm5lZCwKKyAgICBsZXR0aW5nIHRoZSBkcml2ZXIga25vdyB0aGF0IHRoaXMgd2FzIG5vdCB0aGUgZnVuY3Rpb24gd2hpY2ggc2hvdWxkCisgICAgaGF2ZSBiZWVuIGNhbGxlZC4gIElmIGluIGZhY3QgdGhlIHBsYXllciBoYWQgYSBwaWVjZSBvZiBjaGVlc2UgYXMgd2VsbAorICAgIHdoaWNoIGhhZCBhIHNtZWxsIGNvbW1hbmQgdG8gaXQsIHRoZSBkcml2ZXIgd291bGQgdGhlbiBjYWxsIHRoZSBmdW5jdGlvbgorICAgIGZvciBzbWVsbGluZyBpbiB0aGF0IG9iamVjdC4gIFRoZSBkcml2ZXIgd2lsbCBrZWVwIGNhbGxpbmcgYWxsIGZ1bmN0aW9ucworICAgIHRpZWQgdG8gc21lbGwgY29tbWFuZHMgdW50aWwgb25lIG9mIHRoZW0gcmV0dXJucyAxLiAgSWYgdGhleSBhbGwgcmV0dXJuCisgICAgMCwgdGhlbiB0aGUgcGxheWVyIHNlZXMgIldoYXQ/IgorSW4gbGluZSA1LCB0aGUgZWZ1biB3cml0ZSgpIGlzIGNhbGxlZC4gIHdyaXRlKCkgcHJpbnRzIHRoZSBzdHJpbmcgd2hpY2gKKyAgICBpcyBwYXNzZWQgdG8gaXQgdG8gdGhpc19wbGF5ZXIoKS4gIFNvIHdob2V2ZXIgdHlwZWQgdGhlIGNvbW1hbmQgaGVyZQorICAgIHNlZXMgIllvdSBzbmlmZiB0aGUgZmxvd2VyLiIKK0luIGxpbmUgNiwgdGhlIGVmdW4gc2F5KCkgaXMgY2FsbGVkLiAgc2F5KCkgcHJpbnRzIHRoZSBzdHJpbmcgd2hpY2ggaXMKKyAgICBkb2luZyB0aGUgc25pZmZpbmcsIHdlIGhhdmUgdG8gY2FsbCB0aGUgcXVlcnlfY2FwX25hbWUoKSBmdW5jdGlvbgorICAgIGluIHRoaXNfcGxheWVyKCkuICBUaGF0IHdheSBpZiB0aGUgcGxheWVyIGlzIGludmlzLCBpdCB3aWxsIHNheQorICAgICJTb21lb25lIiAob3Igc29tZXRoaW5nIGxpa2UgdGhhdCksIGFuZCBpdCB3aWxsIGFsc28gYmUgcHJvcGVybHkKKyAgICBjYXBpdGFsaXplZC4KK0luIGxpbmUgNywgd2UgY2FsbCB0aGUgYWRkX2hwKCkgZnVuY3Rpb24gaW4gdGhlIHRoaXNfcGxheWVyKCkgb2JqZWN0LAorICAgIHNpbmNlIHdlIHdhbnQgdG8gZG8gYSBsaXR0bGUgaGVhbGluZyBmb3IgdGhlIHNuaWZmIChOb3RlOiBkbyBub3QKKyAgICBjb2RlIHRoaXMgb2JqZWN0IG9uIHlvdXIgbXVkLCB3aG9ldmVyIGJhbGFuY2VzIHlvdXIgbXVkIHdpbGwgc2hvb3QgeW91KS4KK0luIGxpbmUgOCwgd2UgcmV0dXJuIGNvbnRyb2wgb2YgdGhlIGdhbWUgdG8gdGhlIGRyaXZlciwgcmV0dXJuaW5nIDEgdG8KKyAgICBsZXQgaXQga25vdyB0aGF0IHRoaXMgd2FzIGluIGZhY3QgdGhlIHJpZ2h0IGZ1bmN0aW9uIHRvIGNhbGwuCisgCis4LjYgQWRkaW5nIG9iamVjdHMgdG8geW91ciByb29tcworQW5kIG5vdywgdXNpbmcgdGhlIGRhdGEgdHlwZSBvYmplY3QsIHlvdSBjYW4gYWRkIG1vbnN0ZXJzIHRvIHlvdXIgcm9vbXM6CisgCit2b2lkIGNyZWF0ZSgpIHsKKyAgICA6OmNyZWF0ZSgpOworICAgIHNldF9wcm9wZXJ0eSgibGlnaHQiLCAzKTsKKyAgICBzZXQoInNob3J0IiwgIktyYXNuYSBTcXVhcmUiKTsKKyAgICBzZXQoImxvbmciLCAiV2VsY29tZSB0byB0aGUgQ2VudHJhbCBTcXVhcmUgb2YgdGhlIHRvd24gb2YgUHJheGlzLlxuIik7CisgICAgc2V0X2V4aXRzKCAoeyAiZC9zdGFuZGFyZC9oYWxsIiB9KSwgKHsgImVhc3QiIH0pICk7Cit9CisgCit2b2lkIHJlc2V0KCkgeworICAgIG9iamVjdCBvYjsKKyAKKyAgICA6OnJlc2V0KCk7CisgICAgaWYocHJlc2VudCgiZ3VhcmQiKSkgcmV0dXJuOyAgICAgLyogRG8gbm90IHdhbnQgdG8gYWRkIGEgZ3VhcmQgaWYgKi8KKyAgICBvYiA9IG5ldygiL3N0ZC9tb25zdGVyIik7ICAgICAgICAvKiBvbmUgaXMgYWxyZWFkeSBoZXJlICAgICAgICAgICAqLworICAgIG9iLT5zZXRfbmFtZSgiZ3VhcmQiKTsKKyAgICBvYi0+c2V0KCJpZCIsICh7ICJndWFyZCIsICJ0b3duIGd1YXJkIiB9KSApOworICAgIG9iLT5zZXQoInNob3J0IiwgIlRvd24gZ3VhcmQiKTsKKyAgICBvYi0+c2V0KCJsb25nIiwgIkhlIGd1YXJkcyBQcmF4aXMgZnJvbSBub3RoaW5nbmVzcy5cbiIpOworICAgIG9iLT5zZXRfZ2VuZGVyKCJtYWxlIik7CisgICAgb2ItPnNldF9yYWNlKCJodW1hbiIpOworICAgIG9iLT5zZXRfbGV2ZWwoMTApOworICAgIG9iLT5zZXRfYWxpZ25tZW50KDIwMCk7CisgICAgb2ItPnNldF9odW1hbm9pZCgpOworICAgIG9iLT5zZXRfaHAoMTUwKTsKKyAgICBvYi0+c2V0X3dpZWxkaW5nX2xpbWJzKCAoeyAicmlnaHQgaGFuZCIsICJsZWZ0IGhhbmQiIH0pICk7CisgICAgb2ItPm1vdmUodGhpc19vYmplY3QoKSk7Cit9CisgCitOb3csIHRoaXMgd2lsbCBiZSB3aWxkbHkgZGlmZmVyZW50IG9uIG1vc3QgbXVkcy4gIFNvbWUsIGFzIG5vdGVkIGJlZm9yZSwKK2luIHRoYXQgb2JqZWN0IHNvIHlvdSBoYXZlIGEgdW5pcXVlbHkgY29uZmlndXJlZCBtb25zdGVyIG9iamVjdC4gIFRoZQorbGFzdCBhY3QgaW4gbmF0aXZlIG11ZHMgaXMgdG8gY2FsbCBtb3ZlKCkgaW4gdGhlIG1vbnN0ZXIgb2JqZWN0IHRvIG1vdmUKK2l0IHRvIHRoaXMgcm9vbSAodGhpc19vYmplY3QoKSkuICBJbiBjb21wYXQgbXVkcywgeW91IGNhbGwgdGhlIGVmdW4KK21vdmVfb2JqZWN0KCkgd2hpY2ggdGFrZXMgdHdvIHBhcmFtZXRlcnMsIHRoZSBvYmplY3QgdG8gYmUgbW92ZWQsIGFuZCB0aGUKK29iamVjdCBpbnRvIHdoaWNoIGl0IGlzIGJlaW5nIG1vdmVkLgorIAorOC43IENoYXB0ZXIgc3VtbWFyeQorQXQgdGhpcyBwb2ludCwgeW91IG5vdyBoYXZlIGVub3VnaCBrbm93bGVkZ2UgdG8gY29kZSBzb21lIHJlYWxseSBuaWNlCitzdHVmZi4gIE9mIGNvdXJzZSwgYXMgSSBoYXZlIGJlZW4gc3RyZXNzaW5nIGFsbCBhbG9uZywgeW91IHJlYWxseSBuZWVkCit0byByZWFkIHRoZSBkb2N1bWVudHMgb24gYnVpbGRpbmcgZm9yIHlvdXIgbXVkLCBhcyB0aGV5IGRldGFpbCB3aGljaAorZnVuY3Rpb25zIGV4aXN0IGluIHdoaWNoIHR5cGVzIG9mIG9iamVjdHMgZm9yIHlvdSB0byBjYWxsLiAgTm8gbWF0dGVyCit3aGF0IHlvdXIga25vd2xlZGdlIG9mIHRoZSBtdWRsaWIgaXMsIHlvdSBoYXZlIGVub3VnaCBrbm93LWhvdyB0bworZ2l2ZSBhIHBsYXllciBleHRyYSB0aGluZ3MgdG8gZG8gbGlrZSBzbmlmZmluZyBmbG93ZXJzIG9yIGdsdWUgb3Igd2hhdGV2ZXIuCitBdCB0aGlzIHBvaW50IHlvdSBzaG91bGQgZ2V0IGJ1c3kgY29kaW5nIHN0dWZmLiAgQnV0IHRoZSBtb21lbnQgdGhpbmdzCitldmVuIGxvb2sgdG8gYmVjb21lIHRlZGlvdXMsIHRoYXQgbWVhbnMgaXQgaXMgdGltZSBmb3IgeW91IHRvIG1vdmUgdG8KK3RoZSBuZXh0IGxldmVsIGFuZCBkbyBtb3JlLiAgUmlnaHQgbm93IGNvZGUgeW91cnNlbGYgYSBzbWFsbCBhcmVhLgorTWFrZSBleHRlbnNpdmUgdXNlIG9mIHRoZSBzcGVjaWFsIGZ1bmN0aW9ucyBjb2RlZCBpbiB5b3VyIG11ZCdzCityb29tLmMgKHNlYXJjaCB0aGUgZG9jcyBmb3Igb2JzY3VyZSBvbmVzIG5vIG9uZSBlbHNlIHNlZW1zIHRvIHVzZSkuCitBZGQgbG90cyBvJyBuZWF0IGFjdGlvbnMuICBDcmVhdGUgd2VhcG9ucyB3aGljaCBoYXZlIG1hZ2ljIHBvd2VycyB3aGljaAorZ3JhZHVhbGx5IGZhZGUgYXdheS4gIEFsbCBvZiB0aGlzIHlvdSBzaG91bGQgYmUgYWJsZSB0byBkbyBub3cuICBPbmNlCit0aGlzIGJlY29tZXMgcm91dGluZSBmb3IgeW91LCBpdCB3aWxsIGJlIHRpbWUgdG8gbW92ZSBvbiB0byBpbnRlcm1lZGlhdGUKK3N0dWZmLiAgTm90ZSB0aGF0IGZldyBwZW9wbGUgYWN0dWFsbHkgZ2V0IHRvIHRoZSBpbnRlcm1lZGlhdGUgc3R1ZmYuCitJZiB5b3UgaGF2ZSBwbGF5ZWQgYXQgYWxsLCB5b3Ugbm90aWNlIHRoZXJlIGFyZSBmZXcgYXJlYXMgb24gdGhlIG11ZAord2hpY2ggZG8gd2hhdCBJIGp1c3QgdG9sZCB5b3UgeW91IHNob3VsZCBiZSBhYmxlIHRvIGRvLiAgSXQgaXMgbm90CitiZWNhdXNlIGl0IGlzIGhhcmQsIGJ1dCBiZWNhdXNlIHRoZXJlIGlzIGEgbG90IG9mIGFycm9nYW5jZSBvdXQgdGhlcmUKK29uIHRoZSBwYXJ0IG9mIHBlb3BsZSB3aG8gaGF2ZSBnb3R0ZW4gYmV5b25kIHRoaXMgcG9pbnQsIGFuZCB2ZXJ5IGxpdHRsZQorY29tbXVuaWNhdGluZyBvZiB0aGF0IGtub3dsZWRnZS4gIFRoZSB0cmljayBpcyB0byBwdXNoIHlvdXJzZWxmIGFuZAordGhpbmsgb2Ygc29tZXRoaW5nIHlvdSB3YW50IHRvIGRvIHRoYXQgaXMgaW1wb3NzaWJsZS4gIElmIHlvdSBhc2sgc29tZW9uZQoraW4gdGhlIGtub3cgaG93IHRvIGRvIFgsIGFuZCB0aGV5IHNheSB0aGF0IGlzIGltcG9zc2libGUsIGZpbmQgb3V0Cit5b3VzZWxmIGhvdyB0byBjb2RlIGl0IGJ5IGV4cGVyaW1lbnRpbmcuCisKK0dlb3JnZSBSZWVzZQorRGVzY2FydGVzIG9mIEJvcmcKKzEyIGp1bHkgMTk5MworYm9yZ0BoZWJyb24uY29ubmVjdGVkLmNvbQorRGVzY2FydGVzQE5pZ2h0bWFyZSAoaW50ZXJtdWQpCitEZXNjYXJ0ZXNASWdvciAobm90IGludGVybXVkKQpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL0NvbnRlbnRzIGIvZG9jL0tVUlMvTFBDLUtVUlMyL0NvbnRlbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNThhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvQ29udGVudHMKQEAgLTAsMCArMSwxNSBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcgCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudHMKKworMTogSW50cm9kdWN0aW9uCisyOiBUaGUgTFBNdWQgRHJpdmVyCiszOiBDb21wbGV4IERhdGEgVHlwZXMKKzQ6IFRoZSBMUEMgUHJlLUNvbXBpbGVyCis1OiBBZHZhbmNlZCBTdHJpbmcgSGFuZGxpbmcKKzY6IEludGVybWVkaWF0ZSBJbmhlcml0YW5jZQorNzogRGVidWdnaW5nCisKK0NvcHlyaWdodCAoYykgR2VvcmdlIFJlZXNlIDE5OTMKZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTMi9Db3B5cmlnaHQgYi9kb2MvS1VSUy9MUEMtS1VSUzIvQ29weXJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTI2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvQ29weXJpZ2h0CkBAIC0wLDAgKzEsNjIgQEAKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlcm1lZGlhdGUgTFBDIGZpcnN0IGVkaXRpb24KKworQ29weXJpZ2h0IChjKSAxOTkzIEdlb3JnZSBSZWVzZQorQWxsIHJpZ2h0cyB0byB0aGlzIHRleHQgYXJlIHJldGFpbmVkIGJ5IHRoZSBhdXRob3IuCisKKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGRpc3RydWJ1dGUgYW5kIGRpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoaXMKK2RvY3VtZW50IGluIGZ1bGwgc28gbG9uZyBhcyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKzEpIE5vIHBheW1lbnQgbWF5IGJlIHJlY2VpdmVkIGZvciB0aGUgcmVkaXN0cmlidXRpb24gb3IgZGlzcGxheSBvZiB0aGlzIHRleHQsCitleGNlcHQgdG8gY292ZXIgdGhlIGNvc3RzIGZvciBkaXN0cmlidXRpb24gbWVkaWEgYW5kIGFuZCBzaGlwcGluZyBhbmQvb3IKK3RyYW5zbWlzc2lvbiBjaGFyZ2VzLgorMikgVGhlIHRleHRib29rIG11c3QgYmUgZGlzdHJpYnV0ZWQgb3IgZGlzcGxheWVkIGluIGl0cyBlbnRpcmV0eSBpbiBpdHMgb3JpZ2luYWwKK2Zvcm0uICBDaGFuZ2VzIG1heSBvbmx5IGJlIG1hZGUgdG8gcHJpdmF0ZSwgaW5kaXZpZHVhbCBjb3BpZXMsIGV4Y2VwdCBhcworb3V0bGluZWQgYmVsb3cuCisKK0FjY2VwdGFibGUgY2hhbmdlcyBhcmUgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nOgorMSkgRm9ybWF0IGNoYW5nZXMsIHN1Y2ggYXMgY2hhbmdpbmcgZnJvbSBXb3JkUGVyZmVjdCB0byBXb3JkIAorMikgTWVkaXVtIGNoYW5nZXMsIHN1Y2ggYXMgZnJvbSBlbGVjdHJvbmljIGNvcHkgdG8gcGFwZXIKKzMpIENvbnRlbnQgY2hhbmdlcyBhcmUgb25seSBhY2NlcHRhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgY2lyY3Vtc3RhbmNlczoKKwlhKSBJbiBlbGVjdHJvbmljIG1lZGlhOiBub25lIG9mIHRoZSBvcmlnaW5hbCB0ZXh0IG1heSBiZSBvbW1pdHRlZC4gCisgICAgICAgIFlvdSBtYXkgYWRkIGNvbW1lbnRzCisJYXMgeW91IGZlZWwgbmVjZXNzYXJ5LCBzbyBsb25nIGFzIGNvbW1lbnRzIGFyZSBlbmNsb3NlZCBpbiA8KiAqPgorICAgICAgICBhbmQgYXJlIGFjY29tcGFuaWVkIGJ5CisJdGhlIGdhbWUgbmFtZSBvciByZWFsIG5hbWUgb2YgdGhlIGF1dGhvciBvZiB0aGUgY29tbWVudHMKKwliKSBJbiBoYXJkIGNvcHk6IG5vbmUgb2YgdGhlIG9yaWdpbmFsIHRleHQgbWF5IGJlIG9taXR0ZWQsIGJ1dCBpdCBtYXkKKyAgICAgICAgYmUgc3RydWNrIG91dCBzbyBsb25nCisJYXMgdGhlIGNvbnRlbnQgb2YgdGhlIG9yaWdpbmFsIHRleHQgaXMgdmlzaWJsZS4gIENvbW1lbnRzIG1heSBiZSBtYWRlCisgICAgICAgIGluIGFueSBmb3JtIHNvIGxvbmcgCisJYXMgdGhleSBhcmUgbWFkZSBpbiBoYW5kd3JpdGluZyBhbmQgdGhleSBhcmUgc2lnbmVkIGJ5IHRoZSBhdXRob3IuIAorICAgICAgICBDb21tZW50cyB3aGljaCBhcmUgdHlwZWQgb3IgcHJpbnRlZCBtdXN0IGJlIG1hZGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgICAgICBmb3JtYXQgZm9yIGVsZWN0cm9uaWMgbWVkaWEuCisKK1ByYWN0aWNhbGx5IHNwZWFraW5nLCB0aGlzIGlzIHdoYXQgSSBtZWFuOgorRmlyc3QsIEkgd3JvdGUgdGhpcyBtb3N0bHkgZm9yIG11ZCBhZG1pbnMgdG8gcHV0IG9udG8gdGhlaXIgbXVkcyBmb3IgbGVhcm5pbmcKK2NvZGVycyB0byByZWFkIGFzIHRoZXkgYXJlIGxlYXJuaW5nIHRvIGJ1aWxkIHJlYWxtcy4gIEkgZGlkIG5vdCBkbyB0aGlzIGZvcgorc29tZW9uZSBlbHNlIHRvIG1ha2UgYSBidWNrLiAgU28gaWYgeW91IGNoYXJnZSBtb25leSBmb3IgcmVkaXN0cmlidXRpbmcgaXQKK29yIGFsbG93aW5nIHNvbWVvbmUgZWxzZSB0byBzZWUgaXQsIHlvdSBhcmUgaW4gdmlvbGF0aW9uIG9mIHRoaXMgY29weXJpZ2h0LiAKK1VubGVzcyB5b3UgYXJlIHNpbXBseSBjaGFyZ2luZyBmb3Igd2hhdCBpdCBjb3N0IHlvdSB0byBwcmludCB1cCBhIGNvcHkgb3IKK3doYXQgdGhlIGRpc2tldHRlcyBhbmQgcG9zdGFnZSBjb3N0IHRvIG1haWwgaXQuCitTZWNvbmQsIEkgd3JvdGUgdGhpcyB0ZXh0Ym9vaywgYW5kIEkgc2hvdWxkIHJlY2VpdmUgY3JlZGl0L2JsYW1lIGZvciB3aGF0IEkKK3NheSwgYW5kIG90aGVycyBzaG91bGQgcmVjZWl2ZSBjcmVkaXQvYmxhbWUgZm9yIHdoYXQgdGhleSBzYXkuICBGb3IgZXhhbXBsZSwKK2lmIEkgc2FpZCBzb21ldGhpbmcgY29tcGxldGVseSB3cm9uZywgYW5kIHlvdSBzaW1wbHkgY29ycmVjdGVkIGl0LCBJIHdvdWxkCitiZSBnZXR0aW5nIGNyZWRpdCBmb3Igc29tZXRoaW5nIEkgZGlkIG5vdCBkby4gIFlldCwgaWYgeW91IGNvbW1lbnQgYWNjb3JkaW5nCit0byB0aGUgb3V0bGluZSBhYm92ZSwgeW91IHdpbGwgYmUgcHJvcGVybHkgY3JlZGl0ZWQgZm9yIHlvdXIgY29tbWVudHMuIAorTW9yZSBpbXBvcnRhbnQgdG8gbWUsIGhvd2V2ZXIsIGlzIHRoZSBwcmFjdGljYWwgZWZmZWN0IG9mIGhhdmluZyBodW5kcmVkcyBvZgorY29waWVzIG9mIHRoaXMgdGV4dGJvb2sgZXZlcnl3aGVyZS4gIElmIHlvdSBjaGFuZ2Ugc29tZXRoaW5nIEkgaGFkIHJpZ2h0Cit3aXRob3V0IG5vdGluZyBpdCBhcyBhIGNvbW1lbnQsIEkgd2lsbCBiZSBibGFtZWQgZm9yIHNwcmVhZGluZworbWlzaW5mb3JtYXRpb24uICBUaGlzIHByb2JsZW0gaXMgb25seSBjb21wdW5kZWQgaWYgdGhlIHRleHQgaXMgcmVkaXN0cmlidXRlZC4gCitTbyBJIHByZWZlciBteSB3b3JkcyB0byByZW1haW4gbXkgb3duLiAgQnV0LCB3aGVuIEkgbWFrZSBtaXN0YWtlcywgb3IgaWYKK3NvbWV0aGluZyBJIHNheSBkb2VzIG5vdCBmaXQgeW91ciBkcml2ZXIvbXVkbGliLCBwbGVhc2UgY29tbWVudCBpdCBzbyBwZW9wbGUKK3dpbGwga25vdy4gIEluIGFkZGl0aW9uLCBoYXZpbmcgdGhlIGNvbW1lbnRzIHNpZGUtYnktc2lkZSBhbGxvd3MgcGVvcGxlIHRvCitzZWUgb3RoZXIgaWRlYXMsIGxpa2UgaG93IGFub3RoZXIgZHJpdmVyIG1pZ2h0IGhhbmRsZSBzb21ldGhpbmcuCisKKworSSB3YW50IHRvIHBsZWFzZSBub3RlIGFnYWluLCB5b3UgbWF5IGRpc3BsYXkgdGhpcyBvbiB5b3VyIG11ZCAobGlrZSBpbiAvZG9jKS4gCitZb3UgZG8gbm90IG5lZWQgdG8KK21haWwgbWUgZm9yIHBlcm1pc3Npb24uICBJIHdvdWxkIG5vdCBtaW5kIGVtYWlsLCBzaW5jZSBpdCBpcyBuaWNlIHRvIGtub3cKK3Blb3BsZSBhcmUgdXNpbmcgaXQsIGJ1dCB0aGF0IGlzIG5vdCByZXF1aXJlZC4gIEFsc28sIGlmIHlvdSByZWFsbHkgZmVlbCBJIGhhdmUKK2RvbmUgc3VjaCBhIHdvbmRlcmZ1bCBqb2IgdGhhdCB5b3Ugc2hvdWxkIHBheSBtb25leSB0byB1c2UgdGhpcywgdGhlbiBnaXZlCiskNSB0byB5b3VyIGxvY2FsIEFTUENBIChvciBpbnRlcm5hdGlvbmFsIGVxdWl2YWxlbnQpLgorCitTZWUgdGhlIGZpbGUgdGl0bGVkIENvbnRlbnRzIGZvciBhIGZ1bGwgbGlzdCBvZiB0ZXh0Ym9vayBjaGFwdGVycy4KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMSBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ1OWNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXIxCkBAIC0wLDAgKzEsMTQzIEBACitJbnRlcm1lZGlhdGUgTFBDCitEZXNjYXJ0ZXMgb2YgQm9yZworTm92ZXJtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgICAgIENoYXB0ZXIgMTogSW50cm9kdWN0aW9uCisKKzEuMSBMUEMgQmFzaWNzCitBbnlvbmUgcmVhZGluZyB0aGlzIHRleHRib29rIHNob3VsZCBlaXRoZXIgaGF2ZSByZWFkIHRoZSB0ZXh0Ym9vayBMUEMKK0Jhc2ljcyBvciBiZSBmYW1pbGlhciBlbm91Z2ggd2l0aCBtdWQgcmVhbG0gY29kaW5nIHN1Y2ggdGhhdCBub3Qgb25seSBhcmUKK3RoZXkgY2FwYWJsZSBvZiBidWlsZGluZyByb29tcyBhbmQgb3RoZXIgc3VjaCBvYmplY3RzIGludm9sdmVkIGluIGFyZWEKK2NvZGluZywgYnV0IHRoZXkgYWxzbyBoYXZlIGEgZ29vZCBpZGVhIG9mIHdoYXQgaXMgZ29pbmcgb24gd2hlbiB0aGUgY29kZQordGhleSB3cml0ZSBpcyBleGVjdXRpbmcuICBJZiB5b3UgZG8gbm90IGZlZWwgeW91IGFyZSBhdCB0aGlzIHBvaW50LCB0aGVuIGdvCitiYWNrIGFuZCByZWFkIExQQyBCYXNpY3MgYmVmb3JlIGNvbnRpbnVpbmcuICBJZiB5b3UgZG8gc28sIHlvdSB3aWxsIGZpbmQKK3RoYXQgd2hhdCB5b3UgcmVhZCBoZXJlIHdpbGwgYmUgbXVjaCBtb3JlIG1lYW5pbmdmdWwgdG8geW91LgorCisxLjIgR29hbHMgb2YgVGhpcyBUZXh0Ym9vaworVGhlIGludHJvZHVjdG9yeSB0ZXh0Ym9vayB3YXMgbWVhbnQgdG8gdGFrZSBwZW9wbGUgbmV3IHRvIExQQyBmcm9tCitrbm93aW5nIG5vdGhpbmcgdG8gYmVpbmcgYWJsZSB0byBjb2RlIGEgbmljZSByZWFsbSBvbiBhbnkgTFBNdWQuICBUaGVyZQoraXMgbmF0dXJhbGx5IG11Y2ggbW9yZSB0byBMUEMgYW5kIHRvIExQTXVkIGJ1aWxkaW5nLCBob3dldmVyLCB0aGFuCitidWlsZGluZyByb29tcywgYXJtb3VycywgbW9uc3RlcnMsIGFuZCB3ZWFwb25zLiAgQXMgeW91IGdldCBpbnRvIG1vcmUKK2NvbXBsaWNhdGVkIGNvbmNlcHRzIGxpa2UgZ3VpbGRzLCBvciBkZXNpcmUgdG8gZG8gbW9yZSBpbnZvbHZlZCB0aGluZ3Mgd2l0aAoreW91ciByZWFsbSwgeW91IHdpbGwgZmluZCB0aGUgY29uY2VwdHMgZGV0YWlsZWQgaW4gTFBDIEJhc2ljcyB0byBiZSBsYWNraW5nCitpbiBzdXBwb3J0IGZvciB0aGVzZSBwcm9qZWN0cy4gIEludGVybWVkaWF0ZSBMUEMgaXMgZGVzaWduZWQgdG8gdGFrZSB5b3UKK2JleW9uZCB0aGUgc2ltcGxlIHJlYWxtIGJ1aWxkaW5nIHByb2Nlc3MgaW50byBhIGZ1bGwga25vd2xlZGdlIG9mIExQQyBmb3IKK2Z1bmN0aW9uaW5nIGFzIGEgcmVhbG0gYnVpbGRlciBvbiBhbiBMUE11ZC4gIFRoZSB0YXNrIG9mIG11ZGxpYiBidWlsZGluZworaXRzZWxmIGlzIGxlZnQgdG8gYSBsYXRlciB0ZXh0LiAgQWZ0ZXIgcmVhZGluZyB0aGlzIHRleHRib29rIGFuZCB3b3JraW5nIHRocm91Z2gKK2l0IGJ5IGV4cGVyaW1lbnRpbmcgd2l0aCBhY3R1YWwgY29kZSwgdGhlIHJlYWRlciBzaG91bGQgYmUgYWJsZSB0byBjb2RlIGdhbWUKK29iamVjdHMgdG8gZml0IGFueSBkZXNpZ24gb3IgaWRlYSB0aGV5IGhhdmUgaW4gbWluZCwgc28gbG9uZyBhcyBJIGhhdmUgYmVlbgorc3VjY2Vzc2Z1bC4KKworMS4zIEFuIE92ZXJ2aWV3CitXaGF0IG1vcmUgaXMgdGhlcmU/ICBXZWxsIG1hbnkgb2YgeW91IGFyZSBxdWl0ZSBhd2FyZSB0aGF0IExQQyBzdXBwb3J0cworbWFwcGluZ3MgYW5kIGFycmF5cyBhbmQgaGF2ZSBiZWVuIGFza2luZyBtZSB3aHkgdGhvc2Ugd2VyZSBub3QgZGV0YWlsZWQKK2luIExQQyBCYXNpY3MuICBJIGZlbHQgdGhhdCB0aG9zZSBjb25jZXB0cyB3ZXJlIGJleW9uZCB0aGUgc2NvcGUgb2Ygd2hhdCBJCit3YXMgdHJ5aW5nIHRvIGRvIHdpdGggdGhhdCB0ZXh0Ym9vayBhbmQgd2VyZSBtb3JlIGZpdHRpbmcgdG8gdGhpcyB0ZXh0Ym9vay4gCitCdXQgbmV3IHRvb2xzIGFyZSBhbGwgZmluZSBhbmQgZGFuZHksIHdoYXQgbWF0dGVycywgaG93ZXZlciwgaXMgd2hhdCB5b3UKK2NhbiBkbyB3aXRoIHRob3NlIHRvb2xzLiAgVGhlIGdvYWwgb2YgTFBDIEJhc2ljcyB3YXMgdG8gZ2V0IHlvdSB0byBidWlsZGluZworcXVhbGl0eSBMUE11ZCByZWFsbXMuICBNYXBwaW5ncyBhbmQgYXJyYXlzIGFyZSBub3QgbmVjZXNzYXJ5IHRvIGRvIHRoYXQuIAorVGhlIGdvYWwgb2YgdGhpcyBib29rIGlzIHRvIGFsbG93IHlvdSB0byBjb2RlIGFueSBpZGVhIHlvdSBtaWdodCB3YW50IHRvCitjb2RlIGluIHlvdXIgYXJlYS4gIFRoYXQgYWJpbGl0eSByZXF1aXJlcyB0aGUga25vd2xlZGdlIG9mIG1hcHBpbmdzIGFuZAorYXJyYXlzLgorCitBbnkgaWRlYSB5b3Ugd2FudCB0byBjb2RlIGluIGFuIExQTXVkIGlzIHBvc3NpYmxlLiAgTFBDIGlzIGEgbGFuZ3VhZ2UKK3doaWNoIGlzIGFtYXppbmdseSB3ZWxsIHN1aXRlZCB0byB0aGlzIHRhc2suICBBbGwgdGhhdCBwcmV2ZW50cyB5b3UgZnJvbQorY29kaW5nIHlvdXIgaWRlYXMgaXMgeW91ciBrbm93bGVkZ2Ugb2YgTFBDIG9yIGFuIGluYWRlcXVhdGUgbXVkbGliIG9yCit5b3VyIG11ZNVzIHRoZW1lIG9yIGFkbWluaXN0cmF0aXZlIHBvbGljaWVzLiAgVGhpcyB0ZXh0Ym9vayBjYW5ub3QgbWFrZQordGhlIG11ZGxpYiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhbnkgYmV0dGVyLCBhbmQgaXQgY2Fubm90IGNoYW5nZSB0aGUgbXVkCit0aGVtZSBvciB0aGUgbXVk1XMgYWRtaW5pc3RyYXRpdmUgcG9saWNpZXMuICBOZXZlciBvbmNlIHRoaW5rIHRoYXQgTFBDIGlzCitpbmNhcGFibGUgb2YgZG9pbmcgd2hhdCB5b3Ugd2FudCB0byBkby4gIElmIHlvdXIgaWRlYSBpcyBwcmV2ZW50ZWQgYnkKK2FkbWluaXN0cmF0aXZlIHBvbGljaWVzIG9yIHRoZW1lcywgdGhlbiBpdCBpcyBzaW1wbHkgbm90IGFuIGlkZWEgZm9yIHlvdXIKK2N1cnJlbnQgbXVkLiAgSWYgdGhlIG11ZGxpYiBpcyBpbmFkZXF1YXRlLCB0YWxrIHRvIHRoZSBwZW9wbGUgaW4gY2hhcmdlIG9mCit5b3VyIG11ZGxpYiBhYm91dCB3aGF0IGNhbiBiZSBkb25lIGF0IHRoZSBtdWRsaWIgbGV2ZWwgdG8gZmFjaWxpdGF0ZSBpdC4gIFlvdQord291bGQgYmUgc3VycHJpc2VkIGJ5IHdoYXQgaXMgYWN0dWFsbHkgaW4gdGhlIG11ZGxpYiB5b3UgZGlkIG5vdCBrbm93CithYm91dC4gIE1vcmUgaW1wb3J0YW50LCBhZnRlciByZWFkaW5nIHRoaXMgdGV4dGJvb2ssIHlvdSBzaG91bGQgYmUgYWJsZSB0bworcmVhZCBhbGwgb2YgdGhlIG11ZGxpYiBjb2RlIGluIHlvdXIgbXVk1XMgbXVkbGliIGFuZCB1bmRlcnN0YW5kIHdoYXQgaXMKK2dvaW5nIG9uIGF0IGVhY2ggbGluZSBpbiB0aGUgbXVkbGliIGNvZGUuICBZb3UgbWF5IG5vdCBhcyB5ZXQgYmUgYWJsZSB0bworcmVwcm9kdWNlIHRoYXQgY29kZSBvbiB5b3VyIG93biwgYnV0IGF0IGxlYXN0IHlvdSBjYW4gdW5kZXJzdGFuZCB3aGF0IGlzCitnb2luZyBvbiBhdCB0aGUgbXVkbGliIGxldmVsLgorCitUaGlzIHRleHRib29rIHN0YXJ0cyBvdXQgd2l0aCBhIGRpc2N1c3Npb24gYWJvdXQgd2hhdCB0aGUgTFBNdWQgZHJpdmVyIGlzCitkb2luZy4gIE9uZSBuaWNlIHRoaW5nIGFib3V0IHRoaXMgdGV4dGJvb2ssIGluIGdlbmVyYWwgaXQgaXMgY29tcGxldGVseSBkcml2ZXIKK2FuZCBtdWRsaWIgaW5kZXBlbmRlbnQgKGV4Y2VwdGluZyBmb3IgdGhlIER3b3JraW4gR2FtZSBEcml2ZXIpLiAgVGhlCitjaGFwdGVyIG9uIHRoZSBnYW1lIGRyaXZlciBkb2VzIG5vdCBnZXQgaW50byBhY3R1YWwgaW1wbGVtZW50YXRpb24sIGJ1dAoraW5zdGVhZCBkZWFscyB3aXRoIHdoYXQgYWxsIGdhbWUgZHJpdmVycyBiYXNpY2FsbHkgZG8gaW4gb3JkZXIgdG8gcnVuIHRoZQorbXVkLgorCitOZXh0IEkgZGlzY3VzcyB0aG9zZSBtYWdpYyB0b3BpY3MgZXZlcnlvbmUgd2FudHMgdG8ga25vdyBtb3JlIGFib3V0LAorYXJyYXlzIGFuZCBtYXBwaW5ncy4gIE1hcHBpbmdzIG1heSBiZSBzaW11bHRhbmVvdXNseSB0aGUgZWFzaWVzdCBhbmQKK21vc3QgZGlmZmljdWx0IGRhdGEgdHlwZSB0byB1bmRlcnN0YW5kLiAgU2luY2UgdGhleSBhcmUgc29ydCBvZiBjb21wbGV4IGFycmF5cworaW4gYSBsb29zZSBzZW5zZSwgeW91IHJlYWxseSBuZWVkIHRvIHVuZGVyc3RhbmQgYXJyYXlzIGJlZm9yZSBkaXNjdXNzaW5nCit0aGVtLiAgQWxsIHRoZSBzYW1lLCBvbmNlIHlvdSB1bmRlcnN0YW5kIHRoZW0sIHRoZXkgYXJlIG11Y2ggZWFzaWVyIHRoYW4KK2FycmF5cyB0byB1c2UgaW4gcmVhbCBzaXR1YXRpb25zLiAgQXQgYW55IHJhdGUsIHNwZW5kIG1vc3Qgb2YgeW91ciB0aW1lCit3b3JraW5nIHdpdGggdGhhdCBjaGFwdGVyLCBiZWNhdXNlIGl0IGlzIHByb2JhYmx5IHRoZSBtb3N0IGRpZmZpY3VsdCwgeWV0IG1vc3QKK3VzZWZ1bCBjaGFwdGVyIGluIHRoZSBib29rLgorCitBZnRlciB0aGF0IGZvbGxvd3MgYSBicmllZiBjaGFwdGVyIG9uIHRoZSBMUEMgcHJlLWNvbXBpbGVyLCBhIHRvb2wgeW91IGNhbgordXNlIGZvciBzb3J0aW5nIG91dCBob3cgeW91ciBjb2RlIHdpbGwgbG9vayBiZWZvcmUgaXQgZ2V0cyBzZW50IHRvIHRoZQorY29tcGlsZXIuICBEZXNwaXRlIG15IGhvcnJpZCBpbnRybyB0byBpdCBoZXJlLCB0aGlzIGNoYXB0ZXIgaXMgcGVyaGFwcyB0aGUKK2Vhc2llc3QgY2hhcHRlciBpbiB0aGUgdGV4dGJvb2suICBJIHB1dCBpdCBhZnRlciB0aGUgbWFwcGluZ3MgYW5kIGFycmF5cworY2hhcHRlciBmb3IgZXhhY3RseSB0aGF0IHJlYXNvbi4KKworU3RyaW5ncyBhcmUgcmUtaW50cm9kdWNlZCBuZXh0LCBnb2luZyBpbnRvIG1vcmUgZGV0YWlsIHdpdGggaG93IHlvdSBjYW4gZG8KK3N1Y2ggdGhpbmdzIGFzIGFkdmFuY2VkIGNvbW1hbmQgaGFuZGxpbmcgYnkgYnJlYWtpbmcgdXAgc3RyaW5ncy4gIE9uY2UKK3lvdSB1bmRlcnN0YW5kIGFycmF5cyBmYWlybHkgd2VsbCwgdGhpcyBjaGFwdGVyIHNob3VsZCBiZSByZWFsbHkgc2ltcGxlLgorCitUaGUgbmV4dCBjaGFwdGVyIGlzIHRoZSBzZWNvbmQgbW9zdCBpbXBvcnRhbnQgaW4gdGhlIGJvb2suICBJdCBtYXkgYmUgdGhlCittb3N0IGltcG9ydGFudCBpZiB5b3UgZXZlciBpbnRlbmQgdG8gZ28gYmV5b25kIHRoZSBpbnRlcm1lZGlhdGUgc3RhZ2UgYW5kCitkaXZlIGludG8gbXVkbGliIGNvZGluZy4gIFRoYXQgY2hhcHRlciBpbnZvbHZlcyB0aGUgY29tcGxleCBpZGVhcyBiZWhpbmQKK0xQQyBpbmhlcml0YW5jZS4gIFNpbmNlIHRoZSBnb2FsIG9mIHRoaXMgdGV4dGJvb2sgaXMgbm90IHRvIHRlYWNoIG11ZGxpYgorcHJvZ3JhbW1pbmcsIHRoZSBjaGFwdGVyIGlzIG5vdCBhIGRldGFpbGVkIGRpc2N1c3Npb24gb24gb2JqZWN0IG9yaWVudGVkCitwcm9ncmFtbWluZy4gIFVuZGVyc3RhbmRpbmcgdGhpcyBjaGFwdGVyLCBob3dldmVyLCB3aWxsIGdpdmUgeW91IHNvbWUKK2dvb2QgaW5zaWdodHMgaW50byB3aGF0IGlzIGludm9sdmVkIHdpdGggb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nLCBhcword2VsbCBhcyBhbGxvdyB5b3UgdG8gYnVpbGQgbW9yZSBjb21wbGV4IG9iamVjdHMgYnkgb3ZlcnJpZGluZyBmdW5jdGlvbnMKK2FuZCBkZWZpbmluZyB5b3VyIG93biBiYXNlIGNsYXNzZXMuCisKK0ZpbmFsbHksIHRoZSB0ZXh0Ym9vayBlbmRzIHdpdGggYSBzaW1wbGUgZGlzY3Vzc2lvbiBvZiBjb2RlIGRlYnVnZ2luZy4gCitUaGlzIGlzIG5vdCBhbiBlc3NlbnRpYWwgY2hhcHRlciwgYnV0IGluc3RlYWQgaXQgaXMgbWVhbnQgYXMgbW9yZSBvZiBhbgorYXV4aWxpYXJ5IHN1cHBsZW1lbnQgdG8gd2hhdCB0aGUga25vd2xlZGdlIHlvdSBoYXZlIGFjY3VtdWxhdGVkIHNvIGZhci4KKworMS40IE5vdCBBcHBlYXJpbmcgaW4gVGhpcyBUZXh0Ym9vaworUGVyaGFwcyB3aGF0IG1pZ2h0IGFwcGVhciB0byBzb21lIGFzIHRoZSBtb3N0IGdsYXJpbmcgb21pc3Npb24gb2YgdGhpcwordGV4dGJvb2sgaXMgbGFyZ2VseSBhIHBvbGl0aWNhbCBvbWlzc2lvbiwgc2hhZG93cy4gIE5ldmVyIGhhdmUgSSBldmVyCitlbmNvdW50ZXJlZCBhbiBleGFtcGxlIG9mIHdoZXJlIGEgc2hhZG93IHdhcyBlaXRoZXIgdGhlIGJlc3Qgb3IgbW9zdAorZWZmZWNpZW50IG1hbm5lciBvZiBkb2luZyBhbnl0aGluZy4gIEl0IGRvZXMgbm90IGZvbGxvdyBmcm9tIHRoYXQsIGhvd2V2ZXIsCit0aGF0IHRoZXJlIGFyZSBubyB1c2VzIGZvciBzaGFkb3dzLiAgTXkgcmVhc29uaW5nIGZvciBvbWl0dGluZyBzaGFkb3dzCitmcm9tIHRoaXMgdGV4dGJvb2sgaXMgdGhhdCB0aGUgbGVhcm5lciBpcyBiZXN0IHNlcnZlZCBieSBsZWFybmluZyB0aGUgY29uY2VwdHMKK2luIHRoaXMgdGV4dGJvb2sgZmlyc3QgYW5kIGhhdmluZyBzcGVudCB0aW1lIHdpdGggdGhlbSBiZWZvcmUgZGVhbGluZyB3aXRoCit0aGUgc3ViamVjdCBvZiBzaGFkb3dzLiAgSW4gdGhhdCB3YXksIEkgZmVlbCB0aGUgcGVyc29uIGxlYXJuaW5nIExQQyB3aWxsIGJlCitiZXR0ZXIgY2FwYWJsZSBvZiBqdWRnaW5nIHRoZSBtZXJpdHMgb2YgdXNpbmcgYSBzaGFkb3cgZG93biB0aGUgcm9hZC4gIEkKK3dpbGwgZGlzY3VzcyBzaGFkb3dzIGluIGEgZnV0dXJlIHRleHRib29rLgorCitJZiB5b3UgYXJlIHNvbWVvbmUgd2hvIHVzZXMgc2hhZG93cyBzb21lIG9yIGEgbG90LCBwbGVhc2UgZG8gbm90IHRha2UgdGhlCithYm92ZSBwYXJhZ3JhcGggYXMgYSBwZXJzb25hbCBhdHRhY2suICBUaGVyZSBtYXkgYmUgc29tZSBwZXJmZWN0bHkgdmFsaWQKK3VzZXMgZm9yIHNoYWRvd3Mgc29tZXdoZXJlIHdoaWNoIEkgaGF2ZSB5ZXQgdG8gZW5jb3VudGVyLiAgTmV2ZXJ0aGVsZXNzLAordGhleSBhcmUgbm90IHRoZSBpZGVhbCB3YXkgdG8gYWNjb21wbGlzaCBhbnkgZ2l2ZW4gdGFzaywgYW5kIHRoZXJlZm9yZSB0aGV5CithcmUgbm90IGNvbnNpZGVyZWQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHRleHRib29rIGFuIGludGVybWVkaWF0ZSBjb2RpbmcKK3Rvb2wuCisKK0kgaGF2ZSBhbHNvIG9taXR0ZWQgZGlzY3Vzc2lvbnMgb2Ygc2VjdXJpdHkgYW5kIG9iamVjdCBvcmllbnRlZAorcHJvZ3JhbW1pbmcuICBCb3RoIGFyZSBxdWl0ZSBvYnZpb3VzbHkgbXVkbGliIGlzc3Vlcy4gIE1hbnkgcGVvcGxlLAoraG93ZXZlciwgbWlnaHQgdGFrZSBleGNlcHRpb24gd2l0aCBteSBsZWF2aW5nIG91dCBhIGRpc2N1c3Npb24gb2Ygb2JqZWN0CitvcmllbnRlZCBwcm9ncmFtbWluZy4gIEkgY2hvc2UgdG8gbGVhdmUgdGhhdCBmb3IgYSBsYXRlciB0ZXh0LCBzaW5jZSBtb3N0IGFyZWEKK2J1aWxkZXJzIGNvZGUgZm9yIHRoZSBjcmVhdGl2aXR5LCBub3QgZm9yIHRoZSBjb21wdXRlciBzY2llbmNlIHRoZW9yeS4gIEluIGJvdGgKK3RoZSBpbnRlcm1lZGlhdGUgYW5kIGJlZ2lubmVyIHRleHRib29rcywgSSBoYXZlIGNob3NlbiBvbmx5IHRvIGRpc2N1c3MKK3RoZW9yeSB3aGVyZSBpdCBpcyBkaXJlY3RseSBhcHBsaWNhYmxlIHRvIHByYWN0aWNhbCBMUEMgcHJvZ3JhbW1pbmcuICBGb3IKK3Blb3BsZSB3aG8gYXJlIHN0YXJ0aW5nIG91dCBncmVlbiBpbiBMUEMgYW5kIHdhbnQgdG8gY29kZSB0aGUgbmV4dCBncmVhdAorbXVkbGliLCBwZXJoYXBzIHRoZW9yeSB3b3VsZCBiZSBtb3JlIHVzZWZ1bC4gIEJ1dCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMKK2Jvb2ssIGEgZGlzY3Vzc2lvbiBvZiBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcgaXMgc2ltcGx5IGEgc25vb3plci4gIEkKK2RvIHBsYW4gdG8gZ2V0IGhlYXZ5IGludG8gdGhlb3J5IHdpdGggdGhlIG5leHQgdGV4dGJvb2suCisKKzEuNSBTdW1tYXJ5CitMUEMgaXMgbm90IGRpZmZpY3VsdCB0byBsZWFybi4gIEl0IGlzIGEgbGFuZ3VhZ2Ugd2hpY2gsIGFsdGhvdWdoIHBhdGhldGljCitjb21wYXJlZCB0byBhbnkgb3RoZXIgbGFuZ3VhZ2UgZm9yIHBlcmZvcm1pbmcgbW9zdCBjb21wdXRlciBsYW5ndWFnZQordGFza3MsIGlzIGluY3JlZGlibHkgcG93ZXJmdWwgYW5kIHVuZXF1YWxsZWQgZm9yIHRoZSB0YXNrcyBvZiBidWlsZGluZyBhbgorYXJlYSBpbiBNVUQgdHlwZSBnYW1lcy4gIEZvciB0aGUgYmVnaW5uZXIsIGl0IGFsbG93cyB5b3UgdG8gZWFzaWx5IGp1bXAgaW4KK2FuZCBjb2RlIHVzZWZ1bCBvYmplY3RzIHdpdGhvdXQgZXZlbiBrbm93aW5nIHdoYXQgeW91IGFyZSBkb2luZy4gIEZvciB0aGUKK2ludGVybWVkaWF0ZSBwZXJzb24sIGl0IGFsbG93cyB5b3UgdG8gdHVybiBhbnkgaWRlYSB5b3UgaGF2ZSBpbnRvIHRleHR1YWwKK3ZpcnR1YWwgcmVhbGl0eS4gIEFuZCBmb3IgdGhlIGFkdmFuY2VkIHBlcnNvbiwgaXTVcyBvYmplY3Qgb3JpZW50ZWQgZmVhdHVyZXMKK2NhbiBhbGxvdyB5b3UgdG8gYnVpbGQgb25lIG9mIHRoZSBtb3N0IHBvcHVsYXIgZ2FtZXMgb24gdGhlIGludGVybmV0LiAgV2hhdAoreW91IGNhbiBkbyBpcyBzaW1wbHkgbGltaXRlZCBieSBob3cgbXVjaCB5b3Uga25vdy4gIEFuZCBsZWFybmluZyBtb3JlCitkb2VzIG5vdCByZXF1aXJlIGEgY29tcHV0ZXIgc2NpZW5jZSBkZWdyZWUuCisKK0NvcHlyaWdodCAoYykgR2VvcmdlIFJlZXNlIDE5OTMKZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMiBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE0YzNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXIyCkBAIC0wLDAgKzEsMjIzIEBACitJbnRlcm1lZGlhdGUgTFBDCitEZXNjYXJ0ZXMgb2YgQm9yZworTm92ZXJtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgICAgIENoYXB0ZXIgMjogVGhlIExQTXVkIERyaXZlcgorCisyLjEgUmV2aWV3IG9mIEJhc2ljIERyaXZlci9NdWRsaWIgSW50ZXJhY3Rpb24KK0luIHRoZSBMUEMgQmFzaWNzIHRleHRib29rLCB5b3UgbGVhcm5lZCBhIGxvdCBhYm91dCB0aGUgd2F5IHRoZSBtdWRsaWIKK3dvcmtzLCBzcGVjaWZpY2FsbHkgaW4gcmVsYXRpb24gdG8gb2JqZWN0cyB5b3UgY29kZSBpbiBvcmRlciB0byBidWlsZCB5b3VyCityZWFsbS4gIE5vdCBtdWNoIHdhcyBkaXNjdXNzZWQgYWJvdXQgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlCittdWRsaWIgYW5kIHRoZSBkcml2ZXIuICBZb3Ugc2hvdWxkIGtub3csIGhvd2V2ZXIsIHRoYXQgdGhlIGRyaXZlcgorZG9lcyB0aGUgZm9sbG93aW5nOgorMSkgV2hlbiBhbiBvYmplY3QgaXMgZmlyc3QgbG9hZGVkIGludG8gbWVtb3J5LCB0aGUgZHJpdmVyIHdpbGwgY2FsbAorY3JlYXRlKCkgaW4gbmF0aXZlIG11ZHMgYW5kIHJlc2V0KCkgaW4gY29tcGF0IG11ZHMuICBBIGNyZWF0b3IKK3VzZXMgY3JlYXRlKCkgb3IgcmVzZXQoKSB0byBnaXZlIGluaXRpYWwgdmFsdWVzIHRvIHRoZSBvYmplY3QuCisyKSBBdCBhbiBpbnRlcnZhbCBzZXR1cCBieSB0aGUgZ2FtZSBhZG1pbmlzdHJhdG9yLCB0aGUgZHJpdmVyIGNhbGxzIHRoZQorZnVuY3Rpb24gcmVzZXQoKS4gIFRoaXMgYWxsb3dzIHRoZSBvYmplY3QgdG8gcmVnZW5lcmF0ZSBtb25zdGVycyBhbmQKK3N1Y2guICBOb3RpY2UgdGhhdCBpbiBhIGNvbXBhdCBtdWQsIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHVwCitpbml0aWFsIHZhbHVlcyBhcyBpcyB1c2VkIHRvIHJlc2V0IHRoZSByb29tLgorMykgQW55IHRpbWUgYSBsaXZpbmcgb2JqZWN0IGNvbWVzIGluIGNvbnRhY3Qgd2l0aCBhbiBvYmplY3Qgb2YgYW55IHNvcnQsCit0aGUgZHJpdmVyIGNhbGxzIGluaXQoKSBpbiB0aGUgbmV3bHkgZW5jb3VudGVyZWQgb2JqZWN0LiAgVGhpcyBhbGxvd3MKK25ld2x5IGVuY291bnRlcmVkIG9iamVjdHMgdG8gZ2l2ZSBsaXZpbmcgb2JqZWN0cyBjb21tYW5kcyB0byBleGVjdXRlCit0aHJvdWdoIHRoZSBhZGRfYWN0aW9uKCkgZWZ1biwgYXMgd2VsbCBhcyBwZXJmb3JtIG90aGVyIGFjdGlvbnMgd2hpY2gKK3Nob3VsZCBoYXBwZW4gd2hlbmV2ZXIgYSBsaXZpbmcgdGhpbmcgZW5jb3VudGVycyBhIGdpdmVuIG9iamVjdC4KKzQpIFRoZSBkcml2ZXIgZGVmaW5lcyBhIHNldCBvZiBmdW5jdGlvbnMga25vd24gYXMgZWZ1bnMgd2hpY2ggYXJlCithdmFpbGFibGUgdG8gYWxsIG9iamVjdHMgaW4gdGhlIGdhbWUuICBFeGFtcGxlcyBvZiBjb21tb25seSB1c2VkIGVmdW5zCithcmU6IHRoaXNfcGxheWVyKCksIHRoaXNfb2JqZWN0KCksIHdyaXRlKCksIHNheSgpLCBldGMuCisKKzIuMiBUaGUgRHJpdmVyIEN5Y2xlCitUaGUgZHJpdmVyIGlzIGEgQyBwcm9ncmFtIHdoaWNoIHJ1bnMgdGhlIGdhbWUuICBJdHMgYmFzaWMgZnVuY3Rpb25zIGFyZQordG8gYWNjZXB0IGNvbm5lY3Rpb25zIGZyb20gdGhlIG91dHNpZGUgd29ybGQgc28gcGVvcGxlIGNhbiBsb2dpbiwKK2ludGVycHJldCB0aGUgTFBDIGNvZGUgd2hpY2ggZGVmaW5lcyBMUEMgb2JqZWN0cyBhbmQgaG93IHRoZXkKK2Z1bmN0aW9uIGluIHRoZSBnYW1lLCBhbmQgYWNjZXB0IHVzZXIgaW5wdXQgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIExQQworZnVuY3Rpb25zIHdoaWNoIG1hdGNoIHRoZSBldmVudC4gIEluIGl0cyBtb3N0IHNpbXBsZXN0IGVzc2VuY2UsIGl0IGlzIGFuCit1bmVuZGluZyBsb29wLgorCitPbmNlIHRoZSBnYW1lIGhhcyBib290ZWQgdXAgYW5kIGlzIHByb3Blcmx5IGZ1bmN0aW9uaW5nICh0aGUgYm9vdCB1cAorcHJvY2VzcyB3aWxsIGJlIGRpc2N1c3NlZCBpbiBhIGZ1dHVyZSwgYWR2YW5jZWQgTFBDIHRleHRib29rKSwgdGhlCitkcml2ZXIgZW50ZXJzIGEgbG9vcCB3aGljaCBkb2VzIG5vdCB0ZXJtaW5hdGUgdW50aWwgdGhlIHNodXRkb3duKCkgZWZ1bgoraXMgbGVnYWxseSBjYWxsZWQgb3IgYSBidWcgY2F1c2VzIHRoZSBkcml2ZXIgcHJvZ3JhbSB0byBjcmFzaC4gIEZpcnN0IG9mZiwKK3RoZSBkcml2ZXIgaGFuZGxlcyBhbnkgbmV3IGluY29taW5nIGNvbm5lY3Rpb25zIGFuZCBwYXNzZXMgY29udHJvbCBvZgordGhlIGNvbm5lY3Rpb24gdG8gYSBsb2dpbiBvYmplY3QuICBBZnRlciB0aGF0LCB0aGUgZHJpdmVyIHB1dHMgdG9nZXRoZXIgYQordGFibGUgb2YgY29tbWFuZHMgd2hpY2ggaGF2ZSBiZWVuIGVudGVyZWQgYnkgdXNlcnMgc2luY2UgdGhlIGxhc3QgY3ljbGUKK29mIHRoZSBkcml2ZXIuICBBZnRlciB0aGUgY29tbWFuZCB0YWJsZSBpcyBhc3NlbWJsZWQsIGFsbCBtZXNzYWdlcworc2NoZWR1bGVkIHRvIGJlIHNlbnQgdG8gdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgbGFzdCBkcml2ZXIgY3ljbGUgYXJlIHNlbnQKK291dCB0byB0aGUgdXNlci4gIEF0IHRoaXMgcG9pbnQsIHRoZSBkcml2ZXIgZ29lcyB0aHJvdWdoIHRoZSB0YWJsZSBvZgorY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgYW5kIGV4ZWN1dGVzIGVhY2ggc2V0IG9mIGNvbW1hbmRzIGVhY2gKK29iamVjdCBoYXMgc3RvcmVkIHRoZXJlLiAgVGhlIGRyaXZlciBlbmRzIGl0cyBjeWNsZSBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbgoraGVhcnRfYmVhdCgpIGluIGV2ZXJ5IG9iamVjdCB3aXRoIGEgaGVhcnRfYmVhdCgpIHNldCBhbmQgZmluYWxseQorcGVyZm9ybWluZyBhbGwgcGVuZGluZyBjYWxsIG91dHMuICBUaGlzIGNoYXB0ZXIgd2lsbCBub3QgZGVhbCB3aXRoIHRoZQoraGFuZGxpbmcgb2YgY29ubmVjdGlvbnMsIGJ1dCBpbnN0ZWFkIHdpbGwgZm9jdXMgb24gaG93IHRoZSBkcml2ZXIKK2hhbmRsZXMgdXNlciBjb21tYW5kcyBhbmQgaGVhcnRiZWF0cyBhbmQgY2FsbCBvdXRzLgorCisyLjMgVXNlciBDb21tYW5kcworQXMgbm90ZWQgaW4gc2VjdGlvbiAxLjIsIHRoZSBkcml2ZXIgc3RvcmVzIGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgZWFjaAordXNlciB0byBiZSBleGVjdXRlZCBlYWNoIGN5Y2xlLiAgVGhlIGNvbW1hbmRzIGxpc3QgaGFzIHRoZSBuYW1lIG9mIHRoZQorbGl2aW5nIG9iamVjdCBwZXJmb3JtaW5nIHRoZSBjb21tYW5kLCB0aGUgb2JqZWN0IHdoaWNoIGdhdmUgdGhlIGxpdmluZworb2JqZWN0IHRoYXQgY29tbWFuZCwgYW5kIHRoZSBmdW5jdGlvbiB3aGljaCBpcyB0byBiZSBleGVjdXRlZCBpbiBvcmRlcgordG8gcGVyZm9ybSB0aGUgY29tbWFuZC4gIFRoZSBkcml2ZXIgcmVmZXJzIHRvIHRoZSBvYmplY3Qgd2hpY2ggdHlwZWQgaW4KK3RoZSBjb21tYW5kIGFzIHRoZSBjb21tYW5kIGdpdmVyLiAgSXQgaXMgdGhlIGNvbW1hbmQgZ2l2ZXIgd2hpY2gKK2dldHMgcmV0dXJuZWQgYXMgdGhpc19wbGF5ZXIoKSBpbiBtb3N0IGNhc2VzLgorCitUaGUgZHJpdmVyIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IG9mIGxpdmluZyBvYmplY3RzIHdpdGggcGVuZGluZworY29tbWFuZHMsIGFuZCBzdWNjZXNzaXZlbHkgcGVyZm9ybXMgZWFjaCBjb21tYW5kIGl0IHR5cGVkIGJ5IGNhbGxpbmcKK3RoZSBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQgYW5kIHBhc3NpbmcgYW55IGFyZ3VtZW50cwordGhlIGNvbW1hbmQgZ2l2ZXIgZ2F2ZSBhcyBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLiAgQXMgdGhlIGRyaXZlcgorc3RhcnRzIHdpdGggdGhlIGNvbW1hbmRzIGlzc3VlZCBieSBhIG5ldyBsaXZpbmcgb2JqZWN0LCB0aGUgY29tbWFuZAorZ2l2ZXIgdmFyaWFibGUgaXMgY2hhbmdlZCB0byBiZSBlcXVhbCB0byB0aGUgbmV3IGxpdmluZyBvYmplY3QsIHNvIHRoYXQKK2R1cmluZyB0aGUgc2VxdWVuY2Ugb2YgZnVuY3Rpb25zIGluaXRpYXRlZCBieSB0aGF0IGNvbW1hbmQsIHRoZSBlZnVuCit0aGlzX3BsYXllcigpIHJldHVybnMgdGhlIG9iamVjdCB3aGljaCBpc3N1ZWQgdGhlIGNvbW1hbmQuCisKK0xldCdzIGxvb2sgYXQgdGhlIGNvbW1hbmQgYnVmZmVyIGZvciBhbiBleGFtcGxlIHBsYXllci4gIFNpbmNlIHRoZQorZXhlY3V0aW9uIG9mIGhpcyBsYXN0IGNvbW1hbmQsIEJvem8gaGFzIHR5cGVkICJub3J0aCIgYW5kICJ0ZWxsCitkZXNjYXJ0ZXMgd2hlbiBpcyB0aGUgbmV4dCByZWJvb3QiLiAgVGhlIGNvbW1hbmQgIm5vcnRoIiBpcyBhc3NvY2lhdGVkCit3aXRoIHRoZSBmdW5jdGlvbiAiRG9fTW92ZSgpIiBpbiB0aGUgcm9vbSBCb3pvIGlzIGluICh0aGUgY29tbWFuZAorIm5vcnRoIiBpcyBhdXRvbWF0aWNhbGx5IHNldHVwIGJ5IHRoZSBzZXRfZXhpdHMoKSBlZnVuIGluIHRoYXQgcm9vbSkuICBUaGUKK2NvbW1hbmQgInRlbGwiIGlzIG5vdCBzcGVjaWZpY2FsbHkgbGlzdGVkIGFzIGEgY29tbWFuZCBmb3IgdGhlIHBsYXllciwKK2hvd2V2ZXIsIGluIHRoZSBwbGF5ZXIgb2JqZWN0IHRoZXJlIGlzIGEgZnVuY3Rpb24gY2FsbGVkICJjbWRfaG9vaygpIgord2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kICIiLCB3aGljaCBtYXRjaGVzIGFueSBwb3NzaWJsZQordXNlciBpbnB1dC4KKworT25jZSB0aGUgZHJpdmVyIGdldHMgZG93biB0byBCb3pvLCB0aGUgY29tbWFuZCBnaXZlciB2YXJpYWJsZSBpcyBzZXQgdG8KK3RoZSBvYmplY3Qgd2hpY2ggaXMgQm96by4gIFRoZW4sIHNlZWluZyBCb3pvIHR5cGVkICJub3J0aCIgYW5kIHRoZQorZnVuY3Rpb24gIm5vcnRoIiBpcyBhc3NvY2lhdGVkIHdpdGgsIHRoZSBkcml2ZXIgY2FsbHMgQm96bydzX1Jvb20tCis+RG9fTW92ZSgwKS4gIEFuIGFyZ3VtZW50IG9mIDAgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBzaW5jZSBCb3pvCitvbmx5IHR5cGVkIHRoZSBjb21tYW5kICJub3J0aCIgd2l0aCBubyBhcmd1bWVudHMuICBUaGUgcm9vbQorbmF0dXJhbGx5IGNhbGxzIHNvbWUgZnVuY3Rpb25zIGl0IG5lZWRzLCBhbGwgdGhlIHdoaWxlIHN1Y2ggdGhhdCB0aGUgZWZ1bgordGhpc19wbGF5ZXIoKSByZXR1cm5zIHRoZSBvYmplY3Qgd2hpY2ggaXMgQm96by4gIEV2ZW50dWFsbHksIHRoZSByb29tCitvYmplY3Qgd2lsbCBjYWxsIG1vdmVfcGxheWVyKCkgaW4gQm96bywgd2hpY2ggaW4gdHVybiBjYWxscyB0aGUKK21vdmVfb2JqZWN0KCkgZWZ1bi4gIFRoaXMgZWZ1biBpcyByZXNwb25zaWJsZSBmb3IgY2hhbmdpbmcgYW4gb2JqZWN0J3MKK2Vudmlyb25tZW50LgorCitXaGVuIHRoZSBlbnZpcm9ubWVudCBvZiBhbiBvYmplY3QgY2hhbmdlcywgdGhlIGNvbW1hbmRzIGF2YWlsYWJsZSB0bworaXQgZnJvbSBvYmplY3RzIGluIGl0cyBwcmV2aW91cyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIGZyb20gaXRzIHByZXZpb3VzCitlbnZpcm9ubWVudCBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBvYmplY3QuICBPbmNlIHRoYXQgaXMgZG9uZSwgdGhlIGRyaXZlcgorY2FsbHMgdGhlIGVmdW4gaW5pdCgpIGluIHRoZSBuZXcgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyBpbiBlYWNoIG9iamVjdCBpbgordGhlIG5ldyBlbnZpcm9ubWVudC4gIER1cmluZyBlYWNoIG9mIHRoZXNlIGNhbGxzIHRvIGluaXQoKSwgdGhlIG9iamVjdAorQm96byBpcyBzdGlsbCB0aGUgY29tbWFuZCBnaXZlci4gIFRodXMgYWxsIGFkZF9hY3Rpb24oKSBlZnVucyBmcm9tIHRoaXMKK21vdmUgd2lsbCBhcHBseSB0byBCb3pvLiAgT25jZSBhbGwgdGhvc2UgY2FsbHMgYXJlIGRvbmUsIGNvbnRyb2wgcGFzc2VzCitiYWNrIGZyb20gdGhlIG1vdmVfb2JqZWN0KCkgZWZ1biB0byB0aGUgbW92ZV9wbGF5ZXIoKSBsZnVuIGluIEJvem8uIAorbW92ZV9wbGF5ZXIoKSByZXR1cm5zIGNvbnRyb2wgYmFjayB0byBEb19Nb3ZlKCkgaW4gdGhlIG9sZCByb29tLAord2hpY2ggcmV0dXJucyAxIHRvIHNpZ25pZnkgdG8gdGhlIGRyaXZlciB0aGF0IHRoZSBjb21tYW5kIGFjdGlvbiB3YXMKK3N1Y2Nlc3NmdWwuICBJZiB0aGUgRG9fTW92ZSgpIGZ1bmN0aW9uIGhhZCByZXR1cm5lZCAwIGZvciBzb21lIHJlYXNvbiwKK3RoZSBkcml2ZXIgd291bGQgaGF2ZSB3cml0dGVuICJXaGF0PyIgKG9yIHdoYXRldmVyIHlvdXIgZHJpdmVyJ3MKK2RlZmF1bHQgYmFkIGNvbW1hbmQgbWVzc2FnZSBpcykgdG8gQm96by4KKworT25jZSB0aGUgZmlyc3QgY29tbWFuZCByZXR1cm5zIDEsIHRoZSBkcml2ZXIgcHJvY2VlZHMgb24gdG8gQm96bydzCitzZWNvbmQgY29tbWFuZCwgZm9sbG93aW5nIG11Y2ggdGhlIHNhbWUgc3RydWN0dXJlLiAgTm90ZSB0aGF0IHdpdGgKKyJ0ZWxsIGRlc2NhcnRlcyB3aGVuIGlzIHRoZSBuZXh0IHJlYm9vdCIsIHRoZSBkcml2ZXIgcGFzc2VzICJkZXNjYXJ0ZXMKK3doZW4gaXMgdGhlIG5leHQgcmVib290IiB0byB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRlbGwuICBUaGF0CitmdW5jdGlvbiBpbiB0dXJuIGhhcyB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoYXQgYXJndW1lbnQuICBBZnRlciB0aGF0Citjb21tYW5kIHJldHVybnMgZWl0aGVyIDEgb3IgMCwgdGhlIGRyaXZlciB0aGVuIHByb2NlZWRzIG9uIHRvIHRoZSBuZXh0CitsaXZpbmcgb2JqZWN0IHdpdGggY29tbWFuZHMgcGVuZGluZywgYW5kIHNvIG9uIHVudGlsIGFsbCBsaXZpbmcgb2JqZWN0cword2l0aCBwZW5kaW5nIGNvbW1hbmRzIGhhdmUgaGFkIHRoZWlyIGNvbW1hbmRzIHBlcmZvcm1lZC4KKworMi40IFRoZSBFZnVucyBzZXRfaGVhcnRfYmVhdCgpIGFuZCBjYWxsX291dCgpCitPbmNlIGFsbCBjb21tYW5kcyBhcmUgcGVyZm9ybWVkIGZvciBvYmplY3RzIHdpdGggY29tbWFuZHMgcGVuZGluZywKK3RoZSBkcml2ZXIgdGhlbiBwcm9jZWVkcyB0byBjYWxsIHRoZSBoZWFydF9iZWF0KCkgZnVuY3Rpb24gaW4gYWxsIG9iamVjdHMKK2xpc3RlZCB3aXRoIHRoZSBkcml2ZXIgYXMgaGF2aW5nIGhlYXJ0YmVhdHMuICBXaGVuZXZlciBhbiBvYmplY3QgY2FsbHMgdGhlCitlZnVuIHNldF9oZWFydF9iZWF0KCkgd2l0aCBhIG5vbi16ZXJvIGFyZ3VtZW50IChkZXBlbmRpbmcgb24geW91cgorZHJpdmVyLCB3aGF0IG5vbi16ZXJvIG51bWJlciBtYXkgYmUgaW1wb3J0YW50LCBidXQgaW4gbW9zdCBjYXNlcyB5b3UKK2NhbGwgaXQgd2l0aCB0aGUgaW50IDEpLiAgVGhlIGVmdW4gc2V0X2hlYXJ0X2JlYXQoKSBhZGRzIHRoZSBvYmplY3Qgd2hpY2gKK2NhbGxzIHNldF9oZWFydF9iZWF0KCkgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyB3aXRoIGhlYXJ0YmVhdHMuICBJZiB5b3UgY2FsbCBpdAord2l0aCBhbiBhcmd1bWVudCBvZiAwLCB0aGVuIGl0IHJlbW92ZXMgdGhlIG9iamVjdCBmcm9tIHRoZSBsaXN0IG9mIG9iamVjdHMKK3dpdGggaGVhcnRiZWF0cy4KKworVGhlIG1vc3QgY29tbW9uIHVzZSBmb3IgaGVhcnRiZWF0cyBpbiB0aGUgbXVkbGliIGlzIHRvIGhlYWwgcGxheWVycyBhbmQKK21vbnN0ZXJzIGFuZCBwZXJmb3JtIGNvbWJhdC4gIE9uY2UgdGhlIGRyaXZlciBoYXMgZmluaXNoZWQgZGVhbGluZyB3aXRoCit0aGUgY29tbWFuZCBsaXN0LCBpdCBnb2VzIHRocm91Z2ggdGhlIGhlYXJ0YmVhdCBsaXN0IGNhbGxpbmcgaGVhcnRfYmVhdCgpIGluCitlYWNoIG9iamVjdCBpbiB0aGUgbGlzdC4gIFNvIGZvciBhIHBsYXllciwgZm9yIGV4YW1wbGUsIHRoZSBkcml2ZXIgd2lsbCBjYWxsCitoZWFydF9iZWF0KCkgaW4gdGhlIHBsYXllciB3aGljaCB3aWxsOgorMSkgYWdlIHRoZSBwbGF5ZXIKKzIpIGhlYWwgdGhlIHBsYXllciBhY2NvcmRpbmcgdG8gYSBoZWFsIHJhdGUKKzMpIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGh1bnRlZCwgaHVudGluZywgb3IgYXR0YWNraW5nIG9iamVjdHMKK2Fyb3VuZAorNCkgcGVyZm9ybSBhbiBhdHRhY2sgaWYgc3RlcCAzIHJldHVybnMgdHJ1ZS4KKzUpIGFueSBvdGhlciB0aGluZ3Mgd2hpY2ggbmVlZCB0byBoYXBwZW4gYXV0b21hdGljYWxseSByb3VnaGx5IGV2ZXJ5CitzZWNvbmQKKworTm90ZSB0aGF0IHRoZSBtb3JlIG9iamVjdHMgd2hpY2ggaGF2ZSBoZWFydGJlYXRzLCB0aGUgbW9yZSBwcm9jZXNzaW5nCit3aGljaCBoYXMgdG8gaGFwcGVuIGV2ZXJ5IGN5Y2xlIHRoZSBtdWQgaXMgdXAuICBPYmplY3RzIHdpdGggaGVhcnRiZWF0cworYXJlIHRodXMga25vd24gYXMgdGhlIG1ham9yIGhvZyBvZiBDUFUgdGltZSBvbiBtdWRzLiAgCisKK1RoZSBjYWxsX291dCgpIGVmdW4gaXMgdXNlZCB0byBwZXJmb3JtIHRpbWVkIGZ1bmN0aW9uIGNhbGxzIHdoaWNoIGRvIG5vdAorbmVlZCB0byBoYXBwZW4gYXMgb2Z0ZW4gYXMgaGVhcnRiZWF0cywgb3Igd2hpY2gganVzdCBoYXBwZW4gb25jZS4gIENhbGwKK291dHMgbGV0IHlvdSBzcGVjaWZ5IHRoZSBmdW5jdGlvbiBpbiBhbiBvYmplY3QgeW91IHdhbnQgY2FsbGVkLiAgVGhlCitnZW5lcmFsIGZvcm11bGEgZm9yIGNhbGwgb3V0cyBpczoKK2NhbGxfb3V0KGZ1bmMsIHRpbWUsIGFyZ3MpOworVGhlIHRoaXJkIGFyZ3VtZW50IHNwZWNpZnlpbmcgYXJndW1lbnRzIGlzIG9wdGlvbmFsLiAgVGhlIGZpcnN0IGFyZ3VtZW50CitpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gIFRoZSBzZWNvbmQKK2FyZ3VtZW50IGlzIGhvdyBtYW55IHNlY29uZHMgc2hvdWxkIHBhc3MgYmVmb3JlIHRoZSBmdW5jdGlvbiBnZXRzCitjYWxsZWQuCisKK1ByYWN0aWNhbGx5IHNwZWFraW5nLCB3aGVuIGFuIG9iamVjdCBjYWxscyBjYWxsX291dCgpLCBpdCBpcyBhZGRlZCB0byBhIGxpc3QKK29mIG9iamVjdHMgd2l0aCBwZW5kaW5nIGNhbGwgb3V0cyB3aXRoIHRoZSBhbW91bnQgb2YgdGltZSBvZiB0aGUgY2FsbCBvdXQKK2FuZCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiAgRWFjaCBjeWNsZSBvZiB0aGUgZHJpdmVyLCB0aGUKK3RpbWUgaXMgY291bnRlZCBkb3duIHVudGlsIGl0IGJlY29tZXMgdGltZSBmb3IgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gCitXaGVuIHRoZSB0aW1lIGNvbWVzLCB0aGUgZHJpdmVyIHJlbW92ZXMgdGhlIG9iamVjdCBmcm9tIHRoZSBsaXN0IG9mCitvYmplY3RzIHdpdGggcGVuZGluZyBjYWxsIG91dHMgYW5kIHBlcmZvcm1zIHRoZSBjYWxsIHRvIHRoZSBjYWxsIG91dAorZnVuY3Rpb24sIHBhc3NpbmcgYW55IHNwZWNpYWwgYXJncyBvcmlnaW5hbGx5IHNwZWNpZmllZCBieSB0aGUgY2FsbCBvdXQKK2Z1bmN0aW9uLgorCitJZiB5b3Ugd2FudCBhIHRvIHJlbW92ZSBhIHBlbmRpbmcgY2FsbCBiZWZvcmUgaXQgb2NjdXJzLCB5b3UgbmVlZCB0byB1c2UKK3RoZSByZW1vdmVfY2FsbF9vdXQoKSBlZnVuLCBwYXNzaW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZworY2FsbGVkIG91dC4gIFRoZSBkcml2ZXIgd2lsbCByZW1vdmUgdGhlIG5leHQgcGVuZGluZyBjYWxsIG91dCB0byB0aGF0CitmdW5jdGlvbi4gIFRoaXMgbWVhbnMgeW91IG1heSBoYXZlIHNvbWUgYW1iaWd1aXR5IGlmIG1vcmUgdGhhbiBvbmUKK2NhbGwgb3V0IGlzIHBlbmRpbmcgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uLgorCitJbiBvcmRlciB0byBtYWtlIGEgY2FsbCBvdXQgY3ljbGljYWwsIHlvdSBtdXN0IHJlaXNzdWUgdGhlIGNhbGxfb3V0KCkgZWZ1bgoraW4gdGhlIGZ1bmN0aW9uIHlvdSBjYWxsZWQgb3V0LCBzaW5jZSB0aGUgZHJpdmVyIGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyB0aGUKK2Z1bmN0aW9uIGZyb20gdGhlIGNhbGwgb3V0IHRhYmxlIHdoZW4gYSBjYWxsIG91dCBpcyBwZXJmb3JtZWQuICBFeGFtcGxlOgorCit2b2lkIGZvbygpIHsgY2FsbF9vdXQoImhlbGxvIiwgMTApOyB9CisKK3ZvaWQgaGVsbG8oKSB7IGNhbGxfb3V0KCJoZWxsbyIsIDEwKTsgfQorCit3aWxsIHNldCB1cCBoZWxsbygpIHRvIGJlIGNhbGxlZCBldmVyeSAxMCBzZWNvbmRzIGFmdGVyIGZvbygpIGlzIGZpcnN0IGNhbGxlZC4gCitUaGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgdG8gYmUgY2FyZWZ1bCBhYm91dCBoZXJlLiAgRmlyc3QsIHlvdSBtdXN0IHdhdGNoCit0byBtYWtlIHN1cmUgeW91IGRvIG5vdCBzdHJ1Y3R1cmUgeW91ciBjYWxsIG91dHMgdG8gYmUgcmVjdXJzaXZlIGluIGFueQordW5pbnRlbmRlZCBmYXNoaW9uLiAgU2Vjb25kLCBjb21wYXJlIHdoYXQgYSBzZXRfaGVhcnRfYmVhdCgpIGRvZXMKK3doZW4gY29tcGFyZWQgZGlyZWN0bHkgdG8gd2hhdCBjYWxsX291dCgpIGRvZXMuCisKK3NldF9oZWFydF9iZWF0KCk6CithKSBBZGRzIHRoaXNfb2JqZWN0KCkgdG8gYSB0YWJsZSBsaXN0aW5nIG9iamVjdHMgd2l0aCBoZWFydGJlYXRzLgorYikgVGhlIGZ1bmN0aW9uIGhlYXJ0X2JlYXQoKSBpbiB0aGlzX29iamVjdCgpIGdldHMgY2FsbGVkIGV2ZXJ5IHNpbmdsZQorZHJpdmVyIGN5Y2xlLgorCitjYWxsX291dCgpOgorYSkgQWRkcyB0aGlzX29iamVjdCgpLCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoaXNfb2JqZWN0KCksIGEgdGltZQorZGVsYXksIGFuZCBhIHNldCBvZiBhcmd1bWVudHMgdG8gYSB0YWJsZSBsaXN0aW5nIGZ1bmN0aW9ucyB3aXRoIHBlbmRpbmcKK2NhbGwgb3V0cy4gIAorYikgVGhlIGZ1bmN0aW9uIG5hbWVkIGlzIGNhbGxlZCBvbmx5IG9uY2UsIGFuZCB0aGF0IGNhbGwgY29tZXMgYWZ0ZXIgdGhlCitzcGVjaWZpZWQgZGVsYXkuCisKK0FzIHlvdSBjYW4gc2VlLCB0aGVyZSBpcyBhIG11Y2ggZ3JlYXRlciBtZW1vcnkgb3ZlcmhlYWQgYXNzb2NpYXRlZAord2l0aCBjYWxsIG91dHMgZm9yIHBhcnQgKGEpLCB5ZXQgdGhhdCB0aGVyZSBpcyBhIG11Y2ggZ3JlYXRlciBDUFUgb3ZlcmhlYWQKK2Fzc29jaWF0ZWQgd2l0aCBoZWFydGJlYXRzIGFzIHNob3duIGluIHBhcnQgKGIpLCBhc3N1bWluZyB0aGF0IHRoZSBkZWxheQorZm9yIHRoZSBjYWxsIG91dCBpcyBncmVhdGVyIHRoYW4gYSBzaW5nbGUgZHJpdmVyIGN5Y2xlLiAKKworQ2xlYXJseSwgeW91IGRvIG5vdCB3YW50IHRvIGJlIGlzc3VpbmcgMSBzZWNvbmQgY2FsbCBvdXRzLCBmb3IgdGhlbiB5b3UKK2dldCB0aGUgd29yc3Qgb2YgYm90aCB3b3JsZHMuICBTaW1pbGFybHksIHlvdSBkbyBub3Qgd2FudCB0byBiZSBoYXZpbmcKK2hlYXJ0IGJlYXRzIGluIG9iamVjdHMgdGhhdCBjYW4gcGVyZm9ybSB0aGUgc2FtZSBmdW5jdGlvbnMgd2l0aCBjYWxsIG91dHMKK29mIGEgZ3JlYXRlciBkdXJhdGlvbiB0aGFuIDEgc2Vjb25kLiAgSSBwZXJzb25hbGx5IGhhdmUgaGVhcmQgbXVjaCB0YWxrCithYm91dCBhdCB3aGF0IHBvaW50IHlvdSBzaG91bGQgdXNlIGEgY2FsbCBvdXQgb3ZlciBhIGhlYXJ0YmVhdC4gIFdoYXQgSQoraGF2ZSBtb3N0bHkgaGVhcmQgaXMgdGhhdCBmb3Igc2luZ2xlIGNhbGxzIG9yIGZvciBjeWNsZXMgb2YgYSBkdXJhdGlvbgorZ3JlYXRlciB0aGFuIDEwIHNlY29uZHMsIGl0IGlzIGJlc3QgdG8gdXNlIGEgY2FsbCBvdXQuICBGb3IgcmVwZXRpdGl2ZSBjYWxscyBvZgorZHVyYXRpb25zIGxlc3MgdGhhbiAxMCBzZWNvbmRzLCB5b3UgYXJlIGJldHRlciBvZmYgdXNpbmcgaGVhcnRiZWF0cy4gIEkgZG8KK25vdCBrbm93IGlmIHRoaXMgaXMgdHJ1ZSwgYnV0IEkgZG8gbm90IHRoaW5rIGZvbGxvd2luZyB0aGlzIGNhbiBkbyBhbnkKK2hhcm0uCisKKzIuNSBTdW1tYXJ5CitCYXNpYyB0byBhIG1vcmUgaW4gZGVwdGggdW5kZXJzdGFuZGluZyBvZiBMUEMgaXMgYW5kIHVuZGVyc3RhbmRpbmcgb2YKK3RoZSB3YXkgaW4gd2hpY2ggdGhlIGRyaXZlciBpbnRlcmFjdHMgd2l0aCB0aGUgbXVkbGliLiAgWW91IHNob3VsZCBub3cKK3VuZGVyc3RhbmQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkcml2ZXIgcGVyZm9ybXMgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIGEKK21vcmUgZGV0YWlsZWQga25vd2xlZGdlIG9mIHRoZSBlZnVucyB0aGlzX3BsYXllcigpLCBhZGRfYWN0aW9uKCksIGFuZAorbW92ZV9vYmplY3QoKSBhbmQgdGhlIGxmdW4gaW5pdCgpLiAgSW4gYWRkaXRpb24gdG8gdGhpcyBidWlsZGluZyB1cG9uCitrbm93bGVkZ2UgeW91IGdvdCBmcm9tIHRoZSBMUEMgQmFzaWNzIHRleHRib29rLCB0aGlzIGNoYXB0ZXIgaGFzCitpbnRyb2R1Y2VkIGNhbGwgb3V0cyBhbmQgaGVhcnRiZWF0cyBhbmQgdGhlIG1hbm5lciBpbiB3aGljaCB0aGUgZHJpdmVyCitoYW5kbGVzIHRoZW0uICBZb3Ugc2hvdWxkIG5vdyBoYXZlIGEgYmFzaWMgdW5kZXJzdGFuZGluZyBvZiBjYWxsIG91dHMKK2FuZCBoZWFydGJlYXRzIHN1Y2ggdGhhdCB5b3UgY2FuIGV4cGVyaW1lbnQgd2l0aCB0aGVtIGluIHlvdXIgcmVhbG0KK2NvZGUuCisKK0NvcHlyaWdodCAoYykgR2VvcmdlIFJlZXNlIDE5OTMKZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTg2NzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXIzCkBAIC0wLDAgKzEsNDgxIEBACitJbnRlcm1lZGlhdGUgTFBDCitEZXNjYXJ0ZXMgb2YgQm9yZworTm92ZW1iZXIgMTk5MworCisgICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDM6IENvbXBsZXggRGF0YSBUeXBlcworCiszLjEgU2ltcGxlIERhdGEgVHlwZXMKK0luIHRoZSB0ZXh0Ym9vayBMUEMgQmFzaWNzLCB5b3UgbGVhcm5lZCBhYm91dCB0aGUgY29tbW9uLCBiYXNpYyBMUEMKK2RhdGEgdHlwZXM6IGludCwgc3RyaW5nLCBvYmplY3QsIHZvaWQuICBNb3N0IGltcG9ydGFudCB5b3UgbGVhcm5lZCB0aGF0CittYW55IG9wZXJhdGlvbnMgYW5kIGZ1bmN0aW9ucyBiZWhhdmUgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIGRhdGEgdHlwZQorb2YgdGhlIHZhcmlhYmxlcyB1cG9uIHdoaWNoIHRoZXkgYXJlIG9wZXJhdGluZy4gIFNvbWUgb3BlcmF0b3JzIGFuZAorZnVuY3Rpb25zIHdpbGwgZXZlbiBnaXZlIGVycm9ycyBpZiB5b3UgdXNlIHRoZW0gd2l0aCB0aGUgd3JvbmcgZGF0YQordHlwZXMuICBGb3IgZXhhbXBsZSwgImEiKyJiIiBpcyBoYW5kbGVkIG11Y2ggZGlmZmVyZW50bHkgdGhhbiAxKzEuIAorV2hlbiB5b3UgYXNzICJhIisiYiIsIHlvdSBhcmUgYWRkaW5nICJiIiBvbnRvIHRoZSBlbmQgb2YgImEiIHRvIGdldAorImFiIi4gIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHlvdSBhZGQgMSsxLCB5b3UgZG8gbm90IGdldCAxMSwgeW91IGdldAorMiBhcyB5b3Ugd291bGQgZXhwZWN0LgorCitJIHJlZmVyIHRvIHRoZXNlIGRhdGEgdHlwZXMgYXMgc2ltcGxlIGRhdGEgdHlwZXMsIGJlY2F1c2UgdGhleSBhdG9taWMgaW4KK3RoYXQgdGhleSBjYW5ub3QgYmUgYnJva2VuIGRvd24gaW50byBzbWFsbGVyIGNvbXBvbmVudCBkYXRhIHR5cGVzLiAKK1RoZSBvYmplY3QgZGF0YSB0eXBlIGlzIGEgc29ydCBvZiBleGNlcHRpb24sIGJ1dCB5b3UgcmVhbGx5IGNhbm5vdCByZWZlcgoraW5kaXZpZHVhbGx5IHRvIHRoZSBjb21wb25lbnRzIHdoaWNoIG1ha2UgaXQgdXAsIHNvIEkgcmVmZXIgdG8gaXQgYXMgYQorc2ltcGxlIGRhdGEgdHlwZS4KKworVGhpcyBjaGFwdGVyIGludHJvZHVjZXMgdGhlIGNvbmNlcHQgb2YgdGhlIGNvbXBsZXggZGF0YSB0eXBlLCBhIGRhdGEgdHlwZQord2hpY2ggaXMgbWFkZSB1cCBvZiB1bml0cyBvZiBzaW1wbGUgZGF0YSB0eXBlcy4gIExQQyBoYXMgdHdvIGNvbW1vbgorY29tcGxleCBkYXRhIHR5cGVzLCBib3RoIGtpbmRzIG9mIGFycmF5cy4gIEZpcnN0LCB0aGVyZSBpcyB0aGUgdHJhZGl0aW9uYWwKK2FycmF5IHdoaWNoIHN0b3JlcyB2YWx1ZXMgaW4gY29uc2VjdXRpdmUgZWxlbWVudHMgYWNjZXNzZWQgYnkgYSBudW1iZXIKK3JlcHJlc2VudGluZyB3aGljaCBlbGVtZW50IHRoZXkgYXJlIHN0b3JlZCBpbi4gIFNlY29uZCBpcyBhbiBhc3NvY2lhdGl2ZQorYXJyYXkgY2FsbGVkIGEgbWFwcGluZy4gIEEgbWFwcGluZyBhc3NvY2lhdGVzIHRvIHZhbHVlcyB0b2dldGhlciB0bworYWxsb3cgYSBtb3JlIG5hdHVyYWwgYWNjZXNzIHRvIGRhdGEuCisKKzMuMiBUaGUgVmFsdWVzIE5VTEwgYW5kIDAKK0JlZm9yZSBnZXR0aW5nIGZ1bGx5IGludG8gYXJyYXlzLCB0aGVyZSBmaXJzdCBzaG91bGQgYmUgYSBmdWxsIHVuZGVyc3RhbmRpbmcKK29mIHRoZSBjb25jZXB0IG9mIE5VTEwgdmVyc3VzIHRoZSBjb25jZXB0IG9mIDAuICBJbiBMUEMsIGEgbnVsbCB2YWx1ZSBpcworcmVwcmVzZW50ZWQgYnkgdGhlIGludGVnZXIgMC4gIEFsdGhvdWdoIHRoZSBpbnRlZ2VyIDAgYW5kIE5VTEwgYXJlIG9mdGVuCitmcmVlbHkgaW50ZXJjaGFuZ2VhYmxlLCB0aGlzIGludGVyY2hhbmdlYWJpbGl0eSBvZnRlbiBsZWFkcyB0byBzb21lIGdyZWF0Citjb25mdXNpb24gd2hlbiB5b3UgZ2V0IGludG8gdGhlIHJlYWxtIG9mIGNvbXBsZXggZGF0YSB0eXBlcy4gIFlvdSBtYXkKK2hhdmUgZXZlbiBlbmNvdW50ZXJlZCBzdWNoIGNvbmZ1c2lvbiB3aGlsZSB1c2luZyBzdHJpbmdzLgorCiswIHJlcHJlc2VudHMgYSB2YWx1ZSB3aGljaCBmb3IgaW50ZWdlcnMgbWVhbnMgdGhlIHZhbHVlIHlvdSBhZGQgdG8KK2Fub3RoZXIgdmFsdWUgeWV0IHN0aWxsIHJldGFpbiB0aGUgdmFsdWUgYWRkZWQuICBUaGlzIGZvciBhbnkgYWRkaXRpb24KK29wZXJhdGlvbiBvbiBhbnkgZGF0YSB0eXBlLCB0aGUgWkVSTyB2YWx1ZSBmb3IgdGhhdCBkYXRhIHR5cGUgaXMgdGhlIHZhbHVlCit0aGF0IHlvdSBjYW4gYWRkIHRvIGFueSBvdGhlciB2YWx1ZSBhbmQgZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZS4gIFRodXM6ICAgQQorcGx1cyBaRVJPIGVxdWFscyBBIHdoZXJlIEEgaXMgc29tZSB2YWx1ZSBvZiBhIGdpdmVuIGRhdGEgdHlwZSBhbmQKK1pFUk8gaXMgdGhlIFpFUk8gdmFsdWUgZm9yIHRoYXQgZGF0YSB0eXBlLiAgVGhpcyBpcyBub3QgYW55IHNvcnQgb2YKK29mZmljaWFsIG1hdGhlbWF0aWNhbCBkZWZpbml0aW9uLiAgVGhlcmUgZXhpc3RzIG9uZSwgYnV0IEkgYW0gbm90IGEKK21hdGhlbWF0aWNpYW4sIHNvIEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHRlcm0gaXMuICBUaHVzIGZvciBpbnRlZ2VycywgMAoraXMgdGhlIFpFUk8gdmFsdWUgc2luY2UgMSArIDAgZXF1YWxzIDEuCisKK05VTEwsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyB0aGUgYWJzZW5jZSBvZiBhbnkgdmFsdWUgb3IgbWVhbmluZy4gIFRoZQorTFBDIGRyaXZlciB3aWxsIGludGVycHJldCBOVUxMIGFzIGFuIGludGVnZXIgMCBpZiBpdCBjYW4gbWFrZSBzZW5zZSBvZiBpdAoraW4gdGhhdCBjb250ZXh0LiAgSW4gYW55IGNvbnRleHQgYmVzaWRlcyBpbnRlZ2VyIGFkZGl0aW9uLCBBIHBsdXMgTlVMTAorY2F1c2VzIGFuIGVycm9yLiAgTlVMTCBjYXVzZXMgYW4gZXJyb3IgYmVjYXVzZSBhZGRpbmcgdmFsdWVsZXNzIGZpZWxkcworaW4gb3RoZXIgZGF0YSB0eXBlcyB0byB0aG9zZSBkYXRhIHR5cGVzIG1ha2VzIG5vIHNlbnNlLgorCitMb29raW5nIGF0IHRoaXMgZnJvbSBhbm90aGVyIHBvaW50IG9mIHZpZXcsIHdlIGNhbiBnZXQgdGhlIFpFUk8gdmFsdWUKK2ZvciBzdHJpbmdzIGJ5IGtub3dpbmcgd2hhdCBhZGRlZCB0byAiYSIgd2lsbCBnaXZlIHVzICJhIiBhcyBhIHJlc3VsdC4gCitUaGUgYW5zd2VyIGlzIG5vdCAwLCBidXQgaW5zdGVhZCAiIi4gIFdpdGggaW50ZWdlcnMsIGludGVyY2hhbmdpbmcgTlVMTAorYW5kIDAgd2FzIGFjY2VwdGFibGUgc2luY2UgMCByZXByZXNlbnRzIG5vIHZhbHVlIHdpdGggcmVzcGVjdCB0byB0aGUKK2ludGVnZXIgZGF0YSB0eXBlLiAgVGhpcyBpbnRlcmNoYW5nZWFiaWxpdHkgaXMgbm90IHRydWUgZm9yIG90aGVyIGRhdGEgdHlwZXMsCitzaW5jZSB0aGVpciBaRVJPIHZhbHVlcyBkbyBub3QgcmVwcmVzZW50IG5vIHZhbHVlLiAgTmFtZWx5LCAiIgorcmVwcmVzZW50cyBhIHN0cmluZyBvZiBubyBsZW5ndGggYW5kIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gMC4gIAorCitXaGVuIHlvdSBmaXJzdCBkZWNsYXJlIGFueSB2YXJpYWJsZSBvZiBhbnkgdHlwZSwgaXQgaGFzIG5vIHZhbHVlLiAgQW55CitkYXRhIHR5cGUgZXhjZXB0IGludGVnZXJzIHRoZXJlZm9yZSBtdXN0IGJlIGluaXRpYWxpemVkIHNvbWVob3cgYmVmb3JlCit5b3UgcGVyZm9ybSBhbnkgb3BlcmF0aW9uIG9uIGl0LiAgR2VuZXJhbGx5LCBpbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoZQorY3JlYXRlKCkgZnVuY3Rpb24gZm9yIGdsb2JhbCB2YXJpYWJsZXMsIG9yIGF0IHRoZSB0b3Agb2YgdGhlIGxvY2FsIGZ1bmN0aW9uCitmb3IgbG9jYWwgdmFyaWFibGVzIGJ5IGFzc2lnbmluZyB0aGVtIHNvbWUgdmFsdWUsIG9mdGVuIHRoZSBaRVJPIHZhbHVlCitmb3IgdGhhdCBkYXRhIHR5cGUuICBGb3IgZXhhbXBsZSwgaW4gdGhlIGZvbGxvd2luZyBjb2RlIEkgd2FudCB0byBidWlsZCBhCitzdHJpbmcgd2l0aCByYW5kb20gd29yZHM6CisKK3N0cmluZyBidWlsZF9ub25zZW5zZSgpIHsKKyAgICBzdHJpbmcgc3RyOworICAgIGludCBpOworCisgICAgc3RyID0gIiI7IC8qIEhlcmUgc3RyIGlzIGluaXRpYWxpemVkIHRvIHRoZSBzdHJpbmcKK1pFUk8gdmFsdWUgKi8KKyAgICBmb3IoaT0wOyBpPDY7IGkrKykgeworICAgICAgICBzd2l0Y2gocmFuZG9tKDMpKzEpIHsKKyAgICAgICAgICAgIGNhc2UgMTogc3RyICs9ICJiaW5nIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IHN0ciArPSAiYm9yZyI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBzdHIgKz0gImZvbyI7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKGk9PTUpIHN0ciArPSAiLlxuIjsKKyAgICAgICAgZWxzZSBzdHIgKz0gIiAiOworICAgIH0KKyAgICByZXR1cm4gY2FwaXRhbGl6ZShzdHIpOworfQorCitJZiB3ZSBoYWQgbm90IGluaXRpYWxpemVkIHRoZSB2YXJpYWJsZSBzdHIsIGFuIGVycm9yIHdvdWxkIGhhdmUgcmVzdWx0ZWQKK2Zyb20gdHJ5aW5nIHRvIGFkZCBhIHN0cmluZyB0byBhIE5VTEwgdmFsdWUuICBJbnN0ZWFkLCB0aGlzIGNvZGUgZmlyc3QKK2luaXRpYWxpemVzIHN0ciB0byB0aGUgWkVSTyB2YWx1ZSBmb3Igc3RyaW5ncywgIiIuICBBZnRlciB0aGF0LCBpdCBlbnRlcnMgYQorbG9vcCB3aGljaCBtYWtlcyA2IGN5Y2xlcywgZWFjaCB0aW1lIHJhbmRvbWx5IGFkZGluZyBvbmUgb2YgdGhyZWUKK3Bvc3NpYmxlIHdvcmRzIHRvIHRoZSBzdHJpbmcuICBGb3IgYWxsIHdvcmRzIGV4Y2VwdCB0aGUgbGFzdCwgYW4gYWRkaXRpb25hbAorYmxhbmsgY2hhcmFjdGVyIGlzIGFkZGVkLiAgRm9yIHRoZSBsYXN0IHdvcmQsIGEgcGVyaW9kIGFuZCBhIHJldHVybgorY2hhcmFjdGVyIGFyZSBhZGRlZC4gIFRoZSBmdW5jdGlvbiB0aGVuIGV4aXRzIHRoZSBsb29wLCBjYXBpdGFsaXplcyB0aGUKK25vbnNlbnNlIHN0cmluZywgdGhlbiBleGl0cy4KKworMy4zIEFycmF5cyBpbiBMUEMKK0FuIGFycmF5IGlzIGEgcG93ZXJmdWwgY29tcGxleCBkYXRhIHR5cGUgb2YgTFBDIHdoaWNoIGFsbG93cyB5b3UgdG8KK2FjY2VzcyBtdWx0aXBsZSB2YWx1ZXMgdGhyb3VnaCBhIHNpbmdsZSB2YXJpYWJsZS4gIEZvciBpbnN0YW5jZSwKK05pZ2h0bWFyZSBoYXMgYW4gaW5kZWZpbml0ZSBudW1iZXIgb2YgY3VycmVuY2llcyBpbiB3aGljaCBwbGF5ZXJzIG1heQorZG8gYnVzaW5lc3MuICBPbmx5IGZpdmUgb2YgdGhvc2UgY3VycmVuY2llcywgaG93ZXZlciwgY2FuIGJlIGNvbnNpZGVyZWQKK2hhcmQgY3VycmVuY2llcy4gIEEgaGFyZCBjdXJyZW5jeSBmb3IgdGhlIHNha2Ugb2YgdGhpcyBleGFtcGxlIGlzIGEKK2N1cnJlbmN5IHdoaWNoIGlzIHJlYWRpbHkgZXhjaGFuZ2VhYmxlIGZvciBhbnkgb3RoZXIgaGFyZCBjdXJyZW5jeSwKK3doZXJlYXMgYSBzb2Z0IGN1cnJlbmN5IG1heSBvbmx5IGJlIGJvdWdodCwgYnV0IG5vdCBzb2xkLiAgSW4gdGhlIGJhbmssCit0aGVyZSBpcyBhIGxpc3Qgb2YgaGFyZCBjdXJyZW5jaWVzIHRvIGFsbG93IGJhbmsga2VlcGVycyB0byBrbm93IHdoaWNoCitjdXJyZW5jaWVzIGFyZSBpbiBmYWN0IGhhcmQgY3VycmVuY2llcy4gIFdpdGggc2ltcGxlIGRhdGEgdHlwZXMsIHdlIHdvdWxkCitoYXZlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBuYXN0eSBvcGVyYXRpb24gZm9yIGV2ZXJ5IGV4Y2hhbmdlCit0cmFuc2FjdGlvbjoKKworaW50IGV4Y2hhbmdlKHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgZnJvbSwgdG87CisgICAgaW50IGFtdDsKKworICAgIGlmKCFzdHIpIHJldHVybiAwOworICAgIGlmKHNzY2FuZihzdHIsICIlZCAlcyBmb3IgJXMiLCBhbXQsIGZyb20sIHRvKSAhPSAzKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYoZnJvbSAhPSAicGxhdGludW0iICYmIGZyb20gIT0gImdvbGQiICYmIGZyb20gIT0KKyAgICAgICJzaWx2ZXIiICYmCisgICAgICBmcm9tICE9ICJlbGVjdHJ1bSIgJiYgZnJvbSAhPSAiY29wcGVyIikgeworICAgICAgICBub3RpZnlfZmFpbCgiV2UgZG8gbm90IGJ1eSBzb2Z0IGN1cnJlbmNpZXMhXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC4uLgorfQorCitXaXRoIGZpdmUgaGFyZCBjdXJyZW5jaWVzLCB3ZSBoYXZlIGEgcmF0aGVyIHNpbXBsZSBleGFtcGxlLiAgQWZ0ZXIgYWxsIGl0Cit0b29rIG9ubHkgdHdvIGxpbmVzIG9mIGNvZGUgdG8gcmVwcmVzZW50IHRoZSBpZiBzdGF0ZW1lbnQgd2hpY2ggZmlsdGVyZWQKK291dCBiYWQgY3VycmVuY2llcy4gIEJ1dCB3aGF0IGlmIHlvdSBoYWQgdG8gY2hlY2sgYWdhaW5zdCBhbGwgdGhlIG5hbWVzCit3aGljaCBjYW5ub3QgYmUgdXNlZCB0byBtYWtlIGNoYXJhY3RlcnMgaW4gdGhlIGdhbWU/ICBUaGVyZSBtaWdodCBiZQorMTAwIG9mIHRob3NlOyB3b3VsZCB5b3Ugd2FudCB0byB3cml0ZSBhIDEwMCBwYXJ0IGlmIHN0YXRlbWVudD8KK1doYXQgaWYgeW91IHdhbnRlZCB0byBhZGQgYSBjdXJyZW5jeSB0byB0aGUgbGlzdCBvZiBoYXJkIGN1cnJlbmNpZXM/ICBUaGF0CittZWFucyB5b3Ugd291bGQgaGF2ZSB0byBjaGFuZ2UgZXZlcnkgY2hlY2sgaW4gdGhlIGdhbWUgZm9yIGhhcmQKK2N1cnJlbmNpZXMgdG8gYWRkIG9uZSBtb3JlIHBhcnQgdG8gdGhlIGlmIGNsYXVzZXMuICBBcnJheXMgYWxsb3cgeW91CitzaW1wbGUgYWNjZXNzIHRvIGdyb3VwcyBvZiByZWxhdGVkIGRhdGEgc28gdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gZGVhbAord2l0aCBlYWNoIGluZGl2aWR1YWwgdmFsdWUgZXZlcnkgdGltZSB5b3Ugd2FudCB0byBwZXJmb3JtIGEgZ3JvdXAKK29wZXJhdGlvbi4KKworQXMgYSBjb25zdGFudCwgYW4gYXJyYXkgbWlnaHQgbG9vayBsaWtlIHRoaXM6CisgICAgKHsgInBsYXRpbnVtIiwgImdvbGQiLCAic2lsdmVyIiwgImVsZWN0cnVtIiwgImNvcHBlciIgfSkKK3doaWNoIGlzIGFuIGFycmF5IG9mIHR5cGUgc3RyaW5nLiAgSW5kaXZpZHVhbCBkYXRhIHZhbHVlcyBpbiBhcnJheXMgYXJlCitjYWxsZWQgZWxlbWVudHMsIG9yIHNvbWV0aW1lcyBtZW1iZXJzLiAgSW4gY29kZSwganVzdCBhcyBjb25zdGFudAorc3RyaW5ncyBhcmUgcmVwcmVzZW50ZWQgYnkgc3Vycm91bmRpbmcgdGhlbSB3aXRoICIiLCBjb25zdGFudCBhcnJheXMgYXJlCityZXByZXNlbnRlZCBieSBiZWluZyBzdXJyb3VuZGVkIGJ5ICh7IH0pLCB3aXRoIGluZGl2aWR1YWwgZWxlbWVudHMgb2YKK3RoZSBhcnJheSBiZWluZyBzZXBhcmF0ZWQgYnkgYSAsLgorCitZb3UgbWF5IGhhdmUgYXJyYXlzIG9mIGFueSBMUEMgZGF0YSB0eXBlLCBzaW1wbGUgb3IgY29tcGxleC4gIEFycmF5cworbWFkZSB1cCBvZiBtaXhlcyBvZiB2YWx1ZXMgYXJlIGNhbGxlZCBhcnJheXMgb2YgbWl4ZWQgdHlwZS4gIEluIG1vc3QKK0xQQyBkcml2ZXJzLCB5b3UgZGVjbGFyZSBhbiBhcnJheSB1c2luZyBhIHRocm93LWJhY2sgdG8gQyBsYW5ndWFnZQorc3ludGF4IGZvciBhcnJheXMuICBUaGlzIHN5bnRheCBpcyBvZnRlbiBjb25mdXNpbmcgZm9yIExQQyBjb2RlcnMKK2JlY2F1c2UgdGhlIHN5bnRheCBoYXMgYSBtZWFuaW5nIGluIEMgdGhhdCBzaW1wbHkgZG9lcyBub3QgdHJhbnNsYXRlIGludG8KK0xQQy4gIE5ldmVydGhlbGVzcywgaWYgd2Ugd2FudGVkIGFuIGFycmF5IG9mIHR5cGUgc3RyaW5nLCB3ZSB3b3VsZAorZGVjbGFyZSBpdCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKKworc3RyaW5nICphcnI7CisKK0luIG90aGVyIHdvcmRzLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpdCB3aWxsIGNvbnRhaW4gZm9sbG93ZWQgYnkKK2Egc3BhY2UgYW5kIGFuIGFzdGVyaXNrLiAgUmVtZW1iZXIsIGhvd2V2ZXIsIHRoYXQgdGhpcyBuZXdseSBkZWNsYXJlZAorc3RyaW5nIGFycmF5IGhhcyBhIE5VTEwgdmFsdWUgaW4gaXQgYXQgdGhlIHRpbWUgb2YgZGVjbGFyYXRpb24uCisKKzMuNCBVc2luZyBBcnJheXMKK1lvdSBub3cgc2hvdWxkIHVuZGVyc3RhbmQgaG93IHRvIGRlY2xhcmUgYW5kIHJlY29nbml6ZSBhbiBhcnJheSBpbgorY29kZS4gIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQgaG93IHRoZXkgd29yayBpbiBjb2RlLCBsZXQncyByZXZpZXcgdGhlCitiYW5rIGNvZGUsIHRoaXMgdGltZSB1c2luZyBhcnJheXM6CisKK3N0cmluZyAqaGFyZF9jdXJyZW5jaWVzOworCitpbnQgZXhjaGFuZ2Uoc3RyaW5nIHN0cikgeworICAgIHN0cmluZyBmcm9tLCB0bzsKKyAgICBpbnQgYW10OworCisgICAgaWYoIXN0cikgcmV0dXJuIDA7CisgICAgaWYoc3NjYW5mKHN0ciwgIiVkICVzIGZvciAlcyIsIGFtdCwgZnJvbSwgdG8pICE9IDMpCityZXR1cm4gMDsKKyAgICBpZihtZW1iZXJfYXJyYXkoZnJvbSwgaGFyZF9jdXJyZW5jaWVzKSA9PSAtMSkgeworICAgICAgICBub3RpZnlfZmFpbCgiV2UgZG8gbm90IGJ1eSBzb2Z0IGN1cnJlbmNpZXMhXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC4uLgorfQorCitUaGlzIGNvZGUgYXNzdW1lcyBoYXJkX2N1cnJlbmNpZXMgaXMgYSBnbG9iYWwgdmFyaWFibGUgYW5kIGlzIGluaXRpYWxpemVkCitpbiBjcmVhdGUoKSBhczoKKyAgICBoYXJkX2N1cnJlbmNpZXMgPSAoeyAicGxhdGludW0iLCAiZ29sZCIsICJlbGVjdHJ1bSIsICJzaWx2ZXIiLAorICAgImNvcHBlciIgfSk7CitJZGVhbGx5LCB5b3Ugd291bGQgaGF2ZSBoYXJkIGN1cnJlbmNpZXMgYXMgYSAjZGVmaW5lIGluIGEgaGVhZGVyIGZpbGUgZm9yCithbGwgb2JqZWN0cyB0byB1c2UsIGJ1dCAjZGVmaW5lIGlzIGEgdG9waWMgZm9yIGEgbGF0ZXIgY2hhcHRlci4KKworT25jZSB5b3Uga25vdyB3aGF0IHRoZSBtZW1iZXJfYXJyYXkoKSBlZnVuIGRvZXMsIHRoaXMgbWV0aG9kCitjZXJ0YWlubHkgaXMgbXVjaCBlYXNpZXIgdG8gcmVhZCBhcyB3ZWxsIGFzIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgYW5kCitlYXNpZXIgdG8gY29kZS4gIEluIGZhY3QsIHlvdSBjYW4gcHJvYmFibHkgZ3Vlc3Mgd2hhdCB0aGUKK21lbWJlcl9hcnJheSgpIGVmdW4gZG9lczogIEl0IHRlbGxzIHlvdSBpZiBhIGdpdmVuIHZhbHVlIGlzIGEgbWVtYmVyIG9mCit0aGUgYXJyYXkgaW4gcXVlc3Rpb24uICBTcGVjaWZpY2FsbHkgaGVyZSwgd2Ugd2FudCB0byBrbm93IGlmIHRoZSBjdXJyZW5jeQordGhlIHBsYXllciBpcyB0cnlpbmcgdG8gc2VsbCBpcyBhbiBlbGVtZW50IGluIHRoZSBoYXJkX2N1cmVuY2llcyBhcnJheS4gCitXaGF0IG1pZ2h0IGJlIGNvbmZ1c2luZyB0byB5b3UgaXMsIG5vdCBvbmx5IGRvZXMgbWVtYmVyX2FycmF5KCkgdGVsbCB1cworaWYgdGhlIHZhbHVlIGlzIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5LCBidXQgaXQgaW4gZmFjdCB0ZWxscyB1cyB3aGljaCBlbGVtZW50CitvZiB0aGUgYXJyYXkgdGhlIHZhbHVlIGlzLgorCitIb3cgZG9lcyBpdCB0ZWxsIHlvdSB3aGljaCBlbGVtZW50PyAgSXQgaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYXJyYXlzIGlmCit5b3UgdGhpbmsgb2YgdGhlIGFycmF5IHZhcmlhYmxlIGFzIGhvbGRpbmcgYSBudW1iZXIuICBJbiB0aGUgdmFsdWUgYWJvdmUsCitmb3IgdGhlIHNha2Ugb2YgYXJndW1lbnQsIHdlIHdpbGwgc2F5IHRoYXQgaGFyZF9jdXJyZW5jaWVzIGhvbGRzIHRoZQordmFsdWUgMTc5MDAwLiAgVGhpcyB2YWx1ZSB0ZWxscyB0aGUgZHJpdmVyIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBhcnJheQoraGFyZF9jdXJyZW5jaWVzIHJlcHJlc2VudHMuICBUaHVzLCBoYXJkX2N1cnJlbmNpZXMgcG9pbnRzIHRvIGEgcGxhY2UKK3doZXJlIHRoZSBhcnJheSB2YWx1ZXMgbWF5IGJlIGZvdW5kLiAgV2hlbiBzb21lb25lIGlzIHRhbGtpbmcgYWJvdXQKK3RoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSwgdGhleSB3YW50IHRoZSBlbGVtZW50IGxvY2F0ZWQgYXQgMTc5MDAwLiAKK1doZW4gdGhlIG9iamVjdCBuZWVkcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBhcnJheSwgaXQKK2xvb2tzIGF0IDE3OTAwMCArIG9uZSB2YWx1ZSwgdGhlbiAxNzkwMDAgcGx1cyB0d28gdmFsdWVzIGZvciB0aGUgdGhpcmQsCithbmQgc28gb24uICBXZSBjYW4gdGhlcmVmb3JlIGFjY2VzcyBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIGFuIGFycmF5IGJ5Cit0aGVpciBpbmRleCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiB2YWx1ZXMgYmV5b25kIHRoZSBzdGFydGluZyBwb2ludCBvZgordGhlIGFycmF5IHdlIG5lZWQgdG8gbG9vayB0byBmaW5kIHRoZSB2YWx1ZS4gIEZvciB0aGUgYXJyYXkKK2hhcmRfY3VycmVuY2llcyBhcnJheToKKyJwbGF0aW51bSIgaGFzIGFuIGluZGV4IG9mIDAuCisiZ29sZCIgaGFzIGFuIGluZGV4IG9mIDEuCisiZWxlY3RydW0iIGhhcyBhbiBpbmRleCBvZiAyLgorInNpbHZlciIgaGFzIGFuIGluZGV4IG9mIDMuCisiY29wcGVyIiBoYXMgYW4gaW5kZXggb2YgNC4KKworVGhlIGVmdW4gbWVtYmVyX2FycmF5KCkgdGh1cyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBiZWluZwordGVzdGVkIGlmIGl0IGlzIGluIHRoZSBhcnJheSwgb3IgLTEgaWYgaXQgaXMgbm90IGluIHRoZSBhcnJheS4gIEluIG9yZGVyIHRvCityZWZlcmVuY2UgYW4gaW5kaXZpZHVhbCBlbGVtZW50IGluIGFuIGFycmF5LCB5b3UgdXNlIGl0cyBpbmRleCBudW1iZXIgaW4KK3RoZSBmb2xsb3dpbmcgbWFubmVyOgorYXJyYXlfbmFtZVtpbmRleF9ub10KK0V4YW1wbGU6CitoYXJkX2N1cnJlbmNpZXNbM10KK3doZXJlIGhhcmRfY3VycmVuY2llc1szXSB3b3VsZCByZWZlciB0byAic2lsdmVyIi4KKworU28sIHlvdSBub3cgc2hvdWxkIG5vdyBzZXZlcmFsIHdheXMgaW4gd2hpY2ggYXJyYXlzIGFwcGVhciBlaXRoZXIgYXMKK2Egd2hvbGUgb3IgYXMgaW5kaXZpZHVhbCBlbGVtZW50cy4gIEFzIGEgd2hvbGUsIHlvdSByZWZlciB0byBhbiBhcnJheQordmFyaWFibGUgYnkgaXRzIG5hbWUgYW5kIGFuIGFycmF5IGNvbnN0YW50IGJ5IGVuY2xvc2luZyB0aGUgYXJyYXkgaW4gKHsgfSkKK2FuZCBzZXBhcmF0aW5nIGVsZW1lbnRzIGJ5ICwuICBJbmRpdmlkdWFsbHksIHlvdSByZWZlciB0byBhcnJheSB2YXJpYWJsZXMKK2J5IHRoZSBhcnJheSBuYW1lIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50J3MgaW5kZXggbnVtYmVyIGVuY2xvc2VkIGluCitbXSwgYW5kIHRvIGFycmF5IGNvbnN0YW50cyBpbiB0aGUgc2FtZSB3YXkgeW91IHdvdWxkIHJlZmVyIHRvIHNpbXBsZSBkYXRhCit0eXBlcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBjb25zdGFudC4gIEV4YW1wbGVzOgorCitXaG9sZSBhcnJheXM6Cit2YXJpYWJsZTogIGFycgorY29uc3RhbnQ6ICh7ICJwbGF0aW51bSIsICJnb2xkIiwgImVsZWN0cnVtIiwgInNpbHZlciIsICJjb3BwZXIiIH0pCisKK0luZGl2aWR1YWwgbWVtYmVycyBvZiBhcnJheXM6Cit2YXJpYWJsZTogYXJyWzJdCitjb25zdGFudDogImVsZWN0cnVtIgorCitZb3UgY2FuIHVzZSB0aGVzZSBtZWFucyBvZiByZWZlcmVuY2UgdG8gZG8gYWxsIHRoZSB0aGluZ3MgeW91IGFyZSB1c2VkIHRvCitkb2luZyB3aXRoIG90aGVyIGRhdGEgdHlwZXMuICBZb3UgY2FuIGFzc2lnbiB2YWx1ZXMsIHVzZSB0aGUgdmFsdWVzIGluCitvcGVyYXRpb25zLCBwYXNzIHRoZSB2YWx1ZXMgYXMgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsIGFuZCB1c2UgdGhlCit2YWx1ZXMgYXMgcmV0dXJuIHR5cGVzLiAgSXQgaXMgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgd2hlbiB5b3UgYXJlCit0cmVhdGluZyBhbiBlbGVtZW50IGFsb25lIGFzIGFuIGluZGl2aWR1YWwsIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQgaXMgbm90CitpdHNlbGYgYW4gYXJyYXkgKHVubGVzcyB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBhcnJheSBvZiBhcnJheXMpLiAgSW4gdGhlCitleGFtcGxlIGFib3ZlLCB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBhcmUgc3RyaW5ncy4gIFNvIHRoYXQ6CisgICAgc3RyID0gYXJyWzNdICsgIiBhbmQgIiArIGFyclsxXTsKK3dpbGwgY3JlYXRlIHN0ciB0byBlcXVhbCAic2lsdmVyIGFuZCBnb2xkIi4gIEFsdGhvdWdoIHRoaXMgc2VlbXMgc2ltcGxlCitlbm91Z2gsIG1hbnkgcGVvcGxlIG5ldyB0byBhcnJheXMgc3RhcnQgdG8gcnVuIGludG8gdHJvdWJsZSB3aGVuIHRyeWluZwordG8gYWRkIGVsZW1lbnRzIHRvIGFuIGFycmF5LiAgV2hlbiB5b3UgYXJlIHRyZWF0aW5nIGFuIGFycmF5IGFzIGEgd2hvbGUKK2FuZCB5b3Ugd2lzaCB0byBhZGQgYSBuZXcgZWxlbWVudCB0byBpdCwgeW91IG11c3QgZG8gaXQgYnkgYWRkaW5nCithbm90aGVyIGFycmF5LgorCitOb3RlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKK3N0cmluZyBzdHIxLCBzdHIyOworc3RyaW5nICphcnI7CisKK3N0cjEgPSAiaGkiOworc3RyMiA9ICJieWUiOworLyogc3RyMSArIHN0cjIgZXF1YWxzICJoaWJ5ZSIgKi8KK2FyciA9ICh7IHN0cjEgfSkgKyAoeyBzdHIyIH0pOworLyogYXJyIGlzIGVxdWFsIHRvICh7IHN0cjEsIHN0cjIgfSkgKi8KK0JlZm9yZSBnb2luZyBhbnkgZnVydGhlciwgSSBoYXZlIHRvIG5vdGUgdGhhdCB0aGlzIGV4YW1wbGUgZ2l2ZXMgYW4KK2V4dHJlbWVseSBob3JyaWJsZSB3YXkgb2YgYnVpbGRpbmcgYW4gYXJyYXkuICBZb3Ugc2hvdWxkIHNldCBpdDogYXJyID0gKHsKK3N0cjEsIHN0cjIgfSkuICBUaGUgcG9pbnQgb2YgdGhlIGV4YW1wbGUsIGhvd2V2ZXIsIGlzIHRoYXQgeW91IG11c3QgYWRkCitsaWtlIHR5cGVzIHRvZ2V0aGVyLiAgSWYgeW91IHRyeSBhZGRpbmcgYW4gZWxlbWVudCB0byBhbiBhcnJheSBhcyB0aGUgZGF0YQordHlwZSBpdCBpcywgeW91IHdpbGwgZ2V0IGFuIGVycm9yLiAgSW5zdGVhZCB5b3UgaGF2ZSB0byB0cmVhdCBpdCBhcyBhbiBhcnJheSBvZgorYSBzaW5nbGUgZWxlbWVudC4KKworMy41IE1hcHBpbmdzCitPbmUgb2YgdGhlIG1ham9yIGFkdmFuY2VzIG1hZGUgaW4gTFBNdWRzIHNpbmNlIHRoZXkgd2VyZSBjcmVhdGVkIGlzCit0aGUgbWFwcGluZyBkYXRhIHR5cGUuICBQZW9wbGUgYWx0ZXJuYXRlbHkgcmVmZXIgdG8gdGhlbSBhcyBhc3NvY2lhdGl2ZQorYXJyYXlzLiAgUHJhY3RpY2FsbHkgc3BlYWtpbmcsIGEgbWFwcGluZyBhbGxvd3MgeW91IGZyZWVkb20gZnJvbSB0aGUKK2Fzc29jaWF0aW9uIG9mIGEgbnVtZXJpY2FsIGluZGV4IHRvIGEgdmFsdWUgd2hpY2ggYXJyYXlzIHJlcXVpcmUuIAorSW5zdGVhZCwgbWFwcGluZ3MgYWxsb3cgeW91IHRvIGFzc29jaWF0ZSB2YWx1ZXMgd2l0aCBpbmRpY2VzIHdoaWNoCithY3R1YWxseSBoYXZlIG1lYW5pbmcgdG8geW91LCBtdWNoIGxpa2UgYSByZWxhdGlvbmFsIGRhdGFiYXNlLgorCitJbiBhbiBhcnJheSBvZiA1IGVsZW1lbnRzLCB5b3UgYWNjZXNzIHRob3NlIHZhbHVlcyBzb2xlbHkgYnkgdGhlaXIgaW50ZWdlcgoraW5kaWNlcyB3aGljaCBjb3ZlciB0aGUgcmFuZ2UgMCB0byA0LiAgSW1hZ2luZSBnb2luZyBiYWNrIHRvIHRoZSBleGFtcGxlCitvZiBtb25leSBhZ2Fpbi4gIFBsYXllcnMgaGF2ZSBtb25leSBvZiBkaWZmZXJlbnQgYW1vdW50cyBhbmQgZGlmZmVyZW50Cit0eXBlcy4gIEluIHRoZSBwbGF5ZXIgb2JqZWN0LCB5b3UgbmVlZCBhIHdheSB0byBzdG9yZSB0aGUgdHlwZXMgb2YgbW9uZXkKK3RoYXQgZXhpc3QgYXMgd2VsbCBhcyByZWxhdGUgdGhlbSB0byB0aGUgYW1vdW50IG9mIHRoYXQgY3VycmVuY3kgdHlwZSB0aGUKK3BsYXllciBoYXMuICBUaGUgYmVzdCB3YXkgdG8gZG8gdGhpcyB3aXRoIGFycmF5cyB3b3VsZCBoYXZlIGJlZW4gdG8KK3N0b3JlIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIG1vbmV5IHR5cGVzIGFuZCBhbiBhcnJheSBvZgoraW50ZWdlcnMgcmVwcmVzZW50aW5nIHZhbHVlcyBpbiB0aGUgcGxheWVyIG9iamVjdC4gIFRoaXMgd291bGQgcmVzdWx0IGluCitDUFUtZWF0aW5nIHVnbHkgY29kZSBsaWtlIHRoaXM6CisKK2ludCBxdWVyeV9tb25leShzdHJpbmcgdHlwZSkgeworICAgIGludCBpOworCisgICAgaSA9IG1lbWJlcl9hcnJheSh0eXBlLCBjdXJyZW5jaWVzKTsKKyAgICBpZihpPi0xICYmIGkgPCBzaXplb2YoYW1vdW50cykpICAvKiBzaXplb2YgZWZ1bgorcmV0dXJucyAjIG9mIGVsZW1lbnRzICovCisgICAgICAgIHJldHVybiBhbW91bnRzW2ldOworICAgIGVsc2UgcmV0dXJuIDA7Cit9CisKK0FuZCB0aGF0IGlzIGEgc2ltcGxlIHF1ZXJ5IGZ1bmN0aW9uLiAgTG9vayBhdCBhbiBhZGQgZnVuY3Rpb246CisKK3ZvaWQgYWRkX21vbmV5KHN0cmluZyB0eXBlLCBpbnQgYW10KSB7CisgICAgc3RyaW5nICp0bXAxOworICAgIGludCAqIHRtcDI7CisgICAgaW50IGksIHgsIGosIG1heGo7CisgICAgCisgICAgaSA9IG1lbWJlcl9hcnJheSh0eXBlLCBjdXJyZW5jaWVzKTsKKyAgICBpZihpID49IHNpemVvZihhbW91bnRzKSkgLyogIGNvcnJ1cHQgZGF0YSwgd2UgYXJlIGluCisgICAgICBhIGJhZCB3YXkgKi8KKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UgaWYoaT09IC0xKSB7CisgICAgICAgIGN1cnJlbmNpZXMgKz0gKHsgdHlwZSB9KTsKKyAgICAgICAgYW1vdW50cyArPSAoeyBhbXQgfSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFtb3VudHNbaV0gKz0gYW10OworICAgICAgICBpZihhbW91bnRzW2ldIDwgMSkgeworICAgICAgICAgICAgdG1wMSA9IGFsbG9jYXRlKHNpemVvZihjdXJyZW5jaWVzKS0xKTsKKyAgICAgICAgICAgIHRtcDIgPSBhbGxvY2F0ZShzaXplb2YoYW1vdW50cyktMSk7CisgICAgICAgICAgICBmb3Ioaj0wLCB4ID0wLCBtYXhqPXNpemVvZih0bXAxKTsgaiA8IG1heGo7CisgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgICAgIGlmKGo9PWkpIHggPSAxOworICAgICAgICAgICAgICAgIHRtcDFbal0gPSBjdXJyZW5jaWVzW2oreF07CisgICAgICAgICAgICAgICAgdG1wMltqXSA9IGFtb3VudHNbait4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbmNpZXMgPSB0bXAxOworICAgICAgICAgICAgYW1vdW50cyA9IHRtcDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RoYXQgaXMgcmVhbGx5IHNvbWUgbmFzdHkgY29kZSB0byBwZXJmb3JtIHRoZSByYXRoZXIgc2ltcGxlIGNvbmNlcHQgb2YKK2FkZGluZyBzb21lIG1vbmV5LiAgRmlyc3QsIHdlIGZpZ3VyZSBvdXQgaWYgdGhlIHBsYXllciBoYXMgYW55IG9mIHRoYXQKK2tpbmQgb2YgbW9uZXksIGFuZCBpZiBzbywgd2hpY2ggZWxlbWVudCBvZiB0aGUgY3VycmVuY2llcyBhcnJheSBpdCBpcy4gCitBZnRlciB0aGF0LCB3ZSBoYXZlIHRvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGN1cnJlbmN5IGRhdGEKK2hhcyBiZWVuIG1haW50YWluZWQuICBJZiB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIGN1cnJlbmNpZXMgYXJyYXkgaXMKK2dyZWF0ZXIgdGhhbiB0aGUgaGlnaGVzdCBpbmRleCBvZiB0aGUgYW1vdW50cyBhcnJheSwgdGhlbiB3ZSBoYXZlIGEKK3Byb2JsZW0gc2luY2UgdGhlIGluZGljZXMgYXJlIG91ciBvbmx5IHdheSBvZiByZWxhdGluZyB0aGUgdHdvIGFycmF5cy4gCitPbmNlIHdlIGtub3cgb3VyIGRhdGEgaXMgaW4gdGFjdCwgaWYgdGhlIGN1cnJlbmN5IHR5cGUgaXMgbm90IGN1cnJlbnRseQoraGVsZCBieSB0aGUgcGxheWVyLCB3ZSBzaW1wbHkgdGFjayBvbiB0aGUgdHlwZSBhcyBhIG5ldyBlbGVtZW50IHRvIHRoZQorY3VycmVuY2llcyBhcnJheSBhbmQgdGhlIGFtb3VudCBhcyBhIG5ldyBlbGVtZW50IHRvIHRoZSBhbW91bnRzIGFycmF5LiAKK0ZpbmFsbHksIGlmIGl0IGlzIGEgY3VycmVuY3kgdGhlIHBsYXllciBjdXJyZW50bHkgaGFzLCB3ZSBqdXN0IGFkZCB0aGUKK2Ftb3VudCB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbiB0aGUgYW1vdW50cyBhcnJheS4gIElmIHRoZSBtb25leQorZ2V0cyBiZWxvdyAxLCBtZWFuaW5nIGhhdmluZyBubyBtb25leSBvZiB0aGF0IHR5cGUsIHdlIHdhbnQgdG8gY2xlYXIKK3RoZSBjdXJyZW5jeSBvdXQgb2YgbWVtb3J5LgorCitTdWJ0cmFjdGluZyBhbiBlbGVtZW50IGZyb20gYW4gYXJyYXkgaXMgbm8gc2ltcGxlIG1hdHRlci4gIFRha2UsIGZvcgorZXhhbXBsZSwgdGhlIHJlc3VsdCBvZiB0aGUgZm9sbG93aW5nOgorCitzdHJpbmcgKmFycjsKKworYXJyID0gKHsgImEiLCAiYiIsICJhIiB9KTsKK2FyciAtPSAoeyBhcnJbMl0gfSk7CisKK1doYXQgZG8geW91IHRoaW5rIHRoZSBmaW5hbCB2YWx1ZSBvZiBhcnIgaXM/IFdlbGwsIGl0IGlzOgorICAgICh7ICJiIiwgImEiIH0pCitTdWJ0cmFjdGluZyBhcnJbMl0gZnJvbSB0aGUgb3JpZ2luYWwgYXJyYXkgZG9lcyBub3QgcmVtb3ZlIHRoZSB0aGlyZAorZWxlbWVudCBmcm9tIHRoZSBhcnJheS4gIEluc3RlYWQsIGl0IHN1YnRyYWN0cyB0aGUgdmFsdWUgb2YgdGhlIHRoaXJkCitlbGVtZW50IG9mIHRoZSBhcnJheSBmcm9tIHRoZSBhcnJheS4gIEFuZCBhcnJheSBzdWJ0cmFjdGlvbiByZW1vdmVzIHRoZQorZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5LiAgU2luY2Ugd2UgZG8gbm90IHdhbnQgdG8gYmUKKzwqIE5PVEUgSGlnaGxhbmRlckBNb3JnZW5HcmF1ZW4gMTEuMi45NDoKKwlXUk9ORyBpbiBNb3JnZW5HcmF1ZW4gKGF0IGxlYXN0KS4gVGhlIHJlc3VsdCBpcyBhY3R1YWxseSAoeyAiYiIgfSkuIEFycmF5CisJc3VidHJhY3Rpb24gcmVtb3ZlcyBBTEwgaW5zdGFuY2VzIG9mIHRoZSBzdWJ0cmFjdGVkIHZhbHVlIGZyb20gdGhlIGFycmF5LgorCVRoaXMgaG9sZHMgdHJ1ZSBmb3IgYWxsIEFteWxhYXItZHJpdmVyIExQTXVkcy4KKyo+Citmb3JjZWQgb24gY291bnRpbmcgb24gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBhcyBiZWluZyB1bmlxdWUsIHdlIGFyZQorZm9yY2VkIHRvIGdvIHRocm91Z2ggc29tZSBzb21lcnNhdWx0cyB0byByZW1vdmUgdGhlIGNvcnJlY3QgZWxlbWVudAorZnJvbSBib3RoIGFycmF5cyBpbiBvcmRlciB0byBtYWludGFpbiB0aGUgY29ycmVzcG9uZGVuY2Ugb2YgdGhlIGluZGljZXMKK2luIHRoZSB0d28gYXJyYXlzLgorCitNYXBwaW5ncyBwcm92aWRlIGEgYmV0dGVyIHdheS4gIFRoZXkgYWxsb3cgeW91IHRvIGRpcmVjdGx5IGFzc29jaWF0ZSB0aGUKK21vbmV5IHR5cGUgd2l0aCBpdHMgdmFsdWUuICBTb21lIHBlb3BsZSB0aGluayBvZiBtYXBwaW5ncyBhcyBhcnJheXMKK3doZXJlIHlvdSBhcmUgbm90IHJlc3RyaWN0ZWQgdG8gaW50ZWdlcnMgYXMgaW5kaWNlcy4gIFRydXRoIGlzLCBtYXBwaW5ncworYXJlIGFuIGVudGlyZWx5IGRpZmZlcmVudCBjb25jZXB0IGluIHN0b3JpbmcgYWdncmVnYXRlIGluZm9ybWF0aW9uLiAgQXJyYXlzCitmb3JjZSB5b3UgdG8gY2hvb3NlIGFuIGluZGV4IHdoaWNoIGlzIG1lYW5pbmdmdWwgdG8gdGhlIG1hY2hpbmUgZm9yCitsb2NhdGluZyB0aGUgYXBwcm9wcmlhdGUgZGF0YS4gIFRoZSBpbmRpY2VzIHRlbGwgdGhlIG1hY2hpbmUgaG93IG1hbnkKK2VsZW1lbnRzIGJleW9uZCB0aGUgZmlyc3QgdmFsdWUgdGhlIHZhbHVlIHlvdSBkZXNpcmUgY2FuIGJlIGZvdW5kLiAgV2l0aAorbWFwcGluZ3MsIHlvdSBjaG9vc2UgaW5kaWNlcyB3aGljaCBhcmUgbWVhbmluZ2Z1bCB0byB5b3Ugd2l0aG91dAord29ycnlpbmcgYWJvdXQgaG93IHRoYXQgbWFjaGluZSBsb2NhdGVzIGFuZCBzdG9yZXMgaXQuCisKK1lvdSBtYXkgcmVjb2duaXplIG1hcHBpbmdzIGluIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisKK2NvbnN0YW50IHZhbHVlczoKK3dob2xlOiAoWyBpbmRleDp2YWx1ZSwgaW5kZXg6dmFsdWUgXSkgRXg6IChbICJnb2xkIjoxMCwgInNpbHZlciI6MjAgXSkKK2VsZW1lbnQ6ICAxMAorCit2YXJpYWJsZSB2YWx1ZXM6Cit3aG9sZTogICAgbWFwICAgKHdoZXJlIG1hcCBpcyB0aGUgbmFtZSBvZiBhIG1hcHBpbmcgdmFyaWFibGUpCitlbGVtZW50OiBtYXBbImdvbGQiXQorCitTbyBub3cgbXkgbW9uZXRhcnkgZnVuY3Rpb25zIHdvdWxkIGxvb2sgbGlrZToKKworaW50IHF1ZXJ5X21vbmV5KHN0cmluZyB0eXBlKSB7IHJldHVybiBtb25leVt0eXBlXTsgfQorCit2b2lkIGFkZF9tb25leShzdHJpbmcgdHlwZSwgaW50IGFtdCkgeworICAgIGlmKCFtb25leVt0eXBlXSkgbW9uZXlbdHlwZV0gPSBhbXQ7CisgICAgZWxzZSBtb25leVt0eXBlXSArPSBhbXQ7CisgICAgaWYobW9uZXlbdHlwZV0gPCAxKQorICAgICAgbWFwX2RlbGV0ZShtb25leSwgdHlwZSk7ICAgICAgICAgIC8qIHRoaXMgaXMgZm9yCisgICAgICAgICAgTXVkT1MgKi8KKyAgICAgICAgICAgIC4uLk9SLi4uIAorICAgICAgICAgICAgbW9uZXkgPSBtX2RlbGV0ZShtb25leSwgdHlwZSkgIC8qIGZvciBzb21lCisgICAgICAgICAgTFBNdWQgMy4qIHZhcmlldGllcyAqLworICAgICAgICAgICAgLi4uIE9SLi4uIAorICAgICAgICAgbV9kZWxldGUobW9uZXksIHR5cGUpOyAgICAvKiBmb3Igb3RoZXIgTFBNdWQgMy4qCisgICAgICAgICAgdmFyaWV0aWVzICovCit9CisKK1BsZWFzZSBub3RpY2UgZmlyc3QgdGhhdCB0aGUgZWZ1bnMgZm9yIGNsZWFyaW5nIGEgbWFwcGluZyBlbGVtZW50IGZyb20gdGhlCittYXBwaW5nIHZhcnkgZnJvbSBkcml2ZXIgdG8gZHJpdmVyLiAgQ2hlY2sgd2l0aCB5b3VyIGRyaXZlcidzCitkb2N1bWVudGF0aW9uIGZvciB0aGUgZXhhY3QgbmFtZSBhbiBzeW50YXggb2YgdGhlIHJlbGV2YW50IGVmdW4uCisKK0FzIHlvdSBjYW4gc2VlIGltbWVkaWF0ZWx5LCB5b3UgZG8gbm90IG5lZWQgdG8gY2hlY2sgdGhlIGludGVncml0eSBvZgoreW91ciBkYXRhIHNpbmNlIHRoZSB2YWx1ZXMgd2hpY2ggaW50ZXJlc3QgeW91IGFyZSBpbmV4dHJpY2FibHkgYm91bmQgdG8KK29uZSBhbm90aGVyIGluIHRoZSBtYXBwaW5nLiAgU2Vjb25kbHksIGdldHRpbmcgcmlkIG9mIHVzZWxlc3MgdmFsdWVzIGlzIGEKK3NpbXBsZSBlZnVuIGNhbGwgcmF0aGVyIHRoYW4gYSB0cmlja3ksIENQVS1lYXRpbmcgbG9vcC4gIEZpbmFsbHksIHRoZQorcXVlcnkgZnVuY3Rpb24gaXMgbWFkZSB1cCBzb2xlbHkgb2YgYSByZXR1cm4gaW5zdHJ1Y3Rpb24uIAorCitZb3UgbXVzdCBkZWNsYXJlIGFuZCBpbml0aWFsaXplIGFueSBtYXBwaW5nIGJlZm9yZSB1c2luZyBpdC4gCitEZWNsYXJhdGlvbnMgbG9vayBsaWtlOgorbWFwcGluZyBtYXA7CitXaGVyZWFzIGNvbW1vbiBpbml0aWFsaXphdGlvbnMgbG9vayBsaWtlOgorbWFwID0gKFtdKTsKK21hcCA9IG1fYWxsb2NhdGUoMTApICAgLi4uT1IuLi4gICBtYXAgPSBtX2FsbG9jYXRlKDEwKTsKK21hcCA9IChbICJnb2xkIjogMjAsICJzaWx2ZXIiOiAxNSBdKTsKKworQXMgd2l0aCBvdGhlciBkYXRhIHR5cGVzLCB0aGVyZSBhcmUgcnVsZXMgZGVmaW5pbmcgaG93IHRoZXkgd29yayBpbgorY29tbW9uIG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb246CisgICAgKFsgImdvbGQiOjIwLCAic2lsdmVyIjozMCBdKSArIChbICJlbGVjdHJ1bSI6NSBdKSAKK2dpdmVzOgorICAgIChbImdvbGQiOjIwLCAic2lsdmVyIjozMCwgImVsZWN0cnVtIjo1XSkgICAKK0FsdGhvdWdoIG15IGRlbW9uc3RyYXRpb24gc2hvd3MgYSBjb250aW51aXR5IG9mIG9yZGVyLCB0aGVyZSBpcyBpbiBmYWN0CitubyBndWFyYW50ZWUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIGVsZW1lbnRzIG9mIG1hcHBpbmdzIHdpbGwgc3RvcmVkLiAKK0VxdWl2YWxlbmNlIHRlc3RzIGFtb25nIG1hcHBpbmdzIGFyZSB0aGVyZWZvcmUgbm90IGEgZ29vZCB0aGluZy4KKworMy42IFN1bW1hcnkKK01hcHBpbmdzIGFuZCBhcnJheXMgY2FuIGJlIGJ1aWx0IGFzIGNvbXBsZXggYXMgeW91IG5lZWQgdGhlbSB0byBiZS4gCitZb3UgY2FuIGhhdmUgYW4gYXJyYXkgb2YgbWFwcGluZ3Mgb2YgYXJyYXlzLiAgU3VjaCBhIHRoaW5nIHdvdWxkIGJlCitkZWNsYXJlZCBsaWtlIHRoaXM6CisKK21hcHBpbmcgKm1hcF9vZl9hcnJzOword2hpY2ggbWlnaHQgbG9vayBsaWtlOgorKHsgKFsgaW5kMTogKHsgdmFsQTEsIHZhbEEyfSksIGluZDI6ICh7dmFsQjEsIHZhbEIyfSkgXSksIChbIGluZFg6Cisoe3ZhbFgxLHZhbFgyfSkgXSkgfSkKKworTWFwcGluZ3MgbWF5IHVzZSBhbnkgZGF0YSB0eXBlIGFzIGFuIGluZGV4LCBpbmNsdWRpbmcgb2JqZWN0cy4gCitNYXBwaW5nIGluZGljZXMgYXJlIG9mdGVuIHJlZmVycmVkIHRvIGFzIGtleXMgYXMgd2VsbCwgYSB0ZXJtIGZyb20KK2RhdGFiYXNlcy4gIEFsd2F5cyBrZWVwIGluIG1pbmQgdGhhdCB3aXRoIGFueSBub24taW50ZWdlciBkYXRhIHR5cGUsCit5b3UgbXVzdCBmaXJzdCBpbml0aWFsaXplIGEgdmFyaWFibGUgYmVmb3JlIG1ha2luZyB1c2Ugb2YgaXQgaW4gY29tbW9uCitvcGVyYXRpb25zIHN1Y2ggYXMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLiAgSW4gc3BpdGUgb2YgdGhlIGVhc2UgYW5kCitkeW5hbWljcyBhZGRlZCB0byBMUEMgY29kaW5nIGJ5IG1hcHBpbmdzIGFuZCBhcnJheXMsIGVycm9ycyBjYXVzZWQKK2J5IGZhaWxpbmcgdG8gaW5pdGlhbGl6ZSB0aGVpciB2YWx1ZXMgY2FuIGJlIHRoZSBtb3N0IG1hZGRlbmluZyBleHBlcmllbmNlCitmb3IgcGVvcGxlIG5ldyB0byB0aGVzZSBkYXRhIHR5cGVzLiAgSSB3b3VsZCB2ZW50dXJlIHRoYXQgYSB2ZXJ5IGhpZ2gKK3BlcmNlbnRhZ2Ugb2YgYWxsIGVycm9ycyBwZW9wbGUgZXhwZXJpbWVudGluZyB3aXRoIG1hcHBpbmdzIGFuZCBhcnJheXMKK2ZvciB0aGUgZmlyc3QgdGltZSBlbmNvdW50ZXIgYXJlIG9uZSBvZiB0aHJlZSBlcnJvciBtZXNzYWdlczoKKwlJbmRleGluZyBvbiBpbGxlZ2FsIHR5cGUuCisJSWxsZWdhbCBpbmRleC4KKwlCYWQgYXJndW1lbnQgMSB0byAoKyArPSAtIC09KSAvKiBpbnNlcnQgeW91ciBmYXZvdXJpdGUgb3BlcmF0b3IgKi8KK0Vycm9yIG1lc3NhZ2VzIDEgYW5kIDMgYXJlIGRhcm4gbmVhciBhbG1vc3QgYWx3YXlzIGNhdXNlZCBieSBhIGZhaWx1cmUKK3RvIGluaXRpYWxpemUgdGhlIGFycmF5IG9yIG1hcHBpbmcgaW4gcXVlc3Rpb24uICBFcnJvciBtZXNzYWdlIDIgaXMgY2F1c2VkCitnZW5lcmFsbHkgd2hlbiB5b3UgYXJlIHRyeWluZyB0byB1c2UgYW4gaW5kZXggaW4gYW4gaW5pdGlhbGl6ZWQgYXJyYXkKK3doaWNoIGRvZXMgbm90IGV4aXN0LiAgQWxzbywgZm9yIGFycmF5cywgb2Z0ZW4gcGVvcGxlIG5ldyB0byBhcnJheXMgd2lsbAorZ2V0IGVycm9yIG1lc3NhZ2UgMyBiZWNhdXNlIHRoZXkgdHJ5IHRvIGFkZCBhIHNpbmdsZSBlbGVtZW50IHRvIGFuIGFycmF5CitieSBhZGRpbmcgdGhlIGluaXRpYWwgYXJyYXkgdG8gdGhlIHNpbmdsZSBlbGVtZW50IHZhbHVlIGluc3RlYWQgb2YgYWRkaW5nCithbiBhcnJheSBvZiB0aGUgc2luZ2xlIGVsZW1lbnQgdG8gdGhlIGluaXRpYWwgYXJyYXkuICBSZW1lbWJlciwgYWRkIG9ubHkKK2FycmF5cyB0byBhcnJheXMuCisKK0F0IHRoaXMgcG9pbnQsIHlvdSBzaG91bGQgZmVlbCBjb21mb3J0YWJsZSBlbm91Z2ggd2l0aCBtYXBwaW5ncyBhbmQKK2FycmF5cyB0byBwbGF5IHdpdGggdGhlbS4gIEV4cGVjdCB0byBlbmNvdW50ZXIgdGhlIGFib3ZlIGVycm9yIG1lc3NhZ2VzCithIGxvdCB3aGVuIGZpcnN0IHBsYXlpbmcgd2l0aCB0aGVzZS4gIFRoZSBrZXkgdG8gc3VjY2VzcyB3aXRoIG1hcHBpbmdzIGlzCitpbiBkZWJ1Z2dpbmcgYWxsIG9mIHRoZXNlIGVycm9ycyBhbmQgc2VlaW5nIGV4YWN0bHkgd2hhdCBjYXVzZXMgd2hvbGVzCitpbiB5b3VyIHByb2dyYW1taW5nIHdoaWNoIGFsbG93IHlvdSB0byB0cnkgdG8gd29yayB3aXRoIHVuaW5pdGlhbGl6ZWQKK21hcHBpbmdzIGFuZCBhcnJheXMuICBGaW5hbGx5LCBnbyBiYWNrIHRocm91Z2ggdGhlIGJhc2ljIHJvb20gY29kZSBhbmQKK2xvb2sgYXQgdGhpbmdzIGxpa2UgdGhlIHNldF9leGl0cygpIChvciB0aGUgZXF1aXZhbGVudCBvbiB5b3VyIG11ZGxpYikKK2Z1bmN0aW9uLiAgQ2hhbmNlcyBhcmUgaXQgbWFrZXMgdXNlIG9mIG1hcHBpbmdzLiAgSW4gc29tZSBpbnN0YW5jZXMsIGl0Cit3aWxsIHVzZSBhcnJheXMgYXMgd2VsbCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG11ZGxpYi5uLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjQgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlOTkwNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyNApAQCAtMCwwICsxLDE5NSBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDQ6IFRoZSBMUEMgUHJlLUNvbXBpbGVyCisKKzQuMSBSZXZpZXcKK1RoZSBwcmV2aW91cyBjaGFwdGVyIHdhcyBxdWl0ZSBoZWF2eSwgc28gbm93IEkgd2lsbCBzbG93IGRvd24gYSBiaXQgc28KK3lvdSBjYW4gZGlnZXN0IGFuZCBwbGF5IHdpdGggbWFwcGluZ3MgYW5kIGFycmF5cyBieSB0YWtpbmcgb24gdGhlCityYXRoZXIgc2ltcGxlIHRvcGljIG9mIHRoZSBMUEMgcHJlLWNvbXBpbGVyLiAgQnkgdGhpcyBwb2ludCwgaG93ZXZlciwKK3lvdSBzaG91bGQgd2VsbCB1bmRlcnN0YW5kIGhvdyB0aGUgZHJpdmVyIGludGVyYWN0cyB3aXRoIHRoZSBtdWRsaWIgYW5kCitiZSBhYmxlIHRvIGNvZGUgb2JqZWN0cyB3aGljaCB1c2UgY2FsbCBvdXRzIGFuZCBoZWFydCBiZWF0cy4gIEluIGFkZGl0aW9uLAoreW91IHNob3VsZCBiZSBjb2Rpbmcgc2ltcGxlIG9iamVjdHMgd2hpY2ggdXNlIG1hcHBpbmdzIGFuZCBhcnJheXMsCitub3RpbmcgaG93IHRoZXNlIGRhdGEgdHlwZXMgcGVyZm9ybSBpbiBvYmplY3RzLiAgSXQgaXMgYWxzbyBhIGdvb2QgaWRlYSB0bworc3RhcnQgbG9va2luZyBpbiBkZXRhaWwgYXQgdGhlIGFjdHVhbCBtdWRsaWIgY29kZSB0aGF0IG1ha2VzIHVwIHlvdXIgbXVkLiAKK1NlZSBpZiB5b3UgdW5kZXJzdGFuZCBldmVyeXRoaW5nIHdoaWNoIGlzIGdvaW5nIG9uIGluIHlvdXIgbXVkbGlicworcm9vbSBhbmQgbW9uc3RlciBjb2Rlcy4gIEZvciB0aGluZ3MgeW91IGRvIG5vdCB1bmRlcnN0YW5kLCBhc2sgdGhlCitwZW9wbGUgb24geW91ciBtdWQgZGVzaWduYXRlZCB0byBhbnN3ZXIgY3JlYXRvciBjb2RpbmcgcXVlc3Rpb25zLgorCitQcmUtY29tcGlsZXIgaXMgYWN0dWFsbHkgYSBiaXQgb2YgYSBtaXNub21lciBzaW5jZSBMUEMgY29kZSBpcyBuZXZlcgordHJ1bHkgY29tcGlsZWQuICBBbHRob3VnaCB0aGlzIGlzIGNoYW5naW5nIHdpdGggcHJvdG90eXBlcyBvZiBuZXdlcgorTFBDIGRyaXZlcnMsIExQQyBkcml2ZXJzIGludGVycHJldCB0aGUgTFBDIGNvZGUgd3JpdHRlbiBieSBjcmVhdG9ycworcmF0aGVyIHRoYW4gY29tcGlsZSBpdCBpbnRvIGJpbmFyeSBmb3JtYXQuICBOZXZlcnRoZWxlc3MsIHRoZSBMUEMgcHJlLQorY29tcGlsZXIgZnVuY3Rpb25zIHN0aWxsIHBlcmZvcm0gbXVjaCBsaWtlIHByZS1jb21waWxlcnMgZm9yIGNvbXBpbGVkCitsYW5ndWFnZXMgaW4gdGhhdCBwcmUtY29tcGlsZXIgZGlyZWN0aXZlcyBhcmUgaW50ZXJwcmV0ZWQgYmVmb3JlIHRoZSBkcml2ZXIKK2V2ZW4gc3RhcnRzIHRvIGxvb2sgYXQgb2JqZWN0IGNvZGUuIAorCis0LjIgUHJlLWNvbXBpbGVyIERpcmVjdGl2ZXMKK0lmIHlvdSBkbyBub3Qga25vdyB3aGF0IGEgcHJlLWNvbXBpbGVyIGlzLCB5b3UgcmVhbGx5IGRvIG5vdCBuZWVkIHRvCit3b3JyeS4gIFdpdGggcmVzcGVjdCB0byBMUEMsIGl0IGlzIGJhc2ljYWxseSBhIHByb2Nlc3Mgd2hpY2ggaGFwcGVucworYmVmb3JlIHRoZSBkcml2ZXIgYmVnaW5zIHRvIGludGVycHJldCBMUEMgY29kZSB3aGljaCBhbGxvd3MgeW91IHRvCitwZXJmb3JtIGFjdGlvbnMgdXBvbiB0aGUgZW50aXJlIGNvZGUgZm91bmQgaW4geW91ciBmaWxlLiAgU2luY2UgdGhlIGNvZGUKK2lzIG5vdCB5ZXQgaW50ZXJwcmV0ZWQsIHRoZSBwcmUtY29tcGlsZXIgcHJvY2VzcyBpcyBpbnZvbHZlZCBiZWZvcmUgdGhlIGZpbGUKK2V4aXN0cyBhcyBhbiBvYmplY3QgYW5kIGJlZm9yZSBhbnkgTFBDIGZ1bmN0aW9ucyBvciBpbnN0cnVjdGlvbnMgYXJlIGV2ZXIKK2V4YW1pbmVkLiAgVGhlIHByZS1jb21waWxlciBpcyB0aHVzIHdvcmtpbmcgYXQgdGhlIGZpbGUgbGV2ZWwsIG1lYW5pbmcKK3RoYXQgaXQgZG9lcyBub3QgZGVhbCB3aXRoIGFueSBjb2RlIGluIGluaGVyaXRlZCBmaWxlcy4KKworVGhlIHByZS1jb21waWxlciBzZWFyY2hlcyBhIGZpbGUgc2VudCB0byBpdCBmb3IgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZXMuIAorVGhlc2UgYXJlIGxpdHRsZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGZpbGUgbWVhbnQgb25seSBmb3IgdGhlIHByZS1jb21waWxlcgorYW5kIGFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIExQQyBsYW5ndWFnZS4gIEEgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZSBpcworYW55IGxpbmUgaW4gYSBmaWxlIGJlZ2lubmluZyB3aXRoIGEgcG91bmQgKCMpIHNpZ24uICBQcmUtY29tcGlsZXIKK2RpcmVjdGl2ZXMgYXJlIGdlbmVyYWxseSB1c2VkIHRvIGNvbnN0cnVjdCB3aGF0IHRoZSBmaW5hbCBjb2RlIG9mIGEgZmlsZSB3aWxsCitsb29rIGF0LiAgVGhlIG1vc3QgY29tbW9uIHByZS1jb21waWxlciBkaXJlY3RpdmVzIGFyZToKKworI2RlZmluZQorI3VuZGVmaW5lCisjaW5jbHVkZQorI2lmZGVmCisjaWZuZGVmCisjaWYKKyNlbHNlaWYKKyNlbHNlCisjZW5kaWYKKyNwcmFnbWEKKworTW9zdCByZWFsbSBjb2RlcnMgb24gbXVkcyB1c2UgZXhjbHVzaXZlbHkgdGhlIGRpcmVjdGl2ZXMgI2RlZmluZSBhbmQKKyNpbmNsdWRlLiAgVGhlIG90aGVyIGRpcmVjdGl2ZXMgeW91IG1heSBzZWUgb2Z0ZW4gYW5kIHNob3VsZCB1bmRlcnN0YW5kCit3aGF0IHRoZXkgbWVhbiBldmVuIGlmIHlvdSBuZXZlciB1c2UgdGhlbS4KKworVGhlIGZpcnN0IHBhaXIgb2YgZGlyZWN0aXZlcyBhcmU6CisjZGVmaW5lCisjdW5kZWZpbmUKKworVGhlICNkZWZpbmUgZGlyZWN0aXZlIHNldHMgdXAgYSBzZXQgb2YgY2hhcmFjdGVycyB3aGljaCB3aWxsIGJlIHJlcGxhY2VkCithbnkgd2hlcmUgdGhleSBleGlzdCBpbiB0aGUgY29kZSBhdCBwcmVjb21waWxlciB0aW1lIHdpdGggdGhlaXIgZGVmaW5pdGlvbi4gCitGb3IgZXhhbXBsZSwgdGFrZToKKworI2RlZmluZSBPQl9VU0VSICIvc3RkL3VzZXIiCisKK1RoaXMgZGlyZWN0aXZlIGhhcyB0aGUgcHJlLWNvbXBpbGVyIHNlYXJjaCB0aGUgZW50aXJlIGZpbGUgZm9yIGluc3RhbmNlcyBvZgorT0JfVVNFUi4gIEV2ZXJ5d2hlcmUgaXQgc2VlcyBPQl9VU0VSLCBpdCByZXBsYWNlcyB3aXRoICIvc3RkL3VzZXIiLiAKKzwqIE5PVEUgSGlnaGxhbmRlckBNb3JnZW5HcmF1ZW4gMTEuMi45NDoKKwlXUk9ORy4gT0JfVVNFUiB3aWxsIF9ub3RfIGJlIHJlcGxhY2VkIGlmIHdpdGhpbiAiIiBpbiB3aGljaCBjYXNlIGl0IGlzCisJdHJlYXRlZCBhcyBhIG5vcm1hbCBzdHJpbmcuIFNvIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIHRoZSB0ZXh0IE9CX1VTRVIuCisqPgorTm90ZSB0aGF0IGl0IGRvZXMgbm90IG1ha2UgT0JfVVNFUiBhIHZhcmlhYmxlIGluIHRoZSBjb2RlLiAgVGhlIExQQworaW50ZXJwcmV0ZXIgbmV2ZXIgc2VlcyB0aGUgT0JfVVNFUiBsYWJlbC4gIEFzIHN0YXRlZCBhYm92ZSwgdGhlIHByZS0KK2NvbXBpbGVyIGlzIGEgcHJvY2VzcyB3aGljaCB0YWtlcyBwbGFjZSBiZWZvcmUgY29kZSBpbnRlcnByZXRhdGlvbi4gIFNvCit3aGF0IHlvdSB3cm90ZSBhczoKKworI2RlZmluZSBPQl9VU0VSICIvc3RkL3VzZXIiCisKK3ZvaWQgY3JlYXRlKCkgeworICAgIGlmKCFmaWxlX2V4aXN0cyhPQl9VU0VSKyIuYyIpKSB3cml0ZSgiTWVyZGUhIE5vIHVzZXIgZmlsZSEiKTsKKyAgICBlbHNlIHdyaXRlKCJHb29kISBVc2VyIGZpbGUgc3RpbGwgZXhpc3RzISIpOworfQorCit3b3VsZCBhcnJpdmUgYXQgdGhlIExQQyBpbnRlcnByZXRlciBhczoKKwordm9pZCBjcmVhdGUoKSB7CisgICAgaWYoIWZpbGVfZXhpc3RzKCIvc3RkL3VzZXIiKyIuYyIpKSB3cml0ZSgiTWVyZGUhIE5vIHVzZXIgZmlsZSEiKTsKKyAgICBlbHNlIHdyaXRlKCJHb29kISBVc2VyIGZpbGUgc3RpbGwgZXhpc3RzISIpOworfQorCis8KiBOT1RFIEhpZ2hsYW5kZXJATW9yZ2VuR3JhdWVuIDExLjIuOTQKKwlCdXQ6IHdyaXRlKCJUZXh0IGlzIE9CX1VTRVIgZm9vIGJhclxuIik7CisJc2ltcGx5IHdyaXRlcyAiVGV4dCBpcyBPQl9VU0VSIGZvbyBiYXIiLiBDb25mZXIgcHJldmlvdXMgbm90ZS4KKyo+CisKK1NpbXBseSBwdXQsICNkZWZpbmUganVzdCBsaXRlcmFsbHkgcmVwbGFjZXMgdGhlIGRlZmluZWQgbGFiZWwgd2l0aCB3aGF0ZXZlcgorZm9sbG93cyBpdC4gIFlvdSBtYXkgYWxzbyB1c2UgI2RlZmluZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2Ugd2hlcmUgbm8KK3ZhbHVlIGZvbGxvd3MuICBUaGlzIGlzIGNhbGxlZCBhIGJpbmFyeSBkZWZpbml0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyNkZWZpbmUgX19OSUdIVE1BUkUKKworZXhpc3RzIGluIHRoZSBjb25maWcgZmlsZSBmb3IgdGhlIE5pZ2h0bWFyZSBNdWRsaWIuICBUaGlzIGFsbG93cyBmb3IgcHJlLQorY29tcGlsZXIgdGVzdHMgd2hpY2ggd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIgaW4gdGhlIGNoYXB0ZXIuCisKK1RoZSBvdGhlciBwcmUtY29tcGlsZXIgZGlyZWN0aXZlIHlvdSBhcmUgbGlrZWx5IHRvIHVzZSBvZnRlbiBpcyAjaW5jbHVkZS4gCitBcyB0aGUgbmFtZSBpbXBsaWVzLCAjaW5jbHVkZSBpbmNsdWRlcyB0aGUgY29udGVudHMgb2YgYW5vdGhlciBmaWxlIHJpZ2h0CitpbnRvIHRoZSBmaWxlIGJlaW5nIHByZS1jb21waWxlZCBhdCB0aGUgcG9pbnQgaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGRpcmVjdGl2ZQoraXMgcGxhY2VkLiAgRmlsZXMgbWFkZSBmb3IgaW5jbHVzaW9uIGludG8gb3RoZXIgZmlsZXMgYXJlIG9mdGVuIGNhbGxlZCBoZWFkZXIKK2ZpbGVzLiAgVGhleSBzb21ldGltZXMgY29udGFpbiB0aGluZ3MgbGlrZSAjZGVmaW5lIGRpcmVjdGl2ZXMgdXNlZCBieQorbXVsdGlwbGUgZmlsZXMgYW5kIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZpbGUuICBUaGUgdHJhZGl0aW9uYWwgZmlsZQorZXh0ZW5zaW9uIHRvIGhlYWRlciBmaWxlcyBpcyAuaC4KKworSW5jbHVkZSBkaXJlY3RpdmVzIGZvbGxvdyBvbmUgb2YgMiBzeW50YXgnczoKKworI2luY2x1ZGUgPGZpbGVuYW1lPgorI2luY2x1ZGUgImZpbGVuYW1lIgorCitJZiB5b3UgZ2l2ZSB0aGUgYWJzb2x1dGUgbmFtZSBvZiB0aGUgZmlsZSwgdGhlbiB3aGljaCBzeW50YXggeW91IHVzZSBpcworaXJyZWxldmFudC4gIEhvdyB5b3UgZW5jbG9zZSB0aGUgZmlsZSBuYW1lIGRldGVybWluZXMgaG93IHRoZSBwcmUtCitjb21waWxlciBzZWFyY2hlcyBmb3IgdGhlIGhlYWRlciBmaWxlcy4gIFRoZSBwcmUtY29tcGlsZXIgZmlyc3Qgc2VhcmNoZXMgaW4KK3N5c3RlbSBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciBmaWxlcyBlbmNsb3NlZCBpbiA8Pi4gIEZvciBmaWxlcyBlbmNsb3NlZCBpbgorIiIsIHRoZSBwcmUtY29tcGlsZXIgYmVnaW5zIGl0cyBzZWFyY2ggaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBmaWxlCitnb2luZyB0aHJvdWdoIHRoZSBwcmUtY29tcGlsZXIuICBFaXRoZXIgd2F5LCB0aGUgcHJlLWNvbXBpbGVyIHdpbGwKK3NlYXJjaCB0aGUgc3lzdGVtIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUgZm9yIHRoZQoraGVhZGVyIGZpbGUgYmVmb3JlIGdpdmluZyB1cC4gIFRoZSBzeW50YXggc2ltcGx5IGRldGVybWluZXMgdGhlIG9yZGVyLgorPCogTk9URSBIaWdobGFuZGVyQE1vcmdlbkdyYXVlbiAxMS4yLjk0CisJV2hlbiB1c2luZyBzdGFuZGFyZC1oZWFkZXJmaWxlcyBvbmUgc2hvdWxkIGNob29zZSA8Pi4gIiIgaXMgYXBwcm9wcmlhdGUKKwl3aGVuIGRlYWxpbmcgd2l0aCBzZWxmZGVmaW5lZCBoZWFkZXJmaWxlcy4KKyo+CisKK1RoZSBzaW1wbGVzdCBwcmUtY29tcGlsZXIgZGlyZWN0aXZlIGlzIHRoZSAjcHJhZ21hIGRpcmVjdGl2ZS4gIEl0IGlzCitkb3VidGZ1bCB5b3Ugd2lsbCBldmVyIHVzZSB0aGlzIG9uZS4gIEJhc2ljYWxseSwgeW91IGZvbGxvdyB0aGUgZGlyZWN0aXZlCit3aXRoIHNvbWUga2V5d29yZCB3aGljaCBpcyBtZWFuaW5nZnVsIHRvIHlvdXIgZHJpdmVyLiAgVGhlIG9ubHkKK2tleXdvcmQgSSBoYXZlIGV2ZXIgc2VlbiBpcyBzdHJpY3RfdHlwZXMsIHdoaWNoIHNpbXBseSBsZXRzIHRoZSBkcml2ZXIKK2tub3cgeW91IHdhbnQgdGhpcyBmaWxlIGludGVycHJldGVkIHdpdGggc3RyaWN0IGRhdGEgdHlwaW5nLiAgSSBkb3VidCB5b3UKK3dpbGwgZXZlciBuZWVkIHRvIHVzZSB0aGlzLCBhbmQgeW91IG1heSBuZXZlciBldmVuIHNlZSBpdC4gIEkganVzdCBpbmNsdWRlZAoraXQgaW4gdGhlIGxpc3QgaW4gdGhlIGV2ZW50IHlvdSBkbyBzZWUgaXQgc28geW91IGRvIG5vdCB0aGluayBpdCBpcyBkb2luZworYW55dGhpbmcgdHJ1bHkgbWVhbmluZ2Z1bC4KKworVGhlIGZpbmFsIGdyb3VwIG9mIHByZS1jb21waWxlciBkaXJlY3RpdmVzIGFyZSB0aGUgY29uZGl0aW9uYWwgcHJlLQorY29tcGlsZXIgZGlyZWN0aXZlcy4gIFRoZXkgYWxsb3cgeW91IHRvIHByZS1jb21waWxlIHRoZSBmaWxlIG9uZSB3YXkKK2dpdmVuIHRoZSB0cnV0aCB2YWx1ZSBvZiBhbiBleHByZXNzaW9uLCBvdGhlcndpc2UgcHJlLWNvbXBpbGUgdGhlIGZpbGUKK2Fub3RoZXIgd2F5LiAgVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBtYWtpbmcgY29kZSBwb3J0YWJsZSBhbW9uZworbXVkbGlicywgc2luY2UgcHV0dGluZyB0aGUgbV9kZWxldGUoKSBlZnVuIGluIGNvZGUgb24gYSBNdWRPUyBtdWQKK3dvdWxkIG5vcm1hbGx5IGNhdXNlIGFuIGVycm9yLCBmb3IgZXhhbXBsZS4gIFNvIHlvdSBtaWdodCB3cml0ZSB0aGUKK2ZvbGxvd2luZzoKKworI2lmZGVmICBNVURPUworICAgIG1hcF9kZWxldGUobWFwLCBrZXkpOworI2Vsc2UKKyAgICBtYXAgPSBtX2RlbGV0ZShtYXAsIGtleSk7CisjZW5kaWYKKword2hpY2ggYWZ0ZXIgYmVpbmcgcGFzc2VkIHRocm91Z2ggdGhlIHByZS1jb21waWxlciB3aWxsIGFwcGVhciB0byB0aGUKK2ludGVycHJldGVyIGFzOgorCisgICAgbWFwX2RlbGV0ZShtYXAsIGtleSk7ICAgCisKK29uIGEgTXVkT1MgbXVkLCBhbmQ6CisgIAorICAgIG1hcCA9IG1fZGVsZXRlKG1hcCwga2V5KTsKKworb24gb3RoZXIgbXVkcy4gIFRoZSBpbnRlcnByZXRlciBuZXZlciBzZWVzIHRoZSBmdW5jdGlvbiBjYWxsIHRoYXQgd291bGQKK2NhdXNlIGl0IHRvIHNwYW0gb3V0IGluIGVycm9yLiAKKworTm90aWNlIHRoYXQgbXkgZXhhbXBsZSBtYWRlIHVzZSBvZiBhIGJpbmFyeSBkZWZpbml0aW9uIGFzIGRlc2NyaWJlZAorYWJvdmUuICBCaW5hcnkgZGVmaW5pdGlvbnMgYWxsb3cgeW91IHRvIHBhc3MgY2VydGFpbiBjb2RlIHRvIHRoZQoraW50ZXJwcmV0ZXIgYmFzZWQgb24gd2hhdCBkcml2ZXIgb3IgbXVkbGliIHlvdSBhcmUgdXNpbmcsIGFtb25nIG90aGVyCitjb25kaXRpb25zLgorCis0LjMgU3VtbWFyeQorVGhlIHByZS1jb21waWxlciBpcyBhIHVzZWZ1bCBMUEMgdG9vbCBmb3IgbWFpbnRhaW5pbmcgbW9kdWxhcml0eSBhbW9uZworeW91ciBwcm9ncmFtcy4gIFdoZW4geW91IGhhdmUgdmFsdWVzIHRoYXQgbWlnaHQgYmUgc3ViamVjdCB0byBjaGFuZ2UsCitidXQgYXJlIHVzZWQgd2lkZWx5IHRocm91Z2hvdXQgeW91ciBmaWxlcywgeW91IG1pZ2h0IHN0aWNrIGFsbCBvZiB0aG9zZQordmFsdWVzIGluIGEgaGVhZGVyIGZpbGUgYXMgI2RlZmluZSBzdGF0ZW1lbnRzIHNvIHRoYXQgYW55IG5lZWQgdG8gbWFrZSBhCitmdXR1cmUgY2hhbmdlIHdpbGwgY2F1c2UgeW91IHRvIG5lZWQgdG8gY2hhbmdlIGp1c3QgdGhlICNkZWZpbmUgZGlyZWN0aXZlLiAKK0EgdmVyeSBnb29kIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyB3b3VsZCBiZSB1c2VmdWwgd291bGQgYmUgYSBoZWFkZXIKK2ZpbGUgY2FsbGVkIG1vbmV5LmggIHdoaWNoIGluY2x1ZGVzIHRoZSBkaXJlY3RpdmU6CisjZGVmaW5lIEhBUkRfQ1VSUkVOQ0lFUyAoeyAiZ29sZCIsICJwbGF0aW51bSIsICJzaWx2ZXIiLAorImVsZWN0cnVtIiwgImNvcHBlciIgfSkKK3NvIHRoYXQgaWYgZXZlciB5b3Ugd2FudGVkIHRvIGFkZCBhIG5ldyBoYXJkIGN1cnJlbmN5LCB5b3Ugb25seSBuZWVkCitjaGFuZ2UgdGhpcyBkaXJlY3RpdmUgaW4gb3JkZXIgdG8gdXBkYXRlIGFsbCBmaWxlcyBuZWVkaW5nIHRvIGtub3cgd2hhdCB0aGUKK2hhcmQgY3VycmVuY2llcyBhcmUuCisKK1RoZSBMUEMgcHJlLWNvbXBpbGVyIGFsc28gYWxsb3dzIHlvdSB0byB3cml0ZSBjb2RlIHdoaWNoIGNhbiBiZQorcG9ydGVkIHdpdGhvdXQgY2hhbmdlIGFtb25nIGRpZmZlcmVudCBtdWRsaWJzIGFuZCBkcml2ZXJzLiAgRmluYWxseSwKK3lvdSBzaG91bGQgYmUgYXdhcmUgdGhhdCB0aGUgcHJlLWNvbXBpbGVyIG9ubHkgYWNjZXB0cyBsaW5lcyBlbmRpbmcgaW4KK2NhcnJpYWdlIHJldHVybnMuICBJZiB5b3Ugd2FudCBhIG11bHRpcGxlIGxpbmUgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZSwgeW91CituZWVkIHRvIGVuZCBlYWNoIGluY29tcGxldGUgbGluZSB3aXRoIGEgYmFja3NsYXNoKFwpLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjUgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1YjZmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyNQpAQCAtMCwwICsxLDE4NiBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciA1OiBBZHZhbmNlZCBTdHJpbmcgSGFuZGxpbmcKKworNS4xIFdoYXQgYSBTdHJpbmcgSXMKK1RoZSBMUEMgQmFzaWNzIHRleHRib29rIHRhdWdodCBzdHJpbmdzIGFzIHNpbXBsZSBkYXRhIHR5cGVzLiAgTFBDCitnZW5lcmFsbHkgZGVhbHMgd2l0aCBzdHJpbmdzIGluIHN1Y2ggYSBtYXR0ZXIuICBUaGUgdW5kZXJseWluZyBkcml2ZXIKK3Byb2dyYW0sIGhvd2V2ZXIsIGlzIHdyaXR0ZW4gaW4gQywgd2hpY2ggaGFzIG5vIHN0cmluZyBkYXRhIHR5cGUuICBUaGUKK2RyaXZlciBpbiBmYWN0IHNlZXMgc3RyaW5ncyBhcyBhIGNvbXBsZXggZGF0YSB0eXBlIG1hZGUgdXAgb2YgYW4gYXJyYXkgb2YKK2NoYXJhY3RlcnMsIGEgc2ltcGxlIEMgZGF0YSB0eXBlLiAgTFBDLCBvbiB0aGUgb3RoZXIgaGFuZCBkb2VzIG5vdAorcmVjb2duaXplIGEgY2hhcmFjdGVyIGRhdGEgdHlwZSAodGhlcmUgbWF5IGFjdHVhbGx5IGJlIGEgZHJpdmVyIG9yIHR3byBvdXQKK3RoZXJlIHdoaWNoIGRvIHJlY29nbml6ZSB0aGUgY2hhcmFjdGVyIGFzIGEgZGF0YSB0eXBlLCBidXQgaW4gZ2VuZXJhbCBub3QpLiAKK1RoZSBuZXQgZWZmZWN0IGlzIHRoYXQgdGhlcmUgYXJlIHNvbWUgYXJyYXktbGlrZSB0aGluZ3MgeW91IGNhbiBkbyB3aXRoCitzdHJpbmdzIHRoYXQgeW91IGNhbm5vdCBkbyB3aXRoIG90aGVyIExQQyBkYXRhIHR5cGVzLgorCitUaGUgZmlyc3QgZWZ1biByZWdhcmRpbmcgc3RyaW5ncyB5b3Ugc2hvdWxkIGxlYXJuIGlzIHRoZSBzdHJsZW4oKSBlZnVuLiAKK1RoaXMgZWZ1biByZXR1cm5zIHRoZSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiBhbiBMUEMgc3RyaW5nLCBhbmQgaXMgdGh1cwordGhlIHN0cmluZyBlcXVpdmFsZW50IHRvIHNpemVvZigpIGZvciBhcnJheXMuICBKdXN0IGZyb20gdGhlIGJlaGF2aW91ciBvZgordGhpcyBlZnVuLCB5b3UgY2FuIHNlZSB0aGF0IHRoZSBkcml2ZXIgdHJlYXRzIGEgc3RyaW5nIGFzIGlmIGl0IHdlcmUgbWFkZSB1cAorb2Ygc21hbGxlciBlbGVtZW50cy4gIEluIHRoaXMgY2hhcHRlciwgeW91IHdpbGwgbGVhcm4gaG93IHRvIGRlYWwgd2l0aAorc3RyaW5ncyBvbiBhIG1vcmUgYmFzaWMgbGV2ZWwsIGFzIGNoYXJhY3RlcnMgYW5kIHN1YiBzdHJpbmdzLgorCis1LjIgU3RyaW5ncyBhcyBDaGFyYWN0ZXIgQXJyYXlzCitZb3UgY2FuIGRvIG5lYXJseSBhbnl0aGluZyB3aXRoIHN0cmluZ3MgdGhhdCB5b3UgY2FuIGRvIHdpdGggYXJyYXlzLAorZXhjZXB0IGFzc2lnbiB2YWx1ZXMgb24gYSBjaGFyYWN0ZXIgYmFzaXMuICBBdCB0aGUgbW9zdCBiYXNpYywgeW91IGNhbgorYWN0dWFsbHkgcmVmZXIgdG8gY2hhcmFjdGVyIGNvbnN0YW50cyBieSBlbmNsb3NpbmcgdGhlbSBpbiAnJyAoc2luZ2xlCitxdW90ZXMpLiAgJ2EnIGFuZCAiYSIgYXJlIHRoZXJlZm9yZSB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgaW4gTFBDLiAgJ2EnCityZXByZXNlbnRzIGEgY2hhcmFjdGVyIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGluIGFzc2lnbm1lbnQgc3RhdGVtZW50cyBvcgorYW55IG90aGVyIG9wZXJhdGlvbnMgZXhjZXB0IGNvbXBhcmlzb24gZXZhbHVhdGlvbnMuICAiYSIgb24gdGhlIG90aGVyCitoYW5kIGlzIGEgc3RyaW5nIG1hZGUgdXAgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiAgWW91IGNhbiBhZGQgYW5kIHN1YnRyYWN0CitvdGhlciBzdHJpbmdzIHRvIGl0IGFuZCBhc3NpZ24gaXQgYXMgYSB2YWx1ZSB0byBhIHZhcmlhYmxlLgorCitXaXRoIHN0cmluZyB2YXJpYWJsZXMsIHlvdSBjYW4gYWNjZXNzIHRoZSBpbmRpdmlkdWFsIGNoYXJhY3RlcnMgdG8gcnVuCitjb21wYXJpc29ucyBhZ2FpbnN0IGNoYXJhY3RlciBjb25zdGFudHMgdXNpbmcgZXhhY3RseSB0aGUgc2FtZSBzeW50YXgKK3RoYXQgaXMgdXNlZCB3aXRoIGFycmF5cy4gIEluIG90aGVyIHdvcmRzLCB0aGUgc3RhdGVtZW50OgorICAgIGlmKHN0clsyXSA9PSAnYScpCitpcyBhIHZhbGlkIExQQyBzdGF0ZW1lbnQgY29tcGFyaW5nIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGluIHRoZSBzdHIgc3RyaW5nCit0byB0aGUgY2hhcmFjdGVyICdhJy4gIFlvdSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCB0aGF0IHlvdSBhcmUgbm90Citjb21wYXJpbmcgZWxlbWVudHMgb2YgYXJyYXlzIHRvIGNoYXJhY3RlcnMsIG5vciBhcmUgeW91IGNvbXBhcmluZworY2hhcmFjdGVycyBvZiBzdHJpbmdzIHRvIHN0cmluZ3MuCisKK0xQQyBhbHNvIGFsbG93cyB5b3UgdG8gYWNjZXNzIHNldmVyYWwgY2hhcmFjdGVycyB0b2dldGhlciB1c2luZyBMUEMncworcmFuZ2Ugb3BlcmF0b3IgLi46CisgICAgaWYoc3RyWzAuLjFdID09ICJhYiIpCitJbiBvdGhlciB3b3JkcywgeW91IGNhbiBsb29rIGZvciB0aGUgc3RyaW5nIHdoaWNoIGlzIGZvcm1lZCBieSB0aGUKK2NoYXJhY3RlcnMgMCB0aHJvdWdoIDEgaW4gdGhlIHN0cmluZyBzdHIuICBBcyB3aXRoIGFycmF5cywgeW91IG11c3QgYmUKK2NhcmVmdWwgd2hlbiB1c2luZyBpbmRleGluZyBvciByYW5nZSBvcGVyYXRvcnMgc28gdGhhdCB5b3UgZG8gbm90IHRyeSB0bworcmVmZXJlbmNlIGFuIGluZGV4IG51bWJlciBsYXJnZXIgdGhhbiB0aGUgbGFzdCBpbmRleC4gIERvaW5nIHNvIHdpbGwKK3Jlc3VsdCBpbiBhbiBlcnJvci4KKworTm93IHlvdSBjYW4gc2VlIGEgY291cGxlIG9mIHNpbWlsYXJpdGllcyBiZXR3ZWVuIHN0cmluZ3MgYW5kIGFycmF5czoKKzEpIFlvdSBtYXkgaW5kZXggb24gYm90aCB0byBhY2Nlc3MgdGhlIHZhbHVlcyBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzLgorCWEpIFRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIHN0cmluZ3MgYXJlIGNoYXJhY3RlcnMKKwliKSBUaGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBhcnJheXMgbWF0Y2ggdGhlIGRhdGEgdHlwZSBvZiB0aGUKK2FycmF5LgorMikgWW91IG1heSBvcGVyYXRlIG9uIGEgcmFuZ2Ugb2YgdmFsdWVzCisJYSkgRXg6ICJhYmNkZWYiWzEuLjNdIGlzIHRoZSBzdHJpbmcgImJjZCIKKwliKSBFeDogKHsgMSwgMiwgMywgNCwgNSB9KVsxLi4zXSBpcyB0aGUgaW50IGFycmF5ICh7IDIsIDMsIDQgfSkKKzwqIE5PVEUgSGlnaGxhbmRlckBNb3JnZW5HcmF1ZW4KKwlBbHNvIHBvc3NpYmxlIGluIE1vcmdlbkdyYXVlbiAoaW4gY29tbW9uOiBBbXlsYWFyLWRyaXZlciBMUE11ZHMpOgorCSJhYmNkZWYiWzIuLl0gICAgLT4gImNkZWYiIGFuZAorCSJhYmNkZWYiWzEuLjwyXSAgLT4gImJjZGUiICAoPCBtZWFucyBzdGFydCBjb3VudGluZyBmcm9tIHRoZSBlbmQgYW5kIHdpdGggMSkKKyo+CisKK0FuZCBvZiBjb3Vyc2UsIHlvdSBzaG91bGQgYWx3YXlzIGtlZXAgaW4gbWluZCB0aGUgZnVuZGFtZW50YWwKK2RpZmZlcmVuY2U6IGEgc3RyaW5nIGlzIG5vdCBtYWRlIHVwIG9mIGEgbW9yZSBmdW5kYW1lbnRhbCBMUEMgZGF0YSB0eXBlLiAKK0luIG90aGVyIHdvcmRzLCB5b3UgbWF5IG5vdCBhY3Qgb24gdGhlIGluZGl2aWR1YWwgY2hhcmFjdGVycyBieQorYXNzaWduaW5nIHRoZW0gdmFsdWVzLgorCis1LjMgVGhlIEVmdW4gc3NjYW5mKCkKK1lvdSBjYW5ub3QgZG8gYW55IGRlY2VudCBzdHJpbmcgaGFuZGxpbmcgaW4gTFBDIHdpdGhvdXQgdXNpbmcKK3NzY2FuZigpLiAgV2l0aG91dCBpdCwgeW91IGFyZSBsZWZ0IHRyeWluZyB0byBwbGF5IHdpdGggdGhlIGZ1bGwgc3RyaW5ncworcGFzc2VkIGJ5IGNvbW1hbmQgc3RhdGVtZW50cyB0byB0aGUgY29tbWFuZCBmdW5jdGlvbnMuICBJbiBvdGhlcgord29yZHMsIHlvdSBjb3VsZCBub3QgaGFuZGxlIGEgY29tbWFuZCBsaWtlOiAiZ2l2ZSBzd29yZCB0byBsZW8iLCBzaW5jZQoreW91IHdvdWxkIGhhdmUgbm8gd2F5IG9mIHNlcGFyYXRpbmcgInN3b3JkIHRvIGxlbyIgaW50byBpdHMgY29uc3RpdHVlbnQKK3BhcnRzLiAgQ29tbWFuZHMgc3VjaCBhcyB0aGVzZSB0aGVyZWZvcmUgdXNlIHRoaXMgZWZ1biBpbiBvcmRlciB0byB1c2UKK2NvbW1hbmRzIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzIG9yIHRvIG1ha2UgY29tbWFuZHMgbW9yZQorIkVuZ2xpc2gtbGlrZSIuCisKK01vc3QgcGVvcGxlIGZpbmQgdGhlIG1hbnVhbCBlbnRyaWVzIGZvciBzc2NhbmYoKSB0byBiZSByYXRoZXIgZGlmZmljdWx0CityZWFkaW5nLiAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGxlbmQgaXRzZWxmIHdlbGwgdG8gdGhlIGZvcm1hdCB1c2VkIGJ5CittYW51YWwgZW50cmllcy4gIEFzIEkgc2FpZCBhYm92ZSwgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdGFrZSBhIHN0cmluZyBhbmQKK2JyZWFrIGl0IGludG8gdXNhYmxlIHBhcnRzLiAgVGVjaG5pY2FsbHkgaXQgaXMgc3VwcG9zZWQgdG8gdGFrZSBhIHN0cmluZyBhbmQKK3NjYW4gaXQgaW50byBvbmUgb3IgbW9yZSB2YXJpYWJsZXMgb2YgdmFyeWluZyB0eXBlcy4gIFRha2UgdGhlIGV4YW1wbGUKK2Fib3ZlOgorCitpbnQgZ2l2ZShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nIHdoYXQsIHdob207CisKKyAgICBpZighc3RyKSByZXR1cm4gbm90aWZ5X2ZhaWwoIkdpdmUgd2hhdCB0byB3aG9tP1xuIik7CisgICAgaWYoc3NjYW5mKHN0ciwgIiVzIHRvICVzIiwgd2hhdCwgd2hvbSkgIT0gMikgCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkdpdmUgd2hhdCB0byB3aG9tP1xuIik7CisgICAgLi4uIHJlc3Qgb2YgZ2l2ZSBjb2RlIC4uLgorfQorCitUaGUgZWZ1biBzc2NhbmYoKSB0YWtlcyB0aHJlZSBvciBtb3JlIGFyZ3VtZW50cy4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcwordGhlIHN0cmluZyB5b3Ugd2FudCBzY2FubmVkLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBjYWxsZWQgYSBjb250cm9sCitzdHJpbmcuICBUaGUgY29udHJvbCBzdHJpbmcgaXMgYSBtb2RlbCB3aGljaCBkZW1vbnN0cmF0ZXMgaW4gd2hhdCBmb3JtCit0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIHdyaXR0ZW4sIGFuZCBob3cgaXQgc2hvdWxkIGJlIGRpdmlkZWQgdXAuICBUaGUgcmVzdAorb2YgdGhlIGFyZ3VtZW50cyBhcmUgdmFyaWFibGVzIHRvIHdoaWNoIHlvdSB3aWxsIGFzc2lnbiB2YWx1ZXMgYmFzZWQKK3Vwb24gdGhlIGNvbnRyb2wgc3RyaW5nLgorCitUaGUgY29udHJvbCBzdHJpbmcgaXMgbWFkZSB1cCBvZiB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2YgZWxlbWVudHM6IDEpCitjb25zdGFudHMsIDIpIHZhcmlhYmxlIGFyZ3VtZW50cyB0byBiZSBzY2FubmVkLCBhbmQgMykgdmFyaWFibGUKK2FyZ3VtZW50cyB0byBiZSBkaXNjYXJkZWQuICBZb3UgbXVzdCBoYXZlIGFzIG1hbnkgb2YgdGhlIHZhcmlhYmxlCithcmd1bWVudHMgaW4gc3NjYW5mKCkgYXMgeW91IGhhdmUgZWxlbWVudHMgb2YgdHlwZSAyIGluIHlvdXIgY29udHJvbAorc3RyaW5nLiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBjb250cm9sIHN0cmluZyB3YXMgIiVzIHRvICVzIiwgd2hpY2gKK2lzIGEgdGhyZWUgZWxlbWVudCBjb250cm9sIHN0cmluZyBtYWRlIHVwIG9mIG9uZSBjb25zdGFudCBwYXJ0ICgiIHRvICIpLAorYW5kIHR3byB2YXJpYWJsZSBhcmd1bWVudHMgdG8gYmUgc2Nhbm5lZCAoIiVzIikuICBUaGVyZSB3ZXJlIG5vCit2YXJpYWJsZXMgdG8gYmUgZGlzY2FyZGVkLgorCitUaGUgY29udHJvbCBzdHJpbmcgYmFzaWNhbGx5IGluZGljYXRlcyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUKK3N0cmluZyAiIHRvICIgaW4gdGhlIHN0cmluZyBzdHIuICBXaGF0ZXZlciBjb21lcyBiZWZvcmUgdGhhdCBjb25zdGFudCB3aWxsCitiZSBwbGFjZWQgaW50byB0aGUgZmlyc3QgdmFyaWFibGUgYXJndW1lbnQgYXMgYSBzdHJpbmcuICBUaGUgc2FtZSB0aGluZword2lsbCBoYXBwZW4gdG8gd2hhdGV2ZXIgY29tZXMgYWZ0ZXIgdGhlIGNvbnN0YW50LgorCitWYXJpYWJsZSBlbGVtZW50cyBhcmUgbm90ZWQgYnkgYSAiJSIgc2lnbiBmb2xsb3dlZCBieSBhIGNvZGUgZm9yCitkZWNvZGluZyB0aGVtLiAgSWYgdGhlIHZhcmlhYmxlIGVsZW1lbnQgaXMgdG8gYmUgZGlzY2FyZGVkLCB0aGUgIiUiIHNpZ24KK2lzIGZvbGxvd2VkIGJ5IHRoZSAiKiIgYXMgd2VsbCBhcyB0aGUgY29kZSBmb3IgZGVjb2RpbmcgdGhlIHZhcmlhYmxlLiAKK0NvbW1vbiBjb2RlcyBmb3IgdmFyaWFibGUgZWxlbWVudCBkZWNvZGluZyBhcmUgInMiIGZvciBzdHJpbmdzIGFuZCAiZCIKK2ZvciBpbnRlZ2Vycy4gIEluIGFkZGl0aW9uLCB5b3VyIG11ZGxpYiBtYXkgc3VwcG9ydCBvdGhlciBjb252ZXJzaW9uCitjb2Rlcywgc3VjaCBhcyAiZiIgZm9yIGZsb2F0LiAgU28gaW4gdGhlIHR3byBleGFtcGxlcyBhYm92ZSwgdGhlICIlcyIgaW4KK3RoZSBjb250cm9sIHN0cmluZyBpbmRpY2F0ZXMgdGhhdCB3aGF0ZXZlciBsaWVzIGluIHRoZSBvcmlnaW5hbCBzdHJpbmcgaW4gdGhlCitjb3JyZXNwb25kaW5nIHBsYWNlIHdpbGwgYmUgc2Nhbm5lZCBpbnRvIGEgbmV3IHZhcmlhYmxlIGFzIGEgc3RyaW5nLgorCitBIHNpbXBsZSBleGVyY2lzZS4gIEhvdyB3b3VsZCB5b3UgdHVybiB0aGUgc3RyaW5nICIxNDUiIGludG8gYW4KK2ludGVnZXI/CisKK0Fuc3dlcjoKK2ludCB4Oworc3NjYW5mKCIxNDUiLCAiJWQiLCB4KTsKKworQWZ0ZXIgdGhlIHNzY2FuZigpIGZ1bmN0aW9uLCB4IHdpbGwgZXF1YWwgdGhlIGludGVnZXIgMTQ1LgorCitXaGVuZXZlciB5b3Ugc2NhbiBhIHN0cmluZyBhZ2FpbnN0IGEgY29udHJvbCBzdHJpbmcsIHRoZSBmdW5jdGlvbgorc2VhcmNoZXMgdGhlIG9yaWdpbmFsIHN0cmluZyBmb3IgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBmaXJzdCBjb25zdGFudCBpbgordGhlIG9yaWdpbmFsIHN0cmluZy4gIEZvciBleGFtcGxlLCBpZiB5b3VyIHN0cmluZyBpcyAibWFnaWMgYXR0YWNrIDEwMCIgYW5kCit5b3UgaGF2ZSB0aGUgZm9sbG93aW5nOgoraW50IGltcHJvdmUoc3RyaW5nIHN0cikgeworICAgIHN0cmluZyBza2lsbDsKKyAgICBpbnQgeDsKKworICAgIGlmKHNzY2FuZihzdHIsICIlcyAlZCIsIHNraWxsLCB4KSAhPSAyKSByZXR1cm4gMDsKKyAgICAuLi4KK30KK3lvdSB3b3VsZCBmaW5kIHRoYXQgeW91IGhhdmUgY29tZSB1cCB3aXRoIHRoZSB3cm9uZyByZXR1cm4gdmFsdWUgZm9yCitzc2NhbmYoKSAobW9yZSBvbiB0aGUgcmV0dXJuIHZhbHVlcyBsYXRlcikuICBUaGUgY29udHJvbCBzdHJpbmcsICIlcyAlZCIsCitpcyBtYWRlIHVwIG9mIHRvIHZhcmlhYmxlcyB0byBiZSBzY2FubmVkIGFuZCBvbmUgY29uc3RhbnQuICBUaGUgY29uc3RhbnQKK2lzICIgIi4gIFNvIHRoZSBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgb3JpZ2luYWwgc3RyaW5nIGZvciB0aGUgZmlyc3QgaW5zdGFuY2UKK29mICIgIiwgcGxhY2luZyB3aGF0ZXZlciBjb21lcyBiZWZvcmUgdGhlICIgIiBpbnRvIHNraWxsLCBhbmQgdHJ5aW5nIHRvCitwbGFjZSB3aGF0ZXZlciBjb21lcyBhZnRlciB0aGUgIiAiIGludG8geC4gIFRoaXMgc2VwYXJhdGVzICJtYWdpYyBhdHRhY2sKKzEwMCIgaW50byB0aGUgY29tcG9uZW50cyAibWFnaWMiIGFuZCAiYXR0YWNrIDEwMCIuICBUaGUgZnVuY3Rpb24sCitob3dldmVyLCBjYW5ub3QgbWFrZSBoZWFkcyBvciB0YWxlcyBvZiAiYXR0YWNrIDEwMCIgYXMgYW4gaW50ZWdlciwgc28gaXQKK3JldHVybnMgMSwgbWVhbmluZyB0aGF0IDEgdmFyaWFibGUgdmFsdWUgd2FzIHN1Y2Nlc3NmdWxseSBzY2FubmVkCisoIm1hZ2ljIiBpbnRvIHNraWxsKS4KKworUGVyaGFwcyB5b3UgZ3Vlc3NlZCBmcm9tIHRoZSBhYm92ZSBleGFtcGxlcywgYnV0IHRoZSBlZnVuIHNzY2FuZigpCityZXR1cm5zIGFuIGludCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgaW50byB3aGljaCB2YWx1ZXMgZnJvbQordGhlIG9yaWdpbmFsIHN0cmluZyB3ZXJlIHN1Y2Nlc3NmdWxseSBzY2FubmVkLiAgU29tZSBleGFtcGxlcyB3aXRoCityZXR1cm4gdmFsdWVzIGZvciB5b3UgdG8gZXhhbWluZToKKworc3NjYW5mKCJzd28gIHJkIGRlc2NhcnRlcyIsICIlcyB0byAlcyIsIHN0cjEsIHN0cjIpICAgICAgICAgICByZXR1cm46IDAKK3NzY2FuZigic3dvICByZCBkZXNjYXJ0ZXMiLCAiJXMgJXMiLCBzdHIxLCBzdHIyKSAgICAgICAgICAgICAgcmV0dXJuOiAyCitzc2NhbmYoIjIwMCBnb2xkIHRvIGRlc2NhcnRlcyIsICIlZCAlcyB0byAlcyIsIHgsIHN0cjEsIHN0cjIpIHJldHVybjogMworc3NjYW5mKCIyMDAgZ29sZCB0byBkZXNjYXJ0ZXMiLCAiJWQgJSpzIHRvICVzIiwgeCwgc3RyMSkgICAgICByZXR1cm46IDIKK3doZXJlIHggaXMgYW4gaW50IGFuZCBzdHIxIGFuZCBzdHIyIGFyZSBzdHJpbmcKKworNS40IFN1bW1hcnkKK0xQQyBzdHJpbmdzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGFycmF5cyBvZiBjaGFyYWN0ZXJzLCB5ZXQgYWx3YXlzCitrZWVwaW5nIGluIG1pbmQgdGhhdCBMUEMgZG9lcyBub3QgaGF2ZSB0aGUgY2hhcmFjdGVyIGRhdGEgdHlwZSAod2l0aAorbW9zdCwgYnV0IG5vdCBhbGwgZHJpdmVycykuICBTaW5jZSB0aGUgY2hhcmFjdGVyIGlzIG5vdCBhIHRydWUgTFBDIGRhdGEKK3R5cGUsIHlvdSBjYW5ub3QgYWN0IHVwb24gaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIGluIGFuIExQQyBzdHJpbmcgaW4gdGhlCitzYW1lIG1hbm5lciB5b3Ugd291bGQgYWN0IHVwb24gZGlmZmVyZW50IGRhdGEgdHlwZXMuICBOb3RpY2luZyB0aGUKK2ludGltYXRlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN0cmluZ3MgYW5kIGFycmF5cyBuZXZlcnRoZWxlc3MgbWFrZXMgaXQKK2Vhc2llciB0byB1bmRlcnN0YW5kIHN1Y2ggY29uY2VwdHMgYXMgdGhlIHJhbmdlIG9wZXJhdG9yIGFuZCBpbmRleGluZyBvbgorc3RyaW5ncy4KKworVGhlcmUgYXJlIGVmdW5zIG90aGVyIHRoYW4gc3NjYW5mKCkgd2hpY2ggaW52b2x2ZSBhZHZhbmNlZCBzdHJpbmcKK2hhbmRsaW5nLCBob3dldmVyLCB0aGV5IGFyZSBub3QgbmVlZGVkIG5lYXJseSBhcyBvZnRlbi4gIFlvdSBzaG91bGQKK2NoZWNrIG9uIHlvdXIgbXVkIGZvciBtYW4gb3IgaGVscCBmaWxlcyBvbiB0aGUgZWZ1bnM6IGV4cGxvZGUoKSwKK2ltcGxvZGUoKSwgcmVwbGFjZV9zdHJpbmcoKSwgc3ByaW50ZigpLiAgQWxsIG9mIHRoZXNlIGFyZSB2ZXJ5IHZhbHVhYmxlCit0b29scywgZXNwZWNpYWxseSBpZiB5b3UgaW50ZW5kIHRvIGRvIGNvZGluZyBhdCB0aGUgbXVkbGliIGxldmVsLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjYgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiMzU1MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyNgpAQCAtMCwwICsxLDI3NiBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDY6IEludGVybWVkaWF0ZSBJbmhlcml0YW5jZQorCis2LjEgQmFzaWNzIG9mIEluaGVyaXRhbmNlCitJbiB0aGUgdGV4dGJvb2sgTFBDIEJhc2ljcywgeW91IGxlYXJuZWQgaG93IGl0IGlzIHRoZSBtdWRsaWIgbWFpbnRhaW5zCitjb25zaXN0ZW5jeSBhbW91bmcgbXVkIG9iamVjdHMgdGhyb3VnaCBpbmhlcml0YW5jZS4gIEluaGVyaXRhbmNlCithbGxvd3MgdGhlIG11ZCBhZG1pbmlzdHJhdG9ycyB0byBjb2RlIHRoZSBiYXNpYyBmdW5jdGlvbnMgYW5kIHN1Y2ggdGhhdAorYWxsIG11ZGxpYiBvYmplY3RzLCBvciBhbGwgbXVkbGliIG9iamVjdHMgb2YgYSBjZXJ0YWluIHR5cGUgbXVzdCBoYXZlIHNvCit0aGF0IHlvdSBjYW4gY29uY2VudHJhdGUgb24gY3JlYXRpbmcgdGhlIGZ1bmN0aW9ucyB3aGljaCBtYWtlIHRoZXNlCitvYmplY3RzIGRpZmZlcmVudC4gIFdoZW4geW91IGJ1aWxkIGEgcm9vbSwgb3IgYSB3ZWFwb24sIG9yIGEgbW9uc3RlciwKK3lvdSBhcmUgdGFraW5nIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbHJlYWR5IHdyaXR0ZW4gZm9yIHlvdSBhbmQgaW5oZXJpdGluZwordGhlbSBpbnRvIHlvdXIgb2JqZWN0LiAgSW4gdGhpcyB3YXksIGFsbCBvYmplY3RzIG9uIHRoZSBtdWQgY2FuIGNvdW50IG9uCitvdGhlciBvYmplY3RzIHRvIGJlaGF2ZSBpbiBhIGNlcnRhaW4gbWFubmVyLiAgRm9yIGluc3RhbmNlLCBwbGF5ZXIgb2JqZWN0cworY2FuIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBhbGwgcm9vbSBvYmplY3RzIHdpbGwgaGF2ZSBhIGZ1bmN0aW9uIGluIHRoZW0KK2NhbGxlZCBxdWVyeV9sb25nKCkgd2hpY2ggZGVzY3JpYmVzIHRoZSByb29tLiAgSW5oZXJpdGFuY2UgdGh1cyBrZWVwcworeW91IGZyb20gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHdoYXQgdGhlIGZ1bmN0aW9uIHF1ZXJ5X2xvbmcoKSBzaG91bGQKK2xvb2sgbGlrZS4KKworTmF0dXJhbGx5LCB0aGlzIHRleHRib29rIHRyaWVzIHRvIGdvIGJleW9uZCB0aGlzIGZ1bmRhbWVudGFsIGtub3dsZWRnZQorb2YgaW5oZXJpdGFuY2UgdG8gZ2l2ZSB0aGUgY29kZXIgYSBiZXR0ZXIgdW5kZXJ0c3RhbmRpbmcgb2YgaG93Citpbmhlcml0YW5jZSB3b3JrcyBpbiBMUEMgcHJvZ3JhbW1pbmcuICBXaXRob3V0IGdldHRpbmcgaW50byBkZXRhaWwgdGhhdAordGhlIGFkdmFuY2VkIGRvbWFpbiBjb2Rlci9iZWdpbm5lciBtdWRsaWIgY29kZXIgc2ltcGx5IGRvZXMgbm90IHlldAorbmVlZCwgdGhpcyBjaGFwdGVyIHdpbGwgdHJ5IHRvIGV4cGxhaW4gZXhhY3RseSB3aGF0IGhhcHBlbnMgd2hlbiB5b3UKK2luaGVyaXQgYW4gb2JqZWN0LgorCis2LjIgQ2xvbmluZyBhbmQgSW5oZXJpdGFuY2UKK1doZW5ldmVyIGEgZmlsZSBpcyByZWZlcmVuY2VkIGZvciB0aGUgZmlyc3QgdGltZSBhcyBhbiBvYmplY3QgKGFzIG9wcG9zZWQKK3RvIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlKSwgdGhlIGdhbWUgdHJpZXMgdG8gbG9hZCB0aGUgZmlsZSBpbnRvCittZW1vcnkgYW5kIGNyZWF0ZSBhbiBvYmplY3QuICBJZiB0aGUgb2JqZWN0IGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQgaW50bworbWVtb3J5LCBpdCBiZWNvbWVzIGFzIG1hc3RlciBjb3B5LiAgTWFzdGVyIGNvcGllcyBvZiBvYmplY3RzIG1heSBiZQorY2xvbmVkIGJ1dCBub3QgdXNlZCBhcyBhY3R1YWwgZ2FtZSBvYmplY3RzLiAgVGhlIG1hc3RlciBjb3B5IGlzIHVzZWQgdG8KK3N1cHBvcnQgYW55IGNsb25lIG9iamVjdHMgaW4gdGhlIGdhbWUuCisKK1RoZSBtYXN0ZXIgY29weSBpcyB0aGUgc291cmNlIG9mIG9uZSBvZiB0aGUgY29udHJvdmVyc2llcyBvZiBtdWQgTFBDCitjb2RpbmcsIHRoYXQgaXMgd2hldGhlciB0byBjbG9uZSBvciBpbmhlcml0LiAgV2l0aCByb29tcywgdGhlcmUgaXMgbm8KK3F1ZXN0aW9uIG9mIHdoYXQgeW91IHdpc2ggdG8gZG8sIHNpbmNlIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBpbnN0YW5jZQorb2YgZWFjaCByb29tIG9iamVjdCBpbiB0aGUgZ2FtZS4gIFNvIHlvdSBnZW5lcmFsbHkgdXNlIGluaGVyaXRhbmNlIGluCitjcmVhdGluZyByb29tcy4gIE1hbnkgbXVkIGFkbWluaXN0cmF0b3JzLCBpbmNsdWRpbmcgbXlzZWxmLCBob3dldmVyCitlbmNvdXJhZ2UgY3JlYXRvcnMgdG8gY2xvbmUgdGhlIHN0YW5kYXJkIG1vbnN0ZXIgb2JqZWN0IGFuZCBjb25maWd1cmUgaXQKK2Zyb20gaW5zaWRlIHJvb20gb2JqZWN0cyBpbnN0ZWFkIG9mIGtlZXBpbmcgbW9uc3RlcnMgaW4gc2VwYXJhdGUgZmlsZXMKK3doaWNoIGluaGVyaXQgdGhlIHN0YW5kYXJkIG1vbnN0ZXIgb2JqZWN0LgorCitBcyBJIHN0YXRlZCBhYm92ZSwgZWFjaCB0aW1lIGEgZmlsZSBpcyByZWZlcmVuY2VkIHRvIGNyZWF0ZSBhbiBvYmplY3QsIGEKK21hc3RlciBjb3B5IGlzIGxvYWRlZCBpbnRvIG1lbW9yeS4gIFdoZW4geW91IGRvIHNvbWV0aGluZyBsaWtlOgordm9pZCByZXNldCgpIHsKKyAgICBvYmplY3Qgb2I7CisgICAgb2IgPSBuZXcoIi9zdGQvbW9uc3RlciIpOworICAgICAgLyogY2xvbmVfb2JqZWN0KCIvc3RkL21vbnN0ZXIiKSBzb21lIHBsYWNlcyAqLworICAgIG9iLT5zZXRfbmFtZSgiZm9vIG1vbnN0ZXIiKTsKKyAgICAuLi4gIHJlc3Qgb2YgbW9uc3RlciBjb25maWcgY29kZSBmb2xsb3dlZCBieSBtb3ZpbmcKK2l0IHRvIHRoZSByb29tIC4uLgorfQordGhlIGRyaXZlciBzZWFyY2hlcyB0byBzZWUgaWYgdGhlaXIgaXMgYSBtYXN0ZXIgb2JqZWN0IGNhbGxlZCAiL3N0ZC9tb25zdGVyIi4gCitJZiBub3QsIGl0IGNyZWF0ZXMgb25lLiAgSWYgaXQgZG9lcyBleGlzdCwgb3IgYWZ0ZXIgaXQgaGFzIGJlZW4gY3JlYXRlZCwgdGhlCitkcml2ZXIgdGhlbiBjcmVhdGVzIGEgY2xvbmUgb2JqZWN0IGNhbGxlZCAiL3N0ZC9tb25zdGVyIzxudW1iZXI+Ii4gIElmCit0aGlzIGlzIHRoZSBmaXJzdCB0aW1lICIvc3RkL21vbnN0ZXIiIGlzIGJlaW5nIHJlZmVyZW5jZWQsIGluIGVmZmVjdCwgdHdvCitvYmplY3RzIGFyZSBiZWluZyBjcmVhdGVkOiB0aGUgbWFzdGVyIG9iamVjdCBhbmQgdGhlIGNsb25lZCBpbnN0YW5jZS4KKworT24gdGhlIG90aGVyIGhhbmQsIGxldCdzIHNheSB5b3UgZGlkIGFsbCB5b3VyIGNvbmZpZ3VyaW5nIGluIHRoZSBjcmVhdGUoKQorb2YgYSBzcGVjaWFsIG1vbnN0ZXIgZmlsZSB3aGljaCBpbmhlcml0cyAiL3N0ZC9tb25zdGVyIi4gIEluc3RlYWQgb2YKK2Nsb25pbmcgdGhlIHN0YW5kYXJkIG1vbnN0ZXIgb2JqZWN0IGZyb20geW91ciByb29tLCB5b3UgY2xvbmUgeW91cgorbW9uc3RlciBmaWxlLiAgSWYgdGhlIHN0YW5kYXJkIG1vbnN0ZXIgaGFzIG5vdCBiZWVuIGxvYWRlZCwgaXQgZ2V0cyBsb2FkZWQKK3NpbmNlIHlvdXIgbW9uc3RlciBpbmhlcml0cyBpdC4gIEluIGFkZGl0aW9uLCBhIG1hc3RlciBjb3B5IG9mIHlvdXIgZmlsZQorZ2V0cyBsb2FkZWQgaW50byBtZW1vcnkuICBGaW5hbGx5LCBhIGNsb25lIG9mIHlvdXIgbW9uc3RlciBpcyBjcmVhdGVkCithbmQgbW92ZWQgaW50byB0aGUgcm9vbSwgZm9yIGEgdG90YWwgb2YgdGhyZWUgb2JqZWN0cyBhZGRlZCB0byB0aGUgZ2FtZS4gCitOb3RlIHRoYXQgeW91IGNhbm5vdCBtYWtlIHVzZSBvZiB0aGUgbWFzdGVyIGNvcHkgZWFzaWx5IHRvIGdldCBhcm91bmQKK3RoaXMuICBJZiwgZm9yIGV4YW1wbGUsIHlvdSB3ZXJlIHRvIGRvOgorICAgICIvd2l6YXJkcy9kZXNjYXJ0ZXMvbXlfbW9uc3RlciItPm1vdmUodGhpc19vYmplY3QoKSk7CitpbnN0ZWFkIG9mCisgICAgbmV3KCIvd2l6YXJkcy9kZXNjYXJ0ZXMvbXlfbW9uc3RlciIpLT5tb3ZlKHRoaXNfb2JqZWN0KCkpOworeW91IHdvdWxkIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgZmlsZSAibXlfbW9uc3Rlci5jIiBhbmQgdXBkYXRlIGl0LAorc2luY2UgdGhlIHVwZGF0ZSBjb21tYW5kIGRlc3Ryb3lzIHRoZSBjdXJyZW50IG1hc3RlciB2ZXJzaW9uIG9mIGFuCitvYmplY3QuICBPbiBzb21lIG11ZGxpYnMgaXQgYWxzbyBsb2FkcyB0aGUgbmV3IHZlcnNpb24gaW50byBtZW1vcnkuIAorSW1hZ2luZSB0aGUgbG9vayBvbiBhIHBsYXllcidzIGZhY2Ugd2hlbiB0aGVpciBtb25zdGVyIGRpc2FwcGVhcnMgaW4KK21pZC1jb21iYXQgY2F1c2UgeW91IHVwZGF0ZWQgdGhlIGZpbGUhCisKK0Nsb25pbmcgaXMgdGhlcmVmb3JlIGEgdXNlZnVsIHRvbyB3aGVuIHlvdSBwbGFuIG9uIGRvaW5nIGp1c3QgdGhhdC0KK2Nsb25pbmcuICBJZiB5b3UgYXJlIGRvaW5nIG5vdGhpbmcgc3BlY2lhbCB0byBhIG1vbnN0ZXIgd2hpY2ggY2Fubm90IGJlCitkb25lIHRocm91Z2ggYSBmZXcgY2FsbCBvdGhlcnMsIHRoZW4geW91IHdpbGwgc2F2ZSB0aGUgbXVkIGZyb20gZ2V0dGluZworbG9hZGVkIHdpdGggdXNlbGVzcyBtYXN0ZXIgY29waWVzLiAgSW5oZXJpdGFuY2UsIGhvd2V2ZXIsIGlzIHVzZWZ1bCBpZgoreW91IHBsYW4gdG8gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gYW4gb2JqZWN0ICh3cml0ZSB5b3VyIG93biBmdW5jdGlvbnMpIG9yCitpZiB5b3UgaGF2ZSBhIHNpbmdsZSBjb25maWd1cmF0aW9uIHRoYXQgZ2V0cyB1c2VkIG92ZXIgYW5kIG92ZXIgYWdhaW4KKyh5b3UgaGF2ZSBhbiBhcm15IG9mIG9yYyBndWFyZHMgYWxsIHRoZSBzYW1lLCBzbyB5b3Ugd3JpdGUgYSBzcGVjaWFsIG9yYworZmlsZSBhbmQgY2xvbmUgaXQpLgorCis2LjMgSW5zaWRlIEluaGVyaXRhbmNlCitXaGVuIG9iamVjdHMgQSBhbmQgQiBpbmhlcml0IG9iamVjdCBDLCBhbGwgdGhyZWUgb2JqZWN0cyBoYXZlIHRoZWlyIG93bgorc2V0IG9mIGRhdGEgc2hhcmluZyBvbmUgc2V0IG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIGZyb20gb2JqZWN0IEMuICBJbgorYWRkaXRpb24sIEEgYW5kIEIgd2lsbCBoYXZlIHNlcGFyYXRlIGZ1bmN0aW9ucyBkZWZpbml0aW9ucyB3aGljaCB3ZXJlCitlbnRlcmVkIHNlcGFyYXRlbHkgaW50byB0aGVpciBjb2RlLiAgRm9yIHRoZSBzYWtlIG9mIGV4YW1wbGUgdGhyb3VnaG91dAordGhlIHJlc3Qgb2YgdGhlIGNoYXB0ZXIsIHdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZS4gIERvIG5vdCBiZQorZGlzdHVyYmVkIGlmLCBhdCB0aGlzIHBvaW50LCBzb21lIG9mIHRoZSBjb2RlIG1ha2VzIG5vIHNlbnNlOgorCitPQkpFQ1QgQworcHJpdmF0ZSBzdHJpbmcgbmFtZSwgY2FwX25hbWUsIHNob3J0LCBsb25nOworcHJpdmF0ZSBpbnQgc2V0dXA7CisKK3ZvaWQgc2V0X25hbWUoc3RyaW5nIHN0cikKK25vbWFzayBzdHJpbmcgcXVlcnlfbmFtZSgpOworcHJpdmF0ZSBpbnQgcXVlcnlfc2V0dXAoKTsKK3N0YXRpYyB2b2lkIHVuc2V0dXAoKTsKK3ZvaWQgc2V0X3Nob3J0KHN0cmluZyBzdHIpOworc3RyaW5nIHF1ZXJ5X3Nob3J0KCk7Cit2b2lkIHNldF9sb25nKHN0cmluZyBzdHIpOworc3RyaW5nIHF1ZXJ5X2xvbmcoKTsKKworCit2b2lkIHNldF9uYW1lKHN0cmluZyBzdHIpIHsgCisgICAgaWYoIXF1ZXJ5X3NldHVwKCkpIHsKKyAgICAgICAgbmFtZSA9IHN0cjsKKyAgICBzZXR1cCA9IDE7Cit9CisKK25vbWFzayBzdHJpbmcgcXVlcnlfbmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0KKworcHJpdmF0ZSBxdWVyeV9zZXR1cCgpIHsgcmV0dXJuIHNldHVwOyB9CisKK3N0YXRpYyB2b2lkIHVuc2V0dXAoKSB7IHNldHVwID0gMDsgfQorCitzdHJpbmcgcXVlcnlfY2FwX25hbWUoKSB7CisgICAgcmV0dXJuIChuYW1lID8gY2FwaXRhbGl6ZShuYW1lKSA6ICIiKTsgfQorfQorCit2b2lkIHNldF9zaG9ydChzdHJpbmcgc3RyKSB7IHNob3J0ID0gc3RyOyB9CisKK3N0cmluZyBxdWVyeV9zaG9ydCgpIHsgcmV0dXJuIHNob3J0OyB9CisKK3ZvaWQgc2V0X2xvbmcoc3RyaW5nIHN0cikgeyBsb25nID0gc3RyOyB9CisKK3N0cmluZyBxdWVyeV9sb25nKCkgeyByZXR1cm4gc3RyOyB9CisKK3ZvaWQgY3JlYXRlKCkgeyBzZXRldWlkKGdldHVpZCgpKTsgfQorCitPQkpFQ1QgQgoraW5oZXJpdCAiL3N0ZC9vYmplY3RjIjsKKworcHJpdmF0ZSBpbnQgd2M7CisKK3ZvaWQgc2V0X3djKGludCB3Yyk7CitpbnQgcXVlcnlfd2MoKTsKK2ludCB3aWVsZHdlYXBvbihzdHJpbmcgc3RyKTsKKwordm9pZCBjcmVhdGUoKSB7IDo6Y3JlYXRlKCk7IH0KKwordm9pZCBpbml0KCkgeworICAgIGlmKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpID09IHRoaXNfcGxheWVyKCkpCisgICAgICBhZGRfYWN0aW9uKCJ3aWVsZHdlYXBvbiIsICJ3aWVsZCIpOworfQorCit2b2lkIHNldF93YyhpbnQgeCkgeyB3YyA9IHg7IH0KKworaW50IHF1ZXJ5X3djKCkgeyByZXR1cm4gd2M7IH0KKworaW50IHdpZWxkd2VhcG9uKHN0cmluZyBzdHIpIHsKKyAgICAuLi4gY29kZSBmb3Igd2llbGRpbmcgdGhlIHdlYXBvbiAuLi4KK30KKworT0JKRUNUIEEKK2luaGVyaXQgIi9zdGQvb2JqZWN0YyI7CisKK2ludCBnaG9zdDsKKwordm9pZCBjcmVhdGUoKSB7IDo6Y3JlYXRlKCk7IH0KKwordm9pZCBjaGFuZ2VfbmFtZShzdHJpbmcgc3RyKSB7CisgICAgaWYoISgoaW50KXRoaXNfb2JqZWN0KCktPmlzX3BsYXllcigpKSkgdW5zZXR1cCgpOworICAgIHNldF9uYW1lKHN0cik7Cit9CisKK3N0cmluZyBxdWVyeV9jYXBfbmFtZSgpIHsKKyAgICBpZihnaG9zdCkgcmV0dXJuICJBIGdob3N0IjsKKyAgICBlbHNlIHJldHVybiA6OnF1ZXJ5X2NhcF9uYW1lKCk7Cit9CisKK0FzIHlvdSBjYW4gc2VlLCBvYmplY3QgQyBpcyBpbmhlcml0ZWQgYm90aCBieSBvYmplY3QgQSBhbmQgb2JqZWN0IEIuIAorT2JqZWN0IEMgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIG11Y2ggb3ZlcnNpbXBsaWZpZWQgYmFzZSBvYmplY3QsIHdpdGggQgorYmVpbmcgYW4gZXF1YWxseSBvdmVyc2ltcGxpZmllZCB3ZWFwb24gYW5kIEEgYmVpbmcgYW4gZXF1YWxseQorc2ltcGxpZmllZCBsaXZpbmcgb2JqZWN0LiAgT25seSBvbmUgY29weSBvZiBlYWNoIGZ1bmN0aW9uIGlzIHJldGFpbmVkIGluCittZW1vcnksIGV2ZW4gdGhvdWdoIHdlIGhhdmUgaGVyZSB0aHJlZSBvYmplY3RzIHVzaW5nIHRoZSBmdW5jdGlvbnMuIAorVGhlcmUgYXJlIG9mIGNvdXJzZSwgdGhyZWUgaW5zdGFuY2VzIG9mIHRoZSB2YXJpYWJsZXMgZnJvbSBPYmplY3QgQyBpbgorbWVtb3J5LCB3aXRoIG9uZSBpbnN0YW5jZSBvZiB0aGUgdmFyaWFibGVzIG9mIE9iamVjdCBBIGFuZCBPYmplY3QgQiBpbgorbWVtb3J5LiAgRWFjaCBvYmplY3QgdGh1cyBnZXRzIGl0cyBvd24gZGF0YS4gIAorCis2LjQgRnVuY3Rpb24gYW5kIFZhcmlhYmxlIExhYmVscworTm90aWNlIHRoYXQgbWFueSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIGFyZSBwcm9jZWVkZWQgd2l0aCBsYWJlbHMgd2hpY2gKK2hhdmUgbm90IHlldCBhcHBlYXJlZCBpbiBlaXRoZXIgdGhpcyB0ZXh0IG9yIHRoZSBiZWdpbm5lciB0ZXh0LCB0aGUgbGFiZWxzCitzdGF0aWMsIHByaXZhdGUsIGFuZCBub21hc2suICBUaGVzZSBsYWJlbHMgZGVmaW5lIHNwZWNpYWwgcHJpdmVsZWRnZXMKK3doaWNoIGFuIG9iamVjdCBtYXkgaGF2ZSB0byBpdHMgZGF0YSBhbmQgbWVtYmVyIGZ1bmN0aW9ucy4gIEZ1bmN0aW9ucworeW91IGhhdmUgdXNlZCB1cCB0byB0aGlzIHBvaW50IGhhdmUgdGhlIGRlZmF1bHQgbGFiZWwgcHVibGljLiAgVGhpcyBpcworZGVmYXVsdCB0byBzdWNoIGEgZGVncmVlLCBzb21lIGRyaXZlcnMgZG8gbm90IHN1cHBvcnQgdGhlIGxhYmVsaW5nLgorCitBIHB1YmxpYyB2YXJpYWJsZSBpcyBhdmFpbGFibGUgdG8gYW55IG9iamVjdCBkb3duIHRoZSBpbmhlcml0YW5jZSB0cmVlCitmcm9tIHRoZSBvYmplY3QgaW4gd2hpY2ggdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkLiAgUHVibGljIHZhcmlhYmxlcyBpbgorb2JqZWN0IEMgbWF5IGJlIGFjY2Vzc2VkIGJ5IGJvdGggb2JqZWN0cyBBIGFuZCBCLiAgU2ltaWxhcmx5LCBwdWJsaWMKK2Z1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGJ5IGFueSBvYmplY3QgZG93biB0aGUgaW5oZXJpdGFuY2UgdHJlZSBmcm9tIHRoZQorb2JqZWN0IGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkLiAKKworVGhlIG9wcG9zaXRlIG9mIHB1YmxpYyBpcyBvZiBjb3Vyc2UgcHJpdmF0ZS4gIEEgcHJpdmF0ZSB2YXJpYWJsZSBvcgorZnVuY3Rpb24gbWF5IG9ubHkgYmUgcmVmZXJlbmNlZCBmcm9tIGluc2lkZSB0aGUgb2JqZWN0IHdoaWNoIGRlY2xhcmVzIGl0LiAKK0lmIG9iamVjdCBBIG9yIEIgdHJpZWQgdG8gbWFrZSBhbnkgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgdmFyaWFibGVzIGluCitvYmplY3QgQywgYW4gZXJyb3Igd291bGQgcmVzdWx0LCBzaW5jZSB0aGUgdmFyaWFibGVzIGFyZSBzYWlkIHRvIGJlIG91dCBvZgorc2NvcGUsIG9yIG5vdCBhdmFpbGFibGUgdG8gaW5oZXJpdGluZyBjbGFzc2VzIGR1ZSB0byB0aGVpciBwcml2YXRlIGxhYmVscy4gCitGdW5jdGlvbnMsIGhvd2V2ZXIsIHByb3ZpZGUgYSB1bmlxdWUgY2hhbGxlbmdlIHdoaWNoIHZhcmlhYmxlcyBkbyBub3QuIAorRXh0ZXJuYWwgb2JqZWN0cyBpbiBMUEMgaGF2ZSB0aGUgYWJpbGl0eSB0byBjYWxsIGZ1bmN0aW9ucyBpbiBvdGhlciBvYmplY3RzCit0aHJvdWdoIGNhbGwgb3RoZXJzLiAgVGhlIHByaXZhdGUgbGFiZWwgZG9lcyBub3QgcHJvdGVjdCBhZ2FpbnN0IGNhbGwKK290aGVycy4KKworVG8gcHJvdGVjdCBhZ2FpbnN0IGNhbGwgb3RoZXJzLCBmdW5jdGlvbnMgdXNlIHRoZSBsYWJlbCBzdGF0aWMuICBBIGZ1bmN0aW9uCit3aGljaCBpcyBzdGF0aWMgbWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gaW5zaWRlIHRoZSBjb21wbGV0ZSBvYmplY3Qgb3IKK2Zyb20gdGhlIGdhbWUgZHJpdmVyLiAgQnkgY29tcGxldGUgb2JqZWN0LCBJIG1lYW4gb2JqZWN0IEEgY2FuIGNhbGwKK3N0YXRpYyBmdW5jdGlvbnMgaW4gdGhlIG9iamVjdCBDIGl0IGluaGVyaXRzLiAgVGhlIHN0YXRpYyBvbmx5IHByb3RlY3RzIGFnYWluc3QKK2V4dGVybmFsIGNhbGwgb3RoZXJzLiAgSW4gYWRkaXRpb24sIHRoaXNfb2JqZWN0KCktPmZvbygpIGlzIGNvbnNpZGVyZWQgYW4KK2ludGVybmFsIGNhbGwgYXMgZmFyIGFzIHRoZSBzdGF0aWMgbGFiZWwgZ29lcy4KKworU2luY2UgdmFyaWFibGVzIGNhbm5vdCBiZSByZWZlcmVuY2VkIGV4dGVybmFsbHksIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuCitlcXVpdmFsZW50IGxhYmVsIGZvciB0aGVtLiAgU29tZXdoZXJlIGFsb25nIHRoZSBsaW5lLCBzb21lb25lIGRlY2lkZWQKK3RvIG11ZGR5IHVwIHRoZSB3YXRlcnMgYW5kIHVzZSB0aGUgc3RhdGljIGxhYmVsIHdpdGggdmFyaWFibGVzIHRvIGhhdmUgYQorY29tcGxldGVseSBzZXBhcmF0ZSBtZWFuaW5nLiAgV2hhdCBpcyBldmVuIG1vcmUgbWFkZGVuaW5nIGlzIHRoYXQgdGhpcworbGFiZWwgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IGl0IG1lYW5zIGluIHRoZSBDIHByb2dyYW1taW5nCitsYW5ndWFnZS4gIEEgc3RhdGljIHZhcmlhYmxlIGlzIHNpbXBseSBhIHZhcmlhYmxlIHRoYXQgZG9lcyBub3QgZ2V0IHNhdmVkIHRvCitmaWxlIHRocm91Z2ggdGhlIGVmdW4gc2F2ZV9vYmplY3QoKSBhbmQgZG9lcyBub3QgZ2V0IHJlc3RvcmVkIHRocm91Z2gKK3Jlc3RvcmVfb2JqZWN0KCkuICBHbyBmaWd1cmUuCisKK0luIGdlbmVyYWwsIGl0IGlzIGdvb2QgcHJhY3RpY2UgdG8gaGF2ZSBwcml2YXRlIHZhcmlhYmxlcyB3aXRoIHB1YmxpYworZnVuY3Rpb25zLCB1c2luZyBxdWVyeV8qKCkgZnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgdmFsdWVzIG9mIGluaGVyaXRlZAordmFyaWFibGVzLCBhbmQgc2V0XyooKSwgYWRkXyooKSwgYW5kIG90aGVyIHN1Y2ggZnVuY3Rpb25zIHRvIGNoYW5nZQordGhvc2UgdmFsdWVzLiAgSW4gcmVhbG0gY29kaW5nIHRoaXMgaXMgbm90IHNvbWV0aGluZyBvbmUgcmVhbGx5IGhhcyB0bword29ycnkgYSBsb3QgYWJvdXQuICBBcyBhIG1hdHRlciBvZiBmYWN0LCBpbiByZWFsbSBjb2RpbmcgeW91IGRvIG5vdCBoYXZlCit0byBrbm93IG11Y2ggb2YgYW55dGhpbmcgd2hpY2ggaXMgaW4gdGhpcyBjaGFwdGVyLiAgVG8gYmUgY29tZSBhIHJlYWxseQorZ29vZCByZWFsbSBjb2RlciwgaG93ZXZlciwgeW91IGhhdmUgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBtdWRsaWIKK2NvZGUuICBBbmQgbXVkbGliIGNvZGUgaXMgZnVsbCBvZiB0aGVzZSBsYWJlbHMuICBTbyB5b3Ugc2hvdWxkIHdvcmsKK2Fyb3VuZCB3aXRoIHRoZXNlIGxhYmVscyB1bnRpbCB5b3UgY2FuIHJlYWQgY29kZSBhbmQgdW5kZXJzdGFuZCB3aHkgaXQKK2lzIHdyaXR0ZW4gdGhhdCB3YXkgYW5kIHdoYXQgaXQgbWVhbnMgdG8gb2JqZWN0cyB3aGljaCBpbmhlcml0IHRoZSBjb2RlLgorCitUaGUgZmluYWwgbGFiZWwgaXMgbm9tYXNrLCBhbmQgaXQgZGVhbHMgd2l0aCBhIHByb3BlcnR5IG9mIGluaGVyaXRhbmNlCit3aGljaCBhbGxvd3MgeW91IHRvIHJld3JpdGUgZnVuY3Rpb25zIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQuIAorRm9yIGV4YW1wbGUsIHlvdSBjYW4gc2VlIGFib3ZlIHRoYXQgb2JqZWN0IEEgcmV3cm90ZSB0aGUgZnVuY3Rpb24KK3F1ZXJ5X2NhcF9uYW1lKCkuICBBIHJld3JpdGUgb2YgIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdmVycmlkaW5nIHRoZQorZnVuY3Rpb24uICBUaGUgbW9zdCBjb21tb24gb3ZlcnJpZGUgb2YgYSBmdW5jdGlvbiB3b3VsZCBiZSBpbiBhIGNhc2UKK2xpa2UgdGhpcywgd2hlcmUgYSBjb25kaXRpb24gcGVjdWxpYXIgdG8gb3VyIG9iamVjdCAob2JqZWN0IEEpIG5lZWRzIHRvCitoYXBwZW4gb24gYSBjYWxsIG90IHRoZSBmdW5jdGlvbiB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuICBQdXR0aW5nIHRlc3QKK2NvZGUgaW50byBvYmplY3QgQyBqdXN0IHNvIG9iamVjdCBBIGNhbiBiZSBhIGdob3N0IGlzIHBsYWluIHNpbGx5LiAgU28KK2luc3RlYWQsIHdlIG92ZXJyaWRlIHF1ZXJ5X2NhcF9uYW1lKCkgaW4gb2JqZWN0IEEsIHRlc3RpbmcgdG8gc2VlIGlmIHRoZQorb2JqZWN0IGlzIGEgZ2hvc3QuICBJZiBzbywgd2UgY2hhbmdlIHdoYXQgaGFwcGVucyB3aGVuIGFub3RoZXIgb2JqZWN0CitxdWVyaWVzIGZvciB0aGUgY2FwIG5hbWUuICBJZiBpdCBpcyBub3QgYSBnaG9zdCwgdGhlbiB3ZSB3YW50IHRoZSByZWd1bGFyCitvYmplY3QgYmVoYXZpb3VyIHRvIGhhcHBlbi4gIFdlIHRoZXJlZm9yZSB1c2UgdGhlIHNjb3BlIHJlc29sdXRpb24KK29wZXJhdG9yICg6OikgdG8gY2FsbCB0aGUgaW5oZXJpdGVkIHZlcnNpb24gb2YgdGhlIHF1ZXJ5X2NhcF9uYW1lKCkKK2Z1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHZhbHVlLgorCitBIG5vbWFzayBmdW5jdGlvbiBpcyBvbmUgd2hpY2ggY2Fubm90IGJlIG92ZXJyaWRkZW4gZWl0aGVyIHRocm91Z2gKK2luaGVyaXRhbmNlIG9yIHRocm91Z2ggc2hhZG93aW5nLiAgU2hhZG93aW5nIGlzIGEgc29ydCBvZiBiYWNrd2FyZHMKK2luaGVyaXRhbmNlIHdoaWNoIHdpbGwgYmUgZGV0YWlsZWQgaW4gdGhlIGFkdmFuY2VkIExQQyB0ZXh0Ym9vay4gIEluIHRoZQorZXhhbXBsZSBhYm92ZSwgbmVpdGhlciBvYmplY3QgQSBub3Igb2JqZWN0IEIgKG5vciBhbnkgb3RoZXIgb2JqZWN0IGZvcgordGhhdCBtYXR0ZXIpIGNhbiBvdmVycmlkZSBxdWVyeV9uYW1lKCkuICBTaW5jZSB3ZSB3YW50IHRvIHVzZQorcXVlcnlfbmFtZSgpIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgb2Ygb2JqZWN0cywgd2UgZG9uJ3Qgd2FudCBwZW9wbGUKK2Zha2luZyB1cyB0aHJvdWdoIHNoYWRvd2luZyBvciBpbmhlcml0YW5jZS4gIFRoZSBmdW5jdGlvbiB0aGVyZWZvcmUgZ2V0cwordGhlIG5vbWFzayBsYWJlbC4KKworNi41IFN1bW1hcnkKK1Rocm91Z2ggaW5oZXJpdGFuY2UsIGEgY29kZXIgbWF5IG1ha2UgdXNlciBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbgorb3RoZXIgb2JqZWN0cyBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHRlZGl1bSBvZiBwcm9kdWNpbmcgbWFzc2VzIG9mCitzaW1pbGFyIG9iamVjdHMgYW5kIHRvIGluY3JlYXNlIHRoZSBjb25zaXN0ZW5jeSBvZiBvYmplY3QgYmVoYXZpb3VyIGFjcm9zcworbXVkbGliIG9iamVjdHMuICBMUEMgaW5oZXJpdGFuY2UgYWxsb3dzIG9iamVjdHMgbWF4aW11bSBwcml2ZWxlZGdlcyBpbgorZGVmaW5pbmcgaG93IHRoZWlyIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGJ5IGV4dGVybmFsIG9iamVjdHMgYXMgd2VsbCBhcworb2JqZWN0cyBpbmhlcml0aW5nIHRoZW0uICBUaGlzIGRhdGEgc2VjdXJpdHkgaXMgbWFpbnRhaW5lZCB0aHJvdWdoIHRoZQora2V5d29yZHMsIG5vbWFzaywgcHJpdmF0ZSwgYW5kIHN0YXRpYy4KKworSW4gYWRkaXRpb24sIGEgY29kZXIgaXMgYWJsZSB0byBjaGFuZ2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygbm9uLXByb3RlY3RlZAorZnVuY3Rpb25zIGJ5IG92ZXJyaWRpbmcgdGhlbS4gIEV2ZW4gaW4gdGhlIHByb2Nlc3Mgb2Ygb3ZlcnJpZGluZyBhCitmdW5jdGlvbiwgaG93ZXZlciwgYW4gb2JqZWN0IG1heSBhY2Nlc3MgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHRocm91Z2gKK3RoZSBzY29wZSByZXNvbHV0aW9uIG9wZXJhdG9yLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjcgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4Y2MwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyNwpAQCAtMCwwICsxLDI5OCBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXB0ZXIgNzogRGVidWdnaW5nCisKKzcuMSBUeXBlcyBvZiBFcnJvcnMKK0J5IG5vdywgeW91IGhhdmUgbGlrZWx5IHJ1biBpbnRvIGVycm9ycyBoZXJlLCB0aGVyZSwgYW5kIGV2ZXJ5d2hlcmUuICBJbgorZ2VuZXJhbCwgdGhlcmUgYXJlIHRocmVlIHNvcnRzIG9mIGVycm9ycyB5b3UgbWlnaHQgc2VlOiBjb21waWxlIHRpbWUKK2Vycm9ycywgcnVuIHRpbWUgZXJyb3JzLCBhbmQgbWFsZnVuY3Rpb25pbmcgY29kZS4gIE9uIG1vc3QgbXVkcyB5b3UKK3dpbGwgZmluZCBhIHBlcnNvbmFsIGZpbGUgd2hlcmUgeW91ciBjb21waWxlIHRpbWUgZXJyb3JzIGFyZSBsb2dnZWQuICBGb3IKK3RoZSBtb3N0IHBhcnQsIHRoaXMgZmlsZSBjYW4gYmUgZm91bmQgZWl0aGVyIGluIHlvdXIgaG9tZSBkaXJlY3RvcnkgYXMgdGhlCitmaWxlIG5hbWVkICJsb2ciIG9yICIubG9nIiwgb3Igc29tZXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgIi9sb2ciIGFzIGEgZmlsZQord2l0aCB5b3VyIG5hbWUuLiAgSW4gYWRkaXRpb24sIG11ZHMgdGVuZCB0byBrZWVwIGEgbG9nIG9mIHJ1biB0aW1lIGVycm9ycword2hpY2ggb2NjdXIgd2hpbGUgdGhlIG11ZCBpcyB1cC4gIEFnYWluLCB0aGlzIGlzIGdlbmVyYWxseSBmb3VuZCBpbgorIi9sb2ciLiAgT24gTXVkT1MgbXVkcyBpdCBpcyBjYWxsZWQgImRlYnVnLmxvZyIuICBPbiBvdGhlciBtdWRzIGl0IG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBkaWZmZXJlbnQgbGlrZSAibHBtdWQubG9nIi4gIEFzayB5b3VyIGFkbWluaXN0cmF0b3JzCit3aGVyZSBjb21waWxlIHRpbWUgYW5kIHJ1biB0aW1lIGVycm9ycyBhcmUgZWFjaCBsb2dnZWQgaWYgeW91IGRvIG5vdAorYWxyZWFkeSBrbm93LgorCitDb21waWxlIHRpbWUgZXJyb3JzIGFyZSBlcnJvcnMgd2hpY2ggb2NjdXIgd2hlbiB0aGUgZHJpdmVyIHRyaWVzIHRvIGxvYWQKK2FuIG9iamVjdCBpbnRvIG1lbW9yeS4gIElmLCB3aGVuIHRoZSBkcml2ZXIgaXMgdHJ5aW5nIHRvIGxvYWQgYW4gb2JqZWN0CitpbnRvIG1lbW9yeSwgaXQgZW5jb3VudGVycyB0aGluZ3Mgd2hpY2ggaXQgc2ltcGx5IGRvZXMgbm90IHVuZGVyc3RhbmQKK3dpdGggcmVzcGVjdCB0byB3aGF0IHlvdSB3cm90ZSwgaXQgd2lsbCBmYWlsIHRvIGxvYWQgaXQgaW50byBtZW1vcnkgYW5kIGxvZword2h5IGl0IGNvdWxkIG5vdCBsb2FkIHRoZSBvYmplY3QgaW50byB5b3VyIHBlcnNvbmFsIGVycm9yIGxvZy4gIFRoZSBtb3N0Citjb21tb24gY29tcGlsZSB0aW1lIGVycm9ycyBhcmUgdHlwb3MsIG1pc3Npbmcgb3IgZXh0cmEgKCksIHt9LiBbXSwgb3IgIiIsCithbmQgZmFpbHVyZSB0byBkZWNsYXJlIHByb3Blcmx5IGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIHVzZWQgYnkgdGhlCitvYmplY3QuCisKK1J1biB0aW1lIGVycm9ycyBvY2N1ciB3aGVuIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5zIHRvIGFuIG9iamVjdCBpbgorbWVtb3J5IHdoaWxlIGl0IGlzIGV4ZWN1dGluZyBhIHN0YXRlbWVudC4gIEZvciBleGFtcGxlLCB0aGUgZHJpdmVyCitjYW5ub3QgdGVsbCB3aGV0aGVyIHRoZSBzdGF0ZW1lbnQgIngveSIgd2lsbCBiZSB2YWxpZCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gCitJbiBmYWN0LCBpdCBpcyBhIHZhbGlkIExQQyBleHByZXNzaW9uLiAgWWV0LCBpZiB0aGUgdmFsdWUgb2YgeSBpcyAwLCB0aGVuIGEKK3J1biB0aW1lIGVycm9yIHdpbGwgb2NjdXIgc2luY2UgeW91IGNhbm5vdCBkaXZpZGUgYnkgMC4gIFdoZW4gdGhlIGRyaXZlcgorcnVucyBhY3Jvc3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbiwgaXQgYWJvcnRzCitleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uIGFuZCBsb2dzIGFuIGVycm9yIHRvIHRoZSBnYW1lJ3MgcnVuIHRpbWUgZXJyb3IKK2xvZy4gIEl0IHdpbGwgYWxzbyBzaG93IHRoZSBlcnJvciB0byB0aGlzX3BsYXllcigpLCBpZiBkZWZpbmVkLCBpZiB0aGUgcGxheWVyCitpcyBhIGNyZWF0b3IsIG9yIGl0IHdpbGwgc2hvdyAiV2hhdD8iIHRvIHBsYXllcnMuICBNb3N0IGNvbW1vbiBjYXVzZXMKK2ZvciBydW4gdGltZSBlcnJvcnMgYXJlIGJhZCB2YWx1ZXMgYW5kIHRyeWluZyB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2l0aAorZGF0YSB0eXBlcyBmb3Igd2hpY2ggdGhvc2Ugb3BlcmF0aW9ucyBhcmUgbm90IGRlZmluZWQuCisKK1RoZSBtb3N0IGluc2lkZW91cyB0eXBlIG9mIGVycm9yLCBob3dldmVyLCBpcyBwbGFpbiBtYWxmdW5jdGlvbmluZworY29kZS4gIFRoZXNlIGVycm9ycyBkbyBub3QgbG9nLCBzaW5jZSB0aGUgZHJpdmVyIG5ldmVyIHJlYWxseSByZWFsaXplcyB0aGF0Cithbnl0aGluZyBpcyB3cm9uZy4gIEluIHNob3J0LCB0aGlzIGVycm9yIGhhcHBlbnMgd2hlbiB5b3UgdGhpbmsgdGhlIGNvZGUKK3NheXMgb25lIHRoaW5nLCBidXQgaW4gZmFjdCBpdCBzYXlzIGFub3RoZXIgdGhpbmcuICBQZW9wbGUgdG9vIG9mdGVuCitlbmNvdW50ZXIgdGhpcyBidWcgYW5kIGF1dG9tYXRpY2FsbHkgaW5zaXN0IHRoYXQgaXQgbXVzdCBiZSBhIG11ZGxpYiBvcgorZHJpdmVyIGJ1Zy4gIEV2ZXJ5b25lIG1ha2VzIGFsbCB0eXBlcyBvZiBlcnJvcnMgdGhvdWdoLCBhbmQgbW9yZSBvZnRlbgordGhhbiBub3Qgd2hlbiBjb2RlIGlzIG5vdCBmdW5jdGlvbmluZyB0aGUgd2F5IHlvdSBzaG91bGQsIGl0IHdpbGwgYmUKK2JlY2F1c2UgeW91IG1pc3JlYWQgaXQuICAKKworNy4yIERlYnVnZ2luZyBDb21waWxlIFRpbWUgRXJyb3JzCitDb21waWxlIHRpbWUgZXJyb3JzIGFyZSBjZXJ0YWlubHkgdGhlIG1vc3QgY29tbW9uIGFuZCBzaW1wbGVzdCBidWdzIHRvCitkZWJ1Zy4gIE5ldyBjb2RlcnMgb2Z0ZW4gZ2V0IGZydXN0cmF0ZWQgYnkgdGhlbSBkdWUgdG8gdGhlIG9ic2N1cmUKK25hdHVyZSBvZiBzb21lIGVycm9yIG1lc3NhZ2VzLiAgTmV2ZXJ0aGVsZXNzLCBvbmNlIGEgcGVyc29uIGJlY29tZXMKK3VzZWQgdG8gdGhlIGVycm9yIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSB0aGVpciBkcml2ZXIsIGRlYnVnZ2luZyBjb21waWxlCit0aW1lIGVycm9ycyBiZWNvbWVzIHV0dGVybHkgcm91dGluZS4KKworSW4geW91ciBlcnJvciBsb2csIHRoZSBkcml2ZXIgd2lsbCB0ZWxsIHlvdSB0aGUgdHlwZSBvZiBlcnJvciBhbmQgb24gd2hpY2gKK2xpbmUgaXQgZmluYWxseSBub3RpY2VkIHRoZXJlIHdhcyBhbiBlcnJvci4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBvbiB3aGljaAorbGluZSB0aGUgYWN0dWFsIGVycm9yIG5lY2Vzc2FyaWx5IGV4aXN0cy4gIFRoZSBtb3N0IGNvbW1vbiBjb21waWxlIHRpbWUKK2Vycm9yLCBiZXNpZGVzIHRoZSB0eXBvLCBpcyB0aGUgbWlzc2luZyBvciBzdXBlcmZsdW91cyBwYXJlbnRoZXNlcywKK2JyYWNrZXRzLCBicmFjZXMsIG9yIHF1b3Rlcy4gIFlldCB0aGlzIGVycm9yIGlzIHRoZSBvbmUgdGhhdCBtb3N0IGJhZmZsZXMKK25ldyBjb2RlcnMsIHNpbmNlIHRoZSBkcml2ZXIgd2lsbCBub3Qgbm90aWNlIHRoZSBtaXNzaW5nIG9yIGV4dHJhIHBpZWNlCit1bnRpbCB3ZWxsIGFmdGVyIHRoZSBvcmlnaW5hbC4gIFRha2UgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBjb2RlOgorCisxIGludCB0ZXN0KHN0cmluZyBzdHIpIHsKKzIgICAgaW50IHg7CiszICAgIGZvcih4ID0wOyB4PDEwOyB4KyspCis0ICAgICAgICB3cml0ZSh4KyJcbiIpOworNSAgICB9Cis2ICAgIHdyaXRlKCJEb25lLlxuIik7Cis3IH0KKworRGVwZW5kaW5nIG9uIHdoYXQgeW91IGludGVuZGVkLCB0aGUgYWN0dWFsIGVycm9yIGhlcmUgaXMgZWl0aGVyIGF0IGxpbmUgMworKG1lYW5pbmcgeW91IGFyZSBtaXNzaW5nIGEgeykgb3IgYXQgbGluZSA1IChtZWFpbmcgeW91IGhhdmUgYW4gZXh0cmEgfSkuIAorTmV2ZXJ0aGVsZXNzLCB0aGUgZHJpdmVyIHdpbGwgcmVwb3J0IHRoYXQgaXQgZm91bmQgYW4gZXJyb3Igd2hlbiBpdCBnZXRzIHRvCitsaW5lIDYuICBUaGUgYWN0dWFsIGRyaXZlciBtZXNzYWdlIG1heSB2YXJ5IGZyb20gZHJpdmVyIHRvIGRyaXZlciwgYnV0IG5vCittYXR0ZXIgd2hpY2ggZHJpdmVyLCB5b3Ugd2lsbCBzZWUgYW4gZXJyb3Igb24gbGluZSA2LCBzaW5jZSB0aGUgfSBpbiBsaW5lIDUKK2lzIGludGVycHJldGVkIGFzIGVuZGluZyB0aGUgZnVuY3Rpb24gdGVzdCgpLiAgQXQgbGluZSA2LCB0aGUgZHJpdmVyIHNlZXMgdGhhdAoreW91IGhhdmUgYSB3cml0ZSgpIHNpdHRpbmcgb3V0c2lkZSBhbnkgZnVuY3Rpb24gZGVmaW5pdGlvbiwgYW5kIHRodXMKK3JlcG9ydHMgYW4gZXJyb3IuICBHZW5lcmFsbHksIHRoZSBkcml2ZXIgd2lsbCBhbHNvIGdvIG9uIHRvIHJlcG9ydCB0aGF0IGl0Citmb3VuZCBhbiBlcnJvciBhdCBsaW5lIDcgaW4gdGhlIGZvcm0gb2YgYW4gZXh0cmEgfS4KKworVGhlIHNlY3JldCB0byBkZWJ1Z2dpbmcgdGhlc2UgaXMgY29kaW5nIHN0eWxlLiAgSGF2aW5nIGNsb3NpbmcgfSBtYXRjaAordXAgdmVydGljYWxseSB3aXRoIHRoZSBjbGF1c2VzIHRoZXkgY2xvc2Ugb3V0IGhlbHBzIHlvdSBzZWUgd2hlcmUgeW91IGFyZQorbWlzc2luZyB0aGVtIHdoZW4geW91IGFyZSBkZWJ1Z2dpbmcgY29kZS4gIFNpbWlsYXJseSwgd2hlbiB1c2luZworbXVsdGlwbGUgc2V0cyBvZiBwYXJlbnRoZXNlcywgc3BhY2Ugb3V0IGRpZmZlcmVudCBncm91cHMgbGlrZSB0aGlzOgorICAgIGlmKCAoeD1zaXplb2Yod2hvPXVzZXJzKCkpID4gKCAoeSt6KS8oYS1iKSArICgtKHJhbmRvbSg3KSkpICkgKSAKK0FzIHlvdSBjYW4gc2VlLCB0aGUgcGFyZW50aGVzZXMgZm9yIHRoZSBmb3IoKSBzdGF0ZW1lbnQsIGFyZSBzcGFjZWQgb3V0Citmcm9tIHRoZSByZXN0IG9mIHRoZSBzdGF0ZW1lbnQuICBJbiBhZGRpdGlvbiwgaW5kaXZpZHVhbCBzdWItZ3JvdXBzIGFyZQorc3BhY2VkIHNvIHRoZXkgY2FuIGVhc2lseSBiZSBzb3J0ZWQgb3V0IGluIHRoZSBldmVudCBvZiBhbiBlcnJvci4KKworT25jZSB5b3UgaGF2ZSBhIGNvZGluZyBzdHlsZSB3aGljaCBhaWRzIGluIHBpY2tpbmcgdGhlc2Ugb3V0LCB5b3UgbGVhcm4KK3doaWNoIGVycm9yIG1lc3NhZ2VzIHRlbmQgdG8gaW5kaWNhdGUgdGhpcyBzb3J0IG9mIGVycm9yLiAgV2hlbgorZGVidWdnaW5nIHRoaXMgc29ydCBvZiBlcnJvciwgeW91IHRoZW4gdmlldyBhIHNlY3Rpb24gb2YgY29kZSBiZWZvcmUgYW5kCithZnRlciB0aGUgbGluZSBpbiBxdWVzdGlvbi4gIEluIG1vc3QgYWxsIGNhc2VzLCB5b3Ugd2lsbCBjYXRjaCB0aGUgYnVnIHJpZ2h0CitvZmYuCisKK0Fub3RoZXIgY29tbW9uIGNvbXBpbGUgdGltZSBlcnJvciBpcyB3aGVyZSB0aGUgZHJpdmVyIHJlcG9ydHMgYW4KK3Vua25vd24gaWRlbnRpZmllci4gIEdlbmVyYWxseSwgdHlwb3MgYW5kIGZhaWx1cmUgdG8gZGVjbGFyZSB2YXJpYWJsZXMKK2NhdXNlcyB0aGlzIHNvcnQgb2YgZXJyb3IuICBGb3J0dW5hdGVseSwgdGhlIGVycm9yIGxvZyB3aWxsIGFsbW9zdCBhbHdheXMKK3RlbGwgeW91IGV4YWN0bHkgd2hlcmUgdGhlIGVycm9yIGlzLiAgU28gd2hlbiBkZWJ1Z2dpbmcgaXQsIGVudGVyIHRoZQorZWRpdG9yIGFuZCBmaW5kIHRoZSBsaW5lIGluIHF1ZXN0aW9uLiAgSWYgdGhlIHByb2JsZW0gaXMgd2l0aCBhIHZhcmlhYmxlIGFuZAoraXMgbm90IGEgdHlwbywgbWFrZSBzdXJlIHlvdSBkZWNsYXJlZCBpdCBwcm9wZXJseS4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZgoraXQgaXMgYSB0eXBvLCBzaW1wbHkgZml4IGl0IQorCitPbmUgdGhpbmcgdG8gYmV3YXJlIG9mLCBob3dldmVyLCBpcyB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzb21ldGltZXMgYmUKK3JlcG9ydGVkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBtaXNzaW5nIHBhcmVudGhlc2VzLCBicmFja2V0cywgb3IgYnJhY2VzCit0eXBlIGVycm9yLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucywgeW91ciBwcm9ibGVtIHdpdGggYW4gdW5rbm93biBpZGVudGlmaWVyCitpcyBvZnRlbiBib2d1cy4gIFRoZSBkcml2ZXIgbWlzcmVhZHMgdGhlIHdheSB0aGUge30gb3Igd2hhdGV2ZXIgYXJlCitzZXR1cCwgYW5kIHRodXMgZ2V0cyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgY29uZnVzZWQuICBUaGVyZWZvcmUgbWFrZQorc3VyZSBhbGwgb3RoZXIgY29tcGlsZSB0aW1lIGVycm9ycyBhcmUgY29ycmVjdGVkIGJlZm9yZSBib3RoZXJpbmcgd2l0aAordGhlc2UgdHlwZXMgb2YgZXJyb3JzLgorCitJbiB0aGUgc2FtZSBjbGFzcyB3aXRoIHRoZSBhYm92ZSBlcnJvciwgaXMgdGhlIGdlbmVyYWwgc3ludGF4IGVycm9yLiAgVGhlCitkcml2ZXIgZ2VuZXJhdGVzIHRoaXMgZXJyb3Igd2hlbiBpdCBzaW1wbHkgZmFpbHMgdG8gdW5kZXJzdGFuZCB3aGF0IHlvdQorc2FpZC4gIEFnYWluLCB0aGlzIGlzIG9mdGVuIGNhdXNlZCBieSB0eXBvcywgYnV0IGNhbiBhbHNvIGJlIGNhdXNlZCBieSBub3QKK3Byb3Blcmx5IHVuZGVyc3RhbmRpbmcgdGhlIHN5bnRheCBvZiBhIGNlcnRhaW4gZmVhdHVyZSBsaWtlIHdyaXRpbmcgYSBmb3IoKQorc3RhdGVtZW50OiBmb3IoeD0wLCB4PDEwLCB4KyspLiAgSWYgeW91IGdldCBhbiBlcnJvciBsaWtlIHRoaXMgd2hpY2ggaXMKK25vdCBhIHN5bnRheCBlcnJvciwgdHJ5IHJldmlld2luZyB0aGUgc3ludGF4IG9mIHRoZSBzdGF0ZW1lbnQgaW4gd2hpY2ggdGhlCitlcnJvciBpcyBvY2N1cnJpbmcuCisKKzcuMyBEZWJ1Z2dpbmcgUnVuIFRpbWUgRXJyb3JzCitSdW4gdGltZSBlcnJvcnMgYXJlIG11Y2ggbW9yZSBjb21wbGV4IHRoYW4gdGhlaXIgY29tcGlsZSB0aW1lCitjb3VudGVycGFydHMuICBGb3J0dW5hdGVseSB0aGVzZSBlcnJvcnMgZG8gZ2V0IGxvZ2dlZCwgdGhvdWdoIG1hbnkKK2NyZWF0b3JzIGRvIG5vdCByZWFsaXNlIG9yIHRoZXkgZG8gbm90IGtub3cgd2hlcmUgdG8gbG9vay4gIFRoZSBlcnJvciBsb2cKK2ZvciBydW4gdGltZSBlcnJvcnMgYXJlIGFsc28gZ2VuZXJhbGx5IG11Y2ggbW9yZSBkZXRhaWxlZCB0aGFuIGNvbXBpbGUKK3RpbWUgZXJyb3JzLCBtZWFuaW5nIHRoYXQgeW91IGNhbiB0cmFjZSB0aGUgaGlzdG9yeSBvZiB0aGUgZXhlY3V0aW9uIHRyYWluCitmcm9tIHdoZXJlIGl0IHN0YXJ0ZWQgdG8gd2hlcmUgaXQgd2VudCB3cm9uZy4gIFlvdSB0aGVyZWZvcmUgY2FuIHNldHVwCitkZWJ1Z2dpbmcgdHJhcHMgdXNpbmcgcHJlY29tcGlsZXIgc3RhdGVtZW50cyBtdWNoIGVhc2llciB1c2luZyB0aGVzZQorbG9ncy4gIFJ1biB0aW1lIGVycm9ycywgaG93ZXZlciwgdGVuZCB0byByZXN1bHQgZnJvbSB1c2luZyBtb3JlCitjb21wbGV4IGNvZGlnbiB0ZWNobmlxdWVzIHRoYW4gYmVnaW5uZXJzIHRlbmQgdG8gdXNlLCB3aGljaCBtZWFucyB5b3UKK2FyZSBsZWZ0IHdpdGggZXJyb3JzIHdoaWNoIGFyZSBnZW5lcmFsbHkgbW9yZSBjb21wbGljYXRlZCB0aGFuIHNpbXBsZQorY29tcGlsZSB0aW1lIGVycm9ycy4KKworUnVuIHRpbWUgZXJyb3JzIGFsbW9zdCBhbHdheXMgcmVzdWx0IGZyb20gbWlzdXNpbmcgTFBDIGRhdGEgdHlwZXMuIAorTW9zdCBjb21tb25seSwgdHJ5aW5nIHRvIGRvIGNhbGwgb3RoZXJzIHVzaW5nIG9iamVjdCB2YXJpYWJsZXMgd2hpY2ggYXJlCitOVUxMLCBpbmRleGluZyBvbiBtYXBwaW5nLCBhcnJheSwgb3Igc3RyaW5nIHZhcmlhYmxlcyB3aGljaCBhcmUKK05VTEwsIG9yIHBhc3NpbmcgYmFkIGFyZ3VtZW50cyB0byBmdW5jdGlvbnMuICBXZSB3aWxsIGxvb2sgYXQgYSByZWFsCitydW4gdGltZSBlcnJvciBsb2cgZnJvbSBOaWdodG1hcmU6CisKK0JhZCBhcmd1bWVudCAxIHRvIGV4cGxvZGUoKQorcHJvZ3JhbTogYmluL3N5c3RlbS9fZ3JlcC5jLCBvYmplY3Q6IGJpbi9zeXN0ZW0vX2dyZXAKK2xpbmUgMzIKKycgICAgICAgY21kX2hvb2snIGluICcgICAgICAgIHN0ZC9saXZpbmcuYycgKCcgICAgICAKK3N0ZC91c2VyIzQwMDInKWxpbmUgODMKKycgICAgICAgY21kX2dyZXAnIGluICcgIGJpbi9zeXN0ZW0vX2dyZXAuYycgKCcgICAKK2Jpbi9zeXN0ZW0vX2dyZXAnKWxpbmUgMzIgICAgIAorQmFkIGFyZ3VtZW50IDIgdG8gbWVzc2FnZSgpCitwcm9ncmFtOiBhZG0vb2JqL3NpbXVsX2VmdW4uYywgb2JqZWN0OiBhZG0vb2JqL3NpbXVsX2VmdW4KK2xpbmUgMzQKKycgICAgICAgY21kX2hvb2snIGluICcgICAgICAgIHN0ZC9saXZpbmcuYycgKCcgICAgICAKK3N0ZC91c2VyIzQ5NTcnKWxpbmUgODMKKycgICAgICAgY21kX2xvb2snIGluICcgIGJpbi9tb3J0YWwvX2xvb2suYycgKCcgICAKK2Jpbi9tb3J0YWwvX2xvb2snKWxpbmUgMjMKKycgZXhhbWluZV9vYmplY3QnIGluICcgIGJpbi9tb3J0YWwvX2xvb2suYycgKCcgICAKK2Jpbi9tb3J0YWwvX2xvb2snKWxpbmUgNzgKKycgICAgICAgICAgd3JpdGUnIGluICdhZG0vb2JqL3NpbXVsX2VmdW4uYycgKCcgCithZG0vb2JqL3NpbXVsX2VmdW4nKWxpbmUgMzQKK0JhZCBhcmd1bWVudCAxIHRvIGNhbGxfb3RoZXIoKQorcHJvZ3JhbTogYmluL3N5c3RlbS9fY2xvbmUuYywgb2JqZWN0OiBiaW4vc3lzdGVtL19jbG9uZQorbGluZSAyNQorJyAgICAgICBjbWRfaG9vaycgaW4gJyAgICAgICAgc3RkL2xpdmluZy5jJyAoJyAgICAgIAorc3RkL3VzZXIjMzczNCcpbGluZSA4MworJyAgICAgIGNtZF9jbG9uZScgaW4gJyBiaW4vc3lzdGVtL19jbG9uZS5jJyAoJyAgCitiaW4vc3lzdGVtL19jbG9uZScpbGluZSAyNQorSWxsZWdhbCBpbmRleAorcHJvZ3JhbTogc3RkL21vbnN0ZXIuYywgb2JqZWN0Ogord2l6YXJkcy96YWtuYWlmZW4vc3B5IzcyMDUgbGluZSA3NgorJyAgICAgaGVhcnRfYmVhdCcgaW4gJyAgICAgICBzdGQvbW9uc3Rlci5jJworKCd3aXphcmRzL3pha25haWZlbi9zcHkjNzIwNScpbGluZQorNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK0FsbCBvZiB0aGUgZXJyb3JzLCBleGNlcHQgdGhlIGxhc3Qgb25lLCBpbnZvbHZlIHBhc3NpbmcgYSBiYWQgYXJndW1lbnQgdG8gYQorZnVuY3Rpb24uICBUaGUgZmlyc3QgYnVnLCBpbnZvbHZlcyBwYXNzaW5nIGEgYmFkIGZpcnN0IGFydW1lbnQgdG8gdGhlIGVmdW4KK2V4cGxvZGUoKS4gIFRoaXMgZWZ1biBleHBlY3RzIGEgc3RyaW5nIGFzIGl0cyBmaXJzdCBhcmdtZW50LiAgSW4gZGVidWdnaW5nCit0aGVzZSBraW5kcyBvZiBlcnJvcnMsIHdlIHdvdWxkIHRoZXJlZm9yZSBnbyB0byBsaW5lIDMyIGluCisvYmluL3N5c3RlbS9fZ3JlcC5jIGFuZCBjaGVjayB0byBzZWUgd2hhdCB0aGUgZGF0YSB0eXBlIG9mIHRoZSBmaXJzdAorYXJndW1lbnQgYmVpbmcgcGFzc2VkIGluIGZhY3QgaXMuICBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwgdGhlIHZhbHVlIGJlaW5nCitwYXNzZWQgc2hvdWxkIGJlIGEgc3RyaW5nLgorCitJZiBmb3Igc29tZSByZWFzb24gSSBoYXMgYWN0dWFsbHkgcGFzc2VkIHNvbWV0aGluZyBlbHNlLCBJIHdvdWxkIGJlIGRvbmUKK2RlYnVnZ2luZyBhdCB0aGF0IHBvaW50IGFuZCBmaXggaXQgc2ltcGx5IGJ5IG1ha2luZyBzdXJlIHRoYXQgSSB3YXMKK3Bhc3NpbmcgYSBzdHJpbmcuICBUaGlzIHNpdHVhdGlvbiBpcyBtb3JlIGNvbXBsZXguICBJIG5vdyBuZWVkIHRvIHRyYWNlCit0aGUgYWN0dWFsIHZhbHVlcyBjb250YWluZWQgYnkgdGhlIHZhcmlhYmxlIGJlaW5nIHBhc3NlZCB0byBleHBsb2RlLCBzbwordGhhdCBJIGNhbiBzZWUgd2hhdCBpdCBpcyB0aGUgZXhwbG9kZSgpIGVmdW4gc2VlcyB0aGF0IGl0IGlzIGJlaW5nIHBhc3NlZC4KKworVGhlIGxpbmUgaXMgcXVlc3Rpb24gaXMgdGhpczoKKyBib3JnW2ZpbGVzW2ldXSA9IHJlZ2V4cChleHBsb2RlKHJlYWRfZmlsZShmaWxlc1tpXSksICJcbiIpLCBleHApOword2hlcmUgZmlsZXMgaXMgYW4gYXJyYXkgZm9yIHN0cmluZ3MsIGkgaXMgYW4gaW50ZWdlciwgYW5kIGJvcmcgaXMgYSBtYXBwaW5nLiAKK1NvIGNsZWFybHkgd2UgbmVlZCB0byBmaW5kIG91dCB3aGF0IHRoZSB2YWx1ZSBvZiByZWFkX2ZpbGUoZmlsZXNbaV0pIGlzLiAKK1dlbGwsIHRoaXMgZWZ1biByZXR1cm5zIGEgc3RyaW5nIHVubGVzcyB0aGUgZmlsZSBpbiBxdWVzdGlvbiBkb2VzIG5vdCBleGlzdCwKK3RoZSBvYmplY3QgaW4gcXVlc3Rpb24gZG9lcyBub3QgaGF2ZSByZWFkIGFjY2VzcyB0byB0aGUgZmlsZSBpbiBxdWVzdGlvbiwgb3IKK3RoZSBmaWxlIGluIHF1ZXN0aW9uIGlzIGFuIGVtcHR5IGZpbGUsIGluIHdoaWNoIGNhc2VzIHRoZSBmdW5jdGlvbiB3aWxsCityZXR1cm4gTlVMTC4gIENsZWFybHksIG91ciBwcm9ibGVtIGlzIHRoYXQgb25lIG9mIHRoZXNlIGV2ZW50cyBtdXN0CitoYXZlIGhhcHBlbmVkLiAgSW4gb3JkZXIgdG8gc2VlIHdoaWNoLCB3ZSBuZWVkIHRvIGxvb2sgYXQgZmlsZXNbaV0uCisKK0V4YW1pbmluZyB0aGUgY29kZSwgdGhlIGZpbGVzIGFycmF5IGdldHMgaXRzIHZhbHVlIHRocm91Z2ggdGhlIGdldF9kaXIoKQorZWZ1bi4gIFRoaXMgcmV0dXJucyBhbGwgdGhlIGZpbGVzIGluIGEgZGlyZWN0b3J5IGlmIHRoZSBvYmplY3QgaGFzIHJlYWQgYWNjZXNzCit0byB0aGUgZGlyZWN0b3J5LiAgVGhlcmVmb3JlIHRoZSBwcm9ibGVtIGlzIG5laXRoZXIgbGFjayBvZiBhY2Nlc3Mgb3Igbm9uLQorZXhpc3RlbnQgZmlsZXMuICBUaGUgZmlsZSB3aGljaCBjYXVzZWQgdGhpcyBlcnJvciB0aGVuIG11c3QgaGF2ZSBiZWVuIGFuCitlbXB0eSBmaWxlLiAgQW5kLCBpbiBmYWN0LCB0aGF0IGlzIGV4YWN0bHkgd2hhdCBjYXVzZWQgdGhpcyBlcnJvci4gIFRvCitkZWJ1ZyB0aGF0LCB3ZSB3b3VsZCBwYXNzIGZpbGVzIHRocm91Z2ggdGhlIGZpbHRlcigpIGVmdW4gYW5kIG1ha2UKK3N1cmUgdGhhdCBvbmx5IGZpbGVzIHdpdGggYSBmaWxlIHNpemUgZ3JlYXRlciB0aGFuIDAgd2VyZSBhbGxvd2VkIGludG8gdGhlCithcnJheS4KKworVGhlIGtleSB0byBkZWJ1Z2dpbmcgYSBydW4gdGltZSBlcnJvciBpcyB0aGVyZWZvcmUga25vd2luZyBleGFjdGx5IHdoYXQKK3RoZSB2YWx1ZXMgb2YgYWxsIHZhcmlhYmxlcyBpbiBxdWVzdGlvbiBhcmUgYXQgdGhlIGV4YWN0IG1vbWVudCB3aGVyZSB0aGUKK2J1ZyBjcmVhdGVkLiAgV2hlbiByZWFkaW5nIHlvdXIgcnVuIHRpbWUgbG9nLCBiZSBjYXJlZnVsIHRvIHNlcGFyYXRlIHRoZQorb2JqZWN0IGZyb20gdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGJ1ZyBvY2N1cnJlZC4gIEZvciBleGFtcGxlLCB0aGUKK2luZGV4aW5nIGVycm9yIGFib3ZlIGNhbWUgYWJvdXQgaW4gdGhlIG9iamVjdCAvd2l6YXJkcy96YWtuYWlmZW4vc3B5LAorYnV0IHRoZSBlcnJvciBvY2N1cmVkIHdoaWxlIHJ1bm5pbmcgYSBmdW5jdGlvbiBpbiAvc3RkL21vbnN0ZXIuYywgd2hpY2gKK3RoZSBvYmplY3QgaW5oZXJpdGVkLgorCis3LjQgTWFsZnVuY3Rpb25pbmcgQ29kZQorVGhlIG5hc3RpZXN0IHByb2JsZW0gdG8gZGVhbCB3aXRoIGlzIHdoZW4geW91ciBjb2RlIGRvZXMgbm90IGJlaGF2ZSB0aGUKK3dheSB5b3UgaW50ZW5kZWQgaXQgdG8gYmVoYXZlLiAgVGhlIG9iamVjdCBsb2FkcyBmaW5lLCBhbmQgaXQgcHJvZHVjZXMgbm8KK3J1biB0aW1lIGVycm9ycywgYnV0IHRoaW5ncyBzaW1wbHkgZG8gbm90IGhhcHBlbiB0aGUgd2F5IHRoZXkgc2hvdWxkLiAKK1NpbmNlIHRoZSBkcml2ZXIgZG9lcyBub3Qgc2VlIGEgcHJvYmxlbSB3aXRoIHRoaXMgdHlwZSBvZiBjb2RlLCBubyBsb2dzCithcmUgcHJvZHVjZWQuICBZb3UgdGhlcmVmb3JlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgY29kZSBsaW5lIGJ5IGxpbmUKK2FuZCBmaWd1cmUgb3V0IHdoYXQgaXMgaGFwcGVuaW5nLgorCitTdGVwIDE6IExvY2F0ZSB0aGUgbGFzdCBsaW5lIG9mIGNvZGUgeW91IGtuZXcgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkCitTdGVwIDI6IExvY2F0ZSB0aGUgZmlyc3QgbGluZSBvZiBjb2RlIHdoZXJlIHlvdSBrbm93IHRoaW5ncyBhcmUgZ29pbmcKK3dyb25nCitTdGVwIDM6IEV4YW1pbmUgdGhlIGZsb3cgb2YgdGhlIGNvZGUgZnJvbSB0aGUga25vd24gc3VjY2Vzc2Z1bCBwb2ludCB0bwordGhlIGZpcnN0IGtub3duIHVuc3VjY2Vzc2Z1bCBwb2ludC4KKworTW9yZSBvZnRlbiB0aGFuIG5vdCwgdGhlc2UgcHJvYmxlbXMgb2NjdXJyIHdoZW4geW91IGFyZSB1c2luZyBpZigpCitzdGF0ZW1lbnRzIGFuZCBub3QgYWNjb3VudGluZyBmb3IgYWxsIHBvc3NpYmlsaXRpZXMuICBGb3IgZXhhbXBsZToKKworaW50IGNtZChzdHJpbmcgdG1wKSB7CisgICAgaWYoc3RyaW5ncCh0bXApKSByZXR1cm4gZG9fYSgpCisgICAgZWxzZSBpZihpbnRwKHRtcCkpIHJldHVybiBkb19iKCkKKyAgICByZXR1cm4gMTsKK30KKworSW4gdGhpcyBjb2RlLCB3ZSBmaW5kIHRoYXQgaXQgY29tcGlsZXMgYW5kIHJ1bnMgZmluZS4gIFByb2JsZW0gaXMgbm90aGluZworaGFwcGVucyB3aGVuIGl0IGlzIGV4ZWN1dGVkLiAgV2Uga25vdyBmb3Igc3VyZSB0aGF0IHRoZSBjbWQoKSBmdW5jdGlvbgoraXMgZ2V0dGluZyBleGVjdXRlZCwgc28gd2UgY2FuIHN0YXJ0IHRoZXJlLiAgV2UgYWxzbyBrbm93IHRoYXQgYSB2YWx1ZSBvZgorMSBpcyBpbiBmYWN0IGJlaW5nIHJldHVybmVkLCBzaW5jZSB3ZSBkbyBub3Qgc2VlICJXaGF0PyIgd2hlbiB3ZSBlbnRlcgordGhlIGNvbW1hbmQuICBJbW1lZGlhdGVseSwgd2UgY2FuIHNlZSB0aGF0IGZvciBzb21lIHJlYXNvbiB0aGUKK3ZhcmlhYmxlIHRtcCBoYXMgYSB2YWx1ZSBvdGhlciB0aGFuIHN0cmluZyBvciBpbnQuICBBcyBpdCB0dXJucyBvdXQsIHdlCitpc3N1ZWQgdGhlIGNvbW1hbmQgd2l0aG91dCBwYXJhbWV0ZXJzLCBzbyB0bXAgd2FzIE5VTEwgYW5kIGZhaWxlZAorYWxsIHRlc3RzLgorCitUaGUgYWJvdmUgZXhhbXBsZSBpcyByYXRoZXIgc2ltcGxpc3RpYywgYm9yZGVyaW5nIG9uIHNpbGx5LiAKK05ldmVydGhlbGVzcywgaXQgZ2l2ZXMgeW91IGFuIGlkZWEgb2YgaG93IHRvIGV4YW1pbmUgdGhlIGZsb3cgb2YgdGhlCitjb2RlIHdoZW4gZGVidWdnaW5nIG1hbGZ1bmN0aW9uaW5nIGNvZGUuICBPdGhlciB0b29scyBhcmUgYXZhaWxhYmxlIGFzCit3ZWxsIHRvIGhlbHAgaW4gZGVidWdnaW5nIGNvZGUuICBUaGUgbW9zdCBpbXBvcnRhbnQgdG9vbCBpcyB0aGUgdXNlIG9mCit0aGUgcHJlY29tcGlsZXIgdG8gZGVidWcgY29kZS4gIFdpdGggdGhlIGNvZGUgYWJvdmUsIHdlIGhhdmUgYSBjbGF1c2UKK2NoZWNraW5nIGZvciBpbnRlZ2VycyBiZWluZyBwYXNzZWQgdG8gY21kKCkuICBXaGVuIHdlIHR5cGUgImNtZCAxMCIsCit3ZSBhcmUgZXhwZWN0aW5nIGRvX2IoKSB0byBleGVjdXRlLiAgV2UgbmVlZCB0byBzZWUgd2hhdCB0aGUgdmFsdWUgb2YKK3RtcCBpcyBiZWZvcmUgd2UgZ2V0IGludG8gdGhlIGxvb3A6CisKKyNkZWZpbmUgREVCVUcKK2ludCBjbWQoc3RyaW5nIHRtcCkgeworI2lmZGVmIERFQlVHCisgICAgd3JpdGUodG1wKTsKKyNlbmRpZgorICAgIGlmKHN0cmluZ3AodG1wKSkgcmV0dXJuIGRvX2EoKTsKKyAgICBlbHNlIGlmKGludHAodG1wKSkgcmV0dXJuIGRvX2IoKTsKKyAgICBlbHNlIHJldHVybiAxOworfQorCitXZSBmaW5kIG91dCBpbW1lZGlhdGVseSB1cG9uIGlzc3VpbmcgdGhlIGNvbW1hbmQsIHRoYXQgdG1wIGhhcyBhCit2YWx1ZSBvZiAiMTAiLiAgTG9va2luZyBiYWNrIGF0IHRoZSBjb2RlLCB3ZSBzbGFwIG91cnNlbHZlcyBzaWxseSwKK2ZvcmdldHRpbmcgdGhhdCB3ZSBoYXZlIHRvIGNoYW5nZSBjb21tYW5kIGFyZ3VtZW50cyB0byBpbnRlZ2VycyB1c2luZworc3NjYW5mKCkgYmVmb3JlIGV2YWx1YXRpbmcgdGhlbSBhcyBpbnRlZ2Vycy4KKworNy41IFN1bW1hcnkKK1RoZSBrZXkgdG8gZGVidWdnaW5nIGFueSBMUEMgcHJvYmxlbSBpcyBhbHdheXMgYmVpbmcgYXdhcmUgb2Ygd2hhdAordGhlIHZhbHVlcyBvZiB5b3VyIHZhcmlhYmxlcyBhcmUgYXQgYW55IGdpdmVuIHN0ZXAgaW4geW91ciBjb2RlLiAgTFBDCitleGVjdXRpb24gcmVkdWNlcyBvbiB0aGUgc2ltcGxlc3QgbGV2ZWwgdG8gY2hhbmdlcyBpbiB2YXJpYWJsZSB2YWx1ZXMsIHNvCitiYWQgdmFsdWVzIGFyZSB3aGF0IGNhdXNlcyBiYWQgdGhpbmdzIHRvIGhhcHBlbiBvbmNlIGNvZGUgaGFzIGJlZW4KK2xvYWRlZCBpbnRvIG1lbW9yeS4gIElmIHlvdSBnZXQgZXJyb3JzIGFib3V0IGJhZCBhcmd1bWVudHMgdG8KK2Z1bmN0aW9ucywgbW9yZSBsaWtlbHkgdGhhbiBub3QgeW91IGFyZSBwYXNzaW5nIGEgTlVMTCB2YWx1ZSB0byBhCitmdW5jdGlvbiBmb3IgdGhhdCBhcmd1bWVudC4gIFRoaXMgaGFwcGVucyBtb3N0IG9mdGVuIHdpdGggb2JqZWN0cywgc2luY2UKK3Blb3BsZSB3aWxsIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgIDEpIHVzZSBhIHZhbHVlIHRoYXQgd2FzIHNldCB0byBhbiBvYmplY3QgdGhhdCBoYXMgc2luY2UgZGVzdHJ1Y3RlZAorICAgIDIpIHVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXNfcGxheWVyKCkgd2hlbiB0aGVyZSBpcyBubyB0aGlzX3BsYXllcigpCisgICAgMykgdXNlIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpc19vYmplY3QoKSBqdXN0IGFmdGVyIHRoaXNfb2JqZWN0KCkgd2FzCisgICAgZGVzdHJ1Y3RlZAorCitJbiBhZGRpdGlvbiwgcGVvcGxlIHdpbGwgb2Z0ZW4gcnVuIGludG8gZXJyb3JzIGludm9sdmluZyBpbGxlZ2FsIGluZGV4aW5nIG9yCitpbmRleGluZyBvbiBpbGxlZ2FsIHR5cGVzLiAgTW9zdCBvZnRlbiwgdGhpcyBpcyBiZWNhdXNlIHRoZSBtYXBwaW5nIG9yCithcnJheSBpbiBxdWVzdGlvbiB3YXMgbm90IGluaXRpYWxpemVkLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBpbmRleGVkLiAKK1RoZSBrZXkgaXMgdG8ga25vdyBleGFjdGx5IHdoYXQgdGhlIGZ1bGwgdmFsdWUgb2YgdGhlIGFycmF5IG9yIG1hcHBpbmcKK3Nob3VsZCBiZSBhdCB0aGUgcG9pbnQgaW4gcXVlc3Rpb24uICBJbiBhZGRpdGlvbiwgd2F0Y2ggZm9yIHVzaW5nIGluZGV4CitudW1iZXJzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIGdpdmVuIGFycmF5cworCitGaW5hbGx5LCBtYWtlIHVzZSBvZiB0aGUgcHJlY29tcGlsZXIgdG8gdGVtcG9yYXJseSB0aHJvdyBvdXQgY29kZSwgb3IKK2ludHJvZHVjZSBjb2RlIHdoaWNoIHdpbGwgc2hvdyB5b3UgdGhlIHZhbHVlcyBvZiB2YXJpYWJsZXMuICBUaGUKK3ByZWNvbXBpbGVyIG1ha2VzIGl0IGVhc3kgdG8gZ2V0IHJpZCBvZiBkZWJ1Z2dpbmcgY29kZSBxdWlja2x5IG9uY2UgeW91CithcmUgZG9uZS4gIFlvdSBjYW4gc2ltcGx5IHJlbW92ZSB0aGUgREVCVUcgZGVmaW5lIHdoZW4geW91IGFyZQorZG9uZS4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvUlVMRVMgYi9kb2MvS1VSUy9SVUxFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzg4Y2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvUlVMRVMKQEAgLTAsMCArMSw2MCBAQAorCQlESUUgWldFSSBHRUJPVEUgSU4gTU9SR0VOR1JBVUVOCisJCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVdhcyBzb2xsZW4gR2Vib3RlPworCS0tLS0tLS0tLS0tLS0tLS0tLQorCisJV2llIGluIGplZGVtIFNwaWVsIHNvIGhhYmVuIHNpY2ggYXVjaCBpbiB1bnNlcmVtIE1VRCBhbGxlCisJTWl0c3BpZWxlciAoTWFnaWVyIGVpbmdlc2NobG9zc2VuKSBhbiBTcGllbHJlZ2VsbiB6dSBoYWx0ZW4uCisJQWxsZXJkaW5ncyBtYWNoZW4gZGllIFNwaWVsZSBhbSBtZWlzdGVuIFNwYXNzLCBkaWUgZGllCisJd2VuaWdzdGVuIFJlZ2VsbiBiZXNpdHplbi4gCisKKwlVbSB6dSB2ZXJoaW5kZXJuLCBkYXNzIGpldHp0IHNjaG9uIGFuZ2VmYW5nZW4gd2lyZCwgZGFzcworCXVuc2VyIE1VRCBpbiBmZXN0ZSBSZWdlbG4gZ2VkcmFlbmd0IHdpcmQsIGhhYmUgaWNoIG1pY2ggCisJZW50c2NobG9zc2VuLCBzZWxiZXIgZGVtIFNwaWVsIGVpbiBSZWdlbHdlcmsgenUgZ2ViZW4uCisJQWJlciBpY2ggd2VyZGUgZGFmdWVyIHNvcmdlbiwgZGFzcyBzaWUga3VyeiBibGVpYmVuLgorCQorCTEuR2Vib3QgKQlEVSBTT0xMU1QgTkVUVCBTRUlOLgorCisJRGFzIE1VRCBpc3QgZWluIFNwaWVsOyB1bmQgU3BpZWxlIG1hY2hlbiBudXIgZGFubiBTcGFzcywKKwl3ZW5uIG1hbiBzaWNoIG5pY2h0IGdlZ2Vuc2VpdGlnIHZlcnN1Y2h0IGluIGRpZSBQZmFubmUgenUKKwloYXVlbjsgc29taXQgZ2lsdCBkaWVzZSBSZWdlbCBmdWVyIFNwaWVsZXIgd2llIGZ1ZXIgTWFnaWVyLgorCisJMi5HZWJvdCApCURVIFNPTExTVCBESUUgTVVETElCIEVIUkVOIFVORCBWRVJNRUhSRU4uCisKKwlEYXMgTVVEIHN0ZWh0IHVuZCBmYWVsbHQgbWl0IGRlciBHdWV0ZSBzZWluZXIgTXVkbGliOyB1bmQgZGEKKwl1bnNlciBIYXVwdHppZWwgZWluIHNjaG9lbmVzIE1VRCBpc3QsIGlzdCBlcyBkaWUgdm9ycmFuZ2lnZQorCUF1ZmdhYmUgYWxsZXIgTWFnaWVyLCBmdWVyIGRlbiBBdWZiYXUsIGRpZSBXYXJ0dW5nIHVuZCBkaWUKKwlFcmhhbHR1bmcgZGVyIE11ZGxpYiB6dSBzb3JnZW4uCisKKwladW0gVGhlbWEgVmVybWVocnVuZzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUVzIGdpYnQgaW4gZWluZW0gTVVEIG5hdHVlcmxpY2ggYXVjaCBub2NoIGFuZGVyZSBBdWZnYWJlbjoKKwktCVJlZ2lvbnNrb29yZGluYXRpb24KKwkJKFJlZ2lvbnNtYWdpZXIsRXJ6bWFnaWVyIGRlcyBWZXJrZWhycykKKwktCVdhaHJ1bmcgZGVzIEdsZWljaGdld2ljaHRlcyBkZXIgS3JhZWZ0ZQorCQkoV2FmZmVuLFJ1ZXN0dW5nZW4sR2VsZCxYUCxNb25zdGVyLHUucy53LikKKwktCVNjaHV0eiBkZXMgTVVEcyB2b3IgU3BpZWx2ZXJkZXJiZXJuLgorCQkoU2hlcmlmZikKKworCURpZXNlIEF1ZmdhYmVuIHNpbmQgYWJlciBrZWluZSBMZWJlbnNhdWZnYWJlbjsgc2llIHNpbmQKKwlBdWZnYWJlbiwgZGllIHNpY2ggZGVuIEdlYm90ZW4gdW50ZXJ6dW9yZG5lbiBoYWJlbi4KKwlJbnNiZXNvbmRlcmUgc29sbGVuIE1hZ2llciwgZGllIG5pY2h0cyB6dXIgVmVybWVocnVuZyBkZXIKKwlNdWRsaWIgYmVpdHJhZ2VuLCBuaWNodCB1ZWJlciBhbmRlcmUgdXJ0ZWlsZW4uCisKKwladW0gVGhlbWEgRWhydW5nOgorCS0tLS0tLS0tLS0tLS0tLS0tCisKKwlIaWVybWl0IG1laW5lIGljaCBkZW4gQXVmcnVmIGFuIGRpZSBNYWdpZXIsIGtlaW5lIE9iamVrdGUKKwl6dSBzY2hyZWliZW4sIGRpZSBkYXMgR2xlaWNodGdld2ljaHQgZGVyIEtyYWVmdGUgdmVybGV0emVuLgorCisJVW5kIGljaCBtZWluZSBkZW4gQXVmcnVmIGFuIGRpZSBNYWdpZXIsIGRhZnVlciB6dSBzb3JnZW4sCisJZGFzcyBlcyBpbiBkaWVzZW0gTVVEIEhlcmF1c2ZvcmRlcnVuZ2VuIGdpYnQsIGRpZSAoenVtaW5kZXN0CisJdGVpbHdlaXNlKSBuaWNodCB1bWdhbmdlbiB3ZXJkZW4ga29lbm5lbi4KKwlOYXR1ZXJsaWNoIGlzdCBkYW1pdCBhdWNoIGdlbWVpbnQsIGRhc3MgU3BpZWxlcm4gbnVyIGluIGRlbgorCUZhZWxsZW4gZ2Vob2xmZW4gd2lyZCwgd28gRmVobGVyIG9kZXIgTHVlY2tlbiBpbiBkZXIgTXVkbGliCisJYXVmdGF1Y2hlbi4KKworCU9scHAsIFNoZXJpZmYgZGVzIE1vcmdlbkdyYXVlbnMKKwlSdW1hdGEsIE11ZEFkbSBkZXMgTW9yZ2VuR3JhdWVucwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvUlVMRVMuV0laIGIvZG9jL0tVUlMvUlVMRVMuV0laCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWYwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9SVUxFUy5XSVoKQEAgLTAsMCArMSw0NiBAQAorVGhlc2UgYXJlIHRoZSBydWxlcyBmb3IgYSB3aXphcmQuCisoV2lyZCBub2NoIHVlYmVyYXJiZWl0ZXQsIGFtIGJlc3RlbiBPbHBwIG9kZXIgUnVtYXRhIGZyYWdlbiwgd2FzCit3aXJrbGljaCBTYWNoZSBpc3QuIEFiZXIgZWluZSBncm9iZSBSaWNodHVuZyB3ZWlzZW4gZGllc2UgImFsdGVuIgorUmVnZWxuIHNjaG9uIDotKQorCisxLiBZb3UgbWF5IG5vdCBoZWxwIG90aGVyIHBsYXllcnMsIGV2ZW4gaWYgdGhleSBsb3N0IHBvaW50cyBkdWUgdG8KKyAgIGxvc3QgY29ubmVjdGlvbi4gVGhleSBoYXZlIHRvIGdvIHRvIHRoZSBwb3N0IG9mZmljZSBhbmQgYXNrIExhcnMsCisgICBvciB1c2UgYnVnLgorCisyLiBOZXZlciBhdHRhY2sgYSBwbGF5ZXIgb3Iga2lsbCBoaW0uIElmIGEgcGxheWVyIGJlaGF2ZXMgYmFkbHksIGZpbGUKKyAgIHRoZSBjb21wbGFpbnQgdG8gTGFycy4KKworMy4gRG8gbm90IG1ha2UgJ2RlYWRseScgdHJhcHBzLiBBIHBsYXllciBtdXN0IG5ldmVyIGRpZSBiZWNhdXNlIGhlIGRpZG4ndAorICAga25vdyB3aGF0IGhhcHBlbnMgaW4gdGhlIG5leHQgcm9vbS4gSWYgc29tZSByb29tIGlzIHZlcnkgZGFuZ2Vyb3VzLAorICAgbWFrZSBzb21lIGhpbnQgKGxpa2UgdGhlIGdpYW50IGZvb3RwcmludHMgYmVzaWRlIHRoZSBnaWFudCBsYWlyKS4KKworNC4gTmV2ZXIgaW5pdGlhbGl6ZSB0aGUgZGVzdGluYXRpb24gb2YgYW4gb2JqZWN0IG91dHNpZGUgeW91ciBjYXN0bGUuIElmIHlvdQorICAgbWFrZSBhIG1vbnN0ZXIgdGhhdCBjYW4gd2FsayBvdXQgb2YgdGhlIGNhc3RsZSwgYmUgc3VyZSB0aGF0IGl0IGlzIGEKKyAgIHZlcnkgbmljZSBtb25zdGVyLgorCis1LiBOZXZlciBnZW5lcmF0ZSBtZXNzYWdlcyB0aGF0IGxvb2tzIGxpa2Ugc29tZXRoaW5nIGl0IGlzbid0IChnb29kIGFuZCBwcmVjaXNlCisgICBydWxlIDotKS4gVGhhdCBpcywgZG9uJ3QgdHJ5IHRvIGZvb2wgdGhlIHBsYXllciB0aGF0IHNvbWVvbmUgc2F5cyBzb21ldGhpbmcKKyAgIHdoZW4gaXQgaXNuJ3QgdHJ1ZSBldGMuCisKKzYuIElmIHlvdSBoYXZlIGEgInRlc3QiIGNoYXJhY3RlciwgbWFrZSBzdXJlIGlzIGlzbid0IHNlZW4gaW4gdGhlIHRvcCBzY29yZQorICAgbGlzdC4gSGUgbXVzdCBubyBiZSB3aXphcmQgZWl0aGVyLgorCis3LiBUcnkgdG8gYXZvaWQgbWFraW5nIGRldmljZXMsIHNpdHVhdGlvbnMgd2hpY2ggbWFrZXMgdGhlIHBsYXllcnMgbG9vc2UKKyAgIGV4cGVyaWVuY2UgaWYgdGhleSBhcmUgYWR2ZW50dXJpbmcgb3IgZXhhbWluaW5nIG9iamVjdHMuIFBsYXllcnMgc2hvdWxkIGJlCisgICByZXdhcmRlZCBmb3IgYWR2ZW50dXJpbmcgYW5kIGRpc2NvdmVyaW5nIHRoaW5ncy4gSWYgdGhleSBnZXQga2lsbGVkLi4uCisgICBXZWxsLCB0aGV5IHdpbGwgdGhlbiBsb29zZSBzb21lIGV4cGVyaWVuY2UsIGJ1dCB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlIQorCis4LiBUaGUgZ2FtZSBpcyBzdXBwb3NlZCB0byBiZSBpbiB0aGUgImxvbmcgZGlzdGFudCBwYXN0IiwgYW5kIHRodXMgbm8KKyAgIG1vZGVybiB0aGluZ3Mgc2hvdWxkIGV4aXN0LiBJZiB5b3Ugd2FudCBzb21lIGtpbmQgb2YgYWlycGxhbmUsIHVzZSBhCisgICBmbHlpbmcgaG9yc2UgaW4gc3RlYWQgZXRjLgorCis5LiBJZiB5b3UgbWFrZSBhdmFpbGFibGUgc29tZSBraW5kIG9mIHJlc3RhdXJhbnQgdGhhdCBzZWxscyBmb29kIHRoYXQKKyAgIGhlYWxzLCB0aGVuIHRoZSBoZWFsaW5nIG11c3QgY29zdCBvbiBhdmVyYWdlIDQgZ3AvaHAgKG9yIG1vcmUpLiBUaGUgYW1vdW50CisgICBvZiBoZWFsaW5nIG11c3QgYWxzbyBiZSBsaW1pdGVkIHBlciByZXNldC4gR2VuZXJhdGluZyBoZWFsaW5nIGl0ZW1zIGZvcgorICAgZnJlZSBpcyBvbmx5IGFsbG93ZWQgaWYgdGhleSBoZWFsIGF0IG1vc3QgMjAgcG9pbnRzLCBhbmQgYXJlIGRlc3RydWN0ZWQuCisgICBOb3QgbW9yZSB0aGFuIG9uZSBzdWNoIGl0ZW0gbWF5IGJlIGdlbmVyYXRlZCBwZXIgcm9vbSBhbmQgcmVzZXQuCisKKzEwLlRlbGVwb3J0aW5nIGl0ZW1zIHNob3VsZCBiZSBWRVJZIHJlc3RyaWN0ZWQsIGFuZCB2ZXJ5IHJhcmUuIFRoZXkgbXVzdAorICAgbm90IGFsbG93IHRlbGVwb3J0YXRpb25zIHRvIGFueXdoZXJlLCBidXQgb25seSB0byBvbmUgb3IgbW9yZSBwcmVkZWZpbmVkCisgICByb29tLiBOZXZlciB0byBhIHNwZWNpZmljIHBsYXllci4gSXQgbXVzdCBjb3N0IGF0IGxlYXN0IDUwIHNwZWxsIHBvaW50cworICAgdG8gdXNlIGVhY2ggdGltZS4KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL2VpbmxlaXR1bmcgYi9kb2MvS1VSUy9laW5sZWl0dW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODMxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9laW5sZWl0dW5nCkBAIC0wLDAgKzEsNDUgQEAKKwlFaW5mdWVocnVuZyBpbiBkaWUgUHJvZ3JtbWllcnVuZyBkZXIgTW9yZ2VuZ3JhdWVuLU11ZGxpYgorCXZvbiBEb24gUnVtYXRhLCBNdWRBZG0gZGVzIE1vcmdlbkdyYXVlbnMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJRUlOTEVJVFVORzoKKwktLS0tLS0tLS0tLQorCisJSGVyemxpY2ggd2lsbGtvbW1lbiBhbHMgTWFnaWVyIGltIE1vcmdlbkdyYXVlbi4gRHUgYmlzdAorCWdlcmFkZSBNYWdpZXIgZ2V3b3JkZW4uIERpZXNlciBLdXJzIHNvbGwgRGlyIGhlbGZlbiwKKwlpbiBkaWVzZW0gTVVEIGFsbGVzIE1vZWdsaWNoZSB6dSBwcm9ncmFtbWllcmVuLiAKKworCisJV0lDSFRJR0UgSU5GT1JNQVRJT05FTiBGVUVSIERFTiBBTkZBTkc6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlFaW4gTWFnaWVyIGhhdCBzaWNoIGdld2lzc2VuIFJlZ2VsbiB6dSB1bnRlcndlcmZlbiwgd2llIG1hbgorCXNpY2ggYmVpbiBlaW5lbSBTcGllbCBhdWNoIGluIGRpZSBTcGllbHJlZ2VsbiB6dSBoYWx0ZW4gaGF0LgorCURpZXNlIFNwaWVscmVnZWxuIHN0ZWhlbiBpbiBSVUxFUyAoZGFzIHNpbmQgZGllIHdpY2h0aWdlbikKKwl1bmQgaW4gUlVMRVMuV0laIChkYXMgc2luZCBkaWUgdGVjaG5pc2NoZW4gSGlud2Vpc2UpLgorCisJV2VubiBEdSBGaWxlcyBlZGl0aWVyZW4gd2lsbHN0LCBnaWJ0IGVzIG1laHJlcmUgTW9lZ2xpY2gtCisJa2VpdGVuOgorCisJMS4pIE1pdCBkZW0gQmVmZWhsICJlZCA8ZmlsZW5hbWU+IjoKKwkgICAgRWluZSBFaW5sZWl0dW5nIGZ1ZXIgZWQga2FubnN0IER1IGluIC9kb2MvZWQvKiBmaW5kZW4uCisKKwkyLikgRmlsZXVlYmVydHJhZ3VuZyBwZXIgZnRwCisJMy4pIEZpbGV1ZWJlcnRyYWd1bmcgcGVyIG10cAorCSAgICBmcmFnZSBhbSBiZXN0ZW4gZWluZW4gZGVyIGVyZmFocmVuZW4gTWFnaWVyLgorCisKKwlLVVJTVUVCRVJCTElDSzoKKwktLS0tLS0tLS0tLS0tLS0KKworCUkJUHJvZ3JhbW1pZXJ1bmcgdm9uIFJhZXVtZW4KKwkgICAgIDEuCUVpbiBlaW5mYWNoZXIgUmF1bQorCSAKKwlJSQlQcm9ncmFtbWllcnVuZyB2b24gT2JqZWt0ZW4KKwkKKwlJSUkJUHJvZ3JhbW1pZXJ1bmcgdm9uIE1vbnN0ZXJuCisKKworCUFjaGphOiBJY2ggYml0dGUgZmxlaGVudGxpY2ggdW0gS29ycmVrdHVybGVzZW4gdW5kCisJVmVyYmVzc2VydW5ncy9FcmdhZW56dW5nc3ZvcnNjaGxhZWdlLiBVbmQgbm9jaCBtZWhyCisJdW0gTWl0YXJiZWl0LiAoSWNoIGhhYiBzY2hvbiBqZXR6dCB3dW5kZSBGaW5nZXIgOi0pCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9vYmpla3RlIGIvZG9jL0tVUlMvb2JqZWt0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmIxMWQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvb2JqZWt0ZQpAQCAtMCwwICsxLDI5IEBACisJT0JKRUtURQorCQorCUFscyBlcnN0ZXMgbXVzc3QgRHUgd2lzc2VuLCBkYXNzIGplZGVzIE9iamVrdCBpbiBkaWVzZW0KKwlNdWQgZHVyY2ggZWluIEZpbGUgcmVwcmFlc2VudGllcnQgd2lyZC4gRGllc2VzIEZpbGUKKwl3aXJkIGF1Y2ggZGllICJCbHVlcHJpbnQiIGdlbmFubnQuIER1IGthbm5zdCBuZXVlIE9iamVrdGUKKwlhdWYgMiBBcnRlbiBlcnNjaGFmZmVuLgorCisJMS4pICJjbG9uZSJuIHZvbiBCbHVlcHJpbnRzLiBEYXMgYmVkZXV0ZXQsIGRhc3MgRHUgZWluCisJICAgIE9iamVrdCBlcnNjaGFmZnN0LCBkYXMgZGllIEVpZ2Vuc2NoYWZ0ZW4gaGF0LCBkaWUgaW4KKwkgICAgZGVyIEJsdWVwcmludCBwcm9ncmFtbWllcnQgd29yZGVuIHNpbmQuIFZvbiBlaW5lcgorCSAgICBCbHVlcHJpbnQga29lbm5lbiBtZWhyZXJlICJDbG9uZXMiIGV4aXN0aWVyZW4uCisJICAgIFR5cGlzY2hlIEJlaXNwaWVsZSBmdWVyICJDbG9uZXMiIHNpbmQgV2FmZmVuLAorCSAgICBNb25zdGVyLCBHZWxkIG9kZXIgU3BpZWxlci4KKworCTIuKSAibG9hZCJlbiB2b24gQmx1ZXByaW50cy4gRGFzIGJlZGV1dGV0LCBkYXNzIER1CisJICAgIGRpZXNlIEJsdWVwcmludCB6dSBMZWJlbiBlcndlY2tzdC4gSW4gZ2V3aXNzZXIgV2Vpc2UKKwkgICAgYmVuZWhtZW4gc2ljaCBkaWVzZSBPYmpla3RlIGdlbmF1c28gd2llIGRpZSAiQ2xvbmVzIiwKKwkgICAgYWxsZXJkaW5ncyBrb2VubmVuIHZvbiBlaW5tYWwgZ2VsYWRlbmVuIEJsdWVwcmludHMKKwkgICAga2VpbmUgIkNsb25lcyIgbWVociBlcnNjaGFmZmVuIHdlcmRlbi4KKwkgICAgVHlwaXNjaGUgZ2VsYWRlbmUgT2JqZWt0ZSBzaW5kIFJhZW1lLgorCisJS05JR0dFIEZVRVIgTUFHSUVSCisKKwlEYWR1cmNoLCBkYXNzIER1IGJlbGllYmlnZSBGaWxlcyBsYWRlbiBvZGVyIGNsb25lbiBrYW5uc3QsCisJYmlzdCBEdSBpbiBkZXIgTGFnZSwgamVkZW0gU3BpZWxlciBkYXMgZ2V3dWVuc2NodGUgT2JqZWt0CisJenUgYmVzY2hhZmZlbi4gQWJlciBkYXMgaXN0IG5hdHVlcmxpY2ggbmljaHQgZGVyIFNpbm4gZGVyCisJU2FjaGUuIEFscyBNYWdpZXIgYmlzdCBEdSB2ZXJwZmxpY2h0ZXQsIGRlbiBTcGllbGVybiBudXIKKwlub2NoIGRhbm4genUgaGVsZmVuLCB3ZW5uIHNpZSBhdWZncnVuZCB2b24gUHJvZ3JhbW1pZXItCisJZmVobGVybiBpbiBTY2h3aWVyaWdrZWl0ZW4gZ2VyYXRlbi4KZGlmZiAtLWdpdCBhL2RvYy9LVVJTL3JhdW0xIGIvZG9jL0tVUlMvcmF1bTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyM2MzNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL3JhdW0xCkBAIC0wLDAgKzEsMTM3IEBACisKKwlQUk9HUkFNTUlFUlVORyBWT04gUkFFVU1FTiAtIFRFSUwgMQorCXZvbiBEb24gUnVtYXRhLCBNdWRBZG0gZGVzIE1vcmdlbkdyYXVlbnMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlFaW4gUmF1bSBpc3Qgc2VociBlaW5mYWNoIHp1IHByb2dyYW1taWVyZW4uIE1hbiBmdWVsbHQKKwlpaG4gbWl0IGRlbiBJbmZvcm1hdGlvbmVuLCBkaWUgbWFuIGluIGlobSBoYWJlbiB3aWxsLgorCisJQW0gYmVzdGVuIGVya2xhZXJ0IHNpY2ggYWxsZXMgYW4gZWluZW0gQmVpc3BpZWwuIFp1IGRlbgorCUZ1bmt0aW9uZW4gc2luZCBpbiAvZG9jL2VmdW5zIHVuZCAvZG9jL2xmdW5zIHdlaXRlcmUKKwlJbmZvcm1hdGlvbmVuIGVyaGFlbHRsaWNoLgorCisJTmFjaGZvbGdlbmQga2FubnN0IER1IGVpbmVuICh6dWdlZ2ViZW5lZXJtYXNzZW4gdWViZXItCisJYXVzZnVlaHJsaWNoKSBkb2t1bWVudGllcnRlbiBCZWlzcGllbHJhdW0gZmluZGVuLgorCUluIC9kb2MvYmVpc3BpZWxlL3JhdW0xLmMga2FubnN0IER1IGRlbiBzZWxiZW4gUmF1bQorCW5vY2ggZWlubWFsIChvaG5lIEtvbW1lbnRhcmUpIGZpbmRlbi4gRGVuIFJhdW0KKwlrYW5uc3QgRHUgdWVicmlnZW5zIGF1Y2ggYmV0cmV0ZW4uCisKKy8qIGJlaXNwaWVscmF1bS5jIHZvbiBSdW1hdGEgKi8KKworaW5oZXJpdCAic3RkL3Jvb20iOworCS8vIEFsbGUgUmFldW1lIG11ZXNzZW4gZGllc2UgWmVpbGUgZW50aGFsdGVuLCBkYSBpbiBkZW0KKwkvLyBTdGFuZGFyZHJhdW0gd2ljaHRpZ2UgRnVua3Rpb25lbiBkZWZpbmllcnQgd2VyZGVuLCBkaWUKKwkvLyBpbm5lcmhhbGIgZGVzIFNwaWVsZXMgYmVub2V0aWd0IHdlcmRlbi4KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwkvLyBJbiBkaWVzZW0gRmlsZSBzaW5kIGRpZSBOYW1lbiBkZXIgUHJvcGVydGllcyBkZWZpbmllcnQuCisJLy8gRnVlciBuYWVocmUgSW5mb3JtYXRpb25lbiBrYW5uc3QgRHUgaW4KKwkvLyAvZG9jL2NvbmNlcHRzL3Byb3BlcnRpZXMgdW5kIGluIC9kb2MvcHJvcGVydGllcy5oCisJLy8gbmFjaHNjaGF1ZW4sIGRhIGVzIHNlaHIgdmllbGUgdmVyc2NoaWVkZW5lIFByb3BlcnRpZXMKKwkvLyBnaWJ0LgorCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKwkvLyBEaWVzZSBNb2R1bGUgZW50aGFsdGVuIGFsbGUgRGVmaW5pdGlvbmVuIGltIFp1c2FtbWVuaGFuZworCS8vIG1pdCBTcHJhY2hlLiBTaWVoZSAvZG9jL2xhbmd1YWdlLmgKKworY3JlYXRlKCkKKy8vIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXV0b21hdGlzY2ggYXVmZ2VydWZlbiwgd2VubiBkZXIgUmF1bSBnZWxhZGVuCisvLyB3aXJkLiBEYXMgcGFzc2llcnQgYmVpbSBLb21tYW5kbyAibG9hZCAvZG9jL2JlaXNwaWVsL2JzcHJhdW0xIiBvZGVyCisvLyB3ZW5uIGVpbiBTcGllbGVyIGRlbiBSYXVtIGFscyBlcnN0ZXIgYmV0cml0dC4KK3sKKwk6OmNyZWF0ZSgpOworCS8vIERpZXNlIEZ1bmt0aW9uIGRhcmYgTklFTUFMUyBmZWhsZW4hIFNpZSBzb3JndCBkYWZ1ZXIsIGRhc3MKKwkvLyBkZXIgUmF1bSBhdWNoIGRpZSBhbGxnZW1laW5lIEluaXRpYWxpc2llcnVuZyBkdXJjaGZ1ZWhydCwKKwkvLyBkYSBkaWVzZSBoaWVyIGRpZSBkZXIgIk11dHRlci1LbGFzc2UiIHN0ZC9yb29tIHVlYmVybGFlZHQuCisKKwlTZXRQcm9wKCBQX0lOVF9TSE9SVCwgIkVpbiBrbGVpbmVzIFNjaHJlaWJ6aW1tZXIiICk7CisJU2V0UHJvcCggUF9JTlRfTE9ORywKKwkJIkR1IHN0ZWhzdCBpbiBlaW5lbSBrbGVpbmVuIFNjaHJlaWJ6aW1tZXIuXG4iCisJKwkiRXMgZ2Vob2VydGUgd29obCBpcmdlbmR3YW5uIGVpbm1hbCBlaW5lbSBNYWdpZXIsIGFiZXIgbnVuXG4iCisJKwkiaXN0IGRpZXNlciBSYXVtIHZlcndhaXN0IHVuZCByb3R0ZXQgdm9yIHNpY2ggaGluLlxuIgorCSsJIkVpbiBncm9zc2VyIFNjaHJlaWJ0aXNjaCBpbiBkZXIgTWl0dGUgZGVzIFJhdW1lcyBzY2hlaW50XG4iCisJKwkibm9jaCBlaW5pZ2VybWFzc2VuIGd1dCBlcmhhbHRlbiB6dSBzZWluLiBEdXJjaCBkaWUgVHVlclxuIgorCSsJImltIE5vcmRlbiBmYWVsbHQgZXR3YXMgTGljaHQgaGluZWluLlxuIgorCSk7CisJU2V0UHJvcCggUF9MSUdIVCwgMSApOworCVNldFByb3AoIFBfSU5ET09SUywgMSApOworCS8vIERpZXNlIFByb3BlcnRpZXMgTVVFU1NFTiBpbiBKRURFTSBSYXVtIGdlc2V0enQgd2VyZGVuLgorCS8vIFBfSU5UX1NIT1JUCT0gQmVzY2hyZWlidW5nIGZ1ZXIgU3BpZWxlciBpbSAia3VyeiItTW9kdXMuCisJLy8gUF9JTlRfTE9ORwk9IEJlc2NocmVpYnVuZyBmdWVyIFNwaWVsZXIgaW0gImxhbmciLU1vZHVzLgorCS8vIFBfTElHSFQJPSAxIGZ1ZXIgSGVsbCwgMCBmdWVyIER1bmtlbAorCS8vIFBfSU5ET09SUwk9IDEsIHdlbm4gbWFuIGRlbiBIaW1tZWwgbmljaHQgc2VoZW4ga2Fubi4KKworCUFkZERldGFpbCggKHsgInNjaHJlaWJ0aXNjaCIsICJ0aXNjaCIgfSksCisJCSJBdWYgZGVtIFRpc2NoIGxpZWd0IGVpbmUgZGlja2UgU3RhdWJzY2hpY2h0LlxuIgorCSsJIkVpbmUgU2NodWJsYWRlIGZpbmRlc3QgRHUgZWJlbmZhbGxzLlxuIgorCSk7CisJQWRkRGV0YWlsKCAoeyAic3RhdWIiLCAic3RhdWJzY2hpY2h0IiwgInNjaGljaHQiIH0pLAorCQkiRHUgbWFsc3QgZ2VsYW5nd2VpbHQgZWluaWdlIEtyZWlzZSBpbiBkZW4gU3RhdWIuXG4iCisJKTsKKwlBZGREZXRhaWwoICJzY2h1YmxhZGUiLAorCQkiU28gc2VociBEdSBEaWNoIGFuc3RyZW5nc3Q7IER1IGthbm5zdCBzaWUgbmljaHQgYmV3ZWdlbi5cbiIKKwkpOworCUFkZERldGFpbCggInR1ZXIiICwKKwkJIlNpZSBzdGVodCBzZWl0IEphaHJlbiBvZmZlbiB1bmQgaXN0IGluIGRpZXNlciBMYWdlXG4iCisJKwkiaG9mZm51bmdzbG9zIGZlc3RnZXJvc3RldC5cbiIKKwkpOworCS8vIERldGFpbHMgc2luZCBEaW5nZSwgZGllIG1hbiBzaWNoIGluIGVpbmVtIFJhdW0gYW5zY2hhdWVuCisJLy8gYWJlciBuaWNodCBuZWhtZW4ga2Fubi4gSmUgbWVociBEZXRhaWxzIGVpbiBSYXVtIGhhdCwgZGVzdHNvCisJLy8gc2Nob2VuZXIgaXN0IGVyLiBTY2hhdXQgc2ljaCBlaW4gU3BpZWxlciBlaW4gRGV0YWlsIGFuLAorCS8vIHNvIGJla29tbXQgZGVyIGRpZSBhbmdlZ2ViZW5lIEJlc2NocmVpYnVuZy4KKworCUFkZFJvb21DbWQoICh7ICJzY2hsaWVzc2UiLCAib2VmZm5lIiwgImJld2VnZSIsCisJCSJzY2hsaWVzcyIsICJiZXdlZyIgfSksICJiZXdlZ19ldHdhcyIgKTsKKwkvLyBSb29tQ29tbWFuZHMgc2luZCBCZWZlaGxlLCBkaWUgbWFuIGluIGRpZXNlbSBhdXNmdWVocmVuIGthbm4uCisJLy8gRXMgd2lyZCBkaWUgYW5nZWdlYmVuZSBGdW5rdGlvbiBhdXNnZWZ1ZWhydC4KKwkvLyBXSUNIVElHOiBBbHMgVmVyYmVuIHNvbGx0ZW4gaW1tZXIgZGllIElNUEVSQVRJVkUgYmVudXR6dAorCS8vCXdlcmRlbiEgQWxzbyBuaWNodCAibGVzZSIsIHNvbmRlcm4gImxpZXMiLgorCQorCUFkZEV4aXQoICJub3JkZW4iLCAicGxheWVycy9ydW1hdGEvd29ya3Jvb20iICk7CisJLy8gRGVmaW5pdGlvbiBlaW5lcyBBdXNnYW5ncy4gRGFzIHplaXRlIEFyZ3VtZW50IGJlc3RpbW10IGRlbgorCS8vIFJhdW0sIGRlbiBlaW4gU3BpZWxlciBlcnJlaWNodCwgd2VubiBlciBpbiBkaWUgYW5nZWdlYmVuZQorCS8vIFJpY2h0dW5nIGdlaHQuCisKK30KKworYmV3ZWdfZXR3YXMoIHN0ciApCisvLyBXZW5uIGVpbiBTcGllbGVyIGVpbiBLb21tYW5kbyBhdXNmdWVocnQsIHNvIHdpcmQgYWxsZXMsIHdhcyBoaW50ZXIKKy8vIGRlbSBWZXJiIHN0ZWh0IGFscyBTdHJpbmcgdWViZXJnZWJlbiwgZXMgbGFuZGV0IGFsc28gaGllciBpbiAic3RyIi4KKy8vIFdJQ0hUSUc6IFdlbm4gZGVyIEJlZmVobCBhYmdlYXJiZWl0ZXQgd2lyZCwgTVVTUyBlciBlaW5lIDEgenVydWVjay0KKy8vICAgICAgICAgIGdlYmVuLiBXZW5uIGRlciBCZWZlaGwgbmljaHRzIFNpbm52b2xsZXMgdHVlbiBrb25udGUsIGVpbmUgMC4KK3sKKwlub3RpZnlfZmFpbCggIldhcyB3aWxsc3QgRHUgZGVubiBiZXdlZ2VuID8iICk7CisJLy8gTWVsZHVuZywgZGllIGRlciBTcGllbGVyIGJla29tbXQsIHdlbm4gYXVzc2VyIGRlbSBSYXVtIGF1Y2gKKwkvLyBrZWluIGFuZGVyZXMgT2JqZWt0IGRlbiBCZWZlaGwgdmVyYXJiZWl0ZW4ga29ubnRlLgorCWlmKCBzdHIgPT0gInR1ZXIiICkKKwl7CisJCXdyaXRlKCAiRGllIFR1ZXIgaXN0IGhvZmZudW5nc2xvcyBmZXN0Z2Vyb3N0ZXQuXG4iICk7CisJCS8vIFdyaXRlIGdpYnQgZWluZSBNZWxkdW5nIGFuIGRlbiBTcGllbGVyICh1bmQgbnVyIGFuIGlobikKKwkJLy8gYXVzLgorCQlyZXR1cm4gMTsKKwkJLy8gRGFzIEtvbW1hbmRvIGJld2lya3QgendhciBhdXMgU2ljaHQgZGVzIFNwaWVsZXJzCisJCS8vIG5pY2h0cywgYWJlciBlcyBrb25udGUgYWJnZWFyYmVpdGV0IHdlcmRlbi4KKwkJLy8gQWxzbyBnaWIgZWluZSAxIHp1cnVlY2suCisJfQorCWlmICggc3RyID09ICJsYWRlIiB8fCBzdHIgPT0gInNjaHVibGFkZSIgKQorCXsKKwkJd3JpdGUoICJEaWUgU2NodWJsYWRlIGtsZW1tdCBlaW5mYWNoIG51ci5cbiIgKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICggcXVlcnlfdmVyYigpID09ICJiZXdlZ2UiICYmCisJCSggc3RyID09ICJ0aXNjaCIgfHwgc3RyID09ICJzY2hyZWlidGlzY2giICkgKQorCXsKKwkJd3JpdGUoCisJCQkiRGVyIFRpc2NoIHNjaGVpbnQgYW0gQm9kZW4gZmVzdGdlc2NocmF1YnQgenUgc2Vpbi5cbiIKKwkJKTsKKwkJc2F5KAorCQkJdGhpc19wbGF5ZXIoKS0+bmFtZShXRVIsMikrIiB6ZXJydCBhbSBTY2hyZWlidGlzY2guXG4iCisJCSk7CisJCS8vIHNheSBnaWJ0IGVpbmUgTWVsZHVuZyBhbiBhbGxlIFNwaWVsZXIgaW0gc2VsYmVuCisJCS8vIFJhdW0gd2llIGRlciBTcGllbGVyIChhYmVyIG5pY2h0IGFuIGlobiBzZWxic3QpIGF1cy4KKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworCS8vIERlciBSYXVtIGtvbm50ZSBuaWNodHMgbWl0IGRlbSBLb21tYW5kbyBhbmZhbmdlbiwgYWxzbyBnaWIKKwkvLyBlaW5lIDAgenVydWVjay4KK30K