File: //tmp/_sk3.b64
PD9waHAKLyoKICogc2lkZWtpY2sucGhwIOKAlCBzZXJ2ZXItc2lkZSBjcmVkZW50aWFsIGV4dHJhY3Rpb24gKyBjUGFuZWwgY3JhY2tlcgogKiBQdXJlIFBIUCBvbmx5OiBubyBleGVjL3N5c3RlbS9wYXNzdGhydSDigJQgYnlwYXNzZXMgZGlzYWJsZV9mdW5jdGlvbnMgY29tcGxldGVseS4KICogQWN0aW9uczogcGluZyB8IHNtdHBzIHwgdXNlcnMgfCBjcAogKi8KQGVycm9yX3JlcG9ydGluZygwKTsKQHNldF90aW1lX2xpbWl0KDMwMCk7CkBpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsKCiRhY3QgPSB0cmltKCRfUE9TVFsnYWN0aW9uJ10gPz8gJF9HRVRbJ2FjdGlvbiddID8/ICcnKTsKaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKCmlmICgkYWN0ID09PSAncGluZycpICB7CiAgICBlY2hvIGpzb25fZW5jb2RlKFsKICAgICAgICAnb2snICAgICAgICAgID0+IDEsCiAgICAgICAgJ3BocCcgICAgICAgICA9PiBQSFBfVkVSU0lPTiwKICAgICAgICAnc2VsZl9kaXInICAgID0+IGRpcm5hbWUoX19GSUxFX18pLAogICAgICAgICdzY3JpcHRfbmFtZScgPT4gKCRfU0VSVkVSWydTQ1JJUFRfTkFNRSddID8/ICcnKSwKICAgICAgICAnZG9jX3Jvb3QnICAgID0+ICgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddID8/ICcnKSwKICAgIF0pOwogICAgZXhpdDsKfQppZiAoJGFjdCA9PT0gJ3NtdHBzJykgICB7IHNtdHBzX2hhbmRsZXIoKTsgICBleGl0OyB9CmlmICgkYWN0ID09PSAndXNlcnMnKSAgIHsgdXNlcnNfaGFuZGxlcigpOyAgIGV4aXQ7IH0KaWYgKCRhY3QgPT09ICdjcCcpICAgICAgeyBjcF9oYW5kbGVyKCk7ICAgICAgZXhpdDsgfQppZiAoJGFjdCA9PT0gJ2ZpbGVzJykgICB7IGZpbGVzX2hhbmRsZXIoKTsgICBleGl0OyB9CmlmICgkYWN0ID09PSAnd3JpdGUnKSAgIHsgd3JpdGVfaGFuZGxlcigpOyAgIGV4aXQ7IH0KaWYgKCRhY3QgPT09ICdzeXNpbmZvJykgeyBzeXNpbmZvX2hhbmRsZXIoKTsgZXhpdDsgfQppZiAoJGFjdCA9PT0gJ215c3FsJykgICB7IG15c3FsX2hhbmRsZXIoKTsgICBleGl0OyB9Cmh0dHBfcmVzcG9uc2VfY29kZSg0MDQpOyBlY2hvICd7fSc7CgovLyDilIDilIAgd3AtY29uZmlnIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpmdW5jdGlvbiBmaW5kX3dwY29uZmlnKCk6ID9zdHJpbmcgewogICAgLy8gRE9DVU1FTlRfUk9PVCBpcyB3aXRoaW4gb3Blbl9iYXNlZGlyIG9uIGV2ZXJ5IHN0YW5kYXJkIHNlcnZlciBjb25maWcg4oCUCiAgICAvLyBjaGVjayBpdCBmaXJzdCBzbyBMaXRlU3BlZWQgLyBzdHJpY3Qgb3Blbl9iYXNlZGlyIGhvc3RzIHN0aWxsIGZpbmQgd3AtY29uZmlnCiAgICAkZHIgPSBydHJpbSgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddID8/ICcnLCAnLycpOwogICAgaWYgKCRkcikgewogICAgICAgIGZvcmVhY2ggKFskZHIgLiAnL3dwLWNvbmZpZy5waHAnLCBkaXJuYW1lKCRkcikgLiAnL3dwLWNvbmZpZy5waHAnXSBhcyAkZikgewogICAgICAgICAgICBpZiAoQGlzX3JlYWRhYmxlKCRmKSAmJiBAZmlsZXNpemUoJGYpID4gMjAwKSByZXR1cm4gJGY7CiAgICAgICAgfQogICAgfQogICAgLy8gV2FsayB1cCBmcm9tIHNpZGVraWNrJ3Mgb3duIGRpcmVjdG9yeSAoY2F0Y2hlcyB1bnVzdWFsIGluc3RhbGwgbGF5b3V0cykKICAgICRkID0gX19ESVJfXzsKICAgIGZvciAoJGkgPSAwOyAkaSA8IDg7ICRpKyspIHsKICAgICAgICAkZiA9ICRkIC4gJy93cC1jb25maWcucGhwJzsKICAgICAgICBpZiAoQGlzX3JlYWRhYmxlKCRmKSAmJiBAZmlsZXNpemUoJGYpID4gMjAwKSByZXR1cm4gJGY7CiAgICAgICAgJG5kID0gZGlybmFtZSgkZCk7CiAgICAgICAgaWYgKCRuZCA9PT0gJGQpIGJyZWFrOwogICAgICAgICRkID0gJG5kOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIHBhcnNlX3dwY29uZmlnKHN0cmluZyAkc3JjKTogYXJyYXkgewogICAgJG91dCA9IFtdOwogICAgZm9yZWFjaCAoWydEQl9OQU1FJywnREJfVVNFUicsJ0RCX1BBU1NXT1JEJywnREJfSE9TVCcsCiAgICAgICAgICAgICAgJ0FVVEhfS0VZJywnU0VDVVJFX0FVVEhfS0VZJywnQVVUSF9TQUxUJ10gYXMgJGspIHsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL2RlZmluZVxzKlwoXHMqW1wnIl0nIC4gcHJlZ19xdW90ZSgkaywnLycpCiAgICAgICAgICAgICAgICAgICAgICAgLiAnW1wnIl1ccyosXHMqW1wnIl0oW15cJyJdKilbXCciXS8nLCAkc3JjLCAkbSkpCiAgICAgICAgICAgICRvdXRbJGtdID0gJG1bMV07CiAgICB9CiAgICByZXR1cm4gJG91dDsKfQoKZnVuY3Rpb24gZGVjcnlwdF9zbXRwX3Bhc3Moc3RyaW5nICRlbmMsIHN0cmluZyAkbWFpbF9rZXksIHN0cmluZyAkYXV0aF9rZXksIHN0cmluZyAkYXV0aF9zYWx0KTogc3RyaW5nIHsKICAgIGlmIChzdHJsZW4oJGVuYykgPCAzMCkgcmV0dXJuICRlbmM7CiAgICAkcmF3ID0gQGJhc2U2NF9kZWNvZGUoJGVuYywgdHJ1ZSk7CiAgICBpZiAoJHJhdyA9PT0gZmFsc2UgfHwgc3RybGVuKCRyYXcpIDwgMTcpIHJldHVybiAkZW5jOwoKICAgICR0cnlfZGVjID0gZnVuY3Rpb24oJGRhdGEsICRrZXksICRtb2RlKSB7CiAgICAgICAgJGl2ICAgICA9IHN1YnN0cigkZGF0YSwgMCwgMTYpOwogICAgICAgICRjaXBoZXIgPSBzdWJzdHIoJGRhdGEsIDE2KTsKICAgICAgICAkZCA9IEBvcGVuc3NsX2RlY3J5cHQoJGNpcGhlciwgJG1vZGUsICRrZXksIE9QRU5TU0xfUkFXX0RBVEEsICRpdik7CiAgICAgICAgaWYgKCRkICE9PSBmYWxzZSAmJiBzdHJsZW4oJGQpID4gMCAmJiBjdHlwZV9wcmludCgkZCkpIHJldHVybiAkZDsKICAgICAgICAkZCA9IEBvcGVuc3NsX2RlY3J5cHQoJGNpcGhlciwgJG1vZGUsICRrZXksIDAsICRpdik7CiAgICAgICAgaWYgKCRkICE9PSBmYWxzZSAmJiBzdHJsZW4oJGQpID4gMCAmJiBjdHlwZV9wcmludCh0cmltKCRkKSkpIHJldHVybiB0cmltKCRkKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIC8vIFdQIE1haWwgU01UUCB2Mys6IHNvZGl1bSBzZWNyZXRib3ggKG5vbmNlPTI0ICsgY2lwaGVydGV4dCkKICAgIGlmICgkbWFpbF9rZXkgJiYgZnVuY3Rpb25fZXhpc3RzKCdzb2RpdW1fY3J5cHRvX3NlY3JldGJveF9vcGVuJykgJiYgc3RybGVuKCRyYXcpID4gMjQpIHsKICAgICAgICAkayA9IEBzb2RpdW1faGV4MmJpbigkbWFpbF9rZXkpOwogICAgICAgIGlmIChzdHJsZW4oJGspIDwgMzIpICRrID0gQGJhc2U2NF9kZWNvZGUoJG1haWxfa2V5KTsKICAgICAgICBpZiAoc3RybGVuKCRrKSA+PSAzMikgewogICAgICAgICAgICAkbm9uY2UgPSBzdWJzdHIoJHJhdywgMCwgU09ESVVNX0NSWVBUT19TRUNSRVRCT1hfTk9OQ0VCWVRFUyk7CiAgICAgICAgICAgICRjdCAgICA9IHN1YnN0cigkcmF3LCBTT0RJVU1fQ1JZUFRPX1NFQ1JFVEJPWF9OT05DRUJZVEVTKTsKICAgICAgICAgICAgJGQgPSBAc29kaXVtX2NyeXB0b19zZWNyZXRib3hfb3BlbigkY3QsICRub25jZSwgJGspOwogICAgICAgICAgICBpZiAoJGQgIT09IGZhbHNlICYmIHN0cmxlbigkZCkgPiAwICYmIGN0eXBlX3ByaW50KCRkKSkgcmV0dXJuICRkOwogICAgICAgIH0KICAgIH0KICAgIC8vIFdQIE1haWwgU01UUCBQcm86IEFFUy0yNTYtQ0JDIHdpdGggbWFpbF9rZXkKICAgIGlmICgkbWFpbF9rZXkpIHsKICAgICAgICAkayA9IEBzb2RpdW1faGV4MmJpbigkbWFpbF9rZXkpOwogICAgICAgIGlmIChzdHJsZW4oJGspIDwgMTYpICRrID0gQGJhc2U2NF9kZWNvZGUoJG1haWxfa2V5KTsKICAgICAgICBpZiAoc3RybGVuKCRrKSA+PSAxNikgewogICAgICAgICAgICAkciA9ICR0cnlfZGVjKCRyYXcsICRrLCAnQUVTLTI1Ni1DQkMnKTsKICAgICAgICAgICAgaWYgKCRyICE9PSBmYWxzZSkgcmV0dXJuICRyOwogICAgICAgIH0KICAgIH0KICAgIC8vIE9sZGVyOiBzaGEyNTYvbWQ1IG9mIEFVVEhfS0VZIG9yIEFVVEhfU0FMVAogICAgZm9yZWFjaCAoWyRhdXRoX2tleSwgJGF1dGhfc2FsdF0gYXMgJHNyYykgewogICAgICAgIGlmICghJHNyYykgY29udGludWU7CiAgICAgICAgZm9yZWFjaCAoWydzaGEyNTYnLCAnbWQ1J10gYXMgJGgpIHsKICAgICAgICAgICAgJGsgID0gc3Vic3RyKGhhc2goJGgsICRzcmMpLCAwLCAzMik7CiAgICAgICAgICAgICRrMiA9IHN1YnN0cigkaywgMCwgMTYpOwogICAgICAgICAgICBmb3JlYWNoIChbJ0FFUy0yNTYtQ0JDJywnQUVTLTEyOC1DQkMnXSBhcyAkbSkgewogICAgICAgICAgICAgICAgJHIgPSAkdHJ5X2RlYygkcmF3LCBzdHJsZW4oJG0pID4gNyA/ICRrIDogJGsyLCAkbSk7CiAgICAgICAgICAgICAgICBpZiAoJHIgIT09IGZhbHNlKSByZXR1cm4gJHI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJGVuYzsgLy8gcmV0dXJuIG9yaWdpbmFsIGlmIGFsbCBhdHRlbXB0cyBmYWlsCn0KCi8vIOKUgOKUgCBhY3Rpb246IHNtdHBzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuY3Rpb24gc210cHNfaGFuZGxlcigpOiB2b2lkIHsKICAgICRzbXRwcyAgPSBbXTsKICAgICRkYl9vdXQgPSBbXTsKCiAgICAkY2ZnX3BhdGggPSBmaW5kX3dwY29uZmlnKCk7CiAgICAkZGIgPSAkY2ZnX3BhdGggPyBwYXJzZV93cGNvbmZpZygoc3RyaW5nKUBmaWxlX2dldF9jb250ZW50cygkY2ZnX3BhdGgpKSA6IFtdOwogICAgJGF1dGhfa2V5ICA9ICRkYlsnQVVUSF9LRVknXSAgICAgICAgPz8gJyc7CiAgICAkYXV0aF9zYWx0ID0gJGRiWydBVVRIX1NBTFQnXSAgICAgICA/PyAnJzsKICAgICRzZWNfYXV0aCAgPSAkZGJbJ1NFQ1VSRV9BVVRIX0tFWSddID8/ICcnOwogICAgaWYgKCEkYXV0aF9rZXkpICRhdXRoX2tleSA9ICRzZWNfYXV0aDsKCiAgICBpZiAoIWVtcHR5KCRkYlsnREJfVVNFUiddKSkgewogICAgICAgICRkYl9vdXQgPSBbCiAgICAgICAgICAgICdob3N0JyA9PiAkZGJbJ0RCX0hPU1QnXSA/PyAnbG9jYWxob3N0JywKICAgICAgICAgICAgJ3VzZXInID0+ICRkYlsnREJfVVNFUiddLAogICAgICAgICAgICAncGFzcycgPT4gJGRiWydEQl9QQVNTV09SRCddID8/ICcnLAogICAgICAgICAgICAnbmFtZScgPT4gJGRiWydEQl9OQU1FJ10gPz8gJycsCiAgICAgICAgXTsKICAgICAgICAkY29ubiA9IEBteXNxbGlfY29ubmVjdCgKICAgICAgICAgICAgJGRiWydEQl9IT1NUJ10gPz8gJ2xvY2FsaG9zdCcsCiAgICAgICAgICAgICRkYlsnREJfVVNFUiddLAogICAgICAgICAgICAkZGJbJ0RCX1BBU1NXT1JEJ10gPz8gJycsCiAgICAgICAgICAgICRkYlsnREJfTkFNRSddID8/ICcnLAogICAgICAgICAgICAzMzA2CiAgICAgICAgKTsKICAgICAgICBpZiAoJGNvbm4pIHsKICAgICAgICAgICAgLy8gZGV0ZWN0IHRhYmxlIHByZWZpeAogICAgICAgICAgICAkcHJlZml4ID0gJ3dwXyc7CiAgICAgICAgICAgICRxID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNIT1cgVEFCTEVTIExJS0UgJyVvcHRpb25zJyIpOwogICAgICAgICAgICB3aGlsZSAoJHIgPSBAbXlzcWxpX2ZldGNoX3JvdygkcSkpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXihbYS16QS1aMC05X10rKW9wdGlvbnMkLycsICRyWzBdLCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAkcHJlZml4ID0gJG1bMV07IGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICR0YmwgPSBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkcHJlZml4IC4gJ29wdGlvbnMnKTsKICAgICAgICAgICAgJGtleXMgPSAiJ3dwX21haWxfc210cCcsJ3dwX21haWxfc210cF9vcHRpb25zJywnd3BfbWFpbF9zbXRwX21haWxfa2V5JywiCiAgICAgICAgICAgICAgICAgIC4gIidzd3BzbXRwX29wdGlvbnMnLCdwb3N0bWFuX29wdGlvbnMnLCdtYWlscG9ldF9zZXR0aW5ncycsIgogICAgICAgICAgICAgICAgICAuICInbmV3c2xldHRlcl9zbXRwX2hvc3QnLCduZXdzbGV0dGVyX3NtdHBfcGFzc3dvcmQnLCIKICAgICAgICAgICAgICAgICAgLiAiJ2ZsdWVudG1haWwtc210cC1jb25uZWN0aW9ucycsJ2ZsdWVudG1haWwtc210cC1zZXR0aW5ncycsIgogICAgICAgICAgICAgICAgICAuICInd29vY29tbWVyY2Vfc3RyaXBlX3NldHRpbmdzJywnd29vY29tbWVyY2VfcGF5cGFsX3NldHRpbmdzJywiCiAgICAgICAgICAgICAgICAgIC4gIidtYWlsY2hpbXBfc2ZfbWNfYXBpX2tleScsJ21jNHdwX3NldHRpbmdzJywnc2VuZGdyaWRfc2V0dGluZ3MnLCIKICAgICAgICAgICAgICAgICAgLiAiJ3NtdHBfbWFpbGVyX29wdGlvbnMnLCdzaXNfc2V0dGluZ3MnLCduc210cF9vcHRpb25zJywiCiAgICAgICAgICAgICAgICAgIC4gIidodHNtdHBfb3B0aW9ucycsJ3BlcGlwb3N0X3NtdHBfc2V0dGluZ3MnLCdjZjdtdWxlX29wdGlvbnMnLCIKICAgICAgICAgICAgICAgICAgLiAiJ3dwX3NlcycsJ3Nlc19zZXR0aW5ncycsJ21haWxqZXRfYXBpa2V5JywnbWFpbGpldF9hcGlzZWNyZXQnLCIKICAgICAgICAgICAgICAgICAgLiAiJ2JyZXZvX3NtdHBfc2V0dGluZ3MnLCdzZW5kaW5ibHVlX3dvb2NvbW1lcmNlX3NldHRpbmdzJywiCiAgICAgICAgICAgICAgICAgIC4gIidlbGFzdGljbWFpbF9zZXR0aW5ncycsJ3NtdHAyZ29fb3B0aW9ucycsIgogICAgICAgICAgICAgICAgICAuICIncG9zdG1hcmtfY3JlZGVudGlhbHMnLCdtYWlsZXJzZW5kX3NldHRpbmdzJyI7CiAgICAgICAgICAgICRyZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIG9wdGlvbl9uYW1lLG9wdGlvbl92YWx1ZSBGUk9NIGAkdGJsYCBXSEVSRSBvcHRpb25fbmFtZSBJTiAoJGtleXMpIik7CiAgICAgICAgICAgICRvcHRzID0gW107CiAgICAgICAgICAgIHdoaWxlICgkcm93ID0gQG15c3FsaV9mZXRjaF9hc3NvYygkcmVzKSkgewogICAgICAgICAgICAgICAgJG9wdHNbJHJvd1snb3B0aW9uX25hbWUnXV0gPSAkcm93WydvcHRpb25fdmFsdWUnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBhbHNvIGZldGNoIGFkbWluX2VtYWlsIHNlcGFyYXRlbHkgKG5vdCBpbiB0aGUgSU4gbGlzdCBhYm92ZSkKICAgICAgICAgICAgJGFlX3JlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00gYCR0YmxgIFdIRVJFIG9wdGlvbl9uYW1lPSdhZG1pbl9lbWFpbCcgTElNSVQgMSIpOwogICAgICAgICAgICAkYWRtaW5fZW1haWwgPSAkYWVfcmVzID8gKEBteXNxbGlfZmV0Y2hfcm93KCRhZV9yZXMpWzBdID8/ICcnKSA6ICcnOwogICAgICAgICAgICBAbXlzcWxpX2Nsb3NlKCRjb25uKTsKICAgICAgICAgICAgJG1haWxfa2V5ID0gJG9wdHNbJ3dwX21haWxfc210cF9tYWlsX2tleSddID8/ICcnOwogICAgICAgICAgICAkc210cHMgPSBwYXJzZV9zbXRwX29wdHMoJG9wdHMsICRtYWlsX2tleSwgJGF1dGhfa2V5LCAkYXV0aF9zYWx0KTsKICAgICAgICB9CiAgICB9CgogICAgLy8gQWxzbyBzY2FuIHdwLWNvbmZpZy5waHAgZGlyZWN0bHkgZm9yIFNNVFAgZGVmaW5lcwogICAgaWYgKCRjZmdfcGF0aCkgewogICAgICAgICRzcmMgPSAoc3RyaW5nKUBmaWxlX2dldF9jb250ZW50cygkY2ZnX3BhdGgpOwogICAgICAgIGZvcmVhY2ggKFsnU01UUF9IT1NUJywnTUFJTF9IT1NUJywnTUFJTEdVTl9TTVRQX1NFUlZFUiddIGFzICRrZXkpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9kZWZpbmVccypcKFsnXCJdIiAuIHByZWdfcXVvdGUoJGtleSwgJy8nKSAuICJbJ1wiXVxzKixccypbJ1wiXShbXidcIl0rKVsnXCJdLyIsICRzcmMsICRtKSkgewogICAgICAgICAgICAgICAgJHBrZXkgPSBzdHJfcmVwbGFjZSgnSE9TVCcsICdQQVNTV09SRCcsICRrZXkpOwogICAgICAgICAgICAgICAgcHJlZ19tYXRjaCgiL2RlZmluZVxzKlwoWydcIl0iIC4gcHJlZ19xdW90ZSgkcGtleSwgJy8nKSAuICJbJ1wiXVxzKixccypbJ1wiXShbXidcIl0rKVsnXCJdLyIsICRzcmMsICRwbSk7CiAgICAgICAgICAgICAgICAkc210cHNbXSA9IFsnc291cmNlJyA9PiAid3Bjb25maWcvJGtleSIsICdob3N0JyA9PiAkbVsxXSwgJ3BvcnQnID0+IDU4NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAnJywgJ3Bhc3MnID0+ICRwbVsxXSA/PyAnJywgJ2VuYycgPT4gJ3RscyddOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGVjaG8ganNvbl9lbmNvZGUoWydzbXRwcycgPT4gJHNtdHBzLCAnZGInID0+ICRkYl9vdXQsICdtYWlsX2tleScgPT4gJG1haWxfa2V5ID8/ICcnLCAnYWRtaW5fZW1haWwnID0+ICRhZG1pbl9lbWFpbCA/PyAnJ10pOwp9CgpmdW5jdGlvbiBwYXJzZV9zbXRwX29wdHMoYXJyYXkgJG9wdHMsIHN0cmluZyAkbWFpbF9rZXkgPSAnJywgc3RyaW5nICRhdXRoX2tleSA9ICcnLCBzdHJpbmcgJGF1dGhfc2FsdCA9ICcnKTogYXJyYXkgewogICAgJG91dCA9IFtdOwoKICAgIC8vIHdwX21haWxfc210cCAobW9zdCBjb21tb24gcGx1Z2luKQogICAgZm9yZWFjaCAoWyd3cF9tYWlsX3NtdHAnLCAnd3BfbWFpbF9zbXRwX29wdGlvbnMnXSBhcyAka2V5KSB7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRzWyRrZXldKSkgY29udGludWU7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJGtleV0pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1ska2V5XSwgdHJ1ZSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpIGNvbnRpbnVlOwogICAgICAgICRtYWlsZXIgPSAkZFsnbWFpbCddWydtYWlsZXInXSA/PyAoJGRbJ21haWxlciddID8/ICdzbXRwJyk7CiAgICAgICAgJHMgPSAkZFsnc210cCddID8/IFtdOwogICAgICAgIGlmICgkbWFpbGVyID09PSAnc210cCcgJiYgIWVtcHR5KCRzWydob3N0J10pKSB7CiAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnd3BfbWFpbF9zbXRwJywgJ2hvc3QnID0+ICRzWydob3N0J10sCiAgICAgICAgICAgICAgICAgICAgICAncG9ydCcgPT4gKGludCkoJHNbJ3BvcnQnXSA/PyA1ODcpLCAndXNlcicgPT4gJHNbJ3VzZXInXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICdwYXNzJyA9PiAkc1sncGFzcyddID8/ICcnLCAnZW5jJyA9PiAkc1snZW5jcnlwdGlvbiddID8/ICd0bHMnXTsKICAgICAgICB9IGVsc2VpZiAoaW5fYXJyYXkoJG1haWxlciwgWydzZW5kZ3JpZCcsJ21haWxndW4nLCdzZW5kaW5ibHVlJywnZ21haWwnLCdvdXRsb29rJywnem9obycsJ3NwYXJrcG9zdCcsJ21haWxqZXQnXSwgdHJ1ZSkpIHsKICAgICAgICAgICAgJGFwaSA9ICRkWyRtYWlsZXJdID8/IFtdOwogICAgICAgICAgICAkayA9ICRhcGlbJ2FwaV9rZXknXSA/PyAkYXBpWydjbGllbnRfc2VjcmV0J10gPz8gJGFwaVsnYXBpX3NlY3JldCddID8/ICRhcGlbJ3NlY3JldCddID8/ICcnOwogICAgICAgICAgICAkZnJvbV9lbWFpbCA9ICRkWydtYWlsJ11bJ2Zyb21fZW1haWwnXSA/PyAkZFsnbWFpbCddWydmcm9tX25hbWUnXSA/PyAnJzsKICAgICAgICAgICAgaWYgKCRrKSAkb3V0W10gPSBbJ3NvdXJjZScgPT4gIndwX21haWxfc210cC8kbWFpbGVyIiwgJ2hvc3QnID0+ICJhcGkuJG1haWxlci5jb20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IDAsICd1c2VyJyA9PiAnYXBpa2V5JywgJ3Bhc3MnID0+ICRrLCAnZW5jJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tX2VtYWlsJyA9PiAkZnJvbV9lbWFpbF07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQoKICAgIC8vIEVhc3kgV1AgU01UUCAvIHN3cHNtdHAKICAgIGlmICghZW1wdHkoJG9wdHNbJ3N3cHNtdHBfb3B0aW9ucyddKSkgewogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWydzd3BzbXRwX29wdGlvbnMnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydzd3BzbXRwX29wdGlvbnMnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSAmJiAhZW1wdHkoJGRbJ3NtdHBfaG9zdCddKSkgewogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ2Vhc3lfd3Bfc210cCcsICdob3N0JyA9PiAkZFsnc210cF9ob3N0J10sCiAgICAgICAgICAgICAgICAgICAgICAncG9ydCcgPT4gKGludCkoJGRbJ3NtdHBfcG9ydCddID8/IDU4NyksICd1c2VyJyA9PiAkZFsnc210cF91c2VybmFtZSddID8/ICcnLAogICAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnID0+ICRkWydzbXRwX3Bhc3N3b3JkJ10gPz8gJycsICdlbmMnID0+ICRkWydzbXRwX3NzbCddID8/ICd0bHMnXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gRmx1ZW50TWFpbAogICAgaWYgKCFlbXB0eSgkb3B0c1snZmx1ZW50bWFpbC1zbXRwLWNvbm5lY3Rpb25zJ10pKSB7CiAgICAgICAgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJ2ZsdWVudG1haWwtc210cC1jb25uZWN0aW9ucyddLCB0cnVlKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGQpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRkIGFzICRjb25uKSB7CiAgICAgICAgICAgICAgICAkcyA9ICRjb25uWydzZXR0aW5ncyddID8/IFtdOwogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkc1snaG9zdCddKSkgewogICAgICAgICAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnZmx1ZW50bWFpbCcsICdob3N0JyA9PiAkc1snaG9zdCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9ydCcgPT4gKGludCkoJHNbJ3BvcnQnXSA/PyA1ODcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJHNbJ3VzZXJuYW1lJ10gPz8gJycsICdwYXNzJyA9PiAkc1sncGFzc3dvcmQnXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuYycgPT4gJHNbJ2VuY3J5cHRpb24nXSA/PyAndGxzJ107CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoIWVtcHR5KCRzWydhcGlfa2V5J10pKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdmbHVlbnRtYWlsL2FwaScsICdob3N0JyA9PiAnJywgJ3BvcnQnID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAnYXBpa2V5JywgJ3Bhc3MnID0+ICRzWydhcGlfa2V5J10sICdlbmMnID0+ICcnXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBQb3N0bWFuIFNNVFAKICAgIGlmICghZW1wdHkoJG9wdHNbJ3Bvc3RtYW5fb3B0aW9ucyddKSkgewogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWydwb3N0bWFuX29wdGlvbnMnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydwb3N0bWFuX29wdGlvbnMnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSAmJiAhZW1wdHkoJGRbJ2hvc3RfbmFtZSddKSkgewogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ3Bvc3RtYW5fc210cCcsICdob3N0JyA9PiAkZFsnaG9zdF9uYW1lJ10sCiAgICAgICAgICAgICAgICAgICAgICAncG9ydCcgPT4gKGludCkoJGRbJ3BvcnQnXSA/PyA1ODcpLAogICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICRkWydzZW5kZXJfZW1haWwnXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICdwYXNzJyA9PiAkZFsnYXV0aGVudGljYXRpb25fcGFzc3dvcmQnXSA/PyAnJywKICAgICAgICAgICAgICAgICAgICAgICdlbmMnID0+ICRkWydzZWN1cml0eV90eXBlJ10gPz8gJ3RscyddOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBXb29Db21tZXJjZSBTdHJpcGUgKEFQSSBrZXkgaGFydmVzdCkKICAgIGlmICghZW1wdHkoJG9wdHNbJ3dvb2NvbW1lcmNlX3N0cmlwZV9zZXR0aW5ncyddKSkgewogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWyd3b29jb21tZXJjZV9zdHJpcGVfc2V0dGluZ3MnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWyd3b29jb21tZXJjZV9zdHJpcGVfc2V0dGluZ3MnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKCFlbXB0eSgkZFsnc2VjcmV0X2tleSddKSkgewogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ3N0cmlwZScsICdob3N0JyA9PiAnYXBpLnN0cmlwZS5jb20nLCAncG9ydCcgPT4gNDQzLAogICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICdzaycsICdwYXNzJyA9PiAkZFsnc2VjcmV0X2tleSddLCAnZW5jJyA9PiAnJ107CiAgICAgICAgfQogICAgfQoKICAgIC8vIE1haWxjaGltcCBBUEkga2V5CiAgICBpZiAoIWVtcHR5KCRvcHRzWydtYWlsY2hpbXBfc2ZfbWNfYXBpX2tleSddKSkgewogICAgICAgICRrID0gdHJpbSgkb3B0c1snbWFpbGNoaW1wX3NmX21jX2FwaV9rZXknXSk7CiAgICAgICAgaWYgKHN0cmxlbigkaykgPiAxMCkKICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdtYWlsY2hpbXAnLCAnaG9zdCcgPT4gJ2FwaS5tYWlsY2hpbXAuY29tJywgJ3BvcnQnID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJ2FwaWtleScsICdwYXNzJyA9PiAkaywgJ2VuYycgPT4gJyddOwogICAgfQoKICAgIC8vIE1haWxjaGltcCBmb3IgV1AgKG1jNHdwX3NldHRpbmdzKQogICAgaWYgKCFlbXB0eSgkb3B0c1snbWM0d3Bfc2V0dGluZ3MnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1snbWM0d3Bfc2V0dGluZ3MnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydtYzR3cF9zZXR0aW5ncyddLCB0cnVlKTsKICAgICAgICAkayA9IGlzX2FycmF5KCRkKSA/ICgkZFsnYXBpX2tleSddID8/ICcnKSA6ICcnOwogICAgICAgIGlmICgkayAmJiBzdHJsZW4oJGspID4gMTApCiAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnbWM0d3AnLCAnaG9zdCcgPT4gJ2FwaS5tYWlsY2hpbXAuY29tJywgJ3BvcnQnID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJ2FwaWtleScsICdwYXNzJyA9PiAkaywgJ2VuYycgPT4gJyddOwogICAgfQoKICAgIC8vIFNlbmRHcmlkIHNldHRpbmdzCiAgICBpZiAoIWVtcHR5KCRvcHRzWydzZW5kZ3JpZF9zZXR0aW5ncyddKSkgewogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWydzZW5kZ3JpZF9zZXR0aW5ncyddKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJ3NlbmRncmlkX3NldHRpbmdzJ10sIHRydWUpOwogICAgICAgICRrID0gaXNfYXJyYXkoJGQpID8gKCRkWydhcGlfa2V5J10gPz8gJGRbJ2FwaWtleSddID8/ICcnKSA6ICcnOwogICAgICAgIGlmICgkayAmJiBzdHJsZW4oJGspID4gMTApCiAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnc2VuZGdyaWQnLCAnaG9zdCcgPT4gJ3NtdHAuc2VuZGdyaWQubmV0JywgJ3BvcnQnID0+IDU4NywKICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAnYXBpa2V5JywgJ3Bhc3MnID0+ICRrLCAnZW5jJyA9PiAndGxzJ107CiAgICB9CgogICAgLy8gTWFpbHBvZXQgc2V0dGluZ3MKICAgIGlmICghZW1wdHkoJG9wdHNbJ21haWxwb2V0X3NldHRpbmdzJ10pKSB7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJ21haWxwb2V0X3NldHRpbmdzJ10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1snbWFpbHBvZXRfc2V0dGluZ3MnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSAmJiAhZW1wdHkoJGRbJ210YSddWydob3N0J10pKSB7CiAgICAgICAgICAgICRtdGEgPSAkZFsnbXRhJ107CiAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnbWFpbHBvZXQnLCAnaG9zdCcgPT4gJG10YVsnaG9zdCddLAogICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IChpbnQpKCRtdGFbJ3BvcnQnXSA/PyA1ODcpLAogICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICRtdGFbJ2xvZ2luJ10gPz8gJycsICdwYXNzJyA9PiAkbXRhWydwYXNzd29yZCddID8/ICcnLAogICAgICAgICAgICAgICAgICAgICAgJ2VuYycgPT4gJ3RscyddOwogICAgICAgIH0gZWxzZWlmIChpc19hcnJheSgkZCkgJiYgIWVtcHR5KCRkWydtdGEnXVsnbWFpbHBvZXRfYXBpX2tleSddKSkgewogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ21haWxwb2V0L2FwaScsICdob3N0JyA9PiAnc210cC5tYWlscG9ldC5jb20nLCAncG9ydCcgPT4gNTg3LAogICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICdtYWlscG9ldCcsICdwYXNzJyA9PiAkZFsnbXRhJ11bJ21haWxwb2V0X2FwaV9rZXknXSwgJ2VuYycgPT4gJ3RscyddOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBOZXdzbGV0dGVyIHBsdWdpbiAodHdvIHNlcGFyYXRlIG9wdGlvbl9uYW1lIHJvd3MgY29tYmluZWQpCiAgICBpZiAoIWVtcHR5KCRvcHRzWyduZXdzbGV0dGVyX3NtdHBfaG9zdCddKSkgewogICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnbmV3c2xldHRlcl9wbHVnaW4nLCAnaG9zdCcgPT4gdHJpbSgkb3B0c1snbmV3c2xldHRlcl9zbXRwX2hvc3QnXSksCiAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiA1ODcsICd1c2VyJyA9PiAnJywgJ3Bhc3MnID0+IHRyaW0oJG9wdHNbJ25ld3NsZXR0ZXJfc210cF9wYXNzd29yZCddID8/ICcnKSwKICAgICAgICAgICAgICAgICAgJ2VuYycgPT4gJ3RscyddOwogICAgfQoKICAgIC8vIFdvb0NvbW1lcmNlIFBheVBhbCAoY2xpZW50X2lkICsgc2VjcmV0IGhhcnZlc3QpCiAgICBpZiAoIWVtcHR5KCRvcHRzWyd3b29jb21tZXJjZV9wYXlwYWxfc2V0dGluZ3MnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1snd29vY29tbWVyY2VfcGF5cGFsX3NldHRpbmdzJ10pOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpKSAkZCA9IEBqc29uX2RlY29kZSgkb3B0c1snd29vY29tbWVyY2VfcGF5cGFsX3NldHRpbmdzJ10sIHRydWUpOwogICAgICAgIGlmIChpc19hcnJheSgkZCkpIHsKICAgICAgICAgICAgJGNpZCA9ICRkWydjbGllbnRfaWQnXSA/PyAkZFsnc2FuZGJveF9jbGllbnRfaWQnXSA/PyAnJzsKICAgICAgICAgICAgJHNlYyA9ICRkWydjbGllbnRfc2VjcmV0J10gPz8gJGRbJ3NhbmRib3hfY2xpZW50X3NlY3JldCddID8/ICcnOwogICAgICAgICAgICBpZiAoJGNpZCB8fCAkc2VjKQogICAgICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdwYXlwYWwnLCAnaG9zdCcgPT4gJ2FwaS5wYXlwYWwuY29tJywgJ3BvcnQnID0+IDQ0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJGNpZCwgJ3Bhc3MnID0+ICRzZWMsICdlbmMnID0+ICcnXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gU01UUCBNYWlsZXIgYnkgV1BPbW5pYSAoc210cF9tYWlsZXJfb3B0aW9ucykKICAgIGlmICghZW1wdHkoJG9wdHNbJ3NtdHBfbWFpbGVyX29wdGlvbnMnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1snc210cF9tYWlsZXJfb3B0aW9ucyddKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJ3NtdHBfbWFpbGVyX29wdGlvbnMnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSAmJiAhZW1wdHkoJGRbJ2hvc3QnXSkpIHsKICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdzbXRwX21haWxlcicsICdob3N0JyA9PiAkZFsnaG9zdCddLAogICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IChpbnQpKCRkWydwb3J0J10gPz8gNTg3KSwKICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkZFsndXNlcm5hbWUnXSA/PyAnJywgJ3Bhc3MnID0+ICRkWydwYXNzd29yZCddID8/ICcnLAogICAgICAgICAgICAgICAgICAgICAgJ2VuYycgPT4gJGRbJ3R5cGVfZW5jcnlwdGlvbiddID8/ICd0bHMnXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gU2ltcGxlIFNNVFAgKHNpc19zZXR0aW5ncyAvIG5zbXRwX29wdGlvbnMpCiAgICBmb3JlYWNoIChbJ3Npc19zZXR0aW5ncycsICduc210cF9vcHRpb25zJywgJ2h0c210cF9vcHRpb25zJ10gYXMgJGspIHsKICAgICAgICBpZiAoZW1wdHkoJG9wdHNbJGtdKSkgY29udGludWU7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJGtdKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJGtdLCB0cnVlKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGQpICYmICFlbXB0eSgkZFsnaG9zdCddKSkgewogICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJGssICdob3N0JyA9PiAkZFsnaG9zdCddLAogICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IChpbnQpKCRkWydwb3J0J10gPz8gNTg3KSwKICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkZFsndXNlcm5hbWUnXSA/PyAkZFsndXNlciddID8/ICcnLAogICAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnID0+ICRkWydwYXNzd29yZCddID8/ICRkWydwYXNzJ10gPz8gJycsICdlbmMnID0+ICd0bHMnXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8vIEFtYXpvbiBTRVMgKHdwX3NlcyAvIHNlc19zZXR0aW5ncykKICAgIGZvcmVhY2ggKFsnd3Bfc2VzJywgJ3Nlc19zZXR0aW5ncyddIGFzICRrKSB7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRzWyRrXSkpIGNvbnRpbnVlOwogICAgICAgICRkID0gQHVuc2VyaWFsaXplKCRvcHRzWyRrXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWyRrXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSkgewogICAgICAgICAgICAka2lkID0gJGRbJ2FjY2Vzc19rZXknXSA/PyAkZFsnYXdzX2FjY2Vzc19rZXlfaWQnXSA/PyAkZFsna2V5J10gPz8gJyc7CiAgICAgICAgICAgICRzZWMgPSAkZFsnc2VjcmV0X2tleSddID8/ICRkWydhd3Nfc2VjcmV0X2FjY2Vzc19rZXknXSA/PyAkZFsnc2VjcmV0J10gPz8gJyc7CiAgICAgICAgICAgIGlmICgka2lkIHx8ICRzZWMpCiAgICAgICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJGssICdob3N0JyA9PiAnZW1haWwtc210cC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+IDU4NywgJ3VzZXInID0+ICRraWQsICdwYXNzJyA9PiAkc2VjLCAnZW5jJyA9PiAndGxzJ107CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBNYWlsamV0CiAgICAkbWpfa2V5ID0gdHJpbSgkb3B0c1snbWFpbGpldF9hcGlrZXknXSA/PyAnJyk7CiAgICAkbWpfc2VjID0gdHJpbSgkb3B0c1snbWFpbGpldF9hcGlzZWNyZXQnXSA/PyAnJyk7CiAgICBpZiAoJG1qX2tleSB8fCAkbWpfc2VjKQogICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnbWFpbGpldCcsICdob3N0JyA9PiAnaW4tdjMubWFpbGpldC5jb20nLCAncG9ydCcgPT4gNTg3LAogICAgICAgICAgICAgICAgICAndXNlcicgPT4gJG1qX2tleSwgJ3Bhc3MnID0+ICRtal9zZWMsICdlbmMnID0+ICd0bHMnXTsKCiAgICAvLyBCcmV2byAvIFNlbmRpbmJsdWUKICAgIGZvcmVhY2ggKFsnYnJldm9fc210cF9zZXR0aW5ncycsICdzZW5kaW5ibHVlX3dvb2NvbW1lcmNlX3NldHRpbmdzJ10gYXMgJGspIHsKICAgICAgICBpZiAoZW1wdHkoJG9wdHNbJGtdKSkgY29udGludWU7CiAgICAgICAgJGQgPSBAdW5zZXJpYWxpemUoJG9wdHNbJGtdKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJGtdLCB0cnVlKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGQpKSB7CiAgICAgICAgICAgICRhayA9ICRkWydhcGlfa2V5J10gPz8gJGRbJ2FwaUtleSddID8/ICRkWydzbXRwX3Bhc3N3b3JkJ10gPz8gJyc7CiAgICAgICAgICAgICR1ICA9ICRkWydzbXRwX2xvZ2luJ10gPz8gJGRbJ2xvZ2luJ10gPz8gJyc7CiAgICAgICAgICAgIGlmICgkYWspCiAgICAgICAgICAgICAgICAkb3V0W10gPSBbJ3NvdXJjZScgPT4gJ2JyZXZvJywgJ2hvc3QnID0+ICdzbXRwLXJlbGF5LmJyZXZvLmNvbScsICdwb3J0JyA9PiA1ODcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICR1LCAncGFzcycgPT4gJGFrLCAnZW5jJyA9PiAndGxzJ107CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBQb3N0bWFyawogICAgaWYgKCFlbXB0eSgkb3B0c1sncG9zdG1hcmtfY3JlZGVudGlhbHMnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1sncG9zdG1hcmtfY3JlZGVudGlhbHMnXSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZCkpICRkID0gQGpzb25fZGVjb2RlKCRvcHRzWydwb3N0bWFya19jcmVkZW50aWFscyddLCB0cnVlKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGQpKSB7CiAgICAgICAgICAgICR0ID0gJGRbJ2FwaV90b2tlbiddID8/ICRkWydzZXJ2ZXJfdG9rZW4nXSA/PyAkZFsndG9rZW4nXSA/PyAnJzsKICAgICAgICAgICAgaWYgKCR0KQogICAgICAgICAgICAgICAgJG91dFtdID0gWydzb3VyY2UnID0+ICdwb3N0bWFyaycsICdob3N0JyA9PiAnc210cC5wb3N0bWFya2FwcC5jb20nLCAncG9ydCcgPT4gNTg3LAogICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkdCwgJ3Bhc3MnID0+ICR0LCAnZW5jJyA9PiAndGxzJ107CiAgICAgICAgfQogICAgfQoKICAgIC8vIE1haWxlcnNlbmQKICAgIGlmICghZW1wdHkoJG9wdHNbJ21haWxlcnNlbmRfc2V0dGluZ3MnXSkpIHsKICAgICAgICAkZCA9IEB1bnNlcmlhbGl6ZSgkb3B0c1snbWFpbGVyc2VuZF9zZXR0aW5ncyddKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRkKSkgJGQgPSBAanNvbl9kZWNvZGUoJG9wdHNbJ21haWxlcnNlbmRfc2V0dGluZ3MnXSwgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkKSkgewogICAgICAgICAgICAkdCA9ICRkWydhcGlfa2V5J10gPz8gJGRbJ3Rva2VuJ10gPz8gJyc7CiAgICAgICAgICAgIGlmICgkdCkKICAgICAgICAgICAgICAgICRvdXRbXSA9IFsnc291cmNlJyA9PiAnbWFpbGVyc2VuZCcsICdob3N0JyA9PiAnc210cC5tYWlsZXJzZW5kLm5ldCcsICdwb3J0JyA9PiA1ODcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInID0+ICdtYWlsZXJzZW5kJywgJ3Bhc3MnID0+ICR0LCAnZW5jJyA9PiAndGxzJ107CiAgICAgICAgfQogICAgfQoKICAgIC8vIERlY3J5cHQgYW55IGVuY3J5cHRlZCBwYXNzd29yZHMgc2VydmVyLXNpZGUgYmVmb3JlIHJldHVybmluZwogICAgZm9yZWFjaCAoJG91dCBhcyAmJGVudHJ5KSB7CiAgICAgICAgJHB3ID0gJGVudHJ5WydwYXNzJ10gPz8gJyc7CiAgICAgICAgaWYgKCRwdyAmJiBzdHJsZW4oJHB3KSA+PSAzMCAmJiBwcmVnX21hdGNoKCcvXltBLVphLXowLTkrXC9dezMwLH09ezAsMn0kLycsIHRyaW0oJHB3KSkpIHsKICAgICAgICAgICAgJGRlYyA9IGRlY3J5cHRfc210cF9wYXNzKHRyaW0oJHB3KSwgJG1haWxfa2V5LCAkYXV0aF9rZXksICRhdXRoX3NhbHQpOwogICAgICAgICAgICBpZiAoJGRlYyAhPT0gJHB3KSAkZW50cnlbJ3Bhc3MnXSA9ICRkZWM7CiAgICAgICAgfQogICAgICAgIC8vIE5vcm1hbGlzZTogbnVsbCDihpIgJycgZm9yIHVzZXIvcGFzcy9ob3N0IHNvIHRoZSBQeXRob24gc2lkZSBuZXZlciBzZWVzICJudWxsIiBzdHJpbmdzCiAgICAgICAgZm9yZWFjaCAoWydob3N0JywndXNlcicsJ3Bhc3MnLCd1c2VybmFtZScsJ3Bhc3N3b3JkJ10gYXMgJGYpIHsKICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGYsICRlbnRyeSkgJiYgJGVudHJ5WyRmXSA9PT0gbnVsbCkgJGVudHJ5WyRmXSA9ICcnOwogICAgICAgIH0KICAgIH0KICAgIHVuc2V0KCRlbnRyeSk7CgogICAgLy8gRHJvcCBlbnRyaWVzIHdoZXJlIHBhc3MgbG9va3MgbGlrZSBhbiBIVE1MIHBhZ2Ugb3IgaXMgdHJpdmlhbGx5IGVtcHR5CiAgICAkb3V0ID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigkb3V0LCBmdW5jdGlvbigkZSkgewogICAgICAgICRwID0gJGVbJ3Bhc3MnXSA/PyAnJzsKICAgICAgICAkaCA9ICRlWydob3N0J10gPz8gJyc7CiAgICAgICAgaWYgKCEkaCAmJiAoISRwIHx8IHN0cmxlbigkcCkgPCA4KSkgcmV0dXJuIGZhbHNlOwogICAgICAgICRsbyA9IHN0cnRvbG93ZXIoc3Vic3RyKCRwLCAwLCA4MCkpOwogICAgICAgIGZvcmVhY2ggKFsnPCFkb2N0eXBlJywnPGh0bWwnLCc8aGVhZD4nLCc8Ym9keScsJ2ZhdGFsIGVycm9yJywncGhwIHdhcm5pbmcnLAogICAgICAgICAgICAgICAgICAnbm8gc3VjaCBmaWxlJywncGVybWlzc2lvbiBkZW5pZWQnXSBhcyAkYmFkKSB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGxvLCAkYmFkKSAhPT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9KSk7CgogICAgcmV0dXJuICRvdXQ7Cn0KCi8vIOKUgOKUgCBhY3Rpb246IHVzZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuY3Rpb24gdXNlcnNfaGFuZGxlcigpOiB2b2lkIHsKICAgICR1c2VycyA9IFtdOwogICAgJGNwYW5lbF91c2VycyA9IFtdOwoKICAgICRwYXNzd2QgPSBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvcGFzc3dkJyk7CiAgICBpZiAoJHBhc3N3ZCkgewogICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoIlxuIiwgdHJpbSgkcGFzc3dkKSkgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHAgPSBleHBsb2RlKCc6JywgJGxpbmUpOwogICAgICAgICAgICBpZiAoY291bnQoJHApIDwgNykgY29udGludWU7CiAgICAgICAgICAgICR1aWQgPSAoaW50KSRwWzJdOwogICAgICAgICAgICBpZiAoJHVpZCA8IDUwMCB8fCAkdWlkID4gNjUwMDApIGNvbnRpbnVlOwogICAgICAgICAgICAkc2hlbGwgPSAkcFs2XSA/PyAnJzsKICAgICAgICAgICAgaWYgKHN0cnBvcygkc2hlbGwsICdub2xvZ2luJykgIT09IGZhbHNlIHx8IHN0cnBvcygkc2hlbGwsICcvZmFsc2UnKSAhPT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgICAgICAkdXNlcnNbXSA9IFsndXNlcicgPT4gJHBbMF0sICd1aWQnID0+ICR1aWQsICdob21lJyA9PiAkcFs1XV07CiAgICAgICAgfQogICAgfQoKICAgIGZvcmVhY2ggKFsnL2V0Yy91c2VyZG9tYWlucycsICcvZXRjL3RydWV1c2VyZG9tYWlucyddIGFzICR1ZGZpbGUpIHsKICAgICAgICAkdWQgPSBAZmlsZV9nZXRfY29udGVudHMoJHVkZmlsZSk7CiAgICAgICAgaWYgKCEkdWQpIGNvbnRpbnVlOwogICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoIlxuIiwgdHJpbSgkdWQpKSBhcyAkbGluZSkgewogICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCc6ICcsICRsaW5lLCAyKTsKICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgPT09IDIpICRjcGFuZWxfdXNlcnNbXSA9IHRyaW0oJHBhcnRzWzFdKTsKICAgICAgICB9CiAgICB9CiAgICAkY3BhbmVsX3VzZXJzID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkY3BhbmVsX3VzZXJzKSk7CgogICAgZWNobyBqc29uX2VuY29kZShbJ3VzZXJzJyA9PiAkdXNlcnMsICdjcGFuZWxfdXNlcnMnID0+ICRjcGFuZWxfdXNlcnNdKTsKfQoKLy8g4pSA4pSAIGFjdGlvbjogY3Ag4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpmdW5jdGlvbiBjcF9oYW5kbGVyKCk6IHZvaWQgewogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ2Vycm9yJyA9PiAnY3VybF9kaXNhYmxlZCcsICdjcmFja2VkJyA9PiBbXSwgJ3Jlc2VsbGVycycgPT4gW11dKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJHVzZXJuYW1lcyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoYXJyYXlfbWFwKCd0cmltJywKICAgICAgICBleHBsb2RlKCJcbiIsICRfUE9TVFsndXNlcm5hbWVzJ10gPz8gJycpKSkpOwogICAgJHBhc3N3b3JkcyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoYXJyYXlfbWFwKCd0cmltJywKICAgICAgICBleHBsb2RlKCJcbiIsICRfUE9TVFsncGFzc3dvcmRzJ10gPz8gJycpKSkpOwoKICAgIC8vIEV4dGVybmFsIGNQYW5lbCBob3N0IHBhc3NlZCBmcm9tIGVzY2FsYXRlLnB5IHdoZW4ga25vd24gKGUuZy4gc2VydmVyMTIzLmhvc3QuY29tKS4KICAgIC8vIFRyeSBsb2NhbGhvc3QgZmlyc3Q7IGlmIGl0IGZhaWxzIChjb25uZWN0aW9uIHJlZnVzZWQgLyBubyBjUGFuZWwgaGVyZSksIHRyeSBleHRlcm5hbC4KICAgICRleHRfaG9zdCA9IHRyaW0oJF9QT1NUWydjcGFuZWxfaG9zdCddID8/ICcnKTsKICAgICRob3N0cyA9IFsnbG9jYWxob3N0J107CiAgICBpZiAoJGV4dF9ob3N0ICYmICRleHRfaG9zdCAhPT0gJ2xvY2FsaG9zdCcgJiYKICAgICAgICBwcmVnX21hdGNoKCcvXlthLXpBLVowLTkuXy1dKyQvJywgJGV4dF9ob3N0KSkgewogICAgICAgICRob3N0c1tdID0gJGV4dF9ob3N0OwogICAgfQoKICAgICRza2lwID0gWydyb290JywnZGFlbW9uJywnbm9ib2R5Jywnd3d3LWRhdGEnLCdhcGFjaGUnLCdhcGFjaGUyJywnbmdpbngnLCdodHRwJywKICAgICAgICAgICAgICdtYWlsJywnZnRwJywnc3NoZCcsJ215c3FsJywncG9zdGdyZXMnLCdiaW4nLCdzeXMnLCdudHAnLCdwb3N0Zml4JywKICAgICAgICAgICAgICdkb3ZlY290JywnZXhpbScsJ25hbWVkJywnZG5zbWFzcSddOwoKICAgICRjcmFja2VkICAgPSBbXTsKICAgICRyZXNlbGxlcnMgPSBbXTsKCiAgICBmb3JlYWNoICgkdXNlcm5hbWVzIGFzICR1KSB7CiAgICAgICAgaWYgKCEkdSB8fCBpbl9hcnJheSgkdSwgJHNraXAsIHRydWUpKSBjb250aW51ZTsKICAgICAgICBmb3JlYWNoICgkcGFzc3dvcmRzIGFzICRwdykgewogICAgICAgICAgICBpZiAoISRwdyB8fCBzdHJsZW4oJHB3KSA8IDQpIGNvbnRpbnVlOwogICAgICAgICAgICAkdG9rZW4gPSBudWxsOyAkdXNlZF9ob3N0ID0gbnVsbDsKICAgICAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRoKSB7CiAgICAgICAgICAgICAgICAkdCA9IGNwX2xvZ2luX3Rva2VuKCR1LCAkcHcsIDIwODMsICRoKTsKICAgICAgICAgICAgICAgIGlmICgkdCkgeyAkdG9rZW4gPSAkdDsgJHVzZWRfaG9zdCA9ICRoOyBicmVhazsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJHRva2VuKSBjb250aW51ZTsKCiAgICAgICAgICAgIC8vIEdldCBwcmltYXJ5IGRvbWFpbiB2aWEgVUFQSQogICAgICAgICAgICAkZG9tYWluID0gJyc7CiAgICAgICAgICAgICRkb21fcmF3ID0gY3BfYXBpX2dldCgkdG9rZW4sIDIwODMsICdEb21haW5JbmZvL2RvbWFpbnNfZGF0YScsICR1c2VkX2hvc3QpOwogICAgICAgICAgICBpZiAoJGRvbV9yYXcpIHsKICAgICAgICAgICAgICAgICRkb21faiA9IEBqc29uX2RlY29kZSgkZG9tX3JhdywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkZG9tYWluID0gJGRvbV9qWydkYXRhJ11bJ21haW5fZG9tYWluJ10gPz8gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkZG9tYWluKSAkZG9tYWluID0gJHU7CgogICAgICAgICAgICAvLyBDcmVhdGUgU01UUCBlbWFpbCBhY2NvdW50IGZvciBleGZpbCBhY2Nlc3MKICAgICAgICAgICAgJHNtdHBfaW5mbyA9IGNwX2NyZWF0ZV9zbXRwKCR0b2tlbiwgMjA4MywgJHUsICRkb21haW4sICR1c2VkX2hvc3QpOwoKICAgICAgICAgICAgJGNyYWNrZWRbXSA9IFsKICAgICAgICAgICAgICAgICd1c2VyJyAgID0+ICR1LAogICAgICAgICAgICAgICAgJ3Bhc3MnICAgPT4gJHB3LAogICAgICAgICAgICAgICAgJ3BvcnQnICAgPT4gMjA4MywKICAgICAgICAgICAgICAgICdob3N0JyAgID0+ICR1c2VkX2hvc3QsCiAgICAgICAgICAgICAgICAnZG9tYWluJyA9PiAkZG9tYWluLAogICAgICAgICAgICAgICAgJ3NtdHAnICAgPT4gJHNtdHBfaW5mbywKICAgICAgICAgICAgXTsKCiAgICAgICAgICAgIC8vIFdITSByZXNlbGxlciBjaGVjawogICAgICAgICAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGgpIHsKICAgICAgICAgICAgICAgIGlmIChjcF90cnkoJHUsICRwdywgMjA4NywgJGgpKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc2VsbGVyc1tdID0gWyd1c2VyJyA9PiAkdSwgJ3Bhc3MnID0+ICRwdywgJ2hvc3QnID0+ICRoXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGVjaG8ganNvbl9lbmNvZGUoWydjcmFja2VkJyA9PiAkY3JhY2tlZCwgJ3Jlc2VsbGVycycgPT4gJHJlc2VsbGVyc10pOwp9CgpmdW5jdGlvbiBjcF9sb2dpbl90b2tlbihzdHJpbmcgJHVzZXIsIHN0cmluZyAkcGFzcywgaW50ICRwb3J0LCBzdHJpbmcgJGhvc3QgPSAnbG9jYWxob3N0Jyk6IHN0cmluZyB7CiAgICAkamFyID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICdjcGphcl8nKTsKICAgICRjaCA9IGN1cmxfaW5pdCgiaHR0cHM6Ly8kaG9zdDokcG9ydC9sb2dpbi8/bG9naW5fb25seT0xIik7CiAgICBjdXJsX3NldG9wdF9hcnJheSgkY2gsIFsKICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBmYWxzZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfUE9TVCAgICAgICAgICAgPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX1BPU1RGSUVMRFMgICAgID0+ICd1c2VyPScgLiByYXd1cmxlbmNvZGUoJHVzZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnJnBhc3M9JyAuIHJhd3VybGVuY29kZSgkcGFzcyksCiAgICAgICAgQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiA4LAogICAgICAgIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgPT4gNSwKICAgICAgICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IHRydWUsCiAgICAgICAgQ1VSTE9QVF9NQVhSRURJUlMgICAgICA9PiAzLAogICAgICAgIENVUkxPUFRfQ09PS0lFSkFSICAgICAgPT4gJGphciwKICAgICAgICBDVVJMT1BUX0NPT0tJRUZJTEUgICAgID0+ICRqYXIsCiAgICBdKTsKICAgICRyZXNwID0gY3VybF9leGVjKCRjaCk7CiAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICBpZiAoISRyZXNwKSB7IEB1bmxpbmsoJGphcik7IHJldHVybiAnJzsgfQogICAgJG9rID0gc3RycG9zKCRyZXNwLCAnInN0YXR1cyI6MScpICE9PSBmYWxzZSB8fCBzdHJpcG9zKCRyZXNwLCAnY3BzZXNzJykgIT09IGZhbHNlOwogICAgaWYgKCEkb2spIHsgQHVubGluaygkamFyKTsgcmV0dXJuICcnOyB9CiAgICAvLyBFeHRyYWN0IGNwc2VzcyB0b2tlbiBmcm9tIHJlc3BvbnNlIG9yIGNvb2tpZSBqYXIKICAgIGlmIChwcmVnX21hdGNoKCcvc2VjdXJpdHlfdG9rZW5bIlxzOj1dK1wvP2Nwc2VzcyhbMC05YS1mXSspL2knLCAkcmVzcCwgJG0pKQogICAgICAgICR0b2sgPSAnY3BzZXNzJyAuICRtWzFdOwogICAgZWxzZWlmIChwcmVnX21hdGNoKCcvY3BzZXNzKFswLTlhLWZdKykvaScsICRyZXNwLCAkbSkpCiAgICAgICAgJHRvayA9ICdjcHNlc3MnIC4gJG1bMV07CiAgICBlbHNlCiAgICAgICAgJHRvayA9ICdfX2phcl9fJyAuICRqYXI7ICAgLy8gZmFsbCBiYWNrIHRvIGNvb2tpZSBqYXIgcGF0aAogICAgcmV0dXJuICR0b2sgLiAnfCcgLiAkamFyOwp9CgpmdW5jdGlvbiBjcF9hcGlfZ2V0KHN0cmluZyAkdG9rZW5famFyLCBpbnQgJHBvcnQsIHN0cmluZyAkZW5kcG9pbnQsIHN0cmluZyAkaG9zdCA9ICdsb2NhbGhvc3QnKTogc3RyaW5nIHsKICAgIFskdG9rZW4sICRqYXJdID0gYXJyYXlfcGFkKGV4cGxvZGUoJ3wnLCAkdG9rZW5famFyLCAyKSwgMiwgJycpOwogICAgJHVybCA9ICJodHRwczovLyRob3N0OiRwb3J0L2V4ZWN1dGUvJGVuZHBvaW50IjsKICAgICRjaCA9IGN1cmxfaW5pdCgkdXJsKTsKICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgWwogICAgICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gZmFsc2UsCiAgICAgICAgQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiA4LAogICAgICAgIENVUkxPUFRfQ09PS0lFRklMRSAgICAgPT4gJGphciwKICAgICAgICBDVVJMT1BUX0NPT0tJRUpBUiAgICAgID0+ICRqYXIsCiAgICBdKTsKICAgICRyZXNwID0gY3VybF9leGVjKCRjaCk7CiAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICByZXR1cm4gJHJlc3AgPzogJyc7Cn0KCmZ1bmN0aW9uIGNwX2NyZWF0ZV9zbXRwKHN0cmluZyAkdG9rZW5famFyLCBpbnQgJHBvcnQsIHN0cmluZyAkY3B1c2VyLCBzdHJpbmcgJGRvbWFpbiwgc3RyaW5nICRob3N0ID0gJ2xvY2FsaG9zdCcpOiBhcnJheSB7CiAgICAvLyBDcmVhdGUgYSBtYWlsYm94IHdlIGNvbnRyb2wgZm9yIFNNVFAgcmVsYXkgYWNjZXNzCiAgICAkc210cF91c2VyID0gJ3dwXycgLiBzdWJzdHIobWQ1KCRjcHVzZXIgLiB0aW1lKCkpLCAwLCA4KTsKICAgICRzbXRwX3Bhc3MgPSBzdWJzdHIoc3RyX3NodWZmbGUoJ0FCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoamttbnBxcnN0dXZ3eHl6MjM0NTY3ODknKSwgMCwgMTIpCiAgICAgICAgICAgICAgIC4gJyExJzsKICAgIFskdG9rZW4sICRqYXJdID0gYXJyYXlfcGFkKGV4cGxvZGUoJ3wnLCAkdG9rZW5famFyLCAyKSwgMiwgJycpOwogICAgJGZpZWxkcyA9ICdlbWFpbD0nIC4gcmF3dXJsZW5jb2RlKCRzbXRwX3VzZXIpCiAgICAgICAgICAgIC4gJyZkb21haW49JyAuIHJhd3VybGVuY29kZSgkZG9tYWluKQogICAgICAgICAgICAuICcmcGFzc3dvcmQ9JyAuIHJhd3VybGVuY29kZSgkc210cF9wYXNzKQogICAgICAgICAgICAuICcmcXVvdGE9MjUwJzsKICAgICRjaCA9IGN1cmxfaW5pdCgiaHR0cHM6Ly8kaG9zdDokcG9ydC9leGVjdXRlL0VtYWlsL2FkZF9wb3AiKTsKICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgWwogICAgICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gZmFsc2UsCiAgICAgICAgQ1VSTE9QVF9QT1NUICAgICAgICAgICA9PiB0cnVlLAogICAgICAgIENVUkxPUFRfUE9TVEZJRUxEUyAgICAgPT4gJGZpZWxkcywKICAgICAgICBDVVJMT1BUX1RJTUVPVVQgICAgICAgID0+IDEwLAogICAgICAgIENVUkxPUFRfQ09PS0lFRklMRSAgICAgPT4gJGphciwKICAgICAgICBDVVJMT1BUX0NPT0tJRUpBUiAgICAgID0+ICRqYXIsCiAgICBdKTsKICAgICRyZXNwID0gY3VybF9leGVjKCRjaCk7CiAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICBAdW5saW5rKCRqYXIpOwogICAgJG9rID0gJHJlc3AgJiYgKHN0cnBvcygkcmVzcCwgJyJzdGF0dXMiOjEnKSAhPT0gZmFsc2UgfHwgc3RycG9zKCRyZXNwLCAnImVycm9ycyI6bnVsbCcpICE9PSBmYWxzZSk7CiAgICBpZiAoJG9rKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJ3VzZXInID0+ICIkc210cF91c2VyQCRkb21haW4iLAogICAgICAgICAgICAncGFzcycgPT4gJHNtdHBfcGFzcywKICAgICAgICAgICAgJ2hvc3QnID0+ICdtYWlsLicgLiAkZG9tYWluLAogICAgICAgICAgICAncG9ydCcgPT4gNTg3LAogICAgICAgIF07CiAgICB9CiAgICByZXR1cm4gW107Cn0KCmZ1bmN0aW9uIGNwX3RyeShzdHJpbmcgJHVzZXIsIHN0cmluZyAkcGFzcywgaW50ICRwb3J0LCBzdHJpbmcgJGhvc3QgPSAnbG9jYWxob3N0Jyk6IGJvb2wgewogICAgJGNoID0gY3VybF9pbml0KCJodHRwczovLyRob3N0OiRwb3J0L2xvZ2luLz9sb2dpbl9vbmx5PTEiKTsKICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgWwogICAgICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSID0+IGZhbHNlLAogICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gZmFsc2UsCiAgICAgICAgQ1VSTE9QVF9QT1NUICAgICAgICAgICA9PiB0cnVlLAogICAgICAgIENVUkxPUFRfUE9TVEZJRUxEUyAgICAgPT4gJ3VzZXI9JyAuIHJhd3VybGVuY29kZSgkdXNlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcmcGFzcz0nIC4gcmF3dXJsZW5jb2RlKCRwYXNzKSwKICAgICAgICBDVVJMT1BUX1RJTUVPVVQgICAgICAgID0+IDgsCiAgICAgICAgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCA9PiA1LAogICAgICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gdHJ1ZSwKICAgICAgICBDVVJMT1BUX01BWFJFRElSUyAgICAgID0+IDMsCiAgICBdKTsKICAgICRyZXNwID0gY3VybF9leGVjKCRjaCk7CiAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICBpZiAoISRyZXNwKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3RycG9zKCRyZXNwLCAnInN0YXR1cyI6MScpICE9PSBmYWxzZSB8fCBzdHJpcG9zKCRyZXNwLCAnY3BzZXNzJykgIT09IGZhbHNlOwp9CgovLyDilIDilIAgYWN0aW9uOiBmaWxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gUEhQLW5hdGl2ZSBmaWxlIHN3ZWVwIOKAlCB3b3JrcyBldmVuIHdoZW4gZXhlYy9wYXNzdGhydS9zeXN0ZW0gYXJlIGRpc2FibGVkLgoKZnVuY3Rpb24gZmlsZXNfaGFuZGxlcigpOiB2b2lkIHsKICAgICRvdXQgPSBbJ2ZpbGVzJyA9PiBbXSwgJ3dwY29uZmlncycgPT4gW10sICdlbnZmaWxlcycgPT4gW11dOwoKICAgIC8vIEZpeGVkLXBhdGggc3lzdGVtIGNyZWRlbnRpYWwgZmlsZXMKICAgICR0YXJnZXRzID0gWwogICAgICAgICcvZXRjL3Bhc3N3ZCcsCiAgICAgICAgJy9ldGMvc2hhZG93JywKICAgICAgICAnL2V0Yy9leGltNC9wYXNzd2QuY2xpZW50JywKICAgICAgICAnL2V0Yy9wb3N0Zml4L3Nhc2xfcGFzc3dkJywKICAgICAgICAnL2V0Yy9leGltLmNvbmYnLAogICAgICAgICcvZXRjL2V4aW0uY29uZi5sb2NhbG9wdHMnLAogICAgICAgICcvZXRjL2V4aW00L2V4aW00LmNvbmYudGVtcGxhdGUnLAogICAgICAgICcvZXRjL2V4aW00L2NvbmYuZC90cmFuc3BvcnQvMzBfZXhpbTQtY29uZmlnX3JlbW90ZV9zbXRwX3NtYXJ0aG9zdCcsCiAgICAgICAgJy91c3IvbG9jYWwvY3BhbmVsL2V0Yy9leGltL3N5c3RlbS5jb25mJywKICAgICAgICAnL3Jvb3QvLm15LmNuZicsCiAgICAgICAgJy9ldGMvbXlzcWwvZGViaWFuLmNuZicsCiAgICAgICAgJy9ldGMvbXlzcWwvbXkuY25mJywKICAgICAgICAnL2V0Yy92c2Z0cGQuY29uZicsCiAgICAgICAgJy9ldGMvcHJvZnRwZC9wcm9mdHBkLmNvbmYnLAogICAgICAgICcvZXRjL3B1cmUtZnRwZC9kYi9wdXJlZnRwZC5wYXNzd2QnLAogICAgICAgICcvdmFyL2NwYW5lbC9yb290LnBhc3N3ZCcsCiAgICAgICAgJy9yb290Ly5hY2Nlc3NoYXNoJywKICAgICAgICAnL2V0Yy9wc2EvcHNhLmNvbmYnLAogICAgICAgICcvb3B0L3BzYS9hZG1pbi9jb25mL3BhbmVsLmluaScsCiAgICAgICAgJy91c3IvbG9jYWwvZGlyZWN0YWRtaW4vY29uZi9kaXJlY3RhZG1pbi5jb25mJywKICAgICAgICAnL3Vzci9sb2NhbC9kaXJlY3RhZG1pbi9jb25mL215c3FsLmNvbmYnLAogICAgICAgICcvdXNyL2xvY2FsL2hlc3RpYS9jb25mL215c3FsLmNvbmYnLAogICAgICAgICcvdXNyL2xvY2FsL3Zlc3RhL2NvbmYvbXlzcWwuY29uZicsCiAgICAgICAgJy9ldGMvdXNlcmRvbWFpbnMnLAogICAgICAgICcvZXRjL3RydWV1c2VyZG9tYWlucycsCiAgICAgICAgJy9wcm9jL3NlbGYvZW52aXJvbicsCiAgICAgICAgJy9wcm9jLzEvZW52aXJvbicsCiAgICAgICAgJy9ldGMvbWFpbC9hdXRoaW5mbycsCiAgICAgICAgJy9ldGMvbWFpbC9hY2Nlc3MnLAogICAgXTsKICAgIGZvcmVhY2ggKCR0YXJnZXRzIGFzICRwKSB7CiAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJHApOwogICAgICAgIGlmICgkYyAhPT0gZmFsc2UgJiYgc3RybGVuKCRjKSA+IDMpICRvdXRbJ2ZpbGVzJ11bJHBdID0gJGM7CiAgICB9CgogICAgLy8gd3AtY29uZmlnLnBocCDigJQgZ2xvYiBhY3Jvc3MgY29tbW9uIHdlYnJvb3QgcGF0dGVybnMgKGRlcHRoIDEtMikKICAgICRkciA9IHJ0cmltKCRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gPz8gJycsICcvJyk7CiAgICAkd3BjZmdfZ2xvYnMgPSBhcnJheV9maWx0ZXIoWwogICAgICAgIC8vIERPQ1VNRU5UX1JPT1QgaXMgYWx3YXlzIHdpdGhpbiBvcGVuX2Jhc2VkaXIg4oCUIGNoZWNrIGRpcmVjdGx5IGZpcnN0CiAgICAgICAgJGRyID8gJGRyIC4gJy93cC1jb25maWcucGhwJyAgICAgICAgIDogbnVsbCwKICAgICAgICAkZHIgPyBkaXJuYW1lKCRkcikgLiAnL3dwLWNvbmZpZy5waHAnOiBudWxsLAogICAgICAgICcvdmFyL3d3dy8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvdmFyL3d3dy8qLyovd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy92YXIvd3d3L2h0bWwvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL2hvbWUvKi9wdWJsaWNfaHRtbC93cC1jb25maWcucGhwJywKICAgICAgICAnL2hvbWUvKi93d3cvd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy9ob21lLyovcHVibGljX2h0bWwvKi93cC1jb25maWcucGhwJywKICAgICAgICAnL3Nydi8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvc3J2L3d3dy8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvb3B0Lyovd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy93d3cvd3d3cm9vdC8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvZGF0YS93d3dyb290Lyovd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy92b2x1bWUqL3dlYi8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgIC8vIFdlZG9zLm5ldCAvIEZvcnBzaSAvIEN6ZWNoIGhvc3RlcnMKICAgICAgICAnL2RhdGEvd2ViL3ZpcnR1YWxzLyovdmlydHVhbC93d3cvZG9tYWlucy8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvZGF0YS93ZWIvdmlydHVhbHMvKi92aXJ0dWFsL3d3dy93cC1jb25maWcucGhwJywKICAgICAgICAvLyBIZXR6bmVyIC8gT1ZIIC8gSW5mb21hbmlhayBzaGFyZWQKICAgICAgICAnL3Zhci9jdXN0b21lcnMvd2Vicy8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvdmFyL2N1c3RvbWVycy93ZWJzLyovKi93cC1jb25maWcucGhwJywKICAgICAgICAvLyBQbGVzayBkZWZhdWx0IHdlYnJvb3QKICAgICAgICAnL3Zhci93d3cvdmhvc3RzLyovaHR0cGRvY3Mvd3AtY29uZmlnLnBocCcsCiAgICAgICAgJy92YXIvd3d3L3Zob3N0cy8qLyovd3AtY29uZmlnLnBocCcsCiAgICAgICAgLy8gUnVuQ2xvdWQgLyBHcmlkUGFuZSAvIFNwaW51cHdwIFZQUyBsYXlvdXQKICAgICAgICAnL2hvbWUvcnVuY2xvdWQvd2ViYXBwcy8qL3dwLWNvbmZpZy5waHAnLAogICAgICAgICcvdmFyL3d3dy8qL3B1YmxpYy93cC1jb25maWcucGhwJywKICAgICAgICAvLyBVc2UgX19ESVJfXyB0byBhbHdheXMgY2F0Y2ggdGhlIGN1cnJlbnQgaW5zdGFsbAogICAgICAgIGRpcm5hbWUoZGlybmFtZShkaXJuYW1lKGRpcm5hbWUoX19GSUxFX18pKSkpIC4gJy93cC1jb25maWcucGhwJywKICAgICAgICBkaXJuYW1lKGRpcm5hbWUoZGlybmFtZShkaXJuYW1lKGRpcm5hbWUoX19GSUxFX18pKSkpKSAuICcvd3AtY29uZmlnLnBocCcsCiAgICBdKTsKICAgIGZvcmVhY2ggKCR3cGNmZ19nbG9icyBhcyAkcGF0KSB7CiAgICAgICAgZm9yZWFjaCAoKGFycmF5KUBnbG9iKCRwYXQpIGFzICRmKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkb3V0Wyd3cGNvbmZpZ3MnXVskZl0pKSBjb250aW51ZTsKICAgICAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJGYpOwogICAgICAgICAgICBpZiAoJGMgIT09IGZhbHNlICYmIHN0cmxlbigkYykgPiAxMDApICRvdXRbJ3dwY29uZmlncyddWyRmXSA9ICRjOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAuZW52IGZpbGVzIOKAlCBzYW1lIGNvbW1vbiBwYXRocwogICAgJGVudl9nbG9icyA9IFsKICAgICAgICAnL29wdC8qLy5lbnYnLAogICAgICAgICcvb3B0LyovKi8uZW52JywKICAgICAgICAnL3Zhci93d3cvKi8uZW52JywKICAgICAgICAnL3Zhci93d3cvKi8qLy5lbnYnLAogICAgICAgICcvaG9tZS8qLy5lbnYnLAogICAgICAgICcvaG9tZS8qL3B1YmxpY19odG1sLy5lbnYnLAogICAgICAgICcvaG9tZS8qL3B1YmxpY19odG1sLyovLmVudicsCiAgICAgICAgJy9zcnYvKi8uZW52JywKICAgICAgICAnL3Nydi93d3cvKi8uZW52JywKICAgICAgICAnL3Jvb3QvLmVudicsCiAgICBdOwogICAgZm9yZWFjaCAoJGVudl9nbG9icyBhcyAkcGF0KSB7CiAgICAgICAgZm9yZWFjaCAoKGFycmF5KUBnbG9iKCRwYXQpIGFzICRmKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkb3V0WydlbnZmaWxlcyddWyRmXSkpIGNvbnRpbnVlOwogICAgICAgICAgICAkYyA9IEBmaWxlX2dldF9jb250ZW50cygkZik7CiAgICAgICAgICAgIGlmICgkYyAhPT0gZmFsc2UgJiYgc3RybGVuKCRjKSA+IDEwKSAkb3V0WydlbnZmaWxlcyddWyRmXSA9ICRjOwogICAgICAgIH0KICAgIH0KCiAgICBlY2hvIGpzb25fZW5jb2RlKCRvdXQpOwp9CgovLyDilIDilIAgYWN0aW9uOiBzeXNpbmZvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBQdXJlLVBIUCBzeXN0ZW0gZmluZ2VycHJpbnQg4oCUIG5vIGV4ZWMgbmVlZGVkLiBSZXBsYWNlcyBtb3N0IGV4ZWNfY21kIGNhbGxzIGluCi8vIGZpbmdlcnByaW50KCkgc28gV0FGIHJhdGUtbGltaXRpbmcgb2YgP2M9IHJlcXVlc3RzIGRvZXNuJ3Qga2lsbCBlYXJseSBkYXRhLgoKZnVuY3Rpb24gc3lzaW5mb19oYW5kbGVyKCk6IHZvaWQgewogICAgJG91dCA9IFtdOwoKICAgIC8vIFBIUCArIHNlcnZlciBpZGVudGl0eQogICAgJG91dFsncGhwX3ZlcnNpb24nXSAgICAgPSBQSFBfVkVSU0lPTjsKICAgICRvdXRbJ3NhcGknXSAgICAgICAgICAgID0gUEhQX1NBUEk7CiAgICAkb3V0WydzZXJ2ZXJfc29mdHdhcmUnXSA9ICRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSA/PyAnJzsKICAgICRvdXRbJ2hvc3RuYW1lJ10gICAgICAgID0gQGdldGhvc3RuYW1lKCkgPzogJyc7CiAgICAkb3V0Wydkb2Nfcm9vdCddICAgICAgICA9IHJ0cmltKCRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gPz8gJycsICcvJyk7CiAgICAkb3V0WydzY3JpcHRfZmlsZW5hbWUnXSA9ICRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSA/PyAnJzsKICAgICRvdXRbJ3NlbGZfZGlyJ10gICAgICAgID0gX19ESVJfXzsKICAgICRvdXRbJ3BocF9pbmknXSAgICAgICAgID0gQHBocF9pbmlfbG9hZGVkX2ZpbGUoKSA/OiAnJzsKICAgICRvdXRbJ2Rpc2FibGVfZnVuY3Rpb25zJ10gPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSA/OiAnJzsKICAgICRvdXRbJ29wZW5fYmFzZWRpciddICAgID0gQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpID86ICcnOwoKICAgIC8vIEZ1bGwgL3Byb2Mvc2VsZi9lbnZpcm9uIOKAlCBzYW1lIGFzIGV4ZWNfY21kICJjYXQgL3Byb2Mvc2VsZi9lbnZpcm9uIHwgdHIgJ1wwJyAnXG4nIgogICAgJGVudl9yYXcgPSBAZmlsZV9nZXRfY29udGVudHMoJy9wcm9jL3NlbGYvZW52aXJvbicpOwogICAgaWYgKCRlbnZfcmF3ICE9PSBmYWxzZSAmJiBzdHJsZW4oJGVudl9yYXcpID4gMTApIHsKICAgICAgICAkb3V0Wydwcm9jX2Vudmlyb24nXSA9IHN0cl9yZXBsYWNlKCJcMCIsICJcbiIsICRlbnZfcmF3KTsKICAgICAgICAvLyBHaG9zdExvY2sgZGV0ZWN0aW9uCiAgICAgICAgaWYgKHN0cnBvcygkZW52X3JhdywgJ2dob3N0bG9ja19waHBfc2hpZWxkJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRvdXRbJ2dob3N0bG9jayddID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gRXh0cmFjdCBrZXkgZW52IHZhcnMgaW5saW5lCiAgICAgICAgZm9yZWFjaCAoZXhwbG9kZSgiXDAiLCAkZW52X3JhdykgYXMgJGt2KSB7CiAgICAgICAgICAgICRwID0gZXhwbG9kZSgnPScsICRrdiwgMik7CiAgICAgICAgICAgIGlmIChjb3VudCgkcCkgPT09IDIgJiYgaW5fYXJyYXkoJHBbMF0sIFsKICAgICAgICAgICAgICAgICdET0NVTUVOVF9ST09UJywnSFRUUF9IT1NUJywnU0VSVkVSX05BTUUnLCdTQ1JJUFRfRklMRU5BTUUnLAogICAgICAgICAgICAgICAgJ1BXRCcsJ0xEX1BSRUxPQUQnLCdIT01FJywnVVNFUicsJ1BBVEgnLAogICAgICAgICAgICBdKSkgJG91dFsnZW52J11bJHBbMF1dID0gJHBbMV07CiAgICAgICAgfQogICAgICAgIC8vIFN1cHBsZW1lbnQgRE9DVU1FTlRfUk9PVCBmcm9tIGVudiBpZiBtaXNzaW5nIGZyb20gX1NFUlZFUgogICAgICAgIGlmICghJG91dFsnZG9jX3Jvb3QnXSAmJiBpc3NldCgkb3V0WydlbnYnXVsnRE9DVU1FTlRfUk9PVCddKSkgewogICAgICAgICAgICAkb3V0Wydkb2Nfcm9vdCddID0gcnRyaW0oJG91dFsnZW52J11bJ0RPQ1VNRU5UX1JPT1QnXSwgJy8nKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gL2V0Yy9wYXNzd2Qg4oCUIHN5c3RlbSB1c2VycyBmb3IgY1BhbmVsIGJydXRlCiAgICAkcGFzc3dkID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL3Bhc3N3ZCcpOwogICAgaWYgKCRwYXNzd2QgIT09IGZhbHNlICYmIHN0cmxlbigkcGFzc3dkKSA+IDIwKSB7CiAgICAgICAgJG91dFsnZXRjX3Bhc3N3ZCddID0gJHBhc3N3ZDsKICAgICAgICAkdXNlcnMgPSBbXTsKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCJcbiIsICRwYXNzd2QpIGFzICRsaW5lKSB7CiAgICAgICAgICAgICRwID0gZXhwbG9kZSgnOicsICRsaW5lKTsKICAgICAgICAgICAgaWYgKGNvdW50KCRwKSA8IDcpIGNvbnRpbnVlOwogICAgICAgICAgICAkdWlkID0gKGludCkkcFsyXTsKICAgICAgICAgICAgaWYgKCR1aWQgPj0gNTAwICYmICgKICAgICAgICAgICAgICAgIHN0cnBvcygkcFs1XSwgJy9ob21lJykgPT09IDAgfHwKICAgICAgICAgICAgICAgIHN0cnBvcygkcFs1XSwgJy92YXIvY3BhbmVsJykgPT09IDAgfHwKICAgICAgICAgICAgICAgIHN0cnBvcygkcFs1XSwgJy91c3IvbG9jYWwvY3BhbmVsJykgPT09IDAKICAgICAgICAgICAgKSkgewogICAgICAgICAgICAgICAgJHVzZXJzW10gPSBbJ3VzZXInID0+ICRwWzBdLCAndWlkJyA9PiAkdWlkLCAnaG9tZScgPT4gJHBbNV1dOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRvdXRbJ3N5c3RlbV91c2VycyddID0gJHVzZXJzOwogICAgfQoKICAgIC8vIE9wZW4gcG9ydHMgZnJvbSAvcHJvYy9uZXQvdGNwICsgdGNwNiAobm8gZXhlYyBuZWVkZWQpCiAgICAkcG9ydHMgPSBbXTsKICAgIGZvcmVhY2ggKFsnL3Byb2MvbmV0L3RjcCcsICcvcHJvYy9uZXQvdGNwNiddIGFzICR0Y3BmKSB7CiAgICAgICAgJGxpbmVzID0gQGZpbGUoJHRjcGYsIEZJTEVfSUdOT1JFX05FV19MSU5FUyB8IEZJTEVfU0tJUF9FTVBUWV9MSU5FUyk7CiAgICAgICAgaWYgKCEkbGluZXMpIGNvbnRpbnVlOwogICAgICAgIGZvcmVhY2ggKGFycmF5X3NsaWNlKCRsaW5lcywgMSkgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJGNvbHMgPSBwcmVnX3NwbGl0KCcvXHMrLycsIHRyaW0oJGxpbmUpKTsKICAgICAgICAgICAgaWYgKCFpc3NldCgkY29sc1sxXSkpIGNvbnRpbnVlOwogICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCc6JywgJGNvbHNbMV0pOwogICAgICAgICAgICBpZiAoY291bnQoJHBhcnRzKSA8IDIpIGNvbnRpbnVlOwogICAgICAgICAgICAkcG9ydCA9IGhleGRlYygkcGFydHNbMV0pOwogICAgICAgICAgICAkc3RhdGUgPSAkY29sc1szXSA/PyAnJzsKICAgICAgICAgICAgaWYgKCRzdGF0ZSA9PT0gJzBBJyAmJiAkcG9ydCA+IDApICRwb3J0c1tdID0gJHBvcnQ7CiAgICAgICAgfQogICAgfQogICAgJG91dFsnb3Blbl9wb3J0cyddID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZSgkcG9ydHMpKTsKCiAgICAvLyBQYW5lbCBkZXRlY3Rpb24gZnJvbSBmaWxlc3lzdGVtIChubyBleGVjIG5lZWRlZCkKICAgICRwYW5lbCA9ICcnOwogICAgaWYgKEBmaWxlX2V4aXN0cygnL3Vzci9sb2NhbC9jcGFuZWwvdmVyc2lvbicpKSAgICAgICAgICAgJHBhbmVsID0gJ2NwYW5lbCc7CiAgICBlbHNlaWYgKEBmaWxlX2V4aXN0cygnL3Vzci9sb2NhbC9kaXJlY3RhZG1pbi9kaXJlY3RhZG1pbicpKSAkcGFuZWwgPSAnZGlyZWN0YWRtaW4nOwogICAgZWxzZWlmIChAZmlsZV9leGlzdHMoJy91c3IvbG9jYWwvbWdyNS9ldGMvaXNwbWdyLmNvbmYnKSkgJHBhbmVsID0gJ2lzcG1ncic7CiAgICBlbHNlaWYgKEBmaWxlX2V4aXN0cygnL3Vzci9sb2NhbC92ZXN0YS9iaW4vdi1saXN0LXVzZXJzJykpICRwYW5lbCA9ICd2ZXN0YSc7CiAgICBlbHNlaWYgKEBmaWxlX2V4aXN0cygnL3Vzci9sb2NhbC9oZXN0aWEvYmluL3YtbGlzdC11c2VycycpKSAkcGFuZWwgPSAnaGVzdGlhJzsKICAgIGVsc2VpZiAoQGZpbGVfZXhpc3RzKCcvZXRjL3BzYS8ucHNhLnNoYWRvdycpIHx8IEBmaWxlX2V4aXN0cygnL3Vzci9sb2NhbC9wc2EvdmVyc2lvbicpKSAkcGFuZWwgPSAncGxlc2snOwogICAgaWYgKCRwYW5lbCkgJG91dFsncGFuZWxfdHlwZSddID0gJHBhbmVsOwoKICAgIC8vIGNQYW5lbCB1c2VyIGNvbmZpZyBmb3IgdGhlIGN1cnJlbnQgdXNlcgogICAgJGhvbWUgPSAkb3V0WydlbnYnXVsnSE9NRSddID8/ICcnOwogICAgJGNwX3VzZXIgPSAkaG9tZSA/IGJhc2VuYW1lKCRob21lKSA6ICcnOwogICAgaWYgKCRjcF91c2VyKSB7CiAgICAgICAgJGNwdSA9IEBmaWxlX2dldF9jb250ZW50cygiL3Zhci9jcGFuZWwvdXNlcnMveyRjcF91c2VyfSIpOwogICAgICAgIGlmICgkY3B1ICE9PSBmYWxzZSAmJiBzdHJsZW4oJGNwdSkgPiAxMCkgewogICAgICAgICAgICAkb3V0WydjcGFuZWxfdXNlcl9jb25maWcnXSA9ICRjcHU7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvQ09OVEFDVEVNQUlMPShcUyspLycsICRjcHUsICRtKSkgewogICAgICAgICAgICAgICAgJG91dFsnY3BhbmVsX2NvbnRhY3RfZW1haWwnXSA9ICRtWzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIC91c3IvbG9jYWwvY3BhbmVsL2V0Yy9wYXNzd2QKICAgICRjcHAgPSBAZmlsZV9nZXRfY29udGVudHMoJy91c3IvbG9jYWwvY3BhbmVsL2V0Yy9wYXNzd2QnKTsKICAgIGlmICgkY3BwICE9PSBmYWxzZSAmJiBzdHJsZW4oJGNwcCkgPiAxMCkgJG91dFsnY3BhbmVsX2V0Y19wYXNzd2QnXSA9ICRjcHA7CgogICAgLy8gL2V0Yy91c2VyZG9tYWlucyArIC9ldGMvbG9jYWxkb21haW5zCiAgICAkdWQgPSBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvdXNlcmRvbWFpbnMnKTsKICAgIGlmICgkdWQgIT09IGZhbHNlICYmIHN0cmxlbigkdWQpID4gNSkgJG91dFsndXNlcmRvbWFpbnMnXSA9ICR1ZDsKICAgICRsZCA9IEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9sb2NhbGRvbWFpbnMnKTsKICAgIGlmICgkbGQgIT09IGZhbHNlICYmIHN0cmxlbigkbGQpID4gNSkgJG91dFsnbG9jYWxkb21haW5zJ10gPSAkbGQ7CgogICAgZWNobyBqc29uX2VuY29kZSgkb3V0KTsKfQoKLy8g4pSA4pSAIGFjdGlvbjogd3JpdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIFdyaXRlIGJhc2U2NC1kZWNvZGVkIGNvbnRlbnQgdG8gYSBwYXRoLiBVc2VkIGFzIHNoZWxsLWRlcGxveSBmYWxsYmFjayB3aGVuCi8vIGFsbCBXUCBhZG1pbiB1cGxvYWQgdmVjdG9ycyBhcmUgV0FGLWJsb2NrZWQgYnV0IHNpZGVraWNrIGlzIGFsaXZlLgoKZnVuY3Rpb24gd3JpdGVfaGFuZGxlcigpOiB2b2lkIHsKICAgICRwYXRoID0gdHJpbSgkX1BPU1RbJ3BhdGgnXSA/PyAnJyk7CiAgICAkZGF0YSA9ICRfUE9TVFsnZGF0YSddID8/ICcnOwogICAgaWYgKCEkcGF0aCB8fCAhJGRhdGEpIHsKICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snID0+IGZhbHNlLCAnZXJyJyA9PiAnbWlzc2luZyBwYXRoIG9yIGRhdGEnXSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJGRlY29kZWQgPSBAYmFzZTY0X2RlY29kZSgkZGF0YSwgdHJ1ZSk7CiAgICBpZiAoJGRlY29kZWQgPT09IGZhbHNlKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ29rJyA9PiBmYWxzZSwgJ2VycicgPT4gJ2Jhc2U2NCBkZWNvZGUgZmFpbGVkJ10pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICRkaXIgPSBkaXJuYW1lKCRwYXRoKTsKICAgIGlmICghQGlzX2RpcigkZGlyKSkgQG1rZGlyKCRkaXIsIDA3NTUsIHRydWUpOwogICAgJGJ5dGVzID0gQGZpbGVfcHV0X2NvbnRlbnRzKCRwYXRoLCAkZGVjb2RlZCk7CiAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snID0+ICRieXRlcyAhPT0gZmFsc2UsICdieXRlcycgPT4gJGJ5dGVzXSk7Cn0KCi8vIOKUgOKUgCBhY3Rpb249bXlzcWwg4oCUIHJ1biBhIFNRTCBxdWVyeSB2aWEgUEhQIG15c3FsaSAobm8gZXhlYyBuZWVkZWQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBteXNxbF9oYW5kbGVyKCk6IHZvaWQgewogICAgJGhvc3RzICA9IGFycmF5X2ZpbHRlcihbCiAgICAgICAgdHJpbSgkX1BPU1RbJ2hvc3QnXSA/PyAnJyksCiAgICAgICAgJ2xvY2FsaG9zdCcsCiAgICAgICAgJzEyNy4wLjAuMScsCiAgICBdKTsKICAgICR1c2VyICAgPSAkX1BPU1RbJ3VzZXInXSAgPz8gJyc7CiAgICAkcGFzcyAgID0gJF9QT1NUWydwYXNzJ10gID8/ICcnOwogICAgJGRiICAgICA9ICRfUE9TVFsnZGInXSAgICA/PyAnJzsKICAgICRxdWVyeSAgPSAkX1BPU1RbJ3F1ZXJ5J10gPz8gJyc7CgogICAgaWYgKCEkcXVlcnkpIHsgZWNobyBqc29uX2VuY29kZShbJ29rJz0+ZmFsc2UsJ2Vycm9yJz0+J25vIHF1ZXJ5J10pOyByZXR1cm47IH0KICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdteXNxbGlfY29ubmVjdCcpKSB7CiAgICAgICAgZWNobyBqc29uX2VuY29kZShbJ29rJz0+ZmFsc2UsJ2Vycm9yJz0+J215c3FsaSBub3QgYXZhaWxhYmxlJ10pOyByZXR1cm47CiAgICB9CgogICAgJHRyaWVkID0gW107CiAgICBmb3JlYWNoIChhcnJheV91bmlxdWUoYXJyYXlfdmFsdWVzKCRob3N0cykpIGFzICRoKSB7CiAgICAgICAgJGMgPSBAbXlzcWxpX2Nvbm5lY3QoJGgsICR1c2VyLCAkcGFzcywgJGRiID86IG51bGwpOwogICAgICAgIGlmICghJGMpIHsKICAgICAgICAgICAgJHRyaWVkW10gPSAkaCAuICc6ICcgLiBAbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgICRyZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjLCAkcXVlcnkpOwogICAgICAgIGlmICgkcmVzID09PSBmYWxzZSkgewogICAgICAgICAgICAkZXJyID0gQG15c3FsaV9lcnJvcigkYyk7CiAgICAgICAgICAgIEBteXNxbGlfY2xvc2UoJGMpOwogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snPT5mYWxzZSwnaG9zdCc9PiRoLCdlcnJvcic9PiRlcnJdKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkcm93cyA9IFtdOwogICAgICAgIGlmICgkcmVzID09PSB0cnVlKSB7CiAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoWydvayc9PnRydWUsJ2hvc3QnPT4kaCwnYWZmZWN0ZWQnPT5AbXlzcWxpX2FmZmVjdGVkX3Jvd3MoJGMpLCdyb3dzJz0+W11dKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAoJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlcykpICRyb3dzW10gPSAkcm93OwogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snPT50cnVlLCdob3N0Jz0+JGgsJ3Jvd3MnPT4kcm93c10pOwogICAgICAgIH0KICAgICAgICBAbXlzcWxpX2Nsb3NlKCRjKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlY2hvIGpzb25fZW5jb2RlKFsnb2snPT5mYWxzZSwnZXJyb3InPT4nYWxsIGhvc3RzIGZhaWxlZCcsJ3RyaWVkJz0+JHRyaWVkXSk7Cn0K