all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Eric S. Raymond" <esr@thyrsus.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: schwab@linux-m68k.org, emacs-devel@gnu.org
Subject: Re: Goals for repo conversion day
Date: Sat, 25 Jan 2014 16:01:32 -0500	[thread overview]
Message-ID: <20140125210132.GB13305@thyrsus.com> (raw)
In-Reply-To: <83ppngasor.fsf@gnu.org>

Eli Zaretskii <eliz@gnu.org>:
> > *I* object to this.  On the grounds that I've been through this dance
> > many times before, and know that such out-of-band representations
> > generally cost more hassle and deliver less than people expect when
> > they think them up.
> 
> With all due respect, this is not necessarily good enough.  You have
> come to the project offering help, but no one gave you the right to
> make unilateral decisions about these issues.  It won't be you who
> will need to use this data in the years to come.  And whatever the
> other projects which you converted in the past, I doubt that any of
> them had as long and complex history as Emacs.

Your doubt is justified.  None of my previous conversions have been 
quite this complex.  The only conversion I have heard of that might have
been hairier was that of Blender, which was done by other people 
using my tools.

But as the size and complexity of the repo goes up, so does the value
of in-band references actually working.  Emacs is an exceptionally *bad*
case for relying solely on an external reference map, not an exceptionally
good one.

> I'd appreciate if you posted the final list of the references, when
> you are finished with it, so we could have some QA.

Here is the current list. It is not final because I expect to resolve
at least a few more  of these, and it is still possible more fossil
references could turn up in odd places.

