{"version":3,"sources":["webpack:///./src/components/primary-buttons/primary-buttons.tsx","webpack:///./src/components/pages/dashboard/challenge/constants.ts","webpack:///./src/components/terms-modal.tsx","webpack:///./src/components/pages/contribution/speak/audio-web.ts","webpack:///./src/components/pages/dashboard/challenge/images/ibm.svg","webpack:///./src/components/pages/dashboard/challenge/images/lenovo.svg","webpack:///./src/components/pages/dashboard/challenge/images/mozilla.svg","webpack:///./src/components/pages/dashboard/challenge/images/sap.svg","webpack:///../node_modules/lodash.pick/index.js","webpack:///./src/components/pages/profile/settings/submission-screenshot-lg.jpg","webpack:///./src/components/pages/profile/settings/submission-screenshot-xs.jpg","webpack:///./src/components/pages/profile/avatar-setup/avatar-setup.tsx","webpack:///./src/components/pages/profile/delete/delete.tsx","webpack:///./src/stores/demographics.ts","webpack:///./src/components/pages/profile/info/info.tsx","webpack:///./src/components/pages/profile/settings/settings.tsx","webpack:///./src/components/pages/profile/layout.tsx"],"names":["PrimaryButton","_a","className","to","trackClass","props","React","disabled","getTrackClass","join","LocaleLink","Object","type","RecordButton","status","MicIcon","StopIcon","RecordLink","URLS","SPEAK","Voice","PlayButton","isPlaying","OldPlayIcon","PlayLink","LISTEN","challengeLogos","ibm","background","border","url","require","lenovo","mozilla","sap","getNow","dateParam","location","search","match","date","dateStr","dateObj","Date","isNaN","getTime","isValidDate","isChallengeLive","challenge","now","start","end","isBeforeChallenge","pilotDates","isEnrolled","account","enrollment","weeklyChallengeCopy","title","subtitle","explanation","FINAL_CHALLENGE_WEEK","length","withLocalization","getString","onAgree","onDisagree","Localized","id","elems","termsLink","TERMS","blank","privacyLink","PRIVACY","Modal","buttons","AudioError","AudioWeb","constructor","this","recorderListeners","dataavailable","stop","analyze","bind","isReady","microphone","getMicrophone","Promise","res","rej","deny","error","NotAllowedError","NOT_ALLOWED","NotFoundError","NO_MIC","name","resolve","stream","navigator","mediaDevices","getUserMedia","audio","then","webkitGetUserMedia","mozGetUserMedia","NO_SUPPORT","isMicrophoneSupported","isAudioRecordingSupported","window","MediaRecorder","notSupported","analyzerNode","getByteFrequencyData","frequencyBins","volumeCallback","Math","max","setVolumeCallback","cb","init","audioContext","AudioContext","webkitAudioContext","sourceNode","createMediaStreamSource","volumeNode","createGain","createAnalyser","outputNode","createMediaStreamDestination","channelCount","connect","recorder","fftSize","smoothingTimeConstant","Uint8Array","frequencyBinCount","jsNode","createScriptProcessor","destination","chunks","removeEventListener","e","push","data","addEventListener","onaudioprocess","console","undefined","blob","Blob","getAudioFormat","URL","createObjectURL","reject","release","track","getTracks","module","exports","freeGlobal","global","freeSelf","self","root","Function","apply","func","thisArg","args","call","arrayPush","array","values","index","offset","objectProto","prototype","hasOwnProperty","objectToString","toString","Symbol","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","nativeMax","isFlattenable","value","isArray","isObjectLike","isLength","tag","isObject","isFunction","isArrayLike","isArrayLikeObject","isArguments","toKey","isSymbol","result","Array","pick","object","predicate","key","basePickBy","basePick","iteratee","arrayMap","baseFlatten","depth","isStrict","arguments","otherArgs","Lottie","lazy","animationData","resizeImage","file","maxSize","reader","FileReader","image","Image","canvas","document","createElement","resize","width","height","getContext","drawImage","dataURI","bytes","split","indexOf","atob","unescape","mime","ia","i","charCodeAt","dataURItoBlob","toDataURL","ok","no","onload","readerEvent","src","target","readAsDataURL","Error","AvatarSetup","state","isSaving","isRecording","counter","clipStatus","blobUrl","avatarClipUrl","isUnsupportedPlatform","maxVolume","recordingStartTime","recordingStopTime","avatarRecordedBlobUrl","audioRef","updateVolume","volume","playAvatarClip","__awaiter","locale","trackVoiceAvatar","current","pause","currentTime","setState","play","playRecordedAvatarClip","log","handleRecordClick","saveRecording","startRecording","setTimeout","err","info","downloadTimer","setInterval","tl","clearInterval","updateAvatarClip","cancelRecording","clip","api","fetchAvatarClip","componentDidMount","user","avatar_clip_url","componentWillUnmount","saveFileAvatar","files","addNotification","refreshUser","item","saveAvatar","includes","trackProfile","uploadAvatarClip","addUpload","saveAvatarClip","confirm","CheckIcon","deleteAvatarClip","render","avatarType","avatar_url","startsWith","defaultOptions","loop","autoplay","rendererSettings","preserveAspectRatio","hasClip","isProduction","preload","ref","onEnded","onError","onClick","Suspense","fallback","options","eventListeners","Button","outline","rounded","TrashIcon","CrossIcon","ShareIcon","onDragOver","event","preventDefault","onDrop","dataTransfer","browseWrap","accept","onChange","LinkIcon","Notifications","actions","addPill","User","refresh","Uploads","add","DeleteProfile","keep","textareaRef","Toggle","onText","offText","defaultChecked","checked","InfoIcon","Hr","open","encodeURIComponent","email","ACCENTS","br","gwenedeg","kerneveg","leoneg","tregerieg","ca","balearic","central","northwestern","northern","valencian","cy","united_kingdom","de","germany","netherlands","austria","poland","switzerland","france","denmark","belgium","hungary","brazil","czechia","united_states","slovakia","russia","kazakhstan","italy","finland","slovenia","canada","bulgaria","greece","lithuania","luxembourg","paraguay","romania","liechtenstein","namibia","turkey","en","us","australia","england","philippines","hongkong","indian","ireland","malaysia","newzealand","scotland","singapore","southatlandtic","african","wales","bermuda","eo","internacia","es","nortepeninsular","centrosurpeninsular","surpeninsular","canario","mexicano","americacentral","caribe","andino","rioplatense","chileno","filipinas","eu","mendebalekoa","erdialdekoa_nafarra","nafarlapurtarra_zuberoatarra","fr","madagascar","cameroon","cote_d_ivoire","tunisia","mali","algeria","morocco","burundi","senegal","niger","togo","burkina_faso","congo_brazzaville","congo_kinshasa","benin","guinea","chad","central_african_republic","portugal","gabon","syria","reunion","mauritania","haiti","comoros","martinique","guadeloupe","new_caledonia","french_polynesia","french_guiana","vanuatu","mayotte","cyprus","equatorial_guinea","seychelles","malta","mauritius","st_martin","monaco","lebanon","djibouti","wallis_et_futuna","st_barthelemy","andorra","st_pierre_et_miquelon","rwanda","nl","suriname","curacao","aruba","sint_maarten","south_africa","indonesia","mumhain","connachta","ulaidh","keelung_city","taipei_city","new_taipei_city","taoyuan_city","hsinchu_county","hsinchu_city","miaoli_county","taichung_city","changhua_county","nantou_county","yunlin_county","chiayi_county","chiayi_city","tainan_city","kaohsiung_city","pingtung_county","yilan_county","hualien_county","taitung_county","penghu_county","kinmen_county","lienchiang_county","hong_kong","AGES","teens","twenties","thirties","fourties","fifties","sixties","seventies","eighties","nineties","SEXES","male","female","other","Tooltip","Options","children","entries","map","withRouter","history","useAPI","toLocaleRoute","useLocale","useTypedSelector","userClients","useAction","addUploads","saveAccount","userFields","setUserFields","useState","username","visible","age","gender","sendEmails","privacyAgreed","locales","setLocales","isInitialized","setIsInitialized","setIsSaving","isSubmitted","setIsSubmitted","showDemographicInfo","setShowDemographicInfo","termsStatus","setTermsStatus","isEnrolledInChallenge","useEffect","isFetchingAccount","basket_token","reduce","u","Boolean","concat","filter","l1","findIndex","l2","handleChangeFor","field","submit","useCallback","l","JSON","parse","client_id","userId","team","invite","subscribeToNewsletter","Redirect","pathname","DASHBOARD","CHALLENGE","showOnboardingModal","earlyEnroll","TermsModal","DownIcon","attrs","label","LabeledInput","LabeledSelect","accent","newLocales","slice","splice","i2","NATIVE_NAMES","_b","arrow","html","theme","LabeledCheckbox","CHALLENGE_TERMS","Section","titleAction","isSubscribed","useIsSubscribed","replaceState","LinkButton","href","origin","PenIcon","getManageSubscriptionURL","rel","SettingsIcon","skip_submission_feedback","alt","localeConnector","infoRoute","avatarRoute","prefRoute","deleteRoute","PROFILE_INFO","PROFILE_AVATAR","PROFILE_SETTINGS","PROFILE_DELETE","r","route","icon","UserIcon","UserPlusIcon","CameraIcon","CogIcon","Infinity","NavLink","text","all","localeLabel","element","setAttribute","style","display","body","appendChild","click","removeChild","downloadData","CloudIcon","Switch","Route","exact","path","component","InfoPage","Component","Settings"],"mappings":"mqBAQO,MAAMA,EAAiBC,I,IAAA,UAC5BC,EAD4B,GAE5BC,EAF4B,WAG5BC,GAAUH,EACVI,uCAC4E,OAC5EC,uBACEJ,UAAW,CACT,iBACAA,EACAG,EAAME,SAAW,WAAa,GAC9BH,EAAaI,YAAc,KAAMJ,GAAc,IAC/CK,KAAK,MACNN,EACCG,gBAACI,IAAUC,eAACR,GAAIA,GAAQE,IAExBC,wCAAQM,KAAK,UAAaP,IAE5BC,uBAAKJ,UAAU,iBAMNW,EAAgBZ,I,IAAA,OAC3Ba,EAD2B,WAE3BV,GAAUH,EACVI,+BAIsC,OACtCC,gBAACN,EAAaW,eACZT,UAAsB,OAAXY,EAAkB,OAAS,UAClCT,EAAK,CACTD,WAAYA,EACZG,SAAqB,YAAXO,IACE,OAAXA,GAAmBR,gBAACS,IAAO,MAChB,cAAXD,GAA0BR,gBAACU,IAAQ,QAI3BC,EAAcZ,GACzBC,gBAACN,EAAaW,eAACT,UAAU,OAAOC,GAAIe,IAAKC,OAAWd,GAClDC,gBAACS,IAAO,OAICK,EAASf,GACpBC,gBAACN,EAAaW,eAACT,UAAU,QAAWG,IAGzBgB,EAAcpB,I,IAAA,UACzBqB,EADyB,WAEzBlB,GAAUH,EACVI,kCAGI,OACJC,gBAACN,EAAaW,eACZT,UAAWoB,EAAY,OAAS,OAChClB,WAAYA,GACRC,GACHiB,EAAYhB,gBAACU,IAAQ,MAAMV,gBAACiB,IAAW,QAI/BC,EAAYnB,GACvBC,gBAACN,EAAaW,eAACT,UAAU,OAAOC,GAAIe,IAAKO,QAAYpB,GACnDC,gBAACiB,IAAW,Q,iCC1EhB,8OAAO,MAAMG,EAMT,CACFC,IAAK,CAAEC,WAAY,OAAQC,QAAQ,EAAMC,IAAKC,EAAQ,MACtDC,OAAQ,CACNJ,WAAY,OACZC,QAAQ,EACRC,IAAKC,EAAQ,MAEfE,QAAS,CACPL,WAAY,OACZC,QAAQ,EACRC,IAAKC,EAAQ,MAEfG,IAAK,CAAEN,WAAY,OAAQC,QAAQ,EAAMC,IAAKC,EAAQ,OAQlDI,EAAS,KACb,MAAMC,EACJC,SAASC,QAAUD,SAASC,OAAOC,MAAM,sBACrCC,EAAOJ,aAAS,EAATA,EAAY,GACzB,OAAOI,GATYC,KACnB,MAAMC,EAAU,IAAIC,KAAKF,GACzB,OAAOC,aAAmBC,OAASC,MAAMF,EAAQG,YAOlCC,CAAYN,GAAQ,IAAIG,KAAKH,GAAQ,IAAIG,MAG7CI,EAAmBC,IAC9B,MAAMC,EAAMd,IACZ,OAAOc,GAAOD,EAAUE,OAASD,EAAMD,EAAUG,KAGtCC,EAAqBJ,GACpBb,IACCa,EAAUE,MAGZG,EAAgC,CAC3CH,MAAO,IAAIP,KAAK,cAChBQ,IAAK,IAAIR,KAAK,eAGHW,EAAcC,IAAuB,aAC7B,QAD6B,EAChDA,aAAO,EAAPA,EAASC,kBAAUvD,WAAA,EAAAA,EAAE+C,WAEVS,EAAsB,CACjC,CACEC,MAAO,yBACPC,SAAU,8DACVC,YACE,iGAEJ,CACEF,MAAO,mBACPC,SAAU,+CACVC,YACE,qGAEJ,CACEF,MAAO,sBACPC,SACE,+EACFC,YACE,sEAIOC,EAAuBJ,EAAoBK,OAAS,G,uDC5EjE,wCA6BeC,gBAnBI,QAAC,UAClBC,EADkB,QAElBC,EAFkB,WAGlBC,GAHiB,SAKjB5D,gBAAC6D,IAAS,CACRC,GAAG,eACHC,MAAO,CACLC,UAAWhE,gBAACI,IAAU,CAACP,GAAIe,IAAKqD,MAAOC,OAAK,IAC5CC,YAAanE,gBAACI,IAAU,CAACP,GAAIe,IAAKwD,QAASF,OAAK,MAElDlE,gBAACqE,IAAK,CACJC,QAAS,CACP,CAACZ,EAAU,gBAAiBC,EAC5B,CAACD,EAAU,mBAAoBE,S,yGClB3BW,E,+SAAZ,SAAYA,GACVA,4BACAA,kBACAA,0BAHF,CAAYA,MAAU,KAWR,MAAOC,EAenBC,cACEC,KAAKC,kBAAoB,CACvB/B,MAAO,KACPgC,cAAe,KACfC,KAAM,MAERH,KAAKI,QAAUJ,KAAKI,QAAQC,KAAKL,MAG3BM,UACN,QAASN,KAAKO,WAGRC,gBACN,OAAO,IAAIC,SAAQ,SAAUC,EAAeC,G,MAC1C,SAASC,EAAKC,GACZF,EACG,CACCG,gBAAiBjB,EAAWkB,YAC5BC,cAAenB,EAAWoB,QACcJ,EAAMK,OAASL,GAG7D,SAASM,EAAQC,GACfV,EAAIU,IAGoB,QAA1B,EAAIC,UAAUC,oBAAYrG,WAAA,EAAAA,EAAEsG,cAC1BF,UAAUC,aACPC,aAAa,CAAEC,OAAO,IACtBC,KAAKN,EAASP,GACRS,UAAUE,aACnBF,UAAUE,aAAa,CAAEC,OAAO,GAAQL,EAASP,GACxCS,UAAUK,mBACnBL,UAAUK,mBAAmB,CAAEF,OAAO,GAAQL,EAASP,GAC9CS,UAAUM,gBACnBN,UAAUM,gBAAgB,CAAEH,OAAO,GAAQL,EAASP,GAGpDD,EAAId,EAAW+B,eAMrBC,wB,MACE,OACwB,QAAtB,EAAAR,UAAUC,oBAAYrG,WAAA,EAAAA,EAAEsG,eACxBF,UAAUE,cACVF,UAAUK,oBACVL,UAAUM,gBAKdG,4BACE,YACkC,IAAzBC,OAAOC,gBACbD,OAAOC,cAAcC,aAIlB7B,UACNJ,KAAKkC,aAAaC,qBAAqBnC,KAAKoC,eAExCpC,KAAKqC,gBACPrC,KAAKqC,eAAeC,KAAKC,OAAOvC,KAAKoC,gBAIzCI,kBAAkBC,GAChBzC,KAAKqC,eAAiBI,EAWlBC,O,yCACJ,GAAI1C,KAAKM,UACP,OAGF,MAAMC,QAAmBP,KAAKQ,gBAE9BR,KAAKO,WAAaA,EAClB,MAAMoC,EAAe,IAAKZ,OAAOa,cAC/Bb,OAAOc,oBACHC,EAAaH,EAAaI,wBAAwBxC,GAClDyC,EAAaL,EAAaM,aAC1Bf,EAAeS,EAAaO,iBAC5BC,EAAaR,EAAaS,+BAGhCN,EAAWO,aAAe,EAC1BL,EAAWK,aAAe,EAC1BnB,EAAamB,aAAe,EAC5BF,EAAWE,aAAe,EAG1BP,EAAWQ,QAAQN,GACnBA,EAAWM,QAAQpB,GACnBA,EAAaoB,QAAQH,GAGrBnD,KAAKuD,SAAW,IAAIxB,OAAOC,cAAcmB,EAAW/B,QAMpDc,EAAasB,QAAU,IACvBtB,EAAauB,sBAAwB,IACrCzD,KAAKoC,cAAgB,IAAIsB,WAAWxB,EAAayB,mBAOjD3D,KAAK4D,OAASjB,EAAakB,sBAAsB,IAAK,EAAG,GACzD7D,KAAK4D,OAAON,QAAQX,EAAamB,aAEjC9D,KAAKkC,aAAeA,EACpBlC,KAAK2C,aAAeA,KAGtBzE,QACE,OAAK8B,KAAKM,UAKH,IAAIG,QAAc,CAACC,EAAeC,KACvCX,KAAK+D,OAAS,GAEd/D,KAAKuD,SAASS,oBAAoB,QAAShE,KAAKC,kBAAkB/B,OAClE8B,KAAKuD,SAASS,oBACZ,gBACAhE,KAAKC,kBAAkBC,eAIzBF,KAAKC,kBAAkB/B,MAAS+F,GAAavD,IAC7CV,KAAKC,kBAAkBC,cAAiB+D,IACtCjE,KAAK+D,OAAOG,KAAKD,EAAEE,OAIrBnE,KAAKuD,SAASa,iBAAiB,QAASpE,KAAKC,kBAAkB/B,OAC/D8B,KAAKuD,SAASa,iBACZ,gBACApE,KAAKC,kBAAkBC,eAOzBF,KAAK4D,OAAOS,eAAiBrE,KAAKI,QAClCJ,KAAKuD,SAASrF,MAAM,QA/BpBoG,QAAQzD,MAAM,oDACPJ,QAAQU,WAkCnBhB,OACE,OAAKH,KAAKM,UAKH,IAAIG,QAAQ,CAACC,EAAeC,KACjCX,KAAK4D,OAAOS,oBAAiBE,EAC7BvE,KAAKuD,SAASS,oBAAoB,OAAQhE,KAAKC,kBAAkBE,MACjEH,KAAKC,kBAAkBE,KAAQ8D,IAC7B,IAAIO,EAAO,IAAIC,KAAKzE,KAAK+D,OAAQ,CAAEnI,KAAM8I,gBACzChE,EAAI,CACF5D,IAAK6H,IAAIC,gBAAgBJ,GACzBA,KAAMA,KAGVxE,KAAKuD,SAASa,iBAAiB,OAAQpE,KAAKC,kBAAkBE,MAC9DH,KAAKuD,SAASpD,UAfdmE,QAAQzD,MAAM,iDACPJ,QAAQoE,UAkBnBC,UACE,GAAI9E,KAAKO,WACP,IAAK,MAAMwE,KAAS/E,KAAKO,WAAWyE,YAClCD,EAAM5E,OAGVH,KAAKO,WAAa,Q,oBCnOtB0E,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,qBCA3C,YAUA,IAUIC,EAA8B,iBAAVC,GAAsBA,GAAUA,EAAOzJ,SAAWA,QAAUyJ,EAGhFC,EAA0B,iBAARC,MAAoBA,MAAQA,KAAK3J,SAAWA,QAAU2J,KAGxEC,EAAOJ,GAAcE,GAAYG,SAAS,cAATA,GAYrC,SAASC,EAAMC,EAAMC,EAASC,GAC5B,OAAQA,EAAK9G,QACX,KAAK,EAAG,OAAO4G,EAAKG,KAAKF,GACzB,KAAK,EAAG,OAAOD,EAAKG,KAAKF,EAASC,EAAK,IACvC,KAAK,EAAG,OAAOF,EAAKG,KAAKF,EAASC,EAAK,GAAIA,EAAK,IAChD,KAAK,EAAG,OAAOF,EAAKG,KAAKF,EAASC,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE3D,OAAOF,EAAKD,MAAME,EAASC,GA+B7B,SAASE,EAAUC,EAAOC,GAKxB,IAJA,IAAIC,GAAS,EACTnH,EAASkH,EAAOlH,OAChBoH,EAASH,EAAMjH,SAEVmH,EAAQnH,GACfiH,EAAMG,EAASD,GAASD,EAAOC,GAEjC,OAAOF,EAIT,IAAII,EAAcxK,OAAOyK,UAGrBC,EAAiBF,EAAYE,eAO7BC,EAAiBH,EAAYI,SAG7BC,EAASjB,EAAKiB,OACdC,EAAuBN,EAAYM,qBACnCC,EAAmBF,EAASA,EAAOG,wBAAqBpC,EAGxDqC,EAAYtE,KAAKC,IAiHrB,SAASsE,EAAcC,GACrB,OAAOC,EAAQD,IAqCjB,SAAqBA,GAEnB,OAmFF,SAA2BA,GACzB,OAAOE,EAAaF,IA9BtB,SAAqBA,GACnB,OAAgB,MAATA,GAkFT,SAAkBA,GAChB,MAAuB,iBAATA,GACZA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,GAnYb,iBA+SGG,CAASH,EAAMhI,UAiDzC,SAAoBgI,GAGlB,IAAII,EA4DN,SAAkBJ,GAChB,IAAIlL,SAAckL,EAClB,QAASA,IAAkB,UAARlL,GAA4B,YAARA,GA9D7BuL,CAASL,GAASR,EAAeT,KAAKiB,GAAS,GACzD,MAhWY,qBAgWLI,GA/VI,8BA+VcA,EArD0BE,CAAWN,GA6BhCO,CAAYP,GApFnCQ,CAAkBR,IAAUT,EAAeR,KAAKiB,EAAO,aAC1DL,EAAqBZ,KAAKiB,EAAO,WAtPzB,sBAsPsCR,EAAeT,KAAKiB,IAxC7CS,CAAYT,OAChCJ,GAAoBI,GAASA,EAAMJ,IAU1C,SAASc,EAAMV,GACb,GAAoB,iBAATA,GAoPb,SAAkBA,GAChB,MAAuB,iBAATA,GACXE,EAAaF,IA7cF,mBA6cYR,EAAeT,KAAKiB,GAtPdW,CAASX,GACvC,OAAOA,EAET,IAAIY,EAAUZ,EAAQ,GACtB,MAAkB,KAAVY,GAAkB,EAAIZ,IAlOjB,IAkOwC,KAAOY,EAkD9D,IAAIX,EAAUY,MAAMZ,QAyKpB,SAASC,EAAaF,GACpB,QAASA,GAAyB,iBAATA,EA0C3B,IAnTkBpB,EAAMxH,EAmTpB0J,GAnTclC,EAmTE,SAASmC,EAAQxM,GACnC,OAAiB,MAAVwM,EAAiB,GA5V1B,SAAkBA,EAAQxM,GAExB,OAcF,SAAoBwM,EAAQxM,EAAOyM,GAKjC,IAJA,IAAI7B,GAAS,EACTnH,EAASzD,EAAMyD,OACf4I,EAAS,KAEJzB,EAAQnH,GAAQ,CACvB,IAAIiJ,EAAM1M,EAAM4K,GACZa,EAAQe,EAAOE,GAEfD,EAAUhB,EAAOiB,KACnBL,EAAOK,GAAOjB,GAGlB,OAAOY,EA3BAM,CADPH,EAASlM,OAAOkM,GACUxM,GAAO,SAASyL,EAAOiB,GAC/C,OAAOA,KAAOF,KAyVaI,CAASJ,EA1bxC,SAAkB9B,EAAOmC,GAKvB,IAJA,IAAIjC,GAAS,EACTnH,EAASiH,EAAQA,EAAMjH,OAAS,EAChC4I,EAASC,MAAM7I,KAEVmH,EAAQnH,GACf4I,EAAOzB,GAASiC,EAASnC,EAAME,GAAQA,EAAOF,GAEhD,OAAO2B,EAkbuCS,CA5XhD,SAASC,EAAYrC,EAAOsC,EAAOP,EAAWQ,EAAUZ,GACtD,IAAIzB,GAAS,EACTnH,EAASiH,EAAMjH,OAKnB,IAHAgJ,IAAcA,EAAYjB,GAC1Ba,IAAWA,EAAS,MAEXzB,EAAQnH,GAAQ,CACvB,IAAIgI,EAAQf,EAAME,GACdoC,EAAQ,GAAKP,EAAUhB,GACrBuB,EAAQ,EAEVD,EAAYtB,EAAOuB,EAAQ,EAAGP,EAAWQ,EAAUZ,GAEnD5B,EAAU4B,EAAQZ,GAEVwB,IACVZ,EAAOA,EAAO5I,QAAUgI,GAG5B,OAAOY,EAwWgDU,CAAY/M,EAAO,GAAImM,KAnT9EtJ,EAAQ0I,OAAoBrC,IAAVrG,EAAuBwH,EAAK5G,OAAS,EAAKZ,EAAO,GAC5D,WAML,IALA,IAAI0H,EAAO2C,UACPtC,GAAS,EACTnH,EAAS8H,EAAUhB,EAAK9G,OAASZ,EAAO,GACxC6H,EAAQ4B,MAAM7I,KAETmH,EAAQnH,GACfiH,EAAME,GAASL,EAAK1H,EAAQ+H,GAE9BA,GAAS,EAET,IADA,IAAIuC,EAAYb,MAAMzJ,EAAQ,KACrB+H,EAAQ/H,GACfsK,EAAUvC,GAASL,EAAKK,GAG1B,OADAuC,EAAUtK,GAAS6H,EACZN,EAAMC,EAAM1F,KAAMwI,KAsS7BvD,EAAOC,QAAU0C,I,8HCtfjB3C,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,4eC6B3C,MAAMuD,EAASC,eAAK,IAAM,mCACpBC,EAAgB5L,EAAQ,IAI9B,SAAS6L,EAAYC,EAAYC,GAC/B,MAAMC,EAAS,IAAIC,WACbC,EAAQ,IAAIC,MACZC,EAASC,SAASC,cAAc,UAYhCC,EAAS,KACb,IAAIC,EAAQN,EAAMM,MACdC,EAASP,EAAMO,OAkBnB,OAhBID,EAAQC,EACND,EAAQT,IACVU,GAAUV,EAAUS,EACpBA,EAAQT,GAGNU,EAASV,IACXS,GAAST,EAAUU,EACnBA,EAASV,GAIbK,EAAOI,MAAQA,EACfJ,EAAOK,OAASA,EAChBL,EAAOM,WAAW,MAAMC,UAAUT,EAAO,EAAG,EAAGM,EAAOC,GA7BjCG,KACrB,MAAMC,EACJD,EAAQE,MAAM,KAAK,GAAGC,QAAQ,WAAa,EACvCC,KAAKJ,EAAQE,MAAM,KAAK,IACxBG,SAASL,EAAQE,MAAM,KAAK,IAC5BI,EAAON,EAAQE,MAAM,KAAK,GAAGA,MAAM,KAAK,GAAGA,MAAM,KAAK,GACtDtH,EAAMqH,EAAM9K,OACZoL,EAAK,IAAIxG,WAAWnB,GAC1B,IAAK,IAAI4H,EAAI,EAAGA,EAAI5H,EAAK4H,IAAKD,EAAGC,GAAKP,EAAMQ,WAAWD,GACvD,OAAO,IAAI1F,KAAK,CAACyF,GAAK,CAAEtO,KAAMqO,KAsBvBI,CADOlB,EAAOmB,UAAU,gBAIjC,OAAO,IAAI7J,QAAQ,CAAC8J,EAAIC,KACjB3B,GAASA,EAAKjN,KAAK2B,MAAM,YAK9BwL,EAAO0B,OAAUC,IACfzB,EAAMwB,OAAS,IAAMF,EAAGjB,KACxBL,EAAM0B,IAAMD,EAAYE,OAAOlD,QAEjCqB,EAAO8B,cAAchC,IARnB2B,EAAG,IAAIM,MAAM,mBAuCnB,MAAMC,UAAoBzP,YAA1ByE,c,oBACE,KAAAiL,MAAe,CACbC,UAAU,EACVC,aAAa,EACb5O,WAAW,EACX6O,QAAS,EACTC,WAAY,WACZC,QAAS,IAAI5G,KACb6G,cAAe,MAIjB,KAAAC,uBAAwB,EACxB,KAAAC,UAAY,EACZ,KAAAC,mBAAqB,EACrB,KAAAC,kBAAoB,EACpB,KAAAC,sBAA6B,KAC7B,KAAAC,SAAWtQ,cAuCH,KAAAuQ,aAAgBC,IACP,MAAXA,GAAkBA,EAAS9L,KAAKwL,YAClCxL,KAAKwL,UAAYM,IAIb,KAAAC,eAAiB,IAAWC,kCAClC,MAAM,OAAEC,GAAWjM,KAAK3E,MACxB6Q,YAAiB,cAAeD,GAC3BjM,KAAKgL,MAAM1O,WAKd0D,KAAK4L,SAASO,QAAQC,QACtBpM,KAAK4L,SAASO,QAAQE,YAAc,EACpCrM,KAAKsM,SAAS,CAAEhQ,WAAW,MAN3B0D,KAAK4L,SAASO,QAAQxB,IAAM3K,KAAKgL,MAAMM,cACvCtL,KAAK4L,SAASO,QAAQI,OACtBvM,KAAKsM,SAAS,CAAEhQ,WAAW,QAQvB,KAAAkQ,uBAAyB,IAAWR,kCAC1C1H,QAAQmI,IAAIzM,KAAK2L,uBACZ3L,KAAKgL,MAAM1O,WAKd0D,KAAK4L,SAASO,QAAQC,QACtBpM,KAAK4L,SAASO,QAAQE,YAAc,EACpCrM,KAAKsM,SAAS,CAAEhQ,WAAW,MAN3B0D,KAAK4L,SAASO,QAAQxB,IAAM3K,KAAK2L,sBACjC3L,KAAK4L,SAASO,QAAQI,OACtBvM,KAAKsM,SAAS,CAAEhQ,WAAW,QAQvB,KAAAoQ,kBAAoB,IAAWV,kCACrC,GAAIhM,KAAKgL,MAAME,YACblL,KAAK2M,qBAIP,UACQ3M,KAAK4M,iBAGXC,WAAW,IAAWb,kCACpBhM,KAAK2M,mBAFU,KAIjB,MAAOG,GACP,KAAMA,KAAOjN,KACX,MAAMiN,MAKJ,KAAAF,eAAiB,IAAWZ,wCAC5BhM,KAAKwB,MAAMtD,QACjB8B,KAAKwL,UAAY,EACjBxL,KAAKyL,mBAAqB9N,KAAKM,MAC/B+B,KAAK0L,kBAAoB,EACzB1L,KAAKsM,SAAS,CACZpB,aAAa,OAIT,KAAAyB,cAAgB,KACtB,GAA8B,YAA1B3M,KAAKgL,MAAMI,WAA0B,CAEvCyB,WAAW,IAAWb,kCACpB,MAAMe,QAAa/M,KAAKwB,MAAMrB,OAC9BH,KAAK2L,sBAAwBoB,EAAKjQ,IAClCkD,KAAKsM,SAAS,CAAEjB,QAAS0B,EAAKvI,KAAM4G,WAAY,gBAJxB,KAM1BpL,KAAK0L,kBAAoB/N,KAAKM,MAC9B+B,KAAKsM,SAAS,CACZpB,aAAa,MAgDX,KAAAC,QAAU,IAAWa,kCAC3B,GAA8B,eAA1BhM,KAAKgL,MAAMI,WAA6B,OAC5CpL,KAAKwB,MAAMsD,gBACL9E,KAAKwB,MAAMkB,OACjB1C,KAAKsM,SAAS,CAAElB,WAAY,WAAYD,QAAS,IACjD,MAAM6B,EAAgBC,YAAY,KAChC,IAAIC,EAAKlN,KAAKgL,MAAMG,QAAU,EAE9B,GADAnL,KAAKsM,SAAS,CAAEnB,QAAS+B,IACrBlN,KAAKgL,MAAMG,SAAW,GAA+B,aAA1BnL,KAAKgL,MAAMI,WAA2B,CACnEpL,KAAKsM,SAAS,CAAElB,WAAY,YAC5B,MAAM,OAAEa,GAAWjM,KAAK3E,MACxB6Q,YAAiB,sBAAuBD,GACxCjM,KAAK0M,oBACLS,cAAcH,KAEf,QAGG,KAAAI,iBAAmB,KACzBpN,KAAKsM,SAAS,CACZhB,cAAe,KACfH,QAAS,EACTC,WAAY,gBAIR,KAAAiC,gBAAkB,IAAWrB,kCACnC,IAAIsB,QAAatN,KAAK3E,MAAMkS,IAAIC,kBAChCF,EACItN,KAAKsM,SAAS,CACZhB,cAAegC,EACflC,WAAY,aACZF,aAAa,IAEflL,KAAKsM,SAAS,CAAElB,WAAY,aAAcF,aAAa,OAhMvDuC,oB,yCAUJ,IAAIH,EATJtN,KAAKwB,MAAQ,IAAI1B,IACjBE,KAAKwB,MAAMgB,kBAAkBxC,KAAK6L,aAAaxL,KAAKL,OAGjDA,KAAKwB,MAAMK,yBACX7B,KAAKwB,MAAMM,8BAEZ9B,KAAKuL,uBAAwB,GAG3BvL,KAAK3E,MAAMqS,KAAKnP,QAAQoP,kBAC1BL,QAAatN,KAAK3E,MAAMkS,IAAIC,mBAE1BF,GAAMtN,KAAKsM,SAAS,CAAEhB,cAAegC,IACzCtN,KAAKsM,SAAS,CAAElB,WAAY,kBAGxBwC,uB,yCACC5N,KAAKgL,MAAME,oBACVlL,KAAKwB,MAAMrB,WAGb0N,eAAeC,G,yCACnB,MAAM,gBAAEC,EAAF,IAAmBR,EAAnB,UAAwBvO,EAAxB,OAAmCiN,EAAnC,YAA2C+B,GAAgBhO,KAAK3E,MACtE2E,KAAKsM,SAAS,CAAErB,UAAU,IAC1B,MAAMhC,QAAcL,EAAYkF,EAAMG,KAAK,GAAI,MACzC,MAAEpN,SAAgB0M,EAAIW,WAAW,OAAQjF,GAC3C,CAAC,aAAakF,SAAStN,IACzBkN,EAAgB/O,EAAU,OAAS6B,IAErCuN,YAAa,cAAenC,GAE5B+B,IACAhO,KAAKsM,SAAS,CAAErB,UAAU,OAiFdoD,mB,yCACZ,MAAM,IAAEd,EAAF,YAAOS,EAAP,gBAAoBD,EAApB,UAAqCO,GAActO,KAAK3E,MAC9DiT,EAAU,CACR,IAAWtC,kCACT,UACQuB,EAAIgB,eAAevO,KAAKgL,MAAMK,SACpCrL,KAAKsM,SAAS,CAAElB,WAAY,eAC5B,IAAIkC,QAAatN,KAAK3E,MAAMkS,IAAIC,kBAC5BF,GAAMtN,KAAKsM,SAAS,CAAEhB,cAAegC,IACzC,MAAOzM,GACP2N,QAAQ,gEAGZ,IAAWxC,kCACT+B,EACEzS,gBAACA,WAAc,KACbA,gBAACmT,IAAS,MAAI,IACdnT,gBAAC6D,IAAS,CAACC,GAAG,kBACZ9D,qCAMV0S,OAGYU,mB,yCACZ,MAAM,IAAEnB,EAAF,YAAOS,EAAP,gBAAoBD,EAApB,UAAqCO,GAActO,KAAK3E,MAE9D,UACQkS,EAAImB,mBACVpK,QAAQmI,IAAI,QACZzM,KAAKsM,SAAS,CAAElB,WAAY,eAC5B,IAAIkC,QAAatN,KAAK3E,MAAMkS,IAAIC,kBAChCxN,KAAKsM,SAAS,CAAEhB,cAAegC,GAAQ,OACvC,MAAOzM,GACPyD,QAAQzD,MAAMA,GAGhBmN,OAwCFW,SACE,MAAM,gBACJZ,EADI,IAEJR,EAFI,UAGJvO,EAHI,YAIJgP,EACAN,MAAM,QAAEnP,IACNyB,KAAK3E,OACH,UAAEiB,EAAF,QAAa6O,EAAb,WAAsBC,EAAtB,cAAkCE,GAAkBtL,KAAKgL,MACzD4D,EACJrQ,EAAQsQ,YACRtQ,EAAQsQ,WAAWC,WAAW,wBAC1B,WACA,KAEAC,EAAiB,CACrBC,MAAM,EACNC,UAAU,EACVtG,cAAeA,EACfuG,iBAAkB,CAChBC,oBAAqB,mBAInBC,EAA4B,OAAlB9D,EAEhB,OACEhQ,uBAAKJ,UAAU,sBACXmU,eACA/T,uBAAKJ,UAAU,QACbI,yBACEgU,QAAQ,OACRC,IAAKvP,KAAK4L,SACV4D,QAAS,IAAMxP,KAAKsM,SAAS,CAAEhQ,WAAW,IAC1CmT,QAAS,IAAMzP,KAAKsM,SAAS,CAAEhQ,WAAW,MAI5B,eAAf8O,GAA+BgE,GAC9B9T,gBAAC6D,IAAS,CAACC,GAAG,2BACZ9D,sBAAIJ,UAAU,gBAGF,eAAfkQ,IAAgCgE,GAC/B9T,gBAAC6D,IAAS,CAACC,GAAG,qBACZ9D,sBAAIJ,UAAU,gBAGF,aAAfkQ,GACC9P,gBAAC6D,IAAS,CAACC,GAAG,qBACZ9D,sBAAIJ,UAAU,gBAGF,YAAfkQ,GACC9P,gBAAC6D,IAAS,CAACC,GAAG,yBACZ9D,sBAAIJ,UAAU,gBAGF,aAAfkQ,GACC9P,gBAAC6D,IAAS,CAACC,GAAG,wBACZ9D,sBAAIJ,UAAU,gBAIlBI,uBAAKJ,UAAU,QACI,eAAfkQ,GAA8C,aAAfA,KAC9BgE,EACC9T,uBAAKJ,UAAU,WACbI,uBAAKJ,UAAU,WACbI,gBAACe,IAAU,CACTC,UAAWA,EACXoT,QAAS1P,KAAK+L,mBAKpBzQ,uBAAKJ,UAAU,WACG,aAAfkQ,GACC9P,uBAAKJ,UAAU,WACbI,gBAACc,IAAK,KACJd,uBACEJ,UACE,sBACa,IAAZiQ,EAAgB,aAAe,KACnB,IAAZA,EAAgB,aAAe,KAC/BA,GAAW,EAAI,aAAe,KAEjC7P,2BACEA,wBAAMJ,UAAU,YAAhB,WACW,IACTI,qBAAGJ,UAAU,iBAAiBiQ,UAShC,YAAfC,GACC9P,gBAACqU,WAAQ,CAACC,SAAUtU,6BAClBA,uBAAKJ,UAAU,UACbI,gBAACmN,EAAM,CAACoH,QAASd,EAAgBe,eAAgB,KACjDxU,uBAAKJ,UAAU,kBACbI,gBAACe,IAAU,CACTC,WAAW,EACXoT,QAAS1P,KAAK0M,uBAMR,aAAftB,GACC9P,uBAAKJ,UAAU,YACbI,uBAAKJ,UAAU,iBACbI,gBAACe,IAAU,CACTC,UAAWA,EACXoT,QAAS1P,KAAKwM,4BAOR,eAAfpB,GAA+BgE,GAC9B9T,2BACEA,uBAAKJ,UAAU,OACbI,2BACEA,gBAACyU,IAAM,CACLC,SAAO,EACPC,SAAO,EACP/U,UAAU,yBACVwU,QAAS1P,KAAKoN,kBACd9R,gBAACS,IAAO,MACRT,gBAAC6D,IAAS,CAACC,GAAG,aACZ9D,gCAINA,2BACEA,gBAACyU,IAAM,CACLC,SAAO,EACPC,SAAO,EACP/U,UAAU,uBACVwU,QAAS1P,KAAK0O,iBAAiBrO,KAAKL,OACpC1E,gBAAC4U,IAAS,MACV5U,gBAAC6D,IAAS,CAACC,GAAG,gBACZ9D,kCAQI,eAAf8P,IAAgCgE,GAC/B9T,gBAACyU,IAAM,CACLC,SAAO,EACPC,SAAO,EACP/U,UAAU,uBACVwU,QAAS1P,KAAKmL,SACd7P,gBAACS,IAAO,MACRT,gBAAC6D,IAAS,CAACC,GAAG,qBACZ9D,+BAIU,aAAf8P,IAA8BgE,GAC7B9T,gBAACyU,IAAM,CACLC,SAAO,EACPC,SAAO,EACP/U,UAAU,qBACVwU,QAAS1P,KAAKqN,iBACd/R,gBAAC6U,IAAS,MACV7U,gBAAC6D,IAAS,CAACC,GAAG,gCACZ9D,+BAIU,YAAf8P,GACC9P,gBAACyU,IAAM,CACLC,SAAO,EACPC,SAAO,EACP/U,UAAU,qBACVwU,QAAS1P,KAAKqN,iBACd/R,gBAAC6U,IAAS,MACV7U,gBAAC6D,IAAS,CAACC,GAAG,gCACZ9D,+BAIU,aAAf8P,GACC9P,2BACEA,uBAAKJ,UAAU,OACbI,2BACEA,gBAACyU,IAAM,CACLC,SAAO,EACPC,SAAO,EACP/U,UAAU,aACVwU,QAAS1P,KAAKqN,iBACd/R,gBAACS,IAAO,MACRT,gBAAC6D,IAAS,CAACC,GAAG,8BACZ9D,gCAINA,2BACEA,gBAACyU,IAAM,CACLC,SAAO,EACPC,SAAO,EACP/U,UAAU,aACVwU,QAAS1P,KAAKqO,iBAAiBhO,KAAKL,OACpC1E,gBAAC8U,IAAS,MACV9U,gBAAC6D,IAAS,CAACC,GAAG,mBACZ9D,iCAKRA,uBAAKJ,UAAU,gBACbI,gBAAC6D,IAAS,CAACC,GAAG,qBACZ9D,qBACEJ,UAAU,eACVwU,QAAS1P,KAAK0O,iBAAiBrO,KAAKL,WAM7CoP,EACC9T,gCACEA,gBAAC6D,IAAS,CAACC,GAAG,oBACZ9D,qBAAGJ,UAAU,4BAIjBI,gBAAC6D,IAAS,CAACC,GAAG,+BACZ9D,qBAAGJ,UAAU,8CAKrBI,uBAAKJ,UAAU,gBACbI,4BAAUJ,UAAU,eAAeK,SAAUyE,KAAKgL,MAAMC,UACtD3P,uBAAKJ,UAAU,eACbI,yBACE+U,WAAYC,IACVA,EAAMC,kBAERC,OAAQF,IACNtQ,KAAK6N,eAAeyC,EAAMG,aAAa3C,OACvCwC,EAAMC,mBAERjV,gBAAC6D,IAAS,CAACC,GAAG,qBACZ9D,wBAAMJ,UAAU,WAElBI,gBAAC6D,IAAS,CACRC,GAAG,cACHC,MAAO,CAAEqR,WAAYpV,wBAAMJ,UAAU,aACrCI,wBAAMJ,UAAU,kBAElBI,yBACEJ,UAAU,aACVU,KAAK,OACL+U,OAAO,UACPC,SAAUN,IACRtQ,KAAK6N,eAAeyC,EAAM1F,OAAOkD,YAMzCxS,0BACEJ,UAAU,UACVU,KAAK,SACL8T,QAAS,IAAW1D,kCAClBhM,KAAKsM,SAAS,CAAErB,UAAU,IAC1B,MAAM,MAAEpK,SAAgB0M,EAAIW,WACZ,YAAdU,EAA2B,UAAY,YAGrC,CAAC,aAAaT,SAAStN,IACzBkN,EAAgB/O,EAAU,YAAc6B,IAGrCA,GACHmN,IAEFhO,KAAKsM,SAAS,CAAErB,UAAU,QAE5B3P,gBAAC6D,IAAS,CAACC,GAAG,oBACZ9D,8BACW,IACE,YAAdsT,EACCtT,gBAACmT,IAAS,CAACvT,UAAU,UAErBI,gBAACuV,IAAQ,CAAC3V,UAAU,cAUrBoI,kBACb,QAAC,IAAEiK,EAAF,OAAOtB,EAAP,KAAeyB,GAAhB,QAAuC,CAAEH,MAAKtB,SAAQyB,SACtD,CACEK,gBAAiB+C,IAAcC,QAAQC,QACvChD,YAAaiD,IAAKF,QAAQG,QAC1B5C,UAAW6C,IAAQJ,QAAQK,KALhB9N,CAObvE,YAAiBgM,I,OC5mBnB,MAAMsG,UAAsB/V,YAA5ByE,c,oBACE,KAAAiL,MAAQ,CAAEsG,MAAM,GAEhB,KAAAC,YAAcjW,cAEdqT,SACE,MAAM,KAAE2C,GAAStR,KAAKgL,MACtB,OACE1P,uBAAKJ,UAAU,kBACbI,uBAAKJ,UAAU,OACbI,0BACEA,gBAAC6D,IAAS,CAACC,GAAG,YACZ9D,8BAFJ,KAMAA,gBAAC6D,IAAS,CAACC,GAAG,sBACZ9D,uBAAKJ,UAAU,eAGnBI,uBAAKJ,UAAU,oBACbI,uBAAKJ,UAAU,oBACbI,gBAACkW,IAAM,CACLC,OAAO,OACPC,QAAQ,SACRC,eAAgBL,EAChBV,SAAWN,IACTtQ,KAAKsM,SAAS,CAAEgF,KAAMhB,EAAM1F,OAAOgH,cAIzCtW,uBAAKJ,UAAU,QACbI,gBAACuW,IAAQ,MACTvW,gBAAC6D,IAAS,CAACC,GAAIkS,EAAO,YAAc,eAClChW,gCAKL,EAMDA,gBAACwW,IAAE,MACHxW,gBAAC6D,IAAS,CAACC,GAAG,uBACZ9D,gBAACyU,IAAM,CACLE,SAAO,EACPP,QAAS,KACP3N,OAAOgQ,KACL,0CACEC,mBAAmB,kBACnB,SACAA,oBACGV,EACG,qBACA,qCAFJ,WAKEtR,KAAK3E,MAAMqS,KAAKnP,QAAQ0T,cAW/B3O,kBAAwB,QAAC,KAAEoK,GAAH,QAA0B,CAAEA,SAApDpK,CACbvE,YAAiBsS,I,gBC5FZ,MAAMa,EAAe,CAC1BC,GAAI,CACFC,SAAU,WACVC,SAAU,WACVC,OAAQ,SACRC,UAAW,aAEbC,GAAI,CACFC,SAAU,SACVC,QAAS,UACTC,aAAc,kBACdC,SAAU,gBACVC,UAAW,YAEbC,GAAI,CACFC,eAAgB,4BAElBC,GAAI,CACFC,QAAS,sBACTC,YAAa,yBACbC,QAAS,2BACTC,OAAQ,mBACRC,YAAa,mBACbN,eAAgB,qBAChBO,OAAQ,sBACRC,QAAS,kBACTC,QAAS,qBACTC,QAAS,oBACTC,OAAQ,0BACRC,QAAS,sBACTC,cAAe,yBACfC,SAAU,qBACVC,OAAQ,mBACRC,WAAY,qBACZC,MAAO,sBACPC,QAAS,mBACTC,SAAU,qBACVC,OAAQ,sBACRC,SAAU,qBACVC,OAAQ,qBACRC,UAAW,oBACXC,WAAY,0BACZC,SAAU,uBACVC,QAAS,oBACTC,cAAe,gCACfC,QAAS,oBACTC,OAAQ,oBAEVC,GAAI,CACFC,GAAI,wBACJC,UAAW,qBACXC,QAAS,kBACTb,OAAQ,mBACRc,YAAa,WACbC,SAAU,oBACVC,OAAQ,oDACRC,QAAS,gBACTC,SAAU,oBACVC,WAAY,sBACZC,SAAU,mBACVC,UAAW,sBACXC,eAAgB,kDAChBC,QAAS,qDACTC,MAAO,gBACPC,QAAS,iEAEXC,GAAI,CACFC,WAAY,cAEdC,GAAI,CACFC,gBACE,8HACFC,oBACE,qEACFC,cAAe,0DACfC,QAAS,yBACTC,SAAU,SACVC,eAAgB,kBAChBC,OACE,oIACFC,OACE,gFACFC,YAAa,6DACbC,QAAS,uBACTC,UAAW,wBAEbC,GAAI,CACFC,aACE,qEACFC,oBAAqB,+CACrBC,6BACE,yEAEJC,GAAI,CACFzD,OAAQ,qBACR0D,WAAY,yBACZC,SAAU,uBACVhE,QAAS,uBACTF,eAAgB,0BAChBmE,cAAe,4BACfC,QAAS,sBACTC,KAAM,mBACNC,QAAS,qBACTlD,OAAQ,qBACRmD,QAAS,oBACTC,QAAS,sBACTC,QAAS,sBACTC,MAAO,oBACPvE,YAAa,wBACbwE,KAAM,oCACNC,aAAc,2BACdnE,QAAS,uBACToE,kBAAmB,kCACnBC,eAAgB,+BAChB7D,MAAO,oBACP8D,MAAO,oBACPrD,QAAS,uBACTsD,OAAQ,qBACRC,KAAM,oBACNC,yBAA0B,wCAC1BrE,cAAe,0BACfP,YAAa,qBACb6E,SAAU,uBACVC,MAAO,oBACPC,MAAO,oBACP/D,OAAQ,oBACRlB,QAAS,sBACTiC,QAAS,qBACTiD,QAAS,yBACTC,WAAY,yBACZ/D,WAAY,yBACZgE,MAAO,mBACPC,QAAS,uBACTC,WAAY,yBACZC,WAAY,yBACZjF,QAAS,qBACTkF,cAAe,iCACfC,iBAAkB,kCAClBC,cAAe,qBACfC,QAAS,sBACTC,QAAS,sBACTC,OAAQ,qBACRC,kBAAmB,iCACnBC,WAAY,0BACZC,MAAO,oBACPC,UAAW,4BACXC,UAAW,2BACXC,OAAQ,qBACRC,QAAS,oBACTC,SAAU,uBACVC,iBAAkB,+BAClBC,cAAe,+BACfC,QAAS,qBACTC,sBAAuB,uCACvBC,OAAQ,sBAEVC,GAAI,CACF5G,YAAa,wBACbM,QAAS,sBACTuG,SAAU,uBACVzG,OAAQ,mBACRL,QAAS,mBACT+G,QAAS,yBACTC,MAAO,uBACPC,aAAc,8BACdC,aAAc,4BACdxF,QAAS,uBACTyF,UAAW,0BAEb,QAAS,CACPC,QAAS,oBACTC,UAAW,oBACXC,OAAQ,iBAEV,QAAS,CACPC,aAAc,UACdC,YAAa,UACbC,gBAAiB,UACjBC,aAAc,UACdC,eAAgB,UAChBC,aAAc,UACdC,cAAe,UACfC,cAAe,UACfC,gBAAiB,UACjBC,cAAe,UACfC,cAAe,UACfC,cAAe,UACfC,YAAa,UACbC,YAAa,UACbC,eAAgB,UAChBC,gBAAiB,UACjBC,aAAc,UACdC,eAAgB,UAChBC,eAAgB,UAChBC,cAAe,UACfC,cAAe,UACfC,kBAAmB,UACnBC,UAAW,MAEb,QAAS,CACP,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,gBACV,KAAU,aACV,KAAU,aACV,KAAU,cACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,iBACV,KAAU,aACV,IAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,eACV,KAAU,aACV,KAAU,aACV,KAAU,aACV,KAAU,iBACV,KAAU,kBACV,KAAU,aACV,KAAU,iBACV,KAAU,mBAIDC,EAAO,CAClB,GAAI,GACJC,MAAO,OACPC,SAAU,UACVC,SAAU,UACVC,SAAU,UACVC,QAAS,UACTC,QAAS,UACTC,UAAW,UACXC,SAAU,UACVC,SAAU,QAGCC,EAAQ,CACnB,GAAI,GACJC,KAAM,OACNC,OAAQ,SACRC,MAAO,S,6UC/NT,MAAMhV,EAAO7K,EAAQ,MACf,QAAE8f,GAAY9f,EAAQ,KAEtB+f,EAAU/d,YACd,QAAC,SACCge,EADD,UAEC/d,GAFF,SAME1D,gCACGK,OAAOqhB,QAAQD,GAAUE,IAAI,QAAElV,EAAKjB,GAAP,SAC5BxL,0BAAQyM,IAAKA,EAAKjB,MAAOiB,GACtB/I,EAAU+I,EAAK,KAAMjB,SAwXjB/H,kBAAiBme,aA/WhC,YAG6D,IAHxC,UACnBle,EADmB,QAEnBme,GAC2D,E,QAC3D,MAAM5P,EAAM6P,eACLnR,EAAQoR,GAAiBC,cAC1B5P,EAAO6P,YAAiB,QAAC,KAAE7P,GAAH,SAAcA,KACtC,QAAEnP,EAAF,YAAWif,GAAgB9P,EAE3BK,EAAkB0P,YAAU3M,IAAcC,QAAQC,SAClD0M,EAAaD,YAAUtM,IAAQJ,QAAQK,KACvCuM,EAAcF,YAAUxM,IAAKF,QAAQ4M,cAEpCC,EAAYC,GAAiBC,mBAOjC,CACDC,SAAU,GACVC,QAAS,EACTC,IAAK,GACLC,OAAQ,GACRC,YAAY,EACZC,eAAe,KAEX,SACJL,EADI,QAEJC,EAFI,IAGJC,EAHI,OAIJC,EAJI,WAKJC,EALI,cAMJC,GACER,GACGS,EAASC,GAAcR,mBAAkB,KACzCS,EAAeC,GAAoBV,oBAAS,IAC5C7S,EAAUwT,GAAeX,oBAAS,IAClCY,EAAaC,GAAkBb,oBAAS,IACxCc,EAAqBC,IAA0Bf,oBAAS,IACxDgB,GAAaC,IAAkBjB,mBACpC,MAEIkB,IACe,QAAnB,EAAAtR,aAAI,EAAJA,EAAM8P,YAAY,UAACviB,WAAA,EAAAA,EAAGuD,aAAcF,YAAWC,GAEjD0gB,oBAAU,KACR,GAAIvR,EAAKwR,mBAAqBX,EAC5B,OAEFC,GAAiB,GAEZjgB,GAAiC,GAAtBif,EAAY1e,QAC1Bqe,EAAQjZ,KAAK,KAGf2Z,EAAc,OAAD,kEACRD,GAAU,CACbO,cAAc5f,aAAO,EAAPA,EAAS4gB,cACvBnB,QAAS,IACNpW,EAAK8F,EAAM,MAAO,WAAY,WAC7BnP,EACAqJ,EAAKrJ,EAAS,MAAO,WAAY,SAAU,WAC3C,CACE0f,IAAKT,EAAY4B,OAAO,CAAC1c,EAAM2c,IAAMA,EAAEpB,KAAOvb,EAAM,IACpDwb,OAAQV,EAAY4B,OAAO,CAAC1c,EAAM2c,IAAMA,EAAEnB,QAAUxb,EAAM,MAC1D,CACN0b,cAAekB,QAAQ/gB,IAAYmP,EAAK0Q,iBAG1C,IAAIC,EAAmB,GAClB9f,IACH8f,EAAUb,EAAY4B,OACpB,CAACf,EAASgB,IAAMhB,EAAQkB,OAAOF,EAAEhB,SAAW,IAC5C,IAEFA,EAAUA,EAAQmB,OAChB,CAACC,EAAItV,IAAMA,GAAKkU,EAAQqB,UAAUC,GAAMA,EAAG1T,QAAUwT,EAAGxT,UAG5DqS,EAAW/f,EAAUA,EAAQ8f,QAAUA,IACtC,CAAC3Q,IAEJ,MAAMkS,GAAmBC,GAAkB,IAEd,IAFe,OAC1CjV,GAC2B,EAC3BiT,EAAc,OAAD,wBACRD,GAAU,CACb,CAACiC,GAAuB,YAAfjV,EAAOhP,KAAqBgP,EAAOgH,QAAUhH,EAAO9D,UAI3DgZ,GAASC,sBAAY,KACzB,IAAKrS,EAAKnP,UACR6P,YAAa,SAAUnC,GAEJ,MAAf6S,IAEF,YADAC,GAAe,QAKnBN,GAAY,GACZE,GAAe,GACfI,GAAe,UAEf,MAAM5a,EAAO,OAAH,wBACLyD,EAAKgW,EAAY,WAAY,MAAO,WAAS,CAChDS,QAASA,EAAQmB,OAAOQ,GAAKA,EAAE/T,QAC/B+R,QAASiC,KAAKC,MAAMlC,EAAQzX,YAC5B4Z,UAAWzS,EAAK0S,OAChB5hB,WAAYkP,EAAK8P,YAAY,GAAGhf,YAAc,CAC5C6hB,KAAM,KACNriB,UAAW,KACXsiB,OAAQ,QAIZ5C,EAAW,CACT,IAAW1R,kC,YACH2R,EAAYxZ,KACD,QAAb,EAACuJ,EAAKnP,eAAOtD,WAAA,EAAAA,EAAEkkB,eAAgBhB,UAC3B5Q,EAAIgT,sBAAsB7S,EAAK8P,YAAY,GAAGvL,QAGtDlE,EAAgB/O,EAAU,8BAC1Byf,GAAY,SAGf,CAAClR,EAAKvO,EAAWiN,EAAQoS,EAASS,GAAapR,EAAMkQ,IAExD,OAAKW,GAIAtT,GAAYyT,GAAeM,GAE5B1jB,gBAACklB,IAAQ,CACPrlB,GAAI,CACFslB,SAAUpD,EAAcnhB,IAAKwkB,UAAYxkB,IAAKykB,WAC9C3V,MAAO,CACL4V,qBAAqB,EACrBC,YAAa9e,OAAO1E,SAASC,OAAO6Q,SAAS,qBAQrD7S,uBAAKJ,UAAU,gBACG,QAAf4jB,IACCxjB,gBAACwlB,IAAU,CAAC7hB,QAAS6gB,GAAQ5gB,WAAY,IAAM6f,GAAe,SAE9DrR,EAAKnP,SACLjD,gBAAC6D,IAAS,CAACC,GAAG,sBACZ9D,4BAGJA,gBAAC6D,IAAS,CAACC,GAAG,oBACZ9D,2BAGFA,uBACEJ,UACE,qBAAuB0jB,EAAsB,WAAa,KAE5DtjB,0BACEM,KAAK,SACL8T,QAAS,IAAMmP,IAAwBD,IACvCtjB,gBAAC6D,IAAS,CAACC,GAAG,mBACZ9D,8BAGFA,gBAACylB,IAAQ,OAEXzlB,gBAAC6D,IAAS,CAACC,GAAG,+BACZ9D,uBAAKJ,UAAU,kBAInBI,uBAAKJ,UAAU,eACbI,gBAAC6D,IAAS,CAACC,GAAG,wBAAwB4hB,MAAO,CAAEC,OAAO,IACpD3lB,gBAAC4lB,IAAY,CACXpa,MAAOiX,EACPnN,SAAUgP,GAAgB,eAI9BtkB,gBAAC6D,IAAS,CAACC,GAAG,yBAAyB4hB,MAAO,CAAEC,OAAO,IACrD3lB,gBAAC6lB,IAAa,CACZra,MAAOkX,EAAQzX,WACfqK,SAAUgP,GAAgB,YAC1BtkB,gBAAC6D,IAAS,CAACC,GAAG,UACZ9D,0BAAQwL,MAAO,KAEjBxL,gBAAC6D,IAAS,CAACC,GAAG,WACZ9D,0BAAQwL,MAAO,KAEhBkY,IACC1jB,0BAAQwL,MAAO,GAAC,mCAKtBxL,gBAAC6D,IAAS,CAACC,GAAG,mBAAmB4hB,MAAO,CAAEC,OAAO,IAC/C3lB,gBAAC6lB,IAAa,CAACra,MAAOmX,EAAKrN,SAAUgP,GAAgB,QACnDtkB,gBAACwhB,EAAO,KAAEf,KAIdzgB,gBAAC6D,IAAS,CAACC,GAAG,sBAAsB4hB,MAAO,CAAEC,OAAO,IAClD3lB,gBAAC6lB,IAAa,CAACra,MAAOoX,EAAQtN,SAAUgP,GAAgB,WACtDtkB,gBAACwhB,EAAO,KAAEL,KAIb4B,EAAQpB,IAAI,CAAC,EAAoB9S,KAArB,IAAC,OAAE8B,EAAF,OAAUmV,GAAX,SACX9lB,gBAACA,WAAc,CAACyM,IAAKoC,GACnB7O,gBAAC6D,IAAS,CACRC,GACO,GAAL+K,EACI,+BACA,mCAEN6W,MAAO,CAAEC,OAAO,IAChB3lB,gBAAC6lB,IAAa,CACZra,MAAOmF,EACP2E,SAAU,IAEiC,IADzChG,QAAQ,MAAE9D,IAC+B,EACzC,MAAMua,EAAahD,EAAQiD,QAC3BD,EAAWlX,GAAK,CAAE8B,OAAQnF,EAAOsa,OAAQ,IACpCta,GACHua,EAAWE,OAAOpX,EAAG,GAEvBmU,EACE+C,EAAW7B,OACT,CAAC,EAAYgC,KAAb,IAAC,OAAEvV,GAAH,SAAoBuV,IAAOrX,GAAK8B,IAAWnF,OAIjDxL,0BAAQwL,MAAM,KACbnL,OAAOqhB,QAAQyE,KAAcxE,IAAI,QAAEhR,EAAQ/K,GAAV,SAChC5F,0BAAQyM,IAAKkE,EAAQnF,MAAOmF,GACzB/K,OAKT5F,gBAAC6D,IAAS,CAACC,GAAG,sBAAsB4hB,MAAO,CAAEC,OAAO,IAClD3lB,gBAAC6lB,IAAa,CACZra,MAAOsa,EACPxQ,SAAU,IAEiC,IADzChG,QAAQ,MAAE9D,IAC+B,EACzC,MAAMua,EAAahD,EAAQiD,QAC3BD,EAAWlX,GAAGiX,OAASta,EACvBwX,EAAW+C,KAEb/lB,0BAAQwL,MAAM,KACboL,EAAQjG,IAAW3Q,gBAACwhB,EAAO,KAAE5K,EAAQjG,UAOhD3Q,gBAACyU,IAAM,CACL7U,UAAU,eACV8U,SAAO,EACPN,QAAS,KACH2O,EAAQvf,SAAWuf,EAAQA,EAAQvf,OAAS,GAAGmN,QAGnDqS,EAAWD,EAAQkB,OAAO,CAAEtT,OAAQ,GAAImV,OAAQ,QAElD9lB,gBAAC6D,IAAS,CAACC,GAAG,gBACZ9D,8BAEFA,kCAGFA,gBAACwW,IAAE,QAEW,QAAb,EAACpE,EAAKnP,eAAOmjB,WAAA,EAAAA,EAAEvC,eACd7jB,gCACEA,uBAAKJ,UAAU,kBACbI,gBAACuhB,EAAO,CACN8E,OAAK,EACLC,KAAM5iB,EAAU,wBAChB6iB,MAAM,gBACNvmB,gBAAC6D,IAAS,CAACC,GAAG,cAAc4hB,MAAO,CAAEC,OAAO,IAC1C3lB,gBAAC4lB,IAAY,CAACpa,MAAO4G,EAAK8P,YAAY,GAAGvL,MAAO1W,UAAQ,MAI5DD,uBAAKJ,UAAU,cACbI,gBAACwmB,IAAe,CACdb,MACE3lB,gCACEA,gBAAC6D,IAAS,CAACC,GAAG,2BACZ9D,gCAEFA,gBAAC6D,IAAS,CAACC,GAAG,wCACZ9D,+BAINsV,SAAUgP,GAAgB,cAC1BhO,QAASuM,KAGTzQ,EAAKnP,UAAYmgB,GACjBpjB,gCACEA,gBAACwmB,IAAe,CACdb,MACE3lB,gCACEA,gBAAC6D,IAAS,CAACC,GAAG,wBACZ9D,gCAEFA,gBAAC6D,IAAS,CACRC,GAAG,iBACHC,MAAO,CACLI,YAAanE,gBAACI,IAAU,CAACP,GAAIe,IAAKwD,QAASF,OAAK,MAElDlE,+BAINsW,QAASwM,EACTxN,SAAUgP,GAAgB,mBAG5BtkB,gBAAC6D,IAAS,CAACC,GAAG,gBACZ9D,gBAACI,IAAU,CACTP,GACE6jB,GACI9iB,IAAK6lB,gBACL7lB,IAAKqD,MAEXrE,UAAU,QACVsE,OAAK,QAQjBlE,gBAACwW,IAAE,OAIPxW,gBAAC6D,IAAS,CAACC,GAAG,4BACZ9D,gBAACyU,IAAM,CACL7U,UAAU,OACV+U,SAAO,EACP1U,SAAU0P,IAAamT,EACvB1O,QAASoQ,OAnOR,S,qVChKX,MAAMkC,EAAW/mB,I,IAAA,MACfyD,EADe,YAEfujB,EAFe,UAGf/mB,EAAY,GAHG,SAIf6hB,GAAQ9hB,EACRI,sDAMI,OACJC,yCAASJ,UAAW,gBAAkBA,GAAeG,GACnDC,uBAAKJ,UAAU,iBACbI,0BAAKoD,GACJujB,GAEFlF,GAAYzhB,uBAAKJ,UAAU,gBAAgB6hB,KAsJjCzZ,kBACb,QAAC,OAAE2I,EAAF,KAAUyB,GAAX,QAAkC,CAChCnP,QAASmP,EAAKnP,QACd0N,WAEF,CACE8B,gBAAiB+C,IAAcC,QAAQC,QACvC2M,YAAa1M,IAAKF,QAAQ4M,aAPfra,CASbvE,aA5IF,SAAkB1D,GAChB,MAAM,QAAEkD,EAAF,gBAAWwP,EAAX,UAA4B/O,EAA5B,YAAuC2e,GAAgBtiB,EACvD6mB,EAAeC,cAsBrB,OApBAlD,oBAAU,KACR,MAAM,SAAEwB,EAAF,OAAYnjB,GAAWD,SACzBC,EAAO6Q,SAAS,kBAClBJ,EACEzS,gBAAC6D,IAAS,CAACC,GAAG,sBACZ9D,8BAEF,SAEF6hB,QAAQiF,aAAa,GAAI,KAAM3B,IACtBnjB,EAAO6Q,SAAS,kBACzBJ,EACEzS,gBAAC6D,IAAS,CAACC,GAAG,6BACZ9D,+BAGJ6hB,QAAQiF,aAAa,GAAI,KAAM3B,KAEhC,IAGDnlB,2BACEA,gBAAC0mB,EAAO,CAACtjB,MAAOM,EAAU,kBAAmB9D,UAAU,eACrDI,gBAAC6D,IAAS,CAACC,GAAG,cAAc4hB,MAAO,CAAEC,OAAO,IAC1C3lB,gBAAC4lB,IAAY,CAACpa,MAAOvI,EAAQ0T,MAAO1W,UAAQ,KAG9CD,gBAAC+mB,IAAU,CACTrS,SAAO,EACP9U,UAAU,cACVonB,KAAMjlB,SAASklB,OAAS,uBACxBjnB,gBAACknB,IAAO,MACRlnB,gBAAC6D,IAAS,CAACC,GAAG,QACZ9D,gCAKLiD,EAAQ4gB,cACP7jB,gBAAC0mB,EAAO,CACNtjB,MAAOM,EAAU,uBACjBijB,YACE3mB,qBACEJ,UAAU,uBACVonB,KAAMG,YAAyBlkB,GAC/BqM,OAAO,SACP8X,IAAI,uBACJpnB,gBAAC6D,IAAS,CAACC,GAAG,wBACZ9D,8BAEFA,gBAACqnB,IAAY,QAGjBrnB,uBAAKJ,UAAU,iBACI,MAAhBgnB,EACC5mB,4BAEAA,gBAACwmB,IAAe,CACdvmB,UAAU,EACVqW,QAASsQ,EACTjB,MACE3lB,gBAAC6D,IAAS,CAACC,GAAG,qBACZ9D,gCAKRA,uBAAKJ,UAAU,qBACbI,gBAACuW,IAAQ,MACTvW,2BACEA,gBAAC6D,IAAS,CACRC,GAAG,uBACHC,MAAO,CACLI,YAAanE,gBAACI,IAAU,CAACP,GAAIe,IAAKwD,QAASF,OAAK,MAElDlE,6BAEFA,2BACAA,gBAAC6D,IAAS,CAACC,GAAG,gBACZ9D,gBAACI,IAAU,CAACP,GAAIe,IAAKqD,MAAOrE,UAAU,QAAQsE,OAAK,SAQ/DlE,gBAAC0mB,EAAO,CAACtjB,MAAOM,EAAU,2BAA4B9D,UAAU,OAC9DI,2BACEA,gBAAC6D,IAAS,CAACC,GAAG,4BACZ9D,sBAAIJ,UAAU,2BAEhBI,gBAACkW,IAAM,CACLE,QAAQ,MACRD,OAAO,KACPE,eAAgBpT,EAAQqkB,yBACxBhS,SAAWN,GACTqN,EAAY,CACViF,yBAA0BtS,EAAM1F,OAAOgH,YAI7CtW,gBAAC6D,IAAS,CAACC,GAAG,+BACZ9D,qBAAGJ,UAAU,iCAEfI,gBAAC6D,IAAS,CAACC,GAAG,wBACZ9D,qBAAGJ,UAAU,2BAIjBI,uBAAKJ,UAAU,UACbI,uBACEJ,UAAU,iBACVyP,IAAK5N,EAAQ,KACb8lB,IAAI,kCAENvnB,uBACEJ,UAAU,eACVyP,IAAK5N,EAAQ,KACb8lB,IAAI,yC,OCxLhB,MAAMjb,EAAO7K,EAAQ,KAqINuG,sBAAwB,QAAC,KAAEoK,GAAH,QAA0B,CAAEA,SAApDpK,CACbwf,YAxEa,IAAmC,IAAlC,cAAEzF,EAAF,KAAiB3P,GAAiB,EAChD,MAAOqV,EAAWC,EAAaC,EAAWC,GAAe,CACvDhnB,IAAKinB,aACLjnB,IAAKknB,eACLlnB,IAAKmnB,iBACLnnB,IAAKonB,gBACLrG,IAAIsG,GAAKlG,EAAckG,IACzB,OACEjoB,uBAAKJ,UAAU,kBACbI,uBAAKJ,UAAU,eACbI,uBAAKJ,UAAU,SACZ,CAAC,OAAD,QAEGsoB,MAAOT,GACHrV,EAAKnP,QACL,CAAEklB,KAAMnoB,gBAACooB,IAAQ,MAAKtkB,GAAI,WAC1B,CAAEqkB,KAAMnoB,gBAACqoB,IAAY,MAAKvkB,GAAI,kBAEpC,CAAEokB,MAAOR,EAAaS,KAAMnoB,gBAACsoB,IAAU,MAAKxkB,GAAI,UAChD,CAAEokB,MAAOP,EAAWQ,KAAMnoB,gBAACuoB,IAAO,MAAKzkB,GAAI,YAC3C,CACEokB,MAAON,EACPO,KAAMnoB,gBAAC4U,IAAS,MAChB9Q,GAAI,wBAGLkiB,MAAM,EAAG5T,EAAKnP,QAAUulB,IAAW,GACnC7G,IAAI,QAAC,MAAEuG,EAAF,KAASC,EAAT,GAAerkB,GAAhB,SACH9D,gBAACyoB,UAAO,CAAChc,IAAKyb,EAAOroB,GAAIqoB,GACtBC,EACDnoB,gBAAC6D,IAAS,CAACC,GAAIA,GACb9D,wBAAMJ,UAAU,aAIvBwS,EAAKnP,SACJjD,qBAAGoU,QAAS,IAxExB,SAAsBnR,GACpB,MAAMylB,EAAO,IACRroB,OAAOqhB,QAAQpV,EAAKrJ,EAAS,QAAS,WAAY,MAAO,cACzDA,EAAQ8f,QAAQe,OAAO,CAAC6E,EAAKjE,EAAG7V,KACjC,MAAM+Z,EAAc,aAAe/Z,EAAI,GACvC,MAAO,IACF8Z,EACH,CAACC,EAAalE,EAAE/T,QAChB,CAACiY,EAAc,UAAWlE,EAAEoB,UAE7B,KAEFnE,IAAI,QAAElV,EAAKjB,GAAP,SAAkBiB,EAAM,KAAOjB,IACnCrL,KAAK,MAEF0oB,EAAU/a,SAASC,cAAc,KACvC8a,EAAQC,aACN,OACA,iCAAmCpS,mBAAmBgS,IAExDG,EAAQC,aAAa,WAAY,eAEjCD,EAAQE,MAAMC,QAAU,OACxBlb,SAASmb,KAAKC,YAAYL,GAE1BA,EAAQM,QAERrb,SAASmb,KAAKG,YAAYP,GA6CEQ,CAAajX,EAAKnP,SAAU+jB,KAAK,KACjDhnB,gBAACspB,IAAS,MACVtpB,gBAAC6D,IAAS,CAACC,GAAG,oBACZ9D,wBAAMJ,UAAU,aAM1BI,uBAAKJ,UAAU,WACbI,gBAACupB,IAAM,KACLvpB,gBAACwpB,IAAK,CAACC,OAAK,EAACC,KAAMjC,EAAWkC,UAAWC,IACxC,CACC,CAAE1B,MAAOR,EAAamC,UAAWpa,GACjC,CAAEyY,MAAOP,EAAWkC,UAAWC,GAC/B,CAAE5B,MAAON,EAAaiC,UAAW9T,IACjC4L,IAAI,QAAC,MAAEuG,EAAF,UAAS2B,GAAV,SACJ7pB,gBAACwpB,IAAK,CACJ/c,IAAKyb,EACLuB,OAAK,EACLC,KAAMxB,EACN7U,OAAQtT,GACNqS,EAAKnP,QAAUjD,gBAAC6pB,EAAS,MAAM7pB,gBAACklB,IAAQ,CAACrlB,GAAI4nB,QAInDznB,gBAACwpB,IAAK,CACJnW,OAAQ,IAAMrT,gBAACklB,IAAQ,CAACrlB,GAAIkiB,EAAcnhB,IAAKinB","file":"8.js?id=8cd4411d8b3feefd7742","sourcesContent":["import * as React from 'react';\nimport URLS from '../../urls';\nimport { LocaleLink } from '../locale-helpers';\nimport { getTrackClass } from '../../services/tracker';\nimport { MicIcon, OldPlayIcon, StopIcon } from '../ui/icons';\n\nimport './primary-buttons.css';\n\nexport const PrimaryButton = ({\n  className,\n  to,\n  trackClass,\n  ...props\n}: { to?: string; trackClass?: string } & React.ButtonHTMLAttributes<any>) => (\n  <div\n    className={[\n      'primary-button',\n      className,\n      props.disabled ? 'disabled' : '',\n      trackClass ? getTrackClass('fs', trackClass) : '',\n    ].join(' ')}>\n    {to ? (\n      <LocaleLink to={to} {...props} />\n    ) : (\n      <button type=\"button\" {...props} />\n    )}\n    <div className=\"background\" />\n  </div>\n);\n\nexport type RecordingStatus = null | 'waiting' | 'recording';\n\nexport const RecordButton = ({\n  status,\n  trackClass,\n  ...props\n}: {\n  status: RecordingStatus;\n  trackClass?: string;\n} & React.ButtonHTMLAttributes<any>) => (\n  <PrimaryButton\n    className={status === null ? 'stop' : 'record'}\n    {...props}\n    trackClass={trackClass}\n    disabled={status === 'waiting'}>\n    {status === null && <MicIcon />}\n    {status === 'recording' && <StopIcon />}\n  </PrimaryButton>\n);\n\nexport const RecordLink = (props: any) => (\n  <PrimaryButton className=\"stop\" to={URLS.SPEAK} {...props}>\n    <MicIcon />\n  </PrimaryButton>\n);\n\nexport const Voice = (props: any) => (\n  <PrimaryButton className=\"stop\" {...props} />\n);\n\nexport const PlayButton = ({\n  isPlaying,\n  trackClass,\n  ...props\n}: { isPlaying: boolean; trackClass?: string } & React.ButtonHTMLAttributes<\n  any\n>) => (\n  <PrimaryButton\n    className={isPlaying ? 'stop' : 'play'}\n    trackClass={trackClass}\n    {...props}>\n    {isPlaying ? <StopIcon /> : <OldPlayIcon />}\n  </PrimaryButton>\n);\n\nexport const PlayLink = (props: any) => (\n  <PrimaryButton className=\"play\" to={URLS.LISTEN} {...props}>\n    <OldPlayIcon />\n  </PrimaryButton>\n);\n","import { ChallengeDuration, ChallengeTeamToken } from 'common';\nimport { UserClient } from 'common';\n\nexport const challengeLogos: {\n  [key in ChallengeTeamToken]: {\n    background: string;\n    border: boolean;\n    url: string;\n  };\n} = {\n  ibm: { background: '#fff', border: true, url: require('./images/ibm.svg') },\n  lenovo: {\n    background: '#fff',\n    border: true,\n    url: require('./images/lenovo.svg'),\n  },\n  mozilla: {\n    background: '#000',\n    border: false,\n    url: require('./images/mozilla.svg'),\n  },\n  sap: { background: '#fff', border: true, url: require('./images/sap.svg') },\n};\n\nconst isValidDate = (dateStr: string) => {\n  const dateObj = new Date(dateStr);\n  return dateObj instanceof Date && !isNaN(dateObj.getTime());\n};\n\nconst getNow = () => {\n  const dateParam =\n    location.search && location.search.match(/date=(\\d+-\\d+-\\d+)/);\n  const date = dateParam?.[1];\n  return date && isValidDate(date) ? new Date(date) : new Date();\n};\n\nexport const isChallengeLive = (challenge: ChallengeDuration) => {\n  const now = getNow();\n  return now >= challenge.start && now < challenge.end;\n};\n\nexport const isBeforeChallenge = (challenge: ChallengeDuration) => {\n  const now = getNow();\n  return now < challenge.start;\n};\n\nexport const pilotDates: ChallengeDuration = {\n  start: new Date('2019-11-19'),\n  end: new Date('2019-12-10'),\n};\n\nexport const isEnrolled = (account: UserClient) =>\n  account?.enrollment?.challenge;\n\nexport const weeklyChallengeCopy = [\n  {\n    title: 'Sign up and Contribute',\n    subtitle: 'Win a prize by being the team with the highest sign up rate',\n    explanation:\n      'This is the percentage of team invites that have been accepted out of the current total sent.',\n  },\n  {\n    title: \"Let's get social\",\n    subtitle: 'The most socially active team wins the prize',\n    explanation:\n      'This is the number of invites your team has sent inviting others to join the Open Voice Challenge',\n  },\n  {\n    title: 'Top the Leaderboard',\n    subtitle:\n      'The team that validates the highest percentage of voice clips wins the prize',\n    explanation:\n      'This is the percentage of clips the team has accurately validated',\n  },\n];\n\nexport const FINAL_CHALLENGE_WEEK = weeklyChallengeCopy.length - 1;\n","import * as React from 'react';\nimport {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport URLS from '../urls';\nimport { LocaleLink } from './locale-helpers';\nimport Modal from './modal/modal';\n\nconst TermsModal = ({\n  getString,\n  onAgree,\n  onDisagree,\n}: { onAgree: () => any; onDisagree: () => any } & WithLocalizationProps) => (\n  <Localized\n    id=\"review-terms\"\n    elems={{\n      termsLink: <LocaleLink to={URLS.TERMS} blank />,\n      privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n    }}>\n    <Modal\n      buttons={{\n        [getString('terms-agree')]: onAgree,\n        [getString('terms-disagree')]: onDisagree,\n      }}\n    />\n  </Localized>\n);\nexport default withLocalization(TermsModal);\n","import { getAudioFormat } from '../../../../utility';\n\ninterface BlobEvent extends Event {\n  data: Blob;\n}\n\nexport enum AudioError {\n  NOT_ALLOWED = 'NOT_ALLOWED',\n  NO_MIC = 'NO_MIC',\n  NO_SUPPORT = 'NO_SUPPORT',\n}\n\nexport interface AudioInfo {\n  url: string;\n  blob: Blob;\n}\n\nexport default class AudioWeb {\n  microphone: MediaStream;\n  analyzerNode: AnalyserNode;\n  audioContext: AudioContext;\n  recorder: any;\n  chunks: any[];\n  frequencyBins: Uint8Array;\n  volumeCallback: Function;\n  jsNode: any;\n  recorderListeners: {\n    start: Function | null;\n    dataavailable: Function | null;\n    stop: Function | null;\n  };\n\n  constructor() {\n    this.recorderListeners = {\n      start: null,\n      dataavailable: null,\n      stop: null,\n    };\n    this.analyze = this.analyze.bind(this);\n  }\n\n  private isReady(): boolean {\n    return !!this.microphone;\n  }\n\n  private getMicrophone(): Promise<MediaStream> {\n    return new Promise(function (res: Function, rej: Function) {\n      function deny(error: MediaStreamError) {\n        rej(\n          ({\n            NotAllowedError: AudioError.NOT_ALLOWED,\n            NotFoundError: AudioError.NO_MIC,\n          } as { [errorName: string]: AudioError })[error.name] || error\n        );\n      }\n      function resolve(stream: MediaStream) {\n        res(stream);\n      }\n\n      if (navigator.mediaDevices?.getUserMedia) {\n        navigator.mediaDevices\n          .getUserMedia({ audio: true })\n          .then(resolve, deny);\n      } else if (navigator.getUserMedia) {\n        navigator.getUserMedia({ audio: true }, resolve, deny);\n      } else if (navigator.webkitGetUserMedia) {\n        navigator.webkitGetUserMedia({ audio: true }, resolve, deny);\n      } else if (navigator.mozGetUserMedia) {\n        navigator.mozGetUserMedia({ audio: true }, resolve, deny);\n      } else {\n        // Browser does not support getUserMedia\n        rej(AudioError.NO_SUPPORT);\n      }\n    });\n  }\n\n  // Check all the browser prefixes for microhpone support.\n  isMicrophoneSupported() {\n    return (\n      navigator.mediaDevices?.getUserMedia ||\n      navigator.getUserMedia ||\n      navigator.webkitGetUserMedia ||\n      navigator.mozGetUserMedia\n    );\n  }\n\n  // Check if audio recording is supported\n  isAudioRecordingSupported() {\n    return (\n      typeof window.MediaRecorder !== 'undefined' &&\n      !window.MediaRecorder.notSupported\n    );\n  }\n\n  private analyze() {\n    this.analyzerNode.getByteFrequencyData(this.frequencyBins);\n\n    if (this.volumeCallback) {\n      this.volumeCallback(Math.max(...this.frequencyBins));\n    }\n  }\n\n  setVolumeCallback(cb: Function) {\n    this.volumeCallback = cb;\n  }\n\n  /**\n   * Initialize the recorder, opening the microphone media stream.\n   *\n   * If microphone access is currently denied, the user is asked to grant\n   * access. Since these permission changes take effect only after a reload,\n   * the page is reloaded if the user decides to do so.\n   *\n   */\n  async init() {\n    if (this.isReady()) {\n      return;\n    }\n\n    const microphone = await this.getMicrophone();\n\n    this.microphone = microphone;\n    const audioContext = new (window.AudioContext ||\n      window.webkitAudioContext)();\n    const sourceNode = audioContext.createMediaStreamSource(microphone);\n    const volumeNode = audioContext.createGain();\n    const analyzerNode = audioContext.createAnalyser();\n    const outputNode = audioContext.createMediaStreamDestination();\n\n    // Make sure we're doing mono everywhere.\n    sourceNode.channelCount = 1;\n    volumeNode.channelCount = 1;\n    analyzerNode.channelCount = 1;\n    outputNode.channelCount = 1;\n\n    // Connect the nodes together\n    sourceNode.connect(volumeNode);\n    volumeNode.connect(analyzerNode);\n    analyzerNode.connect(outputNode);\n\n    // and set up the recorder.\n    this.recorder = new window.MediaRecorder(outputNode.stream);\n\n    // Set up the analyzer node, and allocate an array for its data\n    // FFT size 64 gives us 32 bins. But those bins hold frequencies up to\n    // 22kHz or more, and we only care about lower frequencies which is where\n    // most human voice lies, so we use fewer bins.\n    analyzerNode.fftSize = 128;\n    analyzerNode.smoothingTimeConstant = 0.96;\n    this.frequencyBins = new Uint8Array(analyzerNode.frequencyBinCount);\n\n    // Setup jsNode for audio analysis callbacks.\n    // TODO: `createScriptProcessor` is deprecated, and is a heavy solution for\n    //       what it’s doing (checking recording volume). It should be replaced\n    //       with something lighter, or AudioWorklets once they become more\n    //       widely adopted.\n    this.jsNode = audioContext.createScriptProcessor(256, 1, 1);\n    this.jsNode.connect(audioContext.destination);\n\n    this.analyzerNode = analyzerNode;\n    this.audioContext = audioContext;\n  }\n\n  start(): Promise<void> {\n    if (!this.isReady()) {\n      console.error('Cannot record audio before microhphone is ready.');\n      return Promise.resolve();\n    }\n\n    return new Promise<void>((res: Function, rej: Function) => {\n      this.chunks = [];\n      // Remove the old listeners.\n      this.recorder.removeEventListener('start', this.recorderListeners.start);\n      this.recorder.removeEventListener(\n        'dataavailable',\n        this.recorderListeners.dataavailable\n      );\n\n      // Update the stored listeners.\n      this.recorderListeners.start = (e: Event) => res();\n      this.recorderListeners.dataavailable = (e: BlobEvent) => {\n        this.chunks.push(e.data);\n      };\n\n      // Add the new listeners.\n      this.recorder.addEventListener('start', this.recorderListeners.start);\n      this.recorder.addEventListener(\n        'dataavailable',\n        this.recorderListeners.dataavailable\n      );\n\n      // Finally, start it up.\n      // We want to be able to record up to 60s of audio in a single blob.\n      // Without this argument to start(), Chrome will call dataavailable\n      // very frequently.\n      this.jsNode.onaudioprocess = this.analyze;\n      this.recorder.start(20000);\n    });\n  }\n\n  stop(): Promise<AudioInfo> {\n    if (!this.isReady()) {\n      console.error('Cannot stop audio before microphone is ready.');\n      return Promise.reject();\n    }\n\n    return new Promise((res: Function, rej: Function) => {\n      this.jsNode.onaudioprocess = undefined;\n      this.recorder.removeEventListener('stop', this.recorderListeners.stop);\n      this.recorderListeners.stop = (e: Event) => {\n        let blob = new Blob(this.chunks, { type: getAudioFormat() });\n        res({\n          url: URL.createObjectURL(blob),\n          blob: blob,\n        });\n      };\n      this.recorder.addEventListener('stop', this.recorderListeners.stop);\n      this.recorder.stop();\n    });\n  }\n\n  release() {\n    if (this.microphone) {\n      for (const track of this.microphone.getTracks()) {\n        track.stop();\n      }\n    }\n    this.microphone = null;\n  }\n}\n","module.exports = __webpack_public_path__ + \"d88c16c3d756a31c343700e0e26d9192.svg\";","module.exports = __webpack_public_path__ + \"6a6a438d4cddcfec4d51f0bd644f154a.svg\";","module.exports = __webpack_public_path__ + \"a914cfc32246a0eee02b5fa521269781.svg\";","module.exports = __webpack_public_path__ + \"723827e558eaea61ef4e2741e9fcd8f4.svg\";","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n    MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    symbolTag = '[object Symbol]';\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array ? array.length : 0,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} props The property identifiers to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, props) {\n  object = Object(object);\n  return basePickBy(object, props, function(value, key) {\n    return key in object;\n  });\n}\n\n/**\n * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} props The property identifiers to pick from.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, props, predicate) {\n  var index = -1,\n      length = props.length,\n      result = {};\n\n  while (++index < length) {\n    var key = props[index],\n        value = object[key];\n\n    if (predicate(value, key)) {\n      result[key] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = array;\n    return apply(func, this, otherArgs);\n  };\n}\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 8-9 which returns 'object' for typed array and other constructors.\n  var tag = isObject(value) ? objectToString.call(value) : '';\n  return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [props] The property identifiers to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = baseRest(function(object, props) {\n  return object == null ? {} : basePick(object, arrayMap(baseFlatten(props, 1), toKey));\n});\n\nmodule.exports = pick;\n","module.exports = __webpack_public_path__ + \"064114c4b4bc50c7a2d9cebbcd2a8aaf.jpg\";","module.exports = __webpack_public_path__ + \"c465307a0dc1fc8585e0eb128e64806e.jpg\";","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport API from '../../../../services/api';\nimport { trackProfile, trackVoiceAvatar } from '../../../../services/tracker';\nimport { Locale } from '../../../../stores/locale';\nimport { Notifications } from '../../../../stores/notifications';\nimport StateTree from '../../../../stores/tree';\nimport { User } from '../../../../stores/user';\nimport { Uploads } from '../../../../stores/uploads';\nimport {\n  CheckIcon,\n  LinkIcon,\n  MicIcon,\n  StopIcon,\n  ShareIcon,\n  RedoIcon,\n  CrossIcon,\n  TrashIcon,\n} from '../../../ui/icons';\nimport { Button } from '../../../ui/ui';\nimport { Voice, PlayButton } from '../../../primary-buttons/primary-buttons';\nimport AudioWeb, { AudioError } from '../../contribution/speak/audio-web';\nimport { isProduction } from '../../../../utility';\nimport { Suspense, lazy } from 'react';\nconst Lottie = lazy(() => import('react-lottie'));\nconst animationData = require('../../../layout/data.json');\n\nimport './avatar-setup.css';\n\nfunction resizeImage(file: File, maxSize: number): Promise<Blob> {\n  const reader = new FileReader();\n  const image = new Image();\n  const canvas = document.createElement('canvas');\n  const dataURItoBlob = (dataURI: string) => {\n    const bytes =\n      dataURI.split(',')[0].indexOf('base64') >= 0\n        ? atob(dataURI.split(',')[1])\n        : unescape(dataURI.split(',')[1]);\n    const mime = dataURI.split(',')[0].split(':')[1].split(';')[0];\n    const max = bytes.length;\n    const ia = new Uint8Array(max);\n    for (var i = 0; i < max; i++) ia[i] = bytes.charCodeAt(i);\n    return new Blob([ia], { type: mime });\n  };\n  const resize = () => {\n    let width = image.width;\n    let height = image.height;\n\n    if (width > height) {\n      if (width > maxSize) {\n        height *= maxSize / width;\n        width = maxSize;\n      }\n    } else {\n      if (height > maxSize) {\n        width *= maxSize / height;\n        height = maxSize;\n      }\n    }\n\n    canvas.width = width;\n    canvas.height = height;\n    canvas.getContext('2d').drawImage(image, 0, 0, width, height);\n    let dataUrl = canvas.toDataURL('image/jpeg');\n    return dataURItoBlob(dataUrl);\n  };\n\n  return new Promise((ok, no) => {\n    if (!file || !file.type.match(/image.*/)) {\n      no(new Error('Not an image'));\n      return;\n    }\n\n    reader.onload = (readerEvent: any) => {\n      image.onload = () => ok(resize());\n      image.src = readerEvent.target.result;\n    };\n    reader.readAsDataURL(file);\n  });\n}\n\ninterface PropsFromState {\n  api: API;\n  locale: Locale.State;\n  user: User.State;\n}\n\ninterface PropsFromDispatch {\n  addNotification: typeof Notifications.actions.addPill;\n  refreshUser: typeof User.actions.refresh;\n  addUpload: typeof Uploads.actions.add;\n}\n\ninterface Props\n  extends WithLocalizationProps,\n    PropsFromState,\n    PropsFromDispatch {}\n\ninterface State {\n  isSaving: boolean;\n  isRecording: boolean;\n  isPlaying: boolean;\n  counter: number;\n  clipStatus: 'fetching' | 'notStarted' | 'started' | 'starting' | 'recorded';\n  blobUrl: Blob;\n  avatarClipUrl: string | null;\n}\n\nclass AvatarSetup extends React.Component<Props, State> {\n  state: State = {\n    isSaving: false,\n    isRecording: false,\n    isPlaying: false,\n    counter: 3,\n    clipStatus: 'fetching',\n    blobUrl: new Blob(),\n    avatarClipUrl: null,\n  };\n\n  audio: AudioWeb;\n  isUnsupportedPlatform = false;\n  maxVolume = 0;\n  recordingStartTime = 0;\n  recordingStopTime = 0;\n  avatarRecordedBlobUrl: any = null;\n  audioRef = React.createRef<HTMLAudioElement>();\n\n  async componentDidMount() {\n    this.audio = new AudioWeb();\n    this.audio.setVolumeCallback(this.updateVolume.bind(this));\n\n    if (\n      !this.audio.isMicrophoneSupported() ||\n      !this.audio.isAudioRecordingSupported()\n    ) {\n      this.isUnsupportedPlatform = true;\n    }\n    let clip;\n    if (this.props.user.account.avatar_clip_url) {\n      clip = await this.props.api.fetchAvatarClip();\n    }\n    if (clip) this.setState({ avatarClipUrl: clip });\n    this.setState({ clipStatus: 'notStarted' });\n  }\n\n  async componentWillUnmount() {\n    if (!this.state.isRecording) return;\n    await this.audio.stop();\n  }\n\n  async saveFileAvatar(files: FileList) {\n    const { addNotification, api, getString, locale, refreshUser } = this.props;\n    this.setState({ isSaving: true });\n    const image = await resizeImage(files.item(0), 200);\n    const { error } = await api.saveAvatar('file', image);\n    if (['too_large'].includes(error)) {\n      addNotification(getString('file' + error));\n    }\n    trackProfile('give-avatar', locale);\n\n    refreshUser();\n    this.setState({ isSaving: false });\n  }\n\n  private updateVolume = (volume: number) => {\n    if (volume !== 100 && volume > this.maxVolume) {\n      this.maxVolume = volume;\n    }\n  };\n\n  private playAvatarClip = async () => {\n    const { locale } = this.props;\n    trackVoiceAvatar('self-listen', locale);\n    if (!this.state.isPlaying) {\n      this.audioRef.current.src = this.state.avatarClipUrl;\n      this.audioRef.current.play();\n      this.setState({ isPlaying: true });\n    } else {\n      this.audioRef.current.pause();\n      this.audioRef.current.currentTime = 0;\n      this.setState({ isPlaying: false });\n    }\n  };\n\n  private playRecordedAvatarClip = async () => {\n    console.log(this.avatarRecordedBlobUrl);\n    if (!this.state.isPlaying) {\n      this.audioRef.current.src = this.avatarRecordedBlobUrl;\n      this.audioRef.current.play();\n      this.setState({ isPlaying: true });\n    } else {\n      this.audioRef.current.pause();\n      this.audioRef.current.currentTime = 0;\n      this.setState({ isPlaying: false });\n    }\n  };\n\n  private handleRecordClick = async () => {\n    if (this.state.isRecording) {\n      this.saveRecording();\n      return;\n    }\n\n    try {\n      await this.startRecording();\n\n      const clipTime = 5000;\n      setTimeout(async () => {\n        this.saveRecording();\n      }, clipTime);\n    } catch (err) {\n      if (!(err in AudioError)) {\n        throw err;\n      }\n    }\n  };\n\n  private startRecording = async () => {\n    await this.audio.start();\n    this.maxVolume = 0;\n    this.recordingStartTime = Date.now();\n    this.recordingStopTime = 0;\n    this.setState({\n      isRecording: true,\n    });\n  };\n\n  private saveRecording = () => {\n    if (this.state.clipStatus === 'started') {\n      const RECORD_STOP_DELAY = 500;\n      setTimeout(async () => {\n        const info = await this.audio.stop();\n        this.avatarRecordedBlobUrl = info.url;\n        this.setState({ blobUrl: info.blob, clipStatus: 'recorded' });\n      }, RECORD_STOP_DELAY);\n      this.recordingStopTime = Date.now();\n      this.setState({\n        isRecording: false,\n      });\n    }\n  };\n\n  private async uploadAvatarClip() {\n    const { api, refreshUser, addNotification, addUpload } = this.props;\n    addUpload([\n      async () => {\n        try {\n          await api.saveAvatarClip(this.state.blobUrl);\n          this.setState({ clipStatus: 'notStarted' });\n          let clip = await this.props.api.fetchAvatarClip();\n          if (clip) this.setState({ avatarClipUrl: clip });\n        } catch (error) {\n          confirm('Upload of this avatar clip keeps failing, keep retrying?');\n        }\n      },\n      async () => {\n        addNotification(\n          <React.Fragment>\n            <CheckIcon />{' '}\n            <Localized id=\"clips-uploaded\">\n              <span />\n            </Localized>\n          </React.Fragment>\n        );\n      },\n    ]);\n    refreshUser();\n  }\n\n  private async deleteAvatarClip() {\n    const { api, refreshUser, addNotification, addUpload } = this.props;\n\n    try {\n      await api.deleteAvatarClip();\n      console.log('done');\n      this.setState({ clipStatus: 'notStarted' });\n      let clip = await this.props.api.fetchAvatarClip();\n      this.setState({ avatarClipUrl: clip || null });\n    } catch (error) {\n      console.error(error);\n    }\n\n    refreshUser();\n  }\n\n  private counter = async () => {\n    if (this.state.clipStatus !== 'notStarted') return;\n    this.audio.release();\n    await this.audio.init();\n    this.setState({ clipStatus: 'starting', counter: 3 });\n    const downloadTimer = setInterval(() => {\n      let tl = this.state.counter - 1;\n      this.setState({ counter: tl });\n      if (this.state.counter <= 0 && this.state.clipStatus === 'starting') {\n        this.setState({ clipStatus: 'started' });\n        const { locale } = this.props;\n        trackVoiceAvatar('create-voice-avatar', locale);\n        this.handleRecordClick();\n        clearInterval(downloadTimer);\n      }\n    }, 1000);\n  };\n\n  private updateAvatarClip = () => {\n    this.setState({\n      avatarClipUrl: null,\n      counter: 3,\n      clipStatus: 'notStarted',\n    });\n  };\n\n  private cancelRecording = async () => {\n    let clip = await this.props.api.fetchAvatarClip();\n    clip\n      ? this.setState({\n          avatarClipUrl: clip,\n          clipStatus: 'notStarted',\n          isRecording: false,\n        })\n      : this.setState({ clipStatus: 'notStarted', isRecording: false });\n  };\n\n  render() {\n    const {\n      addNotification,\n      api,\n      getString,\n      refreshUser,\n      user: { account },\n    } = this.props;\n    const { isPlaying, counter, clipStatus, avatarClipUrl } = this.state;\n    const avatarType =\n      account.avatar_url &&\n      account.avatar_url.startsWith('https://gravatar.com')\n        ? 'gravatar'\n        : null;\n\n    const defaultOptions = {\n      loop: true,\n      autoplay: true,\n      animationData: animationData,\n      rendererSettings: {\n        preserveAspectRatio: 'xMidYMid slice',\n      },\n    };\n\n    const hasClip = avatarClipUrl !== null;\n\n    return (\n      <div className=\"full-avatar-setup\">\n        {!isProduction() && (\n          <div className=\"clip\">\n            <audio\n              preload=\"auto\"\n              ref={this.audioRef}\n              onEnded={() => this.setState({ isPlaying: false })}\n              onError={() => this.setState({ isPlaying: false })}\n            />\n            {/*heading */}\n\n            {clipStatus === 'notStarted' && hasClip && (\n              <Localized id=\"change-your-avatar-clip\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'notStarted' && !hasClip && (\n              <Localized id=\"avatar-clip-title\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'starting' && (\n              <Localized id=\"avatar-clip-title\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'started' && (\n              <Localized id=\"recording-in-progress\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {clipStatus === 'recorded' && (\n              <Localized id=\"avatar-clip-recorded\">\n                <h2 className=\"clip-title\" />\n              </Localized>\n            )}\n            {/* Below fix div is for middle content of avatar setup like wave image, lottie animation */}\n            <div className=\"fix\">\n              {(clipStatus === 'notStarted' || clipStatus === 'starting') &&\n                (hasClip ? (\n                  <div className=\"group-1\">\n                    <div className=\"counter\">\n                      <PlayButton\n                        isPlaying={isPlaying}\n                        onClick={this.playAvatarClip}\n                      />\n                    </div>\n                  </div>\n                ) : (\n                  <div className=\"group-1\">\n                    {clipStatus === 'starting' && (\n                      <div className=\"counter\">\n                        <Voice>\n                          <div\n                            className={\n                              'counter-animation ' +\n                              (counter === 2 ? 'counter-2 ' : '') +\n                              (counter === 1 ? 'counter-1 ' : '') +\n                              (counter <= 0 ? 'counter-0 ' : '')\n                            }>\n                            <div>\n                              <span className=\"start-in\">\n                                Start in{' '}\n                                <p className=\"counter-digit\">{counter}</p>\n                              </span>\n                            </div>\n                          </div>\n                        </Voice>\n                      </div>\n                    )}\n                  </div>\n                ))}\n              {clipStatus === 'started' && (\n                <Suspense fallback={<div />}>\n                  <div className=\"lottie\">\n                    <Lottie options={defaultOptions} eventListeners={[]} />\n                    <div className=\"recording-stop\">\n                      <PlayButton\n                        isPlaying={true}\n                        onClick={this.handleRecordClick}\n                      />\n                    </div>\n                  </div>\n                </Suspense>\n              )}\n              {clipStatus === 'recorded' && (\n                <div className=\"lottiebg\">\n                  <div className=\"recorded-play\">\n                    <PlayButton\n                      isPlaying={isPlaying}\n                      onClick={this.playRecordedAvatarClip}\n                    />\n                  </div>\n                </div>\n              )}\n            </div>\n            {/* ALL buttons, first page delete and re-record buttons */}\n            {clipStatus === 'notStarted' && hasClip && (\n              <div>\n                <div className=\"but\">\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-3 rerecord-but\"\n                      onClick={this.updateAvatarClip}>\n                      <MicIcon />\n                      <Localized id=\"re-record\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-2 delete-but\"\n                      onClick={this.deleteAvatarClip.bind(this)}>\n                      <TrashIcon />\n                      <Localized id=\"delete-voice\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                </div>\n              </div>\n            )}\n\n            {clipStatus === 'notStarted' && !hasClip && (\n              <Button\n                outline\n                rounded\n                className=\"primary rerecord-but\"\n                onClick={this.counter}>\n                <MicIcon />\n                <Localized id=\"record-voice-wave\">\n                  <span />\n                </Localized>\n              </Button>\n            )}\n            {clipStatus === 'starting' && !hasClip && (\n              <Button\n                outline\n                rounded\n                className=\"primary cancel-but\"\n                onClick={this.cancelRecording}>\n                <CrossIcon />\n                <Localized id=\"cancel-avatar-clip-recording\">\n                  <span />\n                </Localized>\n              </Button>\n            )}\n            {clipStatus === 'started' && (\n              <Button\n                outline\n                rounded\n                className=\"primary cancel-but\"\n                onClick={this.cancelRecording}>\n                <CrossIcon />\n                <Localized id=\"cancel-avatar-clip-recording\">\n                  <span />\n                </Localized>\n              </Button>\n            )}\n            {clipStatus === 'recorded' && (\n              <div>\n                <div className=\"but\">\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-3 \"\n                      onClick={this.cancelRecording}>\n                      <MicIcon />\n                      <Localized id=\"retry-voice-wave-recording\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                  <div>\n                    <Button\n                      outline\n                      rounded\n                      className=\"primary-2 \"\n                      onClick={this.uploadAvatarClip.bind(this)}>\n                      <ShareIcon />\n                      <Localized id=\"ready-to-upload\">\n                        <span />\n                      </Localized>\n                    </Button>\n                  </div>\n                </div>\n                <div className=\"delete-voice\">\n                  <Localized id=\"delete-voice-clip\">\n                    <p\n                      className=\"delete-voice\"\n                      onClick={this.deleteAvatarClip.bind(this)}\n                    />\n                  </Localized>\n                </div>\n              </div>\n            )}\n            {hasClip ? (\n              <>\n                <Localized id=\"avatar-clip-fact\">\n                  <p className=\"create-a-custom-voice\" />\n                </Localized>\n              </>\n            ) : (\n              <Localized id=\"about-avatar-clip-recording\">\n                <p className=\"create-a-custom-voice voice-paragraph-2\" />\n              </Localized>\n            )}\n          </div>\n        )}\n        <div className=\"photo-avatar\">\n          <fieldset className=\"avatar-setup\" disabled={this.state.isSaving}>\n            <div className=\"file-upload\">\n              <label\n                onDragOver={event => {\n                  event.preventDefault();\n                }}\n                onDrop={event => {\n                  this.saveFileAvatar(event.dataTransfer.files);\n                  event.preventDefault();\n                }}>\n                <Localized id=\"browse-file-title\">\n                  <span className=\"title\" />\n                </Localized>\n                <Localized\n                  id=\"browse-file\"\n                  elems={{ browseWrap: <span className=\"browse\" /> }}>\n                  <span className=\"upload-label\" />\n                </Localized>\n                <input\n                  className=\"hide-input\"\n                  type=\"file\"\n                  accept=\"image/*\"\n                  onChange={event => {\n                    this.saveFileAvatar(event.target.files);\n                  }}\n                />\n              </label>\n            </div>\n\n            <button\n              className=\"connect\"\n              type=\"button\"\n              onClick={async () => {\n                this.setState({ isSaving: true });\n                const { error } = await api.saveAvatar(\n                  avatarType == 'gravatar' ? 'default' : 'gravatar'\n                );\n\n                if (['not_found'].includes(error)) {\n                  addNotification(getString('gravatar_' + error));\n                }\n\n                if (!error) {\n                  refreshUser();\n                }\n                this.setState({ isSaving: false });\n              }}>\n              <Localized id=\"connect-gravatar\">\n                <span />\n              </Localized>{' '}\n              {avatarType == 'gravatar' ? (\n                <CheckIcon className=\"check\" />\n              ) : (\n                <LinkIcon className=\"link\" />\n              )}\n            </button>\n          </fieldset>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default connect<PropsFromState, any>(\n  ({ api, locale, user }: StateTree) => ({ api, locale, user }),\n  {\n    addNotification: Notifications.actions.addPill,\n    refreshUser: User.actions.refresh,\n    addUpload: Uploads.actions.add,\n  }\n)(withLocalization(AvatarSetup));\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { User } from '../../../../stores/user';\nimport StateTree from '../../../../stores/tree';\nimport { InfoIcon } from '../../../ui/icons';\nimport { Toggle, Hr, Button } from '../../../ui/ui';\n\nimport './delete.css';\n\ninterface PropsFromState {\n  user: User.State;\n}\n\ninterface Props extends WithLocalizationProps, PropsFromState {}\n\nclass DeleteProfile extends React.Component<Props, { keep: boolean }> {\n  state = { keep: true };\n\n  textareaRef = React.createRef<HTMLTextAreaElement>();\n\n  render() {\n    const { keep } = this.state;\n    return (\n      <div className=\"profile-delete\">\n        <div className=\"top\">\n          <h2>\n            <Localized id=\"delete-q\">\n              <span />\n            </Localized>\n            *\n          </h2>\n          <Localized id=\"indicates-required\">\n            <div className=\"required\" />\n          </Localized>\n        </div>\n        <div className=\"toggle-with-info\">\n          <div className=\"toggle-container\">\n            <Toggle\n              onText=\"keep\"\n              offText=\"remove\"\n              defaultChecked={keep}\n              onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n                this.setState({ keep: event.target.checked });\n              }}\n            />\n          </div>\n          <div className=\"info\">\n            <InfoIcon />\n            <Localized id={keep ? 'keep-info' : 'remove-info'}>\n              <div />\n            </Localized>\n          </div>\n        </div>\n        {/* We're disabling this field for now */}\n        {false && !keep && (\n          <textarea\n            placeholder={this.props.getString('why-delete-recordings')}\n            ref={this.textareaRef}\n          />\n        )}\n        <Hr />\n        <Localized id=\"profile-form-delete\">\n          <Button\n            rounded\n            onClick={() => {\n              window.open(\n                'mailto:commonvoice@mozilla.com?subject=' +\n                  encodeURIComponent('Delete Profile') +\n                  '&body=' +\n                  encodeURIComponent(\n                    (keep\n                      ? 'keep my recordings'\n                      : 'remove my recordings, because: ' + '\\n') +\n                      /*+ this.textareaRef.current.value*/ '\\n' +\n                      'email:' +\n                      this.props.user.account.email\n                  )\n              );\n            }}\n          />\n        </Localized>\n      </div>\n    );\n  }\n}\n\nexport default connect<PropsFromState>(({ user }: StateTree) => ({ user }))(\n  withLocalization(DeleteProfile)\n);\n","export const ACCENTS: any = {\n  br: {\n    gwenedeg: 'Gwenedeg',\n    kerneveg: 'Kerneveg',\n    leoneg: 'Leoneg',\n    tregerieg: 'Tregerieg',\n  },\n  ca: {\n    balearic: 'balear',\n    central: 'central',\n    northwestern: 'nord-occidental',\n    northern: 'septentrional',\n    valencian: 'valencià',\n  },\n  cy: {\n    united_kingdom: 'Y Deyrnas Unedig Cymraeg',\n  },\n  de: {\n    germany: 'Deutschland Deutsch',\n    netherlands: 'Niederländisch Deutsch',\n    austria: 'Österreichisches Deutsch',\n    poland: 'Polnisch Deutsch',\n    switzerland: 'Schweizerdeutsch',\n    united_kingdom: 'Britisches Deutsch',\n    france: 'Französisch Deutsch',\n    denmark: 'Dänisch Deutsch',\n    belgium: 'Belgisches Deutsch',\n    hungary: 'Ungarisch Deutsch',\n    brazil: 'Brasilianisches Deutsch',\n    czechia: 'Tschechisch Deutsch',\n    united_states: 'Amerikanisches Deutsch',\n    slovakia: 'Slowakisch Deutsch',\n    russia: 'Russisch Deutsch',\n    kazakhstan: 'Kasachisch Deutsch',\n    italy: 'Italienisch Deutsch',\n    finland: 'Finnisch Deutsch',\n    slovenia: 'Slowenisch Deutsch',\n    canada: 'Kanadisches Deutsch',\n    bulgaria: 'Bulgarisch Deutsch',\n    greece: 'Griechisch Deutsch',\n    lithuania: 'Litauisch Deutsch',\n    luxembourg: 'Luxemburgisches Deutsch',\n    paraguay: 'Paraguayisch Deutsch',\n    romania: 'Rumänisch Deutsch',\n    liechtenstein: 'liechtensteinisches Deutscher',\n    namibia: 'Namibisch Deutsch',\n    turkey: 'Türkisch Deutsch',\n  },\n  en: {\n    us: 'United States English',\n    australia: 'Australian English',\n    england: 'England English',\n    canada: 'Canadian English',\n    philippines: 'Filipino',\n    hongkong: 'Hong Kong English',\n    indian: 'India and South Asia (India, Pakistan, Sri Lanka)',\n    ireland: 'Irish English',\n    malaysia: 'Malaysian English',\n    newzealand: 'New Zealand English',\n    scotland: 'Scottish English',\n    singapore: 'Singaporean English',\n    southatlandtic: 'South Atlantic (Falkland Islands, Saint Helena)',\n    african: 'Southern African (South Africa, Zimbabwe, Namibia)',\n    wales: 'Welsh English',\n    bermuda: 'West Indies and Bermuda (Bahamas, Bermuda, Jamaica, Trinidad)',\n  },\n  eo: {\n    internacia: 'Internacia',\n  },\n  es: {\n    nortepeninsular:\n      'España: Norte peninsular (Asturias, Castilla y León, Cantabria, País Vasco, Navarra, Aragón, La Rioja, Guadalajara, Cuenca)',\n    centrosurpeninsular:\n      'España: Centro-Sur peninsular (Madrid, Toledo, Castilla-La Mancha)',\n    surpeninsular: 'España: Sur peninsular (Andalucia, Extremadura, Murcia)',\n    canario: 'España: Islas Canarias',\n    mexicano: 'México',\n    americacentral: 'América central',\n    caribe:\n      'Caribe: Cuba, Venezuela, Puerto Rico, República Dominicana, Panamá, Colombia caribeña, México caribeño, Costa del golfo de México',\n    andino:\n      'Andino-Pacífico: Colombia, Perú, Ecuador, oeste de Bolivia y Venezuela andina',\n    rioplatense: 'Rioplatense: Argentina, Uruguay, este de Bolivia, Paraguay',\n    chileno: 'Chileno: Chile, Cuyo',\n    filipinas: 'Español de Filipinas',\n  },\n  eu: {\n    mendebalekoa:\n      'Mendebalekoa (Araka, Bizkaia, Gipuzkoako mendebaleko herri batzuk)',\n    erdialdekoa_nafarra: 'Erdialdekoa edo Nafarra (Gipuzkoa, Nafarroa)',\n    nafarlapurtarra_zuberoatarra:\n      'Nafar-lapurtarra edo Zuberotarra (Lapurdi, Nafarroa Beherea, Zuberoa)',\n  },\n  fr: {\n    france: 'Français de France',\n    madagascar: 'Français de Madagascar',\n    cameroon: 'Français du Cameroun',\n    germany: 'Français d’Allemagne',\n    united_kingdom: 'Français du Royaume-Uni',\n    cote_d_ivoire: 'Français de Côte d’Ivoire',\n    tunisia: 'Français de Tunisie',\n    mali: 'Français du Mali',\n    algeria: 'Français d’Algérie',\n    canada: 'Français du Canada',\n    morocco: 'Français du Maroc',\n    burundi: 'Français du Burundi',\n    senegal: 'Français du Sénégal',\n    niger: 'Français du Niger',\n    netherlands: 'Français des Pays-Bas',\n    togo: 'Français de la République du Togo',\n    burkina_faso: 'Français du Burkina-Faso',\n    belgium: 'Français de Belgique',\n    congo_brazzaville: 'Français du Congo (Brazzaville)',\n    congo_kinshasa: 'Français du Congo (Kinshasa)',\n    italy: 'Français d’Italie',\n    benin: 'Français du Bénin',\n    romania: 'Français de Roumanie',\n    guinea: 'Français de Guinée',\n    chad: 'Français du Tchad',\n    central_african_republic: 'Français de République centrafricaine',\n    united_states: 'Français des États-Unis',\n    switzerland: 'Français de Suisse',\n    portugal: 'Français du Portugal',\n    gabon: 'Français du Gabon',\n    syria: 'Français de Syrie',\n    greece: 'Français de Grèce',\n    austria: 'Français d’Autriche',\n    ireland: 'Français d’Irlande',\n    reunion: 'Français de La Réunion',\n    mauritania: 'Français de Mauritanie',\n    luxembourg: 'Français du Luxembourg',\n    haiti: 'Français d’Haïti',\n    comoros: 'Français des Comores',\n    martinique: 'Français de Martinique',\n    guadeloupe: 'Français de Guadeloupe',\n    hungary: 'Français d’Hongrie',\n    new_caledonia: 'Français de Nouvelle-Calédonie',\n    french_polynesia: 'Français de Polynésie française',\n    french_guiana: 'Français de Guyane',\n    vanuatu: 'Français du Vanuatu',\n    mayotte: 'Français de Mayotte',\n    cyprus: 'Français de Chypre',\n    equatorial_guinea: 'Français de Guinée équatoriale',\n    seychelles: 'Français des Seychelles',\n    malta: 'Français de Malte',\n    mauritius: 'Français de l’Île Maurice',\n    st_martin: 'Français de Saint-Martin',\n    monaco: 'Français de Monaco',\n    lebanon: 'Français du Liban',\n    djibouti: 'Français de Djibouti',\n    wallis_et_futuna: 'Français de Wallis et Futuna',\n    st_barthelemy: 'Français de Saint-Barthélemy',\n    andorra: 'Français d’Andorre',\n    st_pierre_et_miquelon: 'Français de Saint-Pierre-et-Miquelon',\n    rwanda: 'Français du Rwanda',\n  },\n  nl: {\n    netherlands: 'Nederlands Nederlands',\n    belgium: 'Belgisch Nederlands',\n    suriname: 'Surinaams Nederlands',\n    france: 'Frans Nederlands',\n    germany: 'Duits Nederlands',\n    curacao: 'Nederlands van Curaçao',\n    aruba: 'Nederlands van Aruba',\n    sint_maarten: 'Nederlands van Sint-Maarten',\n    south_africa: 'Zuid-Afrikaans Nederlands',\n    namibia: 'Namibisch Nederlands',\n    indonesia: 'Indonesisch Nederlands',\n  },\n  'ga-IE': {\n    mumhain: 'Gaeilge na Mumhan',\n    connachta: 'Gaeilge Chonnacht',\n    ulaidh: 'Gaeilge Uladh',\n  },\n  'zh-TW': {\n    keelung_city: '出生地：基隆市',\n    taipei_city: '出生地：臺北市',\n    new_taipei_city: '出生地：新北市',\n    taoyuan_city: '出生地：桃園市',\n    hsinchu_county: '出生地：新竹縣',\n    hsinchu_city: '出生地：新竹市',\n    miaoli_county: '出生地：苗栗縣',\n    taichung_city: '出生地：臺中市',\n    changhua_county: '出生地：彰化縣',\n    nantou_county: '出生地：南投縣',\n    yunlin_county: '出生地：雲林縣',\n    chiayi_county: '出生地：嘉義縣',\n    chiayi_city: '出生地：嘉義市',\n    tainan_city: '出生地：臺南市',\n    kaohsiung_city: '出生地：高雄市',\n    pingtung_county: '出生地：屏東縣',\n    yilan_county: '出生地：宜蘭縣',\n    hualien_county: '出生地：花蓮縣',\n    taitung_county: '出生地：臺東縣',\n    penghu_county: '出生地：澎湖縣',\n    kinmen_county: '出生地：金門縣',\n    lienchiang_county: '出生地：連江縣',\n    hong_kong: '香港',\n  },\n  'zh-CN': {\n    '110000': '出生地：11 北京市',\n    '120000': '出生地：12 天津市',\n    '130000': '出生地：13 河北省',\n    '140000': '出生地：14 山西省',\n    '150000': '出生地：15 内蒙古自治区',\n    '210000': '出生地：21 辽宁省',\n    '220000': '出生地：22 吉林省',\n    '230000': '出生地：23 黑龙江省',\n    '310000': '出生地：31 上海市',\n    '320000': '出生地：32 江苏省',\n    '330000': '出生地：33 浙江省',\n    '340000': '出生地：34 安徽省',\n    '350000': '出生地：35 福建省',\n    '360000': '出生地：36 江西省',\n    '370000': '出生地：37 山东省',\n    '410000': '出生地：41 河南省',\n    '420000': '出生地：42 湖北省',\n    '430000': '出生地：43 湖南省',\n    '440000': '出生地：44 广东省',\n    '450000': '出生地：45 广西壮族自治区',\n    '460000': '出生地：46 海南省',\n    '500000': '出生地：50 重庆市',\n    '510000': '出生地：51 四川省',\n    '520000': '出生地：52 贵州省',\n    '530000': '出生地：53 云南省',\n    '540000': '出生地：54 西藏自治区',\n    '610000': '出生地：61 陕西省',\n    '620000': '出生地：62 甘肃省',\n    '630000': '出生地：63 青海省',\n    '640000': '出生地：64 宁夏回族自治区',\n    '650000': '出生地：65 新疆维吾尔自治区',\n    '710000': '出生地：71 台湾省',\n    '810000': '出生地：81 香港特别行政区',\n    '820000': '出生地：82 澳门特别行政区',\n  },\n};\n\nexport const AGES = {\n  '': '',\n  teens: '< 19',\n  twenties: '19 - 29',\n  thirties: '30 - 39',\n  fourties: '40 - 49',\n  fifties: '50 - 59',\n  sixties: '60 - 69',\n  seventies: '70 - 79',\n  eighties: '80 - 89',\n  nineties: '> 89',\n};\n\nexport const SEXES = {\n  '': '',\n  male: 'Male',\n  female: 'Female',\n  other: 'Other',\n};\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Redirect, RouteComponentProps, withRouter } from 'react-router';\nimport { useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { NATIVE_NAMES } from '../../../../services/localization';\nimport { trackProfile } from '../../../../services/tracker';\nimport { ACCENTS, AGES, SEXES } from '../../../../stores/demographics';\nimport { Notifications } from '../../../../stores/notifications';\nimport { useTypedSelector } from '../../../../stores/tree';\nimport { Uploads } from '../../../../stores/uploads';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { LocaleLink, useLocale } from '../../../locale-helpers';\nimport TermsModal from '../../../terms-modal';\nimport { DownIcon } from '../../../ui/icons';\nimport {\n  Button,\n  Hr,\n  LabeledCheckbox,\n  LabeledInput,\n  LabeledSelect,\n} from '../../../ui/ui';\nimport { isEnrolled } from '../../dashboard/challenge/constants';\n\nimport './info.css';\n\nconst pick = require('lodash.pick');\nconst { Tooltip } = require('react-tippy');\n\nconst Options = withLocalization(\n  ({\n    children,\n    getString,\n  }: {\n    children: { [key: string]: string };\n  } & WithLocalizationProps) => (\n    <>\n      {Object.entries(children).map(([key, value]) => (\n        <option key={key} value={key}>\n          {getString(key, null, value)}\n        </option>\n      ))}\n    </>\n  )\n);\n\ntype Locales = { locale: string; accent: string }[];\n\nfunction ProfilePage({\n  getString,\n  history,\n}: WithLocalizationProps & RouteComponentProps<any, any, any>) {\n  const api = useAPI();\n  const [locale, toLocaleRoute] = useLocale();\n  const user = useTypedSelector(({ user }) => user);\n  const { account, userClients } = user;\n\n  const addNotification = useAction(Notifications.actions.addPill);\n  const addUploads = useAction(Uploads.actions.add);\n  const saveAccount = useAction(User.actions.saveAccount);\n\n  const [userFields, setUserFields] = useState<{\n    username: string;\n    visible: number | string;\n    age: string;\n    gender: string;\n    sendEmails: boolean;\n    privacyAgreed: boolean;\n  }>({\n    username: '',\n    visible: 0,\n    age: '',\n    gender: '',\n    sendEmails: false,\n    privacyAgreed: false,\n  });\n  const {\n    username,\n    visible,\n    age,\n    gender,\n    sendEmails,\n    privacyAgreed,\n  } = userFields;\n  const [locales, setLocales] = useState<Locales>([]);\n  const [isInitialized, setIsInitialized] = useState(false);\n  const [isSaving, setIsSaving] = useState(false);\n  const [isSubmitted, setIsSubmitted] = useState(false);\n  const [showDemographicInfo, setShowDemographicInfo] = useState(false);\n  const [termsStatus, setTermsStatus] = useState<null | 'show' | 'agreed'>(\n    null\n  );\n  const isEnrolledInChallenge =\n    user?.userClients[0]?.enrollment || isEnrolled(account);\n\n  useEffect(() => {\n    if (user.isFetchingAccount || isInitialized) {\n      return;\n    }\n    setIsInitialized(true);\n\n    if (!account && userClients.length == 0) {\n      history.push('/');\n    }\n\n    setUserFields({\n      ...userFields,\n      sendEmails: !!account?.basket_token,\n      visible: 0,\n      ...pick(user, 'age', 'username', 'gender'),\n      ...(account\n        ? pick(account, 'age', 'username', 'gender', 'visible')\n        : {\n            age: userClients.reduce((init, u) => u.age || init, ''),\n            gender: userClients.reduce((init, u) => u.gender || init, ''),\n          }),\n      privacyAgreed: Boolean(account) || user.privacyAgreed,\n    });\n\n    let locales: Locales = [];\n    if (!account) {\n      locales = userClients.reduce(\n        (locales, u) => locales.concat(u.locales || []),\n        []\n      );\n      locales = locales.filter(\n        (l1, i) => i == locales.findIndex(l2 => l2.locale == l1.locale)\n      );\n    }\n    setLocales(account ? account.locales : locales);\n  }, [user]);\n\n  const handleChangeFor = (field: string) => ({\n    target,\n  }: React.ChangeEvent<any>) => {\n    setUserFields({\n      ...userFields,\n      [field]: target.type == 'checkbox' ? target.checked : target.value,\n    });\n  };\n\n  const submit = useCallback(() => {\n    if (!user.account) {\n      trackProfile('create', locale);\n\n      if (termsStatus == null) {\n        setTermsStatus('show');\n        return;\n      }\n    }\n\n    setIsSaving(true);\n    setIsSubmitted(true);\n    setTermsStatus('agreed');\n\n    const data = {\n      ...pick(userFields, 'username', 'age', 'gender'),\n      locales: locales.filter(l => l.locale),\n      visible: JSON.parse(visible.toString()),\n      client_id: user.userId,\n      enrollment: user.userClients[0].enrollment || {\n        team: null,\n        challenge: null,\n        invite: null,\n      },\n    };\n\n    addUploads([\n      async () => {\n        await saveAccount(data);\n        if (!user.account?.basket_token && sendEmails) {\n          await api.subscribeToNewsletter(user.userClients[0].email);\n        }\n\n        addNotification(getString('profile-form-submit-saved'));\n        setIsSaving(false);\n      },\n    ]);\n  }, [api, getString, locale, locales, termsStatus, user, userFields]);\n\n  if (!isInitialized) {\n    return null;\n  }\n\n  if (!isSaving && isSubmitted && isEnrolledInChallenge) {\n    return (\n      <Redirect\n        to={{\n          pathname: toLocaleRoute(URLS.DASHBOARD + URLS.CHALLENGE),\n          state: {\n            showOnboardingModal: true,\n            earlyEnroll: window.location.search.includes('achievement=1'),\n          },\n        }}\n      />\n    );\n  }\n\n  return (\n    <div className=\"profile-info\">\n      {termsStatus == 'show' && (\n        <TermsModal onAgree={submit} onDisagree={() => setTermsStatus(null)} />\n      )}\n      {!user.account && (\n        <Localized id=\"thanks-for-account\">\n          <h2 />\n        </Localized>\n      )}\n      <Localized id=\"why-profile-text\">\n        <p />\n      </Localized>\n\n      <div\n        className={\n          'demographic-info ' + (showDemographicInfo ? 'expanded' : '')\n        }>\n        <button\n          type=\"button\"\n          onClick={() => setShowDemographicInfo(!showDemographicInfo)}>\n          <Localized id=\"why-demographic\">\n            <span />\n          </Localized>\n\n          <DownIcon />\n        </button>\n        <Localized id=\"why-demographic-explanation\">\n          <div className=\"explanation\" />\n        </Localized>\n      </div>\n\n      <div className=\"form-fields\">\n        <Localized id=\"profile-form-username\" attrs={{ label: true }}>\n          <LabeledInput\n            value={username}\n            onChange={handleChangeFor('username')}\n          />\n        </Localized>\n\n        <Localized id=\"leaderboard-visibility\" attrs={{ label: true }}>\n          <LabeledSelect\n            value={visible.toString()}\n            onChange={handleChangeFor('visible')}>\n            <Localized id=\"hidden\">\n              <option value={0} />\n            </Localized>\n            <Localized id=\"visible\">\n              <option value={1} />\n            </Localized>\n            {isEnrolledInChallenge && (\n              <option value={2}>Visible within challenge team</option>\n            )}\n          </LabeledSelect>\n        </Localized>\n\n        <Localized id=\"profile-form-age\" attrs={{ label: true }}>\n          <LabeledSelect value={age} onChange={handleChangeFor('age')}>\n            <Options>{AGES}</Options>\n          </LabeledSelect>\n        </Localized>\n\n        <Localized id=\"profile-form-gender\" attrs={{ label: true }}>\n          <LabeledSelect value={gender} onChange={handleChangeFor('gender')}>\n            <Options>{SEXES}</Options>\n          </LabeledSelect>\n        </Localized>\n\n        {locales.map(({ locale, accent }, i) => (\n          <React.Fragment key={i}>\n            <Localized\n              id={\n                i == 0\n                  ? 'profile-form-native-language'\n                  : 'profile-form-additional-language'\n              }\n              attrs={{ label: true }}>\n              <LabeledSelect\n                value={locale}\n                onChange={({\n                  target: { value },\n                }: React.ChangeEvent<HTMLSelectElement>) => {\n                  const newLocales = locales.slice();\n                  newLocales[i] = { locale: value, accent: '' };\n                  if (!value) {\n                    newLocales.splice(i, 1);\n                  }\n                  setLocales(\n                    newLocales.filter(\n                      ({ locale }, i2) => i2 === i || locale !== value\n                    )\n                  );\n                }}>\n                <option value=\"\" />\n                {Object.entries(NATIVE_NAMES).map(([locale, name]) => (\n                  <option key={locale} value={locale}>\n                    {name}\n                  </option>\n                ))}\n              </LabeledSelect>\n            </Localized>\n            <Localized id=\"profile-form-accent\" attrs={{ label: true }}>\n              <LabeledSelect\n                value={accent}\n                onChange={({\n                  target: { value },\n                }: React.ChangeEvent<HTMLSelectElement>) => {\n                  const newLocales = locales.slice();\n                  newLocales[i].accent = value;\n                  setLocales(newLocales);\n                }}>\n                <option value=\"\" />\n                {ACCENTS[locale] && <Options>{ACCENTS[locale]}</Options>}\n              </LabeledSelect>\n            </Localized>\n          </React.Fragment>\n        ))}\n      </div>\n\n      <Button\n        className=\"add-language\"\n        outline\n        onClick={() => {\n          if (locales.length && !locales[locales.length - 1].locale) {\n            return;\n          }\n          setLocales(locales.concat({ locale: '', accent: '' }));\n        }}>\n        <Localized id=\"add-language\">\n          <span />\n        </Localized>\n        <span>+</span>\n      </Button>\n\n      <Hr />\n\n      {!user.account?.basket_token && (\n        <>\n          <div className=\"signup-section\">\n            <Tooltip\n              arrow\n              html={getString('change-email-setings')}\n              theme=\"grey-tooltip\">\n              <Localized id=\"email-input\" attrs={{ label: true }}>\n                <LabeledInput value={user.userClients[0].email} disabled />\n              </Localized>\n            </Tooltip>\n\n            <div className=\"checkboxes\">\n              <LabeledCheckbox\n                label={\n                  <>\n                    <Localized id=\"email-opt-in-info-title\">\n                      <strong />\n                    </Localized>\n                    <Localized id=\"email-opt-in-info-sub-with-challenge\">\n                      <span />\n                    </Localized>\n                  </>\n                }\n                onChange={handleChangeFor('sendEmails')}\n                checked={sendEmails}\n              />\n\n              {!user.account && !isSubmitted && (\n                <>\n                  <LabeledCheckbox\n                    label={\n                      <>\n                        <Localized id=\"accept-privacy-title\">\n                          <strong />\n                        </Localized>\n                        <Localized\n                          id=\"accept-privacy\"\n                          elems={{\n                            privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n                          }}>\n                          <span />\n                        </Localized>\n                      </>\n                    }\n                    checked={privacyAgreed}\n                    onChange={handleChangeFor('privacyAgreed')}\n                  />\n\n                  <Localized id=\"read-terms-q\">\n                    <LocaleLink\n                      to={\n                        isEnrolledInChallenge\n                          ? URLS.CHALLENGE_TERMS\n                          : URLS.TERMS\n                      }\n                      className=\"terms\"\n                      blank\n                    />\n                  </Localized>\n                </>\n              )}\n            </div>\n          </div>\n\n          <Hr />\n        </>\n      )}\n\n      <Localized id=\"profile-form-submit-save\">\n        <Button\n          className=\"save\"\n          rounded\n          disabled={isSaving || !privacyAgreed}\n          onClick={submit}\n        />\n      </Localized>\n    </div>\n  );\n}\n\nexport default withLocalization(withRouter(ProfilePage));\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useEffect } from 'react';\nimport { connect } from 'react-redux';\nimport { UserClient } from 'common';\nimport { Notifications } from '../../../../stores/notifications';\nimport StateTree from '../../../../stores/tree';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { getManageSubscriptionURL } from '../../../../utility';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { InfoIcon, PenIcon, SettingsIcon } from '../../../ui/icons';\nimport {\n  LabeledCheckbox,\n  LabeledInput,\n  LinkButton,\n  Toggle,\n} from '../../../ui/ui';\n\nimport './settings.css';\nimport { useIsSubscribed } from '../../../../hooks/store-hooks';\n\nconst Section = ({\n  title,\n  titleAction,\n  className = '',\n  children,\n  ...props\n}: {\n  title: string;\n  titleAction?: React.ReactNode;\n  className?: string;\n  children?: React.ReactNode;\n}) => (\n  <section className={'user-setting ' + className} {...props}>\n    <div className=\"section-title\">\n      <h2>{title}</h2>\n      {titleAction}\n    </div>\n    {children && <div className=\"section-body\">{children}</div>}\n  </section>\n);\n\ninterface PropsFromState {\n  account: UserClient;\n  locale: string;\n}\n\ninterface PropsFromDispatch {\n  addNotification: typeof Notifications.actions.addPill;\n  saveAccount: any;\n}\n\ninterface Props\n  extends WithLocalizationProps,\n    PropsFromState,\n    PropsFromDispatch {}\n\nfunction Settings(props: Props) {\n  const { account, addNotification, getString, saveAccount } = props;\n  const isSubscribed = useIsSubscribed();\n\n  useEffect(() => {\n    const { pathname, search } = location;\n    if (search.includes('success=false')) {\n      addNotification(\n        <Localized id=\"email-already-used\">\n          <span />\n        </Localized>,\n        'error'\n      );\n      history.replaceState({}, null, pathname);\n    } else if (search.includes('success=true')) {\n      addNotification(\n        <Localized id=\"profile-form-submit-saved\">\n          <span />\n        </Localized>\n      );\n      history.replaceState({}, null, pathname);\n    }\n  }, []);\n\n  return (\n    <div>\n      <Section title={getString('login-identity')} className=\"two-columns\">\n        <Localized id=\"email-input\" attrs={{ label: true }}>\n          <LabeledInput value={account.email} disabled />\n        </Localized>\n\n        <LinkButton\n          outline\n          className=\"edit-button\"\n          href={location.origin + '/login?change_email'}>\n          <PenIcon />\n          <Localized id=\"edit\">\n            <span />\n          </Localized>\n        </LinkButton>\n      </Section>\n\n      {account.basket_token && (\n        <Section\n          title={getString('email-subscriptions')}\n          titleAction={\n            <a\n              className=\"manage-subscriptions\"\n              href={getManageSubscriptionURL(account)}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\">\n              <Localized id=\"manage-subscriptions\">\n                <span />\n              </Localized>\n              <SettingsIcon />\n            </a>\n          }>\n          <div className=\"email-section\">\n            {isSubscribed == null ? (\n              <div />\n            ) : (\n              <LabeledCheckbox\n                disabled={true}\n                checked={isSubscribed}\n                label={\n                  <Localized id=\"email-opt-in-info\">\n                    <span />\n                  </Localized>\n                }\n              />\n            )}\n            <div className=\"privacy-and-terms\">\n              <InfoIcon />\n              <div>\n                <Localized\n                  id=\"email-opt-in-privacy\"\n                  elems={{\n                    privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n                  }}>\n                  <div />\n                </Localized>\n                <br />\n                <Localized id=\"read-terms-q\">\n                  <LocaleLink to={URLS.TERMS} className=\"terms\" blank />\n                </Localized>\n              </div>\n            </div>\n          </div>\n        </Section>\n      )}\n\n      <Section title={getString('contribution-experience')} className=\"box\">\n        <div>\n          <Localized id=\"skip-submission-feedback\">\n            <h3 className=\"feedback-toggle-title\" />\n          </Localized>\n          <Toggle\n            offText=\"off\"\n            onText=\"on\"\n            defaultChecked={account.skip_submission_feedback}\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              saveAccount({\n                skip_submission_feedback: event.target.checked,\n              })\n            }\n          />\n          <Localized id=\"skip-submission-description\">\n            <p className=\"skip-submission-description\" />\n          </Localized>\n          <Localized id=\"skip-submission-note\">\n            <p className=\"skip-submission-note\" />\n          </Localized>\n        </div>\n\n        <div className=\"images\">\n          <img\n            className=\"hidden-sm-down\"\n            src={require('./submission-screenshot-lg.jpg')}\n            alt=\"Submission Success Screenshot\"\n          />\n          <img\n            className=\"hidden-md-up\"\n            src={require('./submission-screenshot-xs.jpg')}\n            alt=\"Submission Success Screenshot\"\n          />\n        </div>\n      </Section>\n    </div>\n  );\n}\n\nexport default connect<PropsFromState, PropsFromDispatch>(\n  ({ locale, user }: StateTree) => ({\n    account: user.account,\n    locale,\n  }),\n  {\n    addNotification: Notifications.actions.addPill,\n    saveAccount: User.actions.saveAccount,\n  }\n)(withLocalization(Settings));\n","import { Localized } from '@fluent/react';\nconst pick = require('lodash.pick');\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Redirect, Route, Switch } from 'react-router';\nimport { NavLink } from 'react-router-dom';\nimport { UserClient } from 'common';\nimport { User } from '../../../stores/user';\nimport StateTree from '../../../stores/tree';\nimport URLS from '../../../urls';\nimport { localeConnector, LocalePropsFromState } from '../../locale-helpers';\nimport {\n  BarChartIcon,\n  CameraIcon,\n  CloudIcon,\n  CogIcon,\n  TrashIcon,\n  UserIcon,\n  UserPlusIcon,\n} from '../../ui/icons';\nimport AvatarSetup from './avatar-setup/avatar-setup';\nimport DeleteProfile from './delete/delete';\nimport InfoPage from './info/info';\nimport Settings from './settings/settings';\n\nimport './layout.css';\n\nfunction downloadData(account: UserClient) {\n  const text = [\n    ...Object.entries(pick(account, 'email', 'username', 'age', 'gender')),\n    ...account.locales.reduce((all, l, i) => {\n      const localeLabel = 'language ' + (i + 1);\n      return [\n        ...all,\n        [localeLabel, l.locale],\n        [localeLabel + ' accent', l.accent],\n      ];\n    }, []),\n  ]\n    .map(([key, value]) => key + ': ' + value)\n    .join('\\n');\n\n  const element = document.createElement('a');\n  element.setAttribute(\n    'href',\n    'data:text/plain;charset=utf-8,' + encodeURIComponent(text)\n  );\n  element.setAttribute('download', 'profile.txt');\n\n  element.style.display = 'none';\n  document.body.appendChild(element);\n\n  element.click();\n\n  document.body.removeChild(element);\n}\n\ninterface PropsFromState {\n  user: User.State;\n}\n\ninterface Props extends LocalePropsFromState, PropsFromState {}\n\nconst Layout = ({ toLocaleRoute, user }: Props) => {\n  const [infoRoute, avatarRoute, prefRoute, deleteRoute] = [\n    URLS.PROFILE_INFO,\n    URLS.PROFILE_AVATAR,\n    URLS.PROFILE_SETTINGS,\n    URLS.PROFILE_DELETE,\n  ].map(r => toLocaleRoute(r));\n  return (\n    <div className=\"profile-layout\">\n      <div className=\"profile-nav\">\n        <div className=\"links\">\n          {[\n            {\n              route: infoRoute,\n              ...(user.account\n                ? { icon: <UserIcon />, id: 'profile' }\n                : { icon: <UserPlusIcon />, id: 'build-profile' }),\n            },\n            { route: avatarRoute, icon: <CameraIcon />, id: 'avatar' },\n            { route: prefRoute, icon: <CogIcon />, id: 'settings' },\n            {\n              route: deleteRoute,\n              icon: <TrashIcon />,\n              id: 'profile-form-delete',\n            },\n          ]\n            .slice(0, user.account ? Infinity : 1)\n            .map(({ route, icon, id }) => (\n              <NavLink key={route} to={route}>\n                {icon}\n                <Localized id={id}>\n                  <span className=\"text\" />\n                </Localized>\n              </NavLink>\n            ))}\n          {user.account && (\n            <a onClick={() => downloadData(user.account)} href=\"#\">\n              <CloudIcon />\n              <Localized id=\"download-profile\">\n                <span className=\"text\" />\n              </Localized>\n            </a>\n          )}\n        </div>\n      </div>\n      <div className=\"content\">\n        <Switch>\n          <Route exact path={infoRoute} component={InfoPage} />\n          {[\n            { route: avatarRoute, Component: AvatarSetup },\n            { route: prefRoute, Component: Settings },\n            { route: deleteRoute, Component: DeleteProfile },\n          ].map(({ route, Component }) => (\n            <Route\n              key={route}\n              exact\n              path={route}\n              render={props =>\n                user.account ? <Component /> : <Redirect to={infoRoute} />\n              }\n            />\n          ))}\n          <Route\n            render={() => <Redirect to={toLocaleRoute(URLS.PROFILE_INFO)} />}\n          />\n        </Switch>\n      </div>\n    </div>\n  );\n};\n\nexport default connect<PropsFromState>(({ user }: StateTree) => ({ user }))(\n  localeConnector(Layout)\n);\n"],"sourceRoot":""}