diff --git a/day03/index.js b/day03/index.js new file mode 100644 index 0000000..0519b08 --- /dev/null +++ b/day03/index.js @@ -0,0 +1,33 @@ +import { readFileSync } from "fs"; + +const input = readFileSync("rucksack.txt", "utf-8"); + +const priorities = {}; + +for(let i = 0; i < 26; i++) { + priorities[String.fromCharCode(97 + i)] = i + 1; + priorities[String.fromCharCode(65 + i)] = 26 + i + 1; +} + +let prioritySum = 0; + +input.split('\n').forEach(rucksack => { + let len = rucksack.length / 2; + const compartment = []; + compartment[0] = rucksack.substring(0, len); + compartment[1] = rucksack.substring(len, rucksack.length); + + let charFound = false; + + for(let i = 0; i < len; i++) { + for(let j = 0; j < len; j++) { + if(compartment[0].charAt(i) === compartment[1].charAt(j) && !charFound) { + prioritySum += priorities[compartment[0].charAt(i)]; + charFound = true; + break; + } + } + } + + console.log(prioritySum); +}); \ No newline at end of file diff --git a/day03/rucksack.txt b/day03/rucksack.txt new file mode 100644 index 0000000..8f2c7b2 --- /dev/null +++ b/day03/rucksack.txt @@ -0,0 +1,300 @@ +WwcsbsWwspmFTGVV +RHtMDHdSMnDBGMSDvnvDjtmpTpjTFggpmjmTFggTjmpP +vtCSGRMBDzHddvBHBzRhrlcZhlLzWNlqblhzcr +shhszHNHHZWqSzVNdClMjlFjBBbNTB +tQQGmnrMnJnGfmvrRRPCjlbljFBdjFCjTjnP +mRwtfGrMmJtwRDvQJQrJpMLSzVDHzhzHZqZzqSzcWVWH +WsWWgrtgsrhTQtsFcWPcRMCCTvqvMvqNNqMMHlMq +bBJrBGbzzLJznJrbSDGGJLqmlvqMqvlmLHRqRZZRNZ +bzJfDGVSzVrJGwjVGPPpQthdPsPpjdphsc +pJpCCBSWlczWWBWMHdMmMsFmpddrgF +wfVqZZGVQvzsMqmMgHjm +vDZGvPttQTVtGDQDDDGwbSCcSJSCJWTcRRSRczRJ +HLVHsVWLwbWswbpWFWrrmThfTPNnhNSDDNhDfznTnhnS +pBRcvGvvBtpGcqqQvgcphPfzfDGhzdzPDzDDhnhS +ZQRvqBptjJgZCtJqqMMMLHWwMWZWHHFFHm +PvPFPvLLLSvNFvQNWNPvrPLrZjwhMttTwtTtQZBwqjqtZqwM +HJDDbHjgppzCDCmzpgzsGbCsTMZqZllqhJBhMTtVBBhMtMth +zgGncmGGzHCnHDpDgDCGsmFLLPFjPRRWLRjdcjrcdRLd +zHnWzntnBRWTSBzRBddpFvZVcHpLFvjvLppvHP +MmmWmNGQhbCpZVLLbccvpj +QDMCGrNWfwNznBJsJzDBdg +tcRcZccZmdZJctRcjrlhNNDfrdNdSfNsNT +QHQpBVvMpRMwgBgvnHRFlhrSsgNFThgTFFflNS +vvHpVBBBGBppHvpLvHGbjmmtCqWLJJZRzZZZZb +ZBtTDZRWsTsDZVWVZDmjpbLbpSSzmLpWrbrS +MFNNFvvwFHwlhmNrCStLNtjzrb +vwffwcHwflGqGflHJfDBBZtQVBgZQJtBBsnT +pTJcmMJTspmpMZZJJZHCQQMzPBlQdWWWFzWP +LDnwrdnDnqjfqgvfDjrfFlBBPFHFSHPQCBvQSSWB +nLbjgLjdbrwVRcppsscJVRRR +mHnfggmMtpHPPBCs +PJjlQQRrJhJNPPTtBsCbCCTlpptd +rSSDhNQwShRRjhmMPmzMDfPmfLzL +HzLFBgrCthtFrrhFSCCCvBQNRVmJJJmnpnddmppddVtJ +MPZsjDWPjZsVzNTzpVdRdZ +qMfjWfwclsPsjwzqHgLFhwGFwHrFFrSC +llllmSbhNmSbNzlPmRNCcgLLchHHpTGsCTQGpT +dVjBrvBBVLJQsLpC +frZBWBDMFndStFsSwzlPlq +vmTVVtmJHwCwDllttTsrcPcMrfqPMMpjMq +LQGBRgGGRNgGgBhgzHfpjPqsMjpLcLjrPLpq +BdgzgSRGBnNHJtJlVStVmt +FbDQsFjPVHFZFSbrVjSVvMJlGBJhDcqBBllJGccJnh +RfTCTTpmppfgwCpwpLwRMnMGMlcPGqhddPcJnl +zgLPLNCCpLggzmTzTWmVrjVvrNvjjjvbVHQZZH +RBjjpwmRszBdvhLdSvpVpV +GrbfbJWmQJGWrGZZQMbSLggfCgSHhCSgShghSC +DWNDZQcrbWQrZJZGQQZPsztzBsPmBTzwcwRwjT +rlvgglvZqbrbWbWWdvdmPHBBNMNJGqjGRRnHnPBJ +cDFDcfcCDhLzsCfLDVpGPRJMPsRJMPNRnjHHGJ +DCfMVDFVScVMVQlgmZgdmWQQmS +nWTWWgwNgGDdBZBVcvDzzJccVlCzHD +RLppMMLpRqfMtMjtMCHJFSpzHSvSpczJdl +RdLRbQRjsRMrMRRMfbQLqPjbmnQgQWWwZmggnNTgnnWwhBhn +TmzjMjrmjmjBmHLvGPpbvWGqJzJJ +CfScwNDssDVCccdNVcNDQfbqJLqSLPpJpJJvJPpGTWJb +nddCQTfQVVrHmjMnrMFM +WHDnTwvwcwZmWwQTnBtgbVLLbgfSlTfrfb +CPPGdJRzNhNpzPJtMgBLbgtlLLfLMz +GJptpdFRhJwDmFHDjvnD +PNcWDNnNDcLjDDcSRWtQFfzzzQgPgsssZtPZ +MGhJRJGGrlpVGVHVCqqGqBQvzFzFfBvZvvtZtvFzvZvQ +JmJplCrlMNdmjbNbWR +pqpqFJPPSswJshNghg +zTHHrrbLzDQHccfhqmDshgCwfmqm +rtqqtTTHtzGLPWBdnGBSWGSS +gmNvgVqjjqzfMRgrRtPcft +WswSQwWWHGCsHQhlGGLLJRbLMRfRGcMb +dQCRCWhhwCwFwQshhRTmmBmFjFTTVNpqTnTj +FZvqSWqjjZvvrNSvbblcbslDppDHbcsS +MmwLTwPmBwmLJJmLlWzWnDllHcHzcDHM +QRwtQtLTwwQBTPfFfZdFvqqrFGWjrh +MqlnnNvJJZnNNdJZZLvLJnMzjjCTCChgWjccWqcjhcgcWR +tbddSHDBbHgHhHTCjh +mffBfbpsFSdQQDbQsrlJvwJNLLJMrrlsJr +RjqbNRRbDDqHndbcHDqdRHcChsffCQJJssZGpzpCpJphJd +VrMmSbrWVMtMtLmQGCfZWJZCfpZfJW +PgSPgTvSSHjjBbvbvq +whclNQQfcCFCcrJRjmmHNWsmLs +PPzMbqBPLVtnTppPTPzHJrGWJRRvsjjjRHssRb +PtgPVZTtTLMtBzqPqttPVMClcdDcgCCfCQDSdSgCwlhh +DrcrsvcNtLWSFPSFszbM +HqTdHJdQhGJBHQHWWDTnnPzbMMzPnS +hdwfqdhQJfjlccrfvNDLfl +BBPCWvjvTLrHTHHPCTndfwhbdnnZZfDhJwfJVb +msmgNMMcgmgczlmmgQNlddpVDDZpZpDfhZfJwsJF +mmQmMgSgzmqSRllGmgjPHrvvwHttjLrLRWWB +RwvDvhjhMvwlFNwNwCWCCWWLZcbGGZLGJVrppbZVcjmpmJ +tfnfsStnPPfTfgnPSSzPflJZZZrlZJVzLLmZJrzVmG +nPHqgfsHQnffqgSTldHTPnPHWMRFFqqFhNNNCwNCFMMhDMhh +FmwFHmnlGJfnlSlmrfsSvWgZNWNvLvtqLqDJhWJD +BVVTTMqRWvRZRbhW +pMBPCzVPQcQsGqSFmPFwSF +TcpTpwqZqMpZqlZCpZlwDjjcPNdgdPjHHHdvhHQgvv +zQFBRbmsQbLLBnGBvFdPghddNgHjNSSj +QnszWVzLfsLGbnGQbwpVtMrwZTqpCqpppr +WrZmrJcGwZdGZZmHdJcwGWcZsdFFLqTtLVtSTLtvvLtLLqSs +fnpCCQClfpQlzbbpQpflBpjhLVSTvFhjqtstVsjtstFVMs +QBQRnbCRpnPngnbggCzzRClZwJHFHDwZJPJGWHwmNGHPZr +fDhjvftQtDwgPhdRcRRP +bbNSgllVNMCWVnbWmcdFdmmFdpFpRrPPPw +NBzBglNzBvvGZDJQ +rGbbtStjSdbGtDpjjJbbRRbdrcCsCCrFqhllrFHsFsCvqCWH +TzgMMgmTVgzzTMLLfMHvTFsFCqHTvFsTvshF +gLMPBgQmQmNzVZLPzPppjbRhhddGBGSttbpR +zMJTpMzpVczHbCzVJVFCpJPngnBqVZqsRZZPnjqRgmjR +wttwNdfLQwLhwhhDDhWvgRmnPqsQqjnBPSZRgjPS +DdLwGGvNvhlvrrMFlFTcZrpC +llBQWMScQlSSBjMrvrrPpFHFBDFDFJTmTtFFmF +nzZzfVgzCNtnJppDHPnPpp +LdRNfVdzbzCCjcvllMcsbtjj +pWFwpFhprTnFfWwZrsBDmsqBvZvjjv +VbcHCthtzQtNqBsvsZvQmQsj +cltzzVcJSMtRWdhJLhRwdh +lmmmLRdZnjBlGgVhNSVvRMWN +bDwCqCGPbwpPwDPPpCpqpPbScvMSMSDWgVcSShNNVfgWWv +bTpzqJHPFFJqbTHswLlGlBntGnjQtGBZTT +pVjVlDDhmRPlHlHPWzWVWrVrcWztVdzv +GCqGGGJSFbnLJLLfrLfPrLdgrrgfWd +PbJSQGSsGnbMbqSFGBMMbsGTNwpTRwppDRsjwlNpsmHwDl +GcnPbbbLqDPDBPPDlQ +JtTChNfRpNJMTCfMTlJVsdVHvDddHBVmQm +TzlffWNfjTfjjCjfTtRrLgbnbbnSSwbnLzZZzr +hggWzjLhzhLhjzVWgpCpTFFHtCJFTJTHHHdG +lvSBvNNSNSSmlbwmMJCGtJQCHmdT +cfSlSSlvBDBPnlPPDZLsgtggZZVVfhzRgV +gGVJGvVVZZLvQLWQppccpctpNptMhnhSjjnM +fzQBsBzmwPzdQrRbSFNFnsSDchjnFhMN +bCwQRbbCJvlGCHgL +NMgdHVSqgQcVHmlllLDjlCLdjL +whTRJtJTnthWBlLLLmlFtVmV +wRhnGTpzzTRnVbzzWWbJwbhNQrZHfpNgMQpfZQHHNZZHHQ +qNNlMdbNrlVsQQfswQNCmW +LJzBvSdLSHpDJzzzHJnHnzFQCCmmswmfwBGhsQfWfCwW +HzSvHppDDRvgHzzcnqTrTtllZdRrbRVVZZ +TWVVVFVPpjVFtRfPBmmzMMPCvmLm +hDDrwndQQbbhZDMSMvcflMLmfnBL +grdggqsbrhdJJJrhbwbbsZGHVNHtTWpVBFVTTTVTHtNg +tLbvnTCzCVnzzwVTJVlwltMFvQFQRFFrQPBFdNgrMBNF +pShsqqmGjZfZccsqSfbdNBMMRQGBPgMdPMPF +HhspDpjhSjbcSmcqhZDcZZjTttLVwlTJJVWtnWVlWHCltL +DwQBvwBnBrSVRrZM +JWWGRssgRsFgzsFPJrNHVMHrlVrPSMNjHH +gspgFzRCFWLJpgqqRWgqpCJwnQCnhQvwcTdcdddnwbDfhf +fMMCwFDGNNMTdTDLlVlZZmdZBdBtVr +jjpjtbpRcPvSPnPnpPnvPPPnbZlmrWmLWHmHBWHlrmrmlZWl +jqjjnPqngtQfGFftFq +qnzhhbzzqGgsqGtnwcJrlCMlCjvcCCcrCRrvCv +mVSNZdTQdVVWmVFHQrpCjpjDRvjMRjdLRt +WBHZTHHTFWWNNBNHQTZPsPggghfgsnsgsffthszJ +sDwpdMgvHrZgwbdggzZZgPhFNFFcjPPqhLhjMlPqLq +JffJfnJGtBtCQQRBJZTQJJGfcNjqCLcFhFWCPLjhFLPjcPhl +VZZVmtGQQZmHrwgddppb +NNNlpjbVpGglNbvpTwBQQvfWvfBrWvBW +JthDJsLhhHPcGcqPshJsshSBwCWwfWSLCfSfSSRBrfWB +dhDtZqGmctZDtZHqDGVgVgNbbbFjndMFNlFg +jqDVzzDMdDwsVQLCZVCRWLGBQC +bbHFbSSpFbFHJHStJNbtJprZlCGLQsLGZRBLRQLQpLBClZ +SmFmTPJvFTNbmmsMdqqjscwz +RqMbHGJRJpgJgGgQjgrLTrTzjcrTrrLg +lwfwdhnflPlbCsVVjhCSbV +fwnNtwmlFZpbFZtM +QNSQrLTNrLNQRRrfHFrSjqhblWtSltqlWqtWWl +DvgBgnzgcvVZMljv +DGJdjBPDngDnDjBpBmFpTRmRFLRRmmCmHH +dtgSdTqdlvdJJvFqTvSqJqqRMPBtLHPBnWbsbWbsbWtWtWHV +DjfCfmcpNrwZQCmmNrDZNZNpsHLHWBBbHVVcGGGbHGBbMVMB +fpNjCfzLNZjTllvzdSgFgJ +nHBfZmHTRwsZffjBnHfmRZHtLtdNPPlWvddWLWJlJldCldLC +zwrbphMMVFzMwdCWNPlCbPdDCD +hccMSpqShMSrhZTBwmTqHjqZmf +NJGGLwGsTSsNlJZhmtgCVlbWQWlQMtCbvb +pDjppDBRdjzqpHqDSDzjVMCCrCrWtgQWdtdQQCdb +fHpfRBPRzDpBFSqcSBRBSNhPNwwNNswJLhmmLNGJZL +RZbsPgnVDzTJcdGjDGmD +NwfQHQtpfppQhjVVjqVNJJTN +tLLtwSptVCSWpvVtRnrbWbMgFPMsgZss +VsQjSwwVSwsZzsvdscZvfrhPRpqBrBrbpzMrrTMh +JtNDTmtGJTmLCGFDCHtDhMMBRhqqRbPrfrbNRrbR +GDWLlDnFgZdTSTWv +gfQHRRpQgRqNSBtjqwjztzjtnL +FvsPgvDlFcmvmTLlBMVztnLwWLzL +cvZGDcvbPcmbTbrcDDPgvbTJdJfJHRhZSRSpRRfHdSpSZd +FGHHHWvBWrHHrWVZJvVtcSrtrTcrtcjMTjStSM +swpwfRhRmmmRQDzcJlcqMSMMqtbMTz +dQDRDDRQfmmQDNsLfwRJvZJWFWVnPWvvPddBnC +zVhHvhMVTnMJgcTzMcfGJtfBWRtBRqJWtqJb +hlZjZSQCZtfBbGjqbb +SQDNwplrDVnhDcVHgT +HHZmttZVLVMQQJwMfcDRfDbbMN +phWvTgBqqgBWsTPTzhWzhzfNGNNwfqfcDwJRRbNcJcbl +FnTsvnhppTPFTBpPzPvpBBpFVmtfCjfmjtCmFdStLmtdfjSd +hMTPPMNlLZNSGNbRBB +gjmrsrttsCnsCsttVsjvttvtZGFHdbZGWWWdZSWddBHHnSWH +BmvptjsrfjBgsvvfgmfQchMpMqqhcQPMMPMhLQ +dJHGnrJJpGpDpFzzDmfsfSSCbfTfMbbRDb +vLcwtWNgtVtSNWmTmTMCmhNhTRfM +jqVgqVvWwwLwwgqZgjVSrPGzHHHqFnrHnFGHJGdr +QcQcdgbzwJnzfgVnVwdHQbdBrrpplHvmhLjrlTphppLrjl +MsPssfSZMWGWqWssSNPqrmmLBvjhqTvhjBprhB +GRDDZMFNMGFCSNWFPDMMFWNnwVtdVdQfcgtddwQwzRJfQd +pMqCMBGpMMCnwnpBMGBlbVRFJFWsJzRdzHlWzzJdJsJd +jLLZjDgPbNPZTDbvftvZgzRFsRzRrRRHWFsJsFJc +TZZLDPjtmDmbqQGwQnVM +RjnNhBnnNNmJmBNhrqGpsHbHtstgTtTjqb +WVMfWwQTzWZDMtlsfldqpplstf +WVTWSTzwQWSSvQVZCQPTSZPvBcnmcvnrhmNcRFncNLRLJmnB +lffQcnNTQBBcwqsdcqjSspcWtD +MPMGrHGMMTqWTtDg +VGRGLrJHZzLHPzTNTmmBfZQFTNBQ +lQBPPrBrlnqBgSRhgZZZrLJr +VNcWMDZbJHhWfWff +VwvMwMvdwvdwjcwdwDDqsqsZQqPPzqzldPQtps +VVJcZJVrRSdcsddfsvvbvFZBnngBMzMZFD +hLLqLpqqWWphWjhlGlCHDFgzbvFBbgBFtnQpnngg +HlhlmmHBTqTHHmlLqjTGhHhPdwdmsdcSNSfNJRrRcfwVJdrr +HmhvmRzzHHrRMBJBjNJGDJRnJD +cbqcPqLWZwsgQWZwWPwWgPPbntJnrNftNNNBtNJJNDBNqdjB +lgwWgggQcWSzrlTHMHlp +FZhQpClCWLBlrNDZvrwrrNSH +ztTfjMjJjgsGrqvzDGwG +bMjfnjndjnJtfgMTwPjFhQhCLdQCFWQQLWQhch +PtrqPrrMCPChzCtLFRbtNgbdTjbF +GdZGvJSWWDGplFjbjLjLSTlL +vspvnZsVppBdBnBpDCszhzMsMzzPzPhcPC +PdCtdfCMfGmtfmtBSWrMQwSlwWwJNQ +qTqbcjqHTZTbcDqczTjjZvWrQvVWJQSVQZZSVVrJNr +qbqjRFTcHTcDFgcczRqFrPsGGGgnhtGssCdnffGmsP +vVbcMvqjjjmHCBCBBmBSSH +PzzLTrcrwQgfLGrJBHSGFSCHtRFBJt +cfsPrLDwQNgsrTNTQgLwVpWnVWvMNvqjjqvpMvlj +jbqZNjLbZQvcfhhQ +CWdCDWWMCgmJDnJmdQVzMSchvfcQVFShzf +WPgWGRWRHdPBsttrHvNtrl +MCJCCMCqcCqJsnssjQRlTvQQQQqTvqfQ +HGVmwmLVlZRzcGZG +FcchHmDFpFbDMDMbntsJ +vfNvvttvDRcrvRNRNTLDNRcVsFhwVBVTwbbFFVbVhbJMBB +CJGgSJHdgPPSnQnjnddHGGFMSMwMMsmsFMMFhFShMWMM +dGCdjgzHCPPGlHDDqJtqRcqJlpfR +CwtqqvwLwnwhtRLtdRnwnnRhPHpLLppTPPpTVfTHzJWVLTWB +sGDsZDllDrMFZVmGgsmDMlmHpJBHpcJFPPTHfJJPzfTHWz +srgVlGSgZVGGrRvwQwdqwtCvnS +MLPgDrgLzThhCTgg +GVfCbvVbVvhBHlmhvhHv +ZqRQffRwtNZWVZfZSMsSssncnDCDnL +VwBNhNNmhJswqjJsRzPgDvSgJvtgvgDt +rRMblbHFfRrSWvPPPgMzLW +ZFpFpCcprGfbrGfGCHclZfnGqmsjmBdNVjQqRBnqBsVNQwBh +VLQlZWQbcPgcPmWbgmDWLQzdpGMTTqdpMTNsbGsNpMSqdq +HChrwfffhJtfHwJTsDqThhDMpTGsjj +HvffCrtBzclQZvQD +dCBVJJmrJDlBdQJWZTTsWbdWThWpbM +FHjSPjwqwssSgqTMGbGWhTMHMMZG +FwLvLfLjjSPqFqgzwffFSvrlDJvrQrDVrnmBvrJsQm +hZCRbddrgrRSVgcGZjjLFGLZFQFp +nzPvMsPvtmvPNssPMqpcWVjGGcGLlqGcGN +TBzmTmzmVmrBSBRrRgdR +bwZZmwfFmcfCRswNWNBsjC +VDSdglSStRCCTNCD +VVVppGHGlrQnnGJbMmnmCh +nFhgnFVNtgtFVssgdgVtVtsqJPTNJvDSNqTZZzbzTDDzDq +HqLHqcwlBjLzPvPJCCvJ +HGrlHqlllHBppRrlwWFnnWfFFVhMnnWdFhfn +FsMFVszjggMMzWlPJlPPlLQsJv +nqnBSNlfZqSvLHnHvWLQTW +hShpfCCSRtfjgFjMzdjlpr +jsbDsQnnwPsFbZgSltWGdgJgpnSp +SCVvLhLRrzCNBhrCvddMJpWdWGvJGlgtpv +cHLBBVCcCNHrbcSQFwQTbDws +rMlbLgrRgpwTDbflcnHtSScwHdJdwHJB +CQCjjZPzGGzCzZQvBVBNdQNSJVcJ +jsPhCzhPqFZzZzChFlsbRRLrMfTbbcLTpD +dqjzmmmQBjBHCmWrgVGWrrrvrpgVpM +PLJnTFbJnhTDzrGgMlvrFMzF +SssPcDttntDSsLcCzHBmmwcmZQqH +fFfFSPHllPRpRfnmmFfHvHjgbsBQjsptBdBTTddjsDdt +ZqLJCLCZzzTgWjdzDjzb +ZhNLMrNcGrchLqcCVMqRvlSnFnRnmmGRggnPnP +HMCMCMrHfwMHtFwTtgHHbVjjbsRZDwDVRbZqjhBD +cDpmpdpNLNDcdZjZqZBNBqssRR +SLJSdPcznSvdvDcHFCftFTFWCTHnWt +NlMmlPClmdGldRZHJs +tgJJcJQcntHBsnBt +TfSgQhhccczSVQqrgSgTjFWqLWmwLFNJLWWPPwqM +GGwTHqWVdnTTVVqgngzzqHzGFbJspFccRsjDpDcjsRFDsdjR +rtLflllZSrhQPLBtQStZvhjDNjbcDNDRNFjCsCDCFs +mPLBQPtvtQZtBlLSmMqVGwHbVMqTHWmz +VvJCrqTvPvQrCpRNVRFGfZfmfG +HMzsdWsjhZSsJJZNZf +wHlbjnlzWCvqJBQlrD +FnVRRsVdSnSnFSRqTVdqBBDBhrDdmcddMcMQMhzm +HtZvJwHlgjlGlHJLNjJrMmrcmDQfDLczDrMhhh +vGGpJjttvlZljZllZvJZvwGqsSTRWSCpnCWTVPVmWWTWWn +wSHCNwwmcSMLSDFcwwSSHQvZnQjLZffZjZZbVZjVVb +JqsNJJGGqprJNtpWhGhspfnffTnTvZvVbZnTrfBQvV +GsWhdGtPWpghJRqhtNPmClczSlDglHMlczmwCH +TzRpjVRjFpVLTTdgrTgrGsZwrZZwgg +vQfSBdbDbMbQNBJrlhmGnrgrgwZhvm +SHSCbdbddcVWqqFPCLqR \ No newline at end of file