{"id":608,"date":"2026-07-07T03:43:54","date_gmt":"2026-07-07T03:43:54","guid":{"rendered":"http:\/\/uni-trend.local\/?page_id=608"},"modified":"2026-10-15T04:13:26","modified_gmt":"2026-10-15T04:13:26","slug":"license-activation","status":"publish","type":"page","link":"https:\/\/uni-trend.visibleone.dev\/de-de\/supports\/license-activation\/","title":{"rendered":"License Activation"},"content":{"rendered":"<section data-section=\"Innerpage Banner\">\n      <!-- Hero image h:240 with dark overlay + centered title -->\n      <div class=\"relative h-[12.5vw] overflow-hidden max-lg:h-[35vw]\">\n        <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/uploads\/2026\/08\/image-63-5.png\" alt=\"License Activation\" class=\"absolute inset-0 w-full h-full object-cover\">\n        <div class=\"absolute inset-0 bg-[rgba(0,0,0,0.2)]\"><\/div>\n        <div class=\"absolute inset-0 flex items-center justify-center\">\n          <h1 class=\"h2 text-white tracking-[-0.02em]\">License Activation<\/h1>\n        <\/div>\n      <\/div>\n      <!-- Lower strip bg:#F5F2F2 h:88 with breadcrumb -->\n      <div class=\"flex items-end container pt-[24px] pb-5 md:pb-10\">\n        <nav class=\"flex items-center gap-[0.63vw]\">\n                                                <span class=\"t-13-20-400 text-c1\">Home<\/span>\n                              <\/nav>\n      <\/div>\n    <\/section>\n\n\n<section data-section=\"license activation form\" class=\"pt-5 pb-[50px] md:pb-[100px] license-activation-form\" x-data=\"licenseFormComponent()\">\n    <div class=\"container\">\n        <div class=\"max-w-[800px] mx-auto\">\n\n            <!-- Sign-in \/ signed-in panel -->\n            <div class=\"rounded-[28px] bg-c4 p-5 md:p-8 mb-10\">\n                <div class=\"flex items-end justify-between gap-4\">\n                    <p class=\"h6 font-semibold text-primary\">\n                        Sign in to Secure Your License                    <\/p>\n                                        <button type=\"button\" x-data @click.prevent=\"$dispatch('ut:open-login', { returnTo: window.location.href })\" class=\"shrink-0 bg-primary text-white body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-primary inline-flex hover:gap-x-2.5 items-center justify-center group\">\n                        <span>Sign in<\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/>\n                    <\/button>\n                                    <\/div>\n                <div class=\"my-6 w-full h-[1px] bg-c3\"><\/div>\n                <p class=\"body-lg font-normal text-c2\">\n                    Each License Key is valid for a <strong>single activation only<\/strong>. To prevent the loss of your .lic file, we strongly recommend logging in before proceeding.                <\/p>\n                <div class=\"my-6 w-full h-[1px] bg-c3\"><\/div>\n                <p class=\"body font-bold text-c1\">With an Account<\/p>\n                <p class=\"pt-3 body font-normal text-c2\">Your activation records and .lic files are permanently saved in your account for instant download anytime.<\/p>\n                <p class=\"pt-6 body font-bold text-c1\">As a Guest<\/p>\n                <p class=\"pt-3 body font-normal text-c2\">If the file is lost, recovery is only possible through your email records or by contacting UNI-T Technical Support manually.<\/p>\n            <\/div>\n\n            <!-- Activation form -->\n            <div class=\"border border-c3 p-5 md:p-10 lg:p-[60px] rounded-[28px]\">\n                <div class=\"flex items-center justify-center border-b border-c3\">\n                    <button type=\"button\" :class=\"tab === 'single' ? 'tab-item active w-1\/2 p-2 body-lg font-normal text-c2' : 'tab-item w-1\/2 p-2 body-lg font-normal text-c2'\" @click=\"tab = 'single'\">Single<\/button>\n                    <button type=\"button\" :class=\"tab === 'bulk' ? 'tab-item active w-1\/2 p-2 body-lg font-normal text-c2' : 'tab-item w-1\/2 p-2 body-lg font-normal text-c2'\" @click=\"tab = 'bulk'\">Bulk<\/button>\n                <\/div>\n\n                <div class=\"pt-6\">\n                    <!-- \u2500\u2500 SINGLE \u2500\u2500 -->\n                    <div x-show=\"tab === 'single'\">\n                        <label class=\"body text-c1 font-semibold\">Key<\/label>\n                        <div class=\"grid grid-cols-2 md:grid-cols-4 gap-x-10 gap-y-5 md:gap-10 mt-5 license-inputs\">\n                            <!-- x-for only iterates on a <template>; on a plain div Alpine\n                                 renders the element once and the four boxes the design\n                                 (and .license-inputs' separator rules) expect never appear. -->\n                            <template x-for=\"(p, i) in parts\" :key=\"i\">\n                                <div class=\"input-items\">\n                                    <input type=\"text\" inputmode=\"text\" autocomplete=\"off\" spellcheck=\"false\" maxlength=\"4\"\n                                        :value=\"parts[i]\" @input=\"advance(i, $event)\" @paste.prevent=\"paste(i, $event)\"\n                                        :aria-label=\"'License key part ' + (i + 1)\"\n                                        class=\"rounded-[8px] bg-c10 !w-full p-2.5 xl:p-3 border border-c10 focus:border-c3 hover:border-c3 text-center uppercase\" \/>\n                                <\/div>\n                            <\/template>\n                        <\/div>\n                        <div class=\"my-9\">\n                            <p class=\"text-c1 body font-semibold\">Serial Number<\/p>\n                            <p class=\"body-sm font-normal text-c2\">(Find your serial number on the back\/bottom side of your product)<\/p>\n                            <input type=\"text\" x-model=\"sn\" @input=\"sn = $event.target.value.toUpperCase()\" autocomplete=\"off\" spellcheck=\"false\"\n                                class=\"mt-5 text-[#1a1a1a99] body-sm rounded-[8px] bg-c10 w-full p-2.5 xl:p-3 border border-c10 focus:border-c3 hover:border-c3 uppercase\"\n                                placeholder=\"eg. 202312345678\" \/>\n                        <\/div>\n                                                    <div class=\"mb-9\">\n    <p class=\"text-c1 body font-semibold\">Email address<\/p>\n    <p class=\"body-sm font-normal text-c2\">(We&#039;ll send your .lic file here \u2014 without an account this is your only copy)<\/p>\n    <input type=\"email\" x-model=\"email\" autocomplete=\"email\" spellcheck=\"false\" inputmode=\"email\"\n        class=\"mt-5 text-[#1a1a1a99] body-sm rounded-[8px] bg-c10 w-full p-2.5 xl:p-3 border border-c10 focus:border-c3 hover:border-c3\"\n        placeholder=\"eg. name@company.com\" \/>\n<\/div>\n                                                <div class=\"flex flex-col items-center gap-3\">\n                            <button type=\"button\" @click=\"activate()\" :disabled=\"busy\"\n                                class=\"shrink-0 bg-primary text-white body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-primary inline-flex hover:gap-x-2.5 items-center justify-center group disabled:opacity-50 disabled:cursor-not-allowed\">\n                                <span x-text=\"busy ? 'Activating\u2026' : 'Submit'\"><\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/>\n                            <\/button>\n                            <p x-show=\"hint\" x-text=\"hint\" class=\"body-sm text-primary text-center\" x-cloak><\/p>\n                        <\/div>\n                    <\/div>\n\n                    <!-- \u2500\u2500 BULK \u2500\u2500 -->\n                    <div x-show=\"tab === 'bulk'\" x-cloak>\n                        <label class=\"body text-c1 font-semibold\">Key<\/label>\n                        <div class=\"mt-5\">\n                            <textarea x-model=\"keysText\" rows=\"4\" autocomplete=\"off\" spellcheck=\"false\"\n                                class=\"rounded-[8px] bg-c10 w-full p-2.5 xl:p-3 border border-c10 focus:border-c3 hover:border-c3 uppercase body-sm\"\n                                placeholder=\"eg. 98JN-EAB5-A7S6-G3PQ, EEAK-XPW3-18VK-596G\"><\/textarea>\n                        <\/div>\n                        <div class=\"my-9\">\n                            <p class=\"text-c1 body font-semibold\">Serial Number<\/p>\n                            <p class=\"body-sm font-normal text-c2\">(Find your serial number on the back\/bottom side of your product)<\/p>\n                            <textarea x-model=\"snsText\" rows=\"4\" autocomplete=\"off\" spellcheck=\"false\"\n                                class=\"mt-5 text-[#1a1a1a99] body-sm rounded-[8px] bg-c10 w-full p-2.5 xl:p-3 border border-c10 focus:border-c3 hover:border-c3 uppercase\"\n                                placeholder=\"eg. 202312345678, 20269789458, 641336978234, 796548657952, 641657985455\"><\/textarea>\n                        <\/div>\n                                                    <div class=\"mb-9\">\n    <p class=\"text-c1 body font-semibold\">Email address<\/p>\n    <p class=\"body-sm font-normal text-c2\">(We&#039;ll send your .lic file here \u2014 without an account this is your only copy)<\/p>\n    <input type=\"email\" x-model=\"email\" autocomplete=\"email\" spellcheck=\"false\" inputmode=\"email\"\n        class=\"mt-5 text-[#1a1a1a99] body-sm rounded-[8px] bg-c10 w-full p-2.5 xl:p-3 border border-c10 focus:border-c3 hover:border-c3\"\n        placeholder=\"eg. name@company.com\" \/>\n<\/div>\n                                                <div class=\"flex flex-col items-center gap-3\">\n                            <button type=\"button\" @click=\"activateBulk()\" :disabled=\"busy\"\n                                class=\"shrink-0 bg-primary text-white body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-primary inline-flex hover:gap-x-2.5 items-center justify-center group disabled:opacity-50 disabled:cursor-not-allowed\">\n                                <span x-text=\"busy ? 'Activating\u2026' : 'Submit'\"><\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/>\n                            <\/button>\n                            <p x-show=\"hint\" x-text=\"hint\" class=\"body-sm text-primary text-center\" x-cloak><\/p>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <!-- \u2500\u2500 LICENCE FILE DOWNLOAD \u2500\u2500\n                 Populated from the .lic files this visitor actually holds: the\n                 records saved to their account, plus anything activated in this\n                 session. Hidden entirely when there is nothing to download, so\n                 the card never advertises a file that does not exist. -->\n            <div class=\"border border-c3 p-5 md:p-10 lg:p-[60px] rounded-[28px] mt-10\" x-show=\"files.length\" x-cloak>\n                <h6 class=\"h6 text-c1 text-center font-semibold\">Licence File Download<\/h6>\n                <div class=\"mt-5 flex flex-col gap-3\">\n                    <template x-for=\"f in files\" :key=\"f.licenseId\">\n                        <a href=\"#\" @click.prevent=\"download(f)\" class=\"group hover:shadow-dCard flex items-center justify-between gap-4 p-6 rounded-[16px] border border-c3\">\n                            <div class=\"flex gap-5 items-center min-w-0\">\n                                <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/software.png\" alt=\"\" aria-hidden=\"true\" \/>\n                                <div class=\"min-w-0\">\n                                    <p class=\"body font-semibold text-c1 group-hover:text-primary truncate\" x-text=\"f.modelName || f.seriesName\"><\/p>\n                                    <p class=\"body-sm font-normal text-c2 truncate\" x-text=\"f.sn\"><\/p>\n                                <\/div>\n                            <\/div>\n                            <div class=\"shrink-0\">\n                                <svg class=\"text-c1 group-hover:text-primary\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"16\" height=\"18\" viewBox=\"0 0 16 18\" fill=\"none\" aria-hidden=\"true\">\n                                    <path d=\"M16 18H0V16H16V18ZM9 9.58599L13.293 5.29303L14.707 6.70706L8.00002 13.4141L1.29295 6.70706L2.70703 5.29303L6.99998 9.58594V0H9V9.58599Z\" fill=\"currentColor\"\/>\n                                <\/svg>\n                            <\/div>\n                        <\/a>\n                    <\/template>\n                <\/div>\n                <div class=\"flex flex-col gap-3 items-center justify-center mt-10\">\n                    <button type=\"button\" @click=\"sendToEmail()\" :disabled=\"mailing\"\n                        class=\"shrink-0 bg-primary text-white body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-primary inline-flex hover:gap-x-2.5 items-center justify-center group disabled:opacity-50 disabled:cursor-not-allowed\">\n                        <span x-text=\"mailing ? 'Sending\u2026' : 'Send to email'\"><\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/>\n                    <\/button>\n                    <p x-show=\"mailNote\" x-text=\"mailNote\" x-cloak class=\"body-sm text-c2 text-center\"><\/p>\n                    <p class=\"caption font-normal text-c2\">\n                        Need help? Please <a href=\"https:\/\/uni-trend.visibleone.dev\/de-de\/contact-us\/\" class=\"underline\">contact us<\/a> for further assistance.                    <\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- \u2500\u2500 SUCCESS MODAL \u2500\u2500 -->\n    <div class=\"activation-successful fixed top-0 left-0 w-full h-full bg-[#00000036] z-10\" x-show=\"showSuccess\" x-cloak @keydown.escape.window=\"showSuccess = false\">\n        <div class=\"relative z-[11] bg-white rounded-t-[10px] rounded-b-[16px] p-8 md:p-12 top-1\/2 left-1\/2 -translate-x-1\/2 -translate-y-1\/2 w-[80%] md:w-auto max-w-[600px] max-h-[90vh] overflow-y-auto\">\n            <div class=\"absolute bg-c3 w-full h-[6px] left-0 top-0 rounded-t-[16px] z-[12]\"><\/div>\n            <div class=\"progress-bar absolute bg-primary h-[6px] left-0 top-0 rounded-t-[16px] z-[12] w-full\"><\/div>\n            <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/success.svg\" class=\"mx-auto\" alt=\"Success\" \/>\n\n            <!-- Single -->\n            <template x-if=\"successMode === 'single' &#038;&#038; singleRecord\">\n                <div>\n                    <p class=\"mt-5 h5 font-bold text-c1 text-center\">Activation Successful<\/p>\n                    <p class=\"mt-5 body-lg font-bold text-c2 text-center\">Your license has been successfully bound to S\/N: <span x-text=\"singleRecord.sn\" class=\"text-c1\"><\/span>.<\/p>\n                    <div class=\"rounded-[12px] bg-c4 mt-5 p-5 flex flex-col gap-3\">\n                        <div class=\"flex justify-between gap-4\">\n                            <p class=\"body-sm font-normal text-c2\">Model<\/p>\n                            <p class=\"body-sm font-semibold text-c1 text-right\" x-text=\"singleRecord.modelName\"><\/p>\n                        <\/div>\n                        <div class=\"flex justify-between gap-4\">\n                            <p class=\"body-sm font-normal text-c2\">Activation Code<\/p>\n                            <p class=\"body-sm font-semibold text-c1 text-right\" x-text=\"singleRecord.activationCode\"><\/p>\n                        <\/div>\n                    <\/div>\n                    <p class=\"body font-normal text-c2 text-center mt-5\" x-text=\"successNote\"><\/p>\n                    <div class=\"mt-5 grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-4\">\n                        <button type=\"button\" @click=\"download(singleRecord)\" class=\"shrink-0 bg-primary text-white body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-primary inline-flex hover:gap-x-2.5 items-center justify-center group\"><span>Download .lic<\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/><\/button>\n                                                <button type=\"button\" @click=\"showSuccess = false\" class=\"shrink-0 border border-primary text-primary body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] inline-flex hover:gap-x-2.5 items-center justify-center group\"><span>Done<\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow-primary.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/><\/button>\n                                            <\/div>\n                <\/div>\n            <\/template>\n\n            <!-- Bulk -->\n            <template x-if=\"successMode === 'bulk'\">\n                <div>\n                    <p class=\"mt-5 h5 font-bold text-c1 text-center\" x-text=\"bulkRecords.length + ' license(s) activated'\"><\/p>\n                    <div class=\"mt-5 flex flex-col gap-3\">\n                        <template x-for=\"r in bulkRecords\" :key=\"r.licenseId\">\n                            <div class=\"rounded-[12px] bg-c4 p-5 flex items-center justify-between gap-4\">\n                                <div class=\"min-w-0\">\n                                    <p class=\"body-sm font-semibold text-c1 truncate\" x-text=\"r.modelName\"><\/p>\n                                    <p class=\"body-sm font-normal text-c2 truncate\" x-text=\"r.seriesName + ' \u00b7 ' + r.sn\"><\/p>\n                                <\/div>\n                                <button type=\"button\" @click=\"download(r)\" class=\"shrink-0 body-sm font-bold text-primary inline-flex items-center gap-2 hover:underline\">Download<\/button>\n                            <\/div>\n                        <\/template>\n                    <\/div>\n                    <p class=\"body-sm font-normal text-c2 text-center mt-5\" x-text=\"successNote\"><\/p>\n                    <div x-show=\"bulkErrors.length\" class=\"mt-5 rounded-[12px] bg-c4 p-5\">\n                        <p class=\"body-sm font-semibold text-primary\">Failed<\/p>\n                        <template x-for=\"(e, i) in bulkErrors\" :key=\"i\">\n                            <p class=\"body-sm font-normal text-c2 mt-2\" x-text=\"(e.key || '\u2014') + ' \/ ' + (e.sn_num || '\u2014') + ': ' + e.error_message\"><\/p>\n                        <\/template>\n                    <\/div>\n                    <button type=\"button\" @click=\"continueAfterBulk()\" class=\"continue mt-5 shrink-0 bg-primary text-white body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-primary inline-flex w-full hover:gap-x-2.5 items-center justify-center group\"><span>Continue<\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/><\/button>\n                <\/div>\n            <\/template>\n        <\/div>\n    <\/div>\n\n    <!-- \u2500\u2500 FAIL MODAL \u2500\u2500 -->\n    <div class=\"activation-fail fixed top-0 left-0 w-full h-full bg-[#00000036] z-10\" x-show=\"showFail\" x-cloak @keydown.escape.window=\"showFail = false\">\n        <div class=\"relative z-[11] bg-white rounded-t-[10px] rounded-b-[16px] p-8 md:p-12 top-1\/2 left-1\/2 -translate-x-1\/2 -translate-y-1\/2 w-[80%] md:w-auto max-w-[600px]\">\n            <div class=\"absolute bg-c3 w-full h-[6px] left-0 top-0 rounded-t-[16px] z-[12]\"><\/div>\n            <div class=\"progress-bar absolute bg-primary h-[6px] left-0 top-0 rounded-t-[16px] z-[12] w-full\"><\/div>\n            <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/fail.svg\" class=\"mx-auto\" alt=\"Failed\" \/>\n            <p class=\"mt-5 h5 font-bold text-c1 text-center\">Activation Failed<\/p>\n            <p class=\"body font-normal text-c2 text-center mt-5\" x-text=\"failMsg\"><\/p>\n            <p class=\"body font-normal text-c2 text-center mt-3\">If this key is already active and bound to a serial number, please check your account to re-download the associated .lic file.<\/p>\n            <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-4 mt-5\">\n                <!-- Deliberately not .try-again: status-popup.js binds that selector to\n                     closePopup(), which adds Tailwind's .hidden to the modal. x-show only\n                     clears inline display, never a class, so the modal would stay hidden\n                     for the rest of the page life and every later failure would be silent. -->\n                <button type=\"button\" @click=\"showFail = false\" class=\"shrink-0 bg-c18 text-primary body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-[#cb302b14] inline-flex hover:gap-x-2.5 items-center justify-center hover:border-primary group\"><span>Try again<\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow-primary.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/><\/button>\n                <a href=\"https:\/\/uni-trend.visibleone.dev\/de-de\/my-account\/\" class=\"shrink-0 bg-primary text-white body font-semibold px-6 py-2.5 md:py-4 rounded-[24px] border border-primary inline-flex hover:gap-x-2.5 items-center justify-center group\"><span>Go to My Account<\/span> <img decoding=\"async\" src=\"https:\/\/uni-trend.visibleone.dev\/wp-content\/themes\/uni-trend\/public\/images\/icons\/btn-arrow.svg\" class=\"w-0 group-hover:w-3 transition-all ease-out duration-200\" alt=\"arrow icon\" \/><\/a>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/section>\n<script>\n    function licenseFormComponent() {\n        return {\n            loggedIn: false,\n            tab: 'single',\n            parts: ['', '', '', ''],\n            sn: '',\n            email: '',\n            keysText: '',\n            snsText: '',\n            busy: false,\n            mailing: false,\n            hint: '',\n            mailNote: '',\n            successNote: '',\n            showSuccess: false,\n            showFail: false,\n            failMsg: '',\n            successMode: 'single',\n            singleRecord: null,\n            bulkRecords: [],\n            bulkErrors: [],\n            \/\/ Guest session token from the server; lets \"Send to email\" re-send a\n            \/\/ file the guest has no account to look it up in.\n            token: '',\n            files: [],\n\n            get key() {\n                return this.parts.join('-');\n            },\n\n            \/\/ Keep the download card in sync without duplicating a licence the\n            \/\/ customer already had listed.\n            addFiles(records) {\n                (records || []).forEach((r) => {\n                    if (!r || !r.licenseId) return;\n                    if (this.files.some((f) => f.licenseId === r.licenseId)) return;\n                    this.files.unshift(r);\n                });\n            },\n\n            advance(i, ev) {\n                let v = ev.target.value.replace(\/[^A-Za-z0-9]\/g, '').toUpperCase();\n                const left = 4 * (4 - i);\n                if (v.length > left) v = v.slice(0, left);\n                for (let j = i; j !== 4 && v; j++) {\n                    this.parts[j] = v.slice(0, 4);\n                    v = v.slice(4);\n                }\n                const box = ev.target.closest('.input-items');\n                const next = box && box.nextElementSibling ? box.nextElementSibling.querySelector('input') : null;\n                if (this.parts[i].length === 4 && i !== 3 && next) next.focus();\n            },\n\n            \/\/ Pasting a whole \"XXXX-XXXX-XXXX-XXXX\" key should fill all four\n            \/\/ boxes; maxlength on the input would otherwise truncate it to 4.\n            paste(i, ev) {\n                const text = (ev.clipboardData || window.clipboardData).getData('text') || '';\n                let v = text.replace(\/[^A-Za-z0-9]\/g, '').toUpperCase();\n                for (let j = i; j !== 4; j++) {\n                    this.parts[j] = v.slice(0, 4);\n                    v = v.slice(4);\n                }\n            },\n\n            \/\/ Guests have to tell us where the .lic file should go \u2014 it is their\n            \/\/ only copy. Returns false and sets the hint when it's missing.\n            guestEmailReady() {\n                if (this.loggedIn) return true;\n                if (\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(this.email.trim())) return true;\n                this.hint = 'Please enter the email address where we should send your .lic file.';\n                return false;\n            },\n\n            async post(action, body) {\n                const fd = new FormData();\n                fd.append('action', action);\n                fd.append('nonce', window.utAuth.nonce);\n                for (const k in body) fd.append(k, body[k]);\n                const res = await fetch(window.utAuth.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: fd });\n                return res.json();\n            },\n\n            async activate() {\n                this.hint = '';\n                if (!\/^[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}$\/.test(this.key)) {\n                    this.hint = 'Please enter the full 16-character license key.';\n                    return;\n                }\n                \/\/ Regex rather than a length comparison. A bare less-than sign in an\n                \/\/ inline block script makes WordPress' HTML splitter read it as the\n                \/\/ start of a tag, lose track of the script element, and texturize the\n                \/\/ rest of the JS \u2014 which encodes every ampersand pair and breaks the\n                \/\/ whole component. Mirrors ut_license_sn_valid() server-side.\n                if (!\/^[A-Za-z0-9-]{4,32}$\/.test(this.sn.trim())) {\n                    this.hint = 'Please enter the serial number of your product.';\n                    return;\n                }\n                if (!this.guestEmailReady()) return;\n\n                this.busy = true;\n                this.showFail = false;\n                try {\n                    const data = await this.post('ut_activate_license', {\n                        key: this.key,\n                        sn_num: this.sn.trim(),\n                        token: this.token,\n                        email: this.loggedIn ? '' : this.email.trim()\n                    });\n                    if (data.success) {\n                        this.singleRecord = data.data.record;\n                        this.token = data.data.token || this.token;\n                        \/\/ Signed-in customers keep the design's copy; a guest is\n                        \/\/ told what actually happened to their only copy.\n                        this.successNote = this.loggedIn\n                            ? 'Your activation record has been created. Please download and save your .lic file immediately. This file is required to unlock your software features.'\n                            : (data.data.message || '');\n                        this.successMode = 'single';\n                        this.showSuccess = true;\n                        this.addFiles([data.data.record]);\n                        this.parts = ['', '', '', ''];\n                        this.sn = '';\n                    } else {\n                        this.failMsg = (data.data && data.data.message) || 'Activation failed. Please try again.';\n                        this.showFail = true;\n                    }\n                } catch (e) {\n                    this.failMsg = 'Something went wrong. Please try again.';\n                    this.showFail = true;\n                } finally {\n                    this.busy = false;\n                }\n            },\n\n            \/\/ The design's bulk fields are free text; accept commas, newlines or\n            \/\/ both so a pasted spreadsheet column works as well as the placeholder.\n            splitList(text) {\n                return text.split(\/[\\s,;]+\/).map((s) => s.trim()).filter(Boolean);\n            },\n\n            async activateBulk() {\n                this.hint = '';\n                const keys = this.splitList(this.keysText);\n                const sns = this.splitList(this.snsText);\n\n                if (!keys.length) {\n                    this.hint = 'Enter at least one license key.';\n                    return;\n                }\n                if (keys.length !== sns.length) {\n                    this.hint = 'The number of keys must match the number of serial numbers, in the same order.';\n                    return;\n                }\n                for (const k of keys) {\n                    if (!\/^[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}$\/.test(k)) {\n                        this.hint = 'Invalid key format: ' + k;\n                        return;\n                    }\n                }\n                if (!this.guestEmailReady()) return;\n\n                const items = keys.map((key, i) => ({ key, sn_num: sns[i] }));\n\n                this.busy = true;\n                this.showFail = false;\n                try {\n                    const data = await this.post('ut_license_batch', {\n                        items: JSON.stringify(items),\n                        token: this.token,\n                        email: this.loggedIn ? '' : this.email.trim()\n                    });\n                    if (data.success) {\n                        this.bulkRecords = data.data.records || [];\n                        this.bulkErrors = data.data.errors || [];\n                        this.token = data.data.token || this.token;\n                        if (this.bulkRecords.length) {\n                            this.successNote = this.loggedIn\n                                ? 'Saved to your account \u2014 you can re-download these at any time.'\n                                : (data.data.emailed\n                                    ? 'The .lic files are on their way to your inbox.'\n                                    : 'We could not email the files. Please download them now and keep them safe.');\n                            this.successMode = 'bulk';\n                            this.showSuccess = true;\n                            this.addFiles(this.bulkRecords);\n                            this.keysText = '';\n                            this.snsText = '';\n                        } else {\n                            this.failMsg = (this.bulkErrors[0] && this.bulkErrors[0].error_message) || 'Activation failed. Please try again.';\n                            this.showFail = true;\n                        }\n                    } else {\n                        this.failMsg = (data.data && data.data.message) || 'Activation failed. Please try again.';\n                        this.showFail = true;\n                    }\n                } catch (e) {\n                    this.failMsg = 'Something went wrong. Please try again.';\n                    this.showFail = true;\n                } finally {\n                    this.busy = false;\n                }\n            },\n\n            async sendToEmail() {\n                this.mailNote = '';\n                if (!this.files.length) return;\n                if (!this.loggedIn && !\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(this.email.trim())) {\n                    this.mailNote = 'Please enter your email address in the form above first.';\n                    return;\n                }\n\n                this.mailing = true;\n                try {\n                    const data = await this.post('ut_license_email', {\n                        token: this.token,\n                        license_ids: JSON.stringify(this.files.map((f) => f.licenseId)),\n                        email: this.loggedIn ? '' : this.email.trim()\n                    });\n                    this.mailNote = (data.data && data.data.message)\n                        ? data.data.message\n                        : 'Something went wrong. Please try again.';\n                } catch (e) {\n                    this.mailNote = 'Something went wrong. Please try again.';\n                } finally {\n                    this.mailing = false;\n                }\n            },\n\n            download(r) {\n                if (!r || !r.xml) return;\n                const blob = new Blob([r.xml], { type: 'application\/xml' });\n                const url = URL.createObjectURL(blob);\n                const a = document.createElement('a');\n                a.href = url;\n                a.download = ((r.seriesName || 'license').replace(\/[^A-Za-z0-9]+\/g, '_') + '_' + (r.sn || 'license') + '.lic');\n                document.body.appendChild(a);\n                a.click();\n                a.remove();\n                URL.revokeObjectURL(url);\n            },\n\n            \/\/ A guest has no account to continue to; close the modal so they land\n            \/\/ on the download card instead of the sign-in wall.\n            continueAfterBulk() {\n                if (this.loggedIn) {\n                    this.goAccount();\n                    return;\n                }\n                this.showSuccess = false;\n            },\n\n            goAccount() {\n                window.location.href = window.utAuth.accountUrl;\n            }\n        };\n    }\n<\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":23556,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-608","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/pages\/608","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/comments?post=608"}],"version-history":[{"count":2,"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/pages\/608\/revisions"}],"predecessor-version":[{"id":1370,"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/pages\/608\/revisions\/1370"}],"up":[{"embeddable":true,"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/pages\/23556"}],"wp:attachment":[{"href":"https:\/\/uni-trend.visibleone.dev\/de-de\/wp-json\/wp\/v2\/media?parent=608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}