From 8c0e88ff06952b922599a36ec4ed5f91da31c578 Mon Sep 17 00:00:00 2001 From: Do-hyun Ko Date: Sat, 24 Aug 2024 23:31:49 +0900 Subject: [PATCH] :adhesive_bandage: Change reat-atoms isImportant to true --- build/404.html | 2 +- build/assets/{index-c5126b8b.js => index-a75d7eb2.js} | 2 +- build/index.html | 2 +- src/locales/en-US/index.ts | 2 +- src/locales/ko-KR/index.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename build/assets/{index-c5126b8b.js => index-a75d7eb2.js} (99%) diff --git a/build/404.html b/build/404.html index e7ecdb4..8847edf 100644 --- a/build/404.html +++ b/build/404.html @@ -94,7 +94,7 @@ region: "eu", }); - + diff --git a/build/assets/index-c5126b8b.js b/build/assets/index-a75d7eb2.js similarity index 99% rename from build/assets/index-c5126b8b.js rename to build/assets/index-a75d7eb2.js index e5da907..54b8fb1 100644 --- a/build/assets/index-c5126b8b.js +++ b/build/assets/index-a75d7eb2.js @@ -14,7 +14,7 @@ function xP(e,t){for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:{};this.init(t,n)}init(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||WP,this.options=n,this.debug=n.debug}log(){for(var t=arguments.length,n=new Array(t),i=0;i{this.observers[i]||(this.observers[i]=new Map);const l=this.observers[i].get(n)||0;this.observers[i].set(n,l+1)}),this}off(t,n){if(this.observers[t]){if(!n){delete this.observers[t];return}this.observers[t].delete(n)}}emit(t){for(var n=arguments.length,i=new Array(n>1?n-1:0),l=1;l{let[f,d]=a;for(let h=0;h{let[f,d]=a;for(let h=0;h{e=i,t=l});return n.resolve=e,n.reject=t,n}function X1(e){return e==null?"":""+e}function QP(e,t,n){e.forEach(i=>{t[i]&&(n[i]=t[i])})}const KP=/###/g;function js(e,t,n){function i(f){return f&&f.indexOf("###")>-1?f.replace(KP,"."):f}function l(){return!e||typeof e=="string"}const s=typeof t!="string"?t:t.split(".");let a=0;for(;a":">",'"':""","'":"'","/":"/"};function JP(e){return typeof e=="string"?e.replace(/[&<>"'\/]/g,t=>XP[t]):e}class ZP{constructor(t){this.capacity=t,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(t){const n=this.regExpMap.get(t);if(n!==void 0)return n;const i=new RegExp(t);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(t,i),this.regExpQueue.push(t),i}}const qP=[" ",",","?","!",";"],e3=new ZP(20);function t3(e,t,n){t=t||"",n=n||"";const i=qP.filter(a=>t.indexOf(a)<0&&n.indexOf(a)<0);if(i.length===0)return!0;const l=e3.getRegExp(`(${i.map(a=>a==="?"?"\\?":a).join("|")})`);let s=!l.test(e);if(!s){const a=e.indexOf(n);a>0&&!l.test(e.substring(0,a))&&(s=!0)}return s}function Ph(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(!e)return;if(e[t])return e[t];const i=t.split(n);let l=e;for(let s=0;s-1&&d0?e.replace("_","-"):e}class Z1 extends cf{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};super(),this.data=t||{},this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}getResource(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};const s=l.keySeparator!==void 0?l.keySeparator:this.options.keySeparator,a=l.ignoreJSONStructure!==void 0?l.ignoreJSONStructure:this.options.ignoreJSONStructure;let f;t.indexOf(".")>-1?f=t.split("."):(f=[t,n],i&&(Array.isArray(i)?f.push(...i):typeof i=="string"&&s?f.push(...i.split(s)):f.push(i)));const d=Pc(this.data,f);return!d&&!n&&!i&&t.indexOf(".")>-1&&(t=f[0],n=f[1],i=f.slice(2).join(".")),d||!a||typeof i!="string"?d:Ph(this.data&&this.data[t]&&this.data[t][n],i,s)}addResource(t,n,i,l){let s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1};const a=s.keySeparator!==void 0?s.keySeparator:this.options.keySeparator;let f=[t,n];i&&(f=f.concat(a?i.split(a):i)),t.indexOf(".")>-1&&(f=t.split("."),l=n,n=f[1]),this.addNamespaces(n),J1(this.data,f,l),s.silent||this.emit("added",t,n,i,l)}addResources(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(const s in i)(typeof i[s]=="string"||Array.isArray(i[s]))&&this.addResource(t,n,s,i[s],{silent:!0});l.silent||this.emit("added",t,n,i)}addResourceBundle(t,n,i,l,s){let a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1,skipCopy:!1},f=[t,n];t.indexOf(".")>-1&&(f=t.split("."),l=i,i=n,n=f[1]),this.addNamespaces(n);let d=Pc(this.data,f)||{};a.skipCopy||(i=JSON.parse(JSON.stringify(i))),l?ZS(d,i,s):d={...d,...i},J1(this.data,f,d),a.silent||this.emit("added",t,n,i)}removeResourceBundle(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}hasResourceBundle(t,n){return this.getResource(t,n)!==void 0}getResourceBundle(t,n){return n||(n=this.options.defaultNS),this.options.compatibilityAPI==="v1"?{...this.getResource(t,n)}:this.getResource(t,n)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const n=this.getDataByLanguage(t);return!!(n&&Object.keys(n)||[]).find(l=>n[l]&&Object.keys(n[l]).length>0)}toJSON(){return this.data}}var qS={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,i,l){return e.forEach(s=>{this.processors[s]&&(t=this.processors[s].process(t,n,i,l))}),t}};const q1={};class Tc extends cf{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(),QP(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=Ir.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(t==null)return!1;const i=this.resolve(t,n);return i&&i.res!==void 0}extractFromKey(t,n){let i=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;i===void 0&&(i=":");const l=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let s=n.ns||this.options.defaultNS||[];const a=i&&t.indexOf(i)>-1,f=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!t3(t,i,l);if(a&&!f){const d=t.match(this.interpolator.nestingRegexp);if(d&&d.length>0)return{key:t,namespaces:s};const h=t.split(i);(i!==l||i===l&&this.options.ns.indexOf(h[0])>-1)&&(s=h.shift()),t=h.join(l)}return typeof s=="string"&&(s=[s]),{key:t,namespaces:s}}translate(t,n,i){if(typeof n!="object"&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),typeof n=="object"&&(n={...n}),n||(n={}),t==null)return"";Array.isArray(t)||(t=[String(t)]);const l=n.returnDetails!==void 0?n.returnDetails:this.options.returnDetails,s=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,{key:a,namespaces:f}=this.extractFromKey(t[t.length-1],n),d=f[f.length-1],h=n.lng||this.language,g=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(h&&h.toLowerCase()==="cimode"){if(g){const N=n.nsSeparator||this.options.nsSeparator;return l?{res:`${d}${N}${a}`,usedKey:a,exactUsedKey:a,usedLng:h,usedNS:d,usedParams:this.getUsedParamsDetails(n)}:`${d}${N}${a}`}return l?{res:a,usedKey:a,exactUsedKey:a,usedLng:h,usedNS:d,usedParams:this.getUsedParamsDetails(n)}:a}const y=this.resolve(t,n);let v=y&&y.res;const S=y&&y.usedKey||a,C=y&&y.exactUsedKey||a,I=Object.prototype.toString.apply(v),A=["[object Number]","[object Function]","[object RegExp]"],x=n.joinArrays!==void 0?n.joinArrays:this.options.joinArrays,E=!this.i18nFormat||this.i18nFormat.handleAsObject;if(E&&v&&(typeof v!="string"&&typeof v!="boolean"&&typeof v!="number")&&A.indexOf(I)<0&&!(typeof x=="string"&&Array.isArray(v))){if(!n.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const N=this.options.returnedObjectHandler?this.options.returnedObjectHandler(S,v,{...n,ns:f}):`key '${a} (${this.language})' returned an object instead of string.`;return l?(y.res=N,y.usedParams=this.getUsedParamsDetails(n),y):N}if(s){const N=Array.isArray(v),M=N?[]:{},_=N?C:S;for(const B in v)if(Object.prototype.hasOwnProperty.call(v,B)){const R=`${_}${s}${B}`;M[B]=this.translate(R,{...n,joinArrays:!1,ns:f}),M[B]===R&&(M[B]=v[B])}v=M}}else if(E&&typeof x=="string"&&Array.isArray(v))v=v.join(x),v&&(v=this.extendTranslation(v,t,n,i));else{let N=!1,M=!1;const _=n.count!==void 0&&typeof n.count!="string",B=Tc.hasDefaultValue(n),R=_?this.pluralResolver.getSuffix(h,n.count,n):"",G=n.ordinal&&_?this.pluralResolver.getSuffix(h,n.count,{ordinal:!1}):"",Y=_&&!n.ordinal&&n.count===0&&this.pluralResolver.shouldUseIntlApi(),j=Y&&n[`defaultValue${this.options.pluralSeparator}zero`]||n[`defaultValue${R}`]||n[`defaultValue${G}`]||n.defaultValue;!this.isValidLookup(v)&&B&&(N=!0,v=j),this.isValidLookup(v)||(M=!0,v=a);const J=(n.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&M?void 0:v,ne=B&&j!==v&&this.options.updateMissing;if(M||N||ne){if(this.logger.log(ne?"updateKey":"missingKey",h,d,a,ne?j:v),s){const O=this.resolve(a,{...n,keySeparator:!1});O&&O.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let te=[];const de=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if(this.options.saveMissingTo==="fallback"&&de&&de[0])for(let O=0;O{const b=B&&w!==v?w:J;this.options.missingKeyHandler?this.options.missingKeyHandler(O,d,X,b,ne,n):this.backendConnector&&this.backendConnector.saveMissing&&this.backendConnector.saveMissing(O,d,X,b,ne,n),this.emit("missingKey",O,d,X,v)};this.options.saveMissing&&(this.options.saveMissingPlurals&&_?te.forEach(O=>{const X=this.pluralResolver.getSuffixes(O,n);Y&&n[`defaultValue${this.options.pluralSeparator}zero`]&&X.indexOf(`${this.options.pluralSeparator}zero`)<0&&X.push(`${this.options.pluralSeparator}zero`),X.forEach(w=>{re([O],a+w,n[`defaultValue${w}`]||j)})}):re(te,a,j))}v=this.extendTranslation(v,t,n,y,i),M&&v===a&&this.options.appendNamespaceToMissingKey&&(v=`${d}:${a}`),(M||N)&&this.options.parseMissingKeyHandler&&(this.options.compatibilityAPI!=="v1"?v=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${d}:${a}`:a,N?v:void 0):v=this.options.parseMissingKeyHandler(v))}return l?(y.res=v,y.usedParams=this.getUsedParamsDetails(n),y):v}extendTranslation(t,n,i,l,s){var a=this;if(this.i18nFormat&&this.i18nFormat.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...i},i.lng||this.language||l.usedLng,l.usedNS,l.usedKey,{resolved:l});else if(!i.skipInterpolation){i.interpolation&&this.interpolator.init({...i,interpolation:{...this.options.interpolation,...i.interpolation}});const h=typeof t=="string"&&(i&&i.interpolation&&i.interpolation.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let g;if(h){const v=t.match(this.interpolator.nestingRegexp);g=v&&v.length}let y=i.replace&&typeof i.replace!="string"?i.replace:i;if(this.options.interpolation.defaultVariables&&(y={...this.options.interpolation.defaultVariables,...y}),t=this.interpolator.interpolate(t,y,i.lng||this.language,i),h){const v=t.match(this.interpolator.nestingRegexp),S=v&&v.length;g1&&arguments[1]!==void 0?arguments[1]:{},i,l,s,a,f;return typeof t=="string"&&(t=[t]),t.forEach(d=>{if(this.isValidLookup(i))return;const h=this.extractFromKey(d,n),g=h.key;l=g;let y=h.namespaces;this.options.fallbackNS&&(y=y.concat(this.options.fallbackNS));const v=n.count!==void 0&&typeof n.count!="string",S=v&&!n.ordinal&&n.count===0&&this.pluralResolver.shouldUseIntlApi(),C=n.context!==void 0&&(typeof n.context=="string"||typeof n.context=="number")&&n.context!=="",I=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);y.forEach(A=>{this.isValidLookup(i)||(f=A,!q1[`${I[0]}-${A}`]&&this.utils&&this.utils.hasLoadedNamespace&&!this.utils.hasLoadedNamespace(f)&&(q1[`${I[0]}-${A}`]=!0,this.logger.warn(`key "${l}" for languages "${I.join(", ")}" won't get resolved as namespace "${f}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),I.forEach(x=>{if(this.isValidLookup(i))return;a=x;const E=[g];if(this.i18nFormat&&this.i18nFormat.addLookupKeys)this.i18nFormat.addLookupKeys(E,g,x,A,n);else{let N;v&&(N=this.pluralResolver.getSuffix(x,n.count,n));const M=`${this.options.pluralSeparator}zero`,_=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(v&&(E.push(g+N),n.ordinal&&N.indexOf(_)===0&&E.push(g+N.replace(_,this.options.pluralSeparator)),S&&E.push(g+M)),C){const B=`${g}${this.options.contextSeparator}${n.context}`;E.push(B),v&&(E.push(B+N),n.ordinal&&N.indexOf(_)===0&&E.push(B+N.replace(_,this.options.pluralSeparator)),S&&E.push(B+M))}}let T;for(;T=E.pop();)this.isValidLookup(i)||(s=T,i=this.getResource(x,A,T,n))}))})}),{res:i,usedKey:l,exactUsedKey:s,usedLng:a,usedNS:f}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,i,l):this.resourceStore.getResource(t,n,i,l)}getUsedParamsDetails(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],i=t.replace&&typeof t.replace!="string";let l=i?t.replace:t;if(i&&typeof t.count<"u"&&(l.count=t.count),this.options.interpolation.defaultVariables&&(l={...this.options.interpolation.defaultVariables,...l}),!i){l={...l};for(const s of n)delete l[s]}return l}static hasDefaultValue(t){const n="defaultValue";for(const i in t)if(Object.prototype.hasOwnProperty.call(t,i)&&n===i.substring(0,n.length)&&t[i]!==void 0)return!0;return!1}}function Op(e){return e.charAt(0).toUpperCase()+e.slice(1)}class ev{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=Ir.create("languageUtils")}getScriptPartFromCode(t){if(t=Ic(t),!t||t.indexOf("-")<0)return null;const n=t.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(t){if(t=Ic(t),!t||t.indexOf("-")<0)return t;const n=t.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(t){if(typeof t=="string"&&t.indexOf("-")>-1){const n=["hans","hant","latn","cyrl","cans","mong","arab"];let i=t.split("-");return this.options.lowerCaseLng?i=i.map(l=>l.toLowerCase()):i.length===2?(i[0]=i[0].toLowerCase(),i[1]=i[1].toUpperCase(),n.indexOf(i[1].toLowerCase())>-1&&(i[1]=Op(i[1].toLowerCase()))):i.length===3&&(i[0]=i[0].toLowerCase(),i[1].length===2&&(i[1]=i[1].toUpperCase()),i[0]!=="sgn"&&i[2].length===2&&(i[2]=i[2].toUpperCase()),n.indexOf(i[1].toLowerCase())>-1&&(i[1]=Op(i[1].toLowerCase())),n.indexOf(i[2].toLowerCase())>-1&&(i[2]=Op(i[2].toLowerCase()))),i.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let n;return t.forEach(i=>{if(n)return;const l=this.formatLanguageCode(i);(!this.options.supportedLngs||this.isSupportedCode(l))&&(n=l)}),!n&&this.options.supportedLngs&&t.forEach(i=>{if(n)return;const l=this.getLanguagePartFromCode(i);if(this.isSupportedCode(l))return n=l;n=this.options.supportedLngs.find(s=>{if(s===l)return s;if(!(s.indexOf("-")<0&&l.indexOf("-")<0)&&(s.indexOf("-")>0&&l.indexOf("-")<0&&s.substring(0,s.indexOf("-"))===l||s.indexOf(l)===0&&l.length>1))return s})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(t,n){if(!t)return[];if(typeof t=="function"&&(t=t(n)),typeof t=="string"&&(t=[t]),Array.isArray(t))return t;if(!n)return t.default||[];let i=t[n];return i||(i=t[this.getScriptPartFromCode(n)]),i||(i=t[this.formatLanguageCode(n)]),i||(i=t[this.getLanguagePartFromCode(n)]),i||(i=t.default),i||[]}toResolveHierarchy(t,n){const i=this.getFallbackCodes(n||this.options.fallbackLng||[],t),l=[],s=a=>{a&&(this.isSupportedCode(a)?l.push(a):this.logger.warn(`rejecting language code not found in supportedLngs: ${a}`))};return typeof t=="string"&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&s(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&s(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&s(this.getLanguagePartFromCode(t))):typeof t=="string"&&s(this.formatLanguageCode(t)),i.forEach(a=>{l.indexOf(a)<0&&s(this.formatLanguageCode(a))}),l}}let n3=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],r3={1:function(e){return+(e>1)},2:function(e){return+(e!=1)},3:function(e){return 0},4:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},5:function(e){return e==0?0:e==1?1:e==2?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},6:function(e){return e==1?0:e>=2&&e<=4?1:2},7:function(e){return e==1?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},8:function(e){return e==1?0:e==2?1:e!=8&&e!=11?2:3},9:function(e){return+(e>=2)},10:function(e){return e==1?0:e==2?1:e<7?2:e<11?3:4},11:function(e){return e==1||e==11?0:e==2||e==12?1:e>2&&e<20?2:3},12:function(e){return+(e%10!=1||e%100==11)},13:function(e){return+(e!==0)},14:function(e){return e==1?0:e==2?1:e==3?2:3},15:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2},16:function(e){return e%10==1&&e%100!=11?0:e!==0?1:2},17:function(e){return e==1||e%10==1&&e%100!=11?0:1},18:function(e){return e==0?0:e==1?1:2},19:function(e){return e==1?0:e==0||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3},20:function(e){return e==1?0:e==0||e%100>0&&e%100<20?1:2},21:function(e){return e%100==1?1:e%100==2?2:e%100==3||e%100==4?3:0},22:function(e){return e==1?0:e==2?1:(e<0||e>10)&&e%10==0?2:3}};const i3=["v1","v2","v3"],o3=["v4"],tv={zero:0,one:1,two:2,few:3,many:4,other:5};function l3(){const e={};return n3.forEach(t=>{t.lngs.forEach(n=>{e[n]={numbers:t.nr,plurals:r3[t.fc]}})}),e}class s3{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.languageUtils=t,this.options=n,this.logger=Ir.create("pluralResolver"),(!this.options.compatibilityJSON||o3.includes(this.options.compatibilityJSON))&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=l3()}addRule(t,n){this.rules[t]=n}getRule(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(Ic(t==="dev"?"en":t),{type:n.ordinal?"ordinal":"cardinal"})}catch{return}return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}needsPlural(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const i=this.getRule(t,n);return this.shouldUseIntlApi()?i&&i.resolvedOptions().pluralCategories.length>1:i&&i.numbers.length>1}getPluralFormsOfKey(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(t,i).map(l=>`${n}${l}`)}getSuffixes(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const i=this.getRule(t,n);return i?this.shouldUseIntlApi()?i.resolvedOptions().pluralCategories.sort((l,s)=>tv[l]-tv[s]).map(l=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${l}`):i.numbers.map(l=>this.getSuffix(t,l,n)):[]}getSuffix(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const l=this.getRule(t,i);return l?this.shouldUseIntlApi()?`${this.options.prepend}${i.ordinal?`ordinal${this.options.prepend}`:""}${l.select(n)}`:this.getSuffixRetroCompatible(l,n):(this.logger.warn(`no plural rule found for: ${t}`),"")}getSuffixRetroCompatible(t,n){const i=t.noAbs?t.plurals(n):t.plurals(Math.abs(n));let l=t.numbers[i];this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1&&(l===2?l="plural":l===1&&(l=""));const s=()=>this.options.prepend&&l.toString()?this.options.prepend+l.toString():l.toString();return this.options.compatibilityJSON==="v1"?l===1?"":typeof l=="number"?`_plural_${l.toString()}`:s():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1?s():this.options.prepend&&i.toString()?this.options.prepend+i.toString():i.toString()}shouldUseIntlApi(){return!i3.includes(this.options.compatibilityJSON)}}function nv(e,t,n){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:".",l=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=YP(e,t,n);return!s&&l&&typeof n=="string"&&(s=Ph(e,n,i),s===void 0&&(s=Ph(t,n,i))),s}class u3{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=Ir.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||(n=>n),this.init(t)}init(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});const{escape:n,escapeValue:i,useRawValueToEscape:l,prefix:s,prefixEscaped:a,suffix:f,suffixEscaped:d,formatSeparator:h,unescapeSuffix:g,unescapePrefix:y,nestingPrefix:v,nestingPrefixEscaped:S,nestingSuffix:C,nestingSuffixEscaped:I,nestingOptionsSeparator:A,maxReplaces:x,alwaysFormat:E}=t.interpolation;this.escape=n!==void 0?n:JP,this.escapeValue=i!==void 0?i:!0,this.useRawValueToEscape=l!==void 0?l:!1,this.prefix=s?Xo(s):a||"{{",this.suffix=f?Xo(f):d||"}}",this.formatSeparator=h||",",this.unescapePrefix=g?"":y||"-",this.unescapeSuffix=this.unescapePrefix?"":g||"",this.nestingPrefix=v?Xo(v):S||Xo("$t("),this.nestingSuffix=C?Xo(C):I||Xo(")"),this.nestingOptionsSeparator=A||",",this.maxReplaces=x||1e3,this.alwaysFormat=E!==void 0?E:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=(n,i)=>n&&n.source===i?(n.lastIndex=0,n):new RegExp(i,"g");this.regexp=t(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=t(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=t(this.nestingRegexp,`${this.nestingPrefix}(.+?)${this.nestingSuffix}`)}interpolate(t,n,i,l){let s,a,f;const d=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function h(C){return C.replace(/\$/g,"$$$$")}const g=C=>{if(C.indexOf(this.formatSeparator)<0){const E=nv(n,d,C,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(E,void 0,i,{...l,...n,interpolationkey:C}):E}const I=C.split(this.formatSeparator),A=I.shift().trim(),x=I.join(this.formatSeparator).trim();return this.format(nv(n,d,A,this.options.keySeparator,this.options.ignoreJSONStructure),x,i,{...l,...n,interpolationkey:A})};this.resetRegExp();const y=l&&l.missingInterpolationHandler||this.options.missingInterpolationHandler,v=l&&l.interpolation&&l.interpolation.skipOnVariables!==void 0?l.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:C=>h(C)},{regex:this.regexp,safeValue:C=>this.escapeValue?h(this.escape(C)):h(C)}].forEach(C=>{for(f=0;s=C.regex.exec(t);){const I=s[1].trim();if(a=g(I),a===void 0)if(typeof y=="function"){const x=y(t,s,l);a=typeof x=="string"?x:""}else if(l&&Object.prototype.hasOwnProperty.call(l,I))a="";else if(v){a=s[0];continue}else this.logger.warn(`missed to pass in variable ${I} for interpolating ${t}`),a="";else typeof a!="string"&&!this.useRawValueToEscape&&(a=X1(a));const A=C.safeValue(a);if(t=t.replace(s[0],A),v?(C.regex.lastIndex+=a.length,C.regex.lastIndex-=s[0].length):C.regex.lastIndex=0,f++,f>=this.maxReplaces)break}}),t}nest(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},l,s,a;function f(d,h){const g=this.nestingOptionsSeparator;if(d.indexOf(g)<0)return d;const y=d.split(new RegExp(`${g}[ ]*{`));let v=`{${y[1]}`;d=y[0],v=this.interpolate(v,a);const S=v.match(/'/g),C=v.match(/"/g);(S&&S.length%2===0&&!C||C.length%2!==0)&&(v=v.replace(/'/g,'"'));try{a=JSON.parse(v),h&&(a={...h,...a})}catch(I){return this.logger.warn(`failed parsing options string in nesting for key ${d}`,I),`${d}${g}${v}`}return a.defaultValue&&a.defaultValue.indexOf(this.prefix)>-1&&delete a.defaultValue,d}for(;l=this.nestingRegexp.exec(t);){let d=[];a={...i},a=a.replace&&typeof a.replace!="string"?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;let h=!1;if(l[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(l[1])){const g=l[1].split(this.formatSeparator).map(y=>y.trim());l[1]=g.shift(),d=g,h=!0}if(s=n(f.call(this,l[1].trim(),a),a),s&&l[0]===t&&typeof s!="string")return s;typeof s!="string"&&(s=X1(s)),s||(this.logger.warn(`missed to resolve ${l[1]} for nesting ${t}`),s=""),h&&(s=d.reduce((g,y)=>this.format(g,y,i.lng,{...i,interpolationkey:l[1].trim()}),s.trim())),t=t.replace(l[0],s),this.regexp.lastIndex=0}return t}}function a3(e){let t=e.toLowerCase().trim();const n={};if(e.indexOf("(")>-1){const i=e.split("(");t=i[0].toLowerCase().trim();const l=i[1].substring(0,i[1].length-1);t==="currency"&&l.indexOf(":")<0?n.currency||(n.currency=l.trim()):t==="relativetime"&&l.indexOf(":")<0?n.range||(n.range=l.trim()):l.split(";").forEach(a=>{if(a){const[f,...d]=a.split(":"),h=d.join(":").trim().replace(/^'+|'+$/g,""),g=f.trim();n[g]||(n[g]=h),h==="false"&&(n[g]=!1),h==="true"&&(n[g]=!0),isNaN(h)||(n[g]=parseInt(h,10))}})}return{formatName:t,formatOptions:n}}function Jo(e){const t={};return function(i,l,s){const a=l+JSON.stringify(s);let f=t[a];return f||(f=e(Ic(l),s),t[a]=f),f(i)}}class c3{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=Ir.create("formatter"),this.options=t,this.formats={number:Jo((n,i)=>{const l=new Intl.NumberFormat(n,{...i});return s=>l.format(s)}),currency:Jo((n,i)=>{const l=new Intl.NumberFormat(n,{...i,style:"currency"});return s=>l.format(s)}),datetime:Jo((n,i)=>{const l=new Intl.DateTimeFormat(n,{...i});return s=>l.format(s)}),relativetime:Jo((n,i)=>{const l=new Intl.RelativeTimeFormat(n,{...i});return s=>l.format(s,i.range||"day")}),list:Jo((n,i)=>{const l=new Intl.ListFormat(n,{...i});return s=>l.format(s)})},this.init(t)}init(t){const i=(arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}}).interpolation;this.formatSeparator=i.formatSeparator?i.formatSeparator:i.formatSeparator||","}add(t,n){this.formats[t.toLowerCase().trim()]=n}addCached(t,n){this.formats[t.toLowerCase().trim()]=Jo(n)}format(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return n.split(this.formatSeparator).reduce((f,d)=>{const{formatName:h,formatOptions:g}=a3(d);if(this.formats[h]){let y=f;try{const v=l&&l.formatParams&&l.formatParams[l.interpolationkey]||{},S=v.locale||v.lng||l.locale||l.lng||i;y=this.formats[h](f,S,{...g,...l,...v})}catch(v){this.logger.warn(v)}return y}else this.logger.warn(`there was no format function for ${h}`);return f},t)}}function f3(e,t){e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)}class d3 extends cf{constructor(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};super(),this.backend=t,this.store=n,this.services=i,this.languageUtils=i.languageUtils,this.options=l,this.logger=Ir.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=l.maxParallelReads||10,this.readingCalls=0,this.maxRetries=l.maxRetries>=0?l.maxRetries:5,this.retryTimeout=l.retryTimeout>=1?l.retryTimeout:350,this.state={},this.queue=[],this.backend&&this.backend.init&&this.backend.init(i,l.backend,l)}queueLoad(t,n,i,l){const s={},a={},f={},d={};return t.forEach(h=>{let g=!0;n.forEach(y=>{const v=`${h}|${y}`;!i.reload&&this.store.hasResourceBundle(h,y)?this.state[v]=2:this.state[v]<0||(this.state[v]===1?a[v]===void 0&&(a[v]=!0):(this.state[v]=1,g=!1,a[v]===void 0&&(a[v]=!0),s[v]===void 0&&(s[v]=!0),d[y]===void 0&&(d[y]=!0)))}),g||(f[h]=!0)}),(Object.keys(s).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:l}),{toLoad:Object.keys(s),pending:Object.keys(a),toLoadLanguages:Object.keys(f),toLoadNamespaces:Object.keys(d)}}loaded(t,n,i){const l=t.split("|"),s=l[0],a=l[1];n&&this.emit("failedLoading",s,a,n),i&&this.store.addResourceBundle(s,a,i,void 0,void 0,{skipCopy:!0}),this.state[t]=n?-1:2;const f={};this.queue.forEach(d=>{GP(d.loaded,[s],a),f3(d,t),n&&d.errors.push(n),d.pendingCount===0&&!d.done&&(Object.keys(d.loaded).forEach(h=>{f[h]||(f[h]={});const g=d.loaded[h];g.length&&g.forEach(y=>{f[h][y]===void 0&&(f[h][y]=!0)})}),d.done=!0,d.errors.length?d.callback(d.errors):d.callback())}),this.emit("loaded",f),this.queue=this.queue.filter(d=>!d.done)}read(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,a=arguments.length>5?arguments[5]:void 0;if(!t.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:n,fcName:i,tried:l,wait:s,callback:a});return}this.readingCalls++;const f=(h,g)=>{if(this.readingCalls--,this.waitingReads.length>0){const y=this.waitingReads.shift();this.read(y.lng,y.ns,y.fcName,y.tried,y.wait,y.callback)}if(h&&g&&l{this.read.call(this,t,n,i,l+1,s*2,a)},s);return}a(h,g)},d=this.backend[i].bind(this.backend);if(d.length===2){try{const h=d(t,n);h&&typeof h.then=="function"?h.then(g=>f(null,g)).catch(f):f(null,h)}catch(h){f(h)}return}return d(t,n,f)}prepareLoading(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},l=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),l&&l();typeof t=="string"&&(t=this.languageUtils.toResolveHierarchy(t)),typeof n=="string"&&(n=[n]);const s=this.queueLoad(t,n,i,l);if(!s.toLoad.length)return s.pending.length||l(),null;s.toLoad.forEach(a=>{this.loadOne(a)})}load(t,n,i){this.prepareLoading(t,n,{},i)}reload(t,n,i){this.prepareLoading(t,n,{reload:!0},i)}loadOne(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";const i=t.split("|"),l=i[0],s=i[1];this.read(l,s,"read",void 0,void 0,(a,f)=>{a&&this.logger.warn(`${n}loading namespace ${s} for language ${l} failed`,a),!a&&f&&this.logger.log(`${n}loaded namespace ${s} for language ${l}`,f),this.loaded(t,a,f)})}saveMissing(t,n,i,l,s){let a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{},f=arguments.length>6&&arguments[6]!==void 0?arguments[6]:()=>{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${i}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(i==null||i==="")){if(this.backend&&this.backend.create){const d={...a,isUpdate:s},h=this.backend.create.bind(this.backend);if(h.length<6)try{let g;h.length===5?g=h(t,n,i,l,d):g=h(t,n,i,l),g&&typeof g.then=="function"?g.then(y=>f(null,y)).catch(f):f(null,g)}catch(g){f(g)}else h(t,n,i,l,f,d)}!t||!t[0]||this.store.addResource(t[0],n,i,l)}}}function rv(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){let n={};if(typeof t[1]=="object"&&(n=t[1]),typeof t[1]=="string"&&(n.defaultValue=t[1]),typeof t[2]=="string"&&(n.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const i=t[3]||t[2];Object.keys(i).forEach(l=>{n[l]=i[l]})}return n},interpolation:{escapeValue:!0,format:e=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function iv(e){return typeof e.ns=="string"&&(e.ns=[e.ns]),typeof e.fallbackLng=="string"&&(e.fallbackLng=[e.fallbackLng]),typeof e.fallbackNS=="string"&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function Ma(){}function p3(e){Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(n=>{typeof e[n]=="function"&&(e[n]=e[n].bind(e))})}class qs extends cf{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;if(super(),this.options=iv(t),this.services={},this.logger=Ir,this.modules={external:[]},p3(this),n&&!this.isInitialized&&!t.isClone){if(!this.options.initImmediate)return this.init(t,n),this;setTimeout(()=>{this.init(t,n)},0)}}init(){var t=this;let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},i=arguments.length>1?arguments[1]:void 0;this.isInitializing=!0,typeof n=="function"&&(i=n,n={}),!n.defaultNS&&n.defaultNS!==!1&&n.ns&&(typeof n.ns=="string"?n.defaultNS=n.ns:n.ns.indexOf("translation")<0&&(n.defaultNS=n.ns[0]));const l=rv();this.options={...l,...this.options,...iv(n)},this.options.compatibilityAPI!=="v1"&&(this.options.interpolation={...l.interpolation,...this.options.interpolation}),n.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=n.keySeparator),n.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=n.nsSeparator);function s(g){return g?typeof g=="function"?new g:g:null}if(!this.options.isClone){this.modules.logger?Ir.init(s(this.modules.logger),this.options):Ir.init(null,this.options);let g;this.modules.formatter?g=this.modules.formatter:typeof Intl<"u"&&(g=c3);const y=new ev(this.options);this.store=new Z1(this.options.resources,this.options);const v=this.services;v.logger=Ir,v.resourceStore=this.store,v.languageUtils=y,v.pluralResolver=new s3(y,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),g&&(!this.options.interpolation.format||this.options.interpolation.format===l.interpolation.format)&&(v.formatter=s(g),v.formatter.init(v,this.options),this.options.interpolation.format=v.formatter.format.bind(v.formatter)),v.interpolator=new u3(this.options),v.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},v.backendConnector=new d3(s(this.modules.backend),v.resourceStore,v,this.options),v.backendConnector.on("*",function(S){for(var C=arguments.length,I=new Array(C>1?C-1:0),A=1;A1?C-1:0),A=1;A{S.init&&S.init(this)})}if(this.format=this.options.interpolation.format,i||(i=Ma),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const g=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);g.length>0&&g[0]!=="dev"&&(this.options.lng=g[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(g=>{this[g]=function(){return t.store[g](...arguments)}}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(g=>{this[g]=function(){return t.store[g](...arguments),t}});const d=ks(),h=()=>{const g=(y,v)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),d.resolve(v),i(y,v)};if(this.languages&&this.options.compatibilityAPI!=="v1"&&!this.isInitialized)return g(null,this.t.bind(this));this.changeLanguage(this.options.lng,g)};return this.options.resources||!this.options.initImmediate?h():setTimeout(h,0),d}loadResources(t){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ma;const l=typeof t=="string"?t:this.language;if(typeof t=="function"&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(l&&l.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return i();const s=[],a=f=>{if(!f||f==="cimode")return;this.services.languageUtils.toResolveHierarchy(f).forEach(h=>{h!=="cimode"&&s.indexOf(h)<0&&s.push(h)})};l?a(l):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(d=>a(d)),this.options.preload&&this.options.preload.forEach(f=>a(f)),this.services.backendConnector.load(s,this.options.ns,f=>{!f&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),i(f)})}else i(null)}reloadResources(t,n,i){const l=ks();return t||(t=this.languages),n||(n=this.options.ns),i||(i=Ma),this.services.backendConnector.reload(t,n,s=>{l.resolve(),i(s)}),l}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&qS.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1))for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(i)){this.resolvedLanguage=i;break}}}changeLanguage(t,n){var i=this;this.isLanguageChangingTo=t;const l=ks();this.emit("languageChanging",t);const s=d=>{this.language=d,this.languages=this.services.languageUtils.toResolveHierarchy(d),this.resolvedLanguage=void 0,this.setResolvedLanguage(d)},a=(d,h)=>{h?(s(h),this.translator.changeLanguage(h),this.isLanguageChangingTo=void 0,this.emit("languageChanged",h),this.logger.log("languageChanged",h)):this.isLanguageChangingTo=void 0,l.resolve(function(){return i.t(...arguments)}),n&&n(d,function(){return i.t(...arguments)})},f=d=>{!t&&!d&&this.services.languageDetector&&(d=[]);const h=typeof d=="string"?d:this.services.languageUtils.getBestMatchFromCodes(d);h&&(this.language||s(h),this.translator.language||this.translator.changeLanguage(h),this.services.languageDetector&&this.services.languageDetector.cacheUserLanguage&&this.services.languageDetector.cacheUserLanguage(h)),this.loadResources(h,g=>{a(g,h)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?f(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(f):this.services.languageDetector.detect(f):f(t),l}getFixedT(t,n,i){var l=this;const s=function(a,f){let d;if(typeof f!="object"){for(var h=arguments.length,g=new Array(h>2?h-2:0),y=2;y`${d.keyPrefix}${v}${C}`):S=d.keyPrefix?`${d.keyPrefix}${v}${a}`:a,l.t(S,d)};return typeof t=="string"?s.lng=t:s.lngs=t,s.ns=n,s.keyPrefix=i,s}t(){return this.translator&&this.translator.translate(...arguments)}exists(){return this.translator&&this.translator.exists(...arguments)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const i=n.lng||this.resolvedLanguage||this.languages[0],l=this.options?this.options.fallbackLng:!1,s=this.languages[this.languages.length-1];if(i.toLowerCase()==="cimode")return!0;const a=(f,d)=>{const h=this.services.backendConnector.state[`${f}|${d}`];return h===-1||h===2};if(n.precheck){const f=n.precheck(this,a);if(f!==void 0)return f}return!!(this.hasResourceBundle(i,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(i,t)&&(!l||a(s,t)))}loadNamespaces(t,n){const i=ks();return this.options.ns?(typeof t=="string"&&(t=[t]),t.forEach(l=>{this.options.ns.indexOf(l)<0&&this.options.ns.push(l)}),this.loadResources(l=>{i.resolve(),n&&n(l)}),i):(n&&n(),Promise.resolve())}loadLanguages(t,n){const i=ks();typeof t=="string"&&(t=[t]);const l=this.options.preload||[],s=t.filter(a=>l.indexOf(a)<0&&this.services.languageUtils.isSupportedCode(a));return s.length?(this.options.preload=l.concat(s),this.loadResources(a=>{i.resolve(),n&&n(a)}),i):(n&&n(),Promise.resolve())}dir(t){if(t||(t=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!t)return"rtl";const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],i=this.services&&this.services.languageUtils||new ev(rv());return n.indexOf(i.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;return new qs(t,n)}cloneInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ma;const i=t.forkResourceStore;i&&delete t.forkResourceStore;const l={...this.options,...t,isClone:!0},s=new qs(l);return(t.debug!==void 0||t.prefix!==void 0)&&(s.logger=s.logger.clone(t)),["store","services","language"].forEach(f=>{s[f]=this[f]}),s.services={...this.services},s.services.utils={hasLoadedNamespace:s.hasLoadedNamespace.bind(s)},i&&(s.store=new Z1(this.store.data,l),s.services.resourceStore=s.store),s.translator=new Tc(s.services,l),s.translator.on("*",function(f){for(var d=arguments.length,h=new Array(d>1?d-1:0),g=1;g{if(t)for(const n in t)e[n]===void 0&&(e[n]=t[n])}),e}const ov=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,y3=(e,t,n)=>{const i=n||{};i.path=i.path||"/";const l=encodeURIComponent(t);let s=`${e}=${l}`;if(i.maxAge>0){const a=i.maxAge-0;if(Number.isNaN(a))throw new Error("maxAge should be a Number");s+=`; Max-Age=${Math.floor(a)}`}if(i.domain){if(!ov.test(i.domain))throw new TypeError("option domain is invalid");s+=`; Domain=${i.domain}`}if(i.path){if(!ov.test(i.path))throw new TypeError("option path is invalid");s+=`; Path=${i.path}`}if(i.expires){if(typeof i.expires.toUTCString!="function")throw new TypeError("option expires is invalid");s+=`; Expires=${i.expires.toUTCString()}`}if(i.httpOnly&&(s+="; HttpOnly"),i.secure&&(s+="; Secure"),i.sameSite)switch(typeof i.sameSite=="string"?i.sameSite.toLowerCase():i.sameSite){case!0:s+="; SameSite=Strict";break;case"lax":s+="; SameSite=Lax";break;case"strict":s+="; SameSite=Strict";break;case"none":s+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return s},lv={create(e,t,n,i){let l=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(l.expires=new Date,l.expires.setTime(l.expires.getTime()+n*60*1e3)),i&&(l.domain=i),document.cookie=y3(e,encodeURIComponent(t),l)},read(e){const t=`${e}=`,n=document.cookie.split(";");for(let i=0;i-1&&(l=window.location.hash.substring(window.location.hash.indexOf("?")));const a=l.substring(1).split("&");for(let f=0;f0&&a[f].substring(0,d)===t&&(n=a[f].substring(d+1))}}return n}};let xs=null;const sv=()=>{if(xs!==null)return xs;try{xs=window!=="undefined"&&window.localStorage!==null;const e="i18next.translate.boo";window.localStorage.setItem(e,"foo"),window.localStorage.removeItem(e)}catch{xs=!1}return xs};var S3={name:"localStorage",lookup(e){let{lookupLocalStorage:t}=e;if(t&&sv())return window.localStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupLocalStorage:n}=t;n&&sv()&&window.localStorage.setItem(n,e)}};let Es=null;const uv=()=>{if(Es!==null)return Es;try{Es=window!=="undefined"&&window.sessionStorage!==null;const e="i18next.translate.boo";window.sessionStorage.setItem(e,"foo"),window.sessionStorage.removeItem(e)}catch{Es=!1}return Es};var k3={name:"sessionStorage",lookup(e){let{lookupSessionStorage:t}=e;if(t&&uv())return window.sessionStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupSessionStorage:n}=t;n&&uv()&&window.sessionStorage.setItem(n,e)}},x3={name:"navigator",lookup(e){const t=[];if(typeof navigator<"u"){const{languages:n,userLanguage:i,language:l}=navigator;if(n)for(let s=0;s0?t:void 0}},E3={name:"htmlTag",lookup(e){let{htmlTag:t}=e,n;const i=t||(typeof document<"u"?document.documentElement:null);return i&&typeof i.getAttribute=="function"&&(n=i.getAttribute("lang")),n}},C3={name:"path",lookup(e){var l;let{lookupFromPathIndex:t}=e;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?(l=n[typeof t=="number"?t:0])==null?void 0:l.replace("/",""):void 0}},P3={name:"subdomain",lookup(e){var l,s;let{lookupFromSubdomainIndex:t}=e;const n=typeof t=="number"?t+1:1,i=typeof window<"u"&&((s=(l=window.location)==null?void 0:l.hostname)==null?void 0:s.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i));if(i)return i[n]}};function I3(){return{order:["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"],lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:e=>e}}class ek{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(t,n)}init(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=t||{languageUtils:{}},this.options=g3(n,this.options||{},I3()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=l=>l.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=i,this.addDetector(v3),this.addDetector(w3),this.addDetector(S3),this.addDetector(k3),this.addDetector(x3),this.addDetector(E3),this.addDetector(C3),this.addDetector(P3)}addDetector(t){return this.detectors[t.name]=t,this}detect(t){t||(t=this.options.order);let n=[];return t.forEach(i=>{if(this.detectors[i]){let l=this.detectors[i].lookup(this.options);l&&typeof l=="string"&&(l=[l]),l&&(n=n.concat(l))}}),n=n.map(i=>this.options.convertDetectedLanguage(i)),this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(t,n){n||(n=this.options.caches),n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(t)>-1||n.forEach(i=>{this.detectors[i]&&this.detectors[i].cacheUserLanguage(t,this.options)}))}}ek.type="languageDetector";function T3(){if(console&&console.warn){for(var e=arguments.length,t=new Array(e),n=0;n()=>{if(e.isInitialized)t();else{const n=()=>{setTimeout(()=>{e.off("initialized",n)},0),t()};e.on("initialized",n)}};function cv(e,t,n){e.loadNamespaces(t,tk(e,n))}function fv(e,t,n,i){typeof n=="string"&&(n=[n]),n.forEach(l=>{e.options.ns.indexOf(l)<0&&e.options.ns.push(l)}),e.loadLanguages(t,tk(e,i))}function L3(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const i=t.languages[0],l=t.options?t.options.fallbackLng:!1,s=t.languages[t.languages.length-1];if(i.toLowerCase()==="cimode")return!0;const a=(f,d)=>{const h=t.services.backendConnector.state[`${f}|${d}`];return h===-1||h===2};return n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!a(t.isLanguageChangingTo,e)?!1:!!(t.hasResourceBundle(i,e)||!t.services.backendConnector.backend||t.options.resources&&!t.options.partialBundledLanguages||a(i,e)&&(!l||a(s,e)))}function A3(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return!t.languages||!t.languages.length?(Ih("i18n.languages were undefined or empty",t.languages),!0):t.options.ignoreJSONStructure!==void 0?t.hasLoadedNamespace(e,{lng:n.lng,precheck:(l,s)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&l.services.backendConnector.backend&&l.isLanguageChangingTo&&!s(l.isLanguageChangingTo,e))return!1}}):L3(e,t,n)}const N3=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,_3={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},R3=e=>_3[e],O3=e=>e.replace(N3,R3);let Th={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:O3};function z3(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Th={...Th,...e}}function D3(){return Th}let nk;function M3(e){nk=e}function $3(){return nk}const F3={type:"3rdParty",init(e){z3(e.options.react),M3(e)}},j3=ee.createContext();class U3{constructor(){this.usedNamespaces={}}addUsedNamespaces(t){t.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}const B3=(e,t)=>{const n=ee.useRef();return ee.useEffect(()=>{n.current=t?n.current:e},[e,t]),n.current};function rk(e,t,n,i){return e.getFixedT(t,n,i)}function V3(e,t,n,i){return ee.useCallback(rk(e,t,n,i),[e,t,n,i])}function hr(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const{i18n:n}=t,{i18n:i,defaultNS:l}=ee.useContext(j3)||{},s=n||i||$3();if(s&&!s.reportNamespaces&&(s.reportNamespaces=new U3),!s){Ih("You will need to pass in an i18next instance by using initReactI18next");const N=(_,B)=>typeof B=="string"?B:B&&typeof B=="object"&&typeof B.defaultValue=="string"?B.defaultValue:Array.isArray(_)?_[_.length-1]:_,M=[N,{},!1];return M.t=N,M.i18n={},M.ready=!1,M}s.options.react&&s.options.react.wait!==void 0&&Ih("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const a={...D3(),...s.options.react,...t},{useSuspense:f,keyPrefix:d}=a;let h=e||l||s.options&&s.options.defaultNS;h=typeof h=="string"?[h]:h||["translation"],s.reportNamespaces.addUsedNamespaces&&s.reportNamespaces.addUsedNamespaces(h);const g=(s.isInitialized||s.initializedStoreOnce)&&h.every(N=>A3(N,s,a)),y=V3(s,t.lng||null,a.nsMode==="fallback"?h:h[0],d),v=()=>y,S=()=>rk(s,t.lng||null,a.nsMode==="fallback"?h:h[0],d),[C,I]=ee.useState(v);let A=h.join();t.lng&&(A=`${t.lng}${A}`);const x=B3(A),E=ee.useRef(!0);ee.useEffect(()=>{const{bindI18n:N,bindI18nStore:M}=a;E.current=!0,!g&&!f&&(t.lng?fv(s,t.lng,h,()=>{E.current&&I(S)}):cv(s,h,()=>{E.current&&I(S)})),g&&x&&x!==A&&E.current&&I(S);function _(){E.current&&I(S)}return N&&s&&s.on(N,_),M&&s&&s.store.on(M,_),()=>{E.current=!1,N&&s&&N.split(" ").forEach(B=>s.off(B,_)),M&&s&&M.split(" ").forEach(B=>s.store.off(B,_))}},[s,A]),ee.useEffect(()=>{E.current&&g&&I(v)},[s,d,g]);const T=[C,s,g];if(T.t=C,T.i18n=s,T.ready=g,g||!g&&!f)return T;throw new Promise(N=>{t.lng?fv(s,t.lng,h,()=>N()):cv(s,h,()=>N())})}const H3={title:{developer:"Developer",name:"Dohyun Ko | 고도현"},introduction:"As a third-year frontend developer, I strive to write maintainable code. Working at a startup, I gained diverse experience in frontend, backend, infrastructure, and AI, and I have also interned at an AI research lab. My goal is to 'take the road not taken,' always embracing various challenges.",current:{organizations:[{name:"GIST Student Association Infoteam",isImportant:!0,color:"#EB6263",url:"https://introduce.gistory.me/",job:"Information Member and Leader for 2024-second half",startedAt:"2022-09",projects:[{name:"AMS Frontend",isImportant:!1,startedAt:"2022-11",endedAt:"2023-02",description:"Developed the frontend of AMS, the GIST club application system.",whatIDid:["Frontend development","UI design"],techStacks:["React","TypeScript","mono-repo"]},{name:"Ziggle Frontend",isImportant:!0,url:"https://github.com/gsainfoteam/ziggle-fe",startedAt:"2023-04",description:"Developing the frontend of Ziggle, GIST's integrated notification platform.",whatIDid:["Lead and Frontend development"],techStacks:["React","TypeScript","Next.js","Tailwind CSS"]},{name:"IdP Frontend",isImportant:!0,url:"https://idp.gistory.me",startedAt:"2024-03",description:"Maintaining the frontend of IdP, the OAuth2.0 authentication system used at GIST.",whatIDid:["Frontend maintenance"],techStacks:["React","TypeScript","Tailwind CSS"]}]},{name:"Wing: GIST CS Club",isImportant:!1,color:"rgb(151, 123, 242)",url:"https://wing-homepage.vercel.app/",job:"Senior Member",startedAt:"2023-03",projects:[{name:"Wing Session",isImportant:!0,startedAt:"2023-03",description:"Conducting development exchanges and sessions at Wing.",whatIDid:["Conducted session on introducing mono-repo","Conducted session on React.cpp(refer to the side project: Dutch: OOP Final)","Conducted session on writing code like a UI library: Compound Components"]}]}]},education:{attendedLectures:["Object-Oriented Programming","Data Structures","Introduction to Algorithms","Computer Systems Theory and Laboratory","Automata Theory","Operating Systems","Computer Graphics","Computer Networking","Machine Learning and Deep Learning","Computer Security","Computational Models of Cognition"],attendedLecture:"Attended Courses",major:"Electrical Engineering and Computer Science"},experience:{experiences:[{name:"GIST Data Science Lab",isImportant:!0,color:"#b509ac",url:"https://sundong.kim/members/",job:"Intern",startedAt:"2024-01-02",endedAt:"2024-05-31",projects:[{name:"O2ARC 3.0",isImportant:!0,url:"https://o2arc.com/",startedAt:"2024-01",endedAt:"2024-05",description:"Developed and maintained version 3.0 of O2ARC, a tool for collecting human solutions data for ARC problems. Authored a demo paper on the development and data analysis, which was submitted to IJCAI 2024.",whatIDid:["Overall frontend and the grid manipulation logic development","Backend API development","UX design to enhance the quality of collected user data"],techStacks:["React","TypeScript","Tailwind CSS","i18next","NestJS","Prisma"]},{name:"Introductory RL Study",isImportant:!1,url:"https://www.coursera.org/specializations/reinforcement-learning",startedAt:"2024-01",endedAt:"2024-02",description:"Studied the basics of reinforcement learning through Coursera's Reinforcement Learning Specialization.",whatIDid:["Studied basics of reinforcement learning (up to Q-Learning)"]}]},{name:"Sigor Inc.",isImportant:!0,color:"#FEAA17",url:"https://introduce.sigor.company/",job:"Web Developer",startedAt:"2022-02-23",endedAt:"2023-12-22",projects:[{name:"Doggly Frontend",url:"https://doggly.co.kr/",startedAt:"2022-08",endedAt:"2023-03",description:"Developed the frontend for Doggly, a pet clothing shopping mall which provides AI-based size measurement.",whatIDid:["Overall frontend development and maintenance","Developed Doggly android & iOS webview app and integrated payment module","A/B testing for funnel improvement"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI","i18next"]},{name:"Rushhour Frontend",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-05",endedAt:"2023-07",description:"Developed the frontend and webview app for Rushhour, a service that informs about available seats in the subway.",whatIDid:["Developed Rushhour webview frontend","Developed Rushhour android & iOS webview app"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI"]},{name:"Rushhour App",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-07",endedAt:"2023-10",description:"Participated in the development of the Flutter version of Rushhour.",whatIDid:["Developed Rushhour Flutter app","Logged app user data"],techStacks:["Flutter","Firebase"]},{name:"Rushhour AI",isImportant:!0,startedAt:"2023-09",endedAt:"2023-12",description:"Participated in developing AI(ML) for Rushhour.",whatIDid:["Developed AI to predict subway congestion","Developed AI to predict available subway seats"],techStacks:["Scikit-learn","Pandas"]},{name:"Others",isImportant:!0,startedAt:"2022-02",endedAt:"2023-12",description:"Performed various development tasks as a developer in a startup.",whatIDid:["Developed landing pages and admin pages","Analyzed and collected user logs","Automated tasks","Integrated into mono-repo for productivity improvement"],techStacks:["React","TypeScript","Amplitude","AWS Lightsail","AWS Lambda","FastAPI","Pandas","mono-repo"]}]},{name:"GDSC-GIST",isImportant:!1,color:"#008cff",url:"https://gdsc.community.dev/gwangju-institute-of-science-and-technology/",job:"2nd-year Team Core, Tech Team",startedAt:"2022-05",endedAt:"2023-07",projects:[{name:"Study",isImportant:!1,startedAt:"2022-11",endedAt:"2023-05",description:"Internal development study conducted by GDSC.",whatIDid:["Led React study","Participated in JS Pattern study"]},{name:"GIST Mini Solution Challenge",isImportant:!1,url:"https://gdsc.community.dev/events/details/developer-student-clubs-gwangju-institute-of-science-and-technology-presents-gist-mini-solution-challenge/",startedAt:"2023-04",endedAt:"2023-04",description:"Hackathon hosted by GDSC-GIST at GIST. A total of 60 people participated.",whatIDid:["Prepared and managed hackathon"]}]},{name:"GPERI",isImportant:!1,color:"#4c568f",url:"https://sites.google.com/view/gperigist",job:"Research Member",startedAt:"2023-07",endedAt:"2024-03",projects:[{name:"C Language Education",isImportant:!1,startedAt:"2023-07",endedAt:"2023-08",description:"Conducted C language education for members.",whatIDid:["Conducted C language education"],techStacks:["C"]},{name:"Rocket Communication Development",isImportant:!1,startedAt:"2023-07",endedAt:"2023-11",description:"Attempted rocket communication development but was not successful.",whatIDid:["Developed Flight Software","Developed communication system"],techStacks:["C","Zigbee"]}]}]},sideProject:{sideProjects:[{name:"2024 KPMG Ideathon: 🥉 3rd place",isImportant:!0,url:"https://github.com/gist-optima",startedAt:"2024-01",endedAt:"2024-02",description:"Participated in the [Samjong KPMG Ideathon](https://kpmgkr.notion.site/kpmgkr/2024-KPMG-1fcd8a808f3d4f36a5ae8ad6e9bc413e) and developed Docuflow, a platform implementing VCS for document work and streamlined-ai-search using LLM.",whatIDid:["Frontend development"],techStacks:["React","TypeScript","Tailwind CSS"]},{name:"Kaggle - Regression with a Mohs Hardness Dataset: 4th place",isImportant:!0,url:"https://www.kaggle.com/competitions/playground-series-s3e25",startedAt:"2023-10",endedAt:"2023-12",description:"Achieved 4th place in Kaggle's Mohs hardness prediction competition. Used a unique post-processing technique considering the score formula being MedAE.",whatIDid:["Developed ML model"],techStacks:["Python","Scikit-learn","Pandas"]},{name:"2023 Creative Space G A.I. & IoT Makerthon: 🥈 2nd place",isImportant:!1,startedAt:"2023-10",endedAt:"2023-11",description:"Developed an AI assistant combining GPT-4 API and Raspberry Pi, capable of understanding everyday conversations and controlling IoT devices like switches and speakers.",whatIDid:["Integrated OpenAI API","Prepared planning and presentation materials"],techStacks:["Python"]},{name:"2023 Net Challenge: 🥈 Silver Award",isImportant:!0,url:"https://github.com/Net-Challenge-InfoTeam",startedAt:"2023-06",endedAt:"2023-12",description:"Participated in the 2023 Net Challenge. Developed a service that analyzes CCTV data with AI to detect threats in real-time and notifies nearby users when a threat is detected.",whatIDid:["Developed app using React and PWA","Displayed real-time threat locations using Mapbox"],techStacks:["React","TypeScript","Mapbox","PWA"]},{name:"React-Atoms: React Component Library",isImportant:!1,url:"https://github.com/dohyun-ko/react-atoms",startedAt:"2023-07",endedAt:"2023-07",description:"A personal library of frequently used React components published on npm.",whatIDid:["Developed React components","Documented components using Storybook","Published on npm"],techStacks:["React","TypeScript","RollUp","Storybook","npm"]},{name:"Dutch: OOP Final Project",isImportant:!1,url:"https://github.com/dohyun-ko/dutch-wasm",startedAt:"2023-04",endedAt:"2023-06",description:"A Dutch pay platform developed entirely in C++ for both frontend and backend. Submitted as the final project for GIST's Object-Oriented Programming course.",whatIDid:["Developed frontend UI using C++ and WebAssembly","Developed frontend logic such as State and Navigator"],techStacks:["C++","WebAssembly","Emscripten"]},{name:"Speaking Melona: Convenience Store Foods Talking to Each Other",isImportant:!1,url:"https://melona.chat",startedAt:"2024-05",endedAt:"2024-05",description:"A service that assigns personas to convenience store foods and generates conversations between them when a barcode is scanned.",whatIDid:["Frontend development","Backend development","Prompting"],techStacks:["React","TypeScript","FastAPI","PostgreSQL"]}]},skill:{skills:[{name:"React",level:5},{name:"TypeScript",level:4},{name:"JavaScript",level:4},{name:"HTML/CSS",level:4},{name:"Python",level:3},{name:"NestJS",level:2},{name:"FastAPI",level:2},{name:"Flutter",level:2},{name:"C++",level:2},{name:"Kotlin",level:1},{name:"Docker",level:1},{name:"Rust",level:1},{name:"Assembly",level:1}]}},b3=Object.freeze(Object.defineProperty({__proto__:null,main:H3},Symbol.toStringTag,{value:"Module"})),W3={title:{developer:"개발자",name:"고도현 | Dohyun Ko"},introduction:"3년차 프론트엔드 개발자로, 유지보수하기 쉬운 코드를 짜기 위해 노력합니다. 스타트업에서 일하며 프론트엔드, 백엔드, 인프라, AI 등 다양한 경험을 쌓았고, AI 연구실에서 인턴으로 일했습니다. 가지 않은 길'을 가는 것을 목표로 언제나 새로운 시도를 합니다.",current:{organizations:[{name:"GIST 학생회 정보국",isImportant:!0,color:"#EB6263",url:"https://introduce.gistory.me/",job:"팀장",startedAt:"2022-09",projects:[{name:"AMS 프론트엔드",isImportant:!1,startedAt:"2022-11",endedAt:"2023-02",description:"GIST 동아리 신청 시스템인 AMS의 프론트엔드를 개발했습니다.",whatIDid:["프론트엔드 개발","UI 디자인"],techStacks:["React","TypeScript","mono-repo"]},{name:"Ziggle 프론트엔드",isImportant:!0,url:"https://github.com/gsainfoteam/ziggle-fe",startedAt:"2023-04",description:"GIST 통합 공지 플랫폼인 Ziggle의 프론트엔드를 개발하고 있습니다.",whatIDid:["팀장 및 프론트엔드 개발"],techStacks:["React","TypeScript","Next.js","Tailwind CSS"]},{name:"IdP 프론트엔드",isImportant:!0,url:"https://idp.gistory.me",startedAt:"2024-03",description:"GIST에서 사용하는 OAuth2.0 인증 시스템 IdP의 프론트엔드를 유지보수하고 있습니다.",whatIDid:["프론트엔드 유지보수"],techStacks:["React","TypeScript","Tailwind CSS"]}]},{name:"Wing: GIST 전산 동아리",isImportant:!1,color:"rgb(151, 123, 242)",url:"https://wing-homepage.vercel.app/",job:"시니어 부원",startedAt:"2023-03",projects:[{name:"Wing Session",isImportant:!0,startedAt:"2023-03",description:"Wing에서 개발 상황 교류 및 세션을 진행합니다.",whatIDid:["모노레포에 도입기 세션 진행","React.cpp 세션 진행","UI 라이브러리처럼 코드 짜기: Compound Components 세션 진행"]}]}]},education:{attendedLectures:["객체 지향 프로그래밍","자료 구조","알고리즘 개론","컴퓨터 시스템 이론 및 실습","오토마타 이론","운영체제","컴퓨터 그래픽스","컴퓨터 네트워킹","기계학습 및 딥러닝","Computer Security","Computational Models of Cognition"],attendedLecture:"수강 강좌",major:"전기전자컴퓨터공학부"},experience:{experiences:[{name:"GIST Data Science Lab",isImportant:!0,color:"#b509ac",url:"https://sundong.kim/members/",job:"인턴",startedAt:"2024-01-02",endedAt:"2024-05-31",projects:[{name:"O2ARC 3.0",isImportant:!0,url:"https://o2arc.com/",startedAt:"2024-01",endedAt:"2024-05",description:"[ARC](https://github.com/fchollet/ARC) 문제의 사람 풀이 데이터 수집을 위한 툴 O2ARC의 3.0 버전을 개발했고 유지보수 했습니다. 개발과 데이터 분석 내용으로 demo 논문을 작성했고 IJCAI 2024에 투고했습니다.",whatIDid:["전체적인 프론트엔드 UI 및 그리드 조작 로직 개발","이벤트 관련 백엔드 API 개발","수집 데이터 품질 개선을 위한 UX 디자인 및 유저 데이터 수집"],techStacks:["React","TypeScript","Tailwind CSS","i18next","NestJS","Prisma"]},{name:"Introductory RL Study",isImportant:!1,url:"https://www.coursera.org/specializations/reinforcement-learning",startedAt:"2024-01",endedAt:"2024-02",description:"Coursera의 강화학습 스페셜리제이션을 통해 강화학습 기초를 공부했습니다.",whatIDid:["강화학습 기초 공부(~Q-Learning)"]}]},{name:"Sigor Inc.",isImportant:!0,color:"#FEAA17",url:"https://introduce.sigor.company/",job:"웹 개발자",startedAt:"2022-02-23",endedAt:"2023-12-22",projects:[{name:"도글리 프론트엔드",isImportant:!0,url:"https://doggly.co.kr/",startedAt:"2022-08",endedAt:"2023-03",description:"AI 기반으로 강아지 사이즈를 측정하는 강아지 의류 쇼핑몰인 도글리의 프론트엔드를 개발했습니다.",whatIDid:["쇼핑몰의 전체적인 프론트엔드 개발 및 유지보수","Android & iOS 웹뷰 앱 개발 및 결제 모듈 연동","퍼널 개선을 위한 A/B 테스팅"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI","i18next"]},{name:"러시아워 프론트엔드",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-05",endedAt:"2023-07",description:"지하철 빈 자리를 알려주는 서비스인 러시아워의 프론트엔드와 웹뷰 앱을 개발했습니다.",whatIDid:["러시아워 웹뷰용 프론트엔드 개발","러시아워 android & ios 웹뷰 앱 개발"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI"]},{name:"러시아워 앱",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-07",endedAt:"2023-10",description:"러시아워의 플러터 버전 개발에 참여했습니다.",whatIDid:["러시아워 플러터 앱 개발","앱 유저 로그 기록"],techStacks:["Flutter","Firebase"]},{name:"러시아워 AI",isImportant:!0,startedAt:"2023-09",endedAt:"2023-12",description:"러시아워 AI 개발에 참여했습니다.",whatIDid:["지하철 혼잡도 예측 AI 개발","지하철 빈자리 예측 AI 개발"],techStacks:["Scikit-learn","Pandas"]},{name:"기타",isImportant:!0,startedAt:"2022-02",endedAt:"2023-12",description:"스타트업의 개발자로서 다양한 개발 업무를 수행했습니다.",whatIDid:["랜딩 페이지 및 관리자 페이지 개발","유저 로그 분석 및 통계","업무 자동화","생산성 향상을 위한 모노레포 통합"],techStacks:["React","TypeScript","Amplitude","AWS Lightsail","AWS Lambda","FastAPI","Pandas","mono-repo"]}]},{name:"GDSC-GIST",isImportant:!1,color:"#008cff",url:"https://gdsc.community.dev/gwangju-institute-of-science-and-technology/",job:"2nd Core, Tech Team",startedAt:"2022-05",endedAt:"2023-07",projects:[{name:"스터디",isImportant:!1,startedAt:"2022-11",endedAt:"2023-05",description:"GDSC에서 진행한 내부 개발 스터디입니다.",whatIDid:["React 스터디 리드","JS Pattern 스터디 참여"]},{name:"GIST Mini Solution Challenge",isImportant:!1,url:"https://gdsc.community.dev/events/details/developer-student-clubs-gwangju-institute-of-science-and-technology-presents-gist-mini-solution-challenge/",startedAt:"2023-04",endedAt:"2023-04",description:"GDSC-GIST가 직접 주최한 GIST 내 해커톤입니다. 총 60명이 참가하였습니다.",whatIDid:["해커톤 준비 & 정산"]}]},{name:"GPERI",isImportant:!1,color:"#4c568f",url:"https://sites.google.com/view/gperigist",job:"연구부원",startedAt:"2023-07",endedAt:"2024-3",projects:[{name:"C언어 교육 진행",isImportant:!1,startedAt:"2023-07",endedAt:"2023-08",description:"부원들에게 C언어 교육을 진행했습니다.",whatIDid:["C언어 교육 진행"],techStacks:["C"]},{name:"발사체 통신 개발",isImportant:!1,startedAt:"2023-07",endedAt:"2023-11",description:"발사체 통신 개발을 시도했지만 성공하지는 못했습니다.",whatIDid:["Flight Software 개발","통신 시스템 개발"],techStacks:["C","Zigbee"]}]}]},sideProject:{sideProjects:[{name:"2024 KPMG Ideathon: 🥉 3등",isImportant:!0,url:"https://github.com/gist-optima",startedAt:"2024-1",endedAt:"2024-2",description:"[삼정 KPMG 아이디어톤](https://kpmgkr.notion.site/kpmgkr/2024-KPMG-1fcd8a808f3d4f36a5ae8ad6e9bc413e)에 참여해 문서 작업에 VCS를 도입하고 LLM을 이용한 streamlined-ai-search를 구현한 플랫폼 Docuflow를 개발했습니다.",whatIDid:["프론트엔드 개발"],techStacks:["React","TypeScript","Tailwind CSS"]},{name:"Kaggle - Regression with a Mohs Hardness Dataset: 4등",isImportant:!0,url:"https://www.kaggle.com/competitions/playground-series-s3e25",startedAt:"2023-10",endedAt:"2023-12",description:"Kaggle의 광물 모스 경도 예측 대회에서 4등을 차지했습니다. 점수 공식이 MedAE인 점을 이용해 독특한 후처리 기법을 사용했습니다.",whatIDid:["ML 모델 개발"],techStacks:["Python","Scikit-learn","Pandas"]},{name:"2023 Creative Space G A.I. & IoT Makerthon: 🥈 2등",isImportant:!1,startedAt:"2023-10",endedAt:"2023-11",description:"메이커톤에서 GPT-4 API와 라즈베리파이를 결합해 일상 대화에서 의미를 추론하고 스위치, 스피커 등 IoT 기기를 조작하는 AI 비서를 개발했습니다.",whatIDid:["OpenAI API 연동","기획 및 발표자료 준비"],techStacks:["Python"]},{name:"2023 Net Challenge: 🥈 은상",isImportant:!0,url:"https://github.com/Net-Challenge-InfoTeam",startedAt:"2023-06",endedAt:"2023-12",description:"2023 Net Chanllenge에 참여했습니다. CCTV 데이터를 AI로 분석해 실시간으로 위협을 감지하고, 위협이 감지되면 주변 유저들에게 알림을 보내는 서비스를 개발했습니다.",whatIDid:["React와 PWA를 사용한 앱 개발","Mapbox를 사용해 실시간 위협 위치 표시"],techStacks:["React","TypeScript","Mapbox","PWA"]},{name:"React-Atoms: React Component Library",isImportant:!1,url:"https://github.com/dohyun-ko/react-atoms",startedAt:"2023-07",endedAt:"2023-07",description:"개인적으로 자주 사용하는 React 컴포넌트를 모아 npm에 배포한 라이브러리입니다.",whatIDid:["React 컴포넌트 개발","Storybook을 사용한 컴포넌트 문서화","npm 배포"],techStacks:["React","TypeScript","RollUp","Storybook","npm"]},{name:"Dutch: OOP Final Project",isImportant:!1,url:"https://github.com/dohyun-ko/dutch-wasm",startedAt:"2023-04",endedAt:"2023-06",description:"프론트엔드와 백엔드 모두 C++로만 작성된 더치페이 플랫폼입니다. GIST 객체 지향 프로그래밍 수업 기말 과제로 제출했습니다.",whatIDid:["C++과 웹 어셈블리를 사용한 프론트엔드 UI 개발","State, Navigator 등 프론트엔드 로직 개발"],techStacks:["C++","WebAssembly","Emscripten"]},{name:"Speaking Melona: 편의점 음식이 서로 대화를 해요",isImportant:!1,url:"https://melona.chat",startedAt:"2024-05",endedAt:"2024-05",description:"편의점 음식별로 페르소나를 설정하고 바코드를 스캔하면 서로 간의 대화를 생성해주는 서비스입니다.",whatIDid:["프론트엔드 개발","백엔드 개발","프롬프팅"],techStacks:["React","TypeScript","FastAPI","PostgreSQL"]}]},skill:{skills:[{name:"React",level:5},{name:"TypeScript",level:4},{name:"JavaScript",level:4},{name:"HTML/CSS",level:4},{name:"Python",level:3},{name:"NestJS",level:2},{name:"FastAPI",level:2},{name:"Flutter",level:2},{name:"C++",level:2},{name:"Kotlin",level:1},{name:"Docker",level:1},{name:"Rust",level:1},{name:"Assembly",level:1}]}},Q3=Object.freeze(Object.defineProperty({__proto__:null,main:W3},Symbol.toStringTag,{value:"Module"})),K3={"ko-KR":{...Q3},"en-US":{...b3}};Jt.use(F3).use(ek).init({resources:K3,fallbackLng:{default:["en-US"],"ko-KR":["ko-KR"],ko:["ko-KR"]},interpolation:{escapeValue:!1},ns:["main"],defaultNS:"main"});var Lh={},ik={exports:{}},zn={},ok={exports:{}},lk={};/** + */var jP=ee,UP=Symbol.for("react.element"),BP=Symbol.for("react.fragment"),VP=Object.prototype.hasOwnProperty,HP=jP.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,bP={key:!0,ref:!0,__self:!0,__source:!0};function JS(e,t,n){var i,l={},s=null,a=null;n!==void 0&&(s=""+n),t.key!==void 0&&(s=""+t.key),t.ref!==void 0&&(a=t.ref);for(i in t)VP.call(t,i)&&!bP.hasOwnProperty(i)&&(l[i]=t[i]);if(e&&e.defaultProps)for(i in t=e.defaultProps,t)l[i]===void 0&&(l[i]=t[i]);return{$$typeof:UP,type:e,key:s,ref:a,props:l,_owner:HP.current}}af.Fragment=BP;af.jsx=JS;af.jsxs=JS;VS.exports=af;var Hm=VS.exports;const xo=Hm.Fragment,W=Hm.jsx,_e=Hm.jsxs;const WP={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){console&&console[e]&&console[e].apply(console,t)}};class Cc{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.init(t,n)}init(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||WP,this.options=n,this.debug=n.debug}log(){for(var t=arguments.length,n=new Array(t),i=0;i{this.observers[i]||(this.observers[i]=new Map);const l=this.observers[i].get(n)||0;this.observers[i].set(n,l+1)}),this}off(t,n){if(this.observers[t]){if(!n){delete this.observers[t];return}this.observers[t].delete(n)}}emit(t){for(var n=arguments.length,i=new Array(n>1?n-1:0),l=1;l{let[f,d]=a;for(let h=0;h{let[f,d]=a;for(let h=0;h{e=i,t=l});return n.resolve=e,n.reject=t,n}function X1(e){return e==null?"":""+e}function QP(e,t,n){e.forEach(i=>{t[i]&&(n[i]=t[i])})}const KP=/###/g;function js(e,t,n){function i(f){return f&&f.indexOf("###")>-1?f.replace(KP,"."):f}function l(){return!e||typeof e=="string"}const s=typeof t!="string"?t:t.split(".");let a=0;for(;a":">",'"':""","'":"'","/":"/"};function JP(e){return typeof e=="string"?e.replace(/[&<>"'\/]/g,t=>XP[t]):e}class ZP{constructor(t){this.capacity=t,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(t){const n=this.regExpMap.get(t);if(n!==void 0)return n;const i=new RegExp(t);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(t,i),this.regExpQueue.push(t),i}}const qP=[" ",",","?","!",";"],e3=new ZP(20);function t3(e,t,n){t=t||"",n=n||"";const i=qP.filter(a=>t.indexOf(a)<0&&n.indexOf(a)<0);if(i.length===0)return!0;const l=e3.getRegExp(`(${i.map(a=>a==="?"?"\\?":a).join("|")})`);let s=!l.test(e);if(!s){const a=e.indexOf(n);a>0&&!l.test(e.substring(0,a))&&(s=!0)}return s}function Ph(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(!e)return;if(e[t])return e[t];const i=t.split(n);let l=e;for(let s=0;s-1&&d0?e.replace("_","-"):e}class Z1 extends cf{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};super(),this.data=t||{},this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}getResource(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};const s=l.keySeparator!==void 0?l.keySeparator:this.options.keySeparator,a=l.ignoreJSONStructure!==void 0?l.ignoreJSONStructure:this.options.ignoreJSONStructure;let f;t.indexOf(".")>-1?f=t.split("."):(f=[t,n],i&&(Array.isArray(i)?f.push(...i):typeof i=="string"&&s?f.push(...i.split(s)):f.push(i)));const d=Pc(this.data,f);return!d&&!n&&!i&&t.indexOf(".")>-1&&(t=f[0],n=f[1],i=f.slice(2).join(".")),d||!a||typeof i!="string"?d:Ph(this.data&&this.data[t]&&this.data[t][n],i,s)}addResource(t,n,i,l){let s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1};const a=s.keySeparator!==void 0?s.keySeparator:this.options.keySeparator;let f=[t,n];i&&(f=f.concat(a?i.split(a):i)),t.indexOf(".")>-1&&(f=t.split("."),l=n,n=f[1]),this.addNamespaces(n),J1(this.data,f,l),s.silent||this.emit("added",t,n,i,l)}addResources(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(const s in i)(typeof i[s]=="string"||Array.isArray(i[s]))&&this.addResource(t,n,s,i[s],{silent:!0});l.silent||this.emit("added",t,n,i)}addResourceBundle(t,n,i,l,s){let a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1,skipCopy:!1},f=[t,n];t.indexOf(".")>-1&&(f=t.split("."),l=i,i=n,n=f[1]),this.addNamespaces(n);let d=Pc(this.data,f)||{};a.skipCopy||(i=JSON.parse(JSON.stringify(i))),l?ZS(d,i,s):d={...d,...i},J1(this.data,f,d),a.silent||this.emit("added",t,n,i)}removeResourceBundle(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}hasResourceBundle(t,n){return this.getResource(t,n)!==void 0}getResourceBundle(t,n){return n||(n=this.options.defaultNS),this.options.compatibilityAPI==="v1"?{...this.getResource(t,n)}:this.getResource(t,n)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const n=this.getDataByLanguage(t);return!!(n&&Object.keys(n)||[]).find(l=>n[l]&&Object.keys(n[l]).length>0)}toJSON(){return this.data}}var qS={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,i,l){return e.forEach(s=>{this.processors[s]&&(t=this.processors[s].process(t,n,i,l))}),t}};const q1={};class Tc extends cf{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(),QP(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=Ir.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(t==null)return!1;const i=this.resolve(t,n);return i&&i.res!==void 0}extractFromKey(t,n){let i=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;i===void 0&&(i=":");const l=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let s=n.ns||this.options.defaultNS||[];const a=i&&t.indexOf(i)>-1,f=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!t3(t,i,l);if(a&&!f){const d=t.match(this.interpolator.nestingRegexp);if(d&&d.length>0)return{key:t,namespaces:s};const h=t.split(i);(i!==l||i===l&&this.options.ns.indexOf(h[0])>-1)&&(s=h.shift()),t=h.join(l)}return typeof s=="string"&&(s=[s]),{key:t,namespaces:s}}translate(t,n,i){if(typeof n!="object"&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),typeof n=="object"&&(n={...n}),n||(n={}),t==null)return"";Array.isArray(t)||(t=[String(t)]);const l=n.returnDetails!==void 0?n.returnDetails:this.options.returnDetails,s=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,{key:a,namespaces:f}=this.extractFromKey(t[t.length-1],n),d=f[f.length-1],h=n.lng||this.language,g=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(h&&h.toLowerCase()==="cimode"){if(g){const N=n.nsSeparator||this.options.nsSeparator;return l?{res:`${d}${N}${a}`,usedKey:a,exactUsedKey:a,usedLng:h,usedNS:d,usedParams:this.getUsedParamsDetails(n)}:`${d}${N}${a}`}return l?{res:a,usedKey:a,exactUsedKey:a,usedLng:h,usedNS:d,usedParams:this.getUsedParamsDetails(n)}:a}const y=this.resolve(t,n);let v=y&&y.res;const S=y&&y.usedKey||a,C=y&&y.exactUsedKey||a,I=Object.prototype.toString.apply(v),A=["[object Number]","[object Function]","[object RegExp]"],x=n.joinArrays!==void 0?n.joinArrays:this.options.joinArrays,E=!this.i18nFormat||this.i18nFormat.handleAsObject;if(E&&v&&(typeof v!="string"&&typeof v!="boolean"&&typeof v!="number")&&A.indexOf(I)<0&&!(typeof x=="string"&&Array.isArray(v))){if(!n.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const N=this.options.returnedObjectHandler?this.options.returnedObjectHandler(S,v,{...n,ns:f}):`key '${a} (${this.language})' returned an object instead of string.`;return l?(y.res=N,y.usedParams=this.getUsedParamsDetails(n),y):N}if(s){const N=Array.isArray(v),M=N?[]:{},_=N?C:S;for(const B in v)if(Object.prototype.hasOwnProperty.call(v,B)){const R=`${_}${s}${B}`;M[B]=this.translate(R,{...n,joinArrays:!1,ns:f}),M[B]===R&&(M[B]=v[B])}v=M}}else if(E&&typeof x=="string"&&Array.isArray(v))v=v.join(x),v&&(v=this.extendTranslation(v,t,n,i));else{let N=!1,M=!1;const _=n.count!==void 0&&typeof n.count!="string",B=Tc.hasDefaultValue(n),R=_?this.pluralResolver.getSuffix(h,n.count,n):"",G=n.ordinal&&_?this.pluralResolver.getSuffix(h,n.count,{ordinal:!1}):"",Y=_&&!n.ordinal&&n.count===0&&this.pluralResolver.shouldUseIntlApi(),j=Y&&n[`defaultValue${this.options.pluralSeparator}zero`]||n[`defaultValue${R}`]||n[`defaultValue${G}`]||n.defaultValue;!this.isValidLookup(v)&&B&&(N=!0,v=j),this.isValidLookup(v)||(M=!0,v=a);const J=(n.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&M?void 0:v,ne=B&&j!==v&&this.options.updateMissing;if(M||N||ne){if(this.logger.log(ne?"updateKey":"missingKey",h,d,a,ne?j:v),s){const O=this.resolve(a,{...n,keySeparator:!1});O&&O.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let te=[];const de=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if(this.options.saveMissingTo==="fallback"&&de&&de[0])for(let O=0;O{const b=B&&w!==v?w:J;this.options.missingKeyHandler?this.options.missingKeyHandler(O,d,X,b,ne,n):this.backendConnector&&this.backendConnector.saveMissing&&this.backendConnector.saveMissing(O,d,X,b,ne,n),this.emit("missingKey",O,d,X,v)};this.options.saveMissing&&(this.options.saveMissingPlurals&&_?te.forEach(O=>{const X=this.pluralResolver.getSuffixes(O,n);Y&&n[`defaultValue${this.options.pluralSeparator}zero`]&&X.indexOf(`${this.options.pluralSeparator}zero`)<0&&X.push(`${this.options.pluralSeparator}zero`),X.forEach(w=>{re([O],a+w,n[`defaultValue${w}`]||j)})}):re(te,a,j))}v=this.extendTranslation(v,t,n,y,i),M&&v===a&&this.options.appendNamespaceToMissingKey&&(v=`${d}:${a}`),(M||N)&&this.options.parseMissingKeyHandler&&(this.options.compatibilityAPI!=="v1"?v=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${d}:${a}`:a,N?v:void 0):v=this.options.parseMissingKeyHandler(v))}return l?(y.res=v,y.usedParams=this.getUsedParamsDetails(n),y):v}extendTranslation(t,n,i,l,s){var a=this;if(this.i18nFormat&&this.i18nFormat.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...i},i.lng||this.language||l.usedLng,l.usedNS,l.usedKey,{resolved:l});else if(!i.skipInterpolation){i.interpolation&&this.interpolator.init({...i,interpolation:{...this.options.interpolation,...i.interpolation}});const h=typeof t=="string"&&(i&&i.interpolation&&i.interpolation.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let g;if(h){const v=t.match(this.interpolator.nestingRegexp);g=v&&v.length}let y=i.replace&&typeof i.replace!="string"?i.replace:i;if(this.options.interpolation.defaultVariables&&(y={...this.options.interpolation.defaultVariables,...y}),t=this.interpolator.interpolate(t,y,i.lng||this.language,i),h){const v=t.match(this.interpolator.nestingRegexp),S=v&&v.length;g1&&arguments[1]!==void 0?arguments[1]:{},i,l,s,a,f;return typeof t=="string"&&(t=[t]),t.forEach(d=>{if(this.isValidLookup(i))return;const h=this.extractFromKey(d,n),g=h.key;l=g;let y=h.namespaces;this.options.fallbackNS&&(y=y.concat(this.options.fallbackNS));const v=n.count!==void 0&&typeof n.count!="string",S=v&&!n.ordinal&&n.count===0&&this.pluralResolver.shouldUseIntlApi(),C=n.context!==void 0&&(typeof n.context=="string"||typeof n.context=="number")&&n.context!=="",I=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);y.forEach(A=>{this.isValidLookup(i)||(f=A,!q1[`${I[0]}-${A}`]&&this.utils&&this.utils.hasLoadedNamespace&&!this.utils.hasLoadedNamespace(f)&&(q1[`${I[0]}-${A}`]=!0,this.logger.warn(`key "${l}" for languages "${I.join(", ")}" won't get resolved as namespace "${f}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),I.forEach(x=>{if(this.isValidLookup(i))return;a=x;const E=[g];if(this.i18nFormat&&this.i18nFormat.addLookupKeys)this.i18nFormat.addLookupKeys(E,g,x,A,n);else{let N;v&&(N=this.pluralResolver.getSuffix(x,n.count,n));const M=`${this.options.pluralSeparator}zero`,_=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(v&&(E.push(g+N),n.ordinal&&N.indexOf(_)===0&&E.push(g+N.replace(_,this.options.pluralSeparator)),S&&E.push(g+M)),C){const B=`${g}${this.options.contextSeparator}${n.context}`;E.push(B),v&&(E.push(B+N),n.ordinal&&N.indexOf(_)===0&&E.push(B+N.replace(_,this.options.pluralSeparator)),S&&E.push(B+M))}}let T;for(;T=E.pop();)this.isValidLookup(i)||(s=T,i=this.getResource(x,A,T,n))}))})}),{res:i,usedKey:l,exactUsedKey:s,usedLng:a,usedNS:f}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,i,l):this.resourceStore.getResource(t,n,i,l)}getUsedParamsDetails(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],i=t.replace&&typeof t.replace!="string";let l=i?t.replace:t;if(i&&typeof t.count<"u"&&(l.count=t.count),this.options.interpolation.defaultVariables&&(l={...this.options.interpolation.defaultVariables,...l}),!i){l={...l};for(const s of n)delete l[s]}return l}static hasDefaultValue(t){const n="defaultValue";for(const i in t)if(Object.prototype.hasOwnProperty.call(t,i)&&n===i.substring(0,n.length)&&t[i]!==void 0)return!0;return!1}}function Op(e){return e.charAt(0).toUpperCase()+e.slice(1)}class ev{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=Ir.create("languageUtils")}getScriptPartFromCode(t){if(t=Ic(t),!t||t.indexOf("-")<0)return null;const n=t.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(t){if(t=Ic(t),!t||t.indexOf("-")<0)return t;const n=t.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(t){if(typeof t=="string"&&t.indexOf("-")>-1){const n=["hans","hant","latn","cyrl","cans","mong","arab"];let i=t.split("-");return this.options.lowerCaseLng?i=i.map(l=>l.toLowerCase()):i.length===2?(i[0]=i[0].toLowerCase(),i[1]=i[1].toUpperCase(),n.indexOf(i[1].toLowerCase())>-1&&(i[1]=Op(i[1].toLowerCase()))):i.length===3&&(i[0]=i[0].toLowerCase(),i[1].length===2&&(i[1]=i[1].toUpperCase()),i[0]!=="sgn"&&i[2].length===2&&(i[2]=i[2].toUpperCase()),n.indexOf(i[1].toLowerCase())>-1&&(i[1]=Op(i[1].toLowerCase())),n.indexOf(i[2].toLowerCase())>-1&&(i[2]=Op(i[2].toLowerCase()))),i.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let n;return t.forEach(i=>{if(n)return;const l=this.formatLanguageCode(i);(!this.options.supportedLngs||this.isSupportedCode(l))&&(n=l)}),!n&&this.options.supportedLngs&&t.forEach(i=>{if(n)return;const l=this.getLanguagePartFromCode(i);if(this.isSupportedCode(l))return n=l;n=this.options.supportedLngs.find(s=>{if(s===l)return s;if(!(s.indexOf("-")<0&&l.indexOf("-")<0)&&(s.indexOf("-")>0&&l.indexOf("-")<0&&s.substring(0,s.indexOf("-"))===l||s.indexOf(l)===0&&l.length>1))return s})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(t,n){if(!t)return[];if(typeof t=="function"&&(t=t(n)),typeof t=="string"&&(t=[t]),Array.isArray(t))return t;if(!n)return t.default||[];let i=t[n];return i||(i=t[this.getScriptPartFromCode(n)]),i||(i=t[this.formatLanguageCode(n)]),i||(i=t[this.getLanguagePartFromCode(n)]),i||(i=t.default),i||[]}toResolveHierarchy(t,n){const i=this.getFallbackCodes(n||this.options.fallbackLng||[],t),l=[],s=a=>{a&&(this.isSupportedCode(a)?l.push(a):this.logger.warn(`rejecting language code not found in supportedLngs: ${a}`))};return typeof t=="string"&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&s(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&s(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&s(this.getLanguagePartFromCode(t))):typeof t=="string"&&s(this.formatLanguageCode(t)),i.forEach(a=>{l.indexOf(a)<0&&s(this.formatLanguageCode(a))}),l}}let n3=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],r3={1:function(e){return+(e>1)},2:function(e){return+(e!=1)},3:function(e){return 0},4:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},5:function(e){return e==0?0:e==1?1:e==2?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},6:function(e){return e==1?0:e>=2&&e<=4?1:2},7:function(e){return e==1?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},8:function(e){return e==1?0:e==2?1:e!=8&&e!=11?2:3},9:function(e){return+(e>=2)},10:function(e){return e==1?0:e==2?1:e<7?2:e<11?3:4},11:function(e){return e==1||e==11?0:e==2||e==12?1:e>2&&e<20?2:3},12:function(e){return+(e%10!=1||e%100==11)},13:function(e){return+(e!==0)},14:function(e){return e==1?0:e==2?1:e==3?2:3},15:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2},16:function(e){return e%10==1&&e%100!=11?0:e!==0?1:2},17:function(e){return e==1||e%10==1&&e%100!=11?0:1},18:function(e){return e==0?0:e==1?1:2},19:function(e){return e==1?0:e==0||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3},20:function(e){return e==1?0:e==0||e%100>0&&e%100<20?1:2},21:function(e){return e%100==1?1:e%100==2?2:e%100==3||e%100==4?3:0},22:function(e){return e==1?0:e==2?1:(e<0||e>10)&&e%10==0?2:3}};const i3=["v1","v2","v3"],o3=["v4"],tv={zero:0,one:1,two:2,few:3,many:4,other:5};function l3(){const e={};return n3.forEach(t=>{t.lngs.forEach(n=>{e[n]={numbers:t.nr,plurals:r3[t.fc]}})}),e}class s3{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.languageUtils=t,this.options=n,this.logger=Ir.create("pluralResolver"),(!this.options.compatibilityJSON||o3.includes(this.options.compatibilityJSON))&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=l3()}addRule(t,n){this.rules[t]=n}getRule(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(Ic(t==="dev"?"en":t),{type:n.ordinal?"ordinal":"cardinal"})}catch{return}return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}needsPlural(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const i=this.getRule(t,n);return this.shouldUseIntlApi()?i&&i.resolvedOptions().pluralCategories.length>1:i&&i.numbers.length>1}getPluralFormsOfKey(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(t,i).map(l=>`${n}${l}`)}getSuffixes(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const i=this.getRule(t,n);return i?this.shouldUseIntlApi()?i.resolvedOptions().pluralCategories.sort((l,s)=>tv[l]-tv[s]).map(l=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${l}`):i.numbers.map(l=>this.getSuffix(t,l,n)):[]}getSuffix(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const l=this.getRule(t,i);return l?this.shouldUseIntlApi()?`${this.options.prepend}${i.ordinal?`ordinal${this.options.prepend}`:""}${l.select(n)}`:this.getSuffixRetroCompatible(l,n):(this.logger.warn(`no plural rule found for: ${t}`),"")}getSuffixRetroCompatible(t,n){const i=t.noAbs?t.plurals(n):t.plurals(Math.abs(n));let l=t.numbers[i];this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1&&(l===2?l="plural":l===1&&(l=""));const s=()=>this.options.prepend&&l.toString()?this.options.prepend+l.toString():l.toString();return this.options.compatibilityJSON==="v1"?l===1?"":typeof l=="number"?`_plural_${l.toString()}`:s():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1?s():this.options.prepend&&i.toString()?this.options.prepend+i.toString():i.toString()}shouldUseIntlApi(){return!i3.includes(this.options.compatibilityJSON)}}function nv(e,t,n){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:".",l=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=YP(e,t,n);return!s&&l&&typeof n=="string"&&(s=Ph(e,n,i),s===void 0&&(s=Ph(t,n,i))),s}class u3{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=Ir.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||(n=>n),this.init(t)}init(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});const{escape:n,escapeValue:i,useRawValueToEscape:l,prefix:s,prefixEscaped:a,suffix:f,suffixEscaped:d,formatSeparator:h,unescapeSuffix:g,unescapePrefix:y,nestingPrefix:v,nestingPrefixEscaped:S,nestingSuffix:C,nestingSuffixEscaped:I,nestingOptionsSeparator:A,maxReplaces:x,alwaysFormat:E}=t.interpolation;this.escape=n!==void 0?n:JP,this.escapeValue=i!==void 0?i:!0,this.useRawValueToEscape=l!==void 0?l:!1,this.prefix=s?Xo(s):a||"{{",this.suffix=f?Xo(f):d||"}}",this.formatSeparator=h||",",this.unescapePrefix=g?"":y||"-",this.unescapeSuffix=this.unescapePrefix?"":g||"",this.nestingPrefix=v?Xo(v):S||Xo("$t("),this.nestingSuffix=C?Xo(C):I||Xo(")"),this.nestingOptionsSeparator=A||",",this.maxReplaces=x||1e3,this.alwaysFormat=E!==void 0?E:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=(n,i)=>n&&n.source===i?(n.lastIndex=0,n):new RegExp(i,"g");this.regexp=t(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=t(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=t(this.nestingRegexp,`${this.nestingPrefix}(.+?)${this.nestingSuffix}`)}interpolate(t,n,i,l){let s,a,f;const d=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function h(C){return C.replace(/\$/g,"$$$$")}const g=C=>{if(C.indexOf(this.formatSeparator)<0){const E=nv(n,d,C,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(E,void 0,i,{...l,...n,interpolationkey:C}):E}const I=C.split(this.formatSeparator),A=I.shift().trim(),x=I.join(this.formatSeparator).trim();return this.format(nv(n,d,A,this.options.keySeparator,this.options.ignoreJSONStructure),x,i,{...l,...n,interpolationkey:A})};this.resetRegExp();const y=l&&l.missingInterpolationHandler||this.options.missingInterpolationHandler,v=l&&l.interpolation&&l.interpolation.skipOnVariables!==void 0?l.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:C=>h(C)},{regex:this.regexp,safeValue:C=>this.escapeValue?h(this.escape(C)):h(C)}].forEach(C=>{for(f=0;s=C.regex.exec(t);){const I=s[1].trim();if(a=g(I),a===void 0)if(typeof y=="function"){const x=y(t,s,l);a=typeof x=="string"?x:""}else if(l&&Object.prototype.hasOwnProperty.call(l,I))a="";else if(v){a=s[0];continue}else this.logger.warn(`missed to pass in variable ${I} for interpolating ${t}`),a="";else typeof a!="string"&&!this.useRawValueToEscape&&(a=X1(a));const A=C.safeValue(a);if(t=t.replace(s[0],A),v?(C.regex.lastIndex+=a.length,C.regex.lastIndex-=s[0].length):C.regex.lastIndex=0,f++,f>=this.maxReplaces)break}}),t}nest(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},l,s,a;function f(d,h){const g=this.nestingOptionsSeparator;if(d.indexOf(g)<0)return d;const y=d.split(new RegExp(`${g}[ ]*{`));let v=`{${y[1]}`;d=y[0],v=this.interpolate(v,a);const S=v.match(/'/g),C=v.match(/"/g);(S&&S.length%2===0&&!C||C.length%2!==0)&&(v=v.replace(/'/g,'"'));try{a=JSON.parse(v),h&&(a={...h,...a})}catch(I){return this.logger.warn(`failed parsing options string in nesting for key ${d}`,I),`${d}${g}${v}`}return a.defaultValue&&a.defaultValue.indexOf(this.prefix)>-1&&delete a.defaultValue,d}for(;l=this.nestingRegexp.exec(t);){let d=[];a={...i},a=a.replace&&typeof a.replace!="string"?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;let h=!1;if(l[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(l[1])){const g=l[1].split(this.formatSeparator).map(y=>y.trim());l[1]=g.shift(),d=g,h=!0}if(s=n(f.call(this,l[1].trim(),a),a),s&&l[0]===t&&typeof s!="string")return s;typeof s!="string"&&(s=X1(s)),s||(this.logger.warn(`missed to resolve ${l[1]} for nesting ${t}`),s=""),h&&(s=d.reduce((g,y)=>this.format(g,y,i.lng,{...i,interpolationkey:l[1].trim()}),s.trim())),t=t.replace(l[0],s),this.regexp.lastIndex=0}return t}}function a3(e){let t=e.toLowerCase().trim();const n={};if(e.indexOf("(")>-1){const i=e.split("(");t=i[0].toLowerCase().trim();const l=i[1].substring(0,i[1].length-1);t==="currency"&&l.indexOf(":")<0?n.currency||(n.currency=l.trim()):t==="relativetime"&&l.indexOf(":")<0?n.range||(n.range=l.trim()):l.split(";").forEach(a=>{if(a){const[f,...d]=a.split(":"),h=d.join(":").trim().replace(/^'+|'+$/g,""),g=f.trim();n[g]||(n[g]=h),h==="false"&&(n[g]=!1),h==="true"&&(n[g]=!0),isNaN(h)||(n[g]=parseInt(h,10))}})}return{formatName:t,formatOptions:n}}function Jo(e){const t={};return function(i,l,s){const a=l+JSON.stringify(s);let f=t[a];return f||(f=e(Ic(l),s),t[a]=f),f(i)}}class c3{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=Ir.create("formatter"),this.options=t,this.formats={number:Jo((n,i)=>{const l=new Intl.NumberFormat(n,{...i});return s=>l.format(s)}),currency:Jo((n,i)=>{const l=new Intl.NumberFormat(n,{...i,style:"currency"});return s=>l.format(s)}),datetime:Jo((n,i)=>{const l=new Intl.DateTimeFormat(n,{...i});return s=>l.format(s)}),relativetime:Jo((n,i)=>{const l=new Intl.RelativeTimeFormat(n,{...i});return s=>l.format(s,i.range||"day")}),list:Jo((n,i)=>{const l=new Intl.ListFormat(n,{...i});return s=>l.format(s)})},this.init(t)}init(t){const i=(arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}}).interpolation;this.formatSeparator=i.formatSeparator?i.formatSeparator:i.formatSeparator||","}add(t,n){this.formats[t.toLowerCase().trim()]=n}addCached(t,n){this.formats[t.toLowerCase().trim()]=Jo(n)}format(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return n.split(this.formatSeparator).reduce((f,d)=>{const{formatName:h,formatOptions:g}=a3(d);if(this.formats[h]){let y=f;try{const v=l&&l.formatParams&&l.formatParams[l.interpolationkey]||{},S=v.locale||v.lng||l.locale||l.lng||i;y=this.formats[h](f,S,{...g,...l,...v})}catch(v){this.logger.warn(v)}return y}else this.logger.warn(`there was no format function for ${h}`);return f},t)}}function f3(e,t){e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)}class d3 extends cf{constructor(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};super(),this.backend=t,this.store=n,this.services=i,this.languageUtils=i.languageUtils,this.options=l,this.logger=Ir.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=l.maxParallelReads||10,this.readingCalls=0,this.maxRetries=l.maxRetries>=0?l.maxRetries:5,this.retryTimeout=l.retryTimeout>=1?l.retryTimeout:350,this.state={},this.queue=[],this.backend&&this.backend.init&&this.backend.init(i,l.backend,l)}queueLoad(t,n,i,l){const s={},a={},f={},d={};return t.forEach(h=>{let g=!0;n.forEach(y=>{const v=`${h}|${y}`;!i.reload&&this.store.hasResourceBundle(h,y)?this.state[v]=2:this.state[v]<0||(this.state[v]===1?a[v]===void 0&&(a[v]=!0):(this.state[v]=1,g=!1,a[v]===void 0&&(a[v]=!0),s[v]===void 0&&(s[v]=!0),d[y]===void 0&&(d[y]=!0)))}),g||(f[h]=!0)}),(Object.keys(s).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:l}),{toLoad:Object.keys(s),pending:Object.keys(a),toLoadLanguages:Object.keys(f),toLoadNamespaces:Object.keys(d)}}loaded(t,n,i){const l=t.split("|"),s=l[0],a=l[1];n&&this.emit("failedLoading",s,a,n),i&&this.store.addResourceBundle(s,a,i,void 0,void 0,{skipCopy:!0}),this.state[t]=n?-1:2;const f={};this.queue.forEach(d=>{GP(d.loaded,[s],a),f3(d,t),n&&d.errors.push(n),d.pendingCount===0&&!d.done&&(Object.keys(d.loaded).forEach(h=>{f[h]||(f[h]={});const g=d.loaded[h];g.length&&g.forEach(y=>{f[h][y]===void 0&&(f[h][y]=!0)})}),d.done=!0,d.errors.length?d.callback(d.errors):d.callback())}),this.emit("loaded",f),this.queue=this.queue.filter(d=>!d.done)}read(t,n,i){let l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,a=arguments.length>5?arguments[5]:void 0;if(!t.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:n,fcName:i,tried:l,wait:s,callback:a});return}this.readingCalls++;const f=(h,g)=>{if(this.readingCalls--,this.waitingReads.length>0){const y=this.waitingReads.shift();this.read(y.lng,y.ns,y.fcName,y.tried,y.wait,y.callback)}if(h&&g&&l{this.read.call(this,t,n,i,l+1,s*2,a)},s);return}a(h,g)},d=this.backend[i].bind(this.backend);if(d.length===2){try{const h=d(t,n);h&&typeof h.then=="function"?h.then(g=>f(null,g)).catch(f):f(null,h)}catch(h){f(h)}return}return d(t,n,f)}prepareLoading(t,n){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},l=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),l&&l();typeof t=="string"&&(t=this.languageUtils.toResolveHierarchy(t)),typeof n=="string"&&(n=[n]);const s=this.queueLoad(t,n,i,l);if(!s.toLoad.length)return s.pending.length||l(),null;s.toLoad.forEach(a=>{this.loadOne(a)})}load(t,n,i){this.prepareLoading(t,n,{},i)}reload(t,n,i){this.prepareLoading(t,n,{reload:!0},i)}loadOne(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";const i=t.split("|"),l=i[0],s=i[1];this.read(l,s,"read",void 0,void 0,(a,f)=>{a&&this.logger.warn(`${n}loading namespace ${s} for language ${l} failed`,a),!a&&f&&this.logger.log(`${n}loaded namespace ${s} for language ${l}`,f),this.loaded(t,a,f)})}saveMissing(t,n,i,l,s){let a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{},f=arguments.length>6&&arguments[6]!==void 0?arguments[6]:()=>{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${i}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(i==null||i==="")){if(this.backend&&this.backend.create){const d={...a,isUpdate:s},h=this.backend.create.bind(this.backend);if(h.length<6)try{let g;h.length===5?g=h(t,n,i,l,d):g=h(t,n,i,l),g&&typeof g.then=="function"?g.then(y=>f(null,y)).catch(f):f(null,g)}catch(g){f(g)}else h(t,n,i,l,f,d)}!t||!t[0]||this.store.addResource(t[0],n,i,l)}}}function rv(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){let n={};if(typeof t[1]=="object"&&(n=t[1]),typeof t[1]=="string"&&(n.defaultValue=t[1]),typeof t[2]=="string"&&(n.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const i=t[3]||t[2];Object.keys(i).forEach(l=>{n[l]=i[l]})}return n},interpolation:{escapeValue:!0,format:e=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function iv(e){return typeof e.ns=="string"&&(e.ns=[e.ns]),typeof e.fallbackLng=="string"&&(e.fallbackLng=[e.fallbackLng]),typeof e.fallbackNS=="string"&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function Ma(){}function p3(e){Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(n=>{typeof e[n]=="function"&&(e[n]=e[n].bind(e))})}class qs extends cf{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;if(super(),this.options=iv(t),this.services={},this.logger=Ir,this.modules={external:[]},p3(this),n&&!this.isInitialized&&!t.isClone){if(!this.options.initImmediate)return this.init(t,n),this;setTimeout(()=>{this.init(t,n)},0)}}init(){var t=this;let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},i=arguments.length>1?arguments[1]:void 0;this.isInitializing=!0,typeof n=="function"&&(i=n,n={}),!n.defaultNS&&n.defaultNS!==!1&&n.ns&&(typeof n.ns=="string"?n.defaultNS=n.ns:n.ns.indexOf("translation")<0&&(n.defaultNS=n.ns[0]));const l=rv();this.options={...l,...this.options,...iv(n)},this.options.compatibilityAPI!=="v1"&&(this.options.interpolation={...l.interpolation,...this.options.interpolation}),n.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=n.keySeparator),n.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=n.nsSeparator);function s(g){return g?typeof g=="function"?new g:g:null}if(!this.options.isClone){this.modules.logger?Ir.init(s(this.modules.logger),this.options):Ir.init(null,this.options);let g;this.modules.formatter?g=this.modules.formatter:typeof Intl<"u"&&(g=c3);const y=new ev(this.options);this.store=new Z1(this.options.resources,this.options);const v=this.services;v.logger=Ir,v.resourceStore=this.store,v.languageUtils=y,v.pluralResolver=new s3(y,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),g&&(!this.options.interpolation.format||this.options.interpolation.format===l.interpolation.format)&&(v.formatter=s(g),v.formatter.init(v,this.options),this.options.interpolation.format=v.formatter.format.bind(v.formatter)),v.interpolator=new u3(this.options),v.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},v.backendConnector=new d3(s(this.modules.backend),v.resourceStore,v,this.options),v.backendConnector.on("*",function(S){for(var C=arguments.length,I=new Array(C>1?C-1:0),A=1;A1?C-1:0),A=1;A{S.init&&S.init(this)})}if(this.format=this.options.interpolation.format,i||(i=Ma),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const g=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);g.length>0&&g[0]!=="dev"&&(this.options.lng=g[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(g=>{this[g]=function(){return t.store[g](...arguments)}}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(g=>{this[g]=function(){return t.store[g](...arguments),t}});const d=ks(),h=()=>{const g=(y,v)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),d.resolve(v),i(y,v)};if(this.languages&&this.options.compatibilityAPI!=="v1"&&!this.isInitialized)return g(null,this.t.bind(this));this.changeLanguage(this.options.lng,g)};return this.options.resources||!this.options.initImmediate?h():setTimeout(h,0),d}loadResources(t){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ma;const l=typeof t=="string"?t:this.language;if(typeof t=="function"&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(l&&l.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return i();const s=[],a=f=>{if(!f||f==="cimode")return;this.services.languageUtils.toResolveHierarchy(f).forEach(h=>{h!=="cimode"&&s.indexOf(h)<0&&s.push(h)})};l?a(l):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(d=>a(d)),this.options.preload&&this.options.preload.forEach(f=>a(f)),this.services.backendConnector.load(s,this.options.ns,f=>{!f&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),i(f)})}else i(null)}reloadResources(t,n,i){const l=ks();return t||(t=this.languages),n||(n=this.options.ns),i||(i=Ma),this.services.backendConnector.reload(t,n,s=>{l.resolve(),i(s)}),l}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&qS.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1))for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(i)){this.resolvedLanguage=i;break}}}changeLanguage(t,n){var i=this;this.isLanguageChangingTo=t;const l=ks();this.emit("languageChanging",t);const s=d=>{this.language=d,this.languages=this.services.languageUtils.toResolveHierarchy(d),this.resolvedLanguage=void 0,this.setResolvedLanguage(d)},a=(d,h)=>{h?(s(h),this.translator.changeLanguage(h),this.isLanguageChangingTo=void 0,this.emit("languageChanged",h),this.logger.log("languageChanged",h)):this.isLanguageChangingTo=void 0,l.resolve(function(){return i.t(...arguments)}),n&&n(d,function(){return i.t(...arguments)})},f=d=>{!t&&!d&&this.services.languageDetector&&(d=[]);const h=typeof d=="string"?d:this.services.languageUtils.getBestMatchFromCodes(d);h&&(this.language||s(h),this.translator.language||this.translator.changeLanguage(h),this.services.languageDetector&&this.services.languageDetector.cacheUserLanguage&&this.services.languageDetector.cacheUserLanguage(h)),this.loadResources(h,g=>{a(g,h)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?f(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(f):this.services.languageDetector.detect(f):f(t),l}getFixedT(t,n,i){var l=this;const s=function(a,f){let d;if(typeof f!="object"){for(var h=arguments.length,g=new Array(h>2?h-2:0),y=2;y`${d.keyPrefix}${v}${C}`):S=d.keyPrefix?`${d.keyPrefix}${v}${a}`:a,l.t(S,d)};return typeof t=="string"?s.lng=t:s.lngs=t,s.ns=n,s.keyPrefix=i,s}t(){return this.translator&&this.translator.translate(...arguments)}exists(){return this.translator&&this.translator.exists(...arguments)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const i=n.lng||this.resolvedLanguage||this.languages[0],l=this.options?this.options.fallbackLng:!1,s=this.languages[this.languages.length-1];if(i.toLowerCase()==="cimode")return!0;const a=(f,d)=>{const h=this.services.backendConnector.state[`${f}|${d}`];return h===-1||h===2};if(n.precheck){const f=n.precheck(this,a);if(f!==void 0)return f}return!!(this.hasResourceBundle(i,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(i,t)&&(!l||a(s,t)))}loadNamespaces(t,n){const i=ks();return this.options.ns?(typeof t=="string"&&(t=[t]),t.forEach(l=>{this.options.ns.indexOf(l)<0&&this.options.ns.push(l)}),this.loadResources(l=>{i.resolve(),n&&n(l)}),i):(n&&n(),Promise.resolve())}loadLanguages(t,n){const i=ks();typeof t=="string"&&(t=[t]);const l=this.options.preload||[],s=t.filter(a=>l.indexOf(a)<0&&this.services.languageUtils.isSupportedCode(a));return s.length?(this.options.preload=l.concat(s),this.loadResources(a=>{i.resolve(),n&&n(a)}),i):(n&&n(),Promise.resolve())}dir(t){if(t||(t=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!t)return"rtl";const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],i=this.services&&this.services.languageUtils||new ev(rv());return n.indexOf(i.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;return new qs(t,n)}cloneInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ma;const i=t.forkResourceStore;i&&delete t.forkResourceStore;const l={...this.options,...t,isClone:!0},s=new qs(l);return(t.debug!==void 0||t.prefix!==void 0)&&(s.logger=s.logger.clone(t)),["store","services","language"].forEach(f=>{s[f]=this[f]}),s.services={...this.services},s.services.utils={hasLoadedNamespace:s.hasLoadedNamespace.bind(s)},i&&(s.store=new Z1(this.store.data,l),s.services.resourceStore=s.store),s.translator=new Tc(s.services,l),s.translator.on("*",function(f){for(var d=arguments.length,h=new Array(d>1?d-1:0),g=1;g{if(t)for(const n in t)e[n]===void 0&&(e[n]=t[n])}),e}const ov=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,y3=(e,t,n)=>{const i=n||{};i.path=i.path||"/";const l=encodeURIComponent(t);let s=`${e}=${l}`;if(i.maxAge>0){const a=i.maxAge-0;if(Number.isNaN(a))throw new Error("maxAge should be a Number");s+=`; Max-Age=${Math.floor(a)}`}if(i.domain){if(!ov.test(i.domain))throw new TypeError("option domain is invalid");s+=`; Domain=${i.domain}`}if(i.path){if(!ov.test(i.path))throw new TypeError("option path is invalid");s+=`; Path=${i.path}`}if(i.expires){if(typeof i.expires.toUTCString!="function")throw new TypeError("option expires is invalid");s+=`; Expires=${i.expires.toUTCString()}`}if(i.httpOnly&&(s+="; HttpOnly"),i.secure&&(s+="; Secure"),i.sameSite)switch(typeof i.sameSite=="string"?i.sameSite.toLowerCase():i.sameSite){case!0:s+="; SameSite=Strict";break;case"lax":s+="; SameSite=Lax";break;case"strict":s+="; SameSite=Strict";break;case"none":s+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return s},lv={create(e,t,n,i){let l=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(l.expires=new Date,l.expires.setTime(l.expires.getTime()+n*60*1e3)),i&&(l.domain=i),document.cookie=y3(e,encodeURIComponent(t),l)},read(e){const t=`${e}=`,n=document.cookie.split(";");for(let i=0;i-1&&(l=window.location.hash.substring(window.location.hash.indexOf("?")));const a=l.substring(1).split("&");for(let f=0;f0&&a[f].substring(0,d)===t&&(n=a[f].substring(d+1))}}return n}};let xs=null;const sv=()=>{if(xs!==null)return xs;try{xs=window!=="undefined"&&window.localStorage!==null;const e="i18next.translate.boo";window.localStorage.setItem(e,"foo"),window.localStorage.removeItem(e)}catch{xs=!1}return xs};var S3={name:"localStorage",lookup(e){let{lookupLocalStorage:t}=e;if(t&&sv())return window.localStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupLocalStorage:n}=t;n&&sv()&&window.localStorage.setItem(n,e)}};let Es=null;const uv=()=>{if(Es!==null)return Es;try{Es=window!=="undefined"&&window.sessionStorage!==null;const e="i18next.translate.boo";window.sessionStorage.setItem(e,"foo"),window.sessionStorage.removeItem(e)}catch{Es=!1}return Es};var k3={name:"sessionStorage",lookup(e){let{lookupSessionStorage:t}=e;if(t&&uv())return window.sessionStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupSessionStorage:n}=t;n&&uv()&&window.sessionStorage.setItem(n,e)}},x3={name:"navigator",lookup(e){const t=[];if(typeof navigator<"u"){const{languages:n,userLanguage:i,language:l}=navigator;if(n)for(let s=0;s0?t:void 0}},E3={name:"htmlTag",lookup(e){let{htmlTag:t}=e,n;const i=t||(typeof document<"u"?document.documentElement:null);return i&&typeof i.getAttribute=="function"&&(n=i.getAttribute("lang")),n}},C3={name:"path",lookup(e){var l;let{lookupFromPathIndex:t}=e;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?(l=n[typeof t=="number"?t:0])==null?void 0:l.replace("/",""):void 0}},P3={name:"subdomain",lookup(e){var l,s;let{lookupFromSubdomainIndex:t}=e;const n=typeof t=="number"?t+1:1,i=typeof window<"u"&&((s=(l=window.location)==null?void 0:l.hostname)==null?void 0:s.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i));if(i)return i[n]}};function I3(){return{order:["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"],lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:e=>e}}class ek{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(t,n)}init(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=t||{languageUtils:{}},this.options=g3(n,this.options||{},I3()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=l=>l.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=i,this.addDetector(v3),this.addDetector(w3),this.addDetector(S3),this.addDetector(k3),this.addDetector(x3),this.addDetector(E3),this.addDetector(C3),this.addDetector(P3)}addDetector(t){return this.detectors[t.name]=t,this}detect(t){t||(t=this.options.order);let n=[];return t.forEach(i=>{if(this.detectors[i]){let l=this.detectors[i].lookup(this.options);l&&typeof l=="string"&&(l=[l]),l&&(n=n.concat(l))}}),n=n.map(i=>this.options.convertDetectedLanguage(i)),this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(t,n){n||(n=this.options.caches),n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(t)>-1||n.forEach(i=>{this.detectors[i]&&this.detectors[i].cacheUserLanguage(t,this.options)}))}}ek.type="languageDetector";function T3(){if(console&&console.warn){for(var e=arguments.length,t=new Array(e),n=0;n()=>{if(e.isInitialized)t();else{const n=()=>{setTimeout(()=>{e.off("initialized",n)},0),t()};e.on("initialized",n)}};function cv(e,t,n){e.loadNamespaces(t,tk(e,n))}function fv(e,t,n,i){typeof n=="string"&&(n=[n]),n.forEach(l=>{e.options.ns.indexOf(l)<0&&e.options.ns.push(l)}),e.loadLanguages(t,tk(e,i))}function L3(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const i=t.languages[0],l=t.options?t.options.fallbackLng:!1,s=t.languages[t.languages.length-1];if(i.toLowerCase()==="cimode")return!0;const a=(f,d)=>{const h=t.services.backendConnector.state[`${f}|${d}`];return h===-1||h===2};return n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!a(t.isLanguageChangingTo,e)?!1:!!(t.hasResourceBundle(i,e)||!t.services.backendConnector.backend||t.options.resources&&!t.options.partialBundledLanguages||a(i,e)&&(!l||a(s,e)))}function A3(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return!t.languages||!t.languages.length?(Ih("i18n.languages were undefined or empty",t.languages),!0):t.options.ignoreJSONStructure!==void 0?t.hasLoadedNamespace(e,{lng:n.lng,precheck:(l,s)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&l.services.backendConnector.backend&&l.isLanguageChangingTo&&!s(l.isLanguageChangingTo,e))return!1}}):L3(e,t,n)}const N3=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,_3={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},R3=e=>_3[e],O3=e=>e.replace(N3,R3);let Th={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:O3};function z3(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Th={...Th,...e}}function D3(){return Th}let nk;function M3(e){nk=e}function $3(){return nk}const F3={type:"3rdParty",init(e){z3(e.options.react),M3(e)}},j3=ee.createContext();class U3{constructor(){this.usedNamespaces={}}addUsedNamespaces(t){t.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}const B3=(e,t)=>{const n=ee.useRef();return ee.useEffect(()=>{n.current=t?n.current:e},[e,t]),n.current};function rk(e,t,n,i){return e.getFixedT(t,n,i)}function V3(e,t,n,i){return ee.useCallback(rk(e,t,n,i),[e,t,n,i])}function hr(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const{i18n:n}=t,{i18n:i,defaultNS:l}=ee.useContext(j3)||{},s=n||i||$3();if(s&&!s.reportNamespaces&&(s.reportNamespaces=new U3),!s){Ih("You will need to pass in an i18next instance by using initReactI18next");const N=(_,B)=>typeof B=="string"?B:B&&typeof B=="object"&&typeof B.defaultValue=="string"?B.defaultValue:Array.isArray(_)?_[_.length-1]:_,M=[N,{},!1];return M.t=N,M.i18n={},M.ready=!1,M}s.options.react&&s.options.react.wait!==void 0&&Ih("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const a={...D3(),...s.options.react,...t},{useSuspense:f,keyPrefix:d}=a;let h=e||l||s.options&&s.options.defaultNS;h=typeof h=="string"?[h]:h||["translation"],s.reportNamespaces.addUsedNamespaces&&s.reportNamespaces.addUsedNamespaces(h);const g=(s.isInitialized||s.initializedStoreOnce)&&h.every(N=>A3(N,s,a)),y=V3(s,t.lng||null,a.nsMode==="fallback"?h:h[0],d),v=()=>y,S=()=>rk(s,t.lng||null,a.nsMode==="fallback"?h:h[0],d),[C,I]=ee.useState(v);let A=h.join();t.lng&&(A=`${t.lng}${A}`);const x=B3(A),E=ee.useRef(!0);ee.useEffect(()=>{const{bindI18n:N,bindI18nStore:M}=a;E.current=!0,!g&&!f&&(t.lng?fv(s,t.lng,h,()=>{E.current&&I(S)}):cv(s,h,()=>{E.current&&I(S)})),g&&x&&x!==A&&E.current&&I(S);function _(){E.current&&I(S)}return N&&s&&s.on(N,_),M&&s&&s.store.on(M,_),()=>{E.current=!1,N&&s&&N.split(" ").forEach(B=>s.off(B,_)),M&&s&&M.split(" ").forEach(B=>s.store.off(B,_))}},[s,A]),ee.useEffect(()=>{E.current&&g&&I(v)},[s,d,g]);const T=[C,s,g];if(T.t=C,T.i18n=s,T.ready=g,g||!g&&!f)return T;throw new Promise(N=>{t.lng?fv(s,t.lng,h,()=>N()):cv(s,h,()=>N())})}const H3={title:{developer:"Developer",name:"Dohyun Ko | 고도현"},introduction:"As a third-year frontend developer, I strive to write maintainable code. Working at a startup, I gained diverse experience in frontend, backend, infrastructure, and AI, and I have also interned at an AI research lab. My goal is to 'take the road not taken,' always embracing various challenges.",current:{organizations:[{name:"GIST Student Association Infoteam",isImportant:!0,color:"#EB6263",url:"https://introduce.gistory.me/",job:"Information Member and Leader for 2024-second half",startedAt:"2022-09",projects:[{name:"AMS Frontend",isImportant:!1,startedAt:"2022-11",endedAt:"2023-02",description:"Developed the frontend of AMS, the GIST club application system.",whatIDid:["Frontend development","UI design"],techStacks:["React","TypeScript","mono-repo"]},{name:"Ziggle Frontend",isImportant:!0,url:"https://github.com/gsainfoteam/ziggle-fe",startedAt:"2023-04",description:"Developing the frontend of Ziggle, GIST's integrated notification platform.",whatIDid:["Lead and Frontend development"],techStacks:["React","TypeScript","Next.js","Tailwind CSS"]},{name:"IdP Frontend",isImportant:!0,url:"https://idp.gistory.me",startedAt:"2024-03",description:"Maintaining the frontend of IdP, the OAuth2.0 authentication system used at GIST.",whatIDid:["Frontend maintenance"],techStacks:["React","TypeScript","Tailwind CSS"]}]},{name:"Wing: GIST CS Club",isImportant:!1,color:"rgb(151, 123, 242)",url:"https://wing-homepage.vercel.app/",job:"Senior Member",startedAt:"2023-03",projects:[{name:"Wing Session",isImportant:!0,startedAt:"2023-03",description:"Conducting development exchanges and sessions at Wing.",whatIDid:["Conducted session on introducing mono-repo","Conducted session on React.cpp(refer to the side project: Dutch: OOP Final)","Conducted session on writing code like a UI library: Compound Components"]}]}]},education:{attendedLectures:["Object-Oriented Programming","Data Structures","Introduction to Algorithms","Computer Systems Theory and Laboratory","Automata Theory","Operating Systems","Computer Graphics","Computer Networking","Machine Learning and Deep Learning","Computer Security","Computational Models of Cognition"],attendedLecture:"Attended Courses",major:"Electrical Engineering and Computer Science"},experience:{experiences:[{name:"GIST Data Science Lab",isImportant:!0,color:"#b509ac",url:"https://sundong.kim/members/",job:"Intern",startedAt:"2024-01-02",endedAt:"2024-05-31",projects:[{name:"O2ARC 3.0",isImportant:!0,url:"https://o2arc.com/",startedAt:"2024-01",endedAt:"2024-05",description:"Developed and maintained version 3.0 of O2ARC, a tool for collecting human solutions data for ARC problems. Authored a demo paper on the development and data analysis, which was submitted to IJCAI 2024.",whatIDid:["Overall frontend and the grid manipulation logic development","Backend API development","UX design to enhance the quality of collected user data"],techStacks:["React","TypeScript","Tailwind CSS","i18next","NestJS","Prisma"]},{name:"Introductory RL Study",isImportant:!1,url:"https://www.coursera.org/specializations/reinforcement-learning",startedAt:"2024-01",endedAt:"2024-02",description:"Studied the basics of reinforcement learning through Coursera's Reinforcement Learning Specialization.",whatIDid:["Studied basics of reinforcement learning (up to Q-Learning)"]}]},{name:"Sigor Inc.",isImportant:!0,color:"#FEAA17",url:"https://introduce.sigor.company/",job:"Web Developer",startedAt:"2022-02-23",endedAt:"2023-12-22",projects:[{name:"Doggly Frontend",url:"https://doggly.co.kr/",startedAt:"2022-08",endedAt:"2023-03",description:"Developed the frontend for Doggly, a pet clothing shopping mall which provides AI-based size measurement.",whatIDid:["Overall frontend development and maintenance","Developed Doggly android & iOS webview app and integrated payment module","A/B testing for funnel improvement"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI","i18next"]},{name:"Rushhour Frontend",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-05",endedAt:"2023-07",description:"Developed the frontend and webview app for Rushhour, a service that informs about available seats in the subway.",whatIDid:["Developed Rushhour webview frontend","Developed Rushhour android & iOS webview app"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI"]},{name:"Rushhour App",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-07",endedAt:"2023-10",description:"Participated in the development of the Flutter version of Rushhour.",whatIDid:["Developed Rushhour Flutter app","Logged app user data"],techStacks:["Flutter","Firebase"]},{name:"Rushhour AI",isImportant:!0,startedAt:"2023-09",endedAt:"2023-12",description:"Participated in developing AI(ML) for Rushhour.",whatIDid:["Developed AI to predict subway congestion","Developed AI to predict available subway seats"],techStacks:["Scikit-learn","Pandas"]},{name:"Others",isImportant:!0,startedAt:"2022-02",endedAt:"2023-12",description:"Performed various development tasks as a developer in a startup.",whatIDid:["Developed landing pages and admin pages","Analyzed and collected user logs","Automated tasks","Integrated into mono-repo for productivity improvement"],techStacks:["React","TypeScript","Amplitude","AWS Lightsail","AWS Lambda","FastAPI","Pandas","mono-repo"]}]},{name:"GDSC-GIST",isImportant:!1,color:"#008cff",url:"https://gdsc.community.dev/gwangju-institute-of-science-and-technology/",job:"2nd-year Team Core, Tech Team",startedAt:"2022-05",endedAt:"2023-07",projects:[{name:"Study",isImportant:!1,startedAt:"2022-11",endedAt:"2023-05",description:"Internal development study conducted by GDSC.",whatIDid:["Led React study","Participated in JS Pattern study"]},{name:"GIST Mini Solution Challenge",isImportant:!1,url:"https://gdsc.community.dev/events/details/developer-student-clubs-gwangju-institute-of-science-and-technology-presents-gist-mini-solution-challenge/",startedAt:"2023-04",endedAt:"2023-04",description:"Hackathon hosted by GDSC-GIST at GIST. A total of 60 people participated.",whatIDid:["Prepared and managed hackathon"]}]},{name:"GPERI",isImportant:!1,color:"#4c568f",url:"https://sites.google.com/view/gperigist",job:"Research Member",startedAt:"2023-07",endedAt:"2024-03",projects:[{name:"C Language Education",isImportant:!1,startedAt:"2023-07",endedAt:"2023-08",description:"Conducted C language education for members.",whatIDid:["Conducted C language education"],techStacks:["C"]},{name:"Rocket Communication Development",isImportant:!1,startedAt:"2023-07",endedAt:"2023-11",description:"Attempted rocket communication development but was not successful.",whatIDid:["Developed Flight Software","Developed communication system"],techStacks:["C","Zigbee"]}]}]},sideProject:{sideProjects:[{name:"2024 KPMG Ideathon: 🥉 3rd place",isImportant:!0,url:"https://github.com/gist-optima",startedAt:"2024-01",endedAt:"2024-02",description:"Participated in the [Samjong KPMG Ideathon](https://kpmgkr.notion.site/kpmgkr/2024-KPMG-1fcd8a808f3d4f36a5ae8ad6e9bc413e) and developed Docuflow, a platform implementing VCS for document work and streamlined-ai-search using LLM.",whatIDid:["Frontend development"],techStacks:["React","TypeScript","Tailwind CSS"]},{name:"Kaggle - Regression with a Mohs Hardness Dataset: 4th place",isImportant:!0,url:"https://www.kaggle.com/competitions/playground-series-s3e25",startedAt:"2023-10",endedAt:"2023-12",description:"Achieved 4th place in Kaggle's Mohs hardness prediction competition. Used a unique post-processing technique considering the score formula being MedAE.",whatIDid:["Developed ML model"],techStacks:["Python","Scikit-learn","Pandas"]},{name:"2023 Creative Space G A.I. & IoT Makerthon: 🥈 2nd place",isImportant:!1,startedAt:"2023-10",endedAt:"2023-11",description:"Developed an AI assistant combining GPT-4 API and Raspberry Pi, capable of understanding everyday conversations and controlling IoT devices like switches and speakers.",whatIDid:["Integrated OpenAI API","Prepared planning and presentation materials"],techStacks:["Python"]},{name:"2023 Net Challenge: 🥈 Silver Award",isImportant:!0,url:"https://github.com/Net-Challenge-InfoTeam",startedAt:"2023-06",endedAt:"2023-12",description:"Participated in the 2023 Net Challenge. Developed a service that analyzes CCTV data with AI to detect threats in real-time and notifies nearby users when a threat is detected.",whatIDid:["Developed app using React and PWA","Displayed real-time threat locations using Mapbox"],techStacks:["React","TypeScript","Mapbox","PWA"]},{name:"React-Atoms: React Component Library",isImportant:!0,url:"https://github.com/dohyun-ko/react-atoms",startedAt:"2023-07",endedAt:"2023-07",description:"A personal library of frequently used React components published on npm.",whatIDid:["Developed React components","Documented components using Storybook","Published on npm"],techStacks:["React","TypeScript","RollUp","Storybook","npm"]},{name:"Dutch: OOP Final Project",isImportant:!1,url:"https://github.com/dohyun-ko/dutch-wasm",startedAt:"2023-04",endedAt:"2023-06",description:"A Dutch pay platform developed entirely in C++ for both frontend and backend. Submitted as the final project for GIST's Object-Oriented Programming course.",whatIDid:["Developed frontend UI using C++ and WebAssembly","Developed frontend logic such as State and Navigator"],techStacks:["C++","WebAssembly","Emscripten"]},{name:"Speaking Melona: Convenience Store Foods Talking to Each Other",isImportant:!1,url:"https://melona.chat",startedAt:"2024-05",endedAt:"2024-05",description:"A service that assigns personas to convenience store foods and generates conversations between them when a barcode is scanned.",whatIDid:["Frontend development","Backend development","Prompting"],techStacks:["React","TypeScript","FastAPI","PostgreSQL"]}]},skill:{skills:[{name:"React",level:5},{name:"TypeScript",level:4},{name:"JavaScript",level:4},{name:"HTML/CSS",level:4},{name:"Python",level:3},{name:"NestJS",level:2},{name:"FastAPI",level:2},{name:"Flutter",level:2},{name:"C++",level:2},{name:"Kotlin",level:1},{name:"Docker",level:1},{name:"Rust",level:1},{name:"Assembly",level:1}]}},b3=Object.freeze(Object.defineProperty({__proto__:null,main:H3},Symbol.toStringTag,{value:"Module"})),W3={title:{developer:"개발자",name:"고도현 | Dohyun Ko"},introduction:"3년차 프론트엔드 개발자로, 유지보수하기 쉬운 코드를 짜기 위해 노력합니다. 스타트업에서 일하며 프론트엔드, 백엔드, 인프라, AI 등 다양한 경험을 쌓았고, AI 연구실에서 인턴으로 일했습니다. 가지 않은 길'을 가는 것을 목표로 언제나 새로운 시도를 합니다.",current:{organizations:[{name:"GIST 학생회 정보국",isImportant:!0,color:"#EB6263",url:"https://introduce.gistory.me/",job:"팀장",startedAt:"2022-09",projects:[{name:"AMS 프론트엔드",isImportant:!1,startedAt:"2022-11",endedAt:"2023-02",description:"GIST 동아리 신청 시스템인 AMS의 프론트엔드를 개발했습니다.",whatIDid:["프론트엔드 개발","UI 디자인"],techStacks:["React","TypeScript","mono-repo"]},{name:"Ziggle 프론트엔드",isImportant:!0,url:"https://github.com/gsainfoteam/ziggle-fe",startedAt:"2023-04",description:"GIST 통합 공지 플랫폼인 Ziggle의 프론트엔드를 개발하고 있습니다.",whatIDid:["팀장 및 프론트엔드 개발"],techStacks:["React","TypeScript","Next.js","Tailwind CSS"]},{name:"IdP 프론트엔드",isImportant:!0,url:"https://idp.gistory.me",startedAt:"2024-03",description:"GIST에서 사용하는 OAuth2.0 인증 시스템 IdP의 프론트엔드를 유지보수하고 있습니다.",whatIDid:["프론트엔드 유지보수"],techStacks:["React","TypeScript","Tailwind CSS"]}]},{name:"Wing: GIST 전산 동아리",isImportant:!1,color:"rgb(151, 123, 242)",url:"https://wing-homepage.vercel.app/",job:"시니어 부원",startedAt:"2023-03",projects:[{name:"Wing Session",isImportant:!0,startedAt:"2023-03",description:"Wing에서 개발 상황 교류 및 세션을 진행합니다.",whatIDid:["모노레포에 도입기 세션 진행","React.cpp 세션 진행","UI 라이브러리처럼 코드 짜기: Compound Components 세션 진행"]}]}]},education:{attendedLectures:["객체 지향 프로그래밍","자료 구조","알고리즘 개론","컴퓨터 시스템 이론 및 실습","오토마타 이론","운영체제","컴퓨터 그래픽스","컴퓨터 네트워킹","기계학습 및 딥러닝","Computer Security","Computational Models of Cognition"],attendedLecture:"수강 강좌",major:"전기전자컴퓨터공학부"},experience:{experiences:[{name:"GIST Data Science Lab",isImportant:!0,color:"#b509ac",url:"https://sundong.kim/members/",job:"인턴",startedAt:"2024-01-02",endedAt:"2024-05-31",projects:[{name:"O2ARC 3.0",isImportant:!0,url:"https://o2arc.com/",startedAt:"2024-01",endedAt:"2024-05",description:"[ARC](https://github.com/fchollet/ARC) 문제의 사람 풀이 데이터 수집을 위한 툴 O2ARC의 3.0 버전을 개발했고 유지보수 했습니다. 개발과 데이터 분석 내용으로 demo 논문을 작성했고 IJCAI 2024에 투고했습니다.",whatIDid:["전체적인 프론트엔드 UI 및 그리드 조작 로직 개발","이벤트 관련 백엔드 API 개발","수집 데이터 품질 개선을 위한 UX 디자인 및 유저 데이터 수집"],techStacks:["React","TypeScript","Tailwind CSS","i18next","NestJS","Prisma"]},{name:"Introductory RL Study",isImportant:!1,url:"https://www.coursera.org/specializations/reinforcement-learning",startedAt:"2024-01",endedAt:"2024-02",description:"Coursera의 강화학습 스페셜리제이션을 통해 강화학습 기초를 공부했습니다.",whatIDid:["강화학습 기초 공부(~Q-Learning)"]}]},{name:"Sigor Inc.",isImportant:!0,color:"#FEAA17",url:"https://introduce.sigor.company/",job:"웹 개발자",startedAt:"2022-02-23",endedAt:"2023-12-22",projects:[{name:"도글리 프론트엔드",isImportant:!0,url:"https://doggly.co.kr/",startedAt:"2022-08",endedAt:"2023-03",description:"AI 기반으로 강아지 사이즈를 측정하는 강아지 의류 쇼핑몰인 도글리의 프론트엔드를 개발했습니다.",whatIDid:["쇼핑몰의 전체적인 프론트엔드 개발 및 유지보수","Android & iOS 웹뷰 앱 개발 및 결제 모듈 연동","퍼널 개선을 위한 A/B 테스팅"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI","i18next"]},{name:"러시아워 프론트엔드",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-05",endedAt:"2023-07",description:"지하철 빈 자리를 알려주는 서비스인 러시아워의 프론트엔드와 웹뷰 앱을 개발했습니다.",whatIDid:["러시아워 웹뷰용 프론트엔드 개발","러시아워 android & ios 웹뷰 앱 개발"],techStacks:["React","TypeScript","Jetpack Compose","SwiftUI"]},{name:"러시아워 앱",isImportant:!0,url:"https://introduce.rushhourkorea.com/",startedAt:"2023-07",endedAt:"2023-10",description:"러시아워의 플러터 버전 개발에 참여했습니다.",whatIDid:["러시아워 플러터 앱 개발","앱 유저 로그 기록"],techStacks:["Flutter","Firebase"]},{name:"러시아워 AI",isImportant:!0,startedAt:"2023-09",endedAt:"2023-12",description:"러시아워 AI 개발에 참여했습니다.",whatIDid:["지하철 혼잡도 예측 AI 개발","지하철 빈자리 예측 AI 개발"],techStacks:["Scikit-learn","Pandas"]},{name:"기타",isImportant:!0,startedAt:"2022-02",endedAt:"2023-12",description:"스타트업의 개발자로서 다양한 개발 업무를 수행했습니다.",whatIDid:["랜딩 페이지 및 관리자 페이지 개발","유저 로그 분석 및 통계","업무 자동화","생산성 향상을 위한 모노레포 통합"],techStacks:["React","TypeScript","Amplitude","AWS Lightsail","AWS Lambda","FastAPI","Pandas","mono-repo"]}]},{name:"GDSC-GIST",isImportant:!1,color:"#008cff",url:"https://gdsc.community.dev/gwangju-institute-of-science-and-technology/",job:"2nd Core, Tech Team",startedAt:"2022-05",endedAt:"2023-07",projects:[{name:"스터디",isImportant:!1,startedAt:"2022-11",endedAt:"2023-05",description:"GDSC에서 진행한 내부 개발 스터디입니다.",whatIDid:["React 스터디 리드","JS Pattern 스터디 참여"]},{name:"GIST Mini Solution Challenge",isImportant:!1,url:"https://gdsc.community.dev/events/details/developer-student-clubs-gwangju-institute-of-science-and-technology-presents-gist-mini-solution-challenge/",startedAt:"2023-04",endedAt:"2023-04",description:"GDSC-GIST가 직접 주최한 GIST 내 해커톤입니다. 총 60명이 참가하였습니다.",whatIDid:["해커톤 준비 & 정산"]}]},{name:"GPERI",isImportant:!1,color:"#4c568f",url:"https://sites.google.com/view/gperigist",job:"연구부원",startedAt:"2023-07",endedAt:"2024-3",projects:[{name:"C언어 교육 진행",isImportant:!1,startedAt:"2023-07",endedAt:"2023-08",description:"부원들에게 C언어 교육을 진행했습니다.",whatIDid:["C언어 교육 진행"],techStacks:["C"]},{name:"발사체 통신 개발",isImportant:!1,startedAt:"2023-07",endedAt:"2023-11",description:"발사체 통신 개발을 시도했지만 성공하지는 못했습니다.",whatIDid:["Flight Software 개발","통신 시스템 개발"],techStacks:["C","Zigbee"]}]}]},sideProject:{sideProjects:[{name:"2024 KPMG Ideathon: 🥉 3등",isImportant:!0,url:"https://github.com/gist-optima",startedAt:"2024-1",endedAt:"2024-2",description:"[삼정 KPMG 아이디어톤](https://kpmgkr.notion.site/kpmgkr/2024-KPMG-1fcd8a808f3d4f36a5ae8ad6e9bc413e)에 참여해 문서 작업에 VCS를 도입하고 LLM을 이용한 streamlined-ai-search를 구현한 플랫폼 Docuflow를 개발했습니다.",whatIDid:["프론트엔드 개발"],techStacks:["React","TypeScript","Tailwind CSS"]},{name:"Kaggle - Regression with a Mohs Hardness Dataset: 4등",isImportant:!0,url:"https://www.kaggle.com/competitions/playground-series-s3e25",startedAt:"2023-10",endedAt:"2023-12",description:"Kaggle의 광물 모스 경도 예측 대회에서 4등을 차지했습니다. 점수 공식이 MedAE인 점을 이용해 독특한 후처리 기법을 사용했습니다.",whatIDid:["ML 모델 개발"],techStacks:["Python","Scikit-learn","Pandas"]},{name:"2023 Creative Space G A.I. & IoT Makerthon: 🥈 2등",isImportant:!1,startedAt:"2023-10",endedAt:"2023-11",description:"메이커톤에서 GPT-4 API와 라즈베리파이를 결합해 일상 대화에서 의미를 추론하고 스위치, 스피커 등 IoT 기기를 조작하는 AI 비서를 개발했습니다.",whatIDid:["OpenAI API 연동","기획 및 발표자료 준비"],techStacks:["Python"]},{name:"2023 Net Challenge: 🥈 은상",isImportant:!0,url:"https://github.com/Net-Challenge-InfoTeam",startedAt:"2023-06",endedAt:"2023-12",description:"2023 Net Chanllenge에 참여했습니다. CCTV 데이터를 AI로 분석해 실시간으로 위협을 감지하고, 위협이 감지되면 주변 유저들에게 알림을 보내는 서비스를 개발했습니다.",whatIDid:["React와 PWA를 사용한 앱 개발","Mapbox를 사용해 실시간 위협 위치 표시"],techStacks:["React","TypeScript","Mapbox","PWA"]},{name:"React-Atoms: React Component Library",isImportant:!0,url:"https://github.com/dohyun-ko/react-atoms",startedAt:"2023-07",endedAt:"2023-07",description:"개인적으로 자주 사용하는 React 컴포넌트를 모아 npm에 배포한 라이브러리입니다.",whatIDid:["React 컴포넌트 개발","Storybook을 사용한 컴포넌트 문서화","npm 배포"],techStacks:["React","TypeScript","RollUp","Storybook","npm"]},{name:"Dutch: OOP Final Project",isImportant:!1,url:"https://github.com/dohyun-ko/dutch-wasm",startedAt:"2023-04",endedAt:"2023-06",description:"프론트엔드와 백엔드 모두 C++로만 작성된 더치페이 플랫폼입니다. GIST 객체 지향 프로그래밍 수업 기말 과제로 제출했습니다.",whatIDid:["C++과 웹 어셈블리를 사용한 프론트엔드 UI 개발","State, Navigator 등 프론트엔드 로직 개발"],techStacks:["C++","WebAssembly","Emscripten"]},{name:"Speaking Melona: 편의점 음식이 서로 대화를 해요",isImportant:!1,url:"https://melona.chat",startedAt:"2024-05",endedAt:"2024-05",description:"편의점 음식별로 페르소나를 설정하고 바코드를 스캔하면 서로 간의 대화를 생성해주는 서비스입니다.",whatIDid:["프론트엔드 개발","백엔드 개발","프롬프팅"],techStacks:["React","TypeScript","FastAPI","PostgreSQL"]}]},skill:{skills:[{name:"React",level:5},{name:"TypeScript",level:4},{name:"JavaScript",level:4},{name:"HTML/CSS",level:4},{name:"Python",level:3},{name:"NestJS",level:2},{name:"FastAPI",level:2},{name:"Flutter",level:2},{name:"C++",level:2},{name:"Kotlin",level:1},{name:"Docker",level:1},{name:"Rust",level:1},{name:"Assembly",level:1}]}},Q3=Object.freeze(Object.defineProperty({__proto__:null,main:W3},Symbol.toStringTag,{value:"Module"})),K3={"ko-KR":{...Q3},"en-US":{...b3}};Jt.use(F3).use(ek).init({resources:K3,fallbackLng:{default:["en-US"],"ko-KR":["ko-KR"],ko:["ko-KR"]},interpolation:{escapeValue:!1},ns:["main"],defaultNS:"main"});var Lh={},ik={exports:{}},zn={},ok={exports:{}},lk={};/** * @license React * scheduler.production.min.js * diff --git a/build/index.html b/build/index.html index e7ecdb4..8847edf 100644 --- a/build/index.html +++ b/build/index.html @@ -94,7 +94,7 @@ region: "eu", }); - + diff --git a/src/locales/en-US/index.ts b/src/locales/en-US/index.ts index cad6093..c81cb9d 100644 --- a/src/locales/en-US/index.ts +++ b/src/locales/en-US/index.ts @@ -344,7 +344,7 @@ export const main = { }, { name: "React-Atoms: React Component Library", - isImportant: false, + isImportant: true, url: "https://github.com/dohyun-ko/react-atoms", startedAt: "2023-07", endedAt: "2023-07", diff --git a/src/locales/ko-KR/index.ts b/src/locales/ko-KR/index.ts index 886a5f4..6bbe079 100644 --- a/src/locales/ko-KR/index.ts +++ b/src/locales/ko-KR/index.ts @@ -333,7 +333,7 @@ export const main = { }, { name: "React-Atoms: React Component Library", - isImportant: false, + isImportant: true, url: "https://github.com/dohyun-ko/react-atoms", startedAt: "2023-07", endedAt: "2023-07",