INSERT INTO `dbacitemplates` (`id`, `uid`, `customer_id`, `name`, `content`, `created_at`, `updated_at`, `builder`, `is_default`, `theme`, `type`) VALUES
(15, '6037a26b0a200', NULL, 'Abandoned Cart Email #2', '<!DOCTYPE html><html lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>Abandoned Cart Email #2</title>\n\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n  </head>\n  <body class=\"builderjs-layout\">\n    <!--[if mso]>\n        <center>\n        <table><tr><td width=\"760\">\n    <![endif]-->    \n    <div builder-element=\"PageElement\" style=\"padding-top:50px;padding-bottom:50px;\">\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <table builder-element=\"CellContainerElement\" data-layout=\"5-5\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n                        <tr>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                                        <div class=\"container\">\n                                            <img alt=\"Header Logo\" builder-element src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2ltYWdl/logo.png\" width=\"200\">\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                                        <div class=\"container\">\n                                            <div builder-element=\"TextElement\" builder-inline-edit>\n                                                <p style=\"text-align: right;margin-bottom:0;\">\n                                                    <a builder-element href=\"\" style=\"color: #333;margin-bottom:0;\">Open in your browser</a>\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n            </td></tr>\n        </table>\n\n      <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <h3 builder-element builder-inline-edit class=\"display-4 text-center\">Hey, you forgot something</h3>\n                    <h5 builder-element builder-inline-edit class=\"text-center font-weight-normal mt-1 mb-3\">\n                        It seems you forgot some items great in your cart<br>\n                        Purchase now before they are sold out!<br>\n                        Click the items to go back to our store and review your cart\n                    </h5>\n                </div>\n            </td></tr>\n        </table>\n\n        <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n            <div class=\"container\">\n                <div data-items-number=\"4\" builder-element=\"AbandonedCartElement\" data-max-items=\"2\" data-display=\"2\" data-sort-by=\"created_at-desc\" class=\"product-list-widget\">\n                    <div class=\"container\">\n                    <span class=\"woo-button product-preview-but\" style=\"display:none\">Preview</span>\n                    <span class=\"woo-button product-unpreview-but\" style=\"display:none\">Close preview</span>\n                    <div class=\"row py-3 products\">\n                                <div class=\"woo-col-item mb-4 mt-4 col-12 col-md-6 col-sm-6\">\n                                    <div class=\"\">\n                                        <div class=\"img-col mb-3\" style=\"\">\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAw/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                        </div>\n                                        <div class=\"\">\n                                            <p class=\"font-weight-normal product-name mb-1\">\n                                                <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAw/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                            </p>\n                                            <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                            <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAw/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n            border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                                Buy now\n                                            </a>\n                                        </div>\n                                    </div>\n                                </div>\n                            \n                                <div class=\"woo-col-item mb-4 mt-4 col-12 col-md-6 col-sm-6\">\n                                    <div class=\"\">\n                                        <div class=\"img-col mb-3\" style=\"\">\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAw/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                        </div>\n                                        <div class=\"\">\n                                            <p class=\"font-weight-normal product-name mb-1\">\n                                                <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAw/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                            </p>\n                                            <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                            <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAw/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n            border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                                Buy now\n                                            </a>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n      <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div builder-element=\"IconsContainerElement\" class=\"\" style=\"text-align: center;\">\n                        <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"display:inline;\">\n                            <tr>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"facebook\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"Facebook Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2ltYWdlL2ljb25z/facebook.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"linkedin\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"LinkedIn Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2ltYWdlL2ljb25z/linkedin.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"youtube\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"YouTube Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2ltYWdlL2ljb25z/youtube.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"twitter\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"Twitter Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjAwL2ltYWdlL2ljb25z/twitter.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                            </tr>\n                        </table>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div class=\"text-muted\">\n\n                        <div builder-element=\"TextElement\">\n                            <p class=\"m-0\" style=\"text-align: center;padding-bottom:5px;\">Copyright © 2023. All rights reserved.</p>\n                            <p class=\"m-0\" style=\"text-align: center;padding-bottom:5px;\">You can <a builder-element href=\"{UPDATE_PROFILE_URL}\">update your preferences</a> or <a builder-element href=\"{UNSUBSCRIBE_URL}\">unsubscribe from this list</a>.</p>\n                        </div>\n                        \n                        <p builder-element builder-inline-edit style=\"text-align: center;margin-top: 15px;font-size: 13px;\">\n                            <a builder-element href=\"#\" style=\"color:#555;\">Back to top</a>\n                        </p>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n    </div>\n    <!--[if mso]>\n        </td></tr></table>\n        </center>\n    <![endif]--> \n  </body>\n</html>', '2023-09-11 18:36:07', '2023-09-11 18:36:07', 1, 1, NULL, 'email'),
(16, '6037a26b0a211', NULL, 'Abandoned Cart Email #3', '<!DOCTYPE html><html lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>Abandoned Cart Email #3</title>\n\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n  </head>\n  <body class=\"builderjs-layout\">\n    <!--[if mso]>\n        <center>\n        <table><tr><td width=\"760\">\n    <![endif]-->    \n    <div builder-element=\"PageElement\" style=\"padding-top:50px;padding-bottom:50px;\">\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <table builder-element=\"CellContainerElement\" data-layout=\"5-5\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n                        <tr>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                                        <div class=\"container\">\n                                            <img alt=\"Header Logo\" builder-element src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdl/logo.png\" width=\"200\">\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                                        <div class=\"container\">\n                                            <div builder-element=\"TextElement\" builder-inline-edit>\n                                                <p style=\"text-align: right;margin-bottom:0;\">\n                                                    <a builder-element href=\"\" style=\"color: #333;margin-bottom:0;\">Open in your browser</a>\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n            </td></tr>\n        </table>\n\n      <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <h3 builder-element builder-inline-edit class=\"display-4 text-center\">Hey, you forgot something</h3>\n                    <h5 builder-element builder-inline-edit class=\"text-center font-weight-normal mt-1 mb-3\">\n                        It seems you forgot some items great in your cart<br>\n                        Purchase now before they are sold out!<br>\n                        Click the items to go back to our store and review your cart\n                    </h5>\n                </div>\n            </td></tr>\n        </table>\n        <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n            <div class=\"container\">\n                <div data-items-number=\"3\" builder-element=\"AbandonedCartElement\" data-max-items=\"3\" data-display=\"3\" data-sort-by=\"created_at-desc\" class=\"product-list-widget\">\n                    <div class=\"container\">\n                    <span class=\"woo-button product-preview-but\" style=\"display:none\">Preview</span>\n                    <span class=\"woo-button product-unpreview-but\" style=\"display:none\">Close preview</span>\n                    <div class=\"row py-3 products\">\n                                <div class=\"woo-col-item mb-4 mt-4 col-12 col-md-4 col-sm-6\">\n                                    <div class=\"\">\n                                        <div class=\"img-col mb-3\" style=\"\">\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                        </div>\n                                        <div class=\"\">\n                                            <p class=\"font-weight-normal product-name mb-1\">\n                                                <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                            </p>\n                                            <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                            <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n            border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                                Buy now\n                                            </a>\n                                        </div>\n                                    </div>\n                                </div>\n                            \n                                <div class=\"woo-col-item mb-4 mt-4 col-12 col-md-4 col-sm-6\">\n                                    <div class=\"\">\n                                        <div class=\"img-col mb-3\" style=\"\">\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                        </div>\n                                        <div class=\"\">\n                                            <p class=\"font-weight-normal product-name mb-1\">\n                                                <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                            </p>\n                                            <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                            <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n            border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                                Buy now\n                                            </a>\n                                        </div>\n                                    </div>\n                                </div>\n                            \n                                <div class=\"woo-col-item mb-4 mt-4 col-12 col-md-4 col-sm-6\">\n                                    <div class=\"\">\n                                        <div class=\"img-col mb-3\" style=\"\">\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                        </div>\n                                        <div class=\"\">\n                                            <p class=\"font-weight-normal product-name mb-1\">\n                                                <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                            </p>\n                                            <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                            <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                            <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjEx/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n            border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                                Buy now\n                                            </a>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n      <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div builder-element=\"IconsContainerElement\" class=\"\" style=\"text-align: center;\">\n                        <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"display:inline;\">\n                            <tr>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"facebook\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"Facebook Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdlL2ljb25z/facebook.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"linkedin\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"LinkedIn Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdlL2ljb25z/linkedin.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"youtube\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"YouTube Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdlL2ljb25z/youtube.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"twitter\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"Twitter Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjExL2ltYWdlL2ljb25z/twitter.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                            </tr>\n                        </table>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div class=\"text-muted\">\n\n                        <div builder-element=\"TextElement\">\n                            <p class=\"m-0\" style=\"text-align: center;padding-bottom:5px;\">Copyright © 2023. All rights reserved.</p>\n                            <p class=\"m-0\" style=\"text-align: center;padding-bottom:5px;\">You can <a builder-element href=\"{UPDATE_PROFILE_URL}\">update your preferences</a> or <a builder-element href=\"{UNSUBSCRIBE_URL}\">unsubscribe from this list</a>.</p>\n                        </div>\n                        \n                        <p builder-element builder-inline-edit style=\"text-align: center;margin-top: 15px;font-size: 13px;\">\n                            <a builder-element href=\"#\" style=\"color:#555;\">Back to top</a>\n                        </p>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n    </div>\n    <!--[if mso]>\n        </td></tr></table>\n        </center>\n    <![endif]--> \n  </body>\n</html>', '2023-09-11 18:36:07', '2023-09-11 18:36:07', 1, 1, NULL, 'email'),
(17, '6037a26b0a244', NULL, 'Abandoned Cart Email #4', '<!DOCTYPE html><html lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>Abandoned Cart Email #4</title>\n\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n  </head>\n  <body class=\"builderjs-layout\">\n    <!--[if mso]>\n        <center>\n        <table><tr><td width=\"760\">\n    <![endif]-->    \n    <div builder-element=\"PageElement\" style=\"padding-top:50px;padding-bottom:50px;\">\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <table builder-element=\"CellContainerElement\" data-layout=\"5-5\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n                        <tr>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                                        <div class=\"container\">\n                                            <img alt=\"Header Logo\" builder-element src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdl/logo.png\" width=\"200\">\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                                        <div class=\"container\">\n                                            <div builder-element=\"TextElement\" builder-inline-edit>\n                                                <p style=\"text-align: right;margin-bottom:0;\">\n                                                    <a builder-element href=\"\" style=\"color: #333;margin-bottom:0;\">Open in your browser</a>\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n            </td></tr>\n        </table>\n\n      <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <h3 builder-element builder-inline-edit class=\"display-4 text-center\">Hey, you forgot something</h3>\n                    <h5 builder-element builder-inline-edit class=\"text-center font-weight-normal mt-1 mb-3\">\n                        It seems you forgot some items great in your cart<br>\n                        Purchase now before they are sold out!<br>\n                        Click the items to go back to our store and review your cart\n                    </h5>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div data-items-number=\"4\" builder-element=\"AbandonedCartElement\" data-max-items=\"4\" data-display=\"4\" data-sort-by=\"created_at-desc\" class=\"product-list-widget\">\n                        <div class=\"container\">\n                        <span class=\"woo-button product-preview-but\" style=\"display:none\">Preview</span>\n                        <span class=\"woo-button product-unpreview-but\" style=\"display:none\">Close preview</span>\n                        <div class=\"row py-3 products\">\n                            <div class=\"woo-col-item mb-4 mt-4 col-12 col-sm-6 col-md-3\">\n                                <div class=\"\">\n                                    <div class=\"img-col mb-3\">\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                    </div>\n                                    <div class=\"\">\n                                        <p class=\"font-weight-normal product-name mb-1\">\n                                            <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                        </p>\n                                        <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                        <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n                border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                            Buy now\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"woo-col-item mb-4 mt-4 col-12 col-sm-6 col-md-3\">\n                                <div class=\"\">\n                                    <div class=\"img-col mb-3\">\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                    </div>\n                                    <div class=\"\">\n                                        <p class=\"font-weight-normal product-name mb-1\">\n                                            <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                        </p>\n                                        <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                        <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n                border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                            Buy now\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"woo-col-item mb-4 mt-4 col-12 col-sm-6 col-md-3\">\n                                <div class=\"\">\n                                    <div class=\"img-col mb-3\">\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                    </div>\n                                    <div class=\"\">\n                                        <p class=\"font-weight-normal product-name mb-1\">\n                                            <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                        </p>\n                                        <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                        <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n                border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                            Buy now\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"woo-col-item mb-4 mt-4 col-12 col-sm-6 col-md-3\">\n                                <div class=\"\">\n                                    <div class=\"img-col mb-3\">\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\"><img src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdl/cart_item.svg\" width=\"100%\"></a>\n                                    </div>\n                                    <div class=\"\">\n                                        <p class=\"font-weight-normal product-name mb-1\">\n                                            <a style=\"color: #333;\" href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" class=\"mr-4\">*|PRODUCT_NAME|*</a>\n                                        </p>\n                                        <p class=\" product-description\">*|PRODUCT_DESCRIPTION|*</p>\n                                        <p><strong>*|PRODUCT_PRICE|*</strong></p>\n                                        <a href=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0/*|PRODUCT_URL|*\" style=\"background-color: #9b5c8f;\n                border-color: #9b5c8f;\" class=\"btn btn-primary text-white\">\n                                            Buy now\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n                        </div></div>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n\n      <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div builder-element=\"IconsContainerElement\" class=\"\" style=\"text-align: center;\">\n                        <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"display:inline;\">\n                            <tr>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"facebook\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"Facebook Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdlL2ljb25z/facebook.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"linkedin\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"LinkedIn Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdlL2ljb25z/linkedin.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"youtube\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"YouTube Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdlL2ljb25z/youtube.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                                <td style=\"padding-right: 15px\">\n                                    <a builder-element=\"IconLinkElement\" data-value=\"twitter\" href=\"\" class=\"d-inline-block\">\n                                        <span class=\"social-icon\">\n                                            <img alt=\"Twitter Icon\" src=\"/assets/YXBwL3RlbXBsYXRlcy82MDM3YTI2YjBhMjQ0L2ltYWdlL2ljb25z/twitter.png\" height=\"35\" width=\"auto\">\n                                        </span>\n                                    </a>\n                                </td>\n                            </tr>\n                        </table>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div class=\"text-muted\">\n\n                        <div builder-element=\"TextElement\">\n                            <p class=\"m-0\" style=\"text-align: center;padding-bottom:5px;\">Copyright © 2023. All rights reserved.</p>\n                            <p class=\"m-0\" style=\"text-align: center;padding-bottom:5px;\">You can <a builder-element href=\"{UPDATE_PROFILE_URL}\">update your preferences</a> or <a builder-element href=\"{UNSUBSCRIBE_URL}\">unsubscribe from this list</a>.</p>\n                        </div>\n                        \n                        <p builder-element builder-inline-edit style=\"text-align: center;margin-top: 15px;font-size: 13px;\">\n                            <a builder-element href=\"#\" style=\"color:#555;\">Back to top</a>\n                        </p>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n    </div>\n    <!--[if mso]>\n        </td></tr></table>\n        </center>\n    <![endif]--> \n  </body>\n</html>', '2023-09-11 18:36:07', '2023-09-11 18:36:07', 1, 1, NULL, 'email');
INSERT INTO `dbacitemplates` (`id`, `uid`, `customer_id`, `name`, `content`, `created_at`, `updated_at`, `builder`, `is_default`, `theme`, `type`) VALUES
(18, '5d7b526bbfd7c', NULL, 'Linkedin Inspiration', '<!DOCTYPE html><html lang=\"en\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>LinkedIn Inspired</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i,700,700i&amp;subset=cyrillic,cyrillic-ext,greek,greek-ext,latin-ext,vietnamese\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        [builder-element=CellElement] .container {\n            padding: 0;\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n            display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n            display: none!important;\n            }\n        }\n        @media (max-width: 767px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"], [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 768px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n        [builder-element=\"PageElement\"] {\n            width: 600px;\n        }\n        @media (max-width: 768px) {\n            [builder-element=\"PageElement\"] {\n                width: calc(100% - 40px);\n            }\n        }\n    </style>\n  </head>\n  <body class=\"builderjs-layout\">    \n\n    <!--[if mso]>\n        <center>\n        <table><tr><td width=\"760\">\n    <![endif]-->    \n    <div builder-element=\"PageElement\" style=\"\n        padding-top:0;\n        padding-bottom:0;\n        background: #fff;\n        margin: auto;\n        border-radius:2px;\n        box-shadow: 0 0 3px rgba(0,0,0,0.05);\">\n        \n    \n        \n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <table builder-element=\"CellContainerElement\" data-layout=\"5-5\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n                        <tr>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:5px;padding-bottom:5px\">\n                                        <div class=\"container\">\n                                            <a builder-element href=\"\" style=\"display:inline-block;\">\n                                                <img builder-element builder-inline-edit src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/icon-left.jpg\" width=\"40\">\n                                            </a>\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                            <td builder-element=\"CellElement\" valign=\"top\" width=\"50%\" class=\"responsive-column\">\n                                <table width=\"100%\" builder-element=\"BlockElement\">\n                                    <tr><td style=\"padding-top:5px;padding-bottom:5px;text-align:right;\">\n                                        <div class=\"container\">\n                                            <a builder-element href=\"\" style=\"display:inline-block;\">\n                                                <img builder-element builder-inline-edit src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/icon-right.png\" width=\"40\">\n                                            </a>\n                                        </div>\n                                    </td></tr>\n                                </table>\n                            </td>\n                        </tr>\n                    </table>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <h2 builder-element style=\"text-align: center;\">Your network hightlights</h2>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <div style=\"display: flex;align-items: center;\">\n                        <div style=\"margin-right:10px;\">\n                            <img builder-element builder-inline-edit src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/mcdonald.jpg\" width=\"80\">\n                        </div>\n                        <div>\n                            <p builder-element style=\"margin-bottom: 0;font-weight: bold;\">\n                                McDonald\'s	McDonald\'s\n                            </p>\n                            <p builder-element style=\"margin-bottom: 0;\">\n                                1,744,705 followers\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </td></tr>\n        </table>\n        \n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <p builder-element style=\"margin-bottom: 0;\">\n                        When you hear “McDonald’s,” you probably don’t think “small business.” But small businesses owned by women,...\n                        <a builder-element href=\"\" style=\"font-weight: bold;\">see more</a>\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:0px;padding-bottom:0px\">\n                <div class=\"container\">\n                    <p builder-element style=\"margin-bottom: 0;\">\n                        <a builder-element href=\"\" style=\"display:inline-block;\">\n                            <img builder-element builder-inline-edit src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/like.jpg\">\n                        </a>\n                        <a builder-element href=\"\" style=\"display:inline-block;\">\n                            <img builder-element builder-inline-edit src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/bravo.jpg\">\n                        </a>\n                        <a builder-element href=\"\" style=\"display:inline-block;\">\n                            <img builder-element builder-inline-edit src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/heart.jpg\">\n                        </a>\n                        351 · 5 Comments\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:25px;padding-bottom:15px\">\n                <div class=\"container\">\n                    <p builder-element style=\"margin-bottom: 0;\">\n                        <button data-style=\"style_16\" builder-element style=\"    background: #fff;\n                        border: solid 1px #2d64bc;\n                        border-radius: 100px;\n                        padding: 10px 25px;\n                        display: inline-block;\n                        color: #2d64bc;\">Read more</button>\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:25px;padding-bottom:0\">\n                <div class=\"container\">\n                    <a builder-element href=\"\" style=\"display:inline-block;text-align: center;\">\n                        <img builder-element builder-inline-edit src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/banner1.png\" width=\"100%\">\n                    </a>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:0;padding-bottom:15px\">\n                <div class=\"container\">\n                    <a builder-element href=\"\" style=\"display:inline-block;text-align: center;font-weight:bold;background-color:#f3f2ef;padding-top:10px;padding-bottom:10px;border-radius:0 0 10px 10px;font-size: 14px;\">\n                        <span style=\"color: #333;\">Meet the Women Behind Some of McDonald\'s Most Iconic (And Essential) Ingredients—And How They\'re Setting New Standards</span>\n                    </a>\n                </div>\n            </td></tr>\n        </table>\n\n\n    </div>\n    <!--[if mso]>\n        </td></tr></table>\n        </center>\n    <![endif]--> \n\n\n    <!--[if mso]>\n        <center>\n        <table><tr><td width=\"760\">\n    <![endif]-->    \n    <div builder-element=\"PageElement\" style=\"\n            padding-top:0;\n            padding-bottom:0;\n            margin: auto;\n            border-radius:2px;\">\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:25px;padding-bottom:15px;text-align:center;\">\n                <div class=\"container\">        \n                    <p builder-element style=\"margin-bottom:0;\">\n                        <button data-style=\"style_15\" builder-element style=\"background: #2d64bc;\n                        font-weight:bold;\n                        border: solid 1px #2d64bc;\n                        border-radius: 100px;\n                        padding: 10px 25px;\n                        display: inline-block;\n                        color: #fff;\">See more on LinkedIn</button>\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:35px;padding-bottom:0;\">\n                <div class=\"container\">\n                    <p builder-element style=\"font-size: 13px;margin-bottom: 0;\">\n                        This email was intended for Sorrento Corp (Search Engine Optimization Specialist at McDonald\'s). Learn why we included this.\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:0;\">\n                <div class=\"container\">\n                    <p builder-element style=\"font-size: 13px;margin-bottom: 0;\">\n                        You are receiving Network Conversations emails.\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:0;\">\n                <div class=\"container\">\n                    <p builder-element style=\"font-size: 13px;margin-bottom: 0;\">\n                        <a builder-element href=\"{UNSUBSCRIBE_URL}\">Unsubscribe</a>  ·  \n                        <a builder-element href=\"\">Help</a>\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:0;\">\n                <div class=\"container\">\n                    <p builder-element style=\"font-size: 13px;margin-bottom: 0;\">\n                        <a builder-element href=\"\">\n                            <img builder-element src=\"/assets/YXBwL3RlbXBsYXRlcy81ZDdiNTI2YmJmZDdjL2ltYWdl/linkedin-long.png\" width=\"60\">\n                        </a>\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n        <table width=\"100%\" builder-element=\"BlockElement\">\n            <tr><td style=\"padding-top:15px;padding-bottom:0;\">\n                <div class=\"container\">\n                    <p builder-element style=\"font-size: 13px;margin-bottom: 0;\">\n                        © 2023 LinkedIn Corporation, 1‌000 West Maude Avenue, Sunnyvale, CA 94085. LinkedIn and the LinkedIn logo are registered trademarks of LinkedIn.\n                    </p>\n                </div>\n            </td></tr>\n        </table>\n\n    </div>\n    <!--[if mso]>\n        </td></tr></table>\n        </center>\n    <![endif]--> \n  </body>\n</html>', '2023-09-11 18:36:07', '2023-09-11 18:36:07', 1, 1, NULL, 'email'),
(19, '6002a2135b900', NULL, 'Right banner', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAwL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAwL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width: 100%\" data-new-gr-c-s-loaded=\"9.38.0\">    \n        <div builder-element=\"PageElement\" style=\"\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div class=\"d-flex\">\n                        <div class=\"main-container\">\n                            <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                <div class=\"container\">\n                                    <h2 builder-element=\"\" builder-inline-edit=\"\" class=\"mt-3\">{LIST_NAME}</h2>\n                                    <p class=\"mb-0\" builder-element=\"\" builder-inline-edit=\"\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tristique ligula ac ipsum interdum.</p>\n                                </div>\n                            </div>\n                            <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                \n                            </div>\n                            <div builder-element=\"\" builder-draggable>\n                                <div class=\"container\">\n                                    <div builder-element=\"TextElement\" class=\"mt-4 text-center small\">\n                                        Made by <span class=\"fw-bold\">YourBrand</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <div builder-element=\"PopupBannerElement\" class=\"banner-container\" style=\"\n                            background-image: url(\'/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAwL2ltYWdl/placeholder.svg\');\n                            background-size: auto 800px;\n                            background-position: center center;\n                        \">\n                            \n                        </div>\n                    </div>\n                </form-section>\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup'),
(20, '6002a2135b901', NULL, 'Left banner', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAxL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAxL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width: 100%\" data-new-gr-c-s-loaded=\"9.38.0\">   \n        <div builder-element=\"PageElement\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div class=\"d-flex\">\n                        <div builder-element=\"PopupBannerElement\" class=\"banner-container\" style=\"\n                            background-image: url(\'/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAxL2ltYWdl/placeholder.svg\');\n                            background-size: auto 800px;\n                            background-position: center center;\n                        \">\n                            \n                        </div>\n                        <div class=\"main-container\">\n                            <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                <div class=\"container\">\n                                    <h2 builder-element=\"\" builder-inline-edit=\"\" class=\"mt-3\">{LIST_NAME}</h2>\n                                    <p class=\"mb-0\" builder-element=\"\" builder-inline-edit=\"\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tristique ligula ac ipsum interdum.</p>\n                                </div>\n                            </div>\n                            <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                \n                            </div>\n                            <div builder-element=\"\" builder-draggable>\n                                <div class=\"container\">\n                                    <div builder-element=\"TextElement\" class=\"mt-4 text-center small\">\n                                        Made by <span class=\"fw-bold\">YourBrand</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </form-section>\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup'),
(21, '6002a2135b902', NULL, 'Top banner', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAyL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAyL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width: 100%\" data-new-gr-c-s-loaded=\"9.38.0\">    \n        <div builder-element=\"PageElement\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div>\n                        <div builder-element=\"PopupBannerElement\" class=\"banner-container\" style=\"\n                            background-image: url(\'/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAyL2ltYWdl/placeholder.svg\');\n                            background-size: auto 400%;\n                            background-position: center center;\n                            height: 160px;\n                        \">\n                            \n                        </div>\n                        <div class=\"main-container\">\n                            <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                <div class=\"container\">\n                                    <h2 builder-element=\"\" builder-inline-edit=\"\" class=\"mt-3\">{LIST_NAME}</h2>\n                                    <p class=\"mb-0\" builder-element=\"\" builder-inline-edit=\"\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tristique ligula ac ipsum interdum.</p>\n                                </div>\n                            </div>\n                            <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                \n                            </div>\n                            <div builder-element=\"\" builder-draggable>\n                                <div class=\"container\">\n                                    <div builder-element=\"TextElement\" class=\"mt-4 text-center small\">\n                                        Made by <span class=\"fw-bold\">YourBrand</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </form-section>\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup'),
(22, '6002a2135b903', NULL, 'Bottom banner', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAzL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAzL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width: 100%\" data-new-gr-c-s-loaded=\"9.38.0\">    \n        <div builder-element=\"PageElement\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div>\n                        <div class=\"main-container\">\n                            <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                <div class=\"container\">\n                                    <h2 builder-element=\"\" builder-inline-edit=\"\" class=\"mt-3\">{LIST_NAME}</h2>\n                                    <p class=\"mb-0\" builder-element=\"\" builder-inline-edit=\"\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tristique ligula ac ipsum interdum.</p>\n                                </div>\n                            </div>\n                            <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                \n                            </div>\n                            <div builder-element=\"\" builder-draggable>\n                                <div class=\"container\">\n                                    <div builder-element=\"TextElement\" class=\"mt-4 text-center small\">\n                                        Made by <span class=\"fw-bold\">YourBrand</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <div builder-element=\"PopupBannerElement\" class=\"banner-container\" style=\"\n                            background-image: url(\'/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTAzL2ltYWdl/placeholder.svg\');\n                            background-size: auto 400%;\n                            background-position: center center;\n                            height: 160px;\n                        \">\n                            \n                        </div>\n                    </div>\n                </form-section>\n\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup'),
(23, '6002a2135b904', NULL, 'Bottom banner', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTA0L2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAyYTIxMzViOTA0L2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width: 100%\" data-new-gr-c-s-loaded=\"9.38.0\">    \n        <div builder-element=\"PageElement\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div>\n                        <div class=\"main-container\">\n                            <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                <div class=\"container\">\n                                    <h2 builder-element=\"\" builder-inline-edit=\"\" class=\"mt-3\">{LIST_NAME}</h2>\n                                    <p class=\"mb-0\" builder-element=\"\" builder-inline-edit=\"\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tristique ligula ac ipsum interdum.</p>\n                                </div>\n                            </div>\n                            <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                \n                            </div>\n                            <div builder-element=\"\" builder-draggable>\n                                <div class=\"container\">\n                                    <div builder-element=\"TextElement\" class=\"mt-4 text-center small\">\n                                        Made by <span class=\"fw-bold\">YourBrand</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </form-section>\n\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup'),
(24, '60cca2135b900', NULL, 'Dark Simple', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MGNjYTIxMzViOTAwL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MGNjYTIxMzViOTAwL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width:100%;\" data-new-gr-c-s-loaded=\"9.38.0\">    \n        <div builder-element=\"PageElement\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div class=\"d-flex\">\n                        <div builder-element=\"PopupBannerElement\" class=\"banner-container\" style=\"\n                            background-image: url(\'/assets/YXBwL3RlbXBsYXRlcy82MGNjYTIxMzViOTAwL2ltYWdl/form-img.jpg\');\n                            background-size: auto 100%;\n                            background-position: center center;\n                        \">\n                            \n                        </div>\n                        <div class=\"main-container\">\n                            <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                <div class=\"container\">\n                                    <h2 builder-element=\"\" builder-inline-edit=\"\" class=\"mt-3\">{LIST_NAME}</h2>\n                                    <p class=\"mb-0\" builder-element=\"\" builder-inline-edit=\"\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tristique ligula ac ipsum interdum.</p>\n                                </div>\n                            </div>\n                            <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                \n                            </div>\n                            <div builder-element=\"\" builder-draggable>\n                                <div class=\"container\">\n                                    <div builder-element=\"TextElement\" class=\"mt-4 text-center small\">\n                                        Made by <span class=\"fw-bold\">YourBrand</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </form-section>\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup');
INSERT INTO `dbacitemplates` (`id`, `uid`, `customer_id`, `name`, `content`, `created_at`, `updated_at`, `builder`, `is_default`, `theme`, `type`) VALUES
(25, '6003a2250a3a3', NULL, 'Sign Up Illustration', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAzYTIyNTBhM2EzL2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDAzYTIyNTBhM2EzL2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width: 100%\" data-new-gr-c-s-loaded=\"9.38.0\">    \n        <div builder-element=\"PageElement\" style=\"\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div class=\"d-flex\">\n                        <div class=\"main-container\">\n                            <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                <div class=\"container\">\n                                    <h1 builder-element=\"\" builder-inline-edit=\"\" class=\"mb-3 mt-5\">Sign up</h1>\n                                    <p class=\"mb-0\" builder-element=\"\" builder-inline-edit=\"\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tristique ligula ac ipsum interdum.</p>\n                                </div>\n                            </div>\n                            <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                \n                            </div>\n                            <div builder-element=\"\" builder-draggable>\n                                <div class=\"container\">\n                                    <div builder-element=\"TextElement\" class=\"mt-4 text-center small\">\n                                        Made by <span class=\"fw-bold\">YourBrand</span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        <div builder-element=\"PopupBannerElement\" class=\"banner-container\" style=\"\n                            background-image: url(\'/assets/YXBwL3RlbXBsYXRlcy82MDAzYTIyNTBhM2EzL2ltYWdl/signup-image.jpg\');\n                            background-size: auto 210px;\n                            background-position: center center;\n                            background-repeat: no-repeat;\n                        \">\n                            \n                        </div>\n                    </div>\n                </form-section>\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup'),
(26, '6004a28418c95', NULL, 'Profile Center', '<!DOCTYPE html><html lang=\"en\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n        <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n        <title>Two column layout</title>\n\n        <!-- Bootstrap core CSS -->\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDA0YTI4NDE4Yzk1L2Nzcw/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/assets/YXBwL3RlbXBsYXRlcy82MDA0YTI4NDE4Yzk1L2Nzcw/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n        \n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n        <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n    </head>\n    <body style=\"width: 100%;background: url(/assets/YXBwL3RlbXBsYXRlcy82MDA0YTI4NDE4Yzk1L2ltYWdl/bg.jpg);\" data-new-gr-c-s-loaded=\"9.38.0\">    \n        <div builder-element=\"PageElement\" style=\"\">\n            <div builder-element=\"BlockElement\" builder-wrapper>\n                <form-section>\n                    <div>\n                        <div class=\"main-container px-5 pt-5 pb-3 text-center d-flex justify-content-center\">\n                            <div class=\"pt-4\" style=\"width: 450px\">\n                                <div builder-element=\"BlockElement\" style=\"padding-top:15px;padding-bottom:15px\">\n                                    <div class=\"container\">\n                                        <img builder-element src=\"/assets/YXBwL3RlbXBsYXRlcy82MDA0YTI4NDE4Yzk1L2ltYWdl/lena.jfif\" class=\"avatar\">\n                                        <h1 builder-element=\"\" builder-inline-edit=\"\" class=\"my-3\">Lena Swift</h1>\n                                    </div>\n                                </div>\n                                <div builder-element=\"BlockElement\" builder-container=\"\" style=\"min-height: 100px\" id=\"formContainer\">              \n                                    \n                                </div>\n                                <div builder-element=\"\" builder-draggable>\n                                    <div class=\"container\">\n                                        <div class=\"mt-4 text-center small\">\n                                            Made by <span class=\"fw-bold\">YourBrand</span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </form-section>\n\n                <message-section style=\"display: none;\">\n                    <div builder-element=\"PageElement\">\n                        <div builder-element=\"BlockElement\" style=\"padding-top:60px;padding-bottom:15px\">\n                            <div class=\"container\">\n                                <h1 builder-element builder-inline-edit builder-draggable style=\"text-align: center;font-weight: normal;\">Thanks for subscribing!</h1>\n                            </div>\n                        </div>\n                    </div>\n                </message-section>\n            </div>\n        </div>\n    </body>\n</html>', '2023-09-11 18:36:08', '2023-09-11 18:36:08', 1, 1, NULL, 'popup');
INSERT INTO `dbacitemplates` (`id`, `uid`, `customer_id`, `name`, `content`, `created_at`, `updated_at`, `builder`, `is_default`, `theme`, `type`) VALUES
(27, '64ff608d9dadf', 1, 'Untitled template', '<!DOCTYPE html><html lang=\"en\"><head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>Blank</title>\n\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MDhkOWRhZGYvY3Nz/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MDhkOWRhZGYvY3Nz/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n  <script>/*\n * This entire block is wrapped in an IIFE to prevent polluting the scope of the web page with\n * functions created by this extension.\n */\n(function(realOpen, realSend, realFetch) {\n    /*\n     * Sometimes pages overwrite standard objects with global\n     * variables. Where possible, we extract fresh versions from an\n     * iframe.\n     */\n    const iframe = document.createElement(\'iframe\');\n    document.documentElement.appendChild(iframe);\n\n    // Initialise with global values\n    let URL = window.URL;\n    let WeakMap = window.WeakMap;\n    let WeakSet = window.WeakSet;\n    let TextDecoder = window.TextDecoder;\n    let Uint8Array = window.Uint8Array;\n    let decodeURIComponent = window.decodeURIComponent;\n    let URLSearchParams = window.URLSearchParams;\n    let Array = window.Array;\n    let Object = window.Object;\n    let atob = window.atob;\n    let CustomEvent = window.CustomEvent;\n    let performance = window.performance;\n    let JSON = window.JSON;\n\n    /*\n     * Under some circumstances the iframe isn\'t added\n     * successfully. If it has a contentWindow then we can extract the\n     * values from it, but otherwise we fall back on the global\n     * values.\n     */\n    if (iframe.contentWindow) {\n        // Try block because sometimes the CORS prevents access to iframe\n        try {\n            URL = iframe.contentWindow.URL;\n            WeakMap = iframe.contentWindow.WeakMap;\n            WeakSet = iframe.contentWindow.WeakSet;\n            TextDecoder = iframe.contentWindow.TextDecoder;\n            Uint8Array = iframe.contentWindow.Uint8Array;\n            decodeURIComponent = iframe.contentWindow.decodeURIComponent;\n            URLSearchParams = iframe.contentWindow.URLSearchParams;\n            Array = iframe.contentWindow.Array;\n            Object = iframe.contentWindow.Object;\n            atob = iframe.contentWindow.atob;\n            CustomEvent = iframe.contentWindow.CustomEvent;\n            performance = iframe.contentWindow.performance;\n            JSON = iframe.contentWindow.JSON;\n        } catch (error) {\n            // Empty catch block to prevent errors from showing in page logs\n        }\n    }\n\n    // If iframe was added successfully, remove it\n    if (iframe.parentNode) {\n        iframe.parentNode.removeChild(iframe);\n    }\n\n    /*\n     * If any of the values don\'t have the correct type, return and\n     * don\'t attempt any monkey patching. This avoids breaking web\n     * pages.\n     */\n    for (f of [\n        URL,\n        WeakMap,\n        WeakSet,\n        TextDecoder,\n        Uint8Array,\n        decodeURIComponent,\n        URLSearchParams,\n        Array,\n        Object,\n        atob,\n        CustomEvent,\n    ]) {\n        if (typeof f !== \'function\') {\n            return;\n        }\n    }\n\n    for (o of [performance, JSON]) {\n        if (typeof o !== \'object\') {\n            return;\n        }\n    }\n\n    /*\n     * Override common funcions that accept callbacks, such as\n     * setInterval, to keep track of what script each callback comes\n     * from. Skimmers commonly have the actual skimming code in a\n     * callback, so most of the time when we intercept a request,\n     * document.currentScript is null. To solve this, the script is\n     * stored in a closure when the callback is passed, and assigned\n     * to callbackCurrentscript when the callback is run.\n     */\n\n    let callbackCurrentScript = null;\n\n    // Maps callbacks originally passed to patched versions\n    const patchedCallbackMap = new WeakMap();\n\n    // Maps patched callbacks to original versions\n    const originalCallbackMap = new WeakMap();\n\n    /**\n     *  Generates the function with which to override the\n     *  callback-accepting functions.\n     *  @param realFn The real function, e.g. setInterval.\n     *  @param callbackIndex The index of the callback in the\n     *  arguments of realFn. For example, the callback is the first\n     *  argument in setInterval, so callbackIndex should be 0.\n     */\n    function generateAddCallbackFunction(realFn, callbackIndex) {\n        const patched = function(...args) {\n            const script = document.currentScript || callbackCurrentScript;\n\n            const callback = args[callbackIndex];\n\n            // If the callback isn\'t a function, there\'s nothing to patch\n            if (typeof callback !== \'function\') {\n                return realFn.apply(this, args);\n            }\n\n            // If a patch exists, use it instead of creating new function\n            let patchedCallback = patchedCallbackMap.get(callback);\n            if (!patchedCallback) {\n                patchedCallback = function() {\n                    callbackCurrentScript = script;\n                    const retVal = callback.apply(this, [...arguments]);\n                    callbackCurrentScript = null;\n                    return retVal;\n                };\n                patchedCallbackMap.set(callback, patchedCallback);\n                originalCallbackMap.set(patchedCallback, callback);\n            }\n\n            args[callbackIndex] = patchedCallback;\n            return realFn.apply(this, args);\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    const realSetInterval = window.setInterval;\n\n    window.setInterval = generateAddCallbackFunction(realSetInterval, 0);\n\n    const realSetTimeout = window.setTimeout;\n\n    window.setTimeout = generateAddCallbackFunction(realSetTimeout, 0);\n\n    const realPromiseThen = Promise.prototype.then;\n    Promise.prototype.then = generateAddCallbackFunction(realPromiseThen, 0);\n\n    const realPromiseCatch = Promise.prototype.catch;\n    Promise.prototype.catch = generateAddCallbackFunction(realPromiseCatch, 0);\n\n    const realPromiseFinally = Promise.prototype.finally;\n    if (realPromiseFinally) {\n        Promise.prototype.finally = generateAddCallbackFunction(\n            realPromiseFinally,\n            0\n        );\n    }\n\n    const realAddEventListener = EventTarget.prototype.addEventListener;\n\n    EventTarget.prototype.addEventListener = generateAddCallbackFunction(\n        realAddEventListener,\n        1\n    );\n\n    /*\n     * removeEventListener needs to be patched to map the passed\n     * listener to the patched listener.\n     */\n    const realRemoveEventListener = EventTarget.prototype.removeEventListener;\n    EventTarget.prototype.removeEventListener = function(...args) {\n        args[1] = patchedCallbackMap.get(args[1]) || args[1];\n\n        return realRemoveEventListener.apply(this, args);\n    };\n    EventTarget.prototype.removeEventListener.toString = () =>\n        realRemoveEventListener.toString();\n\n    /*\n     * Event listeners are sometimes set by directly assigning to a\n     * property from the GlobalEventHandlers mixin,\n     * e.g. \'submitBtn.onclick\'. For each of the GlobalEventHandlers\n     * implementations that are likely to be relevant, the event\n     * properties likely to be used by skimmers are overridden with\n     * our version that tracks currentScript when assigned.\n     */\n    for (const eventTarget of [\n        HTMLElement.prototype,\n        Document.prototype,\n        window,\n    ]) {\n        for (const eventName of [\n            \'onclick\',\n            \'onblur\',\n            \'onfocus\',\n            \'onchange\',\n            \'oninput\',\n            \'onkeydown\',\n            \'onkeypress\',\n            \'onkeyup\',\n            \'onload\',\n            \'onloadend\',\n            \'onmousedown\',\n            \'onmouseenter\',\n            \'onmouseleave\',\n            \'onmousemove\',\n            \'onmouseout\',\n            \'onmouseover\',\n            \'onmouseup\',\n            \'onpointerdown\',\n            \'onpointermove\',\n            \'onpointerup\',\n            \'onpointerover\',\n            \'onpointerout\',\n            \'onpointerenter\',\n            \'onpointerleave\',\n            \'onsubmit\',\n        ]) {\n            const descriptor = Object.getOwnPropertyDescriptor(\n                eventTarget,\n                eventName\n            );\n\n            if (!descriptor) {\n                continue;\n            }\n\n            const realGetter = descriptor.get;\n            const realSetter = descriptor.set;\n\n            const patchedSetter = generateAddCallbackFunction(realSetter, 0);\n\n            /*\n             * In case a script checks the value of the property after\n             * setting it, the getter has to be patched to return the\n             * original callback.\n             */\n            const patchedGetter = function() {\n                const realValue = realGetter.call(this);\n\n                const originalCallback = originalCallbackMap.get(realValue);\n                if (originalCallback) {\n                    return originalCallback;\n                } else {\n                    return realValue;\n                }\n            };\n\n            patchedGetter.toString = () => realGetter.toString();\n\n            Object.defineProperty(eventTarget, eventName, {\n                get: patchedGetter,\n                set: patchedSetter,\n            });\n        }\n    }\n\n    /*\n     * This script has some dependencies that need to be included\n     * without polluting the global namespace. This is achieved by\n     * inserting them into the source at build time in the\n     * makefile. This is preferable to loading the dependencies via\n     * AJAX, because the latter doesn\'t work if the CSP disallows\n     * unsafe-eval. The following tag tells the makefile where to\n     * insert the dependencies.\n     */\n    // <DEPENDENCIES>\nclass InputAnalyser {\n    constructor(_inputs) {\n        this._inputs = _inputs;\n        this._irrelevantInputs = new WeakSet();\n\n        /*\n         * Not currently using Password because it was causing too\n         * many false positives. Some sites use external auth domains,\n         * and many have misconfigured analytics that collect\n         * passwords.\n         */\n        this.relevantInputs = [new CardNumber()];\n    }\n\n    get relevantInputValues() {\n        const inputs = {};\n        this._inputs.forEach(\n            input => (inputs[input.id || input.name] = input.value)\n        );\n\n        return inputs;\n    }\n\n    get relevantFilledInputs() {\n        return this.allInputs\n            .filter(input => this.isRelevantElement(input))\n            .filter(input => input.value.length >= cons.minInputSize)\n            .map(input => ({\n                id: input.id,\n                name: input.name,\n                value: input.value,\n            }));\n    }\n\n    get allInputs() {\n        this._inputs = [\n            ...document.querySelectorAll(\n                this.relevantInputs.map(i => i.relevantInputTypes).join(\', \')\n            ),\n        ];\n\n        return this._inputs;\n    }\n\n    static getLabelText(input) {\n        if (!input.labels.length) {\n            return \'\';\n        }\n        return stripSpecialChars(input.labels[0].textContent).trim();\n    }\n\n    /**\n     * Takes an HTMLElement and determines whether or not it could be relevant for the purposes of\n     * skimmer detection.\n     * @param {HTMLElement} input The element which is to be checked for relevancy.\n     * @returns {boolean} Returns true if the element is potentially relevant (e.g. a credit card\n     * field or other such sensitive input).\n     */\n    isRelevantElement(input) {\n        // If the element has been identified as irrelevant, return false\n        if (this._irrelevantInputs.has(input)) {\n            return false;\n        }\n\n        // Check the input against all the relevant input types\n        const relevances = this.relevantInputs.map(i => i.test(input));\n\n        /*\n         *  If they all agree that this input is unlikely to become\n         *  relevant, exclude it from further checks and return false\n         */\n        if (relevances.every(i => i === RelevantInput.relevance.NOT_RELEVANT)) {\n            this._irrelevantInputs.add(input);\n            return false;\n        }\n\n        // Return true if any consider the input to be relevant, otherwise false\n        return relevances.some(i => i === RelevantInput.relevance.RELEVANT);\n    }\n}\n/*\n * Input Matcher represents a class that can have matches with relevant inputs.\n * Each class that inherits must implement the findInputMatches method.\n */\nclass InputMatcher {\n    /*\n     * Finds any matches with the list of inputs.\n     * @param inputs. An object whose values represent relevant inputs.\n     * @return {[String]} The keys of the inputs that were found.\n     */\n    findInputMatches(inputs) {\n        throw new Error(\'findInputMatches has not been implemented.\');\n    }\n\n    /**\n     * Determines whether one or more values in needles are present in any of\n     * the keys of the haystacks.\n     * Checks both raw input and base64 encoded versions of the needles.\n     * @param needles An object. The haystacks are searched for the values of\n     * this object.\n     * @param haystacks The array of strings in which the needle(s) may reside.\n     * A string may optionally be supplied if only one value is present.\n     * @returns {[String]} The keys of the needles that were found in one or\n     * more haystacks in either raw or base64 encoded form.\n     */\n    static atLeastOneNeedleInHaystack(needles, haystacks) {\n        if (\n            needles === undefined ||\n            needles.length === 0 ||\n            haystacks === undefined\n        ) {\n            return [];\n        }\n\n        const searchArray = Array.isArray(haystacks) ? haystacks : [haystacks];\n\n        return Object.entries(needles)\n            .filter(([_, needle]) =>\n                searchArray.some(haystack => {\n                    if (isBase64Encoded(haystack)) {\n                        if (atob(haystack).indexOf(needle) !== -1) {\n                            return true;\n                        }\n                    }\n                    return haystack.indexOf(needle) !== -1;\n                })\n            )\n            .map(([input, _]) => input);\n    }\n}\n/*\n * Matcher for an object that cannot contain any inputs.\n */\nclass EmptyMatcher extends InputMatcher {\n    findInputMatches(inputs) {\n        return [];\n    }\n}\n\nclass URLParamsMatcher extends InputMatcher {\n    constructor(url) {\n        super();\n        this._url = url;\n    }\n\n    findInputMatches(inputs) {\n        try {\n            const parsedUrl = new URL(this._url);\n            return InputMatcher.atLeastOneNeedleInHaystack(inputs, [\n                ...parsedUrl.searchParams.values(),\n            ]);\n        } catch (e) {\n            return [];\n        }\n    }\n}\n\nclass StringBodyMatcher extends InputMatcher {\n    constructor(str) {\n        super();\n        this._str = str;\n    }\n\n    findInputMatches(inputs) {\n        let decoded;\n        try {\n            decoded = decodeURIComponent(this._str);\n        } catch (e) {\n            decoded = this._str;\n        }\n\n        const searchParams = new URLSearchParams(decoded);\n        const parsedQuery = {};\n        const parsedValues = [];\n\n        for (const [key, value] of searchParams.entries()) {\n            parsedQuery[key] = value;\n            parsedValues.push(value);\n        }\n\n        if (parsedQuery !== {} && parsedValues.indexOf(null) === -1) {\n            return InputMatcher.atLeastOneNeedleInHaystack(\n                inputs,\n                parsedValues\n            );\n        }\n        return InputMatcher.atLeastOneNeedleInHaystack(inputs, decoded);\n    }\n}\n\nclass FormBodyMatcher extends InputMatcher {\n    constructor(formData) {\n        super();\n        this._formData = formData;\n    }\n\n    findInputMatches(inputs) {\n        return InputMatcher.atLeastOneNeedleInHaystack(\n            inputs,\n            Object.values(this._formData).flat()\n        );\n    }\n}\n/**\r\n * Takes a string and removes a variety of \'special\' characters like punctuation.\r\n * @param str The string to be modified.\r\n * @returns {string} The resulting string without any special characters.\r\n */\r\nfunction stripSpecialChars(str) {\r\n    return str.replace(/[`~!@#$%^&*()_|+\\-=?;:\'\",.<>}{\\][\\\\/]/gi, \'\');\r\n}\r\n\r\n/**\r\n * Attempts to identify where a string is base-64 encoded or not.\r\n * @param string The raw string to be examined.\r\n * @returns {boolean} Returns true if the string matches a base-64 string. False otherwise.\r\n */\r\nfunction isBase64Encoded(string) {\r\n    return /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/.test(\r\n        string\r\n    );\r\n}\r\n\r\n// Computes the base64 sha512/sha224 hash of some text, removing trailing ==\r\nfunction base64hash(hashFunction, text) {\r\n    return btoa(\r\n        hashFunction\r\n            .array(text)\r\n            .map(char => String.fromCharCode(char))\r\n            .join(\'\')\r\n    ).slice(0, -2);\r\n}\r\n\r\nfunction normaliseUrl(str) {\r\n    const link = document.createElement(\'a\');\r\n    link.href = str;\r\n    return link.href;\r\n}\r\n\r\nfunction stripCredentials(urlstr) {\r\n    try {\r\n        const url = new URL(urlstr);\r\n        const params = url.searchParams;\r\n        params.forEach((_, key) => params.set(key, \'\'));\r\n        return url.toString();\r\n    } catch (e) {\r\n        return urlstr;\r\n    }\r\n}\r\n\r\n/**\r\n * Check if two URLs match regardless of any partial encoding.\r\n *\r\n * Uses decodeURI which can throw a URIError when url is malformed.\r\n */\r\nfunction urlsMatch(first, second) {\r\n    try {\r\n        return decodeURI(first) === decodeURI(second);\r\n    } catch (e) {\r\n        return false;\r\n    }\r\n}\r\n\r\nfunction sendMessage(type, data, tabId, options) {\r\n    if (tabId) {\r\n        chrome.tabs.sendMessage(tabId, { data, type }, options);\r\n    } else {\r\n        chrome.runtime.sendMessage({ data, type });\r\n    }\r\n}\r\n\r\n// Encodes the given input using base64url as defined by RFC4648 section 5.\r\nfunction base64Url(input) {\r\n    return btoa(input)\r\n        .replace(\'+\', \'-\')\r\n        .replace(\'/\', \'_\');\r\n}\r\n/*\n * Netcraft Extension\n * constants JavaScript\n */\n\n/* eslint sort-keys: \'off\' */\n/* sort-keys is disabled as the constants are separated by type */\n\n// Aligned values here make for easier reading, so we disable prettier\n\n// prettier-ignore\nconst cons = (function() {\n    const cryptojackersUrl = \'https://www.netcraft.com/apps/help/glossary/#crypto-miners\';\n    const skimmersUrl = \'https://www.netcraft.com/apps/help/glossary/#credit-card-skimmers\';\n    const evilResourceCrime = \'attempted to load\';\n\n    return {\n        fields: [\n            \'topsites\',\n            \'country\',\n            \'netblock\',\n            \'hoster\',\n            \'firstseen\',\n            \'rank\',\n            \'risk\',\n            \'uses_sslv3\',\n            \'pfs\',\n            \'heartbleed\',\n            \'heartbleed_message\',\n        ],\n\n        // options that can be toggle in options.js and installed flag\n\n        toggleOptions: [\n            \'installed\',\n            \'block\',\n            \'xss\',\n            \'suspicious\',\n            \'other-malicious-scripts\',\n            \'credential-leaks\',\n            \'analytics\',\n            \'cryptojackers\',\n            \'skimmers\',\n        ],\n\n        // domains\n        mirror:  \'https://mirror2.extension.netcraft.com/\',\n        toolbar: \'https://mirror.toolbar.netcraft.com/\',\n\n        // links and faqs\n        blogArchive:      \'https://news.netcraft.com/archives/\',\n        browserApp:       \'https://www.netcraft.com/apps/browser/\',\n        cryptojackersUrl,\n        extensionStore:   \'https://addons.mozilla.org/en-us/firefox/addon/netcraft-toolbar?src=external-blocked_visit-rating\',\n        heartbleedUrl:    \'https://www.netcraft.com/apps/help/glossary/#heartbleed\',\n        logBlockedVisit:  \'https://toolbar.netcraft.com/blocked_visit\',\n        netblock:         \'https://sitereport.netcraft.com/netblock?q=\',\n        pfsUrl:           \'https://www.netcraft.com/apps/help/glossary/#pfs\',\n        report:           \'https://sitereport.netcraft.com/?url=\',\n        reportAPI:        \'https://report.netcraft.com/api/v2/report/urls\',\n        reportMistake:    \'https://report.netcraft.com/report/mistake?url=\',\n        skimmersUrl,\n        sslv3Url:         \'https://www.netcraft.com/apps/help/glossary/#sslv3\',\n        submissionURL:    \'https://report.netcraft.com/submission/\',\n        topsites:         \'https://trends.netcraft.com/topsites?s=\',\n\n        // paths\n        block:              \'blocked.html\',\n        check:              \'check_url/v4/\',\n        danger:             \'Images/danger.png\',\n        embed:              \'/embedded\',\n        evilJSPatternsFeed: \'eviljspatterns\',\n        skimmerDomainWhitelistFeed: \'eviljsskimmerwhitelist\',\n        evilResourcesFeed:  \'blockdb/netcraft_extension_evil_resource_encrypted-yppL7bVh/\',\n        flags:              \'Images/flags/\',\n        force:              \'/dodns\',\n        heartbleed:         \'Images/heartbleed.png\',\n        info:               \'/info\',\n        poodlePost:         \'2014/10/15/googles-poodle-affects-oodles.html\',\n        warning:            \'Images/warning.png\',\n\n        // feed constants\n        evilResourceTypes: [\'cryptojacker\', \'skimmer\'],\n        evilResourcesSalt: \'C4jhYHxW\',\n        maxRevisions:      5,\n        randomSaltLength:  8,\n\n        // mappings of url_type => information\n        urlTypeInformationMappings: {\n            \'malicious_javascript/cryptojacker\': [\'web miners\',             cryptojackersUrl],\n            \'malicious_javascript/skimmer\':      [\'shopping site skimmers\', skimmersUrl],\n        },\n\n        // mappings of evilResourceTypes => user options\n        evilResourceOptionMappings: {\n            \'cryptojacker\': \'cryptojackers\',\n            \'skimmer\':      \'skimmers\'\n        },\n\n        // mappings of user options => url_type\n        optionUrlTypeMappings: {\n            \'block\':                   /^(?!malicious_javascript:)/,\n            \'cryptojackers\':           /^malicious_javascript\\/cryptojacker$/,\n            \'other-malicious-scripts\': /^malicious_javascript\\/(?!(skimmer|cryptojacker)$)/,\n            \'skimmers\':                /^malicious_javascript\\/skimmer$/,\n        },\n\n        // report constants\n        malwareSourceEmail:  \'extension-reported-malware@netcraft.com\',\n        malwareSourceUUID:   \'mwcCcApi89cobY9loJ9rWJ9HuOhlpwMj\',\n        extensionSourceUUID: \'qBEQ3NhEnwK4sypmuSxBJzRqpxZLRXxe\',\n\n        // report error default message\n        reportErrorMessage: \'An error occured with your submission. Please try again.\',\n\n        // mapping from report API errors to displayed messages\n        reportErrorMappings: {\n            \'Duplicate of a recent submission\': \'This URL has already been reported.\',\n            \'Supplied email is not valid\': \'Invalid email address. Please correct it and try again.\',\n        },\n\n        whitelistErrorMessages: {\n            invalidHostname: \'Invalid hostname, please correct it and try again\',\n            duplicate: \'Protection is already disabled for this site\',\n        },\n\n        // browserAction icon paths\n        iconNormal: {\n            16: \'Images/action-normal-16.png\',\n            24: \'Images/action-normal-24.png\',\n            32: \'Images/action-normal-32.png\'\n        },\n        iconDanger: {\n            16: \'Images/action-danger-16.png\',\n            24: \'Images/action-danger-24.png\',\n            32: \'Images/action-danger-32.png\'\n        },\n        iconWarning: {\n            16: \'Images/action-warning-16.png\',\n            24: \'Images/action-warning-24.png\',\n            32: \'Images/action-warning-32.png\'\n        },\n        iconDisabled: {\n            16: \'Images/action-disabled-16.png\',\n            24: \'Images/action-disabled-24.png\',\n            32: \'Images/action-disabled-32.png\'\n        },\n\n        // Extension internal message types\n        capturedIntercept:  \'interceptDetailsCaptured\',\n        confirmedIntercept: \'interceptDetailsConfirmed\',\n        contentReady:       \'contentScriptReady\',\n        leaksEnabled:       \'credentialLeaksEnabled\',\n        reportURL:          \'report\',\n        reqBlock:           \'block\',\n        reqDetails:         \'details\',\n        reqForce:           \'force\',\n        reqPopUp:           \'popup\',\n        reqPrintTimingData: \'time\', //debug\n        reqInputs:          \'requestInputValues\',\n        sendInputs:         \'sendInputs\',\n        sendIntercept:      \'sendInterceptDetails\',\n        updateOption:       \'updateOption\',\n        updateWhitelist:    \'whitelist\', // disable button whitelist\n\n        // Status codes\n        errEvilResource: \'EVILRESOURCE\',\n        errNoDetails:    \'NODETAILS\',\n        errNoInfo:       \'NOINFO\',\n        errBlocked:      \'BLOCKED\',\n        errPending:      \'PENDING\',\n        errServer:       \'ERROR\',\n        errSuspicious:   \'SUSPICIOUS\',\n        errTimeout:      \'TIMEOUT\',\n        errXSS:          \'XSS\',\n        noError:         \'OK\',\n\n        // Valid protocols (it is a regex match so ^ matches start of string)\n        protocols:    [\'^http\', \'^https\', \'^ftp\'],\n\n        // Human readable messages\n        msgNa:           \'NA\',\n        msgNewSite:      \'New Site\',\n        msgNoInfo:       \'Site information not available\',\n        msgNoServer:     \'Unable to contact Netcraft servers\',\n        msgSuspicious:   \'Suspicious URL Detected\',\n        msgXSS:          \'Suspected XSS Attack\',\n        msgBlocked:      {\n            \'malicious_javascript/skimmer\': {\n                title: \'Shopping Site Skimmer Detected\',\n                description: \'shopping site skimmer\'\n            },\n            \'malicious_javascript/dropsite\': {\n                title: \'Potential Credential Leak Detected\',\n                description: \'potential credential leak\'\n            },\n            \'malicious_javascript/cryptojacker\': {\n                title: \'Web Miner Detected\',\n                description: \'web miner\'\n            },\n            \'malware_c2/infrastructure\': {\n                title: \'Malicious URL\',\n                description: \'malicious page\'\n            },\n            \'default\': {\n                title: \'Suspected Phishing\',\n                description: \'suspected phishing site\'\n            },\n        },\n\n        // Human readable reasons\n        urlTypeCrimeMappings: {\n            \'malicious_javascript/skimmer\':      evilResourceCrime,\n            \'malicious_javascript/cryptojacker\': evilResourceCrime,\n            \'malicious_javascript/dropsite\':     \' is blocked because we detected that sensitive information was leaked from\',\n        },\n\n        // Timeout function value to clear cache etc.\n        timeout:      300000,\n\n        // Skimmer whitelist update interval (1 day)\n        skimmerWhitelistInterval: 1000 * 60 * 60 * 24,\n\n        // Google Analytics account\n        account:      \'UA-2150242-8\',\n        gaCategory:   \'Popup load times\',\n\n        // InputAnalyser constants\n        minInputSize: 5,\n\n        // First addresses of the private IPv4 netblocks\n        privateIPv4Blocks: [\n            \'10.0.0.0\',\n            \'172.16.0.0\',\n            \'192.168.0.0\'\n        ],\n\n        // Sync storage key for disable for this site button whitelist\n        disableButtonWhitelistKey: \'disableButtonWhitelist\',\n\n        // Local storage key for local credential leak detection whitelist\n        localCredentialLeakWhitelistKey: \'localCredentialLeakWhitelist\',\n\n        // Whitelisted fileName regexes for credential leak detection\n        credentialLeakFileNameWhitelist: [\n            /^https?:\\/\\/googleads.g.doubleclick.net\\//,\n        ],\n    };\n})();\n\n/*\n * recursively prevents any property or sub-property in cons from:\n *   - being added;\n *   - being removed; or\n *   - being modified.\n */\nfunction deepFreeze(object) {\n    Object.freeze(object);\n\n    for (const name of Object.getOwnPropertyNames(object)) {\n        if (typeof object[name] === \'object\') {\n            deepFreeze(object[name]);\n        }\n    }\n}\n\ndeepFreeze(cons);\n/*\r\n * RelevantInput objects check whether given form inputs should be\r\n * treated as sensitive data.\r\n *\r\n * This should be treated as an abstract class. Only the subclasses\r\n * are intended to be instantiated.\r\n */\r\nclass RelevantInput {\r\n    /*\r\n     * Enum of the possible return values of test():\r\n     * RELEVANT:\r\n     *     Input is relevant now, outgoing requests should be\r\n     *     checked for the contained value (subject to minimum length).\r\n     * POTENTIALLY RELEVANT:\r\n     *     Input should not be considered relevant now, but may be in\r\n     *     future so should continue to be checked.\r\n     * NOT_RELEVANT:\r\n     *     Input is not relevant and will not become relevant, so can\r\n     *     be ommitted from further checks to optimise performance.\r\n     */\r\n    static get relevance() {\r\n        return {\r\n            NOT_RELEVANT: 1,\r\n            POTENTIALLY_RELEVANT: 2,\r\n            RELEVANT: 3,\r\n        };\r\n    }\r\n\r\n    /*\r\n     * relevantInputTypes (string) - a comma separated list of\r\n     * selectors that describe the types of input that should be\r\n     * considered relevant.\r\n     */\r\n    constructor(relevantInputTypes) {\r\n        this.relevantInputTypes = relevantInputTypes;\r\n    }\r\n\r\n    /*\r\n     * Checks whether any of the given input\'s \'labels\' (the ID, name,\r\n     * or actual label) match the given regex.\r\n     */\r\n    static testInputLabel(regex, input) {\r\n        const labels = [\r\n            input.id,\r\n            input.name,\r\n            InputAnalyser.getLabelText(input),\r\n        ];\r\n        return labels.some(label => regex.test(label));\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for passwords.\r\n */\r\nclass Password extends RelevantInput {\r\n    constructor() {\r\n        super(\'input[type=password]\');\r\n    }\r\n\r\n    /*\r\n     * Passwords are verified purely by their input type.\r\n     */\r\n    test(input) {\r\n        if (input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for card numbers.\r\n */\r\nclass CardNumber extends RelevantInput {\r\n    constructor() {\r\n        // Inputs with no type attribute act like text inputs\r\n        super(\r\n            \'input[type=text], input[type=tel], input[type=number], input:not([type])\'\r\n        );\r\n\r\n        // Definitely card number labels\r\n        this.inputLabelRegexes = [\r\n            /(cc|card).?(num|no)/i,\r\n            /カード番号/,\r\n            /Номер.*карты/i,\r\n            /信用卡卡號/i,\r\n            /信用卡号码/i,\r\n        ];\r\n\r\n        /*\r\n         * Matches incomplete card numbers, because ideally the\r\n         * skimmer should be detected before the victim gives away\r\n         * most of their card number.\r\n         */\r\n        this.inputValueRegexes = [/^(\\d{4}[-\\s]?){0,4}\\d{1,4}$/];\r\n\r\n        // Probably card number labels\r\n        this.suspectInputLabelRegexes = [\r\n            /card/i,\r\n            /tarjeta/i,\r\n            /carte/i,\r\n            /карты/i,\r\n            /卡/i,\r\n            /カード/i,\r\n            /카드/i,\r\n            /credit[^s]/i,\r\n        ];\r\n\r\n        // If it matches one of these, probably not a card number\r\n        this.inputLabelExceptionRegexes = [\r\n            /post/i,\r\n            /code/i,\r\n            /zip/i,\r\n            /acc(oun)?t?[-_]?n(um|o)/i,\r\n            /credit[-_]?(sum|limit)/i,\r\n            /loyalty/i,\r\n            /gift/i,\r\n            /idcard/i,\r\n            /cardid/i,\r\n            /club/i,\r\n            /sku/i,\r\n            /(\\b|_)otp/i,\r\n            /price/i,\r\n            /amount/i,\r\n            /service/i,\r\n            /picard/i,\r\n            /search/i,\r\n            /contact/i,\r\n            /callme/i,\r\n            /chat/i,\r\n            /activate/i,\r\n            /msisdn/i,\r\n        ];\r\n    }\r\n\r\n    test(input) {\r\n        if (!input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return NOT_RELEVANT if label matches an exception regex\r\n        if (\r\n            this.inputLabelExceptionRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return RELEVANT if label clearly states card number\r\n        if (\r\n            this.inputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        }\r\n\r\n        /*\r\n         * If label suggests card number, return RELEVANT if value\r\n         * also suggests card number or POTENTIALLY_RELEVANT if\r\n         * not. Otherwise, return NOT_RELEVANT as this element will\r\n         * not become relevant unless a label changes (unlikely).\r\n         */\r\n        if (\r\n            this.suspectInputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            if (this.inputValueRegexes.some(r => r.test(input.value))) {\r\n                return RelevantInput.relevance.RELEVANT;\r\n            } else {\r\n                return RelevantInput.relevance.POTENTIALLY_RELEVANT;\r\n            }\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\n    const inputAnalyser = new InputAnalyser();\n\n    const resourceBlockList = new Set([\n                            \"6C590F97DDB1A11AE795B3050E4C3866\", \"D285BE79786E2ECE396941331C5BA65E\", \"59DF8523520DE7F08FB53D3D12BD94F5\", \"1FB784EBAFDA1618023756BF5B6D7E46\", \"0D6E1B5F03B81F5C37813B22E29C4FE2\", \"EFAB0ECE9383D50C555B8168C3E2A4DD\", \"AC8A4B13A411A4E43E61D0A034FA4A55\", \"25A781F6D1F94EEACCF1E00E844D9E14\", \"3920B04ED0D215EA738F524F60485F23\", \"05F4A2D3161A92EB82A44F15FC2A3AEC\", \"C5A1BE7B3855B0A25275B2877E005CB9\", \"00069CEC347076721EBE2257978A0A33\", \"9A513130D02F360BBDC16D8AC0C579D8\", \"7CDB2A3A29E50F90C1000252EF523AD6\", \"25CE912FAF2376026AAD0174AD5A0329\", \"739E1F67AA5F64A06FC469F6030802D4\", \"F49368C9A05C29EF49411999C5987F2C\", \"AB2DD89FB892155275D8780CF527BC93\", \"CFE758EB18FBFE70B1F690241B75D2B1\", \"E43C3463B40A790545F4149FF06B419E\", \"8B6D4C76A7CCF5EB720660B8B2D3F5EB\", \"45573B3E2F613AF5BF2145DF004BABD1\", \"E3DB4E968B371DE94CE607199A062F39\", \"A4EFF1240C5DE614B394FB738CBD28E2\", \"F42D10E84B9A69A8A24062319F425A83\", \"90646BE39982594A58EDF5D2630CCFFD\", \"669853BEA9B84EA51D7302A7FBFF5BC3\", \"0BA566B4777526F451108100107DC5ED\", \"AB19E12BFFBC47244BDCC2403EAA9037\", \"61DAF8537240639277FD1A5908A131A4\", \"6F1DC1309CFE734C038685D8F17A3B6B\", \"DCC3DB001334F29C1C0208D15E9EAB49\", \"2DBD7D54022C28273ADE3147B8EEB076\", \"AE3760E93412C65EC5BF63537B037019\", \"4CD96A830DAC0E0B5EBE578B0DD870AE\", \"4C70569BBE1821F5655382660807FA77\", \"05ECA17FF0EA78669ED43B2BD7B63571\", \"44E503B3621513B9D3666F284E4DF47A\", \"8F1C92E7665860AE70CBB228DED86111\", \"D69552885B55C4097E5725F805815639\", \"B4357A9D889E974CDF3F9740E48F9A1B\", \"5709DC60CFC365B7064B06C709A9D32B\", \"14E8729CBB16AC3625EAA0D7A679E56E\", \"793D4DABAAA377A12F2B6CE88C5FB389\", \"C5D1DCE2AE0D8CE79054FC16CB13D65A\", \"89F91750BD4A9397D1F8CE183757FF70\", \"50B8BC213FB188A687173C1A0A77EA57\"\n                        ]);\n    const evilJSPatterns = new Set([\n                            \n                        ]);\n\n    // Extract body object\n    function extractBody(data) {\n        if (!data) {\n            return Promise.resolve({});\n        }\n        if (FormData.prototype.isPrototypeOf(data)) {\n            const formData = {};\n            for (const [key, value] of data.entries()) {\n                formData[key] = value;\n            }\n            return Promise.resolve({ formData });\n        }\n        // Create a temporary Request object to parse the body\n        const tempRequest = new Request(\'\', { body: data, method: \'POST\' });\n        return extractBodyFromRequest(tempRequest);\n    }\n\n    function extractBodyFromRequest(request) {\n        // Try to extract as text\n        return request\n            .text()\n            .then(text => {\n                return { text };\n            })\n            .catch(e => {\n                return {};\n            });\n    }\n\n    /**\n     * This function checks if the request hostname/URL is in the blocklist.\n     * Used when identifying whether or not to forward request to background\n     * script.\n     * @param hostname Hostname to check against blocklist.\n     * @param url Request url to check against evil JS patterns\n     * @returns boolean true if hostname is in the blocklist, false if\n     * it is not in blocklist or if blocklist is not provided.\n     */\n    function requestInBlocklist(hostname, url) {\n        if (resourceBlockList === undefined || evilJSPatterns === undefined) {\n            return false;\n        }\n        if (testEvilJS(url.replace(/^(https?:)?\\/\\//i, \'\'))) {\n            return true;\n        }\n        while (!testEvilJS(hostname) && !testResource(hostname)) {\n            const newHostname = hostname.replace(/^.+?\\./g, \'\');\n\n            if (hostname === newHostname) return false;\n\n            hostname = newHostname;\n        }\n        return true;\n    }\n\n    function testEvilJS(url) {\n        return evilJSPatterns.has(base64hash(sha512, url));\n    }\n\n    function testResource(hostname) {\n        return resourceBlockList.has(\n            md5(cons.evilResourcesSalt + hostname).toUpperCase()\n        );\n    }\n\n    /*\n     * Implementations to overwrite window.XMLHttpRequest.prototype.open,\n     * window.XMLHttpRequest.prototype.send and window.fetch. These are (to my knowledge) the two\n     * APIs that can be used to make requests within Javascript. If there are more, then they will\n     * also need to be overridden and intercepted like below.\n     */\n\n    /**\n     * This function generates functions to be used for wrapping and intercepting network\n     * requests, namely from XMLHttpRequest and the Fetch API. It works by taking the real\n     * function we want to intercept the request for, and then uses document.currentScript to work\n     * out which file initiated the request. It sends those details to the content script which\n     * forwards it to the background script, and then we await a confirmation of receipt from the\n     * background page. Finally, the real request is sent by forwarding parameters to the original\n     * function passed in.\n     * @param realFn A reference to the real function that is being intercepted.\n     * @param getRequestUrlFn A function used to get the request URL from the object. This is\n     * necessary as the mechanisms for different objects differs depending on implementation.\n     * @param getRequestBodyPr A function used to get the request body from the object. Returns\n     * a promise. It should be null if it\'s not applicable (e.g. if it sets the src of an image or script).\n     * @param type The type of request, which will be a ResourceType:\n     * https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType\n     * @returns {function(...[*]=): PromiseLike<any | never>}\n     */\n    function generateRequestInterceptFn(\n        realFn,\n        getRequestUrlFn,\n        getRequestBodyPr,\n        type\n    ) {\n        const patched = function(...args) {\n            /*\n             * We create a link DOM element in order to correctly generate the\n             * absolute path of the request, automatically transforming from a\n             * relative path if necessary.\n             */\n            const requestUrl = normaliseUrl(\n                getRequestUrlFn.bind(this)(...args)\n            );\n\n            let requestHostname;\n            let pageHostname;\n\n            try {\n                requestHostname = new URL(requestUrl).hostname;\n                pageHostname = new URL(location.href).hostname;\n            } catch (e) {\n                return realFn.apply(this, args);\n            }\n\n            /*\n             * If hostname is in the blocklist, the request should always be\n             * sent to the background script.\n             */\n            // eslint-disable-next-line prefer-const\n            let forceStall = false;\n\n            if (!forceStall) {\n                /*\n                 * Delaying outgoing requests sometimes causes problems\n                 * with elements such as video players and dynamically\n                 * loaded images, so it should only be done when\n                 * necessary. Before inputAnalyser is defined and when the\n                 * request is to the same hostname as the page, this can\n                 * be skipped.\n                 */\n                if (\n                    requestHostname === pageHostname ||\n                    inputAnalyser === undefined\n                ) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * It can also be skipped if there is no sensitive\n                 * information entered into a form on the page yet.\n                 */\n                const relevantFilledInputs = inputAnalyser.relevantFilledInputs;\n                if (!relevantFilledInputs.length) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * For requests with no body, it\'s only necessary to delay\n                 * them when the sensitive information from the form\n                 * inputs is present in the request URL.\n                 */\n                const ia = new InputAnalyser(relevantFilledInputs);\n                const relevantInputValues = ia.relevantInputValues;\n                const urlMatcher = new URLParamsMatcher(requestUrl);\n\n                if (\n                    getRequestBodyPr === null &&\n                    !urlMatcher.findInputMatches(relevantInputValues).length\n                ) {\n                    return realFn.apply(this, args);\n                }\n            }\n\n            /*\n             * Create a promise that resolves immediately if the request body\n             * does not apply to this request.\n             */\n            if (getRequestBodyPr === null) {\n                getRequestBodyPr = function() {\n                    return Promise.resolve({});\n                };\n            }\n\n            let fileName;\n            if (document.currentScript && document.currentScript.src) {\n                fileName = document.currentScript.src;\n            } else if (callbackCurrentScript && callbackCurrentScript.src) {\n                fileName = callbackCurrentScript.src;\n            } else {\n                fileName = location.href;\n            }\n\n            return getRequestBodyPr\n                .bind(this)(...args)\n                .then(requestBody => {\n                    /*\n                     * Generate the information object to send through to the\n                     * content script including the request URL, the initiator\n                     * filename and a timestamp relative to the page load.\n                     */\n                    const detail = {\n                        fileName,\n                        requestBody,\n                        requestUrl,\n                        timestamp: performance.now(),\n                        type,\n                    };\n\n                    document.dispatchEvent(\n                        new CustomEvent(cons.capturedIntercept, {\n                            detail,\n                        })\n                    );\n\n                    return new Promise(resolve => {\n                        /*\n                         * Send the initiator\'s file name and other info to the\n                         * background script, then wait for confirmation that the\n                         * details made it to the background page before calling\n                         * the real function. This is to avoid any race conditions\n                         * whereby the details haven\'t been added to the tab data\n                         * before onBeforeRequest/onBeforeSendHeaders gets called.\n                         */\n                        document.addEventListener(\n                            cons.confirmedIntercept,\n                            function compareData(customEvent) {\n                                const receivedData = JSON.parse(\n                                    customEvent.detail\n                                );\n                                if (detailsMatch(detail, receivedData)) {\n                                    /*\n                                     * If it\'s the correct confirmation, then we\n                                     * can resolve the promise and call the real\n                                     * function in the finally block.\n                                     */\n                                    document.removeEventListener(\n                                        cons.confirmedIntercept,\n                                        compareData,\n                                        false\n                                    );\n                                    resolve();\n                                }\n                            }\n                        );\n                    }).then(() => realFn.apply(this, args));\n                });\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    function detailsMatch(first, second) {\n        const comparisonKeys = [\'fileName\', \'requestUrl\', \'timestamp\', \'type\'];\n        for (const key of comparisonKeys) {\n            if (first[key] !== second[key]) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    window.fetch = generateRequestInterceptFn(\n        realFetch,\n        request => (typeof request === \'string\' ? request : request.url),\n        (request, options) => {\n            // Check if argument is a Request object.\n            if (request instanceof Request) {\n                return extractBodyFromRequest(request);\n            }\n            return options ? extractBody(options.body) : Promise.resolve({});\n        },\n        \'xmlhttprequest\'\n    );\n\n    window.XMLHttpRequest.prototype.send = generateRequestInterceptFn(\n        realSend,\n        function getRequestUrl() {\n            return this._requestUrl;\n        },\n        extractBody,\n        \'xmlhttprequest\'\n    );\n\n    /*\n     * This function is intercepted so that we can capture the value of the\n     * request URL, since it isn\'t present in the arguments for\n     * XMLHttpRequest.send (above).\n     */\n    window.XMLHttpRequest.prototype.open = function open(...args) {\n        [, this._requestUrl] = args;\n        realOpen.apply(this, args);\n    };\n    window.XMLHttpRequest.prototype.open.toString = () => realOpen.toString();\n\n    /*\n     * Monkeypatches for setting the src of images and scripts, an\n     * indirect way of sending requests that is often employed by\n     * skimmers. The getters are also overridden to make the behaviour\n     * seem identical to the original implementation. Otherwise, if a\n     * script were to set an src and immediately read it, it would\n     * come back as the old value.\n     */\n\n    /*\n     * WeakMap maps an object to a value. This is used to store the\n     * new src of an object when its true src property may not yet\n     * have been set.\n     */\n    const srcMap = new WeakMap();\n    const requestElements = [\n        {\n            srcElement: HTMLImageElement.prototype,\n            type: \'image\',\n        },\n        {\n            srcElement: HTMLScriptElement.prototype,\n            type: \'script\',\n        },\n    ];\n\n    for (const { srcElement, type } of requestElements) {\n        const realGetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .get;\n        const realSetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .set;\n        const realGetAttribute = srcElement.getAttribute;\n        const realSetAttribute = srcElement.setAttribute;\n        const realRemoveAttribute = srcElement.removeAttribute;\n\n        const interceptFn = generateRequestInterceptFn(\n            realSetSrc,\n            src => `${src}`,\n            null,\n            type\n        );\n\n        function setSrc(url) {\n            /*\n             * It\'s valid to provide a TrustedScriptURL wrapping the URL but we need to\n             * return a string in the getter, so we convert the url to a string here.\n             *\n             * The url can also be undefined/null so we can\'t just call `.toString()`.\n             *\n             * See #56.\n             */\n            srcMap.set(this, `${url}`);\n            interceptFn.call(this, url);\n            return url;\n        }\n\n        function getSrc() {\n            if (srcMap.get(this) === undefined) {\n                return realGetSrc.call(this);\n            } else {\n                return normaliseUrl(srcMap.get(this));\n            }\n        }\n\n        getSrc.toString = () => realGetSrc.toString();\n        setSrc.toString = () => realSetSrc.toString();\n\n        Object.defineProperty(srcElement, \'src\', {\n            get: getSrc,\n            set: setSrc,\n        });\n\n        srcElement.setAttribute = function(attributeName, value) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                setSrc.call(this, value);\n            } else {\n                realSetAttribute.call(this, attributeName, value);\n            }\n        };\n        srcElement.setAttribute.toString = () => realSetAttribute.toString();\n\n        srcElement.getAttribute = function(attributeName) {\n            if (\n                attributeName.toUpperCase() === \'SRC\' &&\n                srcMap.get(this) !== undefined\n            ) {\n                return srcMap.get(this);\n            } else {\n                return realGetAttribute.call(this, attributeName);\n            }\n        };\n        srcElement.getAttribute.toString = () => realGetAttribute.toString();\n\n        srcElement.removeAttribute = function(attributeName) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                srcMap.delete(this);\n            }\n\n            return realRemoveAttribute.call(this, attributeName);\n        };\n        srcElement.removeAttribute.toString = () =>\n            realRemoveAttribute.toString();\n    }\n})(\n    window.XMLHttpRequest.prototype.open,\n    window.XMLHttpRequest.prototype.send,\n    window.fetch\n);\n</script>\n                    <style font-name=\"MS PMincho\">\n                        @font-face {\n                            font-family: \"MS PMincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-pmincho.ttf);\n                        }\n                    </style>\n                \n                    <style font-name=\"MS Mincho\">\n                        @font-face {\n                            font-family: \"MS Mincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-mincho.ttf);\n                        }\n                    </style>\n                <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\"><link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n                \n            </head>\n  <body class=\"builderjs-layout\"><style type=\"text/css\">#message-htmlpart1 div.rcmBody #v1outlook a { padding: 0; }\n#message-htmlpart1 div.rcmBody .v1es-button { mso-style-priority: 100!important; text-decoration: none!important; }\n#message-htmlpart1 div.rcmBody a[x-apple-data-detectors] { color: inherit!important; text-decoration: none!important; font-size: inherit!important; font-family: inherit!important; font-weight: inherit!important; line-height: inherit!important; }\n#message-htmlpart1 div.rcmBody .v1es-desk-hidden { display: none; float: left; overflow: hidden; width: 0; max-height: 0; line-height: 0; mso-hide: all; }\n@media only screen and (max-width:600px) {#message-htmlpart1 div.rcmBody p, #message-htmlpart1 div.rcmBody ul li, #message-htmlpart1 div.rcmBody ol li, #message-htmlpart1 div.rcmBody a { line-height: 150%!important; } #message-htmlpart1 div.rcmBody h1, #message-htmlpart1 div.rcmBody h2, #message-htmlpart1 div.rcmBody h3, #message-htmlpart1 div.rcmBody h1 a, #message-htmlpart1 div.rcmBody h2 a, #message-htmlpart1 div.rcmBody h3 a { line-height: 120%; } #message-htmlpart1 div.rcmBody h1 { font-size: 30px!important; text-align: left; } #message-htmlpart1 div.rcmBody h2 { font-size: 24px!important; text-align: left; } #message-htmlpart1 div.rcmBody h3 { font-size: 20px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-header-body h1 a, #message-htmlpart1 div.rcmBody .v1es-content-body h1 a, #message-htmlpart1 div.rcmBody .v1es-footer-body h1 a { font-size: 30px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-header-body h2 a, #message-htmlpart1 div.rcmBody .v1es-content-body h2 a, #message-htmlpart1 div.rcmBody .v1es-footer-body h2 a { font-size: 24px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-header-body h3 a, #message-htmlpart1 div.rcmBody .v1es-content-body h3 a, #message-htmlpart1 div.rcmBody .v1es-footer-body h3 a { font-size: 20px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-menu td a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-header-body p, #message-htmlpart1 div.rcmBody .v1es-header-body ul li, #message-htmlpart1 div.rcmBody .v1es-header-body ol li, #message-htmlpart1 div.rcmBody .v1es-header-body a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-content-body p, #message-htmlpart1 div.rcmBody .v1es-content-body ul li, #message-htmlpart1 div.rcmBody .v1es-content-body ol li, #message-htmlpart1 div.rcmBody .v1es-content-body a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-footer-body p, #message-htmlpart1 div.rcmBody .v1es-footer-body ul li, #message-htmlpart1 div.rcmBody .v1es-footer-body ol li, #message-htmlpart1 div.rcmBody .v1es-footer-body a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-infoblock p, #message-htmlpart1 div.rcmBody .v1es-infoblock ul li, #message-htmlpart1 div.rcmBody .v1es-infoblock ol li, #message-htmlpart1 div.rcmBody .v1es-infoblock a { font-size: 12px!important; } #message-htmlpart1 div.rcmBody *[class=\"gmail-fix\"] { display: none!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-c, #message-htmlpart1 div.rcmBody .v1es-m-txt-c h1, #message-htmlpart1 div.rcmBody .v1es-m-txt-c h2, #message-htmlpart1 div.rcmBody .v1es-m-txt-c h3 { text-align: center!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-r, #message-htmlpart1 div.rcmBody .v1es-m-txt-r h1, #message-htmlpart1 div.rcmBody .v1es-m-txt-r h2, #message-htmlpart1 div.rcmBody .v1es-m-txt-r h3 { text-align: right!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-l, #message-htmlpart1 div.rcmBody .v1es-m-txt-l h1, #message-htmlpart1 div.rcmBody .v1es-m-txt-l h2, #message-htmlpart1 div.rcmBody .v1es-m-txt-l h3 { text-align: left!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-r img, #message-htmlpart1 div.rcmBody .v1es-m-txt-c img, #message-htmlpart1 div.rcmBody .v1es-m-txt-l img { display: inline!important; } #message-htmlpart1 div.rcmBody .v1es-button-border { display: inline-block!important; } #message-htmlpart1 div.rcmBody a.v1es-button, #message-htmlpart1 div.rcmBody button.v1es-button { font-size: 18px!important; display: inline-block!important; } #message-htmlpart1 div.rcmBody .v1es-adaptive table, #message-htmlpart1 div.rcmBody .v1es-left, #message-htmlpart1 div.rcmBody .v1es-right { width: 100%!important; } #message-htmlpart1 div.rcmBody .v1es-content table, #message-htmlpart1 div.rcmBody .v1es-header table, #message-htmlpart1 div.rcmBody .v1es-footer table, #message-htmlpart1 div.rcmBody .v1es-content, #message-htmlpart1 div.rcmBody .v1es-footer, #message-htmlpart1 div.rcmBody .v1es-header { width: 100%!important; max-width: 600px!important; } #message-htmlpart1 div.rcmBody .v1es-adapt-td { display: block!important; width: 100%!important; } #message-htmlpart1 div.rcmBody .v1adapt-img { width: 100%!important; height: auto!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0 { padding: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0r { padding-right: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0l { padding-left: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0t { padding-top: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0b { padding-bottom: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20b { padding-bottom: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-mobile-hidden, #message-htmlpart1 div.rcmBody .v1es-hidden { display: none!important; } #message-htmlpart1 div.rcmBody tr.v1es-desk-hidden, #message-htmlpart1 div.rcmBody td.v1es-desk-hidden, #message-htmlpart1 div.rcmBody table.v1es-desk-hidden { width: auto!important; overflow: visible!important; float: none!important; max-height: inherit!important; line-height: inherit!important; } #message-htmlpart1 div.rcmBody tr.v1es-desk-hidden { display: table-row!important; } #message-htmlpart1 div.rcmBody table.v1es-desk-hidden { display: table!important; } #message-htmlpart1 div.rcmBody td.v1es-desk-menu-hidden { display: table-cell!important; } #message-htmlpart1 div.rcmBody .v1es-menu td { width: 1%!important; } #message-htmlpart1 div.rcmBody table.v1es-table-not-adapt, #message-htmlpart1 div.rcmBody .v1esd-block-html table { width: auto!important; } #message-htmlpart1 div.rcmBody table.v1es-social { display: inline-block!important; } #message-htmlpart1 div.rcmBody table.v1es-social td { display: inline-block!important; } #message-htmlpart1 div.rcmBody .v1es-desk-hidden { display: table-row!important; width: auto!important; overflow: visible!important; max-height: inherit!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5 { padding: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5t { padding-top: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5b { padding-bottom: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5r { padding-right: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5l { padding-left: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10 { padding: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10t { padding-top: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10b { padding-bottom: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10r { padding-right: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10l { padding-left: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15 { padding: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15t { padding-top: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15b { padding-bottom: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15r { padding-right: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15l { padding-left: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20 { padding: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20t { padding-top: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20r { padding-right: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20l { padding-left: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25 { padding: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25t { padding-top: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25b { padding-bottom: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25r { padding-right: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25l { padding-left: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30 { padding: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30t { padding-top: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30b { padding-bottom: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30r { padding-right: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30l { padding-left: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35 { padding: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35t { padding-top: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35b { padding-bottom: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35r { padding-right: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35l { padding-left: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40 { padding: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40t { padding-top: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40b { padding-bottom: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40r { padding-right: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40l { padding-left: 40px!important; } }</style>\n<div class=\"v1es-wrapper-color\" style=\"background-color: #f3f3f3\">\n<table class=\"v1es-wrapper\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; padding: 0; margin: 0; width: 100%; height: 100%; background-repeat: repeat; background-position: center top; background-color: #f3f3f3\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" valign=\"top\">\n<table class=\"v1es-content\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; table-layout: fixed !important; width: 100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" align=\"center\">\n<table class=\"v1es-content-body\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; background-color: #ffffff; width: 600px\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" bgcolor=\"#ffffff\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" align=\"left\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"v1es-m-p0r v1es-m-p20b\" style=\"padding: 0; margin: 0; width: 600px\" align=\"center\" valign=\"top\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0; position: relative\" align=\"center\"><a style=\"-webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; text-decoration: underline; color: #068fc1; font-size: 14px\" href=\"https://www.hostingperu.com.pe/diagnostico-web\" rel=\"noreferrer\" target=\"_blank\"><img class=\"v1adapt-img\" style=\"display: block; border: 0; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic\" title=\"Hosting Peru\" src=\"https://hobezg.stripocdn.email/content/guids/bannerImgGuid/images/image16938504541591855.png\" alt=\"Hosting Peru\" width=\"600\"></a></td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n<table class=\"v1es-content\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; table-layout: fixed !important; width: 100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" align=\"center\">\n<table class=\"v1es-content-body\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; background-color: #ffffff; width: 600px\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" bgcolor=\"#ffffff\">\n<tbody>\n<tr>\n<td style=\"margin: 0; padding: 20px 20px 35px 20px\" align=\"left\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0; width: 560px\" align=\"center\" valign=\"top\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"v1es-m-txt-c v1es-m-p0r v1es-m-p0l\" style=\"padding: 0; margin: 0; padding-top: 20px; padding-left: 40px; padding-right: 40px\" align=\"center\">\n<p style=\"margin: 0; -webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; font-family: arial, \'helvetica neue\', helvetica, sans-serif; line-height: 21px; color: #455a64; font-size: 14px\"><strong>Estás seguro si tu Sitio Web esta en un sistema actualizado?<br>Si no lo está, eres vulnerable de ataques de Hackers o Phishing</strong></p>\n</td>\n</tr>\n<tr>\n<td class=\"v1es-m-txt-c v1es-m-p0r v1es-m-p0l\" style=\"margin: 0; padding: 15px 40px 20px 40px\" align=\"center\">\n<p style=\"margin: 0; -webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; font-family: arial, \'helvetica neue\', helvetica, sans-serif; line-height: 21px; color: #455a64; font-size: 14px\">Como cliente de Hosting Peru podemos ofrecerte un diagnostico completo GRATIS de su estado.<br><br>Si está actualizado ¡Te felicitaremos!<br><br>Si es vulnerable, HORROR!! Además del informe te podemos enviar una propuesta de renovación segura y total a precios super competitivos.<br>Solicita sin ningún compromiso un DIAGNOSTICO GRATIS!<br>Llenando este sencillo formulario</p>\n</td>\n</tr>\n<tr>\n<td style=\"padding: 0; margin: 0; padding-top: 20px\" align=\"center\"><span class=\"v1msohide v1es-button-border\" style=\"background: #ff5d00; display: inline-block; border-radius: 10px; width: auto; mso-hide: all; border: 0px solid #2CB543\"><a class=\"v1es-button\" style=\"mso-style-priority: 100 !important; text-decoration: none; -webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; color: #ffffff; font-size: 18px; padding: 10px 20px 10px 20px; display: inline-block; background: #ff5d00; border-radius: 10px; font-family: arial, \'helvetica neue\', helvetica, sans-serif; font-weight: normal; font-style: normal; line-height: 22px; width: auto; text-align: center; mso-padding-alt: 0; mso-border-alt: 10px solid #FF5D00\" href=\"https://www.hostingperu.com.pe/diagnostico-web\" rel=\"noreferrer\" target=\"_blank\">Solicitar diagnóstico Gratis</a></span></td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td></tr>\n\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</div></body></html>', '2023-09-11 18:46:37', '2023-09-11 18:47:18', 1, 0, NULL, 'email');
INSERT INTO `dbacitemplates` (`id`, `uid`, `customer_id`, `name`, `content`, `created_at`, `updated_at`, `builder`, `is_default`, `theme`, `type`) VALUES
(28, '64ff610df30a3', 1, '[Campaign: \"Campaña de prueba\"]', '<!DOCTYPE html><html lang=\"en\"><head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>Blank</title>\n\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MTBkZjMwYTMvY3Nz/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MTBkZjMwYTMvY3Nz/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n  <script>/*\n * This entire block is wrapped in an IIFE to prevent polluting the scope of the web page with\n * functions created by this extension.\n */\n(function(realOpen, realSend, realFetch) {\n    /*\n     * Sometimes pages overwrite standard objects with global\n     * variables. Where possible, we extract fresh versions from an\n     * iframe.\n     */\n    const iframe = document.createElement(\'iframe\');\n    document.documentElement.appendChild(iframe);\n\n    // Initialise with global values\n    let URL = window.URL;\n    let WeakMap = window.WeakMap;\n    let WeakSet = window.WeakSet;\n    let TextDecoder = window.TextDecoder;\n    let Uint8Array = window.Uint8Array;\n    let decodeURIComponent = window.decodeURIComponent;\n    let URLSearchParams = window.URLSearchParams;\n    let Array = window.Array;\n    let Object = window.Object;\n    let atob = window.atob;\n    let CustomEvent = window.CustomEvent;\n    let performance = window.performance;\n    let JSON = window.JSON;\n\n    /*\n     * Under some circumstances the iframe isn\'t added\n     * successfully. If it has a contentWindow then we can extract the\n     * values from it, but otherwise we fall back on the global\n     * values.\n     */\n    if (iframe.contentWindow) {\n        // Try block because sometimes the CORS prevents access to iframe\n        try {\n            URL = iframe.contentWindow.URL;\n            WeakMap = iframe.contentWindow.WeakMap;\n            WeakSet = iframe.contentWindow.WeakSet;\n            TextDecoder = iframe.contentWindow.TextDecoder;\n            Uint8Array = iframe.contentWindow.Uint8Array;\n            decodeURIComponent = iframe.contentWindow.decodeURIComponent;\n            URLSearchParams = iframe.contentWindow.URLSearchParams;\n            Array = iframe.contentWindow.Array;\n            Object = iframe.contentWindow.Object;\n            atob = iframe.contentWindow.atob;\n            CustomEvent = iframe.contentWindow.CustomEvent;\n            performance = iframe.contentWindow.performance;\n            JSON = iframe.contentWindow.JSON;\n        } catch (error) {\n            // Empty catch block to prevent errors from showing in page logs\n        }\n    }\n\n    // If iframe was added successfully, remove it\n    if (iframe.parentNode) {\n        iframe.parentNode.removeChild(iframe);\n    }\n\n    /*\n     * If any of the values don\'t have the correct type, return and\n     * don\'t attempt any monkey patching. This avoids breaking web\n     * pages.\n     */\n    for (f of [\n        URL,\n        WeakMap,\n        WeakSet,\n        TextDecoder,\n        Uint8Array,\n        decodeURIComponent,\n        URLSearchParams,\n        Array,\n        Object,\n        atob,\n        CustomEvent,\n    ]) {\n        if (typeof f !== \'function\') {\n            return;\n        }\n    }\n\n    for (o of [performance, JSON]) {\n        if (typeof o !== \'object\') {\n            return;\n        }\n    }\n\n    /*\n     * Override common funcions that accept callbacks, such as\n     * setInterval, to keep track of what script each callback comes\n     * from. Skimmers commonly have the actual skimming code in a\n     * callback, so most of the time when we intercept a request,\n     * document.currentScript is null. To solve this, the script is\n     * stored in a closure when the callback is passed, and assigned\n     * to callbackCurrentscript when the callback is run.\n     */\n\n    let callbackCurrentScript = null;\n\n    // Maps callbacks originally passed to patched versions\n    const patchedCallbackMap = new WeakMap();\n\n    // Maps patched callbacks to original versions\n    const originalCallbackMap = new WeakMap();\n\n    /**\n     *  Generates the function with which to override the\n     *  callback-accepting functions.\n     *  @param realFn The real function, e.g. setInterval.\n     *  @param callbackIndex The index of the callback in the\n     *  arguments of realFn. For example, the callback is the first\n     *  argument in setInterval, so callbackIndex should be 0.\n     */\n    function generateAddCallbackFunction(realFn, callbackIndex) {\n        const patched = function(...args) {\n            const script = document.currentScript || callbackCurrentScript;\n\n            const callback = args[callbackIndex];\n\n            // If the callback isn\'t a function, there\'s nothing to patch\n            if (typeof callback !== \'function\') {\n                return realFn.apply(this, args);\n            }\n\n            // If a patch exists, use it instead of creating new function\n            let patchedCallback = patchedCallbackMap.get(callback);\n            if (!patchedCallback) {\n                patchedCallback = function() {\n                    callbackCurrentScript = script;\n                    const retVal = callback.apply(this, [...arguments]);\n                    callbackCurrentScript = null;\n                    return retVal;\n                };\n                patchedCallbackMap.set(callback, patchedCallback);\n                originalCallbackMap.set(patchedCallback, callback);\n            }\n\n            args[callbackIndex] = patchedCallback;\n            return realFn.apply(this, args);\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    const realSetInterval = window.setInterval;\n\n    window.setInterval = generateAddCallbackFunction(realSetInterval, 0);\n\n    const realSetTimeout = window.setTimeout;\n\n    window.setTimeout = generateAddCallbackFunction(realSetTimeout, 0);\n\n    const realPromiseThen = Promise.prototype.then;\n    Promise.prototype.then = generateAddCallbackFunction(realPromiseThen, 0);\n\n    const realPromiseCatch = Promise.prototype.catch;\n    Promise.prototype.catch = generateAddCallbackFunction(realPromiseCatch, 0);\n\n    const realPromiseFinally = Promise.prototype.finally;\n    if (realPromiseFinally) {\n        Promise.prototype.finally = generateAddCallbackFunction(\n            realPromiseFinally,\n            0\n        );\n    }\n\n    const realAddEventListener = EventTarget.prototype.addEventListener;\n\n    EventTarget.prototype.addEventListener = generateAddCallbackFunction(\n        realAddEventListener,\n        1\n    );\n\n    /*\n     * removeEventListener needs to be patched to map the passed\n     * listener to the patched listener.\n     */\n    const realRemoveEventListener = EventTarget.prototype.removeEventListener;\n    EventTarget.prototype.removeEventListener = function(...args) {\n        args[1] = patchedCallbackMap.get(args[1]) || args[1];\n\n        return realRemoveEventListener.apply(this, args);\n    };\n    EventTarget.prototype.removeEventListener.toString = () =>\n        realRemoveEventListener.toString();\n\n    /*\n     * Event listeners are sometimes set by directly assigning to a\n     * property from the GlobalEventHandlers mixin,\n     * e.g. \'submitBtn.onclick\'. For each of the GlobalEventHandlers\n     * implementations that are likely to be relevant, the event\n     * properties likely to be used by skimmers are overridden with\n     * our version that tracks currentScript when assigned.\n     */\n    for (const eventTarget of [\n        HTMLElement.prototype,\n        Document.prototype,\n        window,\n    ]) {\n        for (const eventName of [\n            \'onclick\',\n            \'onblur\',\n            \'onfocus\',\n            \'onchange\',\n            \'oninput\',\n            \'onkeydown\',\n            \'onkeypress\',\n            \'onkeyup\',\n            \'onload\',\n            \'onloadend\',\n            \'onmousedown\',\n            \'onmouseenter\',\n            \'onmouseleave\',\n            \'onmousemove\',\n            \'onmouseout\',\n            \'onmouseover\',\n            \'onmouseup\',\n            \'onpointerdown\',\n            \'onpointermove\',\n            \'onpointerup\',\n            \'onpointerover\',\n            \'onpointerout\',\n            \'onpointerenter\',\n            \'onpointerleave\',\n            \'onsubmit\',\n        ]) {\n            const descriptor = Object.getOwnPropertyDescriptor(\n                eventTarget,\n                eventName\n            );\n\n            if (!descriptor) {\n                continue;\n            }\n\n            const realGetter = descriptor.get;\n            const realSetter = descriptor.set;\n\n            const patchedSetter = generateAddCallbackFunction(realSetter, 0);\n\n            /*\n             * In case a script checks the value of the property after\n             * setting it, the getter has to be patched to return the\n             * original callback.\n             */\n            const patchedGetter = function() {\n                const realValue = realGetter.call(this);\n\n                const originalCallback = originalCallbackMap.get(realValue);\n                if (originalCallback) {\n                    return originalCallback;\n                } else {\n                    return realValue;\n                }\n            };\n\n            patchedGetter.toString = () => realGetter.toString();\n\n            Object.defineProperty(eventTarget, eventName, {\n                get: patchedGetter,\n                set: patchedSetter,\n            });\n        }\n    }\n\n    /*\n     * This script has some dependencies that need to be included\n     * without polluting the global namespace. This is achieved by\n     * inserting them into the source at build time in the\n     * makefile. This is preferable to loading the dependencies via\n     * AJAX, because the latter doesn\'t work if the CSP disallows\n     * unsafe-eval. The following tag tells the makefile where to\n     * insert the dependencies.\n     */\n    // <DEPENDENCIES>\nclass InputAnalyser {\n    constructor(_inputs) {\n        this._inputs = _inputs;\n        this._irrelevantInputs = new WeakSet();\n\n        /*\n         * Not currently using Password because it was causing too\n         * many false positives. Some sites use external auth domains,\n         * and many have misconfigured analytics that collect\n         * passwords.\n         */\n        this.relevantInputs = [new CardNumber()];\n    }\n\n    get relevantInputValues() {\n        const inputs = {};\n        this._inputs.forEach(\n            input => (inputs[input.id || input.name] = input.value)\n        );\n\n        return inputs;\n    }\n\n    get relevantFilledInputs() {\n        return this.allInputs\n            .filter(input => this.isRelevantElement(input))\n            .filter(input => input.value.length >= cons.minInputSize)\n            .map(input => ({\n                id: input.id,\n                name: input.name,\n                value: input.value,\n            }));\n    }\n\n    get allInputs() {\n        this._inputs = [\n            ...document.querySelectorAll(\n                this.relevantInputs.map(i => i.relevantInputTypes).join(\', \')\n            ),\n        ];\n\n        return this._inputs;\n    }\n\n    static getLabelText(input) {\n        if (!input.labels.length) {\n            return \'\';\n        }\n        return stripSpecialChars(input.labels[0].textContent).trim();\n    }\n\n    /**\n     * Takes an HTMLElement and determines whether or not it could be relevant for the purposes of\n     * skimmer detection.\n     * @param {HTMLElement} input The element which is to be checked for relevancy.\n     * @returns {boolean} Returns true if the element is potentially relevant (e.g. a credit card\n     * field or other such sensitive input).\n     */\n    isRelevantElement(input) {\n        // If the element has been identified as irrelevant, return false\n        if (this._irrelevantInputs.has(input)) {\n            return false;\n        }\n\n        // Check the input against all the relevant input types\n        const relevances = this.relevantInputs.map(i => i.test(input));\n\n        /*\n         *  If they all agree that this input is unlikely to become\n         *  relevant, exclude it from further checks and return false\n         */\n        if (relevances.every(i => i === RelevantInput.relevance.NOT_RELEVANT)) {\n            this._irrelevantInputs.add(input);\n            return false;\n        }\n\n        // Return true if any consider the input to be relevant, otherwise false\n        return relevances.some(i => i === RelevantInput.relevance.RELEVANT);\n    }\n}\n/*\n * Input Matcher represents a class that can have matches with relevant inputs.\n * Each class that inherits must implement the findInputMatches method.\n */\nclass InputMatcher {\n    /*\n     * Finds any matches with the list of inputs.\n     * @param inputs. An object whose values represent relevant inputs.\n     * @return {[String]} The keys of the inputs that were found.\n     */\n    findInputMatches(inputs) {\n        throw new Error(\'findInputMatches has not been implemented.\');\n    }\n\n    /**\n     * Determines whether one or more values in needles are present in any of\n     * the keys of the haystacks.\n     * Checks both raw input and base64 encoded versions of the needles.\n     * @param needles An object. The haystacks are searched for the values of\n     * this object.\n     * @param haystacks The array of strings in which the needle(s) may reside.\n     * A string may optionally be supplied if only one value is present.\n     * @returns {[String]} The keys of the needles that were found in one or\n     * more haystacks in either raw or base64 encoded form.\n     */\n    static atLeastOneNeedleInHaystack(needles, haystacks) {\n        if (\n            needles === undefined ||\n            needles.length === 0 ||\n            haystacks === undefined\n        ) {\n            return [];\n        }\n\n        const searchArray = Array.isArray(haystacks) ? haystacks : [haystacks];\n\n        return Object.entries(needles)\n            .filter(([_, needle]) =>\n                searchArray.some(haystack => {\n                    if (isBase64Encoded(haystack)) {\n                        if (atob(haystack).indexOf(needle) !== -1) {\n                            return true;\n                        }\n                    }\n                    return haystack.indexOf(needle) !== -1;\n                })\n            )\n            .map(([input, _]) => input);\n    }\n}\n/*\n * Matcher for an object that cannot contain any inputs.\n */\nclass EmptyMatcher extends InputMatcher {\n    findInputMatches(inputs) {\n        return [];\n    }\n}\n\nclass URLParamsMatcher extends InputMatcher {\n    constructor(url) {\n        super();\n        this._url = url;\n    }\n\n    findInputMatches(inputs) {\n        try {\n            const parsedUrl = new URL(this._url);\n            return InputMatcher.atLeastOneNeedleInHaystack(inputs, [\n                ...parsedUrl.searchParams.values(),\n            ]);\n        } catch (e) {\n            return [];\n        }\n    }\n}\n\nclass StringBodyMatcher extends InputMatcher {\n    constructor(str) {\n        super();\n        this._str = str;\n    }\n\n    findInputMatches(inputs) {\n        let decoded;\n        try {\n            decoded = decodeURIComponent(this._str);\n        } catch (e) {\n            decoded = this._str;\n        }\n\n        const searchParams = new URLSearchParams(decoded);\n        const parsedQuery = {};\n        const parsedValues = [];\n\n        for (const [key, value] of searchParams.entries()) {\n            parsedQuery[key] = value;\n            parsedValues.push(value);\n        }\n\n        if (parsedQuery !== {} && parsedValues.indexOf(null) === -1) {\n            return InputMatcher.atLeastOneNeedleInHaystack(\n                inputs,\n                parsedValues\n            );\n        }\n        return InputMatcher.atLeastOneNeedleInHaystack(inputs, decoded);\n    }\n}\n\nclass FormBodyMatcher extends InputMatcher {\n    constructor(formData) {\n        super();\n        this._formData = formData;\n    }\n\n    findInputMatches(inputs) {\n        return InputMatcher.atLeastOneNeedleInHaystack(\n            inputs,\n            Object.values(this._formData).flat()\n        );\n    }\n}\n/**\r\n * Takes a string and removes a variety of \'special\' characters like punctuation.\r\n * @param str The string to be modified.\r\n * @returns {string} The resulting string without any special characters.\r\n */\r\nfunction stripSpecialChars(str) {\r\n    return str.replace(/[`~!@#$%^&*()_|+\\-=?;:\'\",.<>}{\\][\\\\/]/gi, \'\');\r\n}\r\n\r\n/**\r\n * Attempts to identify where a string is base-64 encoded or not.\r\n * @param string The raw string to be examined.\r\n * @returns {boolean} Returns true if the string matches a base-64 string. False otherwise.\r\n */\r\nfunction isBase64Encoded(string) {\r\n    return /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/.test(\r\n        string\r\n    );\r\n}\r\n\r\n// Computes the base64 sha512/sha224 hash of some text, removing trailing ==\r\nfunction base64hash(hashFunction, text) {\r\n    return btoa(\r\n        hashFunction\r\n            .array(text)\r\n            .map(char => String.fromCharCode(char))\r\n            .join(\'\')\r\n    ).slice(0, -2);\r\n}\r\n\r\nfunction normaliseUrl(str) {\r\n    const link = document.createElement(\'a\');\r\n    link.href = str;\r\n    return link.href;\r\n}\r\n\r\nfunction stripCredentials(urlstr) {\r\n    try {\r\n        const url = new URL(urlstr);\r\n        const params = url.searchParams;\r\n        params.forEach((_, key) => params.set(key, \'\'));\r\n        return url.toString();\r\n    } catch (e) {\r\n        return urlstr;\r\n    }\r\n}\r\n\r\n/**\r\n * Check if two URLs match regardless of any partial encoding.\r\n *\r\n * Uses decodeURI which can throw a URIError when url is malformed.\r\n */\r\nfunction urlsMatch(first, second) {\r\n    try {\r\n        return decodeURI(first) === decodeURI(second);\r\n    } catch (e) {\r\n        return false;\r\n    }\r\n}\r\n\r\nfunction sendMessage(type, data, tabId, options) {\r\n    if (tabId) {\r\n        chrome.tabs.sendMessage(tabId, { data, type }, options);\r\n    } else {\r\n        chrome.runtime.sendMessage({ data, type });\r\n    }\r\n}\r\n\r\n// Encodes the given input using base64url as defined by RFC4648 section 5.\r\nfunction base64Url(input) {\r\n    return btoa(input)\r\n        .replace(\'+\', \'-\')\r\n        .replace(\'/\', \'_\');\r\n}\r\n/*\n * Netcraft Extension\n * constants JavaScript\n */\n\n/* eslint sort-keys: \'off\' */\n/* sort-keys is disabled as the constants are separated by type */\n\n// Aligned values here make for easier reading, so we disable prettier\n\n// prettier-ignore\nconst cons = (function() {\n    const cryptojackersUrl = \'https://www.netcraft.com/apps/help/glossary/#crypto-miners\';\n    const skimmersUrl = \'https://www.netcraft.com/apps/help/glossary/#credit-card-skimmers\';\n    const evilResourceCrime = \'attempted to load\';\n\n    return {\n        fields: [\n            \'topsites\',\n            \'country\',\n            \'netblock\',\n            \'hoster\',\n            \'firstseen\',\n            \'rank\',\n            \'risk\',\n            \'uses_sslv3\',\n            \'pfs\',\n            \'heartbleed\',\n            \'heartbleed_message\',\n        ],\n\n        // options that can be toggle in options.js and installed flag\n\n        toggleOptions: [\n            \'installed\',\n            \'block\',\n            \'xss\',\n            \'suspicious\',\n            \'other-malicious-scripts\',\n            \'credential-leaks\',\n            \'analytics\',\n            \'cryptojackers\',\n            \'skimmers\',\n        ],\n\n        // domains\n        mirror:  \'https://mirror2.extension.netcraft.com/\',\n        toolbar: \'https://mirror.toolbar.netcraft.com/\',\n\n        // links and faqs\n        blogArchive:      \'https://news.netcraft.com/archives/\',\n        browserApp:       \'https://www.netcraft.com/apps/browser/\',\n        cryptojackersUrl,\n        extensionStore:   \'https://addons.mozilla.org/en-us/firefox/addon/netcraft-toolbar?src=external-blocked_visit-rating\',\n        heartbleedUrl:    \'https://www.netcraft.com/apps/help/glossary/#heartbleed\',\n        logBlockedVisit:  \'https://toolbar.netcraft.com/blocked_visit\',\n        netblock:         \'https://sitereport.netcraft.com/netblock?q=\',\n        pfsUrl:           \'https://www.netcraft.com/apps/help/glossary/#pfs\',\n        report:           \'https://sitereport.netcraft.com/?url=\',\n        reportAPI:        \'https://report.netcraft.com/api/v2/report/urls\',\n        reportMistake:    \'https://report.netcraft.com/report/mistake?url=\',\n        skimmersUrl,\n        sslv3Url:         \'https://www.netcraft.com/apps/help/glossary/#sslv3\',\n        submissionURL:    \'https://report.netcraft.com/submission/\',\n        topsites:         \'https://trends.netcraft.com/topsites?s=\',\n\n        // paths\n        block:              \'blocked.html\',\n        check:              \'check_url/v4/\',\n        danger:             \'Images/danger.png\',\n        embed:              \'/embedded\',\n        evilJSPatternsFeed: \'eviljspatterns\',\n        skimmerDomainWhitelistFeed: \'eviljsskimmerwhitelist\',\n        evilResourcesFeed:  \'blockdb/netcraft_extension_evil_resource_encrypted-yppL7bVh/\',\n        flags:              \'Images/flags/\',\n        force:              \'/dodns\',\n        heartbleed:         \'Images/heartbleed.png\',\n        info:               \'/info\',\n        poodlePost:         \'2014/10/15/googles-poodle-affects-oodles.html\',\n        warning:            \'Images/warning.png\',\n\n        // feed constants\n        evilResourceTypes: [\'cryptojacker\', \'skimmer\'],\n        evilResourcesSalt: \'C4jhYHxW\',\n        maxRevisions:      5,\n        randomSaltLength:  8,\n\n        // mappings of url_type => information\n        urlTypeInformationMappings: {\n            \'malicious_javascript/cryptojacker\': [\'web miners\',             cryptojackersUrl],\n            \'malicious_javascript/skimmer\':      [\'shopping site skimmers\', skimmersUrl],\n        },\n\n        // mappings of evilResourceTypes => user options\n        evilResourceOptionMappings: {\n            \'cryptojacker\': \'cryptojackers\',\n            \'skimmer\':      \'skimmers\'\n        },\n\n        // mappings of user options => url_type\n        optionUrlTypeMappings: {\n            \'block\':                   /^(?!malicious_javascript:)/,\n            \'cryptojackers\':           /^malicious_javascript\\/cryptojacker$/,\n            \'other-malicious-scripts\': /^malicious_javascript\\/(?!(skimmer|cryptojacker)$)/,\n            \'skimmers\':                /^malicious_javascript\\/skimmer$/,\n        },\n\n        // report constants\n        malwareSourceEmail:  \'extension-reported-malware@netcraft.com\',\n        malwareSourceUUID:   \'mwcCcApi89cobY9loJ9rWJ9HuOhlpwMj\',\n        extensionSourceUUID: \'qBEQ3NhEnwK4sypmuSxBJzRqpxZLRXxe\',\n\n        // report error default message\n        reportErrorMessage: \'An error occured with your submission. Please try again.\',\n\n        // mapping from report API errors to displayed messages\n        reportErrorMappings: {\n            \'Duplicate of a recent submission\': \'This URL has already been reported.\',\n            \'Supplied email is not valid\': \'Invalid email address. Please correct it and try again.\',\n        },\n\n        whitelistErrorMessages: {\n            invalidHostname: \'Invalid hostname, please correct it and try again\',\n            duplicate: \'Protection is already disabled for this site\',\n        },\n\n        // browserAction icon paths\n        iconNormal: {\n            16: \'Images/action-normal-16.png\',\n            24: \'Images/action-normal-24.png\',\n            32: \'Images/action-normal-32.png\'\n        },\n        iconDanger: {\n            16: \'Images/action-danger-16.png\',\n            24: \'Images/action-danger-24.png\',\n            32: \'Images/action-danger-32.png\'\n        },\n        iconWarning: {\n            16: \'Images/action-warning-16.png\',\n            24: \'Images/action-warning-24.png\',\n            32: \'Images/action-warning-32.png\'\n        },\n        iconDisabled: {\n            16: \'Images/action-disabled-16.png\',\n            24: \'Images/action-disabled-24.png\',\n            32: \'Images/action-disabled-32.png\'\n        },\n\n        // Extension internal message types\n        capturedIntercept:  \'interceptDetailsCaptured\',\n        confirmedIntercept: \'interceptDetailsConfirmed\',\n        contentReady:       \'contentScriptReady\',\n        leaksEnabled:       \'credentialLeaksEnabled\',\n        reportURL:          \'report\',\n        reqBlock:           \'block\',\n        reqDetails:         \'details\',\n        reqForce:           \'force\',\n        reqPopUp:           \'popup\',\n        reqPrintTimingData: \'time\', //debug\n        reqInputs:          \'requestInputValues\',\n        sendInputs:         \'sendInputs\',\n        sendIntercept:      \'sendInterceptDetails\',\n        updateOption:       \'updateOption\',\n        updateWhitelist:    \'whitelist\', // disable button whitelist\n\n        // Status codes\n        errEvilResource: \'EVILRESOURCE\',\n        errNoDetails:    \'NODETAILS\',\n        errNoInfo:       \'NOINFO\',\n        errBlocked:      \'BLOCKED\',\n        errPending:      \'PENDING\',\n        errServer:       \'ERROR\',\n        errSuspicious:   \'SUSPICIOUS\',\n        errTimeout:      \'TIMEOUT\',\n        errXSS:          \'XSS\',\n        noError:         \'OK\',\n\n        // Valid protocols (it is a regex match so ^ matches start of string)\n        protocols:    [\'^http\', \'^https\', \'^ftp\'],\n\n        // Human readable messages\n        msgNa:           \'NA\',\n        msgNewSite:      \'New Site\',\n        msgNoInfo:       \'Site information not available\',\n        msgNoServer:     \'Unable to contact Netcraft servers\',\n        msgSuspicious:   \'Suspicious URL Detected\',\n        msgXSS:          \'Suspected XSS Attack\',\n        msgBlocked:      {\n            \'malicious_javascript/skimmer\': {\n                title: \'Shopping Site Skimmer Detected\',\n                description: \'shopping site skimmer\'\n            },\n            \'malicious_javascript/dropsite\': {\n                title: \'Potential Credential Leak Detected\',\n                description: \'potential credential leak\'\n            },\n            \'malicious_javascript/cryptojacker\': {\n                title: \'Web Miner Detected\',\n                description: \'web miner\'\n            },\n            \'malware_c2/infrastructure\': {\n                title: \'Malicious URL\',\n                description: \'malicious page\'\n            },\n            \'default\': {\n                title: \'Suspected Phishing\',\n                description: \'suspected phishing site\'\n            },\n        },\n\n        // Human readable reasons\n        urlTypeCrimeMappings: {\n            \'malicious_javascript/skimmer\':      evilResourceCrime,\n            \'malicious_javascript/cryptojacker\': evilResourceCrime,\n            \'malicious_javascript/dropsite\':     \' is blocked because we detected that sensitive information was leaked from\',\n        },\n\n        // Timeout function value to clear cache etc.\n        timeout:      300000,\n\n        // Skimmer whitelist update interval (1 day)\n        skimmerWhitelistInterval: 1000 * 60 * 60 * 24,\n\n        // Google Analytics account\n        account:      \'UA-2150242-8\',\n        gaCategory:   \'Popup load times\',\n\n        // InputAnalyser constants\n        minInputSize: 5,\n\n        // First addresses of the private IPv4 netblocks\n        privateIPv4Blocks: [\n            \'10.0.0.0\',\n            \'172.16.0.0\',\n            \'192.168.0.0\'\n        ],\n\n        // Sync storage key for disable for this site button whitelist\n        disableButtonWhitelistKey: \'disableButtonWhitelist\',\n\n        // Local storage key for local credential leak detection whitelist\n        localCredentialLeakWhitelistKey: \'localCredentialLeakWhitelist\',\n\n        // Whitelisted fileName regexes for credential leak detection\n        credentialLeakFileNameWhitelist: [\n            /^https?:\\/\\/googleads.g.doubleclick.net\\//,\n        ],\n    };\n})();\n\n/*\n * recursively prevents any property or sub-property in cons from:\n *   - being added;\n *   - being removed; or\n *   - being modified.\n */\nfunction deepFreeze(object) {\n    Object.freeze(object);\n\n    for (const name of Object.getOwnPropertyNames(object)) {\n        if (typeof object[name] === \'object\') {\n            deepFreeze(object[name]);\n        }\n    }\n}\n\ndeepFreeze(cons);\n/*\r\n * RelevantInput objects check whether given form inputs should be\r\n * treated as sensitive data.\r\n *\r\n * This should be treated as an abstract class. Only the subclasses\r\n * are intended to be instantiated.\r\n */\r\nclass RelevantInput {\r\n    /*\r\n     * Enum of the possible return values of test():\r\n     * RELEVANT:\r\n     *     Input is relevant now, outgoing requests should be\r\n     *     checked for the contained value (subject to minimum length).\r\n     * POTENTIALLY RELEVANT:\r\n     *     Input should not be considered relevant now, but may be in\r\n     *     future so should continue to be checked.\r\n     * NOT_RELEVANT:\r\n     *     Input is not relevant and will not become relevant, so can\r\n     *     be ommitted from further checks to optimise performance.\r\n     */\r\n    static get relevance() {\r\n        return {\r\n            NOT_RELEVANT: 1,\r\n            POTENTIALLY_RELEVANT: 2,\r\n            RELEVANT: 3,\r\n        };\r\n    }\r\n\r\n    /*\r\n     * relevantInputTypes (string) - a comma separated list of\r\n     * selectors that describe the types of input that should be\r\n     * considered relevant.\r\n     */\r\n    constructor(relevantInputTypes) {\r\n        this.relevantInputTypes = relevantInputTypes;\r\n    }\r\n\r\n    /*\r\n     * Checks whether any of the given input\'s \'labels\' (the ID, name,\r\n     * or actual label) match the given regex.\r\n     */\r\n    static testInputLabel(regex, input) {\r\n        const labels = [\r\n            input.id,\r\n            input.name,\r\n            InputAnalyser.getLabelText(input),\r\n        ];\r\n        return labels.some(label => regex.test(label));\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for passwords.\r\n */\r\nclass Password extends RelevantInput {\r\n    constructor() {\r\n        super(\'input[type=password]\');\r\n    }\r\n\r\n    /*\r\n     * Passwords are verified purely by their input type.\r\n     */\r\n    test(input) {\r\n        if (input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for card numbers.\r\n */\r\nclass CardNumber extends RelevantInput {\r\n    constructor() {\r\n        // Inputs with no type attribute act like text inputs\r\n        super(\r\n            \'input[type=text], input[type=tel], input[type=number], input:not([type])\'\r\n        );\r\n\r\n        // Definitely card number labels\r\n        this.inputLabelRegexes = [\r\n            /(cc|card).?(num|no)/i,\r\n            /&#12459;&#12540;&#12489;&#30058;&#21495;/,\r\n            /&#1053;&#1086;&#1084;&#1077;&#1088;.*&#1082;&#1072;&#1088;&#1090;&#1099;/i,\r\n            /&#20449;&#29992;&#21345;&#21345;&#34399;/i,\r\n            /&#20449;&#29992;&#21345;&#21495;&#30721;/i,\r\n        ];\r\n\r\n        /*\r\n         * Matches incomplete card numbers, because ideally the\r\n         * skimmer should be detected before the victim gives away\r\n         * most of their card number.\r\n         */\r\n        this.inputValueRegexes = [/^(\\d{4}[-\\s]?){0,4}\\d{1,4}$/];\r\n\r\n        // Probably card number labels\r\n        this.suspectInputLabelRegexes = [\r\n            /card/i,\r\n            /tarjeta/i,\r\n            /carte/i,\r\n            /&#1082;&#1072;&#1088;&#1090;&#1099;/i,\r\n            /&#21345;/i,\r\n            /&#12459;&#12540;&#12489;/i,\r\n            /&#52852;&#46300;/i,\r\n            /credit[^s]/i,\r\n        ];\r\n\r\n        // If it matches one of these, probably not a card number\r\n        this.inputLabelExceptionRegexes = [\r\n            /post/i,\r\n            /code/i,\r\n            /zip/i,\r\n            /acc(oun)?t?[-_]?n(um|o)/i,\r\n            /credit[-_]?(sum|limit)/i,\r\n            /loyalty/i,\r\n            /gift/i,\r\n            /idcard/i,\r\n            /cardid/i,\r\n            /club/i,\r\n            /sku/i,\r\n            /(\\b|_)otp/i,\r\n            /price/i,\r\n            /amount/i,\r\n            /service/i,\r\n            /picard/i,\r\n            /search/i,\r\n            /contact/i,\r\n            /callme/i,\r\n            /chat/i,\r\n            /activate/i,\r\n            /msisdn/i,\r\n        ];\r\n    }\r\n\r\n    test(input) {\r\n        if (!input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return NOT_RELEVANT if label matches an exception regex\r\n        if (\r\n            this.inputLabelExceptionRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return RELEVANT if label clearly states card number\r\n        if (\r\n            this.inputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        }\r\n\r\n        /*\r\n         * If label suggests card number, return RELEVANT if value\r\n         * also suggests card number or POTENTIALLY_RELEVANT if\r\n         * not. Otherwise, return NOT_RELEVANT as this element will\r\n         * not become relevant unless a label changes (unlikely).\r\n         */\r\n        if (\r\n            this.suspectInputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            if (this.inputValueRegexes.some(r => r.test(input.value))) {\r\n                return RelevantInput.relevance.RELEVANT;\r\n            } else {\r\n                return RelevantInput.relevance.POTENTIALLY_RELEVANT;\r\n            }\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\n    const inputAnalyser = new InputAnalyser();\n\n    const resourceBlockList = new Set([\n                            \"6C590F97DDB1A11AE795B3050E4C3866\", \"D285BE79786E2ECE396941331C5BA65E\", \"59DF8523520DE7F08FB53D3D12BD94F5\", \"1FB784EBAFDA1618023756BF5B6D7E46\", \"0D6E1B5F03B81F5C37813B22E29C4FE2\", \"EFAB0ECE9383D50C555B8168C3E2A4DD\", \"AC8A4B13A411A4E43E61D0A034FA4A55\", \"25A781F6D1F94EEACCF1E00E844D9E14\", \"3920B04ED0D215EA738F524F60485F23\", \"05F4A2D3161A92EB82A44F15FC2A3AEC\", \"C5A1BE7B3855B0A25275B2877E005CB9\", \"00069CEC347076721EBE2257978A0A33\", \"9A513130D02F360BBDC16D8AC0C579D8\", \"7CDB2A3A29E50F90C1000252EF523AD6\", \"25CE912FAF2376026AAD0174AD5A0329\", \"739E1F67AA5F64A06FC469F6030802D4\", \"F49368C9A05C29EF49411999C5987F2C\", \"AB2DD89FB892155275D8780CF527BC93\", \"CFE758EB18FBFE70B1F690241B75D2B1\", \"E43C3463B40A790545F4149FF06B419E\", \"8B6D4C76A7CCF5EB720660B8B2D3F5EB\", \"45573B3E2F613AF5BF2145DF004BABD1\", \"E3DB4E968B371DE94CE607199A062F39\", \"A4EFF1240C5DE614B394FB738CBD28E2\", \"F42D10E84B9A69A8A24062319F425A83\", \"90646BE39982594A58EDF5D2630CCFFD\", \"669853BEA9B84EA51D7302A7FBFF5BC3\", \"0BA566B4777526F451108100107DC5ED\", \"AB19E12BFFBC47244BDCC2403EAA9037\", \"61DAF8537240639277FD1A5908A131A4\", \"6F1DC1309CFE734C038685D8F17A3B6B\", \"DCC3DB001334F29C1C0208D15E9EAB49\", \"2DBD7D54022C28273ADE3147B8EEB076\", \"AE3760E93412C65EC5BF63537B037019\", \"4CD96A830DAC0E0B5EBE578B0DD870AE\", \"4C70569BBE1821F5655382660807FA77\", \"05ECA17FF0EA78669ED43B2BD7B63571\", \"44E503B3621513B9D3666F284E4DF47A\", \"8F1C92E7665860AE70CBB228DED86111\", \"D69552885B55C4097E5725F805815639\", \"B4357A9D889E974CDF3F9740E48F9A1B\", \"5709DC60CFC365B7064B06C709A9D32B\", \"14E8729CBB16AC3625EAA0D7A679E56E\", \"793D4DABAAA377A12F2B6CE88C5FB389\", \"C5D1DCE2AE0D8CE79054FC16CB13D65A\", \"89F91750BD4A9397D1F8CE183757FF70\", \"50B8BC213FB188A687173C1A0A77EA57\"\n                        ]);\n    const evilJSPatterns = new Set([\n                            \n                        ]);\n\n    // Extract body object\n    function extractBody(data) {\n        if (!data) {\n            return Promise.resolve({});\n        }\n        if (FormData.prototype.isPrototypeOf(data)) {\n            const formData = {};\n            for (const [key, value] of data.entries()) {\n                formData[key] = value;\n            }\n            return Promise.resolve({ formData });\n        }\n        // Create a temporary Request object to parse the body\n        const tempRequest = new Request(\'\', { body: data, method: \'POST\' });\n        return extractBodyFromRequest(tempRequest);\n    }\n\n    function extractBodyFromRequest(request) {\n        // Try to extract as text\n        return request\n            .text()\n            .then(text => {\n                return { text };\n            })\n            .catch(e => {\n                return {};\n            });\n    }\n\n    /**\n     * This function checks if the request hostname/URL is in the blocklist.\n     * Used when identifying whether or not to forward request to background\n     * script.\n     * @param hostname Hostname to check against blocklist.\n     * @param url Request url to check against evil JS patterns\n     * @returns boolean true if hostname is in the blocklist, false if\n     * it is not in blocklist or if blocklist is not provided.\n     */\n    function requestInBlocklist(hostname, url) {\n        if (resourceBlockList === undefined || evilJSPatterns === undefined) {\n            return false;\n        }\n        if (testEvilJS(url.replace(/^(https?:)?\\/\\//i, \'\'))) {\n            return true;\n        }\n        while (!testEvilJS(hostname) && !testResource(hostname)) {\n            const newHostname = hostname.replace(/^.+?\\./g, \'\');\n\n            if (hostname === newHostname) return false;\n\n            hostname = newHostname;\n        }\n        return true;\n    }\n\n    function testEvilJS(url) {\n        return evilJSPatterns.has(base64hash(sha512, url));\n    }\n\n    function testResource(hostname) {\n        return resourceBlockList.has(\n            md5(cons.evilResourcesSalt + hostname).toUpperCase()\n        );\n    }\n\n    /*\n     * Implementations to overwrite window.XMLHttpRequest.prototype.open,\n     * window.XMLHttpRequest.prototype.send and window.fetch. These are (to my knowledge) the two\n     * APIs that can be used to make requests within Javascript. If there are more, then they will\n     * also need to be overridden and intercepted like below.\n     */\n\n    /**\n     * This function generates functions to be used for wrapping and intercepting network\n     * requests, namely from XMLHttpRequest and the Fetch API. It works by taking the real\n     * function we want to intercept the request for, and then uses document.currentScript to work\n     * out which file initiated the request. It sends those details to the content script which\n     * forwards it to the background script, and then we await a confirmation of receipt from the\n     * background page. Finally, the real request is sent by forwarding parameters to the original\n     * function passed in.\n     * @param realFn A reference to the real function that is being intercepted.\n     * @param getRequestUrlFn A function used to get the request URL from the object. This is\n     * necessary as the mechanisms for different objects differs depending on implementation.\n     * @param getRequestBodyPr A function used to get the request body from the object. Returns\n     * a promise. It should be null if it\'s not applicable (e.g. if it sets the src of an image or script).\n     * @param type The type of request, which will be a ResourceType:\n     * https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType\n     * @returns {function(...[*]=): PromiseLike<any | never>}\n     */\n    function generateRequestInterceptFn(\n        realFn,\n        getRequestUrlFn,\n        getRequestBodyPr,\n        type\n    ) {\n        const patched = function(...args) {\n            /*\n             * We create a link DOM element in order to correctly generate the\n             * absolute path of the request, automatically transforming from a\n             * relative path if necessary.\n             */\n            const requestUrl = normaliseUrl(\n                getRequestUrlFn.bind(this)(...args)\n            );\n\n            let requestHostname;\n            let pageHostname;\n\n            try {\n                requestHostname = new URL(requestUrl).hostname;\n                pageHostname = new URL(location.href).hostname;\n            } catch (e) {\n                return realFn.apply(this, args);\n            }\n\n            /*\n             * If hostname is in the blocklist, the request should always be\n             * sent to the background script.\n             */\n            // eslint-disable-next-line prefer-const\n            let forceStall = false;\n\n            if (!forceStall) {\n                /*\n                 * Delaying outgoing requests sometimes causes problems\n                 * with elements such as video players and dynamically\n                 * loaded images, so it should only be done when\n                 * necessary. Before inputAnalyser is defined and when the\n                 * request is to the same hostname as the page, this can\n                 * be skipped.\n                 */\n                if (\n                    requestHostname === pageHostname ||\n                    inputAnalyser === undefined\n                ) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * It can also be skipped if there is no sensitive\n                 * information entered into a form on the page yet.\n                 */\n                const relevantFilledInputs = inputAnalyser.relevantFilledInputs;\n                if (!relevantFilledInputs.length) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * For requests with no body, it\'s only necessary to delay\n                 * them when the sensitive information from the form\n                 * inputs is present in the request URL.\n                 */\n                const ia = new InputAnalyser(relevantFilledInputs);\n                const relevantInputValues = ia.relevantInputValues;\n                const urlMatcher = new URLParamsMatcher(requestUrl);\n\n                if (\n                    getRequestBodyPr === null &&\n                    !urlMatcher.findInputMatches(relevantInputValues).length\n                ) {\n                    return realFn.apply(this, args);\n                }\n            }\n\n            /*\n             * Create a promise that resolves immediately if the request body\n             * does not apply to this request.\n             */\n            if (getRequestBodyPr === null) {\n                getRequestBodyPr = function() {\n                    return Promise.resolve({});\n                };\n            }\n\n            let fileName;\n            if (document.currentScript && document.currentScript.src) {\n                fileName = document.currentScript.src;\n            } else if (callbackCurrentScript && callbackCurrentScript.src) {\n                fileName = callbackCurrentScript.src;\n            } else {\n                fileName = location.href;\n            }\n\n            return getRequestBodyPr\n                .bind(this)(...args)\n                .then(requestBody => {\n                    /*\n                     * Generate the information object to send through to the\n                     * content script including the request URL, the initiator\n                     * filename and a timestamp relative to the page load.\n                     */\n                    const detail = {\n                        fileName,\n                        requestBody,\n                        requestUrl,\n                        timestamp: performance.now(),\n                        type,\n                    };\n\n                    document.dispatchEvent(\n                        new CustomEvent(cons.capturedIntercept, {\n                            detail,\n                        })\n                    );\n\n                    return new Promise(resolve => {\n                        /*\n                         * Send the initiator\'s file name and other info to the\n                         * background script, then wait for confirmation that the\n                         * details made it to the background page before calling\n                         * the real function. This is to avoid any race conditions\n                         * whereby the details haven\'t been added to the tab data\n                         * before onBeforeRequest/onBeforeSendHeaders gets called.\n                         */\n                        document.addEventListener(\n                            cons.confirmedIntercept,\n                            function compareData(customEvent) {\n                                const receivedData = JSON.parse(\n                                    customEvent.detail\n                                );\n                                if (detailsMatch(detail, receivedData)) {\n                                    /*\n                                     * If it\'s the correct confirmation, then we\n                                     * can resolve the promise and call the real\n                                     * function in the finally block.\n                                     */\n                                    document.removeEventListener(\n                                        cons.confirmedIntercept,\n                                        compareData,\n                                        false\n                                    );\n                                    resolve();\n                                }\n                            }\n                        );\n                    }).then(() => realFn.apply(this, args));\n                });\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    function detailsMatch(first, second) {\n        const comparisonKeys = [\'fileName\', \'requestUrl\', \'timestamp\', \'type\'];\n        for (const key of comparisonKeys) {\n            if (first[key] !== second[key]) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    window.fetch = generateRequestInterceptFn(\n        realFetch,\n        request => (typeof request === \'string\' ? request : request.url),\n        (request, options) => {\n            // Check if argument is a Request object.\n            if (request instanceof Request) {\n                return extractBodyFromRequest(request);\n            }\n            return options ? extractBody(options.body) : Promise.resolve({});\n        },\n        \'xmlhttprequest\'\n    );\n\n    window.XMLHttpRequest.prototype.send = generateRequestInterceptFn(\n        realSend,\n        function getRequestUrl() {\n            return this._requestUrl;\n        },\n        extractBody,\n        \'xmlhttprequest\'\n    );\n\n    /*\n     * This function is intercepted so that we can capture the value of the\n     * request URL, since it isn\'t present in the arguments for\n     * XMLHttpRequest.send (above).\n     */\n    window.XMLHttpRequest.prototype.open = function open(...args) {\n        [, this._requestUrl] = args;\n        realOpen.apply(this, args);\n    };\n    window.XMLHttpRequest.prototype.open.toString = () => realOpen.toString();\n\n    /*\n     * Monkeypatches for setting the src of images and scripts, an\n     * indirect way of sending requests that is often employed by\n     * skimmers. The getters are also overridden to make the behaviour\n     * seem identical to the original implementation. Otherwise, if a\n     * script were to set an src and immediately read it, it would\n     * come back as the old value.\n     */\n\n    /*\n     * WeakMap maps an object to a value. This is used to store the\n     * new src of an object when its true src property may not yet\n     * have been set.\n     */\n    const srcMap = new WeakMap();\n    const requestElements = [\n        {\n            srcElement: HTMLImageElement.prototype,\n            type: \'image\',\n        },\n        {\n            srcElement: HTMLScriptElement.prototype,\n            type: \'script\',\n        },\n    ];\n\n    for (const { srcElement, type } of requestElements) {\n        const realGetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .get;\n        const realSetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .set;\n        const realGetAttribute = srcElement.getAttribute;\n        const realSetAttribute = srcElement.setAttribute;\n        const realRemoveAttribute = srcElement.removeAttribute;\n\n        const interceptFn = generateRequestInterceptFn(\n            realSetSrc,\n            src => `${src}`,\n            null,\n            type\n        );\n\n        function setSrc(url) {\n            /*\n             * It\'s valid to provide a TrustedScriptURL wrapping the URL but we need to\n             * return a string in the getter, so we convert the url to a string here.\n             *\n             * The url can also be undefined/null so we can\'t just call `.toString()`.\n             *\n             * See #56.\n             */\n            srcMap.set(this, `${url}`);\n            interceptFn.call(this, url);\n            return url;\n        }\n\n        function getSrc() {\n            if (srcMap.get(this) === undefined) {\n                return realGetSrc.call(this);\n            } else {\n                return normaliseUrl(srcMap.get(this));\n            }\n        }\n\n        getSrc.toString = () => realGetSrc.toString();\n        setSrc.toString = () => realSetSrc.toString();\n\n        Object.defineProperty(srcElement, \'src\', {\n            get: getSrc,\n            set: setSrc,\n        });\n\n        srcElement.setAttribute = function(attributeName, value) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                setSrc.call(this, value);\n            } else {\n                realSetAttribute.call(this, attributeName, value);\n            }\n        };\n        srcElement.setAttribute.toString = () => realSetAttribute.toString();\n\n        srcElement.getAttribute = function(attributeName) {\n            if (\n                attributeName.toUpperCase() === \'SRC\' &&\n                srcMap.get(this) !== undefined\n            ) {\n                return srcMap.get(this);\n            } else {\n                return realGetAttribute.call(this, attributeName);\n            }\n        };\n        srcElement.getAttribute.toString = () => realGetAttribute.toString();\n\n        srcElement.removeAttribute = function(attributeName) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                srcMap.delete(this);\n            }\n\n            return realRemoveAttribute.call(this, attributeName);\n        };\n        srcElement.removeAttribute.toString = () =>\n            realRemoveAttribute.toString();\n    }\n})(\n    window.XMLHttpRequest.prototype.open,\n    window.XMLHttpRequest.prototype.send,\n    window.fetch\n);\n</script>\n                    <style font-name=\"MS PMincho\">\n                        @font-face {\n                            font-family: \"MS PMincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-pmincho.ttf);\n                        }\n                    </style>\n                \n                    <style font-name=\"MS Mincho\">\n                        @font-face {\n                            font-family: \"MS Mincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-mincho.ttf);\n                        }\n                    </style>\n                <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\"><link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n                \n            </head>\n  <body class=\"builderjs-layout\"><style type=\"text/css\">#message-htmlpart1 div.rcmBody #v1outlook a { padding: 0; }\n#message-htmlpart1 div.rcmBody .v1es-button { mso-style-priority: 100!important; text-decoration: none!important; }\n#message-htmlpart1 div.rcmBody a[x-apple-data-detectors] { color: inherit!important; text-decoration: none!important; font-size: inherit!important; font-family: inherit!important; font-weight: inherit!important; line-height: inherit!important; }\n#message-htmlpart1 div.rcmBody .v1es-desk-hidden { display: none; float: left; overflow: hidden; width: 0; max-height: 0; line-height: 0; mso-hide: all; }\n@media only screen and (max-width:600px) {#message-htmlpart1 div.rcmBody p, #message-htmlpart1 div.rcmBody ul li, #message-htmlpart1 div.rcmBody ol li, #message-htmlpart1 div.rcmBody a { line-height: 150%!important; } #message-htmlpart1 div.rcmBody h1, #message-htmlpart1 div.rcmBody h2, #message-htmlpart1 div.rcmBody h3, #message-htmlpart1 div.rcmBody h1 a, #message-htmlpart1 div.rcmBody h2 a, #message-htmlpart1 div.rcmBody h3 a { line-height: 120%; } #message-htmlpart1 div.rcmBody h1 { font-size: 30px!important; text-align: left; } #message-htmlpart1 div.rcmBody h2 { font-size: 24px!important; text-align: left; } #message-htmlpart1 div.rcmBody h3 { font-size: 20px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-header-body h1 a, #message-htmlpart1 div.rcmBody .v1es-content-body h1 a, #message-htmlpart1 div.rcmBody .v1es-footer-body h1 a { font-size: 30px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-header-body h2 a, #message-htmlpart1 div.rcmBody .v1es-content-body h2 a, #message-htmlpart1 div.rcmBody .v1es-footer-body h2 a { font-size: 24px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-header-body h3 a, #message-htmlpart1 div.rcmBody .v1es-content-body h3 a, #message-htmlpart1 div.rcmBody .v1es-footer-body h3 a { font-size: 20px!important; text-align: left; } #message-htmlpart1 div.rcmBody .v1es-menu td a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-header-body p, #message-htmlpart1 div.rcmBody .v1es-header-body ul li, #message-htmlpart1 div.rcmBody .v1es-header-body ol li, #message-htmlpart1 div.rcmBody .v1es-header-body a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-content-body p, #message-htmlpart1 div.rcmBody .v1es-content-body ul li, #message-htmlpart1 div.rcmBody .v1es-content-body ol li, #message-htmlpart1 div.rcmBody .v1es-content-body a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-footer-body p, #message-htmlpart1 div.rcmBody .v1es-footer-body ul li, #message-htmlpart1 div.rcmBody .v1es-footer-body ol li, #message-htmlpart1 div.rcmBody .v1es-footer-body a { font-size: 14px!important; } #message-htmlpart1 div.rcmBody .v1es-infoblock p, #message-htmlpart1 div.rcmBody .v1es-infoblock ul li, #message-htmlpart1 div.rcmBody .v1es-infoblock ol li, #message-htmlpart1 div.rcmBody .v1es-infoblock a { font-size: 12px!important; } #message-htmlpart1 div.rcmBody *[class=\"gmail-fix\"] { display: none!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-c, #message-htmlpart1 div.rcmBody .v1es-m-txt-c h1, #message-htmlpart1 div.rcmBody .v1es-m-txt-c h2, #message-htmlpart1 div.rcmBody .v1es-m-txt-c h3 { text-align: center!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-r, #message-htmlpart1 div.rcmBody .v1es-m-txt-r h1, #message-htmlpart1 div.rcmBody .v1es-m-txt-r h2, #message-htmlpart1 div.rcmBody .v1es-m-txt-r h3 { text-align: right!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-l, #message-htmlpart1 div.rcmBody .v1es-m-txt-l h1, #message-htmlpart1 div.rcmBody .v1es-m-txt-l h2, #message-htmlpart1 div.rcmBody .v1es-m-txt-l h3 { text-align: left!important; } #message-htmlpart1 div.rcmBody .v1es-m-txt-r img, #message-htmlpart1 div.rcmBody .v1es-m-txt-c img, #message-htmlpart1 div.rcmBody .v1es-m-txt-l img { display: inline!important; } #message-htmlpart1 div.rcmBody .v1es-button-border { display: inline-block!important; } #message-htmlpart1 div.rcmBody a.v1es-button, #message-htmlpart1 div.rcmBody button.v1es-button { font-size: 18px!important; display: inline-block!important; } #message-htmlpart1 div.rcmBody .v1es-adaptive table, #message-htmlpart1 div.rcmBody .v1es-left, #message-htmlpart1 div.rcmBody .v1es-right { width: 100%!important; } #message-htmlpart1 div.rcmBody .v1es-content table, #message-htmlpart1 div.rcmBody .v1es-header table, #message-htmlpart1 div.rcmBody .v1es-footer table, #message-htmlpart1 div.rcmBody .v1es-content, #message-htmlpart1 div.rcmBody .v1es-footer, #message-htmlpart1 div.rcmBody .v1es-header { width: 100%!important; max-width: 600px!important; } #message-htmlpart1 div.rcmBody .v1es-adapt-td { display: block!important; width: 100%!important; } #message-htmlpart1 div.rcmBody .v1adapt-img { width: 100%!important; height: auto!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0 { padding: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0r { padding-right: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0l { padding-left: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0t { padding-top: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p0b { padding-bottom: 0!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20b { padding-bottom: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-mobile-hidden, #message-htmlpart1 div.rcmBody .v1es-hidden { display: none!important; } #message-htmlpart1 div.rcmBody tr.v1es-desk-hidden, #message-htmlpart1 div.rcmBody td.v1es-desk-hidden, #message-htmlpart1 div.rcmBody table.v1es-desk-hidden { width: auto!important; overflow: visible!important; float: none!important; max-height: inherit!important; line-height: inherit!important; } #message-htmlpart1 div.rcmBody tr.v1es-desk-hidden { display: table-row!important; } #message-htmlpart1 div.rcmBody table.v1es-desk-hidden { display: table!important; } #message-htmlpart1 div.rcmBody td.v1es-desk-menu-hidden { display: table-cell!important; } #message-htmlpart1 div.rcmBody .v1es-menu td { width: 1%!important; } #message-htmlpart1 div.rcmBody table.v1es-table-not-adapt, #message-htmlpart1 div.rcmBody .v1esd-block-html table { width: auto!important; } #message-htmlpart1 div.rcmBody table.v1es-social { display: inline-block!important; } #message-htmlpart1 div.rcmBody table.v1es-social td { display: inline-block!important; } #message-htmlpart1 div.rcmBody .v1es-desk-hidden { display: table-row!important; width: auto!important; overflow: visible!important; max-height: inherit!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5 { padding: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5t { padding-top: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5b { padding-bottom: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5r { padding-right: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p5l { padding-left: 5px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10 { padding: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10t { padding-top: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10b { padding-bottom: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10r { padding-right: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p10l { padding-left: 10px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15 { padding: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15t { padding-top: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15b { padding-bottom: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15r { padding-right: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p15l { padding-left: 15px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20 { padding: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20t { padding-top: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20r { padding-right: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p20l { padding-left: 20px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25 { padding: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25t { padding-top: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25b { padding-bottom: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25r { padding-right: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p25l { padding-left: 25px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30 { padding: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30t { padding-top: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30b { padding-bottom: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30r { padding-right: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p30l { padding-left: 30px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35 { padding: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35t { padding-top: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35b { padding-bottom: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35r { padding-right: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p35l { padding-left: 35px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40 { padding: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40t { padding-top: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40b { padding-bottom: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40r { padding-right: 40px!important; } #message-htmlpart1 div.rcmBody .v1es-m-p40l { padding-left: 40px!important; } }</style>\n<div class=\"v1es-wrapper-color\" style=\"background-color: #f3f3f3\">\n<table class=\"v1es-wrapper\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; padding: 0; margin: 0; width: 100%; height: 100%; background-repeat: repeat; background-position: center top; background-color: #f3f3f3\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" valign=\"top\">\n<table class=\"v1es-content\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; table-layout: fixed !important; width: 100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" align=\"center\">\n<table class=\"v1es-content-body\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; background-color: #ffffff; width: 600px\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" bgcolor=\"#ffffff\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" align=\"left\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"v1es-m-p0r v1es-m-p20b\" style=\"padding: 0; margin: 0; width: 600px\" align=\"center\" valign=\"top\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0; position: relative\" align=\"center\"><a style=\"-webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; text-decoration: underline; color: #068fc1; font-size: 14px\" href=\"https://www.hostingperu.com.pe/diagnostico-web\" rel=\"noreferrer\" target=\"_blank\"><img class=\"v1adapt-img\" style=\"display: block; border: 0; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic\" title=\"Hosting Peru\" src=\"https://hobezg.stripocdn.email/content/guids/bannerImgGuid/images/image16938504541591855.png\" alt=\"Hosting Peru\" width=\"600\"></a></td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n<table class=\"v1es-content\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; table-layout: fixed !important; width: 100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0\" align=\"center\">\n<table class=\"v1es-content-body\" style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px; background-color: #ffffff; width: 600px\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" bgcolor=\"#ffffff\">\n<tbody>\n<tr>\n<td style=\"margin: 0; padding: 20px 20px 35px 20px\" align=\"left\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td style=\"padding: 0; margin: 0; width: 560px\" align=\"center\" valign=\"top\">\n<table style=\"mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: collapse; border-spacing: 0px\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"v1es-m-txt-c v1es-m-p0r v1es-m-p0l\" style=\"padding: 0; margin: 0; padding-top: 20px; padding-left: 40px; padding-right: 40px\" align=\"center\">\n<p style=\"margin: 0; -webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; font-family: arial, \'helvetica neue\', helvetica, sans-serif; line-height: 21px; color: #455a64; font-size: 14px\"><strong>Estás seguro si tu Sitio Web esta en un sistema actualizado?<br>Si no lo está, eres vulnerable de ataques de Hackers o Phishing</strong></p>\n</td>\n</tr>\n<tr>\n<td class=\"v1es-m-txt-c v1es-m-p0r v1es-m-p0l\" style=\"margin: 0; padding: 15px 40px 20px 40px\" align=\"center\">\n<p style=\"margin: 0; -webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; font-family: arial, \'helvetica neue\', helvetica, sans-serif; line-height: 21px; color: #455a64; font-size: 14px\">Como cliente de Hosting Peru podemos ofrecerte un diagnostico completo GRATIS de su estado.<br><br>Si está actualizado ¡Te felicitaremos!<br><br>Si es vulnerable, HORROR!! Además del informe te podemos enviar una propuesta de renovación segura y total a precios super competitivos.<br>Solicita sin ningún compromiso un DIAGNOSTICO GRATIS!<br>Llenando este sencillo formulario</p>\n</td>\n</tr>\n<tr>\n<td style=\"padding: 0; margin: 0; padding-top: 20px\" align=\"center\"><span class=\"v1msohide v1es-button-border\" style=\"background: #ff5d00; display: inline-block; border-radius: 10px; width: auto; mso-hide: all; border: 0px solid #2CB543\"><a class=\"v1es-button\" style=\"mso-style-priority: 100 !important; text-decoration: none; -webkit-text-size-adjust: none; -ms-text-size-adjust: none; mso-line-height-rule: exactly; color: #ffffff; font-size: 18px; padding: 10px 20px 10px 20px; display: inline-block; background: #ff5d00; border-radius: 10px; font-family: arial, \'helvetica neue\', helvetica, sans-serif; font-weight: normal; font-style: normal; line-height: 22px; width: auto; text-align: center; mso-padding-alt: 0; mso-border-alt: 10px solid #FF5D00\" href=\"https://www.hostingperu.com.pe/diagnostico-web\" rel=\"noreferrer\" target=\"_blank\">Solicitar diagnóstico Gratis</a></span></td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td></tr>\n\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</td>\n</tr>\n</tbody>\n</table>\n</div></body></html>', '2023-09-11 18:48:46', '2023-09-11 18:48:46', 1, 0, NULL, 'email');
INSERT INTO `dbacitemplates` (`id`, `uid`, `customer_id`, `name`, `content`, `created_at`, `updated_at`, `builder`, `is_default`, `theme`, `type`) VALUES
(29, '64ff617ddcfd2', 1, 'Campaña de prueba222', '<!DOCTYPE html><html lang=\"en\"><head><style id=\"mceDefaultStyles\" type=\"text/css\">img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}\r\n</style>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>Blank</title>\n\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MTdkZGNmZDIvY3Nz/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MTdkZGNmZDIvY3Nz/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n  <script>/*\n * This entire block is wrapped in an IIFE to prevent polluting the scope of the web page with\n * functions created by this extension.\n */\n(function(realOpen, realSend, realFetch) {\n    /*\n     * Sometimes pages overwrite standard objects with global\n     * variables. Where possible, we extract fresh versions from an\n     * iframe.\n     */\n    const iframe = document.createElement(\'iframe\');\n    document.documentElement.appendChild(iframe);\n\n    // Initialise with global values\n    let URL = window.URL;\n    let WeakMap = window.WeakMap;\n    let WeakSet = window.WeakSet;\n    let TextDecoder = window.TextDecoder;\n    let Uint8Array = window.Uint8Array;\n    let decodeURIComponent = window.decodeURIComponent;\n    let URLSearchParams = window.URLSearchParams;\n    let Array = window.Array;\n    let Object = window.Object;\n    let atob = window.atob;\n    let CustomEvent = window.CustomEvent;\n    let performance = window.performance;\n    let JSON = window.JSON;\n\n    /*\n     * Under some circumstances the iframe isn\'t added\n     * successfully. If it has a contentWindow then we can extract the\n     * values from it, but otherwise we fall back on the global\n     * values.\n     */\n    if (iframe.contentWindow) {\n        // Try block because sometimes the CORS prevents access to iframe\n        try {\n            URL = iframe.contentWindow.URL;\n            WeakMap = iframe.contentWindow.WeakMap;\n            WeakSet = iframe.contentWindow.WeakSet;\n            TextDecoder = iframe.contentWindow.TextDecoder;\n            Uint8Array = iframe.contentWindow.Uint8Array;\n            decodeURIComponent = iframe.contentWindow.decodeURIComponent;\n            URLSearchParams = iframe.contentWindow.URLSearchParams;\n            Array = iframe.contentWindow.Array;\n            Object = iframe.contentWindow.Object;\n            atob = iframe.contentWindow.atob;\n            CustomEvent = iframe.contentWindow.CustomEvent;\n            performance = iframe.contentWindow.performance;\n            JSON = iframe.contentWindow.JSON;\n        } catch (error) {\n            // Empty catch block to prevent errors from showing in page logs\n        }\n    }\n\n    // If iframe was added successfully, remove it\n    if (iframe.parentNode) {\n        iframe.parentNode.removeChild(iframe);\n    }\n\n    /*\n     * If any of the values don\'t have the correct type, return and\n     * don\'t attempt any monkey patching. This avoids breaking web\n     * pages.\n     */\n    for (f of [\n        URL,\n        WeakMap,\n        WeakSet,\n        TextDecoder,\n        Uint8Array,\n        decodeURIComponent,\n        URLSearchParams,\n        Array,\n        Object,\n        atob,\n        CustomEvent,\n    ]) {\n        if (typeof f !== \'function\') {\n            return;\n        }\n    }\n\n    for (o of [performance, JSON]) {\n        if (typeof o !== \'object\') {\n            return;\n        }\n    }\n\n    /*\n     * Override common funcions that accept callbacks, such as\n     * setInterval, to keep track of what script each callback comes\n     * from. Skimmers commonly have the actual skimming code in a\n     * callback, so most of the time when we intercept a request,\n     * document.currentScript is null. To solve this, the script is\n     * stored in a closure when the callback is passed, and assigned\n     * to callbackCurrentscript when the callback is run.\n     */\n\n    let callbackCurrentScript = null;\n\n    // Maps callbacks originally passed to patched versions\n    const patchedCallbackMap = new WeakMap();\n\n    // Maps patched callbacks to original versions\n    const originalCallbackMap = new WeakMap();\n\n    /**\n     *  Generates the function with which to override the\n     *  callback-accepting functions.\n     *  @param realFn The real function, e.g. setInterval.\n     *  @param callbackIndex The index of the callback in the\n     *  arguments of realFn. For example, the callback is the first\n     *  argument in setInterval, so callbackIndex should be 0.\n     */\n    function generateAddCallbackFunction(realFn, callbackIndex) {\n        const patched = function(...args) {\n            const script = document.currentScript || callbackCurrentScript;\n\n            const callback = args[callbackIndex];\n\n            // If the callback isn\'t a function, there\'s nothing to patch\n            if (typeof callback !== \'function\') {\n                return realFn.apply(this, args);\n            }\n\n            // If a patch exists, use it instead of creating new function\n            let patchedCallback = patchedCallbackMap.get(callback);\n            if (!patchedCallback) {\n                patchedCallback = function() {\n                    callbackCurrentScript = script;\n                    const retVal = callback.apply(this, [...arguments]);\n                    callbackCurrentScript = null;\n                    return retVal;\n                };\n                patchedCallbackMap.set(callback, patchedCallback);\n                originalCallbackMap.set(patchedCallback, callback);\n            }\n\n            args[callbackIndex] = patchedCallback;\n            return realFn.apply(this, args);\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    const realSetInterval = window.setInterval;\n\n    window.setInterval = generateAddCallbackFunction(realSetInterval, 0);\n\n    const realSetTimeout = window.setTimeout;\n\n    window.setTimeout = generateAddCallbackFunction(realSetTimeout, 0);\n\n    const realPromiseThen = Promise.prototype.then;\n    Promise.prototype.then = generateAddCallbackFunction(realPromiseThen, 0);\n\n    const realPromiseCatch = Promise.prototype.catch;\n    Promise.prototype.catch = generateAddCallbackFunction(realPromiseCatch, 0);\n\n    const realPromiseFinally = Promise.prototype.finally;\n    if (realPromiseFinally) {\n        Promise.prototype.finally = generateAddCallbackFunction(\n            realPromiseFinally,\n            0\n        );\n    }\n\n    const realAddEventListener = EventTarget.prototype.addEventListener;\n\n    EventTarget.prototype.addEventListener = generateAddCallbackFunction(\n        realAddEventListener,\n        1\n    );\n\n    /*\n     * removeEventListener needs to be patched to map the passed\n     * listener to the patched listener.\n     */\n    const realRemoveEventListener = EventTarget.prototype.removeEventListener;\n    EventTarget.prototype.removeEventListener = function(...args) {\n        args[1] = patchedCallbackMap.get(args[1]) || args[1];\n\n        return realRemoveEventListener.apply(this, args);\n    };\n    EventTarget.prototype.removeEventListener.toString = () =>\n        realRemoveEventListener.toString();\n\n    /*\n     * Event listeners are sometimes set by directly assigning to a\n     * property from the GlobalEventHandlers mixin,\n     * e.g. \'submitBtn.onclick\'. For each of the GlobalEventHandlers\n     * implementations that are likely to be relevant, the event\n     * properties likely to be used by skimmers are overridden with\n     * our version that tracks currentScript when assigned.\n     */\n    for (const eventTarget of [\n        HTMLElement.prototype,\n        Document.prototype,\n        window,\n    ]) {\n        for (const eventName of [\n            \'onclick\',\n            \'onblur\',\n            \'onfocus\',\n            \'onchange\',\n            \'oninput\',\n            \'onkeydown\',\n            \'onkeypress\',\n            \'onkeyup\',\n            \'onload\',\n            \'onloadend\',\n            \'onmousedown\',\n            \'onmouseenter\',\n            \'onmouseleave\',\n            \'onmousemove\',\n            \'onmouseout\',\n            \'onmouseover\',\n            \'onmouseup\',\n            \'onpointerdown\',\n            \'onpointermove\',\n            \'onpointerup\',\n            \'onpointerover\',\n            \'onpointerout\',\n            \'onpointerenter\',\n            \'onpointerleave\',\n            \'onsubmit\',\n        ]) {\n            const descriptor = Object.getOwnPropertyDescriptor(\n                eventTarget,\n                eventName\n            );\n\n            if (!descriptor) {\n                continue;\n            }\n\n            const realGetter = descriptor.get;\n            const realSetter = descriptor.set;\n\n            const patchedSetter = generateAddCallbackFunction(realSetter, 0);\n\n            /*\n             * In case a script checks the value of the property after\n             * setting it, the getter has to be patched to return the\n             * original callback.\n             */\n            const patchedGetter = function() {\n                const realValue = realGetter.call(this);\n\n                const originalCallback = originalCallbackMap.get(realValue);\n                if (originalCallback) {\n                    return originalCallback;\n                } else {\n                    return realValue;\n                }\n            };\n\n            patchedGetter.toString = () => realGetter.toString();\n\n            Object.defineProperty(eventTarget, eventName, {\n                get: patchedGetter,\n                set: patchedSetter,\n            });\n        }\n    }\n\n    /*\n     * This script has some dependencies that need to be included\n     * without polluting the global namespace. This is achieved by\n     * inserting them into the source at build time in the\n     * makefile. This is preferable to loading the dependencies via\n     * AJAX, because the latter doesn\'t work if the CSP disallows\n     * unsafe-eval. The following tag tells the makefile where to\n     * insert the dependencies.\n     */\n    // <DEPENDENCIES>\nclass InputAnalyser {\n    constructor(_inputs) {\n        this._inputs = _inputs;\n        this._irrelevantInputs = new WeakSet();\n\n        /*\n         * Not currently using Password because it was causing too\n         * many false positives. Some sites use external auth domains,\n         * and many have misconfigured analytics that collect\n         * passwords.\n         */\n        this.relevantInputs = [new CardNumber()];\n    }\n\n    get relevantInputValues() {\n        const inputs = {};\n        this._inputs.forEach(\n            input => (inputs[input.id || input.name] = input.value)\n        );\n\n        return inputs;\n    }\n\n    get relevantFilledInputs() {\n        return this.allInputs\n            .filter(input => this.isRelevantElement(input))\n            .filter(input => input.value.length >= cons.minInputSize)\n            .map(input => ({\n                id: input.id,\n                name: input.name,\n                value: input.value,\n            }));\n    }\n\n    get allInputs() {\n        this._inputs = [\n            ...document.querySelectorAll(\n                this.relevantInputs.map(i => i.relevantInputTypes).join(\', \')\n            ),\n        ];\n\n        return this._inputs;\n    }\n\n    static getLabelText(input) {\n        if (!input.labels.length) {\n            return \'\';\n        }\n        return stripSpecialChars(input.labels[0].textContent).trim();\n    }\n\n    /**\n     * Takes an HTMLElement and determines whether or not it could be relevant for the purposes of\n     * skimmer detection.\n     * @param {HTMLElement} input The element which is to be checked for relevancy.\n     * @returns {boolean} Returns true if the element is potentially relevant (e.g. a credit card\n     * field or other such sensitive input).\n     */\n    isRelevantElement(input) {\n        // If the element has been identified as irrelevant, return false\n        if (this._irrelevantInputs.has(input)) {\n            return false;\n        }\n\n        // Check the input against all the relevant input types\n        const relevances = this.relevantInputs.map(i => i.test(input));\n\n        /*\n         *  If they all agree that this input is unlikely to become\n         *  relevant, exclude it from further checks and return false\n         */\n        if (relevances.every(i => i === RelevantInput.relevance.NOT_RELEVANT)) {\n            this._irrelevantInputs.add(input);\n            return false;\n        }\n\n        // Return true if any consider the input to be relevant, otherwise false\n        return relevances.some(i => i === RelevantInput.relevance.RELEVANT);\n    }\n}\n/*\n * Input Matcher represents a class that can have matches with relevant inputs.\n * Each class that inherits must implement the findInputMatches method.\n */\nclass InputMatcher {\n    /*\n     * Finds any matches with the list of inputs.\n     * @param inputs. An object whose values represent relevant inputs.\n     * @return {[String]} The keys of the inputs that were found.\n     */\n    findInputMatches(inputs) {\n        throw new Error(\'findInputMatches has not been implemented.\');\n    }\n\n    /**\n     * Determines whether one or more values in needles are present in any of\n     * the keys of the haystacks.\n     * Checks both raw input and base64 encoded versions of the needles.\n     * @param needles An object. The haystacks are searched for the values of\n     * this object.\n     * @param haystacks The array of strings in which the needle(s) may reside.\n     * A string may optionally be supplied if only one value is present.\n     * @returns {[String]} The keys of the needles that were found in one or\n     * more haystacks in either raw or base64 encoded form.\n     */\n    static atLeastOneNeedleInHaystack(needles, haystacks) {\n        if (\n            needles === undefined ||\n            needles.length === 0 ||\n            haystacks === undefined\n        ) {\n            return [];\n        }\n\n        const searchArray = Array.isArray(haystacks) ? haystacks : [haystacks];\n\n        return Object.entries(needles)\n            .filter(([_, needle]) =>\n                searchArray.some(haystack => {\n                    if (isBase64Encoded(haystack)) {\n                        if (atob(haystack).indexOf(needle) !== -1) {\n                            return true;\n                        }\n                    }\n                    return haystack.indexOf(needle) !== -1;\n                })\n            )\n            .map(([input, _]) => input);\n    }\n}\n/*\n * Matcher for an object that cannot contain any inputs.\n */\nclass EmptyMatcher extends InputMatcher {\n    findInputMatches(inputs) {\n        return [];\n    }\n}\n\nclass URLParamsMatcher extends InputMatcher {\n    constructor(url) {\n        super();\n        this._url = url;\n    }\n\n    findInputMatches(inputs) {\n        try {\n            const parsedUrl = new URL(this._url);\n            return InputMatcher.atLeastOneNeedleInHaystack(inputs, [\n                ...parsedUrl.searchParams.values(),\n            ]);\n        } catch (e) {\n            return [];\n        }\n    }\n}\n\nclass StringBodyMatcher extends InputMatcher {\n    constructor(str) {\n        super();\n        this._str = str;\n    }\n\n    findInputMatches(inputs) {\n        let decoded;\n        try {\n            decoded = decodeURIComponent(this._str);\n        } catch (e) {\n            decoded = this._str;\n        }\n\n        const searchParams = new URLSearchParams(decoded);\n        const parsedQuery = {};\n        const parsedValues = [];\n\n        for (const [key, value] of searchParams.entries()) {\n            parsedQuery[key] = value;\n            parsedValues.push(value);\n        }\n\n        if (parsedQuery !== {} && parsedValues.indexOf(null) === -1) {\n            return InputMatcher.atLeastOneNeedleInHaystack(\n                inputs,\n                parsedValues\n            );\n        }\n        return InputMatcher.atLeastOneNeedleInHaystack(inputs, decoded);\n    }\n}\n\nclass FormBodyMatcher extends InputMatcher {\n    constructor(formData) {\n        super();\n        this._formData = formData;\n    }\n\n    findInputMatches(inputs) {\n        return InputMatcher.atLeastOneNeedleInHaystack(\n            inputs,\n            Object.values(this._formData).flat()\n        );\n    }\n}\n/**\r\n * Takes a string and removes a variety of \'special\' characters like punctuation.\r\n * @param str The string to be modified.\r\n * @returns {string} The resulting string without any special characters.\r\n */\r\nfunction stripSpecialChars(str) {\r\n    return str.replace(/[`~!@#$%^&*()_|+\\-=?;:\'\",.<>}{\\][\\\\/]/gi, \'\');\r\n}\r\n\r\n/**\r\n * Attempts to identify where a string is base-64 encoded or not.\r\n * @param string The raw string to be examined.\r\n * @returns {boolean} Returns true if the string matches a base-64 string. False otherwise.\r\n */\r\nfunction isBase64Encoded(string) {\r\n    return /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/.test(\r\n        string\r\n    );\r\n}\r\n\r\n// Computes the base64 sha512/sha224 hash of some text, removing trailing ==\r\nfunction base64hash(hashFunction, text) {\r\n    return btoa(\r\n        hashFunction\r\n            .array(text)\r\n            .map(char => String.fromCharCode(char))\r\n            .join(\'\')\r\n    ).slice(0, -2);\r\n}\r\n\r\nfunction normaliseUrl(str) {\r\n    const link = document.createElement(\'a\');\r\n    link.href = str;\r\n    return link.href;\r\n}\r\n\r\nfunction stripCredentials(urlstr) {\r\n    try {\r\n        const url = new URL(urlstr);\r\n        const params = url.searchParams;\r\n        params.forEach((_, key) => params.set(key, \'\'));\r\n        return url.toString();\r\n    } catch (e) {\r\n        return urlstr;\r\n    }\r\n}\r\n\r\n/**\r\n * Check if two URLs match regardless of any partial encoding.\r\n *\r\n * Uses decodeURI which can throw a URIError when url is malformed.\r\n */\r\nfunction urlsMatch(first, second) {\r\n    try {\r\n        return decodeURI(first) === decodeURI(second);\r\n    } catch (e) {\r\n        return false;\r\n    }\r\n}\r\n\r\nfunction sendMessage(type, data, tabId, options) {\r\n    if (tabId) {\r\n        chrome.tabs.sendMessage(tabId, { data, type }, options);\r\n    } else {\r\n        chrome.runtime.sendMessage({ data, type });\r\n    }\r\n}\r\n\r\n// Encodes the given input using base64url as defined by RFC4648 section 5.\r\nfunction base64Url(input) {\r\n    return btoa(input)\r\n        .replace(\'+\', \'-\')\r\n        .replace(\'/\', \'_\');\r\n}\r\n/*\n * Netcraft Extension\n * constants JavaScript\n */\n\n/* eslint sort-keys: \'off\' */\n/* sort-keys is disabled as the constants are separated by type */\n\n// Aligned values here make for easier reading, so we disable prettier\n\n// prettier-ignore\nconst cons = (function() {\n    const cryptojackersUrl = \'https://www.netcraft.com/apps/help/glossary/#crypto-miners\';\n    const skimmersUrl = \'https://www.netcraft.com/apps/help/glossary/#credit-card-skimmers\';\n    const evilResourceCrime = \'attempted to load\';\n\n    return {\n        fields: [\n            \'topsites\',\n            \'country\',\n            \'netblock\',\n            \'hoster\',\n            \'firstseen\',\n            \'rank\',\n            \'risk\',\n            \'uses_sslv3\',\n            \'pfs\',\n            \'heartbleed\',\n            \'heartbleed_message\',\n        ],\n\n        // options that can be toggle in options.js and installed flag\n\n        toggleOptions: [\n            \'installed\',\n            \'block\',\n            \'xss\',\n            \'suspicious\',\n            \'other-malicious-scripts\',\n            \'credential-leaks\',\n            \'analytics\',\n            \'cryptojackers\',\n            \'skimmers\',\n        ],\n\n        // domains\n        mirror:  \'https://mirror2.extension.netcraft.com/\',\n        toolbar: \'https://mirror.toolbar.netcraft.com/\',\n\n        // links and faqs\n        blogArchive:      \'https://news.netcraft.com/archives/\',\n        browserApp:       \'https://www.netcraft.com/apps/browser/\',\n        cryptojackersUrl,\n        extensionStore:   \'https://addons.mozilla.org/en-us/firefox/addon/netcraft-toolbar?src=external-blocked_visit-rating\',\n        heartbleedUrl:    \'https://www.netcraft.com/apps/help/glossary/#heartbleed\',\n        logBlockedVisit:  \'https://toolbar.netcraft.com/blocked_visit\',\n        netblock:         \'https://sitereport.netcraft.com/netblock?q=\',\n        pfsUrl:           \'https://www.netcraft.com/apps/help/glossary/#pfs\',\n        report:           \'https://sitereport.netcraft.com/?url=\',\n        reportAPI:        \'https://report.netcraft.com/api/v2/report/urls\',\n        reportMistake:    \'https://report.netcraft.com/report/mistake?url=\',\n        skimmersUrl,\n        sslv3Url:         \'https://www.netcraft.com/apps/help/glossary/#sslv3\',\n        submissionURL:    \'https://report.netcraft.com/submission/\',\n        topsites:         \'https://trends.netcraft.com/topsites?s=\',\n\n        // paths\n        block:              \'blocked.html\',\n        check:              \'check_url/v4/\',\n        danger:             \'Images/danger.png\',\n        embed:              \'/embedded\',\n        evilJSPatternsFeed: \'eviljspatterns\',\n        skimmerDomainWhitelistFeed: \'eviljsskimmerwhitelist\',\n        evilResourcesFeed:  \'blockdb/netcraft_extension_evil_resource_encrypted-yppL7bVh/\',\n        flags:              \'Images/flags/\',\n        force:              \'/dodns\',\n        heartbleed:         \'Images/heartbleed.png\',\n        info:               \'/info\',\n        poodlePost:         \'2014/10/15/googles-poodle-affects-oodles.html\',\n        warning:            \'Images/warning.png\',\n\n        // feed constants\n        evilResourceTypes: [\'cryptojacker\', \'skimmer\'],\n        evilResourcesSalt: \'C4jhYHxW\',\n        maxRevisions:      5,\n        randomSaltLength:  8,\n\n        // mappings of url_type => information\n        urlTypeInformationMappings: {\n            \'malicious_javascript/cryptojacker\': [\'web miners\',             cryptojackersUrl],\n            \'malicious_javascript/skimmer\':      [\'shopping site skimmers\', skimmersUrl],\n        },\n\n        // mappings of evilResourceTypes => user options\n        evilResourceOptionMappings: {\n            \'cryptojacker\': \'cryptojackers\',\n            \'skimmer\':      \'skimmers\'\n        },\n\n        // mappings of user options => url_type\n        optionUrlTypeMappings: {\n            \'block\':                   /^(?!malicious_javascript:)/,\n            \'cryptojackers\':           /^malicious_javascript\\/cryptojacker$/,\n            \'other-malicious-scripts\': /^malicious_javascript\\/(?!(skimmer|cryptojacker)$)/,\n            \'skimmers\':                /^malicious_javascript\\/skimmer$/,\n        },\n\n        // report constants\n        malwareSourceEmail:  \'extension-reported-malware@netcraft.com\',\n        malwareSourceUUID:   \'mwcCcApi89cobY9loJ9rWJ9HuOhlpwMj\',\n        extensionSourceUUID: \'qBEQ3NhEnwK4sypmuSxBJzRqpxZLRXxe\',\n\n        // report error default message\n        reportErrorMessage: \'An error occured with your submission. Please try again.\',\n\n        // mapping from report API errors to displayed messages\n        reportErrorMappings: {\n            \'Duplicate of a recent submission\': \'This URL has already been reported.\',\n            \'Supplied email is not valid\': \'Invalid email address. Please correct it and try again.\',\n        },\n\n        whitelistErrorMessages: {\n            invalidHostname: \'Invalid hostname, please correct it and try again\',\n            duplicate: \'Protection is already disabled for this site\',\n        },\n\n        // browserAction icon paths\n        iconNormal: {\n            16: \'Images/action-normal-16.png\',\n            24: \'Images/action-normal-24.png\',\n            32: \'Images/action-normal-32.png\'\n        },\n        iconDanger: {\n            16: \'Images/action-danger-16.png\',\n            24: \'Images/action-danger-24.png\',\n            32: \'Images/action-danger-32.png\'\n        },\n        iconWarning: {\n            16: \'Images/action-warning-16.png\',\n            24: \'Images/action-warning-24.png\',\n            32: \'Images/action-warning-32.png\'\n        },\n        iconDisabled: {\n            16: \'Images/action-disabled-16.png\',\n            24: \'Images/action-disabled-24.png\',\n            32: \'Images/action-disabled-32.png\'\n        },\n\n        // Extension internal message types\n        capturedIntercept:  \'interceptDetailsCaptured\',\n        confirmedIntercept: \'interceptDetailsConfirmed\',\n        contentReady:       \'contentScriptReady\',\n        leaksEnabled:       \'credentialLeaksEnabled\',\n        reportURL:          \'report\',\n        reqBlock:           \'block\',\n        reqDetails:         \'details\',\n        reqForce:           \'force\',\n        reqPopUp:           \'popup\',\n        reqPrintTimingData: \'time\', //debug\n        reqInputs:          \'requestInputValues\',\n        sendInputs:         \'sendInputs\',\n        sendIntercept:      \'sendInterceptDetails\',\n        updateOption:       \'updateOption\',\n        updateWhitelist:    \'whitelist\', // disable button whitelist\n\n        // Status codes\n        errEvilResource: \'EVILRESOURCE\',\n        errNoDetails:    \'NODETAILS\',\n        errNoInfo:       \'NOINFO\',\n        errBlocked:      \'BLOCKED\',\n        errPending:      \'PENDING\',\n        errServer:       \'ERROR\',\n        errSuspicious:   \'SUSPICIOUS\',\n        errTimeout:      \'TIMEOUT\',\n        errXSS:          \'XSS\',\n        noError:         \'OK\',\n\n        // Valid protocols (it is a regex match so ^ matches start of string)\n        protocols:    [\'^http\', \'^https\', \'^ftp\'],\n\n        // Human readable messages\n        msgNa:           \'NA\',\n        msgNewSite:      \'New Site\',\n        msgNoInfo:       \'Site information not available\',\n        msgNoServer:     \'Unable to contact Netcraft servers\',\n        msgSuspicious:   \'Suspicious URL Detected\',\n        msgXSS:          \'Suspected XSS Attack\',\n        msgBlocked:      {\n            \'malicious_javascript/skimmer\': {\n                title: \'Shopping Site Skimmer Detected\',\n                description: \'shopping site skimmer\'\n            },\n            \'malicious_javascript/dropsite\': {\n                title: \'Potential Credential Leak Detected\',\n                description: \'potential credential leak\'\n            },\n            \'malicious_javascript/cryptojacker\': {\n                title: \'Web Miner Detected\',\n                description: \'web miner\'\n            },\n            \'malware_c2/infrastructure\': {\n                title: \'Malicious URL\',\n                description: \'malicious page\'\n            },\n            \'default\': {\n                title: \'Suspected Phishing\',\n                description: \'suspected phishing site\'\n            },\n        },\n\n        // Human readable reasons\n        urlTypeCrimeMappings: {\n            \'malicious_javascript/skimmer\':      evilResourceCrime,\n            \'malicious_javascript/cryptojacker\': evilResourceCrime,\n            \'malicious_javascript/dropsite\':     \' is blocked because we detected that sensitive information was leaked from\',\n        },\n\n        // Timeout function value to clear cache etc.\n        timeout:      300000,\n\n        // Skimmer whitelist update interval (1 day)\n        skimmerWhitelistInterval: 1000 * 60 * 60 * 24,\n\n        // Google Analytics account\n        account:      \'UA-2150242-8\',\n        gaCategory:   \'Popup load times\',\n\n        // InputAnalyser constants\n        minInputSize: 5,\n\n        // First addresses of the private IPv4 netblocks\n        privateIPv4Blocks: [\n            \'10.0.0.0\',\n            \'172.16.0.0\',\n            \'192.168.0.0\'\n        ],\n\n        // Sync storage key for disable for this site button whitelist\n        disableButtonWhitelistKey: \'disableButtonWhitelist\',\n\n        // Local storage key for local credential leak detection whitelist\n        localCredentialLeakWhitelistKey: \'localCredentialLeakWhitelist\',\n\n        // Whitelisted fileName regexes for credential leak detection\n        credentialLeakFileNameWhitelist: [\n            /^https?:\\/\\/googleads.g.doubleclick.net\\//,\n        ],\n    };\n})();\n\n/*\n * recursively prevents any property or sub-property in cons from:\n *   - being added;\n *   - being removed; or\n *   - being modified.\n */\nfunction deepFreeze(object) {\n    Object.freeze(object);\n\n    for (const name of Object.getOwnPropertyNames(object)) {\n        if (typeof object[name] === \'object\') {\n            deepFreeze(object[name]);\n        }\n    }\n}\n\ndeepFreeze(cons);\n/*\r\n * RelevantInput objects check whether given form inputs should be\r\n * treated as sensitive data.\r\n *\r\n * This should be treated as an abstract class. Only the subclasses\r\n * are intended to be instantiated.\r\n */\r\nclass RelevantInput {\r\n    /*\r\n     * Enum of the possible return values of test():\r\n     * RELEVANT:\r\n     *     Input is relevant now, outgoing requests should be\r\n     *     checked for the contained value (subject to minimum length).\r\n     * POTENTIALLY RELEVANT:\r\n     *     Input should not be considered relevant now, but may be in\r\n     *     future so should continue to be checked.\r\n     * NOT_RELEVANT:\r\n     *     Input is not relevant and will not become relevant, so can\r\n     *     be ommitted from further checks to optimise performance.\r\n     */\r\n    static get relevance() {\r\n        return {\r\n            NOT_RELEVANT: 1,\r\n            POTENTIALLY_RELEVANT: 2,\r\n            RELEVANT: 3,\r\n        };\r\n    }\r\n\r\n    /*\r\n     * relevantInputTypes (string) - a comma separated list of\r\n     * selectors that describe the types of input that should be\r\n     * considered relevant.\r\n     */\r\n    constructor(relevantInputTypes) {\r\n        this.relevantInputTypes = relevantInputTypes;\r\n    }\r\n\r\n    /*\r\n     * Checks whether any of the given input\'s \'labels\' (the ID, name,\r\n     * or actual label) match the given regex.\r\n     */\r\n    static testInputLabel(regex, input) {\r\n        const labels = [\r\n            input.id,\r\n            input.name,\r\n            InputAnalyser.getLabelText(input),\r\n        ];\r\n        return labels.some(label => regex.test(label));\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for passwords.\r\n */\r\nclass Password extends RelevantInput {\r\n    constructor() {\r\n        super(\'input[type=password]\');\r\n    }\r\n\r\n    /*\r\n     * Passwords are verified purely by their input type.\r\n     */\r\n    test(input) {\r\n        if (input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for card numbers.\r\n */\r\nclass CardNumber extends RelevantInput {\r\n    constructor() {\r\n        // Inputs with no type attribute act like text inputs\r\n        super(\r\n            \'input[type=text], input[type=tel], input[type=number], input:not([type])\'\r\n        );\r\n\r\n        // Definitely card number labels\r\n        this.inputLabelRegexes = [\r\n            /(cc|card).?(num|no)/i,\r\n            /カード番号/,\r\n            /Номер.*карты/i,\r\n            /信用卡卡號/i,\r\n            /信用卡号码/i,\r\n        ];\r\n\r\n        /*\r\n         * Matches incomplete card numbers, because ideally the\r\n         * skimmer should be detected before the victim gives away\r\n         * most of their card number.\r\n         */\r\n        this.inputValueRegexes = [/^(\\d{4}[-\\s]?){0,4}\\d{1,4}$/];\r\n\r\n        // Probably card number labels\r\n        this.suspectInputLabelRegexes = [\r\n            /card/i,\r\n            /tarjeta/i,\r\n            /carte/i,\r\n            /карты/i,\r\n            /卡/i,\r\n            /カード/i,\r\n            /카드/i,\r\n            /credit[^s]/i,\r\n        ];\r\n\r\n        // If it matches one of these, probably not a card number\r\n        this.inputLabelExceptionRegexes = [\r\n            /post/i,\r\n            /code/i,\r\n            /zip/i,\r\n            /acc(oun)?t?[-_]?n(um|o)/i,\r\n            /credit[-_]?(sum|limit)/i,\r\n            /loyalty/i,\r\n            /gift/i,\r\n            /idcard/i,\r\n            /cardid/i,\r\n            /club/i,\r\n            /sku/i,\r\n            /(\\b|_)otp/i,\r\n            /price/i,\r\n            /amount/i,\r\n            /service/i,\r\n            /picard/i,\r\n            /search/i,\r\n            /contact/i,\r\n            /callme/i,\r\n            /chat/i,\r\n            /activate/i,\r\n            /msisdn/i,\r\n        ];\r\n    }\r\n\r\n    test(input) {\r\n        if (!input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return NOT_RELEVANT if label matches an exception regex\r\n        if (\r\n            this.inputLabelExceptionRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return RELEVANT if label clearly states card number\r\n        if (\r\n            this.inputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        }\r\n\r\n        /*\r\n         * If label suggests card number, return RELEVANT if value\r\n         * also suggests card number or POTENTIALLY_RELEVANT if\r\n         * not. Otherwise, return NOT_RELEVANT as this element will\r\n         * not become relevant unless a label changes (unlikely).\r\n         */\r\n        if (\r\n            this.suspectInputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            if (this.inputValueRegexes.some(r => r.test(input.value))) {\r\n                return RelevantInput.relevance.RELEVANT;\r\n            } else {\r\n                return RelevantInput.relevance.POTENTIALLY_RELEVANT;\r\n            }\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\n    const inputAnalyser = new InputAnalyser();\n\n    const resourceBlockList = new Set([\n                            \"6C590F97DDB1A11AE795B3050E4C3866\", \"D285BE79786E2ECE396941331C5BA65E\", \"59DF8523520DE7F08FB53D3D12BD94F5\", \"1FB784EBAFDA1618023756BF5B6D7E46\", \"0D6E1B5F03B81F5C37813B22E29C4FE2\", \"EFAB0ECE9383D50C555B8168C3E2A4DD\", \"AC8A4B13A411A4E43E61D0A034FA4A55\", \"25A781F6D1F94EEACCF1E00E844D9E14\", \"3920B04ED0D215EA738F524F60485F23\", \"05F4A2D3161A92EB82A44F15FC2A3AEC\", \"C5A1BE7B3855B0A25275B2877E005CB9\", \"00069CEC347076721EBE2257978A0A33\", \"9A513130D02F360BBDC16D8AC0C579D8\", \"7CDB2A3A29E50F90C1000252EF523AD6\", \"25CE912FAF2376026AAD0174AD5A0329\", \"739E1F67AA5F64A06FC469F6030802D4\", \"F49368C9A05C29EF49411999C5987F2C\", \"AB2DD89FB892155275D8780CF527BC93\", \"CFE758EB18FBFE70B1F690241B75D2B1\", \"E43C3463B40A790545F4149FF06B419E\", \"8B6D4C76A7CCF5EB720660B8B2D3F5EB\", \"45573B3E2F613AF5BF2145DF004BABD1\", \"E3DB4E968B371DE94CE607199A062F39\", \"A4EFF1240C5DE614B394FB738CBD28E2\", \"F42D10E84B9A69A8A24062319F425A83\", \"90646BE39982594A58EDF5D2630CCFFD\", \"669853BEA9B84EA51D7302A7FBFF5BC3\", \"0BA566B4777526F451108100107DC5ED\", \"AB19E12BFFBC47244BDCC2403EAA9037\", \"61DAF8537240639277FD1A5908A131A4\", \"6F1DC1309CFE734C038685D8F17A3B6B\", \"DCC3DB001334F29C1C0208D15E9EAB49\", \"2DBD7D54022C28273ADE3147B8EEB076\", \"AE3760E93412C65EC5BF63537B037019\", \"4CD96A830DAC0E0B5EBE578B0DD870AE\", \"4C70569BBE1821F5655382660807FA77\", \"05ECA17FF0EA78669ED43B2BD7B63571\", \"44E503B3621513B9D3666F284E4DF47A\", \"8F1C92E7665860AE70CBB228DED86111\", \"D69552885B55C4097E5725F805815639\", \"B4357A9D889E974CDF3F9740E48F9A1B\", \"5709DC60CFC365B7064B06C709A9D32B\", \"14E8729CBB16AC3625EAA0D7A679E56E\", \"793D4DABAAA377A12F2B6CE88C5FB389\", \"C5D1DCE2AE0D8CE79054FC16CB13D65A\", \"89F91750BD4A9397D1F8CE183757FF70\", \"50B8BC213FB188A687173C1A0A77EA57\"\n                        ]);\n    const evilJSPatterns = new Set([\n                            \n                        ]);\n\n    // Extract body object\n    function extractBody(data) {\n        if (!data) {\n            return Promise.resolve({});\n        }\n        if (FormData.prototype.isPrototypeOf(data)) {\n            const formData = {};\n            for (const [key, value] of data.entries()) {\n                formData[key] = value;\n            }\n            return Promise.resolve({ formData });\n        }\n        // Create a temporary Request object to parse the body\n        const tempRequest = new Request(\'\', { body: data, method: \'POST\' });\n        return extractBodyFromRequest(tempRequest);\n    }\n\n    function extractBodyFromRequest(request) {\n        // Try to extract as text\n        return request\n            .text()\n            .then(text => {\n                return { text };\n            })\n            .catch(e => {\n                return {};\n            });\n    }\n\n    /**\n     * This function checks if the request hostname/URL is in the blocklist.\n     * Used when identifying whether or not to forward request to background\n     * script.\n     * @param hostname Hostname to check against blocklist.\n     * @param url Request url to check against evil JS patterns\n     * @returns boolean true if hostname is in the blocklist, false if\n     * it is not in blocklist or if blocklist is not provided.\n     */\n    function requestInBlocklist(hostname, url) {\n        if (resourceBlockList === undefined || evilJSPatterns === undefined) {\n            return false;\n        }\n        if (testEvilJS(url.replace(/^(https?:)?\\/\\//i, \'\'))) {\n            return true;\n        }\n        while (!testEvilJS(hostname) && !testResource(hostname)) {\n            const newHostname = hostname.replace(/^.+?\\./g, \'\');\n\n            if (hostname === newHostname) return false;\n\n            hostname = newHostname;\n        }\n        return true;\n    }\n\n    function testEvilJS(url) {\n        return evilJSPatterns.has(base64hash(sha512, url));\n    }\n\n    function testResource(hostname) {\n        return resourceBlockList.has(\n            md5(cons.evilResourcesSalt + hostname).toUpperCase()\n        );\n    }\n\n    /*\n     * Implementations to overwrite window.XMLHttpRequest.prototype.open,\n     * window.XMLHttpRequest.prototype.send and window.fetch. These are (to my knowledge) the two\n     * APIs that can be used to make requests within Javascript. If there are more, then they will\n     * also need to be overridden and intercepted like below.\n     */\n\n    /**\n     * This function generates functions to be used for wrapping and intercepting network\n     * requests, namely from XMLHttpRequest and the Fetch API. It works by taking the real\n     * function we want to intercept the request for, and then uses document.currentScript to work\n     * out which file initiated the request. It sends those details to the content script which\n     * forwards it to the background script, and then we await a confirmation of receipt from the\n     * background page. Finally, the real request is sent by forwarding parameters to the original\n     * function passed in.\n     * @param realFn A reference to the real function that is being intercepted.\n     * @param getRequestUrlFn A function used to get the request URL from the object. This is\n     * necessary as the mechanisms for different objects differs depending on implementation.\n     * @param getRequestBodyPr A function used to get the request body from the object. Returns\n     * a promise. It should be null if it\'s not applicable (e.g. if it sets the src of an image or script).\n     * @param type The type of request, which will be a ResourceType:\n     * https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType\n     * @returns {function(...[*]=): PromiseLike<any | never>}\n     */\n    function generateRequestInterceptFn(\n        realFn,\n        getRequestUrlFn,\n        getRequestBodyPr,\n        type\n    ) {\n        const patched = function(...args) {\n            /*\n             * We create a link DOM element in order to correctly generate the\n             * absolute path of the request, automatically transforming from a\n             * relative path if necessary.\n             */\n            const requestUrl = normaliseUrl(\n                getRequestUrlFn.bind(this)(...args)\n            );\n\n            let requestHostname;\n            let pageHostname;\n\n            try {\n                requestHostname = new URL(requestUrl).hostname;\n                pageHostname = new URL(location.href).hostname;\n            } catch (e) {\n                return realFn.apply(this, args);\n            }\n\n            /*\n             * If hostname is in the blocklist, the request should always be\n             * sent to the background script.\n             */\n            // eslint-disable-next-line prefer-const\n            let forceStall = false;\n\n            if (!forceStall) {\n                /*\n                 * Delaying outgoing requests sometimes causes problems\n                 * with elements such as video players and dynamically\n                 * loaded images, so it should only be done when\n                 * necessary. Before inputAnalyser is defined and when the\n                 * request is to the same hostname as the page, this can\n                 * be skipped.\n                 */\n                if (\n                    requestHostname === pageHostname ||\n                    inputAnalyser === undefined\n                ) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * It can also be skipped if there is no sensitive\n                 * information entered into a form on the page yet.\n                 */\n                const relevantFilledInputs = inputAnalyser.relevantFilledInputs;\n                if (!relevantFilledInputs.length) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * For requests with no body, it\'s only necessary to delay\n                 * them when the sensitive information from the form\n                 * inputs is present in the request URL.\n                 */\n                const ia = new InputAnalyser(relevantFilledInputs);\n                const relevantInputValues = ia.relevantInputValues;\n                const urlMatcher = new URLParamsMatcher(requestUrl);\n\n                if (\n                    getRequestBodyPr === null &&\n                    !urlMatcher.findInputMatches(relevantInputValues).length\n                ) {\n                    return realFn.apply(this, args);\n                }\n            }\n\n            /*\n             * Create a promise that resolves immediately if the request body\n             * does not apply to this request.\n             */\n            if (getRequestBodyPr === null) {\n                getRequestBodyPr = function() {\n                    return Promise.resolve({});\n                };\n            }\n\n            let fileName;\n            if (document.currentScript && document.currentScript.src) {\n                fileName = document.currentScript.src;\n            } else if (callbackCurrentScript && callbackCurrentScript.src) {\n                fileName = callbackCurrentScript.src;\n            } else {\n                fileName = location.href;\n            }\n\n            return getRequestBodyPr\n                .bind(this)(...args)\n                .then(requestBody => {\n                    /*\n                     * Generate the information object to send through to the\n                     * content script including the request URL, the initiator\n                     * filename and a timestamp relative to the page load.\n                     */\n                    const detail = {\n                        fileName,\n                        requestBody,\n                        requestUrl,\n                        timestamp: performance.now(),\n                        type,\n                    };\n\n                    document.dispatchEvent(\n                        new CustomEvent(cons.capturedIntercept, {\n                            detail,\n                        })\n                    );\n\n                    return new Promise(resolve => {\n                        /*\n                         * Send the initiator\'s file name and other info to the\n                         * background script, then wait for confirmation that the\n                         * details made it to the background page before calling\n                         * the real function. This is to avoid any race conditions\n                         * whereby the details haven\'t been added to the tab data\n                         * before onBeforeRequest/onBeforeSendHeaders gets called.\n                         */\n                        document.addEventListener(\n                            cons.confirmedIntercept,\n                            function compareData(customEvent) {\n                                const receivedData = JSON.parse(\n                                    customEvent.detail\n                                );\n                                if (detailsMatch(detail, receivedData)) {\n                                    /*\n                                     * If it\'s the correct confirmation, then we\n                                     * can resolve the promise and call the real\n                                     * function in the finally block.\n                                     */\n                                    document.removeEventListener(\n                                        cons.confirmedIntercept,\n                                        compareData,\n                                        false\n                                    );\n                                    resolve();\n                                }\n                            }\n                        );\n                    }).then(() => realFn.apply(this, args));\n                });\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    function detailsMatch(first, second) {\n        const comparisonKeys = [\'fileName\', \'requestUrl\', \'timestamp\', \'type\'];\n        for (const key of comparisonKeys) {\n            if (first[key] !== second[key]) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    window.fetch = generateRequestInterceptFn(\n        realFetch,\n        request => (typeof request === \'string\' ? request : request.url),\n        (request, options) => {\n            // Check if argument is a Request object.\n            if (request instanceof Request) {\n                return extractBodyFromRequest(request);\n            }\n            return options ? extractBody(options.body) : Promise.resolve({});\n        },\n        \'xmlhttprequest\'\n    );\n\n    window.XMLHttpRequest.prototype.send = generateRequestInterceptFn(\n        realSend,\n        function getRequestUrl() {\n            return this._requestUrl;\n        },\n        extractBody,\n        \'xmlhttprequest\'\n    );\n\n    /*\n     * This function is intercepted so that we can capture the value of the\n     * request URL, since it isn\'t present in the arguments for\n     * XMLHttpRequest.send (above).\n     */\n    window.XMLHttpRequest.prototype.open = function open(...args) {\n        [, this._requestUrl] = args;\n        realOpen.apply(this, args);\n    };\n    window.XMLHttpRequest.prototype.open.toString = () => realOpen.toString();\n\n    /*\n     * Monkeypatches for setting the src of images and scripts, an\n     * indirect way of sending requests that is often employed by\n     * skimmers. The getters are also overridden to make the behaviour\n     * seem identical to the original implementation. Otherwise, if a\n     * script were to set an src and immediately read it, it would\n     * come back as the old value.\n     */\n\n    /*\n     * WeakMap maps an object to a value. This is used to store the\n     * new src of an object when its true src property may not yet\n     * have been set.\n     */\n    const srcMap = new WeakMap();\n    const requestElements = [\n        {\n            srcElement: HTMLImageElement.prototype,\n            type: \'image\',\n        },\n        {\n            srcElement: HTMLScriptElement.prototype,\n            type: \'script\',\n        },\n    ];\n\n    for (const { srcElement, type } of requestElements) {\n        const realGetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .get;\n        const realSetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .set;\n        const realGetAttribute = srcElement.getAttribute;\n        const realSetAttribute = srcElement.setAttribute;\n        const realRemoveAttribute = srcElement.removeAttribute;\n\n        const interceptFn = generateRequestInterceptFn(\n            realSetSrc,\n            src => `${src}`,\n            null,\n            type\n        );\n\n        function setSrc(url) {\n            /*\n             * It\'s valid to provide a TrustedScriptURL wrapping the URL but we need to\n             * return a string in the getter, so we convert the url to a string here.\n             *\n             * The url can also be undefined/null so we can\'t just call `.toString()`.\n             *\n             * See #56.\n             */\n            srcMap.set(this, `${url}`);\n            interceptFn.call(this, url);\n            return url;\n        }\n\n        function getSrc() {\n            if (srcMap.get(this) === undefined) {\n                return realGetSrc.call(this);\n            } else {\n                return normaliseUrl(srcMap.get(this));\n            }\n        }\n\n        getSrc.toString = () => realGetSrc.toString();\n        setSrc.toString = () => realSetSrc.toString();\n\n        Object.defineProperty(srcElement, \'src\', {\n            get: getSrc,\n            set: setSrc,\n        });\n\n        srcElement.setAttribute = function(attributeName, value) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                setSrc.call(this, value);\n            } else {\n                realSetAttribute.call(this, attributeName, value);\n            }\n        };\n        srcElement.setAttribute.toString = () => realSetAttribute.toString();\n\n        srcElement.getAttribute = function(attributeName) {\n            if (\n                attributeName.toUpperCase() === \'SRC\' &&\n                srcMap.get(this) !== undefined\n            ) {\n                return srcMap.get(this);\n            } else {\n                return realGetAttribute.call(this, attributeName);\n            }\n        };\n        srcElement.getAttribute.toString = () => realGetAttribute.toString();\n\n        srcElement.removeAttribute = function(attributeName) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                srcMap.delete(this);\n            }\n\n            return realRemoveAttribute.call(this, attributeName);\n        };\n        srcElement.removeAttribute.toString = () =>\n            realRemoveAttribute.toString();\n    }\n})(\n    window.XMLHttpRequest.prototype.open,\n    window.XMLHttpRequest.prototype.send,\n    window.fetch\n);\n</script>\n                    <style font-name=\"MS PMincho\">\n                        @font-face {\n                            font-family: \"MS PMincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-pmincho.ttf);\n                        }\n                    </style>\n                \n                    <style font-name=\"MS Mincho\">\n                        @font-face {\n                            font-family: \"MS Mincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-mincho.ttf);\n                        }\n                    </style>\n                <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\"><link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n                \n            </head>\n  <body class=\"builderjs-layout\" spellcheck=\"false\">\n    <!--[if mso]>\n        <center>\n        <table><tr><td width=\"760\">\n    <![endif]-->\n        <div builder-element=\"PageElement\" style=\"padding-top:50px;padding-bottom:50px;\" class=\"\"><table width=\"100%\" builder-element=\"BlockElement\" style=\"opacity: 1;\" class=\"\">\n                    <tbody><tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                        <div class=\"container\">\n                        <div style=\"text-align:center;margin:0\">\n            <img builder-element=\"\" src=\"data:image/png;base64,[encoded data, 4956 characters]\" width=\"200px\" class=\"\">\n        </div></div>\n                    </td></tr></tbody></table><table width=\"100%\" builder-element=\"BlockElement\" style=\"opacity: 1;\" class=\"\">\n                    <tbody><tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                        <div class=\"container\">\n                        <div builder-element=\"TextElement\" builder-inline-edit=\"\" id=\"mce_0\" style=\"text-align: center; position: relative;\" spellcheck=\"false\">I\'m a new Text block ready for your content.</div></div>\n                    </td></tr></tbody></table></div>\n    <!--[if mso]>\n        </td></tr></table>\n        </center>\n    <![endif]--> \n  \n</body></html>', '2023-09-11 18:50:37', '2023-09-11 18:51:06', 1, 0, NULL, 'email');
INSERT INTO `dbacitemplates` (`id`, `uid`, `customer_id`, `name`, `content`, `created_at`, `updated_at`, `builder`, `is_default`, `theme`, `type`) VALUES
(30, '64ff61c4ba78f', 1, '[Campaign: \"Demo2\"]', '<!DOCTYPE html><html lang=\"en\"><head><style id=\"mceDefaultStyles\" type=\"text/css\">img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}\r\n</style>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"Mark Otto, Jacob Thornton, and Bootstrap contributors\">\n    <meta name=\"generator\" content=\"AcelleSystemLayouts\">\n    <title>Blank</title>\n\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MWM0YmE3OGYvY3Nz/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"/assets/YXBwL2N1c3RvbWVycy82NGZmNWUxODg1NTE5L2hvbWUvdGVtcGxhdGVzLzY0ZmY2MWM0YmE3OGYvY3Nz/custom.css\" rel=\"stylesheet\">\n\n    <style>\n        @media (min-width: 768px) {\n            .container {\n                max-width: 650px;\n            }\n        }\n        @media (min-width: 992px) {\n            .container {\n                max-width: 760px;\n            }\n        }\n        @media (min-width: 769px) {\n            [data-hide-on=\"desktop\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [data-hide-on=\"mobile\"] {\n                display: none!important;\n            }\n        }\n        @media (max-width: 600px) {\n            [builder-element=CellContainerElement].cell-responsive {\n                display: block!important;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] {\n                width: 100%!important;\n                max-width: none!important;        \n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"],\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"BlockElement\"] {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n            /* EmailMode */\n            [builder-element=CellContainerElement].cell-responsive tbody,\n            [builder-element=CellContainerElement].cell-responsive tr,\n            [builder-element=CellContainerElement].cell-responsive td {\n                display: block!important;\n                width: 100%;\n            }\n            [builder-element=CellContainerElement].cell-responsive [builder-element=\"CellElement\"] td {\n                padding-left: 0px!important;\n                padding-right: 0px!important;\n            }\n        }\n        @media (min-width: 600px) {\n            [builder-element=PricingTableElement] .col-12 {\n                flex-basis: 0;\n                flex-grow: 1;\n            }\n        }\n    </style>\n  <script>/*\n * This entire block is wrapped in an IIFE to prevent polluting the scope of the web page with\n * functions created by this extension.\n */\n(function(realOpen, realSend, realFetch) {\n    /*\n     * Sometimes pages overwrite standard objects with global\n     * variables. Where possible, we extract fresh versions from an\n     * iframe.\n     */\n    const iframe = document.createElement(\'iframe\');\n    document.documentElement.appendChild(iframe);\n\n    // Initialise with global values\n    let URL = window.URL;\n    let WeakMap = window.WeakMap;\n    let WeakSet = window.WeakSet;\n    let TextDecoder = window.TextDecoder;\n    let Uint8Array = window.Uint8Array;\n    let decodeURIComponent = window.decodeURIComponent;\n    let URLSearchParams = window.URLSearchParams;\n    let Array = window.Array;\n    let Object = window.Object;\n    let atob = window.atob;\n    let CustomEvent = window.CustomEvent;\n    let performance = window.performance;\n    let JSON = window.JSON;\n\n    /*\n     * Under some circumstances the iframe isn\'t added\n     * successfully. If it has a contentWindow then we can extract the\n     * values from it, but otherwise we fall back on the global\n     * values.\n     */\n    if (iframe.contentWindow) {\n        // Try block because sometimes the CORS prevents access to iframe\n        try {\n            URL = iframe.contentWindow.URL;\n            WeakMap = iframe.contentWindow.WeakMap;\n            WeakSet = iframe.contentWindow.WeakSet;\n            TextDecoder = iframe.contentWindow.TextDecoder;\n            Uint8Array = iframe.contentWindow.Uint8Array;\n            decodeURIComponent = iframe.contentWindow.decodeURIComponent;\n            URLSearchParams = iframe.contentWindow.URLSearchParams;\n            Array = iframe.contentWindow.Array;\n            Object = iframe.contentWindow.Object;\n            atob = iframe.contentWindow.atob;\n            CustomEvent = iframe.contentWindow.CustomEvent;\n            performance = iframe.contentWindow.performance;\n            JSON = iframe.contentWindow.JSON;\n        } catch (error) {\n            // Empty catch block to prevent errors from showing in page logs\n        }\n    }\n\n    // If iframe was added successfully, remove it\n    if (iframe.parentNode) {\n        iframe.parentNode.removeChild(iframe);\n    }\n\n    /*\n     * If any of the values don\'t have the correct type, return and\n     * don\'t attempt any monkey patching. This avoids breaking web\n     * pages.\n     */\n    for (f of [\n        URL,\n        WeakMap,\n        WeakSet,\n        TextDecoder,\n        Uint8Array,\n        decodeURIComponent,\n        URLSearchParams,\n        Array,\n        Object,\n        atob,\n        CustomEvent,\n    ]) {\n        if (typeof f !== \'function\') {\n            return;\n        }\n    }\n\n    for (o of [performance, JSON]) {\n        if (typeof o !== \'object\') {\n            return;\n        }\n    }\n\n    /*\n     * Override common funcions that accept callbacks, such as\n     * setInterval, to keep track of what script each callback comes\n     * from. Skimmers commonly have the actual skimming code in a\n     * callback, so most of the time when we intercept a request,\n     * document.currentScript is null. To solve this, the script is\n     * stored in a closure when the callback is passed, and assigned\n     * to callbackCurrentscript when the callback is run.\n     */\n\n    let callbackCurrentScript = null;\n\n    // Maps callbacks originally passed to patched versions\n    const patchedCallbackMap = new WeakMap();\n\n    // Maps patched callbacks to original versions\n    const originalCallbackMap = new WeakMap();\n\n    /**\n     *  Generates the function with which to override the\n     *  callback-accepting functions.\n     *  @param realFn The real function, e.g. setInterval.\n     *  @param callbackIndex The index of the callback in the\n     *  arguments of realFn. For example, the callback is the first\n     *  argument in setInterval, so callbackIndex should be 0.\n     */\n    function generateAddCallbackFunction(realFn, callbackIndex) {\n        const patched = function(...args) {\n            const script = document.currentScript || callbackCurrentScript;\n\n            const callback = args[callbackIndex];\n\n            // If the callback isn\'t a function, there\'s nothing to patch\n            if (typeof callback !== \'function\') {\n                return realFn.apply(this, args);\n            }\n\n            // If a patch exists, use it instead of creating new function\n            let patchedCallback = patchedCallbackMap.get(callback);\n            if (!patchedCallback) {\n                patchedCallback = function() {\n                    callbackCurrentScript = script;\n                    const retVal = callback.apply(this, [...arguments]);\n                    callbackCurrentScript = null;\n                    return retVal;\n                };\n                patchedCallbackMap.set(callback, patchedCallback);\n                originalCallbackMap.set(patchedCallback, callback);\n            }\n\n            args[callbackIndex] = patchedCallback;\n            return realFn.apply(this, args);\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    const realSetInterval = window.setInterval;\n\n    window.setInterval = generateAddCallbackFunction(realSetInterval, 0);\n\n    const realSetTimeout = window.setTimeout;\n\n    window.setTimeout = generateAddCallbackFunction(realSetTimeout, 0);\n\n    const realPromiseThen = Promise.prototype.then;\n    Promise.prototype.then = generateAddCallbackFunction(realPromiseThen, 0);\n\n    const realPromiseCatch = Promise.prototype.catch;\n    Promise.prototype.catch = generateAddCallbackFunction(realPromiseCatch, 0);\n\n    const realPromiseFinally = Promise.prototype.finally;\n    if (realPromiseFinally) {\n        Promise.prototype.finally = generateAddCallbackFunction(\n            realPromiseFinally,\n            0\n        );\n    }\n\n    const realAddEventListener = EventTarget.prototype.addEventListener;\n\n    EventTarget.prototype.addEventListener = generateAddCallbackFunction(\n        realAddEventListener,\n        1\n    );\n\n    /*\n     * removeEventListener needs to be patched to map the passed\n     * listener to the patched listener.\n     */\n    const realRemoveEventListener = EventTarget.prototype.removeEventListener;\n    EventTarget.prototype.removeEventListener = function(...args) {\n        args[1] = patchedCallbackMap.get(args[1]) || args[1];\n\n        return realRemoveEventListener.apply(this, args);\n    };\n    EventTarget.prototype.removeEventListener.toString = () =>\n        realRemoveEventListener.toString();\n\n    /*\n     * Event listeners are sometimes set by directly assigning to a\n     * property from the GlobalEventHandlers mixin,\n     * e.g. \'submitBtn.onclick\'. For each of the GlobalEventHandlers\n     * implementations that are likely to be relevant, the event\n     * properties likely to be used by skimmers are overridden with\n     * our version that tracks currentScript when assigned.\n     */\n    for (const eventTarget of [\n        HTMLElement.prototype,\n        Document.prototype,\n        window,\n    ]) {\n        for (const eventName of [\n            \'onclick\',\n            \'onblur\',\n            \'onfocus\',\n            \'onchange\',\n            \'oninput\',\n            \'onkeydown\',\n            \'onkeypress\',\n            \'onkeyup\',\n            \'onload\',\n            \'onloadend\',\n            \'onmousedown\',\n            \'onmouseenter\',\n            \'onmouseleave\',\n            \'onmousemove\',\n            \'onmouseout\',\n            \'onmouseover\',\n            \'onmouseup\',\n            \'onpointerdown\',\n            \'onpointermove\',\n            \'onpointerup\',\n            \'onpointerover\',\n            \'onpointerout\',\n            \'onpointerenter\',\n            \'onpointerleave\',\n            \'onsubmit\',\n        ]) {\n            const descriptor = Object.getOwnPropertyDescriptor(\n                eventTarget,\n                eventName\n            );\n\n            if (!descriptor) {\n                continue;\n            }\n\n            const realGetter = descriptor.get;\n            const realSetter = descriptor.set;\n\n            const patchedSetter = generateAddCallbackFunction(realSetter, 0);\n\n            /*\n             * In case a script checks the value of the property after\n             * setting it, the getter has to be patched to return the\n             * original callback.\n             */\n            const patchedGetter = function() {\n                const realValue = realGetter.call(this);\n\n                const originalCallback = originalCallbackMap.get(realValue);\n                if (originalCallback) {\n                    return originalCallback;\n                } else {\n                    return realValue;\n                }\n            };\n\n            patchedGetter.toString = () => realGetter.toString();\n\n            Object.defineProperty(eventTarget, eventName, {\n                get: patchedGetter,\n                set: patchedSetter,\n            });\n        }\n    }\n\n    /*\n     * This script has some dependencies that need to be included\n     * without polluting the global namespace. This is achieved by\n     * inserting them into the source at build time in the\n     * makefile. This is preferable to loading the dependencies via\n     * AJAX, because the latter doesn\'t work if the CSP disallows\n     * unsafe-eval. The following tag tells the makefile where to\n     * insert the dependencies.\n     */\n    // <DEPENDENCIES>\nclass InputAnalyser {\n    constructor(_inputs) {\n        this._inputs = _inputs;\n        this._irrelevantInputs = new WeakSet();\n\n        /*\n         * Not currently using Password because it was causing too\n         * many false positives. Some sites use external auth domains,\n         * and many have misconfigured analytics that collect\n         * passwords.\n         */\n        this.relevantInputs = [new CardNumber()];\n    }\n\n    get relevantInputValues() {\n        const inputs = {};\n        this._inputs.forEach(\n            input => (inputs[input.id || input.name] = input.value)\n        );\n\n        return inputs;\n    }\n\n    get relevantFilledInputs() {\n        return this.allInputs\n            .filter(input => this.isRelevantElement(input))\n            .filter(input => input.value.length >= cons.minInputSize)\n            .map(input => ({\n                id: input.id,\n                name: input.name,\n                value: input.value,\n            }));\n    }\n\n    get allInputs() {\n        this._inputs = [\n            ...document.querySelectorAll(\n                this.relevantInputs.map(i => i.relevantInputTypes).join(\', \')\n            ),\n        ];\n\n        return this._inputs;\n    }\n\n    static getLabelText(input) {\n        if (!input.labels.length) {\n            return \'\';\n        }\n        return stripSpecialChars(input.labels[0].textContent).trim();\n    }\n\n    /**\n     * Takes an HTMLElement and determines whether or not it could be relevant for the purposes of\n     * skimmer detection.\n     * @param {HTMLElement} input The element which is to be checked for relevancy.\n     * @returns {boolean} Returns true if the element is potentially relevant (e.g. a credit card\n     * field or other such sensitive input).\n     */\n    isRelevantElement(input) {\n        // If the element has been identified as irrelevant, return false\n        if (this._irrelevantInputs.has(input)) {\n            return false;\n        }\n\n        // Check the input against all the relevant input types\n        const relevances = this.relevantInputs.map(i => i.test(input));\n\n        /*\n         *  If they all agree that this input is unlikely to become\n         *  relevant, exclude it from further checks and return false\n         */\n        if (relevances.every(i => i === RelevantInput.relevance.NOT_RELEVANT)) {\n            this._irrelevantInputs.add(input);\n            return false;\n        }\n\n        // Return true if any consider the input to be relevant, otherwise false\n        return relevances.some(i => i === RelevantInput.relevance.RELEVANT);\n    }\n}\n/*\n * Input Matcher represents a class that can have matches with relevant inputs.\n * Each class that inherits must implement the findInputMatches method.\n */\nclass InputMatcher {\n    /*\n     * Finds any matches with the list of inputs.\n     * @param inputs. An object whose values represent relevant inputs.\n     * @return {[String]} The keys of the inputs that were found.\n     */\n    findInputMatches(inputs) {\n        throw new Error(\'findInputMatches has not been implemented.\');\n    }\n\n    /**\n     * Determines whether one or more values in needles are present in any of\n     * the keys of the haystacks.\n     * Checks both raw input and base64 encoded versions of the needles.\n     * @param needles An object. The haystacks are searched for the values of\n     * this object.\n     * @param haystacks The array of strings in which the needle(s) may reside.\n     * A string may optionally be supplied if only one value is present.\n     * @returns {[String]} The keys of the needles that were found in one or\n     * more haystacks in either raw or base64 encoded form.\n     */\n    static atLeastOneNeedleInHaystack(needles, haystacks) {\n        if (\n            needles === undefined ||\n            needles.length === 0 ||\n            haystacks === undefined\n        ) {\n            return [];\n        }\n\n        const searchArray = Array.isArray(haystacks) ? haystacks : [haystacks];\n\n        return Object.entries(needles)\n            .filter(([_, needle]) =>\n                searchArray.some(haystack => {\n                    if (isBase64Encoded(haystack)) {\n                        if (atob(haystack).indexOf(needle) !== -1) {\n                            return true;\n                        }\n                    }\n                    return haystack.indexOf(needle) !== -1;\n                })\n            )\n            .map(([input, _]) => input);\n    }\n}\n/*\n * Matcher for an object that cannot contain any inputs.\n */\nclass EmptyMatcher extends InputMatcher {\n    findInputMatches(inputs) {\n        return [];\n    }\n}\n\nclass URLParamsMatcher extends InputMatcher {\n    constructor(url) {\n        super();\n        this._url = url;\n    }\n\n    findInputMatches(inputs) {\n        try {\n            const parsedUrl = new URL(this._url);\n            return InputMatcher.atLeastOneNeedleInHaystack(inputs, [\n                ...parsedUrl.searchParams.values(),\n            ]);\n        } catch (e) {\n            return [];\n        }\n    }\n}\n\nclass StringBodyMatcher extends InputMatcher {\n    constructor(str) {\n        super();\n        this._str = str;\n    }\n\n    findInputMatches(inputs) {\n        let decoded;\n        try {\n            decoded = decodeURIComponent(this._str);\n        } catch (e) {\n            decoded = this._str;\n        }\n\n        const searchParams = new URLSearchParams(decoded);\n        const parsedQuery = {};\n        const parsedValues = [];\n\n        for (const [key, value] of searchParams.entries()) {\n            parsedQuery[key] = value;\n            parsedValues.push(value);\n        }\n\n        if (parsedQuery !== {} && parsedValues.indexOf(null) === -1) {\n            return InputMatcher.atLeastOneNeedleInHaystack(\n                inputs,\n                parsedValues\n            );\n        }\n        return InputMatcher.atLeastOneNeedleInHaystack(inputs, decoded);\n    }\n}\n\nclass FormBodyMatcher extends InputMatcher {\n    constructor(formData) {\n        super();\n        this._formData = formData;\n    }\n\n    findInputMatches(inputs) {\n        return InputMatcher.atLeastOneNeedleInHaystack(\n            inputs,\n            Object.values(this._formData).flat()\n        );\n    }\n}\n/**\r\n * Takes a string and removes a variety of \'special\' characters like punctuation.\r\n * @param str The string to be modified.\r\n * @returns {string} The resulting string without any special characters.\r\n */\r\nfunction stripSpecialChars(str) {\r\n    return str.replace(/[`~!@#$%^&*()_|+\\-=?;:\'\",.<>}{\\][\\\\/]/gi, \'\');\r\n}\r\n\r\n/**\r\n * Attempts to identify where a string is base-64 encoded or not.\r\n * @param string The raw string to be examined.\r\n * @returns {boolean} Returns true if the string matches a base-64 string. False otherwise.\r\n */\r\nfunction isBase64Encoded(string) {\r\n    return /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/.test(\r\n        string\r\n    );\r\n}\r\n\r\n// Computes the base64 sha512/sha224 hash of some text, removing trailing ==\r\nfunction base64hash(hashFunction, text) {\r\n    return btoa(\r\n        hashFunction\r\n            .array(text)\r\n            .map(char => String.fromCharCode(char))\r\n            .join(\'\')\r\n    ).slice(0, -2);\r\n}\r\n\r\nfunction normaliseUrl(str) {\r\n    const link = document.createElement(\'a\');\r\n    link.href = str;\r\n    return link.href;\r\n}\r\n\r\nfunction stripCredentials(urlstr) {\r\n    try {\r\n        const url = new URL(urlstr);\r\n        const params = url.searchParams;\r\n        params.forEach((_, key) => params.set(key, \'\'));\r\n        return url.toString();\r\n    } catch (e) {\r\n        return urlstr;\r\n    }\r\n}\r\n\r\n/**\r\n * Check if two URLs match regardless of any partial encoding.\r\n *\r\n * Uses decodeURI which can throw a URIError when url is malformed.\r\n */\r\nfunction urlsMatch(first, second) {\r\n    try {\r\n        return decodeURI(first) === decodeURI(second);\r\n    } catch (e) {\r\n        return false;\r\n    }\r\n}\r\n\r\nfunction sendMessage(type, data, tabId, options) {\r\n    if (tabId) {\r\n        chrome.tabs.sendMessage(tabId, { data, type }, options);\r\n    } else {\r\n        chrome.runtime.sendMessage({ data, type });\r\n    }\r\n}\r\n\r\n// Encodes the given input using base64url as defined by RFC4648 section 5.\r\nfunction base64Url(input) {\r\n    return btoa(input)\r\n        .replace(\'+\', \'-\')\r\n        .replace(\'/\', \'_\');\r\n}\r\n/*\n * Netcraft Extension\n * constants JavaScript\n */\n\n/* eslint sort-keys: \'off\' */\n/* sort-keys is disabled as the constants are separated by type */\n\n// Aligned values here make for easier reading, so we disable prettier\n\n// prettier-ignore\nconst cons = (function() {\n    const cryptojackersUrl = \'https://www.netcraft.com/apps/help/glossary/#crypto-miners\';\n    const skimmersUrl = \'https://www.netcraft.com/apps/help/glossary/#credit-card-skimmers\';\n    const evilResourceCrime = \'attempted to load\';\n\n    return {\n        fields: [\n            \'topsites\',\n            \'country\',\n            \'netblock\',\n            \'hoster\',\n            \'firstseen\',\n            \'rank\',\n            \'risk\',\n            \'uses_sslv3\',\n            \'pfs\',\n            \'heartbleed\',\n            \'heartbleed_message\',\n        ],\n\n        // options that can be toggle in options.js and installed flag\n\n        toggleOptions: [\n            \'installed\',\n            \'block\',\n            \'xss\',\n            \'suspicious\',\n            \'other-malicious-scripts\',\n            \'credential-leaks\',\n            \'analytics\',\n            \'cryptojackers\',\n            \'skimmers\',\n        ],\n\n        // domains\n        mirror:  \'https://mirror2.extension.netcraft.com/\',\n        toolbar: \'https://mirror.toolbar.netcraft.com/\',\n\n        // links and faqs\n        blogArchive:      \'https://news.netcraft.com/archives/\',\n        browserApp:       \'https://www.netcraft.com/apps/browser/\',\n        cryptojackersUrl,\n        extensionStore:   \'https://addons.mozilla.org/en-us/firefox/addon/netcraft-toolbar?src=external-blocked_visit-rating\',\n        heartbleedUrl:    \'https://www.netcraft.com/apps/help/glossary/#heartbleed\',\n        logBlockedVisit:  \'https://toolbar.netcraft.com/blocked_visit\',\n        netblock:         \'https://sitereport.netcraft.com/netblock?q=\',\n        pfsUrl:           \'https://www.netcraft.com/apps/help/glossary/#pfs\',\n        report:           \'https://sitereport.netcraft.com/?url=\',\n        reportAPI:        \'https://report.netcraft.com/api/v2/report/urls\',\n        reportMistake:    \'https://report.netcraft.com/report/mistake?url=\',\n        skimmersUrl,\n        sslv3Url:         \'https://www.netcraft.com/apps/help/glossary/#sslv3\',\n        submissionURL:    \'https://report.netcraft.com/submission/\',\n        topsites:         \'https://trends.netcraft.com/topsites?s=\',\n\n        // paths\n        block:              \'blocked.html\',\n        check:              \'check_url/v4/\',\n        danger:             \'Images/danger.png\',\n        embed:              \'/embedded\',\n        evilJSPatternsFeed: \'eviljspatterns\',\n        skimmerDomainWhitelistFeed: \'eviljsskimmerwhitelist\',\n        evilResourcesFeed:  \'blockdb/netcraft_extension_evil_resource_encrypted-yppL7bVh/\',\n        flags:              \'Images/flags/\',\n        force:              \'/dodns\',\n        heartbleed:         \'Images/heartbleed.png\',\n        info:               \'/info\',\n        poodlePost:         \'2014/10/15/googles-poodle-affects-oodles.html\',\n        warning:            \'Images/warning.png\',\n\n        // feed constants\n        evilResourceTypes: [\'cryptojacker\', \'skimmer\'],\n        evilResourcesSalt: \'C4jhYHxW\',\n        maxRevisions:      5,\n        randomSaltLength:  8,\n\n        // mappings of url_type => information\n        urlTypeInformationMappings: {\n            \'malicious_javascript/cryptojacker\': [\'web miners\',             cryptojackersUrl],\n            \'malicious_javascript/skimmer\':      [\'shopping site skimmers\', skimmersUrl],\n        },\n\n        // mappings of evilResourceTypes => user options\n        evilResourceOptionMappings: {\n            \'cryptojacker\': \'cryptojackers\',\n            \'skimmer\':      \'skimmers\'\n        },\n\n        // mappings of user options => url_type\n        optionUrlTypeMappings: {\n            \'block\':                   /^(?!malicious_javascript:)/,\n            \'cryptojackers\':           /^malicious_javascript\\/cryptojacker$/,\n            \'other-malicious-scripts\': /^malicious_javascript\\/(?!(skimmer|cryptojacker)$)/,\n            \'skimmers\':                /^malicious_javascript\\/skimmer$/,\n        },\n\n        // report constants\n        malwareSourceEmail:  \'extension-reported-malware@netcraft.com\',\n        malwareSourceUUID:   \'mwcCcApi89cobY9loJ9rWJ9HuOhlpwMj\',\n        extensionSourceUUID: \'qBEQ3NhEnwK4sypmuSxBJzRqpxZLRXxe\',\n\n        // report error default message\n        reportErrorMessage: \'An error occured with your submission. Please try again.\',\n\n        // mapping from report API errors to displayed messages\n        reportErrorMappings: {\n            \'Duplicate of a recent submission\': \'This URL has already been reported.\',\n            \'Supplied email is not valid\': \'Invalid email address. Please correct it and try again.\',\n        },\n\n        whitelistErrorMessages: {\n            invalidHostname: \'Invalid hostname, please correct it and try again\',\n            duplicate: \'Protection is already disabled for this site\',\n        },\n\n        // browserAction icon paths\n        iconNormal: {\n            16: \'Images/action-normal-16.png\',\n            24: \'Images/action-normal-24.png\',\n            32: \'Images/action-normal-32.png\'\n        },\n        iconDanger: {\n            16: \'Images/action-danger-16.png\',\n            24: \'Images/action-danger-24.png\',\n            32: \'Images/action-danger-32.png\'\n        },\n        iconWarning: {\n            16: \'Images/action-warning-16.png\',\n            24: \'Images/action-warning-24.png\',\n            32: \'Images/action-warning-32.png\'\n        },\n        iconDisabled: {\n            16: \'Images/action-disabled-16.png\',\n            24: \'Images/action-disabled-24.png\',\n            32: \'Images/action-disabled-32.png\'\n        },\n\n        // Extension internal message types\n        capturedIntercept:  \'interceptDetailsCaptured\',\n        confirmedIntercept: \'interceptDetailsConfirmed\',\n        contentReady:       \'contentScriptReady\',\n        leaksEnabled:       \'credentialLeaksEnabled\',\n        reportURL:          \'report\',\n        reqBlock:           \'block\',\n        reqDetails:         \'details\',\n        reqForce:           \'force\',\n        reqPopUp:           \'popup\',\n        reqPrintTimingData: \'time\', //debug\n        reqInputs:          \'requestInputValues\',\n        sendInputs:         \'sendInputs\',\n        sendIntercept:      \'sendInterceptDetails\',\n        updateOption:       \'updateOption\',\n        updateWhitelist:    \'whitelist\', // disable button whitelist\n\n        // Status codes\n        errEvilResource: \'EVILRESOURCE\',\n        errNoDetails:    \'NODETAILS\',\n        errNoInfo:       \'NOINFO\',\n        errBlocked:      \'BLOCKED\',\n        errPending:      \'PENDING\',\n        errServer:       \'ERROR\',\n        errSuspicious:   \'SUSPICIOUS\',\n        errTimeout:      \'TIMEOUT\',\n        errXSS:          \'XSS\',\n        noError:         \'OK\',\n\n        // Valid protocols (it is a regex match so ^ matches start of string)\n        protocols:    [\'^http\', \'^https\', \'^ftp\'],\n\n        // Human readable messages\n        msgNa:           \'NA\',\n        msgNewSite:      \'New Site\',\n        msgNoInfo:       \'Site information not available\',\n        msgNoServer:     \'Unable to contact Netcraft servers\',\n        msgSuspicious:   \'Suspicious URL Detected\',\n        msgXSS:          \'Suspected XSS Attack\',\n        msgBlocked:      {\n            \'malicious_javascript/skimmer\': {\n                title: \'Shopping Site Skimmer Detected\',\n                description: \'shopping site skimmer\'\n            },\n            \'malicious_javascript/dropsite\': {\n                title: \'Potential Credential Leak Detected\',\n                description: \'potential credential leak\'\n            },\n            \'malicious_javascript/cryptojacker\': {\n                title: \'Web Miner Detected\',\n                description: \'web miner\'\n            },\n            \'malware_c2/infrastructure\': {\n                title: \'Malicious URL\',\n                description: \'malicious page\'\n            },\n            \'default\': {\n                title: \'Suspected Phishing\',\n                description: \'suspected phishing site\'\n            },\n        },\n\n        // Human readable reasons\n        urlTypeCrimeMappings: {\n            \'malicious_javascript/skimmer\':      evilResourceCrime,\n            \'malicious_javascript/cryptojacker\': evilResourceCrime,\n            \'malicious_javascript/dropsite\':     \' is blocked because we detected that sensitive information was leaked from\',\n        },\n\n        // Timeout function value to clear cache etc.\n        timeout:      300000,\n\n        // Skimmer whitelist update interval (1 day)\n        skimmerWhitelistInterval: 1000 * 60 * 60 * 24,\n\n        // Google Analytics account\n        account:      \'UA-2150242-8\',\n        gaCategory:   \'Popup load times\',\n\n        // InputAnalyser constants\n        minInputSize: 5,\n\n        // First addresses of the private IPv4 netblocks\n        privateIPv4Blocks: [\n            \'10.0.0.0\',\n            \'172.16.0.0\',\n            \'192.168.0.0\'\n        ],\n\n        // Sync storage key for disable for this site button whitelist\n        disableButtonWhitelistKey: \'disableButtonWhitelist\',\n\n        // Local storage key for local credential leak detection whitelist\n        localCredentialLeakWhitelistKey: \'localCredentialLeakWhitelist\',\n\n        // Whitelisted fileName regexes for credential leak detection\n        credentialLeakFileNameWhitelist: [\n            /^https?:\\/\\/googleads.g.doubleclick.net\\//,\n        ],\n    };\n})();\n\n/*\n * recursively prevents any property or sub-property in cons from:\n *   - being added;\n *   - being removed; or\n *   - being modified.\n */\nfunction deepFreeze(object) {\n    Object.freeze(object);\n\n    for (const name of Object.getOwnPropertyNames(object)) {\n        if (typeof object[name] === \'object\') {\n            deepFreeze(object[name]);\n        }\n    }\n}\n\ndeepFreeze(cons);\n/*\r\n * RelevantInput objects check whether given form inputs should be\r\n * treated as sensitive data.\r\n *\r\n * This should be treated as an abstract class. Only the subclasses\r\n * are intended to be instantiated.\r\n */\r\nclass RelevantInput {\r\n    /*\r\n     * Enum of the possible return values of test():\r\n     * RELEVANT:\r\n     *     Input is relevant now, outgoing requests should be\r\n     *     checked for the contained value (subject to minimum length).\r\n     * POTENTIALLY RELEVANT:\r\n     *     Input should not be considered relevant now, but may be in\r\n     *     future so should continue to be checked.\r\n     * NOT_RELEVANT:\r\n     *     Input is not relevant and will not become relevant, so can\r\n     *     be ommitted from further checks to optimise performance.\r\n     */\r\n    static get relevance() {\r\n        return {\r\n            NOT_RELEVANT: 1,\r\n            POTENTIALLY_RELEVANT: 2,\r\n            RELEVANT: 3,\r\n        };\r\n    }\r\n\r\n    /*\r\n     * relevantInputTypes (string) - a comma separated list of\r\n     * selectors that describe the types of input that should be\r\n     * considered relevant.\r\n     */\r\n    constructor(relevantInputTypes) {\r\n        this.relevantInputTypes = relevantInputTypes;\r\n    }\r\n\r\n    /*\r\n     * Checks whether any of the given input\'s \'labels\' (the ID, name,\r\n     * or actual label) match the given regex.\r\n     */\r\n    static testInputLabel(regex, input) {\r\n        const labels = [\r\n            input.id,\r\n            input.name,\r\n            InputAnalyser.getLabelText(input),\r\n        ];\r\n        return labels.some(label => regex.test(label));\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for passwords.\r\n */\r\nclass Password extends RelevantInput {\r\n    constructor() {\r\n        super(\'input[type=password]\');\r\n    }\r\n\r\n    /*\r\n     * Passwords are verified purely by their input type.\r\n     */\r\n    test(input) {\r\n        if (input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\r\n/*\r\n * RelevantInput for card numbers.\r\n */\r\nclass CardNumber extends RelevantInput {\r\n    constructor() {\r\n        // Inputs with no type attribute act like text inputs\r\n        super(\r\n            \'input[type=text], input[type=tel], input[type=number], input:not([type])\'\r\n        );\r\n\r\n        // Definitely card number labels\r\n        this.inputLabelRegexes = [\r\n            /(cc|card).?(num|no)/i,\r\n            /&#12459;&#12540;&#12489;&#30058;&#21495;/,\r\n            /&#1053;&#1086;&#1084;&#1077;&#1088;.*&#1082;&#1072;&#1088;&#1090;&#1099;/i,\r\n            /&#20449;&#29992;&#21345;&#21345;&#34399;/i,\r\n            /&#20449;&#29992;&#21345;&#21495;&#30721;/i,\r\n        ];\r\n\r\n        /*\r\n         * Matches incomplete card numbers, because ideally the\r\n         * skimmer should be detected before the victim gives away\r\n         * most of their card number.\r\n         */\r\n        this.inputValueRegexes = [/^(\\d{4}[-\\s]?){0,4}\\d{1,4}$/];\r\n\r\n        // Probably card number labels\r\n        this.suspectInputLabelRegexes = [\r\n            /card/i,\r\n            /tarjeta/i,\r\n            /carte/i,\r\n            /&#1082;&#1072;&#1088;&#1090;&#1099;/i,\r\n            /&#21345;/i,\r\n            /&#12459;&#12540;&#12489;/i,\r\n            /&#52852;&#46300;/i,\r\n            /credit[^s]/i,\r\n        ];\r\n\r\n        // If it matches one of these, probably not a card number\r\n        this.inputLabelExceptionRegexes = [\r\n            /post/i,\r\n            /code/i,\r\n            /zip/i,\r\n            /acc(oun)?t?[-_]?n(um|o)/i,\r\n            /credit[-_]?(sum|limit)/i,\r\n            /loyalty/i,\r\n            /gift/i,\r\n            /idcard/i,\r\n            /cardid/i,\r\n            /club/i,\r\n            /sku/i,\r\n            /(\\b|_)otp/i,\r\n            /price/i,\r\n            /amount/i,\r\n            /service/i,\r\n            /picard/i,\r\n            /search/i,\r\n            /contact/i,\r\n            /callme/i,\r\n            /chat/i,\r\n            /activate/i,\r\n            /msisdn/i,\r\n        ];\r\n    }\r\n\r\n    test(input) {\r\n        if (!input.matches(this.relevantInputTypes)) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return NOT_RELEVANT if label matches an exception regex\r\n        if (\r\n            this.inputLabelExceptionRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n\r\n        // Return RELEVANT if label clearly states card number\r\n        if (\r\n            this.inputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            return RelevantInput.relevance.RELEVANT;\r\n        }\r\n\r\n        /*\r\n         * If label suggests card number, return RELEVANT if value\r\n         * also suggests card number or POTENTIALLY_RELEVANT if\r\n         * not. Otherwise, return NOT_RELEVANT as this element will\r\n         * not become relevant unless a label changes (unlikely).\r\n         */\r\n        if (\r\n            this.suspectInputLabelRegexes.some(r =>\r\n                RelevantInput.testInputLabel(r, input)\r\n            )\r\n        ) {\r\n            if (this.inputValueRegexes.some(r => r.test(input.value))) {\r\n                return RelevantInput.relevance.RELEVANT;\r\n            } else {\r\n                return RelevantInput.relevance.POTENTIALLY_RELEVANT;\r\n            }\r\n        } else {\r\n            return RelevantInput.relevance.NOT_RELEVANT;\r\n        }\r\n    }\r\n}\r\n\n    const inputAnalyser = new InputAnalyser();\n\n    const resourceBlockList = new Set([\n                            \"6C590F97DDB1A11AE795B3050E4C3866\", \"D285BE79786E2ECE396941331C5BA65E\", \"59DF8523520DE7F08FB53D3D12BD94F5\", \"1FB784EBAFDA1618023756BF5B6D7E46\", \"0D6E1B5F03B81F5C37813B22E29C4FE2\", \"EFAB0ECE9383D50C555B8168C3E2A4DD\", \"AC8A4B13A411A4E43E61D0A034FA4A55\", \"25A781F6D1F94EEACCF1E00E844D9E14\", \"3920B04ED0D215EA738F524F60485F23\", \"05F4A2D3161A92EB82A44F15FC2A3AEC\", \"C5A1BE7B3855B0A25275B2877E005CB9\", \"00069CEC347076721EBE2257978A0A33\", \"9A513130D02F360BBDC16D8AC0C579D8\", \"7CDB2A3A29E50F90C1000252EF523AD6\", \"25CE912FAF2376026AAD0174AD5A0329\", \"739E1F67AA5F64A06FC469F6030802D4\", \"F49368C9A05C29EF49411999C5987F2C\", \"AB2DD89FB892155275D8780CF527BC93\", \"CFE758EB18FBFE70B1F690241B75D2B1\", \"E43C3463B40A790545F4149FF06B419E\", \"8B6D4C76A7CCF5EB720660B8B2D3F5EB\", \"45573B3E2F613AF5BF2145DF004BABD1\", \"E3DB4E968B371DE94CE607199A062F39\", \"A4EFF1240C5DE614B394FB738CBD28E2\", \"F42D10E84B9A69A8A24062319F425A83\", \"90646BE39982594A58EDF5D2630CCFFD\", \"669853BEA9B84EA51D7302A7FBFF5BC3\", \"0BA566B4777526F451108100107DC5ED\", \"AB19E12BFFBC47244BDCC2403EAA9037\", \"61DAF8537240639277FD1A5908A131A4\", \"6F1DC1309CFE734C038685D8F17A3B6B\", \"DCC3DB001334F29C1C0208D15E9EAB49\", \"2DBD7D54022C28273ADE3147B8EEB076\", \"AE3760E93412C65EC5BF63537B037019\", \"4CD96A830DAC0E0B5EBE578B0DD870AE\", \"4C70569BBE1821F5655382660807FA77\", \"05ECA17FF0EA78669ED43B2BD7B63571\", \"44E503B3621513B9D3666F284E4DF47A\", \"8F1C92E7665860AE70CBB228DED86111\", \"D69552885B55C4097E5725F805815639\", \"B4357A9D889E974CDF3F9740E48F9A1B\", \"5709DC60CFC365B7064B06C709A9D32B\", \"14E8729CBB16AC3625EAA0D7A679E56E\", \"793D4DABAAA377A12F2B6CE88C5FB389\", \"C5D1DCE2AE0D8CE79054FC16CB13D65A\", \"89F91750BD4A9397D1F8CE183757FF70\", \"50B8BC213FB188A687173C1A0A77EA57\"\n                        ]);\n    const evilJSPatterns = new Set([\n                            \n                        ]);\n\n    // Extract body object\n    function extractBody(data) {\n        if (!data) {\n            return Promise.resolve({});\n        }\n        if (FormData.prototype.isPrototypeOf(data)) {\n            const formData = {};\n            for (const [key, value] of data.entries()) {\n                formData[key] = value;\n            }\n            return Promise.resolve({ formData });\n        }\n        // Create a temporary Request object to parse the body\n        const tempRequest = new Request(\'\', { body: data, method: \'POST\' });\n        return extractBodyFromRequest(tempRequest);\n    }\n\n    function extractBodyFromRequest(request) {\n        // Try to extract as text\n        return request\n            .text()\n            .then(text => {\n                return { text };\n            })\n            .catch(e => {\n                return {};\n            });\n    }\n\n    /**\n     * This function checks if the request hostname/URL is in the blocklist.\n     * Used when identifying whether or not to forward request to background\n     * script.\n     * @param hostname Hostname to check against blocklist.\n     * @param url Request url to check against evil JS patterns\n     * @returns boolean true if hostname is in the blocklist, false if\n     * it is not in blocklist or if blocklist is not provided.\n     */\n    function requestInBlocklist(hostname, url) {\n        if (resourceBlockList === undefined || evilJSPatterns === undefined) {\n            return false;\n        }\n        if (testEvilJS(url.replace(/^(https?:)?\\/\\//i, \'\'))) {\n            return true;\n        }\n        while (!testEvilJS(hostname) && !testResource(hostname)) {\n            const newHostname = hostname.replace(/^.+?\\./g, \'\');\n\n            if (hostname === newHostname) return false;\n\n            hostname = newHostname;\n        }\n        return true;\n    }\n\n    function testEvilJS(url) {\n        return evilJSPatterns.has(base64hash(sha512, url));\n    }\n\n    function testResource(hostname) {\n        return resourceBlockList.has(\n            md5(cons.evilResourcesSalt + hostname).toUpperCase()\n        );\n    }\n\n    /*\n     * Implementations to overwrite window.XMLHttpRequest.prototype.open,\n     * window.XMLHttpRequest.prototype.send and window.fetch. These are (to my knowledge) the two\n     * APIs that can be used to make requests within Javascript. If there are more, then they will\n     * also need to be overridden and intercepted like below.\n     */\n\n    /**\n     * This function generates functions to be used for wrapping and intercepting network\n     * requests, namely from XMLHttpRequest and the Fetch API. It works by taking the real\n     * function we want to intercept the request for, and then uses document.currentScript to work\n     * out which file initiated the request. It sends those details to the content script which\n     * forwards it to the background script, and then we await a confirmation of receipt from the\n     * background page. Finally, the real request is sent by forwarding parameters to the original\n     * function passed in.\n     * @param realFn A reference to the real function that is being intercepted.\n     * @param getRequestUrlFn A function used to get the request URL from the object. This is\n     * necessary as the mechanisms for different objects differs depending on implementation.\n     * @param getRequestBodyPr A function used to get the request body from the object. Returns\n     * a promise. It should be null if it\'s not applicable (e.g. if it sets the src of an image or script).\n     * @param type The type of request, which will be a ResourceType:\n     * https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType\n     * @returns {function(...[*]=): PromiseLike<any | never>}\n     */\n    function generateRequestInterceptFn(\n        realFn,\n        getRequestUrlFn,\n        getRequestBodyPr,\n        type\n    ) {\n        const patched = function(...args) {\n            /*\n             * We create a link DOM element in order to correctly generate the\n             * absolute path of the request, automatically transforming from a\n             * relative path if necessary.\n             */\n            const requestUrl = normaliseUrl(\n                getRequestUrlFn.bind(this)(...args)\n            );\n\n            let requestHostname;\n            let pageHostname;\n\n            try {\n                requestHostname = new URL(requestUrl).hostname;\n                pageHostname = new URL(location.href).hostname;\n            } catch (e) {\n                return realFn.apply(this, args);\n            }\n\n            /*\n             * If hostname is in the blocklist, the request should always be\n             * sent to the background script.\n             */\n            // eslint-disable-next-line prefer-const\n            let forceStall = false;\n\n            if (!forceStall) {\n                /*\n                 * Delaying outgoing requests sometimes causes problems\n                 * with elements such as video players and dynamically\n                 * loaded images, so it should only be done when\n                 * necessary. Before inputAnalyser is defined and when the\n                 * request is to the same hostname as the page, this can\n                 * be skipped.\n                 */\n                if (\n                    requestHostname === pageHostname ||\n                    inputAnalyser === undefined\n                ) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * It can also be skipped if there is no sensitive\n                 * information entered into a form on the page yet.\n                 */\n                const relevantFilledInputs = inputAnalyser.relevantFilledInputs;\n                if (!relevantFilledInputs.length) {\n                    return realFn.apply(this, args);\n                }\n\n                /*\n                 * For requests with no body, it\'s only necessary to delay\n                 * them when the sensitive information from the form\n                 * inputs is present in the request URL.\n                 */\n                const ia = new InputAnalyser(relevantFilledInputs);\n                const relevantInputValues = ia.relevantInputValues;\n                const urlMatcher = new URLParamsMatcher(requestUrl);\n\n                if (\n                    getRequestBodyPr === null &&\n                    !urlMatcher.findInputMatches(relevantInputValues).length\n                ) {\n                    return realFn.apply(this, args);\n                }\n            }\n\n            /*\n             * Create a promise that resolves immediately if the request body\n             * does not apply to this request.\n             */\n            if (getRequestBodyPr === null) {\n                getRequestBodyPr = function() {\n                    return Promise.resolve({});\n                };\n            }\n\n            let fileName;\n            if (document.currentScript && document.currentScript.src) {\n                fileName = document.currentScript.src;\n            } else if (callbackCurrentScript && callbackCurrentScript.src) {\n                fileName = callbackCurrentScript.src;\n            } else {\n                fileName = location.href;\n            }\n\n            return getRequestBodyPr\n                .bind(this)(...args)\n                .then(requestBody => {\n                    /*\n                     * Generate the information object to send through to the\n                     * content script including the request URL, the initiator\n                     * filename and a timestamp relative to the page load.\n                     */\n                    const detail = {\n                        fileName,\n                        requestBody,\n                        requestUrl,\n                        timestamp: performance.now(),\n                        type,\n                    };\n\n                    document.dispatchEvent(\n                        new CustomEvent(cons.capturedIntercept, {\n                            detail,\n                        })\n                    );\n\n                    return new Promise(resolve => {\n                        /*\n                         * Send the initiator\'s file name and other info to the\n                         * background script, then wait for confirmation that the\n                         * details made it to the background page before calling\n                         * the real function. This is to avoid any race conditions\n                         * whereby the details haven\'t been added to the tab data\n                         * before onBeforeRequest/onBeforeSendHeaders gets called.\n                         */\n                        document.addEventListener(\n                            cons.confirmedIntercept,\n                            function compareData(customEvent) {\n                                const receivedData = JSON.parse(\n                                    customEvent.detail\n                                );\n                                if (detailsMatch(detail, receivedData)) {\n                                    /*\n                                     * If it\'s the correct confirmation, then we\n                                     * can resolve the promise and call the real\n                                     * function in the finally block.\n                                     */\n                                    document.removeEventListener(\n                                        cons.confirmedIntercept,\n                                        compareData,\n                                        false\n                                    );\n                                    resolve();\n                                }\n                            }\n                        );\n                    }).then(() => realFn.apply(this, args));\n                });\n        };\n        // make toString() look native, #34\n        patched.toString = () => realFn.toString();\n        return patched;\n    }\n\n    function detailsMatch(first, second) {\n        const comparisonKeys = [\'fileName\', \'requestUrl\', \'timestamp\', \'type\'];\n        for (const key of comparisonKeys) {\n            if (first[key] !== second[key]) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    window.fetch = generateRequestInterceptFn(\n        realFetch,\n        request => (typeof request === \'string\' ? request : request.url),\n        (request, options) => {\n            // Check if argument is a Request object.\n            if (request instanceof Request) {\n                return extractBodyFromRequest(request);\n            }\n            return options ? extractBody(options.body) : Promise.resolve({});\n        },\n        \'xmlhttprequest\'\n    );\n\n    window.XMLHttpRequest.prototype.send = generateRequestInterceptFn(\n        realSend,\n        function getRequestUrl() {\n            return this._requestUrl;\n        },\n        extractBody,\n        \'xmlhttprequest\'\n    );\n\n    /*\n     * This function is intercepted so that we can capture the value of the\n     * request URL, since it isn\'t present in the arguments for\n     * XMLHttpRequest.send (above).\n     */\n    window.XMLHttpRequest.prototype.open = function open(...args) {\n        [, this._requestUrl] = args;\n        realOpen.apply(this, args);\n    };\n    window.XMLHttpRequest.prototype.open.toString = () => realOpen.toString();\n\n    /*\n     * Monkeypatches for setting the src of images and scripts, an\n     * indirect way of sending requests that is often employed by\n     * skimmers. The getters are also overridden to make the behaviour\n     * seem identical to the original implementation. Otherwise, if a\n     * script were to set an src and immediately read it, it would\n     * come back as the old value.\n     */\n\n    /*\n     * WeakMap maps an object to a value. This is used to store the\n     * new src of an object when its true src property may not yet\n     * have been set.\n     */\n    const srcMap = new WeakMap();\n    const requestElements = [\n        {\n            srcElement: HTMLImageElement.prototype,\n            type: \'image\',\n        },\n        {\n            srcElement: HTMLScriptElement.prototype,\n            type: \'script\',\n        },\n    ];\n\n    for (const { srcElement, type } of requestElements) {\n        const realGetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .get;\n        const realSetSrc = Object.getOwnPropertyDescriptor(srcElement, \'src\')\n            .set;\n        const realGetAttribute = srcElement.getAttribute;\n        const realSetAttribute = srcElement.setAttribute;\n        const realRemoveAttribute = srcElement.removeAttribute;\n\n        const interceptFn = generateRequestInterceptFn(\n            realSetSrc,\n            src => `${src}`,\n            null,\n            type\n        );\n\n        function setSrc(url) {\n            /*\n             * It\'s valid to provide a TrustedScriptURL wrapping the URL but we need to\n             * return a string in the getter, so we convert the url to a string here.\n             *\n             * The url can also be undefined/null so we can\'t just call `.toString()`.\n             *\n             * See #56.\n             */\n            srcMap.set(this, `${url}`);\n            interceptFn.call(this, url);\n            return url;\n        }\n\n        function getSrc() {\n            if (srcMap.get(this) === undefined) {\n                return realGetSrc.call(this);\n            } else {\n                return normaliseUrl(srcMap.get(this));\n            }\n        }\n\n        getSrc.toString = () => realGetSrc.toString();\n        setSrc.toString = () => realSetSrc.toString();\n\n        Object.defineProperty(srcElement, \'src\', {\n            get: getSrc,\n            set: setSrc,\n        });\n\n        srcElement.setAttribute = function(attributeName, value) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                setSrc.call(this, value);\n            } else {\n                realSetAttribute.call(this, attributeName, value);\n            }\n        };\n        srcElement.setAttribute.toString = () => realSetAttribute.toString();\n\n        srcElement.getAttribute = function(attributeName) {\n            if (\n                attributeName.toUpperCase() === \'SRC\' &&\n                srcMap.get(this) !== undefined\n            ) {\n                return srcMap.get(this);\n            } else {\n                return realGetAttribute.call(this, attributeName);\n            }\n        };\n        srcElement.getAttribute.toString = () => realGetAttribute.toString();\n\n        srcElement.removeAttribute = function(attributeName) {\n            if (attributeName.toUpperCase() === \'SRC\') {\n                srcMap.delete(this);\n            }\n\n            return realRemoveAttribute.call(this, attributeName);\n        };\n        srcElement.removeAttribute.toString = () =>\n            realRemoveAttribute.toString();\n    }\n})(\n    window.XMLHttpRequest.prototype.open,\n    window.XMLHttpRequest.prototype.send,\n    window.fetch\n);\n</script>\n                    <style font-name=\"MS PMincho\">\n                        @font-face {\n                            font-family: \"MS PMincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-pmincho.ttf);\n                        }\n                    </style>\n                \n                    <style font-name=\"MS Mincho\">\n                        @font-face {\n                            font-family: \"MS Mincho\";\n                            src: url(https://sys.emarketing.pe/builder/font/ms-mincho.ttf);\n                        }\n                    </style>\n                <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\"><link href=\"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined\" rel=\"stylesheet\">\n                \n            </head>\n  <body class=\"builderjs-layout\" spellcheck=\"false\">\n    <!--[if mso]>\n        <center>\n        <table><tr><td width=\"760\">\n    <![endif]-->\n        <div builder-element=\"PageElement\" style=\"padding-top:50px;padding-bottom:50px;\" class=\"\"><table width=\"100%\" builder-element=\"BlockElement\" style=\"opacity: 1;\" class=\"\">\n                    <tbody><tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                        <div class=\"container\">\n                        <div style=\"text-align:center;margin:0\">\n            <img builder-element=\"\" src=\"data:image/png;base64,[encoded data, 4956 characters]\" width=\"200px\" class=\"\">\n        </div></div>\n                    </td></tr></tbody></table><table width=\"100%\" builder-element=\"BlockElement\" style=\"opacity: 1;\" class=\"\">\n                    <tbody><tr><td style=\"padding-top:15px;padding-bottom:15px\">\n                        <div class=\"container\">\n                        <div builder-element=\"TextElement\" builder-inline-edit=\"\" id=\"mce_0\" style=\"text-align: center; position: relative;\" spellcheck=\"false\">I\'m a new Text block ready for your content.</div></div>\n                    </td></tr></tbody></table></div>\n    <!--[if mso]>\n        </td></tr></table>\n        </center>\n    <![endif]--> \n  \n</body></html>', '2023-09-11 18:51:48', '2023-09-11 18:51:48', 1, 0, NULL, 'email');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbacitemplates_categories`
--

CREATE TABLE `dbacitemplates_categories` (
  `id` int(10) UNSIGNED NOT NULL,
  `template_id` int(10) UNSIGNED NOT NULL,
  `category_id` int(10) UNSIGNED NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Volcado de datos para la tabla `dbacitemplates_categories`
--

INSERT INTO `dbacitemplates_categories` (`id`, `template_id`, `category_id`, `created_at`, `updated_at`) VALUES
(1, 1, 5, NULL, NULL),
(2, 2, 5, NULL, NULL),
(3, 3, 5, NULL, NULL),
(4, 4, 5, NULL, NULL),
(5, 5, 5, NULL, NULL),
(6, 6, 5, NULL, NULL),
(7, 7, 5, NULL, NULL),
(8, 8, 5, NULL, NULL),
(9, 9, 5, NULL, NULL),
(10, 10, 5, NULL, NULL),
(11, 11, 5, NULL, NULL),
(12, 12, 5, NULL, NULL),
(13, 13, 5, NULL, NULL),
(14, 14, 5, NULL, NULL),
(15, 15, 8, NULL, NULL),
(16, 16, 8, NULL, NULL),
(17, 17, 8, NULL, NULL),
(18, 18, 6, NULL, NULL),
(19, 27, 5, NULL, NULL),
(20, 28, 5, NULL, NULL),
(21, 29, 5, NULL, NULL),
(22, 30, 5, NULL, NULL);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbacitemplate_categories`
--

CREATE TABLE `dbacitemplate_categories` (
  `id` int(10) UNSIGNED NOT NULL,
  `uid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Volcado de datos para la tabla `dbacitemplate_categories`
--

INSERT INTO `dbacitemplate_categories` (`id`, `uid`, `name`, `created_at`, `updated_at`) VALUES
(5, '64ff5e174c595', 'Basic', '2023-09-11 18:36:07', '2023-09-11 18:36:07'),
(6, '64ff5e174cdc9', 'Featured', '2023-09-11 18:36:07', '2023-09-11 18:36:07'),
(7, '64ff5e174d5bd', 'Themes', '2023-09-11 18:36:07', '2023-09-11 18:36:07'),
(8, '64ff5e174de08', 'WooCommerce', '2023-09-11 18:36:07', '2023-09-11 18:36:07');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbacitimelines`
--

CREATE TABLE `dbacitimelines` (
  `id` int(10) UNSIGNED NOT NULL,
  `uid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `automation2_id` int(10) UNSIGNED NOT NULL,
  `subscriber_id` int(10) UNSIGNED NOT NULL,
  `auto_trigger_id` int(10) UNSIGNED NOT NULL,
  `activity` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `activity_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbacitracking_domains`
--

CREATE TABLE `dbacitracking_domains` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `uid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `customer_id` int(10) UNSIGNED NOT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `scheme` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `verification_method` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbacitracking_logs`
--

CREATE TABLE `dbacitracking_logs` (
  `id` int(10) UNSIGNED NOT NULL,
  `runtime_message_id` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `message_id` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `customer_id` int(10) UNSIGNED NOT NULL,
  `sending_server_id` int(10) UNSIGNED NOT NULL,
  `campaign_id` int(10) UNSIGNED DEFAULT NULL,
  `subscriber_id` int(10) UNSIGNED NOT NULL,
  `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `error` text COLLATE utf8mb4_unicode_ci,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `auto_trigger_id` int(10) UNSIGNED DEFAULT NULL,
  `sub_account_id` int(10) UNSIGNED DEFAULT NULL,
  `email_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Volcado de datos para la tabla `dbacitracking_logs`
--

INSERT INTO `dbacitracking_logs` (`id`, `runtime_message_id`, `message_id`, `customer_id`, `sending_server_id`, `campaign_id`, `subscriber_id`, `status`, `error`, `created_at`, `updated_at`, `auto_trigger_id`, `sub_account_id`, `email_id`) VALUES
(1, NULL, NULL, 1, 1, 1, 1, 'failed', 'Unclosed comment in \"content\" at line 1492.', '2023-09-11 18:49:11', '2023-09-11 18:49:11', NULL, NULL, NULL),
(2, NULL, NULL, 1, 1, 2, 1, 'failed', 'Call to a member function setNext() on null', '2023-09-11 18:52:04', '2023-09-11 18:52:04', NULL, NULL, NULL);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbacitransactions`
--

CREATE TABLE `dbacitransactions` (
  `id` int(10) UNSIGNED NOT NULL,
  `uid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `invoice_id` int(10) UNSIGNED NOT NULL,
  `error` longtext COLLATE utf8mb4_unicode_ci,
  `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `method` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `metadata` longtext COLLATE utf8mb4_unicode_ci,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `allow_manual_review` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Volcado de datos para la tabla `dbacitransactions`
--

INSERT INTO `dbacitransactions` (`id`, `uid`, `invoice_id`, `error`, `status`, `method`, `metadata`, `created_at`, `updated_at`, `allow_manual_review`) VALUES
(1, '64ff6038aaeb9', 1, NULL, 'success', 'offline', NULL, '2023-09-11 18:45:12', '2023-09-11 18:45:12', 1);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbaciunsubscribe_logs`
--

CREATE TABLE `dbaciunsubscribe_logs` (
  `id` int(10) UNSIGNED NOT NULL,
  `message_id` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `ip_address` text COLLATE utf8mb4_unicode_ci,
  `user_agent` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `subscriber_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbaciuser_activations`
--

CREATE TABLE `dbaciuser_activations` (
  `id` int(10) UNSIGNED NOT NULL,
  `user_id` int(10) UNSIGNED NOT NULL,
  `token` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dbaciwebsites`
--

CREATE TABLE `dbaciwebsites` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `uid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `url` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `customer_id` int(10) UNSIGNED DEFAULT NULL,
  `metadata` longtext COLLATE utf8mb4_unicode_ci,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `_tmp_subscriptions`
--

CREATE TABLE `_tmp_subscriptions` (
  `id` int(10) UNSIGNED NOT NULL,
  `uid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `user_id` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `plan_id` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `current_period_ends_at` datetime DEFAULT NULL,
  `trial_ends_at` timestamp NULL DEFAULT NULL,
  `ends_at` datetime DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `timezone` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `started_at` datetime DEFAULT NULL,
  `last_period_ends_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `dbaciadmins`
--
ALTER TABLE `dbaciadmins`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciadmins_user_id_foreign` (`user_id`),
  ADD KEY `dbaciadmins_creator_id_foreign` (`creator_id`),
  ADD KEY `dbaciadmins_contact_id_foreign` (`contact_id`),
  ADD KEY `dbaciadmins_admin_group_id_foreign` (`admin_group_id`),
  ADD KEY `dbaciadmins_language_id_foreign` (`language_id`);

--
-- Indices de la tabla `dbaciadmin_groups`
--
ALTER TABLE `dbaciadmin_groups`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciadmin_groups_creator_id_foreign` (`creator_id`);

--
-- Indices de la tabla `dbaciattachments`
--
ALTER TABLE `dbaciattachments`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbaciautomation2s`
--
ALTER TABLE `dbaciautomation2s`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciautomation2s_customer_id_foreign` (`customer_id`),
  ADD KEY `dbaciautomation2s_mail_list_id_foreign` (`mail_list_id`);

--
-- Indices de la tabla `dbaciauto_triggers`
--
ALTER TABLE `dbaciauto_triggers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciauto_triggers_subscriber_id_foreign` (`subscriber_id`),
  ADD KEY `dbaciauto_triggers_automation2_id_foreign` (`automation2_id`);

--
-- Indices de la tabla `dbacibilling_addresses`
--
ALTER TABLE `dbacibilling_addresses`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacibilling_addresses_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacibilling_addresses_country_id_foreign` (`country_id`);

--
-- Indices de la tabla `dbaciblacklists`
--
ALTER TABLE `dbaciblacklists`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciblacklists_admin_id_foreign` (`admin_id`),
  ADD KEY `dbaciblacklists_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbacibounce_handlers`
--
ALTER TABLE `dbacibounce_handlers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacibounce_handlers_admin_id_foreign` (`admin_id`);

--
-- Indices de la tabla `dbacibounce_logs`
--
ALTER TABLE `dbacibounce_logs`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacicampaigns`
--
ALTER TABLE `dbacicampaigns`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicampaigns_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacicampaigns_default_mail_list_id_foreign` (`default_mail_list_id`),
  ADD KEY `dbacicampaigns_tracking_domain_id_foreign` (`tracking_domain_id`),
  ADD KEY `dbacicampaigns_template_id_foreign` (`template_id`);

--
-- Indices de la tabla `dbacicampaigns_lists_segments`
--
ALTER TABLE `dbacicampaigns_lists_segments`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicls_campaign_id_fk` (`campaign_id`),
  ADD KEY `dbacicls_mail_list_id_fk` (`mail_list_id`),
  ADD KEY `dbacicls_segment_id_fk` (`segment_id`);

--
-- Indices de la tabla `dbacicampaign_links`
--
ALTER TABLE `dbacicampaign_links`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicampaign_links_campaign_id_foreign` (`campaign_id`);

--
-- Indices de la tabla `dbacicampaign_webhooks`
--
ALTER TABLE `dbacicampaign_webhooks`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicampaign_webhooks_campaign_id_foreign` (`campaign_id`),
  ADD KEY `dbacicampaign_webhooks_campaign_link_id_foreign` (`campaign_link_id`);

--
-- Indices de la tabla `dbaciclick_logs`
--
ALTER TABLE `dbaciclick_logs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciclick_logs_message_id_foreign` (`message_id`);

--
-- Indices de la tabla `dbacicontacts`
--
ALTER TABLE `dbacicontacts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicontacts_country_id_foreign` (`country_id`);

--
-- Indices de la tabla `dbacicountries`
--
ALTER TABLE `dbacicountries`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacicurrencies`
--
ALTER TABLE `dbacicurrencies`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicurrencies_admin_id_foreign` (`admin_id`);

--
-- Indices de la tabla `dbacicustomers`
--
ALTER TABLE `dbacicustomers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicustomers_admin_id_foreign` (`admin_id`),
  ADD KEY `dbacicustomers_contact_id_foreign` (`contact_id`),
  ADD KEY `dbacicustomers_language_id_foreign` (`language_id`);

--
-- Indices de la tabla `dbacicustomer_groups`
--
ALTER TABLE `dbacicustomer_groups`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacicustomer_groups_admin_id_foreign` (`admin_id`);

--
-- Indices de la tabla `dbacicustomer_group_sending_servers`
--
ALTER TABLE `dbacicustomer_group_sending_servers`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbaciemails`
--
ALTER TABLE `dbaciemails`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciemails_automation2_id_foreign` (`automation2_id`),
  ADD KEY `dbaciemails_tracking_domain_id_foreign` (`tracking_domain_id`),
  ADD KEY `dbaciemails_template_id_foreign` (`template_id`),
  ADD KEY `dbaciemails_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbaciemail_links`
--
ALTER TABLE `dbaciemail_links`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciemail_links_email_id_foreign` (`email_id`);

--
-- Indices de la tabla `dbaciemail_verifications`
--
ALTER TABLE `dbaciemail_verifications`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciemail_verifications_subscriber_id_foreign` (`subscriber_id`),
  ADD KEY `dbaciev_email_verification_server_id_fk` (`email_verification_server_id`),
  ADD KEY `dbaciemail_verifications_result_index` (`result`);

--
-- Indices de la tabla `dbaciemail_verification_servers`
--
ALTER TABLE `dbaciemail_verification_servers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacievs_admin_id_fk` (`admin_id`),
  ADD KEY `dbacievs_customer_id_fk` (`customer_id`);

--
-- Indices de la tabla `dbaciemail_webhooks`
--
ALTER TABLE `dbaciemail_webhooks`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciemail_webhooks_email_id_foreign` (`email_id`),
  ADD KEY `dbaciemail_webhooks_email_link_id_foreign` (`email_link_id`);

--
-- Indices de la tabla `dbacifailed_jobs`
--
ALTER TABLE `dbacifailed_jobs`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `dbacifailed_jobs_uuid_unique` (`uuid`);

--
-- Indices de la tabla `dbacifeedback_logs`
--
ALTER TABLE `dbacifeedback_logs`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacifeedback_loop_handlers`
--
ALTER TABLE `dbacifeedback_loop_handlers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacifeedback_loop_handlers_admin_id_foreign` (`admin_id`);

--
-- Indices de la tabla `dbacifields`
--
ALTER TABLE `dbacifields`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacifields_mail_list_id_foreign` (`mail_list_id`);

--
-- Indices de la tabla `dbacifield_options`
--
ALTER TABLE `dbacifield_options`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacifield_options_field_id_foreign` (`field_id`);

--
-- Indices de la tabla `dbaciforms`
--
ALTER TABLE `dbaciforms`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciforms_template_id_foreign` (`template_id`),
  ADD KEY `dbaciforms_mail_list_id_foreign` (`mail_list_id`),
  ADD KEY `dbaciforms_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbaciinvoices`
--
ALTER TABLE `dbaciinvoices`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciinvoices_customer_id_foreign` (`customer_id`),
  ADD KEY `dbaciinvoices_currency_id_foreign` (`currency_id`);

--
-- Indices de la tabla `dbaciinvoice_items`
--
ALTER TABLE `dbaciinvoice_items`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciinvoice_items_invoice_id_foreign` (`invoice_id`);

--
-- Indices de la tabla `dbaciip_locations`
--
ALTER TABLE `dbaciip_locations`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciip_locations_ip_address_index` (`ip_address`);

--
-- Indices de la tabla `dbacijobs`
--
ALTER TABLE `dbacijobs`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacijob_batches`
--
ALTER TABLE `dbacijob_batches`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacijob_monitors`
--
ALTER TABLE `dbacijob_monitors`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacilanguages`
--
ALTER TABLE `dbacilanguages`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacilayouts`
--
ALTER TABLE `dbacilayouts`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacilogs`
--
ALTER TABLE `dbacilogs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacilogs_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbacimail_lists`
--
ALTER TABLE `dbacimail_lists`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacimail_lists_contact_id_foreign` (`contact_id`),
  ADD KEY `dbacimail_lists_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbacimail_lists_sending_servers`
--
ALTER TABLE `dbacimail_lists_sending_servers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacimlss_sending_server_id_fk` (`sending_server_id`),
  ADD KEY `dbacimlss_mail_list_id_fk` (`mail_list_id`);

--
-- Indices de la tabla `dbacimigrations`
--
ALTER TABLE `dbacimigrations`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacinotifications`
--
ALTER TABLE `dbacinotifications`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacinotifications_admin_id_foreign` (`admin_id`),
  ADD KEY `dbacinotifications_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbaciopen_logs`
--
ALTER TABLE `dbaciopen_logs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciopen_logs_message_id_foreign` (`message_id`),
  ADD KEY `dbaciopen_logs_ip_address_index` (`ip_address`);

--
-- Indices de la tabla `dbacipages`
--
ALTER TABLE `dbacipages`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacipages_mail_list_id_foreign` (`mail_list_id`),
  ADD KEY `dbacipages_layout_id_foreign` (`layout_id`);

--
-- Indices de la tabla `dbacipassword_resets`
--
ALTER TABLE `dbacipassword_resets`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacipassword_resets_email_index` (`email`),
  ADD KEY `dbacipassword_resets_token_index` (`token`);

--
-- Indices de la tabla `dbaciplans`
--
ALTER TABLE `dbaciplans`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciplans_admin_id_foreign` (`admin_id`),
  ADD KEY `dbaciplans_currency_id_foreign` (`currency_id`);

--
-- Indices de la tabla `dbaciplans_email_verification_servers`
--
ALTER TABLE `dbaciplans_email_verification_servers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacipevs_server_id_fk` (`server_id`),
  ADD KEY `dbacipevs_plan_id_fk` (`plan_id`);

--
-- Indices de la tabla `dbaciplans_sending_servers`
--
ALTER TABLE `dbaciplans_sending_servers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacipss_sending_server_id_fk` (`sending_server_id`),
  ADD KEY `dbaciplans_sending_servers_plan_id_foreign` (`plan_id`);

--
-- Indices de la tabla `dbaciplugins`
--
ALTER TABLE `dbaciplugins`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbaciproducts`
--
ALTER TABLE `dbaciproducts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciproducts_customer_id_foreign` (`customer_id`),
  ADD KEY `dbaciproducts_source_id_foreign` (`source_id`);

--
-- Indices de la tabla `dbacisegments`
--
ALTER TABLE `dbacisegments`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisegments_mail_list_id_foreign` (`mail_list_id`);

--
-- Indices de la tabla `dbacisegment_conditions`
--
ALTER TABLE `dbacisegment_conditions`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisegment_conditions_segment_id_foreign` (`segment_id`),
  ADD KEY `dbacisegment_conditions_field_id_foreign` (`field_id`);

--
-- Indices de la tabla `dbacisenders`
--
ALTER TABLE `dbacisenders`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisenders_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacisenders_sending_server_id_foreign` (`sending_server_id`);

--
-- Indices de la tabla `dbacisending_domains`
--
ALTER TABLE `dbacisending_domains`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisending_domains_admin_id_foreign` (`admin_id`),
  ADD KEY `dbacisending_domains_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacisending_domains_sending_server_id_foreign` (`sending_server_id`);

--
-- Indices de la tabla `dbacisettings`
--
ALTER TABLE `dbacisettings`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacisources`
--
ALTER TABLE `dbacisources`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisources_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacisources_mail_list_id_foreign` (`mail_list_id`);

--
-- Indices de la tabla `dbacisubscribers`
--
ALTER TABLE `dbacisubscribers`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisubscribers_mail_list_id_email_index` (`mail_list_id`,`email`),
  ADD KEY `dbacisubscribers_email_index` (`email`);

--
-- Indices de la tabla `dbacisubscriber_fields`
--
ALTER TABLE `dbacisubscriber_fields`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisubscriber_fields_subscriber_id_foreign` (`subscriber_id`),
  ADD KEY `dbacisubscriber_fields_field_id_foreign` (`field_id`);

--
-- Indices de la tabla `dbacisubscriptions`
--
ALTER TABLE `dbacisubscriptions`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisubscriptions_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacisubscriptions_plan_id_foreign` (`plan_id`);

--
-- Indices de la tabla `dbacisubscription_logs`
--
ALTER TABLE `dbacisubscription_logs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisl_subscription_id_fk` (`subscription_id`);

--
-- Indices de la tabla `dbacisub_accounts`
--
ALTER TABLE `dbacisub_accounts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacisub_accounts_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacisub_accounts_sending_server_id_foreign` (`sending_server_id`);

--
-- Indices de la tabla `dbacitemplates`
--
ALTER TABLE `dbacitemplates`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacitemplates_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbacitemplates_categories`
--
ALTER TABLE `dbacitemplates_categories`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacitemplates_categories_template_id_foreign` (`template_id`),
  ADD KEY `dbacitemplates_categories_category_id_foreign` (`category_id`);

--
-- Indices de la tabla `dbacitemplate_categories`
--
ALTER TABLE `dbacitemplate_categories`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `dbacitimelines`
--
ALTER TABLE `dbacitimelines`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacitimelines_automation2_id_foreign` (`automation2_id`),
  ADD KEY `dbacitimelines_subscriber_id_foreign` (`subscriber_id`),
  ADD KEY `dbacitimelines_auto_trigger_id_foreign` (`auto_trigger_id`);

--
-- Indices de la tabla `dbacitracking_domains`
--
ALTER TABLE `dbacitracking_domains`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacitracking_domains_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `dbacitracking_logs`
--
ALTER TABLE `dbacitracking_logs`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `dbacitracking_logs_runtime_message_id_unique` (`runtime_message_id`),
  ADD UNIQUE KEY `dbacitracking_logs_message_id_unique` (`message_id`),
  ADD KEY `dbacitracking_logs_customer_id_foreign` (`customer_id`),
  ADD KEY `dbacitracking_logs_sending_server_id_foreign` (`sending_server_id`),
  ADD KEY `dbacitracking_logs_subscriber_id_foreign` (`subscriber_id`),
  ADD KEY `dbacitracking_logs_auto_trigger_id_foreign` (`auto_trigger_id`),
  ADD KEY `dbacitracking_logs_sub_account_id_foreign` (`sub_account_id`),
  ADD KEY `dbacitracking_logs_email_id_foreign` (`email_id`),
  ADD KEY `dbacitracking_logs_campaign_id_foreign` (`campaign_id`);

--
-- Indices de la tabla `dbacitransactions`
--
ALTER TABLE `dbacitransactions`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbacitransactions_invoice_id_foreign` (`invoice_id`);

--
-- Indices de la tabla `dbaciunsubscribe_logs`
--
ALTER TABLE `dbaciunsubscribe_logs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciunsubscribe_logs_message_id_foreign` (`message_id`),
  ADD KEY `dbaciunsubscribe_logs_subscriber_id_foreign` (`subscriber_id`);

--
-- Indices de la tabla `dbaciuser_activations`
--
ALTER TABLE `dbaciuser_activations`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciuser_activations_user_id_foreign` (`user_id`),
  ADD KEY `dbaciuser_activations_token_index` (`token`);

--
-- Indices de la tabla `dbaciwebsites`
--
ALTER TABLE `dbaciwebsites`
  ADD PRIMARY KEY (`id`),
  ADD KEY `dbaciwebsites_customer_id_foreign` (`customer_id`);

--
-- Indices de la tabla `_tmp_subscriptions`
--
ALTER TABLE `_tmp_subscriptions`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `dbaciadmins`
--
ALTER TABLE `dbaciadmins`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbaciadmin_groups`
--
ALTER TABLE `dbaciadmin_groups`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT de la tabla `dbaciattachments`
--
ALTER TABLE `dbaciattachments`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciautomation2s`
--
ALTER TABLE `dbaciautomation2s`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciauto_triggers`
--
ALTER TABLE `dbaciauto_triggers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacibilling_addresses`
--
ALTER TABLE `dbacibilling_addresses`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbaciblacklists`
--
ALTER TABLE `dbaciblacklists`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacibounce_handlers`
--
ALTER TABLE `dbacibounce_handlers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacibounce_logs`
--
ALTER TABLE `dbacibounce_logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacicampaigns`
--
ALTER TABLE `dbacicampaigns`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT de la tabla `dbacicampaigns_lists_segments`
--
ALTER TABLE `dbacicampaigns_lists_segments`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT de la tabla `dbacicampaign_links`
--
ALTER TABLE `dbacicampaign_links`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

--
-- AUTO_INCREMENT de la tabla `dbacicampaign_webhooks`
--
ALTER TABLE `dbacicampaign_webhooks`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciclick_logs`
--
ALTER TABLE `dbaciclick_logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacicontacts`
--
ALTER TABLE `dbacicontacts`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbacicountries`
--
ALTER TABLE `dbacicountries`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=233;

--
-- AUTO_INCREMENT de la tabla `dbacicurrencies`
--
ALTER TABLE `dbacicurrencies`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbacicustomers`
--
ALTER TABLE `dbacicustomers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbacicustomer_groups`
--
ALTER TABLE `dbacicustomer_groups`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacicustomer_group_sending_servers`
--
ALTER TABLE `dbacicustomer_group_sending_servers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciemails`
--
ALTER TABLE `dbaciemails`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciemail_links`
--
ALTER TABLE `dbaciemail_links`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciemail_verifications`
--
ALTER TABLE `dbaciemail_verifications`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciemail_verification_servers`
--
ALTER TABLE `dbaciemail_verification_servers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciemail_webhooks`
--
ALTER TABLE `dbaciemail_webhooks`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacifailed_jobs`
--
ALTER TABLE `dbacifailed_jobs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacifeedback_logs`
--
ALTER TABLE `dbacifeedback_logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacifeedback_loop_handlers`
--
ALTER TABLE `dbacifeedback_loop_handlers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacifields`
--
ALTER TABLE `dbacifields`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

--
-- AUTO_INCREMENT de la tabla `dbacifield_options`
--
ALTER TABLE `dbacifield_options`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciforms`
--
ALTER TABLE `dbaciforms`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciinvoices`
--
ALTER TABLE `dbaciinvoices`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbaciinvoice_items`
--
ALTER TABLE `dbaciinvoice_items`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbaciip_locations`
--
ALTER TABLE `dbaciip_locations`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacijobs`
--
ALTER TABLE `dbacijobs`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacijob_monitors`
--
ALTER TABLE `dbacijob_monitors`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

--
-- AUTO_INCREMENT de la tabla `dbacilanguages`
--
ALTER TABLE `dbacilanguages`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

--
-- AUTO_INCREMENT de la tabla `dbacilayouts`
--
ALTER TABLE `dbacilayouts`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=18;

--
-- AUTO_INCREMENT de la tabla `dbacilogs`
--
ALTER TABLE `dbacilogs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

--
-- AUTO_INCREMENT de la tabla `dbacimail_lists`
--
ALTER TABLE `dbacimail_lists`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbacimail_lists_sending_servers`
--
ALTER TABLE `dbacimail_lists_sending_servers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacimigrations`
--
ALTER TABLE `dbacimigrations`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=279;

--
-- AUTO_INCREMENT de la tabla `dbacinotifications`
--
ALTER TABLE `dbacinotifications`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciopen_logs`
--
ALTER TABLE `dbaciopen_logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacipages`
--
ALTER TABLE `dbacipages`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacipassword_resets`
--
ALTER TABLE `dbacipassword_resets`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciplans`
--
ALTER TABLE `dbaciplans`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

--
-- AUTO_INCREMENT de la tabla `dbaciplans_email_verification_servers`
--
ALTER TABLE `dbaciplans_email_verification_servers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciplans_sending_servers`
--
ALTER TABLE `dbaciplans_sending_servers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbaciplugins`
--
ALTER TABLE `dbaciplugins`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciproducts`
--
ALTER TABLE `dbaciproducts`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacisegments`
--
ALTER TABLE `dbacisegments`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacisegment_conditions`
--
ALTER TABLE `dbacisegment_conditions`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacisenders`
--
ALTER TABLE `dbacisenders`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacisending_domains`
--
ALTER TABLE `dbacisending_domains`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacisettings`
--
ALTER TABLE `dbacisettings`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=30;

--
-- AUTO_INCREMENT de la tabla `dbacisources`
--
ALTER TABLE `dbacisources`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacisubscribers`
--
ALTER TABLE `dbacisubscribers`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbacisubscriber_fields`
--
ALTER TABLE `dbacisubscriber_fields`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

--
-- AUTO_INCREMENT de la tabla `dbacisubscriptions`
--
ALTER TABLE `dbacisubscriptions`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbacisubscription_logs`
--
ALTER TABLE `dbacisubscription_logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT de la tabla `dbacisub_accounts`
--
ALTER TABLE `dbacisub_accounts`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacitemplates`
--
ALTER TABLE `dbacitemplates`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=31;

--
-- AUTO_INCREMENT de la tabla `dbacitemplates_categories`
--
ALTER TABLE `dbacitemplates_categories`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=23;

--
-- AUTO_INCREMENT de la tabla `dbacitemplate_categories`
--
ALTER TABLE `dbacitemplate_categories`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;

--
-- AUTO_INCREMENT de la tabla `dbacitimelines`
--
ALTER TABLE `dbacitimelines`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacitracking_domains`
--
ALTER TABLE `dbacitracking_domains`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbacitracking_logs`
--
ALTER TABLE `dbacitracking_logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT de la tabla `dbacitransactions`
--
ALTER TABLE `dbacitransactions`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `dbaciunsubscribe_logs`
--
ALTER TABLE `dbaciunsubscribe_logs`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciuser_activations`
--
ALTER TABLE `dbaciuser_activations`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `dbaciwebsites`
--
ALTER TABLE `dbaciwebsites`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `_tmp_subscriptions`
--
ALTER TABLE `_tmp_subscriptions`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- Restricciones para tablas volcadas
--

--
-- Filtros para la tabla `dbaciadmins`
--
ALTER TABLE `dbaciadmins`
  ADD CONSTRAINT `dbaciadmins_admin_group_id_foreign` FOREIGN KEY (`admin_group_id`) REFERENCES `dbaciadmin_groups` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciadmins_contact_id_foreign` FOREIGN KEY (`contact_id`) REFERENCES `dbacicontacts` (`id`),
  ADD CONSTRAINT `dbaciadmins_creator_id_foreign` FOREIGN KEY (`creator_id`) REFERENCES `dbaciusers` (`id`),
  ADD CONSTRAINT `dbaciadmins_language_id_foreign` FOREIGN KEY (`language_id`) REFERENCES `dbacilanguages` (`id`),
  ADD CONSTRAINT `dbaciadmins_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `dbaciusers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciadmin_groups`
--
ALTER TABLE `dbaciadmin_groups`
  ADD CONSTRAINT `dbaciadmin_groups_creator_id_foreign` FOREIGN KEY (`creator_id`) REFERENCES `dbaciusers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciautomation2s`
--
ALTER TABLE `dbaciautomation2s`
  ADD CONSTRAINT `dbaciautomation2s_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciautomation2s_mail_list_id_foreign` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciauto_triggers`
--
ALTER TABLE `dbaciauto_triggers`
  ADD CONSTRAINT `dbaciauto_triggers_automation2_id_foreign` FOREIGN KEY (`automation2_id`) REFERENCES `dbaciautomation2s` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciauto_triggers_subscriber_id_foreign` FOREIGN KEY (`subscriber_id`) REFERENCES `dbacisubscribers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacibilling_addresses`
--
ALTER TABLE `dbacibilling_addresses`
  ADD CONSTRAINT `dbacibilling_addresses_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `dbacicountries` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacibilling_addresses_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciblacklists`
--
ALTER TABLE `dbaciblacklists`
  ADD CONSTRAINT `dbaciblacklists_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciblacklists_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacibounce_handlers`
--
ALTER TABLE `dbacibounce_handlers`
  ADD CONSTRAINT `dbacibounce_handlers_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacicampaigns`
--
ALTER TABLE `dbacicampaigns`
  ADD CONSTRAINT `dbacicampaigns_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacicampaigns_default_mail_list_id_foreign` FOREIGN KEY (`default_mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacicampaigns_template_id_foreign` FOREIGN KEY (`template_id`) REFERENCES `dbacitemplates` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `dbacicampaigns_tracking_domain_id_foreign` FOREIGN KEY (`tracking_domain_id`) REFERENCES `dbacitracking_domains` (`id`) ON DELETE SET NULL;

--
-- Filtros para la tabla `dbacicampaigns_lists_segments`
--
ALTER TABLE `dbacicampaigns_lists_segments`
  ADD CONSTRAINT `dbacicls_campaign_id_fk` FOREIGN KEY (`campaign_id`) REFERENCES `dbacicampaigns` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacicls_mail_list_id_fk` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacicls_segment_id_fk` FOREIGN KEY (`segment_id`) REFERENCES `dbacisegments` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacicampaign_links`
--
ALTER TABLE `dbacicampaign_links`
  ADD CONSTRAINT `dbacicampaign_links_campaign_id_foreign` FOREIGN KEY (`campaign_id`) REFERENCES `dbacicampaigns` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacicampaign_webhooks`
--
ALTER TABLE `dbacicampaign_webhooks`
  ADD CONSTRAINT `dbacicampaign_webhooks_campaign_id_foreign` FOREIGN KEY (`campaign_id`) REFERENCES `dbacicampaigns` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacicampaign_webhooks_campaign_link_id_foreign` FOREIGN KEY (`campaign_link_id`) REFERENCES `dbacicampaign_links` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciclick_logs`
--
ALTER TABLE `dbaciclick_logs`
  ADD CONSTRAINT `dbaciclick_logs_message_id_foreign` FOREIGN KEY (`message_id`) REFERENCES `dbacitracking_logs` (`message_id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacicontacts`
--
ALTER TABLE `dbacicontacts`
  ADD CONSTRAINT `dbacicontacts_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `dbacicountries` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacicurrencies`
--
ALTER TABLE `dbacicurrencies`
  ADD CONSTRAINT `dbacicurrencies_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacicustomers`
--
ALTER TABLE `dbacicustomers`
  ADD CONSTRAINT `dbacicustomers_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`),
  ADD CONSTRAINT `dbacicustomers_contact_id_foreign` FOREIGN KEY (`contact_id`) REFERENCES `dbacicontacts` (`id`),
  ADD CONSTRAINT `dbacicustomers_language_id_foreign` FOREIGN KEY (`language_id`) REFERENCES `dbacilanguages` (`id`);

--
-- Filtros para la tabla `dbacicustomer_groups`
--
ALTER TABLE `dbacicustomer_groups`
  ADD CONSTRAINT `dbacicustomer_groups_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciemails`
--
ALTER TABLE `dbaciemails`
  ADD CONSTRAINT `dbaciemails_automation2_id_foreign` FOREIGN KEY (`automation2_id`) REFERENCES `dbaciautomation2s` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciemails_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciemails_template_id_foreign` FOREIGN KEY (`template_id`) REFERENCES `dbacitemplates` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `dbaciemails_tracking_domain_id_foreign` FOREIGN KEY (`tracking_domain_id`) REFERENCES `dbacitracking_domains` (`id`) ON DELETE SET NULL;

--
-- Filtros para la tabla `dbaciemail_links`
--
ALTER TABLE `dbaciemail_links`
  ADD CONSTRAINT `dbaciemail_links_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `dbaciemails` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciemail_verifications`
--
ALTER TABLE `dbaciemail_verifications`
  ADD CONSTRAINT `dbaciemail_verifications_subscriber_id_foreign` FOREIGN KEY (`subscriber_id`) REFERENCES `dbacisubscribers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciev_email_verification_server_id_fk` FOREIGN KEY (`email_verification_server_id`) REFERENCES `dbaciemail_verification_servers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciemail_verification_servers`
--
ALTER TABLE `dbaciemail_verification_servers`
  ADD CONSTRAINT `dbacievs_admin_id_fk` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacievs_customer_id_fk` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciemail_webhooks`
--
ALTER TABLE `dbaciemail_webhooks`
  ADD CONSTRAINT `dbaciemail_webhooks_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `dbaciemails` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciemail_webhooks_email_link_id_foreign` FOREIGN KEY (`email_link_id`) REFERENCES `dbaciemail_links` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacifeedback_loop_handlers`
--
ALTER TABLE `dbacifeedback_loop_handlers`
  ADD CONSTRAINT `dbacifeedback_loop_handlers_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacifields`
--
ALTER TABLE `dbacifields`
  ADD CONSTRAINT `dbacifields_mail_list_id_foreign` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacifield_options`
--
ALTER TABLE `dbacifield_options`
  ADD CONSTRAINT `dbacifield_options_field_id_foreign` FOREIGN KEY (`field_id`) REFERENCES `dbacifields` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciforms`
--
ALTER TABLE `dbaciforms`
  ADD CONSTRAINT `dbaciforms_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciforms_mail_list_id_foreign` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciforms_template_id_foreign` FOREIGN KEY (`template_id`) REFERENCES `dbacitemplates` (`id`) ON DELETE SET NULL;

--
-- Filtros para la tabla `dbaciinvoices`
--
ALTER TABLE `dbaciinvoices`
  ADD CONSTRAINT `dbaciinvoices_currency_id_foreign` FOREIGN KEY (`currency_id`) REFERENCES `dbacicurrencies` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciinvoices_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciinvoice_items`
--
ALTER TABLE `dbaciinvoice_items`
  ADD CONSTRAINT `dbaciinvoice_items_invoice_id_foreign` FOREIGN KEY (`invoice_id`) REFERENCES `dbaciinvoices` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacilogs`
--
ALTER TABLE `dbacilogs`
  ADD CONSTRAINT `dbacilogs_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacimail_lists`
--
ALTER TABLE `dbacimail_lists`
  ADD CONSTRAINT `dbacimail_lists_contact_id_foreign` FOREIGN KEY (`contact_id`) REFERENCES `dbacicontacts` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacimail_lists_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacimail_lists_sending_servers`
--
ALTER TABLE `dbacimail_lists_sending_servers`
  ADD CONSTRAINT `dbacimlss_mail_list_id_fk` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacimlss_sending_server_id_fk` FOREIGN KEY (`sending_server_id`) REFERENCES `dbacisending_servers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacinotifications`
--
ALTER TABLE `dbacinotifications`
  ADD CONSTRAINT `dbacinotifications_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacinotifications_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciopen_logs`
--
ALTER TABLE `dbaciopen_logs`
  ADD CONSTRAINT `dbaciopen_logs_message_id_foreign` FOREIGN KEY (`message_id`) REFERENCES `dbacitracking_logs` (`message_id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacipages`
--
ALTER TABLE `dbacipages`
  ADD CONSTRAINT `dbacipages_layout_id_foreign` FOREIGN KEY (`layout_id`) REFERENCES `dbacilayouts` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacipages_mail_list_id_foreign` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciplans`
--
ALTER TABLE `dbaciplans`
  ADD CONSTRAINT `dbaciplans_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciplans_currency_id_foreign` FOREIGN KEY (`currency_id`) REFERENCES `dbacicurrencies` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciplans_email_verification_servers`
--
ALTER TABLE `dbaciplans_email_verification_servers`
  ADD CONSTRAINT `dbacipevs_plan_id_fk` FOREIGN KEY (`plan_id`) REFERENCES `dbaciplans` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacipevs_server_id_fk` FOREIGN KEY (`server_id`) REFERENCES `dbaciemail_verification_servers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciplans_sending_servers`
--
ALTER TABLE `dbaciplans_sending_servers`
  ADD CONSTRAINT `dbaciplans_sending_servers_plan_id_foreign` FOREIGN KEY (`plan_id`) REFERENCES `dbaciplans` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacipss_sending_server_id_fk` FOREIGN KEY (`sending_server_id`) REFERENCES `dbacisending_servers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciproducts`
--
ALTER TABLE `dbaciproducts`
  ADD CONSTRAINT `dbaciproducts_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbaciproducts_source_id_foreign` FOREIGN KEY (`source_id`) REFERENCES `dbacisources` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisegments`
--
ALTER TABLE `dbacisegments`
  ADD CONSTRAINT `dbacisegments_mail_list_id_foreign` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisegment_conditions`
--
ALTER TABLE `dbacisegment_conditions`
  ADD CONSTRAINT `dbacisegment_conditions_field_id_foreign` FOREIGN KEY (`field_id`) REFERENCES `dbacifields` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisegment_conditions_segment_id_foreign` FOREIGN KEY (`segment_id`) REFERENCES `dbacisegments` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisenders`
--
ALTER TABLE `dbacisenders`
  ADD CONSTRAINT `dbacisenders_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisenders_sending_server_id_foreign` FOREIGN KEY (`sending_server_id`) REFERENCES `dbacisending_servers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisending_domains`
--
ALTER TABLE `dbacisending_domains`
  ADD CONSTRAINT `dbacisending_domains_admin_id_foreign` FOREIGN KEY (`admin_id`) REFERENCES `dbaciadmins` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisending_domains_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisending_domains_sending_server_id_foreign` FOREIGN KEY (`sending_server_id`) REFERENCES `dbacisending_servers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisources`
--
ALTER TABLE `dbacisources`
  ADD CONSTRAINT `dbacisources_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisources_mail_list_id_foreign` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisubscribers`
--
ALTER TABLE `dbacisubscribers`
  ADD CONSTRAINT `dbacisubscribers_mail_list_id_foreign` FOREIGN KEY (`mail_list_id`) REFERENCES `dbacimail_lists` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisubscriber_fields`
--
ALTER TABLE `dbacisubscriber_fields`
  ADD CONSTRAINT `dbacisubscriber_fields_field_id_foreign` FOREIGN KEY (`field_id`) REFERENCES `dbacifields` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisubscriber_fields_subscriber_id_foreign` FOREIGN KEY (`subscriber_id`) REFERENCES `dbacisubscribers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisubscriptions`
--
ALTER TABLE `dbacisubscriptions`
  ADD CONSTRAINT `dbacisubscriptions_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisubscriptions_plan_id_foreign` FOREIGN KEY (`plan_id`) REFERENCES `dbaciplans` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisubscription_logs`
--
ALTER TABLE `dbacisubscription_logs`
  ADD CONSTRAINT `dbacisl_subscription_id_fk` FOREIGN KEY (`subscription_id`) REFERENCES `dbacisubscriptions` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacisub_accounts`
--
ALTER TABLE `dbacisub_accounts`
  ADD CONSTRAINT `dbacisub_accounts_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacisub_accounts_sending_server_id_foreign` FOREIGN KEY (`sending_server_id`) REFERENCES `dbacisending_servers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacitemplates`
--
ALTER TABLE `dbacitemplates`
  ADD CONSTRAINT `dbacitemplates_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacitemplates_categories`
--
ALTER TABLE `dbacitemplates_categories`
  ADD CONSTRAINT `dbacitemplates_categories_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `dbacitemplate_categories` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitemplates_categories_template_id_foreign` FOREIGN KEY (`template_id`) REFERENCES `dbacitemplates` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacitimelines`
--
ALTER TABLE `dbacitimelines`
  ADD CONSTRAINT `dbacitimelines_auto_trigger_id_foreign` FOREIGN KEY (`auto_trigger_id`) REFERENCES `dbaciauto_triggers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitimelines_automation2_id_foreign` FOREIGN KEY (`automation2_id`) REFERENCES `dbaciautomation2s` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitimelines_subscriber_id_foreign` FOREIGN KEY (`subscriber_id`) REFERENCES `dbacisubscribers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacitracking_domains`
--
ALTER TABLE `dbacitracking_domains`
  ADD CONSTRAINT `dbacitracking_domains_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacitracking_logs`
--
ALTER TABLE `dbacitracking_logs`
  ADD CONSTRAINT `dbacitracking_logs_auto_trigger_id_foreign` FOREIGN KEY (`auto_trigger_id`) REFERENCES `dbaciauto_triggers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitracking_logs_campaign_id_foreign` FOREIGN KEY (`campaign_id`) REFERENCES `dbacicampaigns` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitracking_logs_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitracking_logs_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `dbaciemails` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitracking_logs_sending_server_id_foreign` FOREIGN KEY (`sending_server_id`) REFERENCES `dbacisending_servers` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitracking_logs_sub_account_id_foreign` FOREIGN KEY (`sub_account_id`) REFERENCES `dbacisub_accounts` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `dbacitracking_logs_subscriber_id_foreign` FOREIGN KEY (`subscriber_id`) REFERENCES `dbacisubscribers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbacitransactions`
--
ALTER TABLE `dbacitransactions`
  ADD CONSTRAINT `dbacitransactions_invoice_id_foreign` FOREIGN KEY (`invoice_id`) REFERENCES `dbaciinvoices` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciunsubscribe_logs`
--
ALTER TABLE `dbaciunsubscribe_logs`
  ADD CONSTRAINT `dbaciunsubscribe_logs_subscriber_id_foreign` FOREIGN KEY (`subscriber_id`) REFERENCES `dbacisubscribers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciuser_activations`
--
ALTER TABLE `dbaciuser_activations`
  ADD CONSTRAINT `dbaciuser_activations_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `dbaciusers` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `dbaciwebsites`
--
ALTER TABLE `dbaciwebsites`
  ADD CONSTRAINT `dbaciwebsites_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `dbacicustomers` (`id`) ON DELETE CASCADE;
COMMIT;

