{"version":3,"file":"WithEmailAndDemo.C2kZ-3kl.mjs","names":[],"sources":["https:/framerusercontent.com/modules/DZUJunl9bI6yiknbAiu3/rAwShlIn7Du1dj7GpGL3/WithEmailAndDemo.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect}from\"react\";import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";/**\n * @framerDisableUnlink\n * @framerIntrinsicWidth 100\n * @framerIntrinsicHeight 100\n */// ─── Shared store ─────────────────────────────────────────────────────────────\n// Persists the captured email across pages so /book-a-demo/onboard can prefill\nconst useStore=createStore({email:\"\",calendlyURL:\"https://calendly.com/thomas-747/jimo-intro-call?hide_gdpr_banner=1&hide_event_type_details=1\",formFieldsValid:false});// ─── Utility ──────────────────────────────────────────────────────────────────\n/**\n * Sets a React-controlled input's value by using the native prototype setter\n * and dispatching a non-bubbling event so React reconciles without triggering\n * sibling/parent listeners.\n */function setNativeInputValue(input,value){const proto=input instanceof HTMLTextAreaElement?window.HTMLTextAreaElement.prototype:window.HTMLInputElement.prototype;const nativeSetter=Object.getOwnPropertyDescriptor(proto,\"value\")?.set;if(nativeSetter){nativeSetter.call(input,value);}else{input.value=value;}// Non-bubbling — updates React state for this field only, won't re-trigger\n// handlers on parent/sibling elements\ninput.dispatchEvent(new Event(\"input\",{bubbles:false}));input.dispatchEvent(new Event(\"change\",{bubbles:false}));}// ─── Shared email domain blocklist ────────────────────────────────────────────\nconst blockedEmailDomains=[\"gmail\",\"yahoo\",\"hotmail\",\"outlook\",\"live\",\"aol\",\"icloud\",\"mail\",\"protonmail\",\"zoho\",\"test\",\"gmai\",\"msn\",\"yandex\",\"gmx\",\"aim\",\"inbox\",\"example\",\"gmail.com\",\"10minutemail\",\"guerrillamail\",\"mailinator\",\"tempmail\",\"maildrop\",\"yopmail\",\"trashmail\",\"getnada\",\"mailnesia\",\"fakemail\",\"throwawaymail\",\"sharklasers\",\"spamgourmet\",\"moakt\",\"dispostable\",\"mailcatch\",\"mintemail\",\"mytempemail\",\"tempinbox\",\"spam4.me\",\"qq\",\"qq.com\",\"bhuxp.org\",\"volku.org\",\"laxiw.org\"];const emailPattern=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;/**\n * Sets custom validity on the email input — safe to call on every keystroke\n * because it does NOT call reportValidity() which would steal focus.\n */function validateEmailSilent(emailInput,value){const domain=value.split(\"@\")[1];if(value===\"\"){emailInput.setCustomValidity(\"\");}else if(!emailPattern.test(value)){emailInput.setCustomValidity(\"Please input your email in the valid format.\");}else if(domain&&blockedEmailDomains.some(d=>domain.toLowerCase().includes(d.toLowerCase()))){emailInput.setCustomValidity(\"Please only enter your work email.\");}else{emailInput.setCustomValidity(\"\");}}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 1: withEmailCapture\n// Use this on the /book-a-demo page (email-only form).\n// Validates the email field, saves it to the store + URL on submit,\n// then redirects to /book-a-demo/onboard with ?email= in the URL.\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withEmailCapture(Component){return props=>{const[store,setStore]=useStore();useEffect(()=>{const emailInput=document.querySelector(\"input[name='email']\");const formElement=document.querySelector(\"form\");if(!emailInput||!formElement)return;// ── Handlers ────────────────────────────────────────────────────\n/**\n             * On every keystroke: silently validate only.\n             * No DOM writes to other fields → no React re-render loop →\n             * the email field accumulates characters normally.\n             */const handleEmailInput=()=>{const value=emailInput.value;validateEmailSilent(emailInput,value);// ─── DEBUG ───────────────────────────────────────────────────\nconst domain=value.split(\"@\")[1]??null;const isBlocked=domain?blockedEmailDomains.some(d=>domain.toLowerCase().includes(d.toLowerCase())):false;console.group(`📧 [/book-a-demo] Email input — \"${value}\"`);console.log(\"Format valid (regex)   :\",emailPattern.test(value));console.log(\"Domain                 :\",domain??\"(no @ yet)\");console.log(\"Domain blocked         :\",isBlocked);console.log(\"Custom validity msg    :\",emailInput.validationMessage||\"(none — valid)\");console.log(\"checkValidity()        :\",emailInput.checkValidity());console.groupEnd();// ─── END DEBUG ───────────────────────────────────────────────\n};/** On blur: show validation tooltip (safe — user left the field) */const handleEmailBlur=()=>{validateEmailSilent(emailInput,emailInput.value);emailInput.reportValidity();};/**\n             * On submit: validate, save email to store + URL, redirect to\n             * /book-a-demo/onboard with email as a query param.\n             */const handleFormSubmit=event=>{event.preventDefault();validateEmailSilent(emailInput,emailInput.value);if(!formElement.checkValidity()){formElement.reportValidity();return;}const email=emailInput.value.trim();// Save to shared store — withFormValidation on /book-a-demo/onboard\n// reads this on mount to prefill the email field.\n// Navigation is handled by Framer — no redirect here.\nsetStore({email});console.log(\"✅ Email captured in store:\",email);};/** Allow Enter key to submit */const handleKeyDown=event=>{if(event.key===\"Enter\"){event.preventDefault();formElement.dispatchEvent(new Event(\"submit\",{bubbles:true,cancelable:true}));}};// ── Prefill from store (e.g. user navigated back to this page) ──\nif(store.email){setNativeInputValue(emailInput,store.email);validateEmailSilent(emailInput,store.email);console.log(\"Prefilled email from store:\",store.email);}// ── Attach hidden URL params to form ─────────────────────────────\nconst params=new URLSearchParams(window.location.search);params.forEach((value,key)=>{if(key!==\"email\"){let existing=formElement.querySelector(`input[name=\"${key}\"]`);if(existing){existing.value=value;}else{const input=document.createElement(\"input\");input.type=\"hidden\";input.name=key;input.value=value;formElement.appendChild(input);}}});// ── currentPage hidden field ─────────────────────────────────────\nconst pagePath=window.location.pathname===\"/\"?\"Homepage\":window.location.pathname;let pageInput=formElement.querySelector(\"input[name='currentPage']\");if(pageInput){pageInput.value=pagePath;}else{pageInput=document.createElement(\"input\");pageInput.type=\"hidden\";pageInput.name=\"currentPage\";pageInput.value=pagePath;formElement.appendChild(pageInput);}// ── Event listeners ──────────────────────────────────────────────\nemailInput.addEventListener(\"input\",handleEmailInput);emailInput.addEventListener(\"blur\",handleEmailBlur);emailInput.addEventListener(\"keydown\",handleKeyDown);formElement.addEventListener(\"submit\",handleFormSubmit);return()=>{emailInput.removeEventListener(\"input\",handleEmailInput);emailInput.removeEventListener(\"blur\",handleEmailBlur);emailInput.removeEventListener(\"keydown\",handleKeyDown);formElement.removeEventListener(\"submit\",handleFormSubmit);};},[]);return /*#__PURE__*/_jsx(Component,{...props});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 2: withCalendlyURL\n// Inject the dynamic Calendly URL from the store into any component as `url`\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withCalendlyURL(Component){return props=>{const[store]=useStore();return /*#__PURE__*/_jsx(Component,{...props,url:store.calendlyURL});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 3: withNextButton\n// Controls the Next button variant based on form validity\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withNextButton(Component){return props=>{const[store]=useStore();const variant=store.formFieldsValid?\"Small-Arrow\":\"Small Disabled\";return /*#__PURE__*/_jsx(Component,{...props,variant:variant});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 4: withSubmitButton\n// Wrap any button to submit the withFormValidation form.\n// Automatically disabled when the form is invalid, clickable when valid.\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withSubmitButton(Component){return props=>{const[store]=useStore();const handleClick=()=>{if(!store.formFieldsValid)return;const formElement=document.querySelector(\"form\");if(!formElement){console.warn(\"withSubmitButton: no <form> found on page\");return;}// Dispatches a native submit event so Framer's own submit\n// handler fires exactly as if the user pressed Enter\nformElement.dispatchEvent(new Event(\"submit\",{bubbles:true,cancelable:true}));};const variant=store.formFieldsValid?\"Small-Arrow\":\"Small Disabled\";return /*#__PURE__*/_jsx(Component,{...props,variant:variant,onClick:handleClick,style:{...props.style,cursor:store.formFieldsValid?\"pointer\":\"not-allowed\"}});};}// ─────────────────────────────────────────────────────────────────────────────\n// OVERRIDE 5: withFormValidation\n// Use this on the /book-a-demo/onboard page (full form).\n// Prefills the email from store or URL param, validates all fields,\n// auto-populates name/company/domain on blur, updates the Calendly URL.\n// ─────────────────────────────────────────────────────────────────────────────\nexport function withFormValidation(Component){return props=>{const[store,setStore]=useStore();const checkFormValidity=()=>{const emailInput=document.querySelector(\"input[name='email']\");const nameInput=document.querySelector(\"input[name='First Name']\");const lastNameInput=document.querySelector(\"input[name='Last Name']\");const companyInput=document.querySelector(\"input[name='Company Name']\");const isEmailValid=emailInput&&emailInput.value.trim()!==\"\"&&emailInput.checkValidity()&&emailInput.validationMessage===\"\";const isNameValid=nameInput&&nameInput.value.trim()!==\"\";const isLastNameValid=lastNameInput&&lastNameInput.value.trim()!==\"\";const isCompanyValid=companyInput&&companyInput.value.trim()!==\"\";const allFieldsValid=isEmailValid&&isNameValid&&isLastNameValid&&isCompanyValid;setStore({formFieldsValid:allFieldsValid});console.log(\"Form validity updated:\",allFieldsValid);return allFieldsValid;};useEffect(()=>{const phoneInput=document.querySelector(\"input[name='Phone Number']\");const emailInput=document.querySelector(\"input[name='email']\");const domainInput=document.querySelector(\"input[name='Domain']\");const companyInput=document.querySelector(\"input[name='Company Name']\");const nameInput=document.querySelector(\"input[name='First Name']\");const gclidInput=document.querySelector(\"input[name='gclid']\");const lastNameInput=document.querySelector(\"input[name='Last Name']\");const formElement=document.querySelector(`form.${props.className}`);// ── Derived field helpers ────────────────────────────────────────\n// ONLY called on blur or prefill — never during typing.\n// Calling setNativeInputValue mid-keystroke causes Framer to\n// re-render and reset the email field to 1 character.\n// Tracks whether derived fields have already been filled from the\n// current email value. Once filled, we skip re-applying on every\n// subsequent keystroke — only re-apply on blur (when email is final).\n// This prevents setNativeInputValue calls mid-typing from causing\n// Framer to re-render and erase the derived field values.\nlet derivedFieldsAppliedForEmail=\"\";/**\n             * Updates derived fields (name, company, domain) using\n             * setNativeInputValue so React properly commits the new values.\n             *\n             * SKIP if we already applied for this exact email string (prevents\n             * repeated calls mid-typing from triggering re-renders).\n             * force=true bypasses the skip — used on blur and prefill.\n             */const applyDerivedFieldsFromEmail=(email,force=false)=>{const parts=email.split(\"@\");const domain=parts[1]||\"\";// Only derive when domain looks complete (has a dot)\nconst domainLooksComplete=domain.includes(\".\");if(!force&&!domainLooksComplete)return;// Skip if already applied for this exact email — avoids calling\n// setNativeInputValue repeatedly which re-renders and erases values\nif(!force&&derivedFieldsAppliedForEmail===email)return;const companyName=domain.split(\".\")[0];const formattedCompany=companyName.charAt(0).toUpperCase()+companyName.slice(1);const name=parts[0]||\"\";const formattedName=name.charAt(0).toUpperCase()+name.slice(1);if(domainInput)setNativeInputValue(domainInput,domain);if(companyInput)setNativeInputValue(companyInput,formattedCompany);if(nameInput)setNativeInputValue(nameInput,name?formattedName:\"\");// Record which email we last derived from so we skip on next keystroke\nderivedFieldsAppliedForEmail=email;};const updateCalendlyURL=()=>{const gclid=gclidInput?.value??\"\";const email=emailInput?.value??\"\";const name=nameInput?.value??\"\";const newURL=`https://calendly.com/thomas-747/jimo-intro-call?name=${encodeURIComponent(name)}&email=${encodeURIComponent(email)}&gclid=${encodeURIComponent(gclid)}&autofill=true&hide_gdpr_banner=1&hide_event_type_details=1`;setStore({calendlyURL:newURL});};// ── Email handlers ───────────────────────────────────────────────\n/**\n             * ON INPUT: validate silently + update derived fields via direct\n             * .value writes (no events dispatched, no React re-render triggered).\n             * Email field accumulates characters normally.\n             */const handleEmailInput=()=>{if(!emailInput)return;const value=emailInput.value.trim();validateEmailSilent(emailInput,value);applyDerivedFieldsFromEmail(value);// ─── DEBUG ───────────────────────────────────────────────────\nconst domain=value.split(\"@\")[1]??null;const isBlocked=domain?blockedEmailDomains.some(d=>domain.toLowerCase().includes(d.toLowerCase())):false;console.group(`📧 [/onboard] Email input — \"${value}\"`);console.log(\"Raw value (untrimmed)  :\",emailInput.value);console.log(\"Format valid (regex)   :\",emailPattern.test(value));console.log(\"Domain                 :\",domain??\"(no @ yet)\");console.log(\"Domain blocked         :\",isBlocked);console.log(\"Custom validity msg    :\",emailInput.validationMessage||\"(none — valid)\");console.log(\"checkValidity()        :\",emailInput.checkValidity());console.log(\"Name field             :\",nameInput?.value??\"(not found)\");console.log(\"Company field          :\",companyInput?.value??\"(not found)\");console.groupEnd();// ─── END DEBUG ───────────────────────────────────────────────\nsetTimeout(checkFormValidity,100);};/**\n             * ON BLUR: show validation tooltip and save email to store.\n             */const handleEmailBlur=()=>{if(!emailInput)return;const value=emailInput.value.trim();validateEmailSilent(emailInput,value);emailInput.reportValidity();// Reset so applyDerivedFieldsFromEmail re-applies with the final email\nderivedFieldsAppliedForEmail=\"\";applyDerivedFieldsFromEmail(value,true);updateCalendlyURL();// Save to store so /book-a-demo/onboard can read it\nsetStore({email:value});setTimeout(checkFormValidity,100);};// ── Phone handlers ───────────────────────────────────────────────\nconst validatePhoneNumberSilent=()=>{if(!phoneInput)return;const value=phoneInput.value.trim();if(value===\"\"){phoneInput.setCustomValidity(\"\");}else if(/[^\\d+\\s\\-\\(\\)\\.]/g.test(value)){phoneInput.setCustomValidity(\"Invalid format - Only numbers, spaces, +, -, (), and . are allowed.\");}else{phoneInput.setCustomValidity(\"\");}setTimeout(checkFormValidity,100);};const handlePhoneBlur=()=>{validatePhoneNumberSilent();phoneInput?.reportValidity();};// ── Generic field change ─────────────────────────────────────────\nconst handleInputChange=()=>{setTimeout(checkFormValidity,100);};// ── Hidden form fields from URL params ───────────────────────────\nif(formElement){const params=new URLSearchParams(window.location.search);params.forEach((value,key)=>{if(key!==\"email\"){const input=document.createElement(\"input\");input.type=\"hidden\";input.name=key;input.value=value;formElement.appendChild(input);}});}// ── Prefill gclid ────────────────────────────────────────────────\n// TEMPORARILY COMMENTED OUT\n// if (gclidInput) {\n//     const gclidParam = new URLSearchParams(window.location.search).get(\"gclid\")\n//     if (gclidParam) {\n//         setNativeInputValue(gclidInput, gclidParam)\n//         console.log(\"Prefilled gclid:\", gclidParam)\n//     }\n// }\n// ── Prefill email from store ─────────────────────────────────────\n// TEMPORARILY COMMENTED OUT — testing withNextButton form validity\n// if (emailInput && store.email) {\n//     setNativeInputValue(emailInput, store.email)\n//     validateEmailSilent(emailInput, store.email)\n//     applyDerivedFieldsFromEmail(store.email, true)\n//     updateCalendlyURL()\n//     console.log(\"Prefilled email on /onboard from store:\", store.email)\n// }\n// ── Event listeners ──────────────────────────────────────────────\nphoneInput?.addEventListener(\"input\",validatePhoneNumberSilent);phoneInput?.addEventListener(\"blur\",handlePhoneBlur);emailInput?.addEventListener(\"input\",handleEmailInput);emailInput?.addEventListener(\"blur\",handleEmailBlur);nameInput?.addEventListener(\"input\",handleInputChange);nameInput?.addEventListener(\"blur\",handleInputChange);lastNameInput?.addEventListener(\"input\",handleInputChange);lastNameInput?.addEventListener(\"blur\",handleInputChange);companyInput?.addEventListener(\"input\",handleInputChange);companyInput?.addEventListener(\"blur\",handleInputChange);gclidInput?.addEventListener(\"input\",updateCalendlyURL);setTimeout(checkFormValidity,200);// ── Cleanup ──────────────────────────────────────────────────────\nreturn()=>{phoneInput?.removeEventListener(\"input\",validatePhoneNumberSilent);phoneInput?.removeEventListener(\"blur\",handlePhoneBlur);emailInput?.removeEventListener(\"input\",handleEmailInput);emailInput?.removeEventListener(\"blur\",handleEmailBlur);nameInput?.removeEventListener(\"input\",handleInputChange);nameInput?.removeEventListener(\"blur\",handleInputChange);lastNameInput?.removeEventListener(\"input\",handleInputChange);lastNameInput?.removeEventListener(\"blur\",handleInputChange);companyInput?.removeEventListener(\"input\",handleInputChange);companyInput?.removeEventListener(\"blur\",handleInputChange);gclidInput?.removeEventListener(\"input\",updateCalendlyURL);};},[props.className]);return /*#__PURE__*/_jsx(Component,{...props});};}\nexport const __FramerMetadata__ = {\"exports\":{\"withSubmitButton\":{\"type\":\"reactHoc\",\"name\":\"withSubmitButton\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withEmailCapture\":{\"type\":\"reactHoc\",\"name\":\"withEmailCapture\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withNextButton\":{\"type\":\"reactHoc\",\"name\":\"withNextButton\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withFormValidation\":{\"type\":\"reactHoc\",\"name\":\"withFormValidation\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCalendlyURL\":{\"type\":\"reactHoc\",\"name\":\"withCalendlyURL\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./WithEmailAndDemo.map"],"mappings":"wLAWG,SAAS,EAAoB,EAAM,EAAM,CAAC,IAAM,EAAM,aAAiB,oBAAoB,EAAO,oBAAoB,UAAU,EAAO,iBAAiB,UAAgB,EAAa,OAAO,yBAAyB,EAAM,QAAQ,EAAE,IAAO,EAAc,EAAa,KAAK,EAAM,EAAM,CAAO,EAAM,MAAM,EAE9S,EAAM,cAAc,IAAI,MAAM,QAAQ,CAAC,QAAQ,GAAM,CAAC,CAAC,CAAC,EAAM,cAAc,IAAI,MAAM,SAAS,CAAC,QAAQ,GAAM,CAAC,CAAC,CAI7G,SAAS,EAAoB,EAAW,EAAM,CAAC,IAAM,EAAO,EAAM,MAAM,IAAI,CAAC,GAAM,IAAQ,GAAI,EAAW,kBAAkB,GAAG,CAAW,EAAa,KAAK,EAAM,CAAwF,GAAQ,EAAoB,KAAK,GAAG,EAAO,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAE,EAAW,kBAAkB,qCAAqC,CAAO,EAAW,kBAAkB,GAAG,CAApR,EAAW,kBAAkB,+CAA+C,CAMnP,SAAgB,EAAiB,EAAU,CAAC,MAAO,IAAO,CAAC,GAAK,CAAC,EAAM,GAAU,GAAU,CAiBkX,OAjBjX,MAAc,CAAC,IAAM,EAAW,SAAS,cAAc,sBAAsB,CAAO,EAAY,SAAS,cAAc,OAAO,CAAC,GAAG,CAAC,GAAY,CAAC,EAAY,OAKzO,IAAM,MAAqB,CAAC,IAAM,EAAM,EAAW,MAAM,EAAoB,EAAW,EAAM,CAC7G,IAAM,EAAO,EAAM,MAAM,IAAI,CAAC,IAAI,KAAW,EAAU,EAAO,EAAoB,KAAK,GAAG,EAAO,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,GAAM,QAAQ,MAAM,oCAAoC,EAAM,GAAG,CAAC,QAAQ,IAAI,2BAA2B,EAAa,KAAK,EAAM,CAAC,CAAC,QAAQ,IAAI,2BAA2B,GAAQ,aAAa,CAAC,QAAQ,IAAI,2BAA2B,EAAU,CAAC,QAAQ,IAAI,2BAA2B,EAAW,mBAAmB,iBAAiB,CAAC,QAAQ,IAAI,2BAA2B,EAAW,eAAe,CAAC,CAAC,QAAQ,UAAU,EAC5d,MAAoB,CAAC,EAAoB,EAAW,EAAW,MAAM,CAAC,EAAW,gBAAgB,EAGxJ,EAAiB,GAAO,CAAyE,GAAxE,EAAM,gBAAgB,CAAC,EAAoB,EAAW,EAAW,MAAM,CAAI,CAAC,EAAY,eAAe,CAAC,CAAC,EAAY,gBAAgB,CAAC,OAAQ,IAAM,EAAM,EAAW,MAAM,MAAM,CAG/N,EAAS,CAAC,QAAM,CAAC,CAAC,QAAQ,IAAI,6BAA6B,EAAM,EAAyC,EAAc,GAAO,CAAI,EAAM,MAAM,UAAS,EAAM,gBAAgB,CAAC,EAAY,cAAc,IAAI,MAAM,SAAS,CAAC,QAAQ,GAAK,WAAW,GAAK,CAAC,CAAC,GACzP,EAAM,QAAO,EAAoB,EAAW,EAAM,MAAM,CAAC,EAAoB,EAAW,EAAM,MAAM,CAAC,QAAQ,IAAI,8BAA8B,EAAM,MAAM,EACjJ,IAAI,gBAAgB,EAAO,SAAS,OAAO,CAAQ,SAAS,EAAM,IAAM,CAAC,GAAG,IAAM,QAAQ,CAAC,IAAI,EAAS,EAAY,cAAc,eAAe,EAAI,IAAI,CAAC,GAAG,EAAU,EAAS,MAAM,MAAW,CAAC,IAAM,EAAM,SAAS,cAAc,QAAQ,CAAC,EAAM,KAAK,SAAS,EAAM,KAAK,EAAI,EAAM,MAAM,EAAM,EAAY,YAAY,EAAM,IAAK,CACnV,IAAM,EAAS,EAAO,SAAS,WAAW,IAAI,WAAW,EAAO,SAAS,SAAa,EAAU,EAAY,cAAc,4BAA4B,CACiE,OAD7D,EAAW,EAAU,MAAM,GAAe,EAAU,SAAS,cAAc,QAAQ,CAAC,EAAU,KAAK,SAAS,EAAU,KAAK,cAAc,EAAU,MAAM,EAAS,EAAY,YAAY,EAAU,EAC9V,EAAW,iBAAiB,QAAQ,EAAiB,CAAC,EAAW,iBAAiB,OAAO,EAAgB,CAAC,EAAW,iBAAiB,UAAU,EAAc,CAAC,EAAY,iBAAiB,SAAS,EAAiB,KAAW,CAAC,EAAW,oBAAoB,QAAQ,EAAiB,CAAC,EAAW,oBAAoB,OAAO,EAAgB,CAAC,EAAW,oBAAoB,UAAU,EAAc,CAAC,EAAY,oBAAoB,SAAS,EAAiB,GAAK,EAAE,CAAC,CAAqB,EAAK,EAAU,CAAC,GAAG,EAAM,CAAC,EAI3f,SAAgB,EAAgB,EAAU,CAAC,MAAO,IAAO,CAAC,GAAK,CAAC,GAAO,GAAU,CAAC,OAAoB,EAAK,EAAU,CAAC,GAAG,EAAM,IAAI,EAAM,YAAY,CAAC,EAItJ,SAAgB,EAAe,EAAU,CAAC,MAAO,IAAO,CAAC,GAAK,CAAC,GAAO,GAAU,CAAO,EAAQ,EAAM,gBAAgB,cAAc,iBAAiB,OAAoB,EAAK,EAAU,CAAC,GAAG,EAAc,UAAQ,CAAC,EAKlN,SAAgB,EAAiB,EAAU,CAAC,MAAO,IAAO,CAAC,GAAK,CAAC,GAAO,GAAU,CAAO,MAAgB,CAAC,GAAG,CAAC,EAAM,gBAAgB,OAAO,IAAM,EAAY,SAAS,cAAc,OAAO,CAAC,GAAG,CAAC,EAAY,CAAC,QAAQ,KAAK,4CAA4C,CAAC,OAEvQ,EAAY,cAAc,IAAI,MAAM,SAAS,CAAC,QAAQ,GAAK,WAAW,GAAK,CAAC,CAAC,EAAS,EAAQ,EAAM,gBAAgB,cAAc,iBAAiB,OAAoB,EAAK,EAAU,CAAC,GAAG,EAAc,UAAQ,QAAQ,EAAY,MAAM,CAAC,GAAG,EAAM,MAAM,OAAO,EAAM,gBAAgB,UAAU,cAAc,CAAC,CAAC,EAMjT,SAAgB,EAAmB,EAAU,CAAC,MAAO,IAAO,CAAC,GAAK,CAAC,EAAM,GAAU,GAAU,CAAO,MAAsB,CAAC,IAAM,EAAW,SAAS,cAAc,sBAAsB,CAAO,EAAU,SAAS,cAAc,2BAA2B,CAAO,EAAc,SAAS,cAAc,0BAA0B,CAAO,EAAa,SAAS,cAAc,6BAA6B,CAAO,EAAa,GAAY,EAAW,MAAM,MAAM,GAAG,IAAI,EAAW,eAAe,EAAE,EAAW,oBAAoB,GAAS,EAAY,GAAW,EAAU,MAAM,MAAM,GAAG,GAAS,EAAgB,GAAe,EAAc,MAAM,MAAM,GAAG,GAAS,EAAe,GAAc,EAAa,MAAM,MAAM,GAAG,GAAS,EAAe,GAAc,GAAa,GAAiB,EAA+G,OAAhG,EAAS,CAAC,gBAAgB,EAAe,CAAC,CAAC,QAAQ,IAAI,yBAAyB,EAAe,CAAQ,GAsD5M,OAtD6N,MAAc,CAAC,IAAM,EAAW,SAAS,cAAc,6BAA6B,CAAO,EAAW,SAAS,cAAc,sBAAsB,CAAO,EAAY,SAAS,cAAc,uBAAuB,CAAO,EAAa,SAAS,cAAc,6BAA6B,CAAO,EAAU,SAAS,cAAc,2BAA2B,CAAO,EAAW,SAAS,cAAc,sBAAsB,CAAO,EAAc,SAAS,cAAc,0BAA0B,CAAO,EAAY,SAAS,cAAc,QAAQ,EAAM,YAAY,CASl7C,EAA6B,GAOZ,GAA6B,EAAM,EAAM,KAAQ,CAAC,IAAM,EAAM,EAAM,MAAM,IAAI,CAAO,EAAO,EAAM,IAAI,GACrH,EAAoB,EAAO,SAAS,IAAI,CAE9C,GAFkD,CAAC,GAAO,CAAC,GAExD,CAAC,GAAO,IAA+B,EAAM,OAAO,IAAM,EAAY,EAAO,MAAM,IAAI,CAAC,GAAS,EAAiB,EAAY,OAAO,EAAE,CAAC,aAAa,CAAC,EAAY,MAAM,EAAE,CAAO,EAAK,EAAM,IAAI,GAAS,EAAc,EAAK,OAAO,EAAE,CAAC,aAAa,CAAC,EAAK,MAAM,EAAE,CAAI,GAAY,EAAoB,EAAY,EAAO,CAAI,GAAa,EAAoB,EAAa,EAAiB,CAAI,GAAU,EAAoB,EAAU,EAAK,EAAc,GAAG,CAChc,EAA6B,GAAc,MAAsB,CAAC,IAAM,EAAM,GAAY,OAAO,GAAS,EAAM,GAAY,OAAO,GAAS,EAAK,GAAW,OAAO,GAAoO,EAAS,CAAC,YAA9N,wDAAwD,mBAAmB,EAAK,CAAC,SAAS,mBAAmB,EAAM,CAAC,SAAS,mBAAmB,EAAM,CAAC,6DAA0F,CAAC,EAKhZ,MAAqB,CAAC,GAAG,CAAC,EAAW,OAAO,IAAM,EAAM,EAAW,MAAM,MAAM,CAAC,EAAoB,EAAW,EAAM,CAAC,EAA4B,EAAM,CAC7K,IAAM,EAAO,EAAM,MAAM,IAAI,CAAC,IAAI,KAAW,EAAU,EAAO,EAAoB,KAAK,GAAG,EAAO,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,GAAM,QAAQ,MAAM,gCAAgC,EAAM,GAAG,CAAC,QAAQ,IAAI,2BAA2B,EAAW,MAAM,CAAC,QAAQ,IAAI,2BAA2B,EAAa,KAAK,EAAM,CAAC,CAAC,QAAQ,IAAI,2BAA2B,GAAQ,aAAa,CAAC,QAAQ,IAAI,2BAA2B,EAAU,CAAC,QAAQ,IAAI,2BAA2B,EAAW,mBAAmB,iBAAiB,CAAC,QAAQ,IAAI,2BAA2B,EAAW,eAAe,CAAC,CAAC,QAAQ,IAAI,2BAA2B,GAAW,OAAO,cAAc,CAAC,QAAQ,IAAI,2BAA2B,GAAc,OAAO,cAAc,CAAC,QAAQ,UAAU,CAChvB,WAAW,EAAkB,IAAI,EAEZ,MAAoB,CAAC,GAAG,CAAC,EAAW,OAAO,IAAM,EAAM,EAAW,MAAM,MAAM,CAAC,EAAoB,EAAW,EAAM,CAAC,EAAW,gBAAgB,CACrK,EAA6B,GAAG,EAA4B,EAAM,GAAK,CAAC,GAAmB,CAC3F,EAAS,CAAC,MAAM,EAAM,CAAC,CAAC,WAAW,EAAkB,IAAI,EACnD,MAA8B,CAAC,GAAG,CAAC,EAAW,OAAO,IAAM,EAAM,EAAW,MAAM,MAAM,CAAI,IAAQ,GAAI,EAAW,kBAAkB,GAAG,CAAU,oBAAoB,KAAK,EAAM,CAAE,EAAW,kBAAkB,sEAAsE,CAAO,EAAW,kBAAkB,GAAG,CAAE,WAAW,EAAkB,IAAI,EAAS,MAAoB,CAAC,GAA2B,CAAC,GAAY,gBAAgB,EACtb,MAAsB,CAAC,WAAW,EAAkB,IAAI,EAqB9D,OApBG,GAA0B,IAAI,gBAAgB,EAAO,SAAS,OAAO,CAAQ,SAAS,EAAM,IAAM,CAAC,GAAG,IAAM,QAAQ,CAAC,IAAM,EAAM,SAAS,cAAc,QAAQ,CAAC,EAAM,KAAK,SAAS,EAAM,KAAK,EAAI,EAAM,MAAM,EAAM,EAAY,YAAY,EAAM,GAAI,CAmB3P,GAAY,iBAAiB,QAAQ,EAA0B,CAAC,GAAY,iBAAiB,OAAO,EAAgB,CAAC,GAAY,iBAAiB,QAAQ,EAAiB,CAAC,GAAY,iBAAiB,OAAO,EAAgB,CAAC,GAAW,iBAAiB,QAAQ,EAAkB,CAAC,GAAW,iBAAiB,OAAO,EAAkB,CAAC,GAAe,iBAAiB,QAAQ,EAAkB,CAAC,GAAe,iBAAiB,OAAO,EAAkB,CAAC,GAAc,iBAAiB,QAAQ,EAAkB,CAAC,GAAc,iBAAiB,OAAO,EAAkB,CAAC,GAAY,iBAAiB,QAAQ,EAAkB,CAAC,WAAW,EAAkB,IAAI,KACroB,CAAC,GAAY,oBAAoB,QAAQ,EAA0B,CAAC,GAAY,oBAAoB,OAAO,EAAgB,CAAC,GAAY,oBAAoB,QAAQ,EAAiB,CAAC,GAAY,oBAAoB,OAAO,EAAgB,CAAC,GAAW,oBAAoB,QAAQ,EAAkB,CAAC,GAAW,oBAAoB,OAAO,EAAkB,CAAC,GAAe,oBAAoB,QAAQ,EAAkB,CAAC,GAAe,oBAAoB,OAAO,EAAkB,CAAC,GAAc,oBAAoB,QAAQ,EAAkB,CAAC,GAAc,oBAAoB,OAAO,EAAkB,CAAC,GAAY,oBAAoB,QAAQ,EAAkB,GAAK,CAAC,EAAM,UAAU,CAAC,CAAqB,EAAK,EAAU,CAAC,GAAG,EAAM,CAAC,6BAnHprB,IAA6B,IAAqE,CAMvI,EAAS,EAAY,CAAC,MAAM,GAAG,YAAY,+FAA+F,gBAAgB,GAAM,CAAC,CAQjK,EAAoB,0XAAuc,CAAO,EAAa"}