PD9waHAKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBGaWxlOglKUEdSQVBIX0ZMQUdTLlBIUAovLyBEZXNjcmlwdGlvbjoJQ2xhc3MgSnBmaWxlLiBIYW5kbGVzIHBsb3RtYXJrcwovLyBDcmVhdGVkOiAJMjAwMy0wNi0yOAovLyBBdXRob3I6CUpvaGFuIFBlcnNzb24gKGpvaGFucEBhZGl0dXMubnUpCi8vIFZlcjoJCSRJZCQKLy8KLy8gQ29weXJpZ2h0IChjKSBBZGl0dXMgQ29uc3VsdGluZy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIERlZmluZXMgZm9yIHRoZSBkaWZmZXJlbnQgYmFzaWMgc2l6ZXMgb2YgZmxhZ3MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KREVGSU5FKCdGTEFHU0laRTEnLDEpOwpERUZJTkUoJ0ZMQUdTSVpFMicsMik7CkRFRklORSgnRkxBR1NJWkUzJywzKTsKREVGSU5FKCdGTEFHU0laRTQnLDQpOwoKY2xhc3MgRmxhZ0ltYWdlcyB7CgogICAgdmFyICRpQ291bnRyeU5hbWVNYXAgPSBhcnJheSgKICAgICdBZmdoYW5pc3RhbicgPT4gJ2FmZ2gnLAogICAgJ1JlcHVibGljIG9mIEFuZ29sYScgPT4gJ2FnbGEnLAogICAgJ1JlcHVibGljIG9mIEFsYmFuaWEnID0+ICdhbGJhJywKICAgICdBbGRlcm5leScgPT4gJ2FsZGUnLAogICAgJ0RlbW9jcmF0aWMgYW5kIFBvcHVsYXIgUmVwdWJsaWMgb2YgQWxnZXJpYScgPT4gJ2FsZ2UnLAogICAgJ1RlcnJpdG9yeSBvZiBBbWVyaWNhbiBTYW1vYScgPT4gJ2Ftc2EnLAogICAgJ1ByaW5jaXBhbGl0eSBvZiBBbmRvcnJhJyA9PiAnYW5kcicsCiAgICAnQnJpdGlzaCBPdmVyc2VhcyBUZXJyaXRvcnkgb2YgQW5ndWlsbGEnID0+ICdhbmd1JywKICAgICdBbnRhcmN0aWNhJyA9PiAnYW50YScsCiAgICAnQXJnZW50aW5lIFJlcHVibGljJyA9PiAnYXJnZScsCiAgICAnTGVhZ3VlIG9mIEFyYWIgU3RhdGVzJyA9PiAnYXJsZScsCiAgICAnUmVwdWJsaWMgb2YgQXJtZW5pYScgPT4gJ2FybWUnLAogICAgJ0FydWJhJyA9PiAnYXJ1YicsCiAgICAnQ29tbW9ud2VhbHRoIG9mIEF1c3RyYWxpYScgPT4gJ2FzdGwnLAogICAgJ1JlcHVibGljIG9mIEF1c3RyaWEnID0+ICdhdXN0JywKICAgICdBemVyYmFpamFuaSBSZXB1YmxpYycgPT4gJ2F6ZXInLAogICAgJ0JyaXRpc2ggQW50YXJjdGljIFRlcnJpdG9yeScgPT4gJ2JhbnQnLAogICAgJ0tpbmdkb20gb2YgQmVsZ2l1bScgPT4gJ2JlbGcnLAogICAgJ0JyaXRpc2ggT3ZlcnNlYXMgVGVycml0b3J5IG9mIEJlcm11ZGEnID0+ICdiZXJtJywKICAgICdDb21tb253ZWFsdGggb2YgdGhlIEJhaGFtYXMnID0+ICdiaG1zJywKICAgICdLaW5nZG9tIG9mIEJhaHJhaW4nID0+ICdiaHJuJywKICAgICdSZXB1YmxpYyBvZiBCZWxhcnVzJyA9PiAnYmxydScsCiAgICAnUmVwdWJsaWMgb2YgQm9saXZpYScgPT4gJ2JsdmEnLAogICAgJ0JlbGl6ZScgPT4gJ2JsemUnLAogICAgJ1JlcHVibGljIG9mIEJlbmluJyA9PiAnYm5pbicsCiAgICAnUmVwdWJsaWMgb2YgQm90c3dhbmEnID0+ICdib3RzJywKICAgICdGZWRlcmF0aXZlIFJlcHVibGljIG9mIEJyYXppbCcgPT4gJ2JyYXonLAogICAgJ0JhcmJhZG9zJyA9PiAnYnJiZCcsCiAgICAnQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5JyA9PiAnYnJpbicsCiAgICAnQnJ1bmVpIERhcnVzc2FsYW0nID0+ICdicnVuJywKICAgICdSZXB1YmxpYyBvZiBCdXJraW5hJyA9PiAnYnVmYScsCiAgICAnUmVwdWJsaWMgb2YgQnVsZ2FyaWEnID0+ICdidWxnJywKICAgICdSZXB1YmxpYyBvZiBCdXJ1bmRpJyA9PiAnYnVydScsCiAgICAnT3ZlcnNlYXMgVGVycml0b3J5IG9mIHRoZSBCcml0aXNoIFZpcmdpbiBJc2xhbmRzJyA9PiAnYnZpcycsCiAgICAnQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljJyA9PiAnY2FmcicsCiAgICAnS2luZ2RvbSBvZiBDYW1ib2RpYScgPT4gJ2NhbWInLAogICAgJ1JlcHVibGljIG9mIENhbWVyb29uJyA9PiAnY2FtZScsCiAgICAnRG9taW5pb24gb2YgQ2FuYWRhJyA9PiAnY2FuYScsCiAgICAnQ2FyaWJiZWFuIENvbW11bml0eScgPT4gJ2NhcmknLAogICAgJ1JlcHVibGljIG9mIENhcGUgVmVyZGUnID0+ICdjYXZlJywKICAgICdSZXB1YmxpYyBvZiBDaGFkJyA9PiAnY2hhZCcsCiAgICAnUmVwdWJsaWMgb2YgQ2hpbGUnID0+ICdjaGlsJywKICAgICdQZW9wbGVzIFJlcHVibGljIG9mIENoaW5hJyA9PiAnY2hpbicsCiAgICAnVGVycml0b3J5IG9mIENocmlzdG1hcyBJc2xhbmQnID0+ICdjaG1zJywKICAgICdDb21tb253ZWFsdGggb2YgSW5kZXBlbmRlbnQgU3RhdGVzJyA9PiAnY2lucycsCiAgICAnQ29vayBJc2xhbmRzJyA9PiAnY2tpcycsCiAgICAnUmVwdWJsaWMgb2YgQ29sb21iaWEnID0+ICdjbG1iJywKICAgICdUZXJyaXRvcnkgb2YgQ29jb3MgSXNsYW5kcycgPT4gJ2NvaXMnLAogICAgJ0NvbW1vbndlYWx0aCcgPT4gJ2NvbW4nLAogICAgJ1VuaW9uIG9mIHRoZSBDb21vcm9zJyA9PiAnY29tbycsCiAgICAnUmVwdWJsaWMgb2YgdGhlIENvbmdvJyA9PiAnY29uZycsCiAgICAnUmVwdWJsaWMgb2YgQ29zdGEgUmljYScgPT4gJ2NvcmMnLAogICAgJ1JlcHVibGljIG9mIENyb2F0aWEnID0+ICdjcm9hJywKICAgICdSZXB1YmxpYyBvZiBDdWJhJyA9PiAnY3ViYScsCiAgICAnQnJpdGlzaCBPdmVyc2VhcyBUZXJyaXRvcnkgb2YgdGhlIENheW1hbiBJc2xhbmRzJyA9PiAnY3lpcycsCiAgICAnUmVwdWJsaWMgb2YgQ3lwcnVzJyA9PiAnY3lwcicsCiAgICAnVGhlIEN6ZWNoIFJlcHVibGljJyA9PiAnY3plYycsCiAgICAnS2luZ2RvbSBvZiBEZW5tYXJrJyA9PiAnZGVubScsCiAgICAnUmVwdWJsaWMgb2YgRGppYm91dGknID0+ICdkamliJywKICAgICdDb21tb253ZWFsdGggb2YgRG9taW5pY2EnID0+ICdkb21uJywKICAgICdEb21pbmljYW4gUmVwdWJsaWMnID0+ICdkb3JlJywKICAgICdSZXB1YmxpYyBvZiBFY3VhZG9yJyA9PiAnZWN1YScsCiAgICAnQXJhYiBSZXB1YmxpYyBvZiBFZ3lwdCcgPT4gJ2VneXAnLAogICAgJ1JlcHVibGljIG9mIEVsIFNhbHZhZG9yJyA9PiAnZWxzYScsCiAgICAnRW5nbGFuZCcgPT4gJ2VuZ2wnLAogICAgJ1JlcHVibGljIG9mIEVxdWF0b3JpYWwgR3VpbmVhJyA9PiAnZXFndScsCiAgICAnU3RhdGUgb2YgRXJpdHJlYScgPT4gJ2VyaXQnLAogICAgJ1JlcHVibGljIG9mIEVzdG9uaWEnID0+ICdlc3RuJywKICAgICdFdGhpb3BpYScgPT4gJ2V0aHAnLAogICAgJ0V1cm9wZWFuIFVuaW9uJyA9PiAnZXV1bicsCiAgICAnQnJpdGlzaCBPdmVyc2VhcyBUZXJyaXRvcnkgb2YgdGhlIEZhbGtsYW5kIElzbGFuZHMnID0+ICdmYWlzJywKICAgICdJbnRlcm5hdGlvbmFsIEZlZGVyYXRpb24gb2YgVmV4aWxsb2xvZ2ljYWwgQXNzb2NpYXRpb25zJyA9PiAnZmlhdicsCiAgICAnUmVwdWJsaWMgb2YgRmlqaScgPT4gJ2ZpamknLAogICAgJ1JlcHVibGljIG9mIEZpbmxhbmQnID0+ICdmaW5sJywKICAgICdUZXJyaXRvcnkgb2YgRnJlbmNoIFBvbHluZXNpYScgPT4gJ2Zwb2wnLAogICAgJ0ZyZW5jaCBSZXB1YmxpYycgPT4gJ2ZyYW4nLAogICAgJ092ZXJzZWFzIERlcGFydG1lbnQgb2YgRnJlbmNoIEd1aWFuYScgPT4gJ2ZyZ3UnLAogICAgJ0dhYm9uZXNlIFJlcHVibGljJyA9PiAnZ2FibicsCiAgICAnUmVwdWJsaWMgb2YgdGhlIEdhbWJpYScgPT4gJ2dhbWInLAogICAgJ1JlcHVibGljIG9mIEdlb3JnaWEnID0+ICdnZW9yJywKICAgICdGZWRlcmFsIFJlcHVibGljIG9mIEdlcm1hbnknID0+ICdnZXJtJywKICAgICdSZXB1YmxpYyBvZiBHaGFuYScgPT4gJ2doYW4nLAogICAgJ0dpYnJhbHRhcicgPT4gJ2dpYnInLAogICAgJ0hlbGxlbmljIFJlcHVibGljJyA9PiAnZ3JlYycsCiAgICAnU3RhdGUgb2YgR3JlbmFkYScgPT4gJ2dyZW4nLAogICAgJ092ZXJzZWFzIERlcGFydG1lbnQgb2YgR3VhZGVsb3VwZScgPT4gJ2d1YWQnLAogICAgJ1RlcnJpdG9yeSBvZiBHdWFtJyA9PiAnZ3VhbScsCiAgICAnUmVwdWJsaWMgb2YgR3VhdGVtYWxhJyA9PiAnZ3VhdCcsCiAgICAnVGhlIEJhaWxpd2ljayBvZiBHdWVybnNleScgPT4gJ2d1ZXInLAogICAgJ1JlcHVibGljIG9mIEd1aW5lYScgPT4gJ2d1aW4nLAogICAgJ1JlcHVibGljIG9mIEhhaXRpJyA9PiAnaGFpdCcsCiAgICAnSG9uZyBLb25nIFNwZWNpYWwgQWRtaW5pc3RyYXRpdmUgUmVnaW9uJyA9PiAnaG9rbicsCiAgICAnUmVwdWJsaWMgb2YgSG9uZHVyYXMnID0+ICdob25kJywKICAgICdSZXB1YmxpYyBvZiBIdW5nYXJ5JyA9PiAnaHVuZycsCiAgICAnUmVwdWJsaWMgb2YgSWNlbGFuZCcgPT4gJ2ljZWwnLAogICAgJ0ludGVybmF0aW9uYWwgQ29tbWl0dGVlIG9mIHRoZSBSZWQgQ3Jvc3MnID0+ICdpY3JjJywKICAgICdSZXB1YmxpYyBvZiBJbmRpYScgPT4gJ2luZGEnLAogICAgJ1JlcHVibGljIG9mIEluZG9uZXNpYScgPT4gJ2luZG4nLAogICAgJ1JlcHVibGljIG9mIElyYXEnID0+ICdpcmFxJywKICAgICdSZXB1YmxpYyBvZiBJcmVsYW5kJyA9PiAnaXJlbCcsCiAgICAnT3JnYW5pemF0aW9uIG9mIHRoZSBJc2xhbWljIENvbmZlcmVuY2UnID0+ICdpc2NvJywKICAgICdJc2xlIG9mIE1hbicgPT4gJ2lzbWEnLAogICAgJ1N0YXRlIG9mIElzcmFlbCcgPT4gJ2lzcmEnLAogICAgJ0l0YWxpYW4gUmVwdWJsaWMnID0+ICdpdGFsJywKICAgICdKYW1haWNhJyA9PiAnamFtYScsCiAgICAnSmFwYW4nID0+ICdqYXBhJywKICAgICdUaGUgQmFpbGl3aWNrIG9mIEplcnNleScgPT4gJ2plcnMnLAogICAgJ0hhc2hlbWl0ZSBLaW5nZG9tIG9mIEpvcmRhbicgPT4gJ2pvcmQnLAogICAgJ1JlcHVibGljIG9mIEthemFraHN0YW4nID0+ICdrYXprJywKICAgICdSZXB1YmxpYyBvZiBLZW55YScgPT4gJ2tlbnknLAogICAgJ1JlcHVibGljIG9mIEtpcmliYXRpJyA9PiAna2lyYicsCiAgICAnU3RhdGUgb2YgS3V3YWl0JyA9PiAna3V3YScsCiAgICAnS3lyZ3l6IFJlcHVibGljJyA9PiAna3lyZycsCiAgICAnUmVwdWJsaWMgb2YgTGF0dmlhJyA9PiAnbGF0dicsCiAgICAnTGViYW5lc2UgUmVwdWJsaWMnID0+ICdsZWJhJywKICAgICdLaW5nZG9tIG9mIExlc290aG8nID0+ICdsZXN0JywKICAgICdSZXB1YmxpYyBvZiBMaWJlcmlhJyA9PiAnbGliZScsCiAgICAnUHJpbmNpcGFsaXR5IG9mIExpZWNodGVuc3RlaW4nID0+ICdsaWVjJywKICAgICdSZXB1YmxpYyBvZiBMaXRodWFuaWEnID0+ICdsaXRoJywKICAgICdHcmFuZCBEdWNoeSBvZiBMdXhlbWJvdXJnJyA9PiAnbHV4ZScsCiAgICAnTWFjYW8gU3BlY2lhbCBBZG1pbmlzdHJhdGl2ZSBSZWdpb24nID0+ICdtYWNhJywKICAgICdSZXB1YmxpYyBvZiBNYWNlZG9uaWEnID0+ICdtYWNlJywKICAgICdSZXB1YmxpYyBvZiBNYWRhZ2FzY2FyJyA9PiAnbWFkYScsCiAgICAnUmVwdWJsaWMgb2YgdGhlIE1hcnNoYWxsIElzbGFuZHMnID0+ICdtYWlzJywKICAgICdSZXB1YmxpYyBvZiBNYWxpJyA9PiAnbWFsaScsCiAgICAnRmVkZXJhdGlvbiBvZiBNYWxheXNpYScgPT4gJ21hbHMnLAogICAgJ1JlcHVibGljIG9mIE1hbHRhJyA9PiAnbWFsdCcsCiAgICAnUmVwdWJsaWMgb2YgTWFsYXdpJyA9PiAnbWFsdycsCiAgICAnT3ZlcnNlYXMgRGVwYXJ0bWVudCBvZiBNYXJ0aW5pcXVlJyA9PiAnbWFydCcsCiAgICAnSXNsYW1pYyBSZXB1YmxpYyBvZiBNYXVyaXRhbmlhJyA9PiAnbWF1cicsCiAgICAnVGVycml0b3JpYWwgQ29sbGVjdGl2aXR5IG9mIE1heW90dGUnID0+ICdtYXl0JywKICAgICdVbml0ZWQgTWV4aWNhbiBTdGF0ZXMnID0+ICdtZXhjJywKICAgICdGZWRlcmF0ZWQgU3RhdGVzIG9mIE1pY3JvbmVzaWEnID0+ICdtaWNyJywKICAgICdNaWR3YXkgSXNsYW5kcycgPT4gJ21paXMnLAogICAgJ1JlcHVibGljIG9mIE1vbGRvdmEnID0+ICdtb2xkJywKICAgICdQcmluY2lwYWxpdHkgb2YgTW9uYWNvJyA9PiAnbW9uYScsCiAgICAnUmVwdWJsaWMgb2YgTW9uZ29saWEnID0+ICdtb25nJywKICAgICdCcml0aXNoIE92ZXJzZWFzIFRlcnJpdG9yeSBvZiBNb250c2VycmF0JyA9PiAnbW9udCcsCiAgICAnS2luZ2RvbSBvZiBNb3JvY2NvJyA9PiAnbW9yYycsCiAgICAnUmVwdWJsaWMgb2YgTW96YW1iaXF1ZScgPT4gJ21vemEnLAogICAgJ1JlcHVibGljIG9mIE1hdXJpdGl1cycgPT4gJ21ydHMnLAogICAgJ1VuaW9uIG9mIE15YW5tYXInID0+ICdteWFuJywKICAgICdSZXB1YmxpYyBvZiBOYW1pYmlhJyA9PiAnbmFtYicsCiAgICAnTm9ydGggQXRsYW50aWMgVHJlYXR5IE9yZ2FuaXphdGlvbicgPT4gJ25hdG8nLAogICAgJ1JlcHVibGljIG9mIE5hdXJ1JyA9PiAnbmF1cicsCiAgICAnVHVya2lzaCBSZXB1YmxpYyBvZiBOb3J0aGVybiBDeXBydXMnID0+ICduY3lwJywKICAgICdOZXRoZXJsYW5kcyBBbnRpbGxlcycgPT4gJ25lYW4nLAogICAgJ0tpbmdkb20gb2YgTmVwYWwnID0+ICduZXBhJywKICAgICdLaW5nZG9tIG9mIHRoZSBOZXRoZXJsYW5kcycgPT4gJ25ldGgnLAogICAgJ1RlcnJpdG9yeSBvZiBOb3Jmb2xrIElzbGFuZCcgPT4gJ25maXMnLAogICAgJ0ZlZGVyYWwgUmVwdWJsaWMgb2YgTmlnZXJpYScgPT4gJ25ncmEnLAogICAgJ1JlcHVibGljIG9mIE5pY2FyYWd1YScgPT4gJ25pY2EnLAogICAgJ1JlcHVibGljIG9mIE5pZ2VyJyA9PiAnbmlncicsCiAgICAnTml1ZScgPT4gJ25pdWUnLAogICAgJ0NvbW1vbndlYWx0aCBvZiB0aGUgTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzJyA9PiAnbm1hcicsCiAgICAnUHJvdmluY2Ugb2YgTm9ydGhlcm4gSXJlbGFuZCcgPT4gJ25vaXInLAogICAgJ05vcmRpYyBDb3VuY2lsJyA9PiAnbm9yZCcsCiAgICAnS2luZ2RvbSBvZiBOb3J3YXknID0+ICdub3J3JywKICAgICdUZXJyaXRvcnkgb2YgTmV3IENhbGVkb25pYSBhbmQgRGVwZW5kZW5jaWVzJyA9PiAnbndjYScsCiAgICAnTmV3IFplYWxhbmQnID0+ICdud3plJywKICAgICdPcmdhbml6YXRpb24gb2YgQW1lcmljYW4gU3RhdGVzJyA9PiAnb2FzdCcsCiAgICAnT3JnYW5pemF0aW9uIG9mIEFmcmljYW4gVW5pdHknID0+ICdvYXVuJywKICAgICdJbnRlcm5hdGlvbmFsIE9seW1waWMgQ29tbWl0dGVlJyA9PiAnb2x5bScsCiAgICAnU3VsdGFuYXRlIG9mIE9tYW4nID0+ICdvbWFuJywKICAgICdJc2xhbWljIFJlcHVibGljIG9mIFBha2lzdGFuJyA9PiAncGFrcycsCiAgICAnUmVwdWJsaWMgb2YgUGFsYXUnID0+ICdwYWxhJywKICAgICdJbmRlcGVuZGVudCBTdGF0ZSBvZiBQYXB1YSBOZXcgR3VpbmVhJyA9PiAncGFuZycsCiAgICAnUmVwdWJsaWMgb2YgUGFyYWd1YXknID0+ICdwYXJhJywKICAgICdSZXB1YmxpYyBvZiBQZXJ1JyA9PiAncGVydScsCiAgICAnUmVwdWJsaWMgb2YgdGhlIFBoaWxpcHBpbmVzJyA9PiAncGhpbCcsCiAgICAnQnJpdGlzaCBPdmVyc2VhcyBUZXJyaXRvcnkgb2YgdGhlIFBpdGNhaXJuIElzbGFuZHMnID0+ICdwaWlzJywKICAgICdSZXB1YmxpYyBvZiBQb2xhbmQnID0+ICdwb2xhJywKICAgICdSZXB1YmxpYyBvZiBQb3J0dWdhbCcgPT4gJ3BvcnQnLAogICAgJ0NvbW1vbndlYWx0aCBvZiBQdWVydG8gUmljbycgPT4gJ3B1cmMnLAogICAgJ1N0YXRlIG9mIFFhdGFyJyA9PiAncWF0YScsCiAgICAnUnVzc2lhbiBGZWRlcmF0aW9uJyA9PiAncnVzcycsCiAgICAnUmVwdWJsaWMgb2YgUndhbmRhJyA9PiAncndhbicsCiAgICAnS2luZ2RvbSBvZiBTYXVkaSBBcmFiaWEnID0+ICdzYWFyJywKICAgICdSZXB1YmxpYyBvZiBTYW4gTWFyaW5vJyA9PiAnc2FtYScsCiAgICAnTm9yZGljIFNhbWkgQ29uZmVyZW5jZScgPT4gJ3NhbWknLAogICAgJ1NhcmsnID0+ICdzYXJrJywKICAgICdTY290bGFuZCcgPT4gJ3Njb3QnLAogICAgJ1ByaW5jaXBhbGl0eSBvZiBTZWJvcmdhJyA9PiAnc2VibycsCiAgICAnUmVwdWJsaWMgb2YgU2llcnJhIExlb25lJyA9PiAnc2lsZScsCiAgICAnUmVwdWJsaWMgb2YgU2luZ2Fwb3JlJyA9PiAnc2luZycsCiAgICAnUmVwdWJsaWMgb2YgS29yZWEnID0+ICdza29yJywKICAgICdSZXB1YmxpYyBvZiBTbG92ZW5pYScgPT4gJ3NsdmEnLAogICAgJ1NvbWFsaSBSZXB1YmxpYycgPT4gJ3NtbGEnLAogICAgJ1JlcHVibGljIG9mIFNvbWFsaWxhbmQnID0+ICdzbWxkJywKICAgICdSZXB1YmxpYyBvZiBTb3V0aCBBZnJpY2EnID0+ICdzb2FmJywKICAgICdTb2xvbW9uIElzbGFuZHMnID0+ICdzb2lzJywKICAgICdLaW5nZG9tIG9mIFNwYWluJyA9PiAnc3BhbicsCiAgICAnU2VjcmV0YXJpYXQgb2YgdGhlIFBhY2lmaWMgQ29tbXVuaXR5JyA9PiAnc3BjbycsCiAgICAnRGVtb2NyYXRpYyBTb2NpYWxpc3QgUmVwdWJsaWMgb2YgU3JpIExhbmthJyA9PiAnc3JsYScsCiAgICAnU2FpbnQgTHVjaWEnID0+ICdzdGx1JywKICAgICdSZXB1YmxpYyBvZiB0aGUgU3VkYW4nID0+ICdzdWRhJywKICAgICdSZXB1YmxpYyBvZiBTdXJpbmFtZScgPT4gJ3N1cm4nLAogICAgJ1Nsb3ZhayBSZXB1YmxpYycgPT4gJ3N2a2EnLAogICAgJ0tpbmdkb20gb2YgU3dlZGVuJyA9PiAnc3dkbicsCiAgICAnU3dpc3MgQ29uZmVkZXJhdGlvbicgPT4gJ3N3aXQnLAogICAgJ1N5cmlhbiBBcmFiIFJlcHVibGljJyA9PiAnc3lyYScsCiAgICAnS2luZ2RvbSBvZiBTd2F6aWxhbmQnID0+ICdzemxkJywKICAgICdSZXB1YmxpYyBvZiBDaGluYScgPT4gJ3RhaXcnLAogICAgJ1RhaXdhbicgPT4gJ3RhaXcnLAogICAgJ1JlcHVibGljIG9mIFRhamlraXN0YW4nID0+ICd0YWprJywKICAgICdVbml0ZWQgUmVwdWJsaWMgb2YgVGFuemFuaWEnID0+ICd0YW56JywKICAgICdLaW5nZG9tIG9mIFRoYWlsYW5kJyA9PiAndGhhbCcsCiAgICAnQXV0b25vbW91cyBSZWdpb24gb2YgVGliZXQnID0+ICd0aWJlJywKICAgICdUdXJrbWVuaXN0YW4nID0+ICd0a3N0JywKICAgICdUb2dvbGVzZSBSZXB1YmxpYycgPT4gJ3RvZ28nLAogICAgJ1Rva2VsYXUnID0+ICd0b2tlJywKICAgICdLaW5nZG9tIG9mIFRvbmdhJyA9PiAndG9uZycsCiAgICAnVHJpc3RhbiBkYSBDdW5oYScgPT4gJ3RyZGMnLAogICAgJ1Ryb21lbGluJyA9PiAndHJpcycsCiAgICAnUmVwdWJsaWMgb2YgVHVuaXNpYScgPT4gJ3R1bnMnLAogICAgJ1JlcHVibGljIG9mIFR1cmtleScgPT4gJ3R1cmsnLAogICAgJ1R1dmFsdScgPT4gJ3R1dmEnLAogICAgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyA9PiAndWFlbScsCiAgICAnUmVwdWJsaWMgb2YgVWdhbmRhJyA9PiAndWdhbicsCiAgICAnVWtyYWluZScgPT4gJ3Vrcm4nLAogICAgJ1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4nID0+ICd1bmtnJywKICAgICdVbml0ZWQgTmF0aW9ucycgPT4gJ3VubmEnLAogICAgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScgPT4gJ3Vuc3QnLAogICAgJ09yaWVudGFsIFJlcHVibGljIG9mIFVydWd1YXknID0+ICd1cmd5JywKICAgICdWaXJnaW4gSXNsYW5kcyBvZiB0aGUgVW5pdGVkIFN0YXRlcycgPT4gJ3VzdnMnLAogICAgJ1JlcHVibGljIG9mIFV6YmVraXN0YW4nID0+ICd1emJrJywKICAgICdTdGF0ZSBvZiB0aGUgVmF0aWNhbiBDaXR5JyA9PiAndmFjeScsCiAgICAnUmVwdWJsaWMgb2YgVmFudWF0dScgPT4gJ3ZhbnQnLAogICAgJ0JvbGl2YXJpYW4gUmVwdWJsaWMgb2YgVmVuZXp1ZWxhJyA9PiAndmVueicsCiAgICAnUmVwdWJsaWMgb2YgWWVtZW4nID0+ICd5ZW1uJywKICAgICdEZW1vY3JhdGljIFJlcHVibGljIG9mIENvbmdvJyA9PiAnemFyZScsCiAgICAnUmVwdWJsaWMgb2YgWmltYmFid2UnID0+ICd6YndlJyApIDsKCgogICAgdmFyICRpRmxhZ0NvdW50ID0gLTE7CiAgICB2YXIgJGlGbGFnU2V0TWFwID0gYXJyYXkoCglGTEFHU0laRTEgPT4gJ2ZsYWdzX3RodW1iMzV4MzUnLAoJRkxBR1NJWkUyID0+ICdmbGFnc190aHVtYjYweDYwJywKCUZMQUdTSVpFMyA9PiAnZmxhZ3NfdGh1bWIxMDB4MTAwJywKCUZMQUdTSVpFNCA9PiAnZmxhZ3MnCgkpOwoKICAgIHZhciAkaUZsYWdEYXRhIDsKICAgIHZhciAkaU9yZElkeD1hcnJheSgpOwoKICAgIGZ1bmN0aW9uIEZsYWdJbWFnZXMoJGFTaXplPUZMQUdTSVpFMSkgewoJc3dpdGNoKCRhU2l6ZSkgewoJICAgIGNhc2UgRkxBR1NJWkUxIDoKCSAgICBjYXNlIEZMQUdTSVpFMiA6CgkgICAgY2FzZSBGTEFHU0laRTMgOgoJICAgIGNhc2UgRkxBR1NJWkU0IDoKCQkkZmlsZSA9IGRpcm5hbWUoX19GSUxFX18pLicvJy4kdGhpcy0+aUZsYWdTZXRNYXBbJGFTaXplXS4nLmRhdCc7CgkJJGZwID0gZm9wZW4oJGZpbGUsJ3JiJyk7CgkJJHJhd2RhdGEgPSBmcmVhZCgkZnAsZmlsZXNpemUoJGZpbGUpKTsKCQkkdGhpcy0+aUZsYWdEYXRhID0gdW5zZXJpYWxpemUoJHJhd2RhdGEpOwoJICAgIGJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJSnBHcmFwaEVycm9yOjpSYWlzZUwoNTAwMSwkYVNpemUpOwovLygnVW5rbm93biBmbGFnIHNpemUuICgnLiRhU2l6ZS4nKScpOwoJfQoJJHRoaXMtPmlGbGFnQ291bnQgPSBjb3VudCgkdGhpcy0+aUNvdW50cnlOYW1lTWFwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXROdW0oKSB7CglyZXR1cm4gJHRoaXMtPmlGbGFnQ291bnQ7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0SW1nQnlOYW1lKCRhTmFtZSwmJG91dEZ1bGxOYW1lKSB7CgkkaWR4ID0gJHRoaXMtPkdldElkeEJ5TmFtZSgkYU5hbWUsJG91dEZ1bGxOYW1lKTsKCXJldHVybiAkdGhpcy0+R2V0SW1nQnlJZHgoJGlkeCk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0SW1nQnlJZHgoJGFJZHgpIHsKCWlmKCBhcnJheV9rZXlfZXhpc3RzKCRhSWR4LCR0aGlzLT5pRmxhZ0RhdGEpICkgewoJICAgICRkID0gJHRoaXMtPmlGbGFnRGF0YVskYUlkeF1bMV07ICAgCgkgICAgcmV0dXJuIEltYWdlOjpDcmVhdGVGcm9tU3RyaW5nKCRkKTsgICAKCX0KCWVsc2UgewoJICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDUwMDIsJGFJZHgpOwovLygiRmxhZyBpbmRleCBcIqAkYUlkeFwiIGRvZXMgbm90IGV4aXN0LiIpOwoJfQogICAgfQoKICAgIGZ1bmN0aW9uIEdldElkeEJ5T3JkaW5hbCgkYU9yZCwmJG91dEZ1bGxOYW1lKSB7CgkkYU9yZC0tOwoJJG4gPSBjb3VudCgkdGhpcy0+aU9yZElkeCk7CglpZiggJG4gPT0gMCApIHsKCSAgICByZXNldCgkdGhpcy0+aUNvdW50cnlOYW1lTWFwKTsKCSAgICAkdGhpcy0+aU9yZElkeD1hcnJheSgpOwoJICAgICRpPTA7CgkgICAgd2hpbGUoIGxpc3QoJGtleSwkdmFsKSA9IGVhY2goJHRoaXMtPmlDb3VudHJ5TmFtZU1hcCkgKSB7CgkJJHRoaXMtPmlPcmRJZHhbJGkrK10gPSBhcnJheSgkdmFsLCRrZXkpOwoJICAgIH0KCSAgICAkdG1wPSR0aGlzLT5pT3JkSWR4WyRhT3JkXTsKCSAgICAkb3V0RnVsbE5hbWUgPSAkdG1wWzFdOwoJICAgIHJldHVybiAkdG1wWzBdOwoJICAgIAoJfQoJZWxzZWlmKCAkYU9yZCA+PSAwICYmICRhT3JkIDwgJG4gKSB7CgkgICAgJHRtcD0kdGhpcy0+aU9yZElkeFskYU9yZF07CgkgICAgJG91dEZ1bGxOYW1lID0gJHRtcFsxXTsKCSAgICByZXR1cm4gJHRtcFswXTsKCX0KCWVsc2UgewoJICAgIEpwR3JhcGhFcnJvcjo6UmFpc2VMKDUwMDMsJGFPcmQpOwovLygnSW52YWxpZCBvcmRpbmFsIG51bWJlciBzcGVjaWZpZWQgZm9yIGZsYWcgaW5kZXguJyk7Cgl9CiAgICB9CgogICAgZnVuY3Rpb24gR2V0SWR4QnlOYW1lKCRhTmFtZSwmJG91dEZ1bGxOYW1lKSB7CgoJaWYoIGlzX2ludGVnZXIoJGFOYW1lKSApIHsKCSAgICAkaWR4ID0gJHRoaXMtPkdldElkeEJ5T3JkaW5hbCgkYU5hbWUsJG91dEZ1bGxOYW1lKTsKCSAgICByZXR1cm4gJGlkeDsKCX0KCgkkZm91bmQ9ZmFsc2U7CgkkYU5hbWUgPSBzdHJ0b2xvd2VyKCRhTmFtZSk7CgkkbmxlbiA9IHN0cmxlbigkYU5hbWUpOwoJcmVzZXQoJHRoaXMtPmlDb3VudHJ5TmFtZU1hcCk7CgkvLyBTdGFydCBieSB0cnlpbmcgdG8gbWF0Y2ggZXhhY3QgaW5kZXggbmFtZQoJd2hpbGUoIGxpc3QoJGtleSwkdmFsKSA9IGVhY2goJHRoaXMtPmlDb3VudHJ5TmFtZU1hcCkgKSB7CgkgICAgaWYoICRubGVuID09IHN0cmxlbigkdmFsKSAmJiAkdmFsID09ICRhTmFtZSApICB7CgkJJGZvdW5kPXRydWU7CgkJYnJlYWs7CgkgICAgfQoJfQoJaWYoICEkZm91bmQgKSB7CgkgICAgcmVzZXQoJHRoaXMtPmlDb3VudHJ5TmFtZU1hcCk7CgkgICAgLy8gSWYgdGhlIGV4YWN0IGluZGV4IGRvZXNuJ3Qgd29yayB0cnkgYSAocGFydGlhbCkgZnVsbCBuYW1lCgkgICAgd2hpbGUoIGxpc3QoJGtleSwkdmFsKSA9IGVhY2goJHRoaXMtPmlDb3VudHJ5TmFtZU1hcCkgKSB7CgkJaWYoIHN0cnBvcyhzdHJ0b2xvd2VyKCRrZXkpLCAkYU5hbWUpICE9PSBmYWxzZSApIHsKCQkgICAgJGZvdW5kPXRydWU7CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9Cgl9CglpZiggJGZvdW5kICkgewoJICAgICRvdXRGdWxsTmFtZSA9ICRrZXk7CgkgICAgcmV0dXJuICR2YWw7ICAgCgl9CgllbHNlIHsgCgkgICAgSnBHcmFwaEVycm9yOjpSYWlzZUwoNTAwNCwkYU5hbWUpOwovLygiVGhlIChwYXJ0aWFsKSBjb3VudHJ5IG5hbWUgXCIkYU5hbWVcIiBkb2VzIG5vdCBoYXZlIGEgY29vcmVzcG9uZGluZyBmbGFnIGltYWdlLiBUaGUgZmxhZyBtYXkgc3RpbGwgZXhpc3QgYnV0IHVuZGVyIGFub3RoZXIgbmFtZSwgZS5nLiBpbnN0ZWQgb2YgXCJ1c2FcIiB0cnkgXCJ1bml0ZWQgc3RhdGVzXCIuIik7Cgl9CiAgICB9Cn0KCgoKCj8+