úÎ!™ulÿË      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê SafelxËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿLM      !"#$%&'()*+,-./0123456789:NOPRQSSafel» SafelùM;T<=>V?U@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstWuvwxyz{|}~€‚ƒNonelsÿb "&ÞÝ' ßàâá(")º¹¸·¶µ´³²±°¯®­¬«ª©* ×Ö+ÕÔÓÒÑÐ,-.     /+*)($#0V§12ÈÇÆÅÄÃÂÁÀ¿¾½¼»3ÜÛÚÙØ4]èç„…56$#%^7œ˜ž™š”“›–•—8wuvt9:; !<JM=>?@ABCKLDPQREFGHINOSTUWXYZYXZ[\_ba`dcefghijklmnopqrsxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’Ÿ ¡¢£¤¥¦¨ÉÊËÌÍÎÏãäåæéêëìíîïðñòóôõö÷øùúûüýþÿ  !%&',-./0123456789:;<=>?@ABCDEFGHIJKLMNOPRQSTVUW[]^_`ÿp &ÞÝ' ßàâá(")º¹¸·¶µ´³²±°¯®­¬«ª©* ×Ö+ÕÔÓÒÑÐ,-.     /+*)($#0V§12ÈÇÆÅÄÃÂÁÀ¿¾½¼»3ÜÛÚÙØ4]èç6$#%^7œ˜ž™š”“›–•—8wuvt:; !<JM=>?@ACKLDPQREFGINOTU\_xyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ’Ÿ ¡¢£¤¥¦¨ÊËÌÍÎÏãäåæéêëìíîïðñòóôõö÷øùúûüýþÿ  !%&'",-utba`efghijklmnopqrs‘’É/0123456789:;<=>?@ABCDEFGHIJKdc; !:H9BX^S]_`LMNOPRQSTVUWZ[5YZYX[-.,WNonel/¾adistribution-opensuse4A (quite possibly inefficient) re-implementation of git stripspace. This function normalizes a X* buffer to conform to the following rules:%All trailing white space is stripped.FEmpty lines at the beginning or at the end of the buffer are stripped.BConsecutive empty lines between paragraphs are collapsed into one.\r\n" line endings are normalized into \n.@If the buffer is not empty, then its last line is terminated by \n.eIf the buffer is empty (i.e. it contains only white space), then it comes out as the empty string.aaNonelUCcdistribution-opensuseÿ Both releases contained the given change log file, and these files differed so that the given text was added at the top of the new one. The text undergoes some amount of cleanup, i.e. we'll trim leading empty lines at the top, trailing whitespace, and trailing empty lines at the end.ddistribution-opensuse+Neither release contains a change log file.edistribution-opensuseA change log file exists (and its name is returned), but it's identical in both releases. In other words, upstream probably forgot to document the release.fdistribution-opensuse±Both releases contain a set of files that look like they might be a change log, but their intersection is empty! This happens, for example, when upstream has renamed the file.gdistribution-opensuseòMultiple change log files exists in both directories. Now, it would probably work out okay if we'd just look at the diffs of both of them, respectively, but it felt like a good idea to err on the side of caution. This case is rare anyways.hdistribution-opensuseguessChangelogÿ6 accepts up to 10 lines of unmodified text at the top of the upstream change log file because some people like to have a short introduction text there etc. If that header becomes too large, however, then we return this error because we expect upstream to add text at the top, not in the middle of the file.idistribution-opensuseÔThis happens when upstream edits the file in ways other than just adding at the top. Sometimes people re-format old entries or rewrite URLs or fix typos, and in such a case it feels to risky to trust the diff.jdistribution-opensuseÿUAutomatically guess the differences between to releases of a package by looking at the change log file provided by upstream. The function as arguments the paths of two directories that contain the extracted release tarballs. The first arguments ought to point to the older release, the second paths ought to point to the updated version.IThe function uses the following algorithm to detect the relevant changes: OScan both directories for files that look like they might be change logs.:If both directories contain the same candidate file, e.g.  ChangeLog, then use that.Compute the differences between the change log files and check that all modifications are additions at the top of the file.Return those additions as X. bcdfgehij jbcdfgehiNone6Kl\úldistribution-opensuseBmkEMailAddress " accept . full (rfc822) . syntax @ example . org "4Just (EMailAddress "accept.full.syntax@example.org")#mkEMailAddress "@this@is@not@good@"Nothing;prettyShow (fromString "joe @ example.net" :: EMailAddress)"joe@example.net"mdistribution-opensuse3Constructor function for e-mail addresses. Returns K( if the input is syntactically invalid.ndistribution-opensuse5Accessor function for the underlying path of strings.lmnlmnNone6<Klfµ‚distribution-opensuse4Note that the input must be terminated by a newline.QparseTest parseDateAddressLine "Wed Jun 27 09:25:07 UTC 2018 - foo@example.org\n"8(2018-06-27 09:25:07 UTC,EMailAddress "foo@example.org")†distribution-opensuseAConsume an empty line, i.e. a line that contains only whitespace.ƒdistribution-opensuse§Consume all text until the end of the file or a dashed line is found. In the latter case, the dashed line is consumed as well. This is unfortunate, but it's how the æ! combinator works, unfortunately,‡distribution-opensuse!Appropriate format parameter for ˆ and ‰. yz{|}~€‚ƒ ~yz{|}€‚ƒNone6lgS ’“”•–—˜™š ’“”•—˜–™šSafelgÙ¤¤ None6<Klp˜¥distribution-opensuse0Projects are identified on OBS by a string path.8parse "project id" "SUSE:SLE-12-SP2:Update" :: ProjectId(ProjectId ["SUSE","SLE-12-SP2","Update"]9parseM "project id" "SUSE::SLE-12-SP2" :: Maybe ProjectIdNothing.parseM "project id" ":SUSE" :: Maybe ProjectIdNothing.parseM "project id" "SUSE:" :: Maybe ProjectIdNothing¦distribution-opensuse-Constructor function for project identifiers.1TODO: Figure out how to deal with the [] project.§distribution-opensuse5Accessor function for the underlying path of strings.¥¦§¥¦§ None6Kltú¸distribution-opensuseType synonym for convenience.¹distribution-opensuseType synonym for convenience.»distribution-opensuse3Constructor function for typed request identifiers.¼distribution-opensuse4Accessor function for the underlying natural number.¸¹º»¼º»¼¸¹ Safelu`ÊÊŠ !"#$%$&$'$()*)+,-./012"3"4"5"6789:;<=>?@$A$B)CDE"F"GHIJ)KLM"NDO"PQR1STUVWXYZ[\]^]_]`]a]bcdefgh]i"j]k]lmnop]qrs]touov]w]x]yz{|}~L€‚ƒ„…†‡ˆ‰Š‹ŒŠŽQQ‘’“”•–—˜—™7š7›7œ77ž7Ÿ7 7¡7¢7£7¤7¥7¦7§W¨W©WªW«W¬­®¯°±²³´µ¶·¸¹º»¼¹½¹¾U¿UÀUÁUÂUÃUÄUÅUÆUÇUÈUÉUÊUËUÌUÍUÎUÏUÐUÑUÒUÓUÔUÕÖ×ÖØÖÙÖÚ’ÛoÜLÝLÞLßàáDâDãDäDåDæDçDèDéDêDëDìDíDîDïDðDñDòDóDôDõDöD÷DøDùDúDûDüDýDþDÿDD}""""""" " " " " """"""""$$$$$$QQQQQ Q!"#$%&'()*+,-./0123456789:;<=>=?@ABCDEFGHIJKLMNOPQRSTUVWXYZY[Y\)])^)_)`)a)b)c)d)e)fghijklmnopqrpqspqtpqupqvpqwpqxpqypqzpq{pq|pq}pq~pqpq€pqpq‚pqƒpq„pq…pq†pq‡pqˆpq‰pqŠpq‹pqŒpqpqŽ‘’“”•“”–“”—“”˜“”™“”š›œ›œž›œŸ› ¡‡ˆ¢‡ˆ£‡ˆ‰‡¤¥¦§¨©ª«¬¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÂÃÄÅÆÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                   !"#$%&'()*+,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,@,A,B,C,DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnonppqrstuvwxwywzw{w|w}w~ww€ww‚wƒ›œ„›œ…›œ†›œ†›œ‡›œˆ› ‰› Š› ‹› Œ› › Ž› › › ‘› 9› ’› “› ”› •› –› —› ˜› ™› š› ›› œ› › ž› Ÿ›  › ¡› ¢› £› ¤› ¥› ¦› §› ¨› ©› ª› «› ¬› ­› ®› ¯› °› (› ±› ²› ³› ´› µ› ¶› ·› ¸› ¹› ›º»›º¼›º½›º¾›º¿›ºÀ›ºÀ›ºÁ›ºÂ›ºÃ›ºÄ›ºÅ›ºÆ›ºÇ›ºÈÉÊÉËÌ͇ÎχÐÑÒ2distribution-opensuse-1.1.1-KdkV8eZ0TwJLLyOY8WXEgyOpenSuse.Prelude'OpenSuse.Prelude.PrettyPrinting.OrphansOpenSuse.StripSpaceOpenSuse.GuessChangeLogOpenSuse.Types.EMailAddressOpenSuse.Types.ChangeLogOpenSuse.Types.IssueOpenSuse.Types.PackageNameOpenSuse.Types.ProjectIdOpenSuse.Types.RequestIdOpenSuse.Types.UserNameOpenSuse.Prelude.ParserOpenSuse.Prelude.PrettyPrintingbaseGHC.Base++ghc-primGHC.PrimseqGHC.Listfilterzip System.IOprint Data.Tuplefstsnd otherwisemap$GHC.Num fromInteger-GHC.Real fromRationalGHC.EnumenumFrom enumFromThen enumFromToenumFromThenTo GHC.Classes==>=negate>>=>>fmapreturn Data.String fromString fromIntegral realToFrac toInteger toRational Control.Monadguard<>memptymappendmconcatjoin<*>pure*>BoundedEnumEq GHC.FloatFloating FractionalIntegralMonadFunctorNumOrdGHC.ReadReadReal RealFloatRealFracGHC.ShowShowIsString Applicative Data.FoldableFoldableData.Traversable Traversable GHC.GenericsGeneric SemigroupMonoid GHC.TypesBoolCharDoubleFloatInt integer-gmpGHC.Integer.TypeInteger GHC.NaturalNaturalMaybeOrderingRationalIOWordGHC.WordWord8 Data.EitherEitherFalseNothingJustTrueLeftRightLTEQGTbytestring-0.10.8.2Data.ByteString.Internal ByteString Data.Functor<$>StringreadList&hashable-1.2.7.0-Q2TKVDwk4GBEHmizb4teZData.Hashable.ClassHashable text-1.2.3.0Data.Text.InternalText time-1.8.0.2 Data.Time.Clock.Internal.UTCTimeUTCTime$aeson-1.4.0.0-LIOMjdhUbDoEPhbHMMZ6tyData.Aeson.Types.ToJSONToJSONData.Aeson.Types.FromJSONFromJSONShowSshow<* Text.Readreadmplusmzero MonadPlusControl.Monad.IO.ClassliftIOMonadIOmfilter<$!>unless replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMforever<=<>=>filterMforMsequencemapM sequenceAtraversereadIOreadLn appendFile writeFilereadFileinteract getContentsgetLinegetCharputStrLnputStrputCharGHC.IO.ExceptionioErrorGHC.IOFilePath userErrorIOErrornotElemallanyorand concatMapconcatmsum sequence_forM_mapM_productsumminimummaximumelemlengthnullfoldl1foldr1foldlfoldrfoldMap Data.OldListunwordswordsunlineslinesreadseitherlex readParen readsPrecText.ParserCombinators.ReadPReadSatanhacoshasinhtanhcoshsinhatanacosasintancossinlogBase**sqrtlogexppiatan2isIEEEisNegativeZeroisDenormalized isInfiniteisNaN scaleFloat significandexponent encodeFloat decodeFloat floatRange floatDigits floatRadixvoidlcmgcd^^^oddevendivModquotRemmoddivremquotrecip/floorceilingroundtruncateproperFractionmaxBoundminBoundfromEnumtoEnumpredsucc showParen showStringshowCharshowsshowList showsPrecunzip3unzipzipWith3zipWithzip3!!lookupreversebreakspansplitAtdroptake dropWhile takeWhilecycle replicaterepeatiteratescanr1scanrscanl1scanlinitlasttailhead Data.Maybe fromMaybemaybeuncurrycurrysubtractsignumabs*+asTypeOfuntil$!flip.constidapliftM5liftM4liftM3liftM2liftMwhen=<<stimessconcat<$GHC.Err undefinederrorWithoutStackTraceerror/=compare<=&&||not<>maxminbinary-0.8.5.1Data.Binary.ClassBinarycontainers-0.5.11.0Data.Set.InternalSetdeepseq-1.4.3.0Control.DeepSeqNFData"extra-1.6.9-AT5lAJP3xwQ1W64AcsUUkCControl.Monad.Extra firstJustMfindMandMorMallManyM&&^||^notMifMunlessMwhenMwhileMloopMloop mapMaybeM mconcatMapM concatForM concatMapM partitionMfold1M_fold1MeitherMmaybeMunit whenMaybeM whenMaybe whenJustMwhenJustparsec-3.1.13.0Text.Parsec.Prim runParser runParserT+parsec-class-1.0.0.0-G83sNEpcT453ikmSK7xxvQText.Parsec.ClassparseparseM CharParserparser HasParser ErrorContextpretty-1.1.3.6Text.PrettyPrint.HughesPJClass prettyShowpPrintPrettyText.PrettyPrint.HughesPJDoc utctDayTimeutctDay!Data.Time.Clock.Internal.DiffTimeDiffTime$fPrettyNaturalLazyByteStringLazyTextpackText unpackText stripSpaceGuessedChangeLogNoChangeLogFilesUndocumentedUpdateNoCommonChangeLogFilesMoreThanOneChangeLogFileUnmodifiedTopIsTooLargeNotJustTopAdditionsguessChangeLog$fShowGuessedChangeLog EMailAddressmkEMailAddressunEMailAddress$fPrettyEMailAddress$fIsStringEMailAddress$fHasParserEMailAddress$fShowEMailAddress$fEqEMailAddress$fOrdEMailAddress$fGenericEMailAddress$fHashableEMailAddress$fBinaryEMailAddress$fNFDataEMailAddressEntry changedAt changedBychangeDescription ChangeLog parseEntryparseDashedLineparseDateAddressLineparseDescription$fHasParserEntry $fNFDataEntry$fHasParserChangeLog $fShowEntry $fEqEntry $fOrdEntry$fGenericEntry$fShowChangeLog $fEqChangeLog$fOrdChangeLog$fGenericChangeLog$fNFDataChangeLog$fSemigroupChangeLog$fMonoidChangeLogIssueBscCve parseIssue showIssueparseCveparseBscisCveisBsc$fFromJSONKeyIssue$fFromJSONIssue $fNFDataIssue $fBinaryIssue$fHashableIssue $fShowIssue $fEqIssue $fOrdIssue$fGenericIssue PackageName ProjectId mkProjectId unProjectId$fToJSONKeyProjectId$fToJSONProjectId$fFromJSONKeyProjectId$fFromJSONProjectId$fHasParserProjectId$fPrettyProjectId$fIsStringProjectId$fShowProjectId $fEqProjectId$fOrdProjectId$fGenericProjectId$fHashableProjectId$fBinaryProjectId$fNFDataProjectId$fSemigroupProjectId$fMonoidProjectIdReleaseRequestIdMaintenanceRequestId RequestId mkRequestId unRequestId$fHasParserRequestId$fPrettyRequestId$fIsStringRequestId$fToJSONRequestId$fFromJSONRequestId$fShowRequestId $fEqRequestId$fOrdRequestId$fEnumRequestId$fGenericRequestId$fHashableRequestId$fBinaryRequestId$fNFDataRequestIdUserNametryReplyErrorOkText.Parsec.Error ParseErrorText.Parsec.CharstringcharsatisfyanyCharoctDigithexDigitdigitletteralphaNumloweruppertab endOfLinecrlfnewlinespacespacesnoneOfoneOfText.Parsec.Combinator parserTraced parserTracemanyTill notFollowedByeofanyTokenchainr1chainl1chainlchainrcountendByendBy1sepEndBy sepEndBy1sepBy1sepBymany1 skipMany1betweenoptional optionMaybeoptionchoice updateStatesetState modifyStateputStategetStateupdateParserStatesetParserStategetParserStatesetInput setPositiongetInput getPosition parseTestrunPrunPT manyAccumskipManymany tokenPrimEx tokenPrimtoken lookAheadtokenslabelslabel<|> parserPlus parserZero parserFailmergeErrorReply parserBind parserReturn parsecMapmkPT runParsecT unexpectedsysUnExpectError unknownErrorParsecTParsecConsumedEmptyState stateInputstatePos stateUserStreamunconserrorPosText.Parsec.PossetSourceColumn setSourceLine setSourceNameincSourceColumn incSourceLine sourceColumn sourceLine sourceName SourceNameLineColumn SourcePos prettyParen prettyNormal PrettyLevel pPrintPrec pPrintList fullRender renderStylerenderfirstfsepfcatcatsep<+>$+$$$ punctuatehangnestvcathsephcat reduceDocmaybeDoubleQuotes maybeQuotes maybeBraces maybeBrackets maybeParensbracesbracketsparens doubleQuotesquotesrationaldoublefloatintegerintrbracelbracerbracklbrackrparenlparenequalscoloncommasemiisEmptyempty zeroWidthText sizedTextptexttext#Text.PrettyPrint.Annotated.HughesPJstyle TextDetailsChrStrPStrStylemode lineLengthribbonsPerLineModePageMode ZigZagModeLeftMode OneLineModeControl.Monad.Fail MonadFailfailparseEmptyLinechangeLogDateFormatData.Time.Format formatTimeData.Time.Format.Parse parseTimeM