ChangeLog:
	revno 108687 -> 2012-06-22T21:17:42Z!eggert@cs.ucla.edu
	revno:105007 -> 2011-07-07T04:21:49Z!handa@m17n.org
	r112148 -> 2013-03-26T22:08:58Z!aidalgol@no8wireless.co.nz
	revno:108936 -> 2012-07-07T10:34:37Z!cyd@gnu.org
	revision 106831 -> 2012-01-10T08:27:22Z!cyd@gnu.org
	revision 1.59
	CVS-1.61
	1.61 in CVS
	revno:106608 -> 2011-12-04T17:13:01Z!lekktu@gmail.com
	revno 100789 -> 2010-07-12T05:26:57Z!handa@etlken
	rev. 110325 -> 2012-10-01T18:10:29Z!cyd@gnu.org
	r115470 -> 2013-12-11T19:01:44Z!tzz@lifelogs.com
	of 2012-12-20 (r111276) -> 2012-12-20T11:15:38Z!michael.albinus@gmx.de
	2013-12-11 (r115470) -> 2013-12-11T19:01:44Z!tzz@lifelogs.com
	revno:114543 -> 2013-10-07T01:28:34Z!sdl.web@gmail.com
	revno:113793 -> 2013-08-11T00:07:48Z!lekktu@gmail.com
	revno:113117 -> 2013-06-21T12:24:37Z!lekktu@gmail.com
	r114834 -> 2013-10-29T02:50:24Z!dancol@dancol.org
	revno:113431 -> 2013-07-16T11:41:06Z!jan.h.d@swipnet.se
	revno:113147 -> 2013-06-23T20:29:18Z!lekktu@gmail.com
	revno 101897 -> 2010-10-10T14:43:05Z!dann@ics.uci.edu
	revno 101876 -> 2010-10-09T18:31:12Z!rgm@gnu.org
	revno 100306 -> 2010-05-15T21:21:30Z!raeburn@raeburn.org
	revno 108687 -> 2012-06-22T21:17:42Z!eggert@cs.ucla.edu
	revision 114614 (commit of 2013-10-10) -> 2013-10-10T19:15:33Z!eggert@cs.ucla.edu
	revno:113431 -> 2013-07-16T11:41:06Z!jan.h.d@swipnet.se
	revno 101949 -> 2010-10-13T14:50:06Z!lekktu@gmail.com
	revno:103013 -> 2011-01-28T22:12:05Z!monnier@iro.umontreal.ca
	rev 102609 -> 2010-12-08T08:09:27Z!kfogel@red-bean.com
	revno 101688 -> 2010-09-30T02:53:26Z!lekktu@gmail.com
	revno 101459 -> 2010-09-17T13:30:30Z!monnier@iro.umontreal.ca
	revnos 101381 -> 2010-09-08T14:42:54Z!michael.albinus@gmx.de
	101422 -> 2010-09-13T15:17:01Z!michael.albinus@gmx.de
	rev 100010 -> 2010-04-23T16:26:11Z!monnier@iro.umontreal.ca
	revno:109911 -> 2012-09-07T04:15:56Z!dgutov@yandex.ru
	109621 -> 2012-08-15T03:33:55Z!monnier@iro.umontreal.ca
	revno:88805 -> 2008-06-21T01:38:39Z!monnier@iro.umontreal.ca
	revno:88864 -> 2008-06-22T13:57:28Z!monnier@iro.umontreal.ca
	revno:89810 -> 2008-07-31T05:33:56Z!dann@ics.uci.edu
	revision 106664 -> 2011-12-11T14:49:48Z!vincentb1@users.sourceforge.net
	revno:105285 -> 2011-07-19T15:01:49Z!larsi@gnus.org
	revno:104787 (2011-06-30) -> 2011-06-30T01:09:13Z!larsi@gnus.org
	revno:104988 (2011-07-06) -> 2011-07-06T15:49:19Z!larsi@gnus.org
	revno:101730 (2010-10-02) -> 2010-10-02T13:21:43Z!michael.albinus@gmx.de
	revno:103877 (2011-04-09) -> 2011-04-09T20:28:01Z!cyd@stupidchicken.com
	revno:99634.2.463 (2010-10-09) -> 2010-10-09T04:09:19Z!cyd@stupidchicken.com
	revno:101913 -> 2010-10-11T23:57:49Z!lekktu@gmail.com
	revno 95090 dated 2009-03-06 -> 2009-03-06T07:51:52Z!handa@m17n.org
	revno 101757 -> 2010-10-03T13:59:56Z!dann@ics.uci.edu
	revno 82799 (2007-11-30) -> 2007-11-30T13:57:21Z!jasonr@gnu.org
	2010-07-29 (revno 100939) -> 2010-07-29T16:49:59Z!jan.h.d@swipnet.se
	revno 100928 -> 2010-07-29T03:25:08Z!dann@ics.uci.edu
	revnos 100982 -> 2010-08-05T23:15:24Z!dann@ics.uci.edu
	100984 -> 2010-08-05T23:34:12Z!dann@ics.uci.edu
	revno 99854.1.6 -> 2010-04-17T12:33:05Z!eliz@gnu.org
	revno 99950 -> 2010-04-20T13:31:28Z!eliz@gnu.org
	revno:100708 -> 2010-07-04T07:50:25Z!dann@ics.uci.edu
	revno:110851 -> 2012-11-09T04:10:16Z!monnier@iro.umontreal.ca
	revision 1.1 -> the initial version
	cvs-1.12.1
	Revision 1.694 -> 2004-05-20T23:29:24Z!teirllm@auburn.edu
	revno 108687 -> 2012-06-22T21:17:42Z!eggert@cs.ucla.edu
	revno:108521 -> 2012-06-08T08:44:45Z!eliz@gnu.org
	revno:108341 -> 2012-05-22T16:20:27Z!eggert@cs.ucla.edu
	2011-08-30 (revision 105619) -> 2011-08-30T17:32:44Z!eliz@gnu.org
	2011-08-30 (revision 105619) -> 2011-08-30T17:32:44Z!eliz@gnu.org
	revision 84777 on 2008-02-22 -> 2008-02-22T17:42:09Z!monnier@iro.umontreal.ca
	revno:102982 (2011-01-26) -> 2011-01-26T20:02:07Z!monnier@iro.umontreal.ca
	revision 104625 -> 2011-06-18T18:49:19Z!cyd@stupidchicken.com
	revision 104134 -> 2011-05-06T07:13:19Z!eggert@cs.ucla.edu
	revno:20537 (1998-01-01) -> 1998-01-01T02:27:27Z!rms@gnu.org
	revno:87605 (2008-05-14) -> 2008-05-14T01:40:23Z!handa@m17n.org
	revno:50135 (2003-03-16) -> 2003-03-16T20:45:46Z!storm@cua.dk
	revno:87605 (2008-05-14) -> 2008-05-14T01:40:23Z!handa@m17n.org
	revno:34925 (2000-12-29) -> 2000-12-29T14:24:09Z!gerd@gnu.org
	revno:20537 (1998-01-01) -> 1998-01-01T02:27:27Z!rms@gnu.org
	revno:25013 (1999-07-21) -> 1999-07-21T21:43:52Z!gerd@gnu.org
	revno:43563.1.17 (2002-03-01) -> 2002-03-01T01:17:24Z!handa@m17n.org
	revno:84043 (2008-02-1) -> 2008-02-01T16:01:31Z!miles@gnu.org
	revno:25356 (1999-08-21) -> 1999-08-21T19:30:21Z!gerd@gnu.org
	revno:20870 (1998-02-08) -> 1998-02-08T21:33:56Z!rms@gnu.org
	revno:36704 (2001-03-09) -> 2001-03-09T18:41:50Z!gerd@gnu.org
	revno:32591 (2000-10-17) -> 2000-10-17T16:08:18Z!gerd@gnu.org
	revno:25013 (1999-07-21) -> 1999-07-21T21:43:52Z!gerd@gnu.org
	revno:43563.1.32 (2002-03-01) -> 2002-03-01T01:17:24Z!handa@m17n.org
	revno:14998 (1996-04-12) -> 1996-04-12T06:01:29Z!rms@gnu.org
	revno:86854 (2008-04-19) -> 2008-04-19T19:30:53Z!monnier@iro.umontreal.ca
	revno:20569 (1998-01-02) -> 1998-01-02T21:29:48Z!rms@gnu.org
	revno 103623 -> 2011-03-11T07:24:21Z!eggert@cs.ucla.edu
	revision 1.32 of saveplace.el -> saveplace.el at 2005-05-29T08:36:26Z!rms@gnu.org
	revision 1.30  of saveplace.el -> saveplace.el at 2005-04-10T23:32:00Z!rms@gnu.org
	version 1.100 -> 2007-12-06T19:56:41Z!deego@gnufans.org
	erc.el 1.39 -> 2007-12-01T03:41:01Z!rgm@gnu.org
	revision 1.104, made on 2000-05-21 -> 2000-05-21T17:04:47Z!fx@gnu.org
	2007-07-18 (revision 1.51)
	revision 1.90 (commitid mWoPbju3pgNotDps) -> 2007-07-13T18:16:17Z!kfogel@red-bean.com
	revision 1.117 -> 2008-10-29T17:42:49Z!cyd@stupidchicken.com
	1.85
	1.878
	1.113
	1.244
	1.34
	1.233
	rev 1.82 -> 1994-08-03T07:39:00Z!rms@gnu.org
	1.70 (Jan 5 changes) -> 1994-01-03T07:21:12Z!rms@gnu.org
	r99212 -> 2009-12-29T07:22:00Z!nickrob@snap.net.nz
	rev. 110325 -> 2012-10-01T18:10:29Z!cyd@gnu.org
	revno r112320 -> 2013-04-18T00:12:33Z!monnier@iro.umontreal.ca

