pU      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                  ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J KLMNOPQRST\Join multi-line strings as side-by-side rectangular strings of the same height, top-padded. _Join multi-line strings as side-by-side rectangular strings of the same height, bottom-padded. XConvert a multi-line string to a rectangular string top-padded to the specified height. [Convert a multi-line string to a rectangular string bottom-padded to the specified height. XConvert a multi-line string to a rectangular string left-padded to the specified width. YConvert a multi-line string to a rectangular string right-padded to the specified width. NClip a multi-line string to the specified width and height from the top left. IClip and pad a multi-line string to fill the specified width and height.  #List just the leaf nodes of a tree Iget the sub-tree rooted at the first (left-most, depth-first) occurrence  of the specified node value Cget the sub-tree for the specified node value in the first tree in  forest in which it occurs. &remove all nodes past a certain depth apply f to all tree nodes 9remove all subtrees whose nodes do not fulfill predicate (is predicate true in any node of tree ? .show a compact ascii representation of a tree 0show a compact ascii representation of a forest 9trace (print on stdout at runtime) a showable expression < (for easily tracing in the middle of a complex expression) Clabelled trace - like strace, with a newline and a label prepended UVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    f !"#$%&'(transactions in this account )4sum of transactions in this account and subaccounts *+,-posting status .ledger transaction date /ledger transaction description 0posting account 1posting amount 2 posting type 3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno=optional per-unit price for this amount at the time of entry pqr the commodity' s symbol 3 display preferences for amounts of this commodity s2should the symbol appear on the left or the right t4should there be a space between symbol and quantity u$should thousands be comma-separated v$number of decimal places to display wxyz{|}~f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~f{~}|zwyxpqrstuvklmnoijehgf^_`abcdZ[\]VWXYMNOPQRSTUGLKJIHBCDEF<=>?@A3456789:;*+,-./012%&'() !"#$f !"#$ !"#$%&'()&'()*+,-./012+,-./0123456789:;456789:;<=>?@A=>?@ABCDEFCDEFGLKJIHHIJKLMNOPQRSTUNOPQRSTUVWXYWXYZ[\][\]^_`abcd_`abcdehgffghijjklmnolmnopqrstuvqrstuvwyxxyz{~}||}~&OSplit a DateSpan into one or more consecutive spans at the specified interval. DParse a period expression to an Interval and overall DateSpan using  the provided reference date. EConvert a single smart date string to a date span using the provided  reference date. /Convert a smart date string to an explicit yyyymmdd string using  the provided reference date. KConvert a SmartDate to an absolute date using the provided reference date. <Parse a date-time string to a time type, or raise an error. 7Parse a date string to a time type, or raise an error. 7Parse a date string to a time type, or raise an error. BParse a time string to a time type using the provided pattern, or  return the default. 4Parse a date in any of the formats allowed in ledger's period expressions, and maybe some others:   2004  2004/10  2004/10/1  10/1  21  october, oct  yesterday, today, tomorrow 6 (not yet) this/next/last week/day/month/quarter/year NReturns a SmartDate, to be converted to a full date later (see fixSmartDate). :Assumes any text in the parse stream has been lowercased. C&&ELook up one of the hard-coded default commodities. For use in tests. GFind the conversion rate between two commodities. Currently returns 1. FApply a binary arithmetic operator to two amounts - converting to the  second one';s commodity, adopting the lowest precision, and discarding F any price information. (Using the second commodity is best since sum 4 and other folds start with a no-commodity amount.) ?Convert an amount to the commodity of its saved price, if any. CConvert an amount to the specified commodity using the appropriate . exchange rate (which is currently always 1). BGet the string representation of an amount, based on its commodity's  display settings. CGet the string representation (of the number part of) of an amount ;Add thousands-separating commas to a decimal number string MDoes this amount appear to be zero when displayed with its given precision ? Is this amount really- zero, regardless of the display precision ? N Since we are using floating point, for now just test to some high precision. Access a mixed amount's components. 5Does this mixed amount appear to be zero - empty, or : containing only simple amounts which appear to be zero ? Is this mixed amount really zero ? See isReallyZeroAmount. 2MixedAmount derives Eq in Types.hs, but that doesn't know that we  want $0 = EUR0 = 0. Yet we don''t want to drag all this code in there. D When zero equality is important, use this, for now; should be used  everywhere. AGet the string representation of a mixed amount, showing each of D its component amounts. NB a mixed amount can have an empty amounts  list in which case it shows as "". ;Get the string representation of a mixed amount, and if it : appears to be all zero just show a bare 0, ledger-style. FSimplify a mixed amount by combining any component amounts which have L the same commodity and the same price. Also removes redundant zero amounts ? and adds a single zero amount if there are no amounts at all. Convert a mixed amount'.s component amounts to the commodity of their  saved price, if any. The empty simple amount. The empty mixed amount. IA temporary value for parsed transactions which had no amount specified.  a:b:c,d:e -> [a,a:b,a:b:c,d,d:e]  a:b:c,d:e -> [a,d] ?We could almost get by with just the AccountName manipulations A above, but we need smarter structures to eg display the account < tree with boring accounts elided. This converts a list of @ AccountName to a tree (later we will convert that to a tree of  &%.) 5Elide an account name to fit in the specified width.  From the ledger 2.6 news:  H What Ledger now does is that if an account name is too long, it will F start abbreviating the first parts of the account name down to two E letters in length. If this results in a string that is still too @ long, the front will be elided -- not the end. For example:  +Expenses:Cash ; OK, not too long  Ex:Wednesday:Cash ; Expenses was abbreviated to fit  Ex:We:Afternoon:Cash ; Expenses and  Wednesday abbreviated E ; Expenses:Wednesday:Afternoon:Lunch:Snack:Candy:Chocolate:Cash 7 ..:Af:Lu:Sn:Ca:Ch:Cash ; Abbreviated and elided!  Check if a set of ledger account/!description patterns matches the I given account name or entry description. Patterns are case-insensitive G regular expression strings; those beginning with - are anti-patterns. BSimilar to matchpats, but follows the special behaviour of ledger  2.6'Bs balance command: positive patterns which do not contain : match D the account leaf name, other patterns match the full account name. DDo the positives in these patterns permit a match for this string ? EDo the negatives in these patterns prevent a match for this string ? @Show a ledger entry, formatted for the print command. ledger 2.x's !standard format looks like this:  yyyymmdd[ *][ CODE]: description......... [ ; comment...............] O account name 1..................... ...$amount1[ ; comment...............] O account name 2..................... ..$-amount1[ ; comment...............]  Dpcodewidth = no limit -- 10 -- mimicking ledger layout. 0pdescwidth = no limit -- 20 -- I don't remember what these mean, Lpacctwidth = 35 minimum, no maximum -- they were important at the time. pamtwidth = 11 pcommentwidth = no limit -- 22 DEnsure that this entry is balanced, possibly auto-filling a missing A amount first. We can auto-fill if there is just one non-virtual @ transaction without an amount. The auto-filled balance will be H converted to cost basis if possible. If the entry can not be balanced, " return an error message instead.  BConvert time log entries to ledger transactions. When there is no E clockout, add one with the provided current time. Sessions crossing ? midnight are split into days to give accurate per-day totals. EConvert a timelog clockin and clockout entry to an equivalent ledger M entry, representing the time expenditure. Note this entry is not balanced,  since we omit the " assets:time"! transaction for simpler output.   Convert a NM to two or more +*s. An id number H is attached to the transactions to preserve their grouping - it should  be unique per entry. =Does the given transaction fall within the given date span ?  5Remove ledger transactions we are not interested in. G Keep only those which fall between the begin and end dates, and match O the description pattern, and are cleared or real if those options are active. RKeep only ledger transactions whose description matches the description patterns. GKeep only ledger transactions which fall between begin and end dates. O We include transactions on the begin date and exclude transactions on the end @ date, like ledger. An empty date string means no restriction. 7Keep only ledger transactions which have the requested  cleared/#uncleared status, if there is one. BStrip out any virtual postings, if the flag is true, otherwise do  no filtering. CStrip out any postings to accounts deeper than the specified depth C (and any ledger transactions which have no postings as a result). UKeep only ledger transactions which affect accounts matched by the account patterns. Give all a ledger'2s amounts their canonical display settings. That E is, in each commodity, amounts will use the display settings of the B first amount detected, and the greatest precision of the amounts E detected. Also, amounts are converted to cost basis if that flag is  active. 9Get just the amounts from a ledger, in the order parsed. EGet just the ammount commodities from a ledger, in the order parsed. CGet just the amount precisions from a ledger, in the order parsed. AClose any open timelog sessions using the provided current time. +The date span containing all the raw ledger's transactions, 0 or DateSpan Nothing Nothing if there are none.  5"Some context kept during parsing. 0the default year most recently specified with Y I don't know the current stack of  container accounts specified by !account CParses the contents of a ledger file, or gives an error. Requires H the current (local) time to calculate any unfinished timelog sessions, " we pass it in for repeatability.      ?Parse a RawLedger from either a ledger file or a timelog file. F It tries first the timelog parser then the ledger parser; this means G parse errors for ledgers are useful while those for timelogs are not. LParse a ledger file. Here is the ledger grammar from the ledger 2.5 manual:   LThe ledger file format is quite simple, but also very flexible. It supports Jmany options, though typically the user can ignore most of them. They are Jsummarized below. The initial character of each line determines what the Kline means, and how it should be interpreted. Allowable initial characters are:  WNUMBER A line beginning with a number denotes an entry. It may be followed by any [ number of lines, each beginning with whitespace, to denote the entrys account ; transactions. The format of the first line is:   DATE[=EDATE] [*|!] [(CODE)] DESC  TIf * appears after the date (with optional eective date), it indicates the entry \ is cleared, which can mean whatever the user wants it t omean. If ! appears b after the date, it indicates d the entry is pending; i.e., tentatively cleared from [ the users point of view, but not yet actually cleared. If a CODE appears in W parentheses, it may be used to indicate a check number, or the type of the \ transaction. Following these is the payee, or a description of the transaction. 9 The format of each following transaction is:  ACCOUNT AMOUNT [; NOTE]  BThe ACCOUNT may be surrounded by parentheses if it is a virtual W transactions, or square brackets if it is a virtual transactions that must R balance. The AMOUNT can be followed by a per-unit transaction cost, J by specifying  AMOUNT, or a complete transaction cost with @ AMOUNT. 8 Lastly, the NOTE may specify an actual and/or eective date for the 9 transaction by using the syntax [ACTUAL_DATE] or [=EFFECTIVE_DATE] or ( [ACTUAL_DATE=EFFECtIVE_DATE].  U= An automated entry. A value expression must appear after the equal sign. _ After this initial line there should be a set of one or more transactions, just as [ if it were normal entry. If the amounts of the transactions have no commodity, Z they will be applied as modifiers to whichever real transaction is matched by " the value expression.  M~ A period entry. A period expression must appear after the tilde. _ After this initial line there should be a set of one or more transactions, just as % if it were normal entry.  V! A line beginning with an exclamation mark denotes a command directive. It U must be immediately followed by the command word. The supported commands  are:   !include 8 Include the stated ledger file.  !account \ The account name is given is taken to be the parent of all transac- A tions that follow, until !end is seen. / !end Ends an account block.  N; A line beginning with a colon indicates a comment, and is ignored.  ZY If a line begins with a capital Y, it denotes the year used for all subsequent W entries that give a date without a year. The year should appear immediately \ after the Y, for example: Y2004. This is useful at the beginning of a file, to ` specify the year for that file. If all entries specify a year, however, this command  has no eect.  ^P Specifies a historical price for a commodity. These are usually found in a pricing > history file (see the -Q option). The syntax is:  P DATE SYMBOL PRICE  \N SYMBOL Indicates that pricing information is to be ignored for a given symbol, nor will X quotes ever be downloaded for that symbol. Useful with a home currency, such _ as the dollar ($). It is recommended that these pricing options be set in the price . database file, which defaults to ~/+.pricedb. The syntax for this command is:   N SYMBOL  [D AMOUNT Specifies the default commodity to use, by specifying an amount in the expected V format. The entry command will use this commodity as the default when none T other can be determined. This command may be used multiple times, to set ] the default flags for dierent commodities; whichever is seen last is used as the W default commodity. For example, to set US dollars as the default commodity, [ while also setting the thousands flag and decimal flag for that commodity, use:   D $1,000.00  C AMOUNT1 = AMOUNT2 Z Specifies a commodity conversion, where the first amount is given to be equiv- Y alent to the second amount. The first amount should use the decimal precision % desired during reporting:  C 1.00 Kb = 1024 bytes   i, o, b, h X These four relate to timeclock support, which permits ledger to read timelog W files. See the timeclocks documentation for more info on the syntax of its  timelog files. See Tests for sample data. WTry to parse a ledger entry. If we successfully parse an entry, ensure it is balanced, # and if we cannot, raise an error. Match a partial M/1D date in a ledger. Warning, this terminates the F program if it finds a match when there is no default year specified.  !"[account names may have single spaces inside them, and are terminated by two or more spaces #$%&'()*Dparse a ledger-style numeric quantity and also return the number of D digits to the right of the decimal point and whether thousands are  separated by comma. +Dparse the two strings of digits before and after a possible decimal D point. The integer part may contain commas, or either part may be " empty, or there may be no point. ,-.JParse a timelog entry. Here is the timelog grammar from timeclock.el 2.6:   @A timelog contains data in the form of a single entry per line. Each entry has the form:   CODE YYYYMMDD HH:MM:SS [COMMENT]  GCODE is one of: b, h, i, o or O. COMMENT is optional when the code is +i, o or O. The meanings of the codes are:  $b Set the current time balance, or " time debt". Useful when B archiving old log data, when a debt must be carried forward. 8 The COMMENT here is the number of seconds of debt.  ?h Set the required working time for the given day. This must C be the first entry for that day. The COMMENT in this case is B the number of hours in this workday. Floating point amounts  are allowed.  Ai Clock in. The COMMENT in this case should be the name of the  project worked on.  Bo Clock out. COMMENT is unnecessary, but can be used to provide 8 a description of how the period went, for example.  AO Final clock out. Whatever project was being worked on, it is 9 now finished. Useful for creating summary reports.  Example: i 20070310 12:26:00 hledger o 200703 10 17:26:02 /DParse a --display expression which is a simple date predicate, like  d>[DATE] or  d<=[DATE]/, and return a transaction-matching predicate. 7      !"#$%&'()*+,-./5      !"#$%&'()*+,-./5      !"#$%&'()*+,-./ 0IConvert a raw ledger to a more efficient cached type, described above. 1DGiven a list of transactions, return an account name tree and three 7 query functions that fetch transactions, balance, and 0 subaccount-including balance by account name. 9 This is to factor out common logic from cacheLedger and " summariseTransactionsInDateSpan. 2EAdd subaccount-excluding and subaccount-including balances to a tree G of account names somewhat efficiently, given a function that looks up  transactions by account name. 3FConvert a list of transactions to a map from account name to the list ' of all transactions in that account. 45 List a ledger's account names. 6%Get the named account from a ledger. 7 List a ledger's accounts, in tree order 8 List a ledger'$s top-level accounts, in tree order 9BAccounts in ledger whose name matches the pattern, in tree order. :List a ledger account's immediate subaccounts ; List a ledger's transactions. < Get a ledger'+s tree of accounts to the specified depth. = Get a ledger'4s tree of accounts rooted at the specified account. >'The date span containing all the ledger's (filtered) transactions, 0 or DateSpan Nothing Nothing if there are none. ?Convenience aliases. @ABCDEFGHIJ0123456789:;<=>?@ABCDEFGHIJ0123456789:;<=>?@ABCDEFGHIJ0123456789:;<=>?@ABCDEFGHIJ KAA tuple of arguments specifying how to filter a raw ledger file: - only include transactions in this date span  only include if cleared/ uncleared/don't care  only include if real/don't care # convert all amounts to cost basis 1 only include if matching these account patterns 5 only include if matching these description patterns L Get the user's default ledger file path. M Get the user's default timelog file path. N Read the user')s default ledger file, or give an error. O Read the user'*s default timelog file, or give an error. PCRead a ledger from this file, with no filtering, or give an error. QBRead a ledger from this file, filtering according to the io args,  | or give an error. RBRead a RawLedger from the given string, using the current time as ( reference time, or give a parse error. SDConvert a RawLedger to a canonicalised, cached and filtered Ledger. T1Expand ~ in a file path (does not handle ~name). KLMNOPQRST KLMNOPQRST KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRST !"#$%&'()*+,-./012344567889:;<=>?@@ABCDEFGHHIJKLMMNOPQRSTUVWWXYZ[\]^__`abbcdeefghijklmnopqqrstuuvwxyz{|}~                                    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L MNOPQRSTUVWXYZXY[X\]X\^X\_XY`XabXYcXYdXYeXYfXYgXYhXaiXjklmnlopXYqrstrsursvrswrsxrsyrszrszr{|r{}r{~r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{r{rrXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXjXjXjXjXjXjXjXjXjXj Xj Xj Xj Xj XjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX X!X\"X\#X\$X\%X\&X\'X\(X\)X\*X\+X\,X\-X\.X\/X\0X\1X\2X\3X\4X\5X\6X\7X\8X\9X\:X\;X\<X\=X\>X\?X\@X\AX\BX\CX\DX\EX\FX\GXHIXHJXHKXHLXHMXHNXHOXHPXHQXHRXHSXHTXYUXYVXYWXaXXaYXaZXa[Xa\Xa]X^X_X`XaXbXcXdXeXfXgXhXilojloklolmnomnpmnqmnrmnsmntmnumnvmnwmnxmnymnzmnmn{mn|}~}~}~}~}~}~        hledger-0.5 Ledger.Utils Ledger.Types Ledger.DatesLedger.Commodity Ledger.AmountLedger.AccountNameLedger.PostingLedger.LedgerTransactionLedger.TimeLogLedger.TransactionLedger.RawLedger Ledger.Parse Ledger.Ledger Ledger.IOLedger.AccountLedgerconcatTopPaddedconcatBottomPaddedpadtop padbottompadleftpadright cliptopleftfitto difforzero containsRegexsplitAtElementleaves subtreeatsubtreeinforest treeprunetreemap treefiltertreeanyshowtree showforeststraceltrace parsewith fromparsenonspacespacenonewline restoflinegetCurrentLocalTimeisLeftisRightstrictReadFile rawledgertext rawledgeraccountnametree accountmapAccountaname atransactionsabalance Transactiontnumtstatustdate tdescriptiontaccounttamountttype RawLedger modifier_txns periodic_txns ledger_txnsopen_timelog_entrieshistorical_pricesfinal_comment_linesfilepathHistoricalPricehdatehsymbol1hsymbol2hprice TimeLogEntrytlcode tldatetime tlcomment TimeLogCodeFinalOutOutInSetRequiredHours SetBalanceLedgerTransactionltdateltstatusltcode ltdescription ltcomment ltpostingsltpreceding_comment_linesPeriodicTransactionptperiodicexpr ptpostingsModifierTransaction mtvalueexpr mtpostingsPostingpstatuspaccountpamountpcommentptype PostingTypeBalancedVirtualPostingVirtualPostingRegularPosting MixedAmountMixedAmount commodityquantityprice Commoditysymbolsidespacedcomma precisionSideRL AccountNameIntervalYearly QuarterlyMonthlyWeeklyDaily NoIntervalDateSpan SmartDateshowDate getCurrentDayelapsedSeconds splitSpanparsePeriodExprspanFromSmartDateStringspanFromSmartDatefixSmartDateStr fixSmartDateprevdayparsedatetimeM parsedatetime parsedateM parsedate parsetimewith smartdateyyyymmddymdymydmdmonthmontoday yesterdaytomorrowlastthisnextthing periodexprintervalanddateperiodexprintervalperiodexprdateperiodexprperiodexprintervalperiodexprdatespandoubledatespan fromdatespan todatespan justdatespancommconversionRateamountop costOfAmountconvertAmountTo showAmount showAmount'punctuatethousands isZeroAmountisReallyZeroAmountamountsisZeroMixedAmountisReallyZeroMixedAmountmixedAmountEqualsshowMixedAmountshowMixedAmountOrZeronormaliseMixedAmountcostOfMixedAmountnullamt nullmixedamt missingamtaccountNameComponentsaccountNameFromComponentsaccountLeafNameaccountNameLevelexpandAccountNamestopAccountNamesparentAccountNameparentAccountNamesisAccountNamePrefixOfisSubAccountNameOfsubAccountNamesFromaccountNameTreeFromelideAccountName matchpatsmatchpats_balancematch_positive_patsmatch_negative_pats showPostingisReal isVirtualisBalancedVirtual hasAmount nullledgertxnshowLedgerTransactionshowLedgerTransactionUnelidedshowLedgerTransaction'isLedgerTransactionBalancedbalanceLedgerTransactionentriesFromTimeLogEntriesentryFromTimeLogInOutshowTransactionflattenLedgerTransactionaccountNamesFromTransactionssumTransactionsnulltxnisTransactionInDateSpanrawLedgerEmptyaddLedgerTransactionaddModifierTransactionaddPeriodicTransactionaddHistoricalPriceaddTimeLogEntryrawLedgerTransactionsrawLedgerAccountNamesUsedrawLedgerAccountNamesrawLedgerAccountNameTreefilterRawLedger(filterRawLedgerTransactionsByDescription!filterRawLedgerTransactionsByDate*filterRawLedgerTransactionsByClearedStatus!filterRawLedgerPostingsByRealnessfilterRawLedgerPostingsByDepth$filterRawLedgerTransactionsByAccountcanonicaliseAmountsrawLedgerAmountsrawLedgerCommoditiesrawLedgerPrecisionsrawLedgerConvertTimeLograwLedgerDateSpan LedgerFileCtxCtxctxYear ctxCommod ctxAccountemptyCtxpushParentAccountpopParentAccountgetParentAccountsetYeargetYearprintParseErrorparseLedgerFile parseLedger ledgerFileledgerDirective ledgerInclude expandPathledgerAccountBeginledgerAccountEnd emptyLine ledgercommentledgerModifierTransactionledgerPeriodicTransactionledgerHistoricalPriceledgerDefaultYearledgerTransaction ledgerdateledgerfulldateledgerpartialdateledgerdatetime ledgerstatus ledgercodeledgerpostings ledgerposting normalpostingvirtualpostingbalancedvirtualpostingtransactionaccountnameledgeraccountname postingamount someamountleftsymbolamountrightsymbolamountnosymbolamountcommoditysymbol priceamountamountquantity numberpartsnumberpartsstartingwithdigitnumberpartsstartingwithpoint timelogentrydatedisplayexpr cacheLedgergroupTransactionscalculateBalancestransactionsByAccount filtertxnsledgerAccountNames ledgerAccountledgerAccountsledgerTopAccountsledgerAccountsMatchingledgerSubAccountsledgerTransactionsledgerAccountTreeledgerAccountTreeAtledgerDateSpan accountnamesaccountaccounts topaccountsaccountsmatching subaccounts transactions accounttree accounttreeatdatespan rawdatespan ledgeramountsIOArgs myLedgerPath myTimelogPathmyLedger myTimelog readLedgerreadLedgerWithIOArgsrawLedgerFromStringfilterAndCacheLedger tildeExpandbaseGHC.Base++foldrGHC.Listconcatfilterzipmap GHC.Classes>=fail>>=>>returnMonadFunctorOrd Control.Monad MonadPlusghc-prim GHC.TypesChar GHC.OrderingOrderingString HUnit-1.2.2.1Test.HUnit.Text runTestTTshowPath showCounts runTestTextputTextToShowSputTextToHandlePutTextTest.HUnit.Base performTest testCaseCount testCasePaths~:~?=~=?~?@?=@=?@? assertEqual assertString assertBoolassert Assertable listAssertListAssertableAssertionPredicateassertionPredicateAssertionPredicableTestCaseTestList TestLabelTesttestTestablefailureserrorstriedcasesCountscountspathState ReportStart ReportProblemPathListItemLabelNodeTest.HUnit.Lang assertFailure Assertion Text.PrintfhPrintfprintf PrintfType HPrintfType PrintfArgIsChar Debug.Trace traceShowtrace putTraceMsg Data.Listunwordswordsunlineslinesproductsumfoldl1'foldl1foldl'unfoldrsortsortBy permutations subsequencestailsinitsgroupBygroupdeleteFirstsByunzip7unzip6unzip5unzip4zipWith7zipWith6zipWith5zipWith4zip7zip6zip5zip4genericReplicate genericIndexgenericSplitAt genericDrop genericTake genericLength minimumBy maximumByminimummaximuminsertByinsert mapAccumR mapAccumL partition transpose intercalate intersperse intersectBy intersectunionByunion\\deleteBydeletenubBynub isInfixOf isSuffixOf isPrefixOf findIndices findIndexfind elemIndices elemIndex stripPrefix Data.Char digitToInt GHC.UnicodetoUppertoLowerGHC.Read readLitChar lexLitCharData.Ord comparingapliftM5liftM4liftM3liftM2liftMunlesswhen replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMjoinforever<=<>=>msumforM_forMfilterMguardmapM_mapM sequence_sequence=<<mplusmzeroGHC.Show intToDigit showLitCharunzip3unzipzipWith3zipWithzip3!! concatMaplookupnotElemelemallanyorandreversebreakspansplitAtdroptake dropWhile takeWhilecycle replicaterepeatiteratescanr1scanrfoldr1scanl1scanlfoldllengthnullinitlasttailhead Data.MaybemapMaybe catMaybes listToMaybe maybeToList fromMaybefromJust isNothingisJustmaybeNothingJustMaybeordchrfmapminmax<=><compareisAsciiisLatin1 isControlisPrintisSpaceisUpperisLowerisAlphaisDigit isOctDigit isHexDigit isAlphaNumGTEQLTcontainers-0.3.0.0 Data.TreeunfoldForestM_BFunfoldTreeM_BF unfoldForestM unfoldTreeM unfoldForest unfoldTreelevelsflatten drawForestdrawTree subForest rootLabelTreeForestregex-compat-0.92 Text.Regex splitRegexsubRegex matchRegexAll matchRegexmkRegexWithOptsmkRegexregex-posix-0.94.1Text.Regex.Posix.WrapRegex time-1.1.4Data.Time.LocalTime.LocalTimeutcToLocalZonedTime getZonedTimezonedTimeToUTCutcToZonedTimelocalTimeToUT1ut1ToLocalTimelocalTimeToUTCutcToLocalTimelocalTimeOfDaylocalDay LocalTime zonedTimeZonezonedTimeToLocalTime ZonedTimeData.Time.LocalTime.TimeOfDaytimeOfDayToDayFractiondayFractionToTimeOfDaytimeOfDayToTimetimeToTimeOfDaylocalToUTCTimeOfDayutcToLocalTimeOfDaymakeTimeOfDayValidmiddaymidnighttodSectodMintodHour TimeOfDayData.Time.LocalTime.TimeZonegetCurrentTimeZone getTimeZoneutctimeZoneOffsetStringtimeZoneOffsetString'hoursToTimeZoneminutesToTimeZone timeZoneNametimeZoneSummerOnlytimeZoneMinutesTimeZoneData.Time.ClockgetCurrentTimeData.Time.Clock.UTCDiff diffUTCTime addUTCTimeData.Time.Clock.UTC utctDayTimeutctDayUTCTimeNominalDiffTimeData.Time.Calendar.GregorianaddGregorianYearsRollOveraddGregorianYearsClipaddGregorianMonthsRollOveraddGregorianMonthsClipgregorianMonthLength showGregorianfromGregorianValid fromGregorian toGregorianData.Time.Calendar.OrdinalDate isLeapYearData.Time.Calendar.DaysdiffDaysaddDaystoModifiedJulianDayModifiedJulianDayDayData.Time.Clock.ScalepicosecondsToDiffTimesecondsToDiffTimegetModJulianDate ModJulianDate UniversalTimeDiffTime lowercase uppercasestriplstriprstripdropws elideLeft elideRightrootsubsbranches splitspannextday startofdaythisweekprevweeknextweek startofweek thismonth prevmonth nextmonth startofmonth thisquarter prevquarter nextquarterstartofquarterthisyearprevyearnextyear startofyear firstJust datesepcharmonths monthabbrevsweekdaysweekdayabbrevs monthIndexmonIndex nulldatespan mkdatespanunknowndollareuropoundhourdollarseurospoundshoursdefaultcommoditiesnegateAmountPreservingPricesumAmountsPreservingPrice acctsepchar negateprefix isnegativepatabspat positivepats negativepats matchregexnullrawpostingnonzerobalanceerroraccountnamechar compareopnullacctledgerdefaultpathtimelogdefaultpath ledgerenvvar timelogenvvarnoioargs