From 0e5a0d9921291f724f815c21c2d5582d28bc8f16 Mon Sep 17 00:00:00 2001 From: bookworm-admin Date: Tue, 30 Jun 2026 00:34:07 +0800 Subject: [PATCH] Path A C-5: pin issuer X25519 pubkey in client (anti TLS-MITM) Get-BwIssuerPublicKey now validates the live /pubkey response against an embedded pinned kid + full pubkey value (-cne), returns the embedded constant, and fails closed on any mismatch. kid mismatch = rotation signal (outdated exe -> tell user to update); pubkey mismatch = MITM/tamper. Pins the post-rotation key (kid Dqm0ahDMRDg; prior key retired after exposure). Embedded base64 regenerated by build.ps1. Co-Authored-By: Claude Opus 4.8 (1M context) --- auto-setup.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto-setup.ps1 b/auto-setup.ps1 index d8d2f1c..f69155c 100644 --- a/auto-setup.ps1 +++ b/auto-setup.ps1 @@ -1631,7 +1631,7 @@ if ($BwPayloadMissing.Count -gt 0) { $BwPayloadB64 = @{ 'seal-cli.js' = 'Ly8gUGF0aCBBIOKAlCBzZWFsIENMSTog5a6i5oi356uvKFBTNS4xKSDnu48gTm9kZSDlrZDov5vnqIvliqDlr4YgYXV0aGNvZGUg55qE5YWl5Y+j44CCCi8vIOeUqOazlTogZWNobyAneyJyZWNpcGllbnRQdWJsaWNYIjoiPGI2NHVybD4iLCJwbGFpbnRleHQiOiI8anNvbj4ifScgfCBub2RlIHNlYWwtY2xpLmpzCi8vIOi+k+WHujogc3Rkb3V0IOWGmSBDLTMg5a+G5paH5bCB5YyFIEpTT07jgIIKLy8g5a6J5YWoOiDmmI7mlocv5YWs6ZKl57uPIHN0ZGluIOS8oOWFpSAo6Z2eIGFyZ3Yg4oaSIOS4jei/m+i/m+eoi+WIl+ihqC/kuI3ooqvlkIznlKjmiLfov5vnqIvmiKrojrcsIDA4IMKnNy4zKeOAggovLyAgICAgICDlrZDov5vnqIvpmo/ljbPpgIDlh7osIOS4jeaMgeS5heWMluS7u+S9leWvhumSpeadkOaWmeOAggppbXBvcnQgeyBzZWFsIH0gZnJvbSAiLi9jcnlwdG8taGFuZHNoYWtlLmpzIjsKCmxldCBpbnB1dCA9ICIiOwpwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCJ1dGY4Iik7CnByb2Nlc3Muc3RkaW4ub24oImRhdGEiLCAoYykgPT4geyBpbnB1dCArPSBjOyB9KTsKcHJvY2Vzcy5zdGRpbi5vbigiZW5kIiwgKCkgPT4gewogIGxldCByZXE7CiAgdHJ5IHsKICAgIHJlcSA9IEpTT04ucGFyc2UoaW5wdXQpOwogIH0gY2F0Y2ggewogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoInNlYWwtY2xpOiBzdGRpbiDpnZ7lkIjms5UgSlNPTlxuIik7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgfQogIGlmICh0eXBlb2YgcmVxPy5yZWNpcGllbnRQdWJsaWNYICE9PSAic3RyaW5nIiB8fCB0eXBlb2YgcmVxPy5wbGFpbnRleHQgIT09ICJzdHJpbmciKSB7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgic2VhbC1jbGk6IOmcgCB7cmVjaXBpZW50UHVibGljWCwgcGxhaW50ZXh0fVxuIik7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgfQogIHRyeSB7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShzZWFsKHJlcS5wbGFpbnRleHQsIHJlcS5yZWNpcGllbnRQdWJsaWNYKSkpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCJzZWFsLWNsaTog5Yqg5a+G5aSx6LSlOiAiICsgKGU/Lm1lc3NhZ2UgPz8gZSkgKyAiXG4iKTsKICAgIHByb2Nlc3MuZXhpdCgxKTsKICB9Cn0pOwo=' 'crypto-handshake.js' = 'Ly8gUGF0aCBBIOKAlCBhdXRoY29kZSDnq6/liLDnq6/liqDlr4bmj6HmiYsg5Y+C6ICD5a6e546wIChDLTEvQy0yL0MtMyDlpZHnuqYsIFBoYXNlIDEpCi8vCi8vIFvpnIDlrozmlbTlrqrms5Xnoa7orqRdIOacrOaooeWdl+aYr+iupOivgeWKoOWvhuaguOW/g+OAguaehOmAoOmHh+eUqOaIkOeGnyBFQ0lFUyDmt7flkIjliqDlr4YsIOS7heeUqCBOb2RlIOWGhee9riBjcnlwdG8sCi8vIOmbtuesrOS4ieaWueS+nei1luOAguS4iue6v+WJjemhu+e7j+eLrOeri+WuieWFqOivhOWuoeetvuWtlyAo6KeBIDA4IOahoyDCpzcp44CCCi8vCi8vIOiuvuiuoeaEj+Wbvjog5a6i5oi356uvKFBTNS4xIOe7jyBOb2RlIOWtkOi/m+eoiynkuI4gaXNzdWVyKE5vZGUpIOWFseeUqOacrOaWh+S7tiDihpIg5Lik5L6n5ZCM5Luj56CBLAovLyDlpZHnuqblpKnnhLblr7npvZAsIOadnOe7nei3qOWunueOsOWIhuatp+OAgmF1dGhjb2RlIOaYjuaWh+e7neS4jeWHuuWuouaIt+err+i/m+eoizsgcHVibGljIOebsueuoemBk+WPqui9rOWvhuaWh+OAggovLwovLyDmnoTpgKAgKHNlYWxlZC1ib3gg5ZCM5qy+LCDljL/lkI3lj5HpgIHmlrkpOgovLyAgIFgyNTUxOSBFQ0RIKOS4tOaXtuWvhumSpSDDlyBpc3N1ZXIg6Z2Z5oCB5YWs6ZKlKSDihpIgSEtERi1TSEEyNTYg4oaSIEFFUy0yNTYtR0NNCi8vICAgLSDml6Dlj5HpgIHmlrnorqTor4EgKOS4jemcgOimgTogYXV0aGNvZGUg6Ieq6Lqr5Y2z56eY5a+GOyDpmLLph43mlL7pnaAgbm9uY2Ug6KGoICsgdHMg5paw6bKc56qXLCDop4EgaXNzdWVyIOS+pykKLy8gICAtIOavj+asoeaWsOS4tOaXtuWvhumSpSDihpIg5YmN5ZCR5L+d5a+GICjkuIDmrKHkuIDlr4YpCmltcG9ydCBjcnlwdG8gZnJvbSAibm9kZTpjcnlwdG8iOwoKZXhwb3J0IGNvbnN0IEhBTkRTSEFLRV9WRVJTSU9OID0gMTsKLyoqIEhLREYgaW5mbzog5Z+f5YiG6ZqUICsg54mI5pys44CC5a6i5oi356uvL2lzc3VlciDlv4XpobvpgJDlrZfkuIDoh7QsIOaUueWKqOWNs+egtOS6kuaTjeS9nOOAgiAqLwpleHBvcnQgY29uc3QgSEtERl9JTkZPID0gQnVmZmVyLmZyb20oImJvb2t3b3JtLXBhdGhBL3YxIGF1dGhjb2RlLXNlYWwiLCAidXRmOCIpOwpjb25zdCBLRVlfTEVOID0gMzI7IC8vIEFFUy0yNTYKY29uc3QgTk9OQ0VfTEVOID0gMTI7IC8vIEFFUy1HQ00g5qCH5YeGIDk2LWJpdApjb25zdCBUQUdfTEVOID0gMTY7CgovLyDilIDilIAgYmFzZTY0dXJsIOe8luino+eggSAocGFja2V0IOS8oOi+k+eUqCkg4pSA4pSACmNvbnN0IGI2NHUgPSAoYnVmKSA9PiBCdWZmZXIuZnJvbShidWYpLnRvU3RyaW5nKCJiYXNlNjR1cmwiKTsKY29uc3QgdW5iNjR1ID0gKHMpID0+IEJ1ZmZlci5mcm9tKHMsICJiYXNlNjR1cmwiKTsKCi8vIOKUgOKUgCBYMjU1MTkg5Y6f5aeL5YWs56eB6ZKlIOKGlCBKV0sgKE5vZGUg55SoIEpXSyDlj5Yv6K6+IDMyIOWtl+iKguijuOWvhumSpSkg4pSA4pSACmZ1bmN0aW9uIHB1YkZyb21SYXdYKHhCNjR1KSB7CiAgcmV0dXJuIGNyeXB0by5jcmVhdGVQdWJsaWNLZXkoeyBrZXk6IHsga3R5OiAiT0tQIiwgY3J2OiAiWDI1NTE5IiwgeDogeEI2NHUgfSwgZm9ybWF0OiAiandrIiB9KTsKfQpmdW5jdGlvbiBwcml2RnJvbUp3ayhqd2spIHsKICByZXR1cm4gY3J5cHRvLmNyZWF0ZVByaXZhdGVLZXkoeyBrZXk6IGp3aywgZm9ybWF0OiAiandrIiB9KTsKfQpmdW5jdGlvbiByYXdYKGtleU9iamVjdCkgewogIHJldHVybiBrZXlPYmplY3QuZXhwb3J0KHsgZm9ybWF0OiAiandrIiB9KS54OyAvLyBiYXNlNjR1cmwg6KO45YWs6ZKlCn0KCi8qKgogKiDnlJ/miJAgaXNzdWVyIOmdmeaAgeWvhumSpeWvuSAo566h55CG5ZGYL2lzc3VlciDkvqfkuIDmrKHmgKcp44CC56eB6ZKl6aG756a757q/L0hTTSDkv53miqTjgIIKICogQHJldHVybnMge3sga2lkOiBzdHJpbmcsIHB1YmxpY0tleVg6IHN0cmluZywgcHJpdmF0ZUp3azogb2JqZWN0IH19CiAqLwpleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJc3N1ZXJLZXlQYWlyKCkgewogIGNvbnN0IHsgcHVibGljS2V5LCBwcml2YXRlS2V5IH0gPSBjcnlwdG8uZ2VuZXJhdGVLZXlQYWlyU3luYygieDI1NTE5Iik7CiAgY29uc3QgcHVibGljS2V5WCA9IHJhd1gocHVibGljS2V5KTsKICByZXR1cm4geyBraWQ6IGtleUlkKHB1YmxpY0tleVgpLCBwdWJsaWNLZXlYLCBwcml2YXRlSndrOiBwcml2YXRlS2V5LmV4cG9ydCh7IGZvcm1hdDogImp3ayIgfSkgfTsKfQoKLyoqIGtleSBpZCA9IFNIQS0yNTYo6KO45YWs6ZKlKSDliY0gOCDlrZfoioIgYmFzZTY0dXJs44CC55So5LqO5a+G6ZKl6L2u5o2i5pe25qCH6K+GIuWKoOWvhue7meS6huWTquaKiiBpc3N1ZXIg5YWs6ZKlIuOAgiAqLwpleHBvcnQgZnVuY3Rpb24ga2V5SWQocHVibGljS2V5WCkgewogIGNvbnN0IGggPSBjcnlwdG8uY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKHVuYjY0dShwdWJsaWNLZXlYKSkuZGlnZXN0KCk7CiAgcmV0dXJuIGI2NHUoaC5zdWJhcnJheSgwLCA4KSk7Cn0KCi8qKiBBQUQgPSDnu5HlrprlpLTpg6jlrZfmrrUsIOmYsuevoeaUuemHjee7hCAodmVyc2lvbuKAlmtpZOKAlmVwa+KAlm5vbmNlKeOAguS4pOS+p+W/hemhu+WQjOaehOmAoOOAgiAqLwpmdW5jdGlvbiBidWlsZEFhZCh2ZXJzaW9uLCBraWQsIGVwa1gsIG5vbmNlKSB7CiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoWwogICAgQnVmZmVyLmZyb20oW3ZlcnNpb25dKSwKICAgIEJ1ZmZlci5mcm9tKGtpZCwgInV0ZjgiKSwKICAgIHVuYjY0dShlcGtYKSwKICAgIG5vbmNlLAogIF0pOwp9CgovKiogSEtERiDmtL7nlJ/lr7nnp7Dlr4bpkqXjgIJzYWx0IOe7keWumiAo5Li05pe25YWs6ZKl4oCW5o6l5pS25pa55YWs6ZKlKSwg5L2/5a+G6ZKl5LiO5pys5qyh5o+h5omL5by657uR5a6a44CCICovCmZ1bmN0aW9uIGRlcml2ZUtleShzaGFyZWQsIGVwa1gsIHJlY2lwaWVudFgpIHsKICBjb25zdCBzYWx0ID0gQnVmZmVyLmNvbmNhdChbdW5iNjR1KGVwa1gpLCB1bmI2NHUocmVjaXBpZW50WCldKTsKICByZXR1cm4gQnVmZmVyLmZyb20oY3J5cHRvLmhrZGZTeW5jKCJzaGEyNTYiLCBzaGFyZWQsIHNhbHQsIEhLREZfSU5GTywgS0VZX0xFTikpOwp9CgovKioKICog5Yqg5a+GIGF1dGhjb2RlIOKGkiDlr4bmloflsIHljIUgKOWuouaIt+err+S+pynjgIIKICogQHBhcmFtIHtzdHJpbmd9IHBsYWludGV4dCAgICAgICAgYXV0aGNvZGUg5piO5paHICjlpoIgQldBLTwzMmhleD4pCiAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnRQdWJsaWNYIGlzc3VlciDpnZnmgIHlhazpkqUgKGJhc2U2NHVybCDoo7ggMzIg5a2X6IqCKQogKiBAcmV0dXJucyB7b2JqZWN0fSBwYWNrZXQgKEMtMyBzY2hlbWEpCiAqLwpleHBvcnQgZnVuY3Rpb24gc2VhbChwbGFpbnRleHQsIHJlY2lwaWVudFB1YmxpY1gpIHsKICBjb25zdCBraWQgPSBrZXlJZChyZWNpcGllbnRQdWJsaWNYKTsKICBjb25zdCByZWNpcGllbnRQdWIgPSBwdWJGcm9tUmF3WChyZWNpcGllbnRQdWJsaWNYKTsKICAvLyDkuLTml7blr4bpkqXlr7kgKOS4gOasoeS4gOWvhikKICBjb25zdCBlcGggPSBjcnlwdG8uZ2VuZXJhdGVLZXlQYWlyU3luYygieDI1NTE5Iik7CiAgY29uc3QgZXBrWCA9IHJhd1goZXBoLnB1YmxpY0tleSk7CiAgY29uc3Qgc2hhcmVkID0gY3J5cHRvLmRpZmZpZUhlbGxtYW4oeyBwcml2YXRlS2V5OiBlcGgucHJpdmF0ZUtleSwgcHVibGljS2V5OiByZWNpcGllbnRQdWIgfSk7CiAgY29uc3Qga2V5ID0gZGVyaXZlS2V5KHNoYXJlZCwgZXBrWCwgcmVjaXBpZW50UHVibGljWCk7CiAgY29uc3Qgbm9uY2UgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoTk9OQ0VfTEVOKTsKICBjb25zdCBhYWQgPSBidWlsZEFhZChIQU5EU0hBS0VfVkVSU0lPTiwga2lkLCBlcGtYLCBub25jZSk7CiAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCJhZXMtMjU2LWdjbSIsIGtleSwgbm9uY2UsIHsgYXV0aFRhZ0xlbmd0aDogVEFHX0xFTiB9KTsKICBjaXBoZXIuc2V0QUFEKGFhZCk7CiAgY29uc3QgY3QgPSBCdWZmZXIuY29uY2F0KFtjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKHBsYWludGV4dCwgInV0ZjgiKSksIGNpcGhlci5maW5hbCgpXSk7CiAgY29uc3QgdGFnID0gY2lwaGVyLmdldEF1dGhUYWcoKTsKICByZXR1cm4gewogICAgdjogSEFORFNIQUtFX1ZFUlNJT04sCiAgICBraWQsCiAgICBlcGs6IGVwa1gsCiAgICBub25jZTogYjY0dShub25jZSksCiAgICBjdDogYjY0dShjdCksCiAgICB0YWc6IGI2NHUodGFnKSwKICB9Owp9CgovKioKICog6Kej5a+G5a+G5paH5bCB5YyFIOKGkiBhdXRoY29kZSDmmI7mlocgKGlzc3VlciDkvqcp44CCCiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrZXQgICAgICBzZWFsKCkg5Lqn5Ye655qE5bCB5YyFCiAqIEBwYXJhbSB7b2JqZWN0fSBpc3N1ZXJQcml2SndrICBpc3N1ZXIg56eB6ZKlIEpXSyAo5p2l6IeqIGdlbmVyYXRlSXNzdWVyS2V5UGFpcigpLnByaXZhdGVKd2spCiAqIEByZXR1cm5zIHtzdHJpbmd9IGF1dGhjb2RlIOaYjuaWhwogKiBAdGhyb3dzIOeJiOacrC9raWQg5LiN56ym44CB56+h5pS5IChHQ00gdGFnIOagoemqjOWksei0pSnjgIHlrZfmrrXnvLrlpLEg4oaSIOaKm+mUmSAoaXNzdWVyIOW6lOiusOS4uuaUu+WHu+S/oeWPtykKICovCmV4cG9ydCBmdW5jdGlvbiBvcGVuKHBhY2tldCwgaXNzdWVyUHJpdkp3aykgewogIGlmICghcGFja2V0IHx8IHBhY2tldC52ICE9PSBIQU5EU0hBS0VfVkVSU0lPTikgdGhyb3cgbmV3IEVycm9yKGBoYW5kc2hha2U6IOeJiOacrOS4jeespiB2PSR7cGFja2V0Py52fWApOwogIGZvciAoY29uc3QgZiBvZiBbImtpZCIsICJlcGsiLCAibm9uY2UiLCAiY3QiLCAidGFnIl0pIHsKICAgIGlmICh0eXBlb2YgcGFja2V0W2ZdICE9PSAic3RyaW5nIikgdGhyb3cgbmV3IEVycm9yKGBoYW5kc2hha2U6IOWwgeWMheWtl+autee8uuWksS/nsbvlnovplJkgJHtmfWApOwogIH0KICBjb25zdCBwcml2ID0gcHJpdkZyb21Kd2soaXNzdWVyUHJpdkp3ayk7CiAgY29uc3QgaXNzdWVyUHViWCA9IHJhd1goY3J5cHRvLmNyZWF0ZVB1YmxpY0tleShwcml2KSk7CiAgaWYgKHBhY2tldC5raWQgIT09IGtleUlkKGlzc3VlclB1YlgpKSB0aHJvdyBuZXcgRXJyb3IoImhhbmRzaGFrZToga2lkIOS4jeWMuemFjeacrCBpc3N1ZXIg5YWs6ZKlICjlr4bpkqXova7mjaI/KSIpOwogIGNvbnN0IGVwaFB1YiA9IHB1YkZyb21SYXdYKHBhY2tldC5lcGspOwogIGNvbnN0IHNoYXJlZCA9IGNyeXB0by5kaWZmaWVIZWxsbWFuKHsgcHJpdmF0ZUtleTogcHJpdiwgcHVibGljS2V5OiBlcGhQdWIgfSk7CiAgY29uc3Qga2V5ID0gZGVyaXZlS2V5KHNoYXJlZCwgcGFja2V0LmVwaywgaXNzdWVyUHViWCk7CiAgY29uc3Qgbm9uY2UgPSB1bmI2NHUocGFja2V0Lm5vbmNlKTsKICBjb25zdCBhYWQgPSBidWlsZEFhZChIQU5EU0hBS0VfVkVSU0lPTiwgcGFja2V0LmtpZCwgcGFja2V0LmVwaywgbm9uY2UpOwogIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoImFlcy0yNTYtZ2NtIiwga2V5LCBub25jZSwgeyBhdXRoVGFnTGVuZ3RoOiBUQUdfTEVOIH0pOwogIGRlY2lwaGVyLnNldEFBRChhYWQpOwogIGRlY2lwaGVyLnNldEF1dGhUYWcodW5iNjR1KHBhY2tldC50YWcpKTsKICBjb25zdCBwdCA9IEJ1ZmZlci5jb25jYXQoW2RlY2lwaGVyLnVwZGF0ZSh1bmI2NHUocGFja2V0LmN0KSksIGRlY2lwaGVyLmZpbmFsKCldKTsgLy8gdGFnIOmUmeKGkmZpbmFsIOaKmwogIHJldHVybiBwdC50b1N0cmluZygidXRmOCIpOwp9Cg==' - 'bw-tokenexchange.ps1' = 'I1JlcXVpcmVzIC1WZXJzaW9uIDUuMQo8IwouU1lOT1BTSVMKICAgIEJvb2t3b3JtIFBhdGggQSDigJQgdG9rZW4tZXhjaGFuZ2Ug5YWx5Lqr5qih5Z2XIChkb3Qtc291cmNlIOi/myBhdXRvLXNldHVwLnBzMSAvIGJ3LW90YS5wczEpCiAgICDniYjmnKw6IG1vZHVsZS12MC4xICgyMDI2LTA2LTI5LCDnlLEgY2xvbmUtdG9rZW5leGNoYW5nZS5wczEg6I2J56i/IHByb2R1Y3Rpb25pemUpCi5ERVNDUklQVElPTgogICAgImF1dGhjb2RlIOKGkiDnq6/liLDnq6/liqDlr4Yoc2VhbC1jbGkpIOKGkiBwdWJsaWMg55uy566h6YGTIOKGkiBpc3N1ZXIg4oaSIOefreacnyB0b2tlbiDihpIg56eB5pyJIGNsb25lL3B1bGwi44CCCiAgICDmnKzmqKHlnZfku4XlkKvlh73mlbAv5bi46YeP5a6a5LmJLCDml6DpobblsYLlia/kvZznlKgg4oaSIOWPr+WuieWFqCBkb3Qtc291cmNl44CCCiAgICDliIblj5HkvY3nva46IH4vLmNsYXVkZS9pc3N1ZXIvYnctdG9rZW5leGNoYW5nZS5wczEgKOmajyBzZWFsLWNsaS5qcyArIGNyeXB0by1oYW5kc2hha2UuanMg5LiA6LW36JC95ZywKeOAggouTk9URVMKICAgIFBTNS4xIOWFvOWuuTog5LiN55SoID8uIC8gPz89IDsg5a2X6IqC5pWw57uE5pi+5byPIFtieXRlW11dIDsg5ZOI5biM5a2Y5Zyo5oCn55SoIC5Db250YWluc0tleSgp44CCCiAgICDkuKXnpoHmmI7mlofpmY3nuqc6IOWKoOWvhi/mjaIgdG9rZW4g5aSx6LSl5LiA5b6L6L+U5ZueICRudWxsLCDosIPnlKjmlrnkuK3mraIsIOe7neS4jeWbnumAgOi0puWvhiAowqdBKyAjNCnjgIIKIz4KCiMg4pSA4pSAIGlzc3VlciDnq6/ngrnluLjph48gW+eUn+S6p+WAvDogMDYyOSDokL3lnLAgYXV0aC5ib29rd29ybXdlYi5jb20sIOWFrOe9kSBETVrihpIxMjcuMC4wLjE6ODc4N10g4pSA4pSACmlmICgtbm90ICRCV19JU1NVRVJfQkFTRSkgICAgICB7ICRCV19JU1NVRVJfQkFTRSAgICAgID0gImh0dHBzOi8vYXV0aC5ib29rd29ybXdlYi5jb20iIH0KaWYgKC1ub3QgJEJXX1BVQkxJQ19QSVBFX1BBVEgpIHsgJEJXX1BVQkxJQ19QSVBFX1BBVEggPSAiL2FwaS92MS9hdXRoL3Rva2VuLWV4Y2hhbmdlIiB9CmlmICgtbm90ICRCV19QVUJLRVlfUEFUSCkgICAgICB7ICRCV19QVUJLRVlfUEFUSCAgICAgID0gIi9hcGkvdjEvYXV0aC9wdWJrZXkiIH0KaWYgKC1ub3QgJEJXX1RPS0VOX1RUTF9TRUMpICAgIHsgJEJXX1RPS0VOX1RUTF9TRUMgICAgPSAzMDAgfSAgICMgW+mcgOWujOaVtOWuquazleehruiupDog5LiOIGlzc3VlciBUVEwg5a+56b2QXQoKIyDpu5jorqQgc2VhbC1jbGkgLyBub2RlIOS9jee9riAo6ZqP5qC45b+D5YiG5Y+R5YiwIH4vLmNsYXVkZS9pc3N1ZXIvKQokQldfU0VBTF9DTEkgPSAoSm9pbi1QYXRoICRlbnY6VVNFUlBST0ZJTEUgIi5jbGF1ZGVcaXNzdWVyXHNlYWwtY2xpLmpzIikKJEJXX05PREVfRVhFID0gIm5vZGUiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEdldC1Cd0RldmljZUlkIOKAlCDnqLPlrprnmoTmr4/orr7lpIfmoIfor4YgKGRldmljZS1DQVMg5om/6YeN6Ziy6YeN5oyJ5q2k6ZSuLCDop4EgaXNzdWVyIGRldmljZS1jYXMuanMpCiMgICBNYWNoaW5lR3VpZCDkvJjlhYgg4oaSIOWbnumAgCDmnLrlkI0r55So5oi3U0lEIOeahCBTSEEyNTYg5oiq5patIOKGkiDlhZzlupUgInVua25vd24tZGV2aWNlIuOAggojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBHZXQtQndEZXZpY2VJZCB7CiAgICB0cnkgewogICAgICAgICRtZyA9IChHZXQtSXRlbVByb3BlcnR5IC1QYXRoICJIS0xNOlxTT0ZUV0FSRVxNaWNyb3NvZnRcQ3J5cHRvZ3JhcGh5IiAtTmFtZSBNYWNoaW5lR3VpZCAtRXJyb3JBY3Rpb24gU3RvcCkuTWFjaGluZUd1aWQKICAgICAgICBpZiAoJG1nKSB7IHJldHVybiBbc3RyaW5nXSRtZyB9CiAgICB9IGNhdGNoIHt9CiAgICB0cnkgewogICAgICAgICRzaWQgPSAoW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuV2luZG93c0lkZW50aXR5XTo6R2V0Q3VycmVudCgpKS5Vc2VyLlZhbHVlCiAgICAgICAgJHNoYSA9IFtTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlNIQTI1Nl06OkNyZWF0ZSgpCiAgICAgICAgJGJ5dGVzID0gJHNoYS5Db21wdXRlSGFzaChbU3lzdGVtLlRleHQuRW5jb2RpbmddOjpVVEY4LkdldEJ5dGVzKCIkZW52OkNPTVBVVEVSTkFNRXwkc2lkIikpCiAgICAgICAgcmV0dXJuICgoW1N5c3RlbS5CaXRDb252ZXJ0ZXJdOjpUb1N0cmluZygkYnl0ZXMpIC1yZXBsYWNlICctJywnJykuU3Vic3RyaW5nKDAsMzIpKS5Ub0xvd2VyKCkKICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiAidW5rbm93bi1kZXZpY2UiCiAgICB9Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2V0LUJ3SXNzdWVyUHVibGljS2V5IOKAlCDlj5YgaXNzdWVyIFgyNTUxOSDlhazpkqUgKEJhc2U2NHVybCkKIyAgIFvpnIDlrozmlbTlrqrms5Xnoa7orqQgQy01XSBUTFMg6K+B5LmmL1NQS0kg5Zu65a6aOiDpmLIgcHVibGljIOiiq+aUu+mZt+aNouWFrOmSpeS4remXtOS6uiAo5LiK57q/5YmN5b+F6ZetKeOAggojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBHZXQtQndJc3N1ZXJQdWJsaWNLZXkgewogICAgcGFyYW0oW3N0cmluZ10kSXNzdWVyQmFzZSA9ICRCV19JU1NVRVJfQkFTRSwgW3N0cmluZ10kUHVia2V5UGF0aCA9ICRCV19QVUJLRVlfUEFUSCkKICAgICR1cmwgPSAiJElzc3VlckJhc2UkUHVia2V5UGF0aCIKICAgIHRyeSB7CiAgICAgICAgJHJlc3AgPSBJbnZva2UtV2ViUmVxdWVzdCAtVXJpICR1cmwgLU1ldGhvZCBHRVQgLVVzZUJhc2ljUGFyc2luZyAtVGltZW91dFNlYyAxNQogICAgICAgIGlmICgkcmVzcC5TdGF0dXNDb2RlIC1uZSAyMDApIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDlhazpkqXnq6/ngrnov5Tlm54gJCgkcmVzcC5TdGF0dXNDb2RlKSI7IHJldHVybiAkbnVsbCB9CiAgICAgICAgJGJvZHkgPSAkcmVzcC5Db250ZW50IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgIGlmICgkYm9keSAtYW5kICRib2R5LnB1YmtleSkgeyByZXR1cm4gW3N0cmluZ10kYm9keS5wdWJrZXkgfQogICAgICAgIFdyaXRlLVdhcm5pbmcgIltCVy1UWF0g5YWs6ZKl5ZON5bqU5qC85byP5LiN56ymIjsgcmV0dXJuICRudWxsCiAgICB9IGNhdGNoIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDojrflj5YgaXNzdWVyIOWFrOmSpeWksei0pTogJF8iOyByZXR1cm4gJG51bGwgfQp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFByb3RlY3QtQndBdXRoY29kZSDigJQg57uPIE5vZGUg5a2Q6L+b56iLIHNlYWwtY2xpIOerr+WIsOerr+WKoOWvhiBhdXRoY29kZQojICAg5piO5paHIHthYyxkZXYsdHN9IOe7jyBzdGRpbiAo6Z2eIGFyZ3YpIOS8oOWFpSDihpIg5LiN6L+b6L+b56iL5YiX6KGoICgwOCDCpzcuMynjgIIKIyAgIOWksei0pei/lOWbniAkbnVsbCDihpIg6LCD55So5pa55Lit5q2iLCDkuKXnpoHmmI7mlofpmY3nuqfjgIIKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gUHJvdGVjdC1Cd0F1dGhjb2RlIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRBdXRoY29kZSwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kSXNzdWVyUHVia2V5QjY0LAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSREZXZpY2VJZCwKICAgICAgICBbc3RyaW5nXSRTZWFsQ2xpID0gJEJXX1NFQUxfQ0xJLAogICAgICAgIFtzdHJpbmddJE5vZGVFeGUgPSAkQldfTk9ERV9FWEUKICAgICkKICAgICR0c01zID0gW2xvbmddKFtEYXRlVGltZU9mZnNldF06OlV0Y05vdy5Ub1VuaXhUaW1lTWlsbGlzZWNvbmRzKCkpCiAgICAkcGxhaW50ZXh0ID0gKEB7IGFjID0gJEF1dGhjb2RlOyBkZXYgPSAkRGV2aWNlSWQ7IHRzID0gJHRzTXMgfSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcykKICAgICRzdGRpbkpzb24gPSAoQHsgcmVjaXBpZW50UHVibGljWCA9ICRJc3N1ZXJQdWJrZXlCNjQ7IHBsYWludGV4dCA9ICRwbGFpbnRleHQgfSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcykKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFNlYWxDbGkpKSB7IFdyaXRlLVdhcm5pbmcgIltCVy1UWF0g5pyq5om+5YiwIHNlYWwtY2xpOiAkU2VhbENsaSI7IHJldHVybiAkbnVsbCB9CiAgICB0cnkgewogICAgICAgICRwYWNrZXQgPSAoJHN0ZGluSnNvbiB8ICYgJE5vZGVFeGUgLS1uby13YXJuaW5ncyAkU2VhbENsaSAyPiRudWxsKSAtam9pbiAiIgogICAgICAgIGlmICgkTEFTVEVYSVRDT0RFIC1uZSAwIC1vciBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRwYWNrZXQpKSB7CiAgICAgICAgICAgIFdyaXRlLVdhcm5pbmcgIltCVy1UWF0gc2VhbC1jbGkg5Yqg5a+G5aSx6LSlIChleGl0PSRMQVNURVhJVENPREUpIjsgcmV0dXJuICRudWxsCiAgICAgICAgfQogICAgICAgIHJldHVybiAkcGFja2V0CiAgICB9IGNhdGNoIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDosIPnlKggc2VhbC1jbGkg5byC5bi4OiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSI7IHJldHVybiAkbnVsbCB9Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2V0LUJ3U2hvcnRMaXZlZFRva2VuIOKAlCBhdXRoY29kZSDihpIg5Yqg5a+GIOKGkiBQT1NUIOebsueuoemBkyDihpIg55+t5pyf5Y+q6K+7IHRva2VuCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmZ1bmN0aW9uIEdldC1Cd1Nob3J0TGl2ZWRUb2tlbiB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kQXV0aGNvZGUsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJERldmljZUlkLAogICAgICAgIFtzdHJpbmddJElzc3VlckJhc2UgPSAkQldfSVNTVUVSX0JBU0UKICAgICkKICAgICRwdWJrZXlCNjQgPSBHZXQtQndJc3N1ZXJQdWJsaWNLZXkgLUlzc3VlckJhc2UgJElzc3VlckJhc2UKICAgIGlmICgtbm90ICRwdWJrZXlCNjQpIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDml6Dms5Xojrflj5YgaXNzdWVyIOWFrOmSpSwg5Lit5q2iIjsgcmV0dXJuICRudWxsIH0KICAgICRwYXlsb2FkID0gUHJvdGVjdC1Cd0F1dGhjb2RlIC1BdXRoY29kZSAkQXV0aGNvZGUgLUlzc3VlclB1YmtleUI2NCAkcHVia2V5QjY0IC1EZXZpY2VJZCAkRGV2aWNlSWQKICAgICMgwqdBKyAjNDog5Yqg5a+G5aSx6LSl5Lil56aB5re75YqgIuWPkeaYjuaWhyIgZmFsbGJhY2sg5YiG5pSv44CCCiAgICBpZiAoLW5vdCAkcGF5bG9hZCkgeyBXcml0ZS1XYXJuaW5nICJbQlctVFhdIGF1dGhjb2RlIOWKoOWvhuWksei0pSwg5Lit5q2iIjsgcmV0dXJuICRudWxsIH0KCiAgICAkcGlwZVVybCA9ICIkSXNzdWVyQmFzZSRCV19QVUJMSUNfUElQRV9QQVRIIgogICAgdHJ5IHsKICAgICAgICAkYm9keUpzb24gPSAoQHsgdmVyc2lvbiA9ICIxIjsgY2FwYWJpbGl0eSA9ICJlbmNyeXB0ZWQiOyBwYXlsb2FkID0gJHBheWxvYWQgfSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcykKICAgICAgICAkcmVzcCA9IEludm9rZS1XZWJSZXF1ZXN0IC1VcmkgJHBpcGVVcmwgLU1ldGhvZCBQT1NUIC1Db250ZW50VHlwZSAiYXBwbGljYXRpb24vanNvbiIgLUJvZHkgJGJvZHlKc29uIC1Vc2VCYXNpY1BhcnNpbmcgLVRpbWVvdXRTZWMgMzAKICAgICAgICBpZiAoJHJlc3AuU3RhdHVzQ29kZSAtZXEgMjAwKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkcmVzcC5Db250ZW50IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgICAgICBpZiAoJHJlc3VsdCAtYW5kICRyZXN1bHQudG9rZW4pIHsgcmV0dXJuIFtzdHJpbmddJHJlc3VsdC50b2tlbiB9CiAgICAgICAgICAgIFdyaXRlLVdhcm5pbmcgIltCVy1UWF0g55uy566h6YGT5ZON5bqU57y6IHRva2VuIOWtl+autSI7IHJldHVybiAkbnVsbAogICAgICAgIH0KICAgICAgICBXcml0ZS1XYXJuaW5nICJbQlctVFhdIOebsueuoemBk+i/lOWbniAkKCRyZXNwLlN0YXR1c0NvZGUpIjsgcmV0dXJuICRudWxsCiAgICB9IGNhdGNoIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSBQT1NUIOebsueuoemBk+W8guW4uDogJF8iOyByZXR1cm4gJG51bGwgfQp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEdldC1Cd1Rva2VuQXV0aEhlYWRlciDigJQg55So55+t5pyfIHRva2VuIOaehOmAoCBHaXRlYSBBUEkvcmF3IOivt+axguWktCAoT1RBIOeJiOacrOafpeivoueUqCkKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gR2V0LUJ3VG9rZW5BdXRoSGVhZGVyIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRTaG9ydExpdmVkVG9rZW4pCiAgICByZXR1cm4gQHsgQXV0aG9yaXphdGlvbiA9ICJ0b2tlbiAkU2hvcnRMaXZlZFRva2VuIiB9Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgSW52b2tlLUJ3QXV0aG9yaXplZENsb25lIOKAlCDnn63mnJ8gdG9rZW4gY2xvbmUg56eB5pyJ5LuTOyDnlKjlrozljbPmuIUsIOS4jeiQvSBDcmVkZW50aWFsIE1hbmFnZXIKIyAgIFvpnIDlrozmlbTlrqrms5Xnoa7orqQgQy02XSDkvJjlhYggR0lUX0FTS1BBU1Mg5pu/5LujIFVSTCDltYzlhaUgdG9rZW4gKOmYsui/m+eoi+WIl+ihqOazhOmcsinjgIIKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gSW52b2tlLUJ3QXV0aG9yaXplZENsb25lIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRSZXBvVXJsLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSREZXN0RGlyLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRTaG9ydExpdmVkVG9rZW4sCiAgICAgICAgW3N0cmluZ10kR2l0VXNlcm5hbWUgPSAiYnctdG9rZW4iLAogICAgICAgIFtpbnRdJENsb25lRGVwdGggPSAxLAogICAgICAgIFtzdHJpbmddJExvZ0xhYmVsID0gIuaOiOadg+WFi+mahiIKICAgICkKICAgICR1cmkgPSBbU3lzdGVtLlVyaV0kUmVwb1VybAogICAgJGF1dGhlZFVybCA9ICIkKCR1cmkuU2NoZW1lKTovLyQoW1N5c3RlbS5VcmldOjpFc2NhcGVEYXRhU3RyaW5nKCRHaXRVc2VybmFtZSkpOiQoW1N5c3RlbS5VcmldOjpFc2NhcGVEYXRhU3RyaW5nKCRTaG9ydExpdmVkVG9rZW4pKUAkKCR1cmkuSG9zdCkkKCR1cmkuUGF0aEFuZFF1ZXJ5KSIKICAgIGlmIChUZXN0LVBhdGggJERlc3REaXIpIHsgV3JpdGUtV2FybmluZyAiW0JXLUNsb25lXSDnm67moIfnm67lvZXlt7LlrZjlnKg6ICREZXN0RGlyIiB9CiAgICAkY2xvbmVBcmdzID0gQCgiLWMiLCAiY3JlZGVudGlhbC5oZWxwZXI9IiwgImNsb25lIiwgIi0tZGVwdGgiLCAiJENsb25lRGVwdGgiLCAkYXV0aGVkVXJsLCAkRGVzdERpcikKICAgICRlcnJMb2cgPSAiJGVudjpURU1QXGJ3LWNsb25lLWVyci0kUElELnR4dCIKICAgIHRyeSB7CiAgICAgICAgJHByb2MgPSBTdGFydC1Qcm9jZXNzICJnaXQiIC1Bcmd1bWVudExpc3QgJGNsb25lQXJncyAtV2FpdCAtUGFzc1RocnUgLU5vTmV3V2luZG93IC1SZWRpcmVjdFN0YW5kYXJkRXJyb3IgJGVyckxvZwogICAgICAgICRleGl0Q29kZSA9ICRwcm9jLkV4aXRDb2RlCiAgICB9IGNhdGNoIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICJbQlctQ2xvbmVdIGdpdCBjbG9uZSDov5vnqIvlkK/liqjlpLHotKU6ICRfIjsgJGV4aXRDb2RlID0gLTEKICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKFRlc3QtUGF0aCAkZXJyTG9nKSB7IFJlbW92ZS1JdGVtICRlcnJMb2cgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlIH0KICAgICAgICBSZW1vdmUtVmFyaWFibGUgLU5hbWUgYXV0aGVkVXJsIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgUmVtb3ZlLVZhcmlhYmxlIC1OYW1lIFNob3J0TGl2ZWRUb2tlbiAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgfQogICAgaWYgKCRleGl0Q29kZSAtbmUgMCkgeyBXcml0ZS1XYXJuaW5nICJbQlctQ2xvbmVdICRMb2dMYWJlbCDlpLHotKUgKGV4aXQ9JGV4aXRDb2RlKSI7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgSW52b2tlLUJ3QXV0aG9yaXplZFB1bGwg4oCUIOefreacnyB0b2tlbiBwdWxsIOW3suacieS7kzsg5Li05pe25pS5IHJlbW90ZSBVUkwsIOWujOaIkOWNs+i/mOWOnwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBJbnZva2UtQndBdXRob3JpemVkUHVsbCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUmVwb0RpciwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kU2hvcnRMaXZlZFRva2VuLAogICAgICAgIFtzdHJpbmddJEdpdFVzZXJuYW1lID0gImJ3LXRva2VuIiwKICAgICAgICBbc3RyaW5nXSRMb2dMYWJlbCA9ICLmjojmnYMgcHVsbCIKICAgICkKICAgICRvcmlnVXJsID0gJG51bGwKICAgIHRyeSB7CiAgICAgICAgJG9yaWdVcmwgPSAoJiBnaXQgLUMgJFJlcG9EaXIgcmVtb3RlIGdldC11cmwgb3JpZ2luIDI+JG51bGwpCiAgICAgICAgaWYgKC1ub3QgJG9yaWdVcmwpIHsgV3JpdGUtV2FybmluZyAiW0JXLVB1bGxdIOaXoOazleiOt+WPliBvcmlnaW4gVVJMIjsgcmV0dXJuICRmYWxzZSB9CiAgICAgICAgJHVyaSA9IFtTeXN0ZW0uVXJpXSRvcmlnVXJsLlRyaW0oKQogICAgICAgICRhdXRoZWRVcmwgPSAiJCgkdXJpLlNjaGVtZSk6Ly8kKFtTeXN0ZW0uVXJpXTo6RXNjYXBlRGF0YVN0cmluZygkR2l0VXNlcm5hbWUpKTokKFtTeXN0ZW0uVXJpXTo6RXNjYXBlRGF0YVN0cmluZygkU2hvcnRMaXZlZFRva2VuKSlAJCgkdXJpLkhvc3QpJCgkdXJpLlBhdGhBbmRRdWVyeSkiCiAgICAgICAgJiBnaXQgLUMgJFJlcG9EaXIgcmVtb3RlIHNldC11cmwgb3JpZ2luICRhdXRoZWRVcmwgMj4kbnVsbAogICAgICAgICYgZ2l0IC1DICRSZXBvRGlyIHB1bGwgLS1yZWJhc2UgLS1hdXRvc3Rhc2ggMj4mMSB8IE91dC1OdWxsCiAgICAgICAgJGV4aXRDb2RlID0gJExBU1RFWElUQ09ERQogICAgfSBjYXRjaCB7CiAgICAgICAgV3JpdGUtV2FybmluZyAiW0JXLVB1bGxdIHB1bGwg5byC5bi4OiAkXyI7ICRleGl0Q29kZSA9IC0xCiAgICB9IGZpbmFsbHkgewogICAgICAgIGlmICgkb3JpZ1VybCkgeyAmIGdpdCAtQyAkUmVwb0RpciByZW1vdGUgc2V0LXVybCBvcmlnaW4gJG9yaWdVcmwuVHJpbSgpIDI+JG51bGwgfQogICAgICAgIFJlbW92ZS1WYXJpYWJsZSAtTmFtZSBhdXRoZWRVcmwgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICBSZW1vdmUtVmFyaWFibGUgLU5hbWUgU2hvcnRMaXZlZFRva2VuIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICB9CiAgICBpZiAoJGV4aXRDb2RlIC1uZSAwKSB7IFdyaXRlLVdhcm5pbmcgIltCVy1QdWxsXSAkTG9nTGFiZWwg5aSx6LSlIChleGl0PSRleGl0Q29kZSkiOyByZXR1cm4gJGZhbHNlIH0KICAgIHJldHVybiAkdHJ1ZQp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJlcXVlc3QtQndBdXRoY29kZUZyb21Vc2VyIOKAlCBHVUkg6L6T5YWl5qGG5Y+WIGF1dGhjb2RlICjmm7/mjaIgU2hvdy1HaXRlYUNyZWRlbnRpYWxEaWFsb2cpCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmZ1bmN0aW9uIFJlcXVlc3QtQndBdXRoY29kZUZyb21Vc2VyIHsKICAgIHBhcmFtKAogICAgICAgIFtzdHJpbmddJFRpdGxlID0gIkJvb2t3b3JtIOaOiOadg+a/gOa0uyIsCiAgICAgICAgW3N0cmluZ10kTWVzc2FnZSA9ICLor7fovpPlhaXmgqjnmoQgQm9va3dvcm0g5r+A5rS756CBIChhdXRoY29kZSk6IgogICAgKQogICAgdHJ5IHsKICAgICAgICBBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIE1pY3Jvc29mdC5WaXN1YWxCYXNpYyAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgICRhdXRoY29kZSA9IFtNaWNyb3NvZnQuVmlzdWFsQmFzaWMuSW50ZXJhY3Rpb25dOjpJbnB1dEJveCgkTWVzc2FnZSwgJFRpdGxlLCAiIikKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkYXV0aGNvZGUpKSB7IHJldHVybiAkbnVsbCB9CiAgICAgICAgcmV0dXJuICRhdXRoY29kZS5UcmltKCkKICAgIH0gY2F0Y2ggewogICAgICAgIFdyaXRlLUhvc3QgJE1lc3NhZ2UgLUZvcmVncm91bmRDb2xvciBDeWFuCiAgICAgICAgJGF1dGhjb2RlID0gUmVhZC1Ib3N0CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGF1dGhjb2RlKSkgeyByZXR1cm4gJG51bGwgfQogICAgICAgIHJldHVybiAkYXV0aGNvZGUuVHJpbSgpCiAgICB9Cn0K' + 'bw-tokenexchange.ps1' = 'I1JlcXVpcmVzIC1WZXJzaW9uIDUuMQo8IwouU1lOT1BTSVMKICAgIEJvb2t3b3JtIFBhdGggQSDigJQgdG9rZW4tZXhjaGFuZ2Ug5YWx5Lqr5qih5Z2XIChkb3Qtc291cmNlIOi/myBhdXRvLXNldHVwLnBzMSAvIGJ3LW90YS5wczEpCiAgICDniYjmnKw6IG1vZHVsZS12MC4xICgyMDI2LTA2LTI5LCDnlLEgY2xvbmUtdG9rZW5leGNoYW5nZS5wczEg6I2J56i/IHByb2R1Y3Rpb25pemUpCi5ERVNDUklQVElPTgogICAgImF1dGhjb2RlIOKGkiDnq6/liLDnq6/liqDlr4Yoc2VhbC1jbGkpIOKGkiBwdWJsaWMg55uy566h6YGTIOKGkiBpc3N1ZXIg4oaSIOefreacnyB0b2tlbiDihpIg56eB5pyJIGNsb25lL3B1bGwi44CCCiAgICDmnKzmqKHlnZfku4XlkKvlh73mlbAv5bi46YeP5a6a5LmJLCDml6DpobblsYLlia/kvZznlKgg4oaSIOWPr+WuieWFqCBkb3Qtc291cmNl44CCCiAgICDliIblj5HkvY3nva46IH4vLmNsYXVkZS9pc3N1ZXIvYnctdG9rZW5leGNoYW5nZS5wczEgKOmajyBzZWFsLWNsaS5qcyArIGNyeXB0by1oYW5kc2hha2UuanMg5LiA6LW36JC95ZywKeOAggouTk9URVMKICAgIFBTNS4xIOWFvOWuuTog5LiN55SoID8uIC8gPz89IDsg5a2X6IqC5pWw57uE5pi+5byPIFtieXRlW11dIDsg5ZOI5biM5a2Y5Zyo5oCn55SoIC5Db250YWluc0tleSgp44CCCiAgICDkuKXnpoHmmI7mlofpmY3nuqc6IOWKoOWvhi/mjaIgdG9rZW4g5aSx6LSl5LiA5b6L6L+U5ZueICRudWxsLCDosIPnlKjmlrnkuK3mraIsIOe7neS4jeWbnumAgOi0puWvhiAowqdBKyAjNCnjgIIKIz4KCiMg4pSA4pSAIGlzc3VlciDnq6/ngrnluLjph48gW+eUn+S6p+WAvDogMDYyOSDokL3lnLAgYXV0aC5ib29rd29ybXdlYi5jb20sIOWFrOe9kSBETVrihpIxMjcuMC4wLjE6ODc4N10g4pSA4pSACmlmICgtbm90ICRCV19JU1NVRVJfQkFTRSkgICAgICB7ICRCV19JU1NVRVJfQkFTRSAgICAgID0gImh0dHBzOi8vYXV0aC5ib29rd29ybXdlYi5jb20iIH0KaWYgKC1ub3QgJEJXX1BVQkxJQ19QSVBFX1BBVEgpIHsgJEJXX1BVQkxJQ19QSVBFX1BBVEggPSAiL2FwaS92MS9hdXRoL3Rva2VuLWV4Y2hhbmdlIiB9CmlmICgtbm90ICRCV19QVUJLRVlfUEFUSCkgICAgICB7ICRCV19QVUJLRVlfUEFUSCAgICAgID0gIi9hcGkvdjEvYXV0aC9wdWJrZXkiIH0KaWYgKC1ub3QgJEJXX1RPS0VOX1RUTF9TRUMpICAgIHsgJEJXX1RPS0VOX1RUTF9TRUMgICAgPSAzMDAgfSAgICMgW+mcgOWujOaVtOWuquazleehruiupDog5LiOIGlzc3VlciBUVEwg5a+56b2QXQoKIyDilIDilIAgW0MtNV0gaXNzdWVyIOWFrOmSpSBwaW4gKOmYsiBUTFMtTUlUTSDmjaLpkqUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIHBpbiDnmoTmmK8i5a6M5pW0IFgyNTUxOSDlhazpkqXlgLwiLCDkuI3mmK/ku4Uga2lkOiBraWQgPSBTSEEyNTYo5YWs6ZKlKSDliY0gOCDlrZfoioIgPSA2NCDkvY3moIfnrb4sCiMgTUlUTSDlj6/ljp/moLflm57loasge2tpZDrlm7rlrprlgLwsIHB1YmtleTrmlLvlh7vogIXlhazpkqV9IOKGkiDku4XmoKHpqowga2lkIOaXoOaViOOAguWFrOmSpeaYr+WFrOW8gOS/oeaBryjpnZ7lh63or4EpLAojIOWGheW1jOS6juWuouaIt+errzsgaXNzdWVyIOi9ruaNouWvhumSpeWQjuatpOWkhOmaj+aWsCBleGUg5pu05paw44CCCiMg5YC85p2l5rqQOiBhdXRoLmJvb2t3b3Jtd2ViLmNvbS9hcGkvdjEvYXV0aC9wdWJrZXkg5LiO5a655Zmo5YaFIEpXSyDlj4zmupDmoLjlr7kgKDIwMjYtMDYtMzAg6L2u5o2i5ZCOKeOAggppZiAoLW5vdCAkQldfUElOTkVEX0tJRCkgICAgICAgIHsgJEJXX1BJTk5FRF9LSUQgICAgICAgID0gIkRxbTBhaERNUkRnIiB9CmlmICgtbm90ICRCV19QSU5ORURfUFVCS0VZX0I2NCkgeyAkQldfUElOTkVEX1BVQktFWV9CNjQgPSAid092Y1pEVXZSU0M4dXpDVmdXUlRYZmN1b3I2Tml1eTdMdTZ1bDFsd3JXUSIgfQoKIyDpu5jorqQgc2VhbC1jbGkgLyBub2RlIOS9jee9riAo6ZqP5qC45b+D5YiG5Y+R5YiwIH4vLmNsYXVkZS9pc3N1ZXIvKQokQldfU0VBTF9DTEkgPSAoSm9pbi1QYXRoICRlbnY6VVNFUlBST0ZJTEUgIi5jbGF1ZGVcaXNzdWVyXHNlYWwtY2xpLmpzIikKJEJXX05PREVfRVhFID0gIm5vZGUiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEdldC1Cd0RldmljZUlkIOKAlCDnqLPlrprnmoTmr4/orr7lpIfmoIfor4YgKGRldmljZS1DQVMg5om/6YeN6Ziy6YeN5oyJ5q2k6ZSuLCDop4EgaXNzdWVyIGRldmljZS1jYXMuanMpCiMgICBNYWNoaW5lR3VpZCDkvJjlhYgg4oaSIOWbnumAgCDmnLrlkI0r55So5oi3U0lEIOeahCBTSEEyNTYg5oiq5patIOKGkiDlhZzlupUgInVua25vd24tZGV2aWNlIuOAggojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBHZXQtQndEZXZpY2VJZCB7CiAgICB0cnkgewogICAgICAgICRtZyA9IChHZXQtSXRlbVByb3BlcnR5IC1QYXRoICJIS0xNOlxTT0ZUV0FSRVxNaWNyb3NvZnRcQ3J5cHRvZ3JhcGh5IiAtTmFtZSBNYWNoaW5lR3VpZCAtRXJyb3JBY3Rpb24gU3RvcCkuTWFjaGluZUd1aWQKICAgICAgICBpZiAoJG1nKSB7IHJldHVybiBbc3RyaW5nXSRtZyB9CiAgICB9IGNhdGNoIHt9CiAgICB0cnkgewogICAgICAgICRzaWQgPSAoW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuV2luZG93c0lkZW50aXR5XTo6R2V0Q3VycmVudCgpKS5Vc2VyLlZhbHVlCiAgICAgICAgJHNoYSA9IFtTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlNIQTI1Nl06OkNyZWF0ZSgpCiAgICAgICAgJGJ5dGVzID0gJHNoYS5Db21wdXRlSGFzaChbU3lzdGVtLlRleHQuRW5jb2RpbmddOjpVVEY4LkdldEJ5dGVzKCIkZW52OkNPTVBVVEVSTkFNRXwkc2lkIikpCiAgICAgICAgcmV0dXJuICgoW1N5c3RlbS5CaXRDb252ZXJ0ZXJdOjpUb1N0cmluZygkYnl0ZXMpIC1yZXBsYWNlICctJywnJykuU3Vic3RyaW5nKDAsMzIpKS5Ub0xvd2VyKCkKICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiAidW5rbm93bi1kZXZpY2UiCiAgICB9Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2V0LUJ3SXNzdWVyUHVibGljS2V5IOKAlCDlj5YgaXNzdWVyIFgyNTUxOSDlhazpkqUgKEJhc2U2NHVybCksIOe7jyBDLTUgcGluIOagoemqjAojICAgW0MtNSDlt7Llrp7njrAgMjAyNi0wNi0zMF0gcGluIOWujOaVtOWFrOmSpeWAvCAo5LyY5LqOIFRMUy9TUEtJIOivgeS5puWbuuWumjog55u05o6l6ZKJ5bqU55So5bGC5a+G6ZKl5a6e5L2TLAojICAg5LiN5L6d6LWWIFRMUyDor4Hkuabpk74sIOa1geawkyBDQS/or4HkuabkuZ/ml6Dms5XmjaLpkqUp44CC6L+U5Zue55qE5rC46L+c5piv5YaF5bWM5bi46YePLCDlnKjnur/nq6/ngrnku4XkvZzmoLjpqowr6L2u5o2i5qOA5rWL44CCCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmZ1bmN0aW9uIEdldC1Cd0lzc3VlclB1YmxpY0tleSB7CiAgICBwYXJhbShbc3RyaW5nXSRJc3N1ZXJCYXNlID0gJEJXX0lTU1VFUl9CQVNFLCBbc3RyaW5nXSRQdWJrZXlQYXRoID0gJEJXX1BVQktFWV9QQVRIKQogICAgIyDmiZPljIXms6jlhaXmiqTmoI86IHBpbm5lZCDluLjph4/nvLrlpLEgKGJ1aWxkIOW8guW4uCkg4oaSIGZhaWwtY2xvc2VkLCDnu53kuI3lm57pgIDliLAi5L+h5Lu7572R57uc5YC8IuOAggogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJEJXX1BJTk5FRF9QVUJLRVlfQjY0KSAtb3IgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkQldfUElOTkVEX0tJRCkpIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICJbQlctVFhdIOWuouaIt+err+e8uuWwkSBwaW5uZWQg5YWs6ZKl5bi46YePICjmiZPljIXms6jlhaXlvILluLgpLCDkuK3mraIiOyByZXR1cm4gJG51bGwKICAgIH0KICAgICR1cmwgPSAiJElzc3VlckJhc2UkUHVia2V5UGF0aCIKICAgIHRyeSB7CiAgICAgICAgJHJlc3AgPSBJbnZva2UtV2ViUmVxdWVzdCAtVXJpICR1cmwgLU1ldGhvZCBHRVQgLVVzZUJhc2ljUGFyc2luZyAtVGltZW91dFNlYyAxNQogICAgICAgIGlmICgkcmVzcC5TdGF0dXNDb2RlIC1uZSAyMDApIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDlhazpkqXnq6/ngrnov5Tlm54gJCgkcmVzcC5TdGF0dXNDb2RlKSI7IHJldHVybiAkbnVsbCB9CiAgICAgICAgJGJvZHkgPSAkcmVzcC5Db250ZW50IHwgQ29udmVydEZyb20tSnNvbgogICAgfSBjYXRjaCB7IFdyaXRlLVdhcm5pbmcgIltCVy1UWF0g6I635Y+WIGlzc3VlciDlhazpkqXlpLHotKU6ICRfIjsgcmV0dXJuICRudWxsIH0KICAgIGlmICgtbm90ICgkYm9keSAtYW5kICRib2R5LmtpZCAtYW5kICRib2R5LnB1YmtleSkpIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDlhazpkqXlk43lupTmoLzlvI/kuI3nrKYiOyByZXR1cm4gJG51bGwgfQogICAgIyDikaAga2lkIOagoemqjCA9IOi9ruaNouajgOa1izoga2lkIOS4jeespiDin7kgaXNzdWVyIOW3sui9ruaNouWvhumSpSwg5q2kIGV4ZSDniYjmnKzov4fmnJ/jgILmi5Lnu53kv6Hku7vmnKrlm7rlrprnmoTmlrDpkqXjgIIKICAgIGlmIChbc3RyaW5nXSRib2R5LmtpZCAtY25lICRCV19QSU5ORURfS0lEKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAiW0JXLVRYXSBpc3N1ZXIg5a+G6ZKl5bey6L2u5o2iICjnq6/ngrkga2lkPSQoJGJvZHkua2lkKSDiiaAg5Zu65a6aICRCV19QSU5ORURfS0lEKeOAguatpOWuieijheWZqOeJiOacrOW3sui/h+acnywg6K+35LiL6L295pyA5pawIEJvb2t3b3JtLVNldHVwLmV4ZeOAguW3suaLkue7neS9v+eUqOacquWbuuWumueahOWFrOmSpeOAgiIKICAgICAgICByZXR1cm4gJG51bGwKICAgIH0KICAgICMg4pGhIOWujOaVtOWFrOmSpeWAvOagoemqjCA9IOmYsiBNSVRNOiBraWQg5qCH56ew5LiA6Ie05L2G5YWs6ZKl5a6e5L2T5LiN56ymIOKfuSDkuK3pl7Tkurov56+h5pS5IChraWQg5LuFIDY0IOS9jeWPr+iiq+WbnuWhqynjgIIKICAgICMgICAgYmFzZTY0dXJsIOWMuuWIhuWkp+Wwj+WGmSwg55SoIC1jbmUg57K+56Gu5q+U6L6DOyDlhazpkqXmmK/lhazlvIDmlbDmja4sIOaXoOmcgOW4uOmHj+aXtumXtOavlOi+g+OAggogICAgaWYgKFtzdHJpbmddJGJvZHkucHVia2V5IC1jbmUgJEJXX1BJTk5FRF9QVUJLRVlfQjY0KSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAiW0JXLVRYXSBpc3N1ZXIg5YWs6ZKl5LiO5Zu65a6a5YC85LiN56ymLCDnlpHkvLwgVExTIOS4remXtOS6uuaUu+WHu+aIluerr+eCueiiq+evoeaUuSwg5Lit5q2i44CCIgogICAgICAgIHJldHVybiAkbnVsbAogICAgfQogICAgIyDlj4zmoKHpqozpgJrov4cg4oaSIOi/lOWbnuWGheW1jOW4uOmHjyAo57ud5LiN6L+U5Zue572R57uc5YC8LCDpmLLmr5TovoPpgLvovpHkuIfkuIDooqvnu5Xov4cp44CCCiAgICByZXR1cm4gJEJXX1BJTk5FRF9QVUJLRVlfQjY0Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvdGVjdC1Cd0F1dGhjb2RlIOKAlCDnu48gTm9kZSDlrZDov5vnqIsgc2VhbC1jbGkg56uv5Yiw56uv5Yqg5a+GIGF1dGhjb2RlCiMgICDmmI7mlocge2FjLGRldix0c30g57uPIHN0ZGluICjpnZ4gYXJndikg5Lyg5YWlIOKGkiDkuI3ov5vov5vnqIvliJfooaggKDA4IMKnNy4zKeOAggojICAg5aSx6LSl6L+U5ZueICRudWxsIOKGkiDosIPnlKjmlrnkuK3mraIsIOS4peemgeaYjuaWh+mZjee6p+OAggojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBQcm90ZWN0LUJ3QXV0aGNvZGUgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJEF1dGhjb2RlLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRJc3N1ZXJQdWJrZXlCNjQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJERldmljZUlkLAogICAgICAgIFtzdHJpbmddJFNlYWxDbGkgPSAkQldfU0VBTF9DTEksCiAgICAgICAgW3N0cmluZ10kTm9kZUV4ZSA9ICRCV19OT0RFX0VYRQogICAgKQogICAgJHRzTXMgPSBbbG9uZ10oW0RhdGVUaW1lT2Zmc2V0XTo6VXRjTm93LlRvVW5peFRpbWVNaWxsaXNlY29uZHMoKSkKICAgICRwbGFpbnRleHQgPSAoQHsgYWMgPSAkQXV0aGNvZGU7IGRldiA9ICREZXZpY2VJZDsgdHMgPSAkdHNNcyB9IHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzKQogICAgJHN0ZGluSnNvbiA9IChAeyByZWNpcGllbnRQdWJsaWNYID0gJElzc3VlclB1YmtleUI2NDsgcGxhaW50ZXh0ID0gJHBsYWludGV4dCB9IHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzKQogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkU2VhbENsaSkpIHsgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDmnKrmib7liLAgc2VhbC1jbGk6ICRTZWFsQ2xpIjsgcmV0dXJuICRudWxsIH0KICAgIHRyeSB7CiAgICAgICAgJHBhY2tldCA9ICgkc3RkaW5Kc29uIHwgJiAkTm9kZUV4ZSAtLW5vLXdhcm5pbmdzICRTZWFsQ2xpIDI+JG51bGwpIC1qb2luICIiCiAgICAgICAgaWYgKCRMQVNURVhJVENPREUgLW5lIDAgLW9yIFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHBhY2tldCkpIHsKICAgICAgICAgICAgV3JpdGUtV2FybmluZyAiW0JXLVRYXSBzZWFsLWNsaSDliqDlr4blpLHotKUgKGV4aXQ9JExBU1RFWElUQ09ERSkiOyByZXR1cm4gJG51bGwKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRwYWNrZXQKICAgIH0gY2F0Y2ggeyBXcml0ZS1XYXJuaW5nICJbQlctVFhdIOiwg+eUqCBzZWFsLWNsaSDlvILluLg6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIjsgcmV0dXJuICRudWxsIH0KfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBHZXQtQndTaG9ydExpdmVkVG9rZW4g4oCUIGF1dGhjb2RlIOKGkiDliqDlr4Yg4oaSIFBPU1Qg55uy566h6YGTIOKGkiDnn63mnJ/lj6ror7sgdG9rZW4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gR2V0LUJ3U2hvcnRMaXZlZFRva2VuIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRBdXRoY29kZSwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kRGV2aWNlSWQsCiAgICAgICAgW3N0cmluZ10kSXNzdWVyQmFzZSA9ICRCV19JU1NVRVJfQkFTRQogICAgKQogICAgJHB1YmtleUI2NCA9IEdldC1Cd0lzc3VlclB1YmxpY0tleSAtSXNzdWVyQmFzZSAkSXNzdWVyQmFzZQogICAgaWYgKC1ub3QgJHB1YmtleUI2NCkgeyBXcml0ZS1XYXJuaW5nICJbQlctVFhdIOaXoOazleiOt+WPliBpc3N1ZXIg5YWs6ZKlLCDkuK3mraIiOyByZXR1cm4gJG51bGwgfQogICAgJHBheWxvYWQgPSBQcm90ZWN0LUJ3QXV0aGNvZGUgLUF1dGhjb2RlICRBdXRoY29kZSAtSXNzdWVyUHVia2V5QjY0ICRwdWJrZXlCNjQgLURldmljZUlkICREZXZpY2VJZAogICAgIyDCp0ErICM0OiDliqDlr4blpLHotKXkuKXnpoHmt7vliqAi5Y+R5piO5paHIiBmYWxsYmFjayDliIbmlK/jgIIKICAgIGlmICgtbm90ICRwYXlsb2FkKSB7IFdyaXRlLVdhcm5pbmcgIltCVy1UWF0gYXV0aGNvZGUg5Yqg5a+G5aSx6LSlLCDkuK3mraIiOyByZXR1cm4gJG51bGwgfQoKICAgICRwaXBlVXJsID0gIiRJc3N1ZXJCYXNlJEJXX1BVQkxJQ19QSVBFX1BBVEgiCiAgICB0cnkgewogICAgICAgICRib2R5SnNvbiA9IChAeyB2ZXJzaW9uID0gIjEiOyBjYXBhYmlsaXR5ID0gImVuY3J5cHRlZCI7IHBheWxvYWQgPSAkcGF5bG9hZCB9IHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzKQogICAgICAgICRyZXNwID0gSW52b2tlLVdlYlJlcXVlc3QgLVVyaSAkcGlwZVVybCAtTWV0aG9kIFBPU1QgLUNvbnRlbnRUeXBlICJhcHBsaWNhdGlvbi9qc29uIiAtQm9keSAkYm9keUpzb24gLVVzZUJhc2ljUGFyc2luZyAtVGltZW91dFNlYyAzMAogICAgICAgIGlmICgkcmVzcC5TdGF0dXNDb2RlIC1lcSAyMDApIHsKICAgICAgICAgICAgJHJlc3VsdCA9ICRyZXNwLkNvbnRlbnQgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgICAgIGlmICgkcmVzdWx0IC1hbmQgJHJlc3VsdC50b2tlbikgeyByZXR1cm4gW3N0cmluZ10kcmVzdWx0LnRva2VuIH0KICAgICAgICAgICAgV3JpdGUtV2FybmluZyAiW0JXLVRYXSDnm7LnrqHpgZPlk43lupTnvLogdG9rZW4g5a2X5q61IjsgcmV0dXJuICRudWxsCiAgICAgICAgfQogICAgICAgIFdyaXRlLVdhcm5pbmcgIltCVy1UWF0g55uy566h6YGT6L+U5ZueICQoJHJlc3AuU3RhdHVzQ29kZSkiOyByZXR1cm4gJG51bGwKICAgIH0gY2F0Y2ggeyBXcml0ZS1XYXJuaW5nICJbQlctVFhdIFBPU1Qg55uy566h6YGT5byC5bi4OiAkXyI7IHJldHVybiAkbnVsbCB9Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2V0LUJ3VG9rZW5BdXRoSGVhZGVyIOKAlCDnlKjnn63mnJ8gdG9rZW4g5p6E6YCgIEdpdGVhIEFQSS9yYXcg6K+35rGC5aS0IChPVEEg54mI5pys5p+l6K+i55SoKQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBHZXQtQndUb2tlbkF1dGhIZWFkZXIgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFNob3J0TGl2ZWRUb2tlbikKICAgIHJldHVybiBAeyBBdXRob3JpemF0aW9uID0gInRva2VuICRTaG9ydExpdmVkVG9rZW4iIH0KfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBJbnZva2UtQndBdXRob3JpemVkQ2xvbmUg4oCUIOefreacnyB0b2tlbiBjbG9uZSDnp4HmnInku5M7IOeUqOWujOWNs+a4hSwg5LiN6JC9IENyZWRlbnRpYWwgTWFuYWdlcgojICAgW+mcgOWujOaVtOWuquazleehruiupCBDLTZdIOS8mOWFiCBHSVRfQVNLUEFTUyDmm7/ku6MgVVJMIOW1jOWFpSB0b2tlbiAo6Ziy6L+b56iL5YiX6KGo5rOE6ZyyKeOAggojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBJbnZva2UtQndBdXRob3JpemVkQ2xvbmUgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFJlcG9VcmwsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJERlc3REaXIsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFNob3J0TGl2ZWRUb2tlbiwKICAgICAgICBbc3RyaW5nXSRHaXRVc2VybmFtZSA9ICJidy10b2tlbiIsCiAgICAgICAgW2ludF0kQ2xvbmVEZXB0aCA9IDEsCiAgICAgICAgW3N0cmluZ10kTG9nTGFiZWwgPSAi5o6I5p2D5YWL6ZqGIgogICAgKQogICAgJHVyaSA9IFtTeXN0ZW0uVXJpXSRSZXBvVXJsCiAgICAkYXV0aGVkVXJsID0gIiQoJHVyaS5TY2hlbWUpOi8vJChbU3lzdGVtLlVyaV06OkVzY2FwZURhdGFTdHJpbmcoJEdpdFVzZXJuYW1lKSk6JChbU3lzdGVtLlVyaV06OkVzY2FwZURhdGFTdHJpbmcoJFNob3J0TGl2ZWRUb2tlbikpQCQoJHVyaS5Ib3N0KSQoJHVyaS5QYXRoQW5kUXVlcnkpIgogICAgaWYgKFRlc3QtUGF0aCAkRGVzdERpcikgeyBXcml0ZS1XYXJuaW5nICJbQlctQ2xvbmVdIOebruagh+ebruW9leW3suWtmOWcqDogJERlc3REaXIiIH0KICAgICRjbG9uZUFyZ3MgPSBAKCItYyIsICJjcmVkZW50aWFsLmhlbHBlcj0iLCAiY2xvbmUiLCAiLS1kZXB0aCIsICIkQ2xvbmVEZXB0aCIsICRhdXRoZWRVcmwsICREZXN0RGlyKQogICAgJGVyckxvZyA9ICIkZW52OlRFTVBcYnctY2xvbmUtZXJyLSRQSUQudHh0IgogICAgdHJ5IHsKICAgICAgICAkcHJvYyA9IFN0YXJ0LVByb2Nlc3MgImdpdCIgLUFyZ3VtZW50TGlzdCAkY2xvbmVBcmdzIC1XYWl0IC1QYXNzVGhydSAtTm9OZXdXaW5kb3cgLVJlZGlyZWN0U3RhbmRhcmRFcnJvciAkZXJyTG9nCiAgICAgICAgJGV4aXRDb2RlID0gJHByb2MuRXhpdENvZGUKICAgIH0gY2F0Y2ggewogICAgICAgIFdyaXRlLVdhcm5pbmcgIltCVy1DbG9uZV0gZ2l0IGNsb25lIOi/m+eoi+WQr+WKqOWksei0pTogJF8iOyAkZXhpdENvZGUgPSAtMQogICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoVGVzdC1QYXRoICRlcnJMb2cpIHsgUmVtb3ZlLUl0ZW0gJGVyckxvZyAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUgfQogICAgICAgIFJlbW92ZS1WYXJpYWJsZSAtTmFtZSBhdXRoZWRVcmwgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICBSZW1vdmUtVmFyaWFibGUgLU5hbWUgU2hvcnRMaXZlZFRva2VuIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICB9CiAgICBpZiAoJGV4aXRDb2RlIC1uZSAwKSB7IFdyaXRlLVdhcm5pbmcgIltCVy1DbG9uZV0gJExvZ0xhYmVsIOWksei0pSAoZXhpdD0kZXhpdENvZGUpIjsgcmV0dXJuICRmYWxzZSB9CiAgICByZXR1cm4gJHRydWUKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBJbnZva2UtQndBdXRob3JpemVkUHVsbCDigJQg55+t5pyfIHRva2VuIHB1bGwg5bey5pyJ5LuTOyDkuLTml7bmlLkgcmVtb3RlIFVSTCwg5a6M5oiQ5Y2z6L+Y5Y6fCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmZ1bmN0aW9uIEludm9rZS1Cd0F1dGhvcml6ZWRQdWxsIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRSZXBvRGlyLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRTaG9ydExpdmVkVG9rZW4sCiAgICAgICAgW3N0cmluZ10kR2l0VXNlcm5hbWUgPSAiYnctdG9rZW4iLAogICAgICAgIFtzdHJpbmddJExvZ0xhYmVsID0gIuaOiOadgyBwdWxsIgogICAgKQogICAgJG9yaWdVcmwgPSAkbnVsbAogICAgdHJ5IHsKICAgICAgICAkb3JpZ1VybCA9ICgmIGdpdCAtQyAkUmVwb0RpciByZW1vdGUgZ2V0LXVybCBvcmlnaW4gMj4kbnVsbCkKICAgICAgICBpZiAoLW5vdCAkb3JpZ1VybCkgeyBXcml0ZS1XYXJuaW5nICJbQlctUHVsbF0g5peg5rOV6I635Y+WIG9yaWdpbiBVUkwiOyByZXR1cm4gJGZhbHNlIH0KICAgICAgICAkdXJpID0gW1N5c3RlbS5VcmldJG9yaWdVcmwuVHJpbSgpCiAgICAgICAgJGF1dGhlZFVybCA9ICIkKCR1cmkuU2NoZW1lKTovLyQoW1N5c3RlbS5VcmldOjpFc2NhcGVEYXRhU3RyaW5nKCRHaXRVc2VybmFtZSkpOiQoW1N5c3RlbS5VcmldOjpFc2NhcGVEYXRhU3RyaW5nKCRTaG9ydExpdmVkVG9rZW4pKUAkKCR1cmkuSG9zdCkkKCR1cmkuUGF0aEFuZFF1ZXJ5KSIKICAgICAgICAmIGdpdCAtQyAkUmVwb0RpciByZW1vdGUgc2V0LXVybCBvcmlnaW4gJGF1dGhlZFVybCAyPiRudWxsCiAgICAgICAgJiBnaXQgLUMgJFJlcG9EaXIgcHVsbCAtLXJlYmFzZSAtLWF1dG9zdGFzaCAyPiYxIHwgT3V0LU51bGwKICAgICAgICAkZXhpdENvZGUgPSAkTEFTVEVYSVRDT0RFCiAgICB9IGNhdGNoIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICJbQlctUHVsbF0gcHVsbCDlvILluLg6ICRfIjsgJGV4aXRDb2RlID0gLTEKICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKCRvcmlnVXJsKSB7ICYgZ2l0IC1DICRSZXBvRGlyIHJlbW90ZSBzZXQtdXJsIG9yaWdpbiAkb3JpZ1VybC5UcmltKCkgMj4kbnVsbCB9CiAgICAgICAgUmVtb3ZlLVZhcmlhYmxlIC1OYW1lIGF1dGhlZFVybCAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIFJlbW92ZS1WYXJpYWJsZSAtTmFtZSBTaG9ydExpdmVkVG9rZW4gLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgIH0KICAgIGlmICgkZXhpdENvZGUgLW5lIDApIHsgV3JpdGUtV2FybmluZyAiW0JXLVB1bGxdICRMb2dMYWJlbCDlpLHotKUgKGV4aXQ9JGV4aXRDb2RlKSI7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUmVxdWVzdC1Cd0F1dGhjb2RlRnJvbVVzZXIg4oCUIEdVSSDovpPlhaXmoYblj5YgYXV0aGNvZGUgKOabv+aNoiBTaG93LUdpdGVhQ3JlZGVudGlhbERpYWxvZykKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gUmVxdWVzdC1Cd0F1dGhjb2RlRnJvbVVzZXIgewogICAgcGFyYW0oCiAgICAgICAgW3N0cmluZ10kVGl0bGUgPSAiQm9va3dvcm0g5o6I5p2D5r+A5rS7IiwKICAgICAgICBbc3RyaW5nXSRNZXNzYWdlID0gIuivt+i+k+WFpeaCqOeahCBCb29rd29ybSDmv4DmtLvnoIEgKGF1dGhjb2RlKToiCiAgICApCiAgICB0cnkgewogICAgICAgIEFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgTWljcm9zb2Z0LlZpc3VhbEJhc2ljIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgJGF1dGhjb2RlID0gW01pY3Jvc29mdC5WaXN1YWxCYXNpYy5JbnRlcmFjdGlvbl06OklucHV0Qm94KCRNZXNzYWdlLCAkVGl0bGUsICIiKQogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRhdXRoY29kZSkpIHsgcmV0dXJuICRudWxsIH0KICAgICAgICByZXR1cm4gJGF1dGhjb2RlLlRyaW0oKQogICAgfSBjYXRjaCB7CiAgICAgICAgV3JpdGUtSG9zdCAkTWVzc2FnZSAtRm9yZWdyb3VuZENvbG9yIEN5YW4KICAgICAgICAkYXV0aGNvZGUgPSBSZWFkLUhvc3QKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkYXV0aGNvZGUpKSB7IHJldHVybiAkbnVsbCB9CiAgICAgICAgcmV0dXJuICRhdXRoY29kZS5UcmltKCkKICAgIH0KfQo=' } # foreach ($f in $BwPayloadMissing) {