Change comments:
	bzrs 111300 -> 2012-12-22T19:57:35Z!rgm@gnu.org
	111840 -> 2013-02-21T02:42:30Z!eggert@cs.ucla.edu
	revision 111647 -> 2013-02-01T07:23:18Z!dmantipov@yandex.ru
	revno:11026 -> 1995-03-15T21:55:37Z!kwzh@gnu.org
	revno:88864 -> 2008-06-22T13:57:28Z!monnier@iro.umontreal.ca
	revno:88805 -> 2008-06-21T01:38:39Z!monnier@iro.umontreal.ca
	revno:89810 -> 2008-07-31T05:33:56Z!dann@ics.uci.edu
	revision 10835 -> 1995-02-25T20:57:45Z!rms@gnu.org
	revision 106726 -> 2011-12-23T14:51:51Z!eliz@gnu.org
	revision 87208 -> 2008-05-02T07:12:59Z!esr@snark.thyrsus.com
	revision 84777 on 2008-02-22 -> 2008-02-22T17:42:09Z!monnier@iro.umontreal.ca
	revno:99634.2.463 (2010-10-09) -> 2010-10-09T04:09:19Z!cyd@stupidchicken.com
	revno:101913 (2010-10-12). -> 2010-10-11T23:57:49Z!lekktu@gmail.com
	revno:20537 (1998-01-01) -> 1998-01-01T02:27:27Z!rms@gnu.org
	revno:87605 (2008-05-14) -> 2008-05-14T01:40:23Z!handa@m17n.org
	revno:87605 (2008-05-14) -> 2008-05-14T01:40:23Z!handa@m17n.org
	revno:34925 (2000-12-29) -> 2000-12-29T14:24:09Z!gerd@gnu.org
	revno:20537 (1998-01-01) -> 1998-01-01T02:27:27Z!rms@gnu.org
	revno:25013 (1999-07-21) -> 1999-07-21T21:43:52Z!gerd@gnu.org
	revno:43563.1.16 (2002-03-01) -> 2002-03-01T01:16:34Z!handa@m17n.org
	revno:84043 (2008-02-1) -> 2008-02-01T16:01:31Z!miles@gnu.org
	revno:20870 (1998-02-08) -> 1998-02-08T21:33:56Z!rms@gnu.org
	revno:36704 (2001-03-09) -> 2001-03-09T18:41:50Z!gerd@gnu.org
	revno:32591 (2000-10-17) -> 2000-10-17T16:08:18Z!gerd@gnu.org
	revno:25356 (1999-08-21) -> 1999-08-21T19:30:21Z!gerd@gnu.org
	revno:14998 (1996-04-12) -> 1996-04-12T06:01:29Z!rms@gnu.org
	revno:86854 (2008-04-19) -> 2008-04-19T19:30:53Z!monnier@iro.umontreal.ca
	revno:20569 (1998-01-02) -> 1998-01-02T21:29:48Z!rms@gnu.org
	r100577 -> 2010-06-10T12:56:11Z!michael.albinus@gmx.de
	CVS rev 1.49, 2001-09-12
	CVS rev 1.47, 2003/01/27
	CVS r1.35
	revno 95090 dated 2009-03-06 -> 2009-03-06T07:51:52Z!handa@m17n.org
	2005-02-15 (revno 60055) -> 2005-02-15T23:19:26Z!jasonr@gnu.org
	r111320 -> 2012-12-24T15:56:17Z!eliz@gnu.org
	revno 99854.1.6 -> 2010-04-17T12:33:05Z!eliz@gnu.org
	revno 99950 -> 2010-04-20T13:31:28Z!eliz@gnu.org
	revision 99649 -> 2010-03-12T16:34:27Z!eliz@gnu.org
	rev 99649 -> 2010-03-12T16:34:27Z!eliz@gnu.org
	rev 99553 -> 2010-02-24T22:07:26Z!bob@gnu.org
	revno 99212 -> 2009-12-29T07:22:00Z!nickrob@snap.net.nz
	revision 94343 -> 2009-01-30T13:06:07Z!lekktu@gmail.com
	revision 1.32 -> 2005-05-29T08:36:26Z!rms@gnu.org
	revision 1.30 -> 2005-04-10T23:32:00Z!rms@gnu.org
	version 1.100 -> 2007-12-06T19:56:41Z!deego@gnufans.org
	r1.135 -> 2009-10-10T21:48:22Z!kfogel@red-bean.com
	rev 1.114
	1.878
	revision 1.117 -> 2008-10-29T17:42:49Z!cyd@stupidchicken.com
	rev 1.14395
	revision 1.56
	3.85
	1.17
	revision 1.69
	revision 1.1 -> initial revision
	rev 1.5
	revisions 1.40
	1.41
	1.39-> 2007-12-01T03:41:01Z!rgm@gnu.org
	revision 1.104
	revision 1.51
	revision 1.90 (commitid mWoPbju3pgNotDps) -> 2007-07-13T18:16:17Z!kfogel@red-bean.com
	revision 1.1509
	revision 7.8
	CVS v1.12.8 and 1.12.9
	cvs-1.12.1
	1.103
	HEAD (1.72)
	v1.275
	1.58
	v1.5046
	v1.5039
	rev 1.82 -> 1994-08-03T07:39:00Z!rms@gnu.org
	rev. 1.761
	revision 1.3831
	1.3832
	revision 1.12
	revision 1.13
	revision 1.14
	revision 1.15

