diff --git a/deno.json b/deno.json index f9ee3b0..e6a95e9 100644 --- a/deno.json +++ b/deno.json @@ -27,5 +27,6 @@ "tasks": { "Day01": "cd ./src/01_Calories && deno run --allow-read=./input.txt Calories.ts", "Day02": "cd ./src/02_RockPaperScissors && deno run --allow-read=./input.txt RockPaperScissors.ts", + "Day03": "cd ./src/03_RucksackReorganization && deno run --allow-read=./input.txt RucksackReorganization.ts" } } diff --git a/src/03_RucksackReorganization/RucksackReorganization.ts b/src/03_RucksackReorganization/RucksackReorganization.ts new file mode 100644 index 0000000..a957f7f --- /dev/null +++ b/src/03_RucksackReorganization/RucksackReorganization.ts @@ -0,0 +1,47 @@ +const input = Deno.readTextFileSync('./input.txt').split('\n'); + +function getPrio(item: string): number { + const itemVal = item.codePointAt(0)!; + // Split upper and lowercase + // lowercase + if (itemVal > 90) return itemVal - 96; + // uppercase + return itemVal - 38; +} + +function findDup(left: Set, ...right: Set[]): string { + for (const char of left) { + if (right.every((rucksack) => rucksack.has(char))) return char; + } + // This should never happen + return ''; +} + +// Part 1 +let score = 0; +for (const line of input) { + if (line === '') continue; + const halfLength = line.length / 2; + const left = new Set(line.slice(0, halfLength)); + const right = new Set(line.slice(halfLength)); + const char = findDup(left, right); + score += getPrio(char); +} + +console.log('P1 Sum of priorities:\t', score); + +// Part 2 +score = 0; +let index = 0; +// skip last empty line +const length = input.length - 1; +while (index < length) { + const bp1 = new Set(input[index]); + const bp2 = new Set(input[index + 1]); + const bp3 = new Set(input[index + 2]); + const char = findDup(bp1, bp2, bp3); + score += getPrio(char); + index += 3; +} + +console.log('P2 Sum of priorities:\t', score); diff --git a/src/03_RucksackReorganization/input.txt b/src/03_RucksackReorganization/input.txt new file mode 100644 index 0000000..1524f4b --- /dev/null +++ b/src/03_RucksackReorganization/input.txt @@ -0,0 +1,300 @@ +ZTmtZvZLTFNLMQMNRvZncdcHwcScJvcdHnVfwV +zqjqrzqjCqrjtqWhqChqrznhcfdfVnVSVgcffcgJcSgd +rtDGpzjjqjlrGsWqBWFRsbTPFQMTbRNRFmbs +FFlnlnVlmQqcBVhBRrSrGSwVdRJbztSt +NPPNsffWfNztRZSJNG +WpgpTTHDpgTDDpMLPGgMHslmBmmHcBQnFmcqhmnjlqQm +VlVNLlPQhtnDRPnP +QgqTffzZqgvgzWmqqZmGcDthtRFvnnFnhJtJJDDt +WGTBzSqBQTQmZBWHswpNbswLbSNCNl +PFzFQDdLjMzzQDhnDNmwZmqwRsmRRmMVNM +GtSbbtlttvvtBvtHBmqqNqVVwsVgCmRw +brlvctHfrlrqvGvcTpjDdFnLDhdfjLhQpn +fTqzgFrcmzTrTNgMzFzTrgtbMtVMVPSLVbvSStRttPVV +lsHnlQhplQpsHhlDJsswNwZPZZVNwvnSZSVvVS +BJpsGWhWQQHdGHlpWpfgrmqgNBmTTBqzTrzr +PLPPrDNHDBnrWNBmjDmjbqqgzjgjQC +GJpFwpvFFsJpwvwwGwJZJRptzdQSSZTmCjTQmTSQjjZSggQQ +ffwGGtJGCfLcNMNNfNLW +nlTzllGwlQHHGMSrrhQLcvbcghgcvL +fFNpttBRFFRNtJJnfNWmqbhhZrZrcjgpvLrvrvcvbr +JBftFFsVRWtNWRsmWtRfftGHGPDDCnTDHSCwzwVnwGSw +LsrZLbLmPSTZtPcc +zpnpljpdwhRpfNLlPWPtTPcnMWPcctTV +qlhNNjldqdpgqdfhjpphdsgmmrDBBJJQgHrmDHLQJb +ndDrsBbpqspHCjzVBCHjMj +LWFcQFQtVVdcCMHC +RLthwTWLTSLwTllRLLlLNlPpPGfrGnqDdGqsZqsZsZhb +jHnJLJrcBbrRHJpnLBBjdHbjfgvGwstwWwdsWWshfhFzFfhv +PZDQMNTMQwtgvGTGhf +lqlPPQZQVSQCPSCPDmLppjqRqHngLHjRgLnL +MfQrhdzNMfMPsNNmPmqPLCLCVLBnbP +WVtcVvJJVjvFZZmgGjnjLBjmnnHB +FFtcZRpWJcSDTwlVMhMDwrrDzM +bSMbrQGZwwqbrbGMdTQGMwQdfFBLDLHLHssDgsHHBJDsFfwL +lpPPCccvVPvccPzcWLDJFJBsBzJJHsqHjg +tnqlPlVlNvNZZSSrGGZb +NlBBBBBwmwcMgLwLVVLLLscHdnMDdbHJCbdvJbPdDDJHvn +ZRWQWSfGhtSjqZhffZhhRjtdvPFHvCJbFdCFFDdHJdPb +fpqGhQWWZRhfqRSqrpGllLcVLmscgrLwBmgCzN +wHHHwDNCzZwzZfpzwsswzfzvnvnMDMgMhMGGFGRVdMnvcF +mLtttqTPBtSJTSBQWlmcMvVdclnvhFggdGhRdn +QBLPSLQQWmLtTBtBSjZfsbwbHzpjGzHfpzzw +zDPBqBPqwzzsqlTzzPzqjttNbCPJVtPCbrvjvCZP +MFhMhGfFfGpWWpHhFfRpHjVNbDbJjVMjrVvVNtMtbt +gfRSmpggSFRgfGRphFGgfgBSBTqzSsdlTLqdsnsDBqLw +QTTdWZZZTrhCZrjhVt +SBJJNRRvvRpwwspNSpTPjCMVhhtCjGThjBjB +fJJpvRRwNRSwvzRzRvzSgSRNqFTFDbFmqncQTbdFfnbDQnLW +wSjwwjWhbhhjWjdqSVpqSndvMdmM +NTvPBrZgPPHDFrFHGvZHRBqVBpCQVRRdmpRppdqM +TgDHZPsNTWbbwsjtvw +HVRPRwJVppQNpGmvMvmqqq +WcttbWsWsdDdbFDSSWclZGvFLMvfvjfzNvLGzLmfqv +tglcmSldWlBQBThRQBhg +LDGGfPFLGsfFnGLfMzfJVccNzmcmwm +qggSRgtjgCRtdtNZCJMCcZwTZVcm +RBbHbbRRnLBDDrvN +pThhMtMtTsWspWTnGjpsVHPdjdjvHdgVvLDVVSjd +JQNrrwCFrSRLRVLnSN +JQcJFCfcnfQmrbblQqlthGqzpZpGTBMWTMqtst +DzVmzDDgsNdHHLGJhJppPPllqSgbql +jrBWjcQMCRchPShwSblpbW +ZjRrSCtnnrtBQTcrSZmGtGFFNDHmHVVmVtzz +GSbGbrTGRRScMlVFjfbqqjdF +tvDmZhtNtHDttBhCmHDJHNwlpjslMwfflvpqldsFpMlf +HdBhLDhJDLWWLDCSQGcrQPGccLTGcQ +tNzrCdJBrrtQdtgQdlQQtrnMZhMTqzHqqTFZZFqTHFMV +bwbsRDvfwfsfcfSFqMmqDqFVNMNVVH +PRvfbSjNvPWPlLllLJ +MjMRRNRMjZtGVGpBCMMCDV +vwfhFzhvcJQQwJlQSddzQwFWGqcDpCDqBqDTcGZTTVTCWG +dvFJzrfZJhddLNLPHsrtRbPr +BmbsFNBhszGgGtGl +MSHVwdSwZflGlcqqpM +QvwZCnnnSvZdCSWrNmDlPPBPDhPmjW +MDwpRzRwMzMsdVSjdMWWMQdW +gmlftnDtHnHHVWSWBjWjWgvW +HbtrhbbGRNDpbCDz +cjVGqQqVqBFhDtvB +ZnTTfTffZZmDhBtJZG +fNzbpzlHTlgHNzlRTlRNbHrWwrCwWSSdQddNjwVcjGSd +WWrPMhwhnjpSLCpDlSSW +sNGBGdmTbZNGsmbstNLZGZDBRSlqSRCfRSCqRRDDqCqp +NvvcGtsLdTNZmLTmdJPcnnMFjFMcrVJhMF +wMRQMSQZHznRsqRbWp +ddgDDhfDrrDdjthHmdHrzpbVCVWFpfVqCWpWqpFs +hdvNdHtjMLJZvJwM +nWzZtWzHzZWgQHMNLDMDfDBfQbdD +MCPmRGGhqdmNjbDN +FRPlMlRChCvFggWZsHsZHn +ZGhhjdgwgcZHsPnRnSnbWscn +tltlfMQQQftDFJpMQJsWJWJsnWBnRSBbrBWP +lfLDpQMFMNfLjGjPPgZzwh +HcmvWcqnHLLPDzPPHM +MGGSfdJRdCglfrLjrjrLzLPzlF +CsgRgfwgdCwhsssJBBwvcnQnQNMvQtQm +nrVbwgnSTSgSnrZpjpWWqmWNHlqqpV +BcBPhSdsDlHNtNlJNP +RLFCQLQRRsBDDcRdGDddhCRDfwzvSCnzrbfrMfMgznwwfbZv +HJLzLNwBNzNJLzBJztRGzQVnDgwsjbgwssZwnDZbDQ +PhvlSvvPfMRlDbDsggbSjQSg +mFfhMlMrfchvPPpFTPvMvPzLBHWRHJNtzJGzzHpzBtCC +FLsgSLzLswdFgLBbWZnJDWHcmZnnBjHM +rpbrrqfqpvCbqqQQvvpClblRDHmjmmjJJZZnWMJmmJmmcRMc +qTppQvCfhzSVVTzbdL +ThTJtlqfDrDtffwqRCFCCnLwdnmpzRdF +WPQSSFsGMgQZWvFQgZgZQcCdmmzLMLCpNzCCddmLzdzm +cvVPGPQQGsZsgGPjVFccbHhThJHhDqfhDDjHqDrr +CgnCCnPMnMtGHDbMFQ +zLpwpRTwwRwhRchHwmqmGvvGbqmTmNQqvq +sHdhzlwrRVrdLzRrprrfjgfjVBnBCfSBZZgPfJ +SPMdWwWPrZwdrrWrSPLFDfgbQDfwDFfFglDQ +qLGBtGLpjzqmvQbvvpDvfFpR +jhLqqHBLGjtLqSZCssSTZZMshP +MhJCpPDpRRFRzQQNNqbcZjNZmVhjNm +LLSlLnGDmNqLbNjb +sfBngrBSTTSnSGHlTsHBGsBpFFdRdQPDCFPWRMzzdQWM +ZQtmgtWfPcgPgcsb +pvMhFThpHVTvPbcFcFJLJDsd +MTVHchVVHjHHTcpjMVBjjnQnGqQZnlqBmrWQQBffQQ +HfcRNJpJfhCmpGSqqGNjsjBnQl +tTdPwwtLTrrTVPSnQsbGPsnnlFllFQ +VvvTSTwWMrSZVwwrrmRmczJchHcHCZhRzD +wfRwhmLRnvrHqHhV +bJlBHlWlHMBPJzDlzMMJJSBlFnrGVrqspGGvpVGPVpGsVqvp +DWdStDMztCCHgZCtmZ +MHdsznVDDfcjcjDcdDjmMSCQwQpCpFCvqSZQqFzQpQ +lhJnLJJnTNrWTRqvqqPrFwZvwqQp +NghhtJBtnWLRTNjmcMDtjdsMfGDH +jgsvPffVmHfDqPSrNwnQwnwNhSvw +PZbGbCdcGdRCGtntQLQQLLwtpLNw +RbcPFBRFcdZBBJDBmTHjsD +dTTFJdzhmmmQpzVz +jtNLcctGGjtfrnVMsNQNQVVWnv +GcrcrfLtDggLftDFhZFdJFHJBVFBgZ +TTbqTgqCqZCrwmhQnnmrgh +MhpfsMLhfmrznLrQrF +RsStRMtjpHMfDtWsWsNDppsqlZqBlhNlbcNdTPClPqcvBP +lRhZPgnpRGZlSrmsLSvSzLVl +wwHdHCfDQCJHdwdDMdHCcDsLmNVvzVsWrcVNcVzLbrLz +dMCCwCtJdwDQJMtjhnvhpPhRZBhR +pBqMZfDffmBnvnNmPt +rhwLHCChrLPCMNWMCNmW +GSMVRSVwHLMRJDQJTZlJZR +sfstzPGRRBSngMfQLNNqgWLQLZZNgq +scVDjjjCDTVhHlDhHdvvjwjHrZmWQmJmrJJWqNqLJbrcQqZq +VvHlVHldTjvhpVplhVThhwjlPFSzPfGzpGBnsRffRRBPPGGF +WNFNfnWTSLSJTnWShTvVZCnvrdPrZvddVCrt +QwsMjppcpHCPdHsvPZ +lcwMGgpcGbzQpMgQwbDjDQZSJTRfShffWNJSSNFFbhSb +JDNgTgqDTggQbQGbZDWbJmVJrPVfPjlPfPwlljJC +FZzHFSznZZtptHzcSmCVrwfPVcwwVrCcdm +nMSStvnZFSHpLLtBtMzHnMWQvNhgDgGNRGNhgqRWTgqg +SJcrhvbBLBLrDpllvnwHQRnllHnQ +ffsjfMMZfVdCCgCfgTzmzslRtwFwFtTnqqHTJRQnqRqq +CVPgmdggVjCJSrhrbrPrrSLW +LPtcLtgddLMRRCMRpTBRrZnppvvGRvBw +WNNJjDjqSjJSqWqzNqzlSlBTGGFvrppSrwTFpn +qbNDWNNHbJqVtctwVmsfLCLP +FvSSLMqgvVSQjQfgwpwWpj +BthszRPRRNbNtzmHRbHNRNPfwJGcsswWQpffJpfsJcQFwJ +bBtzPmRrbBRHtNCzPhqdCLFMLSSvdnvCTnML +VPHWJPDjVLDDjDSFDJhgdnNGdbblzTzNjlnNbl +ZprsRZMQwwmGZsvtQZgTfggqnbfdTzrbqlTd +GZMtsscmsRZswwBQHBhDDJJPPCPWSWCJ +mNDNNmmVMSVgGgGGqsqGLhQqsLGhLq +nZBTZpJPhCpnnrsqbbcfczJfFccz +HpBZZRPRHjnPPjrHnRtCZnBdShDVlMDNDgVmtmDdVDWSdN +tBftztmztGBBCBSGHBmhvHHcchbshhThpbLJHJ +wwzMrrMnQdldVdMvJTcLNnphphbLJv +ZzwPVrWQlwrdStGGCWqDSSGW +QwfrQPvhwPfzQrvWWpQpvVGGTDGsjbgNNcbfsGTsDFgG +CtddSdZMRRdnJhRnHtZtlRMbGGDjDgggjNTZDNgTGFgGjc +mdmdCnHhVWmLmwwL +zLcWSWFcPJLWrWLSZrJLjVjHtjVsrdtstHdtVQgg +nChlwwnmhlCNqhhjHMgDjVVdwMjdtd +CNnBmNNThhhdhCdlBGGlGvNpcJbJLSbcZzcFJzpJTWPbzc +LdPZTPVpLCVTtCNsNsfFnlDC +SMwqcqcWQMbMhWQzBnsNfsFwrnnNNlrs +WMMWhvQRNNNjvLgZ +DWFGzrtfsZHZZMLt +pNwNzNCNTpppmnvNMTLVjHLBLLjMRTLH +PPdlPmJJNNClDdcdDDfWhzrW +nSJVSHQQnwLThnhrML +ddsjfRdGZjmGjRTwwTZhwrMwWwtb +qCdfRdMmgssPfjsdjdPspBzQpScSSCBpzNBQzcQz +fJnmRMJrlrmRmTRmbqssWVdqNVQdswdNNb +GZggFHGhHHgHSFvtHPPPsfwgwNsVqjqNpNjNNssN +PPSPDDBPBmBMlLfmLr +BdqdCBqqCVPVTZBrlJcTcTJTcfcbwwmcgv +WjGGLzLMhpWQmRGhpHfbhcDhHHHhgcsbJD +tQzSGjWRzWBntntrZmVB +clfLQLgfzfTLDMwNrNrrNDGCGG +tmbpFtBvvmvdQQdFQwMJCG +SnbtnqnSbnQQsBqzgLgVsLZTLTPfVg +QnQBQQBVzqqzpmfgBpnqSDFPjhhWsFVhlsFFsDstFs +MGGrTHcvRTTrrrCDpjvWtFPlFlsvjp +bZbpTpJJBBQmBmJf +dNVgDdVtPcNPhgTLPLpTPlnTHHRn +WrvjvwjWwfwWjGJsrwBjQJjTQLbnSTTmpTRQSTClHTbLmn +JqWWGvBJBwGJfJJGvwqZZddFtDFhgDqZhHNM +VwJcNgbfvfJbfcmGLZfPhZLfZGTDhP +CnnrlBlprsBnzQFntnZLqDhZZqThWGtWWSPL +FllFdCjzlsCzjJNJGGJwHHVg +fTbVBmNJCJRVbTmbfJFHsDjQHDHQjnQRsvDn +cLWcrGtttddMPhrPhPtPrtzsnSQQBvHjFpFSpDHsMjnvjD +PrPgPdhGWLrrqgdqcVCffbNblBwfVmwqwC +gmBfbmlbBDqrdfrDcJ +PwVWrQphQWWhQsJFcMPqzDdcJq +QWCSSHpSQWCttQpCRCHNSlZBtrmBZTjvGgZjmBZjBn +JrnhMPvtVtPVHJGrBrQwTmQmRGGB +pSSZCFClCbbSLbljZlSlFFszzBwcZNwTzQNDmBwGTBNTBz +ldsCCjpFjCqdLgsFjpsLFQgtnfqtJvnMtnvhWnHHMnnVWV +hzNHzHjWNzwHjjhprpGvGgvGvvpv +PLBVVRPDLdrgCdMrdrdC +FmBTqTmLPrsFqTBDcTTVtNNJztqWQNQtWWtJqNNz +fFffFvFBgHQWHdvfGglBWbqbPSSbSwVntPhZwwbS +jJCMzNMCjNCLNMjjphPSPqhbqnwPZLSqZh +rNpJJDzpcNMzzdBnGcQTccBvgv +FRFMwsrzVtwstgbCHHJJPgNb +hfZGhZDnnTTHTCCNzJjH +hppDvznmZphZQVFQwFVWlRqFls +jrjrgdHdFBZsBlcCGghWNgpgbCCp +QwJJqQQMLwPTwLMMwzvzwwzhCWbvcNcCChWpchWbNGfFff +qqFQJTmwJSPjZsrlnBjdHm +QfffRppWfHpQSrWVpSGmGMMccSjBjmmGmc +qdzLvbwzwdsWwnFdBBcBhMjMDvBBcBhc +bPdZPqddqzFsZVRptZZQHVWNpN +BzBQQHNjTSzzJDDFZFgJDJ +qLvCnLpfCpqCnLJhntRglFncDrGrllmZFZlDrc +JpqvfhRhLddfpbbtsdJWjHSwHHTNSQNPTVHQTb +qVQCCVlQZWgHZMqgqWlrtScFwrmtmcJqSSsSJS +MzdnddpNLzhRpzbzNPPBbPScjcnmrwSFjSjSJFtrwjcF +ddTzRMPLdLbvhBRdLWGQClVVCWQZQDTGGf +DHHTsldDNdPnVDCRDCNHllHwcMpprSMpRmphhRWhrhmzSS +qJLBqQLvJLQgftgPjJrhrMMWSmWMmMrrSqrc +FjfFftgLBjJPBLQZGvvZtNClnTTNGCdHTbCCNsnslH +jHHNsNqhjsShsshdRRCDMfMbCWHBrGGC +TJQFmnpgmTpBDCgCMCDZCGDC +FwpQzwQTmVvwTJmFJzTcQSdhBNztNPNjSlqLhBNhSh +vBCfSDcRMfRcRHSRRZZtPwrWWNtdSmrNVGSdwm +gbLnTzqTbjhGqFzgWrtttQtrPQTtNPmP +zbhjzglgzzlBGcsflsCl +jNHDNNHjVGVDNQFDTQSFZzDQTd +vvLwhbnpvPPgClwnfFTmTZQgffFFtTfc +LrhrLvwrnJvhCHVVRZNMjsRJVB +ShfcBWfvdhhJBBVwCJjHTRNwRVNC +qQzlDqMDDDslPqGVLTNZVpPwTRZZpV +bgbDbsqzsDTcfrgFFdgg +vlRHvvHwvMMMTTlvjmRtBjSJmSnDnpdrpSSrJJnDQrLp +cPfCgZZzNzzcGhNszcTPNZLrnVSJpJhDrrhSSQSpDDQn +FbTgbGcgNgcFbPFHMqvjjRtjRWvFvt +fZTnqfFFDNglcjdjZcfLGQJBwrGGQwbGQTBBJz +VhvfvsPpWRChmphvRGBbBLGhSbLrBQBSwb +pCsCsHvsstPsfRMMMtmDqFjngdFZqDHFnNFFjl +PVVwffMlfGWMDDSwfDwVpRpsZRjBHgpSsjJSpBSp +TdnFbqTFdmbjctcqcbRBZtJJZgsBzBBzvgHJ +bNmbcqnnbNFLChCVCfjDfWlMjVDPCr +JBLLjBQccLLJhcBDDlSrdFDsVhrVsR +HgNWCgqWGbvCRRZvGWvZmszsSlrWdSdFrWzSldDF +qvGCZGHggRNHvGTgvLnBjpjjPJwTPjLcJj +GCGwQrwBZMZdGVdLzbqbbp +TRfTTCtgcDmhtDmsTDVSbvpLdNpzNVRqVdVL +CfDJjscgTcsjfhtFZljPZWZMWPlZjQ +WsrjjfRfjjZjwjWjBpDpVpVhMBsMMSBT +JgmqHnCHHPCCtCJgSZMgZppDTgzvzZMz +HCGCGqqqCtmnHnqLFHWjlFrWRRbfjZccNWrR +BJBfSfPLPvdhvrbbvpDsHgDTzgpdzgZpgN +cVcmRnCWCqGngHpZsZsTsqNN +jmGCVwWjjnWFMjGwcwmrLJbBJPbLSrPPTbFBTr +SPZmmtlmqjZlZMwhlrtggqGGcCLCpfGLgqdCqF +FBBVDVTVDJfgcddLCDdp +zzVHvVNTbWJJTTRbVWBFJbWHmwmSPlMjPSShjlhMhhrrml +GJZJZTsnhsDJtVZdtsZJZrBCQpLjQgBnrQgjCjQQQj +RPSfqcRShHbFcPSfBqLLprBCwrQQQCqg +zPzPRHbFPcRRRHPclMhSfvfZsJZVTTZsJNVMGWGVdGTWWD +lCZrCLWCwVllGzWPPBMTFpsbGdsTpsbNMgFb +RDjtjHcHjcHctDRtjnhtnHTgMqTMqhTbdbdZbgFqZdMN +vfDmvfjtmvtcHmjZfSRZHQzBLrVLCJLJLfJBPzVJlwPw +JMTHVZMWNSCwCwMS +nsddQbDCnQQdDBPdCQCSvwpDvwffhfSvpmppvp +BssqBFtqRHgTqVRC +cWTTthtrgrzpCdCddtpz +SSSLNJLGLSLfCJfJFQCJzQ +swMPMZVMMSlMSZMqVSSHznzcqgzWTHgTnhbnrr +RJjjgMjWShPqchtbVBPV +DDddwCnZMHLLvDnfLrvvbVbbBtpwVBVPwtVpbcbb +zrvnvLrlZCHrfZZLffHZHHTsTmsQgFQSFTMjjQlFTRmR +zhTTMLRVTzLbVqwVRJgDQQsSCgCDNgsZCpqp +rrmrBmmWrWnHjWnGWrnGnhDHSQgNSpQsCgSNgtNtDDHZ +fBrGPGmGPBcTMfLhJVTc +TbTCjTBSbCncHsDZDZPhZbzv +rMwplFdlWWJMJzhhpGtHtvHSSP +fMMfwWdWrNfJNdlVgMcTLTmLffjTqnLScCjL +SwhTllwJDwqqBWLBbNtfhjBB +mvllZMmRMZGFZRfctLWtWttzfNLR +MGvHMCGpVnFGlgvVFFnpnGmmsHrDJJdSsqPqJSqDJJdTTDqD +QTTcqJZJhHSpShhFpFzjDDwwsFzpdg +NBMnBvmBPvwrqvgvvqgD +bNNGmWmbbClQTQRqchhQbf