fix(app-proxy): remove canary time freeze (#1554)

This commit is contained in:
Hampus
2026-08-11 14:16:03 +02:00
committed by GitHub
parent 4255ad8f55
commit b438837beb
2 changed files with 12 additions and 334 deletions
-322
View File
@@ -5,7 +5,6 @@ use base64::Engine;
use std::sync::LazyLock; use std::sync::LazyLock;
const STABLE_SNAPSHOT_SHA: &str = "3250c73cbf94e97e8b9ca5a0ecb03c20bdde3867"; const STABLE_SNAPSHOT_SHA: &str = "3250c73cbf94e97e8b9ca5a0ecb03c20bdde3867";
const CANARY_SNAPSHOT_SHA: &str = "2026.605.11941";
const STABLE_INDEX_HTML: &str = "\ const STABLE_INDEX_HTML: &str = "\
PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iZW4iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48dGl0bGU+Rmx1eGVyPC90\ PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iZW4iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48dGl0bGU+Rmx1eGVyPC90\
@@ -304,312 +303,6 @@ eyJzaGEiOiIzMjUwYzczY2JmOTRlOTdlOGI5Y2E1YTBlY2IwM2MyMGJkZGUzODY3IiwiYnVpbGROdW1i
aW1lc3RhbXAiOiIxNzgwNzgxMTY4In0=\ aW1lc3RhbXAiOiIxNzgwNzgxMTY4In0=\
"; ";
const CANARY_INDEX_HTML: &str = "\
PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iZW4iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48dGl0bGU+Rmx1eGVyPC90aXRsZT48bWV0YSBuYW1l\
PSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSx2aWV3cG9ydC1maXQ9Y292ZXIsaW50ZXJhY3RpdmUtd2lk\
Z2V0PXJlc2l6ZXMtY29udGVudCxtYXhpbXVtLXNjYWxlPTEsdXNlci1zY2FsYWJsZT1ubyI+PG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkZs\
dXhlciBpcyBhIGZyZWUgYW5kIG9wZW4gc291cmNlIGluc3RhbnQgbWVzc2FnaW5nIGFuZCBWb0lQIGNoYXQgYXBwIGJ1aWx0IGZvciBmcmllbmRzLCBncm91\
cHMsIGFuZCBjb21tdW5pdGllcy4iPjxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0ie3tTVEFUSUNfQ0ROX0VORFBPSU5UfX0iPjxsaW5rIHJlbD0ic3R5\
bGVzaGVldCIgaHJlZj0ie3tTVEFUSUNfQ0ROX0VORFBPSU5UfX0vZm9udHMvaWJtLXBsZXguY3NzIj48bGluayByZWw9Im1hbmlmZXN0IiBocmVmPSIvbWFu\
aWZlc3QuanNvbiI+PGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS9wbmciIHNpemVzPSIzMngzMiIgaHJlZj0ie3tTVEFUSUNfQ0ROX0VORFBPSU5UfX0v\
d2ViL2Zhdmljb24tMzJ4MzIucG5nIj48bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIHNpemVzPSIxODB4MTgwIiBocmVmPSJ7e1NUQVRJQ19DRE5fRU5E\
UE9JTlR9fS93ZWIvYXBwbGUtdG91Y2gtaWNvbi5wbmciPjxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLWNhcGFibGUiIGNvbnRlbnQ9InllcyI+\
PG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iZGVmYXVsdCI+PG1ldGEgbmFtZT0iYXBwbGUtbW9i\
aWxlLXdlYi1hcHAtdGl0bGUiIGNvbnRlbnQ9IkZsdXhlciI+PG1ldGEgbmFtZT0ibW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj48bWV0\
YSBuYW1lPSJ0aGVtZS1jb2xvciIgY29udGVudD0iIzQ2NDFEOSI+PG1ldGEgbmFtZT0ibXNhcHBsaWNhdGlvbi1uYXZidXR0b24tY29sb3IiIGNvbnRlbnQ9\
IiM0NjQxRDkiPjxtZXRhIG5hbWU9Im1zYXBwbGljYXRpb24tVGlsZUNvbG9yIiBjb250ZW50PSIjNDY0MUQ5Ij48bWV0YSBuYW1lPSJmb3JtYXQtZGV0ZWN0\
aW9uIiBjb250ZW50PSJ0ZWxlcGhvbmU9bm8iPjxtZXRhIG5hbWU9ImRpc3BsYXkiIGNvbnRlbnQ9InN0YW5kYWxvbmUiPjxzY3JpcHQgbm9uY2U9Int7Q1NQ\
X05PTkNFX1BMQUNFSE9MREVSfX0iPiFmdW5jdGlvbigpe3RyeXt2YXIgZT13aW5kb3cubG9jYXRpb247aWYoIi8iPT09ZS5wYXRobmFtZSl7dmFyIGE9Ii9j\
aGFubmVscy9AbWUiO2Uuc2VhcmNoJiYoYSs9ZS5zZWFyY2gpLGUuaGFzaCYmKGErPWUuaGFzaCksZS5yZXBsYWNlKGEpfX1jYXRjaChlKXt9fSgpLGZ1bmN0\
aW9uKCl7dHJ5e3ZhciBlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ0aGVtZSIpO2UmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJ0\
aGVtZS0iK2UpfWNhdGNoe319KCk8L3NjcmlwdD48bGluayBocmVmPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzL2JiZjQxNDA1ZDkyZTI3MjYu\
Y3NzIiByZWw9InN0eWxlc2hlZXQiPjwvaGVhZD48Ym9keT48ZGl2IGlkPSJyb290Ij48L2Rpdj4KPG5vc2NyaXB0PkphdmFTY3JpcHQgaXMgcmVxdWlyZWQg\
dG8gdXNlIHRoaXMgYXBwbGljYXRpb24uPC9ub3NjcmlwdD4KCgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy9kODI1ZDc0\
Y2I3NGVjMjc3LmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzNhYzFlYmYx\
YjY1ZTBhYjMuanMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvZTE5NGM4MTEx\
NzNmMDhhNy5qcyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy9lYTUyM2JkOWM4\
NjBkZjI1LmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzVhYjdjNzdiM2I5\
NzI3ODYuanMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvM2E4NjFhMjYzM2Q4\
NzM2My5qcyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy84NjY3MzIxZDM3OWQ3\
NGZmLmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzZiODVkYTIyNjRiZmI5\
ODAuanMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvYjU4MDVjYTAzZTJmYzI4\
Ni5qcyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy80NzRiODYwYjA1ZjJlZThm\
LmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzL2I3MWM5MjhjMWZiMGZlNzYu\
anMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvYjI1MDgxOWM4NDZhZGVmZS5q\
cyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy9hN2U1MjQ1ZTFjNDc4MmJkLmpz\
IiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzZiZWJjYTI2NjBlNDdmZmQuanMi\
IHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvNzk5Yjc3Y2Y0MjJkNjRiMS5qcyIg\
dHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy80MjZmMDA2NDY2ZTc2Mzc5LmpzIiB0\
eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+\
";
const CANARY_SW_JS: &str = "\
InVzZSBzdHJpY3QiOwooKCkgPT4gewogIC8vIDxkZWZpbmU6X19GTFVYRVJfUFJFQ0FDSEVfTUFOSUZFU1RfXz4KICB2YXIgZGVmaW5lX0ZMVVhFUl9QUkVD\
QUNIRV9NQU5JRkVTVF9kZWZhdWx0ID0gW3sgdXJsOiAiL2luZGV4Lmh0bWwiLCByZXZpc2lvbjogIjMxODY6MTc4MDYyMjQ5MTM2MSIgfSwgeyB1cmw6ICIv\
IiwgcmV2aXNpb246ICIzMTg2OjE3ODA2MjI0OTEzNjEiIH0sIHsgdXJsOiAiL21hbmlmZXN0Lmpzb24iLCByZXZpc2lvbjogIjExNTA6MTc4MDYyMjQ5MTM1\
NyIgfSwgeyB1cmw6ICIvYnJvd3NlcmNvbmZpZy54bWwiLCByZXZpc2lvbjogIjI0ODoxNzgwNjIyNDkxMjkzIiB9LCB7IHVybDogIi9yb2JvdHMudHh0Iiwg\
cmV2aXNpb246ICIyMzoxNzgwNjIyNDkxNDc3IiB9LCB7IHVybDogIi92ZXJzaW9uLmpzb24iLCByZXZpc2lvbjogIjI4OjE3ODA2MjI0OTE1NjEiIH1dOwoK\
ICAvLyBzcmMvZmVhdHVyZXMvYXBwL2NvbmZpZy9Qcm9kdWN0Q29uc3RhbnRzLnRzCiAgdmFyIFBST0RVQ1RfTkFNRSA9ICJGbHV4ZXIiOwoKICAvLyBzcmMv\
ZmVhdHVyZXMvcGxhdGZvcm0vbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25BbGVydE9wdGlvbnMudHMKICB2YXIgTk9USUZJQ0FUSU9OX1ZJQlJBVElPTl9Q\
QVRURVJOID0gWzIwMCwgMTAwLCAyMDBdOwogIGZ1bmN0aW9uIGlzSU9TTW9iaWxlT3JUYWJsZXRVc2VyQWdlbnQodXNlckFnZW50LCBtYXhUb3VjaFBvaW50\
cyA9IDApIHsKICAgIHJldHVybiAvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QodXNlckFnZW50KSB8fCAvTWFjaW50b3NoL2kudGVzdCh1c2VyQWdlbnQpICYm\
IG1heFRvdWNoUG9pbnRzID4gMTsKICB9CiAgZnVuY3Rpb24gaXNNb2JpbGVPclRhYmxldFVzZXJBZ2VudCh1c2VyQWdlbnQsIG1heFRvdWNoUG9pbnRzID0g\
MCkgewogICAgcmV0dXJuIC9BbmRyb2lkL2kudGVzdCh1c2VyQWdlbnQpIHx8IGlzSU9TTW9iaWxlT3JUYWJsZXRVc2VyQWdlbnQodXNlckFnZW50LCBtYXhU\
b3VjaFBvaW50cyk7CiAgfQogIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbkFsZXJ0T3B0aW9ucyh7CiAgICBtb2JpbGVPclRhYmxldCwKICAgIHNpbGVudE9u\
Tm9uTW9iaWxlCiAgfSkgewogICAgaWYgKG1vYmlsZU9yVGFibGV0KSB7CiAgICAgIHJldHVybiB7IHZpYnJhdGU6IFsuLi5OT1RJRklDQVRJT05fVklCUkFU\
SU9OX1BBVFRFUk5dIH07CiAgICB9CiAgICBpZiAoc2lsZW50T25Ob25Nb2JpbGUpIHsKICAgICAgcmV0dXJuIHsgc2lsZW50OiB0cnVlIH07CiAgICB9CiAg\
ICByZXR1cm4ge307CiAgfQoKICAvLyBzcmMvZmVhdHVyZXMvcGxhdGZvcm0vc2VydmljZV93b3JrZXIvV29ya2VyQ2FjaGVDbGVhbnVwLnRzCiAgdmFyIFdP\
UktFUl9DQUNIRV9QUkVGSVggPSAiZmx1eGVyIjsKICB2YXIgTEVHQUNZX0VYUFJFU1NJT05fQVNTRVRfQ0FDSEVfUFJFRklYID0gYCR7V09SS0VSX0NBQ0hF\
X1BSRUZJWH0tZXhwcmVzc2lvbi1hc3NldHNgOwogIGZ1bmN0aW9uIGlzTGVnYWN5RXhwcmVzc2lvbkFzc2V0Q2FjaGVOYW1lKGNhY2hlTmFtZSkgewogICAg\
cmV0dXJuIGNhY2hlTmFtZSA9PT0gTEVHQUNZX0VYUFJFU1NJT05fQVNTRVRfQ0FDSEVfUFJFRklYIHx8IGNhY2hlTmFtZS5zdGFydHNXaXRoKGAke0xFR0FD\
WV9FWFBSRVNTSU9OX0FTU0VUX0NBQ0hFX1BSRUZJWH0tYCk7CiAgfQogIGZ1bmN0aW9uIHNob3VsZERlbGV0ZVdvcmtlckNhY2hlKGNhY2hlTmFtZSwgZXhw\
ZWN0ZWRDYWNoZXMpIHsKICAgIGlmIChpc0xlZ2FjeUV4cHJlc3Npb25Bc3NldENhY2hlTmFtZShjYWNoZU5hbWUpKSB7CiAgICAgIHJldHVybiB0cnVlOwog\
ICAgfQogICAgaWYgKCFjYWNoZU5hbWUuc3RhcnRzV2l0aChgJHtXT1JLRVJfQ0FDSEVfUFJFRklYfS1gKSB8fCBleHBlY3RlZENhY2hlcy5oYXMoY2FjaGVO\
YW1lKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoY2FjaGVOYW1lLnN0YXJ0c1dpdGgoYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tYXNz\
ZXRzLWApKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8gc3JjL2ZlYXR1cmVzL3BsYXRmb3JtL3NlcnZp\
Y2Vfd29ya2VyL1dvcmtlck5hdmlnYXRpb24udHMKICB2YXIgQVBQX05BVklHQVRJT05fRVhBQ1RfUEFUSFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChb\
CiAgICAiLyIsCiAgICAiL2xvZ2luIiwKICAgICIvcmVnaXN0ZXIiLAogICAgIi9mb3Jnb3QiLAogICAgIi9yZXNldCIsCiAgICAiL3ZlcmlmeSIsCiAgICAi\
L2F1dGhvcml6ZS1pcCIsCiAgICAiL3dhc250bWUiLAogICAgIi9wZW5kaW5nIiwKICAgICIvb2F1dGgyL2F1dGhvcml6ZSIsCiAgICAiL2F1dGgvc3NvL2Nh\
bGxiYWNrIiwKICAgICIvYm9va21hcmtzIiwKICAgICIvbWVudGlvbnMiLAogICAgIi9ub3RpZmljYXRpb25zIiwKICAgICIveW91IiwKICAgICIvcmVwb3J0\
IiwKICAgICIvcHJlbWl1bS1jYWxsYmFjayIsCiAgICAiL2FnZS12ZXJpZmljYXRpb24tY2FsbGJhY2siLAogICAgIi9jb25uZWN0aW9uLWNhbGxiYWNrIiwK\
ICAgICIvdGhlbWUtc3R1ZGlvIiwKICAgICIvX19ub3Rmb3VuZCIsCiAgICAiL2ludml0ZSIsCiAgICAiL2dpZnQiLAogICAgIi90aGVtZSIKICBdKTsKICB2\
YXIgQVBQX05BVklHQVRJT05fUFJFRklYRVMgPSBbIi9jaGFubmVscy8iLCAiL3VzZXJzLyIsICIvaW52aXRlLyIsICIvZ2lmdC8iLCAiL3RoZW1lLyJdOwog\
IGZ1bmN0aW9uIGlzQXBwTmF2aWdhdGlvblBhdGgocGF0aG5hbWUpIHsKICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRobmFtZSA9IHBhdGhuYW1lLmxlbmd0aCA+\
IDEgPyBwYXRobmFtZS5yZXBsYWNlKC9cLyskLywgIiIpIDogcGF0aG5hbWU7CiAgICBpZiAoQVBQX05BVklHQVRJT05fRVhBQ1RfUEFUSFMuaGFzKG5vcm1h\
bGl6ZWRQYXRobmFtZSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gQVBQX05BVklHQVRJT05fUFJFRklYRVMuc29tZSgocHJlZml4\
KSA9PiBub3JtYWxpemVkUGF0aG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKTsKICB9CgogIC8vIHNyYy9mZWF0dXJlcy9wbGF0Zm9ybS9zZXJ2aWNlX3dvcmtl\
ci9Xb3JrZXJGZXRjaFJvdXRpbmcudHMKICBmdW5jdGlvbiBpc05hdmlnYXRpb25SZXF1ZXN0KHJlcXVlc3QpIHsKICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09\
ICJuYXZpZ2F0ZSIpIHJldHVybiB0cnVlOwogICAgY29uc3QgYWNjZXB0ID0gcmVxdWVzdC5oZWFkZXJzLmdldCgiYWNjZXB0IikgPz8gIiI7CiAgICByZXR1\
cm4gcmVxdWVzdC5kZXN0aW5hdGlvbiA9PT0gImRvY3VtZW50IiB8fCBhY2NlcHQuaW5jbHVkZXMoInRleHQvaHRtbCIpOwogIH0KICBmdW5jdGlvbiBnZXRX\
b3JrZXJGZXRjaFJvdXRlKHJlcXVlc3QsIHdvcmtlck9yaWdpbikgewogICAgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAiR0VUIikgewogICAgICByZXR1cm4g\
Imlnbm9yZSI7CiAgICB9CiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTsKICAgIGlmICh1cmwub3JpZ2luICE9PSB3b3JrZXJPcmlnaW4p\
IHsKICAgICAgcmV0dXJuICJpZ25vcmUiOwogICAgfQogICAgaWYgKGlzTmF2aWdhdGlvblJlcXVlc3QocmVxdWVzdCkpIHsKICAgICAgcmV0dXJuIGlzQXBw\
TmF2aWdhdGlvblBhdGgodXJsLnBhdGhuYW1lKSA/ICJuYXZpZ2F0aW9uIiA6ICJpZ25vcmUiOwogICAgfQogICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNX\
aXRoKCIvYXNzZXRzLyIpKSB7CiAgICAgIHJldHVybiAic3RhdGljLWFzc2V0IjsKICAgIH0KICAgIGlmICh1cmwucGF0aG5hbWUgPT09ICIvbWFuaWZlc3Qu\
anNvbiIgfHwgdXJsLnBhdGhuYW1lID09PSAiL3ZlcnNpb24uanNvbiIpIHsKICAgICAgcmV0dXJuICJtZXRhZGF0YSI7CiAgICB9CiAgICByZXR1cm4gImln\
bm9yZSI7CiAgfQoKICAvLyBzcmMvZmVhdHVyZXMvcGxhdGZvcm0vc2VydmljZV93b3JrZXIvV29ya2VyUHVzaFBheWxvYWQudHMKICB2YXIgbm9ybWFsaXpl\
UHVzaFBheWxvYWQgPSAocmF3KSA9PiB7CiAgICBjb25zdCBwYXlsb2FkID0gcmF3ID8/IHt9OwogICAgaWYgKHBheWxvYWQud2ViX3B1c2ggPT09IDgwMzAg\
JiYgcGF5bG9hZC5ub3RpZmljYXRpb24gJiYgdHlwZW9mIHBheWxvYWQubm90aWZpY2F0aW9uID09PSAib2JqZWN0IikgewogICAgICBjb25zdCBpbm5lciA9\
IHBheWxvYWQubm90aWZpY2F0aW9uOwogICAgICBjb25zdCBuYXZpZ2F0ZVVybCA9IGlubmVyLm5hdmlnYXRlOwogICAgICBjb25zdCBkYXRhID0geyAuLi5p\
bm5lci5kYXRhID8/IHt9IH07CiAgICAgIGlmICh0eXBlb2YgbmF2aWdhdGVVcmwgPT09ICJzdHJpbmciICYmICFkYXRhLnVybCkgZGF0YS51cmwgPSBuYXZp\
Z2F0ZVVybDsKICAgICAgcmV0dXJuIHsgLi4uaW5uZXIsIGRhdGEgfTsKICAgIH0KICAgIHJldHVybiBwYXlsb2FkOwogIH07CiAgdmFyIGdldEJhZGdlQ291\
bnQgPSAocGF5bG9hZCkgPT4gewogICAgY29uc3QgYmFkZ2VWYWx1ZSA9IHBheWxvYWQuZGF0YT8uYmFkZ2VfY291bnQ7CiAgICBpZiAodHlwZW9mIGJhZGdl\
VmFsdWUgPT09ICJudW1iZXIiICYmIE51bWJlci5pc0Zpbml0ZShiYWRnZVZhbHVlKSkgewogICAgICByZXR1cm4gYmFkZ2VWYWx1ZTsKICAgIH0KICAgIGlm\
ICh0eXBlb2YgYmFkZ2VWYWx1ZSA9PT0gInN0cmluZyIgJiYgYmFkZ2VWYWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihi\
YWRnZVZhbHVlKTsKICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbDsKICAgIH0KICAgIHJldHVybiBudWxsOwog\
IH07CiAgdmFyIHJlc29sdmVQdXNoTm90aWZpY2F0aW9uVGFnID0gKHBheWxvYWQpID0+IHsKICAgIGNvbnN0IGV4cGxpY2l0VGFnID0gcGF5bG9hZC50YWcg\
Pz8gcGF5bG9hZC5kYXRhPy5ub3RpZmljYXRpb25fdGFnID8/IHBheWxvYWQuZGF0YT8udGFnOwogICAgaWYgKHR5cGVvZiBleHBsaWNpdFRhZyA9PT0gInN0\
cmluZyIgJiYgZXhwbGljaXRUYWcubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gZXhwbGljaXRUYWc7CiAgICB9CiAgICBjb25zdCBjaGFubmVsSWQgPSBw\
YXlsb2FkLmRhdGE/LmNoYW5uZWxfaWQ7CiAgICBpZiAodHlwZW9mIGNoYW5uZWxJZCA9PT0gInN0cmluZyIgJiYgY2hhbm5lbElkLmxlbmd0aCA+IDApIHsK\
ICAgICAgcmV0dXJuIGBjaGFubmVsOiR7Y2hhbm5lbElkfWA7CiAgICB9CiAgICByZXR1cm4gdm9pZCAwOwogIH07CiAgdmFyIGdldFB1c2hOb3RpZmljYXRp\
b25DbGllbnRTdGF0ZSA9IChjbGllbnRzKSA9PiAoewogICAgaGFzV2luZG93Q2xpZW50OiBjbGllbnRzLmxlbmd0aCA+IDAsCiAgICBoYXNWaXNpYmxlQ2xp\
ZW50OiBjbGllbnRzLnNvbWUoKGNsaWVudCkgPT4gY2xpZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gInZpc2libGUiKQogIH0pOwogIHZhciBzaG91bGRTaWxl\
bmNlTm9uTW9iaWxlUHVzaE5vdGlmaWNhdGlvbiA9IChjbGllbnRTdGF0ZSkgPT4gY2xpZW50U3RhdGUuaGFzV2luZG93Q2xpZW50OwogIHZhciBpc05vdGlm\
aWNhdGlvbkNsZWFyUGF5bG9hZCA9IChwYXlsb2FkKSA9PiB7CiAgICBjb25zdCByZWNvcmQgPSBwYXlsb2FkOwogICAgY29uc3QgZGF0YSA9IHBheWxvYWQu\
ZGF0YSA/PyB7fTsKICAgIHJldHVybiByZWNvcmQudHlwZSA9PT0gIm5vdGlmaWNhdGlvbl9jbGVhciIgfHwgcmVjb3JkLmFjdGlvbiA9PT0gImNsZWFyX2No\
YW5uZWwiIHx8IGRhdGEudHlwZSA9PT0gIm5vdGlmaWNhdGlvbl9jbGVhciIgfHwgZGF0YS5hY3Rpb24gPT09ICJjbGVhcl9jaGFubmVsIiB8fCBwYXlsb2Fk\
Lm5vdGlmaWNhdGlvbj8uZGF0YT8udHlwZSA9PT0gIm5vdGlmaWNhdGlvbl9jbGVhciIgfHwgcGF5bG9hZC5ub3RpZmljYXRpb24/LmRhdGE/LmFjdGlvbiA9\
PT0gImNsZWFyX2NoYW5uZWwiOwogIH07CgogIC8vIHNyYy9mZWF0dXJlcy9wbGF0Zm9ybS9zZXJ2aWNlX3dvcmtlci9Xb3JrZXIudHMKICB2YXIgd29ya2Vy\
TmF2aWdhdG9yID0gc2VsZi5uYXZpZ2F0b3I7CiAgdmFyIGVuc3VyZVNlcnZpY2VXb3JrZXJSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpOwogIHZhciBTRVJW\
SUNFX1dPUktFUl9WRVJTSU9OID0gdHJ1ZSA/ICIxNzgwNjIyNDkyMjcxIiA6ICJkZXYiOwogIHZhciBQUkVDQUNIRV9NQU5JRkVTVCA9IHR5cGVvZiBkZWZp\
bmVfRkxVWEVSX1BSRUNBQ0hFX01BTklGRVNUX2RlZmF1bHQgPT09ICJ1bmRlZmluZWQiID8gW10gOiBkZWZpbmVfRkxVWEVSX1BSRUNBQ0hFX01BTklGRVNU\
X2RlZmF1bHQ7CiAgdmFyIFBSRUNBQ0hFX0NBQ0hFID0gYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tcHJlY2FjaGUtJHtTRVJWSUNFX1dPUktFUl9WRVJTSU9O\
fWA7CiAgdmFyIEFTU0VUX0NBQ0hFID0gYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tYXNzZXRzLSR7U0VSVklDRV9XT1JLRVJfVkVSU0lPTn1gOwogIHZhciBO\
QVZJR0FUSU9OX0NBQ0hFID0gYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tbmF2aWdhdGlvbi0ke1NFUlZJQ0VfV09SS0VSX1ZFUlNJT059YDsKICB2YXIgRVhQ\
RUNURURfQ0FDSEVTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1BSRUNBQ0hFX0NBQ0hFLCBBU1NFVF9DQUNIRSwgTkFWSUdBVElPTl9DQUNIRV0pOwog\
IHZhciBOQVZJR0FUSU9OX05FVFdPUktfVElNRU9VVF9NUyA9IDY1MDsKICB2YXIgc2VydmljZVdvcmtlckNhY2hlcyA9IHNlbGYuY2FjaGVzOwogIHZhciBp\
c05hdGl2ZURlc2t0b3BVc2VyQWdlbnQgPSAodXNlckFnZW50KSA9PiAvXGJFbGVjdHJvblwvXGQrKD86XC5cZCspKi8udGVzdCh1c2VyQWdlbnQpOwogIHRy\
eSB7CiAgICBkZWxldGUgc2VsZi5jYWNoZXM7CiAgfSBjYXRjaCB7CiAgfQogIHZhciBsb2cgPSBhc3luYyAobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHsK\
ICAgIHRyeSB7CiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBjb25zdCBmbiA9IGxldmVsID09PSAiZXJyb3Ii\
ID8gY29uc29sZS5lcnJvciA6IGxldmVsID09PSAid2FybiIgPyBjb25zb2xlLndhcm4gOiBsZXZlbCA9PT0gImluZm8iID8gY29uc29sZS5pbmZvIDogY29u\
c29sZS5kZWJ1ZzsKICAgICAgICBpZiAoZGF0YSAhPT0gdm9pZCAwKSBmbj8uY2FsbChjb25zb2xlLCAiW1NXXSIsIG1lc3NhZ2UsIGRhdGEpOwogICAgICAg\
IGVsc2UgZm4/LmNhbGwoY29uc29sZSwgIltTV10iLCBtZXNzYWdlKTsKICAgICAgfQogICAgfSBjYXRjaCB7CiAgICB9CiAgfTsKICB2YXIgaXNDYWNoZWFi\
bGVSZXNwb25zZSA9IChyZXNwb25zZSkgPT4gewogICAgcmV0dXJuIHJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlLnR5cGUgPT09ICJvcGFxdWUiOwogIH07CiAg\
dmFyIHBydW5lQ2FjaGVFbnRyaWVzID0gYXN5bmMgKGNhY2hlLCBtYXhFbnRyaWVzKSA9PiB7CiAgICBjb25zdCBrZXlzID0gYXdhaXQgY2FjaGUua2V5cygp\
OwogICAgY29uc3Qgb3ZlcmZsb3cgPSBrZXlzLmxlbmd0aCAtIG1heEVudHJpZXM7CiAgICBpZiAob3ZlcmZsb3cgPD0gMCkgewogICAgICByZXR1cm47CiAg\
ICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChrZXlzLnNsaWNlKDAsIG92ZXJmbG93KS5tYXAoKHJlcXVlc3QpID0+IGNhY2hlLmRlbGV0ZShyZXF1ZXN0KSkp\
OwogIH07CiAgdmFyIGNhY2hlUmVxdWVzdCA9IGFzeW5jIChjYWNoZU5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlLCBtYXhFbnRyaWVzKSA9PiB7CiAgICBpZiAo\
IWlzQ2FjaGVhYmxlUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyeSB7CiAgICAgIGlmICghc2VydmljZVdvcmtlckNh\
Y2hlcykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHNlcnZpY2VXb3JrZXJDYWNoZXMub3BlbihjYWNoZU5h\
bWUpOwogICAgICBhd2FpdCBjYWNoZS5wdXQocmVxdWVzdCwgcmVzcG9uc2UuY2xvbmUoKSk7CiAgICAgIGlmIChtYXhFbnRyaWVzICE9IG51bGwpIHsKICAg\
ICAgICBhd2FpdCBwcnVuZUNhY2hlRW50cmllcyhjYWNoZSwgbWF4RW50cmllcyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGF3YWl0\
IGxvZygid2FybiIsICJjYWNoZSBwdXQgZmFpbGVkIiwgeyBjYWNoZU5hbWUsIGVycm9yOiBkZXNjcmliZUVycm9yKGVycm9yKSB9KTsKICAgIH0KICB9Owog\
IHZhciBwcmVjYWNoZUFwcFNoZWxsID0gYXN5bmMgKCkgPT4gewogICAgaWYgKCFzZXJ2aWNlV29ya2VyQ2FjaGVzKSB7CiAgICAgIHJldHVybjsKICAgIH0K\
ICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgc2VydmljZVdvcmtlckNhY2hlcy5vcGVuKFBSRUNBQ0hFX0NBQ0hFKTsKICAgIGF3YWl0IFByb21pc2UuYWxsU2V0\
dGxlZCgKICAgICAgUFJFQ0FDSEVfTUFOSUZFU1QubWFwKGFzeW5jIChlbnRyeSkgPT4gewogICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChu\
ZXcgVVJMKGVudHJ5LnVybCwgc2VsZi5sb2NhdGlvbi5vcmlnaW4pLnRvU3RyaW5nKCksIHsgY2FjaGU6ICJyZWxvYWQiIH0pOwogICAgICAgIGNvbnN0IHJl\
c3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7CiAgICAgICAgaWYgKGlzQ2FjaGVhYmxlUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgICBhd2Fp\
dCBjYWNoZS5wdXQoZW50cnkudXJsLCByZXNwb25zZSk7CiAgICAgICAgfQogICAgICB9KQogICAgKTsKICB9OwogIHZhciBjbGVhbnVwT2xkQ2FjaGVzID0g\
YXN5bmMgKCkgPT4gewogICAgaWYgKCFzZXJ2aWNlV29ya2VyQ2FjaGVzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5hbWVzID0gYXdhaXQg\
c2VydmljZVdvcmtlckNhY2hlcy5rZXlzKCk7CiAgICBhd2FpdCBQcm9taXNlLmFsbCgKICAgICAgbmFtZXMubWFwKChuYW1lKSA9PiB7CiAgICAgICAgaWYg\
KCFzaG91bGREZWxldGVXb3JrZXJDYWNoZShuYW1lLCBFWFBFQ1RFRF9DQUNIRVMpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAg\
ICAgICByZXR1cm4gc2VydmljZVdvcmtlckNhY2hlcy5kZWxldGUobmFtZSk7CiAgICAgIH0pCiAgICApOwogIH07CiAgdmFyIGdldENhY2hlZEFwcFNoZWxs\
ID0gYXN5bmMgKCkgPT4gewogICAgaWYgKCFzZXJ2aWNlV29ya2VyQ2FjaGVzKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICByZXR1cm4gYXdh\
aXQgc2VydmljZVdvcmtlckNhY2hlcy5tYXRjaCgiL2luZGV4Lmh0bWwiKSA/PyBhd2FpdCBzZXJ2aWNlV29ya2VyQ2FjaGVzLm1hdGNoKCIvIikgPz8gYXdh\
aXQgc2VydmljZVdvcmtlckNhY2hlcy5tYXRjaChuZXcgUmVxdWVzdCgiL2luZGV4Lmh0bWwiLCB7IGNhY2hlOiAicmVsb2FkIiB9KSkgPz8gdm9pZCAwOwog\
IH07CiAgdmFyIGZldGNoTmF2aWdhdGlvbiA9IGFzeW5jIChyZXF1ZXN0KSA9PiB7CiAgICBjb25zdCB0aW1lb3V0ID0gbmV3IFByb21pc2UoKHJlc29sdmUp\
ID0+IHsKICAgICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKHZvaWQgMCksIE5BVklHQVRJT05fTkVUV09SS19USU1FT1VUX01TKTsKICAgIH0pOwogICAg\
Y29uc3QgbmV0d29yayA9IGZldGNoKHJlcXVlc3QpLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7CiAgICAgIGF3YWl0IGNhY2hlUmVxdWVzdChOQVZJR0FU\
SU9OX0NBQ0hFLCAiL2luZGV4Lmh0bWwiLCByZXNwb25zZSk7CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogICAgbGV0IG5ldHdvcmtSZXNwb25z\
ZTsKICAgIHRyeSB7CiAgICAgIG5ldHdvcmtSZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmFjZShbbmV0d29yaywgdGltZW91dF0pOwogICAgICBpZiAobmV0\
d29ya1Jlc3BvbnNlICYmIGlzQ2FjaGVhYmxlUmVzcG9uc2UobmV0d29ya1Jlc3BvbnNlKSkgewogICAgICAgIHJldHVybiBuZXR3b3JrUmVzcG9uc2U7CiAg\
ICAgIH0KICAgIH0gY2F0Y2ggewogICAgfQogICAgY29uc3QgY2FjaGVkID0gYXdhaXQgZ2V0Q2FjaGVkQXBwU2hlbGwoKTsKICAgIGlmIChjYWNoZWQpIHsK\
ICAgICAgbmV0d29yay5jYXRjaCgoKSA9PiB2b2lkIDApOwogICAgICByZXR1cm4gY2FjaGVkOwogICAgfQogICAgaWYgKG5ldHdvcmtSZXNwb25zZSkgewog\
ICAgICByZXR1cm4gbmV0d29ya1Jlc3BvbnNlOwogICAgfQogICAgcmV0dXJuIG5ldHdvcms7CiAgfTsKICB2YXIgZmV0Y2hDYWNoZUZpcnN0ID0gYXN5bmMg\
KHJlcXVlc3QpID0+IHsKICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHNlcnZpY2VXb3JrZXJDYWNoZXM/Lm1hdGNoKHJlcXVlc3QpOwogICAgaWYgKGNhY2hl\
ZCkgewogICAgICByZXR1cm4gY2FjaGVkOwogICAgfQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTsKICAgIGF3YWl0IGNhY2hl\
UmVxdWVzdChBU1NFVF9DQUNIRSwgcmVxdWVzdCwgcmVzcG9uc2UpOwogICAgcmV0dXJuIHJlc3BvbnNlOwogIH07CiAgdmFyIGZldGNoTmV0d29ya0ZpcnN0\
ID0gYXN5bmMgKHJlcXVlc3QpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7CiAgICAgIGF3YWl0\
IGNhY2hlUmVxdWVzdChQUkVDQUNIRV9DQUNIRSwgcmVxdWVzdCwgcmVzcG9uc2UpOwogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9IGNhdGNoIChlcnJv\
cikgewogICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBzZXJ2aWNlV29ya2VyQ2FjaGVzPy5tYXRjaChyZXF1ZXN0KTsKICAgICAgaWYgKGNhY2hlZCkgewog\
ICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICAgIH0KICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CiAgfTsKICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImluc3Rh\
bGwiLCAoZXZlbnQpID0+IHsKICAgIGV2ZW50LndhaXRVbnRpbCgKICAgICAgKGFzeW5jICgpID0+IHsKICAgICAgICBhd2FpdCBlbnN1cmVTZXJ2aWNlV29y\
a2VyUmVhZHk7CiAgICAgICAgYXdhaXQgcHJlY2FjaGVBcHBTaGVsbCgpOwogICAgICAgIGF3YWl0IGxvZygiaW5mbyIsICJpbnN0YWxsIik7CiAgICAgICAg\
c2VsZi5za2lwV2FpdGluZygpOwogICAgICB9KSgpCiAgICApOwogIH0pOwogIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigiYWN0aXZhdGUiLCAoZXZlbnQpID0+\
IHsKICAgIGV2ZW50LndhaXRVbnRpbCgKICAgICAgKGFzeW5jICgpID0+IHsKICAgICAgICBhd2FpdCBlbnN1cmVTZXJ2aWNlV29ya2VyUmVhZHk7CiAgICAg\
ICAgYXdhaXQgbG9nKCJpbmZvIiwgImFjdGl2YXRlIik7CiAgICAgICAgYXdhaXQgY2xlYW51cE9sZENhY2hlcygpOwogICAgICAgIGF3YWl0IHNlbGYuY2xp\
ZW50cy5jbGFpbSgpOwogICAgICAgIGF3YWl0IGxvZygiZGVidWciLCAiY2xpZW50cyBjbGFpbWVkIik7CiAgICAgIH0pKCkKICAgICk7CiAgfSk7CiAgc2Vs\
Zi5hZGRFdmVudExpc3RlbmVyKCJmZXRjaCIsIChldmVudCkgPT4gewogICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7CiAgICBjb25zdCByb3V0\
ZSA9IGdldFdvcmtlckZldGNoUm91dGUocmVxdWVzdCwgc2VsZi5sb2NhdGlvbi5vcmlnaW4pOwogICAgaWYgKHJvdXRlID09PSAibmF2aWdhdGlvbiIpIHsK\
ICAgICAgZXZlbnQucmVzcG9uZFdpdGgoZmV0Y2hOYXZpZ2F0aW9uKHJlcXVlc3QpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHJvdXRlID09PSAi\
c3RhdGljLWFzc2V0IikgewogICAgICBldmVudC5yZXNwb25kV2l0aChmZXRjaENhY2hlRmlyc3QocmVxdWVzdCkpOwogICAgICByZXR1cm47CiAgICB9CiAg\
ICBpZiAocm91dGUgPT09ICJtZXRhZGF0YSIpIHsKICAgICAgZXZlbnQucmVzcG9uZFdpdGgoZmV0Y2hOZXR3b3JrRmlyc3QocmVxdWVzdCkpOwogICAgfQog\
IH0pOwogIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChldmVudCkgPT4gewogICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7CiAgICBjb25z\
dCB0eXBlID0gZGF0YT8udHlwZTsKICAgIGlmICh0eXBlID09PSAiU0tJUF9XQUlUSU5HIikgewogICAgICBldmVudC53YWl0VW50aWwobG9nKCJpbmZvIiwg\
Im1lc3NhZ2U6IFNLSVBfV0FJVElORyIpKTsKICAgICAgc2VsZi5za2lwV2FpdGluZygpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZSA9PT0g\
IkFQUF9VUERBVEVfQkFER0UiKSB7CiAgICAgIGNvbnN0IHJhd0NvdW50ID0gZGF0YT8uY291bnQ7CiAgICAgIGxldCBiYWRnZUNvdW50ID0gbnVsbDsKICAg\
ICAgaWYgKHR5cGVvZiByYXdDb3VudCA9PT0gIm51bWJlciIgJiYgTnVtYmVyLmlzRmluaXRlKHJhd0NvdW50KSkgewogICAgICAgIGJhZGdlQ291bnQgPSBy\
YXdDb3VudDsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmF3Q291bnQgPT09ICJzdHJpbmciICYmIHJhd0NvdW50Lmxlbmd0aCA+IDApIHsKICAgICAgICBj\
b25zdCBwYXJzZWQgPSBOdW1iZXIocmF3Q291bnQpOwogICAgICAgIGJhZGdlQ291bnQgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51\
bGw7CiAgICAgIH0KICAgICAgZXZlbnQud2FpdFVudGlsKHVwZGF0ZUFwcEJhZGdlKGJhZGdlQ291bnQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXZl\
bnQud2FpdFVudGlsKGxvZygiZGVidWciLCAibWVzc2FnZTogdW5rbm93biIsIHsgdHlwZSB9KSk7CiAgfSk7CiAgdmFyIHVwZGF0ZUFwcEJhZGdlID0gYXN5\
bmMgKGNvdW50KSA9PiB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvci5zZXRBcHBCYWRnZSAhPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmNs\
ZWFyQXBwQmFkZ2UgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgaWYgKGNvdW50ICE9PSBudWxsICYmIGNv\
dW50ID4gMCkgewogICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yLnNldEFwcEJhZGdlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBhd2FpdCBuYXZp\
Z2F0b3Iuc2V0QXBwQmFkZ2UoY291bnQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yLmNsZWFyQXBwQmFkZ2UgPT09ICJm\
dW5jdGlvbiIpIHsKICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xlYXJBcHBCYWRnZSgpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBh\
d2FpdCBsb2coImVycm9yIiwgIkZhaWxlZCB0byB1cGRhdGUgYXBwIGJhZGdlIiwgeyBlcnJvcjogZGVzY3JpYmVFcnJvcihlcnJvcikgfSk7CiAgICB9CiAg\
fTsKICB2YXIgY2xvc2VQdXNoTm90aWZpY2F0aW9ucyA9IGFzeW5jICh0YWcpID0+IHsKICAgIGlmICghdGFnIHx8IHR5cGVvZiBzZWxmLnJlZ2lzdHJhdGlv\
bi5nZXROb3RpZmljYXRpb25zICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3Qgbm90aWZpY2F0\
aW9ucyA9IGF3YWl0IHNlbGYucmVnaXN0cmF0aW9uLmdldE5vdGlmaWNhdGlvbnMoeyB0YWcgfSk7CiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uIG9m\
IG5vdGlmaWNhdGlvbnMpIHsKICAgICAgICBub3RpZmljYXRpb24uY2xvc2UoKTsKICAgICAgfQogICAgICByZXR1cm4gbm90aWZpY2F0aW9ucy5sZW5ndGg7\
CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBhd2FpdCBsb2coImVycm9yIiwgInB1c2g6IGZhaWxlZCB0byBjbG9zZSBub3RpZmljYXRpb25zIiwgeyB0\
YWcsIGVycm9yOiBkZXNjcmliZUVycm9yKGVycm9yKSB9KTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfTsKICB2YXIgcmVzb2x2ZVRhcmdldFVybCA9ICh1\
cmwpID0+IHsKICAgIGlmICghdXJsKSByZXR1cm4gbnVsbDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc29sdmVkID0gbmV3IFVSTCh1cmwsIHNlbGYubG9j\
YXRpb24ub3JpZ2luKTsKICAgICAgaWYgKHJlc29sdmVkLnByb3RvY29sICE9PSAiaHR0cDoiICYmIHJlc29sdmVkLnByb3RvY29sICE9PSAiaHR0cHM6Iikg\
cmV0dXJuIG51bGw7CiAgICAgIHJldHVybiByZXNvbHZlZC50b1N0cmluZygpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07\
CiAgdmFyIHBvc3RNZXNzYWdlVG9DbGllbnRzID0gYXN5bmMgKG1lc3NhZ2UpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGNsaWVudExpc3QgPSBhd2Fp\
dCBzZWxmLmNsaWVudHMubWF0Y2hBbGwoewogICAgICAgIHR5cGU6ICJ3aW5kb3ciLAogICAgICAgIGluY2x1ZGVVbmNvbnRyb2xsZWQ6IHRydWUKICAgICAg\
fSk7CiAgICAgIGZvciAoY29uc3QgY2xpZW50IG9mIGNsaWVudExpc3QpIHsKICAgICAgICBjbGllbnQucG9zdE1lc3NhZ2UobWVzc2FnZSk7CiAgICAgIH0K\
ICAgICAgcmV0dXJuIGNsaWVudExpc3Q7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBhd2FpdCBsb2coImVycm9yIiwgIlVuYWJsZSB0byBicm9hZGNh\
c3QgdG8gY2xpZW50cyIsIHsgZXJyb3I6IGRlc2NyaWJlRXJyb3IoZXJyb3IpIH0pOwogICAgICByZXR1cm4gW107CiAgICB9CiAgfTsKICB2YXIgZm9jdXNP\
ck9wZW5DbGllbnQgPSBhc3luYyAodGFyZ2V0VXJsLCB0YXJnZXRVc2VySWQpID0+IHsKICAgIGNvbnN0IG1lc3NhZ2UgPSB7CiAgICAgIHR5cGU6ICJOT1RJ\
RklDQVRJT05fQ0xJQ0tfTkFWSUdBVEUiLAogICAgICB1cmw6IHRhcmdldFVybAogICAgfTsKICAgIGlmICh0YXJnZXRVc2VySWQpIHsKICAgICAgbWVzc2Fn\
ZS50YXJnZXRVc2VySWQgPSB0YXJnZXRVc2VySWQ7CiAgICB9CiAgICBjb25zdCBjbGllbnRMaXN0ID0gYXdhaXQgcG9zdE1lc3NhZ2VUb0NsaWVudHMobWVz\
c2FnZSk7CiAgICBjb25zdCBleGFjdCA9IGNsaWVudExpc3QuZmluZCgoYykgPT4gYy51cmwgPT09IHRhcmdldFVybCk7CiAgICBpZiAoZXhhY3QpIHsKICAg\
ICAgYXdhaXQgbG9nKCJkZWJ1ZyIsICJmb2N1cyBleGFjdCBjbGllbnQiLCB7IHVybDogdGFyZ2V0VXJsIH0pOwogICAgICBhd2FpdCBleGFjdC5mb2N1cygp\
OwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzYW1lT3JpZ2luID0gY2xpZW50TGlzdC5maW5kKChjKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAg\
cmV0dXJuIG5ldyBVUkwoYy51cmwpLm9yaWdpbiA9PT0gc2VsZi5sb2NhdGlvbi5vcmlnaW47CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiBmYWxz\
ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoc2FtZU9yaWdpbikgewogICAgICBhd2FpdCBsb2coImRlYnVnIiwgImZvY3VzIHNhbWUtb3JpZ2luIGNsaWVu\
dCIsIHsgdXJsOiBzYW1lT3JpZ2luLnVybCB9KTsKICAgICAgYXdhaXQgc2FtZU9yaWdpbi5mb2N1cygpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAo\
c2VsZi5jbGllbnRzLm9wZW5XaW5kb3cpIHsKICAgICAgYXdhaXQgbG9nKCJkZWJ1ZyIsICJvcGVuV2luZG93IiwgeyB1cmw6IHRhcmdldFVybCB9KTsKICAg\
ICAgYXdhaXQgc2VsZi5jbGllbnRzLm9wZW5XaW5kb3codGFyZ2V0VXJsKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGRlc2NyaWJlRXJyb3IoZXJyb3IpIHsK\
ICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgIHJldHVybiB7IG5hbWU6IGVycm9yLm5hbWUsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2Us\
IHN0YWNrOiBlcnJvci5zdGFjayB9OwogICAgfQogICAgcmV0dXJuIHsgdmFsdWU6IFN0cmluZyhlcnJvcikgfTsKICB9CiAgc2VsZi5hZGRFdmVudExpc3Rl\
bmVyKCJwdXNoIiwgKGV2ZW50KSA9PiB7CiAgICBldmVudC53YWl0VW50aWwoCiAgICAgIChhc3luYyAoKSA9PiB7CiAgICAgICAgYXdhaXQgZW5zdXJlU2Vy\
dmljZVdvcmtlclJlYWR5OwogICAgICAgIGxldCByYXc7CiAgICAgICAgbGV0IHJhd1RleHQgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICByYXdU\
ZXh0ID0gZXZlbnQuZGF0YT8udGV4dCgpID8/IG51bGw7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICByYXdUZXh0ID0gbnVsbDsKICAgICAgICB9CiAg\
ICAgICAgdHJ5IHsKICAgICAgICAgIHJhdyA9IGV2ZW50LmRhdGE/Lmpzb24/LigpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBhd2Fp\
dCBsb2coImVycm9yIiwgInB1c2g6IEpTT04gcGFyc2UgZmFpbGVkIiwgewogICAgICAgICAgICBlcnJvcjogZGVzY3JpYmVFcnJvcihlcnJvciksCiAgICAg\
ICAgICAgIHJhd1ByZXZpZXc6IHJhd1RleHQ/LnNsaWNlKDAsIDUxMikgPz8gbnVsbAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBh\
eWxvYWQgPSBub3JtYWxpemVQdXNoUGF5bG9hZChyYXcgPz8geyB0aXRsZTogUFJPRFVDVF9OQU1FIH0pOwogICAgICAgIGNvbnN0IHRpdGxlID0gcGF5bG9h\
ZC50aXRsZSA/PyBQUk9EVUNUX05BTUU7CiAgICAgICAgY29uc3QgdGFnID0gcmVzb2x2ZVB1c2hOb3RpZmljYXRpb25UYWcocGF5bG9hZCk7CiAgICAgICAg\
Y29uc3QgYmFkZ2VDb3VudCA9IGdldEJhZGdlQ291bnQocGF5bG9hZCk7CiAgICAgICAgaWYgKGlzTm90aWZpY2F0aW9uQ2xlYXJQYXlsb2FkKHBheWxvYWQp\
KSB7CiAgICAgICAgICBjb25zdCBjbG9zZWRDb3VudCA9IGF3YWl0IGNsb3NlUHVzaE5vdGlmaWNhdGlvbnModGFnKTsKICAgICAgICAgIGF3YWl0IHVwZGF0\
ZUFwcEJhZGdlKGJhZGdlQ291bnQpOwogICAgICAgICAgYXdhaXQgbG9nKCJpbmZvIiwgInB1c2ggY2xlYXIgcmVjZWl2ZWQiLCB7IHRhZywgY2xvc2VkQ291\
bnQsIGJhZGdlQ291bnQgfSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChpc05hdGl2ZURlc2t0b3BVc2VyQWdlbnQod29ya2Vy\
TmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsKICAgICAgICAgIGF3YWl0IHVwZGF0ZUFwcEJhZGdlKGJhZGdlQ291bnQpOwogICAgICAgICAgYXdhaXQgbG9nKCJ3\
YXJuIiwgInB1c2ggaWdub3JlZCBpbiBuYXRpdmUgZGVza3RvcCBzZXJ2aWNlIHdvcmtlciIsIHsgYmFkZ2VDb3VudCB9KTsKICAgICAgICAgIHJldHVybjsK\
ICAgICAgICB9CiAgICAgICAgY29uc3QgYm9keSA9IHBheWxvYWQuYm9keSA/PyAiIjsKICAgICAgICBsZXQgY2xpZW50U3RhdGUgPSBnZXRQdXNoTm90aWZp\
Y2F0aW9uQ2xpZW50U3RhdGUoW10pOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBjbGllbnRMaXN0ID0gYXdhaXQgc2VsZi5jbGllbnRzLm1hdGNo\
QWxsKHsKICAgICAgICAgICAgdHlwZTogIndpbmRvdyIsCiAgICAgICAgICAgIGluY2x1ZGVVbmNvbnRyb2xsZWQ6IHRydWUKICAgICAgICAgIH0pOwogICAg\
ICAgICAgY2xpZW50U3RhdGUgPSBnZXRQdXNoTm90aWZpY2F0aW9uQ2xpZW50U3RhdGUoY2xpZW50TGlzdCk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAg\
fQogICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgICAgICBib2R5LAogICAgICAgICAgaWNvbjogcGF5bG9hZC5pY29uID8/IHZvaWQgMCwKICAgICAg\
ICAgIGJhZGdlOiBwYXlsb2FkLmJhZGdlID8/IHZvaWQgMCwKICAgICAgICAgIGRhdGE6IHBheWxvYWQuZGF0YSA/PyB2b2lkIDAsCiAgICAgICAgICB0YWcs\
CiAgICAgICAgICByZW5vdGlmeTogdGFnICE9PSB2b2lkIDAsCiAgICAgICAgICAuLi5nZXROb3RpZmljYXRpb25BbGVydE9wdGlvbnMoewogICAgICAgICAg\
ICBtb2JpbGVPclRhYmxldDogaXNNb2JpbGVPclRhYmxldFVzZXJBZ2VudCh3b3JrZXJOYXZpZ2F0b3IudXNlckFnZW50LCB3b3JrZXJOYXZpZ2F0b3IubWF4\
VG91Y2hQb2ludHMgPz8gMCksCiAgICAgICAgICAgIHNpbGVudE9uTm9uTW9iaWxlOiBzaG91bGRTaWxlbmNlTm9uTW9iaWxlUHVzaE5vdGlmaWNhdGlvbihj\
bGllbnRTdGF0ZSkKICAgICAgICAgIH0pCiAgICAgICAgfTsKICAgICAgICBhd2FpdCBsb2coImluZm8iLCAicHVzaCByZWNlaXZlZCIsIHsKICAgICAgICAg\
IHRpdGxlLAogICAgICAgICAgaGFzQm9keTogQm9vbGVhbihwYXlsb2FkLmJvZHkpLAogICAgICAgICAgdGFnLAogICAgICAgICAgaGFzRGF0YTogcGF5bG9h\
ZC5kYXRhICE9PSB2b2lkIDAsCiAgICAgICAgICBiYWRnZUNvdW50LAogICAgICAgICAgaGFzV2luZG93Q2xpZW50OiBjbGllbnRTdGF0ZS5oYXNXaW5kb3dD\
bGllbnQsCiAgICAgICAgICBoYXNWaXNpYmxlQ2xpZW50OiBjbGllbnRTdGF0ZS5oYXNWaXNpYmxlQ2xpZW50LAogICAgICAgICAgd2ViUHVzaDogcGF5bG9h\
ZC53ZWJfcHVzaCA/PyBudWxsCiAgICAgICAgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtzZWxmLnJlZ2lzdHJhdGlv\
bi5zaG93Tm90aWZpY2F0aW9uKHRpdGxlLCBvcHRpb25zKSwgdXBkYXRlQXBwQmFkZ2UoYmFkZ2VDb3VudCldKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikg\
ewogICAgICAgICAgYXdhaXQgbG9nKCJlcnJvciIsICJwdXNoOiBzaG93Tm90aWZpY2F0aW9uIGZhaWxlZCwgc2hvd2luZyBmYWxsYmFjayIsIHsgZXJyb3I6\
IGRlc2NyaWJlRXJyb3IoZXJyb3IpIH0pOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYXdhaXQgc2VsZi5yZWdpc3RyYXRpb24uc2hvd05vdGlmaWNh\
dGlvbihQUk9EVUNUX05BTUUsIHsgYm9keTogIiIgfSk7CiAgICAgICAgICB9IGNhdGNoIChmYWxsYmFja0Vycm9yKSB7CiAgICAgICAgICAgIGF3YWl0IGxv\
ZygiZXJyb3IiLCAicHVzaDogZmFsbGJhY2sgc2hvd05vdGlmaWNhdGlvbiBhbHNvIGZhaWxlZCIsIHsKICAgICAgICAgICAgICBlcnJvcjogZGVzY3JpYmVF\
cnJvcihmYWxsYmFja0Vycm9yKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pKCkKICAgICk7CiAgfSk7CiAgc2VsZi5h\
ZGRFdmVudExpc3RlbmVyKCJub3RpZmljYXRpb25jbGljayIsIChldmVudCkgPT4gewogICAgZXZlbnQubm90aWZpY2F0aW9uLmNsb3NlKCk7CiAgICBjb25z\
dCB0YXJnZXRVcmwgPSByZXNvbHZlVGFyZ2V0VXJsKGV2ZW50Lm5vdGlmaWNhdGlvbi5kYXRhPy51cmwpOwogICAgY29uc3QgdGFyZ2V0VXNlcklkID0gZXZl\
bnQubm90aWZpY2F0aW9uLmRhdGE/LnRhcmdldF91c2VyX2lkOwogICAgZXZlbnQud2FpdFVudGlsKAogICAgICAoYXN5bmMgKCkgPT4gewogICAgICAgIGF3\
YWl0IGVuc3VyZVNlcnZpY2VXb3JrZXJSZWFkeTsKICAgICAgICBhd2FpdCBsb2coImluZm8iLCAibm90aWZpY2F0aW9uY2xpY2siLCB7IHRhcmdldFVybCwg\
dGFyZ2V0VXNlcklkLCB0YWc6IGV2ZW50Lm5vdGlmaWNhdGlvbi50YWcgfSk7CiAgICAgICAgaWYgKCF0YXJnZXRVcmwpIHJldHVybjsKICAgICAgICB0cnkg\
ewogICAgICAgICAgYXdhaXQgZm9jdXNPck9wZW5DbGllbnQodGFyZ2V0VXJsLCB0YXJnZXRVc2VySWQpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAg\
ICAgICAgICBhd2FpdCBsb2coImVycm9yIiwgIm5vdGlmaWNhdGlvbmNsaWNrOiBmb2N1c09yT3BlbiBmYWlsZWQiLCB7IGVycm9yOiBkZXNjcmliZUVycm9y\
KGVycm9yKSB9KTsKICAgICAgICB9CiAgICAgIH0pKCkKICAgICk7CiAgfSk7CiAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCJub3RpZmljYXRpb25jbG9zZSIs\
IChldmVudCkgPT4gewogICAgZXZlbnQud2FpdFVudGlsKGxvZygiZGVidWciLCAibm90aWZpY2F0aW9uY2xvc2UiLCB7IHRhZzogZXZlbnQubm90aWZpY2F0\
aW9uLnRhZyB9KSk7CiAgfSk7CiAgdmFyIGFycmF5QnVmZmVyVG9CYXNlNjRVcmwgPSAoYnVmZmVyKSA9PiB7CiAgICBpZiAoIWJ1ZmZlcikgcmV0dXJuIG51\
bGw7CiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CiAgICBsZXQgYmluYXJ5ID0gIiI7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8\
IGJ5dGVzLmxlbmd0aDsgaSArPSAxKSBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7CiAgICByZXR1cm4gYnRvYShiaW5hcnkpLnJl\
cGxhY2UoL1wrL2csICItIikucmVwbGFjZSgvXC8vZywgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7CiAgfTsKICB2YXIgdXJsQmFzZTY0VG9VaW50OEFycmF5\
ID0gKGJhc2U2NCkgPT4gewogICAgY29uc3QgcGFkZGluZyA9ICI9Ii5yZXBlYXQoKDQgLSBiYXNlNjQubGVuZ3RoICUgNCkgJSA0KTsKICAgIGNvbnN0IHJh\
dyA9IGF0b2IoKGJhc2U2NCArIHBhZGRpbmcpLnJlcGxhY2UoLy0vZywgIisiKS5yZXBsYWNlKC9fL2csICIvIikpOwogICAgY29uc3Qgb3V0ID0gbmV3IFVp\
bnQ4QXJyYXkocmF3Lmxlbmd0aCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkgKz0gMSkgb3V0W2ldID0gcmF3LmNoYXJDb2RlQXQo\
aSk7CiAgICByZXR1cm4gb3V0OwogIH07CiAgdmFyIGZldGNoSW5zdGFuY2VDb25maWcgPSBhc3luYyAoKSA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCBy\
ZXMgPSBhd2FpdCBmZXRjaCgiLy53ZWxsLWtub3duL2ZsdXhlciIsIHsgY3JlZGVudGlhbHM6ICJpbmNsdWRlIiB9KTsKICAgICAgaWYgKCFyZXMub2spIHJl\
dHVybiBudWxsOwogICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgY29uc3QgYXBpQ2xpZW50ID0gZGF0YS5lbmRwb2ludHM/LmFw\
aV9jbGllbnQgPz8gZGF0YS5lbmRwb2ludHM/LmFwaTsKICAgICAgaWYgKCFhcGlDbGllbnQpIHJldHVybiBudWxsOwogICAgICByZXR1cm4geyBhcGlDbGll\
bnQsIHZhcGlkS2V5OiBkYXRhLnB1c2g/LnB1YmxpY192YXBpZF9rZXkgPz8gbnVsbCB9OwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgYXdhaXQgbG9n\
KCJlcnJvciIsICJGYWlsZWQgdG8gZmV0Y2ggaW5zdGFuY2UgY29uZmlnIGluIFNXIiwgeyBlcnJvcjogZGVzY3JpYmVFcnJvcihlcnJvcikgfSk7CiAgICAg\
IHJldHVybiBudWxsOwogICAgfQogIH07CiAgdmFyIFNXX0FQSV9WRVJTSU9OID0gMTsKICB2YXIgcm90YXRlU3Vic2NyaXB0aW9uT25TZXJ2ZXIgPSBhc3lu\
YyAob2xkRW5kcG9pbnQsIG5ld1N1YiwgYXBpQ2xpZW50KSA9PiB7CiAgICBjb25zdCBwMjU2ZGggPSBhcnJheUJ1ZmZlclRvQmFzZTY0VXJsKG5ld1N1Yi5n\
ZXRLZXkoInAyNTZkaCIpKTsKICAgIGNvbnN0IGF1dGggPSBhcnJheUJ1ZmZlclRvQmFzZTY0VXJsKG5ld1N1Yi5nZXRLZXkoImF1dGgiKSk7CiAgICBpZiAo\
IXAyNTZkaCB8fCAhYXV0aCkgewogICAgICBhd2FpdCBsb2coImVycm9yIiwgInJvdGF0ZTogbmV3IHN1YnNjcmlwdGlvbiBtaXNzaW5nIGtleXMiKTsKICAg\
ICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdXJsID0gYCR7YXBpQ2xpZW50fS92JHtTV19BUElfVkVSU0lPTn0vdXNlcnMvQG1lL3B1c2gvcm90YXRlYDsK\
ICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIGNyZWRlbnRpYWxz\
OiAiaW5jbHVkZSIsCiAgICAgICAgaGVhZGVyczogeyAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0sCiAgICAgICAgYm9keTogSlNPTi5z\
dHJpbmdpZnkoewogICAgICAgICAgb2xkX2VuZHBvaW50OiBvbGRFbmRwb2ludCwKICAgICAgICAgIGVuZHBvaW50OiBuZXdTdWIuZW5kcG9pbnQsCiAgICAg\
ICAgICBrZXlzOiB7IHAyNTZkaCwgYXV0aCB9LAogICAgICAgICAgdXNlcl9hZ2VudDogc2VsZi5uYXZpZ2F0b3IudXNlckFnZW50CiAgICAgICAgfSkKICAg\
ICAgfSk7CiAgICAgIGF3YWl0IGxvZyhyZXMub2sgPyAiaW5mbyIgOiAiZXJyb3IiLCAicm90YXRlOiBzZXJ2ZXIgcmVzcG9uc2UiLCB7IHN0YXR1czogcmVz\
LnN0YXR1cywgb2s6IHJlcy5vayB9KTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGF3YWl0IGxvZygiZXJyb3IiLCAicm90YXRlOiBmZXRjaCBmYWls\
ZWQiLCB7IGVycm9yOiBkZXNjcmliZUVycm9yKGVycm9yKSB9KTsKICAgIH0KICB9OwogIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicHVzaHN1YnNjcmlwdGlv\
bmNoYW5nZSIsIChldmVudCkgPT4gewogICAgZXZlbnQud2FpdFVudGlsKAogICAgICAoYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IGVuc3VyZVNlcnZp\
Y2VXb3JrZXJSZWFkeTsKICAgICAgICBhd2FpdCBsb2coImluZm8iLCAicHVzaHN1YnNjcmlwdGlvbmNoYW5nZSIsIHsKICAgICAgICAgIGhhc09sZDogQm9v\
bGVhbihldmVudC5vbGRTdWJzY3JpcHRpb24pLAogICAgICAgICAgaGFzTmV3OiBCb29sZWFuKGV2ZW50Lm5ld1N1YnNjcmlwdGlvbiksCiAgICAgICAgICBv\
bGRFbmRwb2ludDogZXZlbnQub2xkU3Vic2NyaXB0aW9uPy5lbmRwb2ludCA/PyBudWxsLAogICAgICAgICAgbmV3RW5kcG9pbnQ6IGV2ZW50Lm5ld1N1YnNj\
cmlwdGlvbj8uZW5kcG9pbnQgPz8gbnVsbAogICAgICAgIH0pOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBvbGRFbmRwb2ludCA9IGV2ZW50Lm9s\
ZFN1YnNjcmlwdGlvbj8uZW5kcG9pbnQgPz8gbnVsbDsKICAgICAgICAgIGxldCBhcHBTZXJ2ZXJLZXkgPSBldmVudC5vbGRTdWJzY3JpcHRpb24/Lm9wdGlv\
bnM/LmFwcGxpY2F0aW9uU2VydmVyS2V5ID8/IG51bGw7CiAgICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBmZXRjaEluc3RhbmNlQ29uZmlnKCk7CiAg\
ICAgICAgICBpZiAoIWFwcFNlcnZlcktleSAmJiBjb25maWc/LnZhcGlkS2V5KSB7CiAgICAgICAgICAgIGFwcFNlcnZlcktleSA9IHVybEJhc2U2NFRvVWlu\
dDhBcnJheShjb25maWcudmFwaWRLZXkpLmJ1ZmZlcjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghYXBwU2VydmVyS2V5KSB7CiAgICAgICAgICAgIGF3\
YWl0IGxvZygiZXJyb3IiLCAicHVzaHN1YnNjcmlwdGlvbmNoYW5nZTogbm8gVkFQSUQga2V5IGF2YWlsYWJsZSIpOwogICAgICAgICAgICBhd2FpdCBwb3N0\
TWVzc2FnZVRvQ2xpZW50cyh7IHR5cGU6ICJQVVNIX1NVQlNDUklQVElPTl9DSEFOR0UiIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAg\
ICAgICAgICBjb25zdCBuZXdTdWIgPSBldmVudC5uZXdTdWJzY3JpcHRpb24gPz8gYXdhaXQgc2VsZi5yZWdpc3RyYXRpb24ucHVzaE1hbmFnZXIuc3Vic2Ny\
aWJlKHsKICAgICAgICAgICAgdXNlclZpc2libGVPbmx5OiB0cnVlLAogICAgICAgICAgICBhcHBsaWNhdGlvblNlcnZlcktleTogYXBwU2VydmVyS2V5CiAg\
ICAgICAgICB9KTsKICAgICAgICAgIGlmIChvbGRFbmRwb2ludCAmJiBjb25maWcpIHsKICAgICAgICAgICAgYXdhaXQgcm90YXRlU3Vic2NyaXB0aW9uT25T\
ZXJ2ZXIob2xkRW5kcG9pbnQsIG5ld1N1YiwgY29uZmlnLmFwaUNsaWVudCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhd2FpdCBsb2coIndh\
cm4iLCAicHVzaHN1YnNjcmlwdGlvbmNoYW5nZTogdW5hYmxlIHRvIHJvdGF0ZSBvbiBzZXJ2ZXIiLCB7CiAgICAgICAgICAgICAgaGFzT2xkRW5kcG9pbnQ6\
IEJvb2xlYW4ob2xkRW5kcG9pbnQpLAogICAgICAgICAgICAgIGhhc0NvbmZpZzogQm9vbGVhbihjb25maWcpCiAgICAgICAgICAgIH0pOwogICAgICAgICAg\
fQogICAgICAgICAgYXdhaXQgcG9zdE1lc3NhZ2VUb0NsaWVudHMoeyB0eXBlOiAiUFVTSF9TVUJTQ1JJUFRJT05fQ0hBTkdFIiB9KTsKICAgICAgICB9IGNh\
dGNoIChlcnJvcikgewogICAgICAgICAgYXdhaXQgbG9nKCJlcnJvciIsICJwdXNoc3Vic2NyaXB0aW9uY2hhbmdlIGhhbmRsZXIgZmFpbGVkIiwgeyBlcnJv\
cjogZGVzY3JpYmVFcnJvcihlcnJvcikgfSk7CiAgICAgICAgICBhd2FpdCBwb3N0TWVzc2FnZVRvQ2xpZW50cyh7IHR5cGU6ICJQVVNIX1NVQlNDUklQVElP\
Tl9DSEFOR0UiIH0pLmNhdGNoKCgpID0+IHZvaWQgMCk7CiAgICAgICAgfQogICAgICB9KSgpCiAgICApOwogIH0pOwp9KSgpOwovLyMgc291cmNlTWFwcGlu\
Z1VSTD1zdy5qcy5tYXAK\
";
const CANARY_VERSION_JSON: &str = "\
eyJ2ZXJzaW9uIjoiMjAyNi42MDUuMTE5NDEifQ==\
";
fn decode(b64: &str) -> Vec<u8> { fn decode(b64: &str) -> Vec<u8> {
base64::engine::general_purpose::STANDARD base64::engine::general_purpose::STANDARD
.decode(b64) .decode(b64)
@@ -623,13 +316,6 @@ pub static STABLE_SNAPSHOT: LazyLock<FrozenSnapshot> = LazyLock::new(|| FrozenSn
version_json: decode(STABLE_VERSION_JSON), version_json: decode(STABLE_VERSION_JSON),
}); });
pub static CANARY_SNAPSHOT: LazyLock<FrozenSnapshot> = LazyLock::new(|| FrozenSnapshot {
sha: CANARY_SNAPSHOT_SHA.to_owned(),
index_html: decode(CANARY_INDEX_HTML),
sw_js: decode(CANARY_SW_JS),
version_json: decode(CANARY_VERSION_JSON),
});
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
@@ -639,27 +325,19 @@ mod tests {
assert_eq!(STABLE_SNAPSHOT.sha, STABLE_SNAPSHOT_SHA); assert_eq!(STABLE_SNAPSHOT.sha, STABLE_SNAPSHOT_SHA);
} }
#[test]
fn canary_snapshot_sha_matches() {
assert_eq!(CANARY_SNAPSHOT.sha, CANARY_SNAPSHOT_SHA);
}
#[test] #[test]
fn index_html_decodes_and_starts_with_doctype() { fn index_html_decodes_and_starts_with_doctype() {
assert_index_html(&STABLE_SNAPSHOT); assert_index_html(&STABLE_SNAPSHOT);
assert_index_html(&CANARY_SNAPSHOT);
} }
#[test] #[test]
fn sw_js_decodes_and_is_javascript() { fn sw_js_decodes_and_is_javascript() {
assert_sw_js(&STABLE_SNAPSHOT); assert_sw_js(&STABLE_SNAPSHOT);
assert_sw_js(&CANARY_SNAPSHOT);
} }
#[test] #[test]
fn version_json_decodes_and_is_valid_json() { fn version_json_decodes_and_is_valid_json() {
assert_version_json(&STABLE_SNAPSHOT); assert_version_json(&STABLE_SNAPSHOT);
assert_version_json(&CANARY_SNAPSHOT);
} }
fn assert_index_html(snapshot: &FrozenSnapshot) { fn assert_index_html(snapshot: &FrozenSnapshot) {
+12 -12
View File
@@ -99,11 +99,10 @@ pub fn load_time_freeze_config_for_index_source(
#[cfg(feature = "time-freeze")] #[cfg(feature = "time-freeze")]
fn load_frozen_snapshot(release_channel: ReleaseChannel) -> Option<FrozenSnapshot> { fn load_frozen_snapshot(release_channel: ReleaseChannel) -> Option<FrozenSnapshot> {
let snapshot = match release_channel { match release_channel {
ReleaseChannel::Stable => &*crate::frozen_snapshots::STABLE_SNAPSHOT, ReleaseChannel::Stable => Some(crate::frozen_snapshots::STABLE_SNAPSHOT.clone()),
ReleaseChannel::Canary => &*crate::frozen_snapshots::CANARY_SNAPSHOT, ReleaseChannel::Canary => None,
}; }
Some(snapshot.clone())
} }
#[cfg(not(feature = "time-freeze"))] #[cfg(not(feature = "time-freeze"))]
@@ -291,14 +290,15 @@ mod tests {
#[cfg(feature = "time-freeze")] #[cfg(feature = "time-freeze")]
#[test] #[test]
fn canary_channel_has_frozen_snapshot() { fn canary_channel_has_no_frozen_snapshot() {
let config = load_time_freeze_config(ReleaseChannel::Canary, false); let config = load_time_freeze_config(ReleaseChannel::Canary, false);
assert!(
config.snapshot.is_some(),
"canary channel should have a frozen snapshot"
);
assert_eq!(config.release_channel, ReleaseChannel::Canary); assert_eq!(config.release_channel, ReleaseChannel::Canary);
assert!(should_serve_frozen(&config).is_some()); assert!(config.snapshot.is_none());
assert!(should_serve_frozen(&config).is_none());
let debug = describe_decision(&config);
assert_eq!(debug.decision, TimeFreezeDecision::NoSnapshot);
assert!(debug.snapshot_sha.is_none());
} }
#[test] #[test]
@@ -340,7 +340,7 @@ mod tests {
#[cfg(feature = "time-freeze")] #[cfg(feature = "time-freeze")]
#[test] #[test]
fn exempt_client_gets_live_content_even_with_snapshot() { fn exempt_client_gets_live_content_even_with_snapshot() {
let config = load_time_freeze_config(ReleaseChannel::Canary, true); let config = load_time_freeze_config(ReleaseChannel::Stable, true);
assert!(config.snapshot.is_some()); assert!(config.snapshot.is_some());
assert!(should_serve_frozen(&config).is_none()); assert!(should_serve_frozen(&config).is_none());