The ChangeLog references are not attributed to individual files
because they moved as the files rotated.

Some of the remaining CVS references cannot be reseolved within the Emacs
history; they actually point to other projects.  One particularly fertile
source of these, which I think accounts for this group

	1.85
	1.878
	1.113
	1.244
	1.34
	1.233

in ChangeLogs, is the CVS history of the erc files before they were merged
into Emacs.

> The problem is not the size of the repository alone.  The problem is
> that different portions of a single changeset were committed many
> revisions apart.  And I don't even understand (and you didn't explain)
> how will you handle the situation I described above, where a single
> commit checked in ChangeLog changes for several unrelated commits in
> the same directory.  Which commit clique will you assign the ChangeLog
> commit to?  The devil is in the details, but you haven't provided any
> details about your plans in this matter.  Would you please do that?

I see we are using the term "changeset" slightly differently, and this has
produced some confusion.

The uncoalesced changesets I am looking for are not defined by "all
share the same ChangeLog entry" (though usually that is the case).
You are quite right that attempting to coalesce all of those would
produce perverse results in cases of several unrelated commits.

Fortunately, most of the unresolved cliques are not like this.  The
usual case, in this conversion as in others I've seen (such as groff)
is that an unresolved clique consists of one or several closely
related changes and one ChangeLog modification, without intervening
commits by others.  This is what I think of as a changeset.

