== Dev Week -- Packaging 101 - Daniel Holbach -- Mon, Jan 19 == UTC-4(EST) {{{ (01:02:50 PM) dholbach: Ok my friends, let's keep questions in #ubuntu-classroom-chat and please: ask :-) (01:03:23 PM) dholbach: So this is "Packaging 101" - I'm going to explain the bare-bone structure of a very simple package (01:03:51 PM) dholbach: a lot of the stuff I'm going to talk about is also in the Packaging Guide which is linked from https://wiki.ubuntu.com/MOTU/GettingStarted (01:04:08 PM) dholbach: so go and bookmark that page, it has all the important information, including some videos about packaging (01:04:36 PM) dholbach: first please all take a look at /etc/apt/sources.list (01:04:49 PM) dholbach: and see if you have something in there resembling (01:04:52 PM) dholbach: deb-src http://archive.ubuntu.com/ubuntu/ intrepid restricted main multiverse universe (01:05:08 PM) dholbach: this will give apt information about source packages which is what we're going to need (01:05:28 PM) dholbach: if you don't have it, please add it (and replace 'intrepid' with whatever ubuntu release you're running) (01:05:29 PM) dholbach: and run (01:05:33 PM) dholbach: sudo apt-get update (01:05:37 PM) dholbach: afterwards (01:05:50 PM) dholbach: QUESTION: Questions may be put at any time or only later? (01:05:58 PM) dholbach: bullgard4: any place in /etc/apt/sources.list should fine (01:06:06 PM) Kelemen3 is now known as Kelemen (01:06:11 PM) dholbach: QUESTION: do I need to learn about man pages and icons and where things go on the file system before I can even think about making a package? (01:06:34 PM) dholbach: dlynch: we're not going to cover it in this session, but as all things in Ubuntu Development it's fine to learn them step by step (01:06:43 PM) dholbach: for the package we're discussing in a few secs, it's not that important (01:06:59 PM) dholbach: alright, now that apt knows about source packages, please run (01:07:02 PM) dholbach: apt-get source hello (01:07:12 PM) dholbach: for those of you who know 'hello', yes, it's boring (01:07:19 PM) Andphe: gksu gedit /etc/apt/sources.list (01:07:21 PM) dholbach: but it's to the point and that's what we like (01:07:27 PM) Andphe: sorry (01:07:30 PM) Andphe: :p (01:07:59 PM) dholbach: hello is a GNU project that shows how to use C, autotools, internationalisation to create an awesome tool which does nothing more than writing "Hello world!" on your screen (01:08:18 PM) dholbach: the hello source package contains a similarly spartanic packaging :) (01:08:24 PM) dholbach: which is a good start (01:08:31 PM) dholbach: so what did 'apt-get source' do? (01:09:10 PM) dholbach: on my machine it downloaded hello_2.2-2.diff.gz hello_2.2-2.dsc and hello_2.2.orig.tar.gz (01:09:23 PM) dholbach: hello_2.2.orig.tar.gz is the unmodified tarball that was released on the GNU homepage (01:09:41 PM) dholbach: (it was merely renamed) (01:09:50 PM) dholbach: Check if the 'dpkg-dev' package is installed. (01:10:00 PM) dholbach: apw: you're right... sorry - you will need dpkg-dev (01:10:06 PM) dholbach: I thought james_w had covered that ;-) (01:10:23 PM) james_w: yeah, sorry, didn't get round to that stuff (01:10:28 PM) dholbach: haha (01:10:32 PM) james_w: there's a lot of Ubuntu development to talk about (01:10:39 PM) dholbach: you're right :) (01:10:41 PM) dholbach: nevermind guys :) (01:10:49 PM) dholbach: hello_2.2-2.diff.gz is the compressed patch that was introduced to make hello build the Ubuntu way (01:10:53 PM) dholbach: what does that mean? (01:11:33 PM) dholbach: Ubuntu and Debian have a build process that is actually a meta-build process, it's on top of the packages build infrastructure (be it autotools or a python distutils project, or just a few PHP scripts that are installed somewhere, etc.) (01:11:47 PM) dholbach: this is a great thing, as we just have one build process that is applied to all kinds of packages (01:12:03 PM) dholbach: this is the "packaging" :) (01:12:17 PM) dholbach: hello_2.2-2.dsc is a text file that contains meta data such as md5sums and so on (01:12:23 PM) dholbach: Question: looking into hello-2.2 directory, itsn't TOO many files for a "prints hello world" programm? (01:12:30 PM) dholbach: xnox: we'll get to the files in the directory in just a sec (01:12:37 PM) dholbach: QUESTION: in the terminal it says signature could not be verified because the public key was not found. how can i fix that? (01:12:43 PM) dholbach: co0lingFir3: you can safely ignore that warning (01:13:06 PM) dholbach: it just means that you don't have the public key of the last person who touched the package to verify it (01:13:17 PM) co0lingFir3: k (01:13:41 PM) dholbach: also I have a hello-2.2 directory that was generated this way: extract the .orig.tar.gz tarball, apply the compressed patch (the .diff.gz) (01:13:56 PM) dholbach: apt-get source will get you every source package that is available in the archive (01:14:16 PM) dholbach: alright, let's crack on (01:14:19 PM) hRedBeard1 is now known as hRedBeard-work (01:14:22 PM) dholbach: cd hello-2.2 (01:14:26 PM) dholbach: ls (01:14:41 PM) dholbach: you can see there's a debian/ directory - this comes from the .diff.gz (01:14:46 PM) dholbach: and that's where the packaging lives (01:15:12 PM) dholbach: if you look into the debian/ directory you can see just a few files (01:15:19 PM) dholbach: and now we're going through all of them one by one (01:15:29 PM) dholbach: any questions already? (01:16:15 PM) dholbach: alright (01:16:25 PM) admin is now known as Guest90417 (01:16:32 PM) dholbach: the first one debian/changelog is pretty straight-forward (01:17:00 PM) dholbach: it contains changelog entries for every revision of the package that was done in Debian / Ubuntu (01:17:24 PM) dholbach: especially in Ubuntu it's very important to document very carefully what you've changed (01:17:36 PM) dholbach: we have no 'maintainer concept' in Ubuntu, we all work on all packages as a team (01:18:00 PM) dholbach: so if you don't like your fellow developer to have to second-guess what "made shit work again" means, you better document it well :) (01:18:11 PM) dholbach: also if you look at the package half a year later you need to know what changed and why (01:18:27 PM) dholbach: also add information about bugs that were fixed, references to patches, discussion etc. (01:18:48 PM) dholbach: QUESTION: how can we tell if it is a debian or ubuntu change (01:18:48 PM) dholbach: QUESTION: revision of the package? not the revision of the binary? (01:18:48 PM) dholbach: QUESTION: in debian it is not? (01:19:01 PM) dholbach: apw, creek23, maix: we'll get to that exactly now :-) (01:19:17 PM) dholbach: QUESTION: Do you, Daniel, often consult the changelog in order to find the cause of a bug? (01:19:19 PM) dholbach: bullgard4: always (01:19:51 PM) dholbach: on my system the first line of debian/changelog says: (01:19:52 PM) dholbach: hello (2.2-2) unstable; urgency=low (01:19:58 PM) dholbach: let's go through them one by one (01:20:04 PM) dholbach: 'hello' is the name of the source package (01:20:11 PM) dholbach: typically just the name of the upstream project (01:20:29 PM) dholbach: (2.2-2) contains the version number of the source package (01:20:33 PM) dholbach: it comprises of two parts (01:20:45 PM) dholbach: "2.2" is the version number of the upstream release (01:20:52 PM) dholbach: remember "hello_2.2.orig.tar.gz"? (01:21:00 PM) dholbach: that was the version that was release on the GNU FTP server (01:21:23 PM) dholbach: -2 means "this is the second revision of hello 2.2 that was uploaded to Debian" (01:21:44 PM) dholbach: if we were to add an Ubuntu-only change to the package, it'd be 2.2-2ubuntu1 (01:21:52 PM) dholbach: so we just add a "ubuntu1" to the Debian revision (01:22:06 PM) dholbach: QUESTION: could you tell, please, a little bit more about X.Y-ZubuntuW package version naming? what stands Z and W for and how it calculates if i made some changes and gonna make new package? (01:22:12 PM) dholbach: Ok, let's talk about it a bit more (01:22:43 PM) dholbach: if we were to update hello to 2.3 without inheriting the version from Debian, we would call it 2.3-0ubuntu1 (01:23:21 PM) dholbach: QUESTION: what about when the upstream release contains a -, such as 1.0-beta2 or 3.0-rc3 (01:23:28 PM) dholbach: that's an interesting question (01:23:42 PM) dholbach: in the case of beta2 and rc3 we would change our tactics slightly (01:23:48 PM) dholbach: we'd use the ~ operator (01:23:52 PM) dholbach: ~? (01:24:06 PM) dholbach: it tells dpkg "this is smaller" (01:24:09 PM) dholbach: let me show you can example (01:24:48 PM) dholbach: daniel@miyazaki:~$ dpkg --compare-versions 1.0-1 gt 1.0~beta1-1 && echo TRUE (01:24:48 PM) dholbach: TRUE (01:24:48 PM) dholbach: daniel@miyazaki:~$ dpkg --compare-versions 1.0-1 gt 1.0beta1-1 && echo TRUE (01:24:48 PM) dholbach: daniel@miyazaki:~$ (01:25:03 PM) dholbach: dpkg is always authoritative (01:25:24 PM) dholbach: dpkg will not upgrade to a version of a package that is "smaller" than the current one (01:25:39 PM) dholbach: we introduce the "~" to artificially let dpkg know: this is smaller :) (01:25:54 PM) dholbach: QUESTION: what about after - for ubuntu-only packages (01:25:59 PM) dholbach: Arc: can you clarify? (01:26:39 PM) dholbach: dholbach: what do you put after the - for when there is no debian package version, when you're packaging directly for ubuntu (01:26:59 PM) dholbach: Arc: OK. let's say I package baconator 1.0 (01:27:15 PM) dholbach: I'd call the first version that ever hits Ubuntu baconator (1.0-0ubuntu1) (01:27:30 PM) dholbach: to indicate: we did not inherit any version from Debian (01:27:40 PM) dholbach: QUESTION: if a software uses the YMD versioning scheme, should the package follow it as foobar-2009.01.16-ubuntu.deb? (01:28:08 PM) dholbach: creek23: it'd probably be foobar_2009.01.16-0ubuntu1_i386.deb or some such (01:28:21 PM) dholbach: QUESTION: why would not our 2.3 copy be 2.3~ubuntu1 (01:28:45 PM) dholbach: apw: in the case of 2.3 (upstream, our first revision) it's not necessary to tell dpkg "this is actually smaller" (01:28:52 PM) dholbach: 2.3-0ubuntu1 works just fine (01:29:01 PM) dholbach: "~" is not used very very often (01:29:11 PM) dholbach: QUESTION: What if we checkout a program from svn that doesn't a numerical version just a svn version (ex. svn2558)? (01:29:35 PM) dholbach: so if this was 1.0 version of baconator plus some changes from SVN, I could make it (01:29:41 PM) dholbach: 1.0+svn2558-0ubuntu1 (01:29:52 PM) dholbach: alright, let's crack on :) (01:30:06 PM) dholbach: QUESTION: for the SVN checkout case, where do we get the .orig.tar.gz? (01:30:11 PM) dholbach: oliver_g_1: create it ourselves (01:30:31 PM) dholbach: projects that use autotools often have a make dist or some such (01:31:06 PM) dholbach: to continue with the first line of debian/changelog.... (01:31:09 PM) dholbach: there's still "unstable; urgency=low" (01:31:28 PM) dholbach: unstable is the default "distro release" that is uploaded to in Debian (01:31:36 PM) dholbach: we use things like "intrepid", "jaunty", etc. (01:31:50 PM) dholbach: we can always just upload to the current development version of Ubuntu (01:31:59 PM) dholbach: which in our case is "jaunty" (01:32:33 PM) dholbach: the 'urgency=low' bit is always added by tools like dch (in the devscripts package) (01:32:38 PM) dholbach: and we can safely ignore it (01:32:45 PM) dholbach: in Debian it describes the urgency of the upload (01:32:54 PM) dholbach: in the Launchpad build service it's ignored (01:32:57 PM) dholbach: QUESTION: what's with the 0 in "-0ubuntu"? (01:33:14 PM) dholbach: creek23: it means that we have not inherited a version of it from Debian yet (01:33:22 PM) dholbach: QUESTION: can we apply for "needs packaging" in launchpad even if there is no new version of a tool but just changes via GIT? (01:33:58 PM) dholbach: co0lingFir3: needs-packaging is something else - it's bookkeeping within Launchpad for packages that are not in Ubuntu yet (01:34:06 PM) dholbach: co0lingFir3: you're free to add changes from GIT (01:34:16 PM) dholbach: QUESTION: if the target version is not an ubuntu release does that target 'development' automatically? (01:34:52 PM) dholbach: apw: dch, which adds boilerplate changelog entries for your (in devscripts package) will default to the version you're running right now (01:35:01 PM) dholbach: QUESTION: what if I want to make a package for Hardy? Can I still leave the changelog line at unstable or jaunty, or does it have to be hardy then? (01:35:13 PM) dholbach: oliver_g_1: take a look at https://wiki.ubuntu.com/StableReleaseUpdates (01:35:22 PM) dholbach: it's about hardy-proposed, hardy-updates, etc. (01:35:29 PM) dholbach: we're not going to have the time here to discuss it, sorry (01:35:42 PM) dholbach: QUESTION: If we package the hello program separately for ubuntu, why does it still retain the 'unstable' bit from debian (01:35:56 PM) dholbach: rugby471: because we got the source package unmodified from Debian (01:36:03 PM) dholbach: QUESTION: does "unstable" thus mean that it was uploaded to debian directly, so we'd s/unstable/jaunty if we were uploading to (ie) a PPA for jaunty? (01:36:22 PM) dholbach: Arc: if you add a new changelog entry, use the current development release, yes (01:36:28 PM) dholbach: QUESTION: isn't it that urgency=high is used for security fixes? (01:36:37 PM) dholbach: maix: yes, in Debian - for us it's irrelevant (01:36:41 PM) dholbach: OK, let's crack on (01:36:49 PM) dholbach: please ask further versioning questions in #ubuntu-motu please :-) (01:37:10 PM) dholbach: the rest of the changelog entry is obvious (01:37:24 PM) dholbach: it describes what was done following the " * " (01:38:00 PM) dholbach: and in the bottom there's the content of DEBFULLNAME and DEBEMAIL (01:38:11 PM) dholbach: plus the current timestamp (date -R) (01:38:33 PM) dholbach: let's move on to debian/control (01:38:41 PM) dholbach: this is much more exciting (01:38:55 PM) dholbach: it's always divided into at least 2 stanzas (01:38:59 PM) dholbach: the first one is about the source package (01:39:11 PM) dholbach: the following ones (in this case just one) about the resulting binary packages (.deb files) (01:39:22 PM) dholbach: Source: just repeats the source package name (01:39:39 PM) InHisName: :q (01:39:41 PM) dholbach: Section: is one of few sections that are defined in debian policy (01:40:07 PM) dholbach: Priority: is also defined in the debian policy (01:40:19 PM) dholbach: the Maintainer: name defines who takes care of the package (01:40:31 PM) MrKanister: You all should bookmark http://people.ubuntu.com/~cjwatson/ubuntu-policy/policy.html/ ;) (01:40:42 PM) MrKanister: sorry for interupting (01:40:48 PM) dholbach: Standards-Version: mentions which version of the debian policy the package complies with (01:41:06 PM) dholbach: QUESTION: You used the term 'build service'. What do you mean by that? (01:41:37 PM) dholbach: bullgard4: we always deal with source packages when we introduce changes, which means we upload the .diff.gz the .dsc and the .orig.tar.gz file to a build server where it will be compiled and result in a bunch of .deb files (01:41:53 PM) dholbach: as I said before: this package is very very simple (01:42:01 PM) dholbach: and thus is does not contain a Build-Depends line (01:42:12 PM) dholbach: which you will encounter in almost every other package (01:42:26 PM) dholbach: in this line you specifiy which packages are necessary to build and compile the package (01:42:49 PM) dholbach: it always assumes that build-essential (including libc, gcc, make and so on) is installed (01:43:02 PM) dholbach: but every other Build dependency is specified explicitly (01:43:13 PM) dholbach: QUESTION: how can you see who the ubuntu mainainer is? (01:43:24 PM) dholbach: apt-cache show hello (01:43:34 PM) dholbach: QUESTION: if i make some changes in package, so i should enter my name in "Maintainer" field, but current "Maintainer" line should replace by XSBC-Original-Maintainer, right? and what XSBC stands for? (01:43:54 PM) dholbach: ia: good question - this package is unmodified but for all the other packages which we decide to modify (over Debian)... (01:44:14 PM) dholbach: our friends at Debian asked us to preserve the Debian Maintainer in XSBC-Original-Maintainer and add a new Maintainer: which is specific to Ubuntu (01:44:30 PM) dholbach: this was done to prevent stray bug mails from Ubuntu users to go to the Debian maintainer (01:44:54 PM) dholbach: this can automatically be done by running update-maintainer (in the ubuntu-dev-tools package) (01:45:19 PM) dholbach: alright (01:45:35 PM) dholbach: so far to the debian/control section about the source package (01:45:39 PM) dholbach: let's come to the binary package (01:45:54 PM) dholbach: "Package:" just contains the name of the binary package we want to get created (01:46:06 PM) dholbach: in this simple case upstream project name = source package name = binary package name (01:46:19 PM) dholbach: "Architecture: any" is slightly more exciting (01:46:38 PM) dholbach: this means: please build the package on any architecture individually (01:46:41 PM) dholbach: let me explain (01:46:58 PM) dholbach: when I upload a modified hello source package to the ubuntu build service (01:47:15 PM) dholbach: it will be independently built on armel, i386, amd64, powerpc, sparc, hppa, etc etc (01:47:28 PM) dholbach: so all the architectures that we have available in the data center (01:47:48 PM) dholbach: this is necessary where the binary package afterwards contains architecture dependent code (01:47:59 PM) dholbach: if you compile a C program, it's different on amd64 and powerpc (01:48:26 PM) dholbach: if you just ship a bunch of artwork in a package, you can safely change Architecture to "all" (01:48:42 PM) dholbach: which means: build it once, use the same package on all architectures (01:48:52 PM) dholbach: QUESTION: in apt-cache show hello I see it depends on libc6 (Depends: libc6 (>= 2.5-0ubuntu1)), though there's no build-depends. How can that be? (01:48:54 PM) dholbach: ronj: just a sec (01:49:01 PM) dholbach: Depends: ${shlibs:Depends} (01:49:16 PM) dholbach: this means: these packages are necessary to install the package (01:49:26 PM) dholbach: ${shlibs:Depends} is not a package name (obvious, ha!) (01:49:37 PM) dholbach: but it's a variable that is substituted after the build (01:49:54 PM) dholbach: and replaced with all the libaries that the code in the binary package is linked against (01:49:56 PM) dholbach: magic! (01:49:57 PM) GSMX_ is now known as GSMX (01:50:04 PM) dholbach: QUESTION: hasn't support for powerpc etc been dropped recently? (01:50:15 PM) dholbach: maix: we still build packages for powerpc, it's a community port (01:50:41 PM) dholbach: The description contains a short (first line) and a long description for the package management tools (01:51:08 PM) dholbach: if you want to look at a non-trivial package, check out apt-cache showsrc mono (01:51:25 PM) dholbach: it will show you that the mono source package is split up into 34567654567 different binary packgaes (01:51:27 PM) dholbach: packages (01:51:37 PM) dholbach: it got a lot better recently though :) (01:51:51 PM) dholbach: let's crack on to the next file, we're running out of time (01:52:04 PM) dholbach: debian/copyright is a file that the archive admins are very picky about (01:52:08 PM) dholbach: it contains information about (01:52:13 PM) dholbach: - who packaged the piece of software (01:52:18 PM) dholbach: - who the upstream developer(s) are (01:52:29 PM) dholbach: - who has copyrights on the source (01:52:42 PM) dholbach: - which individual licenses ALL the files in the source code are under (01:52:51 PM) dholbach: we have to be VERY VERY VERY careful when filling out that file (01:53:06 PM) dholbach: if we miss copyrights or miss files that are maybe unredistributable we're in trouble (01:53:20 PM) dholbach: and you'll make archive admins unhappy if you don't take it seriously :) (01:54:04 PM) dholbach: for a insufficient quick overview, try out this: (01:54:06 PM) dholbach: find . -iname '*.c' -o -iname '*.h' | xargs head | less (01:54:18 PM) dholbach: it will show you the headers of all the .c and .h files in the source tree (01:54:23 PM) dholbach: and show some of the copyrights (01:54:29 PM) dholbach: as I said, it's insufficient (01:54:37 PM) dholbach: QUESTION: does ubuntu maintainers use some scripts for searching "Copyright" strings in source code tree of project before packaging? (01:54:50 PM) dholbach: ia: there are a few tools for that, best to ask in #ubuntu-motu or #ubuntu-devel about it (01:55:07 PM) dholbach: also check out https://wiki.ubuntu.com/MOTU/GettingStarted because it links to a lot of important information about this stuff (01:55:14 PM) dholbach: (packaging guide, ubuntudevelopment processes, etc.) (01:55:29 PM) dholbach: the last file we just briefly mention is debian/rules (01:55:50 PM) dholbach: it is a Makefile that wraps around the Makefiles that are used by the upstream source (01:56:03 PM) dholbach: it basically makes use of what you'd do to build and install the software (01:56:19 PM) dholbach: ./configure && make && sudo make install is something you probably can relate to (01:57:02 PM) gabrielix is now known as elisa (01:57:09 PM) dholbach: the new targets build, clean, binary, etc. wrap around whatever build infrastructure your project has (01:57:25 PM) elisa is now known as elisabeth (01:57:39 PM) dholbach: this is a very blunt and very spartanic package, so it does not make use of debhelper, cdbs or other tools which make the job of maintaining a package a lot lot easier (01:58:03 PM) dholbach: QUESTION (sorry if this is too far ahead) : As far as I understand, if I found a bug, it wasn't being patched and I wnated to fix it, the best way would be for me to download the source (as you have shown) fix the problem, package the package and then ... , is this correct and what happens after the ... ? (01:58:33 PM) dholbach: rugby471: I'll talk much more about that topic at Wednesday 17:00 UTC (01:58:39 PM) dholbach: "fixing bugs in Ubuntu" (01:59:00 PM) dholbach: very short version: generate patch, attach to bug, subscribe ubuntu-main-sponsors (or ubuntu-universe-sponsors team) to get review (01:59:01 PM) rugby471: ok, I'll wait with anticipation! (sorry for interrupting) (01:59:08 PM) dholbach: QUESTION: Could you advise some concrete docs, where describes in detail, how can create "rules" file manually to understand each line? (so as to don't look at dh_* commands like at some spells :-) (01:59:22 PM) dholbach: ia: https://wiki.ubuntu.com/MOTU/GettingStarted - check out Packaging Guide (01:59:30 PM) dholbach: QUESTION: if we for example had a python package we'd put a byte-compiling script in that debian/rules? (01:59:51 PM) dholbach: maix: you'd wrap around python setup.py install etc (but we have clever tools for that - google for "debian python policy") (01:59:58 PM) dholbach: QUESTION: what if the upstream project did not include a Makefile? Can I put the installation commands (cp) directly into debian/rules? (02:00:09 PM) dholbach: oliver_g_1: you can, there's a lot of different ways to do it (02:00:13 PM) dholbach: OK, the session is over (02:00:16 PM) dholbach: thanks a lot everybody (02:00:22 PM) dholbach: have a great Ubuntu Developer Wekk (02:00:23 PM) dholbach: Week (02:00:28 PM) dholbach: bookmark https://wiki.ubuntu.com/MOTU/GettingStarted (02:00:31 PM) dholbach: hope to see you in #ubuntu-motu (02:00:35 PM) dholbach: make Ubuntu better! (02:00:40 PM) dholbach: make me proud! :-) (02:00:43 PM) NetSKaVeN: great session dholbach!! (02:00:46 PM) CrownAmbassador: Thanks dholbach!!! Was great! (02:00:53 PM) h00k: thanks, dholbach (02:00:53 PM) rmcbride_ is now known as rmcbride (02:00:54 PM) rugby471: THanks great seession, It was a great idea to have that command at the start, so that everyone cna see what you are talking about, and also look at it in their won time. Thanks!! (02:00:54 PM) ***xnox applauds (02:00:55 PM) ***mneptok hugs dholbach (02:00:57 PM) xnox: thank you (02:01:01 PM) maix: thanks dholbach (02:01:02 PM) audriusz: Big thanks to comes to you :D (02:01:05 PM) bullgard4: Thank you dholbach ! (02:01:07 PM) ***dholbach hugs y'all (02:01:10 PM) ***iulian hugs dholbach as well. (02:01:11 PM) rugby471: cna * can won * own (02:01:12 PM) ronj: thanks (02:01:12 PM) tictacaddict: thanks, it was a fun! (02:01:20 PM) ganbat: thx (02:01:23 PM) GSMX: thx (02:01:32 PM) ia: thanks a lot ) (02:01:47 PM) creek23: thanks... (02:02:20 PM) theseas: thanx dholbach! :) (02:02:26 PM) ikis: thanks! }}}