hms/0000755000176200001440000000000013605457502011050 5ustar liggesusershms/NAMESPACE0000644000176200001440000000271313605127176012273 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("[<-",hms) S3method("[[",hms) S3method("units<-",hms) S3method(as.POSIXct,hms) S3method(as.POSIXlt,hms) S3method(as.character,hms) S3method(as.hms,POSIXlt) S3method(as.hms,POSIXt) S3method(as.hms,default) S3method(c,hms) S3method(format,hms) S3method(print,hms) S3method(vec_cast,hms) S3method(vec_cast.POSIXct,hms) S3method(vec_cast.POSIXlt,hms) S3method(vec_cast.character,hms) S3method(vec_cast.difftime,hms) S3method(vec_cast.double,hms) S3method(vec_cast.hms,POSIXct) S3method(vec_cast.hms,POSIXlt) S3method(vec_cast.hms,character) S3method(vec_cast.hms,default) S3method(vec_cast.hms,difftime) S3method(vec_cast.hms,double) S3method(vec_cast.hms,hms) S3method(vec_cast.hms,integer) S3method(vec_cast.integer,hms) S3method(vec_ptype2,hms) S3method(vec_ptype2.character,hms) S3method(vec_ptype2.difftime,hms) S3method(vec_ptype2.double,hms) S3method(vec_ptype2.hms,character) S3method(vec_ptype2.hms,default) S3method(vec_ptype2.hms,difftime) S3method(vec_ptype2.hms,double) S3method(vec_ptype2.hms,hms) S3method(vec_ptype2.hms,integer) S3method(vec_ptype2.integer,hms) S3method(vec_ptype_abbr,hms) S3method(vec_ptype_full,hms) export(as.hms) export(as_hms) export(hms) export(is.hms) export(is_hms) export(new_hms) export(parse_hm) export(parse_hms) export(round_hms) export(trunc_hms) export(vec_cast.hms) export(vec_ptype2.hms) import(rlang) import(vctrs) importFrom(methods,setOldClass) importFrom(pkgconfig,get_config) hms/README.md0000644000176200001440000000470613511055774012337 0ustar liggesusers # hms [![Lifecycle: maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) [![Travis-CI Build Status](https://travis-ci.org/tidyverse/hms.svg?branch=master)](https://travis-ci.org/tidyverse/hms) [![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/tidyverse/hms?branch=master&svg=true)](https://ci.appveyor.com/project/tidyverse/hms) [![codecov](https://codecov.io/gh/tidyverse/hms/branch/master/graph/badge.svg)](https://codecov.io/gh/tidyverse/hms) [![CRAN\_Status\_Badge](https://www.r-pkg.org/badges/version/hms)](https://cran.r-project.org/package=hms) ## Overview The hms package provides a simple class for storing durations or time-of-day values and displaying them in the hh:mm:ss format. This class is intended to simplify data exchange with databases, spreadsheets, and other data sources: - Stores values as a numeric vector that contains the number of seconds since midnight - Supports construction from explicit hour, minute, or second values - Supports coercion to and from various data types, including `POSIXt` - Can be used as column in a data frame - Based on the `difftime` class - Values can exceed the 24-hour boundary or be negative - By default, fractional seconds up to a microsecond are displayed, regardless of the value of the `"digits.secs"` option ## Installation ``` r # The easiest way to get hms is to install the whole tidyverse: install.packages("tidyverse") # Alternatively, install just hms: install.packages("hms") # Or the the development version from GitHub: # install.packages("devtools") devtools::install_github("tidyverse/hms") ``` ## Usage The following example showcases ways of using the `hms` class standalone or as a data frame column. ``` r library(hms) hms(56, 34, 12) #> 12:34:56 as_hms(1) #> 00:00:01 as_hms("12:34:56") #> 12:34:56 as_hms(Sys.time()) #> 11:18:52.496955 as.POSIXct(hms(1)) #> [1] "1970-01-01 00:00:01 UTC" data.frame(hours = 1:3, hms = hms(hours = 1:3)) #> hours hms #> 1 1 01:00:00 #> 2 2 02:00:00 #> 3 3 03:00:00 ``` ----- Please note that the ‘hms’ project is released with a [Contributor Code of Conduct](https://github.com/tidyverse/hms/blob/master/CODE_OF_CONDUCT.md). By contributing to this project, you agree to abide by its terms. hms/man/0000755000176200001440000000000013602661175011623 5ustar liggesusershms/man/vec_cast.hms.Rd0000644000176200001440000000110113502523706014454 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cast.R \name{vec_cast.hms} \alias{vec_cast.hms} \title{Casting} \usage{ \method{vec_cast}{hms}(x, to, ...) } \arguments{ \item{x}{Vectors to cast.} \item{to}{Type to cast to. If \code{NULL}, \code{x} will be returned as is.} \item{...}{For \code{vec_cast_common()}, vectors to cast. For \code{vec_cast()} and \code{vec_restore()}, these dots are only for future extensions and should be empty.} } \description{ Double dispatch methods to support \code{\link[vctrs:vec_cast]{vctrs::vec_cast()}}. } hms/man/hms-package.Rd0000644000176200001440000000145013602661203014262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hms.R \docType{package} \name{hms-package} \alias{hms-package} \title{hms: Pretty Time of Day} \description{ \if{html}{\figure{logo.png}{options: align='right' alt='logo' width='120'}} Implements an S3 class for storing and formatting time-of-day values, based on the 'difftime' class. } \details{ \Sexpr[results=rd, stage=render]{hms:::lifecycle("stable")} } \seealso{ Useful links: \itemize{ \item \url{https://hms.tidyverse.org/} \item \url{https://github.com/tidyverse/hms} \item Report bugs at \url{https://github.com/tidyverse/hms/issues} } } \author{ \strong{Maintainer}: Kirill Müller \email{krlmlr+r@mailbox.org} Other contributors: \itemize{ \item The R Consortium [funder] \item RStudio [funder] } } hms/man/hms.Rd0000644000176200001440000000414713602662754012713 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hms.R \name{hms} \alias{hms} \alias{new_hms} \alias{is_hms} \alias{as_hms} \alias{as.POSIXct.hms} \alias{as.POSIXlt.hms} \alias{as.character.hms} \alias{format.hms} \alias{print.hms} \title{A simple class for storing time-of-day values} \usage{ hms(seconds = NULL, minutes = NULL, hours = NULL, days = NULL) new_hms(x = numeric()) is_hms(x) as_hms(x) \method{as.POSIXct}{hms}(x, ...) \method{as.POSIXlt}{hms}(x, ...) \method{as.character}{hms}(x, ...) \method{format}{hms}(x, ...) \method{print}{hms}(x, ...) } \arguments{ \item{seconds, minutes, hours, days}{Time since midnight. No bounds checking is performed.} \item{x}{An object.} \item{...}{additional arguments to be passed to or from methods.} } \description{ The values are stored as a \link{difftime} vector with a custom class, and always with "seconds" as unit for robust coercion to numeric. Supports construction from time values, coercion to and from various data types, and formatting. Can be used as a regular column in a data frame. \code{hms()} is a high-level constructor that accepts second, minute, hour and day components as numeric vectors. \code{new_hms()} is a low-level constructor that only checks that its input has the correct base type, \link{numeric}. \code{is_hms()} checks if an object is of class \code{hms}. \code{as_hms()} forwards to \code{\link[=vec_cast]{vec_cast()}}. } \details{ For \code{hms}, all arguments must have the same length or be \code{NULL}. Odd combinations (e.g., passing only \code{seconds} and \code{hours} but not \code{minutes}) are rejected. For arguments of type \link{POSIXct} and \link{POSIXlt}, \code{as_hms()} does not perform timezone conversion. Use \code{\link[lubridate:with_tz]{lubridate::with_tz()}} and \code{\link[lubridate:force_tz]{lubridate::force_tz()}} as necessary. } \examples{ hms(56, 34, 12) hms() new_hms(as.numeric(1:3)) # Supports numeric only! try(new_hms(1:3)) as_hms(1) as_hms("12:34:56") as_hms(Sys.time()) as.POSIXct(hms(1)) data.frame(a = hms(1)) d <- data.frame(hours = 1:3) d$hours <- hms(hours = d$hours) d } hms/man/vec_ptype2.hms.Rd0000644000176200001440000000161513602661203014753 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/coerce.R \name{vec_ptype2.hms} \alias{vec_ptype2.hms} \title{Coercion} \usage{ \method{vec_ptype2}{hms}(x, y, ..., x_arg = "", y_arg = "") } \arguments{ \item{x}{Vector types.} \item{y}{Vector types.} \item{...}{These dots are for future extensions and must be empty.} \item{x_arg}{Argument names for \code{x} and \code{y}. These are used in error messages to inform the user about the locations of incompatible types (see \code{\link[vctrs:stop_incompatible_type]{stop_incompatible_type()}}).} \item{y_arg}{Argument names for \code{x} and \code{y}. These are used in error messages to inform the user about the locations of incompatible types (see \code{\link[vctrs:stop_incompatible_type]{stop_incompatible_type()}}).} } \description{ Double dispatch methods to support \code{\link[vctrs:vec_ptype2]{vctrs::vec_ptype2()}}. } hms/man/round_hms.Rd0000644000176200001440000000122613562622301014102 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/round.R \name{round_hms} \alias{round_hms} \alias{trunc_hms} \title{Round or truncate to a multiple of seconds} \usage{ round_hms(x, secs) trunc_hms(x, secs) } \arguments{ \item{x}{A vector of class \link{hms}} \item{secs}{Multiple of seconds, a positive numeric. Values less than one are supported} } \value{ The input, rounded or truncated to the nearest multiple of \code{secs} } \description{ Convenience functions to round or truncate to a multiple of seconds. } \examples{ round_hms(as_hms("12:34:56"), 5) round_hms(as_hms("12:34:56"), 60) trunc_hms(as_hms("12:34:56"), 60) } hms/man/Deprecated.Rd0000644000176200001440000000255013602661203014144 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hms.R \name{Deprecated} \alias{Deprecated} \alias{is.hms} \alias{as.hms} \alias{as.hms.default} \alias{as.hms.POSIXt} \alias{as.hms.POSIXlt} \title{Deprecated functions} \usage{ is.hms(x) as.hms(x, ...) \method{as.hms}{default}(x, ...) \method{as.hms}{POSIXt}(x, tz = pkgconfig::get_config("hms::default_tz", ""), ...) \method{as.hms}{POSIXlt}(x, tz = pkgconfig::get_config("hms::default_tz", ""), ...) } \arguments{ \item{x}{An object.} \item{...}{Arguments passed on to further methods.} \item{tz}{The time zone in which to interpret a POSIXt time for extracting the time of day. The default is now the zone of \code{x} but was \code{"UTC"} for v0.3 and earlier. The previous behavior can be restored by calling \code{pkgconfig::set_config("hms::default_tz", "UTC")}, see \code{\link[pkgconfig:set_config]{pkgconfig::set_config()}}.} } \description{ \code{is.hms()} has been replaced by \code{\link[=is_hms]{is_hms()}}. \code{as.hms()} has been replaced by \code{\link[=as_hms]{as_hms()}}, which is no longer generic and also does not have a \code{tz} argument. It also uses the time zone of the argument for conversion, not the current system's timezone. Change the timezone before converting if necessary, e.g. using \code{\link[lubridate:with_tz]{lubridate::with_tz()}}. } \keyword{internal} hms/man/figures/0000755000176200001440000000000013452227404013263 5ustar liggesusershms/man/figures/lifecycle-defunct.svg0000644000176200001440000000170413452227404017373 0ustar liggesuserslifecyclelifecycledefunctdefunct hms/man/figures/lifecycle-maturing.svg0000644000176200001440000000170613452227404017573 0ustar liggesuserslifecyclelifecyclematuringmaturing hms/man/figures/logo.png0000644000176200001440000005277213452227404014746 0ustar liggesusersPNG  IHDRX?gAMA a cHRMz&u0`:pQ<bKGD pHYs!7!73XztIME  ֆxTIDATxwdgu}:I&'iFiG 4kׁ]絽kJ~7bc{_c/6x1& EfFSӹ+{ǭU~RuͿ{<'(VO@,PR@QO/!:P<(MĒ{~x(Kb؇P/s|L GmC8a rW/GipqLiJ[UԊQc@ ?mZ)Jۯq?|kO!/C o2iD+ GˈpYӔfY7GLFiMWYXp h=lU+/ (JLi:(Mq!/u/a㤣fϭᧀ_6.O_O)8\K0(>. kxŧYH:,Jׁ>(>hoiK4gXpDh䣈%X]1g|)"(Um^)ֲitŹsp]R!WnOD`)LJPJ GPa \8^DW۴"sۆ<.D;^ GhJ+3"dr"G,a'؍k|it5{Њ[w13s4>"';1, a1t9N/xiGSrVQ~X6s~Z޽N5& b5{Nx+ݠ(tX} JwbqUig#1 ?kuo.d"Bͷ;)@Ddh/=*ϟzx*Q$?W0,;-͆?>xݦp6 7˃%2kJ$ۃ_3 GcXUSd5MhYb83A'V̴j`'^`(@]C5T#lhFS:0; `əh~ K0dBly3-mV_8}Ցl,KPZݭ~1sߌxn**"DKq]X5*ىwwE)"CA P1.>nݭZ,88Nb1q,pi~!(E{V`?y!"\.**ʨo4KAxlAv+ 19wtM!PNe VwVVF22XX"KSĒ}b 4?D@%!* OOx})- smXn4pn;mQi굦'8iEp-B2hi~ʪ%!t]tv ׷r#p}=$BN|ːDW!皟8-#6GUe` Ӝ㦦}DbUD"|ŧP<'mq !ǿ 䛻*wpp.nY AR^YF4h?.R`C1{Ivϭn+J[>8 NCqQVQJiy۵+=dQiOnbnX1n~"4JJC{i2qL%S2<8avX[<%r+e_ W+."f„a|2Y>|şnV͟|桛~He)%cnyEn=u7#JV?w#?[=K]VGn2dGSJ<@*-q㌗ 1T̓knãOL{fW5@l@h܀7v*HK_Kz8i~ eռk۝kEn~R?W=O*݈qi:kώʖ){=))+O<͡'^iKO,i+|χո 2D|atn09sWM.)8s{N xGfwLL[l[iKNO r+J)p~B3 TTf3~wK)93xaVVBuwR/iQ(RQhI\}XE&mz(4M])ۿ4%#'%r+FFt?cwEYSrʫp{=2 4MSO=AF]|Py!E[rSraN 02r{\A<>7a`dBiBE+#md) yg5X4q`?*k}M2p-_xڷ}WdnlkW"Bw{[)ŕk \q]>T50;^/94ͪv{^a`nŢEW<غ "qJiɅ?VESctTd\̽ƠP c~օ e0(#= [$,W6~״/EvBJ)|~PMײqAE>lŢ6H?J{7.'`fF=\/HrBѮsߔП\H{Q sfI3X9."i&'13_%IeM^׵G2ij nT FR̅M9?VʲOZ)R+{0E°@  EFK$xQPQӎD^}Pr~/iu뱍FW\ޖyV]͟|vbea5 y) CO1WhUޚT˧hJq! #z]d2Qв ШՔ"a9]qo\NsɆbx\Y # {$E9 9\sy-Il~@.n9,_n.ttF,DI$۳x_#y#aKaȼأ YR{Ng32' ;D0OYBR%"`w/hǰҊ0)&iRa&>(F7]4eɜ-θpʹN8 x)LmHa ,S'ꋒJ~K(>keV8gbed4OBq<.JCJܺSnay̘ ƈ$ R|An@(n~h.PinoA KL*ű 'v[TxnreMWev_E=60 a TQSv[Tc*~Ba}>|%^44YC]ObI4V쳐4d,˰HFS$pNU/-JSW%Xس7Oq+K5~~6E֓0 G}͹d,3[ԶnwyаJ]i . ع\''=H;\%"^Yf!syx`ͭ6"p ䷸2rmXbKdTcqyuB!< DC.G;.(нpyu|e~!Jz=WOP˖/pX[7Tڈ) -$h?+Y{,S xn>$f>a. zT"x\Z<eL[a !OjwtldU% *XmxRPPe'cAǖX^qFc$T@+ƍot'˝-YbQ f+w_Bv?j?NΡYmKLSuu x47J\]&IY[cA4MsV"BuG6ﲣ4qW:a%g,ÚD%Gw5~Dl=yžzFfRfF , ZJǚfGe /^=ȉLI-F$RRr_=tF7gݧ6f3iEDД{|^ݍ%2nm jJ* s[B,tP46D_;/^=Y%g][LjD,58jh8=`jieSf'}u[n&oM3ϤU1nM՛i.ky j8wA v^;(<'y8˘LRi(0K,B7UoG?/&pl XA7&^8̡Sv_in-bJ"V&X4a[y\M[iu3b*aM% vǜK7(`WGzh̆҆候ȝdMkV^zo0ceqDLnARG.waU@29Bljt{nfmvB~y]>H2e[=|Zn݁+@v_m+q67cc%you ASZ^(e$M)2k'iޚmQJ)"kJqyuug1M$+ |ڤܕo';6h眚/L1a=U҆IG҈e9~/kJ#•78]]`v2G2y4X%kIU_XYKO"nَ%,< 9fH:X7w3v'ᕃG4E = ]^ކ=lÝ 8=p :hK4}YN,=#VsaOj}O \RsWC9M@݈4N%U4ރݼx GΑ4RhJ+ڽ(j$R K3<ŎVi _)/w"a$ d+JG$:g1(ރWM=5[2bzѼ漏%e'vCK$u፮c FPK|)፮p-/M1KЋ6[IȴKXEה⶚JX_\Dbyk6t.t^`޲HEOFrQ.9CjlU:Y" ׎OXZ7a,qWD0,h<i3+d(Լ=$,5^뙳Rii`۾Nl k~WbF RLe1ZK,Kd'j}-ٙ看1VwXQNA0idB0SK.P}|W9^Z'gȼ <l9¯%"XH&GkegW }E rK'_rDгy?+O&@g_ݮф>Υ%sWpy2Vs&&MO\iS1B^̆Z7c,jp/*+^9jf#U"a',zx;FF] ;m~gF9,KzvWm1T3]uCGWN9l!#Y`P+'ɔx_;7ab.fXꊯFXΑp{ ,zj_{kR/`}_<ϭp[f9Ǫp<9K;. Vz#Pp#c&7mDX!zx-qӷW2>>5&'=L3%f F85p0rB'ȦzօH)QL)N/bcx^Cko5f".7G9,,3#R u=z{]iNdlmcm}x!t/9r y>APH:Ω$Q tBl-o"џ"I.|bK,vTroÞ Cjc} g*4vz9=p@95:?V( B=MR(hJF1>wq(HI ]c_ e+YϺ:fTZxXĮ2yGݮ1/"v\c_./s>pk:քj9K

