1"use strict";(self.webpackChunkultimate_jekyll=self.webpackChunkultimate_jekyll||[]).push([[5581],{596(e,t,o){var n=o(6451),r=o(8129);o.d(t,["A",0,async function(e,t={}){const s=JSON.parse(JSON.stringify(t)),{getAuth:a}=await Promise.all([o.e(9943),o.e(2052)]).then(o.bind(o,2052)),i=a().currentUser;if(i||console.warn("authorizedFetch: No authenticated user found. Did we fully wait for auth state to be determined?"),s.headers||(s.headers={}),i){const e=await i.getIdToken(!0);s.headers.Authorization=`Bearer ${e}`}const c="complete"===s.output;s.output="complete";const u=await(0,n.A)(e,s);return function(e){const t=e?.["bm-properties"];if(!t?.usage)return;const{current:o,limits:n}=t.usage;if(!o)return;const s=r.A.bindings().getContext().usage||{},a={...s};for(const e of Object.keys(o))a[e]={...s[e],...o[e],limit:n?.[e]||0};r.A.bindings().update({usage:a})}(u.headers),c?u:u.body}])},5581(e,t,o){o.r(t),o.d(t,{init:()=>u,loadData:()=>d,onShow:()=>l});var n=o(200),r=o(596),s=o(8129);const a=["Charged by mistake","Not satisfied with the service","Too expensive","Found a better alternative","Technical issues or bugs","Not using it enough","Billing or payment issue","Other"];let i=null,c=null;async function u(){!function(){const e=document.getElementById("refund-reasons-container");if(!e)return;const t=[...a],o=t.pop(),n=[...p(t),o];e.innerHTML=n.map((e,t)=>`\n <div class="form-check mb-2">\n <input class="form-check-input" type="radio" name="refund_reason" id="refund-reason-${t}" value="${s.A.utilities().escapeHTML(e)}" required>\n <label class="form-check-label" for="refund-reason-${t}">${s.A.utilities().escapeHTML(e)}</label>\n </div>\n `).join("")}(),document.getElementById("refund-form")&&(i=new n.FormManager("#refund-form",{allowResubmit:!1,warnOnUnsavedChanges:!1,submittingText:"Processing refund...",submittedText:"Refund Processed"}),i.on("submit",async({data:e})=>{const t=document.querySelector('input[name="refund_reason"]:checked'),o=t?.value||"";if(!o)throw new Error("Please select a reason for your refund request.");var n;n="submit",gtag("event","refund_action",{action:n}),fbq("trackCustom","RefundAction",{action:n}),ttq.track("ViewContent",{content_id:`refund-${n}`,content_type:"product",content_name:`Refund ${n}`});const a=await(0,r.A)(`${s.A.getApiUrl()}/backend-manager/payments/refund`,{method:"POST",timeout:3e4,response:"json",body:{confirmed:!0,reason:o,feedback:e.feedback||""}});if(a.error)throw new Error(a.message||"Failed to process refund.");const c=a.refund||{},u=c.amount?new Intl.NumberFormat("en-US",{style:"currency",currency:(c.currency||"usd").toUpperCase()}).format(c.amount):"",d=c.full?"full":"prorated",l=u?`Your ${d} refund of ${u} has been processed. Your subscription has been cancelled.`:"Your refund has been processed. Your subscription has been cancelled.";i.showSuccess(l)}))}async function d(e){c=e,f(e)}function l(){c&&f(c)}function f(e){const t=e?.subscription||{},o=s.A.auth().resolveSubscription(e),n="basic"!==t.product?.id&&!!t.product?.id&&("cancelled"===t.status||o.cancelling),r=document.getElementById("refund-eligible"),a=document.getElementById("refund-ineligible");r&&r.classList.toggle("d-none",!n),a&&a.classList.toggle("d-none",n)}function p(e){for(let t=e.length-1;t>0;t--){const o=Math.floor(Math.random()*(t+1));[e[t],e[o]]=[e[o],e[t]]}return e}},6451(e,t,o){o.d(t,{A:()=>c});var n=(e=>"undefined"!=typeof require?require:"undefined"!=typeof Proxy?new Proxy(e,{get:(e,t)=>("undefined"!=typeof require?require:e)[t]}):e)(function(e){if("undefined"!=typeof require)return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});function r(e){const t={};return e&&e.headers?(e.headers.forEach(function(e,o){try{t[o]=JSON.parse(e)}catch(n){t[o]=e}}),t):t}function s(e,t,o){return"body"===o.output?t:{status:e.status,headers:r(e),body:t}}function a(e){return new Promise(function(t){setTimeout(t,e)})}async function i(e,t){const o=function(e,t){if(!(e=e||t.url))throw new Error("No URL provided.");return(t=t||{}).timeout=t.timeout||6e4,t.tries=void 0===t.tries?1:t.tries,t.log=void 0!==t.log&&t.log,t.method=(t.method||"get").toLowerCase(),t.cacheBreaker=void 0===t.cacheBreaker||t.cac
1heBreaker,t.contentType=(void 0===t.contentType?"":t.contentType).toLowerCase(),t.response=(void 0===t.response?"raw":t.response).toLowerCase(),t.output=void 0===t.output?"body":t.output,t.authorization=void 0!==t.authorization&&t.authorization,t.attachResponseHeaders=void 0!==t.attachResponseHeaders&&t.attachResponseHeaders,t.download=t.download||!1,t.headers=t.headers||{},t.query=t.query||{},t.body=t.body||null,{url:e,options:t}}(e,t);e=o.url,t=o.options;const{url:i,config:c}=function(e,t){const o=t.body&&"object"==typeof t.body,n=o&&"function"==typeof t.body.append,r={method:t.method.toUpperCase(),headers:{...t.headers},body:null};if(t.body&&(r.body=n?t.body:o?JSON.stringify(t.body):t.body),(o&&!n||"json"===t.contentType)&&(r.headers["Content-Type"]="application/json"),"GET"===r.method&&(delete r.body,delete r.headers["Content-Type"]),t.authorization){const e=t.authorization;r.headers.Authorization=e.match(/^Bearer |^Basic |^Digest /)?e:`Bearer ${e}`}const s=new URL(e);Object.keys(t.query).forEach(function(e){s.searchParams.set(e,t.query[e])});const a=!0===t.cacheBreaker?Math.floor(Date.now()/1e3):t.cacheBreaker;return a&&s.searchParams.set("cb",a),t.log&&console.log("Fetch configuration:",{bodyIsFormData:n,bodyIsObject:o,options:t,config:r}),{url:s.toString(),config:r}}(e,t);return async function(e,t){const o=t.tries,n=0===o;let r;for(let s=1;n||s<=o;s++){if(s>1){const e=Math.min(3e3*(s-1),6e4);await a(e)}let i,c;t.log&&console.log(`Fetch (${s}/${t.tries}): attempt`),t.timeout>0&&(i=new AbortController,c=setTimeout(function(){i.abort()},t.timeout));try{const t=await e(i?i.signal:void 0);return clearTimeout(c),t}catch(e){if(clearTimeout(c),r="AbortError"===e.name?new Error("Request timed out"):e,!n&&s>=o)throw r}}}(async function(e){const o={...c};e&&(o.signal=e);const a="undefined"!=typeof window&&window.fetch||globalThis.fetch;t.log&&console.log("Fetching:",i);const u=await a(i,o);if(u.ok&&t.download){const e=await function(e,t){const{Readable:o}=n("stream"),r=n("fs-jetpack"),s=n("mime-types"),a=n("path");return new Promise(function(n,i){const c=e.headers.get("content-type"),u=(s.extension(c)||"").replace("jpeg","jpg");if(!r.exists(t.download)){const e=a.dirname(t.download);r.dir(e)}a.extname(t.download)||(t.download+=`.${u}`);const d=o.fromWeb(e.body),l=r.createWriteStream(t.download);d.pipe(l),d.on("error",function(e){i(new Error(`Failed to download: ${e}`))}),l.on("finish",function(){n({res:e,path:t.download})})})}(u,t);return s(u,e,t)}if(!u.ok){const e=await function(e,t){const o=r(e);return e.text().then(function(n){const r=new Error(n||e.statusText||"Unknown error");if(r.status=e.status,o["bm-properties"])try{Object.keys(o["bm-properties"]).forEac
1h(function(e){r[e]=o["bm-properties"][e]})}catch(e){console.warn("Failed to add bm-properties to error object",e)}return t.attachResponseHeaders&&Object.keys(o).forEach(function(e){"bm-properties"!==e&&(r[e]=o[e])}),r})}(u,t);throw e}const d=await async function(e,t){if("raw"===t.response)return e;const o=await e.text();if("json"===t.response)try{return JSON.parse(o)}catch(e){throw new Error(`Response is not JSON: ${e}`)}return o}(u,t);return s(u,d,t)},t)}"undefined"!=typeof window&&(window.WonderfulFetch=i);var c=i}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.