{
  "payload": {
    "version": "1.2.0",
    "protocol": "zhuge-im-v1",
    "api_major": 1,
    "storage_version": 1,
    "files": {
      "bootstrap.js": "7635493d28fcbfb0188db95596cb7177be9eda49d19ea944198eb308bd964713",
      "build.mjs": "45feb781439cc3de4b2ff7d497ad1972cefc4a76dfa403b81ca6810656b75c1f",
      "config.js": "36946cf75ff79b62e6606147425b58d10dc11df2cff31d39b9508135b2a30411",
      "extension-host.js": "f80651e554a3c39e106420b8acabe159f6afaf55f1c2ffcecd48705a27a2ceab",
      "extension-schema.js": "5ce6a6d9c2f857ff57712974f7832872d0093f4b3944a022cba8dedbc3a6a214",
      "extension-worker.js": "3159ffbc7b7ca6099308b8161acfeef0839113321bb13ad0cb34953525d4fc02",
      "extensions-page.js": "2da43a47c8e7df6ecf05b239f2f214fbb7b1a63d6b4103183301c3ef51221f9a",
      "guard.mjs": "edd71cb2b6f6a729bc123649dba2201531145ba8fadb32c80c20ddceeb2413fe",
      "guest-control.js": "34dd9e419148bd90ac1991ba63b7a3c5765bc4f6192ab8982eb72f7e99dc77fd",
      "guest-identity.js": "7fbde6606f7e2930b6e787fce1c9ccd20a6187aed80ee4e4f5bf87d0849f40f7",
      "integrity.js": "19a593743549d4963b15d1b28cd85162687b46ed84b778becb2adf71682ad8d1",
      "recovery.html": "a56c1f38279f9e4614403332d9fafef47a779778d166da9e6991313f04f82818",
      "recovery.js": "759f3c2549a71684707cb8c1bcd2cdb12f8355aa43cf6a774e258816eb7ccca9",
      "release-key.json": "fac5a606b5a942538f373ca29639d998405f0b794a323c8577c8a55456906962",
      "sdk.js": "dde24a19e63aee8eed034f50a939458201cd818c8543b3a743e36cf5f89fa36a",
      "server.mjs": "2dc5501bdf0976170cf2ba3ce49427d5b20cb9ece89047f8e2a9a284ecde12b0",
      "src/client.ts": "c6ca01f4191025bed479d19e07165ff9cda57bc1b3b92b06912a09a33e387ed2",
      "src/client.js": "5801686b1b5fee24daaaf0e2bd5fb02549adfbeb9a3b2f0c68e7097197931272",
      "src/storage.ts": "f862ad2af24bc9443cf56943c18490fee49e760e50e0305f8bece6d2a2713a0b",
      "src/storage.js": "42ec41b51d55927a7304cad179470bf0a2996c260ed3dfffc20692ca4b976290"
    },
    "baseline": {
      "bootstrap.js": "Ly8gVmVyaWZ5IGJlZm9yZSBpbXBvcnRpbmcgdGhlIGNvbW11bmljYXRpb24gbW9kdWxlLCBpbmNsdWRpbmcgb24gc3RhdGljIEhUVFBTIGhvc3RpbmcuCmNvbnN0IG5vdGljZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWNlJyksY29ubmVjdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29ubmVjdCcpOwpjb25uZWN0LmRpc2FibGVkPXRydWU7bm90aWNlLnRleHRDb250ZW50PSfmraPlnKjmo4Dmn6XpgJrkv6HnqIvluo/igKYnOwp0cnl7Y29uc3Qge2NoZWNrQ29yZX09YXdhaXQgaW1wb3J0KCcuL2ludGVncml0eS5qcycpO2F3YWl0IGNoZWNrQ29yZSgpO2F3YWl0IGltcG9ydCgnLi9hcHAuanMnKTtjb25uZWN0LmRpc2FibGVkPWZhbHNlO30KY2F0Y2goZXJyb3Ipe25vdGljZS50ZXh0Q29udGVudD1g56iL5bqP5qOA5p+l5pyq5a6M5oiQ77yaJHtlcnJvci5tZXNzYWdlfeOAguivt+aJk+W8gOKAnOajgOafpeS4juaBouWkjeKAne+8jOaIlumHjeaWsOS4i+i9veWujOaVtOWPr+WumuWItueJiOOAgmA7Y29ubmVjdC5kaXNhYmxlZD10cnVlO30K",
      "build.mjs": "aW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnOwppbXBvcnQge3JlYWRGaWxlLHdyaXRlRmlsZX0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7CmlmKCFwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXhwZXJpbWVudGFsJykpdGhyb3cgbmV3IEVycm9yKCfnm7TmjqXnvJbor5HkvJrmlLnlj5jlj5fkv53miqTnmoTpgJrkv6HmoLjlv4PjgILor7flhYjov5DooYwgbm9kZSBndWFyZC5tanMgZXhwZXJpbWVudO+8jOWcqOWunumqjOWJr+acrOS4reS9v+eUqCAtLWV4cGVyaW1lbnRhbO+8m+WunumqjOeJiOS4jeiDveWGkuWFheWumOaWueeJiOacrOOAgicpOwpmb3IoY29uc3QgbmFtZSBvZiBbJ2NsaWVudCcsJ3N0b3JhZ2UnXSl7CiAgY29uc3Qgc291cmNlPWF3YWl0IHJlYWRGaWxlKG5ldyBVUkwoYHNyYy8ke25hbWV9LnRzYCxpbXBvcnQubWV0YS51cmwpLCd1dGY4Jyk7CiAgY29uc3QgcmVzdWx0PXRzLnRyYW5zcGlsZU1vZHVsZShzb3VyY2Use2NvbXBpbGVyT3B0aW9uczp7dGFyZ2V0OnRzLlNjcmlwdFRhcmdldC5FUzIwMjIsbW9kdWxlOnRzLk1vZHVsZUtpbmQuRVMyMDIyfX0pOwogIGF3YWl0IHdyaXRlRmlsZShuZXcgVVJMKGBzcmMvJHtuYW1lfS5qc2AsaW1wb3J0Lm1ldGEudXJsKSxyZXN1bHQub3V0cHV0VGV4dC5yZXBsYWNlKC9mcm9tICJcLlwvc3RvcmFnZSIvZywnZnJvbSAiLi9zdG9yYWdlLmpzIicpKTsKfQo=",
      "config.js": "Ly8gUHVibGljIHBsYXRmb3JtIGFkZHJlc3Mgb25seS4gTmV2ZXIgcHV0IGFuIGFjY2VzcyB0b2tlbiBpbiB0aGlzIGZpbGUuCmV4cG9ydCBjb25zdCBwbGF0Zm9ybU9yaWdpbiA9ICdodHRwczovL3podWdlanVuc2hpLmNvbSc7Cg==",
      "extension-host.js": "aW1wb3J0IHt2YWxpZGF0ZUV4dGVuc2lvbixleHRlbnNpb25EaWdlc3R9IGZyb20gJy4vZXh0ZW5zaW9uLXNjaGVtYS5qcyc7CmltcG9ydCB7cGxhdGZvcm1PcmlnaW59IGZyb20gJy4vY29uZmlnLmpzJzsKZXhwb3J0IGNvbnN0IEVYVEVOU0lPTl9LRVk9J3podWdlLWRpcmVjdC1pbS1leHRlbnNpb25zLXYxJzsKZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZEV4dGVuc2lvbnMoKXt0cnl7Y29uc3Qgdj1KU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKEVYVEVOU0lPTl9LRVkpfHwnW10nKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh2KT92LnNsaWNlKDAsMjApOltdO31jYXRjaHtyZXR1cm4gW107fX0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRFeHRlbnNpb24ocmVjb3JkKXsKICBpZih0eXBlb2YgcmVjb3JkPy50ZXh0IT09J3N0cmluZyd8fHJlY29yZC50ZXh0Lmxlbmd0aD42NTUzNil0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleaWh+S7tuaXoOaViOOAgicpOwogIGNvbnN0IGV4dGVuc2lvbj12YWxpZGF0ZUV4dGVuc2lvbihKU09OLnBhcnNlKHJlY29yZC50ZXh0KSk7CiAgY29uc3QgZGlnZXN0PWF3YWl0IGV4dGVuc2lvbkRpZ2VzdChyZWNvcmQudGV4dCk7CiAgaWYocmVjb3JkLmRpZ2VzdCE9PWRpZ2VzdCl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleWGheWuueW3sue7j+WPmOWMlu+8jOivt+mHjeaWsOWvvOWFpeW5tuaOiOadg+OAgicpOwogIHJldHVybiB7ZXh0ZW5zaW9uLGRpZ2VzdH07Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrTWFya2V0UmVjb3JkKHJlY29yZCl7CiAgaWYoIXJlY29yZC5yZWxlYXNlX2lkKXJldHVybjsKICBpZighL15bYS1mMC05XXszMn0kLy50ZXN0KHJlY29yZC5yZWxlYXNlX2lkKSl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleadpea6kOaXoOaViOOAgicpOwogIGNvbnN0IHJlc3BvbnNlPWF3YWl0IGZldGNoKGAke3BsYXRmb3JtT3JpZ2lufS9hcGkvaW0tZGlyZWN0L2V4dGVuc2lvbnMvY2F0YWxvZy8ke3JlY29yZC5yZWxlYXNlX2lkfWAse2NyZWRlbnRpYWxzOidvbWl0JyxjYWNoZTonbm8tc3RvcmUnLHNpZ25hbDpBYm9ydFNpZ25hbC50aW1lb3V0KDgwMDApfSk7CiAgaWYoIXJlc3BvbnNlLm9rKXRocm93IG5ldyBFcnJvcign6K+l54mI5pys5pqC5LiN5Y+v55So77yM6K+35Yiw5omp5bGV5biC5Zy65p+l55yL44CCJyk7CiAgY29uc3QgcmVsZWFzZT1hd2FpdCByZXNwb25zZS5qc29uKCk7aWYocmVsZWFzZS5zaGEyNTYhPT1yZWNvcmQuZGlnZXN0fHxyZWxlYXNlLnN0YXR1cyE9PSdhcHByb3ZlZCcpdGhyb3cgbmV3IEVycm9yKCfor6XniYjmnKzlt7Llj5jmm7TmiJblgZzmraLliIblj5HjgIInKTsKfQpleHBvcnQgZnVuY3Rpb24gbW91bnRFeHRlbnNpb25zKHJvb3Qse2dldERyYWZ0LHNldERyYWZ0LGdldENvbnRleHQsbm90aWNlfSl7CiAgbGV0IGdlbmVyYXRpb249MCx3b3JrZXJzPW5ldyBTZXQoKTsKICBjb25zdCBlbGVtZW50PSh0YWcsdGV4dCk9Pntjb25zdCBlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7aWYodGV4dCE9PXVuZGVmaW5lZCllbC50ZXh0Q29udGVudD10ZXh0O3JldHVybiBlbDt9OwogIGNvbnN0IHJlc2V0PSgpPT57Z2VuZXJhdGlvbisrO2Zvcihjb25zdCB3IG9mIHdvcmtlcnMpdy50ZXJtaW5hdGUoKTt3b3JrZXJzLmNsZWFyKCk7cm9vdC5yZXBsYWNlQ2hpbGRyZW4oKTt9OwogIGFzeW5jIGZ1bmN0aW9uIHJlbmRlcigpewogICAgcmVzZXQoKTtjb25zdCBlcG9jaD1nZW5lcmF0aW9uO2NvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCgpOwogICAgaWYoIWNvbnRleHQpe3Jvb3QudGV4dENvbnRlbnQ9J+aJk+W8gOiBiuWkqeW5tumAieaLqeS8muivneWQju+8jOWPr+WQr+eUqOW3suWuieijheeahOaJqeWxleOAgic7cmV0dXJuO30KICAgIGNvbnN0IGl0ZW1zPWluc3RhbGxlZEV4dGVuc2lvbnMoKTtpZighaXRlbXMubGVuZ3RoKXtyb290LnRleHRDb250ZW50PSflsJrmnKrlronoo4XmianlsZXvvIzlj6/ku47igJznrqHnkIbmiJHnmoTmianlsZXigJ3mt7vliqDjgIInO3JldHVybjt9CiAgICBmb3IoY29uc3QgcmVjb3JkIG9mIGl0ZW1zKXsKICAgICAgdHJ5ewogICAgICAgIGNvbnN0IHtleHRlbnNpb246ZX09YXdhaXQgcmVhZEV4dGVuc2lvbihyZWNvcmQpO2lmKGVwb2NoIT09Z2VuZXJhdGlvbilyZXR1cm47CiAgICAgICAgY29uc3Qgcm93PWVsZW1lbnQoJ2RpdicpO3Jvdy5jbGFzc05hbWU9J2V4dGVuc2lvbi1yb3cnOwogICAgICAgIHJvdy5hcHBlbmQoZWxlbWVudCgncCcsYCR7ZS5uYW1lfSDCtyAke2UudmVyc2lvbn0gwrcgJHtyZWNvcmQucmVsZWFzZV9pZD8n5biC5Zy654mI5pysJzon5pys5Zyw5L+u5pS554mIJ31gKSk7CiAgICAgICAgY29uc3QgY29uc2VudD1lbGVtZW50KCdpbnB1dCcpO2NvbnNlbnQudHlwZT0nY2hlY2tib3gnOwogICAgICAgIGNvbnN0IGxhYmVsPWVsZW1lbnQoJ2xhYmVsJyk7bGFiZWwuYXBwZW5kKGNvbnNlbnQsZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYCDmnKzmrKHov57mjqXlhYHorrjvvJoke2UucGVybWlzc2lvbnMubWFwKHA9PnA9PT0nZHJhZnQucmVhZCc/J+ivu+WPluW9k+WJjeiNieeovyc6J+e7j+aIkeaTjeS9nOWGmeWFpeiNieeovycpLmpvaW4oJ+OAgScpfHwn5LuF55Sf5oiQ6aKE6KeIJ33jgIJgKSk7cm93LmFwcGVuZChsYWJlbCk7CiAgICAgICAgY29uc3QgYnV0dG9ucz1lbGVtZW50KCdkaXYnKTtidXR0b25zLmNsYXNzTmFtZT0ndG9vbHMnOwogICAgICAgIGNvbnN0IG91dHB1dD1lbGVtZW50KCd0ZXh0YXJlYScpO291dHB1dC5yZWFkT25seT10cnVlO291dHB1dC5yb3dzPTM7b3V0cHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsYCR7ZS5uYW1lfeWkhOeQhue7k+aenGApOwogICAgICAgIGNvbnN0IGFwcGx5PWVsZW1lbnQoJ2J1dHRvbicsJ+aUvuWFpeiNieeovycpO2FwcGx5LmRpc2FibGVkPXRydWU7CiAgICAgICAgbGV0IHJlc3VsdENvbnRleHQ9JycscnVuPTA7CiAgICAgICAgY29uc3QgaXNDdXJyZW50PSgpPT5lcG9jaD09PWdlbmVyYXRpb24mJmdldENvbnRleHQoKT09PWNvbnRleHQmJmluc3RhbGxlZEV4dGVuc2lvbnMoKS5zb21lKHI9PnIuZGlnZXN0PT09cmVjb3JkLmRpZ2VzdCYmci50ZXh0PT09cmVjb3JkLnRleHQpOwogICAgICAgIGNvbnNlbnQub25jaGFuZ2U9KCk9PntydW4rKztvdXRwdXQudmFsdWU9Jyc7YXBwbHkuZGlzYWJsZWQ9dHJ1ZTt9OwogICAgICAgIGZvcihjb25zdCBhY3Rpb24gb2YgZS5hY3Rpb25zKXsKICAgICAgICAgIGNvbnN0IGJ1dHRvbj1lbGVtZW50KCdidXR0b24nLGFjdGlvbi5sYWJlbCk7YnV0dG9ucy5hcHBlbmQoYnV0dG9uKTsKICAgICAgICAgIGxldCBxdWFudGl0eSxwcmljZSxzaGlwcGluZzsKICAgICAgICAgIGlmKGFjdGlvbi5vcGVyYXRpb249PT0ncXVvdGUnKXsKICAgICAgICAgICAgY29uc3QgZmllbGRzPWVsZW1lbnQoJ2RpdicpO2ZpZWxkcy5jbGFzc05hbWU9J3Rvb2xzJzsKICAgICAgICAgICAgZm9yKGNvbnN0IFtuYW1lLHRpdGxlLGluaXRpYWxdIG9mIFtbJ3F1YW50aXR5Jywn5pWw6YePJywnMSddLFsncHJpY2UnLCfljZXku7cnLCcwJ10sWydzaGlwcGluZycsJ+i/kOi0uScsJzAnXV0pewogICAgICAgICAgICAgIGNvbnN0IGlucHV0PWVsZW1lbnQoJ2lucHV0Jyk7aW5wdXQudHlwZT0nbnVtYmVyJztpbnB1dC5taW49bmFtZT09PSdxdWFudGl0eSc/JzEnOicwJztpbnB1dC5zdGVwPW5hbWU9PT0ncXVhbnRpdHknPycxJzonLjAxJztpbnB1dC52YWx1ZT1pbml0aWFsO2lucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsdGl0bGUpO2lucHV0LnN0eWxlLndpZHRoPScxMzBweCc7Y29uc3QgbD1lbGVtZW50KCdsYWJlbCcsdGl0bGUrJyAnKTtsLmFwcGVuZChpbnB1dCk7ZmllbGRzLmFwcGVuZChsKTsKICAgICAgICAgICAgICBpZihuYW1lPT09J3F1YW50aXR5JylxdWFudGl0eT1pbnB1dDtlbHNlIGlmKG5hbWU9PT0ncHJpY2UnKXByaWNlPWlucHV0O2Vsc2Ugc2hpcHBpbmc9aW5wdXQ7CiAgICAgICAgICAgIH1yb3cuYXBwZW5kKGZpZWxkcyk7CiAgICAgICAgICB9CiAgICAgICAgICBidXR0b24ub25jbGljaz1hc3luYygpPT57CiAgICAgICAgICAgIGNvbnN0IGF0dGVtcHQ9KytydW47YXBwbHkuZGlzYWJsZWQ9dHJ1ZTtvdXRwdXQudmFsdWU9Jyc7CiAgICAgICAgICAgIGlmKCFjb25zZW50LmNoZWNrZWR8fCFpc0N1cnJlbnQoKSl7bm90aWNlKCfor7flhYjlkK/nlKjmnKzmrKHov57mjqXmiYDpnIDnmoTmianlsZXmnYPpmZDjgIInKTtyZXR1cm47fQogICAgICAgICAgICBidXR0b24uZGlzYWJsZWQ9dHJ1ZTtsZXQgd29ya2VyLHRpbWVyOwogICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgYXdhaXQgcmVhZEV4dGVuc2lvbihyZWNvcmQpO2F3YWl0IGNoZWNrTWFya2V0UmVjb3JkKHJlY29yZCk7CiAgICAgICAgICAgICAgaWYoYXR0ZW1wdCE9PXJ1bnx8IWNvbnNlbnQuY2hlY2tlZHx8IWlzQ3VycmVudCgpKXRocm93IG5ldyBFcnJvcign5omp5bGV5bey5YGc5q2i77yM5pyq6K+75Y+W6I2J56i/44CCJyk7CiAgICAgICAgICAgICAgY29uc3QgaW5wdXQ9e307aWYoZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnZHJhZnQucmVhZCcpKWlucHV0LmRyYWZ0PWdldERyYWZ0KCk7CiAgICAgICAgICAgICAgaWYocXVhbnRpdHkpT2JqZWN0LmFzc2lnbihpbnB1dCx7cXVhbnRpdHk6TnVtYmVyKHF1YW50aXR5LnZhbHVlKSxwcmljZTpOdW1iZXIocHJpY2UudmFsdWUpLHNoaXBwaW5nOk51bWJlcihzaGlwcGluZy52YWx1ZSl9KTsKICAgICAgICAgICAgICB3b3JrZXI9bmV3IFdvcmtlcihuZXcgVVJMKCcuL2V4dGVuc2lvbi13b3JrZXIuanMnLGltcG9ydC5tZXRhLnVybCkse3R5cGU6J21vZHVsZSd9KTt3b3JrZXJzLmFkZCh3b3JrZXIpOwogICAgICAgICAgICAgIGNvbnN0IHJlc3VsdD1hd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57dGltZXI9c2V0VGltZW91dCgoKT0+cmVqZWN0KG5ldyBFcnJvcign5omp5bGV5aSE55CG6LaF5pe244CCJykpLDIwMDApO3dvcmtlci5vbmVycm9yPSgpPT5yZWplY3QobmV3IEVycm9yKCfmianlsZXlpITnkIblpLHotKXjgIInKSk7d29ya2VyLm9ubWVzc2FnZT1ldmVudD0+e2lmKGV2ZW50LmRhdGEuaWQhPT1hdHRlbXB0KXJldHVybjtldmVudC5kYXRhLmVycm9yP3JlamVjdChuZXcgRXJyb3IoZXZlbnQuZGF0YS5lcnJvcikpOnJlc29sdmUoZXZlbnQuZGF0YS5yZXN1bHQpO307d29ya2VyLnBvc3RNZXNzYWdlKHtpZDphdHRlbXB0LGV4dGVuc2lvbjplLGFjdGlvbjphY3Rpb24uaWQsaW5wdXR9KTt9KTsKICAgICAgICAgICAgICBpZihhdHRlbXB0IT09cnVufHwhY29uc2VudC5jaGVja2VkfHwhaXNDdXJyZW50KCkpdGhyb3cgbmV3IEVycm9yKCfkvJror53miJbmjojmnYPlt7LmlLnlj5jvvIzmnKrlhpnlhaXojYnnqL/jgIInKTsKICAgICAgICAgICAgICBpZih0eXBlb2YgcmVzdWx0IT09J3N0cmluZyd8fHJlc3VsdC5sZW5ndGg+NDAwMCl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxlei/lOWbnuWGheWuueaXoOaViOOAgicpOwogICAgICAgICAgICAgIG91dHB1dC52YWx1ZT1yZXN1bHQ7cmVzdWx0Q29udGV4dD1jb250ZXh0O2FwcGx5LmRpc2FibGVkPSFlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdkcmFmdC53cml0ZScpOwogICAgICAgICAgICB9Y2F0Y2goZXJyb3Ipe25vdGljZShlcnJvci5tZXNzYWdlKTt9ZmluYWxseXtjbGVhclRpbWVvdXQodGltZXIpO2lmKHdvcmtlcil7d29ya2VyLnRlcm1pbmF0ZSgpO3dvcmtlcnMuZGVsZXRlKHdvcmtlcik7fWJ1dHRvbi5kaXNhYmxlZD1mYWxzZTt9CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBhcHBseS5vbmNsaWNrPSgpPT57aWYoIWNvbnNlbnQuY2hlY2tlZHx8IWlzQ3VycmVudCgpfHxyZXN1bHRDb250ZXh0IT09Z2V0Q29udGV4dCgpfHwhZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnZHJhZnQud3JpdGUnKSl7bm90aWNlKCfmjojmnYPmiJbkvJror53lt7LmlLnlj5jvvIzor7fph43mlrDlpITnkIbjgIInKTthcHBseS5kaXNhYmxlZD10cnVlO3JldHVybjt9c2V0RHJhZnQob3V0cHV0LnZhbHVlKTtub3RpY2UoJ+W3suaUvuWFpeiNieeov++8jOivt+ajgOafpeWQjuiHquihjOWPkemAgeOAgicpO2FwcGx5LmRpc2FibGVkPXRydWU7fTsKICAgICAgICByb3cuYXBwZW5kKGJ1dHRvbnMsb3V0cHV0LGFwcGx5KTtyb290LmFwcGVuZChyb3cpOwogICAgICB9Y2F0Y2goZXJyb3Ipe3Jvb3QuYXBwZW5kKGVsZW1lbnQoJ3AnLGVycm9yLm1lc3NhZ2UpKTt9CiAgICB9CiAgfQogIHJldHVybiB7cmVuZGVyLHJlc2V0fTsKfQo=",
      "extension-schema.js": "Ly8gVGhpcyBzY2hlbWEgaXMgZGVsaWJlcmF0ZWx5IGEgZGF0YS1vbmx5IGxhbmd1YWdlLiBVbmtub3duIHByb3BlcnRpZXMgYXJlIHJlamVjdGVkLgpleHBvcnQgY29uc3QgUEVSTUlTU0lPTlM9T2JqZWN0LmZyZWV6ZShbJ2RyYWZ0LnJlYWQnLCdkcmFmdC53cml0ZSddKTsKY29uc3Qgb2JqZWN0PXY9PnYhPT1udWxsJiZ0eXBlb2Ygdj09PSdvYmplY3QnJiYhQXJyYXkuaXNBcnJheSh2KTsKZnVuY3Rpb24ga2V5cyh2YWx1ZSxhbGxvd2VkKXtpZighb2JqZWN0KHZhbHVlKXx8T2JqZWN0LmtleXModmFsdWUpLnNvbWUoaz0+IWFsbG93ZWQuaW5jbHVkZXMoaykpKXRocm93IG5ldyBFcnJvcign5omp5bGV5YyF5ZCr5LiN5pSv5oyB55qE5a2X5q6144CCJyk7fQpmdW5jdGlvbiBzdHJpbmcodixtaW4sbWF4KXtyZXR1cm4gdHlwZW9mIHY9PT0nc3RyaW5nJyYmdi5sZW5ndGg+PW1pbiYmdi5sZW5ndGg8PW1heDt9CmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvbih2YWx1ZSl7CiAga2V5cyh2YWx1ZSxbJ2lkJywnbmFtZScsJ2Rlc2NyaXB0aW9uJywndmVyc2lvbicsJ2FwaV9tYWpvcicsJ3Byb3RvY29sJywncGVybWlzc2lvbnMnLCdhY3Rpb25zJ10pOwogIGlmKHR5cGVvZiB2YWx1ZS5pZCE9PSdzdHJpbmcnfHwhL15bYS16XVthLXowLTktXXsyLDU5fSQvLnRlc3QodmFsdWUuaWQpfHwhc3RyaW5nKHZhbHVlLm5hbWUsMiw2MCl8fCFzdHJpbmcodmFsdWUuZGVzY3JpcHRpb24sMiw1MDApfHx0eXBlb2YgdmFsdWUudmVyc2lvbiE9PSdzdHJpbmcnfHwhL15cZHsxLDR9XC5cZHsxLDR9XC5cZHsxLDR9JC8udGVzdCh2YWx1ZS52ZXJzaW9uKXx8dmFsdWUuYXBpX21ham9yIT09MXx8dmFsdWUucHJvdG9jb2whPT0nemh1Z2UtaW0tZXh0ZW5zaW9uLXYxJyl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleWQjeensOaIlueJiOacrOagvOW8j+aXoOaViOOAgicpOwogIGlmKCFBcnJheS5pc0FycmF5KHZhbHVlLnBlcm1pc3Npb25zKXx8dmFsdWUucGVybWlzc2lvbnMubGVuZ3RoPjJ8fG5ldyBTZXQodmFsdWUucGVybWlzc2lvbnMpLnNpemUhPT12YWx1ZS5wZXJtaXNzaW9ucy5sZW5ndGh8fHZhbHVlLnBlcm1pc3Npb25zLnNvbWUocD0+IVBFUk1JU1NJT05TLmluY2x1ZGVzKHApKSl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleeUs+ivt+S6huS4jeaUr+aMgeeahOadg+mZkOOAgicpOwogIGlmKCFBcnJheS5pc0FycmF5KHZhbHVlLmFjdGlvbnMpfHx2YWx1ZS5hY3Rpb25zLmxlbmd0aDwxfHx2YWx1ZS5hY3Rpb25zLmxlbmd0aD4xMil0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxlemcgOimgSAxIOiHsyAxMiDkuKrliqjkvZzjgIInKTsKICBjb25zdCBzZWVuPW5ldyBTZXQoKTsKICBmb3IoY29uc3QgYSBvZiB2YWx1ZS5hY3Rpb25zKXsKICAgIGtleXMoYSxbJ2lkJywnbGFiZWwnLCdvcGVyYXRpb24nLCd0ZW1wbGF0ZScsJ2ZpbmQnLCdyZXBsYWNlbWVudCddKTsKICAgIGlmKHR5cGVvZiBhLmlkIT09J3N0cmluZyd8fCEvXlthLXpdW2EtejAtOS1dezEsMzl9JC8udGVzdChhLmlkKXx8c2Vlbi5oYXMoYS5pZCl8fCFzdHJpbmcoYS5sYWJlbCwyLDQwKXx8IVsndHJpbScsJ3VwcGVyY2FzZScsJ2xvd2VyY2FzZScsJ3RlbXBsYXRlJywncmVwbGFjZScsJ3F1b3RlJ10uaW5jbHVkZXMoYS5vcGVyYXRpb24pKXRocm93IG5ldyBFcnJvcign5omp5bGV5Yqo5L2c5peg5pWI44CCJyk7CiAgICBzZWVuLmFkZChhLmlkKTsKICAgIGlmKGEub3BlcmF0aW9uPT09J3RlbXBsYXRlJyl7CiAgICAgIGlmKCFzdHJpbmcoYS50ZW1wbGF0ZSwxLDQwMDApfHxhLmZpbmQhPT11bmRlZmluZWR8fGEucmVwbGFjZW1lbnQhPT11bmRlZmluZWQpdGhyb3cgbmV3IEVycm9yKCflm57lpI3mqKHmnb/ml6DmlYjjgIInKTsKICAgICAgaWYoYS50ZW1wbGF0ZS5pbmNsdWRlcygne3tkcmFmdH19JykmJiF2YWx1ZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnZHJhZnQucmVhZCcpKXRocm93IG5ldyBFcnJvcign6K+75Y+W6I2J56i/6ZyA6KaB5aOw5piO5p2D6ZmQ44CCJyk7CiAgICB9ZWxzZSBpZihhLm9wZXJhdGlvbj09PSdyZXBsYWNlJyl7CiAgICAgIGlmKCFzdHJpbmcoYS5maW5kLDEsMTAwKXx8IXN0cmluZyhhLnJlcGxhY2VtZW50LDAsNTAwKXx8YS50ZW1wbGF0ZSE9PXVuZGVmaW5lZCl0aHJvdyBuZXcgRXJyb3IoJ+abv+aNouWGheWuueaXoOaViOOAgicpOwogICAgfWVsc2UgaWYoYS50ZW1wbGF0ZSE9PXVuZGVmaW5lZHx8YS5maW5kIT09dW5kZWZpbmVkfHxhLnJlcGxhY2VtZW50IT09dW5kZWZpbmVkKXRocm93IG5ldyBFcnJvcign5Yqo5L2c5YyF5ZCr5aSa5L2Z6K6+572u44CCJyk7CiAgICBpZihbJ3RyaW0nLCd1cHBlcmNhc2UnLCdsb3dlcmNhc2UnLCdyZXBsYWNlJ10uaW5jbHVkZXMoYS5vcGVyYXRpb24pJiYhdmFsdWUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2RyYWZ0LnJlYWQnKSl0aHJvdyBuZXcgRXJyb3IoJ+aWh+acrOaVtOeQhumcgOimgeivu+WPluiNieeov+adg+mZkOOAgicpOwogIH0KICBpZihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpKS5sZW5ndGg+NjU1MzYpdGhyb3cgbmV3IEVycm9yKCfmianlsZXmlofku7bkuI3og73otoXov4cgNjQgS0LjgIInKTsKICByZXR1cm4gc3RydWN0dXJlZENsb25lKHZhbHVlKTsKfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0ZW5zaW9uRGlnZXN0KHRleHQpe3JldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JyxuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkpKSxiPT5iLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCcwJykpLmpvaW4oJycpO30KZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpb24oZXh0ZW5zaW9uLGlkLGlucHV0PXt9KXsKICBjb25zdCBlPXZhbGlkYXRlRXh0ZW5zaW9uKGV4dGVuc2lvbiksYWN0aW9uPWUuYWN0aW9ucy5maW5kKGE9PmEuaWQ9PT1pZCk7aWYoIWFjdGlvbil0aHJvdyBuZXcgRXJyb3IoJ+WKqOS9nOS4jeWtmOWcqOOAgicpOwogIGtleXMoaW5wdXQsWydkcmFmdCcsJ3F1YW50aXR5JywncHJpY2UnLCdzaGlwcGluZyddKTsKICBjb25zdCBkcmFmdD1pbnB1dC5kcmFmdD8/Jyc7aWYoIXN0cmluZyhkcmFmdCwwLDQwMDApKXRocm93IG5ldyBFcnJvcign6I2J56i/6L+H6ZW/44CCJyk7CiAgaWYoZHJhZnQmJiFlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdkcmFmdC5yZWFkJykpdGhyb3cgbmV3IEVycm9yKCfmsqHmnInor7vlj5bojYnnqL/mnYPpmZDjgIInKTsKICBsZXQgcmVzdWx0PScnOwogIHN3aXRjaChhY3Rpb24ub3BlcmF0aW9uKXsKICAgIGNhc2UgJ3RyaW0nOnJlc3VsdD1kcmFmdC50cmltKCk7YnJlYWs7CiAgICBjYXNlICd1cHBlcmNhc2UnOnJlc3VsdD1kcmFmdC50b1VwcGVyQ2FzZSgpO2JyZWFrOwogICAgY2FzZSAnbG93ZXJjYXNlJzpyZXN1bHQ9ZHJhZnQudG9Mb3dlckNhc2UoKTticmVhazsKICAgIGNhc2UgJ3RlbXBsYXRlJzpyZXN1bHQ9YWN0aW9uLnRlbXBsYXRlLnNwbGl0KCd7e2RyYWZ0fX0nKS5qb2luKGRyYWZ0KTticmVhazsKICAgIGNhc2UgJ3JlcGxhY2UnOnJlc3VsdD1kcmFmdC5zcGxpdChhY3Rpb24uZmluZCkuam9pbihhY3Rpb24ucmVwbGFjZW1lbnQpO2JyZWFrOwogICAgY2FzZSAncXVvdGUnOnsKICAgICAgY29uc3Qge3F1YW50aXR5LHByaWNlLHNoaXBwaW5nfT1pbnB1dDsKICAgICAgaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHF1YW50aXR5KXx8cXVhbnRpdHk8MXx8cXVhbnRpdHk+MTAwMDAwMHx8IVtwcmljZSxzaGlwcGluZ10uZXZlcnkobj0+dHlwZW9mIG49PT0nbnVtYmVyJyYmTnVtYmVyLmlzRmluaXRlKG4pJiZuPj0wJiZuPD0xMDAwMDAwJiZNYXRoLmFicyhuKjEwMC1NYXRoLnJvdW5kKG4qMTAwKSk8MC4wMDAwMSkpdGhyb3cgbmV3IEVycm9yKCfor7floavlhpnmnInmlYjmlbDph4/lkozmnIDlpJrkuKTkvY3lsI/mlbDnmoTph5Hpop3jgIInKTsKICAgICAgY29uc3QgY2VudHM9cXVhbnRpdHkqTWF0aC5yb3VuZChwcmljZSoxMDApK01hdGgucm91bmQoc2hpcHBpbmcqMTAwKTsKICAgICAgcmVzdWx0PWDmlbDph4/vvJoke3F1YW50aXR5fVxu5Y2V5Lu377yaJHtwcmljZS50b0ZpeGVkKDIpfSDlhYNcbui/kOi0ue+8miR7c2hpcHBpbmcudG9GaXhlZCgyKX0g5YWDXG7lkIjorqHvvJokeyhjZW50cy8xMDApLnRvRml4ZWQoMil9IOWFg2A7YnJlYWs7CiAgICB9CiAgfQogIGlmKHJlc3VsdC5sZW5ndGg+NDAwMCl0aHJvdyBuZXcgRXJyb3IoJ+WkhOeQhue7k+aenOi2hei/hyA0MDAwIOWtl++8jOacquWGmeWFpeiNieeov+OAgicpOwogIHJldHVybiByZXN1bHQ7Cn0K",
      "extension-worker.js": "aW1wb3J0IHtleGVjdXRlQWN0aW9ufSBmcm9tICcuL2V4dGVuc2lvbi1zY2hlbWEuanMnOwovLyBPbmx5IHRoaXMgdHJ1c3RlZCBpbnRlcnByZXRlciBydW5zLiBFeHRlbnNpb24gZG9jdW1lbnRzIGFyZSBuZXZlciBldmFsdWF0ZWQgYXMgY29kZS4Kc2VsZi5vbm1lc3NhZ2U9ZXZlbnQ9PnsKICB0cnl7c2VsZi5wb3N0TWVzc2FnZSh7aWQ6ZXZlbnQuZGF0YS5pZCxyZXN1bHQ6ZXhlY3V0ZUFjdGlvbihldmVudC5kYXRhLmV4dGVuc2lvbixldmVudC5kYXRhLmFjdGlvbixldmVudC5kYXRhLmlucHV0KX0pO30KICBjYXRjaChlcnJvcil7c2VsZi5wb3N0TWVzc2FnZSh7aWQ6ZXZlbnQuZGF0YT8uaWQsZXJyb3I6ZXJyb3IubWVzc2FnZX0pO30KfTsK",
      "extensions-page.js": "aW1wb3J0IHtpbnN0YWxsZWRFeHRlbnNpb25zLEVYVEVOU0lPTl9LRVkscmVhZEV4dGVuc2lvbixjaGVja01hcmtldFJlY29yZH0gZnJvbSAnLi9leHRlbnNpb24taG9zdC5qcyc7CmltcG9ydCB7ZXh0ZW5zaW9uRGlnZXN0fSBmcm9tICcuL2V4dGVuc2lvbi1zY2hlbWEuanMnOwppbXBvcnQge3BsYXRmb3JtT3JpZ2lufSBmcm9tICcuL2NvbmZpZy5qcyc7CmNvbnN0IG5vdGljZT10ZXh0PT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbm90aWNlJykudGV4dENvbnRlbnQ9dGV4dDsKYXN5bmMgZnVuY3Rpb24gaW5zdGFsbCh0ZXh0LHJlbGVhc2VfaWQpewogIC8vIEEgbWFya2V0IGRvd25sb2FkIGVudmVsb3BlIGJpbmRzIHRoZSBleGFjdCByZXZpZXdlZCBmaWxlOyByYXcgbG9jYWwgZmlsZXMgc3RheSB1bnJldmlld2VkLgogIGNvbnN0IHBhcnNlZD1KU09OLnBhcnNlKHRleHQpOwogIGlmKHBhcnNlZC5raW5kPT09J3podWdlLmltLmV4dGVuc2lvbi5kb3dubG9hZCcpe2lmKHR5cGVvZiBwYXJzZWQudGV4dCE9PSdzdHJpbmcnKXRocm93IG5ldyBFcnJvcign5LiL6L295paH5Lu25peg5pWI44CCJyk7dGV4dD1wYXJzZWQudGV4dDtyZWxlYXNlX2lkPXBhcnNlZC5yZWxlYXNlX2lkO30KICBjb25zdCByZWNvcmQ9e3RleHQsZGlnZXN0OmF3YWl0IGV4dGVuc2lvbkRpZ2VzdCh0ZXh0KSwuLi4ocmVsZWFzZV9pZD97cmVsZWFzZV9pZH06e30pfTsKICBjb25zdCB7ZXh0ZW5zaW9ufT1hd2FpdCByZWFkRXh0ZW5zaW9uKHJlY29yZCk7YXdhaXQgY2hlY2tNYXJrZXRSZWNvcmQocmVjb3JkKTsKICBjb25zdCBlbnRyaWVzPWluc3RhbGxlZEV4dGVuc2lvbnMoKS5maWx0ZXIocj0+e3RyeXtyZXR1cm4gSlNPTi5wYXJzZShyLnRleHQpLmlkIT09ZXh0ZW5zaW9uLmlkO31jYXRjaHtyZXR1cm4gZmFsc2U7fX0pOwogIGlmKGVudHJpZXMubGVuZ3RoPj0yMCl0aHJvdyBuZXcgRXJyb3IoJ+acgOWkmuWuieijhSAyMCDkuKrmianlsZXjgIInKTsKICBlbnRyaWVzLnB1c2gocmVjb3JkKTtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShFWFRFTlNJT05fS0VZLEpTT04uc3RyaW5naWZ5KGVudHJpZXMpKTthd2FpdCByZW5kZXIoKTtub3RpY2UoJ+W3suWuieijheOAguWbnuWIsOiBiuWkqeWQju+8jOivt+mHjeaWsOWQr+eUqOatpOeJiOacrOeahOadg+mZkOOAgicpOwp9CmFzeW5jIGZ1bmN0aW9uIHJlbmRlcigpe2NvbnN0IGxpc3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2luc3RhbGxlZCcpO2xpc3QucmVwbGFjZUNoaWxkcmVuKCk7Zm9yKGNvbnN0IHJlY29yZCBvZiBpbnN0YWxsZWRFeHRlbnNpb25zKCkpewogIGNvbnN0IHJvdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtyb3cuY2xhc3NOYW1lPSdlbnRyeSc7Y29uc3QgbGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOwogIHRyeXtjb25zdCB7ZXh0ZW5zaW9uOmV9PWF3YWl0IHJlYWRFeHRlbnNpb24ocmVjb3JkKTtsYWJlbC50ZXh0Q29udGVudD1gJHtlLm5hbWV9IMK3ICR7ZS52ZXJzaW9ufSDCtyAke3JlY29yZC5yZWxlYXNlX2lkPyfluILlnLrniYjmnKzvvIzov5DooYzliY3lpI3moLjnirbmgIEnOifmnKzlnLDkv67mlLnniYgnfVxuJHtlLnBlcm1pc3Npb25zLm1hcChwPT5wPT09J2RyYWZ0LnJlYWQnPyfor7vlj5blvZPliY3ojYnnqL8nOifnu4/nlKjmiLfmk43kvZzlhpnlhaXojYnnqL8nKS5qb2luKCfjgIEnKXx8J+S7hemihOiniCd9YDt9Y2F0Y2goZXJyb3Ipe2xhYmVsLnRleHRDb250ZW50PWVycm9yLm1lc3NhZ2U7fQogIGNvbnN0IGJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtidXR0b24udGV4dENvbnRlbnQ9J+enu+mZpCc7YnV0dG9uLm9uY2xpY2s9KCk9Pntsb2NhbFN0b3JhZ2Uuc2V0SXRlbShFWFRFTlNJT05fS0VZLEpTT04uc3RyaW5naWZ5KGluc3RhbGxlZEV4dGVuc2lvbnMoKS5maWx0ZXIocj0+ci5kaWdlc3QhPT1yZWNvcmQuZGlnZXN0KSkpO3ZvaWQgcmVuZGVyKCk7fTtyb3cuYXBwZW5kKGxhYmVsLGJ1dHRvbik7bGlzdC5hcHBlbmQocm93KTsKfWlmKCFsaXN0LmNoaWxkcmVuLmxlbmd0aClsaXN0LnRleHRDb250ZW50PSflsJrmnKrlronoo4XmianlsZXjgIInO30KZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcmtldCcpLmhyZWY9cGxhdGZvcm1PcmlnaW4rJy9jYXBhYmlsaXR5LW1hcmtldC9kaXJlY3QtaW0vZXh0ZW5zaW9ucyc7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWV4YW1wbGVdJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5vbmNsaWNrPWFzeW5jKCk9PntidXR0b24uZGlzYWJsZWQ9dHJ1ZTt0cnl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgZmV0Y2goYC4vZXh0ZW5zaW9ucy8ke2J1dHRvbi5kYXRhc2V0LmV4YW1wbGV9Lmpzb25gKTtpZighcmVzcG9uc2Uub2spdGhyb3cgbmV3IEVycm9yKCfnpLrkvovor7vlj5blpLHotKXjgIInKTthd2FpdCBpbnN0YWxsKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7fWNhdGNoKGVycm9yKXtub3RpY2UoZXJyb3IubWVzc2FnZSk7fWZpbmFsbHl7YnV0dG9uLmRpc2FibGVkPWZhbHNlO319KTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ltcG9ydCcpLm9uY2hhbmdlPWFzeW5jIGV2ZW50PT57Y29uc3QgZmlsZT1ldmVudC50YXJnZXQuZmlsZXNbMF07aWYoIWZpbGUpcmV0dXJuO3RyeXtpZihmaWxlLnNpemU+MTAwMDAwKXRocm93IG5ldyBFcnJvcign5paH5Lu26L+H5aSn44CCJyk7YXdhaXQgaW5zdGFsbChhd2FpdCBmaWxlLnRleHQoKSk7fWNhdGNoKGVycm9yKXtub3RpY2UoZXJyb3IubWVzc2FnZSk7fWZpbmFsbHl7ZXZlbnQudGFyZ2V0LnZhbHVlPScnO319Owp2b2lkIHJlbmRlcigpOwo=",
      "guard.mjs": "aW1wb3J0IHtyZWFkRmlsZSx3cml0ZUZpbGUsbWtkaXIscmVuYW1lLGxzdGF0LGNvcHlGaWxlLHJlYWRkaXJ9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnOwppbXBvcnQge2NyZWF0ZUhhc2gsY3JlYXRlUHVibGljS2V5LHZlcmlmeSxyYW5kb21VVUlEfSBmcm9tICdub2RlOmNyeXB0byc7CmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnOwpjb25zdCBzaGE9ZGF0YT0+Y3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGRhdGEpLmRpZ2VzdCgnaGV4Jyk7CmV4cG9ydCBjb25zdCByb290PWZpbGVVUkxUb1BhdGgobmV3IFVSTCgnLicsaW1wb3J0Lm1ldGEudXJsKSk7CmNvbnN0IHJlcXVpcmVkPVsnYm9vdHN0cmFwLmpzJywnc2RrLmpzJywnaW50ZWdyaXR5LmpzJywnY29uZmlnLmpzJywnc2VydmVyLm1qcycsJ2d1YXJkLm1qcycsJ2V4dGVuc2lvbi1ob3N0LmpzJywnZXh0ZW5zaW9uLXNjaGVtYS5qcycsJ2V4dGVuc2lvbi13b3JrZXIuanMnLCdzcmMvY2xpZW50LmpzJywnc3JjL3N0b3JhZ2UuanMnXTsKY29uc3QgdmFsaWRQYXRoPW5hbWU9Pi9eKD86c3JjXC9bYS16LV0rXC4oPzpqc3x0cyl8W2Etei1dK1wuKD86anN8bWpzfGpzb258aHRtbCkpJC8udGVzdChuYW1lKTsKYXN5bmMgZnVuY3Rpb24gc2FmZVRhcmdldChiYXNlLG5hbWUpewogIGlmKCF2YWxpZFBhdGgobmFtZSkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Pmlofku7bot6/lvoTml6DmlYjjgIInKTsKICBjb25zdCB0YXJnZXQ9cGF0aC5yZXNvbHZlKGJhc2UsbmFtZSk7aWYoIXRhcmdldC5zdGFydHNXaXRoKHBhdGgucmVzb2x2ZShiYXNlKStwYXRoLnNlcCkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Pot6/lvoTotornlYzjgIInKTsKICBsZXQgY3VycmVudD1iYXNlO2Zvcihjb25zdCBwYXJ0IG9mIG5hbWUuc3BsaXQoJy8nKSl7Y3VycmVudD1wYXRoLmpvaW4oY3VycmVudCxwYXJ0KTtjb25zdCBzdGF0PWF3YWl0IGxzdGF0KGN1cnJlbnQpLmNhdGNoKGU9PntpZihlLmNvZGU9PT0nRU5PRU5UJylyZXR1cm4gbnVsbDt0aHJvdyBlO30pO2lmKHN0YXQ/LmlzU3ltYm9saWNMaW5rKCkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Pot6/lvoTkuI3og73kvb/nlKjnrKblj7fpk77mjqXjgIInKTt9CiAgcmV0dXJuIHRhcmdldDsKfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVsZWFzZShyZWxlYXNlLGJhc2U9cm9vdCl7CiAgY29uc3QgdHJ1c3RlZEtleT1hd2FpdCByZWFkRmlsZShwYXRoLmpvaW4oYmFzZSwncmVsZWFzZS1rZXkuanNvbicpKTsKICBjb25zdCBqd2s9SlNPTi5wYXJzZSh0cnVzdGVkS2V5LnRvU3RyaW5nKCkpOwogIGlmKCFyZWxlYXNlPy5wYXlsb2FkfHx0eXBlb2YgcmVsZWFzZS5zaWduYXR1cmUhPT0nc3RyaW5nJ3x8IXZlcmlmeSgnUlNBLVNIQTI1NicsQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocmVsZWFzZS5wYXlsb2FkKSksY3JlYXRlUHVibGljS2V5KHtrZXk6andrLGZvcm1hdDonandrJ30pLEJ1ZmZlci5mcm9tKHJlbGVhc2Uuc2lnbmF0dXJlLCdiYXNlNjQnKSkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Plj5HluIPnrb7lkI3ml6DmlYjjgIInKTsKICBjb25zdCBwPXJlbGVhc2UucGF5bG9hZDsKICBpZihwLmZpbGVzPy5bJ3JlbGVhc2Uta2V5Lmpzb24nXSE9PXNoYSh0cnVzdGVkS2V5KSl0aHJvdyBuZXcgRXJyb3IoJ+WNh+e6p+aWh+S7tuS4jeiDvemdmem7mOabv+aNouWumOaWueetvuWQjeagueOAgicpOwogIGlmKHAucHJvdG9jb2whPT0nemh1Z2UtaW0tdjEnfHxwLmFwaV9tYWpvciE9PTF8fHAuc3RvcmFnZV92ZXJzaW9uIT09MXx8IS9eXGQrXC5cZCtcLlxkKyQvLnRlc3QocC52ZXJzaW9uKSl0aHJvdyBuZXcgRXJyb3IoJ+WNj+iuruaIluacrOWcsOiusOW9leagvOW8j+S4jeWFvOWuue+8jOS4jeiDveebtOaOpeWIh+aNouatpOeJiOacrOOAgicpOwogIGlmKCFwLmZpbGVzfHwhcC5iYXNlbGluZXx8T2JqZWN0LmtleXMocC5maWxlcykubGVuZ3RoPjQwfHxyZXF1aXJlZC5zb21lKG49PiFwLmZpbGVzW25dKSl0aHJvdyBuZXcgRXJyb3IoJ+aguOW/g+WPkeW4g+a4heWNleS4jeWujOaVtOOAgicpOwogIGZvcihjb25zdCBbbmFtZSxkaWdlc3RdIG9mIE9iamVjdC5lbnRyaWVzKHAuZmlsZXMpKXsKICAgIGlmKCF2YWxpZFBhdGgobmFtZSl8fHR5cGVvZiBwLmJhc2VsaW5lW25hbWVdIT09J3N0cmluZyd8fHAuYmFzZWxpbmVbbmFtZV0ubGVuZ3RoPjIwMDAwMDB8fHNoYShCdWZmZXIuZnJvbShwLmJhc2VsaW5lW25hbWVdLCdiYXNlNjQnKSkhPT1kaWdlc3QpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4PmgaLlpI3lhoXlrrnmoKHpqozlpLHotKXjgIInKTsKICB9CiAgcmV0dXJuIHA7Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrKGJhc2U9cm9vdCl7CiAgY29uc3QgcmVsZWFzZT1KU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhdGguam9pbihiYXNlLCdyZWxlYXNlLmpzb24nKSwndXRmOCcpKTtjb25zdCBwPWF3YWl0IHZlcmlmeVJlbGVhc2UocmVsZWFzZSxiYXNlKTtjb25zdCBjaGFuZ2VkPVtdOwogIGZvcihjb25zdCBbbmFtZSxkaWdlc3RdIG9mIE9iamVjdC5lbnRyaWVzKHAuZmlsZXMpKXsKICAgIHRyeXtpZihzaGEoYXdhaXQgcmVhZEZpbGUoYXdhaXQgc2FmZVRhcmdldChiYXNlLG5hbWUpKSkhPT1kaWdlc3QpY2hhbmdlZC5wdXNoKG5hbWUpO31jYXRjaHtjaGFuZ2VkLnB1c2gobmFtZSk7fQogIH0KICByZXR1cm4ge29rOmNoYW5nZWQubGVuZ3RoPT09MCx2ZXJzaW9uOnAudmVyc2lvbixwcm90b2NvbDpwLnByb3RvY29sLGNoYW5nZWR9Owp9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN0b3JlKHJlbGVhc2UsYmFzZT1yb290KXsKICBjb25zdCBwPWF3YWl0IHZlcmlmeVJlbGVhc2UocmVsZWFzZSxiYXNlKTsKICBjb25zdCB0YXJnZXRzPVtdO2Zvcihjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHAuZmlsZXMpKXRhcmdldHMucHVzaChbbmFtZSxhd2FpdCBzYWZlVGFyZ2V0KGJhc2UsbmFtZSksQnVmZmVyLmZyb20ocC5iYXNlbGluZVtuYW1lXSwnYmFzZTY0JyldKTsKICB0YXJnZXRzLnB1c2goWydyZWxlYXNlLmpzb24nLGF3YWl0IHNhZmVUYXJnZXQoYmFzZSwncmVsZWFzZS5qc29uJyksQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocmVsZWFzZSxudWxsLDIpKV0pOwogIGNvbnN0IGJhY2t1cFJvb3Q9cGF0aC5qb2luKGJhc2UsJ3VzZXItYmFja3VwcycpO2NvbnN0IHN0PWF3YWl0IGxzdGF0KGJhY2t1cFJvb3QpLmNhdGNoKCgpPT5udWxsKTtpZihzdD8uaXNTeW1ib2xpY0xpbmsoKSl0aHJvdyBuZXcgRXJyb3IoJ+Wkh+S7veebruW9leS4jeiDveS9v+eUqOespuWPt+mTvuaOpeOAgicpOwogIGNvbnN0IGJhY2t1cD1wYXRoLmpvaW4oYmFja3VwUm9vdCxgY29yZS0ke0RhdGUubm93KCl9LSR7cmFuZG9tVVVJRCgpfWApO2F3YWl0IG1rZGlyKGJhY2t1cCx7cmVjdXJzaXZlOnRydWV9KTsKICAvLyBCYWNrIHVwIGV2ZXJ5IGV4aXN0aW5nIGNvcmUgZmlsZSBiZWZvcmUgdGhlIGZpcnN0IG11dGF0aW9uOyBuZXZlciB0b3VjaCBicm93c2VyIHN0b3JhZ2UuCiAgZm9yKGNvbnN0IFtuYW1lLHRhcmdldF0gb2YgdGFyZ2V0cyl7Y29uc3QgY29udGVudD1hd2FpdCByZWFkRmlsZSh0YXJnZXQpLmNhdGNoKGU9PntpZihlLmNvZGU9PT0nRU5PRU5UJylyZXR1cm4gbnVsbDt0aHJvdyBlO30pO2lmKGNvbnRlbnQpe2NvbnN0IGRlc3Q9cGF0aC5qb2luKGJhY2t1cCxuYW1lKTthd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdCkse3JlY3Vyc2l2ZTp0cnVlfSk7YXdhaXQgd3JpdGVGaWxlKGRlc3QsY29udGVudCx7ZmxhZzond3gnfSk7fX0KICBmb3IoY29uc3QgWyx0YXJnZXQsYnl0ZXNdIG9mIHRhcmdldHMpe2F3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXQpLHtyZWN1cnNpdmU6dHJ1ZX0pO2NvbnN0IHN0YWdlZD10YXJnZXQrJy4nK3JhbmRvbVVVSUQoKSsnLnRtcCc7YXdhaXQgd3JpdGVGaWxlKHN0YWdlZCxieXRlcyx7ZmxhZzond3gnfSk7YXdhaXQgcmVuYW1lKHN0YWdlZCx0YXJnZXQpO30KICByZXR1cm4ge3ZlcnNpb246cC52ZXJzaW9uLGJhY2t1cCxjaGVjazphd2FpdCBjaGVjayhiYXNlKX07Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShyZWxlYXNlLGJhc2U9cm9vdCl7CiAgY29uc3QgY3VycmVudD1hd2FpdCBjaGVjayhiYXNlKTtpZighY3VycmVudC5vayl0aHJvdyBuZXcgRXJyb3IoJ+ivt+WFiOaBouWkjeW9k+WJjeaguOW/g++8jOWGjeajgOafpeWNh+e6p+OAgicpOwogIGNvbnN0IHA9YXdhaXQgdmVyaWZ5UmVsZWFzZShyZWxlYXNlLGJhc2UpO2NvbnN0IG5leHQ9cC52ZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlciksb2xkPWN1cnJlbnQudmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpOwogIGNvbnN0IGRpZmZlcmluZz1uZXh0LmZpbmRJbmRleCgobixpKT0+biE9PW9sZFtpXSk7aWYoZGlmZmVyaW5nPj0wJiZuZXh0W2RpZmZlcmluZ108b2xkW2RpZmZlcmluZ10pdGhyb3cgbmV3IEVycm9yKCfkuI3og73nm7TmjqXpmY3nuqfmoLjlv4PvvJvor7fkv53nlZnlvZPliY3mlbDmja7lubbkvb/nlKjljp/niYjmnKzlpIfku73jgIInKTsKICByZXR1cm4gcmVzdG9yZShyZWxlYXNlLGJhc2UpOwp9CmFzeW5jIGZ1bmN0aW9uIGV4cGVyaW1lbnQoYmFzZT1yb290KXsKICBjb25zdCBwYXJlbnQ9cGF0aC5qb2luKGJhc2UsJ2V4cGVyaW1lbnRzJyk7aWYoKGF3YWl0IGxzdGF0KHBhcmVudCkuY2F0Y2goKCk9Pm51bGwpKT8uaXNTeW1ib2xpY0xpbmsoKSl0aHJvdyBuZXcgRXJyb3IoJ+WunumqjOebruW9leS4jeiDveS9v+eUqOespuWPt+mTvuaOpeOAgicpOwogIGNvbnN0IGRlc3Q9cGF0aC5qb2luKHBhcmVudCxgY29yZS0ke0RhdGUubm93KCl9LSR7cmFuZG9tVVVJRCgpfWApO2F3YWl0IG1rZGlyKGRlc3Qse3JlY3Vyc2l2ZTp0cnVlfSk7CiAgYXN5bmMgZnVuY3Rpb24gY29weShmcm9tLHRvKXtmb3IoY29uc3QgaXRlbSBvZiBhd2FpdCByZWFkZGlyKGZyb20se3dpdGhGaWxlVHlwZXM6dHJ1ZX0pKXtpZihpdGVtLm5hbWUuc3RhcnRzV2l0aCgnLicpfHxbJ2V4cGVyaW1lbnRzJywndXNlci1iYWNrdXBzJywnbm9kZV9tb2R1bGVzJ10uaW5jbHVkZXMoaXRlbS5uYW1lKXx8aXRlbS5pc1N5bWJvbGljTGluaygpKWNvbnRpbnVlO2NvbnN0IHM9cGF0aC5qb2luKGZyb20saXRlbS5uYW1lKSx0PXBhdGguam9pbih0byxpdGVtLm5hbWUpO2lmKGl0ZW0uaXNEaXJlY3RvcnkoKSl7YXdhaXQgbWtkaXIodCx7cmVjdXJzaXZlOnRydWV9KTthd2FpdCBjb3B5KHMsdCk7fWVsc2UgaWYoaXRlbS5pc0ZpbGUoKSlhd2FpdCBjb3B5RmlsZShzLHQpO319CiAgYXdhaXQgY29weShiYXNlLGRlc3QpO3JldHVybiB7cGF0aDpkZXN0LG1lc3NhZ2U6J+WunumqjOWJr+acrOW3suWIm+W7uuOAguivt+S9v+eUqOS4jeWQjOerr+WPo+OAgeeLrOeri+a1j+iniOWZqOmFjee9ruWSjOa1i+ivlei0puWPt++8m+a1j+iniOWZqOiusOW9leayoeacieWkjeWItuOAgid9Owp9CmlmKHByb2Nlc3MuYXJndlsxXSYmcGF0aC5yZXNvbHZlKHByb2Nlc3MuYXJndlsxXSk9PT1maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpewogIHRyeXtjb25zdCBjb21tYW5kPXByb2Nlc3MuYXJndlsyXXx8J2NoZWNrJztsZXQgcmVzdWx0OwogICAgaWYoY29tbWFuZD09PSdjaGVjaycpcmVzdWx0PWF3YWl0IGNoZWNrKCk7CiAgICBlbHNlIGlmKGNvbW1hbmQ9PT0ncmVzdG9yZScpcmVzdWx0PWF3YWl0IHJlc3RvcmUoSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYXRoLmpvaW4ocm9vdCwncmVsZWFzZS5qc29uJyksJ3V0ZjgnKSkpOwogICAgZWxzZSBpZihjb21tYW5kPT09J3VwZGF0ZScmJnByb2Nlc3MuYXJndlszXSlyZXN1bHQ9YXdhaXQgdXBkYXRlKEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocHJvY2Vzcy5hcmd2WzNdLCd1dGY4JykpKTsKICAgIGVsc2UgaWYoY29tbWFuZD09PSdleHBlcmltZW50JylyZXN1bHQ9YXdhaXQgZXhwZXJpbWVudCgpOwogICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ+S9v+eUqCBub2RlIGd1YXJkLm1qcyBjaGVjayAvIHJlc3RvcmUgLyB1cGRhdGUg5Y+R5biD5paH5Lu2IC8gZXhwZXJpbWVudOOAgicpOwogICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LG51bGwsMikpO2lmKHJlc3VsdC5vaz09PWZhbHNlKXByb2Nlc3MuZXhpdENvZGU9MTsKICB9Y2F0Y2goZXJyb3Ipe2NvbnNvbGUuZXJyb3IoJ+ajgOafpeacquWujOaIkO+8micrZXJyb3IubWVzc2FnZSk7cHJvY2Vzcy5leGl0Q29kZT0xO30KfQo=",
      "guest-control.js": "aW1wb3J0IHtwbGF0Zm9ybU9yaWdpbn0gZnJvbSAnLi9jb25maWcuanMnOwppbXBvcnQge29wZW5EZXZpY2UscmVhZERldmljZSxzYXZlRGV2aWNlLGhhc2gsbnVtYmVyRm9yLHNpZ24sdmVyaWZ5LGJhc2U2NCxzZWFsLHVuc2VhbH0gZnJvbSAnLi9ndWVzdC1pZGVudGl0eS5qcyc7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVSb29tKGVudmVsb3BlLG93bklkLGNvbXBsZXRlPXRydWUpewogIGNvbnN0IHJvb209SlNPTi5wYXJzZShlbnZlbG9wZS5wYXlsb2FkKSxzZWVuPW5ldyBTZXQoKTsKICBpZihyb29tLnZlcnNpb24hPT0xfHxPYmplY3Qua2V5cyhyb29tKS5zb3J0KCkuam9pbigpIT09J21lbWJlcnMsbm9uY2Usb3duZXIsdGl0bGUsdmVyc2lvbid8fHR5cGVvZiByb29tLm5vbmNlIT09J3N0cmluZyd8fHJvb20ubm9uY2UubGVuZ3RoIT09MzZ8fHR5cGVvZiByb29tLnRpdGxlIT09J3N0cmluZyd8fHJvb20udGl0bGUubGVuZ3RoPjQwfHwhcm9vbS50aXRsZS50cmltKCl8fCFBcnJheS5pc0FycmF5KHJvb20ubWVtYmVycyl8fHJvb20ubWVtYmVycy5sZW5ndGg8Mnx8cm9vbS5tZW1iZXJzLmxlbmd0aD42KXRocm93IG5ldyBFcnJvcign5Lya6K+d5L+h5oGv5LiN5q2j56Gu44CCJyk7CiAgZm9yKGNvbnN0IG0gb2Ygcm9vbS5tZW1iZXJzKXsKICAgIGlmKE9iamVjdC5rZXlzKG0pLnNvcnQoKS5qb2luKCkhPT0naWQsbmFtZSxwdWJsaWNfa2V5J3x8bS5pZCE9PWF3YWl0IG51bWJlckZvcihtLnB1YmxpY19rZXkpfHx0eXBlb2YgbS5uYW1lIT09J3N0cmluZyd8fCFtLm5hbWUudHJpbSgpfHxtLm5hbWUubGVuZ3RoPjQwfHxzZWVuLmhhcyhtLmlkKSl0aHJvdyBuZXcgRXJyb3IoJ+iuvuWkh+i6q+S7veS4jeS4gOiHtOOAgicpOwogICAgc2Vlbi5hZGQobS5pZCk7Y29uc3Qgc2lnbmF0dXJlPWVudmVsb3BlLnNpZ25hdHVyZXNbU3RyaW5nKG0uaWQpXTsKICAgIGlmKChjb21wbGV0ZXx8c2lnbmF0dXJlKSYmIWF3YWl0IHZlcmlmeShtLnB1YmxpY19rZXksJ3podWdlLWltLXJvb20tdjFcbicrZW52ZWxvcGUucGF5bG9hZCxzaWduYXR1cmUpKXRocm93IG5ldyBFcnJvcign5oiQ5ZGY5pyq56Gu6K6k5oiW562+5ZCN5bey5Y+Y5YyW44CCJyk7CiAgfQogIGlmKCFzZWVuLmhhcyhvd25JZCl8fCFzZWVuLmhhcyhyb29tLm93bmVyKXx8T2JqZWN0LmtleXMoZW52ZWxvcGUuc2lnbmF0dXJlcykuc29tZShpZD0+IXNlZW4uaGFzKE51bWJlcihpZCkpKSl0aHJvdyBuZXcgRXJyb3IoJ+S4jeWxnuS6jui/meS4quS8muivneOAgicpOwogIGNvbnN0IGRpZ2VzdD1hd2FpdCBoYXNoKGVudmVsb3BlLnBheWxvYWQpO3JldHVybiB7Li4ucm9vbSxkaWdlc3QsaWQ6cGFyc2VJbnQoZGlnZXN0LnNsaWNlKDAsMTMpLDE2KXx8MSxlbnZlbG9wZX07Cn0KCmV4cG9ydCBjbGFzcyBHdWVzdENvbnRyb2x7CiAgc3RhdGljIGFzeW5jIGNyZWF0ZShuYW1lLGFsaWFzLG9uQ2hhbmdlLG9uTm90aWNlKXtjb25zdCBzZWxmPW5ldyBHdWVzdENvbnRyb2woKTtzZWxmLmlkZW50aXR5PWF3YWl0IG9wZW5EZXZpY2UobmFtZSxhbGlhcyk7c2VsZi5vbkNoYW5nZT1vbkNoYW5nZTtzZWxmLm9uTm90aWNlPW9uTm90aWNlO2F3YWl0IHNlbGYubG9hZFJvb21zKCk7cmV0dXJuIHNlbGY7fQogIHRva2VuPScnO2V4cGlyZXM9MDtkaXNjb3ZlcmFibGU9dHJ1ZTthdXRvUGF1c2VBcm1lZD10cnVlO2Nsb3NlZD1mYWxzZTtyb29tcz1bXTtpbnZpdGF0aW9ucz1bXTtsaW5rcz1bXTtjb25uZWN0ZWRJZHM9bmV3IFNldCgpO2xhc3RQcmVzZW5jZT0wO3BhZ2VJZD0nJzsKICBhc3luYyBsb2FkUm9vbXMoKXt0aGlzLnJvb21zPVtdO2Zvcihjb25zdCBlIG9mIHRoaXMuaWRlbnRpdHkucm9vbXN8fFtdKXtjb25zdCByb29tPWF3YWl0IHZhbGlkYXRlUm9vbShlLHRoaXMuaWRlbnRpdHkuaWQpO2lmKCFyb29tLm1lbWJlcnMuc29tZShtPT50aGlzLmlkZW50aXR5LmJsb2NrZWQuaW5jbHVkZXMobS5pZCkpKXRoaXMucm9vbXMucHVzaChyb29tKTt9fQogIHByb2ZpbGUoKXtyZXR1cm4ge2lkOnRoaXMuaWRlbnRpdHkuaWQsbmFtZTp0aGlzLmlkZW50aXR5Lm5hbWUsYWxpYXM6dGhpcy5pZGVudGl0eS5hbGlhcyxkaXNjb3ZlcmFibGU6dGhpcy5kaXNjb3ZlcmFibGV9O30KICBjb252ZXJzYXRpb25zKCl7cmV0dXJuIHRoaXMucm9vbXMubWFwKHI9Pih7aWQ6ci5pZCx0aXRsZTpyLm1lbWJlcnMubGVuZ3RoPT09Mj9yLm1lbWJlcnMuZmluZChtPT5tLmlkIT09dGhpcy5pZGVudGl0eS5pZCkubmFtZTpyLnRpdGxlLGNvbnZlcnNhdGlvbl90eXBlOnIubWVtYmVycy5sZW5ndGg9PT0yPydkaXJlY3QnOidncm91cCcscGFydGljaXBhbnRzOnIubWVtYmVycy5tYXAobT0+KHt1c2VyX2lkOm0uaWQsZGlzcGxheV9uYW1lOm0ubmFtZX0pKX0pKTt9CiAgdHJ1c3RlZChwZWVyLGlkKXtyZXR1cm4gIXRoaXMuY2xvc2VkJiYhdGhpcy5pZGVudGl0eS5ibG9ja2VkLmluY2x1ZGVzKHBlZXIpJiZ0aGlzLnJvb21zLnNvbWUocj0+ci5pZD09PWlkJiZyLm1lbWJlcnMuc29tZShtPT5tLmlkPT09cGVlcikmJnIubWVtYmVycy5zb21lKG09Pm0uaWQ9PT10aGlzLmlkZW50aXR5LmlkKSk7fQogIGNvbm5lY3RlZChpZHMpewogICAgdGhpcy5jb25uZWN0ZWRJZHM9bmV3IFNldChpZHMpOwogICAgY29uc3QgZXhwZWN0ZWQ9Wy4uLm5ldyBTZXQodGhpcy5yb29tcy5mbGF0TWFwKHI9PnIubWVtYmVycy5tYXAobT0+bS5pZCkpKV0uZmlsdGVyKGlkPT5pZCE9PXRoaXMuaWRlbnRpdHkuaWQpOwogICAgY29uc3QgYWxsPWV4cGVjdGVkLmxlbmd0aCYmZXhwZWN0ZWQuZXZlcnkoaWQ9PnRoaXMuY29ubmVjdGVkSWRzLmhhcyhpZCkpOwogICAgaWYoIWFsbCl0aGlzLmF1dG9QYXVzZUFybWVkPXRydWU7CiAgICBpZih0aGlzLmRpc2NvdmVyYWJsZSYmYWxsJiZ0aGlzLmF1dG9QYXVzZUFybWVkJiYhdGhpcy5pbnZpdGF0aW9ucy5zb21lKGk9PiFpLmRlY2xpbmVkJiYhaS5jb21wbGV0ZSkpdm9pZCB0aGlzLmRpc2NvdmVyeShmYWxzZSkuY2F0Y2goZT0+dGhpcy5vbk5vdGljZShlLm1lc3NhZ2UpKTsKICB9CiAgYXN5bmMgaHR0cChwYXRoLGJvZHksYXV0aGVudGljYXRlZD10cnVlKXsKICAgIGlmKHRoaXMuY2xvc2VkKXRocm93IG5ldyBFcnJvcign6K6+5aSH6L+e5o6l5bey57uT5p2f44CCJyk7CiAgICBpZihhdXRoZW50aWNhdGVkJiZ0aGlzLmV4cGlyZXM8RGF0ZS5ub3coKSlhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZSgpOwogICAgY29uc3Qgcj1hd2FpdCBmZXRjaChgJHtwbGF0Zm9ybU9yaWdpbn0vYXBpL2ltLWRpcmVjdC9ndWVzdCR7cGF0aH1gLHttZXRob2Q6J1BPU1QnLGNyZWRlbnRpYWxzOidvbWl0JyxjYWNoZTonbm8tc3RvcmUnLGhlYWRlcnM6eydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uJywuLi4oYXV0aGVudGljYXRlZD97QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dGhpcy50b2tlbn1gfTp7fSl9LGJvZHk6SlNPTi5zdHJpbmdpZnkoYm9keSksc2lnbmFsOkFib3J0U2lnbmFsLnRpbWVvdXQoMTIwMDApfSk7CiAgICBjb25zdCBkYXRhPWF3YWl0IHIuanNvbigpLmNhdGNoKCgpPT4oe30pKTtpZighci5vayl7aWYoci5zdGF0dXM9PT00MDEpdGhpcy5leHBpcmVzPTA7dGhyb3cgbmV3IEVycm9yKHR5cGVvZiBkYXRhLmRldGFpbD09PSdzdHJpbmcnP2RhdGEuZGV0YWlsOmDorr7lpIflj5HnjrDmmoLmnKrlrozmiJDvvIgke3Iuc3RhdHVzfe+8ieOAgmApO31yZXR1cm4gZGF0YTsKICB9CiAgYXN5bmMgYXV0aGVudGljYXRlKCl7CiAgICBjb25zdCBjPWF3YWl0IHRoaXMuaHR0cCgnL2NoYWxsZW5nZScse3B1YmxpY19rZXk6dGhpcy5pZGVudGl0eS5wdWJsaWNfa2V5fSxmYWxzZSk7CiAgICBpZihjLmlkIT09dGhpcy5pZGVudGl0eS5pZCl0aHJvdyBuZXcgRXJyb3IoJ+iuvuWkh+iBlOezu+WPt+S4jeWMuemFjeOAgicpOwogICAgY29uc3Qgc2lnbmF0dXJlPWF3YWl0IHNpZ24odGhpcy5pZGVudGl0eSwnemh1Z2UtaW0tZ3Vlc3Qtc2Vzc2lvbi12MVxuJytjLmNoYWxsZW5nZSsnXG4nK2xvY2F0aW9uLm9yaWdpbik7CiAgICBjb25zdCBzZXNzaW9uPWF3YWl0IHRoaXMuaHR0cCgnL3Nlc3Npb24nLHtwdWJsaWNfa2V5OnRoaXMuaWRlbnRpdHkucHVibGljX2tleSxjaGFsbGVuZ2U6Yy5jaGFsbGVuZ2Usc2lnbmF0dXJlfSxmYWxzZSk7CiAgICB0aGlzLnRva2VuPXNlc3Npb24uYWNjZXNzX3Rva2VuO3RoaXMuZXhwaXJlcz1EYXRlLm5vdygpKyhzZXNzaW9uLmV4cGlyZXNfaW4tMzApKjEwMDA7CiAgfQogIGFzeW5jIHByZXNlbmNlKCl7YXdhaXQgdGhpcy5odHRwKCcvZGlyZWN0b3J5Jyx7bmFtZTp0aGlzLmlkZW50aXR5Lm5hbWUsYWxpYXM6dGhpcy5pZGVudGl0eS5hbGlhcyxwYWdlX2lkOnRoaXMucGFnZUlkLGRpc2NvdmVyYWJsZTp0aGlzLmRpc2NvdmVyYWJsZX0pO3RoaXMubGFzdFByZXNlbmNlPURhdGUubm93KCk7fQogIGFzeW5jIGRpc2NvdmVyeSh2YWx1ZSl7CiAgICB0aGlzLmRpc2NvdmVyYWJsZT0hIXZhbHVlO2lmKHZhbHVlKXRoaXMuYXV0b1BhdXNlQXJtZWQ9ZmFsc2U7dGhpcy5vbkNoYW5nZSgpOwogICAgdHJ5e2F3YWl0IHRoaXMucHJlc2VuY2UoKTt9ZmluYWxseXt0aGlzLm9uQ2hhbmdlKCk7fQogIH0KICBhc3luYyBzZWFyY2gocXVlcnkpe3RoaXMuYXV0b1BhdXNlQXJtZWQ9ZmFsc2U7aWYoIXRoaXMuZGlzY292ZXJhYmxlKWF3YWl0IHRoaXMuZGlzY292ZXJ5KHRydWUpO3JldHVybiB0aGlzLmh0dHAoJy9zZWFyY2gnLHtxdWVyeX0pO30KICBjb250YWN0cygpe2NvbnN0IG1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHIgb2YgdGhpcy5yb29tcylmb3IoY29uc3QgbSBvZiByLm1lbWJlcnMpaWYobS5pZCE9PXRoaXMuaWRlbnRpdHkuaWQpbWFwLnNldChtLmlkLG0pO3JldHVybiBbLi4ubWFwLnZhbHVlcygpXTt9CiAgYXN5bmMgcHJvcG9zZShtZW1iZXJzLHRpdGxlKXsKICAgIHRoaXMuYXV0b1BhdXNlQXJtZWQ9ZmFsc2U7YXdhaXQgdGhpcy5kaXNjb3ZlcnkodHJ1ZSk7CiAgICBjb25zdCBvd249e2lkOnRoaXMuaWRlbnRpdHkuaWQsbmFtZTp0aGlzLmlkZW50aXR5Lm5hbWUscHVibGljX2tleTp0aGlzLmlkZW50aXR5LnB1YmxpY19rZXl9OwogICAgY29uc3QgdW5pcXVlPVtvd24sLi4ubWVtYmVycy5maWx0ZXIobT0+bS5pZCE9PW93bi5pZCkubWFwKG09Pih7aWQ6bS5pZCxuYW1lOm0ubmFtZSxwdWJsaWNfa2V5Om0ucHVibGljX2tleX0pKV07CiAgICBjb25zdCBwYXlsb2FkPUpTT04uc3RyaW5naWZ5KHt2ZXJzaW9uOjEsbm9uY2U6Y3J5cHRvLnJhbmRvbVVVSUQoKSxvd25lcjpvd24uaWQsdGl0bGU6dGl0bGV8fHVuaXF1ZS5tYXAobT0+bS5uYW1lKS5qb2luKCfjgIEnKS5zbGljZSgwLDQwKSxtZW1iZXJzOnVuaXF1ZX0pOwogICAgY29uc3Qgc2lnbmF0dXJlPWF3YWl0IHNpZ24odGhpcy5pZGVudGl0eSwnemh1Z2UtaW0tcm9vbS12MVxuJytwYXlsb2FkKTsKICAgIGF3YWl0IHZhbGlkYXRlUm9vbSh7cGF5bG9hZCxzaWduYXR1cmVzOntbb3duLmlkXTpzaWduYXR1cmV9fSxvd24uaWQsZmFsc2UpOwogICAgcmV0dXJuIHRoaXMuaHR0cCgnL3Jvb21zL3Byb3Bvc2UnLHtwYXlsb2FkLHNpZ25hdHVyZX0pOwogIH0KICBhc3luYyByZXNwb25kKGlkLGFjY2VwdCl7CiAgICBjb25zdCBpbnZpdGU9dGhpcy5pbnZpdGF0aW9ucy5maW5kKGk9PmkuaWQ9PT1pZCk7aWYoIWludml0ZSl0aHJvdyBuZXcgRXJyb3IoJ+mCgOivt+W3sue7k+adn+OAgicpOwogICAgaWYoYWNjZXB0KXtjb25zdCByb29tPWF3YWl0IHZhbGlkYXRlUm9vbShpbnZpdGUsdGhpcy5pZGVudGl0eS5pZCxmYWxzZSk7aWYocm9vbS5tZW1iZXJzLnNvbWUobT0+dGhpcy5pZGVudGl0eS5ibG9ja2VkLmluY2x1ZGVzKG0uaWQpKSl0aHJvdyBuZXcgRXJyb3IoJ+mCgOivt+S4reWMheWQq+W3suWxj+iUveeahOiuvuWkh+OAgicpO30KICAgIGF3YWl0IHRoaXMuaHR0cCgnL3Jvb21zL3Jlc3BvbmQnLHtyb29tX2lkOmlkLGFjY2VwdCxzaWduYXR1cmU6YWNjZXB0P2F3YWl0IHNpZ24odGhpcy5pZGVudGl0eSwnemh1Z2UtaW0tcm9vbS12MVxuJytpbnZpdGUucGF5bG9hZCk6Jyd9KTsKICB9CiAgYXN5bmMgYmxvY2soaWQpewogICAgaWYoaWQ9PT10aGlzLmlkZW50aXR5LmlkKXRocm93IG5ldyBFcnJvcign5LiN6IO95bGP6JS96Ieq5bex44CCJyk7CiAgICBpZighdGhpcy5pZGVudGl0eS5ibG9ja2VkLmluY2x1ZGVzKGlkKSl0aGlzLmlkZW50aXR5LmJsb2NrZWQucHVzaChpZCk7CiAgICB0aGlzLmlkZW50aXR5LnJvb21zPXRoaXMuaWRlbnRpdHkucm9vbXMuZmlsdGVyKGU9PiFKU09OLnBhcnNlKGUucGF5bG9hZCkubWVtYmVycy5zb21lKG09Pm0uaWQ9PT1pZCkpOwogICAgYXdhaXQgc2F2ZURldmljZSh0aGlzLmlkZW50aXR5KTthd2FpdCB0aGlzLmxvYWRSb29tcygpO3RoaXMub25DaGFuZ2UoKTsKICB9CiAgYXN5bmMgcmVxdWVzdChwYXRoLGJvZHk9e30sbWV0aG9kPSdQT1NUJyl7CiAgICBpZihwYXRoPT09Jy9pZGVudGl0eScpcmV0dXJuIHtpZDp0aGlzLmlkZW50aXR5LmlkLGVudGVycHJpc2VfaWQ6MH07CiAgICBpZihwYXRoPT09Jy9wb2xsJyl7CiAgICAgIHRoaXMucGFnZUlkPWJvZHkucGFnZV9pZDsKICAgICAgbGV0IHNpZ25hbHM9W107CiAgICAgIGlmKHRoaXMuZGlzY292ZXJhYmxlKXsKICAgICAgICBpZihEYXRlLm5vdygpLXRoaXMubGFzdFByZXNlbmNlPjI1MDAwKWF3YWl0IHRoaXMucHJlc2VuY2UoKTsKICAgICAgICBjb25zdCBwZWVycz1bLi4ubmV3IFNldCh0aGlzLnJvb21zLmZsYXRNYXAocj0+ci5tZW1iZXJzLm1hcChtPT5tLmlkKSkpXS5maWx0ZXIoaWQ9PmlkIT09dGhpcy5pZGVudGl0eS5pZCk7CiAgICAgICAgY29uc3QgcmVzdWx0PWF3YWl0IHRoaXMuaHR0cCgnL3BvbGwnLHtwYWdlX2lkOnRoaXMucGFnZUlkLHBlZXJzfSk7dGhpcy5saW5rcz1yZXN1bHQucGVlcnM7CiAgICAgICAgY29uc3QgaW52aXRhdGlvbnM9W107bGV0IGNoYW5nZWQ9ZmFsc2U7CiAgICAgICAgZm9yKGNvbnN0IHJvdyBvZiByZXN1bHQuaW52aXRlcyl7CiAgICAgICAgICB0cnl7CiAgICAgICAgICAgIGNvbnN0IHI9YXdhaXQgdmFsaWRhdGVSb29tKHJvdyx0aGlzLmlkZW50aXR5LmlkLGZhbHNlKTtpZihyLmRpZ2VzdCE9PXJvdy5pZHx8ci5tZW1iZXJzLnNvbWUobT0+dGhpcy5pZGVudGl0eS5ibG9ja2VkLmluY2x1ZGVzKG0uaWQpKSljb250aW51ZTsKICAgICAgICAgICAgY29uc3QgY29tcGxldGU9IXJvdy5kZWNsaW5lZCYmci5tZW1iZXJzLmV2ZXJ5KG09PiEhcm93LnNpZ25hdHVyZXNbU3RyaW5nKG0uaWQpXSk7CiAgICAgICAgICAgIGlmKGNvbXBsZXRlJiYhdGhpcy5yb29tcy5zb21lKHJvb209PnJvb20uZGlnZXN0PT09ci5kaWdlc3QpKXsKICAgICAgICAgICAgICBjb25zdCBhcHByb3ZlZD1hd2FpdCB2YWxpZGF0ZVJvb20ocm93LHRoaXMuaWRlbnRpdHkuaWQpOwogICAgICAgICAgICAgIGlmKGFwcHJvdmVkLm1lbWJlcnMuc29tZShtPT50aGlzLmlkZW50aXR5LmJsb2NrZWQuaW5jbHVkZXMobS5pZCkpKWNvbnRpbnVlOwogICAgICAgICAgICAgIGlmKHRoaXMucm9vbXMuc29tZShyb29tPT5yb29tLmlkPT09YXBwcm92ZWQuaWQpKXRocm93IG5ldyBFcnJvcign5Lya6K+d57yW5Y+35Yay56qB77yM6K+36YeN5paw6YKA6K+344CCJyk7CiAgICAgICAgICAgICAgdGhpcy5yb29tcy5wdXNoKGFwcHJvdmVkKTt0aGlzLmF1dG9QYXVzZUFybWVkPXRydWU7dGhpcy5pZGVudGl0eS5yb29tcy5wdXNoKHtwYXlsb2FkOnJvdy5wYXlsb2FkLHNpZ25hdHVyZXM6cm93LnNpZ25hdHVyZXN9KTtjaGFuZ2VkPXRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIXRoaXMucm9vbXMuc29tZShyb29tPT5yb29tLmRpZ2VzdD09PXIuZGlnZXN0KSlpbnZpdGF0aW9ucy5wdXNoKHsuLi5yb3cscm9vbTpyLGNvbXBsZXRlfSk7CiAgICAgICAgICB9Y2F0Y2goZSl7dGhpcy5vbk5vdGljZShlLm1lc3NhZ2UpO30KICAgICAgICB9CiAgICAgICAgdGhpcy5pbnZpdGF0aW9ucz1pbnZpdGF0aW9ucztpZihjaGFuZ2VkKWF3YWl0IHNhdmVEZXZpY2UodGhpcy5pZGVudGl0eSk7CiAgICAgICAgY29uc3QgaWdub3JlZD1bXTsKICAgICAgICBmb3IoY29uc3Qgcm93IG9mIHJlc3VsdC5zaWduYWxzLnJldmVyc2UoKSl7CiAgICAgICAgICB0cnl7CiAgICAgICAgICAgIGNvbnN0IGQ9SlNPTi5wYXJzZShyb3cucGF5bG9hZCkscm9vbT10aGlzLnJvb21zLmZpbmQocj0+ci5kaWdlc3Q9PT1kLnJvb20pLG1lbWJlcj1yb29tPy5tZW1iZXJzLmZpbmQobT0+bS5pZD09PWQuZnJvbSk7CiAgICAgICAgICAgIGlmKCFtZW1iZXJ8fGQudG8hPT10aGlzLmlkZW50aXR5LmlkfHxkLnBlZXJfcGFnZV9pZCE9PXRoaXMucGFnZUlkfHxkLmV4cGlyZXM8RGF0ZS5ub3coKS8xMDAwfHxkLmV4cGlyZXM+RGF0ZS5ub3coKS8xMDAwKzE4NXx8IWF3YWl0IHZlcmlmeShtZW1iZXIucHVibGljX2tleSwnemh1Z2UtaW0tc2lnbmFsLXYxXG4nK3Jvdy5wYXlsb2FkLHJvdy5zaWduYXR1cmUpKXRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICBjb25zdCBsaW5rPXRoaXMubGlua3MuZmluZChsPT5sLnBlZXJfdXNlcl9pZD09PWQuZnJvbSk7aWYoIWxpbmt8fGxpbmsucGVlcl9wYWdlX2lkIT09ZC5wYWdlX2lkKXRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICBzaWduYWxzLnB1c2goe2lkOnJvdy5pZCxwZWVyX3VzZXJfaWQ6ZC5mcm9tLGNoYW5uZWxfaWQ6ZC5jaGFubmVsX2lkLHNpZ25hbF90eXBlOmQuc2lnbmFsX3R5cGUsc2lnbmFsOmQuc2lnbmFsfSk7CiAgICAgICAgICB9Y2F0Y2h7aWdub3JlZC5wdXNoKHJvdy5pZCk7fQogICAgICAgIH0KICAgICAgICBpZihpZ25vcmVkLmxlbmd0aClhd2FpdCB0aGlzLmh0dHAoJy9zaWduYWxzL2Fjaycse3BhZ2VfaWQ6dGhpcy5wYWdlSWQsaWRzOmlnbm9yZWR9KTsKICAgICAgfQogICAgICBjb25zdCB3YW50ZWQ9bmV3IFNldCh0aGlzLnJvb21zLmZsYXRNYXAocj0+ci5tZW1iZXJzLm1hcChtPT5tLmlkKSkpOwogICAgICBjb25zdCBwZWVycz10aGlzLmxpbmtzLmZpbHRlcihsPT53YW50ZWQuaGFzKGwucGVlcl91c2VyX2lkKSkubWFwKGw9PnRoaXMuZGlzY292ZXJhYmxlP2w6ey4uLmwsb25saW5lOmZhbHNlfSk7CiAgICAgIHJldHVybiB7dXNlcjp7aWQ6dGhpcy5pZGVudGl0eS5pZCxlbnRlcnByaXNlX2lkOjAsZGlzcGxheV9uYW1lOnRoaXMuaWRlbnRpdHkubmFtZX0sY29udmVyc2F0aW9uczp0aGlzLmNvbnZlcnNhdGlvbnMoKSxwZWVycyxzaWduYWxzLGljZV9zZXJ2ZXJzOlt7dXJsczonc3R1bjp6aHVnZWp1bnNoaS5jb206MzQ3OCd9XSx0cmFuc3BvcnQ6J2RpcmVjdF9vbmx5J307CiAgICB9CiAgICBpZihwYXRoPT09Jy9zaWduYWxzJyl7CiAgICAgIGlmKCF0aGlzLmRpc2NvdmVyYWJsZSlyZXR1cm4ge2lnbm9yZWQ6dHJ1ZX07CiAgICAgIGNvbnN0IHJvb209dGhpcy5yb29tcy5maW5kKHI9PnIubWVtYmVycy5zb21lKG09Pm0uaWQ9PT1ib2R5LnBlZXJfdXNlcl9pZCkpO2lmKCFyb29tKXRocm93IG5ldyBFcnJvcign6K+l6K6+5aSH5bCa5pyq56Gu6K6k6L+e5o6l44CCJyk7CiAgICAgIGNvbnN0IHBheWxvYWQ9SlNPTi5zdHJpbmdpZnkoe3Jvb206cm9vbS5kaWdlc3QsZnJvbTp0aGlzLmlkZW50aXR5LmlkLHRvOmJvZHkucGVlcl91c2VyX2lkLHBhZ2VfaWQ6Ym9keS5wYWdlX2lkLHBlZXJfcGFnZV9pZDpib2R5LnBlZXJfcGFnZV9pZCxjaGFubmVsX2lkOmJvZHkuY2hhbm5lbF9pZCxzaWduYWxfdHlwZTpib2R5LnNpZ25hbF90eXBlLHNpZ25hbDpib2R5LnNpZ25hbCxleHBpcmVzOk1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKSsxMjAsbm9uY2U6Y3J5cHRvLnJhbmRvbVVVSUQoKX0pOwogICAgICByZXR1cm4gdGhpcy5odHRwKCcvc2lnbmFscycse2VudmVsb3BlOntwYXlsb2FkOnJvb20uZW52ZWxvcGUucGF5bG9hZCxzaWduYXR1cmVzOnJvb20uZW52ZWxvcGUuc2lnbmF0dXJlc30scGF5bG9hZCxzaWduYXR1cmU6YXdhaXQgc2lnbih0aGlzLmlkZW50aXR5LCd6aHVnZS1pbS1zaWduYWwtdjFcbicrcGF5bG9hZCl9KTsKICAgIH0KICAgIGlmKHBhdGg9PT0nL3NpZ25hbHMvYWNrJylyZXR1cm4gdGhpcy5odHRwKCcvc2lnbmFscy9hY2snLGJvZHkpOwogICAgdGhyb3cgbmV3IEVycm9yKCfmraTlhaXlj6PkuI3lsZ7kuo7orr7lpIfnm7Tov57lip/og73jgIInKTsKICB9CiAgYXN5bmMgYmFja3VwKGNoYXQscGFzc3dvcmQpe2NvbnN0IHtwcml2YXRlS2V5LC4uLmlkZW50aXR5fT10aGlzLmlkZW50aXR5O3JldHVybiBzZWFsKHtpZGVudGl0eTp7Li4uaWRlbnRpdHkscHJpdmF0ZUp3azphd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgnandrJyxwcml2YXRlS2V5KX0sY2hhdDphd2FpdCBjaGF0LnRleHQoKX0scGFzc3dvcmQpO30KICBjbG9zZSgpe3RoaXMuY2xvc2VkPXRydWU7dGhpcy50b2tlbj0nJzt0aGlzLmV4cGlyZXM9MDt9Cn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN0b3JlR3Vlc3RJZGVudGl0eShmaWxlLHBhc3N3b3JkKXsKICBjb25zdCBkYXRhPWF3YWl0IHVuc2VhbChmaWxlLHBhc3N3b3JkKSx2YWx1ZT1kYXRhLmlkZW50aXR5OwogIGlmKCF2YWx1ZXx8dmFsdWUuaWQhPT1hd2FpdCBudW1iZXJGb3IodmFsdWUucHVibGljX2tleSl8fCFBcnJheS5pc0FycmF5KHZhbHVlLnJvb21zKXx8IUFycmF5LmlzQXJyYXkodmFsdWUuYmxvY2tlZCl8fHR5cGVvZiBkYXRhLmNoYXQhPT0nc3RyaW5nJyl0aHJvdyBuZXcgRXJyb3IoJ+iuvuWkh+Wkh+S7veS4jeWujOaVtOOAgicpOwogIGNvbnN0IHByaXZhdGVLZXk9YXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ2p3aycsdmFsdWUucHJpdmF0ZUp3ayx7bmFtZTonRUNEU0EnLG5hbWVkQ3VydmU6J1AtMjU2J30sdHJ1ZSxbJ3NpZ24nXSk7CiAgY29uc3QgcHJvYmU9YXdhaXQgc2lnbih7cHJpdmF0ZUtleX0sJ2RldmljZS1yZXN0b3JlJyk7aWYoIWF3YWl0IHZlcmlmeSh2YWx1ZS5wdWJsaWNfa2V5LCdkZXZpY2UtcmVzdG9yZScscHJvYmUpKXRocm93IG5ldyBFcnJvcign6K6+5aSH5a+G6ZKl5LiN5Yy56YWN44CCJyk7CiAgZm9yKGNvbnN0IHJvb20gb2YgdmFsdWUucm9vbXMpYXdhaXQgdmFsaWRhdGVSb29tKHJvb20sdmFsdWUuaWQpOwogIGNvbnN0IGN1cnJlbnQ9YXdhaXQgcmVhZERldmljZSgpO2lmKGN1cnJlbnQmJmN1cnJlbnQuaWQhPT12YWx1ZS5pZCl0aHJvdyBuZXcgRXJyb3IoJ+W9k+WJjea1j+iniOWZqOW3suacieWPpuS4gOWPsOiuvuWkh+i6q+S7veOAguivt+S9v+eUqOeLrOeri+a1j+iniOWZqOmFjee9ruaBouWkje+8jOWOn+i6q+S7veWSjOiusOW9leS8muS/neeVmeOAgicpOwogIGNvbnN0IHtwcml2YXRlSndrLC4uLnJlc3R9PXZhbHVlO3JldHVybiB7aWRlbnRpdHk6ey4uLnJlc3QscHJpdmF0ZUtleX0sY2hhdDpuZXcgRmlsZShbZGF0YS5jaGF0XSwn6IGK5aSp5aSH5Lu9Lmpzb24nLHt0eXBlOidhcHBsaWNhdGlvbi9qc29uJ30pfTsKfQo=",
      "guest-identity.js": "Ly8gU2VsZi1vd25lZCBkZXZpY2Uga2V5cy4gT25seSB0aGUgc2lnbmVkIGNvcmUgcmVjZWl2ZXMgdGhlIHByaXZhdGUga2V5Lgpjb25zdCBieXRlcz1uZXcgVGV4dEVuY29kZXIoKTsKZXhwb3J0IGNvbnN0IGJhc2U2ND1kYXRhPT57bGV0IHRleHQ9Jyc7Zm9yKGNvbnN0IGIgb2YgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpdGV4dCs9U3RyaW5nLmZyb21DaGFyQ29kZShiKTtyZXR1cm4gYnRvYSh0ZXh0KTt9OwpleHBvcnQgY29uc3QgdW5iYXNlNjQ9dmFsdWU9PlVpbnQ4QXJyYXkuZnJvbShhdG9iKHZhbHVlKSxjPT5jLmNoYXJDb2RlQXQoMCkpOwpleHBvcnQgY29uc3QgaGFzaD1hc3luYyB2YWx1ZT0+QXJyYXkuZnJvbShuZXcgVWludDhBcnJheShhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsdHlwZW9mIHZhbHVlPT09J3N0cmluZyc/Ynl0ZXMuZW5jb2RlKHZhbHVlKTp2YWx1ZSkpLGI9PmIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsJzAnKSkuam9pbignJyk7CmV4cG9ydCBjb25zdCBudW1iZXJGb3I9YXN5bmMgcHVibGljS2V5PT4yKio1MitwYXJzZUludCgoYXdhaXQgaGFzaCh1bmJhc2U2NChwdWJsaWNLZXkpKSkuc2xpY2UoMCwxMyksMTYpOwpleHBvcnQgY29uc3Qgc2lnbj1hc3luYyhpZGVudGl0eSx0ZXh0KT0+YmFzZTY0KGF3YWl0IGNyeXB0by5zdWJ0bGUuc2lnbih7bmFtZTonRUNEU0EnLGhhc2g6J1NIQS0yNTYnfSxpZGVudGl0eS5wcml2YXRlS2V5LGJ5dGVzLmVuY29kZSh0ZXh0KSkpOwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5KHB1YmxpY0tleSx0ZXh0LHNpZ25hdHVyZSl7CiAgdHJ5e2NvbnN0IGtleT1hd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgnc3BraScsdW5iYXNlNjQocHVibGljS2V5KSx7bmFtZTonRUNEU0EnLG5hbWVkQ3VydmU6J1AtMjU2J30sZmFsc2UsWyd2ZXJpZnknXSk7cmV0dXJuIGF3YWl0IGNyeXB0by5zdWJ0bGUudmVyaWZ5KHtuYW1lOidFQ0RTQScsaGFzaDonU0hBLTI1Nid9LGtleSx1bmJhc2U2NChzaWduYXR1cmUpLGJ5dGVzLmVuY29kZSh0ZXh0KSk7fWNhdGNoe3JldHVybiBmYWxzZTt9Cn0KY29uc3QgcmVxdWVzdD1yPT5uZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57ci5vbnN1Y2Nlc3M9KCk9PnJlc29sdmUoci5yZXN1bHQpO3Iub25lcnJvcj0oKT0+cmVqZWN0KHIuZXJyb3IpO30pOwpjb25zdCBjb21taXQ9dHg9Pm5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pnt0eC5vbmNvbXBsZXRlPXJlc29sdmU7dHgub25hYm9ydD10eC5vbmVycm9yPSgpPT5yZWplY3QodHguZXJyb3J8fG5ldyBFcnJvcign6K6+5aSH6Lqr5Lu95pyq6IO95L+d5a2Y44CCJykpO30pOwphc3luYyBmdW5jdGlvbiBkYXRhYmFzZSgpe2NvbnN0IHI9aW5kZXhlZERCLm9wZW4oJ3podWdlLWRpcmVjdC1pbS1kZXZpY2UtdjEnLDEpO3Iub251cGdyYWRlbmVlZGVkPSgpPT5yLnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSgnZGV2aWNlJyk7cmV0dXJuIHJlcXVlc3Qocik7fQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZERldmljZSgpe2NvbnN0IGRiPWF3YWl0IGRhdGFiYXNlKCk7dHJ5e3JldHVybiBhd2FpdCByZXF1ZXN0KGRiLnRyYW5zYWN0aW9uKCdkZXZpY2UnKS5vYmplY3RTdG9yZSgnZGV2aWNlJykuZ2V0KCdpZGVudGl0eScpKTt9ZmluYWxseXtkYi5jbG9zZSgpO319CmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRGV2aWNlKGlkZW50aXR5KXtjb25zdCBkYj1hd2FpdCBkYXRhYmFzZSgpO3RyeXtjb25zdCB0eD1kYi50cmFuc2FjdGlvbignZGV2aWNlJywncmVhZHdyaXRlJykscmVhZHk9Y29tbWl0KHR4KTt0eC5vYmplY3RTdG9yZSgnZGV2aWNlJykucHV0KGlkZW50aXR5LCdpZGVudGl0eScpO2F3YWl0IHJlYWR5O31maW5hbGx5e2RiLmNsb3NlKCk7fX0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5EZXZpY2UobmFtZSxhbGlhcz0nJyl7CiAgbGV0IGlkZW50aXR5PWF3YWl0IHJlYWREZXZpY2UoKTsKICBpZighaWRlbnRpdHkpewogICAgY29uc3Qga2V5cz1hd2FpdCBjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KHtuYW1lOidFQ0RTQScsbmFtZWRDdXJ2ZTonUC0yNTYnfSx0cnVlLFsnc2lnbicsJ3ZlcmlmeSddKTsKICAgIGNvbnN0IHB1YmxpY19rZXk9YmFzZTY0KGF3YWl0IGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdzcGtpJyxrZXlzLnB1YmxpY0tleSkpOwogICAgY29uc3QgY2FuZGlkYXRlPXtpZDphd2FpdCBudW1iZXJGb3IocHVibGljX2tleSkscHVibGljX2tleSxwcml2YXRlS2V5OmtleXMucHJpdmF0ZUtleSxuYW1lOicnLGFsaWFzOicnLHJvb21zOltdLGJsb2NrZWQ6W119OwogICAgY29uc3QgZGI9YXdhaXQgZGF0YWJhc2UoKTt0cnl7Y29uc3QgdHg9ZGIudHJhbnNhY3Rpb24oJ2RldmljZScsJ3JlYWR3cml0ZScpLHJlYWR5PWNvbW1pdCh0eCksc3RvcmU9dHgub2JqZWN0U3RvcmUoJ2RldmljZScpO2lkZW50aXR5PWF3YWl0IHJlcXVlc3Qoc3RvcmUuZ2V0KCdpZGVudGl0eScpKXx8Y2FuZGlkYXRlO3N0b3JlLnB1dChpZGVudGl0eSwnaWRlbnRpdHknKTthd2FpdCByZWFkeTt9ZmluYWxseXtkYi5jbG9zZSgpO30KICB9CiAgaWRlbnRpdHkubmFtZT1TdHJpbmcobmFtZXx8aWRlbnRpdHkubmFtZSkubm9ybWFsaXplKCdORktDJykudHJpbSgpO2lkZW50aXR5LmFsaWFzPVN0cmluZyhhbGlhcykubm9ybWFsaXplKCdORktDJykudHJpbSgpOwogIGlmKCFpZGVudGl0eS5uYW1lfHxpZGVudGl0eS5uYW1lLmxlbmd0aD40MHx8aWRlbnRpdHkuYWxpYXMubGVuZ3RoPjQwKXRocm93IG5ldyBFcnJvcign6K+35aGr5YaZIDEg6IezIDQwIOS4quWtl+eahOWQjeensO+8jOS7o+WPt+S5n+S4jeiDvei2hei/hyA0MCDkuKrlrZfjgIInKTsKICBhd2FpdCBzYXZlRGV2aWNlKGlkZW50aXR5KTtyZXR1cm4gaWRlbnRpdHk7Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYWwoZGF0YSxwYXNzd29yZCl7CiAgaWYocGFzc3dvcmQubGVuZ3RoPDEwKXRocm93IG5ldyBFcnJvcign5aSH5Lu95a+G56CB6Iez5bCR6ZyA6KaBIDEwIOS4quWtl+espuOAgicpOwogIGNvbnN0IHNhbHQ9Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpLGl2PWNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTsKICBjb25zdCBrZXk9YXdhaXQgYmFja3VwS2V5KHBhc3N3b3JkLHNhbHQsWydlbmNyeXB0J10pOwogIHJldHVybiBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoe2Zvcm1hdDonemh1Z2UtZGV2aWNlLWJhY2t1cC12MScsc2FsdDpiYXNlNjQoc2FsdCksaXY6YmFzZTY0KGl2KSxkYXRhOmJhc2U2NChhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6J0FFUy1HQ00nLGl2fSxrZXksYnl0ZXMuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSkpfSldLHt0eXBlOidhcHBsaWNhdGlvbi9qc29uJ30pOwp9CmFzeW5jIGZ1bmN0aW9uIGJhY2t1cEtleShwYXNzd29yZCxzYWx0LHVzYWdlKXtjb25zdCBiYXNlPWF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLGJ5dGVzLmVuY29kZShwYXNzd29yZCksJ1BCS0RGMicsZmFsc2UsWydkZXJpdmVLZXknXSk7cmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KHtuYW1lOidQQktERjInLHNhbHQsaXRlcmF0aW9uczoyNTAwMDAsaGFzaDonU0hBLTI1Nid9LGJhc2Use25hbWU6J0FFUy1HQ00nLGxlbmd0aDoyNTZ9LGZhbHNlLHVzYWdlKTt9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bnNlYWwoZmlsZSxwYXNzd29yZCl7CiAgaWYoZmlsZS5zaXplPjM1MCoxMDI0KjEwMjQpdGhyb3cgbmV3IEVycm9yKCflpIfku73mlofku7bov4flpKfjgIInKTsKICB0cnl7Y29uc3QgZT1KU09OLnBhcnNlKGF3YWl0IGZpbGUudGV4dCgpKTtpZihlLmZvcm1hdCE9PSd6aHVnZS1kZXZpY2UtYmFja3VwLXYxJyl0aHJvdyBuZXcgRXJyb3IoKTtjb25zdCBrZXk9YXdhaXQgYmFja3VwS2V5KHBhc3N3b3JkLHVuYmFzZTY0KGUuc2FsdCksWydkZWNyeXB0J10pO3JldHVybiBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoe25hbWU6J0FFUy1HQ00nLGl2OnVuYmFzZTY0KGUuaXYpfSxrZXksdW5iYXNlNjQoZS5kYXRhKSkpKTt9Y2F0Y2h7dGhyb3cgbmV3IEVycm9yKCflpIfku73mlofku7bmiJblr4bnoIHkuI3mraPnoa7vvIzljp/orrDlvZXmnKrmlLnlj5jjgIInKTt9Cn0K",
      "integrity.js": "Ly8gUHJvdGVjdGVkOiBzb3VyY2UgdmVyaWZpY2F0aW9uIGlzIGEgbG9jYWwgYWNjaWRlbnQgZ3VhcmQsIG5vdCByZW1vdGUgYXR0ZXN0YXRpb24uCmNvbnN0IGhleCA9IGJ5dGVzID0+IEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYnl0ZXMpLCBiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpOwpjb25zdCBieXRlcyA9IHZhbHVlID0+IFVpbnQ4QXJyYXkuZnJvbShhdG9iKHZhbHVlKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpOwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tDb3JlKCkgewogIGNvbnN0IGdldCA9IGFzeW5jIG5hbWUgPT4gewogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgVVJMKG5hbWUsIGltcG9ydC5tZXRhLnVybCksIHtjYWNoZTonbm8tc3RvcmUnfSk7CiAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ+aXoOazleivu+WPlumAmuS/oeaguOW/g++8jOivt+aJk+W8gOajgOafpeS4juaBouWkjemhtemdouOAgicpOwogICAgcmV0dXJuIHJlc3BvbnNlOwogIH07CiAgY29uc3QgW3JlbGVhc2UsIGp3a10gPSBhd2FpdCBQcm9taXNlLmFsbChbKGF3YWl0IGdldCgncmVsZWFzZS5qc29uJykpLmpzb24oKSwgKGF3YWl0IGdldCgncmVsZWFzZS1rZXkuanNvbicpKS5qc29uKCldKTsKICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgnandrJywgandrLCB7bmFtZTonUlNBU1NBLVBLQ1MxLXYxXzUnLGhhc2g6J1NIQS0yNTYnfSwgZmFsc2UsIFsndmVyaWZ5J10pOwogIGlmICghYXdhaXQgY3J5cHRvLnN1YnRsZS52ZXJpZnkoJ1JTQVNTQS1QS0NTMS12MV81Jywga2V5LCBieXRlcyhyZWxlYXNlLnNpZ25hdHVyZSksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShyZWxlYXNlLnBheWxvYWQpKSkpIHRocm93IG5ldyBFcnJvcign6YCa5L+h5qC45b+D54mI5pys562+5ZCN5LiN5Yy56YWN77yM6K+35oGi5aSN5Y+v5L+h54mI5pys44CCJyk7CiAgY29uc3QgcCA9IHJlbGVhc2UucGF5bG9hZDsKICBpZiAocC5wcm90b2NvbCAhPT0gJ3podWdlLWltLXYxJyB8fCBwLmFwaV9tYWpvciAhPT0gMSB8fCBwLnN0b3JhZ2VfdmVyc2lvbiAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCfpgJrkv6HmoLjlv4PniYjmnKzkuI3lhbzlrrnvvIzor7fmn6XnnIvljYfnuqfor7TmmI7jgIInKTsKICBmb3IgKGNvbnN0IFtuYW1lLCBleHBlY3RlZF0gb2YgT2JqZWN0LmVudHJpZXMocC5maWxlcykpIHsKICAgIGlmICghL14oPzpzcmNcL1thLXotXStcLig/OmpzfHRzKXxbYS16LV0rXC4oPzpqc3xtanN8anNvbnxodG1sKSkkLy50ZXN0KG5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoJ+mAmuS/oeaguOW/g+a4heWNleaXoOaViOOAgicpOwogICAgaWYgKGhleChhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGF3YWl0IChhd2FpdCBnZXQobmFtZSkpLmFycmF5QnVmZmVyKCkpKSAhPT0gZXhwZWN0ZWQpIHRocm93IG5ldyBFcnJvcihg6YCa5L+h5qC45b+D5Y+R55Sf5Y+Y5pu077yaJHtuYW1lfeOAguivt+aJk+W8gOajgOafpeS4juaBouWkjemhtemdouOAgmApOwogIH0KICByZXR1cm4ge3ZlcnNpb246cC52ZXJzaW9uLHByb3RvY29sOnAucHJvdG9jb2wsYXBpX21ham9yOnAuYXBpX21ham9yfTsKfQo=",
      "recovery.html": "PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iemgtQ04iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSI+PHRpdGxlPuajgOafpeS4juaBouWkjTwvdGl0bGU+PHN0eWxlPmJvZHl7bWF4LXdpZHRoOjg1MHB4O21hcmdpbjozMHB4IGF1dG87cGFkZGluZzowIDE4cHg7Y29sb3I6IzIwMjEyNDtmb250OjE0cHgvMS43ICJNaWNyb3NvZnQgWWFIZWkiLEFyaWFsLHNhbnMtc2VyaWZ9aDF7Zm9udC1zaXplOjIycHh9YnV0dG9uLGEsaW5wdXR7Zm9udDppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojMjU2M2VifWJ1dHRvbntwYWRkaW5nOjEwcHggMTRweDttYXJnaW46NnB4O2JhY2tncm91bmQ6d2hpdGU7Ym9yZGVyOjFweCBzb2xpZCAjZTRlNmViO2N1cnNvcjpwb2ludGVyfWJ1dHRvbjpkaXNhYmxlZHtvcGFjaXR5Oi41fXByZXt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtvdmVyZmxvdy13cmFwOmFueXdoZXJlfWE6Zm9jdXMtdmlzaWJsZSxidXR0b246Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjJweCBzb2xpZCAjMjU2M2VifTwvc3R5bGU+PC9oZWFkPjxib2R5PjxhIGhyZWY9Ii8iPui/lOWbnuiBiuWkqTwvYT48aDE+5qOA5p+l5LiO5oGi5aSNPC9oMT48cD7mgaLlpI3liY3kv53lrZjkuIDku73njrDmnInmoLjlv4Pmlofku7bjgILmgqjnmoTnlYzpnaLjgIHmianlsZXlkozmtY/op4jlmajogYrlpKnorrDlvZXkvJrkv53nlZnjgILmk43kvZzlrozmiJDlkI7or7fph43mlrDlkK/liqjnqIvluo/jgII8L3A+PHAgaWQ9InN0YXR1cyIgcm9sZT0ic3RhdHVzIj7mraPlnKjmo4Dmn6XigKY8L3A+PHByZSBpZD0iZGV0YWlscyI+PC9wcmU+PGJ1dHRvbiBpZD0icmVzdG9yZSI+5oGi5aSN5pys54mI5pys5qC45b+DPC9idXR0b24+PGxhYmVsPumAieaLqeWumOaWueWNh+e6p+aWh+S7tiA8aW5wdXQgaWQ9InVwZGF0ZSIgdHlwZT0iZmlsZSIgYWNjZXB0PSIuanNvbiI+PC9sYWJlbD48cD7or7fku47pgJrkv6Hog73lipvnmoTniYjmnKzpobXpnaLkuIvovb3ljYfnuqfmlofku7bjgILljYfnuqfkvJrmo4Dmn6Xnrb7lkI3jgIHljY/orq7lj4rmnKzlnLDorrDlvZXmoLzlvI/jgII8L3A+PGEgaHJlZj0iaHR0cHM6Ly96aHVnZWp1bnNoaS5jb20vY2FwYWJpbGl0eS1tYXJrZXQvZGlyZWN0LWltL3ZlcnNpb25zIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+5p+l55yL5a6Y5pa554mI5pysPC9hPjxzY3JpcHQgdHlwZT0ibW9kdWxlIiBzcmM9Ii4vcmVjb3ZlcnkuanMiPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+Cg==",
      "recovery.js": "bGV0IGtleT0nJztjb25zdCBzdGF0dXM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXR1cycpOwphc3luYyBmdW5jdGlvbiBpbnNwZWN0KCl7dHJ5e2NvbnN0IHI9YXdhaXQgZmV0Y2goJy9fX2NvcmUvc3RhdHVzJyk7Y29uc3QgZD1hd2FpdCByLmpzb24oKTtrZXk9ZC5sb2NhbF9rZXk7c3RhdHVzLnRleHRDb250ZW50PWQub2s/J+aguOW/g+WujOaVtO+8jOWPr+i/lOWbnuiBiuWkqeOAgic6J+aguOW/g+mcgOimgeajgOafpe+8jOivt+afpeeci+S4i+aWueivpuaDheOAgic7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGFpbHMnKS50ZXh0Q29udGVudD1kLmNoZWNrLmVycm9yfHxg5b2T5YmN54mI5pys77yaJHtkLmNoZWNrLnZlcnNpb259XG4ke2Qub2s/J+aguOW/g+aWh+S7tuS4juWPkeW4g+eJiOacrOS4gOiHtOOAgic6J+WPkeeUn+WPmOWMlueahOaWh+S7tu+8mlxuJytkLmNoZWNrLmNoYW5nZWQuam9pbignXG4nKX1gO31jYXRjaHtzdGF0dXMudGV4dENvbnRlbnQ9J+ajgOafpeaaguaXtuayoeacieWujOaIkOOAguacrOmhteaBouWkjeWKn+iDvemcgOS9v+eUqOWMheWGheacrOacuuWQr+WKqOeoi+W6j+OAgic7fX0KYXN5bmMgZnVuY3Rpb24gYWN0aW9uKG5hbWUsYm9keSl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RvcmUnKS5kaXNhYmxlZD10cnVlO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUnKS5kaXNhYmxlZD10cnVlO3RyeXtjb25zdCByPWF3YWl0IGZldGNoKCcvX19jb3JlLycrbmFtZSx7bWV0aG9kOidQT1NUJyxoZWFkZXJzOnsnQ29udGVudC1UeXBlJzonYXBwbGljYXRpb24vanNvbicsJ1gtWmh1Z2UtTG9jYWwtS2V5JzprZXl9LGJvZHk6SlNPTi5zdHJpbmdpZnkoYm9keSl9KTtjb25zdCBkPWF3YWl0IHIuanNvbigpO2lmKCFyLm9rKXRocm93IG5ldyBFcnJvcihkLmVycm9yKTtzdGF0dXMudGV4dENvbnRlbnQ9J+W3suWujOaIkO+8jOivt+mHjeaWsOWQr+WKqOeoi+W6j+OAgic7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGFpbHMnKS50ZXh0Q29udGVudD1g5oGi5aSN54mI5pys77yaJHtkLnZlcnNpb259XG7ljp/mlofku7blpIfku73kvY3nva7vvJoke2QuYmFja3VwfVxu5oKo55qE55WM6Z2i44CB5omp5bGV5ZKM5rWP6KeI5Zmo6K6w5b2V5bey5L+d55WZ44CCYDt9Y2F0Y2goZSl7c3RhdHVzLnRleHRDb250ZW50PWUubWVzc2FnZTt9ZmluYWxseXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdG9yZScpLmRpc2FibGVkPWZhbHNlO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUnKS5kaXNhYmxlZD1mYWxzZTt9fQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdG9yZScpLm9uY2xpY2s9KCk9PnZvaWQgYWN0aW9uKCdyZXN0b3JlJyx7fSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUnKS5vbmNoYW5nZT1hc3luYyBlPT57Y29uc3QgZj1lLnRhcmdldC5maWxlc1swXTtpZihmKXt0cnl7aWYoZi5zaXplPjQwMDAwMDApdGhyb3cgbmV3IEVycm9yKCfljYfnuqfmlofku7bov4flpKfjgIInKTthd2FpdCBhY3Rpb24oJ3VwZGF0ZScsSlNPTi5wYXJzZShhd2FpdCBmLnRleHQoKSkpO31jYXRjaChlcnJvcil7c3RhdHVzLnRleHRDb250ZW50PWVycm9yLm1lc3NhZ2U7fX19Owp2b2lkIGluc3BlY3QoKTsK",
      "release-key.json": "ewogICJrdHkiOiAiUlNBIiwKICAibiI6ICJ4cUQ1RXItOXoxVm5TeV8zNW9ZMjIwVlZVSWFMVGR5bFZYTDZaSl9lOTJ4cDBTakJCTEhLdUlmVkxOaFZnQk92NTM5VXVrekdMa3hMZktiZmFXdm0wSVh6ZkluWW5oeVd2LXFrTjNQbjQ5ZXk0Ml9oaUhpRG5MR1h1WERfRmpiNnNNNmZSV3ZQbmVaNUhnZ1gtZ2RhNEhMcmJGakpzOVBLaE5hZjVjNk1RM3RTeTQ4bEZSZFJHOXk0a3U0a2VHVDhQM1VLMURDcUFxdWhiSWQtQlZqWmF2MndraDV4WnRFOXhKaElxaGV6cExZa0otb2JXRDdqNFhkdk5QMTVfblJ1anhsY3RNNk5rM3ZHdkhlS3Vla0JLRjA5ZXZMVktrOWVULXNMaUotUlI1NFRKZDFpdllIaFNWbGN6bldFTUtSRThzVWw5TFlveEhETWdwMm1JWVc3OGx6OFVodmpFbW1ibUN3dFZGLU5yYmpOYjJ4RDlCWHhQcVlMY3ptOVhMWElGRzFHNGUxNVFwUzVndy1WWnA5dDhyQ2Nnbi1mV0k4ZXRqSEhaaFQ4UzM0S3FDREc5c2NZUlYtdXhER21ja2hrbG1pa0MwLVdBYzE3djU0OGJHZm5GbHVYN0pDRkhfZG52R2JrOHNoT3lMZ2EwdWdXNUdJRXBpYWpFdk9HbndsTCIsCiAgImUiOiAiQVFBQiIKfQ==",
      "sdk.js": "aW1wb3J0IHtEaXJlY3RDaGF0Q2xpZW50fSBmcm9tICcuL3NyYy9jbGllbnQuanMnOwppbXBvcnQge3BsYXRmb3JtT3JpZ2lufSBmcm9tICcuL2NvbmZpZy5qcyc7CmltcG9ydCB7Y2hlY2tDb3JlfSBmcm9tICcuL2ludGVncml0eS5qcyc7CmltcG9ydCB7R3Vlc3RDb250cm9sLHJlc3RvcmVHdWVzdElkZW50aXR5fSBmcm9tICcuL2d1ZXN0LWNvbnRyb2wuanMnOwppbXBvcnQge3JlYWREZXZpY2Usc2F2ZURldmljZX0gZnJvbSAnLi9ndWVzdC1pZGVudGl0eS5qcyc7CmltcG9ydCB7TG9jYWxDaGF0U3RvcmV9IGZyb20gJy4vc3JjL3N0b3JhZ2UuanMnOwoKLy8gRG8gbm90IGV4cG9zZSB0aGUgcmF3IGNsaWVudCwgY3JlZGVudGlhbHMsIHN0b3JhZ2UgaGFuZGxlIG9yIHRyYW5zcG9ydCB0byBleHRlbnNpb25zLgpleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2hhdEFwcCh7b25DaGFuZ2U9KCk9Pnt9LG9uTm90aWNlPSgpPT57fX09e30pIHsKICBsZXQgY2xpZW50LCBndWVzdCwgdG9rZW49JycsIHBlbmRpbmcsIHBvcHVwLCBzdGF0ZT0nJywgY2hlY2tUaW1lciwgY2hlY2tpbmc9ZmFsc2UsIGdlbmVyYXRpb249MDsKICBjb25zdCByZXF1aXJlQ2xpZW50PSgpPT57aWYoIWNsaWVudD8uc25hcHNob3QpdGhyb3cgbmV3IEVycm9yKCfor7flhYjov57mjqXotKblj7fjgIInKTtyZXR1cm4gY2xpZW50O307CiAgY29uc3QgZGlzY29ubmVjdD0oKT0+e2dlbmVyYXRpb24rKztjbGVhckludGVydmFsKGNoZWNrVGltZXIpO2NsaWVudD8uc3RvcCgpO2d1ZXN0Py5jbG9zZSgpO2NsaWVudD11bmRlZmluZWQ7Z3Vlc3Q9dW5kZWZpbmVkO3Rva2VuPScnO3N0YXRlPScnO2lmKHBlbmRpbmcpe2NsZWFyVGltZW91dChwZW5kaW5nLnRpbWVyKTtwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IoJ+i/nuaOpeW3suWPlua2iOOAgicpKTtwZW5kaW5nPXVuZGVmaW5lZDt9b25DaGFuZ2UoKTt9OwogIGNvbnN0IHdhdGNoPWFzeW5jKCk9PntpZihjaGVja2luZylyZXR1cm47Y2hlY2tpbmc9dHJ1ZTt0cnl7YXdhaXQgY2hlY2tDb3JlKCk7fWNhdGNoKGUpe2Rpc2Nvbm5lY3QoKTtvbk5vdGljZShlLm1lc3NhZ2UpO31maW5hbGx5e2NoZWNraW5nPWZhbHNlO319OwogIGNvbnN0IGxpc3RlbmVyPWFzeW5jIGV2ZW50PT57CiAgICBpZighcGVuZGluZ3x8IXN0YXRlfHxldmVudC5vcmlnaW4hPT1uZXcgVVJMKHBsYXRmb3JtT3JpZ2luKS5vcmlnaW58fGV2ZW50LnNvdXJjZSE9PXBvcHVwfHxldmVudC5kYXRhPy50eXBlIT09J3podWdlLWRpcmVjdC1pbS1zZXNzaW9uJ3x8ZXZlbnQuZGF0YT8uc3RhdGUhPT1zdGF0ZSlyZXR1cm47CiAgICBjb25zdCBhY3RpdmU9cGVuZGluZztwZW5kaW5nPXVuZGVmaW5lZDtjbGVhclRpbWVvdXQoYWN0aXZlLnRpbWVyKTtzdGF0ZT0nJztjb25zdCBlcG9jaD1nZW5lcmF0aW9uOwogICAgdHJ5ewogICAgICBhd2FpdCBjaGVja0NvcmUoKTtpZihlcG9jaCE9PWdlbmVyYXRpb24pdGhyb3cgbmV3IEVycm9yKCfov57mjqXlt7Llj5bmtojjgIInKTsKICAgICAgdG9rZW49U3RyaW5nKGV2ZW50LmRhdGEuYWNjZXNzX3Rva2VufHwnJyk7aWYoIXRva2VuLnN0YXJ0c1dpdGgoJ2ltZGNfJykpdGhyb3cgbmV3IEVycm9yKCfor7fkvb/nlKjpgJrkv6HkuJPnlKjov57mjqXmjojmnYPjgIInKTsKICAgICAgY2xpZW50PW5ldyBEaXJlY3RDaGF0Q2xpZW50KHtiYXNlVXJsOmAke3BsYXRmb3JtT3JpZ2lufS9hcGkvaW0tZGlyZWN0YCx0b2tlbjooKT0+dG9rZW4sb25DaGFuZ2Usb25Ob3RpY2V9KTsKICAgICAgYXdhaXQgY2xpZW50LnN0YXJ0KCk7aWYoZXBvY2ghPT1nZW5lcmF0aW9uKXRocm93IG5ldyBFcnJvcign6L+e5o6l5bey5Y+W5raI44CCJyk7CiAgICAgIGNoZWNrVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnZvaWQgd2F0Y2goKSwxMDAwMCk7YWN0aXZlLnJlc29sdmUoKTsKICAgIH1jYXRjaChlKXtkaXNjb25uZWN0KCk7YWN0aXZlLnJlamVjdChlKTt9CiAgfTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsbGlzdGVuZXIpOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsZGlzY29ubmVjdCk7CiAgcmV0dXJuIE9iamVjdC5mcmVlemUoewogICAgYXBpVmVyc2lvbjoxLAogICAgYXN5bmMgc2F2ZWREZXZpY2UoKXtjb25zdCBkZXZpY2U9YXdhaXQgcmVhZERldmljZSgpO3JldHVybiBkZXZpY2U/e2lkOmRldmljZS5pZCxuYW1lOmRldmljZS5uYW1lLGFsaWFzOmRldmljZS5hbGlhc306bnVsbDt9LAogICAgZ2V0IGRldmljZSgpe3JldHVybiBndWVzdD9zdHJ1Y3R1cmVkQ2xvbmUoZ3Vlc3QucHJvZmlsZSgpKTp1bmRlZmluZWQ7fSwKICAgIGdldCBpbnZpdGF0aW9ucygpe3JldHVybiBndWVzdD9zdHJ1Y3R1cmVkQ2xvbmUoZ3Vlc3QuaW52aXRhdGlvbnMpOltdO30sCiAgICBnZXQgZGV2aWNlQ29udGFjdHMoKXtyZXR1cm4gZ3Vlc3Q/c3RydWN0dXJlZENsb25lKGd1ZXN0LmNvbnRhY3RzKCkpOltdO30sCiAgICBhc3luYyBjb25uZWN0RGV2aWNlKG5hbWUsYWxpYXM9JycpewogICAgICBkaXNjb25uZWN0KCk7Y29uc3QgZXBvY2g9Z2VuZXJhdGlvbjthd2FpdCBjaGVja0NvcmUoKTsKICAgICAgY29uc3QgY29udHJvbD1hd2FpdCBHdWVzdENvbnRyb2wuY3JlYXRlKG5hbWUsYWxpYXMsb25DaGFuZ2Usb25Ob3RpY2UpOwogICAgICBpZihlcG9jaCE9PWdlbmVyYXRpb24pe2NvbnRyb2wuY2xvc2UoKTt0aHJvdyBuZXcgRXJyb3IoJ+i/nuaOpeW3suWPlua2iOOAgicpO30KICAgICAgZ3Vlc3Q9Y29udHJvbDtjbGllbnQ9bmV3IERpcmVjdENoYXRDbGllbnQoe2Jhc2VVcmw6JycsdG9rZW46KCk9PicnLGRldmljZUNvbnRyb2w6Y29udHJvbCxvbkNoYW5nZSxvbk5vdGljZX0pOwogICAgICB0cnl7YXdhaXQgY2xpZW50LnN0YXJ0KCk7aWYoZXBvY2ghPT1nZW5lcmF0aW9uKXRocm93IG5ldyBFcnJvcign6L+e5o6l5bey5Y+W5raI44CCJyk7Y2hlY2tUaW1lcj1zZXRJbnRlcnZhbCgoKT0+dm9pZCB3YXRjaCgpLDEwMDAwKTt9Y2F0Y2goZSl7ZGlzY29ubmVjdCgpO3Rocm93IGU7fQogICAgfSwKICAgIGFzeW5jIHNlYXJjaERldmljZXMocXVlcnkpe2F3YWl0IGNoZWNrQ29yZSgpO2lmKCFndWVzdCl0aHJvdyBuZXcgRXJyb3IoJ+ivt+WFiOaJk+W8gOiHquW3seeahOiuvuWkh+OAgicpO3JldHVybiBndWVzdC5zZWFyY2gocXVlcnkpO30sCiAgICBhc3luYyBpbnZpdGVEZXZpY2VzKG1lbWJlcnMsdGl0bGUpe2F3YWl0IGNoZWNrQ29yZSgpO2lmKCFndWVzdCl0aHJvdyBuZXcgRXJyb3IoJ+ivt+WFiOaJk+W8gOiHquW3seeahOiuvuWkh+OAgicpO2NvbnN0IHI9YXdhaXQgZ3Vlc3QucHJvcG9zZShtZW1iZXJzLHRpdGxlKTthd2FpdCBjbGllbnQucG9sbCgpO3JldHVybiByO30sCiAgICBhc3luYyBhbnN3ZXJJbnZpdGF0aW9uKGlkLGFjY2VwdCl7YXdhaXQgY2hlY2tDb3JlKCk7aWYoIWd1ZXN0KXRocm93IG5ldyBFcnJvcign6K+35YWI5omT5byA6Ieq5bex55qE6K6+5aSH44CCJyk7YXdhaXQgZ3Vlc3QucmVzcG9uZChpZCxhY2NlcHQpO2F3YWl0IGNsaWVudC5wb2xsKCk7fSwKICAgIGFzeW5jIGRpc2NvdmVyRGV2aWNlcyh2YWx1ZSl7aWYoIWd1ZXN0KXRocm93IG5ldyBFcnJvcign6K+35YWI5omT5byA6Ieq5bex55qE6K6+5aSH44CCJyk7YXdhaXQgZ3Vlc3QuZGlzY292ZXJ5KHZhbHVlKTthd2FpdCBjbGllbnQucG9sbCgpO30sCiAgICBhc3luYyBibG9ja0RldmljZShpZCl7aWYoIWd1ZXN0KXRocm93IG5ldyBFcnJvcign6K+35YWI5omT5byA6Ieq5bex55qE6K6+5aSH44CCJyk7YXdhaXQgZ3Vlc3QuYmxvY2soaWQpO2F3YWl0IGNsaWVudC5wb2xsKCk7fSwKICAgIGFzeW5jIHJlc3RvcmVEZXZpY2UoZmlsZSxwYXNzd29yZCl7CiAgICAgIGF3YWl0IGNoZWNrQ29yZSgpO2lmKGNsaWVudCl0aHJvdyBuZXcgRXJyb3IoJ+ivt+WFiOaWreW8gOW9k+WJjei/nuaOpeWGjeaBouWkjeOAgicpOwogICAgICBjb25zdCBkYXRhPWF3YWl0IHJlc3RvcmVHdWVzdElkZW50aXR5KGZpbGUscGFzc3dvcmQpLHN0b3JlPW5ldyBMb2NhbENoYXRTdG9yZShkYXRhLmlkZW50aXR5LmlkKTsKICAgICAgdHJ5e2F3YWl0IHN0b3JlLm9wZW4oKTthd2FpdCBzdG9yZS5yZXN0b3JlKGRhdGEuY2hhdCxwYXNzd29yZCk7YXdhaXQgc2F2ZURldmljZShkYXRhLmlkZW50aXR5KTt9ZmluYWxseXtzdG9yZS5jbG9zZSgpO30KICAgICAgcmV0dXJuIHtpZDpkYXRhLmlkZW50aXR5LmlkLG5hbWU6ZGF0YS5pZGVudGl0eS5uYW1lLGFsaWFzOmRhdGEuaWRlbnRpdHkuYWxpYXN9OwogICAgfSwKICAgIGdldCBjb25uZWN0aW9uUmV2aXNpb24oKXtyZXR1cm4gZ2VuZXJhdGlvbjt9LAogICAgZ2V0IHNuYXBzaG90KCl7cmV0dXJuIGNsaWVudD8uc25hcHNob3Q/c3RydWN0dXJlZENsb25lKHt1c2VyOmNsaWVudC5zbmFwc2hvdC51c2VyLGNvbnZlcnNhdGlvbnM6Y2xpZW50LnNuYXBzaG90LmNvbnZlcnNhdGlvbnN9KTp1bmRlZmluZWQ7fSwKICAgIGNoZWNrOmNoZWNrQ29yZSwKICAgIGNvbm5lY3QoKXsKICAgICAgZGlzY29ubmVjdCgpO3N0YXRlPWNyeXB0by5yYW5kb21VVUlEKCk7Y29uc3QgdXJsPW5ldyBVUkwoJy9pbS9jb25uZWN0JyxwbGF0Zm9ybU9yaWdpbik7dXJsLnNlYXJjaFBhcmFtcy5zZXQoJ29yaWdpbicsbG9jYXRpb24ub3JpZ2luKTt1cmwuc2VhcmNoUGFyYW1zLnNldCgnc3RhdGUnLHN0YXRlKTsKICAgICAgcG9wdXA9d2luZG93Lm9wZW4odXJsLCd6aHVnZS1kaXJlY3QtaW0tY29ubmVjdCcsJ3dpZHRoPTY0MCxoZWlnaHQ9NzIwJyk7CiAgICAgIGlmKCFwb3B1cCl7c3RhdGU9Jyc7cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcign6K+35YWB6K645omT5byA6LSm5Y+36L+e5o6l56qX5Y+j44CCJykpO30KICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntwZW5kaW5nPXtyZXNvbHZlLHJlamVjdCx0aW1lcjpzZXRUaW1lb3V0KCgpPT57c3RhdGU9Jyc7cGVuZGluZz11bmRlZmluZWQ7cmVqZWN0KG5ldyBFcnJvcign6L+e5o6l562J5b6F6LaF5pe277yM6K+36YeN5paw6L+e5o6l44CCJykpO30sOTAwMDApfTt9KTsKICAgIH0sCiAgICBkaXNjb25uZWN0LAogICAgZGlzcG9zZSgpe2Rpc2Nvbm5lY3QoKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsbGlzdGVuZXIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsZGlzY29ubmVjdCk7fSwKICAgIHN0YXR1czppZD0+Y2xpZW50Py5zdGF0dXMoaWQpfHwn5bCa5pyq6L+e5o6lJywKICAgIG1lc3NhZ2VzOmlkPT5yZXF1aXJlQ2xpZW50KCkubWVzc2FnZXMoaWQpLAogICAgYXN5bmMgc2VuZFRleHQoaWQsdGV4dCl7YXdhaXQgY2hlY2tDb3JlKCk7cmV0dXJuIHJlcXVpcmVDbGllbnQoKS5zZW5kKGlkLHRleHQpO30sCiAgICBhc3luYyBzZW5kRmlsZShpZCxmaWxlKXthd2FpdCBjaGVja0NvcmUoKTtyZXR1cm4gcmVxdWlyZUNsaWVudCgpLnNlbmQoaWQsYOaWh+S7tu+8miR7ZmlsZS5uYW1lfWAsJ2ZpbGUnLHt9LGZpbGUpO30sCiAgICBtYXJrUmVhZDppZD0+cmVxdWlyZUNsaWVudCgpLnN0b3JlLm1hcmtSZWFkKGlkKSwKICAgIGZyaWVuZHM6KCk9PnJlcXVpcmVDbGllbnQoKS5hcGkoJy9tZXRhZGF0YScse3BhdGg6Jy9pbS9mcmllbmRzJyxtZXRob2Q6J0dFVCd9KSwKICAgIGFzeW5jIG9wZW5Db252ZXJzYXRpb24ocGVlcil7Y29uc3QgYz1yZXF1aXJlQ2xpZW50KCk7Y29uc3QgcmVzdWx0PWF3YWl0IGMuYXBpKCcvbWV0YWRhdGEnLHtwYXRoOicvaW0vY29udmVyc2F0aW9ucy9kaXJlY3QnLG1ldGhvZDonUE9TVCcsYm9keTp7Y3VycmVudF91c2VyX2lkOmMuc25hcHNob3QudXNlci5pZCxwZWVyX3VzZXJfaWQ6cGVlcn19KTthd2FpdCBjLnBvbGwoKTtyZXR1cm4gcmVzdWx0O30sCiAgICBhc3luYyBiYWNrdXAocGFzc3dvcmQpe2NvbnN0IGNoYXQ9YXdhaXQgcmVxdWlyZUNsaWVudCgpLnN0b3JlLmJhY2t1cChwYXNzd29yZCk7cmV0dXJuIGd1ZXN0P2d1ZXN0LmJhY2t1cChjaGF0LHBhc3N3b3JkKTpjaGF0O30sCiAgICByZXN0b3JlOihmaWxlLHBhc3N3b3JkKT0+cmVxdWlyZUNsaWVudCgpLnN0b3JlLnJlc3RvcmUoZmlsZSxwYXNzd29yZCksCiAgfSk7Cn0K",
      "server.mjs": "aW1wb3J0IHtjcmVhdGVTZXJ2ZXJ9IGZyb20gJ25vZGU6aHR0cCc7CmltcG9ydCB7cmVhZEZpbGUsbHN0YXR9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnOwppbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJzsKaW1wb3J0IHtyYW5kb21CeXRlc30gZnJvbSAnbm9kZTpjcnlwdG8nOwppbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnOwppbXBvcnQge2NoZWNrLHJlc3RvcmUsdXBkYXRlfSBmcm9tICcuL2d1YXJkLm1qcyc7CmNvbnN0IHJvb3Q9ZmlsZVVSTFRvUGF0aChuZXcgVVJMKCcuJyxpbXBvcnQubWV0YS51cmwpKTsKY29uc3QgbG9jYWxLZXk9cmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKCdoZXgnKTtsZXQgbXV0YXRpbmc9ZmFsc2U7CmNvbnN0IHR5cGVzPXsnLmh0bWwnOid0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLCcuanMnOid0ZXh0L2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgnLCcubWpzJzondGV4dC9qYXZhc2NyaXB0OyBjaGFyc2V0PXV0Zi04JywnLmNzcyc6J3RleHQvY3NzOyBjaGFyc2V0PXV0Zi04JywnLmpzb24nOidhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J307CmFzeW5jIGZ1bmN0aW9uIGhlYWx0aCgpe3RyeXtyZXR1cm4gYXdhaXQgY2hlY2soKTt9Y2F0Y2goZXJyb3Ipe3JldHVybiB7b2s6ZmFsc2UsZXJyb3I6ZXJyb3IubWVzc2FnZX07fX0KY29uc3Qgc2VydmVyPWNyZWF0ZVNlcnZlcihhc3luYyhyZXEscmVzKT0+ewogIGNvbnN0IHBvcnQ9c2VydmVyLmFkZHJlc3MoKS5wb3J0LGhvc3RzPW5ldyBTZXQoW2AxMjcuMC4wLjE6JHtwb3J0fWAsYGxvY2FsaG9zdDoke3BvcnR9YF0pOwogIGNvbnN0IGpzb249KGNvZGUsZGF0YSk9PnJlcy53cml0ZUhlYWQoY29kZSx7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLCdDYWNoZS1Db250cm9sJzonbm8tc3RvcmUnLCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJzonbm9zbmlmZid9KS5lbmQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpOwogIHRyeXsKICAgIGlmKCFob3N0cy5oYXMocmVxLmhlYWRlcnMuaG9zdCkpcmV0dXJuIGpzb24oNDAzLHtlcnJvcjon5Y+q5YWB6K645pys5py65Zyw5Z2A44CCJ30pOwogICAgY29uc3Qgb3JpZ2luPWBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0fWA7Y29uc3QgcmVxdWVzdFBhdGg9ZGVjb2RlVVJJQ29tcG9uZW50KG5ldyBVUkwocmVxLnVybCxvcmlnaW4pLnBhdGhuYW1lKTsKICAgIGlmKHJlcXVlc3RQYXRoPT09Jy9fX2NvcmUvc3RhdHVzJyYmcmVxLm1ldGhvZD09PSdHRVQnKXtjb25zdCByZXN1bHQ9YXdhaXQgaGVhbHRoKCk7cmV0dXJuIGpzb24oMjAwLHtvazpyZXN1bHQub2ssY2hlY2s6cmVzdWx0LGxvY2FsX2tleTpsb2NhbEtleX0pO30KICAgIGlmKFsnL19fY29yZS9yZXN0b3JlJywnL19fY29yZS91cGRhdGUnXS5pbmNsdWRlcyhyZXF1ZXN0UGF0aCkmJnJlcS5tZXRob2Q9PT0nUE9TVCcpewogICAgICBpZihyZXEuaGVhZGVycy5vcmlnaW4hPT1vcmlnaW58fHJlcS5oZWFkZXJzWyd4LXpodWdlLWxvY2FsLWtleSddIT09bG9jYWxLZXkpcmV0dXJuIGpzb24oNDAzLHtlcnJvcjon6K+35Zyo5pys5py65qOA5p+l6aG16Z2i5pON5L2c44CCJ30pOwogICAgICBpZihtdXRhdGluZylyZXR1cm4ganNvbig0MDkse2Vycm9yOiflj6bkuIDkuKrmgaLlpI3mk43kvZzmraPlnKjov5vooYzjgIInfSk7bXV0YXRpbmc9dHJ1ZTsKICAgICAgdHJ5e2xldCBzaXplPTA7Y29uc3QgcGFydHM9W107Zm9yIGF3YWl0KGNvbnN0IHBhcnQgb2YgcmVxKXtzaXplKz1wYXJ0Lmxlbmd0aDtpZihzaXplPjQwMDAwMDApdGhyb3cgbmV3IEVycm9yKCfmlofku7bov4flpKfjgIInKTtwYXJ0cy5wdXNoKHBhcnQpO31jb25zdCBib2R5PUpTT04ucGFyc2UoQnVmZmVyLmNvbmNhdChwYXJ0cykudG9TdHJpbmcoKXx8J3t9Jyk7cmV0dXJuIGpzb24oMjAwLHJlcXVlc3RQYXRoLmVuZHNXaXRoKCcvdXBkYXRlJyk/YXdhaXQgdXBkYXRlKGJvZHkpOmF3YWl0IHJlc3RvcmUoSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYXRoLmpvaW4ocm9vdCwncmVsZWFzZS5qc29uJyksJ3V0ZjgnKSkpKTt9CiAgICAgIGZpbmFsbHl7bXV0YXRpbmc9ZmFsc2U7fQogICAgfQogICAgaWYocmVxLm1ldGhvZCE9PSdHRVQnJiZyZXEubWV0aG9kIT09J0hFQUQnKXJldHVybiBqc29uKDQwNSx7ZXJyb3I6J+S4jeaUr+aMgeatpOaTjeS9nOOAgid9KTsKICAgIGlmKHJlcXVlc3RQYXRoLmluY2x1ZGVzKCdcXCcpfHxyZXF1ZXN0UGF0aC5zcGxpdCgnLycpLnNvbWUocD0+cC5zdGFydHNXaXRoKCcuJykpfHwvXlwvKHVzZXItYmFja3Vwc3xleHBlcmltZW50c3xub2RlX21vZHVsZXMpKFwvfCQpLy50ZXN0KHJlcXVlc3RQYXRoKSlyZXR1cm4ganNvbig0MDQse2Vycm9yOifmnKrmib7liLDmlofku7bjgIInfSk7CiAgICBpZihyZXF1ZXN0UGF0aD09PScvJ3x8cmVxdWVzdFBhdGg9PT0nL2luZGV4Lmh0bWwnfHxyZXF1ZXN0UGF0aD09PScvZ3Vlc3QuaHRtbCcpewogICAgICBpZighKGF3YWl0IGhlYWx0aCgpKS5vayl7cmVzLndyaXRlSGVhZCgzMDIseydMb2NhdGlvbic6Jy9yZWNvdmVyeS5odG1sJywnQ2FjaGUtQ29udHJvbCc6J25vLXN0b3JlJ30pLmVuZCgpO3JldHVybjt9CiAgICB9CiAgICBjb25zdCBuYW1lPXJlcXVlc3RQYXRoPT09Jy8nPydpbmRleC5odG1sJzpyZXF1ZXN0UGF0aC5zbGljZSgxKTtjb25zdCB0YXJnZXQ9cGF0aC5yZXNvbHZlKHJvb3QsbmFtZSk7CiAgICBpZighdGFyZ2V0LnN0YXJ0c1dpdGgocGF0aC5yZXNvbHZlKHJvb3QpK3BhdGguc2VwKSlyZXR1cm4ganNvbig0MDQse2Vycm9yOifmnKrmib7liLDmlofku7bjgIInfSk7CiAgICBsZXQgcGFydGlhbD1yb290O2Zvcihjb25zdCBwYXJ0IG9mIG5hbWUuc3BsaXQoJy8nKSl7cGFydGlhbD1wYXRoLmpvaW4ocGFydGlhbCxwYXJ0KTtpZigoYXdhaXQgbHN0YXQocGFydGlhbCkpLmlzU3ltYm9saWNMaW5rKCkpcmV0dXJuIGpzb24oNDA0LHtlcnJvcjon5pyq5om+5Yiw5paH5Lu244CCJ30pO30KICAgIGNvbnN0IGRhdGE9YXdhaXQgcmVhZEZpbGUodGFyZ2V0KTsKICAgIHJlcy53cml0ZUhlYWQoMjAwLHsnQ29udGVudC1UeXBlJzp0eXBlc1twYXRoLmV4dG5hbWUodGFyZ2V0KV18fCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCdDYWNoZS1Db250cm9sJzonbm8tc3RvcmUnLCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJzonbm9zbmlmZicsJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JzpyZXF1ZXN0UGF0aD09PScvZXh0ZW5zaW9uLXdvcmtlci5qcyc/ImRlZmF1bHQtc3JjICdub25lJzsgc2NyaXB0LXNyYyAnc2VsZic7IGNvbm5lY3Qtc3JjICdub25lJzsgd29ya2VyLXNyYyAnbm9uZSciOiJmcmFtZS1hbmNlc3RvcnMgJ25vbmUnOyBvYmplY3Qtc3JjICdub25lJzsgYmFzZS11cmkgJ25vbmUnIn0pLmVuZChyZXEubWV0aG9kPT09J0hFQUQnP3VuZGVmaW5lZDpkYXRhKTsKICB9Y2F0Y2goZXJyb3Ipe2pzb24oZXJyb3IuY29kZT09PSdFTk9FTlQnPzQwNDo0MDAse2Vycm9yOmVycm9yLmNvZGU9PT0nRU5PRU5UJz8n5pyq5om+5Yiw5paH5Lu244CCJzplcnJvci5tZXNzYWdlfSk7fQp9KTsKc2VydmVyLmxpc3RlbihOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVHx8NDE4NiksJzEyNy4wLjAuMScsYXN5bmMoKT0+Y29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe3VybDpgaHR0cDovLzEyNy4wLjAuMToke3NlcnZlci5hZGRyZXNzKCkucG9ydH0vZ3Vlc3QuaHRtbGAsY29yZTphd2FpdCBoZWFsdGgoKX0pKSk7Cg==",
      "src/client.ts": "aW1wb3J0IHsgTG9jYWxDaGF0U3RvcmUsIENoYXRSZWNvcmQsIHRvQmFzZTY0LCBmcm9tQmFzZTY0IH0gZnJvbSAiLi9zdG9yYWdlIjsNCg0KZXhwb3J0IHR5cGUgQ29udmVyc2F0aW9uID0geyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyBjb252ZXJzYXRpb25fdHlwZT86IHN0cmluZzsgcGFydGljaXBhbnRzOiB7IHVzZXJfaWQ6IG51bWJlcjsgZGlzcGxheV9uYW1lOiBzdHJpbmcgfVtdOyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07DQp0eXBlIExpbmsgPSB7IHBlZXJfdXNlcl9pZDogbnVtYmVyOyBwZWVyX3BhZ2VfaWQ6IHN0cmluZyB8IG51bGw7IG9ubGluZTogYm9vbGVhbiB9Ow0KdHlwZSBTaWduYWwgPSB7IGlkOiBudW1iZXJ8c3RyaW5nOyBwZWVyX3VzZXJfaWQ6IG51bWJlcjsgY2hhbm5lbF9pZDogc3RyaW5nOyBzaWduYWxfdHlwZTogIm9mZmVyInwiYW5zd2VyInwiaWNlIjsgc2lnbmFsOiBSVENTZXNzaW9uRGVzY3JpcHRpb25Jbml0ICYgUlRDSWNlQ2FuZGlkYXRlSW5pdCB9OwpleHBvcnQgdHlwZSBTbmFwc2hvdCA9IHsgdXNlcjoge2lkOiBudW1iZXI7IGVudGVycHJpc2VfaWQ6IG51bWJlcjsgZGlzcGxheV9uYW1lOiBzdHJpbmd9OyBjb252ZXJzYXRpb25zOiBDb252ZXJzYXRpb25bXTsgcGVlcnM6IExpbmtbXTsgc2lnbmFsczogU2lnbmFsW107IGljZV9zZXJ2ZXJzOiBSVENJY2VTZXJ2ZXJbXTsgdHJhbnNwb3J0OiBzdHJpbmcgfTsNCnR5cGUgV2lyZSA9IHsgdHlwZTogIm1lc3NhZ2UiOyB2ZXJzaW9uOiAxOyBpZDogc3RyaW5nOyBjb252ZXJzYXRpb25faWQ6IG51bWJlcjsgc2VuZGVyX3VzZXJfaWQ6IG51bWJlcjsgY29udGVudDogc3RyaW5nOyBtZXNzYWdlX3R5cGU6IHN0cmluZzsgY3JlYXRlZF9hdDogc3RyaW5nOyBtZXRhZGF0YV9qc29uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9Ow0KdHlwZSBQZWVyID0geyBsaW5rOiBMaW5rOyBwYzogUlRDUGVlckNvbm5lY3Rpb247IGNoYW5uZWw/OiBSVENEYXRhQ2hhbm5lbDsgY2hhbm5lbElkOiBzdHJpbmc7IHBlbmRpbmc6IFJUQ0ljZUNhbmRpZGF0ZUluaXRbXTsgcmVhZHk6IGJvb2xlYW47IHF1ZXVlOiBQcm9taXNlPHZvaWQ+OyBwdW1waW5nOiBib29sZWFuOyBzZWVuOiBTZXQ8bnVtYmVyfHN0cmluZz47IHN0YXJ0ZWQ6IG51bWJlcjsgc2lnbmFsUXVldWU6IFByb21pc2U8dm9pZD4gfTsKdHlwZSBUcmFuc2ZlciA9IHsgbWVzc2FnZTogV2lyZTsgcGFydHM6IFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+W107IHJlY2VpdmVkOiBudW1iZXI7IGNodW5rczogbnVtYmVyOyB0b3VjaGVkOiBudW1iZXIgfTsNCmNvbnN0IE1BWF9GSUxFID0gMjUqMTAyNCoxMDI0Ow0KY29uc3QgQ0hVTksgPSAxMioxMDI0Ow0KY29uc3QgVVVJRCA9IC9eW2EtZjAtOS1dezM2fSQvaTsNCmV4cG9ydCB0eXBlIERldmljZUNvbnRyb2wgPSB7CiAgcmVxdWVzdChwYXRoOiBzdHJpbmcsIGJvZHk/OiB1bmtub3duLCBtZXRob2Q/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+OwogIHRydXN0ZWQocGVlcjogbnVtYmVyLCBjb252ZXJzYXRpb246IG51bWJlcik6IGJvb2xlYW47CiAgY29ubmVjdGVkKHBlZXJzOiBudW1iZXJbXSk6IHZvaWQ7CiAgY2xvc2UoKTogdm9pZDsKfTsKZXhwb3J0IHR5cGUgRGlyZWN0T3B0aW9ucyA9IHsgYmFzZVVybDogc3RyaW5nOyB0b2tlbjogKCkgPT4gc3RyaW5nOyBvbkNoYW5nZT86ICgpID0+IHZvaWQ7IG9uTm90aWNlPzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDsgZGV2aWNlQ29udHJvbD86IERldmljZUNvbnRyb2wgfTsKDQpleHBvcnQgY2xhc3MgRGlyZWN0Q2hhdENsaWVudCB7DQogIHJlYWRvbmx5IHBhZ2VJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7DQogIHN0b3JlPzogTG9jYWxDaGF0U3RvcmU7DQogIHNuYXBzaG90PzogU25hcHNob3Q7DQogIHByaXZhdGUgcGVlcnMgPSBuZXcgTWFwPG51bWJlciwgUGVlcj4oKTsNCiAgcHJpdmF0ZSBpbmJvdW5kID0gbmV3IE1hcDxzdHJpbmcsIFRyYW5zZmVyPigpOw0KICBwcml2YXRlIHRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47DQogIHByaXZhdGUgYWxpdmUgPSBmYWxzZTsKICBwcml2YXRlIHBvbGxpbmcgPSBmYWxzZTsKICBwcml2YXRlIGF1dGhlbnRpY2F0ZWRBdCA9IDA7DQogIHByaXZhdGUgbmV4dFNlbmQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpOw0KICBwcml2YXRlIHJlbGVhc2VkPzogKCkgPT4gdm9pZDsNCiAgY29uc3RydWN0b3IocmVhZG9ubHkgb3B0aW9uczogRGlyZWN0T3B0aW9ucykge30NCiAgYXN5bmMgYXBpPFQ+KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24sIG1ldGhvZCA9ICJQT1NUIik6IFByb21pc2U8VD4gewogICAgaWYgKCF0aGlzLmFsaXZlKSB0aHJvdyBuZXcgRXJyb3IoIui/nuaOpeW3sue7k+adn++8jOivt+mHjeaWsOaJk+W8gOiBiuWkqeOAgiIpOwogICAgaWYgKHRoaXMub3B0aW9ucy5kZXZpY2VDb250cm9sKSByZXR1cm4gdGhpcy5vcHRpb25zLmRldmljZUNvbnRyb2wucmVxdWVzdChwYXRoLCBib2R5LCBtZXRob2QpIGFzIFByb21pc2U8VD47CiAgICBjb25zdCB0b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbigpOw0KICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcigi6K+35YWI6L+e5o6l6Ieq5bex55qE6LSm5Y+344CCIik7DQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLm9wdGlvbnMuYmFzZVVybC5yZXBsYWNlKC9cLyQvLCAiIil9JHtwYXRofWAsIHsNCiAgICAgIG1ldGhvZCwgY3JlZGVudGlhbHM6ICJvbWl0IiwgY2FjaGU6ICJuby1zdG9yZSIsIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMjAwMCksDQogICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0sDQogICAgICBib2R5OiBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBKU09OLnN0cmluZ2lmeShib2R5KSwNCiAgICB9KTsNCiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7DQogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHRoaXMuZGlzY29ubmVjdFBlZXJzKCk7DQogICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOwogICAgICBpZiAoZGF0YS5kZXRhaWw/LmNvZGUgPT09ICJkZXZpY2VfcmVwbGFjZWQiKSB7IHRoaXMuc3RvcCgpOyB0aHJvdyBuZXcgRXJyb3IoZGF0YS5kZXRhaWwubWVzc2FnZSk7IH0KICAgICAgdGhyb3cgbmV3IEVycm9yKHR5cGVvZiBkYXRhLmRldGFpbCA9PT0gInN0cmluZyIgPyBkYXRhLmRldGFpbCA6IGDov57mjqXmmoLml7bmnKrlrozmiJDvvIgke3Jlc3BvbnNlLnN0YXR1c33vvInjgIJgKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsNCiAgfQ0KICBhc3luYyBzdGFydCgpIHsNCiAgICBpZiAodGhpcy5hbGl2ZSkgcmV0dXJuOw0KICAgIHRoaXMuYWxpdmUgPSB0cnVlOw0KICAgIHRyeSB7DQogICAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMuYXBpPHtpZDpudW1iZXJ9PigiL2lkZW50aXR5IiwgdW5kZWZpbmVkLCAiR0VUIik7CiAgICAgIGlmICghdGhpcy5hbGl2ZSkgcmV0dXJuOw0KICAgICAgLy8gT25lIHRhYiBwZXIgYWNjb3VudC9vcmlnaW4gb3ducyBhIGRldmljZSBub2RlOyBvdGhlciB0YWJzIG5ldmVyIGZpZ2h0IG92ZXIgc2lnbmFsaW5nLg0KICAgICAgaWYgKG5hdmlnYXRvci5sb2NrcykgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUscmVqZWN0KSA9PiB7DQogICAgICAgIHZvaWQgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QoYHpodWdlLWRpcmVjdC1pbS0ke2lkZW50aXR5LmlkfWAsIHsgaWZBdmFpbGFibGU6IHRydWUgfSwgYXN5bmMgbG9jayA9PiB7CiAgICAgICAgICBpZiAoIWxvY2spIHsgcmVqZWN0KG5ldyBFcnJvcigi5q2k6LSm5Y+35bey5Zyo5Y+m5LiA5Liq56qX5Y+j5omT5byA6IGK5aSp77yM6K+35YWI5YWz6Zet6YKj5Liq56qX5Y+j44CCIikpOyByZXR1cm47IH0NCiAgICAgICAgICByZXNvbHZlKCk7IGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlbGVhc2UgPT4geyB0aGlzLnJlbGVhc2VkID0gcmVsZWFzZTsgfSk7DQogICAgICAgIH0pOw0KICAgICAgfSk7DQogICAgICB0aGlzLnN0b3JlID0gbmV3IExvY2FsQ2hhdFN0b3JlKGlkZW50aXR5LmlkKTsgYXdhaXQgdGhpcy5zdG9yZS5vcGVuKCk7CiAgICAgIGlmICghdGhpcy5hbGl2ZSkgeyB0aGlzLnN0b3JlLmNsb3NlKCk7IHRoaXMucmVsZWFzZWQ/LigpOyByZXR1cm47IH0KICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCB0aGlzLmFwaTxTbmFwc2hvdD4oIi9wb2xsIiwgeyBwYWdlX2lkOiB0aGlzLnBhZ2VJZCwgYWN0aXZhdGU6IHRydWUgfSk7CiAgICAgIHRoaXMuc25hcHNob3QgPSBmaXJzdDsgdGhpcy5hdXRoZW50aWNhdGVkQXQgPSBEYXRlLm5vdygpOyB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOw0KICAgICAgdm9pZCBuYXZpZ2F0b3Iuc3RvcmFnZT8ucGVyc2lzdD8uKCkuY2F0Y2goKCkgPT4gZmFsc2UpOw0KICAgICAgYXdhaXQgdGhpcy5hcHBseVNuYXBzaG90KGZpcnN0KTsNCiAgICAgIHRoaXMuc2NoZWR1bGUoKTsNCiAgICB9IGNhdGNoIChlcnJvcikgeyB0aGlzLnN0b3AoKTsgdGhyb3cgZXJyb3I7IH0NCiAgfQ0KICBwcml2YXRlIHNjaGVkdWxlKCkgeyBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7IGlmICh0aGlzLmFsaXZlKSB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucG9sbCgpLCAyNTAwKTsgfQogIGFzeW5jIHBvbGwoKSB7DQogICAgaWYgKCF0aGlzLmFsaXZlIHx8IHRoaXMucG9sbGluZykgcmV0dXJuOwogICAgdGhpcy5wb2xsaW5nID0gdHJ1ZTsKICAgIHRyeSB7DQogICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5hcGk8U25hcHNob3Q+KCIvcG9sbCIsIHsgcGFnZV9pZDogdGhpcy5wYWdlSWQgfSk7DQogICAgICBpZiAoIXRoaXMuYWxpdmUpIHJldHVybjsNCiAgICAgIGlmICh0aGlzLnN0b3JlPy5hY2NvdW50ICE9PSBkYXRhLnVzZXIuaWQpIHsgdGhpcy5zdG9wKCk7IHRocm93IG5ldyBFcnJvcigi6LSm5Y+35bey5pS55Y+Y77yM6K+36YeN5paw5omT5byA6IGK5aSp44CCIik7IH0NCiAgICAgIHRoaXMuYXV0aGVudGljYXRlZEF0ID0gRGF0ZS5ub3coKTsgdGhpcy5zbmFwc2hvdCA9IGRhdGE7DQogICAgICBhd2FpdCB0aGlzLmFwcGx5U25hcHNob3QoZGF0YSk7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7DQogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBBcnJheS5mcm9tKHRoaXMuaW5ib3VuZCkpIGlmIChEYXRlLm5vdygpLXZhbHVlLnRvdWNoZWQgPiA2MDAwMCkgdGhpcy5pbmJvdW5kLmRlbGV0ZShrZXkpOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7IHRoaXMubm90aWNlKGVycm9yKTsgfSBmaW5hbGx5IHsgdGhpcy5wb2xsaW5nID0gZmFsc2U7IHRoaXMuc2NoZWR1bGUoKTsgfQogIH0NCiAgcHJpdmF0ZSBub3RpY2UoZXJyb3I6IHVua25vd24pIHsgdGhpcy5vcHRpb25zLm9uTm90aWNlPy4oZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAi6L+e5o6l5pqC5pe25LiN5Y+v55So44CCIik7IH0NCiAgcHJpdmF0ZSBhbGxvd2VkKHBlZXI6IG51bWJlciwgY29udmVyc2F0aW9uOiBudW1iZXIpIHsNCiAgICBjb25zdCBjID0gdGhpcy5zbmFwc2hvdD8uY29udmVyc2F0aW9ucy5maW5kKGMgPT4gYy5pZCA9PT0gY29udmVyc2F0aW9uKTsNCiAgICBjb25zdCB2YWxpZCA9IHRoaXMub3B0aW9ucy5kZXZpY2VDb250cm9sID8gdGhpcy5vcHRpb25zLmRldmljZUNvbnRyb2wudHJ1c3RlZChwZWVyLCBjb252ZXJzYXRpb24pIDogRGF0ZS5ub3coKS10aGlzLmF1dGhlbnRpY2F0ZWRBdCA8IDEyMDAwMDsKICAgIHJldHVybiB2YWxpZCAmJiAhIWM/LnBhcnRpY2lwYW50cy5zb21lKHAgPT4gcC51c2VyX2lkID09PSBwZWVyKSAmJiAhIWMucGFydGljaXBhbnRzLnNvbWUocCA9PiBwLnVzZXJfaWQgPT09IHRoaXMuc3RvcmU/LmFjY291bnQpOwogIH0NCiAgcHJpdmF0ZSBhc3luYyBhcHBseVNuYXBzaG90KGRhdGE6IFNuYXBzaG90KSB7DQogICAgaWYgKGRhdGEudHJhbnNwb3J0ICE9PSAiZGlyZWN0X29ubHkiKSB0aHJvdyBuZXcgRXJyb3IoIuW9k+WJjei/nuaOpeaWueW8j+S4jeespuWQiOiuvuWkh+ebtOi/nuimgeaxguOAgiIpOw0KICAgIGNvbnN0IHJlYWNoYWJsZSA9IG5ldyBTZXQoZGF0YS5wZWVycy5tYXAobCA9PiBsLnBlZXJfdXNlcl9pZCkpOw0KICAgIGZvciAoY29uc3QgW3VpZCwgcGVlcl0gb2YgQXJyYXkuZnJvbSh0aGlzLnBlZXJzKSkgaWYgKCFyZWFjaGFibGUuaGFzKHVpZCkpIHRoaXMuY2xvc2VQZWVyKHVpZCwgcGVlcik7DQogICAgZm9yIChjb25zdCBsaW5rIG9mIGRhdGEucGVlcnMpIHsNCiAgICAgIGxldCBwZWVyID0gdGhpcy5wZWVycy5nZXQobGluay5wZWVyX3VzZXJfaWQpOw0KICAgICAgaWYgKHBlZXIgJiYgbGluay5vbmxpbmUgJiYgcGVlci5saW5rLnBlZXJfcGFnZV9pZCAhPT0gbGluay5wZWVyX3BhZ2VfaWQpIHsgdGhpcy5jbG9zZVBlZXIobGluay5wZWVyX3VzZXJfaWQsIHBlZXIpOyBwZWVyID0gdW5kZWZpbmVkOyB9DQogICAgICBpZiAocGVlciAmJiAhcGVlci5yZWFkeSAmJiBEYXRlLm5vdygpLXBlZXIuc3RhcnRlZCA+IDI1MDAwKSB7IHRoaXMuY2xvc2VQZWVyKGxpbmsucGVlcl91c2VyX2lkLCBwZWVyKTsgcGVlciA9IHVuZGVmaW5lZDsgfQ0KICAgICAgLy8gQSBmYWlsZWQgcHJlc2VuY2UgcmVxdWVzdCBtdXN0IG5vdCB0ZWFyIGRvd24gYW4gZXN0YWJsaXNoZWQgZGlyZWN0IGNvbm5lY3Rpb24uDQogICAgICBpZiAoIXBlZXIgJiYgbGluay5vbmxpbmUpIHsNCiAgICAgICAgcGVlciA9IHRoaXMuY3JlYXRlUGVlcihsaW5rKTsNCiAgICAgICAgaWYgKGRhdGEudXNlci5pZCA8IGxpbmsucGVlcl91c2VyX2lkKSB7DQogICAgICAgICAgdGhpcy5jb25maWd1cmVDaGFubmVsKHBlZXIsIHBlZXIucGMuY3JlYXRlRGF0YUNoYW5uZWwoInpodWdlLWltLXYxIiwgeyBvcmRlcmVkOiB0cnVlIH0pKTsNCiAgICAgICAgICBjb25zdCBvZmZlciA9IGF3YWl0IHBlZXIucGMuY3JlYXRlT2ZmZXIoKTsgYXdhaXQgcGVlci5wYy5zZXRMb2NhbERlc2NyaXB0aW9uKG9mZmVyKTsNCiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRTaWduYWwocGVlciwgIm9mZmVyIiwgeyB0eXBlOiAib2ZmZXIiLCBzZHA6IG9mZmVyLnNkcCB9KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBjb25zdCBhY2s6IChudW1iZXJ8c3RyaW5nKVtdID0gW107CiAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBkYXRhLnNpZ25hbHMpIHsNCiAgICAgIGNvbnN0IHBlZXIgPSB0aGlzLnBlZXJzLmdldChzaWduYWwucGVlcl91c2VyX2lkKTsNCiAgICAgIGlmICghcGVlcikgY29udGludWU7DQogICAgICBpZiAoIXBlZXIuc2Vlbi5oYXMoc2lnbmFsLmlkKSkgew0KICAgICAgICB0cnkgeyBhd2FpdCB0aGlzLmFjY2VwdFNpZ25hbChwZWVyLCBzaWduYWwpOyBwZWVyLnNlZW4uYWRkKHNpZ25hbC5pZCk7IH0NCiAgICAgICAgY2F0Y2ggeyBjb250aW51ZTsgfQ0KICAgICAgfQ0KICAgICAgYWNrLnB1c2goc2lnbmFsLmlkKTsNCiAgICB9DQogICAgaWYgKGFjay5sZW5ndGgpIGF3YWl0IHRoaXMuYXBpKCIvc2lnbmFscy9hY2siLCB7cGFnZV9pZDogdGhpcy5wYWdlSWQsIGlkczogYWNrfSk7DQogICAgZm9yIChjb25zdCBwZWVyIG9mIEFycmF5LmZyb20odGhpcy5wZWVycy52YWx1ZXMoKSkpIGlmIChwZWVyLnJlYWR5KSB2b2lkIHRoaXMucHVtcChwZWVyKTsKICAgIHRoaXMub3B0aW9ucy5kZXZpY2VDb250cm9sPy5jb25uZWN0ZWQoQXJyYXkuZnJvbSh0aGlzLnBlZXJzKS5maWx0ZXIoKFsscF0pPT5wLnJlYWR5KS5tYXAoKFt1aWRdKT0+dWlkKSk7CiAgfQ0KICBwcml2YXRlIGNyZWF0ZVBlZXIobGluazogTGluayk6IFBlZXIgew0KICAgIGNvbnN0IGljZSA9ICh0aGlzLnNuYXBzaG90Py5pY2Vfc2VydmVycyB8fCBbXSkubWFwKHMgPT4gKHsgdXJsczogKEFycmF5LmlzQXJyYXkocy51cmxzKSA/IHMudXJscyA6IFtzLnVybHNdKS5maWx0ZXIodSA9PiB1LnN0YXJ0c1dpdGgoInN0dW46IikpIH0pKS5maWx0ZXIocyA9PiBzLnVybHMubGVuZ3RoKTsNCiAgICBjb25zdCBwYyA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbih7IGljZVNlcnZlcnM6IGljZSB9KTsNCiAgICBjb25zdCBwZWVyOiBQZWVyID0geyBsaW5rLCBwYywgY2hhbm5lbElkOiBjcnlwdG8ucmFuZG9tVVVJRCgpLCBwZW5kaW5nOiBbXSwgcmVhZHk6IGZhbHNlLCBxdWV1ZTogUHJvbWlzZS5yZXNvbHZlKCksIHB1bXBpbmc6IGZhbHNlLCBzZWVuOiBuZXcgU2V0KCksIHN0YXJ0ZWQ6IERhdGUubm93KCksIHNpZ25hbFF1ZXVlOiBQcm9taXNlLnJlc29sdmUoKSB9Ow0KICAgIHRoaXMucGVlcnMuc2V0KGxpbmsucGVlcl91c2VyX2lkLCBwZWVyKTsNCiAgICBwYy5vbmljZWNhbmRpZGF0ZSA9IGUgPT4geyBpZiAoZS5jYW5kaWRhdGUpIHsgY29uc3QgYyA9IGUuY2FuZGlkYXRlLnRvSlNPTigpOyB2b2lkIHRoaXMuc2VuZFNpZ25hbChwZWVyLCAiaWNlIiwgeyBjYW5kaWRhdGU6IGMuY2FuZGlkYXRlLCBzZHBNaWQ6IGMuc2RwTWlkLCBzZHBNTGluZUluZGV4OiBjLnNkcE1MaW5lSW5kZXggfSkuY2F0Y2goZXJyb3IgPT4gdGhpcy5ub3RpY2UoZXJyb3IpKTsgfSB9Ow0KICAgIHBjLm9uZGF0YWNoYW5uZWwgPSBlID0+IHRoaXMuY29uZmlndXJlQ2hhbm5lbChwZWVyLCBlLmNoYW5uZWwpOw0KICAgIHBjLm9uY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gKCkgPT4geyBpZiAoWyJmYWlsZWQiLCAiY2xvc2VkIl0uaW5jbHVkZXMocGMuY29ubmVjdGlvblN0YXRlKSkgeyBwZWVyLnJlYWR5ID0gZmFsc2U7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7IH0gfTsNCiAgICByZXR1cm4gcGVlcjsNCiAgfQ0KICBwcml2YXRlIGFzeW5jIHNlbmRTaWduYWwocGVlcjogUGVlciwgdHlwZTogc3RyaW5nLCBzaWduYWw6IHVua25vd24pIHsNCiAgICBpZiAoIXRoaXMuYWxpdmUpIHJldHVybjsNCiAgICBjb25zdCBzZW5kID0gKCkgPT4gdGhpcy5hcGkoIi9zaWduYWxzIiwgeyBwYWdlX2lkOiB0aGlzLnBhZ2VJZCwgcGVlcl91c2VyX2lkOiBwZWVyLmxpbmsucGVlcl91c2VyX2lkLA0KICAgICAgcGVlcl9wYWdlX2lkOiBwZWVyLmxpbmsucGVlcl9wYWdlX2lkLCBjaGFubmVsX2lkOiBwZWVyLmNoYW5uZWxJZCwgc2lnbmFsX3R5cGU6IHR5cGUsIHNpZ25hbCB9KS50aGVuKCgpID0+IHVuZGVmaW5lZCk7DQogICAgcGVlci5zaWduYWxRdWV1ZSA9IHBlZXIuc2lnbmFsUXVldWUudGhlbihzZW5kKTsgcmV0dXJuIHBlZXIuc2lnbmFsUXVldWU7DQogIH0NCiAgcHJpdmF0ZSBhc3luYyBhY2NlcHRTaWduYWwocGVlcjogUGVlciwgc2lnbmFsOiBTaWduYWwpIHsNCiAgICBpZiAoc2lnbmFsLnNpZ25hbF90eXBlID09PSAib2ZmZXIiKSB7DQogICAgICBpZiAodGhpcy5zdG9yZSEuYWNjb3VudCA8IHBlZXIubGluay5wZWVyX3VzZXJfaWQpIHJldHVybjsNCiAgICAgIGlmIChwZWVyLnBjLnNpZ25hbGluZ1N0YXRlICE9PSAic3RhYmxlIiB8fCBwZWVyLnBjLnJlbW90ZURlc2NyaXB0aW9uKSByZXR1cm47DQogICAgICBwZWVyLmNoYW5uZWxJZCA9IHNpZ25hbC5jaGFubmVsX2lkOw0KICAgICAgYXdhaXQgcGVlci5wYy5zZXRSZW1vdGVEZXNjcmlwdGlvbihzaWduYWwuc2lnbmFsKTsNCiAgICAgIGZvciAoY29uc3QgYyBvZiBwZWVyLnBlbmRpbmcuc3BsaWNlKDApKSBhd2FpdCBwZWVyLnBjLmFkZEljZUNhbmRpZGF0ZShjKTsNCiAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IHBlZXIucGMuY3JlYXRlQW5zd2VyKCk7IGF3YWl0IHBlZXIucGMuc2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIpOw0KICAgICAgYXdhaXQgdGhpcy5zZW5kU2lnbmFsKHBlZXIsICJhbnN3ZXIiLCB7dHlwZTogImFuc3dlciIsIHNkcDogYW5zd2VyLnNkcH0pOw0KICAgIH0gZWxzZSBpZiAoc2lnbmFsLnNpZ25hbF90eXBlID09PSAiYW5zd2VyIikgew0KICAgICAgaWYgKHNpZ25hbC5jaGFubmVsX2lkICE9PSBwZWVyLmNoYW5uZWxJZCB8fCBwZWVyLnBjLnNpZ25hbGluZ1N0YXRlICE9PSAiaGF2ZS1sb2NhbC1vZmZlciIpIHJldHVybjsNCiAgICAgIGF3YWl0IHBlZXIucGMuc2V0UmVtb3RlRGVzY3JpcHRpb24oc2lnbmFsLnNpZ25hbCk7DQogICAgICBmb3IgKGNvbnN0IGMgb2YgcGVlci5wZW5kaW5nLnNwbGljZSgwKSkgYXdhaXQgcGVlci5wYy5hZGRJY2VDYW5kaWRhdGUoYyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGlmICh0aGlzLnN0b3JlIS5hY2NvdW50IDwgcGVlci5saW5rLnBlZXJfdXNlcl9pZCAmJiBzaWduYWwuY2hhbm5lbF9pZCAhPT0gcGVlci5jaGFubmVsSWQpIHJldHVybjsNCiAgICAgIGlmIChwZWVyLnBjLnJlbW90ZURlc2NyaXB0aW9uKSBhd2FpdCBwZWVyLnBjLmFkZEljZUNhbmRpZGF0ZShzaWduYWwuc2lnbmFsKTsNCiAgICAgIGVsc2UgcGVlci5wZW5kaW5nLnB1c2goc2lnbmFsLnNpZ25hbCk7DQogICAgfQ0KICB9DQogIHByaXZhdGUgY29uZmlndXJlQ2hhbm5lbChwZWVyOiBQZWVyLCBjaGFubmVsOiBSVENEYXRhQ2hhbm5lbCkgew0KICAgIGlmIChjaGFubmVsLmxhYmVsICE9PSAiemh1Z2UtaW0tdjEiIHx8IHBlZXIuY2hhbm5lbCkgeyBjaGFubmVsLmNsb3NlKCk7IHJldHVybjsgfQ0KICAgIHBlZXIuY2hhbm5lbCA9IGNoYW5uZWw7DQogICAgY2hhbm5lbC5vbm9wZW4gPSBhc3luYyAoKSA9PiB7DQogICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHBlZXIucGMuZ2V0U3RhdHMoKTsgbGV0IHJlbGF5ID0gZmFsc2U7DQogICAgICBzdGF0cy5mb3JFYWNoKHMgPT4geyBpZiAoKHMudHlwZSA9PT0gImxvY2FsLWNhbmRpZGF0ZSIgfHwgcy50eXBlID09PSAicmVtb3RlLWNhbmRpZGF0ZSIpICYmIHMuY2FuZGlkYXRlVHlwZSA9PT0gInJlbGF5IikgcmVsYXkgPSB0cnVlOyB9KTsNCiAgICAgIGlmIChyZWxheSkgeyB0aGlzLmNsb3NlUGVlcihwZWVyLmxpbmsucGVlcl91c2VyX2lkLCBwZWVyKTsgdGhpcy5ub3RpY2UobmV3IEVycm9yKCLlt7LlgZzmraLkuK3nu6fov57mjqXvvIzor7fkvb/nlKjlj6/nm7Tov57nvZHnu5zjgIIiKSk7IHJldHVybjsgfQ0KICAgICAgcGVlci5yZWFkeSA9IHRydWU7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7IHZvaWQgdGhpcy5wdW1wKHBlZXIpOw0KICAgIH07DQogICAgY2hhbm5lbC5vbmNsb3NlID0gY2hhbm5lbC5vbmVycm9yID0gKCkgPT4geyBwZWVyLnJlYWR5ID0gZmFsc2U7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7IH07DQogICAgY2hhbm5lbC5vbm1lc3NhZ2UgPSBldmVudCA9PiB7DQogICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgIT09ICJzdHJpbmciIHx8IGV2ZW50LmRhdGEubGVuZ3RoID4gMjQwMDApIHJldHVybjsNCiAgICAgIC8vIFByZXNlcnZlIHdpcmUgb3JkZXIgYWNyb3NzIGFzeW5jaHJvbm91cyBJbmRleGVkREIvaGFzaCBvcGVyYXRpb25zLg0KICAgICAgcGVlci5xdWV1ZSA9IHBlZXIucXVldWUudGhlbigoKSA9PiB0aGlzLnJlY2VpdmUocGVlciwgSlNPTi5wYXJzZShldmVudC5kYXRhKSkpLmNhdGNoKGVycm9yID0+IHRoaXMubm90aWNlKGVycm9yKSk7DQogICAgfTsNCiAgfQ0KICBwcml2YXRlIGFzeW5jIHdyaXRlKHBlZXI6IFBlZXIsIHZhbHVlOiB1bmtub3duKSB7DQogICAgY29uc3QgY2hhbm5lbCA9IHBlZXIuY2hhbm5lbDsNCiAgICBpZiAoIXRoaXMuYWxpdmUgfHwgIWNoYW5uZWwgfHwgY2hhbm5lbC5yZWFkeVN0YXRlICE9PSAib3BlbiIpIHRocm93IG5ldyBFcnJvcigi5a+55pa55pqC5pe256a757q/77yM5raI5oGv5Lya55WZ5Zyo5pys5py6562J5b6F6YeN6L+e44CCIik7DQogICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7DQogICAgd2hpbGUgKGNoYW5uZWwuYnVmZmVyZWRBbW91bnQgPiAyNTYqMTAyNCkgew0KICAgICAgaWYgKERhdGUubm93KCktc3RhcnRlZCA+IDE1MDAwIHx8IGNoYW5uZWwucmVhZHlTdGF0ZSAhPT0gIm9wZW4iIHx8ICF0aGlzLmFsaXZlKSB0aHJvdyBuZXcgRXJyb3IoIuaWh+S7tuS8oOi+k+S4reaWre+8jOato+WcqOetieW+hemHjei/nuOAgiIpOw0KICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDI1KSk7DQogICAgfQ0KICAgIGNoYW5uZWwuc2VuZChKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOw0KICB9DQogIHByaXZhdGUgYXN5bmMgcHVtcChwZWVyOiBQZWVyKSB7DQogICAgaWYgKHBlZXIucHVtcGluZyB8fCAhdGhpcy5zdG9yZSkgcmV0dXJuOw0KICAgIHBlZXIucHVtcGluZyA9IHRydWU7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLnN0b3JlLmxpc3QoKTsNCiAgICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRzKSB7DQogICAgICAgIGNvbnN0IGtleSA9IGAke3IuZGlyZWN0X2lkfToke3BlZXIubGluay5wZWVyX3VzZXJfaWR9YDsNCiAgICAgICAgaWYgKCFyLmlzX21pbmUgfHwgIXIucmVjaXBpZW50X2lkcy5pbmNsdWRlcyhwZWVyLmxpbmsucGVlcl91c2VyX2lkKSB8fCByLmRlbGl2ZXJlZF90by5pbmNsdWRlcyhwZWVyLmxpbmsucGVlcl91c2VyX2lkKSB8fCAhdGhpcy5hbGxvd2VkKHBlZXIubGluay5wZWVyX3VzZXJfaWQsci5jb252ZXJzYXRpb25faWQpIHx8ICh0aGlzLm5leHRTZW5kLmdldChrZXkpfHwwKT5EYXRlLm5vdygpKSBjb250aW51ZTsNCiAgICAgICAgdGhpcy5uZXh0U2VuZC5zZXQoa2V5LCBEYXRlLm5vdygpKzMwMDAwKTsNCiAgICAgICAgY29uc3Qgd2lyZTogV2lyZSA9IHt0eXBlOiJtZXNzYWdlIiwgdmVyc2lvbjoxLCBpZDpyLmRpcmVjdF9pZCwgY29udmVyc2F0aW9uX2lkOnIuY29udmVyc2F0aW9uX2lkLA0KICAgICAgICAgIHNlbmRlcl91c2VyX2lkOnIuc2VuZGVyX3VzZXJfaWQsIGNvbnRlbnQ6ci5jb250ZW50LCBtZXNzYWdlX3R5cGU6ci5tZXNzYWdlX3R5cGUsIGNyZWF0ZWRfYXQ6ci5jcmVhdGVkX2F0LCBtZXRhZGF0YV9qc29uOnIubWV0YWRhdGFfanNvbn07DQogICAgICAgIGF3YWl0IHRoaXMud3JpdGUocGVlciwgd2lyZSk7DQogICAgICAgIGlmIChyLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiKSB7DQogICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMuc3RvcmUuZmlsZShyLmRpcmVjdF9pZCk7DQogICAgICAgICAgaWYgKCFmaWxlKSB0aHJvdyBuZXcgRXJyb3IoIuW+heWPkeaWh+S7tuW3suS4jeWcqOacrOacuu+8jOivt+mHjeaWsOmAieaLqeaWh+S7tuOAgiIpOw0KICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShmaWxlKTsNCiAgICAgICAgICBmb3IgKGxldCBzdGFydD0wO3N0YXJ0PGRhdGEubGVuZ3RoO3N0YXJ0Kz1DSFVOSykgYXdhaXQgdGhpcy53cml0ZShwZWVyLCB7dHlwZToiY2h1bmsiLCBpZDpyLmRpcmVjdF9pZCwgaW5kZXg6c3RhcnQvQ0hVTkssIGRhdGE6dG9CYXNlNjQoZGF0YS5zdWJhcnJheShzdGFydCxzdGFydCtDSFVOSykpfSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9IGNhdGNoIChlcnJvcikgeyB0aGlzLm5vdGljZShlcnJvcik7IH0gZmluYWxseSB7IHBlZXIucHVtcGluZyA9IGZhbHNlOyB9DQogIH0NCiAgcHJpdmF0ZSB2YWxpZE1lc3NhZ2UodmFsdWU6IFdpcmUsIHBlZXI6IFBlZXIpOiBib29sZWFuIHsNCiAgICBpZiAodmFsdWUudmVyc2lvbiE9PTEgfHwgIVVVSUQudGVzdCh2YWx1ZS5pZCkgfHwgdmFsdWUuc2VuZGVyX3VzZXJfaWQhPT1wZWVyLmxpbmsucGVlcl91c2VyX2lkIHx8ICF0aGlzLmFsbG93ZWQocGVlci5saW5rLnBlZXJfdXNlcl9pZCx2YWx1ZS5jb252ZXJzYXRpb25faWQpKSByZXR1cm4gZmFsc2U7DQogICAgaWYgKHR5cGVvZiB2YWx1ZS5jb250ZW50IT09InN0cmluZyIgfHwgdmFsdWUuY29udGVudC5sZW5ndGg+NDAwMCB8fCB0eXBlb2YgdmFsdWUuY3JlYXRlZF9hdCE9PSJzdHJpbmciIHx8IHZhbHVlLmNyZWF0ZWRfYXQubGVuZ3RoPjQwIHx8ICFbInRleHQiLCJmaWxlIiwibG9jYXRpb24iLCJjYWxsIl0uaW5jbHVkZXModmFsdWUubWVzc2FnZV90eXBlKSkgcmV0dXJuIGZhbHNlOw0KICAgIGlmICghdmFsdWUubWV0YWRhdGFfanNvbiB8fCB0eXBlb2YgdmFsdWUubWV0YWRhdGFfanNvbiE9PSJvYmplY3QiIHx8IEpTT04uc3RyaW5naWZ5KHZhbHVlLm1ldGFkYXRhX2pzb24pLmxlbmd0aD4yMDAwKSByZXR1cm4gZmFsc2U7DQogICAgcmV0dXJuIHRydWU7DQogIH0NCiAgcHJpdmF0ZSBhc3luYyByZWNlaXZlKHBlZXI6IFBlZXIsIHZhbHVlOiBXaXJlICYge2RhdGE/OiBzdHJpbmc7IGluZGV4PzogbnVtYmVyfSkgew0KICAgIGlmICghdGhpcy5zdG9yZSB8fCAhdGhpcy5hbGl2ZSkgcmV0dXJuOw0KICAgIGNvbnN0IGtpbmQ6IHN0cmluZyA9IHZhbHVlLnR5cGU7DQogICAgaWYgKGtpbmQgPT09ICJhY2siKSB7DQogICAgICBhd2FpdCB0aGlzLnN0b3JlLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7DQogICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnN0b3JlIS5maW5kKHZhbHVlLmlkKTsNCiAgICAgICAgaWYgKCFyPy5pc19taW5lIHx8ICFyLnJlY2lwaWVudF9pZHMuaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgci5kZWxpdmVyZWRfdG8uaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkpIHJldHVybjsNCiAgICAgICAgci5kZWxpdmVyZWRfdG8ucHVzaChwZWVyLmxpbmsucGVlcl91c2VyX2lkKTsgci5sb2NhbF9zdGF0dXMgPSByLnJlY2lwaWVudF9pZHMuZXZlcnkoaWQ9PnIuZGVsaXZlcmVkX3RvLmluY2x1ZGVzKGlkKSkgPyAic2VudCI6InNlbmRpbmciOw0KICAgICAgICBhd2FpdCB0aGlzLnN0b3JlIS5zYXZlKHIpOw0KICAgICAgfSk7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7IHJldHVybjsNCiAgICB9DQogICAgaWYgKGtpbmQgPT09ICJtZXNzYWdlIikgew0KICAgICAgaWYgKCF0aGlzLnZhbGlkTWVzc2FnZSh2YWx1ZSxwZWVyKSkgcmV0dXJuOw0KICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnN0b3JlLmZpbmQodmFsdWUuaWQpOw0KICAgICAgaWYgKGV4aXN0aW5nKSB7IGlmIChleGlzdGluZy5zZW5kZXJfdXNlcl9pZCA9PT0gdmFsdWUuc2VuZGVyX3VzZXJfaWQgJiYgZXhpc3RpbmcuY29udmVyc2F0aW9uX2lkID09PSB2YWx1ZS5jb252ZXJzYXRpb25faWQgJiYgZXhpc3RpbmcuY29udGVudCA9PT0gdmFsdWUuY29udGVudCkgYXdhaXQgdGhpcy53cml0ZShwZWVyLHt0eXBlOiJhY2siLGlkOnZhbHVlLmlkfSk7IHJldHVybjsgfQ0KICAgICAgaWYgKHZhbHVlLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiKSB7DQogICAgICAgIGNvbnN0IGEgPSB2YWx1ZS5tZXRhZGF0YV9qc29uLmF0dGFjaG1lbnQgYXMge3NpemU6bnVtYmVyO29yaWdpbmFsX25hbWU6c3RyaW5nO3NoYTI1NjpzdHJpbmc7Y29udGVudF90eXBlOnN0cmluZ307DQogICAgICAgIGlmICghYSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoYS5zaXplKSB8fCBhLnNpemU8MSB8fCBhLnNpemU+TUFYX0ZJTEUgfHwgdHlwZW9mIGEub3JpZ2luYWxfbmFtZSE9PSJzdHJpbmciIHx8IGEub3JpZ2luYWxfbmFtZS5sZW5ndGg+MjQwIHx8ICEvXlthLWYwLTldezY0fSQvLnRlc3QoYS5zaGEyNTYpKSByZXR1cm47DQogICAgICAgIGlmICh0aGlzLmluYm91bmQuc2l6ZT49NCAmJiAhdGhpcy5pbmJvdW5kLmhhcyh2YWx1ZS5pZCkpIHJldHVybjsNCiAgICAgICAgdGhpcy5pbmJvdW5kLnNldCh2YWx1ZS5pZCx7bWVzc2FnZTp2YWx1ZSxwYXJ0czpbXSxyZWNlaXZlZDowLGNodW5rczowLHRvdWNoZWQ6RGF0ZS5ub3coKX0pOyByZXR1cm47DQogICAgICB9DQogICAgICBhd2FpdCB0aGlzLmFjY2VwdE1lc3NhZ2UocGVlcix2YWx1ZSk7IHJldHVybjsNCiAgICB9DQogICAgaWYgKGtpbmQgPT09ICJjaHVuayIpIHsNCiAgICAgIGNvbnN0IHRyYW5zZmVyID0gdGhpcy5pbmJvdW5kLmdldCh2YWx1ZS5pZCk7DQogICAgICBpZiAoIXRyYW5zZmVyIHx8IHRyYW5zZmVyLm1lc3NhZ2Uuc2VuZGVyX3VzZXJfaWQhPT1wZWVyLmxpbmsucGVlcl91c2VyX2lkIHx8ICF0aGlzLmFsbG93ZWQocGVlci5saW5rLnBlZXJfdXNlcl9pZCx0cmFuc2Zlci5tZXNzYWdlLmNvbnZlcnNhdGlvbl9pZCkgfHwgdmFsdWUuaW5kZXghPT10cmFuc2Zlci5jaHVua3MgfHwgdHlwZW9mIHZhbHVlLmRhdGEhPT0ic3RyaW5nIiB8fCB2YWx1ZS5kYXRhLmxlbmd0aD5DSFVOSyo0LzMpIHJldHVybjsNCiAgICAgIGNvbnN0IGNodW5rID0gZnJvbUJhc2U2NCh2YWx1ZS5kYXRhKTsgY29uc3QgYSA9IHRyYW5zZmVyLm1lc3NhZ2UubWV0YWRhdGFfanNvbi5hdHRhY2htZW50IGFzIHtzaXplOm51bWJlcjtzaGEyNTY6c3RyaW5nfTsNCiAgICAgIGlmICghY2h1bmsubGVuZ3RoIHx8IHRyYW5zZmVyLnJlY2VpdmVkK2NodW5rLmxlbmd0aD5hLnNpemUpIHsgdGhpcy5pbmJvdW5kLmRlbGV0ZSh2YWx1ZS5pZCk7IHJldHVybjsgfQ0KICAgICAgdHJhbnNmZXIucGFydHMucHVzaChjaHVuayk7IHRyYW5zZmVyLnJlY2VpdmVkKz1jaHVuay5sZW5ndGg7IHRyYW5zZmVyLmNodW5rcysrOyB0cmFuc2Zlci50b3VjaGVkPURhdGUubm93KCk7DQogICAgICBpZiAodHJhbnNmZXIucmVjZWl2ZWQ9PT1hLnNpemUpIHsNCiAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKHRyYW5zZmVyLnBhcnRzKTsNCiAgICAgICAgaWYgKGF3YWl0IGhhc2goYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKSE9PWEuc2hhMjU2KSB7dGhpcy5pbmJvdW5kLmRlbGV0ZSh2YWx1ZS5pZCk7IHRocm93IG5ldyBFcnJvcigi5paH5Lu25qCh6aqM5aSx6LSl77yM5pyq5L+d5a2Y5paH5Lu244CCIik7fQ0KICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNhdmVGaWxlKHZhbHVlLmlkLGZpbGUpOw0KICAgICAgICBhd2FpdCB0aGlzLmFjY2VwdE1lc3NhZ2UocGVlcix0cmFuc2Zlci5tZXNzYWdlKTsgdGhpcy5pbmJvdW5kLmRlbGV0ZSh2YWx1ZS5pZCk7DQogICAgICB9DQogICAgfQ0KICB9DQogIHByaXZhdGUgYXN5bmMgYWNjZXB0TWVzc2FnZShwZWVyOiBQZWVyLCB3aXJlOiBXaXJlKSB7DQogICAgYXdhaXQgdGhpcy5zdG9yZSEuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsNCiAgICAgIGlmIChhd2FpdCB0aGlzLnN0b3JlIS5maW5kKHdpcmUuaWQpKSByZXR1cm47DQogICAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5zbmFwc2hvdCEuY29udmVyc2F0aW9ucy5maW5kKGM9PmMuaWQ9PT13aXJlLmNvbnZlcnNhdGlvbl9pZCkhLnBhcnRpY2lwYW50czsNCiAgICAgIC8vIE5ldmVyIHRydXN0IGEgcmVtb3RlIGF0dGFjaG1lbnQgVVJMIG9yIGxhYmVsIGZvciB0aGUgc2VuZGVyIGlkZW50aXR5Lg0KICAgICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307DQogICAgICBpZiAod2lyZS5tZXNzYWdlX3R5cGU9PT0iZmlsZSIpIHsgY29uc3QgYSA9IHdpcmUubWV0YWRhdGFfanNvbi5hdHRhY2htZW50IGFzIFJlY29yZDxzdHJpbmcsdW5rbm93bj47IG1ldGFkYXRhLmF0dGFjaG1lbnQgPSB7b3JpZ2luYWxfbmFtZTpTdHJpbmcoYS5vcmlnaW5hbF9uYW1lKSxzaXplOk51bWJlcihhLnNpemUpLGNvbnRlbnRfdHlwZToiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixzaGEyNTY6U3RyaW5nKGEuc2hhMjU2KX07IH0NCiAgICAgIGlmICh3aXJlLm1lc3NhZ2VfdHlwZT09PSJsb2NhdGlvbiIpIHsgY29uc3QgcD13aXJlLm1ldGFkYXRhX2pzb24ubG9jYXRpb24gYXMgUmVjb3JkPHN0cmluZyx1bmtub3duPjsgaWYgKHAgJiYgdHlwZW9mIHAubGF0aXR1ZGU9PT0ibnVtYmVyIiAmJiBNYXRoLmFicyhwLmxhdGl0dWRlKTw9OTAgJiYgdHlwZW9mIHAubG9uZ2l0dWRlPT09Im51bWJlciIgJiYgTWF0aC5hYnMocC5sb25naXR1ZGUpPD0xODApIG1ldGFkYXRhLmxvY2F0aW9uPXtsYXRpdHVkZTpwLmxhdGl0dWRlLGxvbmdpdHVkZTpwLmxvbmdpdHVkZX07IH0NCiAgICAgIGF3YWl0IHRoaXMuc3RvcmUhLnNhdmUoe2lkOmF3YWl0IHRoaXMuc3RvcmUhLm5leHRJZCgpLGRpcmVjdF9pZDp3aXJlLmlkLGNvbnZlcnNhdGlvbl9pZDp3aXJlLmNvbnZlcnNhdGlvbl9pZCxzZW5kZXJfdXNlcl9pZDp3aXJlLnNlbmRlcl91c2VyX2lkLA0KICAgICAgICBzZW5kZXJfbmFtZTptZW1iZXJzLmZpbmQocD0+cC51c2VyX2lkPT09d2lyZS5zZW5kZXJfdXNlcl9pZCk/LmRpc3BsYXlfbmFtZSB8fCAi6IGU57O75Lq6Iixjb250ZW50OndpcmUuY29udGVudCxtZXNzYWdlX3R5cGU6d2lyZS5tZXNzYWdlX3R5cGUsY3JlYXRlZF9hdDp3aXJlLmNyZWF0ZWRfYXQsDQogICAgICAgIG1ldGFkYXRhX2pzb246bWV0YWRhdGEscmVjaXBpZW50X2lkczpbXSxkZWxpdmVyZWRfdG86W10saXNfbWluZTpmYWxzZSxsb2NhbF9zdGF0dXM6InNlbnQifSk7DQogICAgfSk7DQogICAgdGhpcy5vcHRpb25zLm9uQ2hhbmdlPy4oKTsgYXdhaXQgdGhpcy53cml0ZShwZWVyLHt0eXBlOiJhY2siLGlkOndpcmUuaWR9KTsNCiAgfQ0KICBhc3luYyBzZW5kKGNvbnZlcnNhdGlvbjogbnVtYmVyLCBjb250ZW50OiBzdHJpbmcsIG1lc3NhZ2VUeXBlPSJ0ZXh0IiwgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsdW5rbm93bj49e30sIGZpbGU/OiBGaWxlKTogUHJvbWlzZTxDaGF0UmVjb3JkPiB7DQogICAgaWYgKCF0aGlzLmFsaXZlIHx8ICF0aGlzLnN0b3JlIHx8ICF0aGlzLnNuYXBzaG90KSB0aHJvdyBuZXcgRXJyb3IoIui/nuaOpeW3sue7k+adn++8jOivt+mHjeaWsOaJk+W8gOiBiuWkqeOAgiIpOwogICAgY29uc3QgYyA9IHRoaXMuc25hcHNob3QuY29udmVyc2F0aW9ucy5maW5kKGM9PmMuaWQ9PT1jb252ZXJzYXRpb24pOw0KICAgIGlmICghYyB8fCBjb250ZW50Lmxlbmd0aD40MDAwIHx8ICFjb250ZW50LnRyaW0oKSkgdGhyb3cgbmV3IEVycm9yKCLor7fpgInmi6nkvJror53vvIzmtojmga/kuI3og73otoXov4cgNDAwMCDkuKrlrZfjgIIiKTsNCiAgICBjb25zdCByZWNpcGllbnRzID0gYy5wYXJ0aWNpcGFudHMubWFwKHA9PnAudXNlcl9pZCkuZmlsdGVyKGlkPT5pZCE9PXRoaXMuc3RvcmUhLmFjY291bnQpOw0KICAgIGlmICghcmVjaXBpZW50cy5sZW5ndGggfHwgcmVjaXBpZW50cy5zb21lKHBlZXI9PiF0aGlzLmFsbG93ZWQocGVlcixjb252ZXJzYXRpb24pKSkgdGhyb3cgbmV3IEVycm9yKCLor7fph43mlrDov57mjqXlubbnoa7orqTkvJror53miJDlkZjlkI7lj5HpgIHjgIIiKTsKICAgIGNvbnN0IGlkPWNyeXB0by5yYW5kb21VVUlEKCk7DQogICAgaWYgKGZpbGUpIHsNCiAgICAgIGlmICghZmlsZS5zaXplIHx8IGZpbGUuc2l6ZT5NQVhfRklMRSkgdGhyb3cgbmV3IEVycm9yKCLmlofku7blpKflsI/pnIDlnKggMSDlrZfoioLoh7MgMjUgTUIg5LmL6Ze044CCIik7DQogICAgICBtZXRhZGF0YT17YXR0YWNobWVudDp7b3JpZ2luYWxfbmFtZTpmaWxlLm5hbWUuc2xpY2UoMCwyNDApLHNpemU6ZmlsZS5zaXplLGNvbnRlbnRfdHlwZTpmaWxlLnR5cGV8fCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLHNoYTI1Njphd2FpdCBoYXNoKGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSl9fTsNCiAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2F2ZUZpbGUoaWQsZmlsZSk7DQogICAgfQ0KICAgIGNvbnN0IHJlY29yZD1hd2FpdCB0aGlzLnN0b3JlLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7DQogICAgICBjb25zdCByOkNoYXRSZWNvcmQ9e2lkOmF3YWl0IHRoaXMuc3RvcmUhLm5leHRJZCgpLGRpcmVjdF9pZDppZCxjb252ZXJzYXRpb25faWQ6Y29udmVyc2F0aW9uLHNlbmRlcl91c2VyX2lkOnRoaXMuc3RvcmUhLmFjY291bnQsDQogICAgICAgIHNlbmRlcl9uYW1lOnRoaXMuc25hcHNob3QhLnVzZXIuZGlzcGxheV9uYW1lLGNvbnRlbnQsbWVzc2FnZV90eXBlOm1lc3NhZ2VUeXBlLGNyZWF0ZWRfYXQ6bmV3IERhdGUoKS50b0lTT1N0cmluZygpLG1ldGFkYXRhX2pzb246bWV0YWRhdGEsDQogICAgICAgIHJlY2lwaWVudF9pZHM6cmVjaXBpZW50cyxkZWxpdmVyZWRfdG86W10saXNfbWluZTp0cnVlLGxvY2FsX3N0YXR1czoic2VuZGluZyJ9Ow0KICAgICAgYXdhaXQgdGhpcy5zdG9yZSEuc2F2ZShyKTtyZXR1cm4gcjsNCiAgICB9KTsNCiAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOyBmb3IgKGNvbnN0IHBlZXIgb2YgQXJyYXkuZnJvbSh0aGlzLnBlZXJzLnZhbHVlcygpKSkgaWYgKHBlZXIucmVhZHkpIHZvaWQgdGhpcy5wdW1wKHBlZXIpOyByZXR1cm4gcmVjb3JkOw0KICB9DQogIGFzeW5jIG1lc3NhZ2VzKGNvbnZlcnNhdGlvbjogbnVtYmVyKTogUHJvbWlzZTxDaGF0UmVjb3JkW10+IHsNCiAgICBpZiAoIXRoaXMuc3RvcmUpIHJldHVybiBbXTsNCiAgICBjb25zdCByb3dzPWF3YWl0IHRoaXMuc3RvcmUubGlzdChjb252ZXJzYXRpb24pOw0KICAgIHJldHVybiBQcm9taXNlLmFsbChyb3dzLm1hcChhc3luYyByPT57DQogICAgICBpZiAoci5tZXNzYWdlX3R5cGUhPT0iZmlsZSIpIHJldHVybiByOw0KICAgICAgY29uc3QgYT1yLm1ldGFkYXRhX2pzb24uYXR0YWNobWVudCBhcyBSZWNvcmQ8c3RyaW5nLHVua25vd24+Ow0KICAgICAgY29uc3QgdXJsPWF3YWl0IHRoaXMuc3RvcmUhLmZpbGVVcmwoci5kaXJlY3RfaWQsU3RyaW5nKGEuY29udGVudF90eXBlfHwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpOw0KICAgICAgcmV0dXJuIHsuLi5yLG1ldGFkYXRhX2pzb246ey4uLnIubWV0YWRhdGFfanNvbixhdHRhY2htZW50OnsuLi5hLHVybH19fTsNCiAgICB9KSk7DQogIH0NCiAgYXN5bmMgY29udmVyc2F0aW9uVmlld3M8VCBleHRlbmRzIENvbnZlcnNhdGlvbj4oaXRlbXM6IFRbXSk6IFByb21pc2U8VFtdPiB7DQogICAgaWYgKCF0aGlzLnN0b3JlKSByZXR1cm4gaXRlbXM7DQogICAgY29uc3QgbWVzc2FnZXM9YXdhaXQgdGhpcy5zdG9yZS5saXN0KCk7DQogICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zLm1hcChhc3luYyBjPT57IGNvbnN0IHJvd3M9bWVzc2FnZXMuZmlsdGVyKHI9PnIuY29udmVyc2F0aW9uX2lkPT09Yy5pZCk7Y29uc3QgcmVhZD1hd2FpdCB0aGlzLnN0b3JlIS5yZWFkQXQoYy5pZCk7Y29uc3QgbGFzdD1yb3dzLmF0KC0xKTsNCiAgICAgIHJldHVybiB7Li4uYyxsYXN0X21lc3NhZ2U6bGFzdHx8bnVsbCxsYXN0X21lc3NhZ2VfYXQ6bGFzdD8uY3JlYXRlZF9hdHx8bnVsbCx1bnJlYWRfY291bnQ6cm93cy5maWx0ZXIocj0+IXIuaXNfbWluZSAmJiByLmlkPnJlYWQpLmxlbmd0aH07IH0pKTsNCiAgfQ0KICBzdGF0dXMoY29udmVyc2F0aW9uOiBudW1iZXIpIHsNCiAgICBjb25zdCBpZHM9dGhpcy5zbmFwc2hvdD8uY29udmVyc2F0aW9ucy5maW5kKGM9PmMuaWQ9PT1jb252ZXJzYXRpb24pPy5wYXJ0aWNpcGFudHMuZmlsdGVyKHA9PnAudXNlcl9pZCE9PXRoaXMuc3RvcmU/LmFjY291bnQpLm1hcChwPT5wLnVzZXJfaWQpfHxbXTsNCiAgICBjb25zdCBvbmxpbmU9aWRzLmZpbHRlcihpZD0+dGhpcy5wZWVycy5nZXQoaWQpPy5yZWFkeSkubGVuZ3RoOw0KICAgIHJldHVybiBvbmxpbmU9PT1pZHMubGVuZ3RoICYmIG9ubGluZT4wID8gIuiuvuWkh+W3suebtOi/niIgOiBvbmxpbmU+MCA/IGAke29ubGluZX0vJHtpZHMubGVuZ3RofSDkvY3miJDlkZjlt7Lnm7Tov55gIDogIuetieW+heWvueaWueS4iue6v+aIlue9kee7nOebtOi/niI7DQogIH0NCiAgcHJpdmF0ZSBjbG9zZVBlZXIodWlkOm51bWJlcixwZWVyOlBlZXIpIHsgcGVlci5jaGFubmVsPy5jbG9zZSgpO3BlZXIucGMuY2xvc2UoKTt0aGlzLnBlZXJzLmRlbGV0ZSh1aWQpOyB9DQogIHByaXZhdGUgZGlzY29ubmVjdFBlZXJzKCkgeyBmb3IgKGNvbnN0IFt1aWQscGVlcl0gb2YgQXJyYXkuZnJvbSh0aGlzLnBlZXJzKSkgdGhpcy5jbG9zZVBlZXIodWlkLHBlZXIpOyB9DQogIHN0b3AoKSB7IHRoaXMuYWxpdmU9ZmFsc2U7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO3RoaXMuZGlzY29ubmVjdFBlZXJzKCk7dGhpcy5pbmJvdW5kLmNsZWFyKCk7dGhpcy5yZWxlYXNlZD8uKCk7dGhpcy5zdG9yZT8uY2xvc2UoKTt0aGlzLm9wdGlvbnMuZGV2aWNlQ29udHJvbD8uY2xvc2UoKTsgfQp9DQphc3luYyBmdW5jdGlvbiBoYXNoKGRhdGE6QXJyYXlCdWZmZXIpIHsgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLGRhdGEpKSxiPT5iLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpOyB9DQo=",
      "src/client.js": "aW1wb3J0IHsgTG9jYWxDaGF0U3RvcmUsIHRvQmFzZTY0LCBmcm9tQmFzZTY0IH0gZnJvbSAiLi9zdG9yYWdlLmpzIjsKY29uc3QgTUFYX0ZJTEUgPSAyNSAqIDEwMjQgKiAxMDI0Owpjb25zdCBDSFVOSyA9IDEyICogMTAyNDsKY29uc3QgVVVJRCA9IC9eW2EtZjAtOS1dezM2fSQvaTsKZXhwb3J0IGNsYXNzIERpcmVjdENoYXRDbGllbnQgewogICAgb3B0aW9uczsKICAgIHBhZ2VJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICBzdG9yZTsKICAgIHNuYXBzaG90OwogICAgcGVlcnMgPSBuZXcgTWFwKCk7CiAgICBpbmJvdW5kID0gbmV3IE1hcCgpOwogICAgdGltZXI7CiAgICBhbGl2ZSA9IGZhbHNlOwogICAgcG9sbGluZyA9IGZhbHNlOwogICAgYXV0aGVudGljYXRlZEF0ID0gMDsKICAgIG5leHRTZW5kID0gbmV3IE1hcCgpOwogICAgcmVsZWFzZWQ7CiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KICAgIGFzeW5jIGFwaShwYXRoLCBib2R5LCBtZXRob2QgPSAiUE9TVCIpIHsKICAgICAgICBpZiAoIXRoaXMuYWxpdmUpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi6L+e5o6l5bey57uT5p2f77yM6K+36YeN5paw5omT5byA6IGK5aSp44CCIik7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZXZpY2VDb250cm9sKQogICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRldmljZUNvbnRyb2wucmVxdWVzdChwYXRoLCBib2R5LCBtZXRob2QpOwogICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5vcHRpb25zLnRva2VuKCk7CiAgICAgICAgaWYgKCF0b2tlbikKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLor7flhYjov57mjqXoh6rlt7HnmoTotKblj7fjgIIiKTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMub3B0aW9ucy5iYXNlVXJsLnJlcGxhY2UoL1wvJC8sICIiKX0ke3BhdGh9YCwgewogICAgICAgICAgICBtZXRob2QsIGNyZWRlbnRpYWxzOiAib21pdCIsIGNhY2hlOiAibm8tc3RvcmUiLCBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTIwMDApLAogICAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0sCiAgICAgICAgICAgIGJvZHk6IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKQogICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0UGVlcnMoKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTsKICAgICAgICAgICAgaWYgKGRhdGEuZGV0YWlsPy5jb2RlID09PSAiZGV2aWNlX3JlcGxhY2VkIikgewogICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5kZXRhaWwubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHR5cGVvZiBkYXRhLmRldGFpbCA9PT0gInN0cmluZyIgPyBkYXRhLmRldGFpbCA6IGDov57mjqXmmoLml7bmnKrlrozmiJDvvIgke3Jlc3BvbnNlLnN0YXR1c33vvInjgIJgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsKICAgIH0KICAgIGFzeW5jIHN0YXJ0KCkgewogICAgICAgIGlmICh0aGlzLmFsaXZlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5hbGl2ZSA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCB0aGlzLmFwaSgiL2lkZW50aXR5IiwgdW5kZWZpbmVkLCAiR0VUIik7CiAgICAgICAgICAgIGlmICghdGhpcy5hbGl2ZSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgLy8gT25lIHRhYiBwZXIgYWNjb3VudC9vcmlnaW4gb3ducyBhIGRldmljZSBub2RlOyBvdGhlciB0YWJzIG5ldmVyIGZpZ2h0IG92ZXIgc2lnbmFsaW5nLgogICAgICAgICAgICBpZiAobmF2aWdhdG9yLmxvY2tzKQogICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgICAgIHZvaWQgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QoYHpodWdlLWRpcmVjdC1pbS0ke2lkZW50aXR5LmlkfWAsIHsgaWZBdmFpbGFibGU6IHRydWUgfSwgYXN5bmMgKGxvY2spID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCLmraTotKblj7flt7LlnKjlj6bkuIDkuKrnqpflj6PmiZPlvIDogYrlpKnvvIzor7flhYjlhbPpl63pgqPkuKrnqpflj6PjgIIiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZWxlYXNlID0+IHsgdGhpcy5yZWxlYXNlZCA9IHJlbGVhc2U7IH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBuZXcgTG9jYWxDaGF0U3RvcmUoaWRlbnRpdHkuaWQpOwogICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLm9wZW4oKTsKICAgICAgICAgICAgaWYgKCF0aGlzLmFsaXZlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VkPy4oKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHRoaXMuYXBpKCIvcG9sbCIsIHsgcGFnZV9pZDogdGhpcy5wYWdlSWQsIGFjdGl2YXRlOiB0cnVlIH0pOwogICAgICAgICAgICB0aGlzLnNuYXBzaG90ID0gZmlyc3Q7CiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uQ2hhbmdlPy4oKTsKICAgICAgICAgICAgdm9pZCBuYXZpZ2F0b3Iuc3RvcmFnZT8ucGVyc2lzdD8uKCkuY2F0Y2goKCkgPT4gZmFsc2UpOwogICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5U25hcHNob3QoZmlyc3QpOwogICAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgfQogICAgc2NoZWR1bGUoKSB7IGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsgaWYgKHRoaXMuYWxpdmUpCiAgICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnBvbGwoKSwgMjUwMCk7IH0KICAgIGFzeW5jIHBvbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmFsaXZlIHx8IHRoaXMucG9sbGluZykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMucG9sbGluZyA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYXBpKCIvcG9sbCIsIHsgcGFnZV9pZDogdGhpcy5wYWdlSWQgfSk7CiAgICAgICAgICAgIGlmICghdGhpcy5hbGl2ZSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmU/LmFjY291bnQgIT09IGRhdGEudXNlci5pZCkgewogICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIui0puWPt+W3suaUueWPmO+8jOivt+mHjeaWsOaJk+W8gOiBiuWkqeOAgiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgdGhpcy5zbmFwc2hvdCA9IGRhdGE7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwbHlTbmFwc2hvdChkYXRhKTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uQ2hhbmdlPy4oKTsKICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgQXJyYXkuZnJvbSh0aGlzLmluYm91bmQpKQogICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB2YWx1ZS50b3VjaGVkID4gNjAwMDApCiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmJvdW5kLmRlbGV0ZShrZXkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5ub3RpY2UoZXJyb3IpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy5wb2xsaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTsKICAgICAgICB9CiAgICB9CiAgICBub3RpY2UoZXJyb3IpIHsgdGhpcy5vcHRpb25zLm9uTm90aWNlPy4oZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAi6L+e5o6l5pqC5pe25LiN5Y+v55So44CCIik7IH0KICAgIGFsbG93ZWQocGVlciwgY29udmVyc2F0aW9uKSB7CiAgICAgICAgY29uc3QgYyA9IHRoaXMuc25hcHNob3Q/LmNvbnZlcnNhdGlvbnMuZmluZChjID0+IGMuaWQgPT09IGNvbnZlcnNhdGlvbik7CiAgICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLm9wdGlvbnMuZGV2aWNlQ29udHJvbCA/IHRoaXMub3B0aW9ucy5kZXZpY2VDb250cm9sLnRydXN0ZWQocGVlciwgY29udmVyc2F0aW9uKSA6IERhdGUubm93KCkgLSB0aGlzLmF1dGhlbnRpY2F0ZWRBdCA8IDEyMDAwMDsKICAgICAgICByZXR1cm4gdmFsaWQgJiYgISFjPy5wYXJ0aWNpcGFudHMuc29tZShwID0+IHAudXNlcl9pZCA9PT0gcGVlcikgJiYgISFjLnBhcnRpY2lwYW50cy5zb21lKHAgPT4gcC51c2VyX2lkID09PSB0aGlzLnN0b3JlPy5hY2NvdW50KTsKICAgIH0KICAgIGFzeW5jIGFwcGx5U25hcHNob3QoZGF0YSkgewogICAgICAgIGlmIChkYXRhLnRyYW5zcG9ydCAhPT0gImRpcmVjdF9vbmx5IikKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLlvZPliY3ov57mjqXmlrnlvI/kuI3nrKblkIjorr7lpIfnm7Tov57opoHmsYLjgIIiKTsKICAgICAgICBjb25zdCByZWFjaGFibGUgPSBuZXcgU2V0KGRhdGEucGVlcnMubWFwKGwgPT4gbC5wZWVyX3VzZXJfaWQpKTsKICAgICAgICBmb3IgKGNvbnN0IFt1aWQsIHBlZXJdIG9mIEFycmF5LmZyb20odGhpcy5wZWVycykpCiAgICAgICAgICAgIGlmICghcmVhY2hhYmxlLmhhcyh1aWQpKQogICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBlZXIodWlkLCBwZWVyKTsKICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgZGF0YS5wZWVycykgewogICAgICAgICAgICBsZXQgcGVlciA9IHRoaXMucGVlcnMuZ2V0KGxpbmsucGVlcl91c2VyX2lkKTsKICAgICAgICAgICAgaWYgKHBlZXIgJiYgbGluay5vbmxpbmUgJiYgcGVlci5saW5rLnBlZXJfcGFnZV9pZCAhPT0gbGluay5wZWVyX3BhZ2VfaWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQZWVyKGxpbmsucGVlcl91c2VyX2lkLCBwZWVyKTsKICAgICAgICAgICAgICAgIHBlZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBlZXIgJiYgIXBlZXIucmVhZHkgJiYgRGF0ZS5ub3coKSAtIHBlZXIuc3RhcnRlZCA+IDI1MDAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGVlcihsaW5rLnBlZXJfdXNlcl9pZCwgcGVlcik7CiAgICAgICAgICAgICAgICBwZWVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEEgZmFpbGVkIHByZXNlbmNlIHJlcXVlc3QgbXVzdCBub3QgdGVhciBkb3duIGFuIGVzdGFibGlzaGVkIGRpcmVjdCBjb25uZWN0aW9uLgogICAgICAgICAgICBpZiAoIXBlZXIgJiYgbGluay5vbmxpbmUpIHsKICAgICAgICAgICAgICAgIHBlZXIgPSB0aGlzLmNyZWF0ZVBlZXIobGluayk7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS51c2VyLmlkIDwgbGluay5wZWVyX3VzZXJfaWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZUNoYW5uZWwocGVlciwgcGVlci5wYy5jcmVhdGVEYXRhQ2hhbm5lbCgiemh1Z2UtaW0tdjEiLCB7IG9yZGVyZWQ6IHRydWUgfSkpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZmVyID0gYXdhaXQgcGVlci5wYy5jcmVhdGVPZmZlcigpOwogICAgICAgICAgICAgICAgICAgIGF3YWl0IHBlZXIucGMuc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlcik7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kU2lnbmFsKHBlZXIsICJvZmZlciIsIHsgdHlwZTogIm9mZmVyIiwgc2RwOiBvZmZlci5zZHAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYWNrID0gW107CiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgZGF0YS5zaWduYWxzKSB7CiAgICAgICAgICAgIGNvbnN0IHBlZXIgPSB0aGlzLnBlZXJzLmdldChzaWduYWwucGVlcl91c2VyX2lkKTsKICAgICAgICAgICAgaWYgKCFwZWVyKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmICghcGVlci5zZWVuLmhhcyhzaWduYWwuaWQpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWNjZXB0U2lnbmFsKHBlZXIsIHNpZ25hbCk7CiAgICAgICAgICAgICAgICAgICAgcGVlci5zZWVuLmFkZChzaWduYWwuaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFjay5wdXNoKHNpZ25hbC5pZCk7CiAgICAgICAgfQogICAgICAgIGlmIChhY2subGVuZ3RoKQogICAgICAgICAgICBhd2FpdCB0aGlzLmFwaSgiL3NpZ25hbHMvYWNrIiwgeyBwYWdlX2lkOiB0aGlzLnBhZ2VJZCwgaWRzOiBhY2sgfSk7CiAgICAgICAgZm9yIChjb25zdCBwZWVyIG9mIEFycmF5LmZyb20odGhpcy5wZWVycy52YWx1ZXMoKSkpCiAgICAgICAgICAgIGlmIChwZWVyLnJlYWR5KQogICAgICAgICAgICAgICAgdm9pZCB0aGlzLnB1bXAocGVlcik7CiAgICAgICAgdGhpcy5vcHRpb25zLmRldmljZUNvbnRyb2w/LmNvbm5lY3RlZChBcnJheS5mcm9tKHRoaXMucGVlcnMpLmZpbHRlcigoWywgcF0pID0+IHAucmVhZHkpLm1hcCgoW3VpZF0pID0+IHVpZCkpOwogICAgfQogICAgY3JlYXRlUGVlcihsaW5rKSB7CiAgICAgICAgY29uc3QgaWNlID0gKHRoaXMuc25hcHNob3Q/LmljZV9zZXJ2ZXJzIHx8IFtdKS5tYXAocyA9PiAoeyB1cmxzOiAoQXJyYXkuaXNBcnJheShzLnVybHMpID8gcy51cmxzIDogW3MudXJsc10pLmZpbHRlcih1ID0+IHUuc3RhcnRzV2l0aCgic3R1bjoiKSkgfSkpLmZpbHRlcihzID0+IHMudXJscy5sZW5ndGgpOwogICAgICAgIGNvbnN0IHBjID0gbmV3IFJUQ1BlZXJDb25uZWN0aW9uKHsgaWNlU2VydmVyczogaWNlIH0pOwogICAgICAgIGNvbnN0IHBlZXIgPSB7IGxpbmssIHBjLCBjaGFubmVsSWQ6IGNyeXB0by5yYW5kb21VVUlEKCksIHBlbmRpbmc6IFtdLCByZWFkeTogZmFsc2UsIHF1ZXVlOiBQcm9taXNlLnJlc29sdmUoKSwgcHVtcGluZzogZmFsc2UsIHNlZW46IG5ldyBTZXQoKSwgc3RhcnRlZDogRGF0ZS5ub3coKSwgc2lnbmFsUXVldWU6IFByb21pc2UucmVzb2x2ZSgpIH07CiAgICAgICAgdGhpcy5wZWVycy5zZXQobGluay5wZWVyX3VzZXJfaWQsIHBlZXIpOwogICAgICAgIHBjLm9uaWNlY2FuZGlkYXRlID0gZSA9PiB7IGlmIChlLmNhbmRpZGF0ZSkgewogICAgICAgICAgICBjb25zdCBjID0gZS5jYW5kaWRhdGUudG9KU09OKCk7CiAgICAgICAgICAgIHZvaWQgdGhpcy5zZW5kU2lnbmFsKHBlZXIsICJpY2UiLCB7IGNhbmRpZGF0ZTogYy5jYW5kaWRhdGUsIHNkcE1pZDogYy5zZHBNaWQsIHNkcE1MaW5lSW5kZXg6IGMuc2RwTUxpbmVJbmRleCB9KS5jYXRjaChlcnJvciA9PiB0aGlzLm5vdGljZShlcnJvcikpOwogICAgICAgIH0gfTsKICAgICAgICBwYy5vbmRhdGFjaGFubmVsID0gZSA9PiB0aGlzLmNvbmZpZ3VyZUNoYW5uZWwocGVlciwgZS5jaGFubmVsKTsKICAgICAgICBwYy5vbmNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9ICgpID0+IHsgaWYgKFsiZmFpbGVkIiwgImNsb3NlZCJdLmluY2x1ZGVzKHBjLmNvbm5lY3Rpb25TdGF0ZSkpIHsKICAgICAgICAgICAgcGVlci5yZWFkeSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOwogICAgICAgIH0gfTsKICAgICAgICByZXR1cm4gcGVlcjsKICAgIH0KICAgIGFzeW5jIHNlbmRTaWduYWwocGVlciwgdHlwZSwgc2lnbmFsKSB7CiAgICAgICAgaWYgKCF0aGlzLmFsaXZlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3Qgc2VuZCA9ICgpID0+IHRoaXMuYXBpKCIvc2lnbmFscyIsIHsgcGFnZV9pZDogdGhpcy5wYWdlSWQsIHBlZXJfdXNlcl9pZDogcGVlci5saW5rLnBlZXJfdXNlcl9pZCwKICAgICAgICAgICAgcGVlcl9wYWdlX2lkOiBwZWVyLmxpbmsucGVlcl9wYWdlX2lkLCBjaGFubmVsX2lkOiBwZWVyLmNoYW5uZWxJZCwgc2lnbmFsX3R5cGU6IHR5cGUsIHNpZ25hbCB9KS50aGVuKCgpID0+IHVuZGVmaW5lZCk7CiAgICAgICAgcGVlci5zaWduYWxRdWV1ZSA9IHBlZXIuc2lnbmFsUXVldWUudGhlbihzZW5kKTsKICAgICAgICByZXR1cm4gcGVlci5zaWduYWxRdWV1ZTsKICAgIH0KICAgIGFzeW5jIGFjY2VwdFNpZ25hbChwZWVyLCBzaWduYWwpIHsKICAgICAgICBpZiAoc2lnbmFsLnNpZ25hbF90eXBlID09PSAib2ZmZXIiKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLmFjY291bnQgPCBwZWVyLmxpbmsucGVlcl91c2VyX2lkKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAocGVlci5wYy5zaWduYWxpbmdTdGF0ZSAhPT0gInN0YWJsZSIgfHwgcGVlci5wYy5yZW1vdGVEZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgcGVlci5jaGFubmVsSWQgPSBzaWduYWwuY2hhbm5lbF9pZDsKICAgICAgICAgICAgYXdhaXQgcGVlci5wYy5zZXRSZW1vdGVEZXNjcmlwdGlvbihzaWduYWwuc2lnbmFsKTsKICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIHBlZXIucGVuZGluZy5zcGxpY2UoMCkpCiAgICAgICAgICAgICAgICBhd2FpdCBwZWVyLnBjLmFkZEljZUNhbmRpZGF0ZShjKTsKICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgcGVlci5wYy5jcmVhdGVBbnN3ZXIoKTsKICAgICAgICAgICAgYXdhaXQgcGVlci5wYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlcik7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFNpZ25hbChwZWVyLCAiYW5zd2VyIiwgeyB0eXBlOiAiYW5zd2VyIiwgc2RwOiBhbnN3ZXIuc2RwIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzaWduYWwuc2lnbmFsX3R5cGUgPT09ICJhbnN3ZXIiKSB7CiAgICAgICAgICAgIGlmIChzaWduYWwuY2hhbm5lbF9pZCAhPT0gcGVlci5jaGFubmVsSWQgfHwgcGVlci5wYy5zaWduYWxpbmdTdGF0ZSAhPT0gImhhdmUtbG9jYWwtb2ZmZXIiKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBhd2FpdCBwZWVyLnBjLnNldFJlbW90ZURlc2NyaXB0aW9uKHNpZ25hbC5zaWduYWwpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcGVlci5wZW5kaW5nLnNwbGljZSgwKSkKICAgICAgICAgICAgICAgIGF3YWl0IHBlZXIucGMuYWRkSWNlQ2FuZGlkYXRlKGMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuYWNjb3VudCA8IHBlZXIubGluay5wZWVyX3VzZXJfaWQgJiYgc2lnbmFsLmNoYW5uZWxfaWQgIT09IHBlZXIuY2hhbm5lbElkKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAocGVlci5wYy5yZW1vdGVEZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgIGF3YWl0IHBlZXIucGMuYWRkSWNlQ2FuZGlkYXRlKHNpZ25hbC5zaWduYWwpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwZWVyLnBlbmRpbmcucHVzaChzaWduYWwuc2lnbmFsKTsKICAgICAgICB9CiAgICB9CiAgICBjb25maWd1cmVDaGFubmVsKHBlZXIsIGNoYW5uZWwpIHsKICAgICAgICBpZiAoY2hhbm5lbC5sYWJlbCAhPT0gInpodWdlLWltLXYxIiB8fCBwZWVyLmNoYW5uZWwpIHsKICAgICAgICAgICAgY2hhbm5lbC5jbG9zZSgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBlZXIuY2hhbm5lbCA9IGNoYW5uZWw7CiAgICAgICAgY2hhbm5lbC5vbm9wZW4gPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgcGVlci5wYy5nZXRTdGF0cygpOwogICAgICAgICAgICBsZXQgcmVsYXkgPSBmYWxzZTsKICAgICAgICAgICAgc3RhdHMuZm9yRWFjaChzID0+IHsgaWYgKChzLnR5cGUgPT09ICJsb2NhbC1jYW5kaWRhdGUiIHx8IHMudHlwZSA9PT0gInJlbW90ZS1jYW5kaWRhdGUiKSAmJiBzLmNhbmRpZGF0ZVR5cGUgPT09ICJyZWxheSIpCiAgICAgICAgICAgICAgICByZWxheSA9IHRydWU7IH0pOwogICAgICAgICAgICBpZiAocmVsYXkpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQZWVyKHBlZXIubGluay5wZWVyX3VzZXJfaWQsIHBlZXIpOwogICAgICAgICAgICAgICAgdGhpcy5ub3RpY2UobmV3IEVycm9yKCLlt7LlgZzmraLkuK3nu6fov57mjqXvvIzor7fkvb/nlKjlj6/nm7Tov57nvZHnu5zjgIIiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGVlci5yZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7CiAgICAgICAgICAgIHZvaWQgdGhpcy5wdW1wKHBlZXIpOwogICAgICAgIH07CiAgICAgICAgY2hhbm5lbC5vbmNsb3NlID0gY2hhbm5lbC5vbmVycm9yID0gKCkgPT4geyBwZWVyLnJlYWR5ID0gZmFsc2U7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7IH07CiAgICAgICAgY2hhbm5lbC5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSAhPT0gInN0cmluZyIgfHwgZXZlbnQuZGF0YS5sZW5ndGggPiAyNDAwMCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgLy8gUHJlc2VydmUgd2lyZSBvcmRlciBhY3Jvc3MgYXN5bmNocm9ub3VzIEluZGV4ZWREQi9oYXNoIG9wZXJhdGlvbnMuCiAgICAgICAgICAgIHBlZXIucXVldWUgPSBwZWVyLnF1ZXVlLnRoZW4oKCkgPT4gdGhpcy5yZWNlaXZlKHBlZXIsIEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpKS5jYXRjaChlcnJvciA9PiB0aGlzLm5vdGljZShlcnJvcikpOwogICAgICAgIH07CiAgICB9CiAgICBhc3luYyB3cml0ZShwZWVyLCB2YWx1ZSkgewogICAgICAgIGNvbnN0IGNoYW5uZWwgPSBwZWVyLmNoYW5uZWw7CiAgICAgICAgaWYgKCF0aGlzLmFsaXZlIHx8ICFjaGFubmVsIHx8IGNoYW5uZWwucmVhZHlTdGF0ZSAhPT0gIm9wZW4iKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuWvueaWueaaguaXtuemu+e6v++8jOa2iOaBr+S8mueVmeWcqOacrOacuuetieW+hemHjei/nuOAgiIpOwogICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICAgIHdoaWxlIChjaGFubmVsLmJ1ZmZlcmVkQW1vdW50ID4gMjU2ICogMTAyNCkgewogICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPiAxNTAwMCB8fCBjaGFubmVsLnJlYWR5U3RhdGUgIT09ICJvcGVuIiB8fCAhdGhpcy5hbGl2ZSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi5paH5Lu25Lyg6L6T5Lit5pat77yM5q2j5Zyo562J5b6F6YeN6L+e44CCIik7CiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyNSkpOwogICAgICAgIH0KICAgICAgICBjaGFubmVsLnNlbmQoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgIH0KICAgIGFzeW5jIHB1bXAocGVlcikgewogICAgICAgIGlmIChwZWVyLnB1bXBpbmcgfHwgIXRoaXMuc3RvcmUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBwZWVyLnB1bXBpbmcgPSB0cnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLnN0b3JlLmxpc3QoKTsKICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZHMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGAke3IuZGlyZWN0X2lkfToke3BlZXIubGluay5wZWVyX3VzZXJfaWR9YDsKICAgICAgICAgICAgICAgIGlmICghci5pc19taW5lIHx8ICFyLnJlY2lwaWVudF9pZHMuaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgci5kZWxpdmVyZWRfdG8uaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgIXRoaXMuYWxsb3dlZChwZWVyLmxpbmsucGVlcl91c2VyX2lkLCByLmNvbnZlcnNhdGlvbl9pZCkgfHwgKHRoaXMubmV4dFNlbmQuZ2V0KGtleSkgfHwgMCkgPiBEYXRlLm5vdygpKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdGhpcy5uZXh0U2VuZC5zZXQoa2V5LCBEYXRlLm5vdygpICsgMzAwMDApOwogICAgICAgICAgICAgICAgY29uc3Qgd2lyZSA9IHsgdHlwZTogIm1lc3NhZ2UiLCB2ZXJzaW9uOiAxLCBpZDogci5kaXJlY3RfaWQsIGNvbnZlcnNhdGlvbl9pZDogci5jb252ZXJzYXRpb25faWQsCiAgICAgICAgICAgICAgICAgICAgc2VuZGVyX3VzZXJfaWQ6IHIuc2VuZGVyX3VzZXJfaWQsIGNvbnRlbnQ6IHIuY29udGVudCwgbWVzc2FnZV90eXBlOiByLm1lc3NhZ2VfdHlwZSwgY3JlYXRlZF9hdDogci5jcmVhdGVkX2F0LCBtZXRhZGF0YV9qc29uOiByLm1ldGFkYXRhX2pzb24gfTsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGUocGVlciwgd2lyZSk7CiAgICAgICAgICAgICAgICBpZiAoci5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLnN0b3JlLmZpbGUoci5kaXJlY3RfaWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLlvoXlj5Hmlofku7blt7LkuI3lnKjmnKzmnLrvvIzor7fph43mlrDpgInmi6nmlofku7bjgIIiKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3RhcnQgPSAwOyBzdGFydCA8IGRhdGEubGVuZ3RoOyBzdGFydCArPSBDSFVOSykKICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZShwZWVyLCB7IHR5cGU6ICJjaHVuayIsIGlkOiByLmRpcmVjdF9pZCwgaW5kZXg6IHN0YXJ0IC8gQ0hVTkssIGRhdGE6IHRvQmFzZTY0KGRhdGEuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgQ0hVTkspKSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5ub3RpY2UoZXJyb3IpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgcGVlci5wdW1waW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgdmFsaWRNZXNzYWdlKHZhbHVlLCBwZWVyKSB7CiAgICAgICAgaWYgKHZhbHVlLnZlcnNpb24gIT09IDEgfHwgIVVVSUQudGVzdCh2YWx1ZS5pZCkgfHwgdmFsdWUuc2VuZGVyX3VzZXJfaWQgIT09IHBlZXIubGluay5wZWVyX3VzZXJfaWQgfHwgIXRoaXMuYWxsb3dlZChwZWVyLmxpbmsucGVlcl91c2VyX2lkLCB2YWx1ZS5jb252ZXJzYXRpb25faWQpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5jb250ZW50ICE9PSAic3RyaW5nIiB8fCB2YWx1ZS5jb250ZW50Lmxlbmd0aCA+IDQwMDAgfHwgdHlwZW9mIHZhbHVlLmNyZWF0ZWRfYXQgIT09ICJzdHJpbmciIHx8IHZhbHVlLmNyZWF0ZWRfYXQubGVuZ3RoID4gNDAgfHwgIVsidGV4dCIsICJmaWxlIiwgImxvY2F0aW9uIiwgImNhbGwiXS5pbmNsdWRlcyh2YWx1ZS5tZXNzYWdlX3R5cGUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKCF2YWx1ZS5tZXRhZGF0YV9qc29uIHx8IHR5cGVvZiB2YWx1ZS5tZXRhZGF0YV9qc29uICE9PSAib2JqZWN0IiB8fCBKU09OLnN0cmluZ2lmeSh2YWx1ZS5tZXRhZGF0YV9qc29uKS5sZW5ndGggPiAyMDAwKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBhc3luYyByZWNlaXZlKHBlZXIsIHZhbHVlKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0b3JlIHx8ICF0aGlzLmFsaXZlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3Qga2luZCA9IHZhbHVlLnR5cGU7CiAgICAgICAgaWYgKGtpbmQgPT09ICJhY2siKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnN0b3JlLmZpbmQodmFsdWUuaWQpOwogICAgICAgICAgICAgICAgaWYgKCFyPy5pc19taW5lIHx8ICFyLnJlY2lwaWVudF9pZHMuaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgci5kZWxpdmVyZWRfdG8uaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgci5kZWxpdmVyZWRfdG8ucHVzaChwZWVyLmxpbmsucGVlcl91c2VyX2lkKTsKICAgICAgICAgICAgICAgIHIubG9jYWxfc3RhdHVzID0gci5yZWNpcGllbnRfaWRzLmV2ZXJ5KGlkID0+IHIuZGVsaXZlcmVkX3RvLmluY2x1ZGVzKGlkKSkgPyAic2VudCIgOiAic2VuZGluZyI7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNhdmUocik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChraW5kID09PSAibWVzc2FnZSIpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkTWVzc2FnZSh2YWx1ZSwgcGVlcikpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zdG9yZS5maW5kKHZhbHVlLmlkKTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3Rpbmcuc2VuZGVyX3VzZXJfaWQgPT09IHZhbHVlLnNlbmRlcl91c2VyX2lkICYmIGV4aXN0aW5nLmNvbnZlcnNhdGlvbl9pZCA9PT0gdmFsdWUuY29udmVyc2F0aW9uX2lkICYmIGV4aXN0aW5nLmNvbnRlbnQgPT09IHZhbHVlLmNvbnRlbnQpCiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZShwZWVyLCB7IHR5cGU6ICJhY2siLCBpZDogdmFsdWUuaWQgfSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbHVlLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhID0gdmFsdWUubWV0YWRhdGFfanNvbi5hdHRhY2htZW50OwogICAgICAgICAgICAgICAgaWYgKCFhIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihhLnNpemUpIHx8IGEuc2l6ZSA8IDEgfHwgYS5zaXplID4gTUFYX0ZJTEUgfHwgdHlwZW9mIGEub3JpZ2luYWxfbmFtZSAhPT0gInN0cmluZyIgfHwgYS5vcmlnaW5hbF9uYW1lLmxlbmd0aCA+IDI0MCB8fCAhL15bYS1mMC05XXs2NH0kLy50ZXN0KGEuc2hhMjU2KSkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmJvdW5kLnNpemUgPj0gNCAmJiAhdGhpcy5pbmJvdW5kLmhhcyh2YWx1ZS5pZCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdGhpcy5pbmJvdW5kLnNldCh2YWx1ZS5pZCwgeyBtZXNzYWdlOiB2YWx1ZSwgcGFydHM6IFtdLCByZWNlaXZlZDogMCwgY2h1bmtzOiAwLCB0b3VjaGVkOiBEYXRlLm5vdygpIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWNjZXB0TWVzc2FnZShwZWVyLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGtpbmQgPT09ICJjaHVuayIpIHsKICAgICAgICAgICAgY29uc3QgdHJhbnNmZXIgPSB0aGlzLmluYm91bmQuZ2V0KHZhbHVlLmlkKTsKICAgICAgICAgICAgaWYgKCF0cmFuc2ZlciB8fCB0cmFuc2Zlci5tZXNzYWdlLnNlbmRlcl91c2VyX2lkICE9PSBwZWVyLmxpbmsucGVlcl91c2VyX2lkIHx8ICF0aGlzLmFsbG93ZWQocGVlci5saW5rLnBlZXJfdXNlcl9pZCwgdHJhbnNmZXIubWVzc2FnZS5jb252ZXJzYXRpb25faWQpIHx8IHZhbHVlLmluZGV4ICE9PSB0cmFuc2Zlci5jaHVua3MgfHwgdHlwZW9mIHZhbHVlLmRhdGEgIT09ICJzdHJpbmciIHx8IHZhbHVlLmRhdGEubGVuZ3RoID4gQ0hVTksgKiA0IC8gMykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBmcm9tQmFzZTY0KHZhbHVlLmRhdGEpOwogICAgICAgICAgICBjb25zdCBhID0gdHJhbnNmZXIubWVzc2FnZS5tZXRhZGF0YV9qc29uLmF0dGFjaG1lbnQ7CiAgICAgICAgICAgIGlmICghY2h1bmsubGVuZ3RoIHx8IHRyYW5zZmVyLnJlY2VpdmVkICsgY2h1bmsubGVuZ3RoID4gYS5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluYm91bmQuZGVsZXRlKHZhbHVlLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cmFuc2Zlci5wYXJ0cy5wdXNoKGNodW5rKTsKICAgICAgICAgICAgdHJhbnNmZXIucmVjZWl2ZWQgKz0gY2h1bmsubGVuZ3RoOwogICAgICAgICAgICB0cmFuc2Zlci5jaHVua3MrKzsKICAgICAgICAgICAgdHJhbnNmZXIudG91Y2hlZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGlmICh0cmFuc2Zlci5yZWNlaXZlZCA9PT0gYS5zaXplKSB7CiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IodHJhbnNmZXIucGFydHMpOwogICAgICAgICAgICAgICAgaWYgKGF3YWl0IGhhc2goYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKSAhPT0gYS5zaGEyNTYpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmQuZGVsZXRlKHZhbHVlLmlkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuaWh+S7tuagoemqjOWksei0pe+8jOacquS/neWtmOaWh+S7tuOAgiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlRmlsZSh2YWx1ZS5pZCwgZmlsZSk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFjY2VwdE1lc3NhZ2UocGVlciwgdHJhbnNmZXIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICB0aGlzLmluYm91bmQuZGVsZXRlKHZhbHVlLmlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGFzeW5jIGFjY2VwdE1lc3NhZ2UocGVlciwgd2lyZSkgewogICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuc3RvcmUuZmluZCh3aXJlLmlkKSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY29uc3QgbWVtYmVycyA9IHRoaXMuc25hcHNob3QuY29udmVyc2F0aW9ucy5maW5kKGMgPT4gYy5pZCA9PT0gd2lyZS5jb252ZXJzYXRpb25faWQpLnBhcnRpY2lwYW50czsKICAgICAgICAgICAgLy8gTmV2ZXIgdHJ1c3QgYSByZW1vdGUgYXR0YWNobWVudCBVUkwgb3IgbGFiZWwgZm9yIHRoZSBzZW5kZXIgaWRlbnRpdHkuCiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0ge307CiAgICAgICAgICAgIGlmICh3aXJlLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhID0gd2lyZS5tZXRhZGF0YV9qc29uLmF0dGFjaG1lbnQ7CiAgICAgICAgICAgICAgICBtZXRhZGF0YS5hdHRhY2htZW50ID0geyBvcmlnaW5hbF9uYW1lOiBTdHJpbmcoYS5vcmlnaW5hbF9uYW1lKSwgc2l6ZTogTnVtYmVyKGEuc2l6ZSksIGNvbnRlbnRfdHlwZTogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsIHNoYTI1NjogU3RyaW5nKGEuc2hhMjU2KSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3aXJlLm1lc3NhZ2VfdHlwZSA9PT0gImxvY2F0aW9uIikgewogICAgICAgICAgICAgICAgY29uc3QgcCA9IHdpcmUubWV0YWRhdGFfanNvbi5sb2NhdGlvbjsKICAgICAgICAgICAgICAgIGlmIChwICYmIHR5cGVvZiBwLmxhdGl0dWRlID09PSAibnVtYmVyIiAmJiBNYXRoLmFicyhwLmxhdGl0dWRlKSA8PSA5MCAmJiB0eXBlb2YgcC5sb25naXR1ZGUgPT09ICJudW1iZXIiICYmIE1hdGguYWJzKHAubG9uZ2l0dWRlKSA8PSAxODApCiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubG9jYXRpb24gPSB7IGxhdGl0dWRlOiBwLmxhdGl0dWRlLCBsb25naXR1ZGU6IHAubG9uZ2l0dWRlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlKHsgaWQ6IGF3YWl0IHRoaXMuc3RvcmUubmV4dElkKCksIGRpcmVjdF9pZDogd2lyZS5pZCwgY29udmVyc2F0aW9uX2lkOiB3aXJlLmNvbnZlcnNhdGlvbl9pZCwgc2VuZGVyX3VzZXJfaWQ6IHdpcmUuc2VuZGVyX3VzZXJfaWQsCiAgICAgICAgICAgICAgICBzZW5kZXJfbmFtZTogbWVtYmVycy5maW5kKHAgPT4gcC51c2VyX2lkID09PSB3aXJlLnNlbmRlcl91c2VyX2lkKT8uZGlzcGxheV9uYW1lIHx8ICLogZTns7vkuroiLCBjb250ZW50OiB3aXJlLmNvbnRlbnQsIG1lc3NhZ2VfdHlwZTogd2lyZS5tZXNzYWdlX3R5cGUsIGNyZWF0ZWRfYXQ6IHdpcmUuY3JlYXRlZF9hdCwKICAgICAgICAgICAgICAgIG1ldGFkYXRhX2pzb246IG1ldGFkYXRhLCByZWNpcGllbnRfaWRzOiBbXSwgZGVsaXZlcmVkX3RvOiBbXSwgaXNfbWluZTogZmFsc2UsIGxvY2FsX3N0YXR1czogInNlbnQiIH0pOwogICAgICAgIH0pOwogICAgICAgIHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7CiAgICAgICAgYXdhaXQgdGhpcy53cml0ZShwZWVyLCB7IHR5cGU6ICJhY2siLCBpZDogd2lyZS5pZCB9KTsKICAgIH0KICAgIGFzeW5jIHNlbmQoY29udmVyc2F0aW9uLCBjb250ZW50LCBtZXNzYWdlVHlwZSA9ICJ0ZXh0IiwgbWV0YWRhdGEgPSB7fSwgZmlsZSkgewogICAgICAgIGlmICghdGhpcy5hbGl2ZSB8fCAhdGhpcy5zdG9yZSB8fCAhdGhpcy5zbmFwc2hvdCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLov57mjqXlt7Lnu5PmnZ/vvIzor7fph43mlrDmiZPlvIDogYrlpKnjgIIiKTsKICAgICAgICBjb25zdCBjID0gdGhpcy5zbmFwc2hvdC5jb252ZXJzYXRpb25zLmZpbmQoYyA9PiBjLmlkID09PSBjb252ZXJzYXRpb24pOwogICAgICAgIGlmICghYyB8fCBjb250ZW50Lmxlbmd0aCA+IDQwMDAgfHwgIWNvbnRlbnQudHJpbSgpKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuivt+mAieaLqeS8muivne+8jOa2iOaBr+S4jeiDvei2hei/hyA0MDAwIOS4quWtl+OAgiIpOwogICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBjLnBhcnRpY2lwYW50cy5tYXAocCA9PiBwLnVzZXJfaWQpLmZpbHRlcihpZCA9PiBpZCAhPT0gdGhpcy5zdG9yZS5hY2NvdW50KTsKICAgICAgICBpZiAoIXJlY2lwaWVudHMubGVuZ3RoIHx8IHJlY2lwaWVudHMuc29tZShwZWVyID0+ICF0aGlzLmFsbG93ZWQocGVlciwgY29udmVyc2F0aW9uKSkpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi6K+36YeN5paw6L+e5o6l5bm256Gu6K6k5Lya6K+d5oiQ5ZGY5ZCO5Y+R6YCB44CCIik7CiAgICAgICAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpOwogICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgIGlmICghZmlsZS5zaXplIHx8IGZpbGUuc2l6ZSA+IE1BWF9GSUxFKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLmlofku7blpKflsI/pnIDlnKggMSDlrZfoioLoh7MgMjUgTUIg5LmL6Ze044CCIik7CiAgICAgICAgICAgIG1ldGFkYXRhID0geyBhdHRhY2htZW50OiB7IG9yaWdpbmFsX25hbWU6IGZpbGUubmFtZS5zbGljZSgwLCAyNDApLCBzaXplOiBmaWxlLnNpemUsIGNvbnRlbnRfdHlwZTogZmlsZS50eXBlIHx8ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCBzaGEyNTY6IGF3YWl0IGhhc2goYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKSB9IH07CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2F2ZUZpbGUoaWQsIGZpbGUpOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnN0b3JlLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHIgPSB7IGlkOiBhd2FpdCB0aGlzLnN0b3JlLm5leHRJZCgpLCBkaXJlY3RfaWQ6IGlkLCBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbiwgc2VuZGVyX3VzZXJfaWQ6IHRoaXMuc3RvcmUuYWNjb3VudCwKICAgICAgICAgICAgICAgIHNlbmRlcl9uYW1lOiB0aGlzLnNuYXBzaG90LnVzZXIuZGlzcGxheV9uYW1lLCBjb250ZW50LCBtZXNzYWdlX3R5cGU6IG1lc3NhZ2VUeXBlLCBjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIG1ldGFkYXRhX2pzb246IG1ldGFkYXRhLAogICAgICAgICAgICAgICAgcmVjaXBpZW50X2lkczogcmVjaXBpZW50cywgZGVsaXZlcmVkX3RvOiBbXSwgaXNfbWluZTogdHJ1ZSwgbG9jYWxfc3RhdHVzOiAic2VuZGluZyIgfTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlKHIpOwogICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICB9KTsKICAgICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOwogICAgICAgIGZvciAoY29uc3QgcGVlciBvZiBBcnJheS5mcm9tKHRoaXMucGVlcnMudmFsdWVzKCkpKQogICAgICAgICAgICBpZiAocGVlci5yZWFkeSkKICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5wdW1wKHBlZXIpOwogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICBhc3luYyBtZXNzYWdlcyhjb252ZXJzYXRpb24pIHsKICAgICAgICBpZiAoIXRoaXMuc3RvcmUpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5zdG9yZS5saXN0KGNvbnZlcnNhdGlvbik7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJvd3MubWFwKGFzeW5jIChyKSA9PiB7CiAgICAgICAgICAgIGlmIChyLm1lc3NhZ2VfdHlwZSAhPT0gImZpbGUiKQogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIGNvbnN0IGEgPSByLm1ldGFkYXRhX2pzb24uYXR0YWNobWVudDsKICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5zdG9yZS5maWxlVXJsKHIuZGlyZWN0X2lkLCBTdHJpbmcoYS5jb250ZW50X3R5cGUgfHwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKTsKICAgICAgICAgICAgcmV0dXJuIHsgLi4uciwgbWV0YWRhdGFfanNvbjogeyAuLi5yLm1ldGFkYXRhX2pzb24sIGF0dGFjaG1lbnQ6IHsgLi4uYSwgdXJsIH0gfSB9OwogICAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIGNvbnZlcnNhdGlvblZpZXdzKGl0ZW1zKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0b3JlKQogICAgICAgICAgICByZXR1cm4gaXRlbXM7CiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCB0aGlzLnN0b3JlLmxpc3QoKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaXRlbXMubWFwKGFzeW5jIChjKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJvd3MgPSBtZXNzYWdlcy5maWx0ZXIociA9PiByLmNvbnZlcnNhdGlvbl9pZCA9PT0gYy5pZCk7CiAgICAgICAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCB0aGlzLnN0b3JlLnJlYWRBdChjLmlkKTsKICAgICAgICAgICAgY29uc3QgbGFzdCA9IHJvd3MuYXQoLTEpOwogICAgICAgICAgICByZXR1cm4geyAuLi5jLCBsYXN0X21lc3NhZ2U6IGxhc3QgfHwgbnVsbCwgbGFzdF9tZXNzYWdlX2F0OiBsYXN0Py5jcmVhdGVkX2F0IHx8IG51bGwsIHVucmVhZF9jb3VudDogcm93cy5maWx0ZXIociA9PiAhci5pc19taW5lICYmIHIuaWQgPiByZWFkKS5sZW5ndGggfTsKICAgICAgICB9KSk7CiAgICB9CiAgICBzdGF0dXMoY29udmVyc2F0aW9uKSB7CiAgICAgICAgY29uc3QgaWRzID0gdGhpcy5zbmFwc2hvdD8uY29udmVyc2F0aW9ucy5maW5kKGMgPT4gYy5pZCA9PT0gY29udmVyc2F0aW9uKT8ucGFydGljaXBhbnRzLmZpbHRlcihwID0+IHAudXNlcl9pZCAhPT0gdGhpcy5zdG9yZT8uYWNjb3VudCkubWFwKHAgPT4gcC51c2VyX2lkKSB8fCBbXTsKICAgICAgICBjb25zdCBvbmxpbmUgPSBpZHMuZmlsdGVyKGlkID0+IHRoaXMucGVlcnMuZ2V0KGlkKT8ucmVhZHkpLmxlbmd0aDsKICAgICAgICByZXR1cm4gb25saW5lID09PSBpZHMubGVuZ3RoICYmIG9ubGluZSA+IDAgPyAi6K6+5aSH5bey55u06L+eIiA6IG9ubGluZSA+IDAgPyBgJHtvbmxpbmV9LyR7aWRzLmxlbmd0aH0g5L2N5oiQ5ZGY5bey55u06L+eYCA6ICLnrYnlvoXlr7nmlrnkuIrnur/miJbnvZHnu5znm7Tov54iOwogICAgfQogICAgY2xvc2VQZWVyKHVpZCwgcGVlcikgeyBwZWVyLmNoYW5uZWw/LmNsb3NlKCk7IHBlZXIucGMuY2xvc2UoKTsgdGhpcy5wZWVycy5kZWxldGUodWlkKTsgfQogICAgZGlzY29ubmVjdFBlZXJzKCkgeyBmb3IgKGNvbnN0IFt1aWQsIHBlZXJdIG9mIEFycmF5LmZyb20odGhpcy5wZWVycykpCiAgICAgICAgdGhpcy5jbG9zZVBlZXIodWlkLCBwZWVyKTsgfQogICAgc3RvcCgpIHsgdGhpcy5hbGl2ZSA9IGZhbHNlOyBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7IHRoaXMuZGlzY29ubmVjdFBlZXJzKCk7IHRoaXMuaW5ib3VuZC5jbGVhcigpOyB0aGlzLnJlbGVhc2VkPy4oKTsgdGhpcy5zdG9yZT8uY2xvc2UoKTsgdGhpcy5vcHRpb25zLmRldmljZUNvbnRyb2w/LmNsb3NlKCk7IH0KfQphc3luYyBmdW5jdGlvbiBoYXNoKGRhdGEpIHsgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLCBkYXRhKSksIGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgIjAiKSkuam9pbigiIik7IH0K",
      "src/storage.ts": "ZXhwb3J0IHR5cGUgQ2hhdFJlY29yZCA9IHsNCiAgaWQ6IG51bWJlcjsgZGlyZWN0X2lkOiBzdHJpbmc7IGNvbnZlcnNhdGlvbl9pZDogbnVtYmVyOyBzZW5kZXJfdXNlcl9pZDogbnVtYmVyOw0KICBzZW5kZXJfbmFtZT86IHN0cmluZzsgY29udGVudDogc3RyaW5nOyBtZXNzYWdlX3R5cGU6IHN0cmluZzsgY3JlYXRlZF9hdDogc3RyaW5nOw0KICBtZXRhZGF0YV9qc29uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgcmVjaXBpZW50X2lkczogbnVtYmVyW107IGRlbGl2ZXJlZF90bzogbnVtYmVyW107DQogIGlzX21pbmU6IGJvb2xlYW47IGxvY2FsX3N0YXR1czogInNlbmRpbmciIHwgInNlbnQiOw0KfTsNCnR5cGUgQ2lwaGVyID0geyBpdjogQXJyYXlCdWZmZXI7IGRhdGE6IEFycmF5QnVmZmVyIH07DQpjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpOw0KY29uc3QgdGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpOw0KZnVuY3Rpb24gZG9uZTxUPihyZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7IHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTsgfSk7DQp9DQpmdW5jdGlvbiBjb21taXR0ZWQodHg6IElEQlRyYW5zYWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IHR4Lm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7IHR4Lm9uYWJvcnQgPSB0eC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHR4LmVycm9yIHx8IG5ldyBFcnJvcigi5pys5py65L+d5a2Y5aSx6LSlIikpOyB9KTsNCn0NCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KGtleTogQ3J5cHRvS2V5LCBpbnB1dDogQXJyYXlCdWZmZXIpOiBQcm9taXNlPENpcGhlcj4gew0KICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTsNCiAgcmV0dXJuIHsgaXY6IGl2LmJ1ZmZlciwgZGF0YTogYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHsgbmFtZTogIkFFUy1HQ00iLCBpdiB9LCBrZXksIGlucHV0KSB9Ow0KfQ0KYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChrZXk6IENyeXB0b0tleSwgaW5wdXQ6IENpcGhlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHsNCiAgcmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7IG5hbWU6ICJBRVMtR0NNIiwgaXY6IGlucHV0Lml2IH0sIGtleSwgaW5wdXQuZGF0YSk7DQp9DQpleHBvcnQgY2xhc3MgTG9jYWxDaGF0U3RvcmUgew0KICBwcml2YXRlIGRiITogSURCRGF0YWJhc2U7DQogIHByaXZhdGUga2V5ITogQ3J5cHRvS2V5Ow0KICBwcml2YXRlIHNlcmlhbDogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpOw0KICBwcml2YXRlIHVybHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpOw0KICBjb25zdHJ1Y3RvcihyZWFkb25seSBhY2NvdW50OiBudW1iZXIpIHt9DQogIGFzeW5jIG9wZW4oKSB7DQogICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih0aGlzLmFjY291bnQpIHx8IHRoaXMuYWNjb3VudCA8PSAwIHx8ICFjcnlwdG8uc3VidGxlIHx8ICFpbmRleGVkREIpIHRocm93IG5ldyBFcnJvcigi6K+355m75b2V5bm25L2/55So5pSv5oyB5pys5Zyw5a2Y5YKo55qE5a6J5YWo5rWP6KeI5Zmo44CCIik7DQogICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKGB6aHVnZS1kaXJlY3QtaW0tdjEtJHt0aGlzLmFjY291bnR9YCwgMSk7DQogICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7IGZvciAoY29uc3QgbmFtZSBvZiBbImtleXMiLCAibWVzc2FnZXMiLCAiZmlsZXMiLCAic3RhdGUiXSkgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUobmFtZSk7IH07DQogICAgdGhpcy5kYiA9IGF3YWl0IGRvbmUocmVxdWVzdCk7DQogICAgdGhpcy5kYi5vbnZlcnNpb25jaGFuZ2UgPSAoKSA9PiB0aGlzLmNsb3NlKCk7DQogICAgY29uc3QgY2FuZGlkYXRlID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleSh7IG5hbWU6ICJBRVMtR0NNIiwgbGVuZ3RoOiAyNTYgfSwgZmFsc2UsIFsiZW5jcnlwdCIsICJkZWNyeXB0Il0pOw0KICAgIGNvbnN0IHR4ID0gdGhpcy5kYi50cmFuc2FjdGlvbigia2V5cyIsICJyZWFkd3JpdGUiKTsNCiAgICBjb25zdCByZWFkeSA9IGNvbW1pdHRlZCh0eCk7DQogICAgY29uc3Qgc3RvcmUgPSB0eC5vYmplY3RTdG9yZSgia2V5cyIpOw0KICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgZG9uZShzdG9yZS5nZXQoImxvY2FsIikpOw0KICAgIHRoaXMua2V5ID0gZXhpc3RpbmcgfHwgY2FuZGlkYXRlOw0KICAgIGlmICghZXhpc3RpbmcpIHN0b3JlLnB1dChjYW5kaWRhdGUsICJsb2NhbCIpOw0KICAgIGF3YWl0IHJlYWR5Ow0KICB9DQogIHByaXZhdGUgYXN5bmMgZ2V0PFQ+KHN0b3JlOiBzdHJpbmcsIGlkOiBJREJWYWxpZEtleSk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4gew0KICAgIHJldHVybiBkb25lKHRoaXMuZGIudHJhbnNhY3Rpb24oc3RvcmUpLm9iamVjdFN0b3JlKHN0b3JlKS5nZXQoaWQpKTsNCiAgfQ0KICBwcml2YXRlIGFzeW5jIHB1dChzdG9yZTogc3RyaW5nLCBpZDogSURCVmFsaWRLZXksIHZhbHVlOiB1bmtub3duKSB7DQogICAgY29uc3QgdHggPSB0aGlzLmRiLnRyYW5zYWN0aW9uKHN0b3JlLCAicmVhZHdyaXRlIik7IGNvbnN0IHJlc3VsdCA9IGNvbW1pdHRlZCh0eCk7DQogICAgdHgub2JqZWN0U3RvcmUoc3RvcmUpLnB1dCh2YWx1ZSwgaWQpOyBhd2FpdCByZXN1bHQ7DQogIH0NCiAgZXhjbHVzaXZlPFQ+KGpvYjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4gew0KICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsLnRoZW4oam9iKTsgdGhpcy5zZXJpYWwgPSByZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTsgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KICBhc3luYyBmaW5kKGlkOiBzdHJpbmcpOiBQcm9taXNlPENoYXRSZWNvcmQgfCB1bmRlZmluZWQ+IHsNCiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZ2V0PENpcGhlcj4oIm1lc3NhZ2VzIiwgaWQpOw0KICAgIHJldHVybiB2YWx1ZSA/IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdCh0aGlzLmtleSwgdmFsdWUpKSkgOiB1bmRlZmluZWQ7DQogIH0NCiAgYXN5bmMgc2F2ZShyZWNvcmQ6IENoYXRSZWNvcmQpIHsNCiAgICBhd2FpdCB0aGlzLnB1dCgibWVzc2FnZXMiLCByZWNvcmQuZGlyZWN0X2lkLCBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBieXRlcy5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocmVjb3JkKSkuYnVmZmVyKSk7DQogIH0NCiAgYXN5bmMgbmV4dElkKCkgew0KICAgIGNvbnN0IG9sZCA9IGF3YWl0IHRoaXMuZ2V0PG51bWJlcj4oInN0YXRlIiwgImNvdW50ZXIiKSB8fCAwOw0KICAgIGNvbnN0IGlkID0gTWF0aC5tYXgoRGF0ZS5ub3coKSAqIDEwMDAsIG9sZCArIDEpOw0KICAgIGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsICJjb3VudGVyIiwgaWQpOyByZXR1cm4gaWQ7DQogIH0NCiAgYXN5bmMgbGlzdChjb252ZXJzYXRpb24/OiBudW1iZXIpOiBQcm9taXNlPENoYXRSZWNvcmRbXT4gew0KICAgIGNvbnN0IGFsbDogQ2lwaGVyW10gPSBhd2FpdCBkb25lKHRoaXMuZGIudHJhbnNhY3Rpb24oIm1lc3NhZ2VzIikub2JqZWN0U3RvcmUoIm1lc3NhZ2VzIikuZ2V0QWxsKCkpOw0KICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBQcm9taXNlLmFsbChhbGwubWFwKGFzeW5jIHZhbHVlID0+IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdCh0aGlzLmtleSwgdmFsdWUpKSkgYXMgQ2hhdFJlY29yZCkpOw0KICAgIHJldHVybiByZWNvcmRzLmZpbHRlcihyID0+IGNvbnZlcnNhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHIuY29udmVyc2F0aW9uX2lkID09PSBjb252ZXJzYXRpb24pLnNvcnQoKGEsYikgPT4gYS5pZC1iLmlkKTsNCiAgfQ0KICBhc3luYyBzYXZlRmlsZShpZDogc3RyaW5nLCBmaWxlOiBCbG9iKSB7IGF3YWl0IHRoaXMucHV0KCJmaWxlcyIsIGlkLCBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCkpKTsgfQ0KICBhc3luYyBmaWxlKGlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgdW5kZWZpbmVkPiB7IGNvbnN0IGYgPSBhd2FpdCB0aGlzLmdldDxDaXBoZXI+KCJmaWxlcyIsIGlkKTsgcmV0dXJuIGYgPyBkZWNyeXB0KHRoaXMua2V5LCBmKSA6IHVuZGVmaW5lZDsgfQ0KICBhc3luYyBmaWxlVXJsKGlkOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7DQogICAgaWYgKHRoaXMudXJscy5oYXMoaWQpKSByZXR1cm4gdGhpcy51cmxzLmdldChpZCk7DQogICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmlsZShpZCk7IGlmICghZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlIH0pKTsgdGhpcy51cmxzLnNldChpZCwgdXJsKTsgcmV0dXJuIHVybDsNCiAgfQ0KICBhc3luYyBtYXJrUmVhZChjb252ZXJzYXRpb246IG51bWJlcikgeyBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5saXN0KGNvbnZlcnNhdGlvbik7IGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsIGByZWFkLSR7Y29udmVyc2F0aW9ufWAsIHJlY29yZHMuYXQoLTEpPy5pZCB8fCAwKTsgfQ0KICBhc3luYyByZWFkQXQoY29udmVyc2F0aW9uOiBudW1iZXIpIHsgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0PG51bWJlcj4oInN0YXRlIiwgYHJlYWQtJHtjb252ZXJzYXRpb259YCkgfHwgMDsgfQ0KICBhc3luYyBwZXJzaXN0UHJlZmVyZW5jZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7IGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsIG5hbWUsIHZhbHVlKTsgfQ0KICBhc3luYyBwcmVmZXJlbmNlPFQ+KG5hbWU6IHN0cmluZykgeyByZXR1cm4gdGhpcy5nZXQ8VD4oInN0YXRlIiwgbmFtZSk7IH0NCiAgYXN5bmMgYmFja3VwKHBhc3NwaHJhc2U6IHN0cmluZyk6IFByb21pc2U8QmxvYj4gew0KICAgIGlmIChwYXNzcGhyYXNlLmxlbmd0aCA8IDEwKSB0aHJvdyBuZXcgRXJyb3IoIuWkh+S7veWvhueggeiHs+WwkemcgOimgSAxMCDkuKrlrZfnrKbjgIIiKTsNCiAgICBjb25zdCBzYWx0ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpOw0KICAgIGNvbnN0IGJhc2UgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IiwgYnl0ZXMuZW5jb2RlKHBhc3NwaHJhc2UpLCAiUEJLREYyIiwgZmFsc2UsIFsiZGVyaXZlS2V5Il0pOw0KICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KHsgbmFtZTogIlBCS0RGMiIsIHNhbHQsIGl0ZXJhdGlvbnM6IDI1MDAwMCwgaGFzaDogIlNIQS0yNTYiIH0sIGJhc2UsIHsgbmFtZTogIkFFUy1HQ00iLCBsZW5ndGg6IDI1NiB9LCBmYWxzZSwgWyJlbmNyeXB0Il0pOw0KICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmxpc3QoKTsNCiAgICBjb25zdCBmaWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9Ow0KICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRzLmZpbHRlcihyID0+IHIubWVzc2FnZV90eXBlID09PSAiZmlsZSIpKSB7IGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZpbGUoci5kaXJlY3RfaWQpOyBpZiAoZGF0YSkgZmlsZXNbci5kaXJlY3RfaWRdID0gdG9CYXNlNjQobmV3IFVpbnQ4QXJyYXkoZGF0YSkpOyB9DQogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5jcnlwdChrZXksIGJ5dGVzLmVuY29kZShKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDEsIGFjY291bnQ6IHRoaXMuYWNjb3VudCwgcmVjb3JkcywgZmlsZXMgfSkpLmJ1ZmZlcik7DQogICAgcmV0dXJuIG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogInpodWdlLWRpcmVjdC1pbS1iYWNrdXAtdjEiLCBzYWx0OiB0b0Jhc2U2NChzYWx0KSwgaXY6IHRvQmFzZTY0KG5ldyBVaW50OEFycmF5KHJlc3VsdC5pdikpLCBkYXRhOiB0b0Jhc2U2NChuZXcgVWludDhBcnJheShyZXN1bHQuZGF0YSkpIH0pXSwgeyB0eXBlOiAiYXBwbGljYXRpb24vanNvbiIgfSk7DQogIH0NCiAgYXN5bmMgcmVzdG9yZShmaWxlOiBGaWxlLCBwYXNzcGhyYXNlOiBzdHJpbmcpIHsNCiAgICBpZiAoZmlsZS5zaXplID4gMjU2ICogMTAyNCAqIDEwMjQpIHRocm93IG5ldyBFcnJvcigi5q2k5aSH5Lu96L+H5aSn77yM6K+35YiG5om55oGi5aSN44CCIik7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShhd2FpdCBmaWxlLnRleHQoKSk7DQogICAgICBpZiAoZW52ZWxvcGUuZm9ybWF0ICE9PSAiemh1Z2UtZGlyZWN0LWltLWJhY2t1cC12MSIpIHRocm93IG5ldyBFcnJvcigpOw0KICAgICAgY29uc3QgYmFzZSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLCBieXRlcy5lbmNvZGUocGFzc3BocmFzZSksICJQQktERjIiLCBmYWxzZSwgWyJkZXJpdmVLZXkiXSk7DQogICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleSh7IG5hbWU6ICJQQktERjIiLCBzYWx0OiBmcm9tQmFzZTY0KGVudmVsb3BlLnNhbHQpLCBpdGVyYXRpb25zOiAyNTAwMDAsIGhhc2g6ICJTSEEtMjU2IiB9LCBiYXNlLCB7IG5hbWU6ICJBRVMtR0NNIiwgbGVuZ3RoOiAyNTYgfSwgZmFsc2UsIFsiZGVjcnlwdCJdKTsNCiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHRleHQuZGVjb2RlKGF3YWl0IGRlY3J5cHQoa2V5LCB7IGl2OiBmcm9tQmFzZTY0KGVudmVsb3BlLml2KS5idWZmZXIsIGRhdGE6IGZyb21CYXNlNjQoZW52ZWxvcGUuZGF0YSkuYnVmZmVyIH0pKSk7DQogICAgICBpZiAoZGF0YS52ZXJzaW9uICE9PSAxIHx8IGRhdGEuYWNjb3VudCAhPT0gdGhpcy5hY2NvdW50IHx8ICFBcnJheS5pc0FycmF5KGRhdGEucmVjb3JkcykgfHwgIWRhdGEuZmlsZXMgfHwgdHlwZW9mIGRhdGEuZmlsZXMgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBuZXcgU2V0PHN0cmluZz4oKTsKICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzIGFzIENoYXRSZWNvcmRbXSkgewogICAgICAgIGlmICghcmVjb3JkIHx8ICEvXlthLWYwLTktXXszNn0kL2kudGVzdChyZWNvcmQuZGlyZWN0X2lkKSB8fCBpZGVudGlmaWVycy5oYXMocmVjb3JkLmRpcmVjdF9pZCkKICAgICAgICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWNvcmQuY29udmVyc2F0aW9uX2lkKSB8fCByZWNvcmQuY29udmVyc2F0aW9uX2lkIDw9IDAKICAgICAgICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWNvcmQuc2VuZGVyX3VzZXJfaWQpIHx8IHJlY29yZC5zZW5kZXJfdXNlcl9pZCA8PSAwCiAgICAgICAgICB8fCB0eXBlb2YgcmVjb3JkLmNvbnRlbnQgIT09ICJzdHJpbmciIHx8IHJlY29yZC5jb250ZW50Lmxlbmd0aCA+IDQwMDAKICAgICAgICAgIHx8ICFbInRleHQiLCJmaWxlIiwibG9jYXRpb24iLCJjYWxsIl0uaW5jbHVkZXMocmVjb3JkLm1lc3NhZ2VfdHlwZSkKICAgICAgICAgIHx8ICFOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShyZWNvcmQuY3JlYXRlZF9hdCkpIHx8ICFyZWNvcmQubWV0YWRhdGFfanNvbiB8fCB0eXBlb2YgcmVjb3JkLm1ldGFkYXRhX2pzb24gIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICBpZGVudGlmaWVycy5hZGQocmVjb3JkLmRpcmVjdF9pZCk7CiAgICAgICAgaWYgKHJlY29yZC5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIiAmJiB0eXBlb2YgZGF0YS5maWxlc1tyZWNvcmQuZGlyZWN0X2lkXSAhPT0gInN0cmluZyIpIHRocm93IG5ldyBFcnJvcigpOwogICAgICB9CiAgICAgIC8vIFJlc3RvcmVkIG91dGdvaW5nIHJlY29yZHMgYXJlIGhpc3RvcnksIG5vdCBhIGNvbW1hbmQgdG8gc2VuZCB0byBmb3JtZXIgY29udGFjdHMgYWdhaW4uCiAgICAgIGF3YWl0IHRoaXMuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBzdGFnZWQ6IHsgaWQ6IHN0cmluZzsgcmVjb3JkOiBDaXBoZXI7IGZpbGU/OiBDaXBoZXIgfVtdID0gW107CiAgICAgICAgbGV0IGNvdW50ZXIgPSBNYXRoLm1heChEYXRlLm5vdygpKjEwMDAsIChhd2FpdCB0aGlzLmdldDxudW1iZXI+KCJzdGF0ZSIsICJjb3VudGVyIikgfHwgMCkrMSk7CiAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzIGFzIENoYXRSZWNvcmRbXSkgewogICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZmluZChyZWNvcmQuZGlyZWN0X2lkKSkgY29udGludWU7CiAgICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSByZWNvcmQubWVzc2FnZV90eXBlID09PSAiZmlsZSIgPyBmcm9tQmFzZTY0KGRhdGEuZmlsZXNbcmVjb3JkLmRpcmVjdF9pZF0pIDogdW5kZWZpbmVkOwogICAgICAgICAgaWYgKGZpbGVCeXRlcyAmJiBmaWxlQnl0ZXMubGVuZ3RoID4gMjUqMTAyNCoxMDI0KSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgIGNvbnN0IHJlc3RvcmVkID0geyAuLi5yZWNvcmQsIGlkOiBjb3VudGVyKyssIGlzX21pbmU6IHJlY29yZC5zZW5kZXJfdXNlcl9pZCA9PT0gdGhpcy5hY2NvdW50LCByZWNpcGllbnRfaWRzOiBbXSwgZGVsaXZlcmVkX3RvOiBbXSwgbG9jYWxfc3RhdHVzOiAic2VudCIgfTsKICAgICAgICAgIHN0YWdlZC5wdXNoKHtpZDpyZWNvcmQuZGlyZWN0X2lkLCByZWNvcmQ6YXdhaXQgZW5jcnlwdCh0aGlzLmtleSwgYnl0ZXMuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHJlc3RvcmVkKSkuYnVmZmVyKSwgZmlsZTpmaWxlQnl0ZXMgPyBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LGZpbGVCeXRlcy5idWZmZXIpIDogdW5kZWZpbmVkfSk7CiAgICAgICAgfQogICAgICAgIC8vIEVuY3J5cHQgYW5kIHZhbGlkYXRlIGV2ZXJ5dGhpbmcgYmVmb3JlIG9wZW5pbmcgdGhlIHNpbmdsZSBhdG9taWMgd3JpdGUgdHJhbnNhY3Rpb24uCiAgICAgICAgY29uc3QgdHggPSB0aGlzLmRiLnRyYW5zYWN0aW9uKFsibWVzc2FnZXMiLCAiZmlsZXMiLCAic3RhdGUiXSwgInJlYWR3cml0ZSIpOwogICAgICAgIGNvbnN0IHJlYWR5ID0gY29tbWl0dGVkKHR4KTsKICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHR4Lm9iamVjdFN0b3JlKCJtZXNzYWdlcyIpOwogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzdGFnZWQpIHsKICAgICAgICAgIGlmIChhd2FpdCBkb25lKG1lc3NhZ2VzLmdldChpdGVtLmlkKSkpIGNvbnRpbnVlOwogICAgICAgICAgbWVzc2FnZXMucHV0KGl0ZW0ucmVjb3JkLGl0ZW0uaWQpOwogICAgICAgICAgaWYgKGl0ZW0uZmlsZSkgdHgub2JqZWN0U3RvcmUoImZpbGVzIikucHV0KGl0ZW0uZmlsZSxpdGVtLmlkKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhdGUgPSB0eC5vYmplY3RTdG9yZSgic3RhdGUiKTsKICAgICAgICBzdGF0ZS5wdXQoTWF0aC5tYXgoY291bnRlciwgKGF3YWl0IGRvbmUoc3RhdGUuZ2V0KCJjb3VudGVyIikpKSB8fCAwKSwgImNvdW50ZXIiKTsKICAgICAgICBhd2FpdCByZWFkeTsKICAgICAgfSk7CiAgICB9IGNhdGNoIHsgdGhyb3cgbmV3IEVycm9yKCLlpIfku73lr4bnoIHjgIHmlofku7bmiJbmiYDlsZ7otKblj7fkuI3mraPnoa7vvIzmnKrmgaLlpI3or6XlpIfku73jgIIiKTsgfQ0KICB9DQogIGNsb3NlKCkgeyBmb3IgKGNvbnN0IHVybCBvZiBBcnJheS5mcm9tKHRoaXMudXJscy52YWx1ZXMoKSkpIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgdGhpcy51cmxzLmNsZWFyKCk7IHRoaXMuZGI/LmNsb3NlKCk7IH0NCn0NCmV4cG9ydCBmdW5jdGlvbiB0b0Jhc2U2NChkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHsNCiAgbGV0IHJlc3VsdCA9ICIiOyBmb3IgKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKz04MTkyKSByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5BcnJheS5mcm9tKGRhdGEuc3ViYXJyYXkoaSxpKzgxOTIpKSk7IHJldHVybiBidG9hKHJlc3VsdCk7DQp9DQpleHBvcnQgZnVuY3Rpb24gZnJvbUJhc2U2NCh2YWx1ZTogc3RyaW5nKTogVWludDhBcnJheTxBcnJheUJ1ZmZlcj4geyByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IodmFsdWUpLCBjID0+IGMuY2hhckNvZGVBdCgwKSk7IH0NCg==",
      "src/storage.js": "Y29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKTsKY29uc3QgdGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpOwpmdW5jdGlvbiBkb25lKHJlcXVlc3QpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7IHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTsgfSk7Cn0KZnVuY3Rpb24gY29tbWl0dGVkKHR4KSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyB0eC5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZSgpOyB0eC5vbmFib3J0ID0gdHgub25lcnJvciA9ICgpID0+IHJlamVjdCh0eC5lcnJvciB8fCBuZXcgRXJyb3IoIuacrOacuuS/neWtmOWksei0pSIpKTsgfSk7Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY3J5cHQoa2V5LCBpbnB1dCkgewogICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEyKSk7CiAgICByZXR1cm4geyBpdjogaXYuYnVmZmVyLCBkYXRhOiBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoeyBuYW1lOiAiQUVTLUdDTSIsIGl2IH0sIGtleSwgaW5wdXQpIH07Cn0KYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChrZXksIGlucHV0KSB7CiAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHsgbmFtZTogIkFFUy1HQ00iLCBpdjogaW5wdXQuaXYgfSwga2V5LCBpbnB1dC5kYXRhKTsKfQpleHBvcnQgY2xhc3MgTG9jYWxDaGF0U3RvcmUgewogICAgYWNjb3VudDsKICAgIGRiOwogICAga2V5OwogICAgc2VyaWFsID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB1cmxzID0gbmV3IE1hcCgpOwogICAgY29uc3RydWN0b3IoYWNjb3VudCkgewogICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CiAgICB9CiAgICBhc3luYyBvcGVuKCkgewogICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodGhpcy5hY2NvdW50KSB8fCB0aGlzLmFjY291bnQgPD0gMCB8fCAhY3J5cHRvLnN1YnRsZSB8fCAhaW5kZXhlZERCKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuivt+eZu+W9leW5tuS9v+eUqOaUr+aMgeacrOWcsOWtmOWCqOeahOWuieWFqOa1j+iniOWZqOOAgiIpOwogICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3Blbihgemh1Z2UtZGlyZWN0LWltLXYxLSR7dGhpcy5hY2NvdW50fWAsIDEpOwogICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4geyBmb3IgKGNvbnN0IG5hbWUgb2YgWyJrZXlzIiwgIm1lc3NhZ2VzIiwgImZpbGVzIiwgInN0YXRlIl0pCiAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKG5hbWUpOyB9OwogICAgICAgIHRoaXMuZGIgPSBhd2FpdCBkb25lKHJlcXVlc3QpOwogICAgICAgIHRoaXMuZGIub252ZXJzaW9uY2hhbmdlID0gKCkgPT4gdGhpcy5jbG9zZSgpOwogICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoeyBuYW1lOiAiQUVTLUdDTSIsIGxlbmd0aDogMjU2IH0sIGZhbHNlLCBbImVuY3J5cHQiLCAiZGVjcnlwdCJdKTsKICAgICAgICBjb25zdCB0eCA9IHRoaXMuZGIudHJhbnNhY3Rpb24oImtleXMiLCAicmVhZHdyaXRlIik7CiAgICAgICAgY29uc3QgcmVhZHkgPSBjb21taXR0ZWQodHgpOwogICAgICAgIGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoImtleXMiKTsKICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGRvbmUoc3RvcmUuZ2V0KCJsb2NhbCIpKTsKICAgICAgICB0aGlzLmtleSA9IGV4aXN0aW5nIHx8IGNhbmRpZGF0ZTsKICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICBzdG9yZS5wdXQoY2FuZGlkYXRlLCAibG9jYWwiKTsKICAgICAgICBhd2FpdCByZWFkeTsKICAgIH0KICAgIGFzeW5jIGdldChzdG9yZSwgaWQpIHsKICAgICAgICByZXR1cm4gZG9uZSh0aGlzLmRiLnRyYW5zYWN0aW9uKHN0b3JlKS5vYmplY3RTdG9yZShzdG9yZSkuZ2V0KGlkKSk7CiAgICB9CiAgICBhc3luYyBwdXQoc3RvcmUsIGlkLCB2YWx1ZSkgewogICAgICAgIGNvbnN0IHR4ID0gdGhpcy5kYi50cmFuc2FjdGlvbihzdG9yZSwgInJlYWR3cml0ZSIpOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1pdHRlZCh0eCk7CiAgICAgICAgdHgub2JqZWN0U3RvcmUoc3RvcmUpLnB1dCh2YWx1ZSwgaWQpOwogICAgICAgIGF3YWl0IHJlc3VsdDsKICAgIH0KICAgIGV4Y2x1c2l2ZShqb2IpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbC50aGVuKGpvYik7CiAgICAgICAgdGhpcy5zZXJpYWwgPSByZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgYXN5bmMgZmluZChpZCkgewogICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5nZXQoIm1lc3NhZ2VzIiwgaWQpOwogICAgICAgIHJldHVybiB2YWx1ZSA/IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdCh0aGlzLmtleSwgdmFsdWUpKSkgOiB1bmRlZmluZWQ7CiAgICB9CiAgICBhc3luYyBzYXZlKHJlY29yZCkgewogICAgICAgIGF3YWl0IHRoaXMucHV0KCJtZXNzYWdlcyIsIHJlY29yZC5kaXJlY3RfaWQsIGF3YWl0IGVuY3J5cHQodGhpcy5rZXksIGJ5dGVzLmVuY29kZShKU09OLnN0cmluZ2lmeShyZWNvcmQpKS5idWZmZXIpKTsKICAgIH0KICAgIGFzeW5jIG5leHRJZCgpIHsKICAgICAgICBjb25zdCBvbGQgPSBhd2FpdCB0aGlzLmdldCgic3RhdGUiLCAiY291bnRlciIpIHx8IDA7CiAgICAgICAgY29uc3QgaWQgPSBNYXRoLm1heChEYXRlLm5vdygpICogMTAwMCwgb2xkICsgMSk7CiAgICAgICAgYXdhaXQgdGhpcy5wdXQoInN0YXRlIiwgImNvdW50ZXIiLCBpZCk7CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQogICAgYXN5bmMgbGlzdChjb252ZXJzYXRpb24pIHsKICAgICAgICBjb25zdCBhbGwgPSBhd2FpdCBkb25lKHRoaXMuZGIudHJhbnNhY3Rpb24oIm1lc3NhZ2VzIikub2JqZWN0U3RvcmUoIm1lc3NhZ2VzIikuZ2V0QWxsKCkpOwogICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBQcm9taXNlLmFsbChhbGwubWFwKGFzeW5jICh2YWx1ZSkgPT4gSlNPTi5wYXJzZSh0ZXh0LmRlY29kZShhd2FpdCBkZWNyeXB0KHRoaXMua2V5LCB2YWx1ZSkpKSkpOwogICAgICAgIHJldHVybiByZWNvcmRzLmZpbHRlcihyID0+IGNvbnZlcnNhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHIuY29udmVyc2F0aW9uX2lkID09PSBjb252ZXJzYXRpb24pLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKTsKICAgIH0KICAgIGFzeW5jIHNhdmVGaWxlKGlkLCBmaWxlKSB7IGF3YWl0IHRoaXMucHV0KCJmaWxlcyIsIGlkLCBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCkpKTsgfQogICAgYXN5bmMgZmlsZShpZCkgeyBjb25zdCBmID0gYXdhaXQgdGhpcy5nZXQoImZpbGVzIiwgaWQpOyByZXR1cm4gZiA/IGRlY3J5cHQodGhpcy5rZXksIGYpIDogdW5kZWZpbmVkOyB9CiAgICBhc3luYyBmaWxlVXJsKGlkLCB0eXBlKSB7CiAgICAgICAgaWYgKHRoaXMudXJscy5oYXMoaWQpKQogICAgICAgICAgICByZXR1cm4gdGhpcy51cmxzLmdldChpZCk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmlsZShpZCk7CiAgICAgICAgaWYgKCFkYXRhKQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2RhdGFdLCB7IHR5cGUgfSkpOwogICAgICAgIHRoaXMudXJscy5zZXQoaWQsIHVybCk7CiAgICAgICAgcmV0dXJuIHVybDsKICAgIH0KICAgIGFzeW5jIG1hcmtSZWFkKGNvbnZlcnNhdGlvbikgeyBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5saXN0KGNvbnZlcnNhdGlvbik7IGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsIGByZWFkLSR7Y29udmVyc2F0aW9ufWAsIHJlY29yZHMuYXQoLTEpPy5pZCB8fCAwKTsgfQogICAgYXN5bmMgcmVhZEF0KGNvbnZlcnNhdGlvbikgeyByZXR1cm4gYXdhaXQgdGhpcy5nZXQoInN0YXRlIiwgYHJlYWQtJHtjb252ZXJzYXRpb259YCkgfHwgMDsgfQogICAgYXN5bmMgcGVyc2lzdFByZWZlcmVuY2UobmFtZSwgdmFsdWUpIHsgYXdhaXQgdGhpcy5wdXQoInN0YXRlIiwgbmFtZSwgdmFsdWUpOyB9CiAgICBhc3luYyBwcmVmZXJlbmNlKG5hbWUpIHsgcmV0dXJuIHRoaXMuZ2V0KCJzdGF0ZSIsIG5hbWUpOyB9CiAgICBhc3luYyBiYWNrdXAocGFzc3BocmFzZSkgewogICAgICAgIGlmIChwYXNzcGhyYXNlLmxlbmd0aCA8IDEwKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuWkh+S7veWvhueggeiHs+WwkemcgOimgSAxMCDkuKrlrZfnrKbjgIIiKTsKICAgICAgICBjb25zdCBzYWx0ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpOwogICAgICAgIGNvbnN0IGJhc2UgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IiwgYnl0ZXMuZW5jb2RlKHBhc3NwaHJhc2UpLCAiUEJLREYyIiwgZmFsc2UsIFsiZGVyaXZlS2V5Il0pOwogICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KHsgbmFtZTogIlBCS0RGMiIsIHNhbHQsIGl0ZXJhdGlvbnM6IDI1MDAwMCwgaGFzaDogIlNIQS0yNTYiIH0sIGJhc2UsIHsgbmFtZTogIkFFUy1HQ00iLCBsZW5ndGg6IDI1NiB9LCBmYWxzZSwgWyJlbmNyeXB0Il0pOwogICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmxpc3QoKTsKICAgICAgICBjb25zdCBmaWxlcyA9IHt9OwogICAgICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRzLmZpbHRlcihyID0+IHIubWVzc2FnZV90eXBlID09PSAiZmlsZSIpKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZpbGUoci5kaXJlY3RfaWQpOwogICAgICAgICAgICBpZiAoZGF0YSkKICAgICAgICAgICAgICAgIGZpbGVzW3IuZGlyZWN0X2lkXSA9IHRvQmFzZTY0KG5ldyBVaW50OEFycmF5KGRhdGEpKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5jcnlwdChrZXksIGJ5dGVzLmVuY29kZShKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDEsIGFjY291bnQ6IHRoaXMuYWNjb3VudCwgcmVjb3JkcywgZmlsZXMgfSkpLmJ1ZmZlcik7CiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogInpodWdlLWRpcmVjdC1pbS1iYWNrdXAtdjEiLCBzYWx0OiB0b0Jhc2U2NChzYWx0KSwgaXY6IHRvQmFzZTY0KG5ldyBVaW50OEFycmF5KHJlc3VsdC5pdikpLCBkYXRhOiB0b0Jhc2U2NChuZXcgVWludDhBcnJheShyZXN1bHQuZGF0YSkpIH0pXSwgeyB0eXBlOiAiYXBwbGljYXRpb24vanNvbiIgfSk7CiAgICB9CiAgICBhc3luYyByZXN0b3JlKGZpbGUsIHBhc3NwaHJhc2UpIHsKICAgICAgICBpZiAoZmlsZS5zaXplID4gMjU2ICogMTAyNCAqIDEwMjQpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi5q2k5aSH5Lu96L+H5aSn77yM6K+35YiG5om55oGi5aSN44CCIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZW52ZWxvcGUgPSBKU09OLnBhcnNlKGF3YWl0IGZpbGUudGV4dCgpKTsKICAgICAgICAgICAgaWYgKGVudmVsb3BlLmZvcm1hdCAhPT0gInpodWdlLWRpcmVjdC1pbS1iYWNrdXAtdjEiKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IiwgYnl0ZXMuZW5jb2RlKHBhc3NwaHJhc2UpLCAiUEJLREYyIiwgZmFsc2UsIFsiZGVyaXZlS2V5Il0pOwogICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleSh7IG5hbWU6ICJQQktERjIiLCBzYWx0OiBmcm9tQmFzZTY0KGVudmVsb3BlLnNhbHQpLCBpdGVyYXRpb25zOiAyNTAwMDAsIGhhc2g6ICJTSEEtMjU2IiB9LCBiYXNlLCB7IG5hbWU6ICJBRVMtR0NNIiwgbGVuZ3RoOiAyNTYgfSwgZmFsc2UsIFsiZGVjcnlwdCJdKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdChrZXksIHsgaXY6IGZyb21CYXNlNjQoZW52ZWxvcGUuaXYpLmJ1ZmZlciwgZGF0YTogZnJvbUJhc2U2NChlbnZlbG9wZS5kYXRhKS5idWZmZXIgfSkpKTsKICAgICAgICAgICAgaWYgKGRhdGEudmVyc2lvbiAhPT0gMSB8fCBkYXRhLmFjY291bnQgIT09IHRoaXMuYWNjb3VudCB8fCAhQXJyYXkuaXNBcnJheShkYXRhLnJlY29yZHMpIHx8ICFkYXRhLmZpbGVzIHx8IHR5cGVvZiBkYXRhLmZpbGVzICE9PSAib2JqZWN0IikKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzKSB7CiAgICAgICAgICAgICAgICBpZiAoIXJlY29yZCB8fCAhL15bYS1mMC05LV17MzZ9JC9pLnRlc3QocmVjb3JkLmRpcmVjdF9pZCkgfHwgaWRlbnRpZmllcnMuaGFzKHJlY29yZC5kaXJlY3RfaWQpCiAgICAgICAgICAgICAgICAgICAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlY29yZC5jb252ZXJzYXRpb25faWQpIHx8IHJlY29yZC5jb252ZXJzYXRpb25faWQgPD0gMAogICAgICAgICAgICAgICAgICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWNvcmQuc2VuZGVyX3VzZXJfaWQpIHx8IHJlY29yZC5zZW5kZXJfdXNlcl9pZCA8PSAwCiAgICAgICAgICAgICAgICAgICAgfHwgdHlwZW9mIHJlY29yZC5jb250ZW50ICE9PSAic3RyaW5nIiB8fCByZWNvcmQuY29udGVudC5sZW5ndGggPiA0MDAwCiAgICAgICAgICAgICAgICAgICAgfHwgIVsidGV4dCIsICJmaWxlIiwgImxvY2F0aW9uIiwgImNhbGwiXS5pbmNsdWRlcyhyZWNvcmQubWVzc2FnZV90eXBlKQogICAgICAgICAgICAgICAgICAgIHx8ICFOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShyZWNvcmQuY3JlYXRlZF9hdCkpIHx8ICFyZWNvcmQubWV0YWRhdGFfanNvbiB8fCB0eXBlb2YgcmVjb3JkLm1ldGFkYXRhX2pzb24gIT09ICJvYmplY3QiKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICAgICAgaWRlbnRpZmllcnMuYWRkKHJlY29yZC5kaXJlY3RfaWQpOwogICAgICAgICAgICAgICAgaWYgKHJlY29yZC5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIiAmJiB0eXBlb2YgZGF0YS5maWxlc1tyZWNvcmQuZGlyZWN0X2lkXSAhPT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzdG9yZWQgb3V0Z29pbmcgcmVjb3JkcyBhcmUgaGlzdG9yeSwgbm90IGEgY29tbWFuZCB0byBzZW5kIHRvIGZvcm1lciBjb250YWN0cyBhZ2Fpbi4KICAgICAgICAgICAgYXdhaXQgdGhpcy5leGNsdXNpdmUoYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgc3RhZ2VkID0gW107CiAgICAgICAgICAgICAgICBsZXQgY291bnRlciA9IE1hdGgubWF4KERhdGUubm93KCkgKiAxMDAwLCAoYXdhaXQgdGhpcy5nZXQoInN0YXRlIiwgImNvdW50ZXIiKSB8fCAwKSArIDEpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZmluZChyZWNvcmQuZGlyZWN0X2lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUJ5dGVzID0gcmVjb3JkLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiID8gZnJvbUJhc2U2NChkYXRhLmZpbGVzW3JlY29yZC5kaXJlY3RfaWRdKSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUJ5dGVzICYmIGZpbGVCeXRlcy5sZW5ndGggPiAyNSAqIDEwMjQgKiAxMDI0KQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlZCA9IHsgLi4ucmVjb3JkLCBpZDogY291bnRlcisrLCBpc19taW5lOiByZWNvcmQuc2VuZGVyX3VzZXJfaWQgPT09IHRoaXMuYWNjb3VudCwgcmVjaXBpZW50X2lkczogW10sIGRlbGl2ZXJlZF90bzogW10sIGxvY2FsX3N0YXR1czogInNlbnQiIH07CiAgICAgICAgICAgICAgICAgICAgc3RhZ2VkLnB1c2goeyBpZDogcmVjb3JkLmRpcmVjdF9pZCwgcmVjb3JkOiBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBieXRlcy5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocmVzdG9yZWQpKS5idWZmZXIpLCBmaWxlOiBmaWxlQnl0ZXMgPyBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBmaWxlQnl0ZXMuYnVmZmVyKSA6IHVuZGVmaW5lZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgYW5kIHZhbGlkYXRlIGV2ZXJ5dGhpbmcgYmVmb3JlIG9wZW5pbmcgdGhlIHNpbmdsZSBhdG9taWMgd3JpdGUgdHJhbnNhY3Rpb24uCiAgICAgICAgICAgICAgICBjb25zdCB0eCA9IHRoaXMuZGIudHJhbnNhY3Rpb24oWyJtZXNzYWdlcyIsICJmaWxlcyIsICJzdGF0ZSJdLCAicmVhZHdyaXRlIik7CiAgICAgICAgICAgICAgICBjb25zdCByZWFkeSA9IGNvbW1pdHRlZCh0eCk7CiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHR4Lm9iamVjdFN0b3JlKCJtZXNzYWdlcyIpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN0YWdlZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCBkb25lKG1lc3NhZ2VzLmdldChpdGVtLmlkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1dChpdGVtLnJlY29yZCwgaXRlbS5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgdHgub2JqZWN0U3RvcmUoImZpbGVzIikucHV0KGl0ZW0uZmlsZSwgaXRlbS5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHR4Lm9iamVjdFN0b3JlKCJzdGF0ZSIpOwogICAgICAgICAgICAgICAgc3RhdGUucHV0KE1hdGgubWF4KGNvdW50ZXIsIChhd2FpdCBkb25lKHN0YXRlLmdldCgiY291bnRlciIpKSkgfHwgMCksICJjb3VudGVyIik7CiAgICAgICAgICAgICAgICBhd2FpdCByZWFkeTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLlpIfku73lr4bnoIHjgIHmlofku7bmiJbmiYDlsZ7otKblj7fkuI3mraPnoa7vvIzmnKrmgaLlpI3or6XlpIfku73jgIIiKTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSgpIHsgZm9yIChjb25zdCB1cmwgb2YgQXJyYXkuZnJvbSh0aGlzLnVybHMudmFsdWVzKCkpKQogICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgdGhpcy51cmxzLmNsZWFyKCk7IHRoaXMuZGI/LmNsb3NlKCk7IH0KfQpleHBvcnQgZnVuY3Rpb24gdG9CYXNlNjQoZGF0YSkgewogICAgbGV0IHJlc3VsdCA9ICIiOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA4MTkyKQogICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLkFycmF5LmZyb20oZGF0YS5zdWJhcnJheShpLCBpICsgODE5MikpKTsKICAgIHJldHVybiBidG9hKHJlc3VsdCk7Cn0KZXhwb3J0IGZ1bmN0aW9uIGZyb21CYXNlNjQodmFsdWUpIHsgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShhdG9iKHZhbHVlKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpOyB9Cg=="
    }
  },
  "signature": "Z7ps1sCT5T5Zkpn37HkIIdjurtklazgH/LnO/YdFO+8DJozaJJolbjpgKptl9QjviBHCk0TDJdD6R5b/fr/pUWj6tIKAQ5AAlOBbm0k83b5uL8Rd+aFOyy0RBO4ND9TwSF1gGal8jm3+YsqG5UhzMzwIvLX+XDyEnr92sAuFGY/WPBKC+Sa37BPe7gnOqOJ81NIm4uswWpkrdDvb5V6/FUDWF3WGtKnw04JkVu89A5tWJ0vE9Ey9Zoi0LD7uP+cAsNJFKEMEqB6gY5ykpxqVjIAwSBsH1+SfeKYY9lBeoC3bCIufuyBFs82vYcwyOuFL+VUElTMMpZQjdNDIBiUrREynyVjAg3wip+kYlr8X0oVIB8lJiDj0OnfWLxUeE7qsN7+swSBRh9Ck2HMYK7VaSaq6n7ZOGwZ60raKe3+BYlcxXMe2zlM6f11vkNFcV6b7PYqGfvHIMVhGGViRGSMTA4lZCEFaOK5ir/EyHDlWUc80Sblg2mXtgLD/W+XUzFmX"
}