diff options
author | Andreas Grois <andi@grois.info> | 2022-12-06 22:04:30 +0100 |
---|---|---|
committer | Andreas Grois <andi@grois.info> | 2022-12-06 22:04:30 +0100 |
commit | c79cf86f6382d5924963866c87438412fdd8c769 (patch) | |
tree | 8a4fe0e85d3868b6bd5c31553f8775da0d0c8ab5 | |
parent | 15392a2813dd0902e9276deecbea9004049c0268 (diff) |
Day 3
-rw-r--r-- | Day3/CHANGELOG.md | 5 | ||||
-rw-r--r-- | Day3/Day3.cabal | 34 | ||||
-rw-r--r-- | Day3/app/Main.hs | 94 | ||||
-rw-r--r-- | Day3/input | 300 |
4 files changed, 433 insertions, 0 deletions
diff --git a/Day3/CHANGELOG.md b/Day3/CHANGELOG.md new file mode 100644 index 0000000..af6b183 --- /dev/null +++ b/Day3/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for Day3 + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/Day3/Day3.cabal b/Day3/Day3.cabal new file mode 100644 index 0000000..fca66ee --- /dev/null +++ b/Day3/Day3.cabal @@ -0,0 +1,34 @@ +cabal-version: 2.4 +name: Day3 +version: 0.1.0.0 + +-- A short (one-line) description of the package. +-- synopsis: + +-- A longer description of the package. +-- description: + +-- A URL where users can report bugs. +-- bug-reports: + +-- The license under which the package is released. +-- license: +author: Andreas Grois +maintainer: andi@grois.info + +-- A copyright notice. +-- copyright: +-- category: +extra-source-files: CHANGELOG.md + +executable Day3 + main-is: Main.hs + + -- Modules included in this executable, other than Main. + -- other-modules: + + -- LANGUAGE extensions used by modules in this package. + -- other-extensions: + build-depends: base ^>=4.16.3.0 + hs-source-dirs: app + default-language: Haskell2010 diff --git a/Day3/app/Main.hs b/Day3/app/Main.hs new file mode 100644 index 0000000..2399b86 --- /dev/null +++ b/Day3/app/Main.hs @@ -0,0 +1,94 @@ +module Main (main) where + +import System.Environment + +main :: IO () +main = getArgs >>= readFile . head >>= print . solveDay3 + +solveDay3 :: String -> (Integer, Integer) +solveDay3 x = (solveDay3Part1 x, solveDay3Part2 x) + +solveDay3Part1 :: String -> Integer +solveDay3Part1 = sum . map getLinePriority . lines + +getLinePriority :: String -> Integer +getLinePriority = getCharPriority . findCharacterInFirstAndSecondHalf + +getCharPriority :: Maybe Char -> Integer +getCharPriority (Just 'a') = 01 +getCharPriority (Just 'b') = 02 +getCharPriority (Just 'c') = 03 +getCharPriority (Just 'd') = 04 +getCharPriority (Just 'e') = 05 +getCharPriority (Just 'f') = 06 +getCharPriority (Just 'g') = 07 +getCharPriority (Just 'h') = 08 +getCharPriority (Just 'i') = 09 +getCharPriority (Just 'j') = 10 +getCharPriority (Just 'k') = 11 +getCharPriority (Just 'l') = 12 +getCharPriority (Just 'm') = 13 +getCharPriority (Just 'n') = 14 +getCharPriority (Just 'o') = 15 +getCharPriority (Just 'p') = 16 +getCharPriority (Just 'q') = 17 +getCharPriority (Just 'r') = 18 +getCharPriority (Just 's') = 19 +getCharPriority (Just 't') = 20 +getCharPriority (Just 'u') = 21 +getCharPriority (Just 'v') = 22 +getCharPriority (Just 'w') = 23 +getCharPriority (Just 'x') = 24 +getCharPriority (Just 'y') = 25 +getCharPriority (Just 'z') = 26 +getCharPriority (Just 'A') = 27 +getCharPriority (Just 'B') = 28 +getCharPriority (Just 'C') = 29 +getCharPriority (Just 'D') = 30 +getCharPriority (Just 'E') = 31 +getCharPriority (Just 'F') = 32 +getCharPriority (Just 'G') = 33 +getCharPriority (Just 'H') = 34 +getCharPriority (Just 'I') = 35 +getCharPriority (Just 'J') = 36 +getCharPriority (Just 'K') = 37 +getCharPriority (Just 'L') = 38 +getCharPriority (Just 'M') = 39 +getCharPriority (Just 'N') = 40 +getCharPriority (Just 'O') = 41 +getCharPriority (Just 'P') = 42 +getCharPriority (Just 'Q') = 43 +getCharPriority (Just 'R') = 44 +getCharPriority (Just 'S') = 45 +getCharPriority (Just 'T') = 46 +getCharPriority (Just 'U') = 47 +getCharPriority (Just 'V') = 48 +getCharPriority (Just 'W') = 49 +getCharPriority (Just 'X') = 50 +getCharPriority (Just 'Y') = 51 +getCharPriority (Just 'Z') = 52 +getCharPriority _ = 0 + +findCharacterInFirstAndSecondHalf :: String -> Maybe Char +findCharacterInFirstAndSecondHalf x = findElementInBothLists (splitAt (length x `div` 2) x) + +findElementInBothLists :: (Eq a) => ([a],[a]) -> Maybe a +findElementInBothLists (a:as,b) = if a `elem` b then Just a else findElementInBothLists (as,b) +findElementInBothLists _ = Nothing + +-- Todo +solveDay3Part2 :: String -> Integer +solveDay3Part2 = sum . map getGroupPriority . elfGroups + +getGroupPriority :: (String, String, String) -> Integer +getGroupPriority = getCharPriority . findElementInThreeLists + +findElementInThreeLists :: (Eq a) => ([a],[a],[a]) -> Maybe a +findElementInThreeLists (a:as,b,c) = if a `elem` b && a `elem` c then Just a else findElementInThreeLists (as,b,c) + +elfGroups :: String -> [(String, String, String)] +elfGroups = groupThree . lines + +groupThree :: [a] -> [(a,a,a)] +groupThree (a:b:c:as) = (a,b,c) : groupThree as +groupThree _ = []
\ No newline at end of file diff --git a/Day3/input b/Day3/input new file mode 100644 index 0000000..0761a34 --- /dev/null +++ b/Day3/input @@ -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 |