est_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%= 3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job= _alert_digest_01-primary_job_list-0-jobcard_body_text_1741831243&trkEmail= =3Deml-email_job_alert_digest_01-primary_job_list-0-jobcard_body_text_17418= 31243-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken= =3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0= NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZ= mMGZhZTM5ZSwxLDE%3D --------------------------------------------------------- =20 See jobs on LinkedIn: https://www.linkedin.com/comm/jobs/search?f_TPR=3Da1= 765824926-&savedSearchId=3D1741831243&alertAction=3Dviewjobs&origin=3DJOB_A= LERT_EMAIL&originToLandingJobPostings=3D4343737843&lipi=3Durn%3Ali%3Apage%3= Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken= =3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_= 01-primary_job_list-0-see_all_jobs_text_1741831243&trkEmail=3Deml-email_job= _alert_digest_01-primary_job_list-0-see_all_jobs_text_1741831243-null-8qev2= 2~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJ= jYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZD= RkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3= D Other jobs you might be interested in =20 Team Lead, Engineering, Node.js Deel EMEA View job: https://www.linkedin.com/comm/jobs/view/4325513377/?trackingId=3D= r42ihPy2SJy1C0Uk3BRc9A%3D%3D&refId=3DDnRM2yPCSBWsm6R7D77jww%3D%3D&lipi=3Dur= n%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%= 3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job= _alert_digest_01-job_card-0-view_job&trkEmail=3Deml-email_job_alert_digest_= 01-job_card-0-view_job-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9ok= zp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkY= WM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3= MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D --------------------------------------------------------- =20 See similar jobs: https://www.linkedin.com/jobs/collections/similar-jobs?r= eferenceJobId=3D4343737843&origin=3DJOB_ALERT_EMAIL&lipi=3Durn%3Ali%3Apage%= 3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken= =3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_= 01-job~alert-0-see~similar~jobs&trkEmail=3Deml-email_job_alert_digest_01-jo= b~alert-0-see~similar~jobs-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-m= j9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0M= DlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJk= Njg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D Job search smarter with Premium https://www.linkedin.com/comm/premium/products/?upsellOrderOrigin=3Demail_j= ob_alert_digest_taj_upsell&utype=3Djob&lipi=3Durn%3Ali%3Apage%3Aemail_email= _job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDi= fLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-job~alert-= 0-premium~upsell~text&trkEmail=3Deml-email_job_alert_digest_01-job~alert-0-= premium~upsell~text-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3= -om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4= ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM= 0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D =20 ---------------------------------------- This email was intended for Josephine Pfeiffer (Senior Cloud Native Consult= ant @ Red Hat | Open-Source | Infrastructure | Security) Learn why we included this: https://www.linkedin.com/help/linkedin/answer/4= 788?lang=3Den&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0= %2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6= Y41&trk=3Deml-email_job_alert_digest_01-SecurityHelp-0-textfooterglimmer&tr= kEmail=3Deml-email_job_alert_digest_01-SecurityHelp-0-textfooterglimmer-nul= l-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2= ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWF= mNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZS= wxLDE%3D You are receiving Job Alert emails. Manage your job alerts: https://www.linkedin.com/comm/jobs/alerts?lipi=3Du= rn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg= %3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_jo= b_alert_digest_01-footer-0-manage_alerts_button_text&trkEmail=3Deml-email_j= ob_alert_digest_01-footer-0-manage_alerts_button_text-null-8qev22~mj9okzp3~= om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMj= QwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlN= WY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D=20 Unsubscribe: https://www.linkedin.com/job-alert-email-unsubscribe?savedSear= chId=3D1741831243&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%= 3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr5= 6Mu6Y41&ek=3Demail_job_alert_digest_01&e=3D8qev22-mj9okzp3-om&eid=3D8qev22-= mj9okzp3-om&m=3Dunsubscribe&ts=3DfooterGlimmer&li=3D0&t=3Dplh =C2=A0=C2=A0= =C2=B7=C2=A0=C2=A0Help: https://www.linkedin.com/help/linkedin/answer/67?la= ng=3Den&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjN= IiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&tr= k=3Deml-email_job_alert_digest_01-help-0-textfooterglimmer&trkEmail=3Deml-e= mail_job_alert_digest_01-help-0-textfooterglimmer-null-8qev22~mj9okzp3~om-n= ull-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNG= VkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5Z= Dk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D =C2=A9 2025 LinkedIn Corporation, 1zwnj000 West Maude Avenue, Sunnyvale, CA= 94085. LinkedIn and the LinkedIn logo are registered trademarks of LinkedIn. ------=_Part_30182798_1564042163.1765956401981 Content-Type: text/html;charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-ID: html-body <= head> </t= itle> <style> @media (max-width: 512px) { .mercado-container { width: 100% = !important; } } </style> <style> @media (max-width: 480px) { .inline-button, .inline-button tabl= e { display: none !important; } .full-width-button, .full-width-button table { display: table != important; } } </style> <style>body {font-family: -apple-system, system-ui, Blin= kMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, 'Oxygen Sans', Cantarell, 'Droid S= ans', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica= , Arial, sans-serif;}</style> <!--[if mso]><style type=3D"text/css"> </styl= e><![endif]--> <!--[if IE]><style type=3D"text/css"> </style><![endif]--> <= style> @media (max-width: 480px) { .inline-button, .inline-button table { display: none !important; } .full-width-button, .full-width-button table { display: table !important; } } @media (min-width: 512px) { .container { max-width: 512px; } } @media (min-width: 576px) { .container { max-width: 576px; } } @media (min-width: 768px) { .container { max-width: 768px; } } @media (min-width: 992px) { .container { max-width: 992px; } } @media (min-width: 1128px) { .container { max-width: 1128px; } } @media (min-width: 1200px) { .container { max-width: 1200px; } } @media (min-width: 1440px) { .container { max-width: 1440px; } } @media (min-width: 1680px) { .container { max-width: 1680px; } } @media (min-width: 1920px) { .container { max-width: 1920px; } } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 0) rotate(0) skewX(0) skewY(0) scaleX(1) sc= aleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) scaleX(= 1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) scale= X(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 0) rotate(0) skewX(0) skewY(0) scaleX= (1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) s= caleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0)= scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 0) rotate(0) skewX(0) skewY(0) = scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) skew= Y(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) sk= ewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 0) rotate(0) skewX(0) ske= wY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0= ) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX= (0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 0) rotate(0) skewX(= 0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) s= kewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0)= skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 0) rotate(0) = skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotat= e(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rot= ate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 0) rota= te(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss= { transform: translate(-100%, 100%)= rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismi= ss { transform: translate(-100%, 100= %) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dis= miss { transform: translate(-100%, 0= ) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } } } } } } } } } } } } } } } } } } } } } } } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) sca= leY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) s= caleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1)= scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) sca= leX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scale= X(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) sca= leX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(= 0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0)= scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) skewY(= 0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) skewX(0) = skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) sk= ewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX(0) = skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(0) ske= wX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) skewX= (0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0) ske= wX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) rotate(= 0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(0)= skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss { transform: translate(0, 100%) rotate(= 0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dismiss { transform: translate(-100%, 100%) r= otate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismiss= { transform: translate(0, 100%) rot= ate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.banner.dismi= ss { transform: translate(0, 100%) r= otate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.banner.dis= miss { transform: translate(-100%, 1= 00%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media transform: translate(0, = -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); (max-width: 767px) { .notification-toasts.notifica= tion-toasts--top.banner.dismiss { transform: translate(0, -10= 0%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.notifi= cation-toasts--top.banner.dismiss { transform: translate(0, -= 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.noti= fication-toasts--top.banner.dismiss { transform: translate(0,= -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px)= { .notification-toasts.no= tification-toasts--top.banner.dismiss { transform: translate(= 0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767p= x) { .notification-toasts.= notification-toasts--top.banner.dismiss { transform: translat= e(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 76= 7px) { .notification-toast= s.notification-toasts--top.banner.dismiss { transform: transl= ate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: = 767px) { .notification-toa= sts.notification-toasts--top.banner.dismiss { transform: tran= slate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width= : 767px) { .notification-t= oasts.notification-toasts--top.banner.dismiss { transform: tr= anslate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-wid= th: 767px) { .notification= -toasts.notification-toasts--top.banner.dismiss { transform: = translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-w= idth: 767px) { .notificati= on-toasts.notification-toasts--top.banner.dismiss { transform= : translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max= -width: 767px) { .notifica= tion-toasts.notification-toasts--top.banner.dismiss { transfo= rm: translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (m= ax-width: 767px) { .notifi= cation-toasts.notification-toasts--top.banner.dismiss { trans= form: translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media = (max-width: 767px) { .noti= fication-toasts.notification-toasts--top.banner.dismiss { tra= nsform: translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1)= ; } @medi= a (max-width: 767px) { .no= tification-toasts.notification-toasts--top.banner.dismiss { t= ransform: translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(= 1); } @me= dia transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) sca= leY(1); (max-width: 767px) { .= notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY= (1); } @= media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scal= eY(1); = } = @media (min-width: 768px) { = .notification-toasts.banner.dismiss { = transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) scaleX(1= ) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) = scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1= ) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.banner.dismiss { = transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) sc= aleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scal= eX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) sc= aleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.banner.dismiss { = transform: translate(-100%, 100%) rotate(0) skewX(0) skewY= (0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY(0= ) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) skewY= (0) scaleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.banner.dismiss { = transform: translate(-100%, 100%) rotate(0) skewX(0)= skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0) s= kewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skewX(0)= skewY(0) scaleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.banner.dismiss { = transform: translate(-100%, 100%) rotate(0) sk= ewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) skew= X(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0) sk= ewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.banner.dismiss { = transform: translate(-100%, 100%) rotate= (0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate(0= ) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.banner.dismiss { = transform: translate(0, 100%) rotate= (0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.banner.dismiss = { = transform: translate(-100%, 100%) = rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media transform: translate(0, -100%= ) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); (max-width: 767px) { = .notification-toasts.notification-= toasts--top.banner.dismiss { = transform: translate(0, -100%) r= otate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.notificatio= n-toasts--top.banner.dismiss { = transform: translate(0, -100%)= rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.notificat= ion-toasts--top.banner.dismiss { = transform: translate(0, -100= %) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.notific= ation-toasts--top.banner.dismiss { = transform: translate(0, -1= 00%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.notif= ication-toasts--top.banner.dismiss { = transform: translate(0, = -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) = { = .notification-toasts.not= ification-toasts--top.banner.dismiss { = transform: translate(0= , -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px= ) { = .notification-toasts.n= otification-toasts--top.banner.dismiss { = transform: translate= (0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767= px) { = .notification-toasts= .notification-toasts--top.banner.dismiss { = transform: transla= te(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 7= 67px) { = .notification-toas= ts.notification-toasts--top.banner.dismiss { = transform: trans= late(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-width:= 767px) { = .notification-to= asts.notification-toasts--top.banner.dismiss { = transform: tra= nslate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-widt= h: 767px) { = .notification-= toasts.notification-toasts--top.banner.dismiss { = transform: t= ranslate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-wi= dth: 767px) { = .notificatio= n-toasts.notification-toasts--top.banner.dismiss { = transform:= translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (max-= width: 767px) { = .notificat= ion-toasts.notification-toasts--top.banner.dismiss { = transfor= m: translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = @media (ma= x-width: 767px) { = .notific= ation-toasts.notification-toasts--top.banner.dismiss { = transf= orm: translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } = } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } @media visibility: hidden; max-height: 0px; overflow: hidden; screen and (min-width: 1163px) { .base-detail-page__header .nav { margin-left: auto; margin-right: auto; width: 1128px; } .main { width: 1128px; } } @media screen and (max-width: 991px) { @media (max-width: 991px) { .search-bar.isExpanded .search-bar__placeholder { display: none; } .search-bar.isExpanded .base-search-bar__form { display: flex; } position: fixed; top: 0px; bottom: 0px; left: 0px; right: 0px; z-index: 1000; margin-bottom: 0px; height: 100%; background-color: #ffffff; .search-bar.isExpanded .switcher-tabs__cancel-btn, .search-bar.isExpanded .switcher-tabs { display: inherit; } } } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) skewX(0) skewY(0) scaleX(1) sc= aleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) scaleX(= 1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) skewX(0) skewY(0) scaleX(1= ) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) sca= leX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) skewX(0) skewY(0) scal= eX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0)= scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) skewX(0) skewY(0) = scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) skew= Y(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) skewX(0) skewY= (0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) = skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) skewX(0) s= kewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX= (0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) skewX(= 0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) s= kewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 0) rotate(0) sk= ewX(0) skewY(0) scaleX(1) scaleY(1); } @media z-index: -100; min-height: 0px; transform: translate(-100%, 0px) rotate(0) skewX(0) skewY(0) scaleX= (1) scaleY(1); opacity: 0; transition-property: all; transition-duration: 500ms; transition-timing-function: cubic-bezier(0.34, 0, 0.21, 1); (min-width: 768px) { .toast--notification.toast--hidden { transform: translate(-100%, 0px) rotate(0= ) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast--hidden { transform: translate(-100%, 0px) rotate= (0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast--hidden { transform: translate(-100%, 0px) rota= te(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast--hidden { transform: translate(-100%, 0px) ro= tate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast--hidden = { transform: translate(-100%, 0px) = rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast--hidde= n { transform: translate(-100%, 0px= ) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast--hid= den { transform: translate(-100%, 0= px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast--h= idden { transform: translate(-100%,= 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toast-= -hidden { transform: translate(-100= %, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .toast--notification.toas= t--hidden { transform: translate(-1= 00%, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px)= { .toast--notification.to= ast--hidden { transform: translate(= -100%, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768p= x) { .toast--notification.= toast--hidden { transform: translat= e(-100%, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 76= 8px) { .toast--notificatio= n.toast--hidden { transform: transl= ate(-100%, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: = 768px) { .toast--notificat= ion.toast--hidden { transform: tran= slate(-100%, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media transform:= translate(0px, 0) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); opacity: 1; transition-property: all; transition-duration: 560ms; transition-timing-function: cubic-bezier(0.34, 0, 0.21, 1); (max-width: 767px) { .notification-t= oasts.animate { transform: tr= anslate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min-wid= th: 768px) { .notification= -toasts.animate { transform: = translate(0px, 0) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-w= idth: 767px) { .notificati= on-toasts.animate { transform= : translate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (min= -width: 768px) { .notifica= tion-toasts.animate { transfo= rm: translate(0px, 0) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (m= ax-width: 767px) { .notifi= cation-toasts.animate { trans= form: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media = (min-width: 768px) { .noti= fication-toasts.animate { tra= nsform: translate(0px, 0) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @medi= a (max-width: 767px) { .no= tification-toasts.animate { t= ransform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(= 1); } @me= dia (min-width: 768px) { .= notification-toasts.animate { = transform: translate(0px, 0) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(= 1); } @= media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) sca= leY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0) rotate(0) skewX(0) skewY(0) scaleX(1) sca= leY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1)= scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0) rotate(0) skewX(0) skewY(0) scaleX(1)= scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scale= X(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0) rotate(0) skewX(0) skewY(0) scale= X(1) scaleY(1); = } = } = } = } = } = } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) sca= leY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) s= caleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) scale= X(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(= 1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(0) s= caleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) sca= leX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) skewY(= 0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX(0) skewY(0)= scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0) sk= ewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX(0) skew= Y(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) skewX(0= ) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX(0) = skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0) ske= wX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.invisible { transform: translate(0, 100%) rotate(0) skewX= (0) skewY(0) scaleX(1) scaleY(1); } @media (min-width: 768px) { .notification-toasts.invisible { transform: translate(-100%, 100%) rotate(0)= skewX(0) skewY(0) scaleX(1) scaleY(1); } @media transform: translate(0, -100%) rotate(= 0) skewX(0) skewY(0) scaleX(1) scaleY(1); (max-width: 767px) { .notification-toasts.notification-toasts--t= op.invisible { transform: translate(0, -100%) rotate(0) = skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.notification-toasts-= -top.invisible { transform: translate(0, -100%) rotate(0= ) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.notification-toast= s--top.invisible { transform: translate(0, -100%) rotate= (0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.notification-toa= sts--top.invisible { transform: translate(0, -100%) rota= te(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.notification-t= oasts--top.invisible { transform: translate(0, -100%) ro= tate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.notification= -toasts--top.invisible { transform: translate(0, -100%) = rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .notification-toasts.notificati= on-toasts--top.invisible { transform: translate(0, -100%= ) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media z-index: -100; min-height: 0px; transform: translate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1= ) scaleY(1); opacity: 0; transition-property: all; transition-duration: 500ms; transition-timing-function: cubic-bezier(0.34, 0, 0.21, 1); (max-width: 767px) { .toast--notification.toast-no= tification--top.toast--hidden { transform: translate(0, -10= 0%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .toast--notification.toast-= notification--top.toast--hidden { transform: translate(0, -= 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px) { .toast--notification.toas= t-notification--top.toast--hidden { transform: translate(0,= -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767px)= { .toast--notification.to= ast-notification--top.toast--hidden { transform: translate(= 0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 767p= x) { .toast--notification.= toast-notification--top.toast--hidden { transform: translat= e(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: 76= 7px) { .toast--notificatio= n.toast-notification--top.toast--hidden { transform: transl= ate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-width: = 767px) { .toast--notificat= ion.toast-notification--top.toast--hidden { transform: tran= slate(0, -100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media z-index: -= 100; min-height: 0px; transform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1)= scaleY(1); opacity: 0; transition-property: all; transition-duration: 500ms; transition-timing-function: cubic-bezier(0.34, 0, 0.21, 1); (max-width: 767px) { .toast--notific= ation.toast-notification--bottom.toast--hidden { transform: tr= anslate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-wid= th: 767px) { .toast--notif= ication.toast-notification--bottom.toast--hidden { transform: = translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max-w= idth: 767px) { .toast--not= ification.toast-notification--bottom.toast--hidden { transform= : translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (max= -width: 767px) { .toast--n= otification.toast-notification--bottom.toast--hidden { transfo= rm: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media (m= ax-width: 767px) { .toast-= -notification.toast-notification--bottom.toast--hidden { trans= form: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @media = (max-width: 767px) { .toas= t--notification.toast-notification--bottom.toast--hidden { tra= nsform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1); } @medi= a (max-width: 767px) { .to= ast--notification.toast-notification--bottom.toast--hidden { t= ransform: translate(0, 100%) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(1= ); } @me= dia transform: translate(0, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scal= eY(1); opacity: 1; transition-property: all; transition-duration: 560ms; transition-timing-function: cubic-bezier(0.34, 0, 0.21, 1); (max-width: 767px) { .= notification-toasts.animate { = transform: translate(0, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) scaleY(= 1); } @= media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) sca= leY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0, 0px) rotate(0) skewX(0) skewY(0) scaleX(1) sca= leY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scaleX(1)= scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0, 0px) rotate(0) skewX(0) skewY(0) scaleX(1)= scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) scale= X(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0, 0px) rotate(0) skewX(0) skewY(0) scale= X(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(0) s= caleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0, 0px) rotate(0) skewX(0) skewY(0) s= caleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) skewY(= 0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0, 0px) rotate(0) skewX(0) skewY(= 0) scaleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0) sk= ewY(0) scaleX(1) scaleY(1); = } = @media (max-width: 767px) { = .notification-toasts.animate { = transform: translate(0, 0px) rotate(0) skewX(0) sk= ewY(0) scaleX(1) scaleY(1); = } = @media (min-width: 768px) { = .notification-toasts.animate { = transform: translate(0px, 0px) rotate(0) skewX(0= ) skewY(0) scaleX(1) scaleY(1); = } = } = } = } = } = } = } = } = } = } = } = } = } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } @media (-ms-high-contrast: active), (forced-colors: active) { .collapsible-dropdown button { border-style: solid; } } @media (max-width: 767px) { .series-article-body [data-type=3D"entityEmbed"] .pub-entity-img { width: 48px; } } @media (max-width: 767px) { .series-article-body [data-type=3D"entityEmbed"][data-entity-type=3D"orga= nization"] .pub-entity-img img { height: 48px; width: 48px; border-radius: 0px; } } @media (max-width: 767px) { .series-article-body [data-type=3D"entityEmbed"][data-entity-type=3D"memb= er"] .pub-entity-img img { height: 56px; width: 56px; } } @media (max-width: 767px) { .series-article-body [data-type=3D"entityEmbed"] .pub-entity-text { padding-left: 12px; } } @media (max-width: 767px) { .series-article-body [data-type=3D"entityEmbed"] .pub-entity-text h1 { margin-bottom: 2px; font-size: 20px; } } @media (max-width: 767px) { .series-article-body [data-type=3D"entityEmbed"] .pub-entity-text h3 { margin-bottom: 2px; font-size: 20px; } } @media (max-width: 767px) { .series-article-body [data-type=3D"entityEmbed"] .pub-entity-text p { margin-bottom: 2px; font-size: 14px; } } @media (min-width: 992px) { .filter .collapsible-dropdown__list { max-height: 400px; } } @media only screen and (min-width: 30.06em) { .card-cta-container-mobile { display: none !important; width: 0 !important; height: 0 !important; overflow: hidden !important; visibility: hidden !important; } .card-cta-container-desktop { display: block !important; width: auto !important; height: auto !important; visibility: visible !important; overflow: visible !important; } } @media screen and (max-width: 320px) { .games-notification-badge { display: none !important; } } @media (min-width: 512px) { .email-md\:text-sm { font-size: 14px; } .email-md\:text-xl { font-size: 24px; } } </style></head> <body dir=3D"ltr" class=3D"font-sans bg-color-background-ca= nvas w-full m-0 p-0 pt-1" style=3D"-webkit-text-size-adjust: 100%; -ms-text= -size-adjust: 100%; margin: 0px; width: 100%; background-color: #f3f2f0; pa= dding: 0px; padding-top: 8px; font-family: -apple-system, system-ui, BlinkM= acSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Ox= ygen, 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe U= I Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, = Arial, sans-serif;"> <div class=3D"h-0 opacity-0 text-transparent invisible= overflow-hidden w-0 max-h-[0]" style=3D"visibility: hidden; height: 0px; m= ax-height: 0; width: 0px; overflow: hidden; opacity: 0; mso-hide: all;" dat= a-email-preheader=3D"true">Frontify Engineering Team Lead: We're all ab= out helping brands turn ideas into=E2=80=A6</div> <div class=3D"h-0 opacity= -0 text-transparent invisible overflow-hidden w-0 max-h-[0]" style=3D"visib= ility: hidden; height: 0px; max-height: 0; width: 0px; overflow: hidden; op= acity: 0; mso-hide: all;"> =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0= =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 = =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD= =8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD= =8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F= =C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F= =C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F= =C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2= =A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2= =A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0= =CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0= =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0= =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD= =8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD= =8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F= =C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F= =C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F= =C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2= =A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2= =A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0= =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0= =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0= =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD= =8F=C2=A0=CD=8F=C2=A0 =CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD= =8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 =CD= =8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F= =C2=A0=CD=8F=C2=A0=CD=8F=C2=A0=CD=8F=C2=A0 </div> <table role=3D"presentati= on" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width= =3D"512" align=3D"center" class=3D"mercado-container w-[512px] max-w-[512px= ] mx-auto my-0 p-0 " style=3D"-webkit-text-size-adjust: 100%; -ms-text-size= -adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; margin-left: a= uto; margin-right: auto; margin-top: 0px; margin-bottom: 0px; width: 512px;= max-width: 512px; padding: 0px;"> <tbody> <tr> <td style=3D"-webkit-text-s= ize-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-ta= ble-rspace: 0pt;"> <table role=3D"presentation" valign=3D"top" border=3D"0"= cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" class=3D"bg-color-backg= round-container " style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-ad= just: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color:= #ffffff;"> <tbody> <tr> <td class=3D"text-center p-3" style=3D"-webkit-tex= t-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso= -table-rspace: 0pt; padding: 24px; text-align: center;"> <table role=3D"pre= sentation" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" = width=3D"100%" class=3D"min-w-full" style=3D"-webkit-text-size-adjust: 100%= ; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;= min-width: 100%;"> <tbody> <tr> <td align=3D"left" valign=3D"middle" style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt;"> <a href=3D"https://www.linkedin.com/co= mm/feed/?lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIj= NIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56= Mu6Y41&trk=3Deml-email_job_alert_digest_01-header-0-home_glimmer_static= _badging_with_count&trkEmail=3Deml-email_job_alert_digest_01-header-0-h= ome_glimmer_static_badging_with_count-null-8qev22~mj9okzp3~om-null-null&= ;eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkND= AxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N= 2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank= " class=3D"w-[84px]" style=3D"color: #0a66c2; cursor: pointer; display: inl= ine-block; text-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-= size-adjust: 100%; width: 84px;"> <img class=3D"h-[37px] w-[101px]" alt=3D"= LinkedIn" src=3D"https://static.licdn.com/aero-v1/sc/h/2fp5x7ci191mxbdy1eyn= scn59" data-test-header-static-badging-img style=3D"outline: none; text-dec= oration: none; -ms-interpolation-mode: bicubic; height: 37px; width: 101px;= " width=3D"101" height=3D"37"> </a> </td> <td valign=3D"middle" align=3D"ri= ght" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; m= so-table-lspace: 0pt; mso-table-rspace: 0pt;"> <table role=3D"presentation"= valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"a= uto" data-test-header-notification-badges style=3D"-webkit-text-size-adjust= : 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace= : 0pt;"> <tbody> <tr> <td align=3D"right" valign=3D"middle" class=3D"px-0.5= " style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-= table-lspace: 0pt; mso-table-rspace: 0pt; padding-left: 4px; padding-right:= 4px;"> <a href=3D"https://www.linkedin.com/comm/messaging/?lipi=3Durn%3Ali= %3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&= amp;midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-ema= il_job_alert_digest_01-header-0-messaging_glimmer&trkEmail=3Deml-email_= job_alert_digest_01-header-0-messaging_glimmer-null-8qev22~mj9okzp3~om-null= -null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjM= jQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNl= NWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target= =3D"_blank" class=3D"h-[25px]" style=3D"color: #0a66c2; cursor: pointer; di= splay: inline-block; text-decoration: none; -webkit-text-size-adjust: 100%;= -ms-text-size-adjust: 100%; height: 25px;"> <img alt=3D"Messaging icon" sr= c=3D"https://static.licdn.com/aero-v1/sc/h/4zo4b28tqisx2lerkp2qoioke" class= =3D"h-[25px]" style=3D"outline: none; text-decoration: none; -ms-interpolat= ion-mode: bicubic; height: 25px;" height=3D"25"> </a> </td> <td align=3D"ri= ght" valign=3D"middle" class=3D"px-0.5" style=3D"-webkit-text-size-adjust: = 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: = 0pt; padding-left: 4px; padding-right: 4px;"> <a href=3D"https://www.linked= in.com/comm/mynetwork/?lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_diges= t_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&mid= Sig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-header-0-my_ne= twork_glimmer&trkEmail=3Deml-email_job_alert_digest_01-header-0-my_netw= ork_glimmer-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&= amp;otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4= ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM= 0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank" class=3D"h-[25px]" style= =3D"color: #0a66c2; cursor: pointer; display: inline-block; text-decoration= : none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; height:= 25px;"> <img alt=3D"Mynetwork icon" src=3D"https://static.licdn.com/aero-v= 1/sc/h/anu0f2h3c0xay9ou5nkdrjk8q" class=3D"h-[25px]" style=3D"outline: none= ; text-decoration: none; -ms-interpolation-mode: bicubic; height: 25px;" he= ight=3D"25"> </a> </td> <td align=3D"right" valign=3D"middle" class=3D"px-0= .5 games-notification-badge pr-1" style=3D"-webkit-text-size-adjust: 100%; = -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; p= adding-left: 4px; padding-right: 8px; display: table-cell;"> <a href=3D"htt= ps://www.linkedin.com/comm/games/zip?lipi=3Durn%3Ali%3Apage%3Aemail_email_j= ob_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqH= DifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-= header-0-games_glimmer&trkEmail=3Deml-email_job_alert_digest_01-header-= 0-games_glimmer-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3= -om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlk= YWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg= 3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank" class=3D"h-[25px]" s= tyle=3D"color: #0a66c2; cursor: pointer; display: inline-block; text-decora= tion: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; hei= ght: 25px;"> <img alt=3D"Games icon" src=3D"https://static.licdn.com/aero-v= 1/sc/h/3lw2d9s3kbqj8uc9fk7nge7lp" class=3D"h-[25px]" style=3D"outline: none= ; text-decoration: none; -ms-interpolation-mode: bicubic; height: 25px;" he= ight=3D"25"> </a> </td> <td align=3D"right" valign=3D"middle" class=3D"px-0= .5" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; ms= o-table-lspace: 0pt; mso-table-rspace: 0pt; padding-left: 4px; padding-righ= t: 4px;"> <a href=3D"https://www.linkedin.com/comm/notifications/?lipi=3Dur= n%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%= 3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3De= ml-email_job_alert_digest_01-header-0-notifications_glimmer&trkEmail=3D= eml-email_job_alert_digest_01-header-0-notifications_glimmer-null-8qev22~mj= 9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTA= xYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNm= YwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxL= DE%3D" target=3D"_blank" class=3D"h-[25px]" style=3D"color: #0a66c2; cursor= : pointer; display: inline-block; text-decoration: none; -webkit-text-size-= adjust: 100%; -ms-text-size-adjust: 100%; height: 25px;"> <img alt=3D"Notif= ications icon" src=3D"https://static.licdn.com/aero-v1/sc/h/eimvvyqypv9ks7z= 164xgby2a5" class=3D"h-[25px]" style=3D"outline: none; text-decoration: non= e; -ms-interpolation-mode: bicubic; height: 25px;" height=3D"25"> </a> </td= > </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> <tr> <t= d class=3D"px-3 pb-3" style=3D"-webkit-text-size-adjust: 100%; -ms-text-siz= e-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; padding-left:= 24px; padding-right: 24px; padding-bottom: 24px;"> <div> <table role=3D"pr= esentation" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0"= width=3D"100%" class=3D"leading-regular" style=3D"-webkit-text-size-adjust= : 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace= : 0pt; line-height: 1.25;"> <tbody> <tr> <td class=3D"job-alert-header" sty= le=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table= -lspace: 0pt; mso-table-rspace: 0pt;"> <h1 class=3D"text-display-sm font-no= rmal leading-regular" data-test-id=3D"email-header" style=3D"margin: 0; fon= t-size: 24px; font-weight: 400; line-height: 1.25;"> <a href=3D"https://www= .linkedin.com/comm/jobs/search?f_TPR=3Da1765824926-&savedSearchId=3D174= 1831243&alertAction=3Dviewjobs&origin=3DJOB_ALERT_EMAIL&originT= oLandingJobPostings=3D4343737843&lipi=3Durn%3Ali%3Apage%3Aemail_email_j= ob_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqH= DifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-= primary_job_list-0-header_1741831243&trkEmail=3Deml-email_job_alert_dig= est_01-primary_job_list-0-header_1741831243-null-8qev22~mj9okzp3~om-null-nu= ll&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQw= NGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY= 5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"= _blank" class=3D"text-system-gray-90" style=3D"cursor: pointer; display: in= line-block; text-decoration: none; -webkit-text-size-adjust: 100%; -ms-text= -size-adjust: 100%; color: #282828;"> Your job alert for <strong class=3D"f= ont-bold" style=3D"font-weight: 600;">system engineering manager</strong> <= /a> </h1> </td> </tr> <tr> <td class=3D"pt-1 job-alert-subheader" style=3D"= -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspac= e: 0pt; mso-table-rspace: 0pt; padding-top: 8px;"> <table role=3D"presentat= ion" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width= =3D"100%" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 10= 0%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt;"> <h2 class=3D"text-md font-normal" data= -test-id=3D"email-subheader" style=3D"margin: 0; font-size: 16px; font-weig= ht: 400;"> A new job in Zurich matches your preferences. </h2> </td> </tr> = </tbody> </table> </td> </tr> <tr> <td class=3D"pt-3" data-test-id=3D"job-c= ard" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; m= so-table-lspace: 0pt; mso-table-rspace: 0pt; padding-top: 24px;"> <table ro= le=3D"presentation" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpaddi= ng=3D"0" width=3D"100%" style=3D"-webkit-text-size-adjust: 100%; -ms-text-s= ize-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <= tr> <td style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%= ; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <table role=3D"presentati= on" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width= =3D"100%" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 10= 0%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt;"> <table role=3D"presentation" valign=3D= "top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td class=3D"pr-1 w-6" va= lign=3D"top" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust:= 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 48px; padding-r= ight: 8px;" width=3D"48"> <a href=3D"https://www.linkedin.com/comm/jobs/vie= w/4343737843/?trackingId=3Dxl8BjwoK2w5E2MIHCQyQvA%3D%3D&refId=3DHlzXRgY= mEHfIaI68d1RCoA%3D%3D&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_di= gest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&= midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-primary_job= _list-0-company_logo_1741831243&trkEmail=3Deml-email_job_alert_digest_0= 1-primary_job_list-0-company_logo_1741831243-null-8qev22~mj9okzp3~om-null-n= ull&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQ= wNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNW= Y5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D= "_blank" style=3D"color: #0a66c2; cursor: pointer; display: inline-block; t= ext-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust:= 100%;"> <img class=3D"inline-block relative bg-color-entity-ghost-backgrou= nd w-6 h-6 rounded-[2px]" src=3D"https://media.licdn.com/dms/image/v2/D4E0B= AQGb6pbcZmqHXg/company-logo_100_100/B4EZW5aT4tH0AU-/0/1742572437423/frontif= y_logo?e=3D1767830400&v=3Dbeta&t=3Daj9_uJRtS6Mbwpl806hQKwErtg_U_bO4= wjCSvPDZGkM" alt=3D"Frontify" style=3D"outline: none; text-decoration: none= ; -ms-interpolation-mode: bicubic; position: relative; display: inline-bloc= k; height: 48px; width: 48px; border-radius: 2px; background-color: #eae6df= ;" width=3D"48" height=3D"48"> </a> </td> <td valign=3D"top" style=3D"-webk= it-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0p= t; mso-table-rspace: 0pt;"> <a href=3D"https://www.linkedin.com/comm/jobs/v= iew/4343737843/?trackingId=3Dxl8BjwoK2w5E2MIHCQyQvA%3D%3D&refId=3DHlzXR= gYmEHfIaI68d1RCoA%3D%3D&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_= digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&am= p;midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-primary_j= ob_list-0-job_posting_1741831243&trkEmail=3Deml-email_job_alert_digest_= 01-primary_job_list-0-job_posting_1741831243-null-8qev22~mj9okzp3~om-null-n= ull&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQ= wNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNW= Y5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D= "_blank" style=3D"color: #0a66c2; cursor: pointer; display: inline-block; t= ext-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust:= 100%;"> <table role=3D"presentation" valign=3D"top" border=3D"0" cellspaci= ng=3D"0" cellpadding=3D"0" width=3D"100%" style=3D"-webkit-text-size-adjust= : 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace= : 0pt;"> <tbody> <tr> <td class=3D"pb-0" style=3D"-webkit-text-size-adjust:= 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace:= 0pt; padding-bottom: 0px;"> <a href=3D"https://www.linkedin.com/comm/jobs/= view/4343737843/?trackingId=3Dxl8BjwoK2w5E2MIHCQyQvA%3D%3D&refId=3DHlzX= RgYmEHfIaI68d1RCoA%3D%3D&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert= _digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&a= mp;midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-primary_= job_list-0-jobcard_body_1741831243&trkEmail=3Deml-email_job_alert_diges= t_01-primary_job_list-0-jobcard_body_1741831243-null-8qev22~mj9okzp3~om-nul= l-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJj= MjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTN= lNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target= =3D"_blank" class=3D"font-bold text-md leading-regular text-system-blue-50"= style=3D"color: #0a66c2; cursor: pointer; display: inline-block; text-deco= ration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; f= ont-size: 16px; font-weight: 600; line-height: 1.25;"> Engineering Team Lea= d </a> </td> </tr> <tr> <td class=3D"pb-0" style=3D"-webkit-text-size-adjus= t: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspac= e: 0pt; padding-bottom: 0px;"> <p class=3D"text-system-gray-100 text-xs lea= ding-regular mt-0.5 line-clamp-1 text-ellipsis" style=3D"margin: 0; font-we= ight: 400; margin-top: 4px; text-overflow: ellipsis; font-size: 12px; line-= height: 1.25; color: #1f1f1f; overflow: hidden; display: -webkit-box; -webk= it-box-orient: vertical; -webkit-line-clamp: 1;"> Frontify · Switzer= land (Remote) </p> </td> </tr> <tr> <td style=3D"-webkit-text-size-adjust: = 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: = 0pt;"> <table role=3D"presentation" valign=3D"top" border=3D"0" cellspacing= =3D"0" cellpadding=3D"0" width=3D"100%" style=3D"-webkit-text-size-adjust: = 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: = 0pt;"> <tbody> <tr> <td style=3D"-webkit-text-size-adjust: 100%; -ms-text-s= ize-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-size: = 0;" align=3D"left"> <!--[if (gte mso 9)|(IE)]><table cellpadding=3D"0" cell= spacing=3D"0" border=3D"0" role=3D"presentation" style=3D"width: 100%;"><![= endif]--> <!--[if (gte mso 9)|(IE)]><tr> <td style=3D"padding-top: 4px;"><!= [endif]--> <table class=3D"inline-block" style=3D"-webkit-text-size-adjust:= 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace:= 0pt; display: inline-block;"> <tr> <td class=3D"job-card-flavor__container= _redesign_shaded_background" style=3D"-webkit-text-size-adjust: 100%; -ms-t= ext-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; margin= -top: 4px; margin-right: 4px; display: inline-block; border-radius: 4px; ba= ckground-color: #f5f7f9; padding: 4px;"> <table role=3D"presentation" valig= n=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" s= tyle=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-tab= le-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td class=3D"pr-0.5 w= -1" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; ms= o-table-lspace: 0pt; mso-table-rspace: 0pt; width: 8px; padding-right: 4px;= " width=3D"8"> <img src=3D"https://static.licdn.com/aero-v1/sc/h/3le24jev2h= ig88cuokev26ksm" alt class=3D"w-2 h-2 block" style=3D"outline: none; text-d= ecoration: none; -ms-interpolation-mode: bicubic; display: block; height: 1= 6px; width: 16px;" width=3D"16" height=3D"16"> </td> <td style=3D"-webkit-t= ext-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; m= so-table-rspace: 0pt;"> <p class=3D"job-card-flavor__detail" style=3D"margi= n: 0; font-weight: 400; font-family: -apple-system, system-ui, BlinkMacSyst= emFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Fira Sans', Ubuntu, Oxygen, = 'Oxygen Sans', Cantarell, 'Droid Sans', 'Apple Color Emoji', 'Segoe UI Emoj= i', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lucida Grande', Helvetica, Arial,= sans-serif; font-size: 12px; line-height: 1.25; color: #666666;"> Actively= recruiting </p> </td> </tr> </tbody> </table> </td> </tr> </table> <!--[if= (gte mso 9)|(IE)]></td> </tr><![endif]--> <!--[if (gte mso 9)|(IE)]><table= cellpadding=3D"0" cellspacing=3D"0" border=3D"0" role=3D"presentation" sty= le=3D"width: 100%;"><![endif]--> </td> </tr> </tbody> </table> </td> </tr> = </tbody> </table> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> <= /table> </td> </tr> </tbody> </table> </td> </tr> <tr> <td class=3D"pt-3 te= xt-left" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100= %; mso-table-lspace: 0pt; mso-table-rspace: 0pt; padding-top: 24px; text-al= ign: left;"> <table role=3D"presentation" valign=3D"top" border=3D"0" cells= pacing=3D"0" cellpadding=3D"0" width=3D"100%" class=3D"email-button " data-= test-id=3D"email-button" style=3D"-webkit-text-size-adjust: 100%; -ms-text-= size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> = <tr> <td valign=3D"middle" align=3D"left" style=3D"-webkit-text-size-adjust= : 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace= : 0pt;"> <a href=3D"https://www.linkedin.com/comm/jobs/search?f_TPR=3Da1765= 824926-&savedSearchId=3D1741831243&alertAction=3Dviewjobs&origi= n=3DJOB_ALERT_EMAIL&originToLandingJobPostings=3D4343737843&lipi=3D= urn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDx= g%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk= =3Deml-email_job_alert_digest_01-primary_job_list-0-see_all_jobs_button_174= 1831243&trkEmail=3Deml-email_job_alert_digest_01-primary_job_list-0-see= _all_jobs_button_1741831243-null-8qev22~mj9okzp3~om-null-null&eid=3D8qe= v22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4= OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZ= iNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank" aria-lab= el=3D"See jobs" class=3D"align-top no-underline " style=3D"color: #0a66c2; = cursor: pointer; display: inline-block; text-decoration: none; -webkit-text= -size-adjust: 100%; -ms-text-size-adjust: 100%; vertical-align: top; text-d= ecoration-line: none;"> <table role=3D"presentation" valign=3D"top" border= =3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"auto" class=3D"border-s= eparate " style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 10= 0%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-collapse: separate= ;"> <tbody> <tr> <td class=3D"btn-md btn-primary border-color-brand button-= link leading-regular !min-h-[auto] !shadow-none border-1 border-solid" styl= e=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-= lspace: 0pt; mso-table-rspace: 0pt; height: min-content; border-radius: 24p= x; padding-top: 12px; padding-bottom: 12px; padding-left: 24px; padding-rig= ht: 24px; text-align: center; font-size: 16px; font-weight: 600; cursor: po= inter; text-decoration-line: none; background-color: #0a66c2; color: #fffff= f; border-width: 1px; border-style: solid; border-color: #0a66c2; line-heig= ht: 1.25; min-height: auto !important; box-shadow: 0 0 #0000, 0 0 #0000, 0 = 0 #0000 !important;"> <a href=3D"https://www.linkedin.com/comm/jobs/search?= f_TPR=3Da1765824926-&savedSearchId=3D1741831243&alertAction=3Dviewj= obs&origin=3DJOB_ALERT_EMAIL&originToLandingJobPostings=3D434373784= 3&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIi= TLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6= Y41&trk=3Deml-email_job_alert_digest_01-primary_job_list-0-see_all_jobs= _button_1741831243&trkEmail=3Deml-email_job_alert_digest_01-primary_job= _list-0-see_all_jobs_button_1741831243-null-8qev22~mj9okzp3~om-null-null&am= p;eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkN= DAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0= N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blan= k" tabindex=3D"-1" aria-hidden=3D"true" class=3D"no-underline" style=3D"col= or: #0a66c2; cursor: pointer; display: inline-block; text-decoration: none;= -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; text-decoratio= n-line: none;"> <span class=3D"no-underline text-white" style=3D"color: #ff= ffff; text-decoration-line: none;"> See jobs </span> </a> </td> </tr> </tbo= dy> </table> </a> </td> </tr> </tbody> </table> </td> </tr> <tr> <td class= =3D"pt-4" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 10= 0%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; padding-top: 32px;"> <hr = class=3D"bg-[#D9D9D9] border-0 h-[1px] m-0" style=3D"margin: 0px; height: 1= px; border-width: 0; background-color: #D9D9D9;"> </td> </tr> <tr> <td clas= s=3D"pt-3" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 1= 00%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; padding-top: 24px;"> <h1= class=3D"text-display-sm font-normal leading-regular text-system-gray-90" = style=3D"margin: 0; font-size: 24px; font-weight: 400; line-height: 1.25; c= olor: #282828;"> Other jobs you might be interested in </h1> </td> </tr> <t= r> <td class=3D"pt-3" data-test-id=3D"job-card-continuous-discovery" style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt; padding-top: 24px;"> <table role=3D"pres= entation" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" w= idth=3D"100%" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust= : 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td st= yle=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-tabl= e-lspace: 0pt; mso-table-rspace: 0pt;"> <table role=3D"presentation" valign= =3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" st= yle=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-tabl= e-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td style=3D"-webkit-t= ext-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; m= so-table-rspace: 0pt;"> <table role=3D"presentation" valign=3D"top" border= =3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" style=3D"-webkit-= text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; = mso-table-rspace: 0pt;"> <tbody> <tr> <td class=3D"pr-1 w-6" valign=3D"top"= style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-t= able-lspace: 0pt; mso-table-rspace: 0pt; width: 48px; padding-right: 8px;" = width=3D"48"> <a href=3D"https://www.linkedin.com/comm/jobs/view/4325513377= /?trackingId=3Dr42ihPy2SJy1C0Uk3BRc9A%3D%3D&refId=3DDnRM2yPCSBWsm6R7D77= jww%3D%3D&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0= %2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4= KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-job_card-0-company_logo= &trkEmail=3Deml-email_job_alert_digest_01-job_card-0-company_logo-null-= 8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMT= cwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0O= DUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZh= ZTM5ZSwxLDE%3D" target=3D"_blank" style=3D"color: #0a66c2; cursor: pointer;= display: inline-block; text-decoration: none; -webkit-text-size-adjust: 10= 0%; -ms-text-size-adjust: 100%;"> <img class=3D"inline-block relative bg-co= lor-entity-ghost-background w-6 h-6 rounded-[2px]" src=3D"https://media.lic= dn.com/dms/image/v2/D560BAQEFXl5JlEEmUg/company-logo_100_100/B56ZikukJoHMAU= -/0/1755110327795/deel_logo?e=3D1767830400&v=3Dbeta&t=3Djsad7RWRNpT= 8xaQdPjcsXZVEgLMg6kq6klMg64nr2zU" alt=3D"Deel" style=3D"outline: none; text= -decoration: none; -ms-interpolation-mode: bicubic; position: relative; dis= play: inline-block; height: 48px; width: 48px; border-radius: 2px; backgrou= nd-color: #eae6df;" width=3D"48" height=3D"48"> </a> </td> <td valign=3D"to= p" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso= -table-lspace: 0pt; mso-table-rspace: 0pt;"> <a href=3D"https://www.linkedi= n.com/comm/jobs/view/4325513377/?trackingId=3Dr42ihPy2SJy1C0Uk3BRc9A%3D%3D&= amp;refId=3DDnRM2yPCSBWsm6R7D77jww%3D%3D&lipi=3Durn%3Ali%3Apage%3Aemail= _email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3D= AQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_di= gest_01-job_card-0-job_posting&trkEmail=3Deml-email_job_alert_digest_01= -job_card-0-job_posting-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-= mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNh= ZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU= 1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank" style=3D"col= or: #0a66c2; cursor: pointer; display: inline-block; text-decoration: none;= -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;"> <table role= =3D"presentation" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding= =3D"0" width=3D"100%" style=3D"-webkit-text-size-adjust: 100%; -ms-text-siz= e-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr= > <td class=3D"pb-0" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size= -adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; padding-bottom= : 0px;"> <a href=3D"https://www.linkedin.com/comm/jobs/view/4325513377/?tra= ckingId=3Dr42ihPy2SJy1C0Uk3BRc9A%3D%3D&refId=3DDnRM2yPCSBWsm6R7D77jww%3= D%3D&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIj= NIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56= Mu6Y41&trk=3Deml-email_job_alert_digest_01-job_card-0-jobcard_body&= trkEmail=3Deml-email_job_alert_digest_01-job_card-0-jobcard_body-null-8qev2= 2~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE= 2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNW= FmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5Z= SwxLDE%3D" target=3D"_blank" class=3D"font-bold text-md leading-regular tex= t-system-blue-50" style=3D"color: #0a66c2; cursor: pointer; display: inline= -block; text-decoration: none; -webkit-text-size-adjust: 100%; -ms-text-siz= e-adjust: 100%; font-size: 16px; font-weight: 600; line-height: 1.25;"> Tea= m Lead, Engineering, Node.js </a> </td> </tr> <tr> <td class=3D"pb-0" style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt; padding-bottom: 0px;"> <p class=3D"text-= system-gray-100 text-xs leading-regular mt-0.5 line-clamp-1 text-ellipsis" = style=3D"margin: 0; font-weight: 400; margin-top: 4px; text-overflow: ellip= sis; font-size: 12px; line-height: 1.25; color: #1f1f1f; overflow: hidden; = display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1;"= > Deel · EMEA (Remote) </p> </td> </tr> <tr> <td style=3D"-webkit-te= xt-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; ms= o-table-rspace: 0pt;"> <table role=3D"presentation" valign=3D"top" border= =3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" style=3D"-webkit-= text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; = mso-table-rspace: 0pt;"> <tbody> <tr> <td style=3D"-webkit-text-size-adjust= : 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace= : 0pt; font-size: 0;" align=3D"left"> <!--[if (gte mso 9)|(IE)]><table cell= padding=3D"0" cellspacing=3D"0" border=3D"0" role=3D"presentation" style=3D= "width: 100%;"><![endif]--> <!--[if (gte mso 9)|(IE)]><table cellpadding=3D= "0" cellspacing=3D"0" border=3D"0" role=3D"presentation" style=3D"width: 10= 0%;"><![endif]--> </td> </tr> </tbody> </table> </td> </tr> </tbody> </tabl= e> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> <= /tr> </tbody> </table> </td> </tr> <tr> <td class=3D"pt-3 pb-1" style=3D"-w= ebkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace:= 0pt; mso-table-rspace: 0pt; padding-top: 24px; padding-bottom: 8px;"> <tab= le role=3D"presentation" valign=3D"top" border=3D"0" cellspacing=3D"0" cell= padding=3D"0" width=3D"100%" class=3D"email-button " data-test-id=3D"email-= button" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%= ; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td valign= =3D"middle" align=3D"left" style=3D"-webkit-text-size-adjust: 100%; -ms-tex= t-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <a hre= f=3D"https://www.linkedin.com/jobs/collections/similar-jobs?referenceJobId= =3D4343737843&origin=3DJOB_ALERT_EMAIL&lipi=3Durn%3Ali%3Apage%3Aema= il_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken= =3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert= _digest_01-job~alert-0-see~similar~jobs&trkEmail=3Deml-email_job_alert_= digest_01-job~alert-0-see~similar~jobs-null-8qev22~mj9okzp3~om-null-null&am= p;eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkN= DAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0= N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blan= k" aria-label=3D"See similar jobs" class=3D"align-top no-underline " style= =3D"color: #0a66c2; cursor: pointer; display: inline-block; text-decoration= : none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; vertica= l-align: top; text-decoration-line: none;"> <table role=3D"presentation" va= lign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"auto= " class=3D"border-separate " style=3D"-webkit-text-size-adjust: 100%; -ms-t= ext-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border= -collapse: separate;"> <tbody> <tr> <td class=3D"btn-md btn-secondary-empha= sis border-color-brand button-link leading-regular !min-h-[auto] !shadow-no= ne border-1 border-solid" style=3D"-webkit-text-size-adjust: 100%; -ms-text= -size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; height: m= in-content; border-radius: 24px; padding-top: 12px; padding-bottom: 12px; p= adding-left: 24px; padding-right: 24px; text-align: center; font-size: 16px= ; font-weight: 600; cursor: pointer; text-decoration-line: none; background= -color: rgba(0, 0, 0, 0); color: #0a66c2; border-width: 1px; border-style: = solid; border-color: #0a66c2; line-height: 1.25; min-height: auto !importan= t; box-shadow: 0 0 #0000, 0 0 #0000, 0 0 #0000 !important;"> <a href=3D"htt= ps://www.linkedin.com/jobs/collections/similar-jobs?referenceJobId=3D434373= 7843&origin=3DJOB_ALERT_EMAIL&lipi=3Durn%3Ali%3Apage%3Aemail_email_= job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZq= HDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01= -job~alert-0-see~similar~jobs&trkEmail=3Deml-email_job_alert_digest_01-= job~alert-0-see~similar~jobs-null-8qev22~mj9okzp3~om-null-null&eid=3D8q= ev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE= 4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MW= ZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank" tabinde= x=3D"-1" aria-hidden=3D"true" class=3D"no-underline" style=3D"color: #0a66c= 2; cursor: pointer; display: inline-block; text-decoration: none; -webkit-t= ext-size-adjust: 100%; -ms-text-size-adjust: 100%; text-decoration-line: no= ne;"> <span class=3D"no-underline text-color-brand" style=3D"color: #0a66c2= ; text-decoration-line: none;"> See similar jobs </span> </a> </td> </tr> <= /tbody> </table> </a> </td> </tr> </tbody> </table> </td> </tr> <tr data-te= st-id=3D"premium-upsell-divider"> <td class=3D"pt-3" style=3D"-webkit-text-= size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-t= able-rspace: 0pt; padding-top: 24px;"> <hr class=3D"bg-[#D9D9D9] border-0 h= -[1px] m-0" style=3D"margin: 0px; height: 1px; border-width: 0; background-= color: #D9D9D9;"> </td> </tr> <tr data-test-id=3D"premium-upsell"> <td clas= s=3D"pt-3" data-test-id=3D"premium-upsell" style=3D"-webkit-text-size-adjus= t: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspac= e: 0pt; padding-top: 24px;"> <table role=3D"presentation" valign=3D"top" bo= rder=3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" style=3D"-web= kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0= pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td style=3D"-webkit-text-size-ad= just: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rs= pace: 0pt;"> <table role=3D"presentation" valign=3D"top" border=3D"0" cells= pacing=3D"0" cellpadding=3D"0" width=3D"100%" style=3D"-webkit-text-size-ad= just: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rs= pace: 0pt;"> <tbody> <tr> <td align=3D"left" valign=3D"top" class=3D"w-0" s= tyle=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-tab= le-lspace: 0pt; mso-table-rspace: 0pt; width: 0px;" width=3D"0"> <a href=3D= "https://ch.linkedin.com/comm/in/josephine-pfeiffer?lipi=3Durn%3Ali%3Apage%= 3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midT= oken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_a= lert_digest_01-job~alert-0-premium~upsell&trkEmail=3Deml-email_job_aler= t_digest_01-job~alert-0-premium~upsell-null-8qev22~mj9okzp3~om-null-null&am= p;eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkN= DAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0= N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blan= k" style=3D"color: #0a66c2; cursor: pointer; display: inline-block; text-de= coration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;= "> <img class=3D"w-[84px]" alt=3D"Premium icon" src=3D"https://static.licdn= .com/aero-v1/sc/h/6mjomvgg6rdiwm5rnormbdyja" style=3D"outline: none; text-d= ecoration: none; -ms-interpolation-mode: bicubic; width: 84px;" width=3D"84= "> </a> </td> </tr> <tr> <td class=3D"text-center" align=3D"center" style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt; text-align: center;"> <img class=3D"inli= ne-block relative bg-color-entity-ghost-background clip-path-circle-50 roun= ded-full w-16 h-16" src=3D"https://media.licdn.com/dms/image/v2/D4E03AQFWoO= TiggijYQ/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_20= 0_200/0/1709562876820?e=3D2147483647&v=3Dbeta&t=3DzsyATWuQohFmC0ERZ= am96XH7DlLgNIn3ZgWU6SCiEac" alt=3D"Josephine Pfeiffer" style=3D"outline: no= ne; text-decoration: none; -ms-interpolation-mode: bicubic; position: relat= ive; display: inline-block; height: 128px; width: 128px; border-radius: 999= 9px; background-color: #eae6df; clip-path: circle(50%);" width=3D"128" heig= ht=3D"128"> </td> </tr> </tbody> </table> </td> </tr> <tr> <td class=3D"tex= t-lg leading-regular text-center pt-2" style=3D"-webkit-text-size-adjust: 1= 00%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0= pt; padding-top: 16px; text-align: center; font-size: 20px; line-height: 1.= 25;"> Job search smarter with Premium </td> </tr> <tr> <td class=3D"pt-2" s= tyle=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-tab= le-lspace: 0pt; mso-table-rspace: 0pt; padding-top: 16px;"> <table role=3D"= presentation" valign=3D"top" border=3D"0" cellspacing=3D"0" cellpadding=3D"= 0" width=3D"100%" class=3D"email-button " data-test-id=3D"email-button" sty= le=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table= -lspace: 0pt; mso-table-rspace: 0pt;"> <tbody> <tr> <td valign=3D"middle" a= lign=3D"middle" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adju= st: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"> <a href=3D"https:= //www.linkedin.com/comm/premium/products/?upsellOrderOrigin=3Demail_job_ale= rt_digest_taj_upsell&utype=3Djob&lipi=3Durn%3Ali%3Apage%3Aemail_ema= il_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5= JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest= _01-null-0-null&trkEmail=3Deml-email_job_alert_digest_01-null-0-null-nu= ll-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken= =3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0= NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZ= mMGZhZTM5ZSwxLDE%3D" target=3D"_blank" aria-label=3D"Retry Premium for CHF0= " class=3D"align-top no-underline " style=3D"color: #0a66c2; cursor: pointe= r; display: inline-block; text-decoration: none; -webkit-text-size-adjust: = 100%; -ms-text-size-adjust: 100%; vertical-align: top; text-decoration-line= : none;"> <table role=3D"presentation" valign=3D"top" border=3D"0" cellspac= ing=3D"0" cellpadding=3D"0" width=3D"auto" class=3D"border-separate " style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt; border-collapse: separate;"> <tbody> <tr= > <td class=3D"btn-sm btn-secondary !border-[#424242] button-link leading-r= egular !min-h-[auto] !shadow-none border-1 border-solid" style=3D"-webkit-t= ext-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; m= so-table-rspace: 0pt; height: min-content; border-radius: 24px; padding-top= : 7px; padding-bottom: 7px; padding-left: 16px; padding-right: 16px; text-a= lign: center; font-size: 14px; font-weight: 600; cursor: pointer; text-deco= ration-line: none; background-color: rgba(0, 0, 0, 0); color: rgba(0, 0, 0,= 0.75); border-width: 1px; border-style: solid; line-height: 1.25; min-heig= ht: auto !important; border-color: #424242 !important; box-shadow: 0 0 #000= 0, 0 0 #0000, 0 0 #0000 !important;"> <a href=3D"https://www.linkedin.com/c= omm/premium/products/?upsellOrderOrigin=3Demail_job_alert_digest_taj_upsell= &utype=3Djob&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_= 01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSi= g=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-null-0-null&= trkEmail=3Deml-email_job_alert_digest_01-null-0-null-null-8qev22~mj9okzp3~o= m-null-null&eid=3D8qev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzF= jMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZj= hhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" t= arget=3D"_blank" tabindex=3D"-1" aria-hidden=3D"true" class=3D"no-underline= " style=3D"color: #0a66c2; cursor: pointer; display: inline-block; text-dec= oration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; = text-decoration-line: none;"> <span class=3D"no-underline !text-[#424242]" = style=3D"text-decoration-line: none; color: #424242 !important;"> Retry Pre= mium for CHF0 </span> </a> </td> </tr> </tbody> </table> </a> </td> </tr> <= /tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table= > </div> </td> </tr> <tr> <td class=3D"bg-color-background-canvas p-3" styl= e=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-= lspace: 0pt; mso-table-rspace: 0pt; background-color: #f3f2f0; padding: 24p= x;"> <table role=3D"presentation" valign=3D"top" border=3D"0" cellspacing= =3D"0" cellpadding=3D"0" width=3D"100%" style=3D"-webkit-text-size-adjust: = 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: = 0pt;"> <tbody> <tr> <td class=3D"text-center pb-2" style=3D"-webkit-text-si= ze-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-tab= le-rspace: 0pt; padding-bottom: 16px; text-align: center;"> <h2 class=3D"te= xt-lg text-teal-80" style=3D"margin: 0; font-weight: 500; font-size: 20px; = color: #114951;"> Get the new LinkedIn desktop app </h2> </td> </tr> <tr> <= td class=3D"text-center pb-2" data-test-id=3D"footer-app-store-icon" style= =3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-l= space: 0pt; mso-table-rspace: 0pt; padding-bottom: 16px; text-align: center= ;"> <a href=3D"https://apps.microsoft.com/store/detail/9WZDNCRFJ4Q7?launch= =3Dtrue&cid=3Dlinkedin_email_upsell&mode=3Dfull" target=3D"_blank" = rel=3D"noopener noreferrer" style=3D"color: #0a66c2; cursor: pointer; displ= ay: inline-block; text-decoration: none; -webkit-text-size-adjust: 100%; -m= s-text-size-adjust: 100%;"> <img alt=3D"Get it from Microsoft" src=3D"https= ://static.licdn.com/aero-v1/sc/h/ejpkkpwvqks31a3cjqokb7fbm" class=3D"h-[40p= x] w-[112px]" style=3D"outline: none; text-decoration: none; -ms-interpolat= ion-mode: bicubic; height: 40px; width: 112px;" width=3D"112" height=3D"40"= > </a> </td> </tr> <tr> <td class=3D"text-center pb-2" style=3D"-webkit-tex= t-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso= -table-rspace: 0pt; padding-bottom: 16px; text-align: center;"> <h2 class= =3D"text-md text-teal-80" style=3D"margin: 0; font-weight: 500; font-size: = 16px; color: #114951;"> Also available on mobile </h2> </td> </tr> <tr> <td= class=3D"text-center" data-test-id=3D"footer-app-store-icon" style=3D"-web= kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0= pt; mso-table-rspace: 0pt; text-align: center;"> <a href=3D"https://itunes.= apple.com/us/app/linkedin/id288429040?pt=3D10746&ct=3Dst_appsite_flagsh= ip&mt=3D8" target=3D"_blank" rel=3D"noopener noreferrer" style=3D"color= : #0a66c2; cursor: pointer; display: inline-block; text-decoration: none; -= webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;"> <img alt=3D"Do= wnload on the App Store" src=3D"https://static.licdn.com/aero-v1/sc/h/76yzk= d0h5kiv27lrd4yaenylk" class=3D"h-[40px] w-[120px] pr-1" style=3D"outline: n= one; text-decoration: none; -ms-interpolation-mode: bicubic; height: 40px; = width: 120px; padding-right: 8px;" width=3D"120" height=3D"40"> </a> <a hre= f=3D"https://play.google.com/store/apps/details?id=3Dcom.linkedin.android&a= mp;referrer=3Dst_appsite_flagship" target=3D"_blank" rel=3D"noopener norefe= rrer" style=3D"color: #0a66c2; cursor: pointer; display: inline-block; text= -decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 10= 0%;"> <img alt=3D"Get it on Google Play" src=3D"https://static.licdn.com/ae= ro-v1/sc/h/142qudwblp58zwmc9vkqfplug" class=3D"h-[40px] w-[134px]" style=3D= "outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; hei= ght: 40px; width: 134px;" width=3D"134" height=3D"40"> </a> </td> </tr> <tr= > <td class=3D"py-2" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size= -adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; padding-top: 1= 6px; padding-bottom: 16px;"><hr class=3D"border-none bg-[#e0dfdd] h-[1px]" = style=3D"height: 1px; border-style: none; background-color: #e0dfdd;"></td>= </tr> </tbody> </table> <table role=3D"presentation" valign=3D"top" border= =3D"0" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" class=3D"text-xs"= style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-t= able-lspace: 0pt; mso-table-rspace: 0pt; font-size: 12px;"> <tbody> <tr> <t= d class=3D"pb-1 m-0" data-test-id=3D"email-footer__intended" style=3D"-webk= it-text-size-adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0p= t; mso-table-rspace: 0pt; margin: 0px; padding-bottom: 8px;"> This email wa= s intended for Josephine Pfeiffer (Senior Cloud Native Consultant @ Red Hat= | Open-Source | Infrastructure | Security) </td> </tr> <tr> <td class=3D"p= b-1 m-0" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100= %; mso-table-lspace: 0pt; mso-table-rspace: 0pt; margin: 0px; padding-botto= m: 8px;"> <a href=3D"https://www.linkedin.com/help/linkedin/answer/4788?lan= g=3Den&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2B= IjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr= 56Mu6Y41&trk=3Deml-email_job_alert_digest_01-SecurityHelp-0-footerglimm= er&trkEmail=3Deml-email_job_alert_digest_01-SecurityHelp-0-footerglimme= r-null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpTok= en=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMj= A0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmN= TZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank" class=3D"text-inherit underline" s= tyle=3D"cursor: pointer; display: inline-block; text-decoration: none; -web= kit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; color: inherit; tex= t-decoration-line: underline;">Learn why we included this.</a> </td> </tr> = <tr> <td class=3D"pb-1 m-0" style=3D"-webkit-text-size-adjust: 100%; -ms-te= xt-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; margin:= 0px; padding-bottom: 8px;">You are receiving Job Alert emails.</td> </tr> = <tr> <td class=3D"pb-1 m-0" style=3D"-webkit-text-size-adjust: 100%; -ms-te= xt-size-adjust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; margin:= 0px; padding-bottom: 8px;"> <a href=3D"https://www.linkedin.com/comm/jobs/= alerts?lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNI= iTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu= 6Y41&trk=3Deml-email_job_alert_digest_01-footer-0-manage_alerts_button&= amp;trkEmail=3Deml-email_job_alert_digest_01-footer-0-manage_alerts_button-= null-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken= =3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0= NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZ= mMGZhZTM5ZSwxLDE%3D" target=3D"_blank" style=3D"color: #0a66c2; cursor: poi= nter; display: inline-block; text-decoration: none; -webkit-text-size-adjus= t: 100%; -ms-text-size-adjust: 100%;"> Manage job alerts </a> =C2=A0=C2=A0= =C2=B7=C2=A0=C2=A0 <a href=3D"https://www.linkedin.com/job-alert-email-unsu= bscribe?savedSearchId=3D1741831243&lipi=3Durn%3Ali%3Apage%3Aemail_email= _job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZ= qHDifLhw&midSig=3D3W4KPr56Mu6Y41&ek=3Demail_job_alert_digest_01&= ;e=3D8qev22-mj9okzp3-om&eid=3D8qev22-mj9okzp3-om&m=3Dunsubscribe&am= p;ts=3DfooterGlimmer&li=3D0&t=3Dplh" target=3D"_blank" class=3D"tex= t-inherit underline" style=3D"cursor: pointer; display: inline-block; text-= decoration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100= %; color: inherit; text-decoration-line: underline;">Unsubscribe</a> =C2=A0= =C2=A0=C2=B7=C2=A0=C2=A0 <a href=3D"https://www.linkedin.com/help/linkedin/= answer/67?lang=3Den&lipi=3Durn%3Ali%3Apage%3Aemail_email_job_alert_dige= st_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&midToken=3DAQG5JZqHDifLhw&mi= dSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job_alert_digest_01-help-0-footer= glimmer&trkEmail=3Deml-email_job_alert_digest_01-help-0-footerglimmer-n= ull-8qev22~mj9okzp3~om-null-null&eid=3D8qev22-mj9okzp3-om&otpToken= =3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE4OWNhZDA0MDlkYWM4ZDYxNzljMjA0= NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MWZiNTU1MzJkNjg3MzM0NTMzZWJmNTZ= mMGZhZTM5ZSwxLDE%3D" target=3D"_blank" data-test-help-link class=3D"text-in= herit underline" style=3D"cursor: pointer; display: inline-block; text-deco= ration: none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; c= olor: inherit; text-decoration-line: underline;">Help</a> </td> </tr> <tr> = <td class=3D"pb-1" style=3D"-webkit-text-size-adjust: 100%; -ms-text-size-a= djust: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; padding-bottom: = 8px;"> <a href=3D"https://www.linkedin.com/comm/feed/?lipi=3Durn%3Ali%3Apag= e%3Aemail_email_job_alert_digest_01%3Bx0%2BIjNIiTLmTQJ1FLNbDxg%3D%3D&mi= dToken=3DAQG5JZqHDifLhw&midSig=3D3W4KPr56Mu6Y41&trk=3Deml-email_job= _alert_digest_01-footer-0-logoGlimmer&trkEmail=3Deml-email_job_alert_di= gest_01-footer-0-logoGlimmer-null-8qev22~mj9okzp3~om-null-null&eid=3D8q= ev22-mj9okzp3-om&otpToken=3DMTcwNzE2ZTAxYjJjYzFjMWJjMjQwNGVkNDAxYmVlYjE= 4OWNhZDA0MDlkYWM4ZDYxNzljMjA0NmM0ODUzNWFmNmYwZDRkZjhhMTNlNWY5ZDk0N2ExZmY3MW= ZiNTU1MzJkNjg3MzM0NTMzZWJmNTZmMGZhZTM5ZSwxLDE%3D" target=3D"_blank" style= =3D"color: #0a66c2; cursor: pointer; display: inline-block; text-decoration= : none; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;"> <img = src=3D"https://static.licdn.com/aero-v1/sc/h/9ehe6n39fa07dc5edzv0rla4e" alt= =3D"LinkedIn" class=3D"block h-[14px] w-[56px] image-rendering-crisp" style= =3D"outline: none; text-decoration: none; image-rendering: -moz-crisp-edges= ; image-rendering: -o-crisp-edges; image-rendering: -webkit-optimize-contra= st; image-rendering: crisp-edges; -ms-interpolation-mode: nearest-neighbor;= display: block; height: 14px; width: 56px;" width=3D"56" height=3D"14"> </= a> </td> </tr> <tr> <td data-test-copyright-text style=3D"-webkit-text-size= -adjust: 100%; -ms-text-size-adjust: 100%; mso-table-lspace: 0pt; mso-table= -rspace: 0pt;"> =C2=A9 2025 LinkedIn Corporation, 1‌000 West Maude Ave= nue, Sunnyvale, CA 94085. <span data-test-trademarks-text> LinkedIn and the= LinkedIn logo are registered trademarks of LinkedIn. </span> </td> </tr> <= /tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table= > <img alt role=3D"presentation" src=3D"https://www.linkedin.com/emimp/ip_T= 0hGbGRqSXlMVzFxT1c5cmVuQXpMVzl0OlpXMWhhV3hmYW05aVgyRnNaWEowWDJScFoyVnpkRjh3= TVE9PTo=3D.gif" style=3D"outline: none; text-decoration: none; -ms-interpol= ation-mode: bicubic; width: 1px; height: 1px;" width=3D"1" height=3D"1"> </= body> </html> ------=_Part_30182798_1564042163.1765956401981-- From - Wed Dec 17 09:20:00 2025 X-Mozilla-Status: 0001 X-Mozilla-Status2: 00000000 Return-Path: <m-11wtt3y6fmcfc1y7c55zqz68fyj57hv7vsij83u5xwxkkjzmhp9kyublv8@bounce.linkedin.com> Delivered-To: hi@josie.lol Received: from witcher.mxrouting.net by witcher.mxrouting.net with LMTP id QH0lE7x1Qmn2vRgAYBR5ng (envelope-from <m-11wtt3y6fmcfc1y7c55zqz68fyj57hv7vsij83u5xwxkkjzmhp9kyublv8@bounce.linkedin.com>) for <hi@josie.lol>; Wed, 17 Dec 2025 09:19:56 +0000 Return-path: <m-11wtt3y6fmcfc1y7c55zqz68fyj57hv7vsij83u5xwxkkjzmhp9kyublv8@bounce.linkedin.com> Envelope-to: linkedin@josie.lol Delivery-date: Wed, 17 Dec 2025 09:19:56 +0000 Received: from maild-bf.linkedin.com ([108.174.3.190]) by witcher.mxrouting.net with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98) (envelope-from <m-11wtt3y6fmcfc1y7c55zqz68fyj57hv7vsij83u5xwxkkjzmhp9kyublv8@bounce.linkedin.com>) id 1vVnhK-00000008FOb-2JFF for linkedin@josie.lol; Wed, 17 Dec 2025 09:19:54 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maild.linkedin.com; s=d2048-202308-0d; t=1765963194; bh=3Gvi/MBZJIS8Aq4Pf8fNj55apuRORscjdGcVEzUEkbQ=; h=From:Subject:MIME-Version:Content-Type:To:Date:X-LinkedIn-Class: X-LinkedIn-Template:X-LinkedIn-fbl; b=dsCx4WFEJk5sd462mP+d23Mi61e7dYSXd74WbJPoCVpXedque9skxhVepcjP7AHKT TUtc3A+31H3h+XvR9Hc/um6MR/5cLORRKK2Bgmq6tl0eQtdw885LxiDb0ZWxYcNH26 2lhZn8UgtpuwI/xnoMYCYfFtfbfaSRUIp3KQh8PNsBT44w4EU6/qFe2cRJR7WyIkFk MC7C/6U2hcjsTR3drNETB34Xcz24YvcxmxsKry3Pn4aIEz50jBAfsjQ0Pw/LZ5BIPD nv1uwL4Op0z+yIukY99fxwNu2bnfNWAgfm6Av54aKD9bSI9WQuBBty8WJ8l/Nm2H3i zuujmiipbWFOg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkedin.com; s=d2048-202308-00; t=1765963194; bh=3Gvi/MBZJIS8Aq4Pf8fNj55apuRORscjdGcVEzUEkbQ=; h=From:Subject:MIME-Version:Content-Type:To:Date:X-LinkedIn-Class: X-LinkedIn-Template:X-LinkedIn-fbl; b=tsN0hr1cPWELp8311+TgsBFMDTwWe+fFIcp65iDgEXmNRN+aGWVi+WJJetO1m6e1x Y6EEbI0Ng9Q3RMpP/nZXQE3wQUkWYRhXyOv6nTQEFue8BPfT/Vb/0NTeknx+YZltkT ztMMG2z6i8KQQxYKlxv+K9rtJOk2oqL6laOpHxQitP6pIMSZYhr1Hez+ae/CQsVhrP 42IOW17LhJU2zYNVrmVwHTPzJ4/TwPhF/gtxhWd5QvbKVjIrJS/1RDDytdY+hT6k8c V0WldiPccpKz0rPkinOuFsQPF4V2l943dqGK5UyOIr4llzrN3TTZjy+FT0tEWE1l2V r5kfLutHY/x1w== From: LinkedIn Job Alerts <jobalerts-noreply@linkedin.com> Message-ID: <1321318628.30861454.1765963193598@lor1-app152169.prod.linkedin.com> Subject: =?UTF-8?Q?=E2=80=9Cengineering_manager=E2=80=9D:_Frontify_?= =?UTF-8?Q?-_Engineering_Team_Lead_and_more?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_30861451_1399649861.1765963193595" To: Josephine Pfeiffer <linkedin@josie.lol> Date: Wed, 17 Dec 2025 09:19:53 +0000 (UTC) X-LinkedIn-Class: SAVEDSEARCH X-LinkedIn-Template: email_job_alert_digest_01 X-LinkedIn-fbl: m2-aszvlkluerybt1uca7ophhicxwnynsv2cpxfu37wj93w0utkyu7x5dj88dypzxoenz1cvejodzycz5ee72gvhchyzkgsu706m71zcg X-LinkedIn-Id: 8qev22-mj9svap8-it List-Unsubscribe: <https://www.linkedin.com/job-alert-email-unsubscribe?savedSearchId=1741831251&lipi=urn%3Ali%3Apage%3Aemail_email_job_alert_digest_01%3BRBlQMoAhRbi8ury8nSo0DQ%3D%3D&midToken=AQG5JZqHDifLhw&midSig=0wPdiWclGf6Y41&ek=email_job_alert_digest"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _types = require("../../tokenizer/types"); var _context = require("../../tokenizer/context"); var _location = require("../../util/location"); var _scopeflags = require("../../util/scopeflags"); var _scope = require("./scope"); var _productionParameter = require("../../util/production-parameter"); var _parseError = require("../../parse-error"); var _node = require("../../parser/node"); var _lval = require("../../parser/lval"); const getOwn = (object, key) => Object.hasOwnProperty.call(object, key) && object[key]; function nonNull(x) { if (x == null) { throw new Error(`Unexpected ${x} value.`); } return x; } function assert(x) { if (!x) { throw new Error("Assert fail"); } } const TSErrors = (0, _parseError.ParseErrorEnum)`typescript`({ AbstractMethodHasImplementation: ({ methodName }) => `Method '${methodName}' cannot have an implementation because it is marked abstract.`, AbstractPropertyHasInitializer: ({ propertyName }) => `Property '${propertyName}' cannot have an initializer because it is marked abstract.`, AccesorCannotDeclareThisParameter: "'get' and 'set' accessors cannot declare 'this' parameters.", AccesorCannotHaveTypeParameters: "An accessor cannot have type parameters.", AccessorCannotBeOptional: "An 'accessor' property cannot be declared optional.", ClassMethodHasDeclare: "Class methods cannot have the 'declare' modifier.", ClassMethodHasReadonly: "Class methods cannot have the 'readonly' modifier.", ConstInitiailizerMustBeStringOrNumericLiteralOrLiteralEnumReference: "A 'const' initializer in an ambient context must be a string or numeric literal or literal enum reference.", ConstructorHasTypeParameters: "Type parameters cannot appear on a constructor declaration.", DeclareAccessor: ({ kind }) => `'declare' is not allowed in ${kind}ters.`, DeclareClassFieldHasInitializer: "Initializers are not allowed in ambient contexts.", DeclareFunctionHasImplementation: "An implementation cannot be declared in ambient contexts.", DuplicateAccessibilityModifier: ({ modifier }) => `Accessibility modifier already seen.`, DuplicateModifier: ({ modifier }) => `Duplicate modifier: '${modifier}'.`, EmptyHeritageClauseType: ({ token }) => `'${token}' list cannot be empty.`, EmptyTypeArguments: "Type argument list cannot be empty.", EmptyTypeParameters: "Type parameter list cannot be empty.", ExpectedAmbientAfterExportDeclare: "'export declare' must be followed by an ambient declaration.", ImportAliasHasImportType: "An import alias can not use 'import type'.", ImportReflectionHasImportType: "An `import module` declaration can not use `type` modifier", IncompatibleModifiers: ({ modifiers }) => `'${modifiers[0]}' modifier cannot be used with '${modifiers[1]}' modifier.`, IndexSignatureHasAbstract: "Index signatures cannot have the 'abstract' modifier.", IndexSignatureHasAccessibility: ({ modifier }) => `Index signatures cannot have an accessibility modifier ('${modifier}').`, IndexSignatureHasDeclare: "Index signatures cannot have the 'declare' modifier.", IndexSignatureHasOverride: "'override' modifier cannot appear on an index signature.", IndexSignatureHasStatic: "Index signatures cannot have the 'static' modifier.", InitializerNotAllowedInAmbientContext: "Initializers are not allowed in ambient contexts.", InvalidModifierOnTypeMember: ({ modifier }) => `'${modifier}' modifier cannot appear on a type member.`, InvalidModifierOnTypeParameter: ({ modifier }) => `'${modifier}' modifier cannot appear on a type parameter.`, InvalidModifierOnTypeParameterPositions: ({ modifier }) => `'${modifier}' modifier can only appear on a type parameter of a class, interface or type alias.`, InvalidModifiersOrder: ({ orderedModifiers }) => `'${orderedModifiers[0]}' modifier must precede '${orderedModifiers[1]}' modifier.`, InvalidPropertyAccessAfterInstantiationExpression: "Invalid property access after an instantiation expression. " + "You can either wrap the instantiation expression in parentheses, or delete the type arguments.", InvalidTupleMemberLabel: "Tuple members must be labeled with a simple identifier.", MissingInterfaceName: "'interface' declarations must be followed by an identifier.", MixedLabeledAndUnlabeledElements: "Tuple members must all have names or all not have names.", NonAbstractClassHasAbstractMethod: "Abstract methods can only appear within an abstract class.", NonClassMethodPropertyHasAbstractModifer: "'abstract' modifier can only appear on a class, method, or property declaration.", OptionalTypeBeforeRequired: "A required element cannot follow an optional element.", OverrideNotInSubClass: "This member cannot have an 'override' modifier because its containing class does not extend another class.", PatternIsOptional: "A binding pattern parameter cannot be optional in an implementation signature.", PrivateElementHasAbstract: "Private elements cannot have the 'abstract' modifier.", PrivateElementHasAccessibility: ({ modifier }) => `Private elements cannot have an accessibility modifier ('${modifier}').`, ReadonlyForMethodSignature: "'readonly' modifier can only appear on a property declaration or index signature.", ReservedArrowTypeParam: "This syntax is reserved in files with the .mts or .cts extension. Add a trailing comma, as in `<T,>() => ...`.", ReservedTypeAssertion: "This syntax is reserved in files with the .mts or .cts extension. Use an `as` expression instead.", SetAccesorCannotHaveOptionalParameter: "A 'set' accessor cannot have an optional parameter.", SetAccesorCannotHaveRestParameter: "A 'set' accessor cannot have rest parameter.", SetAccesorCannotHaveReturnType: "A 'set' accessor cannot have a return type annotation.", SingleTypeParameterWithoutTrailingComma: ({ typeParameterName }) => `Single type parameter ${typeParameterName} should have a trailing comma. Example usage: <${typeParameterName},>.`, StaticBlockCannotHaveModifier: "Static class blocks cannot have any modifier.", TupleOptionalAfterType: "A labeled tuple optional element must be declared using a question mark after the name and before the colon (`name?: type`), rather than after the type (`name: type?`).", TypeAnnotationAfterAssign: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.", TypeImportCannotSpecifyDefaultAndNamed: "A type-only import can specify a default import or named bindings, but not both.", TypeModifierIsUsedInTypeExports: "The 'type' modifier cannot be used on a named export when 'export type' is used on its export statement.", TypeModifierIsUsedInTypeImports: "The 'type' modifier cannot be used on a named import when 'import type' is used on its import statement.", UnexpectedParameterModifier: "A parameter property is only allowed in a constructor implementation.", UnexpectedReadonly: "'readonly' type modifier is only permitted on array and tuple literal types.", UnexpectedTypeAnnotation: "Did not expect a type annotation here.", UnexpectedTypeCastInParameter: "Unexpected type cast in parameter position.", UnsupportedImportTypeArgument: "Argument in a type import must be a string literal.", UnsupportedParameterPropertyKind: "A parameter property may not be declared using a binding pattern.", UnsupportedSignatureParameterKind: ({ type }) => `Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got ${type}.` }); function keywordTypeFromName(value) { switch (value) { case "any": return "TSAnyKeyword"; case "boolean": return "TSBooleanKeyword"; case "bigint": return "TSBigIntKeyword"; case "never": return "TSNeverKeyword"; case "number": return "TSNumberKeyword"; case "object": return "TSObjectKeyword"; case "string": return "TSStringKeyword"; case "symbol": return "TSSymbolKeyword"; case "undefined": return "TSUndefinedKeyword"; case "unknown": return "TSUnknownKeyword"; default: return undefined; } } function tsIsAccessModifier(modifier) { return modifier === "private" || modifier === "public" || modifier === "protected"; } function tsIsVarianceAnnotations(modifier) { return modifier === "in" || modifier === "out"; } var _default = superClass => class TypeScriptParserMixin extends superClass { constructor(...args) { super(...args); this.tsParseInOutModifiers = this.tsParseModifiers.bind(this, { allowedModifiers: ["in", "out"], disallowedModifiers: ["const", "public", "private", "protected", "readonly", "declare", "abstract", "override"], errorTemplate: TSErrors.InvalidModifierOnTypeParameter }); this.tsParseConstModifier = this.tsParseModifiers.bind(this, { allowedModifiers: ["const"], disallowedModifiers: ["in", "out"], errorTemplate: TSErrors.InvalidModifierOnTypeParameterPositions }); this.tsParseInOutConstModifiers = this.tsParseModifiers.bind(this, { allowedModifiers: ["in", "out", "const"], disallowedModifiers: ["public", "private", "protected", "readonly", "declare", "abstract", "override"], errorTemplate: TSErrors.InvalidModifierOnTypeParameter }); } getScopeHandler() { return _scope.default; } tsIsIdentifier() { return (0, _types.tokenIsIdentifier)(this.state.type); } tsTokenCanFollowModifier() { return (this.match(0) || this.match(5) || this.match(55) || this.match(21) || this.match(136) || this.isLiteralPropertyName()) && !this.hasPrecedingLineBreak(); } tsNextTokenCanFollowModifier() { this.next(); return this.tsTokenCanFollowModifier(); } tsParseModifier(allowedModifiers, stopOnStartOfClassStaticBlock) { if (!(0, _types.tokenIsIdentifier)(this.state.type) && this.state.type !== 58 && this.state.type !== 75) { return undefined; } const modifier = this.state.value; if (allowedModifiers.indexOf(modifier) !== -1) { if (stopOnStartOfClassStaticBlock && this.tsIsStartOfStaticBlocks()) { return undefined; } if (this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))) { return modifier; } } return undefined; } tsParseModifiers({ allowedModifiers, disallowedModifiers, stopOnStartOfClassStaticBlock, errorTemplate = TSErrors.InvalidModifierOnTypeMember }, modified) { const enforceOrder = (loc, modifier, before, after) => { if (modifier === before && modified[after]) { this.raise(TSErrors.InvalidModifiersOrder, { at: loc, orderedModifiers: [before, after] }); } }; const incompatible = (loc, modifier, mod1, mod2) => { if (modified[mod1] && modifier === mod2 || modified[mod2] && modifier === mod1) { this.raise(TSErrors.IncompatibleModifiers, { at: loc, modifiers: [mod1, mod2] }); } }; for (;;) { const { startLoc } = this.state; const modifier = this.tsParseModifier(allowedModifiers.concat(disallowedModifiers != null ? disallowedModifiers : []), stopOnStartOfClassStaticBlock); if (!modifier) break; if (tsIsAccessModifier(modifier)) { if (modified.accessibility) { this.raise(TSErrors.DuplicateAccessibilityModifier, { at: startLoc, modifier }); } else { enforceOrder(startLoc, modifier, modifier, "override"); enforceOrder(startLoc, modifier, modifier, "static"); enforceOrder(startLoc, modifier, modifier, "readonly"); modified.accessibility = modifier; } } else if (tsIsVarianceAnnotations(modifier)) { if (modified[modifier]) { this.raise(TSErrors.DuplicateModifier, { at: startLoc, modifier }); } modified[modifier] = true; enforceOrder(startLoc, modifier, "in", "out"); } else { if (Object.hasOwnProperty.call(modified, modifier)) { this.raise(TSErrors.DuplicateModifier, { at: startLoc, modifier }); } else { enforceOrder(startLoc, modifier, "static", "readonly"); enforceOrder(startLoc, modifier, "static", "override"); enforceOrder(startLoc, modifier, "override", "readonly"); enforceOrder(startLoc, modifier, "abstract", "override"); incompatible(startLoc, modifier, "declare", "override"); incompatible(startLoc, modifier, "static", "abstract"); } modified[modifier] = true; } if (disallowedModifiers != null && disallowedModifiers.includes(modifier)) { this.raise(errorTemplate, { at: startLoc, modifier }); } } } tsIsListTerminator(kind) { switch (kind) { case "EnumMembers": case "TypeMembers": return this.match(8); case "HeritageClauseElement": return this.match(5); case "TupleElementTypes": return this.match(3); case "TypeParametersOrArguments": return this.match(48); } } tsParseList(kind, parseElement) { const result = []; while (!this.tsIsListTerminator(kind)) { result.push(parseElement()); } return result; } tsParseDelimitedList(kind, parseElement, refTrailingCommaPos) { return nonNull(this.tsParseDelimitedListWorker(kind, parseElement, true, refTrailingCommaPos)); } tsParseDelimitedListWorker(kind, parseElement, expectSuccess, refTrailingCommaPos) { const result = []; let trailingCommaPos = -1; for (;;) { if (this.tsIsListTerminator(kind)) { break; } trailingCommaPos = -1; const element = parseElement(); if (element == null) { return undefined; } result.push(element); if (this.eat(12)) { trailingCommaPos = this.state.lastTokStart; continue; } if (this.tsIsListTerminator(kind)) { break; } if (expectSuccess) { this.expect(12); } return undefined; } if (refTrailingCommaPos) { refTrailingCommaPos.value = trailingCommaPos; } return result; } tsParseBracketedList(kind, parseElement, bracket, skipFirstToken, refTrailingCommaPos) { if (!skipFirstToken) { if (bracket) { this.expect(0); } else { this.expect(47); } } const result = this.tsParseDelimitedList(kind, parseElement, refTrailingCommaPos); if (bracket) { this.expect(3); } else { this.expect(48); } return result; } tsParseImportType() { const node = this.startNode(); this.expect(83); this.expect(10); if (!this.match(131)) { this.raise(TSErrors.UnsupportedImportTypeArgument, { at: this.state.startLoc }); } node.argument = super.parseExprAtom(); this.expect(11); if (this.eat(16)) { node.qualifier = this.tsParseEntityName(); } if (this.match(47)) { node.typeParameters = this.tsParseTypeArguments(); } return this.finishNode(node, "TSImportType"); } tsParseEntityName(allowReservedWords = true) { let entity = this.parseIdentifier(allowReservedWords); while (this.eat(16)) { const node = this.startNodeAtNode(entity); node.left = entity; node.right = this.parseIdentifier(allowReservedWords); entity = this.finishNode(node, "TSQualifiedName"); } return entity; } tsParseTypeReference() { const node = this.startNode(); node.typeName = this.tsParseEntityName(); if (!this.hasPrecedingLineBreak() && this.match(47)) { node.typeParameters = this.tsParseTypeArguments(); } return this.finishNode(node, "TSTypeReference"); } tsParseThisTypePredicate(lhs) { this.next(); const node = this.startNodeAtNode(lhs); node.parameterName = lhs; node.typeAnnotation = this.tsParseTypeAnnotation(false); node.asserts = false; return this.finishNode(node, "TSTypePredicate"); } tsParseThisTypeNode() { const node = this.startNode(); this.next(); return this.finishNode(node, "TSThisType"); } tsParseTypeQuery() { const node = this.startNode(); this.expect(87); if (this.match(83)) { node.exprName = this.tsParseImportType(); } else { node.exprName = this.tsParseEntityName(); } if (!this.hasPrecedingLineBreak() && this.match(47)) { node.typeParameters = this.tsParseTypeArguments(); } return this.finishNode(node, "TSTypeQuery"); } tsParseTypeParameter(parseModifiers) { const node = this.startNode(); parseModifiers(node); node.name = this.tsParseTypeParameterName(); node.constraint = this.tsEatThenParseType(81); node.default = this.tsEatThenParseType(29); return this.finishNode(node, "TSTypeParameter"); } tsTryParseTypeParameters(parseModifiers) { if (this.match(47)) { return this.tsParseTypeParameters(parseModifiers); } } tsParseTypeParameters(parseModifiers) { const node = this.startNode(); if (this.match(47) || this.match(140)) { this.next(); } else { this.unexpected(); } const refTrailingCommaPos = { value: -1 }; node.params = this.tsParseBracketedList("TypeParametersOrArguments", this.tsParseTypeParameter.bind(this, parseModifiers), false, true, refTrailingCommaPos); if (node.params.length === 0) { this.raise(TSErrors.EmptyTypeParameters, { at: node }); } if (refTrailingCommaPos.value !== -1) { this.addExtra(node, "trailingComma", refTrailingCommaPos.value); } return this.finishNode(node, "TSTypeParameterDeclaration"); } tsFillSignature(returnToken, signature) { const returnTokenRequired = returnToken === 19; const paramsKey = "parameters"; const returnTypeKey = "typeAnnotation"; signature.typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier); this.expect(10); signature[paramsKey] = this.tsParseBindingListForSignature(); if (returnTokenRequired) { signature[returnTypeKey] = this.tsParseTypeOrTypePredicateAnnotation(returnToken); } else if (this.match(returnToken)) { signature[returnTypeKey] = this.tsParseTypeOrTypePredicateAnnotation(returnToken); } } tsParseBindingListForSignature() { const list = super.parseBindingList(11, 41, _lval.ParseBindingListFlags.IS_FUNCTION_PARAMS); for (const pattern of list) { const { type } = pattern; if (type === "AssignmentPattern" || type === "TSParameterProperty") { this.raise(TSErrors.UnsupportedSignatureParameterKind, { at: pattern, type }); } } return list; } tsParseTypeMemberSemicolon() { if (!this.eat(12) && !this.isLineTerminator()) { this.expect(13); } } tsParseSignatureMember(kind, node) { this.tsFillSignature(14, node); this.tsParseTypeMemberSemicolon(); return this.finishNode(node, kind); } tsIsUnambiguouslyIndexSignature() { this.next(); if ((0, _types.tokenIsIdentifier)(this.state.type)) { this.next(); return this.match(14); } return false; } tsTryParseIndexSignature(node) { if (!(this.match(0) && this.tsLookAhead(this.tsIsUnambiguouslyIndexSignature.bind(this)))) { return; } this.expect(0); const id = this.parseIdentifier(); id.typeAnnotation = this.tsParseTypeAnnotation(); this.resetEndLocation(id); this.expect(3); node.parameters = [id]; const type = this.tsTryParseTypeAnnotation(); if (type) node.typeAnnotation = type; this.tsParseTypeMemberSemicolon(); return this.finishNode(node, "TSIndexSignature"); } tsParsePropertyOrMethodSignature(node, readonly) { if (this.eat(17)) node.optional = true; const nodeAny = node; if (this.match(10) || this.match(47)) { if (readonly) { this.raise(TSErrors.ReadonlyForMethodSignature, { at: node }); } const method = nodeAny; if (method.kind && this.match(47)) { this.raise(TSErrors.AccesorCannotHaveTypeParameters, { at: this.state.curPosition() }); } this.tsFillSignature(14, method); this.tsParseTypeMemberSemicolon(); const paramsKey = "parameters"; const returnTypeKey = "typeAnnotation"; if (method.kind === "get") { if (method[paramsKey].length > 0) { this.raise(_parseError.Errors.BadGetterArity, { at: this.state.curPosition() }); if (this.isThisParam(method[paramsKey][0])) { this.raise(TSErrors.AccesorCannotDeclareThisParameter, { at: this.state.curPosition() }); } } } else if (method.kind === "set") { if (method[paramsKey].length !== 1) { this.raise(_parseError.Errors.BadSetterArity, { at: this.state.curPosition() }); } else { const firstParameter = method[paramsKey][0]; if (this.isThisParam(firstParameter)) { this.raise(TSErrors.AccesorCannotDeclareThisParameter, { at: this.state.curPosition() }); } if (firstParameter.type === "Identifier" && firstParameter.optional) { this.raise(TSErrors.SetAccesorCannotHaveOptionalParameter, { at: this.state.curPosition() }); } if (firstParameter.type === "RestElement") { this.raise(TSErrors.SetAccesorCannotHaveRestParameter, { at: this.state.curPosition() }); } } if (method[returnTypeKey]) { this.raise(TSErrors.SetAccesorCannotHaveReturnType, { at: method[returnTypeKey] }); } } else { method.kind = "method"; } return this.finishNode(method, "TSMethodSignature"); } else { const property = nodeAny; if (readonly) property.readonly = true; const type = this.tsTryParseTypeAnnotation(); if (type) property.typeAnnotation = type; this.tsParseTypeMemberSemicolon(); return this.finishNode(property, "TSPropertySignature"); } } tsParseTypeMember() { const node = this.startNode(); if (this.match(10) || this.match(47)) { return this.tsParseSignatureMember("TSCallSignatureDeclaration", node); } if (this.match(77)) { const id = this.startNode(); this.next(); if (this.match(10) || this.match(47)) { return this.tsParseSignatureMember("TSConstructSignatureDeclaration", node); } else { node.key = this.createIdentifier(id, "new"); return this.tsParsePropertyOrMethodSignature(node, false); } } this.tsParseModifiers({ allowedModifiers: ["readonly"], disallowedModifiers: ["declare", "abstract", "private", "protected", "public", "static", "override"] }, node); const idx = this.tsTryParseIndexSignature(node); if (idx) { return idx; } super.parsePropertyName(node); if (!node.computed && node.key.type === "Identifier" && (node.key.name === "get" || node.key.name === "set") && this.tsTokenCanFollowModifier()) { node.kind = node.key.name; super.parsePropertyName(node); } return this.tsParsePropertyOrMethodSignature(node, !!node.readonly); } tsParseTypeLiteral() { const node = this.startNode(); node.members = this.tsParseObjectTypeMembers(); return this.finishNode(node, "TSTypeLiteral"); } tsParseObjectTypeMembers() { this.expect(5); const members = this.tsParseList("TypeMembers", this.tsParseTypeMember.bind(this)); this.expect(8); return members; } tsIsStartOfMappedType() { this.next(); if (this.eat(53)) { return this.isContextual(120); } if (this.isContextual(120)) { this.next(); } if (!this.match(0)) { return false; } this.next(); if (!this.tsIsIdentifier()) { return false; } this.next(); return this.match(58); } tsParseMappedTypeParameter() { const node = this.startNode(); node.name = this.tsParseTypeParameterName(); node.constraint = this.tsExpectThenParseType(58); return this.finishNode(node, "TSTypeParameter"); } tsParseMappedType() { const node = this.startNode(); this.expect(5); if (this.match(53)) { node.readonly = this.state.value; this.next(); this.expectContextual(120); } else if (this.eatContextual(120)) { node.readonly = true; } this.expect(0); node.typeParameter = this.tsParseMappedTypeParameter(); node.nameType = this.eatContextual(93) ? this.tsParseType() : null; this.expect(3); if (this.match(53)) { node.optional = this.state.value; this.next(); this.expect(17); } else if (this.eat(17)) { node.optional = true; } node.typeAnnotation = this.tsTryParseType(); this.semicolon(); this.expect(8); return this.finishNode(node, "TSMappedType"); } tsParseTupleType() { const node = this.startNode(); node.elementTypes = this.tsParseBracketedList("TupleElementTypes", this.tsParseTupleElementType.bind(this), true, false); let seenOptionalElement = false; let labeledElements = null; node.elementTypes.forEach(elementNode => { var _labeledElements; const { type } = elementNode; if (seenOptionalElement && type !== "TSRestType" && type !== "TSOptionalType" && !(type === "TSNamedTupleMember" && elementNode.optional)) { this.raise(TSErrors.OptionalTypeBeforeRequired, { at: elementNode }); } seenOptionalElement || (seenOptionalElement = type === "TSNamedTupleMember" && elementNode.optional || type === "TSOptionalType"); let checkType = type; if (type === "TSRestType") { elementNode = elementNode.typeAnnotation; checkType = elementNode.type; } const isLabeled = checkType === "TSNamedTupleMember"; (_labeledElements = labeledElements) != null ? _labeledElements : labeledElements = isLabeled; if (labeledElements !== isLabeled) { this.raise(TSErrors.MixedLabeledAndUnlabeledElements, { at: elementNode }); } }); return this.finishNode(node, "TSTupleType"); } tsParseTupleElementType() { const { startLoc } = this.state; const rest = this.eat(21); let labeled; let label; let optional; let type; const isWord = (0, _types.tokenIsKeywordOrIdentifier)(this.state.type); const chAfterWord = isWord ? this.lookaheadCharCode() : null; if (chAfterWord === 58) { labeled = true; optional = false; label = this.parseIdentifier(true); this.expect(14); type = this.tsParseType(); } else if (chAfterWord === 63) { optional = true; const startLoc = this.state.startLoc; const wordName = this.state.value; const typeOrLabel = this.tsParseNonArrayType(); if (this.lookaheadCharCode() === 58) { labeled = true; label = this.createIdentifier(this.startNodeAt(startLoc), wordName); this.expect(17); this.expect(14); type = this.tsParseType(); } else { labeled = false; type = typeOrLabel; this.expect(17); } } else { type = this.tsParseType(); optional = this.eat(17); labeled = this.eat(14); } if (labeled) { let labeledNode; if (label) { labeledNode = this.startNodeAtNode(label); labeledNode.optional = optional; labeledNode.label = label; labeledNode.elementType = type; if (this.eat(17)) { labeledNode.optional = true; this.raise(TSErrors.TupleOptionalAfterType, { at: this.state.lastTokStartLoc }); } } else { labeledNode = this.startNodeAtNode(type); labeledNode.optional = optional; this.raise(TSErrors.InvalidTupleMemberLabel, { at: type }); labeledNode.label = type; labeledNode.elementType = this.tsParseType(); } type = this.finishNode(labeledNode, "TSNamedTupleMember"); } else if (optional) { const optionalTypeNode = this.startNodeAtNode(type); optionalTypeNode.typeAnnotation = type; type = this.finishNode(optionalTypeNode, "TSOptionalType"); } if (rest) { const restNode = this.startNodeAt(startLoc); restNode.typeAnnotation = type; type = this.finishNode(restNode, "TSRestType"); } return type; } tsParseParenthesizedType() { const node = this.startNode(); this.expect(10); node.typeAnnotation = this.tsParseType(); this.expect(11); return this.finishNode(node, "TSParenthesizedType"); } tsParseFunctionOrConstructorType(type, abstract) { const node = this.startNode(); if (type === "TSConstructorType") { node.abstract = !!abstract; if (abstract) this.next(); this.next(); } this.tsInAllowConditionalTypesContext(() => this.tsFillSignature(19, node)); return this.finishNode(node, type); } tsParseLiteralTypeNode() { const node = this.startNode(); switch (this.state.type) { case 132: case 133: case 131: case 85: case 86: node.literal = super.parseExprAtom(); break; default: this.unexpected(); } return this.finishNode(node, "TSLiteralType"); } tsParseTemplateLiteralType() { const node = this.startNode(); node.literal = super.parseTemplate(false); return this.finishNode(node, "TSLiteralType"); } parseTemplateSubstitution() { if (this.state.inType) return this.tsParseType(); return super.parseTemplateSubstitution(); } tsParseThisTypeOrThisTypePredicate() { const thisKeyword = this.tsParseThisTypeNode(); if (this.isContextual(114) && !this.hasPrecedingLineBreak()) { return this.tsParseThisTypePredicate(thisKeyword); } else { return thisKeyword; } } tsParseNonArrayType() { switch (this.state.type) { case 131: case 132: case 133: case 85: case 86: return this.tsParseLiteralTypeNode(); case 53: if (this.state.value === "-") { const node = this.startNode(); const nextToken = this.lookahead(); if (nextToken.type !== 132 && nextToken.type !== 133) { this.unexpected(); } node.literal = this.parseMaybeUnary(); return this.finishNode(node, "TSLiteralType"); } break; case 78: return this.tsParseThisTypeOrThisTypePredicate(); case 87: return this.tsParseTypeQuery(); case 83: return this.tsParseImportType(); case 5: return this.tsLookAhead(this.tsIsStartOfMappedType.bind(this)) ? this.tsParseMappedType() : this.tsParseTypeLiteral(); case 0: return this.tsParseTupleType(); case 10: ; return this.tsParseParenthesizedType(); case 25: case 24: return this.tsParseTemplateLiteralType(); default: { const { type } = this.state; if ((0, _types.tokenIsIdentifier)(type) || type === 88 || type === 84) { const nodeType = type === 88 ? "TSVoidKeyword" : type === 84 ? "TSNullKeyword" : keywordTypeFromName(this.state.value); if (nodeType !== undefined && this.lookaheadCharCode() !== 46) { const node = this.startNode(); this.next(); return this.finishNode(node, nodeType); } return this.tsParseTypeReference(); } } } this.unexpected(); } tsParseArrayTypeOrHigher() { let type = this.tsParseNonArrayType(); while (!this.hasPrecedingLineBreak() && this.eat(0)) { if (this.match(3)) { const node = this.startNodeAtNode(type); node.elementType = type; this.expect(3); type = this.finishNode(node, "TSArrayType"); } else { const node = this.startNodeAtNode(type); node.objectType = type; node.indexType = this.tsParseType(); this.expect(3); type = this.finishNode(node, "TSIndexedAccessType"); } } return type; } tsParseTypeOperator() { const node = this.startNode(); const operator = this.state.value; this.next(); node.operator = operator; node.typeAnnotation = this.tsParseTypeOperatorOrHigher(); if (operator === "readonly") { this.tsCheckTypeAnnotationForReadOnly(node); } return this.finishNode(node, "TSTypeOperator"); } tsCheckTypeAnnotationForReadOnly(node) { switch (node.typeAnnotation.type) { case "TSTupleType": case "TSArrayType": return; default: this.raise(TSErrors.UnexpectedReadonly, { at: node }); } } tsParseInferType() { const node = this.startNode(); this.expectContextual(113); const typeParameter = this.startNode(); typeParameter.name = this.tsParseTypeParameterName(); typeParameter.constraint = this.tsTryParse(() => this.tsParseConstraintForInferType()); node.typeParameter = this.finishNode(typeParameter, "TSTypeParameter"); return this.finishNode(node, "TSInferType"); } tsParseConstraintForInferType() { if (this.eat(81)) { const constraint = this.tsInDisallowConditionalTypesContext(() => this.tsParseType()); if (this.state.inDisallowConditionalTypesContext || !this.match(17)) { return constraint; } } } tsParseTypeOperatorOrHigher() { const isTypeOperator = (0, _types.tokenIsTSTypeOperator)(this.state.type) && !this.state.containsEsc; return isTypeOperator ? this.tsParseTypeOperator() : this.isContextual(113) ? this.tsParseInferType() : this.tsInAllowConditionalTypesContext(() => this.tsParseArrayTypeOrHigher()); } tsParseUnionOrIntersectionType(kind, parseConstituentType, operator) { const node = this.startNode(); const hasLeadingOperator = this.eat(operator); const types = []; do { types.push(parseConstituentType()); } while (this.eat(operator)); if (types.length === 1 && !hasLeadingOperator) { return types[0]; } node.types = types; return this.finishNode(node, kind); } tsParseIntersectionTypeOrHigher() { return this.tsParseUnionOrIntersectionType("TSIntersectionType", this.tsParseTypeOperatorOrHigher.bind(this), 45); } tsParseUnionTypeOrHigher() { return this.tsParseUnionOrIntersectionType("TSUnionType", this.tsParseIntersectionTypeOrHigher.bind(this), 43); } tsIsStartOfFunctionType() { if (this.match(47)) { return true; } return this.match(10) && this.tsLookAhead(this.tsIsUnambiguouslyStartOfFunctionType.bind(this)); } tsSkipParameterStart() { if ((0, _types.tokenIsIdentifier)(this.state.type) || this.match(78)) { this.next(); return true; } if (this.match(5)) { const { errors } = this.state; const previousErrorCount = errors.length; try { this.parseObjectLike(8, true); return errors.length === previousErrorCount; } catch (_unused) { return false; } } if (this.match(0)) { this.next(); const { errors } = this.state; const previousErrorCount = errors.length; try { super.parseBindingList(3, 93, _lval.ParseBindingListFlags.ALLOW_EMPTY); return errors.length === previousErrorCount; } catch (_unused2) { return false; } } return false; } tsIsUnambiguouslyStartOfFunctionType() { this.next(); if (this.match(11) || this.match(21)) { return true; } if (this.tsSkipParameterStart()) { if (this.match(14) || this.match(12) || this.match(17) || this.match(29)) { return true; } if (this.match(11)) { this.next(); if (this.match(19)) { return true; } } } return false; } tsParseTypeOrTypePredicateAnnotation(returnToken) { return this.tsInType(() => { const t = this.startNode(); this.expect(returnToken); const node = this.startNode(); const asserts = !!this.tsTryParse(this.tsParseTypePredicateAsserts.bind(this)); if (asserts && this.match(78)) { let thisTypePredicate = this.tsParseThisTypeOrThisTypePredicate(); if (thisTypePredicate.type === "TSThisType") { node.parameterName = thisTypePredicate; node.asserts = true; node.typeAnnotation = null; thisTypePredicate = this.finishNode(node, "TSTypePredicate"); } else { this.resetStartLocationFromNode(thisTypePredicate, node); thisTypePredicate.asserts = true; } t.typeAnnotation = thisTypePredicate; return this.finishNode(t, "TSTypeAnnotation"); } const typePredicateVariable = this.tsIsIdentifier() && this.tsTryParse(this.tsParseTypePredicatePrefix.bind(this)); if (!typePredicateVariable) { if (!asserts) { return this.tsParseTypeAnnotation(false, t); } node.parameterName = this.parseIdentifier(); node.asserts = asserts; node.typeAnnotation = null; t.typeAnnotation = this.finishNode(node, "TSTypePredicate"); return this.finishNode(t, "TSTypeAnnotation"); } const type = this.tsParseTypeAnnotation(false); node.parameterName = typePredicateVariable; node.typeAnnotation = type; node.asserts = asserts; t.typeAnnotation = this.finishNode(node, "TSTypePredicate"); return this.finishNode(t, "TSTypeAnnotation"); }); } tsTryParseTypeOrTypePredicateAnnotation() { if (this.match(14)) { return this.tsParseTypeOrTypePredicateAnnotation(14); } } tsTryParseTypeAnnotation() { if (this.match(14)) { return this.tsParseTypeAnnotation(); } } tsTryParseType() { return this.tsEatThenParseType(14); } tsParseTypePredicatePrefix() { const id = this.parseIdentifier(); if (this.isContextual(114) && !this.hasPrecedingLineBreak()) { this.next(); return id; } } tsParseTypePredicateAsserts() { if (this.state.type !== 107) { return false; } const containsEsc = this.state.containsEsc; this.next(); if (!(0, _types.tokenIsIdentifier)(this.state.type) && !this.match(78)) { return false; } if (containsEsc) { this.raise(_parseError.Errors.InvalidEscapedReservedWord, { at: this.state.lastTokStartLoc, reservedWord: "asserts" }); } return true; } tsParseTypeAnnotation(eatColon = true, t = this.startNode()) { this.tsInType(() => { if (eatColon) this.expect(14); t.typeAnnotation = this.tsParseType(); }); return this.finishNode(t, "TSTypeAnnotation"); } tsParseType() { assert(this.state.inType); const type = this.tsParseNonConditionalType(); if (this.state.inDisallowConditionalTypesContext || this.hasPrecedingLineBreak() || !this.eat(81)) { return type; } const node = this.startNodeAtNode(type); node.checkType = type; node.extendsType = this.tsInDisallowConditionalTypesContext(() => this.tsParseNonConditionalType()); this.expect(17); node.trueType = this.tsInAllowConditionalTypesContext(() => this.tsParseType()); this.expect(14); node.falseType = this.tsInAllowConditionalTypesContext(() => this.tsParseType()); return this.finishNode(node, "TSConditionalType"); } isAbstractConstructorSignature() { return this.isContextual(122) && this.lookahead().type === 77; } tsParseNonConditionalType() { if (this.tsIsStartOfFunctionType()) { return this.tsParseFunctionOrConstructorType("TSFunctionType"); } if (this.match(77)) { return this.tsParseFunctionOrConstructorType("TSConstructorType"); } else if (this.isAbstractConstructorSignature()) { return this.tsParseFunctionOrConstructorType("TSConstructorType", true); } return this.tsParseUnionTypeOrHigher(); } tsParseTypeAssertion() { if (this.getPluginOption("typescript", "disallowAmbiguousJSXLike")) { this.raise(TSErrors.ReservedTypeAssertion, { at: this.state.startLoc }); } const node = this.startNode(); node.typeAnnotation = this.tsInType(() => { this.next(); return this.match(75) ? this.tsParseTypeReference() : this.tsParseType(); }); this.expect(48); node.expression = this.parseMaybeUnary(); return this.finishNode(node, "TSTypeAssertion"); } tsParseHeritageClause(token) { const originalStartLoc = this.state.startLoc; const delimitedList = this.tsParseDelimitedList("HeritageClauseElement", () => { const node = this.startNode(); node.expression = this.tsParseEntityName(); if (this.match(47)) { node.typeParameters = this.tsParseTypeArguments(); } return this.finishNode(node, "TSExpressionWithTypeArguments"); }); if (!delimitedList.length) { this.raise(TSErrors.EmptyHeritageClauseType, { at: originalStartLoc, token }); } return delimitedList; } tsParseInterfaceDeclaration(node, properties = {}) { if (this.hasFollowingLineBreak()) return null; this.expectContextual(127); if (properties.declare) node.declare = true; if ((0, _types.tokenIsIdentifier)(this.state.type)) { node.id = this.parseIdentifier(); this.checkIdentifier(node.id, _scopeflags.BIND_TS_INTERFACE); } else { node.id = null; this.raise(TSErrors.MissingInterfaceName, { at: this.state.startLoc }); } node.typeParameters = this.tsTryParseTypeParameters(this.tsParseInOutConstModifiers); if (this.eat(81)) { node.extends = this.tsParseHeritageClause("extends"); } const body = this.startNode(); body.body = this.tsInType(this.tsParseObjectTypeMembers.bind(this)); node.body = this.finishNode(body, "TSInterfaceBody"); return this.finishNode(node, "TSInterfaceDeclaration"); } tsParseTypeAliasDeclaration(node) { node.id = this.parseIdentifier(); this.checkIdentifier(node.id, _scopeflags.BIND_TS_TYPE); node.typeAnnotation = this.tsInType(() => { node.typeParameters = this.tsTryParseTypeParameters(this.tsParseInOutModifiers); this.expect(29); if (this.isContextual(112) && this.lookahead().type !== 16) { const node = this.startNode(); this.next(); return this.finishNode(node, "TSIntrinsicKeyword"); } return this.tsParseType(); }); this.semicolon(); return this.finishNode(node, "TSTypeAliasDeclaration"); } tsInNoContext(cb) { const oldContext = this.state.context; this.state.context = [oldContext[0]]; try { return cb(); } finally { this.state.context = oldContext; } } tsInType(cb) { const oldInType = this.state.inType; this.state.inType = true; try { return cb(); } finally { this.state.inType = oldInType; } } tsInDisallowConditionalTypesContext(cb) { const oldInDisallowConditionalTypesContext = this.state.inDisallowConditionalTypesContext; this.state.inDisallowConditionalTypesContext = true; try { return cb(); } finally { this.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext; } } tsInAllowConditionalTypesContext(cb) { const oldInDisallowConditionalTypesContext = this.state.inDisallowConditionalTypesContext; this.state.inDisallowConditionalTypesContext = false; try { return cb(); } finally { this.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext; } } tsEatThenParseType(token) { if (this.match(token)) { return this.tsNextThenParseType(); } } tsExpectThenParseType(token) { return this.tsInType(() => { this.expect(token); return this.tsParseType(); }); } tsNextThenParseType() { return this.tsInType(() => { this.next(); return this.tsParseType(); }); } tsParseEnumMember() { const node = this.startNode(); node.id = this.match(131) ? super.parseStringLiteral(this.state.value) : this.parseIdentifier(true); if (this.eat(29)) { node.initializer = super.parseMaybeAssignAllowIn(); } return this.finishNode(node, "TSEnumMember"); } tsParseEnumDeclaration(node, properties = {}) { if (properties.const) node.const = true; if (properties.declare) node.declare = true; this.expectContextual(124); node.id = this.parseIdentifier(); this.checkIdentifier(node.id, node.const ? _scopeflags.BIND_TS_CONST_ENUM : _scopeflags.BIND_TS_ENUM); this.expect(5); node.members = this.tsParseDelimitedList("EnumMembers", this.tsParseEnumMember.bind(this)); this.expect(8); return this.finishNode(node, "TSEnumDeclaration"); } tsParseModuleBlock() { const node = this.startNode(); this.scope.enter(_scopeflags.SCOPE_OTHER); this.expect(5); super.parseBlockOrModuleBlockBody(node.body = [], undefined, true, 8); this.scope.exit(); return this.finishNode(node, "TSModuleBlock"); } tsParseModuleOrNamespaceDeclaration(node, nested = false) { node.id = this.parseIdentifier(); if (!nested) { this.checkIdentifier(node.id, _scopeflags.BIND_TS_NAMESPACE); } if (this.eat(16)) { const inner = this.startNode(); this.tsParseModuleOrNamespaceDeclaration(inner, true); node.body = inner; } else { this.scope.enter(_scopeflags.SCOPE_TS_MODULE); this.prodParam.enter(_productionParameter.PARAM); node.body = this.tsParseModuleBlock(); this.prodParam.exit(); this.scope.exit(); } return this.finishNode(node, "TSModuleDeclaration"); } tsParseAmbientExternalModuleDeclaration(node) { if (this.isContextual(110)) { node.global = true; node.id = this.parseIdentifier(); } else if (this.match(131)) { node.id = super.parseStringLiteral(this.state.value); } else { this.unexpected(); } if (this.match(5)) { this.scope.enter(_scopeflags.SCOPE_TS_MODULE); this.prodParam.enter(_productionParameter.PARAM); node.body = this.tsParseModuleBlock(); this.prodParam.exit(); this.scope.exit(); } else { this.semicolon(); } return this.finishNode(node, "TSModuleDeclaration"); } tsParseImportEqualsDeclaration(node, maybeDefaultIdentifier, isExport) { node.isExport = isExport || false; node.id = maybeDefaultIdentifier || this.parseIdentifier(); this.checkIdentifier(node.id, _scopeflags.BIND_FLAGS_TS_IMPORT); this.expect(29); const moduleReference = this.tsParseModuleReference(); if (node.importKind === "type" && moduleReference.type !== "TSExternalModuleReference") { this.raise(TSErrors.ImportAliasHasImportType, { at: moduleReference }); } node.moduleReference = moduleReference; this.semicolon(); return this.finishNode(node, "TSImportEqualsDeclaration"); } tsIsExternalModuleReference() { return this.isContextual(117) && this.lookaheadCharCode() === 40; } tsParseModuleReference() { return this.tsIsExternalModuleReference() ? this.tsParseExternalModuleReference() : this.tsParseEntityName(false); } tsParseExternalModuleReference() { const node = this.startNode(); this.expectContextual(117); this.expect(10); if (!this.match(131)) { this.unexpected(); } node.expression = super.parseExprAtom(); this.expect(11); this.sawUnambiguousESM = true; return this.finishNode(node, "TSExternalModuleReference"); } tsLookAhead(f) { const state = this.state.clone(); const res = f(); this.state = state; return res; } tsTryParseAndCatch(f) { const result = this.tryParse(abort => f() || abort()); if (result.aborted || !result.node) return; if (result.error) this.state = result.failState; return result.node; } tsTryParse(f) { const state = this.state.clone(); const result = f(); if (result !== undefined && result !== false) { return result; } this.state = state; } tsTryParseDeclare(nany) { if (this.isLineTerminator()) { return; } let startType = this.state.type; let kind; if (this.isContextual(99)) { startType = 74; kind = "let"; } return this.tsInAmbientContext(() => { switch (startType) { case 68: nany.declare = true; return super.parseFunctionStatement(nany, false, false); case 80: nany.declare = true; return this.parseClass(nany, true, false); case 124: return this.tsParseEnumDeclaration(nany, { declare: true }); case 110: return this.tsParseAmbientExternalModuleDeclaration(nany); case 75: case 74: if (!this.match(75) || !this.isLookaheadContextual("enum")) { nany.declare = true; return this.parseVarStatement(nany, kind || this.state.value, true); } this.expect(75); return this.tsParseEnumDeclaration(nany, { const: true, declare: true }); case 127: { const result = this.tsParseInterfaceDeclaration(nany, { declare: true }); if (result) return result; } default: if ((0, _types.tokenIsIdentifier)(startType)) { return this.tsParseDeclaration(nany, this.state.value, true, null); } } }); } tsTryParseExportDeclaration() { return this.tsParseDeclaration(this.startNode(), this.state.value, true, null); } tsParseExpressionStatement(node, expr, decorators) { switch (expr.name) { case "declare": { const declaration = this.tsTryParseDeclare(node); if (declaration) { declaration.declare = true; } return declaration; } case "global": if (this.match(5)) { this.scope.enter(_scopeflags.SCOPE_TS_MODULE); this.prodParam.enter(_productionParameter.PARAM); const mod = node; mod.global = true; mod.id = expr; mod.body = this.tsParseModuleBlock(); this.scope.exit(); this.prodParam.exit(); return this.finishNode(mod, "TSModuleDeclaration"); } break; default: return this.tsParseDeclaration(node, expr.name, false, decorators); } } tsParseDeclaration(node, value, next, decorators) { switch (value) { case "abstract": if (this.tsCheckLineTerminator(next) && (this.match(80) || (0, _types.tokenIsIdentifier)(this.state.type))) { return this.tsParseAbstractDeclaration(node, decorators); } break; case "module": if (this.tsCheckLineTerminator(next)) { if (this.match(131)) { return this.tsParseAmbientExternalModuleDeclaration(node); } else if ((0, _types.tokenIsIdentifier)(this.state.type)) { return this.tsParseModuleOrNamespaceDeclaration(node); } } break; case "namespace": if (this.tsCheckLineTerminator(next) && (0, _types.tokenIsIdentifier)(this.state.type)) { return this.tsParseModuleOrNamespaceDeclaration(node); } break; case "type": if (this.tsCheckLineTerminator(next) && (0, _types.tokenIsIdentifier)(this.state.type)) { return this.tsParseTypeAliasDeclaration(node); } break; } } tsCheckLineTerminator(next) { if (next) { if (this.hasFollowingLineBreak()) return false; this.next(); return true; } return !this.isLineTerminator(); } tsTryParseGenericAsyncArrowFunction(startLoc) { if (!this.match(47)) return; const oldMaybeInArrowParameters = this.state.maybeInArrowParameters; this.state.maybeInArrowParameters = true; const res = this.tsTryParseAndCatch(() => { const node = this.startNodeAt(startLoc); node.typeParameters = this.tsParseTypeParameters(this.tsParseConstModifier); super.parseFunctionParams(node); node.returnType = this.tsTryParseTypeOrTypePredicateAnnotation(); this.expect(19); return node; }); this.state.maybeInArrowParameters = oldMaybeInArrowParameters; if (!res) return; return super.parseArrowExpression(res, null, true); } tsParseTypeArgumentsInExpression() { if (this.reScan_lt() !== 47) return; return this.tsParseTypeArguments(); } tsParseTypeArguments() { const node = this.startNode(); node.params = this.tsInType(() => this.tsInNoContext(() => { this.expect(47); return this.tsParseDelimitedList("TypeParametersOrArguments", this.tsParseType.bind(this)); })); if (node.params.length === 0) { this.raise(TSErrors.EmptyTypeArguments, { at: node }); } else if (!this.state.inType && this.curContext() === _context.types.brace) { this.reScan_lt_gt(); } this.expect(48); return this.finishNode(node, "TSTypeParameterInstantiation"); } tsIsDeclarationStart() { return (0, _types.tokenIsTSDeclarationStart)(this.state.type); } isExportDefaultSpecifier() { if (this.tsIsDeclarationStart()) return false; return super.isExportDefaultSpecifier(); } parseAssignableListItem(flags, decorators) { const startLoc = this.state.startLoc; const modified = {}; this.tsParseModifiers({ allowedModifiers: ["public", "private", "protected", "override", "readonly"] }, modified); const accessibility = modified.accessibility; const override = modified.override; const readonly = modified.readonly; if (!(flags & _lval.ParseBindingListFlags.IS_CONSTRUCTOR_PARAMS) && (accessibility || readonly || override)) { this.raise(TSErrors.UnexpectedParameterModifier, { at: startLoc }); } const left = this.parseMaybeDefault(); this.parseAssignableListItemTypes(left, flags); const elt = this.parseMaybeDefault(left.loc.start, left); if (accessibility || readonly || override) { const pp = this.startNodeAt(startLoc); if (decorators.length) { pp.decorators = decorators; } if (accessibility) pp.accessibility = accessibility; if (readonly) pp.readonly = readonly; if (override) pp.override = override; if (elt.type !== "Identifier" && elt.type !== "AssignmentPattern") { this.raise(TSErrors.UnsupportedParameterPropertyKind, { at: pp }); } pp.parameter = elt; return this.finishNode(pp, "TSParameterProperty"); } if (decorators.length) { left.decorators = decorators; } return elt; } isSimpleParameter(node) { return node.type === "TSParameterProperty" && super.isSimpleParameter(node.parameter) || super.isSimpleParameter(node); } tsDisallowOptionalPattern(node) { for (const param of node.params) { if (param.type !== "Identifier" && param.optional && !this.state.isAmbientContext) { this.raise(TSErrors.PatternIsOptional, { at: param }); } } } setArrowFunctionParameters(node, params, trailingCommaLoc) { super.setArrowFunctionParameters(node, params, trailingCommaLoc); this.tsDisallowOptionalPattern(node); } parseFunctionBodyAndFinish(node, type, isMethod = false) { if (this.match(14)) { node.returnType = this.tsParseTypeOrTypePredicateAnnotation(14); } const bodilessType = type === "FunctionDeclaration" ? "TSDeclareFunction" : type === "ClassMethod" || type === "ClassPrivateMethod" ? "TSDeclareMethod" : undefined; if (bodilessType && !this.match(5) && this.isLineTerminator()) { return this.finishNode(node, bodilessType); } if (bodilessType === "TSDeclareFunction" && this.state.isAmbientContext) { this.raise(TSErrors.DeclareFunctionHasImplementation, { at: node }); if (node.declare) { return super.parseFunctionBodyAndFinish(node, bodilessType, isMethod); } } this.tsDisallowOptionalPattern(node); return super.parseFunctionBodyAndFinish(node, type, isMethod); } registerFunctionStatementId(node) { if (!node.body && node.id) { this.checkIdentifier(node.id, _scopeflags.BIND_TS_AMBIENT); } else { super.registerFunctionStatementId(node); } } tsCheckForInvalidTypeCasts(items) { items.forEach(node => { if ((node == null ? void 0 : node.type) === "TSTypeCastExpression") { this.raise(TSErrors.UnexpectedTypeAnnotation, { at: node.typeAnnotation }); } }); } toReferencedList(exprList, isInParens) { this.tsCheckForInvalidTypeCasts(exprList); return exprList; } parseArrayLike(close, canBePattern, isTuple, refExpressionErrors) { const node = super.parseArrayLike(close, canBePattern, isTuple, refExpressionErrors); if (node.type === "ArrayExpression") { this.tsCheckForInvalidTypeCasts(node.elements); } return node; } parseSubscript(base, startLoc, noCalls, state) { if (!this.hasPrecedingLineBreak() && this.match(35)) { this.state.canStartJSXElement = false; this.next(); const nonNullExpression = this.startNodeAt(startLoc); nonNullExpression.expression = base; return this.finishNode(nonNullExpression, "TSNonNullExpression"); } let isOptionalCall = false; if (this.match(18) && this.lookaheadCharCode() === 60) { if (noCalls) { state.stop = true; return base; } state.optionalChainMember = isOptionalCall = true; this.next(); } if (this.match(47) || this.match(51)) { let missingParenErrorLoc; const result = this.tsTryParseAndCatch(() => { if (!noCalls && this.atPossibleAsyncArrow(base)) { const asyncArrowFn = this.tsTryParseGenericAsyncArrowFunction(startLoc); if (asyncArrowFn) { return asyncArrowFn; } } const typeArguments = this.tsParseTypeArgumentsInExpression(); if (!typeArguments) return; if (isOptionalCall && !this.match(10)) { missingParenErrorLoc = this.state.curPosition(); return; } if ((0, _types.tokenIsTemplate)(this.state.type)) { const result = super.parseTaggedTemplateExpression(base, startLoc, state); result.typeParameters = typeArguments; return result; } if (!noCalls && this.eat(10)) { const node = this.startNodeAt(startLoc); node.callee = base; node.arguments = this.parseCallExpressionArguments(11, false); this.tsCheckForInvalidTypeCasts(node.arguments); node.typeParameters = typeArguments; if (state.optionalChainMember) { node.optional = isOptionalCall; } return this.finishCallExpression(node, state.optionalChainMember); } const tokenType = this.state.type; if (tokenType === 48 || tokenType === 52 || tokenType !== 10 && (0, _types.tokenCanStartExpression)(tokenType) && !this.hasPrecedingLineBreak()) { return; } const node = this.startNodeAt(startLoc); node.expression = base; node.typeParameters = typeArguments; return this.finishNode(node, "TSInstantiationExpression"); }); if (missingParenErrorLoc) { this.unexpected(missingParenErrorLoc, 10); } if (result) { if (result.type === "TSInstantiationExpression" && (this.match(16) || this.match(18) && this.lookaheadCharCode() !== 40)) { this.raise(TSErrors.InvalidPropertyAccessAfterInstantiationExpression, { at: this.state.startLoc }); } return result; } } return super.parseSubscript(base, startLoc, noCalls, state); } parseNewCallee(node) { var _callee$extra; super.parseNewCallee(node); const { callee } = node; if (callee.type === "TSInstantiationExpression" && !((_callee$extra = callee.extra) != null && _callee$extra.parenthesized)) { node.typeParameters = callee.typeParameters; node.callee = callee.expression; } } parseExprOp(left, leftStartLoc, minPrec) { let isSatisfies; if ((0, _types.tokenOperatorPrecedence)(58) > minPrec && !this.hasPrecedingLineBreak() && (this.isContextual(93) || (isSatisfies = this.isContextual(118)))) { const node = this.startNodeAt(leftStartLoc); node.expression = left; node.typeAnnotation = this.tsInType(() => { this.next(); if (this.match(75)) { if (isSatisfies) { this.raise(_parseError.Errors.UnexpectedKeyword, { at: this.state.startLoc, keyword: "const" }); } return this.tsParseTypeReference(); } return this.tsParseType(); }); this.finishNode(node, isSatisfies ? "TSSatisfiesExpression" : "TSAsExpression"); this.reScan_lt_gt(); return this.parseExprOp(node, leftStartLoc, minPrec); } return super.parseExprOp(left, leftStartLoc, minPrec); } checkReservedWord(word, startLoc, checkKeywords, isBinding) { if (!this.state.isAmbientContext) { super.checkReservedWord(word, startLoc, checkKeywords, isBinding); } } checkImportReflection(node) { super.checkImportReflection(node); if (node.module && node.importKind !== "value") { this.raise(TSErrors.ImportReflectionHasImportType, { at: node.specifiers[0].loc.start }); } } checkDuplicateExports() {} isPotentialImportPhase(isExport) { if (super.isPotentialImportPhase(isExport)) return true; if (this.isContextual(128)) { const ch = this.lookaheadCharCode(); return isExport ? ch === 123 || ch === 42 : ch !== 61; } return !isExport && this.isContextual(87); } applyImportPhase(node, isExport, phase, loc) { super.applyImportPhase(node, isExport, phase, loc); if (isExport) { node.exportKind = phase === "type" ? "type" : "value"; } else { node.importKind = phase === "type" || phase === "typeof" ? phase : "value"; } } parseImport(node) { if (this.match(131)) { node.importKind = "value"; return super.parseImport(node); } let importNode; if ((0, _types.tokenIsIdentifier)(this.state.type) && this.lookaheadCharCode() === 61) { node.importKind = "value"; return this.tsParseImportEqualsDeclaration(node); } else if (this.isContextual(128)) { const maybeDefaultIdentifier = this.parseMaybeImportPhase(node, false); if (this.lookaheadCharCode() === 61) { return this.tsParseImportEqualsDeclaration(node, maybeDefaultIdentifier); } else { importNode = super.parseImportSpecifiersAndAfter(node, maybeDefaultIdentifier); } } else { importNode = super.parseImport(node); } if (importNode.importKind === "type" && importNode.specifiers.length > 1 && importNode.specifiers[0].type === "ImportDefaultSpecifier") { this.raise(TSErrors.TypeImportCannotSpecifyDefaultAndNamed, { at: importNode }); } return importNode; } parseExport(node, decorators) { if (this.match(83)) { this.next(); let maybeDefaultIdentifier = null; if (this.isContextual(128) && this.isPotentialImportPhase(false)) { maybeDefaultIdentifier = this.parseMaybeImportPhase(node, false); } else { node.importKind = "value"; } return this.tsParseImportEqualsDeclaration(node, maybeDefaultIdentifier, true); } else if (this.eat(29)) { const assign = node; assign.expression = super.parseExpression(); this.semicolon(); this.sawUnambiguousESM = true; return this.finishNode(assign, "TSExportAssignment"); } else if (this.eatContextual(93)) { const decl = node; this.expectContextual(126); decl.id = this.parseIdentifier(); this.semicolon(); return this.finishNode(decl, "TSNamespaceExportDeclaration"); } else { return super.parseExport(node, decorators); } } isAbstractClass() { return this.isContextual(122) && this.lookahead().type === 80; } parseExportDefaultExpression() { if (this.isAbstractClass()) { const cls = this.startNode(); this.next(); cls.abstract = true; return this.parseClass(cls, true, true); } if (this.match(127)) { const result = this.tsParseInterfaceDeclaration(this.startNode()); if (result) return result; } return super.parseExportDefaultExpression(); } parseVarStatement(node, kind, allowMissingInitializer = false) { const { isAmbientContext } = this.state; const declaration = super.parseVarStatement(node, kind, allowMissingInitializer || isAmbientContext); if (!isAmbientContext) return declaration; for (const { id, init } of declaration.declarations) { if (!init) continue; if (kind !== "const" || !!id.typeAnnotation) { this.raise(TSErrors.InitializerNotAllowedInAmbientContext, { at: init }); } else if (!isValidAmbientConstInitializer(init, this.hasPlugin("estree"))) { this.raise(TSErrors.ConstInitiailizerMustBeStringOrNumericLiteralOrLiteralEnumReference, { at: init }); } } return declaration; } parseStatementContent(flags, decorators) { if (this.match(75) && this.isLookaheadContextual("enum")) { const node = this.startNode(); this.expect(75); return this.tsParseEnumDeclaration(node, { const: true }); } if (this.isContextual(124)) { return this.tsParseEnumDeclaration(this.startNode()); } if (this.isContextual(127)) { const result = this.tsParseInterfaceDeclaration(this.startNode()); if (result) return result; } return super.parseStatementContent(flags, decorators); } parseAccessModifier() { return this.tsParseModifier(["public", "protected", "private"]); } tsHasSomeModifiers(member, modifiers) { return modifiers.some(modifier => { if (tsIsAccessModifier(modifier)) { return member.accessibility === modifier; } return !!member[modifier]; }); } tsIsStartOfStaticBlocks() { return this.isContextual(104) && this.lookaheadCharCode() === 123; } parseClassMember(classBody, member, state) { const modifiers = ["declare", "private", "public", "protected", "override", "abstract", "readonly", "static"]; this.tsParseModifiers({ allowedModifiers: modifiers, disallowedModifiers: ["in", "out"], stopOnStartOfClassStaticBlock: true, errorTemplate: TSErrors.InvalidModifierOnTypeParameterPositions }, member); const callParseClassMemberWithIsStatic = () => { if (this.tsIsStartOfStaticBlocks()) { this.next(); this.next(); if (this.tsHasSomeModifiers(member, modifiers)) { this.raise(TSErrors.StaticBlockCannotHaveModifier, { at: this.state.curPosition() }); } super.parseClassStaticBlock(classBody, member); } else { this.parseClassMemberWithIsStatic(classBody, member, state, !!member.static); } }; if (member.declare) { this.tsInAmbientContext(callParseClassMemberWithIsStatic); } else { callParseClassMemberWithIsStatic(); } } parseClassMemberWithIsStatic(classBody, member, state, isStatic) { const idx = this.tsTryParseIndexSignature(member); if (idx) { classBody.body.push(idx); if (member.abstract) { this.raise(TSErrors.IndexSignatureHasAbstract, { at: member }); } if (member.accessibility) { this.raise(TSErrors.IndexSignatureHasAccessibility, { at: member, modifier: member.accessibility }); } if (member.declare) { this.raise(TSErrors.IndexSignatureHasDeclare, { at: member }); } if (member.override) { this.raise(TSErrors.IndexSignatureHasOverride, { at: member }); } return; } if (!this.state.inAbstractClass && member.abstract) { this.raise(TSErrors.NonAbstractClassHasAbstractMethod, { at: member }); } if (member.override) { if (!state.hadSuperClass) { this.raise(TSErrors.OverrideNotInSubClass, { at: member }); } } super.parseClassMemberWithIsStatic(classBody, member, state, isStatic); } parsePostMemberNameModifiers(methodOrProp) { const optional = this.eat(17); if (optional) methodOrProp.optional = true; if (methodOrProp.readonly && this.match(10)) { this.raise(TSErrors.ClassMethodHasReadonly, { at: methodOrProp }); } if (methodOrProp.declare && this.match(10)) { this.raise(TSErrors.ClassMethodHasDeclare, { at: methodOrProp }); } } parseExpressionStatement(node, expr, decorators) { const decl = expr.type === "Identifier" ? this.tsParseExpressionStatement(node, expr, decorators) : undefined; return decl || super.parseExpressionStatement(node, expr, decorators); } shouldParseExportDeclaration() { if (this.tsIsDeclarationStart()) return true; return super.shouldParseExportDeclaration(); } parseConditional(expr, startLoc, refExpressionErrors) { if (!this.state.maybeInArrowParameters || !this.match(17)) { return super.parseConditional(expr, startLoc, refExpressionErrors); } const result = this.tryParse(() => super.parseConditional(expr, startLoc)); if (!result.node) { if (result.error) { super.setOptionalParametersError(refExpressionErrors, result.error); } return expr; } if (result.error) this.state = result.failState; return result.node; } parseParenItem(node, startLoc) { node = super.parseParenItem(node, startLoc); if (this.eat(17)) { node.optional = true; this.resetEndLocation(node); } if (this.match(14)) { const typeCastNode = this.startNodeAt(startLoc); typeCastNode.expression = node; typeCastNode.typeAnnotation = this.tsParseTypeAnnotation(); return this.finishNode(typeCastNode, "TSTypeCastExpression"); } return node; } parseExportDeclaration(node) { if (!this.state.isAmbientContext && this.isContextual(123)) { return this.tsInAmbientContext(() => this.parseExportDeclaration(node)); } const startLoc = this.state.startLoc; const isDeclare = this.eatContextual(123); if (isDeclare && (this.isContextual(123) || !this.shouldParseExportDeclaration())) { throw this.raise(TSErrors.ExpectedAmbientAfterExportDeclare, { at: this.state.startLoc }); } const isIdentifier = (0, _types.tokenIsIdentifier)(this.state.type); const declaration = isIdentifier && this.tsTryParseExportDeclaration() || super.parseExportDeclaration(node); if (!declaration) return null; if (declaration.type === "TSInterfaceDeclaration" || declaration.type === "TSTypeAliasDeclaration" || isDeclare) { node.exportKind = "type"; } if (isDeclare) { this.resetStartLocation(declaration, startLoc); declaration.declare = true; } return declaration; } parseClassId(node, isStatement, optionalId, bindingType) { if ((!isStatement || optionalId) && this.isContextual(111)) { return; } super.parseClassId(node, isStatement, optionalId, node.declare ? _scopeflags.BIND_TS_AMBIENT : _scopeflags.BIND_CLASS); const typeParameters = this.tsTryParseTypeParameters(this.tsParseInOutConstModifiers); if (typeParameters) node.typeParameters = typeParameters; } parseClassPropertyAnnotation(node) { if (!node.optional) { if (this.eat(35)) { node.definite = true; } else if (this.eat(17)) { node.optional = true; } } const type = this.tsTryParseTypeAnnotation(); if (type) node.typeAnnotation = type; } parseClassProperty(node) { this.parseClassPropertyAnnotation(node); if (this.state.isAmbientContext && !(node.readonly && !node.typeAnnotation) && this.match(29)) { this.raise(TSErrors.DeclareClassFieldHasInitializer, { at: this.state.startLoc }); } if (node.abstract && this.match(29)) { const { key } = node; this.raise(TSErrors.AbstractPropertyHasInitializer, { at: this.state.startLoc, propertyName: key.type === "Identifier" && !node.computed ? key.name : `[${this.input.slice(key.start, key.end)}]` }); } return super.parseClassProperty(node); } parseClassPrivateProperty(node) { if (node.abstract) { this.raise(TSErrors.PrivateElementHasAbstract, { at: node }); } if (node.accessibility) { this.raise(TSErrors.PrivateElementHasAccessibility, { at: node, modifier: node.accessibility }); } this.parseClassPropertyAnnotation(node); return super.parseClassPrivateProperty(node); } parseClassAccessorProperty(node) { this.parseClassPropertyAnnotation(node); if (node.optional) { this.raise(TSErrors.AccessorCannotBeOptional, { at: node }); } return super.parseClassAccessorProperty(node); } pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) { const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier); if (typeParameters && isConstructor) { this.raise(TSErrors.ConstructorHasTypeParameters, { at: typeParameters }); } const { declare = false, kind } = method; if (declare && (kind === "get" || kind === "set")) { this.raise(TSErrors.DeclareAccessor, { at: method, kind }); } if (typeParameters) method.typeParameters = typeParameters; super.pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper); } pushClassPrivateMethod(classBody, method, isGenerator, isAsync) { const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier); if (typeParameters) method.typeParameters = typeParameters; super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync); } declareClassPrivateMethodInScope(node, kind) { if (node.type === "TSDeclareMethod") return; if (node.type === "MethodDefinition" && !node.value.body) return; super.declareClassPrivateMethodInScope(node, kind); } parseClassSuper(node) { super.parseClassSuper(node); if (node.superClass && (this.match(47) || this.match(51))) { node.superTypeParameters = this.tsParseTypeArgumentsInExpression(); } if (this.eatContextual(111)) { node.implements = this.tsParseHeritageClause("implements"); } } parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors) { const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier); if (typeParameters) prop.typeParameters = typeParameters; return super.parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors); } parseFunctionParams(node, isConstructor) { const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier); if (typeParameters) node.typeParameters = typeParameters; super.parseFunctionParams(node, isConstructor); } parseVarId(decl, kind) { super.parseVarId(decl, kind); if (decl.id.type === "Identifier" && !this.hasPrecedingLineBreak() && this.eat(35)) { decl.definite = true; } const type = this.tsTryParseTypeAnnotation(); if (type) { decl.id.typeAnnotation = type; this.resetEndLocation(decl.id); } } parseAsyncArrowFromCallExpression(node, call) { if (this.match(14)) { node.returnType = this.tsParseTypeAnnotation(); } return super.parseAsyncArrowFromCallExpression(node, call); } parseMaybeAssign(refExpressionErrors, afterLeftParse) { var _jsx, _jsx2, _typeCast, _jsx3, _typeCast2; let state; let jsx; let typeCast; if (this.hasPlugin("jsx") && (this.match(140) || this.match(47))) { state = this.state.clone(); jsx = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state); if (!jsx.error) return jsx.node; const { context } = this.state; const currentContext = context[context.length - 1]; if (currentContext === _context.types.j_oTag || currentContext === _context.types.j_expr) { context.pop(); } } if (!((_jsx = jsx) != null && _jsx.error) && !this.match(47)) { return super.parseMaybeAssign(refExpressionErrors, afterLeftParse); } if (!state || state === this.state) state = this.state.clone(); let typeParameters; const arrow = this.tryParse(abort => { var _expr$extra, _typeParameters; typeParameters = this.tsParseTypeParameters(this.tsParseConstModifier); const expr = super.parseMaybeAssign(refExpressionErrors, afterLeftParse); if (expr.type !== "ArrowFunctionExpression" || (_expr$extra = expr.extra) != null && _expr$extra.parenthesized) { abort(); } if (((_typeParameters = typeParameters) == null ? void 0 : _typeParameters.params.length) !== 0) { this.resetStartLocationFromNode(expr, typeParameters); } expr.typeParameters = typeParameters; ; return expr; }, state); if (!arrow.error && !arrow.aborted) { if (typeParameters) this.reportReservedArrowTypeParam(typeParameters); return arrow.node; } if (!jsx) { assert(!this.hasPlugin("jsx")); typeCast = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state); if (!typeCast.error) return typeCast.node; } if ((_jsx2 = jsx) != null && _jsx2.node) { this.state = jsx.failState; return jsx.node; } if (arrow.node) { this.state = arrow.failState; if (typeParameters) this.reportReservedArrowTypeParam(typeParameters); return arrow.node; } if ((_typeCast = typeCast) != null && _typeCast.node) { this.state = typeCast.failState; return typeCast.node; } throw ((_jsx3 = jsx) == null ? void 0 : _jsx3.error) || arrow.error || ((_typeCast2 = typeCast) == null ? void 0 : _typeCast2.error); } reportReservedArrowTypeParam(node) { var _node$extra; if (node.params.length === 1 && !node.params[0].constraint && !((_node$extra = node.extra) != null && _node$extra.trailingComma) && this.getPluginOption("typescript", "disallowAmbiguousJSXLike")) { this.raise(TSErrors.ReservedArrowTypeParam, { at: node }); } } parseMaybeUnary(refExpressionErrors, sawUnary) { if (!this.hasPlugin("jsx") && this.match(47)) { return this.tsParseTypeAssertion(); } return super.parseMaybeUnary(refExpressionErrors, sawUnary); } parseArrow(node) { if (this.match(14)) { const result = this.tryParse(abort => { const returnType = this.tsParseTypeOrTypePredicateAnnotation(14); if (this.canInsertSemicolon() || !this.match(19)) abort(); return returnType; }); if (result.aborted) return; if (!result.thrown) { if (result.error) this.state = result.failState; node.returnType = result.node; } } return super.parseArrow(node); } parseAssignableListItemTypes(param, flags) { if (!(flags & _lval.ParseBindingListFlags.IS_FUNCTION_PARAMS)) return param; if (this.eat(17)) { param.optional = true; } const type = this.tsTryParseTypeAnnotation(); if (type) param.typeAnnotation = type; this.resetEndLocation(param); return param; } isAssignable(node, isBinding) { switch (node.type) { case "TSTypeCastExpression": return this.isAssignable(node.expression, isBinding); case "TSParameterProperty": return true; default: return super.isAssignable(node, isBinding); } } toAssignable(node, isLHS = false) { switch (node.type) { case "ParenthesizedExpression": this.toAssignableParenthesizedExpression(node, isLHS); break; case "TSAsExpression": case "TSSatisfiesExpression": case "TSNonNullExpression": case "TSTypeAssertion": if (isLHS) { this.expressionScope.recordArrowParameterBindingError(TSErrors.UnexpectedTypeCastInParameter, { at: node }); } else { this.raise(TSErrors.UnexpectedTypeCastInParameter, { at: node }); } this.toAssignable(node.expression, isLHS); break; case "AssignmentExpression": if (!isLHS && node.left.type === "TSTypeCastExpression") { node.left = this.typeCastToParameter(node.left); } default: super.toAssignable(node, isLHS); } } toAssignableParenthesizedExpression(node, isLHS) { switch (node.expression.type) { case "TSAsExpression": case "TSSatisfiesExpression": case "TSNonNullExpression": case "TSTypeAssertion": case "ParenthesizedExpression": this.toAssignable(node.expression, isLHS); break; default: super.toAssignable(node, isLHS); } } checkToRestConversion(node, allowPattern) { switch (node.type) { case "TSAsExpression": case "TSSatisfiesExpression": case "TSTypeAssertion": case "TSNonNullExpression": this.checkToRestConversion(node.expression, false); break; default: super.checkToRestConversion(node, allowPattern); } } isValidLVal(type, isUnparenthesizedInAssign, binding) { return getOwn({ TSTypeCastExpression: true, TSParameterProperty: "parameter", TSNonNullExpression: "expression", TSAsExpression: (binding !== _scopeflags.BIND_NONE || !isUnparenthesizedInAssign) && ["expression", true], TSSatisfiesExpression: (binding !== _scopeflags.BIND_NONE || !isUnparenthesizedInAssign) && ["expression", true], TSTypeAssertion: (binding !== _scopeflags.BIND_NONE || !isUnparenthesizedInAssign) && ["expression", true] }, type) || super.isValidLVal(type, isUnparenthesizedInAssign, binding); } parseBindingAtom() { if (this.state.type === 78) { return this.parseIdentifier(true); } return super.parseBindingAtom(); } parseMaybeDecoratorArguments(expr) { if (this.match(47) || this.match(51)) { const typeArguments = this.tsParseTypeArgumentsInExpression(); if (this.match(10)) { const call = super.parseMaybeDecoratorArguments(expr); call.typeParameters = typeArguments; return call; } this.unexpected(null, 10); } return super.parseMaybeDecoratorArguments(expr); } checkCommaAfterRest(close) { if (this.state.isAmbientContext && this.match(12) && this.lookaheadCharCode() === close) { this.next(); return false; } return super.checkCommaAfterRest(close); } isClassMethod() { return this.match(47) || super.isClassMethod(); } isClassProperty() { return this.match(35) || this.match(14) || super.isClassProperty(); } parseMaybeDefault(startLoc, left) { const node = super.parseMaybeDefault(startLoc, left); if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) { this.raise(TSErrors.TypeAnnotationAfterAssign, { at: node.typeAnnotation }); } return node; } getTokenFromCode(code) { if (this.state.inType) { if (code === 62) { this.finishOp(48, 1); return; } if (code === 60) { this.finishOp(47, 1); return; } } super.getTokenFromCode(code); } reScan_lt_gt() { const { type } = this.state; if (type === 47) { this.state.pos -= 1; this.readToken_lt(); } else if (type === 48) { this.state.pos -= 1; this.readToken_gt(); } } reScan_lt() { const { type } = this.state; if (type === 51) { this.state.pos -= 2; this.finishOp(47, 1); return 47; } return type; } toAssignableList(exprList, trailingCommaLoc, isLHS) { for (let i = 0; i < exprList.length; i++) { const expr = exprList[i]; if ((expr == null ? void 0 : expr.type) === "TSTypeCastExpression") { exprList[i] = this.typeCastToParameter(expr); } } super.toAssignableList(exprList, trailingCommaLoc, isLHS); } typeCastToParameter(node) { node.expression.typeAnnotation = node.typeAnnotation; this.resetEndLocation(node.expression, node.typeAnnotation.loc.end); return node.expression; } shouldParseArrow(params) { if (this.match(14)) { return params.every(expr => this.isAssignable(expr, true)); } return super.shouldParseArrow(params); } shouldParseAsyncArrow() { return this.match(14) || super.shouldParseAsyncArrow(); } canHaveLeadingDecorator() { return super.canHaveLeadingDecorator() || this.isAbstractClass(); } jsxParseOpeningElementAfterName(node) { if (this.match(47) || this.match(51)) { const typeArguments = this.tsTryParseAndCatch(() => this.tsParseTypeArgumentsInExpression()); if (typeArguments) node.typeParameters = typeArguments; } return super.jsxParseOpeningElementAfterName(node); } getGetterSetterExpectedParamCount(method) { const baseCount = super.getGetterSetterExpectedParamCount(method); const params = this.getObjectOrClassMethodParams(method); const firstParam = params[0]; const hasContextParam = firstParam && this.isThisParam(firstParam); return hasContextParam ? baseCount + 1 : baseCount; } parseCatchClauseParam() { const param = super.parseCatchClauseParam(); const type = this.tsTryParseTypeAnnotation(); if (type) { param.typeAnnotation = type; this.resetEndLocation(param); } return param; } tsInAmbientContext(cb) { const oldIsAmbientContext = this.state.isAmbientContext; this.state.isAmbientContext = true; try { return cb(); } finally { this.state.isAmbientContext = oldIsAmbientContext; } } parseClass(node, isStatement, optionalId) { const oldInAbstractClass = this.state.inAbstractClass; this.state.inAbstractClass = !!node.abstract; try { return super.parseClass(node, isStatement, optionalId); } finally { this.state.inAbstractClass = oldInAbstractClass; } } tsParseAbstractDeclaration(node, decorators) { if (this.match(80)) { node.abstract = true; return this.maybeTakeDecorators(decorators, this.parseClass(node, true, false)); } else if (this.isContextual(127)) { if (!this.hasFollowingLineBreak()) { node.abstract = true; this.raise(TSErrors.NonClassMethodPropertyHasAbstractModifer, { at: node }); return this.tsParseInterfaceDeclaration(node); } } else { this.unexpected(null, 80); } } parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope) { const method = super.parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope); if (method.abstract) { const hasBody = this.hasPlugin("estree") ? !!method.value.body : !!method.body; if (hasBody) { const { key } = method; this.raise(TSErrors.AbstractMethodHasImplementation, { at: method, methodName: key.type === "Identifier" && !method.computed ? key.name : `[${this.input.slice(key.start, key.end)}]` }); } } return method; } tsParseTypeParameterName() { const typeName = this.parseIdentifier(); return typeName.name; } shouldParseAsAmbientContext() { return !!this.getPluginOption("typescript", "dts"); } parse() { if (this.shouldParseAsAmbientContext()) { this.state.isAmbientContext = true; } return super.parse(); } getExpression() { if (this.shouldParseAsAmbientContext()) { this.state.isAmbientContext = true; } return super.getExpression(); } parseExportSpecifier(node, isString, isInTypeExport, isMaybeTypeOnly) { if (!isString && isMaybeTypeOnly) { this.parseTypeOnlyImportExportSpecifier(node, false, isInTypeExport); return this.finishNode(node, "ExportSpecifier"); } node.exportKind = "value"; return super.parseExportSpecifier(node, isString, isInTypeExport, isMaybeTypeOnly); } parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, bindingType) { if (!importedIsString && isMaybeTypeOnly) { this.parseTypeOnlyImportExportSpecifier(specifier, true, isInTypeOnlyImport); return this.finishNode(specifier, "ImportSpecifier"); } specifier.importKind = "value"; return super.parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, isInTypeOnlyImport ? _scopeflags.BIND_TS_TYPE_IMPORT : _scopeflags.BIND_FLAGS_TS_IMPORT); } parseTypeOnlyImportExportSpecifier(node, isImport, isInTypeOnlyImportExport) { const leftOfAsKey = isImport ? "imported" : "local"; const rightOfAsKey = isImport ? "local" : "exported"; let leftOfAs = node[leftOfAsKey]; let rightOfAs; let hasTypeSpecifier = false; let canParseAsKeyword = true; const loc = leftOfAs.loc.start; if (this.isContextual(93)) { const firstAs = this.parseIdentifier(); if (this.isContextual(93)) { const secondAs = this.parseIdentifier(); if ((0, _types.tokenIsKeywordOrIdentifier)(this.state.type)) { hasTypeSpecifier = true; leftOfAs = firstAs; rightOfAs = isImport ? this.parseIdentifier() : this.parseModuleExportName(); canParseAsKeyword = false; } else { rightOfAs = secondAs; canParseAsKeyword = false; } } else if ((0, _types.tokenIsKeywordOrIdentifier)(this.state.type)) { canParseAsKeyword = false; rightOfAs = isImport ? this.parseIdentifier() : this.parseModuleExportName(); } else { hasTypeSpecifier = true; leftOfAs = firstAs; } } else if ((0, _types.tokenIsKeywordOrIdentifier)(this.state.type)) { hasTypeSpecifier = true; if (isImport) { leftOfAs = this.parseIdentifier(true); if (!this.isContextual(93)) { this.checkReservedWord(leftOfAs.name, leftOfAs.loc.start, true, true); } } else { leftOfAs = this.parseModuleExportName(); } } if (hasTypeSpecifier && isInTypeOnlyImportExport) { this.raise(isImport ? TSErrors.TypeModifierIsUsedInTypeImports : TSErrors.TypeModifierIsUsedInTypeExports, { at: loc }); } node[leftOfAsKey] = leftOfAs; node[rightOfAsKey] = rightOfAs; const kindKey = isImport ? "importKind" : "exportKind"; node[kindKey] = hasTypeSpecifier ? "type" : "value"; if (canParseAsKeyword && this.eatContextual(93)) { node[rightOfAsKey] = isImport ? this.parseIdentifier() : this.parseModuleExportName(); } if (!node[rightOfAsKey]) { node[rightOfAsKey] = (0, _node.cloneIdentifier)(node[leftOfAsKey]); } if (isImport) { this.checkIdentifier(node[rightOfAsKey], hasTypeSpecifier ? _scopeflags.BIND_TS_TYPE_IMPORT : _scopeflags.BIND_FLAGS_TS_IMPORT); } } }; exports.default = _default; function isPossiblyLiteralEnum(expression) { if (expression.type !== "MemberExpression") return false; const { computed, property } = expression; if (computed && property.type !== "StringLiteral" && (property.type !== "TemplateLiteral" || property.expressions.length > 0)) { return false; } return isUncomputedMemberExpressionChain(expression.object); } function isValidAmbientConstInitializer(expression, estree) { var _expression$extra; const { type } = expression; if ((_expression$extra = expression.extra) != null && _expression$extra.parenthesized) { return false; } if (estree) { if (type === "Literal") { const { value } = expression; if (typeof value === "string" || typeof value === "boolean") { return true; } } } else { if (type === "StringLiteral" || type === "BooleanLiteral") { return true; } } if (isNumber(expression, estree) || isNegativeNumber(expression, estree)) { return true; } if (type === "TemplateLiteral" && expression.expressions.length === 0) { return true; } if (isPossiblyLiteralEnum(expression)) { return true; } return false; } function isNumber(expression, estree) { if (estree) { return expression.type === "Literal" && (typeof expression.value === "number" || "bigint" in expression); } return expression.type === "NumericLiteral" || expression.type === "BigIntLiteral"; } function isNegativeNumber(expression, estree) { if (expression.type === "UnaryExpression") { const { operator, argument } = expression; if (operator === "-" && isNumber(argument, estree)) { return true; } } return false; } function isUncomputedMemberExpressionChain(expression) { if (expression.type === "Identifier") return true; if (expression.type !== "MemberExpression" || expression.computed) { return false; } return isUncomputedMemberExpressionChain(expression.object); } //# sourceMappingURL=index.js.map