{"id":886,"date":"2025-09-29T12:16:21","date_gmt":"2025-09-29T12:16:21","guid":{"rendered":"https:\/\/protolinker.com\/?page_id=886"},"modified":"2026-05-05T09:03:34","modified_gmt":"2026-05-05T09:03:34","slug":"login","status":"publish","type":"page","link":"https:\/\/protolinker.com\/en\/login\/","title":{"rendered":"login"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"886\" class=\"elementor elementor-886\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1f40719 e-flex e-con-boxed e-con e-parent\" data-id=\"1f40719\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a15f069 elementor-widget elementor-widget-html\" data-id=\"a15f069\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"pl-login-section login-page\" id=\"login\">\n  <div class=\"pl-login-card login-box\">\n    <a href=\"\/protolinker\/signup\/\" class=\"signup-link\">Sign up instead<\/a>\n\n    <div class=\"logo-box\">\n      <a href=\"\/\">\n        <img decoding=\"async\" src=\"https:\/\/protolinker.com\/wp-content\/uploads\/2025\/09\/logo.png\" alt=\"Protolinker Logo\">\n      <\/a>\n    <\/div>\n\n    <div class=\"pl-login-header\">\n      <span class=\"pl-section-kicker\">Sign in<\/span>\n      <h2>Continue building with Protolinker<\/h2>\n      <p>\n        Access your dashboard, selected plan, and industrial protocol integrations from one workspace.\n      <\/p>\n    <\/div>\n\n    <form id=\"loginForm\">\n      <label class=\"pl-field\" for=\"email\">\n        <span>Email<\/span>\n        <input type=\"email\" id=\"email\" placeholder=\"Enter your email\" required>\n      <\/label>\n\n      <div class=\"pl-field password-wrapper\">\n        <label for=\"password\">Password<\/label>\n        <input type=\"password\" id=\"password\" placeholder=\"Enter your password\" required>\n        <button type=\"button\" class=\"toggle-password\">Show<\/button>\n      <\/div>\n\n      <div class=\"login-actions\">\n        <button type=\"button\" class=\"forgot-password-button\">Forgot password?<\/button>\n      <\/div>\n\n      <button type=\"submit\" id=\"submitBtn\" class=\"submit-btn\" disabled>Next<\/button>\n    <\/form>\n  <\/div>\n<\/section>\n\n<div id=\"loaderOverlay\" class=\"loader-overlay\">\n  <div class=\"loader\"><\/div>\n<\/div>\n\n<script>\n  (function () {\n    function onReady(callback) {\n      if (document.readyState === \"loading\") {\n        document.addEventListener(\"DOMContentLoaded\", callback);\n      } else {\n        callback();\n      }\n    }\n\n    function parseSearchParams(search) {\n      var params = {};\n      var query = String(search || \"\").replace(\/^\\?\/, \"\");\n\n      if (!query) {\n        return params;\n      }\n\n      query.split(\"&\").forEach(function (part) {\n        if (!part) {\n          return;\n        }\n\n        var pieces = part.split(\"=\");\n        var key = decodeURIComponent((pieces[0] || \"\").replace(\/\\+\/g, \" \"));\n\n        if (!key) {\n          return;\n        }\n\n        var value = decodeURIComponent((pieces.slice(1).join(\"=\") || \"\").replace(\/\\+\/g, \" \"));\n        params[key] = value;\n      });\n\n      return params;\n    }\n\n    function buildQuery(params) {\n      var parts = [];\n\n      Object.keys(params).forEach(function (key) {\n        var value = params[key];\n\n        if (value === undefined || value === null || value === \"\") {\n          return;\n        }\n\n        parts.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(String(value)));\n      });\n\n      return parts.join(\"&\");\n    }\n\n    function hasValue(list, value) {\n      return list.indexOf(value) !== -1;\n    }\n\n    function getCurrentLanguagePrefix() {\n      var path = window.location.pathname || \"\";\n\n      if (path.indexOf(\"\/pt\/\") === 0 || path === \"\/pt\") {\n        return \"\/pt\";\n      }\n\n      if (path.indexOf(\"\/en\/\") === 0 || path === \"\/en\") {\n        return \"\/en\";\n      }\n\n      return \"\";\n    }\n\n    function getLocalizedPath(defaultPath) {\n      var langPrefix = getCurrentLanguagePrefix();\n\n      defaultPath = String(defaultPath || \"\");\n\n      if (defaultPath.charAt(0) !== \"\/\") {\n        defaultPath = \"\/\" + defaultPath;\n      }\n\n      return langPrefix + defaultPath;\n    }\n\n    function getLocalizedResetPasswordUrl() {\n      return \"https:\/\/protolinker.com\" + getLocalizedPath(\"\/reset-password\/\");\n    }\n\n    onReady(function () {\n      var loginSection = document.querySelector(\".pl-login-section\");\n\n      if (!loginSection) {\n        return;\n      }\n\n      var emailInput = loginSection.querySelector(\"#email\");\n      var pwInput = loginSection.querySelector(\"#password\");\n      var submitBtn = loginSection.querySelector(\"#submitBtn\");\n      var form = loginSection.querySelector(\"#loginForm\");\n      var loader = document.getElementById(\"loaderOverlay\") || document.querySelector(\".loader-overlay\");\n      var signupLink = loginSection.querySelector(\".signup-link\");\n      var passwordToggle = loginSection.querySelector(\".toggle-password\");\n      var forgotPasswordButton = loginSection.querySelector(\".forgot-password-button\");\n\n      if (!emailInput || !pwInput || !submitBtn || !form) {\n        return;\n      }\n\n      var queryParams = parseSearchParams(window.location.search);\n      var validPlans = [\"free\", \"start\", \"pro\", \"max\"];\n      var validCurrencies = [\"usd\", \"brl\", \"eur\"];\n\n      function getRequestedPlan() {\n        var plan = String(queryParams.plan || \"\").trim().toLowerCase();\n        return hasValue(validPlans, plan) ? plan : \"\";\n      }\n\n      function getRequestedCurrency() {\n        var currency = String(queryParams.currency || \"\").trim().toLowerCase();\n        return hasValue(validCurrencies, currency) ? currency : \"\";\n      }\n\n      var requestedPlan = getRequestedPlan();\n      var requestedCurrency = getRequestedCurrency();\n\n      if (signupLink) {\n        var signupParams = {};\n\n        if (requestedPlan) {\n          signupParams.plan = requestedPlan;\n        }\n\n        if (requestedCurrency) {\n          signupParams.currency = requestedCurrency;\n        }\n\n        var signupQuery = buildQuery(signupParams);\n        var signupPath = getLocalizedPath(\"\/protolinker\/signup\/\");\n\n        signupLink.href = signupPath + (signupQuery ? \"?\" + signupQuery : \"\");\n      }\n\n      function setLoaderVisible(isVisible) {\n        if (loader) {\n          loader.style.display = isVisible ? \"flex\" : \"none\";\n        }\n      }\n\n      function togglePassword() {\n        pwInput.type = pwInput.type === \"password\" ? \"text\" : \"password\";\n\n        if (passwordToggle) {\n          passwordToggle.textContent = pwInput.type === \"password\" ? \"Show\" : \"Hide\";\n        }\n      }\n\n      function updateSubmitState() {\n        var isEmailValid = emailInput.value.trim().length > 0;\n        var isPwValid = pwInput.value.trim().length >= 8;\n        var enable = isEmailValid && isPwValid;\n\n        submitBtn.disabled = !enable;\n        submitBtn.classList.toggle(\"enabled\", enable);\n      }\n\n      if (passwordToggle) {\n        passwordToggle.addEventListener(\"click\", function (e) {\n          e.preventDefault();\n          togglePassword();\n        });\n      }\n\n      if (forgotPasswordButton) {\n        forgotPasswordButton.addEventListener(\"click\", function () {\n          var email = prompt(\"Enter your email to receive a password reset link:\");\n\n          if (!email || !email.trim()) {\n            alert(\"Email is required to reset the password.\");\n            return;\n          }\n\n          setLoaderVisible(true);\n\n          fetch(\"https:\/\/pnjzqfekyquoptxmlbma.auth.sa-east-1.nhost.run\/v1\/user\/password\/reset\", {\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application\/json\"\n            },\n            body: JSON.stringify({\n              email: email.trim(),\n              options: {\n                redirectTo: getLocalizedResetPasswordUrl()\n              }\n            })\n          })\n            .then(function (response) {\n              return response.json();\n            })\n            .then(function (result) {\n              if (result.error) {\n                alert(\"Error: \" + result.error.message);\n              } else {\n                alert(\"Password reset email sent. Please check your inbox.\");\n              }\n            })\n            .catch(function () {\n              alert(\"An unexpected error occurred. Please try again later.\");\n            })\n            .then(function () {\n              setLoaderVisible(false);\n            }, function () {\n              setLoaderVisible(false);\n            });\n        });\n      }\n\n      emailInput.addEventListener(\"input\", updateSubmitState);\n      pwInput.addEventListener(\"input\", updateSubmitState);\n\n      updateSubmitState();\n\n      form.addEventListener(\"submit\", function (e) {\n        e.preventDefault();\n        setLoaderVisible(true);\n\n        var requestBody = {\n          email: emailInput.value.trim(),\n          password: pwInput.value\n        };\n\n        if (requestedPlan) {\n          requestBody.plan = requestedPlan;\n        }\n\n        if (requestedCurrency) {\n          requestBody.currency = requestedCurrency;\n        }\n\n        fetch(\"https:\/\/pnjzqfekyquoptxmlbma.functions.sa-east-1.nhost.run\/v1\/login_with_dashboard\", {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application\/json\"\n          },\n          body: JSON.stringify(requestBody)\n        })\n          .then(function (response) {\n            return response.json().then(function (data) {\n              return {\n                response: response,\n                data: data\n              };\n            });\n          })\n          .then(function (result) {\n            if (!result.response.ok || result.data.error) {\n              alert(result.data.error || \"Login failed. Please check your credentials.\");\n              return;\n            }\n\n            if (result.data.url) {\n              window.location.href = result.data.url;\n            } else {\n              alert(\"Login successful, but no dashboard link was returned.\");\n            }\n          })\n          .catch(function () {\n            alert(\"Something went wrong. Please try again.\");\n          })\n          .then(function () {\n            setLoaderVisible(false);\n          }, function () {\n            setLoaderVisible(false);\n          });\n      });\n    });\n  })();\n<\/script>\n\n<style>\n  .pl-login-section {\n    --pl-bg: transparent;\n    --pl-card-bg: color-mix(in srgb, currentColor 5%, transparent);\n    --pl-card-border: color-mix(in srgb, currentColor 14%, transparent);\n    --pl-text: currentColor;\n    --pl-muted: color-mix(in srgb, currentColor 68%, transparent);\n    --pl-soft: rgba(0, 144, 255, 0.08);\n    --pl-input-bg: color-mix(in srgb, currentColor 4%, transparent);\n    --pl-input-border: color-mix(in srgb, currentColor 16%, transparent);\n    --pl-blue: #0090ff;\n    --pl-green: #3ddc6f;\n    --pl-shadow: 0 24px 70px rgba(10, 15, 23, 0.08);\n    min-height: 100vh;\n    padding: 72px 20px;\n    background: transparent !important;\n    color: var(--pl-text) !important;\n    font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n  }\n\n  .elementor-widget-html:has(.pl-login-section),\n  .elementor-widget-container:has(.pl-login-section),\n  .elementor-html:has(.pl-login-section) {\n    background: transparent !important;\n    background-color: transparent !important;\n  }\n\n  @supports not (color: color-mix(in srgb, black, white)) {\n    .pl-login-section {\n      --pl-card-bg: rgba(255, 255, 255, 0.94);\n      --pl-card-border: rgba(10, 15, 23, 0.12);\n      --pl-muted: rgba(0, 0, 0, 0.68);\n      --pl-input-bg: rgba(255, 255, 255, 0.9);\n      --pl-input-border: rgba(10, 15, 23, 0.16);\n    }\n  }\n\n  html.dark .pl-login-section,\n  body.dark .pl-login-section,\n  .dark .pl-login-section,\n  html.dark-mode .pl-login-section,\n  body.dark-mode .pl-login-section,\n  .dark-mode .pl-login-section,\n  html.is-dark-theme .pl-login-section,\n  body.is-dark-theme .pl-login-section,\n  .is-dark-theme .pl-login-section,\n  .wp-dark-mode-active .pl-login-section,\n  .darkmode--activated .pl-login-section,\n  html[data-theme=\"dark\"] .pl-login-section,\n  body[data-theme=\"dark\"] .pl-login-section,\n  html[data-color-mode=\"dark\"] .pl-login-section,\n  body[data-color-mode=\"dark\"] .pl-login-section,\n  .pl-login-section[data-pl-theme=\"dark\"] {\n    --pl-bg: transparent;\n    --pl-card-bg: rgba(12, 12, 12, 0.96);\n    --pl-card-border: rgba(255, 255, 255, 0.14);\n    --pl-text: #ffffff;\n    --pl-muted: rgba(255, 255, 255, 0.74);\n    --pl-soft: rgba(0, 144, 255, 0.16);\n    --pl-input-bg: rgba(255, 255, 255, 0.06);\n    --pl-input-border: rgba(255, 255, 255, 0.16);\n    --pl-shadow: 0 24px 80px rgba(0, 0, 0, 0.36);\n  }\n\n  html.light .pl-login-section,\n  body.light .pl-login-section,\n  .light .pl-login-section,\n  html.light-mode .pl-login-section,\n  body.light-mode .pl-login-section,\n  .light-mode .pl-login-section,\n  html.is-light-theme .pl-login-section,\n  body.is-light-theme .pl-login-section,\n  .is-light-theme .pl-login-section,\n  html.wp-light-mode-active .pl-login-section,\n  body.wp-light-mode-active .pl-login-section,\n  .wp-light-mode-active .pl-login-section,\n  html[data-theme=\"light\"] .pl-login-section,\n  body[data-theme=\"light\"] .pl-login-section,\n  html[data-color-mode=\"light\"] .pl-login-section,\n  body[data-color-mode=\"light\"] .pl-login-section,\n  .pl-login-section[data-pl-theme=\"light\"] {\n    --pl-bg: transparent;\n    --pl-card-bg: color-mix(in srgb, currentColor 5%, transparent);\n    --pl-card-border: color-mix(in srgb, currentColor 14%, transparent);\n    --pl-text: currentColor;\n    --pl-muted: color-mix(in srgb, currentColor 68%, transparent);\n    --pl-soft: rgba(0, 144, 255, 0.08);\n    --pl-input-bg: color-mix(in srgb, currentColor 4%, transparent);\n    --pl-input-border: color-mix(in srgb, currentColor 16%, transparent);\n    --pl-shadow: 0 24px 70px rgba(10, 15, 23, 0.08);\n  }\n\n  .pl-login-section *,\n  .pl-login-section *::before,\n  .pl-login-section *::after {\n    box-sizing: border-box;\n  }\n\n  .pl-login-card {\n    width: min(460px, 100%);\n    margin: 0 auto;\n    padding: 30px;\n    border: 1px solid var(--pl-card-border);\n    border-radius: 28px;\n    background: var(--pl-card-bg) !important;\n    color: var(--pl-text) !important;\n    box-shadow: var(--pl-shadow);\n    backdrop-filter: blur(16px);\n  }\n\n  .pl-login-section .signup-link {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    min-height: 40px;\n    margin-bottom: 24px;\n    padding: 0 16px;\n    border: 1px solid var(--pl-card-border);\n    border-radius: 999px;\n    background: transparent;\n    color: var(--pl-text) !important;\n    font-size: 14px;\n    font-weight: 800;\n    text-decoration: none;\n    transition:\n      transform 160ms ease,\n      background 160ms ease;\n  }\n\n  .pl-login-section .signup-link:hover {\n    transform: translateY(-1px);\n    background: var(--pl-soft);\n  }\n\n  .pl-login-section .logo-box {\n    width: 78px;\n    height: 78px;\n    margin: 0 auto 20px;\n    overflow: hidden;\n    border: 1px solid var(--pl-card-border);\n    border-radius: 50%;\n    background: linear-gradient(135deg, rgba(0, 144, 255, 0.2), rgba(61, 220, 111, 0.18));\n    box-shadow: 0 16px 34px rgba(0, 144, 255, 0.14);\n  }\n\n  .pl-login-section .logo-box a,\n  .pl-login-section .logo-box img {\n    display: block;\n    width: 100%;\n    height: 100%;\n  }\n\n  .pl-login-section .logo-box img {\n    object-fit: cover;\n    border-radius: 50%;\n  }\n\n  .pl-login-header {\n    margin-bottom: 24px;\n    text-align: center;\n  }\n\n  .pl-section-kicker {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    margin-bottom: 14px;\n    padding: 8px 14px;\n    border: 1px solid var(--pl-card-border);\n    border-radius: 999px;\n    background: var(--pl-soft);\n    color: var(--pl-blue) !important;\n    font-size: 14px;\n    font-weight: 700;\n    letter-spacing: 0.02em;\n  }\n\n  .pl-login-header h2 {\n    margin: 0;\n    color: var(--pl-text) !important;\n    font-size: clamp(25px, 4vw, 34px);\n    line-height: 1.08;\n    letter-spacing: -0.03em;\n  }\n\n  .pl-login-header p {\n    margin: 14px auto 0;\n    color: var(--pl-muted) !important;\n    font-size: 15.5px;\n    line-height: 1.6;\n  }\n\n  .pl-field {\n    display: block;\n    margin-bottom: 14px;\n  }\n\n  .pl-field span,\n  .pl-field label {\n    display: block;\n    margin-bottom: 7px;\n    color: var(--pl-text) !important;\n    font-size: 13px;\n    font-weight: 800;\n  }\n\n  .pl-login-section input[type=\"email\"],\n  .pl-login-section input[type=\"password\"],\n  .pl-login-section .password-wrapper input {\n    width: 100%;\n    min-height: 48px;\n    margin: 0;\n    padding: 0 15px;\n    border: 1px solid var(--pl-input-border);\n    border-radius: 14px;\n    outline: none;\n    background: var(--pl-input-bg) !important;\n    color: var(--pl-text) !important;\n    font: inherit;\n    font-size: 15px;\n    transition:\n      border-color 160ms ease,\n      box-shadow 160ms ease,\n      background 160ms ease;\n  }\n\n  .pl-login-section input[type=\"email\"]::placeholder,\n  .pl-login-section input[type=\"password\"]::placeholder,\n  .pl-login-section .password-wrapper input::placeholder {\n    color: var(--pl-muted) !important;\n  }\n\n  .pl-login-section input[type=\"email\"]:focus,\n  .pl-login-section input[type=\"password\"]:focus,\n  .pl-login-section .password-wrapper input:focus {\n    border-color: rgba(0, 144, 255, 0.62);\n    box-shadow: 0 0 0 4px rgba(0, 144, 255, 0.12);\n  }\n\n  .pl-login-section .password-wrapper {\n    position: relative;\n  }\n\n  .pl-login-section .password-wrapper input {\n    padding-right: 88px !important;\n  }\n\n  .pl-login-section .toggle-password {\n    position: absolute;\n    right: 9px;\n    bottom: 7px;\n    min-width: 56px;\n    min-height: 34px;\n    border: 1px solid var(--pl-card-border);\n    border-radius: 999px;\n    background: transparent;\n    color: var(--pl-blue) !important;\n    cursor: pointer;\n    font-size: 13px;\n    font-weight: 800;\n  }\n\n  .pl-login-section .toggle-password:hover {\n    background: var(--pl-soft);\n  }\n\n  .pl-login-section .login-actions {\n    display: flex;\n    justify-content: flex-end;\n    margin: -2px 0 22px;\n  }\n\n  .pl-login-section .login-actions button {\n    padding: 0;\n    border: 0;\n    background: transparent;\n    color: var(--pl-blue) !important;\n    cursor: pointer;\n    font: inherit;\n    font-size: 13px;\n    font-weight: 800;\n  }\n\n  .pl-login-section .login-actions button:hover {\n    text-decoration: underline;\n  }\n\n  .pl-login-section .submit-btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    min-height: 50px;\n    padding: 0 18px;\n    border: 0;\n    border-radius: 999px;\n    background: rgba(128, 128, 128, 0.28);\n    color: var(--pl-muted) !important;\n    cursor: not-allowed;\n    font: inherit;\n    font-size: 15px;\n    font-weight: 850;\n    text-transform: none;\n    transition:\n      transform 160ms ease,\n      opacity 160ms ease,\n      background 160ms ease;\n  }\n\n  .pl-login-section .submit-btn.enabled {\n    background: linear-gradient(135deg, var(--pl-blue), var(--pl-green));\n    color: #ffffff !important;\n    cursor: pointer;\n    box-shadow: 0 14px 32px rgba(0, 144, 255, 0.28);\n  }\n\n  .pl-login-section .submit-btn.enabled:hover {\n    transform: translateY(-1px);\n  }\n\n  .loader-overlay {\n    position: fixed;\n    inset: 0;\n    z-index: 9999;\n    display: none;\n    align-items: center;\n    justify-content: center;\n    background: rgba(0, 0, 0, 0.16);\n    backdrop-filter: blur(2px);\n  }\n\n  .loader {\n    width: 42px;\n    height: 42px;\n    border: 4px solid rgba(255, 255, 255, 0.34);\n    border-top-color: var(--pl-blue, #0090ff);\n    border-radius: 50%;\n    animation: spin 1s linear infinite;\n  }\n\n  @keyframes spin {\n    0% {\n      transform: rotate(0deg);\n    }\n\n    100% {\n      transform: rotate(360deg);\n    }\n  }\n\n  @media (max-width: 640px) {\n    .pl-login-section {\n      min-height: auto;\n      padding: 48px 16px;\n    }\n\n    .pl-login-card {\n      padding: 24px;\n      border-radius: 22px;\n    }\n\n    .pl-login-header h2 {\n      font-size: 28px;\n    }\n  }\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Sign up instead Sign in Continue building with Protolinker Access your dashboard, selected plan, and industrial protocol integrations from one workspace. Email Password Show Forgot password? Next<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-886","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/pages\/886","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/comments?post=886"}],"version-history":[{"count":18,"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/pages\/886\/revisions"}],"predecessor-version":[{"id":1296,"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/pages\/886\/revisions\/1296"}],"wp:attachment":[{"href":"https:\/\/protolinker.com\/en\/wp-json\/wp\/v2\/media?parent=886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}