Saturday, 2007-06-02

*** tpb has joined #tp00:00
*** ChanServ sets mode: +o tpb00:00
*** mithro has joined #tp00:11
llnzhi mithro00:12
mithrohey00:14
mithro~seen niphree00:14
tpbmithro: niphree was last seen in #tp 1 day, 12 hours, 5 minutes, and 41 seconds ago: <niphree> hello00:14
llnzmithro: btw, i updated the metaserver00:24
mithrookay00:24
mithrothe avahi guys want us to use tp-http when in zeroconf00:24
llnznow accepts tp+http and tp+https00:24
mithrollnz: cool00:25
llnzi know00:25
llnzi've been watching the bug report00:25
mithrollnz: i think it would be fine00:25
llnzyeah00:25
llnztpserver-cpp doesn't export those two unless they are the only ones the server has00:28
CIA-3llnz tpserver-cpp * r2f9d43725dec /tpserver/avahi.cpp:00:32
CIA-3Export tp-http and tp-https instead of tp+http and tp+https thorugh avahi00:32
CIA-3as they suggested that those are better service types.00:32
mithrollnz: you have been around early quite a bit?00:36
llnz?00:36
llnzi spent friday at home (working remotely) and didn't have anything on today00:37
mithrollnz: normally you don't seem to turn up till around 5pm my time - last couple of days you have been around since I got up00:38
llnzyes, the last two days i've been trying to work through playerview00:39
mithrohows it going?00:40
llnznot bad, inching closer to full tp04 support (difference support)00:40
mithrollnz: do you have some type of plan for it? I would be intrested to see how you went about it00:41
llnzfor tp04 support?00:41
llnzor playerview?00:41
mithrofor playerview00:42
llnzi took what I already had in Player, and moved it to the playerview class00:43
llnzthen starting with components (the simplest thing), added per-player view and difference support00:43
llnzthen design00:43
llnznext is object, i think00:43
CIA-3mithro tpserver-py * rb55e012138bf /tp/server/rules/minisec/ (__init__.py actions/Turn.py): Increase turn number of the universe object.00:48
xdotxoh man. i just cannot take benadryl any more00:53
xdotxwhen i was a kid, it never made me tired. i just took 1 pill and it practically knocked me out00:54
mithroxdotx: funny how drugs effect you differently at different ages01:00
xdotxmithro: yes, and highly inconvenient01:00
mithroxdotx: sorry about not looking into your problem in the end01:01
mithroxdotx: since llnz is around, he migth be a good person to quiz :P01:02
xdotxmithro: the other day? certainly no problem; you had quite a hang up there01:02
mithronash: ping01:02
mithronash: tpserver-py should now be less annoying for you01:10
mithronash: ping me when you are about01:18
mithroI'm triggering an assert in galaxie which I can't see as possible01:18
llnzso mithro, when are you going to finish tpclient-pywx-dev so that it works?01:29
mithrollnz: once I get tpserver-py in order01:29
llnzok01:29
mithrollnz: after my exams probably01:30
mithrotpserver-py is getting very close01:30
llnzcool01:30
llnzwhen are your exams?01:30
mithro19th and 25th I think01:30
llnzah01:30
mithro19th and 27th01:30
mithrogot the two worsed ones on the 19th :/01:31
llnzfun01:34
mithroyeah01:53
mithroi should really be studying for them instead of working on tpserver-py01:53
llnzyes01:55
llnzbbs, dinner02:13
CIA-3mithro tpserver-py * r368427d2b60f /tp/server/bases/ (Object.py SQL.py): Fixed bug where order removal was removing all order parameters.02:14
CIA-3mithro tpserver-py * rf405bbd245fb /tp/server/rules/ (3 files in 2 dirs): Make the output a little more verbose..02:14
* mithro pokes nash 02:36
mithrojotham: ping?02:36
jothamhey02:37
CIA-3mithro tpserver-py * r715bc1e00476 /tp/server/rules/minisec/orders/BuildFleet.py: Honour the name the player gives the fleet.02:59
CIA-3mithro tpserver-py * rbf1427c6149d /tp/server/__init__.py:02:59
CIA-3Handle an amount of -1 when getting OrderDesc.02:59
CIA-3Removed some excess prints.02:59
CIA-3mithro tpserver-py * r1f00a75d4364 /tp/server/rules/base/orders/Colonise.py: Colonise order now matches one used by tpserver-cpp.02:59
llnzmithro: matches the one in tpserver-cpp?03:01
mithrollnz: IE Has an single parameter which is the ID of the thing to be colonised03:02
mithrotpserver-py use to just colonise any object which you are orbiting03:02
llnzhehe, minisec and mtsec in tpserver-cpp don't do that any more03:02
llnzthey now have no parameters and colonise the object they are at03:05
mithrollnz: what happens if two planets are at the same location?03:07
llnzthey are not03:07
mithrollnz: it's not inconvicable?03:07
llnzit is very, very, very unlikely03:08
*** tpb` has joined #tp03:41
*** tpb` is now known as tpb03:41
*** llnz2 has joined #tp03:41
*** llnz has quit IRC03:42
*** ChanServ sets mode: +o tpb03:42
*** llnz2 is now known as llnz03:42
llnzahhh... that will be why nash's ai wasn't doing well the other day on demo103:42
llnzmithro: we should do something about the media03:42
mithrollnz: yes04:04
mithrollnz: i'm wondering which way is the best to go04:06
mithrollnz: RE: Media, I've been meaning too04:06
llnzhehe, you should see demo104:09
mithrowhy?04:14
llnz11 colony fleets moving04:15
llnzabout to be joined by another four04:15
mithrooh, nash's AI going at it?04:15
llnznope, just me :-)04:15
mithrooh :P04:16
mithrolooks like you need some competition :P04:16
llnzhehe, good luck with that :-p04:17
mithroI think nash's AI might still give you a run for your money04:17
mithroit doesn't sleep :P04:19
llnzit's not aggressive, it wouldn't try to take a planet i own already04:21
* llnz is pondering writing an AI framework for tp in c++04:23
mithrollnz: bah, C++ is a pretty bad language to do AI stuff in04:24
mithroC++ with Lua scripting could be okay04:25
llnzthey ai wouldn't need to be written in c++04:25
mithrooverall, with any AI development time is the biggest problem04:25
llnzit would basically be a swig library that expose useful basic building blocks04:26
mithroswig is teh evil04:26
llnzmaybe04:26
llnzor it could just be a c++ environment with languages embeded in it04:26
llnzhaven't really thought it through yet04:30
llnzi am going to rewrite libtpproto-cpp again though04:30
llnzpart of it, really04:30
CIA-3mithro tpserver-py * r2a04964c74cb /tp/server/ (bases/Object.py utils/__init__.py): Fixed the ordering parameter of bypos.04:33
mithrollnz: why?04:33
llnzbecause it blocks, and blocking is bad for GUIs04:33
mithrooh, blocking is bad :P04:34
llnzand i want the library to report when it's ready for the client, and all the callback/delgate stuff04:35
mithroevent driven is probably the way to go04:35
llnzyes, using the client's event loop, not an internal one04:36
mithrollnz: probably want to provide way to use it in a select type system?04:38
llnzyeah04:38
mithroso I'm not quite sure what to do about the media04:38
llnztailor into a git repo?04:39
llnzor put the svn back up04:39
mithrowell, git has the problem that you have to download the whole repository history04:39
llnztrue04:39
mithrowith binaries that can get very big very fast04:39
llnzyeah04:39
llnzbut only need to once04:40
jothamwhats up mithro04:52
mithrojotham: how goes the battleviewer? :P04:52
jothamuh dude04:52
jothami have concussion04:52
jothami can't even remember basic shit :\04:52
jothamlike where my gran lives (happend today)04:53
jothamyeah i got hit by a car thursday04:53
jothampretty much fine just concussed quite badly04:53
mithrojotham: ahh that sucks04:54
mithrojotham: how does on recover from concussion?04:55
mithros/on/one04:55
jothamit's bruising04:55
jothamof the brain04:55
jothamit just heals04:55
jothami've had it a few times before over the years04:55
jothamfrom riding bmx's04:55
llnzbbs05:10
mithrojotham: so you don't have to do like brain physio or anything?05:13
*** zipola has joined #tp05:13
jothamhaha mithro05:14
jothamnaah05:14
mithrojotham: so what you been up to then?05:22
jothamsleeping pretty much05:22
jothameven being on the computer makes me tired and dizzy05:22
jothamam pretty bruised05:22
jothamso if i install the thing generating these battles can i generate my own, or do i need to simulate games and crap too?05:23
mithrojotham: the battle generator can be run standalone05:24
jothamok05:24
mithroit takes a file which specifies the participants05:24
mithrosee the following directory05:24
mithrohttp://git.thousandparsec.net/gitweb/gitweb.cgi?p=tpserver-py.git;a=tree;f=tp/server/rules/minisec/actions;h=b62aa6d96ebd4aac169a2d9dced41be09c75a058;hb=HEAD05:25
tpb<http://ln-s.net/_DE> (at git.thousandparsec.net)05:25
mithrothe file you want is "FleetCombat.py"05:25
mithrothe tests directory is some sample input for FleetCombat.py05:25
mithrobut if you don't feel well, I wouldn't recommend looking at that code :P05:27
jothamheh05:27
jothami'll try to remember to check it in the morning05:27
llnzback05:46
llnzget well soon jotham05:47
CIA-3llnz tpserver-cpp * r2375f679c478 /tpserver/playerview.cpp: Protect against requests for too many items in PlayerView.06:21
mithrollnz: so how does your playerview work?06:25
llnzfor designs and components, which don't store history, it keeps a copy of the thing (as far as it can see it) and a list of those usable for the player, and a list of visible things06:26
llnzit also maintains it's own timestamps, etc06:27
mithroso how do objects work?06:30
llnzwill work, you mean :-)06:30
llnzwell....06:31
llnzplayerview will hold a list of the player's owned objects, and a list of visible objects06:32
llnzplayerview will hold a copy of each visible object for each turn06:33
llnzwhen the player doesn't own the object, it will give the copy in the PlayerView06:36
llnzwhen the player does own it, it will give the "real" object06:36
llnznone of this is currently set up to work with persistence06:38
mithrookay06:45
llnzyes06:48
llnzyet06:48
mithroso how does that deal with history?06:57
llnzplayerview will hold a copy of each visible object *for each turn*06:57
llnzso it will have a history for each turn06:58
mithrowhy not hold a complete history of the object in the object class?06:59
mithroand then just use a "masking" function?06:59
llnz?06:59
llnzoh06:59
llnzthe object the playerview holds is only what the player can see06:59
llnzthe filtering is done before it's added to playerview07:00
llnzthat applies to components and designs too07:00
mithrollnz: what I'm planning to do is have a table which says "Saw this object at XXX with this 'mask'"07:00
mithrowhere the mask explains what the player can't see07:00
llnzcool07:00
mithrowhich I think is the most efficent way to store it07:01
mithroas there is still only one copy of the full object history07:01
llnzhow does that deal with "old" data?07:01
mithrollnz: well the "object table" stores the complete history of all objects07:02
mithroso if a player can only see an old version of the object, the "playerview" table just points to the object at an older point in history07:04
llnzolder parts with newer parts?07:05
mithrookay, let me start over07:06
mithrothis is my plan,07:07
mithro - object becomes a "log" type system. To update an object you insert a new record with a later modtime07:07
mithrothis means that you can always get the latest state by selecting the max(modtime) for each object07:08
llnzit's that a slow query in sql?07:08
mithrollnz: not really07:09
mithroinfact with proper indexing it's really quite fast07:09
mithroand you can also build a "cache" by performing the select once into a temporary table07:10
mithroeach player then have a "view", this is table which has two fields a "reference to object@time" and a "mask"07:11
mithroso to get what a player can see, it's a join between the "view" table and the "object" table and again selecting the "max(modtime)"07:11
mithroyou can also see anytime in the history by also adding a "where modtime < x"07:12
mithro90% of objects don't change - in this case there will only be 1 record in object and reference for each player (when they first see the object)07:14
mithromake sense?07:14
llnzyes07:14
llnzmy model supports incorrect/misleading information07:15
mithrowhich means storage wise its  sizeof<object> + sizeof<int>*3*numplayers07:15
mithrollnz: well, it's fairly easy to add incorrect/misleading information too07:16
mithrojust have an "overrides" table, then do the same select - preferencing overrides over the "object" table data07:16
mithrowhich again means you only storing the (uncommon) case when there is some value you want to override07:17
mithrollnz: that sound sensible07:27
mithro?07:27
llnzhummm....07:27
CIA-3mithro tpserver-py * rb94cb6cae4bb /tp/server/bases/ (Message.py Order.py):07:28
CIA-3Fix up Message.07:28
CIA-3Tried to make Order and Message as common as possible. Should probably make07:28
CIA-3a seperate baseclass.07:28
CIA-3mithro tpserver-py * re38eabbe4662 /tp/server/bases/SQL.py: IDs start at 1.07:28
CIA-3mithro tpserver-py * r15478143c47e /tp/server/bases/Ruleset.py: Insert instead of save.07:28
llnzit does sound sensible07:30
llnzand other than the space requirement, do does mine?07:30
mithrollnz: I'm actually going to write it up now07:30
llnzs/do/so/07:30
llnzcool07:30
mithrollnz: well, yeah - it's probably a bit simpliar/less error prone07:30
mithrohowever your space requirements are going to spiral out of control I think?07:31
mithroeach turn you need to store   sizeof<object>*numberofobjects*numberofplayers ?07:31
llnztrue07:32
llnzi think your overrides table and view table will get fairly big07:32
llnzprobably not anywhere near as fast though07:33
mithrollnz: well overrides arn't all that common?07:33
mithroIE When would you actually use them?07:33
llnzspies, inaccurate sensor readings, etc07:34
mithroremeber 90% of the universe is pretty much inhert?07:37
llnzlooking at it, it doesn't appear to be that much07:38
llnzhumm.... going to have to fiddle with the children of objects in playerview :-(07:41
llnzactually07:42
llnzin the db tables, i could have a level of indirection for player's view of objects07:42
llnzallowing for non-changing objects to be only present once, with pointers from each turn07:43
llnzgrows only 12 bytes a turn (or so)07:43
mithromy idea, things only grow when there are actual changes07:46
llnzactually, with the indirection, it only has to grow when there are actual changes07:53
llnzwhen it does, i store the whole object, not just a reference and a mask (and sometimes a override)07:54
mithrothat makes sense07:54
*** niphree has joined #tp07:59
niphreehello07:59
llnzhi niphree08:01
mithrohey niphree08:06
mithrohow is everything going?08:06
niphreestill trying to add this new files ;)08:09
niphreeI'll send you error message08:09
mithroniphree: okay08:11
mithroniphree: feel free to just pmsg me08:11
mithroniphree: hrm08:18
mithrothat error is a little weird08:18
mithroniphree: okay give it a go now08:20
niphreemithro: I also had warnings when I commit files - but no errors :/08:26
mithrowhat where the warnings?08:26
mithro"nothing known about file x"?08:26
niphreeno...08:27
niphreeI don't remember exacky - but I think it was this same as here.08:28
niphree"cvs add: warning: unrecognized response `DBD::SQLite::st execute failed: attempt to write a readonly database(1) "08:28
mithrohrm....08:39
mithroniphree: try again now08:40
niphreeheh - it's working :]08:42
mithrocool08:43
mithroniphree: so you going to commit?08:46
niphreemithro: yes, but not now - I want to add some more changes first08:49
mithrookay08:49
mithroremeber, commit early, commit often08:49
niphreemithro: k ;)08:49
niphreemithro: is there any documentation protocol v.4. I know I read something before :/08:51
mithrothere is some basic stuff08:51
mithrohttp://www.thousandparsec.net/tp/dev/documents/protocol4.php08:51
tpb<http://ln-s.net/JqO> (at www.thousandparsec.net)08:51
niphreethx08:52
* llnz wanders off09:10
llnzlater all09:10
*** llnz has quit IRC09:25
mithroniphree: how are you going?09:26
niphreegood - I'm just thinking about this code09:39
mithroniphree: when you get a chance, could we finish up the intro email?09:55
niphreemithro: ... heh - I almost forgot about this.09:57
CIA-3mithro tpserver-py * r75acc5e9a567 / (.gitignore TODO doc/howstuffworks doc/script.sh): Plans for how to do the history/fow/etc.09:57
mithroniphree: I'm going to head to bed soonish10:03
mithroso if you want me to look at anything, we should do it soon10:03
mithro~seen nash10:04
tpbmithro: nash was last seen in #tp 1 day, 9 hours, 39 minutes, and 2 seconds ago: <nash> mithro: cool10:04
mithrowell I'm going to assume that nash has already gone to bed10:04
mithroniphree: you likely to be around tommorrow?10:11
mithroniphree: ping?10:34
CIA-3mithro tpserver-py * rf3931be2b2b9 /tp/server/rules/minisec/__init__.py: Temporarily lock the player location.10:41
mithrobrx: ping?10:55
CIA-3mithro web * r043b30fd97e7 /bits/start_page.inc: Reenable the Google Urchin.10:55
CIA-3mithro web * r62fc631ce11e /dev/documents/ncl.php:10:55
CIA-3Removed the commas.10:55
CIA-3Scheme is based on s-expressions, the parameters inside the paramater list10:55
CIA-3are "whitespace separated", usually. See10:55
CIA-3http://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-7.html#%_sec_4.2.610:55
tpb<http://ln-s.net/Z1a> (at www.schemers.org)10:55
CIA-3for why an expression such as the above would lead to an error in r5rs10:56
CIA-3compliant schemes.10:56
CIA-3mithro web * r8c1683a2b8c1 /news/2007-05-26-2136.news: Merge with git+ssh://[email protected]/git/web.git10:56
CIA-3mithro web * rdc3d57ba7cb9 /dev/documents/minisec.php: Cleared up the movement/speed of ships.11:38
brxmithro: pong11:58
mithrobrx: I wanted to ask scheme questions11:58
mithrowhy does let require double brackets?12:01
brxlet takes a list of binding defs of the form (var val)12:02
mithro(let ((x 5)) (* x 2))12:03
brx(let ((x1 v1) (x2 v2) ...) ...)12:03
brxyes12:03
brxwhat's wrong withthat12:03
brxas I said, it takes a list of bindings12:04
mithroit just seems a bit redundent12:04
brxit won't _magically_ expect a (var value) list when you only specify one binding12:05
brxthis is consistency12:05
mithrowhen could (let (x 5) (* x 2)) be ambigious?12:07
brxit has different semantics.12:11
mithroit just seems an annoying way to catch out newbies12:16
brxnot really..12:16
brxit's much clearer the way it is12:17
brxactually, it's just that. clear.12:17
brx(let (x 5) ...) is silly sugar12:17
brxand it changes the semantics of let12:17
brxthat's not really acceptable.12:18
brxone thing that is nice about scheme is that it is consistent12:18
mithroone thing that scheme is not, is clear :P12:19
brxits syntax is among the most elegant, its standard fits on a few html pages. are you kidding me? :)12:20
brxit's clear and simple.12:20
mithrobrx: it might be nice and clear to a computer, but a human just sees bracket soup12:21
mithroi bet without an editor you would have trouble matching brackets12:21
brxI don't see any brackets12:21
brxof course I would12:21
brxI don't read code by matching brackets however12:22
brxI read by indentation12:22
mithroahh, but why can't the computer use the indentation then?12:22
brxthere used to be a srfi for that12:23
mithrosrfi?12:23
brxwhitespace sensitive scheme12:23
brxscheme request for implementation12:23
brxhttp://srfi.schemers.org/srfi-49/srfi-49.html12:23
brxuh, but schemers hated it12:24
mithrobrx: why?12:26
brxmithro: it's less readable12:32
mithroI'm finding it more readable12:32
brxmithro: group12:35
brxack12:35
brxhttp://paste.lisp.org/display/4215512:35
tpbTitle: Paste number 42155: uh (at paste.lisp.org)12:35
brxmithro: just go at it with an open mind, use a sensible text editor (emacs, emacs, emacs).12:36
mithrobrx: I'm a Vim user12:37
brxthen it is likely that you will either give up lisp in the near future or switch to emacs at least for scheme :)12:38
mithrobrx: okay - a language is fundementally broken when it depends on a certain editor to be usable12:40
*** Demitar_ has quit IRC12:40
mithrothe nicest thing I've seen about scheme, is that it looks like it's easy to paralize12:43
brxuh, I certainly don't have the energy to cope with blockheaded comments like this now, mithro12:43
brxno time for this.12:43
*** brx has left #tp12:43
*** niphree has quit IRC12:58
CIA-3mithro libtpproto-py * rf2c0177ffbc1 /tp/netlib/xstruct.py:14:12
CIA-3Added support for the buffer object.14:12
CIA-3Added better error string.14:12
CIA-3mithro tpserver-py * r4bafd2743737 /tp/server/rules/minisecplus/__init__.py: Remove the excess prints.14:25
CIA-3mithro tpserver-py * r24517d08965f /tp/server/ (6 files in 2 dirs): Minisec+ now has components and properties on the designs.14:25
CIA-3mithro web * r502e232a15c7 /dev/documents/ncl.php: Added sprintf function.14:55
*** Epyon has quit IRC16:01
*** TBBle has quit IRC16:26
*** Epyon has joined #tp17:17
* nash waves21:31
xdotxhey nash21:34
nashheyo... so can I start testing RFTS yet ? ;-)21:36
xdotxheh, i think i'll fully tested it so far21:37
xdotxloads: _/, displays name and version: _/ :P21:37
nashCool...21:38
nashHave you had any thoughts on how to do combat?21:38
xdotxi just got minisec/mtsec successfully loading on tpserver-cpp here, connected to myself and am trying to figure minisec out ~~21:38
xdotxin short, no21:39
nashminisec shouldn';t be too hard.21:40
xdotxi thought so too21:41
nashheh21:41
nashWhat are you having problems iwth?21:41
xdotxeverything?21:42
xdotxaside from selecting planets and systems21:42
xdotxthere are the 3 ship designs, but i can't place any orders or anything...?21:43
nashHmm?  Using the client/21:44
xdotxyes, the pywx one21:44
* nash notes mithro is using galaxie for testing his server at the moment21:47
nashxdotx: galaxie is mostly useful as the AI does a few hard coded things, rather then generic commands21:50
xdotxi was under the impression pywx was most common21:50
nashIt is the most complete.21:50
* xdotx nods21:51
nashGalaxie doesn't allow humans to enter orders at the moment21:51
nashNot sure about the text client21:51
xdotxhmm. so i should be using pywx for testing, right?21:57
nashIf ti is working ... yes21:57
nashElse I can start tweaking galaxie to be basci AI for RFTS as well21:58
nashWhich I'm happy to do...22:00
xdotxhmm. well currently i don't really know if pywx is working or not.. i suspect it's something i'm doing wrong22:01
nashhmm...22:01
nashBack in a while22:04
xdotxkk22:05
*** CIA-3 has quit IRC22:09
*** CIA-3 has joined #tp22:12
*** xdotx has quit IRC23:13
*** xdotx has joined #tp23:14
mithroxdotx: ping!23:18
mithronash: ping!23:18
nashpong23:24
nashmi23:24
nashmithro:23:24
mithronash: galaxie successfully colonised a planet in tpserver-py23:25
nashmithro: cool23:25
mithronash: but that brought up the issue that tpserver-cpp has converted to colonise orders with no arguments23:27
nash*sigh*23:28
nashokay, I'll fix it one way or another23:28
mithronash: so I was discussing it with Lee23:28
mithrowhich way do you think is better?23:28
mithroColonise being "Colonise the current location"23:29
nasharg - so that way there can bve two objects at the same point ;-)23:29
mithroor having an arugment with the object to colonise23:29
mithronash: but that is an almost "impossible" situation, they are 64bit ints, you could just of set it by 123:29
mithronash: so currently tpserver-py is the only server the AI works on :P23:32
mithrotpserver-py also has more interesting designs too23:35
xdotxmithro: pong!23:36
nashYou shouldn't to set if off by one23:36
mithroxdotx: so did you figure out your problem?23:36
nashhow abouta planet with multiple continents - colonise which continent23:37
xdotxmithro: no, not yet23:37
mithroxdotx: if you can give me more info, I can probably help23:37
xdotxmithro: k, just a sec23:37
xdotxmithro: well.. could you guide me through running a local minisec game?23:42
mithroxdotx: copy the sample config23:42
mithrothen ./tpclient-pywx23:42
mithroclick the new button23:42
mithroenter details23:42
mithroclick okay23:43
xdotxk23:45
xdotxmithro: hmm, if i log in as guest i can't really do anything?23:48
mithroguest user can only view23:48
xdotxthat would explain it (why didn't i think of that??)23:49
xdotxi think i would have had my local server accepting account creation before, but i was running in to another problem.. i should have that fixed by now23:49

Generated by irclog2html.py 2.5 by Marius Gedminas - find it at mg.pov.lt!