Normally tools such as parsecvs collect these into single changesets.  
But these converters have a maximum coalescence window.  If such a span
of commits took place over a longer period of time than the window, it
won't be coalesced. 

The problem is that the default time windows on these converters are
set small in order to avoid false-positive matches.  Experience has
taught me that this is a mostly imaginary problem; the window would
have been better set to infinity in almost every case I have seen.

The result of a too-small commit window is that some genuine changesets
(not the edge case you are pointing at) do not get coalesced. In your
edge case, the least bad thing to do is accept that the ChangeLog entry
must remain its own changeset; sometimes you can get partial 
coalescence in the file changes.

When there is CVS in the history, a standard part of my cleanup is
basically to run a coalescence pass with a very long window.
Semi-automating this operation, so it (a) doesn't have to be done
manually, but (b) is easily checked by skilled human judgment, was
one of the purposes for which I originally wrote reposurgeon.

Fortunately the bad cases aren't actually very common.

> > > > 5. Unconverted .bzrignores (and possibly .cvsignores) in the history.
> > > 
> > > Why is that a problem?
> > 
> > See "seamless history browsing".
> 
> Sorry, I don't understand.  Please elaborate: what is the relation
> between these ignore files and history browsing?

In a properly done conversion, file ignores don't abruptly stop working
bevcause you browsed back past the point of conversion and what should
be .gitignore files are nmow .bzrignores or .cvsignores.

> > The way this is working is that I am building a reposurgeon script that
> > expresses a sequence of edits to Andreas's mirror. On conversion day 
> > we will apply that script once, after which everyone can re-clone and
> > go on as before.
> 
> Sorry, I don't see how this changes anything.  You are still going to
> make deep changes to the existing mirror.

Yes, for arguable values of "deep". As Paul Eggert (I think) said, I'm
after a result that is stainless steel rather than earthenware. With
ugly cracks in it.