f yT(3g/M,z0RCS#8_~ypl%awaMg:ώ-.MgS_p#CQ'3 8F/x[ǾPj&!w.D;SaomCl\#\C+P̽J2Bn?#B-.Yp-!5.t2+E5BCfaX&KRDS嫇STIBW&|6As L1ﹼLguTQʦ~)fwzfhfН睑9KOf`t7~ d1lDZ{VXJQiasє°L>h5-z EJt+2tAcD%W"\?oB_o | EB)s&Mx_+"/K5ׂ9f (u9ypTo>T5 W)>&) $VZSmC9Ħ£PH3!:}E<#փ- +;pg/Ə>lWAc}kE~k NFR2ӅDU= K}T5T-63F9ǭyl݄YGiJc05۾;g߷HhJz^gd0>blVЖ1#QtF1Fq޽~ j:\USvhO_xQD,e'gsgf]RǹKc}mtzf6R+íwJ!ep4o_;`j6Eщqjb4OEyk( jj~L$+H:nrĻ"pBȽ# soq{Hm:]I8^a(&#ڕrఌqఌqఌqఌqఌqఌqఌqఌqఌq"d ͉1vXP AvWmWĬ}*;-p *m#~_'9cKHb8oc 9]'g#`e#`e#`e#`e#`e#`e@b;-pw=<]8GlC1!H&AH̺#&qEt|hJ#eI[RSFD<ۏWw# #I,̳3) !]I3M<$mePsq</BC Kpi^rsCdjq!Xsۋ> 31DMU&6FQ +B;Jaӱ bĢ6P] f.`2ʉpMŴYՕD.vo]l)o_W`H&Ag}mu/;pĢ[MiUMznΏ5_=ϗ>G,\=+HF9s0ͥqw] ?o-[ƽ=e ^ۍ"J[l̈́ȚP ;*[yd>j?CiElŚp ?=oK{#߸0\|2i3طoX5 ~gp_S |l V燿DHL 2AL~k.Mgsz_dsdqi.M?~s]ŭMn}AߗxBGJH&>F>q/eV׬ưS+GE$o'1@* @7Օ{;O|sb1156\LJ6>4*ތe?9GsSW2n;[7yoxd>~aev45Fo`8P{>.D;OM8FA{ʮ%¹=K_b.XIKֆkqi.^8Dʠ+<6Ns/pJ!TottyN৚bau |tc=ΗN?áSN]5M=W(KLz$c]^6G[mjJ-ëo>teqZ"U;jw~fX_>_84}A,+2o]UfGzϢ9+yg/:F4G1. wrt0J_&l׮q=ɣRnwooWFPJ!pz":Eq>YdG<[s23ϐ233I3i1n6@6LЕq\SzNtMiy҂П7xA[Nu^8"V >u+}T 93p=5FrooF'<:m@쥞9ʧWF+}T*dX|YN[\|/ye+mԯU(\NWϟ&Ù|.Aq;shV7;FSa.8."#p[&]5Opm *ꃕjMR=<SѪl_~sHC|̔KX9wc}}&\Ktܨx ܚ{1oǪp9fs3L( f$9sz`Ŭ,RwW;ޙUDvFzg.r>zuhxxTg0u;Va3<_8."g/0 .F;YV]iyKfK]$g\R(z0 2=uWpx\sS 28H&)oV 3UDb9Pz2ߣmv$aK H bi#2ĚRxc/kn6Pݷ⎺oqfq#9mhY Z&),yf,#odlwgaapRMcsӔƙ|W>a>uOUp7~%!s|e^-tž C/ړoz=^;h)\xc?q{ŭ59w:^8)抲J)*e IƼ,nm{n.XO޷.K|o@4Uh-[O?N}^"j|d\]ū:rm\)-(fw_ ;yM).D;/pWni͑|n} '"\-MӸn*Ccud+ ^= 7&\R*>[}hZ2چ.6t[kbGe˨5rk.~by8ږun%-kz/yxlh嫇x, #Y,x+hsi#?>]>9/~_^|. x:MihJ#K^s8k[+ᾆ}a ކ=܁?5@GY9OzNF8W"*:;i= `5Yb|+7c/ʰC'u% _YWw/~age+O:n+Mq /_=DgwC^" rsEU Œ.MƽG:Z]itz9aCnE2 _)6X]>dSdu VIR)["-x3Km_gC>Xɽ {ZW:2%ֲ/]iU(r`hŎm#i4G4+tOlhƫmonH_dǥMۂN5D(Rf#=kIe^>XBjF=u%|(0*/շ9?1,% -F#hۓ#}:ߡ/1 W.M綾d^}@6}l>@bFq 1~؈=zjwp[v"pv&zflVJx$>7Q-ek-(ԜR xA. wٳ֎xW5rp7Ur> X9:b$$~u%os:,Ea{5Yق囵f,p'ΝwfBٚu{ע}^}GC<awl/ņz6c-I [c<_2^nk|s== 7\]\QNcIQ#]rvN"^o6X0ܛI)56r;Í\\qGz=^a!oãO,WFVz\7$Zx)pܲX40x_] eq6+ԔH&k'y훻n롈 >9rcGgֳ Nx FRbuL 9 ˌ9MZ6S&Xt;Í@xo#YPlxǔ[@'Tysu>#i]uҜa*GB2"Z] ]p xR)MVD)+]}0  F@[_΅F248ɡ$b;J#c|AӔnY7G{T/:H$ci*H (>5K)E|66?q q7[)j. __+˰H%IFSXFA:(SbW4(70SVNȵ"|w;5.̏7Aʙ"uXdp`3]p3v௕DV \ӿv=5-O>%tچq@e't^$2~Q|L ݫeVi~2;֔K,7l~?I+] {=z^qXX"(H$FUJS/%R˓1]KDx?kM\ͥ++.Iة xX"\vVr-υhH d4Er(Y+!3J5'scNoTk#XJm 4y%d2 NKE0M?BH:B^@r}֗{߸OcX,!=l/ S._R.J=s7{ p[np'}-d\ `X3e4{xDj.J=!SC2 XCr%_s 5p E WGzEIdI & C?oD\VOsXWJ#ƒY>-#\ _^vZ i綽:Z:p)l*GBˮʍY`UsiJqi; # vʹIb0i[ REHϝ]1qDMݭ+ $wwBe]#;GZ#k'(uB';V@&aZ4mqۇ4N\(z?L '1P/(~Uh -NǼ89!GpUi<=YiXluwRS_Mi9"R/RDhUO{]+e\'QyEN{ T13D/緓4 SJL[TK[{.X5PD#|J:aY Z>bGwr9NFPO R`4O}^ټOv~T?n!.4]U3-Ɗ(l~Oxo_;鈷(c>J D|%\}406ͯk`k4auC4]}O5̲ލXE:̘:XD(iJ?$aɫy@DKYK'85ro ^Ix_@3Sp9|oj.w"izv=w˓^SFcA4p OQ%sV+ؿvUn2ًrv[(g#6EOi]{-sgܮeX$I%\)ş!xaᄛc^8KՁM! W֧{XWiY!*9-֖؆SOf>{G˴AA_r5Zi#*e ]a052Q~&R#=1#'׷Rd|!3ET{XFF̌gɳe x3ikjح8.J}PFo!^3 E$Zф[157Ώ_?H"Q+iEEVK"?;|x#@ճ3=N3mW[Fve'K,U4[)śNJ;}V R )k5Sx]7R&8f ?7<ⷔ[wy]+KB9rqy6`P7 *@t,jAy?ՁȔRhC09X l)0!*n,nM7kg덓IiO(œXNǒpqiR} vp_y#}gb8ǧi.[3w4̤8y<Ϟ":8Rh+K ,&KR01m|Yxڢa5Cqgnjͮs0߾)3,#6&i)[C٘%>-\r3|+BFHCQfkC_P,Y {wk3,3pu| ϟz>y 1oXFƥ-Zy-*l?+xG/.)'azM :WE SL~|C$Ձr\|v GV2kv^:sd-{[=_i~ Ų~2[>yݥiȭ<-Yo 27!?tMg[ye0CWmg;ǿA>4=w旊,wf;3GeE4Mq/Ps)lY}1졵˥-+.z}]. ۨPpvT_ڝ gb}=I),r6&2O+3bkǥʊx2^8K/$g+mq!% CL\|;f+; 2 ޾vk_.j%" /'7-|[Նt>8PP 6G6pn/wf(=i7ǘ4EU Vt[\7P<>ѯЗ_Ώ5ǣ/]=!&f,f7^Jc 8貓FP,:+h'9l"<ư L(rK6,,^)ɻ4Vz*^8Kգ8_J# r y=AJ@B6##/3FPq7Q/c(5¶&ڇr->VxQ?<OH sWPy (}. ͕UmǒK[ hM4bX)#kPڀGs؆eoq[7p{v\[_"n$I$${ㅖ't+Y6i~ #SD8]vlȕɆe"ٲz1ȈsVy8Lra*eh.rTԐ-\<)= R11f: GS0Y*ވ!m1G-[Y9{G4u;qi:/w3K49Br؎[.R7Yi~ #ih yPwDx%mPZ{r!c&iyIF2q^;řKdbtqC7r6+(ny>p< &mmXֲ|d/Z-5Xγ%Pl`xor?n~{c7?g<;ρr?Iסp2"u[,VJqOͼ}%J(bIXi~ Pvʹȵ4O`a EOb^ѫ*I)^| L,Cb i?FS*]˻*b8Or\6m񌦫߶,j6,v3 FXE]iuP 2 ^̔Ei~zղ\38.%qд\CL[J64e#y䆴)&JhO*yK=HB)mc'[菓JU'opցRH6m"-i"05 ܺ{&94ʤyq^;yX.KNs9i~ ƪ* ׸ܔ-"~y;i^i50-3y+z)$;xpX*#CY>tk,(ײF]i8[9'_ն 'c'?\jTq_ײ ^9wXa7˵JOEL2A ǀjٞ%i4WA{`YV!`qAitŹsˋ#%D'ŲB1\nM#c.-/Atp m1OL4/Q>/[Wsq?qw}KJZeҗ8ٴE,CP.ᗁ"ϴi_!gKܛ_/&XP&)MwYxm cw[ޓ'mNO+, -;/C60V?ga _+?ЭtS}js2&76.6ni~VZNh]8^ej%ܗz4?^PYZ 8^ANJޏ)_9~ O2$7 W[q?:B 0%tEXtdate:create2019-01-09T20:13:25+01:00|X%tEXtdate:modify2019-01-09T20:13:25+01:00̠IENDB`hms/man/figures/lifecycle-archived.svg0000644000176200001440000000170713452227404017533 0ustar liggesusers lifecyclelifecyclearchivedarchived hms/man/figures/lifecycle-soft-deprecated.svg0000644000176200001440000000172613452227404021020 0ustar liggesuserslifecyclelifecyclesoft-deprecatedsoft-deprecated hms/man/figures/lifecycle-questioning.svg0000644000176200001440000000171413452227404020311 0ustar liggesuserslifecyclelifecyclequestioningquestioning hms/man/figures/lifecycle-stable.svg0000644000176200001440000000167413452227404017223 0ustar liggesuserslifecyclelifecyclestablestable hms/man/figures/lifecycle-experimental.svg0000644000176200001440000000171613452227404020443 0ustar liggesuserslifecyclelifecycleexperimentalexperimental hms/man/figures/lifecycle-deprecated.svg0000644000176200001440000000171213452227404020042 0ustar liggesuserslifecyclelifecycledeprecateddeprecated hms/man/parse_hms.Rd0000644000176200001440000000121413452227404014065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/parse.R \name{parse_hms} \alias{parse_hms} \alias{parse_hm} \title{Parsing hms values} \usage{ parse_hms(x) parse_hm(x) } \arguments{ \item{x}{A character vector} } \value{ An object of class \link{hms}. } \description{ These functions convert character vectors to objects of the \link{hms} class. \code{NA} values are supported. \code{parse_hms()} accepts values of the form \code{"HH:MM:SS"}, with optional fractional seconds. \code{parse_hm()} accepts values of the form \code{"HH:MM"}. } \examples{ parse_hms("12:34:56") parse_hms("12:34:56.789") parse_hm("12:34") } hms/DESCRIPTION0000644000176200001440000000163213605457502012560 0ustar liggesusersPackage: hms Title: Pretty Time of Day Date: 2020-01-07 Version: 0.5.3 Authors@R: c( person("Kirill", "Müller", role = c("aut", "cre"), email = "krlmlr+r@mailbox.org"), person("The R Consortium", role = "fnd"), person("RStudio", role = "fnd") ) Description: Implements an S3 class for storing and formatting time-of-day values, based on the 'difftime' class. Imports: methods, pkgconfig, rlang, vctrs (>= 0.2.1) Suggests: crayon, lubridate, pillar (>= 1.1.0), testthat License: GPL-3 Encoding: UTF-8 LazyData: true URL: https://hms.tidyverse.org/, https://github.com/tidyverse/hms BugReports: https://github.com/tidyverse/hms/issues RoxygenNote: 7.0.2 NeedsCompilation: no Packaged: 2020-01-07 16:20:04 UTC; kirill Author: Kirill Müller [aut, cre], The R Consortium [fnd], RStudio [fnd] Maintainer: Kirill Müller Repository: CRAN Date/Publication: 2020-01-08 23:01:22 UTC hms/build/0000755000176200001440000000000013605127664012152 5ustar liggesusershms/build/hms.pdf0000644000176200001440000026151513605127664013446 0ustar liggesusers%PDF-1.5 % 43 0 obj << /Length 997 /Filter /FlateDecode >> stream xXKo8W2PIhR-ZFe!dHt_R+Mdg7 | erfo^"@3f~6" 8',/cL$ `ÏBBM"P}n|0I1NCLl$ lvNRr#AY{(RNUa. aL8U NR}@ 0+{rI 7Q$^_$)wZJ} C1X YQ1TN{{QSnj#X f֪ҭ1[/-MZ]7eU~y-/h^DN X]9Bڪ֧յlWX{(zQ +J8݋!_7XXR )VzYkG@ y"/BCJVfi{ # >mBL`8eUώT`\m27 MZW 0 Ka(ajQ/~22SUJpOhU3UV6`īEZvȟ;ӑ ә}fƍN!^.2lCActf5z 9 ֛tje5MA1Ar{On~xQz=c=LwE3oL N"mkI@;4?v.n˜Ii ;Sb`j4! Nz3նײkۣwleӋƜu"J%(p'l_ |lk3_n2șL½KMLM3JI$bq= *OME#L> [H苯Ge9}<ʡU?I`[&[ ^_9~wEc_tk? rK?h!FO> stream xڵW[o6~RhQwð]u(SL\tH*u(Gr[!@sl8i1}3''y$bP'a8)$ sgr.`z4Ea ;94'CB4"q:E5l~r`+ϜhDn0.䏃oy5>I"$qJ<=Xq6|Gwgt .arS/}w1cWTgپ~t4%=aO2T=W;-zش/ծ!uYyߢdnit#Ŕ^NTLk@׬4]V\1 dˍ}Yo9^OՕX;k#@%83~s(I^11lYvr_ЙQF^}Bh?3Q5Vߡ-(:ۯBD|QYG$_eU ^6Fn~8G$Gg6B~%Y4b9 FB :z4^@I@^A<>t>F9~5jmu[ǚ=$|ەhK:kιUT͋ZO׭Q)!'ivx8e$8;v6DXoTy zܯWj#]ff[TwCH=:Fi<IF>L() I-mA0OWK2I6m~!wo{a2pK]M lRM- !3'U#p٧dSyD,Gc߂»+\acںjΕS ۫c)Rƚиb kʚI%D6@L]65ݺz߼ݙS*-Bne$CѸg驇hA )EӪSVL3J{9϶!XZu͍I[l>̥><liKve[ۢb-YɉZ}T hMwG~@ ʆ/| zl=]ݪ=Qo р-Ӷ+ V J|En%Vsۉm^=sm3]SD={d;W_&JI'#n&ݲ1ޣN遳jrkŖVݾ@öw]2ՋRN\5M~ RãZ|# 6zrlГy@o<|݇ =5ك6fgG? stD@y4Icle `+nʑ ЦMŗ)=|$޽5_#> endstream endobj 94 0 obj << /Length 1037 /Filter /FlateDecode >> stream xWK6WȡPskR4"%VCu~}"ey^Ё#r8boas/AIHCoBxΫc'( )l31Ͳvg&yC#dF{]o(Z{ Jh8L:M{3;CVE}Trۋ8N7cN-|&=:Bm-{&oċn!,^u^ дHKB'%RaqRQ #@]&8IAI ޡ_>|T .DZ/4Hl_|bJzh;@Wm#}Pk={ ,#4˼뫺">7ZB",X4;tEAMV\!5 tޛd!34 hLb+)|]mOx2e*ZFcf)5džhLJlС%8%X=ԏR\̃yq@[p| qwsΏ ע`,0U;e\꥙QyOu'*;UzrCaq'M0 6e\ i00!߇,3DT:1Dpw,gpͩRuǩCvn G@r"(kAɒk{TNueQ> ]₅ሃY[LR5{o=oezy0:>{!}>\Mrnl/%\ O;AAeк kSKp$`h#Ju B{.Rs7<"J~)TY}ztr`fXRpbʫ N\XtTvhO~K& )ӚQTRv?b1cC,m7%6?*C8"No%[ ܲjRU2?n}Z=i 6>ra|]}' endstream endobj 110 0 obj << /Length 775 /Filter /FlateDecode >> stream xڵV]o0}ϯ*zL HA B2ڦV=NtI0 !s)@2x5 .ʈD`4!HYbaD%MwgՀ4SjiJZeF-M ? "G9.z$ԅ*S}Cu0SQea%oRxakHEU$S[=P>A_ܵI7K7iP>}4g5xS8$GΜ_fs.!$H-cІC*/KbV{]lkID d>nJ+]uUb54^nb͑n5&xajkmlQCU&1LjlVIAKJ,!wuřT̗]>L4Ay鏟v/p}Ȧt:rP@7  &UM,@w.$UR `6uzܶOH$[[KH sR5Zv1$"vWIו2ԕr=IeK2EPVzΛ7piٞI ߲Zmm06` %MAA E&eж|U3fPJR-!?5խ5;n lÒbjȳ`8(GtԫMD۽/L$C-oJ %) 6XGN7xiƾ[\/{g<|e4hqOv8<$k_bV endstream endobj 121 0 obj << /Length 1052 /Filter /FlateDecode >> stream xWߏ8~_a/ [VWN6˶ZQ $9 )f=`|E]Y8LQB0bCI*"uؗ ລ^dE )Al%WawKH0=tg|h?%X $أ3{7pPCqGeǺj8ST1þ쐛V*"BS_t?3(&^ NU\e:+Gari v sN,-bl >h1 S  9Lbrm'ݦ2+d̴z3}->`ЈBJַ>-jH`Dͣp'K^͸nHYKT";ve:akvQ|s\HGReu0ϐ*rpgR&5Se廋 sJaFp(:M qNȺc~!6;sjVbT鉴JyU[">fQKCf"얍r1:? @w3y);{F%|I7op^xINRl ?-vA.oHqlɊ&p/)U,X)JfdΨ?we2T&Mwq]KVN[|2|>O=QEϷN*#J~APF}8F5f.N.h(.cӚNWm' sPAmQ >?S2.,3&\͘]uSEƉZv fDjȊ%Yi~_Ë`1NĠb6JᲐ.P I,|!*9~p !6T)# Еp(;Q.k5"7_6|:mpB׆ڕM#5Mun9O endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 796 /Length 1843 /Filter /FlateDecode >> stream xYO7^E"hZ5TJKx N;t&]> G7ywl{G611M19rDCJ2lƓ1 7^x6k0`L(xw{4qACT@3 9b!b89g`do"v8< F)|h6+a^bcFMjvb5R4Ff6ȶͲ\hB6#^a ii1$5LVZZ!>q6#\cbEh5~ 1ɢxZ Alq &Gq`VcH@cJEb(ZZi}H6Er4eCO,H7d_CrȏvL,)8%>,qr;hҥCITsM%|[ j&Ԗ*m]v"6]HP]mAb[7Mz=:?B*wI-SG''^_d%!;;fx;/DGATx~^OGA?eQT֡!\x:!5 'Q*6Tle%c)h ڋׁ8E ӢBwN s?ZC=̯'ހ$lA},Z{` ЛtWq(G b⁅B˅By`;ܹVB7}8"ѡB\dDjCfee8zaƸ^:^ U Fz6ggE/Ott|ԛ!ͷݳwkq{W`;$W;,Jzz܋6cz%*,ƀذD܊ b7"NAAo^61 ?Qh,5_iUZ[ 8Jp;}L}A&j ߢ.0L&דXKH؏ةq@Y-eI9|7X@Y=* ,},CI޸X6{q endstream endobj 139 0 obj << /Length 768 /Filter /FlateDecode >> stream xVMo0 Wa6mVmvu3K?ʒɂve{|$Lt=z7]\XQBppRy,dnM>]\%ɞ#8ጧuy ) d1FFxY*sfD\я )Ì(Gw'D~%JinFxõ@(< 3tw:"JaŪZǎJ`/c ))&*FC"fhL33wjd8 f+uOj샮쪚ͦK?zj RJ(t./N?ݻHẊVo=^j1> stream xWnPwJeJMnZ,*%rII~} c;q1Uŝsf΁U&x*Ved?L0 m&}{ۻd,ȣ*-̳x|0X-5L8$-^Zmz0ʆ]Qȟ'r1>>Ӯݕ\ _90F#E0h4@M߄ rYdh Ƴ}?jb endstream endobj 189 0 obj << /Length1 2598 /Length2 22771 /Length3 0 /Length 24101 /Filter /FlateDecode >> stream xڜxTݲ%!KCpww'8{HpNpwa}OyofoUODQ^(argf`HL@Nv6FFl@s#G\y!,@<:VČT\@g /?;GbahD p4p2~ df(@пPY::9l 6F|25a0IY=Jy7)Po l@e!'S 5ÿZAN@S Pm oI )מILL* gg{Fƿ2181ΌoLElm g'f&F-AQz 09;ZtL}~{d]M\3D;ع̜v&n+;I,(߁ 3;7uW;?Tvo~.;f?M_?lOc?ݷ=u˨6+GϺ+ z24]V3H-iEx(+0H3~:o}tKCXKPqx(Z],A̺dkUD桋A8 |yd-0O)ZTxQ*tFgB 5kɷjab⦭1V.4r4k/i)"$k!e ([kVcytXd3ޔS{,cZ k{ae^]ɟNΐ{zr&^$m8?9E^N*jͺ۔9B˷\2fF G4zIH,Un - 9UqصjE 6MR »83$7®Ȅː[x)֕,} |+kPDB8c]<̄]Lƶ*_x#:7J9\*YM^ߍ|As3e~1 ( OE|b'wV2{ln1ClK ''K`1E\ȸ[c[l n-' y\GZqk+Pr;Y5/dh'x j?ٟR\F M+Arj\ ͵O6"f]kSۘ_!UDeXeD<*CܺU`8V_><5Q]>`g=tcm[yΜw2tJbGFFm%zZu7fk ~!{ hRZS*^G笄~-3Jo>sd:N " uH]Nȯ(C$. ]_0CxQ$q K2Ć #(s>)Nt)AG+7Ʒ!DQ'r +P݃Bt!wj|}g=ׂܞUaMS:LzۜnSLQ{H9ɮv߆հFkߧjU)dz5aDĒ &XyMM0Ll (r bCYo:"BrڇXP 'jI=l— uΖhᒪQ1TZ'f'}SZv*S߷pt?צXy xvfE ߂,N$J"ثqs$< Yw9Wn מP|'i1Dz`lA$dҤ{ s6ۢ@O5f/qȍTHM; VR?ILptkQYnuWYdlJQ6 Y; :ؚɘ^Ӈ SKӌE, 0etDT %W̓"5Ytf.H+z'7ۯ0n~U?7uі{Rnq_ ;5Lo&`%@mreF 3këCoCʹ=ua^v,}勮^"n1Y ,,VH9ZА<#yaً~o@rZg[ 5_X&yCk9{`-h`xPG6R$Z>C>-K,ϩ.ܥɏjP{hq $0"k4 -urܶ}@S%a\IP TKpoM%* 5%ˢFs MDg]*X C[nV"#–~H[ 3i96=uGc%tJn.@f!<^tK7gmpPx$%u]-'s#t6iDTL{HfJ$WiQ\e3;A=R&`o4N$M)F(GطYohk&2L8m &(.Ub+49}x-O Zk jrraʘN/C?U2;zI- Ԟ8RA|QzaipPhY(40I)߂vwh1ʖt.dv'~(/Q~;NɠQFX0R]|Vh <ǬJaTMT]AvP}'ۜh%o,f[jv>yɭx &/"~c6Pv,q#ZT)VIxIĶO{8z'cv!R@3sEeGj&}Nf ֞x,jzM\4vSsܤ?!er.:b5cq1Y@s6d 3}0-f@v ]cr>NLO'&a{dA5i5$Og#t$N-!B1P4-%(Gaլۥm0s=[%s1e6+ ʿ/FVEVkHJ`i_>?Yd?es?J(vUi8NZƖKNΫ"Crj{(? R'~nĪ9uç#'=J%: 9j 1bL/_yMa4Rev1" "09:Br,#R< ̓ڙ\ɾ=?|eruQ3iM`\)uƷ F`H%6/I/sM0D le3W׼?R!bJ+G*U}pdKl%f_nn\fRcq5$ٶZK 8^`w| x%v,3 ~ג^Y w=rNYN|l*j>Ձ;u<i :;-t#b1##s P H{&\B1䭸|0ͅB)btM hyޓS"xw#lߚH("H7҆#v' ng[#u `W!Il~[&,|>:AkR;F!-+TgHXǂ>IJeD̯CgNDr57|ᒚ}'SsIu@aHjZ4.La͂s\HK;' Dq~'w qd愥R AP/343Eo*Z¦/[CLR~ԘK6)(gY)*nc`>hkՏ4~L4pY<Ǣ Xip9"9\a^. Tst9S&J+7{))O\3,.h$\ћ';%t20b.ǽh9%BfοIP2oJ E hٸ e/Iy9FJWk^n2\k괖A{gc!2C{ؗF`F RGB:f&a节,< #DeQZD.1m_|댳lVGc{Ÿ-PEkZMlvIۍWR3І43|c)(|iӓ%~Y5.?/hZଭ8j2:Zqn MkH ބԶ!'Nxo³L1F-lW9/O* LtfPy'GfD e ;nsո3]6tGr@msz޻ >U~d7)Lœ5Kr6)Ȩʳ5]o$oGRrb]nyt+-8%Z]}'H+ʉ3˧~*I8.g ]\"\Oڒ}I׫[ȵ1::%$Y vIxGTTBLHf/' ,'!d Kxݞcr|MSkÜ/zdU*X^w;t]),+iܥu?D|Ҍ=t+ Yx΀էHNff0f" [*O 08=C-ŤהYU]lg'׊iI!\y`TkH~$:_k|w2 ?im,r+qJ4 *͋Xs'qV'q|PY i;,T[X >ʧ&;>xs|@F.OgBy7us"ȝ |y;\X/9$rF|\YO(}(!DvTu$a;vǶ碏8O 1XVc-l` eZYѭV[ܔ^\Q3BZ@<tA3sTrΡ$Q3s%jOJ_]>*;--& g={!MnxnsF;RkWol#07\'Tʴ=ףȰ@ 'żkȹjh'W^0Ix6!xl&f/ЬoeCN(J6IVrc{5]z | @,>}ռD97qaYvHVɜO6~I3LHa V]צIJ?V701v/[`QtvȌe-F* zȼ?QXxymDMTb0RΡ.ϧ9?F8UU窛1 2ɽ%هL]gaA|&R(ʠne_y~zY숾jjJ!9ҏ+Z`EOBϫ6v*eVe (zse-6+EjWpŭ+V~}eJ\TnMځw7T *7X+0~B8\V~&/_>dsy=ZlKpB4&VUI`MX';δ$w02I?g)lniUG8 kCP+ɅxR/uXySE0yG| :9'|8WN;UAڍ/Ӈ'XYGu0E?B`kK݁/'F]xExUwiVj;NjO"Heda\FIl,2@~L3\XDŽ͗ f]1c@;qe~ey<%b7 `i_egj^#YrcglUV '"t*$%Ψ6֗goXd_[$'\6PAj7DҒgz|rĪʯ6֗kf߮*]=y"ȗ.='4 #_S%<쳐bήnCMlRld.SG9yk$j$V h|G8Cud_ }#b-s!o<˩8, f|(N_f΂!CٜI'kY>4 .F&l ]ȎN? d)$YQBpi;#89f&g],ߑ(@r% }t&޾fokԅ9Ekyb3bW^`"2SsjxI2IɪB`l(2a=kHKPl!>:w#GPs%n'A{ (o5v{{6G@b8H.˟#/ԇFfws%}(9\h~K0d& z 3cBWZ>#*$ 9aSCL{x#q؋ܹ9tRSBm=6Io?e/`G:dѪ!3v籘#-)t%ACm))&Z=?2uJFX'*O~W3KV']PJC"e֤^lyB{QsGgq>(ʌiKY{ (KJ*K7WK=9~"8'c0Ef$o>iuhȶ[ݟjcHTFiUTa=Bى%=WUsZ;a<{(dU1`btgc%Z<)y, i8k睽1BrxrM ~VOzLO X`&,VwW(n?_ջ9< ?ىRޔ4<ʰ'yC `AXa٬˖ݹe $+Ͱ.^ӑ@lp6]~:FM#[=Y3zI7=XutSr<ycp0Nlp)NuETn?݁9lCBD{I- T tx'EJjz,l\m vxh+۶3#ԅ@hg7#R|%uD]TϹn-x+etherl#_u6](xbPʹlNJk>:2ƭ_n\ Ub J;B/ 9 Q'=q@j P糬״]uA)_C7 >o6sZ^@X"EwwYSa}~dUPz z,TU\,R4V|miF͖c`b̴|"]}7T>cⵠ &J_$2di%vx 3" GȲ 殃zadw)cˣ4B5[2f5G~Whc0NC~Qk˜ylgx).VsSRHתwkV(4a..22^Ks=[5%ZD3R7tzW;wΕoģaBI7&r Y6`r~iph Ql|5.t7C{fX =Vh;n#t{g3z0$I-0vu[/1xDI𽣑Z8T(;$JÖƩ>:!aOXޤsdOkvlW.w.nįuFÇtØ3D.T׽m:$ҏM9vj_Q8i;aK!Gf"'x` om.y~j/L5Ρuv\GJGtV':ժ4LM vC:]dAJm_Lwᦌ/ S; gxM-Jˆ_0> K5. 73K_#˳56ikg ~=Oms%w =~ .nȳD`gQ<i&\o[oԜH@@D[ hO_(qzgbVl;ލUa~=ipE~{/61  }H^X߭⓳nHBb1a>7 _m-8QQR"v톶 5Q['φN! #܄<`~YqK K_cs'd@d{.u!uV.9[ GJ(e_<򢚋>3 k B|ܯuQ6L{P0[YanӆA;6aد)Z@gMYx>]co.7S}vcLr~Xm{qGDإ!Ec2kڒU9[r^W>)PNjy zA068S6m|z*Jh0f Z8l>UPKs=;eC>U"1\JQ=R@wlE^z j OR*/^9ƙ8 4ֱ#+<$d~qH1!EˋֈP OT1;ufAkҨBMxWg Џqg?bDzCoǕ 4 0"(Ѻҳ?i|l_H'(h9s?Y/ay˞<{=PZ>K\K-l$ nanC;2j6BhtO-LmZYo4H۰W.8IJ/;4n6f:TJ PɘdpG'Zθqd/TsW밄o|/:^- <-޲"܈jUNS50˜æ`(N6E~AP0~h%"{m| SQǗȞg"WH<޼ 2<8}QN&-絺aKAY7)zR#N^Y/v-/? dU?35|,c #BJ!0)h Rzdwxb0OsQ+ <P@FMlM 8)ؗubjG޾ƾf~g6LTT$ؕQzBZ}Oek+xlJO^2׏mb-\kH_Ź+(~)J~e)B]-!PYG2>~@,70y ]`F; s 57-i8r -nY63#jXVsI X'I;`D{GwLn24# BèJRC%ҤV%ieĎ+BN7?U |e~ Lqdl9;񧇕hZ ; iTDyfK)aj͍{,GC(re"p %1.# }Snr0.h|/_DH6k>kشyaQ{쩐DIICۖ}Y1lzL%ܩ*rxIǫh2Xn8Eo1Tscņ9\)(dĂJ"$zQn_37[۬K㓧Z $JіV_ʞrB#l&|>|6+#~,>251-*f zA.4S81&uKo &ysdS/o/]׵0cD;99 F:U2uom5W|6}Qz=zŭ*]qd'7=;h޹"Iq&{&Bu4q5 4]}] ٗwOܕPϓ8hCͯ:P}.o?}4:櫹]b#)᥈LGʯ':qAX 4* Fw!b#`04jԪײ&_߹b MµRUHt4AoSlR{CVIyt nUtD "9g^kO8zOF!*e#|,M{VlO@0;hQ@k­Y[ ־Al MG4o{ ˧YK9 CD&΂$ 0@/^l$i ^ F~P D29dlZg-2(0wZcvhwU`z&ͮVCEhqt:L*6VTltW='1ye_r~dФIbn?}HvYXPŢEJiN %iqFu]ק> Aqb6<Dď ?`+ 10Q P>@}t5T6Ϲuq>Sz4L07ļN0+L8,U㝵=> 'olZsNb+Nה>]8e۷a#؟Mα{ k*"LfH^4oKSaTo{-OI)gg;v؊_F-6^+oII.<}ԝ+6S7S9SӌL'~EeTaU]@?-W$vhcBk|{fȕ |KLa(׭ sH[%W"3cme<3kĸ}6.AV9+(h,҉Ō$ UpO7.{~"QH[?x{. h/O h:e_Ya[b_$)t`NAXoD35T6򳲛:p x=8w=C[2,ML/OXvHtRړ#ltY JzYmNINl&NJ[nMڄ֨HЇ-Ͼ" K^fzxmn[3l;ҕ=3V-I CVCݲًGJ |.p>#C.o\rf&/ntc({Z=d_l}Lꄸ Fڼ2PɆ+%ɝx4?ClOqðWCTl &gC9gQ!Wy_#QV-9'rTIE', ϜkE8ZΉh|%ү]QUua6䄸Iy4] z!nQf}вs eK`Rq4(2l5"p)1HE<(fKĶN{k+qE3C~nDkZVeOϟ2 rp-}H2t$/<.ᮮMg%6 G;5orB;W\jS]߳ںǦ9C9V錖hn :GԜѮVX_g@(o .?EafW~C:KO\?zh_ω֩O" gV[CZ_lj1! 0 +4ܾ'i)kiBAYVX!04EZB sd,QA:<:]OyξOe 1o2E`}1{"~i_@{`OdVv[woPZt0i}'-Q|]oѧξHAV"c̘3#*SWa8I€&\NuG q0Z։4=Ԏѳ*}ɬGcE#IOAݑ  YcTedFt~-hXtQZq>wJ!]ہ6?ll#@wОx?>$c˺|O0 t.U(Azs4W(l&XtlVSqrGܾj8hKssj$F[%˾MW"%!bqjαīX it8O֯3CZFNߣF('YyDUIK!N_>6=Hq^JK}ȯdk: _Xrr':)^֦ {">wn7+ <[ $e\QK;~^m) A$Yjm?S/~%6Ӟ 1I2*{7MO(܎AliZ2Eغ};aD!<s9R{޸^ QA:.WX\!2:f-p1m}/EO><>KQG9(6"~2*cTYUom𻏣MwIF] M|݋49D+dgiʴ*9tF%m xjg*`~R6-E܇ EZ%F/Mx˽(cv5[v7"B6n K\KN϶Gx'T`'Lv-Ct._Bʄ+WLvs+H b/{@J/16,3w :.n%Da%@{uv ɭ3ㄢ7t*/ a.K(#ߦ3S ^O'IH\gDD}4UB&nyk ȯD[BS5_"F;]Ll?f;x m9A {jX] GnW|vA-'O TMKuN86=Mo.}.MߵFA$s4cdpDE̸{ޛ=o\zb&HL >$!k-VOtȼM$8jr>rqWŋexa;'5d8֗U0q&mď m?, _Hn7N݊7='"şUoH木a& ;R0&ǘsԠ jś%dJ 5+hx wAb3.5\Z9xhaA{RHz[8NX#㤉q)NHհ 9l!6/,PD*jUE?"-գ yFZq)g+%S!Qi#9W bJ<׍WH=P1<Qvh$Bgރl_ZG({϶ j%q`$.D6A51psf<++U$\// 8 _'Mpɂ+~?k0R) 8f-( \^k?XXܣ_H ,cW,!Wڜ9i1$̊ t}D`xطʿiV}9%,'&O^MIFL$웭OzSO+G}fe{yw%SeGDa.)z#69ydgeDSn["7侙7腴䕔e 2P-5ue/Eĝg\ܮ#s|fb*;0>jM-&z1~?r-C? {z/u֋WQ\ItY ǻ `s.9" api_)t]E~p6Ts m.?YZrbHF)T+Rk O,DӕHc::|`Lrp"RrnJqYKĶkވUC'3k!/ IZb5߿/:Ue |BH䶝M} R%gC‫qK$#W桊H:Mg>lO&+ṛ39 +ZtU4GzPV{ՃW̉Ŝ6?,،P񉠀mVxR}D%bK9krb`0!sc'oUбf?gbSE;pWV%D0s%X[T%㡉 y/+`bJsͩc*6 Ag#{h*tz଄YӬdrdշt}*i\>jvb+w*&K!r\je@KoY/sL5y;9)i$ϒ{P8?kScw3nUմ9w1&]}rָd ,hJeD<ʶ/ulVԭ>5AJ6ž*<*ݾr9u}Řpv gf)O#8HhA>+m ]jl%-8$.IՖkbr21;^~w5vTq-(4nYJy:Q^j}7+z\Xѱ ̘u'iXo {Q#%} [$G_2W4;:]fy_O&${ 7Z8eT2Ϡ=:i {I-1ubX^C$9#Ok 閭 W|tZe-Y]sV9+$|BM#H\{ZTezKF^138)- \QeԅzÁN^!Av .`P8]P.gevMfb G!.(9P{ J ex N$d.!]`7xW r5C0^rmUnvF;Qy*$7vԟ'ςwG6,E(7'Fw 1e?/,Î;{ ~Ia℅]}X" 9=0{_f8_d".)SaVz*_UBl}%HA۫+~^\) -*HK;͓Ĩ}XDo(Ff.-zd .4CfDzҾmY~0}KifI/+'y~Zo^^Ny7b}zf*}D2Jio9nwx,>Xp, ?@X~F?Lz\L+F q XS׽\;r%+܏X֝>=HZ1F}=Q6˜!ƬU\ED"C*݊vj0&DڂEoG,& [s.3Wmݑܭ;Z#=zDi!28͚:i"F/]LX,7 ˸>V[Ī{H߃z &#_J_ZP?N7Ś*`ni{}SkV/(hc6>ٯ#xl.0CmV;5j Aaq țP+ |W s,ԛօ>(ٵSh v?ֵ36Y'_7"nL6#^4)xCYjkNq'@X3U3NTK]@6Pi ]'[mMQ?BXDS!Hؔl b&LBqhZ$@ua Ђ]Rb2N7<+"S)gzȐ0JFêϞ&<fDnܐ_PvǐFz[q0_ "x+ !Ԩ:Gi|>wdNQ0N쪖m1"MsouP~Q59LGEEs AOD<bFt4x_ujTpˑܯtA,/M+R}ȒZ_R45bIKaĂ(K6]60y * {+[: [H73}ق' <xy(LԇT8NJ':V(ld`Ԁ{ƠZ6zTJzoa^wh/߇>Ԑ |trgO!]z`7R{c".r900R԰׼<O1HLZHZ3xڱfMA8/}. {7R;<|{ | F1<'qA7nTy<;|$p*If#u'&5./GI}!5/<X!7xL Vm͉Y`5\ h/9ߛt\rSJڃ8lxzVr(8Lu?3AxW'Ial f՘TT@ՌDz 3SY*+,{.4<%%(ja<*A'GΓRȰ:Iyひljzt\)f7WWBW^p15/+e_4`3+; $ K`Xy1 PO]'Z'&t߯@9}ko8+TloRC8skn#f5)W4Y!h5bנs&^OA XޤRDS!UHJ p*.5l]~(pjĻ"6.,E$S`H4R]0JV^()Dkp8rwD% uYo#xz^ hy5_E$2*uEHfx,ꟃ-- V9 a1Q֩U3YŌ'xrzhgы,p*7\x鬥>%SBK X*rx$ +\HrPAÆd|s @ h۵G=RH,e!A>d󥀎+5M4J DĎ8'eQ%W{ƞ,I#Q Pr&8HΒk^)n z׌G_ksCő4$3p%y]}kE%8:LĨ71A.=am4@K!a7M 8پ`egOtHP&1l\Ud;s`@6HE|>) t"QOΕ23גq0ݸqCuhw,4!(ud)]8C1^\jC*D m\Q4AO$y|> stream xuSyQa"AXHx\dDg"B+1+|&WY#]AĆ#t rt&TA>Z4s:¢gBvP#X4L,SB ]3i̜!>@͝[q?,fδ6Ptw'alPXp+c62@gH4Lx`Ѹp;џb B;E`B !@5|SGa5 V ku^(o>H0fn_T06x)"o1WB;Blľ  îWALd3Ep?5wO-47˝dq\xӽsiiWsYw! 10uL 2)5,fμ87 `px.1"`P @7C0sN0aB0 Q̯4xf.=eςAp+P/AIg'ϐc0nYXm,Zn+t^fD6r)m`9o9L{c" j湥i0=gCT~Ф5EkcϝWFWO;T&#񺓛Qz|%1͏(u#%[҅S.x^Ѡ[ꨂJvU}E*&6޼d(۴dzt̬]ӣ뫻5S^ّX}Dkm60dx0t~zli^Kɚv󶞆{k'֩#%ILf=?x$6wjVurhu(237k<]iu4Mтָ'" ^&?S^PZo#fn=q-ޞ'IS 6Ɖg'v5+:+E-%F#/7삯O$1w_H\W8PAݓҨ@BT9>2hZJ?U7[qf*L&\꺪#oXl-Aih\Fѹw)}ʭDءx5{b 2+: M%w:~uxe[ؤ=j*/ާ z:V]q[e"Y)sa@&YDtd[~Lwp[:eMY1uX|ƹڪ~9qluL,a$+o[{$mr>[4|x~p7>Qi\XZT< 0\8e@<2}llDUޭ\Q=D-)p#1ve9k|U\3)J)}AؾގWuЉ<گ4kli3[}!FW7=81&A[%E R9etI犓%?Hd)g֍{}:drވ>~s@ҞhReQ? {#nq69WxKKԇn7r겜p=*VmI.xu$ #c|?M>ՙe:Y`{Yt2C eͺiۍ{6i8U捞5 K֭^]%+ ڍ#VE\~E"Pk~%lLs+ęyoj UVHF`iͶ8QO 6kKZ$M sSC] ąhv~B1Ja:`:>LcKRa-4&w([nR(UK}5*a㧬'R4>o R:`4V̷(2語rnxjo \s͓T҅ اPPhy`#qRãvEjA fR[SiNuC%eNy՝թsG9޷h{cdE>!Gm,)hi|-M7Q21dՈDZêhEm 쩒\h endstream endobj 193 0 obj << /Length1 1626 /Length2 11169 /Length3 0 /Length 11998 /Filter /FlateDecode >> stream xڭxeT\.N!H@p4xp` .Kp .9ΝgkzꭽW3Шkq3@9x8E [3g'M;[U;e*@c`qBAvYS(P4#3O_&3Լz:  _;jg d?*Uu@ Pw6 s sqA,@d4́@G[3r4@_{ `g-dhja{ nu2wCYe')NW5ֽyBMA'+`r~ fbOG5_gV=oo [r4Aиr gԹn_3 vX-ѸT);9}$(o]9x]2(Z4ζ-rWk=?Jہ-U5}m[+-ܜށ܀ g)_u @G0|8xEdnJ๤ޫiȰoC!jۿbRT,Wii;7'0RgS# `Z77' #1klI/_jsgGWU݀hKvbi)*⬁=]<AEv>ɡ"&OAusvYwL /:\UV!]."̔#HϳYu}AnFOH|(g,t.7XI5фm8u0xUyG7L}Ã;lѨ b 4ߠ&Wψ.B0:K2-*嫬>i\l87*+n.mUt #mo e5+(ajcRi#>tFCBn&ʪì`8c=$x&ͼT$Rw#W"'S=͐ >\PGյ.81$g*g,{0 &g!I]Ʊ Za&J:tipR|#e֔3:A5ZIOLwo yg!K&Y`liA';`S8tj!4 \1|z[%=rRHwtK6MMEg g!.«kS^-ۑFG~/34&Hf8l"z=ē-nرA1,&'|qoXo襚:2|:heD܍n`P|7P` ߗ1xCiDoar9.n 8^k] y #:lB}M~9REʪsms /D)VoϪ(9ɒy fǸ\A'o-ՑU*#(}(T9EgQmD7[)"醌,u3@]79uoK@yQFKJM[W{ՕCIf(jQ(@ mQh>H'u |7 8_QCg~~fh) ^a~c!ik/K*cB5}o|J쒫Pm&%RKsq?;[kRC?O@޺~t`zڰD{-r Zc|f;ז!`-K8IۋbbrNOu^C܅P%Vq/^?ݑfI93`W0A=D++4g`$X5$*dyS=]< "&T{;04qT]B8P>ㄮ:sp^BS ܂1 ݺ{) j>j$1 ??WqqIJ &GC0x *v+KWCo]I=S/eb VBݿE~6-LSX+:e%webD Hc1àHd>=@OdLyTrPzH*߷ė)^j5e}3þ[r|b8Z+ {Vsj*؛CZBABd} _CUKFޢ]jDvrDaˊHBl²^ F߿n_gM̘?[N^eIN.< Ėb8l\uԒY`t**KQ7 0tr ZȆ90V{I+=Q|]gC!֧WCLZ;2 f_>hCV8'tYMLʢ+Z ;8OTv1z=WyG c2j.*G"nZ xV,$Z4I~&.wr n$ B }¹nܺOjVs,c#DH"@4lg w $^GsY`N%VKR|\8R  *(g,2Mݰ7hi>I8-ٙܜD,~!Aj%0Od)! y#J!3$bu&)wi &.`i|C㉾>ʈ0=pȼ:ȴϗp8hS9>ܒJN# )nɒ'7vѫ0E3䲷#J!-.Ia/*<)zZrGڴZ^Ɵ,DȼB?*،0kap͚ _5Zϯ(A%`Qob$dA/abJ4-$ ßұ5kmu,؛-'j~hB.[QJ2@Σf丠]1ӂ+^lqH[!L)r!z &,׺Dz`0t,rt F ͯ&W$溣8=Ӫ 2]Kz)Jz<*TDx?=1jdiw]P)swo<&>4z)RWСAi̅gqMm.!ԳLa6v.]"S5:lITt+Ɩ D&qxƵه?cMI5_b\wDcqxr_7<6avSe m5q ֔"g)!yOd~%XDs cd.ԊPHѭX)Y\F[tѰN*#`i^p;Lv˿nGiaKşHd{DGmzD?.0>'W.֘굶=S4y2w$?;5򼫫5Oս@{ ;Yv?y#UkZ[A*NUm#UI骜1r[+PBGX&'H,* Lk愯,C Rbe_H T*[}&䧻DpnV@9;0t5x"*vbw_. Y*yKq*.cuD:'$2qtjvbh{nM\4OS.@zW'+QIπN&=#N*9_mJm"v9.Ȭ'eO>@O|Ww4YF\YPt&9ݖQE.gNvg4vS/&};)>W5>=F2"/ximl ?nSYydGQKk,qqXmBE^`p53\ݜ!70AϯQ.69Շ{.]b`ǔ7U QvP>>-dE<]6h$K\ʋ+JL@M槂ķ+N`Uϯ#{ZYe;`c:>"JήzB]v^Hys/2箕O"&tk1N^( SƤ',]=C1PޮRz 1{ݿ'#?ں8MVL+rs-:#i*h3e2]#e&hDzPT6Dn&t;ꙧ=OXwh65$ kCw4pyswqO[jUyxpziVdw.K_)$z?}_>dŕ%p8I-*#w/U\\QT_S& ?Ug1M6TV$+@ozi‡h:0_BR0WK9&JfUu~xkܚԲܳ:K߽UMvfmI}vi;M:qCfȕqtV{lf}ۊ3\u7m"XNlKy4+|Q¤` R{0vNM.ex JoH﫚j;X<BE #Vc*]?$ǖ;glou]>n2][X0E;h7@A.t*4Kpǘǣ8qd<8#&[@ݛOi^ WZܰw ٜ٢l e$T}ksi=ҎFӖJCJ&i!X >L&FM0%Qp1+9bJcBgQt;ԕ-!'3[ ES vg;EuzA 65]cۺ/Uń{,$ŝ yx'Mqk2kU.i/r;}̼gr?8TH?FʒuګSa{{vtw(j|MjgPpHɬ5jO;f#jY*Kg- S{ռA%>t-[% irˊ>دbn?R42 1.[Y)Dc iuvV}zAHֵC*E1淅z vc羮 X J d= ,laGjJƪpS',)Wr/0WIrS;.՟?["=o%߻'=ҵ +9n)('X|tqhНg~|'ɓ"L@*)s̶-!ːw+$|)HȺ)\>bHO:)/ioiIe@KLtQIܬho.L5qjjȱjB0D uS156fCvÿNeр.|{s3mlnMJ65$tK^5S9>(dӔ̉R:܎f.C.}iy,X &;d˪Wzاew;yv]/'D F;T[׎| VdPFo4P翢?l#c aCGݶ)Ҷqp Bl1]ǦH'ZmX"{Y/H=WҦQ">\cwIT=-6_Wz)*cȓǽhPG{'UO^ֳRuc> "w\_8~j@&#4׹n-RT>o:1G9fٶ~K1mo4gzMKm;T{7j; o 0|cKK(Zlt](azwK 2>M7§:9xwދ&jJ(:L*/gzm0xg>wJ۩'U{pʖx!b/NG!LGB njco&K2Jb9 Z<=ވՎFu:򏶟qo[7tn /Y+tMr;ah>2'gl&I1ٗ<Zq"$퇱^v /Yb4kS~^ |K 6c,Sy]-a/ޱ<H*&|Kԏ~ jVDFw1Ϛrs獦o=ix$R3ߺ)dXU a1`gc’6F @D5My 8:]!\'*+UR[;z-5r;U}IHMOa)v\E`6Xk#k+*ˑSlF"# M;??х[-N QEݩṧylHlXc`slZ֝L$nMF"ȑx%τ+ Cה?Eэ I> stream xڬctfm&ۮm۶m>YmbN*;zOckޓXI^\ޕ3qsQqSpW1tճÑ:Ō]yf1sS  rPhRXF-m]B_\@[s$JRA inoll Pr3䀦. g\b .a枦v@ \@{S[7 pWA=)9:]*INW+cr=Li_0@{?Lf@G[c9:U ?+8[;ٚtOҽ׿?kZ01i7%]p03[o6ws ꟝[QoJ }$7PB oWG+=2w ;b퀶^ir`Ү"lo&+.@Os3%W73wڛ_c331m27_3*kkKko.G7fSFDCgbI/ ]ݿ}31_`MYUWc{?Mݜp!ٙ#tGB˚Ԋ:gDpWׅ24O|vx-:~cR_R@ݤ= b4(C<ӌZۆ`8bPE0 sD@#41"p m^<,91_)q}';KRNf-j7۲C:s+0>вIex|Kqф茚AC yOM w9zY2}UJHbNXJF4 '[ RP}xeʮPIA/! /HZPC?>#މIHH:,U-Np,mKrʺz~dZ0%Cr[8Ԧ]3Ot>T>ݞ q A?Ͳ0^M#R 岰q ~l:gH&utz;Ux9"i}Q{)ـ+6= wA´ 0(z4qCFK&Z-FoN4EsaXʮ?XJFAc4>ww쥄L¥TPl=ǦLǍwb1Z4Pt) |wO5GIs9r^}5fUZR%rb5v(va冡 .(?XAZ(bwŚ5$Q@P3Ð=e!(05?$EK6{VC{O nm5-r1 @@ $踂~މ\^Q^EJ΢B(BVV%/É3نŠՖ`klE`ӟ\ 3j p%lOc$e~.\ ZX %[eH ;ȕj489SU5,̜?7:?^_=$ϲ[@]X17N}#fDֳӲ&gsfhF8Q -fG^u=Ϙ/0U*/QG¾xg}4@^j/_DY+OQSqoYz'eJΎULj@XUL %ݔcm>"έ%|zNj&OkR#G_~=/Dlz>ױ5Ake;Q1OvG_:%sbh6^uݬ3r5(]]Tk78MHg-sѲ#KS"S\Է7 LՍFnsq_LqGn??6 PJcTcioy( ^4Akm) ƫ*k mD7Tx Sz^F0L8f5y|5Bwq* bQ*1^/#ͪ߈̳"~i)ϘJ8[LӃG:Ys4?ŝ'Gݑ9Iz,owG$ѬI %?0dԛ T٢=ԕJ j],L;VP-Fy(ѭ=F\j;]|] EpG9-o0.QE0c{>+cPÉTJq}RsT)%zͣbhox(eMkfAJ<̺ltHIqv/%ҙg_m]Cbcdx/Qo/ݤ;&J ةV)~(3|?ׄ &ŸoYP/TԴCv:9 ) RzKJKV=pxlłfXmut!-Mt,$5G=&$(c/(>& }W1A_\tK7F z9yCI+D@K"Ss>QV7Da֒3kl?aGfsKfc s("+]^ IeaܷD#v ~<hPF8͚!W;wo"7x׆ rd}dhɡ_6ؗ$`g#538NgHh׮,nMxg} Gi/6. /,&Jk@jXfV[o`-aT!+~sA~-컰[x {upzF1lHeJǐx"u`7eK&p[dox0FVYVٽX#hYnY\4r-yfY9 9@cZ]'Z1df%wȰzCZ fnթoY)"ONKW'A ȚUcR;ZrzV0/P]H .V1$<(N GSsf$`b++v 9~dVU9RNNW"\V/ !$ \mVAfy,R9 ^s~PSg+;Qk#Xrwc@gRx=6 t?#IPj۾tw:WY!ɽ,Um5{N̽w%\Es P? d,ɒ4tΓ^ֳL_&56Vz6;Z'Aqa۟aXZNdsaǽw_Yc QfR]T?PخI\ <;ggR,Y 1I5PaǸƳS ÅURg׊l3U8/oh_~:] {܏fرV$e/jQM\QI Ҥ3&0^,yop Z23z:FdS]ˠ8Ohr:…79?k͝LT6yMw[+9FUR$Qq&'B %:>|G3~7#nbڟXLZ_fP%aLjHfO6g! ~jZLzHhL#I#Ӆrv+4HWxwt(SD㶏YYb,$m$A0馀d8dwÁ}۵6گ>WA0YTر[A/$B5ri_<%#Jdc2c0fsf"$j:ϪgY]( @5޸Cvs a4z8Wm#-yCJ>K?o܉:]b=&ipmv.1X V 8m%CdݹJ|I2OJw>l|sC +_~=zRrv86јje xDr{AآUϧ֙ԑ*  #?6I18 jIkdbyLʼn{84pϕ4~XQwE/4(J~43gFP]ȳ-)a&ӈ_Fuu:%7ԟ} MóW:/Jq=;;Փ_:1da ]:,8"=*z ܹg'ԭ(9x wcz 86b~Hs$DVFDzl%0,10h$K@*Uc?`Zx /vtSpVOu6^;l;X5=Ƣ<ߒ+w_Tt͞;9 x+X=KR7ʚt÷f6 lJ/K of:V偤G/ 391B Aq[Gގ+{cRI Ƌ-JЦsJN^"JZ[ް~aWP~kb)Mk2Uz}ƥ=x'uZE]>%r?e[s !'VIzkHӿ.+gc6l Mx/ʴH |ۮO.v(mf&O>I&!COm :Ba Ć Rmhm[]ua.a։*<'!\Y/P<|^P򠞆3/|Iɣys+B- {+X2C:4/ӗ eлp^Be.Eߣ&fJ/ &2̗ދI%ՇR)_#$V1gC"qio0VUg]1Gw7zYm! 5.^vq"KQ;orj/^m`frȭOkVݔF0f~\<,{8P'1P @nG^iZ ҶҊVY΄ү\?ui:w*efΊ]pZ[4`gOr}WPz֙[ j_qY|HUф tP3+%OvJksB\m#4-76`+H# 'WNp*2Sqֆc#P=rm\xTh@ȻCzh4_-7@]]+~0\Z+Sz#NI>,P߃eK¾iڧg74)׷XC`A_I;wP} +? / 2 x'/=@D#sHOIQSjKsΰc#ZCwR YLmu}3FϋHuR)2}yXSZ]Q\[TQLia\)&3}ca-1+ӰvEҀbmTt.ᅘxp-9\Ϫ^TZ㳯 cs)lOg4iopY gI7)ܻЧ d#<'.,?UV59iߘQFY%l4Be2v%J, "5 iOrģlZa-Ȋ{lfٵK%-?Ζ`!Crs )1Mb (R ɂ=Ρ:x!ͥ$dC0Qր8*% (pxſ< %~)|PHv:~C  lgtȦ4F:$0}#aECrYKЖ6U YD^AH!-r@#4s/ڗ'.x/)&Tr%b?ߌZ ]=c$ryVwr4eiUC /Uڤ{66#X˧LL+Sp'q%6V򙖦 P{EM㼇|ox3t>CYσQОDGcc? %=}X$7!*G Ϟ1vX?̠5wPGȕb/HDc w c`cXPHmT\pGߝ?Z0MaÙWڞ&!u7Inc|B(1Cب>IYj^:@!ᗽ {5r4Ku ٘0{PV/1x}>v(۹Ju"K y 񌓶<(2M+ϊ)T֒, *J\j9.+?ťЏqIU({r5`[j3R9Ih}wO`.yvetj/PB#~"՞%%ngCOW 0J uY|6~zNh8v<inwl7Rcd /J/G0"զPD`Û#L%JpڗE(^?3{ɸ%%!v9 P35fZkC )OA߽2jj\dTtiM!eg68}ęhyk/BAc}#TDJ2"BtѼhoi&4&Dzv.B--IVB%}o F%!< WD- -nߵ&{\AROQ;2MwXu3κ3 }SWDR[òXoޥ>ɼX%>nPff qAxDSfWD=Bч\3 Gt7{]cxâN"DǫC7FdT jh}UP@p+jjXu.¢NW2 &(0d+Q}Ѕl-qqO Vuo:uԐN+׶Ud:! ErWW`\IPߜbHަ+gNetUYIdE*C.3uG! .p42Y)ؿ*#C٦ڿ,_c9a<ڭdGLGM8 67pe jwǖrF4N՛Ⳳ[@dP?:XeƆe~nX+-ۺcTչƅ%K4Mq8/ʿ n"OL5a=EBDԟQꯑY uz >Vʗ*S~ժ Oj3(/*os)SvߒI3fxYoc$ϋ0Bt;߀T4W-IK6d$Wz0r`9Vc& m6^{b})%Ⱥ*K ϧ@f52ЫR-)H;D@mJ}iqc}EYܺucBohZ6@(gDRׅ=aIKW> a}O)SE$Y*FFHǑIJ]u)B'b: c kéUj?ᝬJ-Ee0|թ׼"(li4M "fd0N\e`5XG5MOS_&C%FД׽h񱣎ŁD Mh N)#6_GPeQ2Wч1)6'LM؅iݹ !=UT#cflCvM`s|?Z8NwDHsk rEOr9Xs>|]̓aLrIONuoz(vVK  c5$˨^?9>hk%M"t ul͛Bj*srJWLU0P?ԝt>SjĖrd4G (k|6 s[텅W.h&:R v42"rd sSQyP}C&EvβyB>tj' 4SG!N ysF+b7;+}Cu2𺓣Eȼ¨,̾pm"';P-M&g:qD%Et8ehE}YëZRW$=8j3n]px$)T QwUEXwI.<n39 $_qm|?4Q=wJVa%<¼uɋvq7S܅Ƕ9}4=b+[ZNL70wkH|B8$-Cd~< !q_ՠ{ϴz!k?@3iGqmF[@{ݚpKԘS5KN#ʳan^@ 2C}."{h*udV5s~eIC%'p.g^z?K1/s?7ҙtݹ.Chf(o҉t|3G`7MIՍg1/ #,?ݷBbnht%QO2X8 |^cҹfNEB(͛.L xJ w\ǂ}@Qe )7cP]LcUL*wFq+DZfh|76цlw_6[cS.-;&|!˪_]͍1޹WӏE[ey$vGCo"77q]yZSFzyMB'Y ~*Ur|Eԑ?wwޝ93 1w:s5q1{wB{TN+XizH42lHP~4FK&Gf b뿆÷ %Pl#~ F8jm .4+6IM!0hNpAi_sIyyWN1o)S4Y/$ܩ)}1ďЦ_ hg~d]1-Ÿ㿘mT!uICG6rP`@h*9q|h>BmE^.;#9YdW]3%!m5L$}3Ob]Ast0j!Kaz8`OT\:s2DHm?,jV9PzyբŲn݊@?(sd7rvfN!RF?0.PwwoqpV˯UF!͹iD~nZOP~h:~Uq7 <kh3d{<| a NjNF0sfiCӌGۨD՞ݶfn )3螙ADW5aь C5 [4:6)S$/1nE ֗N{d`Ino9W]Leap O&;w(h8~0n}h7Rm&~u?FބT~d C@V #_ *s6)z9~Q!$8Z37gTL&;/"FF\T;Mχo4jOoeu,{g,ח ' .e}ސ#)aO73FocZ .xcuoV_ӆ`f]*N327 @h1]sy7aPyh&87$24yYL""I,/;oۣ-M?HMVu )vZ;Vh[g=( 5OBZ2d=wܧc_b a@4!?cq2ǥ6vR耛Ԡt =,Ej2,XpJKe/BS#igKG#[J]FCdP-k tS%N ݭFI%"_xĭ{4WU]ɻ!e K>lu}j3!_bA9)1"iA󸎨3^x%;qPކSֵ_ oYC<8T2?R-ѥ;5"WPE2OrCDU *=@͘u't_u[KFdR"]U]mFwZ@lE6 @U~#x-N}yO5aP@O϶513M#xMrAfxy$$^1ItmqU^+A꘿fkf9! :MwR?r_U `x1;Nݖȼuj !k ص/:d['Ba{Z!@s|i*jpЀ'e,]nXyYi k(bXD㢘ƪ:™Y' EϦi|wDв()L|Q"J*W )M3R}͵ xm<2VW+"U- qţiS1 #w?<^JuJB@ fzj w:JZ.jJH} iJ+tbʏ~ +;Wt b>SJܗ1$ZI? <#*rg]N5ŃԟŲFyic$ W^H9W.P պr?Ȓ}&aI\X~u`du~d&\ƫgP%"ݘKCV=q&@t>UZ/N&5KHJz u-O W'-)K|awb.vO}j"e[VqPئ03X,/cD̓C3~] n2eZJjtc4Y&jwYzMEYJy:>S#r6Yܔf2Ў|jF~]=3c䖒M{o&YnޢɘmSV\/{c2y_خ%1j<K8頃l~;\X n5uRe DZ&o^W/!<CDG &AhDC*{v$ 5wјHMєb=i\vv37 ^I'G".j,ʾ),?ePog 'QrfRE"y!o%ʠycDcgog9v5JOs-%|9Nxd٠`u5N8r;2s+JHw[&)-  Yx/Yޱ.v? F6sX޶%a%‰ qoN49n\:QD[T@9&Mّ=:Ofz0nPkc#Ȼ#=//SjMI! 8r[,SȹP ]GM1[LNV91b^Ap7 cBC@H:,eUɤIHIvLUbtlt}jO*nRׅEu 2"i%(~vs=jpj Pi"ڼO*D^&죙8좊d_Yױި䕄߻7NҐmPģ$s{f4uIgJԱERrF>;E#qJJfe)7k~Yk/Vkqb {?ErL47ɲ,W @=!q9f(#_%ƃױM.8-/MM0^G,i\SAwE)t]bW4`t@fy7dn݆¶yBs'rXݤ/_&g{_(Z%&қC #IG ^?͚Rk1}Q&Z4MX_ޔQ.H6_Ae=|*p`;*O6LmI*$#z4{;\!3o /pr7JI89{F*H"oܠz}pOg 'Lqվ)k>@sؘ>^ Ax~Tz]DVuC,?Cw=iK]futr`ԃ(%8!UQx@"93ZR`չ( k+.hLS@4[>(:ö uu]~h?DwgxQ#J) +\"g(cHt(adKk~DHOcoq^0$ۊ@yru ]Iک#H~!h*D7C\9k%8n?Iݗ,0)6~oOڔ0y Caŗt:/I79H^3(GZ47|Z fgzY/w1u*u12dS@ 6z R&vŒaM(dFKwD}MYBMomt}))vyA EWwsƳȫM@ntp)1U#~ c9^/&O'=AheЊZ{pt*ɨuEa 6{]lo5gu0.O endstream endobj 197 0 obj << /Length1 1644 /Length2 8191 /Length3 0 /Length 9042 /Filter /FlateDecode >> stream xڭveXے5B[www.@h'xנ݃ːsw;ݵvU}* t9B`lBU+TAQPUd xJ,``G $2 +SPP t4Yis`ȳ'l=@3Q lAk= n*`Wȃ  {= A F ) % XN + b8\P7 ظX@`=9+{W֎%|{&Sw V.`'9yl-`bC0&OIa4( ` ؟X  u|L+ W(b X.  = }yӝ /[89{׭AAl\1`ϱmt?vprm:'rA f9 #Y:žCw*D7Ho"M<{Wj9W{{U {g*?X8=';LfIͳ4l<`Tìl}ˮ\г/-C _x$Ueղ63N>]ԟxzo8!rxr X8_sj\`DsċPIi+ִ*-Պ ˘cGʧRce4h\_$GiϽ,F{k夙_3:63ק<tn:yCX!ﰧ{m8j-DFֵy1s~*#K(~KNtNh>nn39ԛm3 INuiNKcnșɱ_ii4(zyh[VvE +0wT{j Ud*ypBJ>x@uq<^s^}R疄S|Ǖ<.лz" $2 А@F."5}>Wcͭ%uᆚA<<둒16b]vhbGקd!b/HUMU>_6m|<(͙ 1VmfƞJL5U2`#(ct :9iVЦlOW-YGPYB W屋cpʮJ\㘈F+V 2;'Trp :[(qs.@>H \\:x_0fG2NL2=^k;ocެa\eF]xFQUQն!(eг1KїО"w* h:ŀVal3z}29";{jwSj$ҵvB@l@9" 5O3g6~0hmlLdlWtn-u Q9Vzj[zJOqQ9zԅcxi7<2۹f+*DV& sbNT۾c=4s2H-gH{L?c SgtXfR^e#]3'LЪ[z=1Y3^ewDzرCӗ: 5σCJ=Tm'a=-~!bob Lܠ;&0U<QֵsIʓg| "N5KJHxZIEǤtt cGp9ЇF$'F(ߑd]bWo+//<1< t#6 E8lK4xuǵ gnѶ`b.bȇCxWZ!q M?|GY틢D:hxъ=nԭ}DV֙jаo!QbgOtJ|EF+pA)RG1D^ڮ!w7Lڸ^zڼZ)57-,39CE? pEyjpx]+N$}UOOvsM)tl4U)svUq3\1_iƒǴ߯Rzr v&,<3R4a߽j֋!+XKf]LKE|nU2h Y_I{eXU+SX6z0Ӳ9`Rnnca2F_osߑpK-Ae2һ%ѫJ%͜T4߄=3o9w˅RI]z0JaA;|2ϢAҋ45O4xbԔz L5Iφʀ~gp3V0 s-X]қkIn"ȟP[+*sJ_.|Eo[A ~OO1S%o_oMŰ}:N֘@$ي꧸ݙFl}u1{#oX790u+ PDg)|F-X:28K=IKq]Ϯ}L6r^0|_ztv =9œVҮ\Eu\!hNX_Z:JXNH4/'"g[`w^ͧ WSKvpo='zcS)=_7l9~uA< .#JQI) . qa0e՜X ,>[Y~8sg?F ݐwA 2y+F՛M74[nP8͎k󚃧$d__XÃjI/LV,_^f5+u n 1G$B}T(in) *,O2^C H7qT\F^LTYci|`f? _bdɣ3h4͏ ͂"==?0b-+Cߎ@,.)D0:]:=<2 Go.!ad@7\oEi~J10>*נҕE_iS:d>~Ɯ_"=O)-QYo>ϐQO:5;->}@Jp_ sX:`{#ħwC$.ӓfc>%K7&laҲ9Zi8ܨH4 6.XJ&xB©BNS'(]3wA85̉NƋ| \,LٓڏS,H죖ȜUJM)02ŭM\te6w-޶&oڡ*׼%mJIȻ7]l=C—eԵT*G'B:b}{?ox-{IHJ0ԋ&#DǸԼ?ů$IIu]XŕD,>&Hͪ + Odge o>_2D:`6a?|ݻOb&kj)k4B~jptW}_.zɔߑF"s7bCO7s ٪0m .v;|j~/MlO^rTg `J$B_1gbwxy}I"4DFiif6H9Y7C'rd'(+R4v\r[L>pTJ#&]sȵ_oD薚bdOpPqyP [^-2"ʣi 敽%ʆ_XI#WEr ["V==9LVdň9eG՚4X68w4b{єFOM Y]6MHu챰To䶆U&\m,87(~=]7DixӸƉJኝ̛dHp+pWqFh`_I>V'h7E,WG|E j/QP yߴI#Cƺ8 L"CT1^Ż]t0i,qL ^bVtΓy5&zɔ_:Ɍ 9ӣlc/7Ȕz4ĩ6 M g:=oY?m6lhw\8tJY)kuj$(vSۺ:յn=vβrE28ѝ2RW>9*YIQ@Sf++Q*X9?ڝu Vw.;@G`(ۋՑ׾6-,q ?iׄU=?:n5+_= }Y nECHg$M ,QH;.u.}{|mM|9MOfѹȴܿkT=`ײ]nؙ; Q-e)U\-t"b4G`>c:bQ-ǶV1vȥt[4Jvb#E}7G$C.q?9aG@:Rp=c mȜ;3>/sɤ=I S.# څml+G῅]S˭P7эjRfJS` Vbk5kG:&ޙ`P<%ss1*W) ԫ7iq\g硵Y ?{ }W ՟ڡHOi ho\l՚*ZEU^gl]]޲=![S `uaO2sǵ^"5D5;O{X$ӃQ9+o<ѐdH&WԠot6/ EY)&$aa4 ita._b${J4ꡮBH塃(KKIÝIC +u=%acCü ^?ƗTZp-|iwл;U?f2+.<$*nwbӎ@)j+ ͠GNz_8veDO&3eLd&Ѿt&)Nm$"ShP)&j}J]E<ߒ{ :H|CitMFg~R+qPw_<Ed|,; $S#p6ݤ6 )L_|o73f8ԊKp^P?N) endstream endobj 199 0 obj << /Length1 1647 /Length2 10510 /Length3 0 /Length 11342 /Filter /FlateDecode >> stream xڭzeX\ݒ5U;?cHY O,?UT??M?%wŢE6N *dhpg>;tDfh]o⁙D&KuK^r0'Pd~6xm.&@! zJ!6hGS{&'(#Ze /PsHw+jĺ\I?+Pu3E} -e&B&65(,:+* vUS?7eB[ !" 丙7 P5幜.s?O] ]}k~pǀFõizL"U[ww!)Ryz9-go=).W1/XO&B뾓rSش9Rpg`1KKEJ.WzHa(p$GK̑FB> "RF6@wJ I/Q-jɇNؑ3H׵8aP rpj>T.~8Մ* rB\=AjcB'zLӄ$*eO w՟h~fhP+fkIj(Oϔ0 cم,Q'^WH-o=켟FՒV㏒vOvspdZ2hR+E8 "ɻk(/nXWc|JqV} 6ηRnس{y3ym4~> ׭MX,6tJa;HJїOU>I?1͌_dg-E e.QRfp))?Ʀ՛n܈zyHfvڂ ==OAUʉjXDɷIJsZdpR  !9v=> ء V= V% ՓFzNCtJn ҥ0Ul5G$0^y:Xn]D .h|j@|*gn3gL O.Q;>HBD*va5PrJdyT< 2pO$:~s[瀞o~:6$W/@l/eIyEYFs?5C/]I#VRw!S'2>A7 Cg0ÃE۪iҨ:0{M>MM"0yJ`(&a!6aqd1/I/aF+K Q\kbїt9NJ>i(.79!;mr~5r6"lb$ ='7q_J?1?>Od:_T^ %9ltվ: svx-zd;E3> vx&+VWwV9\/!Ubuo.]3#r [;qT3zU",{V:,jM &FNL =E㾜ݾ.z3ӫ51nEib2u\|Pv x0~ pENEyKZ@`|{pzt{8TiWpUFהg{tgXTm1(ra_#$F%dEdbIU"T͸N#eZc"5z:>!־eD>IjF[#c տ]@E@m$*p#4JBGʕ.רDNё#K8UNK\?GRDG^SΗ- }GX+X"E+B~ɪD)45OЉ;Lvwg2"aW #׳,Xv)mQI fcRGHۗEk8 W#J "m+K> ahd/ܺt%.jrۭn5QI1Y-~u(,~:D]\⯖sJ%?ūln='/T2,8r"lyZ!G{.=@K/0PDa=B, ,XFT$N 8ce7tK>As"/hE9^}  FS4!UQ* d[ȣjV"*֝Ԓ`Wcd7!vWq^=0j/DzМ9Oo.Y%q;k6VIqS-)Nj'dLԔbEvgAw]>݁f2|QM c63=t Ek;^KGT4VrbN!#WceX→% |xo'X\2w c5_\bKn7û\)9T Q`w@Lɴzbe{dp ɹۨ4iϫh-dDMVHc?^92ȭr;Te\5dT_>Oo9-?@%aM .+}OL,r}qnXS t*t_Gb\N4uC)elYmy;?Jc3Oݭt7 rZnVx71ar-IQ{PSR޷ߍ&G6] &zmeg!1_kE*nTq0ݖ?yZl6)X"̸?1W 5њQm$ J,iUYJ]0#k_po}"(AQibKu~<}U"I"mGDbz?ENY,(kbf"khĀYV(YdF+FDA=sRGT6DcG3QW[\1@Cz/e! Z\bD;-!/f2Ztaƹ0:34Ǖtek&W̨%yqv|sH F Sb|AcH?jl5 her%U.9|e("19EXhIҬ= }m"ΪbZ⒪-.IczIEiõ}`u#kǚEbq\̩"5ۖ!Gݥ'4[D4y֏%&OhdOt~6Hʋ݋rT5:Jd~S/Ei\{<nW(.#cxI,})3DW g{!Rх 4u~wT4B#Թ;FkȦBp%oQ{RnҲcI|+#RT-9vB@ļJ8Iʮŋ !56uгBzj[֞Cf!=4I~տW},5rDJy$=LA6Ⅲzb)}ۜZM 6CNLc_T5x-?wuMP(^Mo]UMd$G\OWf^qg~*{=MYuڙW!q+1~."߲'>;!. ~^\Z@ʑL'Ƈ:Wl #Tg@m2TJ6À튭+6F@@B͊yEA"ABRG;ޭQD%Pf!? qW@MϬueYBEf=2۾T|nXW j;vO_'(Bڰ2Z{(`%ƊO <+Hڞo-My zDƬ"9ojv5`lI7$oiWq}*Զ7"ʺم]\BR{{sYJxW7oVU*qh'|8kW\k]יHR_8s7tmSsӶ6! ۣIVudH|UTHZ)~vmvtPMUkljV{›o#eFȌN-*o*&8#GHҢrcȮ/&劺` &i@e)i&>XNY wFParX;>lO1&◺} SQiQ $ӌWa} zKW> :6BԆn|MlxŜ{ǁfi3xF30S()d]og\% e?M~Wp*kaZtHvK~Q rf>乍6\8M'HB˃#5 = blY\­uO'#Eq3f1u4r>zŭ7W/Flu[&h%dMMϧÆ2~6X3+Q%Z#$`"ֳc$8;wڭZ.Zĕ=PвF?qUH M؋>LM! ĔX?Cۇ^Hr*amp IDz:I^ qhzM5Ƀ.d{as5#PF2^a ;Yr4ĐrF|y]ȩ6rjqfY뀔.&ɔ3|_9HH82`ΛKgN߱\Ka)fx2IKsB_yhEl>*(-TNYSo6qd֬0 "鰨r/Vq": /H< <&anQ6 ج }AISAT>/xi9o0wh m)zwsHϺ;ȸ poH?t f1)RvVJfrvSts%f^>kG43[ 1a[t#s\*: &՟, X! Вiw8tfœs e`vcd0X9dRo8w 'KrVC%KrM}@8ldbtsZŮ,NAዠRCv_/yqGBgDn<{B7-`5#-34f㵞l?`K#݆ru0wlH<)GZU> ŷ3ęwQ<( 8q 8x$nsJY鸢vDŽfݝ2C!Mtlp>mc>JqWΘK3X1ݡwz6ėZHاN6yŘ.JrX{\_Obs6ۧȟbb@ Sx l+A骪ZQgRL!h=91gH%2KTQ pQv 1Q;ɺrmQl 'PY ݳ!QsbҍB5S sR?pLF [$0okN3 PqP>A`*ق[I5Fyv\.D78i9fOp!fUr FTMhHIi̲/Yt]xD'xt>:pz^=[Z>Q\I&G:Wf$د'Vxr~HqTAQB ٿaM}1c#y?x©$_7%TΖEk͚'|V.<[3*%Uf=}K7bȑY1#%ցqqHԝ8ܟpq&hg(L^_kJnJHFFY'Yf*}&*oHZ!~翫 dۨ(Vd^JęPXtd8gP>$bZ1+Q[U>ؙq)]r fl2j|#(Jݳ c)LiyVHX ) BѽD-؃*j߹IoI3FkwB"hRG~Z_?uE ѭ}?IUPlt(iWuj+nоNF᱂]/mʉ ՜JHU_I"(0e;E=1jrkr9VjDATE2V14RI ;L3)砧"ۑ)Ehpj)X湓z@q1c\[A1_yyn"hurʎ͂jS#jC4*.`bamE#~ }/!m9Ȇx6$Soϩ".p :Wu;) n< 7Yy^TzKW,dZWeXd[YDk[ߟɾdK3ԡֆş5jbC?34 .LO2 ]Ĭy"|T2WB#h/=ؘ! l3$4IbAjE +7 II'o?3gp^JQ4+\Kc|(i!c\éx VTp]Z'{}nXMI 1׊XD(bu?Ί endstream endobj 144 0 obj << /Type /ObjStm /N 100 /First 895 /Length 3884 /Filter /FlateDecode >> stream x[ksܶvDw /QԵ]IjEK۬v]q܋V~xPA9Ϲ YɄhoԶLknjeV&tɬ)\QZ0 @NJyeFB9]`YB$ qc0qxt\ {:2(&UF3)xkG-F`ǤL:Gd(q-*I+)* *cHXÔ%eK`zKOWfF+ biKxbځ4ީ&'A#eV J 2)VC Q%FBQ#A!!HAM . K@Udoލ9KW̒Pa`q7M< B(,/Xp J:'( 48_/- J,  N G{ )e  hjYHd W,qdbR?QJ3*`؏$ WEG$P@`8e g "RpZp)(4\FOk KA}Ոbgy] D\iZ/'u/tt񑝗谂P^ bk8|m_ A?gu<~9_TD)ZKe頚HS,tE)'T Q!i)P)#R&U%-K KˠQuk@-[B{P2!*st yy2>:@N(h0GS>IIj|~ *uM"-*Z%ԣŹSʆ$VnHr$M+}iBs %z: ">sq{Ҵ})! \0hSX3]A%+wKP~ 78 "DF|<j: +JO+3E٬$49$a@Csg$~@G#-+#SGg%=b蚎iOO![+dYq1i4=y'9velwQ?- 35ƴZtvFm~Va2Xm$-Ȥ1,Ԏ[96GKcdsXTϙ찧ۢw1$c9*oFL8oR֧-EK|"HZr_\+7t6ŧw;yx46A"D;3[_dA9wnÔðDk.i`)!}V^v?gIEۙk\$,Ek:"o֛L1HhvI[~&6µklٲ頷fͿszGn+ɚdtM֪삠sĨKK6낃q\Nt\hEƋlmlEiwפO|wMr .jՋeSO_7b>YWٸ6ǧlLgOczQd@_XP+rğᆳ7_td~=nkpxIeI_W5q/Ooo_-f+E_>Nf[~_e5%7Ts>?Us>+>/wqͪuZUW_5Ք-~%_UZM?l5oU_ϱXMˊWZ.OL{oQۦ/x݋?^ޯў[yLeV,627iG_%N1ܡXѷklj<\Uz ]fkEaiS8[p۵^M-vWt[MڟjNt>s(}?q@W!Jo):F\>U)>owY:Xs.{O~HVj7t]b[*(G|*M3קsB?dl2 + մZbꁙ!ϱo{g ddu4sk9|wn!p#@7?aC:@}Ƈ@6r3t4'rLt `s5+x3t"@PΔ6LP=)h,@}55Ty|J)1]w950uA߱ 4Bi0qMol$<чɩQNʤ܅WsŃT[t(+jr kbT|*l*54UuOP R͇%Tnϐ&9,Mr>0.6JL:Oǫ*>[]Q5~9u2]jyx߈g^7lB_nt 6!sp1I\'ۧ&>>zZ0GdF}H߀iwTSk! v_̣:|2w+0 #Kz2T#}eQoP/@AzZ׎mtna"X%X*ZySLL/Ο0 !MfY}sKMwwi2+zV{قGN'Gr-rT'#gb}\Q, 8/#s'o^x7Ah<1^ꈥs띣oқvZ G_ H'LsVGgq,(=W(Ê;T#f7t؎k[F04IiMr9BaPr~Km/f00ռ%WiQNتB­^U@"2Oq;Γ}&owɓEyf}[ܪC~A $ǚYh zv[#_nFC.q+YQaWRB}HDK!Ak)b(z.9ކdCC{`c:;68#~;!N (jROsUCtI> endobj 217 0 obj << /Type /ObjStm /N 4 /First 29 /Length 194 /Filter /FlateDecode >> stream xu 0EYVAh- v+ql@6\f8w  > >g$]`#,801qS1wgl=э,,tnSO@[| @Wʩ>=`tXW˕6TG.[[hzi c+1}.Q& endstream endobj 222 0 obj << /Type /XRef /Index [0 223] /Size 223 /W [1 3 1] /Root 220 0 R /Info 221 0 R /ID [<057C21CB0FCB3EE9EA1494018915D769> <057C21CB0FCB3EE9EA1494018915D769>] /Length 518 /Filter /FlateDecode >> stream xGRTa{A[؊&@EQ$bBE1ف#99{pVG6pL~u8*"(h eJ(6p S4;f:'acL%8Œ&hfd@9PɈ6L7@//V˰ |JAa`3y2VW*\17a&LmSp.r?ΊW,LF?)=8kء*3Zh-~68<7gt2=| 6a >|{%J(J('קV־l'&RڤObrQ)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q$Q$HnNȹQ.Q5e K"2HF/A0l_;c|Ͽ2T<-f9D"-_%E"BP/Ɉddȷ]ܹJFU2enN1gs4 endstream endobj startxref 90184 %%EOF hms/tests/0000755000176200001440000000000013155736157012220 5ustar liggesusershms/tests/testthat/0000755000176200001440000000000013605457502014052 5ustar liggesusershms/tests/testthat/test-lubridate.R0000644000176200001440000000114213446235304017120 0ustar liggesuserscontext("lubridate") test_that("duration", { skip_if_not_installed("lubridate") expect_identical(lubridate::as.duration(hms(minutes = 1:3)), lubridate::duration(minutes = 1:3)) }) test_that("interval", { skip_if_not_installed("lubridate") timestamp <- Sys.time() expect_identical(lubridate::as.interval(hms(seconds = 2), timestamp), lubridate::interval(timestamp, timestamp + 2)) }) test_that("period", { skip_if_not_installed("lubridate") expect_identical(lubridate::as.period(hms(hours = -1)), lubridate::period(hours = -1)) }) hms/tests/testthat/test-construct.R0000644000176200001440000000276713527724566017224 0ustar liggesuserscontext("construct") test_that("constructor", { expect_identical(hms(1:3, 2:4, 3:5, 4:6), hms(seconds = 1:3 + 2:4 * 60 + 3:5 * 3600 + 4:6 * 86400)) expect_identical(hms(-1, 1), hms(59)) expect_identical(hms(3600), hms(hours = 1)) expect_equal(length(hms(1)), 1L) expect_true(is_hms(hms(1))) expect_is(hms(1), "difftime") expect_identical(as.numeric(hms(1)), 1) expect_identical(as.difftime(hms(1)), hms(1)) expect_identical(units(as_hms(as.difftime(1, units = "mins"))), "secs") expect_identical(as_hms(hms(1)), hms(1)) }) test_that("zero length (#35)", { expect_equal(length(hms()), 0L) expect_true(is_hms(hms())) expect_is(hms(), "difftime") expect_identical(as.numeric(hms()), numeric()) expect_identical(as.difftime(hms()), hms()) expect_identical(hms(), hms(seconds = numeric())) expect_identical(hms(), hms(minutes = numeric())) expect_identical(hms(), hms(hours = numeric())) expect_identical(hms(), hms(days = numeric())) expect_identical(hms(), as_hms(numeric())) }) test_that("bad input", { expect_error(hms(hours = 1, seconds = 3), "only") expect_error(hms(minutes = 1, days = 3), "only") expect_error(hms(minutes = 1, hours = 2:3), "same length or be NULL") expect_error(hms(seconds = 1:5, minutes = 6:10, hours = 11:17), "same length or be NULL") expect_error(hms("05:00"), "must be numeric") }) test_that("is.hms()", { scoped_lifecycle_silence() expect_identical(is.hms(hms), is_hms(hms)) expect_identical(is.hms(3), is_hms(3)) }) hms/tests/testthat/helper-compare.R0000644000176200001440000000047013502521537017075 0ustar liggesusersexpect_hms_equal <- function(x, y) { expect_s3_class(x, "hms") expect_s3_class(y, "hms") expect_equal(as.numeric(x), as.numeric(y)) } expect_difftime_equal <- function(x, y) { expect_s3_class(x, "difftime") expect_s3_class(y, "difftime") expect_equal(as.numeric(as_hms(x)), as.numeric(as_hms(y))) } hms/tests/testthat/helper-pillar.R0000644000176200001440000000045413510746773016746 0ustar liggesusersexpect_known_pillar_shaft_display <- function(x, file, width) { # Avoid crayon tests on CRAN cran <- !identical(Sys.getenv("NOT_CRAN"), "true") if (cran) return() object_quo <- rlang::quo(pillar::pillar_shaft(x)) pillar::expect_known_display(!!object_quo, file = file.path("out", file)) } hms/tests/testthat/test-parse.R0000644000176200001440000000073613455156023016267 0ustar liggesuserscontext("parse") test_that("parse_hms", { expect_equal(parse_hms("12:34:56"), hms(56, 34, 12)) expect_equal(parse_hms("12:34:56.789"), hms(56.789, 34, 12)) expect_equal(parse_hms(NA), hms(NA)) expect_equal(parse_hms(c("12:34:56", NA)), as_hms(c(hms(56, 34, 12), hms(NA)))) }) test_that("parse_hm", { expect_equal(parse_hm("12:34"), hms(0, 34, 12)) expect_equal(parse_hm(NA), hms(NA)) expect_equal(parse_hm(c("12:34", NA)), as_hms(c(hms(0, 34, 12), hms(NA)))) }) hms/tests/testthat/test-combine.R0000644000176200001440000000205313605127176016567 0ustar liggesuserscontext("combine") test_that("combination keeps class and order", { expect_identical(c(hms(1), hms(2)), hms(1:2)) }) test_that("combination errs if not supported", { expect_error(c(hms(1), factor(2))) }) test_that("combination coerces to hms", { # Deprecated in v0.5.0 scoped_lifecycle_silence() expect_identical(c(hms(1), 2), hms(1:2)) if (getRversion() < "3.3") skip("Only for R >= 3.3") expect_identical(c(hms(1), "00:00:02"), hms(1:2)) expect_identical(vec_c("00:00:01", hms(2)), hms(1:2)) expect_identical(c(hms(1), 2L), hms(1:2)) expect_identical(vec_c(1L, hms(2)), hms(1:2)) expect_identical(c(hms(1), new_duration(2)), hms(1:2)) expect_identical(vec_c(new_duration(1), hms(2)), hms(1:2)) }) # In R base,`c(as.difftime("20:00:00"), NA)` fails test_that("composition with NA works", { expect_identical( c(hms(1), NA), hms(c(1, NA)) ) expect_identical( vec_c(hms(1), NA), hms(vec_c(1, NA)) ) h <- hms(1) expect_equal(vec_ptype2(h, NA), vec_ptype(h)) expect_equal(vec_ptype2(NA, h), vec_ptype(h)) }) hms/tests/testthat/test-arith.R0000644000176200001440000000254413507433340016261 0ustar liggesuserscontext("arith") test_that("arithmetics work", { expect_equal(as.Date("2016-03-31") + hms(hours = 1), as.Date("2016-03-31")) expect_equal(as.Date("2016-03-31") + hms(days = -1), as.Date("2016-03-30")) expect_equal(as.POSIXct("2016-03-31") + hms(1), as.POSIXct("2016-03-31 00:00:01")) expect_equal(hms(hours = 1) + as.Date("2016-03-31"), as.Date("2016-03-31")) expect_equal(hms(days = 1) + as.Date("2016-03-31"), as.Date("2016-04-01")) expect_equal(hms(hours = 1) + as.POSIXct("2016-03-31"), as.POSIXct("2016-03-31 01:00:00")) expect_difftime_equal(hms(1) + hms(2), hms(3)) expect_difftime_equal(hms(1) - hms(2), hms(-1)) expect_difftime_equal(2 * hms(1), hms(2)) expect_difftime_equal(hms(hours = 1) / 2, hms(minutes = 30)) expect_difftime_equal(-hms(1), hms(-1)) }) test_that("component extraction work", { x <- as.numeric(hms(12.3, 45, 23, 1)) * TICS_PER_SECOND expect_equal(tic_of_second(x), 300000) expect_equal(second_of_minute(x), 12) expect_equal(minute_of_hour(x), 45) expect_equal(hour_of_day(x), 23) expect_equal(days(x), 1) }) test_that("component extraction work for negative times", { x <- as.numeric(-hms(12.3, 45, 23, 1)) * TICS_PER_SECOND expect_equal(tic_of_second(x), 300000) expect_equal(second_of_minute(x), 12) expect_equal(minute_of_hour(x), 45) expect_equal(hour_of_day(x), 23) expect_equal(days(x), -1) }) hms/tests/testthat/out/0000755000176200001440000000000013556150011014647 5ustar liggesusershms/tests/testthat/out/mss.txt0000644000176200001440000000052013605127316016216 0ustar liggesusers-01'00.000" -00'01.000" -00'00.001" 00'00.000" 00'00.001" 00'01.000" 01'00.000" NA hms/tests/testthat/out/hms.txt0000644000176200001440000000065613605127316016215 0ustar liggesusers-1000:00:00 - 01:00:00 - 00:01:00 - 00:00:01 00:00:00 00:00:01 00:01:00 01:00:00 1000:00:00 NA hms/tests/testthat/out/hmss.txt0000644000176200001440000000101413605127316016365 0ustar liggesusers-01:00:00.000 -00:03:03.450 -00:00:01.000 -00:00:00.001 00:00:00.000 00:00:00.001 00:00:01.000 00:01:00.000 00:02:03.450 01:00:00.000 NA hms/tests/testthat/out/ms.txt0000644000176200001440000000030613605127316016035 0ustar liggesusers-01'00" -00'01" 00'00" 00'01" 01'00" NA hms/tests/testthat/out/hm.txt0000644000176200001440000000056613605127316016032 0ustar liggesusers-01:06:40.55 -01:00:00.00 -00:01:00.00 00:00:00.00 00:03:00.00 02:00:00.00 02:46:40.23 NA hms/tests/testthat/test-coercion-deprecated.R0000644000176200001440000000271713455156023021055 0ustar liggesuserscontext("coercion-deprecated") test_that("coercion in", { scoped_lifecycle_silence() expect_identical(as.hms(0.5 * 86400), hms(hours = 12)) expect_identical(as.hms(-0.25 * 86400), hms(hours = -6)) expect_hms_equal(as.hms("12:34:56"), hms(56, 34, 12)) expect_hms_equal(as.hms(strptime("12:34:56", format = "%H:%M:%S", tz = "UTC"), tz = "UTC"), hms(56, 34, 12)) expect_hms_equal(as.hms(strptime("12:34:56", format = "%H:%M:%S", tz = "CEST"), tz = "CEST"), hms(56, 34, 12)) expect_hms_equal(as.hms(strptime("12:34:56", format = "%H:%M:%S", tz = "PST8PDT"), tz = "PST8PDT"), hms(56, 34, 12)) now <- Sys.time() now_lt <- as.POSIXlt(now) expect_hms_equal(as.hms(now), hms(now_lt$sec, now_lt$min, now_lt$hour)) expect_hms_equal(as.hms(now_lt), as.hms(now)) expect_error(as.hms(FALSE)) }) test_that("coercion out", { expect_identical(as.character(hms(56, 34, 12)), "12:34:56") expect_identical(as.character(hms(NA)), NA_character_) expect_identical(as.POSIXlt(hms(hours = 6)), strptime("1970-01-01 06:00:00", format = "%Y-%m-%d %H:%M:%S", tz = "UTC")) expect_identical(as.POSIXct(hms(hours = -6)), strptime("1970-01-01 18:00:00", format = "%Y-%m-%d %H:%M:%S", tz = "UTC") - 86400) df <- data.frame(a = 1:3) df$b <- hms(hours = df$a) expect_identical(df, data.frame(a = 1:3, b = hms(hours = 1:3))) }) hms/tests/testthat/test-colformat.R0000644000176200001440000000120613446235304017134 0ustar liggesuserscontext("pillar") test_that("pillar", { expect_known_pillar_shaft_display( hms(c(-3600, -123.45 -60, -1, -0.001, 0, 0.001, 1, 60, 123.45, 3600, NA)), file = "hmss.txt" ) expect_known_pillar_shaft_display( hms(c(-3600000, -3600, -60, -1, 0, 1, 60, 3600, 3600000, NA)), file = "hms.txt" ) expect_known_pillar_shaft_display( hms(c(-4000.55, -3600, -60, 0, 180, 7200, 10000.23, NA)), file = "hm.txt" ) expect_known_pillar_shaft_display( hms(c(-60, -1, 0, 1, 60, NA)), file = "ms.txt" ) expect_known_pillar_shaft_display( hms(c(-60, -1, -0.001, 0, 0.001, 1, 60, NA)), file = "mss.txt" ) }) hms/tests/testthat/test-coercion.R0000644000176200001440000000354713527724506016770 0ustar liggesuserscontext("coercion") test_that("coercion in", { expect_identical(as_hms(0.5 * 86400), hms(hours = 12)) expect_identical(as_hms(-0.25 * 86400), hms(hours = -6)) expect_hms_equal(as_hms("12:34:56"), hms(56, 34, 12)) expect_hms_equal(as_hms(strptime("12:34:56", format = "%H:%M:%S", tz = "UTC")), hms(56, 34, 12)) expect_hms_equal(as_hms(strptime("12:34:56", format = "%H:%M:%S", tz = "CEST")), hms(56, 34, 12)) expect_hms_equal(as_hms(strptime("12:34:56", format = "%H:%M:%S", tz = "PST8PDT")), hms(56, 34, 12)) expect_hms_equal(as_hms(as.POSIXct(strptime("12:34:56", format = "%H:%M:%S", tz = "UTC"))), hms(56, 34, 12)) expect_hms_equal(as_hms(as.POSIXct(strptime("12:34:56", format = "%H:%M:%S", tz = "CEST"))), hms(56, 34, 12)) expect_hms_equal(as_hms(as.POSIXct(strptime("12:34:56", format = "%H:%M:%S", tz = "PST8PDT"))), hms(56, 34, 12)) now <- Sys.time() now_lt <- as.POSIXlt(now) expect_hms_equal(as_hms(now), hms(now_lt$sec, now_lt$min, now_lt$hour)) expect_hms_equal(as_hms(now_lt), as_hms(now)) expect_error(as_hms(FALSE)) x <- c("12:34:56", "ab:cd:ef") expect_condition(hms::as_hms(x), class = "hms_lossy_cast") }) test_that("coercion out", { expect_identical(as.character(hms(56, 34, 12)), "12:34:56") expect_identical(as.character(hms(NA)), NA_character_) expect_identical(as.POSIXlt(hms(hours = 6)), strptime("1970-01-01 06:00:00", format = "%Y-%m-%d %H:%M:%S", tz = "UTC")) expect_identical(as.POSIXct(hms(hours = -6)), strptime("1970-01-01 18:00:00", format = "%Y-%m-%d %H:%M:%S", tz = "UTC") - 86400) df <- data.frame(a = 1:3) df$b <- hms(hours = df$a) expect_identical(df, data.frame(a = 1:3, b = hms(hours = 1:3))) }) hms/tests/testthat/test-update.R0000644000176200001440000000043013446235304016426 0ustar liggesuserscontext("update") test_that("Can't update units", { x <- hms(minutes = 3) expect_equal(units(x), "secs") expect_warning(units(x) <- "mins", "always uses seconds") expect_equal(units(x), "secs") expect_warning(units(x) <- "secs", NA) expect_equal(units(x), "secs") }) hms/tests/testthat/test-round.R0000644000176200001440000000134613455156023016302 0ustar liggesuserscontext("round") test_that("round_hms", { expect_equal(round_hms(parse_hms("12:34:56"), 5), hms(55, 34, 12)) expect_equal(round_hms(parse_hms("12:34:56"), 60), hms(0, 35, 12)) expect_equal(round_hms(hms(0.7), 0.25), hms(0.75)) expect_equal(round_hms(hms(NA), 5), hms(NA)) expect_equal(round_hms(parse_hms(c("12:34:56", NA)), 5), as_hms(c(hms(55, 34, 12), hms(NA)))) }) test_that("trunc_hms", { expect_equal(trunc_hms(parse_hms("12:34:56"), 5), hms(55, 34, 12)) expect_equal(trunc_hms(parse_hms("12:34:56"), 60), hms(0, 34, 12)) expect_equal(trunc_hms(hms(0.7), 0.25), hms(0.5)) expect_equal(trunc_hms(hms(NA), 5), hms(NA)) expect_equal(trunc_hms(parse_hms(c("12:34:56", NA)), 5), as_hms(c(hms(55, 34, 12), hms(NA)))) }) hms/tests/testthat/test-output.R0000644000176200001440000000541213455167742016523 0ustar liggesuserscontext("output") test_that("output", { expect_identical(format(hms()), "hms()") expect_identical(format(hms(1:2, minutes = c(0, 0), hours = 3:4)), c("03:00:01", "04:00:02")) expect_identical(format(hms(minutes = 1:-1)), c(" 00:01:00", " 00:00:00", "-00:01:00")) expect_output( expect_identical(print(hms(minutes = 1:2, hours = 3:4)), hms(minutes = 1:2, hours = 3:4)), "03:01:00\n04:02:00", fixed = TRUE) }) test_that("abbreviation", { expect_identical(vec_ptype_abbr(hms()), "time") expect_identical(vec_ptype_full(hms()), "time") }) test_that("beyond 24 hours (#12)", { expect_identical(format(hms(hours = 23:25)), c("23:00:00", "24:00:00", "25:00:00")) expect_identical(format(hms(hours = 99:101)), c(" 99:00:00", "100:00:00", "101:00:00")) expect_identical(format(hms(hours = c(-99, 100))), c("- 99:00:00", " 100:00:00")) expect_identical(format(hms(hours = c(-100, 99))), c("-100:00:00", " 99:00:00")) }) test_that("fractional seconds (#13)", { expect_identical(format(hms(0.1)), c("00:00:00.1")) expect_identical(format(hms(c(12, 0.3))), c("00:00:12.0", "00:00:00.3")) expect_identical(format(hms(c(0.1, 0.01))), c("00:00:00.10", "00:00:00.01")) expect_identical(format(hms(c(12, 0.3), minutes = c(0, 0), hours = c(345, 6))), c("345:00:12.0", " 06:00:00.3")) expect_identical(format(hms(c(-0.1, 0.1))), c("-00:00:00.1", " 00:00:00.1")) }) test_that("picoseconds (#17)", { expect_identical(format(hms(1e-6)), c("00:00:00.000001")) expect_identical(format(hms(9e-7)), c("00:00:00.000001")) expect_identical(format(hms(4e-7)), c("00:00:00.000000")) expect_identical(format(hms(1e-10)), c("00:00:00.000000")) expect_identical(format(hms(1e-20)), c("00:00:00.000000")) expect_identical(format(hms(c(1, 1e-20))), c("00:00:01.000000", "00:00:00.000000")) }) test_that("picoseconds to the next second (#140)", { expect_identical(format(hms(1 - 1e-6)), c("00:00:00.999999")) expect_identical(format(hms(1 - 9e-7)), c("00:00:00.999999")) expect_identical(format(hms(1 - 4e-7)), c("00:00:01.000000")) expect_identical(format(hms(1 - 1e-10)), c("00:00:01.000000")) expect_identical(format(hms(1 - 1e-10)), c("00:00:01.000000")) expect_identical(format(hms(1 - c(1, 1e-10))), c("00:00:00.000000", "00:00:01.000000")) }) test_that("NA", { expect_identical(format(hms(NA)), c("NA")) }) hms/tests/testthat/test-subset.R0000644000176200001440000000137313507432664016466 0ustar liggesuserscontext("subset") test_that("range subsetting keeps class", { expect_identical(hms(1:3)[2], hms(2)) expect_identical(hms(1:3)[2:3], hms(2:3)) }) test_that("range updating keeps class", { skip_if(packageVersion("vctrs") <= "0.1.0") x <- hms(1:3) x[2] <- hms(4) expect_identical(x, hms(c(1,4,3))) x <- hms(1:4) x[2:3] <- hms(5:6) expect_identical(x, hms(c(1,5,6,4))) }) test_that("range updating warns if lossy cast", { skip_if(packageVersion("vctrs") <= "0.1.0") x <- hms(1:3) # r-lib/testthat#783 expect_warning(x[2] <- "a") }) test_that("index subsetting keeps class", { expect_identical(hms(1:3)[[2]], hms(2)) }) test_that("index updating keeps class", { x <- hms(1:3) x[[2]] <- 4 expect_identical(x, hms(c(1,4,3))) }) hms/tests/testthat.R0000644000176200001440000000006213155736157014201 0ustar liggesuserslibrary(testthat) library(hms) test_check("hms") hms/R/0000755000176200001440000000000013605127301011240 5ustar liggesusershms/R/pillar.R0000644000176200001440000000374513505755442012673 0ustar liggesusers# Dynamically exported, see zzz.R pillar_shaft.hms <- function(x, ...) { data <- rep(NA_character_, length(x)) xx <- decompose(x) has_hours <- xx$hours > 0 highlight_hours <- has_hours highlighted <- highlight_hours has_minutes <- xx$minute_of_hour > 0 highlight_minutes <- !highlighted & has_minutes highlighted <- highlighted | highlight_minutes has_seconds <- xx$second_of_minute > 0 highlight_seconds <- !highlighted & has_seconds highlighted <- highlighted | highlight_seconds has_tics <- xx$tics > 0 highlight_tics <- !highlighted & has_tics need_tics <- any(has_tics, na.rm = TRUE) need_seconds <- need_tics || any(has_seconds, na.rm = TRUE) need_hours <- any(has_hours, na.rm = TRUE) need_sign <- any(xx$sign) if (need_hours) { data_seconds <- paste0( if (need_sign) ifelse(xx$sign, "-", " ") else "", pillar::style_num(format_hours(xx$hours), xx$sign, highlight_hours), pillar::style_subtle(":"), pillar::style_num(format_two_digits(xx$minute_of_hour), xx$sign, highlight_minutes), if (need_seconds) paste0( pillar::style_subtle(":"), pillar::style_num(format_two_digits(xx$second_of_minute), xx$sign, highlight_seconds) ) ) data <- paste0( data_seconds, if (need_seconds) { pillar::style_num(format_tics(xx$tics), xx$sign, highlight_tics) } ) } else { data_seconds <- paste0( if (need_sign) ifelse(xx$sign, "-", " ") else "", pillar::style_num(format_two_digits(xx$minute_of_hour), xx$sign, highlight_minutes), pillar::style_subtle("'"), pillar::style_num(format_two_digits(xx$second_of_minute), xx$sign, highlight_seconds) ) data <- paste0( data_seconds, pillar::style_num(format_tics(xx$tics), xx$sign, highlight_tics), pillar::style_subtle('"') ) } na_indent <- crayon::col_nchar(data_seconds[1], type = "width") - 2L data[is.na(x)] <- NA pillar::new_pillar_shaft_simple(data, na_indent = na_indent) } hms/R/parse.R0000644000176200001440000000152413556147465012521 0ustar liggesusers#' Parsing hms values #' #' @description #' These functions convert character vectors to objects of the [hms] class. #' `NA` values are supported. #' #' `parse_hms()` accepts values of the form `"HH:MM:SS"`, with optional #' fractional seconds. #' @param x A character vector #' @return An object of class [hms]. #' #' @export #' @examples #' parse_hms("12:34:56") #' parse_hms("12:34:56.789") parse_hms <- function(x) { as_hms(parse_time(x, format = "%H:%M:%OS")) } #' @rdname parse_hms #' @description #' `parse_hm()` accepts values of the form `"HH:MM"`. #' @export #' @examples #' parse_hm("12:34") parse_hm <- function(x) { as_hms(parse_time(x, format = "%H:%M")) } parse_time <- function(x, format) { difftime( strptime(as.character(x), format = format), strptime("0:0:0", format = "%X"), units = "secs", tz = "UTC" ) } hms/R/zzz.R0000644000176200001440000000042713507433405012231 0ustar liggesusers# nocov start .onLoad <- function(...) { vctrs::s3_register("pillar::pillar_shaft", "hms") if (utils::packageVersion("vctrs") <= "0.1.0") { vec_default_cast <<- vec_default_cast_old } else { rm("vec_default_cast", inherits = TRUE) } invisible() } # nocov end hms/R/args.R0000644000176200001440000000135613505755442012340 0ustar liggesuserscheck_args <- function(args) { is_null <- map_lgl(args, is.null) if (all(is_null)) return() valid <- map_lgl(args[!is_null], is_numeric_or_na) if (!all(valid)) { stop("All arguments must be numeric or NA", call. = FALSE) } if (!all(diff(which(!is_null)) == 1L)) { stop("Can't pass only ", paste(names(is_null)[!is_null], collapse = ", "), " to hms().", call. = FALSE) } lengths <- map_int(args[!is_null], length) if (length(unique(lengths)) > 1L) { stop("All arguments to hms() must have the same length or be NULL. Found ", paste0("length(", names(lengths), ") = ", lengths, collapse = ", "), ".", call. = FALSE) } } is_numeric_or_na <- function(x) { is.numeric(x) || all(is.na(x)) } hms/R/round.R0000644000176200001440000000125613562622240012522 0ustar liggesusers#' Round or truncate to a multiple of seconds #' #' Convenience functions to round or truncate to a multiple of seconds. #' @param x A vector of class [hms] #' @param secs Multiple of seconds, a positive numeric. Values less than one #' are supported #' @return The input, rounded or truncated to the nearest multiple of `secs` #' @export #' @examples #' round_hms(as_hms("12:34:56"), 5) #' round_hms(as_hms("12:34:56"), 60) round_hms <- function(x, secs) { vec_restore(round(as.numeric(x) / secs) * secs, x) } #' @rdname round_hms #' @export #' @examples #' trunc_hms(as_hms("12:34:56"), 60) trunc_hms <- function(x, secs) { vec_restore(trunc(as.numeric(x) / secs) * secs, x) } hms/R/arith.R0000644000176200001440000000237113505755442012511 0ustar liggesusersSPLIT_SECOND_DIGITS <- 6L TICS_PER_SECOND <- 10^SPLIT_SECOND_DIGITS SECONDS_PER_MINUTE <- 60 MINUTES_PER_HOUR <- 60 HOURS_PER_DAY <- 24 TICS_PER_MINUTE <- SECONDS_PER_MINUTE * TICS_PER_SECOND TICS_PER_HOUR <- MINUTES_PER_HOUR * TICS_PER_MINUTE TICS_PER_DAY <- HOURS_PER_DAY * TICS_PER_HOUR days <- function(x) { trunc(x / TICS_PER_DAY) } hours <- function(x) { trunc(x / TICS_PER_HOUR) } hour_of_day <- function(x) { abs(hours(x) - days(x) * HOURS_PER_DAY) } minutes <- function(x) { trunc(x / TICS_PER_MINUTE) } minute_of_hour <- function(x) { abs(minutes(x) - hours(x) * MINUTES_PER_HOUR) } seconds <- function(x) { trunc(x / TICS_PER_SECOND) } second_of_minute <- function(x) { abs(seconds(x) - minutes(x) * SECONDS_PER_MINUTE) } tics <- function(x) { x } tic_of_second <- function(x) { abs(tics(x) - seconds(x) * TICS_PER_SECOND) } decompose <- function(x) { x <- vec_data(x) * TICS_PER_SECOND # #140 xr <- round(x) out <- list( sign = xr < 0 & !is.na(xr), hours = abs(hours(xr)), minute_of_hour = minute_of_hour(xr), second_of_minute = second_of_minute(xr), tics = tic_of_second(xr) ) # #140: Make sure zeros are printed fake_zero <- (out$tics == 0) & (xr != x) out$tics[fake_zero] <- 0.25 out } hms/R/cast.R0000644000176200001440000000561413527724545012343 0ustar liggesusers#' Casting #' #' Double dispatch methods to support [vctrs::vec_cast()]. #' #' @inheritParams vctrs::vec_cast #' #' @method vec_cast hms #' @export #' @export vec_cast.hms vec_cast.hms <- function(x, to, ...) UseMethod("vec_cast.hms") #' @method vec_cast.hms default #' @export vec_cast.hms.default <- function(x, to, ...) vec_default_cast(x, to, ...) #' @method vec_cast.hms hms #' @export vec_cast.hms.hms <- function(x, to, ...) x #' @method vec_cast.hms difftime #' @export vec_cast.hms.difftime <- function(x, to, ...) { units(x) <- "secs" new_hms(vec_data(x)) } #' @method vec_cast.difftime hms #' @export vec_cast.difftime.hms <- function(x, to, ...) { # as.difftime() doesn't change the class class(x) <- "difftime" vec_cast(x, to, ...) } #' @method vec_cast.hms POSIXct #' @export vec_cast.hms.POSIXct <- function(x, to, ...) { vec_cast(as.POSIXlt(x), to) } #' @method vec_cast.POSIXct hms #' @export vec_cast.POSIXct.hms <- function(x, to, ...) { structure(as.numeric(x), tzone = "UTC", class = c("POSIXct", "POSIXt")) } #' @method vec_cast.hms POSIXlt #' @export vec_cast.hms.POSIXlt <- function(x, to, ...) { hms(x$sec, x$min, x$hour) } #' @method vec_cast.POSIXlt hms #' @export vec_cast.POSIXlt.hms <- function(x, to, ...) { as.POSIXlt(vec_cast(x, new_datetime())) } #' @method vec_cast.hms double #' @export vec_cast.hms.double <- function(x, to, ...) new_hms(x) #' @method vec_cast.double hms #' @export vec_cast.double.hms <- function(x, to, ...) vec_data(x) #' @method vec_cast.hms integer #' @export vec_cast.hms.integer <- function(x, to, ...) new_hms(as.numeric(x)) #' @method vec_cast.integer hms #' @export vec_cast.integer.hms <- function(x, to, ...) as.integer(vec_data(x)) #' @method vec_cast.hms character #' @export vec_cast.hms.character <- function(x, to, ...) { ret <- parse_hms(x) lossy <- is.na(ret) & !is.na(x) warn_lossy_cast(x, to, ..., lossy = lossy) ret } #' @method vec_cast.character hms #' @export vec_cast.character.hms <- function(x, to, ...) format_hms(x) # Requires vctrs > 0.1.0 vec_default_cast <- NULL utils::globalVariables("vec_unspecified_cast") vec_default_cast_old <- function(x, to, ...) { if (is.logical(x)) { vec_unspecified_cast(x, to, ...) } else { stop_incompatible_cast(x, to, ...) } } warn_lossy_cast <- function(x, to, ..., lossy) { problems <- which(lossy) if (is_empty(problems)) return() warn( paste0("Lossy cast from to at position(s) ", commas(problems)), .subclass = "hms_lossy_cast" ) } commas <- function(problems) { MAX_BULLETS <- 6L if (length(problems) >= MAX_BULLETS) { n_more <- length(problems) - MAX_BULLETS + 1L problems[[MAX_BULLETS]] <- paste0(pre_dots("(and "), n_more, " more)") length(problems) <- MAX_BULLETS } paste0(problems, collapse = ", ") } pre_dots <- function(x) { if (length(x) > 0) { paste0("... ", x) } else { character() } } hms/R/hms.R0000644000176200001440000001454113602662745012174 0ustar liggesusers#' @details #' \Sexpr[results=rd, stage=render]{hms:::lifecycle("stable")} #' @import vctrs #' @import rlang #' @aliases hms-package NULL "_PACKAGE" #' @importFrom methods setOldClass setOldClass(c("hms", "difftime")) #' A simple class for storing time-of-day values #' #' The values are stored as a [difftime] vector with a custom class, #' and always with "seconds" as unit for robust coercion to numeric. #' Supports construction from time values, coercion to and from #' various data types, and formatting. Can be used as a regular column in a #' data frame. #' #' @name hms #' @examples #' hms(56, 34, 12) #' hms() #' #' new_hms(as.numeric(1:3)) #' # Supports numeric only! #' try(new_hms(1:3)) #' #' as_hms(1) #' as_hms("12:34:56") #' as_hms(Sys.time()) #' as.POSIXct(hms(1)) #' data.frame(a = hms(1)) #' d <- data.frame(hours = 1:3) #' d$hours <- hms(hours = d$hours) #' d NULL # Construction ------------------------------------------------------------ #' hms() #' #' `hms()` is a high-level constructor that accepts second, minute, hour and day components #' as numeric vectors. #' #' @rdname hms #' @details For `hms`, all arguments must have the same length or be #' `NULL`. Odd combinations (e.g., passing only `seconds` and #' `hours` but not `minutes`) are rejected. #' @param seconds,minutes,hours,days Time since midnight. No bounds checking is #' performed. #' @export hms <- function(seconds = NULL, minutes = NULL, hours = NULL, days = NULL) { args <- list(seconds = seconds, minutes = minutes, hours = hours, days = days) check_args(args) arg_secs <- map2(args, c(1, 60, 3600, 86400), `*`) secs <- reduce(arg_secs[!map_lgl(args, is.null)], `+`) if (is.null(secs)) secs <- numeric() new_hms(as.numeric(secs)) } #' new_hms() #' #' `new_hms()` is a low-level constructor that only checks that its input has the correct base type, [numeric]. #' #' @rdname hms #' @export new_hms <- function(x = numeric()) { vec_assert(x, numeric()) out <- new_duration(x, units = "secs") # no class argument? class(out) <- c("hms", class(out)) out } #' is_hms() #' #' `is_hms()` checks if an object is of class `hms`. #' #' @rdname hms #' @export is_hms <- function(x) inherits(x, "hms") #' Deprecated functions #' #' @name Deprecated NULL #' Deprecated is.hms() #' #' `is.hms()` has been replaced by [is_hms()]. #' #' @inheritParams is_hms #' @rdname Deprecated #' @export #' @keywords internal is.hms <- function(x) { signal_soft_deprecated("is.hms() is deprecated, please use is_hms().") is_hms(x) } #' @export vec_ptype_abbr.hms <- function(x) { "time" } #' @export vec_ptype_full.hms <- function(x) { "time" } # Coercion in ------------------------------------------------------------- #' as_hms() #' #' `as_hms()` forwards to [vec_cast()]. #' #' For arguments of type [POSIXct] and [POSIXlt], `as_hms()` does not perform timezone #' conversion. #' Use [lubridate::with_tz()] and [lubridate::force_tz()] as necessary. #' #' @rdname hms #' @param x An object. #' @export as_hms <- function(x) { vec_cast(x, new_hms()) } #' Deprecated as.hms() #' #' `as.hms()` has been replaced by [as_hms()], which is no longer generic and also #' does not have a `tz` argument. #' It also uses the time zone of the argument for conversion, #' not the current system's timezone. #' Change the timezone before converting if necessary, e.g. using [lubridate::with_tz()]. #' #' @inheritParams as_hms #' @param ... Arguments passed on to further methods. #' @rdname Deprecated #' @export #' @keywords internal as.hms <- function(x, ...) { signal_soft_deprecated("as.hms() is deprecated, please use as_hms().") UseMethod("as.hms", x) } #' @rdname Deprecated #' @export as.hms.default <- function(x, ...) { as_hms(x) } #' @rdname Deprecated #' @param tz The time zone in which to interpret a POSIXt time for extracting #' the time of day. The default is now the zone of `x` but was `"UTC"` #' for v0.3 and earlier. The previous behavior can be restored by calling #' `pkgconfig::set_config("hms::default_tz", "UTC")`, see #' [pkgconfig::set_config()]. #' @export #' @importFrom pkgconfig get_config as.hms.POSIXt <- function(x, tz = pkgconfig::get_config("hms::default_tz", ""), ...) { time <- as.POSIXlt(x, tz = tz) vec_cast(time, new_hms()) } #' @rdname Deprecated #' @export as.hms.POSIXlt <- function(x, tz = pkgconfig::get_config("hms::default_tz", ""), ...) { # We need to roundtrip via as.POSIXct() to respect the time zone time <- as.POSIXlt(as.POSIXct(x), tz = tz) vec_cast(time, new_hms()) } # Coercion out ------------------------------------------------------------ #' @rdname hms #' @inheritParams base::as.data.frame #' @export as.POSIXct.hms <- function(x, ...) { vec_cast(x, new_datetime()) } #' @rdname hms #' @export as.POSIXlt.hms <- function(x, ...) { vec_cast(x, as.POSIXlt(new_datetime())) } #' @rdname hms #' @export as.character.hms <- function(x, ...) { vec_cast(x, character()) } format_hms <- function(x) { xx <- decompose(x) ifelse(is.na(x), NA_character_, paste0( ifelse(xx$sign, "-", ""), format_hours(xx$hours), ":", format_two_digits(xx$minute_of_hour), ":", format_two_digits(xx$second_of_minute), format_tics(xx$tics))) } # Subsetting -------------------------------------------------------------- #' @export `[[.hms` <- function(x, ...) { vec_restore(NextMethod(), x) } #' @export `[<-.hms` <- function(x, i, value) { if (missing(i)) { i <- TRUE } x <- vec_data(x) # Workaround for Ops.difftime() implementation for unary minus if (identical(class(value), "numeric")) { attr(value, "units") <- NULL } value <- vec_cast(value, new_hms()) x[i] <- vec_data(value) new_hms(x) } # Combination ------------------------------------------------------------- #' @export c.hms <- function(x, ...) { # Needed to override c.difftime() vec_c(x, ...) } # Updating ---------------------------------------------------------------- #' @export `units<-.hms` <- function(x, value) { if (!identical(value, "secs")) { warning("hms always uses seconds as unit.", call. = FALSE) } x } # Output ------------------------------------------------------------------ #' @rdname hms #' @export format.hms <- function(x, ...) { if (length(x) == 0L) { "hms()" } else { format(as.character(x), justify = "right") } } #' @rdname hms #' @export print.hms <- function(x, ...) { cat(format(x), sep = "\n") invisible(x) } hms/R/coerce.R0000644000176200001440000000345213605127176012641 0ustar liggesusers#' Coercion #' #' Double dispatch methods to support [vctrs::vec_ptype2()]. #' #' @inheritParams vctrs::vec_ptype2 #' #' @method vec_ptype2 hms #' @export #' @export vec_ptype2.hms vec_ptype2.hms <- function(x, y, ..., x_arg = "", y_arg = "") UseMethod("vec_ptype2.hms", y) #' @method vec_ptype2.hms default #' @export vec_ptype2.hms.default <- function(x, y, ..., x_arg = "", y_arg = "") { vec_default_ptype2(x, y, x_arg = x_arg, y_arg = y_arg) } #' @method vec_ptype2.hms hms #' @export vec_ptype2.hms.hms <- function(x, y, ...) hms::hms() #' @method vec_ptype2.difftime hms #' @export vec_ptype2.difftime.hms <- function(x, y, ...) new_hms() #' @method vec_ptype2.hms difftime #' @export vec_ptype2.hms.difftime <- function(x, y, ...) new_hms() #' @method vec_ptype2.double hms #' @export vec_ptype2.double.hms <- function(x, y, ...) { warn_deprecated("Coercion of to %s lifecycle}", url, file.path("figures", file), stage_alt ) , `soft-deprecated` = , deprecated = , defunct = sprintf( "\\figure{%s}{options: alt='%s lifecycle'}", file, stage_alt ), rlang::abort(sprintf("Unknown lifecycle stage `%s`", stage)) ) } upcase1 <- function(x) { substr(x, 1, 1) <- toupper(substr(x, 1, 1)) x } # nocov end hms/R/compat-purrr.R0000644000176200001440000000723413505755442014040 0ustar liggesusers# nocov start - compat-purrr (last updated: rlang 0.1.9000) # This file serves as a reference for compatibility functions for # purrr. They are not drop-in replacements but allow a similar style # of programming. This is useful in cases where purrr is too heavy a # package to depend on. Please find the most recent version in rlang's # repository. map <- function(.x, .f, ...) { lapply(.x, .f, ...) } map_mold <- function(.x, .f, .mold, ...) { out <- vapply(.x, .f, .mold, ..., USE.NAMES = FALSE) names(out) <- names(.x) out } map_lgl <- function(.x, .f, ...) { map_mold(.x, .f, logical(1), ...) } map_int <- function(.x, .f, ...) { map_mold(.x, .f, integer(1), ...) } map_dbl <- function(.x, .f, ...) { map_mold(.x, .f, double(1), ...) } map_chr <- function(.x, .f, ...) { map_mold(.x, .f, character(1), ...) } map_cpl <- function(.x, .f, ...) { map_mold(.x, .f, complex(1), ...) } pluck <- function(.x, .f) { map(.x, `[[`, .f) } pluck_lgl <- function(.x, .f) { map_lgl(.x, `[[`, .f) } pluck_int <- function(.x, .f) { map_int(.x, `[[`, .f) } pluck_dbl <- function(.x, .f) { map_dbl(.x, `[[`, .f) } pluck_chr <- function(.x, .f) { map_chr(.x, `[[`, .f) } pluck_cpl <- function(.x, .f) { map_cpl(.x, `[[`, .f) } map2 <- function(.x, .y, .f, ...) { Map(.f, .x, .y, ...) } map2_lgl <- function(.x, .y, .f, ...) { as.vector(map2(.x, .y, .f, ...), "logical") } map2_int <- function(.x, .y, .f, ...) { as.vector(map2(.x, .y, .f, ...), "integer") } map2_dbl <- function(.x, .y, .f, ...) { as.vector(map2(.x, .y, .f, ...), "double") } map2_chr <- function(.x, .y, .f, ...) { as.vector(map2(.x, .y, .f, ...), "character") } map2_cpl <- function(.x, .y, .f, ...) { as.vector(map2(.x, .y, .f, ...), "complex") } args_recycle <- function(args) { lengths <- map_int(args, length) n <- max(lengths) stopifnot(all(lengths == 1L | lengths == n)) to_recycle <- lengths == 1L args[to_recycle] <- map(args[to_recycle], function(x) rep.int(x, n)) args } pmap <- function(.l, .f, ...) { args <- args_recycle(.l) do.call("mapply", c( FUN = list(quote(.f)), args, MoreArgs = quote(list(...)), SIMPLIFY = FALSE, USE.NAMES = FALSE )) } probe <- function(.x, .p, ...) { if (is_logical(.p)) { stopifnot(length(.p) == length(.x)) .p } else { map_lgl(.x, .p, ...) } } keep <- function(.x, .f, ...) { .x[probe(.x, .f, ...)] } discard <- function(.x, .p, ...) { sel <- probe(.x, .p, ...) .x[is.na(sel) | !sel] } map_if <- function(.x, .p, .f, ...) { matches <- probe(.x, .p) .x[matches] <- map(.x[matches], .f, ...) .x } compact <- function(.x) { Filter(length, .x) } transpose <- function(.l) { inner_names <- names(.l[[1]]) if (is.null(inner_names)) { fields <- seq_along(.l[[1]]) } else { fields <- set_names(inner_names) } map(fields, function(i) { map(.l, .subset2, i) }) } every <- function(.x, .p, ...) { for (i in seq_along(.x)) { if (!rlang::is_true(.p(.x[[i]], ...))) return(FALSE) } TRUE } some <- function(.x, .p, ...) { for (i in seq_along(.x)) { if (rlang::is_true(.p(.x[[i]], ...))) return(TRUE) } FALSE } negate <- function(.p) { function(...) !.p(...) } reduce <- function(.x, .f, ..., .init) { f <- function(x, y) .f(x, y, ...) Reduce(f, .x, init = .init) } reduce_right <- function(.x, .f, ..., .init) { f <- function(x, y) .f(y, x, ...) Reduce(f, .x, init = .init, right = TRUE) } accumulate <- function(.x, .f, ..., .init) { f <- function(x, y) .f(x, y, ...) Reduce(f, .x, init = .init, accumulate = TRUE) } accumulate_right <- function(.x, .f, ..., .init) { f <- function(x, y) .f(y, x, ...) Reduce(f, .x, init = .init, right = TRUE, accumulate = TRUE) } # nocov end hms/R/format.R0000644000176200001440000000070713505755442012673 0ustar liggesusersformat_hours <- function(x) { format(format_two_digits(x), justify = "right") } format_two_digits <- function(x) { formatC(x, format = "f", digits = 0, width = 2, flag = "0") } format_tics <- function(x) { x <- x / TICS_PER_SECOND out <- format(x, scientific = FALSE, digits = SPLIT_SECOND_DIGITS + 1L) digits <- max(min(max(nchar(out) - 2), SPLIT_SECOND_DIGITS), 0) out <- formatC(x, format = "f", digits = digits) gsub("^0", "", out) } hms/NEWS.md0000644000176200001440000001051713605127542012150 0ustar liggesusers# hms 0.5.3 - Use `vec_default_ptype2()`, remove `vec_ptype2.hms.unspecified()` (#80, @romainfrancois). - `vec_ptype2.hms.default()` forwards to `vec_default_ptype2()` for compatibility with vctrs 0.2.1. - Remove `as.data.frame.hms()`, handeld by vctrs. # hms 0.5.2.9000 - Internal changes only. # hms 0.5.2 - Work around parsing error that occurs on DST changeover dates (https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16764). # hms 0.5.1 - Lossy casts from `character` vectors to `hms` now also trigger a warning if the cast succeeds in the first element of the vector but fails for other elements. # hms 0.5.0 ## Breaking changes - Now based on vctrs >= 0.2.0 (#61). This adds support for `vec_cast()` and `vec_ptype2()`. Some operations (such as subset assignment) are now stricter. The `new_hms()` constructor permits safe construction of `hms` objects from a numeric vector. - The new `is_hms()` deprecates the existing `is.hms()`. `as.hms()` is deprecated in favor of `vec_cast()` or the new `as_hms()` (which is just a thin wrapper around `vec_cast()`). ## Printing - Always show seconds in a pillar if they are different from zero (#54). - Values with nonzero hours, seconds and split-seconds are now displayed correctly in tibbles (#56), even with a very small distance to the full second (#64). ## Internal - Don't test colored output on CRAN. - Correct reference link on r4ds (#58, @evanhaldane). # hms 0.4.2 - Adapted tests to pillar 1.2.1. # hms 0.4.1 - Preserve `NA` when converting to `character` (#51, @jeroen). - Adapted tests to pillar 1.1.0. # hms 0.4.0 ## Breaking changes - `as.hms.POSIXt()` now defaults to the current time zone, the previous default was `"UTC"` and can be restored by calling `pkgconfig::set_config("hms::default_tz", "UTC")`. ## New features - Pillar support, will display `hms` columns in tibbles in color on terminals that support it (#43). - New `round_hms()` and `trunc_hms()` for rounding or truncating to a given multiple of seconds (#31). - New `parse_hms()` and `parse_hm()` to parse strings in "HH:MM:SS" and "HH:MM" formats (#30). - `as.hms.POSIXt()` gains `tz` argument, default `"UTC"` (#28). - `as.hms.character()` and `parse_hms()` accept fractional seconds (#33). ## Bug fixes - `hms()` now works correctly if all four components (days, hours, minutes, seconds) are passed (#49). - `hms()` creates a zero-length object of class `hms` that prints as `"hms()"`. - `hms(integer())` and `as.hms(integer())` both work and are identical to `hms()`. - Values with durations of over 10000 hours are now printed correctly (#48). - `c()` now returns a hms (#41, @qgeissmann). ## Documentation and error messages - Fix and enhance examples in `?hms`. - Documentation is in Markdown format now. - Improved error message if calling `hms()` with a character argument (#29). # hms 0.3 - Fix `lubridate` test for compatibility with 1.6.0 (#23, @vspinu). - NA values are formatted as `NA` (#22). # hms 0.2 Minor fixes and improvements. - Subsetting keeps `hms` class (#16). - `format.hms()` right-justifies the output by padding with spaces from the left, `as.character.hms()` remains unchanged. - Times larger than 24 hours or with split seconds are now formatted correctly (#12, #13). - Sub-second part is printed with up to six digits, for even smaller values trailing zeros are shown (#17). # hms 0.1 First CRAN release. - Values are stored as a numeric vector that contains the number of seconds since midnight. - Inherits from `difftime` class. - Updating units is a no-op, anything different from `"secs"` issues a warning. - Supports construction from time values, coercion to and from various data types, and formatting. - Conversion from numeric treats input as seconds. - Negative times are formatted with a leading `-`. - Can be used as a regular column in a data frame. - Full test coverage. - Test for arithmetic with `Date`, `POSIXt` and `hms` classes. - Test basic compatibility with `lubridate` package (#5). - Interface: - `hms()` (with rigorous argument checks) - `as.hms()` for `character`, `numeric`, `POSIXct` and `POSIXlt` - `as.xxx.hms()` for `character`, `numeric` (implicitly), `POSIXct` and `POSIXlt` - `is.hms()` - `as.data.frame.hms()` (forwards to `as.data.frame.difftime()`) - `format.hms()` - `print.hms()` (returns unchanged input invisibly) hms/MD50000644000176200001440000000570513605457502011367 0ustar liggesuserse9839c315f54565ca3d68a53f0f32d12 *DESCRIPTION dab152885bb6ed8fdd5205a368a22d9e *NAMESPACE 83168283ce3decf04a717652f38af67e *NEWS.md 1fee82e810be4583b57360d2f66e1ee3 *R/args.R 35756eeba709476e300eaecf69e6b3cb *R/arith.R 8d8e3d9c28dd82bd911b7039d695e188 *R/cast.R e79f8cbc72b692f5fcc7958d5592412f *R/coerce.R 3b06ee41c6c8619e98933c040bf2236a *R/compat-lifecycle.R feaa904f11d6970ddbc1057a30cf6610 *R/compat-purrr.R 364d7cd8c0547a6e667966d1e1d950e7 *R/format.R a21fda1ed00f275348cfc5e159fb5588 *R/hms.R d336dd6270984e6550cb9330d1ec0d66 *R/parse.R 908ff8ac532c2bd7e0e9dfa94ee27f19 *R/pillar.R ae853ded1ceb802b1a39590184131feb *R/round.R eb3cb013a475f35265e3e2ce3ad2412e *R/zzz.R f3621b24597cfef0be046d3f45abccc2 *README.md da14b7e7448e046cc10b13c3b9a7d607 *build/hms.pdf ad93882238336d8021ef08cc74511003 *man/Deprecated.Rd cb1e46f469cfbbbde29c8b5113e1d789 *man/figures/lifecycle-archived.svg c0d2e5a54f1fa4ff02bf9533079dd1f7 *man/figures/lifecycle-defunct.svg a1b8c987c676c16af790f563f96cbb1f *man/figures/lifecycle-deprecated.svg c3978703d8f40f2679795335715e98f4 *man/figures/lifecycle-experimental.svg 952b59dc07b171b97d5d982924244f61 *man/figures/lifecycle-maturing.svg 27b879bf3677ea76e3991d56ab324081 *man/figures/lifecycle-questioning.svg 6902bbfaf963fbc4ed98b86bda80caa2 *man/figures/lifecycle-soft-deprecated.svg 53b3f893324260b737b3c46ed2a0e643 *man/figures/lifecycle-stable.svg 3d561da75ad64e93abc817f5be07e6cf *man/figures/logo.png 4fc2f7c8b3fc1fa4e4b6f6d952a54f19 *man/hms-package.Rd 1b888570c416a466863670acb302df83 *man/hms.Rd b55df4864cedf621d12c2dca628477a1 *man/parse_hms.Rd 3c3fababc7a5c4d5f3edfda20b30dc86 *man/round_hms.Rd daad84ced7ec697ddc19f4fefb41948b *man/vec_cast.hms.Rd 8c5414de99e4108adfedd8dfe1294f36 *man/vec_ptype2.hms.Rd 929afdb21c50685048246bdc5d82207d *tests/testthat.R 08300697749ea9be5f1722184785fa81 *tests/testthat/helper-compare.R 7b33607f30e961b5c874aaa9aca1abf0 *tests/testthat/helper-pillar.R b5d3c66107686b530cdfbae32d183527 *tests/testthat/out/hm.txt 9089c40f8338c3202071dc63a21a71ec *tests/testthat/out/hms.txt 866bfb0ef2593bd150185fa96899c0bc *tests/testthat/out/hmss.txt 9b049343c63828611f4a30ac73b8ed3a *tests/testthat/out/ms.txt 79f8df17ab9a4bf2b96a045db424c6e2 *tests/testthat/out/mss.txt fc1d6f4b9fe95e8fc3954fafe830b557 *tests/testthat/test-arith.R d1ed4120ab47337e143272d6737522a5 *tests/testthat/test-coercion-deprecated.R f446016b8c1b989cf86617b22c10f880 *tests/testthat/test-coercion.R f97049d2605dccc8142287d89edd9c10 *tests/testthat/test-colformat.R 33b8509a1a7047b2f330bbfb22e198fd *tests/testthat/test-combine.R bc889834f953020450636d97c3fcac90 *tests/testthat/test-construct.R 8a0858c5e546d54f7719e77a7940b62a *tests/testthat/test-lubridate.R 76b9115bca52bfb9b00b9e050e3eae84 *tests/testthat/test-output.R 48f6889a8ecfe891e83541e7ea5037ab *tests/testthat/test-parse.R 4bda995ff8c8c296a352e64a52a7c8be *tests/testthat/test-round.R 3fcd4a1347b2ab449289b2d961f72c10 *tests/testthat/test-subset.R 36082171f366b616c4004a919542871c *tests/testthat/test-update.R