> > > Noble goals all of them, but I'm skeptical as to whether they can be
> > > achieved in practice.  What's worse, we won't know whether some issues
> > > remained until much later.
> > 
> > I know they can be achieved in practice because I have achieved them before,
> > many times.  Most recently in the conversion of the groff history, but
> > you could check with the maintainers of NUT or Hercules or robotfindskitten
> > or Roundup as well. Or the Blender Foundation - blender is a big reposurgeon
> > conversion done by someone else.
> 
> Sorry, been there done that.  The CVS to bzr conversion also seemed
> flawless until much later.

There are several differences this time.  One of the most important is that
the state of the art has advanced.  My tools do things that would have been
impossible or impractical before they existed.  I have auditing capabilities
you would probably have to work a bit to even imagine.

As a relatively trivial example - if Stefan or some other person with
policy authority makes the call, I could reliably split elpa out into
its own repo with one short command in the reposurgeon DSL.
 
> > If we find any problems afterwards, I have the tools to fix them. Part of
> > my commitment is to do that.
> 
> I don't think any of us can in good faith give such promises.

The span of my contributions to Emacs is measures in decades.  I do not 
think you need to fear that I will vanish before this job is done.
-- 
		<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>



  reply	other threads:[~2014-01-25 21:01 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-24 16:29 The git mirror is *very* badly screwed up Eric S. Raymond
2014-01-24 16:42 ` Andreas Schwab
2014-01-24 17:07   ` Eric S. Raymond
2014-01-24 17:22     ` Andreas Schwab
2014-01-24 18:54       ` Eric S. Raymond
2014-01-24 20:03         ` Eric S. Raymond
2014-01-24 21:06         ` Andreas Schwab
2014-01-24 21:27         ` Eli Zaretskii
2014-01-25  6:25           ` Eric S. Raymond
2014-01-25  7:44             ` Eli Zaretskii
2014-01-25 14:06               ` Goals for repo conversion day Eric S. Raymond
2014-01-25 14:42                 ` Eli Zaretskii
2014-01-25 14:46                   ` Eli Zaretskii
2014-01-25 16:01                   ` Eric S. Raymond
2014-01-25 16:15                     ` Paul Eggert
2014-01-25 17:15                     ` Eli Zaretskii
2014-01-25 21:01                       ` Eric S. Raymond [this message]
2014-01-26 17:32                         ` Eli Zaretskii
2014-01-27  0:33                           ` Eric S. Raymond
2014-01-27  5:16                             ` Werner LEMBERG
2014-01-27 16:31                               ` Eli Zaretskii
2014-01-27 17:42                                 ` Werner LEMBERG
2014-01-27 17:54                                   ` Eli Zaretskii
2014-01-27 10:04                             ` Andreas Schwab
2014-01-27 13:22                               ` Eric S. Raymond
2014-01-28  8:14                                 ` Ulrich Mueller
2014-01-28  8:58                                   ` Andreas Schwab
2014-01-28  9:07                                     ` David Kastrup
2014-01-28 15:40                                     ` What to do about the attic files Eric S. Raymond
2014-01-27 16:25                             ` Goals for repo conversion day Eli Zaretskii
2014-01-27 16:28                             ` Bzr's "confusion" between branches and repositories Eli Zaretskii
2014-01-27 16:47                               ` Andreas Schwab
2014-01-27 16:53                                 ` Eli Zaretskii
2014-01-27 17:15                                   ` Eli Zaretskii
2014-01-25 19:32                   ` Goals for repo conversion day Glenn Morris
2014-01-25 16:09                 ` Andreas Schwab
2014-01-25 17:01                 ` Thien-Thi Nguyen
2014-01-25 19:54                   ` Eric S. Raymond
2014-01-25 22:08                     ` Thien-Thi Nguyen
2014-01-26  3:24                       ` Eric S. Raymond
2014-01-25 21:57             ` The git mirror is *very* badly screwed up Stefan Monnier
2014-01-25 23:27               ` Eric S. Raymond

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140125210132.GB13305@thyrsus.com \
    --to=esr@thyrsus.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=schwab@linux-m68k.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.