06:00
<heycam>
Hixie, typo in html5: s/one or mode/one or more/
08:36
<hsivonen_>
lots of logs to read...
08:52
<hsivonen_>
zcorpan: Tokenizer errors are in Tokenizer.java, tree builder errors in TreeBuilder.java. XML errors are in the xmlparser module
08:53
<hsivonen_>
zcorpan: RELAX NG errors are in onvdl/src//Users/hsivonen/Projects/whattf/onvdl/src/com/thaiopensource/relaxng/impl/resources/Messages.properties
08:53
<hsivonen_>
zcorpan: non-schema errors are in the non-schema module
08:53
<hsivonen_>
zcorpan: in summary: messages are all over the place. :-(
08:54
<hsivonen_>
mainly because each component is supposed to be reusable on its own and, therefore, needs to contain its own messages
08:54
<hsivonen_>
or came from a third party that way
08:55
<hsivonen_>
zcorpan: warning about inferred tags would be an XML parity advocacy feature
08:55
<hsivonen_>
zcorpan: checking for indentation doesn't seem to come with a similar competitive consideration
08:57
<hsivonen_>
annevk: if someone wants to use XHR to POST text/html from a browser by giving the content as a string to XHR, they need to set Content-Type and, hence, still need OPTIONS, right?
09:37
<hsivonen_>
re: data-* and microformats: It seems to me that it would be better to have a fast-track way for microformats.org to get attributes added to HTML validation.
09:38
<hsivonen_>
Validator.nu already supports custom schemas in case a user doesn't want to wait for the presets to change
09:57
<hsivonen_>
roc: Re: parsing perf and case preserving: It might be OK to make the tokenizer conditionally case folding. What's bad for performance is deferring case folding to after the tokenizer, since early interning of tokens is desirable. (not only interning the string but mapping to a static token object that has the 'scoping' etc flags, the tree builder dispatch group magic number, etc.)
10:00
<hsivonen_>
I do camelCase fixes for SVG by having the static pre-interned tokens carry a reference to a camelCased string
10:00
<Philip`>
hsivonen_: Can't you have each token contain both the original un-case-folded string and the interned static case-folded token object?
10:00
<hsivonen_>
so the camelCasing is zero-cost in execution time and only cost memory footprint
10:01
<hsivonen_>
Philip`: then I couldn't share the same objects for each concurrent parser instance
10:01
<hsivonen_>
Philip`: the well-known tokens are statics that go in memory at initialization time and are then shared by all threads
10:02
<hsivonen_>
I guess I should reply on list to SVG WG's proposal and explain how I do token interning and tree builder dispatch
10:03
<roc>
the token objects refer back to the source right?
10:03
<hsivonen_>
roc: they don't
10:03
<roc>
hmm, someone claimed that they do
10:03
<hsivonen_>
roc: Hixie got that part wrong about how I implemented it
10:04
<roc>
ok
10:04
<roc>
I'm surprised that round-trippability of source is not a concern here
10:05
<hsivonen_>
roc: the DOM doesn't represent inter-attribute whitespace, either
10:05
<roc>
since HTML5 specifies (and Acid3 tests) round-trippability of attribute values, I assumed full round-trippability was the way the wind was blowing
10:05
<roc>
that's true
10:05
<hsivonen_>
roc: round tripping source on the level that preserves meaningless details is a huge hassle
10:05
<hsivonen_>
and would interfere with the primary use cases of a parser
10:06
<hsivonen_>
(at least for perf considerations)
10:06
<hsivonen_>
round-trippability of attribute values is different
10:09
<Philip`>
Is parser performance a significant issue in practice, compared to networking and scripting and everything else involved in loading a page?
10:09
<hsivonen_>
I find I pretty much agree with takkaria's feedback regarding the SVG proposal
10:09
<roc>
yes
10:10
<Philip`>
The author-visible aspects of the language seem like they should be much more important than the optimisation details of some specific parser implementations
10:11
<roc>
I agree
10:11
<hsivonen_>
Philip`: it seems to me that early interning is a general implementation concern--not just a concern for a specific impl
10:12
<roc>
maybe
10:12
<roc>
designing around implementation details is risky because later on those implementation details might not matter, or might be broken by another spec change
10:13
<roc>
see my comments about SVG filters
10:14
<hsivonen_>
roc: OTOH, it really sucks to get parts of infrastructure that are really inconvenient in practice (e.g. Namespaces)
10:15
<roc>
it does, but that's life writing Web browsers
10:15
hsivonen_
guesses that Gecko's XML parsing could be faster if nsIAtoms for element local names could be built much earlier
10:16
<roc>
I never did figure out why the SVG WG's proposal actually needs to preserve case in tokens, though
11:07
<gsnedders>
Hixie: you around?
11:27
<gsnedders>
Hixie: Sent mail anyway now
11:50
<zcorpan_>
hsivonen: ok (re messages etc)
12:51
<zcorpan_>
krijnh: feature request for the logs: at the bottom please have links to the previous and next day
13:02
<zcorpan_>
that favicon game got me inspired
13:02
<zcorpan_>
i think i'll implement a creepy favicon that looks at the cursor later today
13:12
<mpt>
zcorpan_, call it xeyes 2.0 BETA
13:48
<takkaria>
I don't see how you can get acceptable performance from an HTML5 parser without some kind of string interning
13:49
<virtuelv>
mpt: Xeys, even
13:53
<mpt>
touch´
13:53
<gsnedders>
takkaria: Well, implement it in a totally different way to how it is spec'd :P
13:54
<takkaria>
well, if you have a treebuilder, and you have comparisons on tag name, either you do string comparisons multiple times per tag or you do a simple integer comparison, probably using switch() or the equivalent thereof
13:54
<Philip`>
takkaria: It's trivial - just lower your expectations
13:55
<Philip`>
"Acceptable" is purely subjective, and you are the subject, so you can choose to accept anything :-)
13:57
<takkaria>
by "acceptable" I mean "anywhere near competing with browser speeds"
13:58
<takkaria>
or even just libxml2 speed, really
13:58
<Philip`>
Presumably you need some kind of "unknown" token that includes the (case-folded) original source string, when it's not one of the default set of internable strings; so I'm still not sure why you can't just do the same for known tags, and carry around the original (unfolded) string in case you need it in the tree constructor, as well as the folded interned integer for fast switching
14:01
<takkaria>
the thought of doing that makes me cringe, I'd have to rerewrite a chunk of hubbub that I'm only just finishing off rewriting
14:01
<takkaria>
:)
14:04
<Philip`>
When balancing some inconvenience for early implementers like you by breaking your optimisation assumptions, versus some inconvenience for the whole of humanity for the rest of eternity by not designing the best possible language, I think you're on the losing side :-p
14:05
<takkaria>
I'm just not sure why people want thee tokeniser to case-preserve
14:06
<gsnedders>
takkaria: Gecko keeps it for one or two mainly irrelevant things
14:09
<Philip`>
takkaria: I think I'd be happier if people argued that way in terms of whether it's the best possible language for authors, and didn't use "but I already implemented this stuff that's commented out in a recently-written controversial section of a draft spec, and it'd take lots of work to change and I'd have to rethink my optimisation approach" as an argument for anything :-)
14:12
<takkaria>
all I'm saying is this; the spec currently makes case-folding mandatory. if there is a reason to change it, then change it, by all means, but if the reason is because the SVG group don't want "<SVG>" to start an SVG block, then I'm not convinced
14:17
<hsivonen>
gsnedders: Gecko does what? Gecko's internal tree API wants to see element names as nsIAtoms which are essentially interned strings
14:18
<gsnedders>
hsivonen: case-preserve
14:18
<hsivonen>
gsnedders: and the well-known lower-case HTML names are pre-interned
14:20
<Philip`>
takkaria: If the only case it's ever needed is to detect <SVG>, just add a one-bit flag to tokens to say "this token name was 'svg' in lowercase", and the tokeniser can set that before it does its standard case folding
14:21
<Philip`>
(Please note that I have no idea how sensible tokenisers are implemented, so I could be entirely wrong about everything :-) )
14:24
<takkaria>
it would be an arse to do that in hubbub
14:25
<takkaria>
I can't imagine it being a significant perf loss to special-case "svg" but all the same, I'd want to avoid it
14:25
<hsivonen>
Philip`: I just sent email recounting why I don't want late case folding
14:25
<hsivonen>
Philip`: of course, I think what I'm doing is sensible :-)
14:26
<takkaria>
given that e.g. it would have roughly the same effect as passing it through to the xml processor (it wouldn't display since tag names are in the wrong case)
14:26
<gsnedders>
hsivonen: It obviously isn't sensible, because you're doing it
14:26
<takkaria>
nice to see the odd ad hominem still in use :)
14:26
<gsnedders>
:P
14:27
<gsnedders>
takkaria: The thing is anyone around here for long enough should know I don't mean it at all :P
14:27
<Philip`>
Clearly the sensible thing would be to not write an HTML5 parser, and to do something nicer instead
14:28
<gsnedders>
Write an XML5 parser!
14:28
<hsivonen>
hmm. Mail.app made my quoting ugly :-(
14:37
<takkaria>
hsivonen: that mail must have taken you a long time to write
14:39
<gsnedders>
Mail.app sux.
14:39
gsnedders
needs to find a better mail client
14:42
<jcranmer>
gsnedders: telnet?
14:42
<gsnedders>
jcranmer: better, I said.
14:42
<jcranmer>
oh, you're using Mail.app, not Outlook
14:43
<takkaria>
thunderbird 3 might be an upgrade
14:43
<takkaria>
of course, you have to wait a while. :)
14:44
<jcranmer>
only 6-ish months
14:44
<gsnedders>
Provided it fixed the idiotic UI behaviour.
14:44
<gsnedders>
:P
14:44
<jcranmer>
which idiotic UI behavior?
14:44
<gsnedders>
(Like, don't come up with your own behaviour for things, do what everything else does)
14:44
<jcranmer>
ah
14:45
<gsnedders>
Like, cmd+scroll with scroll wheel should have the same affect as without cmd
14:45
<gsnedders>
(yes, I do randomly hold cmd down)
14:45
<takkaria>
I also hope that they figure out how to let me connect to my own mail server over SSL with a self-signed cert without me having to go through the rigmarole that tb3 currently puts me through
14:45
<jcranmer>
I think that's FF's fault
14:46
<gsnedders>
It's been a while since I've played around with TB, and I can't remember what annoys me in Gecko and what annoys me in TB :P
14:48
<Philip`>
Thunderbird shows me a list of my emails and lets me click on them to read them, and that's good enough for me
14:48
<gsnedders>
I want sane threading.
14:49
<jcranmer>
I want free email clients to actually generate I-R-T and References: correctly
14:49
<Lachy>
gsnedders, compared with Mail.app, Thunderbird gives very sane threading, unlike Mail.app's confusing threading
14:49
<gsnedders>
Lachy: True, but TB annoys me in other ways.
14:49
<jcranmer>
besides, TB uses the unofficial official threading algorithm
14:49
<Lachy>
jcranmer, what?
14:50
<jcranmer>
Lachy: the algorithm in the expired draft RFC
14:50
<Lachy>
which one?
14:51
<jcranmer>
hmm, I can't find it ATM, but RFC 5256 references http://www.jwz.org/doc/threading.html for threading
14:53
<jcranmer>
although the algorithm is given by jwz, so be prepared to meet bile at any product other than NS2
14:53
<gsnedders>
NS2?
14:54
<takkaria>
netscape 2
14:54
<gsnedders>
ah
14:54
<jcranmer>
netscape 2, jwz apparently hates ns 4 and anything later with a passion
14:54
<Philip`>
What about NS3?
14:54
<jcranmer>
he seems to be okay with that
14:55
<jcranmer>
my knowledge of early Netscape history is very little
14:55
gsnedders
doesn't remember it either
14:55
<gsnedders>
But maybe that's more justifiable
14:56
<Philip`>
My (possibly incorrect) memory of that era is primarily that NS3 allowed you to set img.src in scripts, but that was the only dynamicity allowed, but then IE4 came out and you could dynamically change pretty much anything on the entire page, and I thought that was really cool
14:56
<Philip`>
(I also thought Java applets to do animated wobbly text were really cool)
14:56
<gsnedders>
So maybe you aren't he best person to judge objective coolness either.
14:57
<Philip`>
I'm not sure "objective coolness" is a concept that makes sense
14:58
<takkaria>
dynamicity is a terrible word
14:59
<gsnedders>
takkaria.name = 'bob'
14:59
<gsnedders>
That doesn't seem to work
15:00
<takkaria>
I'm obviously still running NS3. :)
15:00
<gsnedders>
Philip`: Besides, how dare you be kind to MS!
15:00
jcranmer
notes that he actually has used telnet to check email, but only because he's trying to write an IMAP server and needs to correlate with a real IMAP server
15:01
gsnedders
is listening to Finding My Way by Rush from Rush
15:01
<gsnedders>
Hmm, that had the undesired result
15:01
jcranmer
also notes that /.'s knee-jerk reaction to MS is often unwarranted
15:01
gsnedders
also notes that /.'s knee-jerk reaction to most things is often unwarranted :)
15:02
Philip`
notes that knee-jerk reactions in general are often unwarranted
15:04
jcranmer
notes that /me seems to be popular today
15:04
<Philip`>
takkaria: http://rubyhacker.com/coralbook/dynam.html is long enough to serve as adequate defence of my use of the word :-)
15:06
gsnedders
notes the comments on digg are stupid
15:06
<gsnedders>
Godwin's Law invoked on the first comment.
15:08
<gsnedders>
And factually incorrect.
15:08
<gsnedders>
I'll be dugg down for saying why Hitler did actually hate the Jews, but so is life
15:10
<jcranmer>
logic + /. / digg / etc. = NaN
15:12
<gsnedders>
:P
15:13
<gsnedders>
Lesson one of digg: Thou shalt not post the truth.
15:13
<Philip`>
Lesson zero: Thou shalt not post.
15:14
<gsnedders>
:)
15:14
<Philip`>
Saves an awful lot of time and stress
15:14
<gsnedders>
It amazes me what manages to get dugg up at times though
15:16
<gsnedders>
Like, at time defending MS and putting down F/OSS gets dugg up.
15:38
<takkaria>
jcranmer: are IMAP servers not remotely like what the spec says they should be, then?
15:38
<takkaria>
the first rule of digg is actually to not look at digg, fwiw
15:40
<takkaria>
Philip`: it's still an ugly word without a nice-sounding pronounciation
15:41
<jcranmer>
takkaria: the spec is one of the most obfuscated I've ever read
15:41
<jcranmer>
if I were grading it for organization, I'd think a C would be on the high side
15:42
<takkaria>
I read it through when I was going to implement a webmail app but never got round to it
15:43
<takkaria>
my favpurite bit was always the modified UTF-7 encoding
15:43
<Philip`>
takkaria: Pronouncing it kind of like "diner-MIcity" sounds reasonable to me
15:44
<jcranmer>
takkaria: fortunately, there's a draft to actually wave it all off and make it UTF-8
15:45
<takkaria>
jcranmer: oh, really? that means I might get round to writing my webmail app then
15:45
<Philip`>
GIMPLE is fun
15:45
<Philip`>
*not entirely
15:45
<jcranmer>
unfortunately, knowing IETF, it will take a year or so before it actually becomes an RFC
17:08
<zcorpan_>
is there a way to get larger extracts from google alerts?
17:45
<virtuelv>
*sigh* twitterspamfollowers seriously all need to go die in a fire
17:45
<virtuelv>
pronto
18:25
<Hixie>
i just realised that the svgwg's proposal has a giant hole
18:25
<Hixie>
it specifies that the parser should bail as soon as a well-formedness error is hit
18:25
<Hixie>
but nothing defines where that error is
18:25
<Hixie>
as far as i can tell
18:27
<Philip`>
That sounds easy - just define it as the earliest point such that no well-formed XML document could begin with the characters up to that point
18:28
<Hixie>
yeah, that could work
18:28
<gsnedders>
Philip`: That'd require the entire document to be well-formed XML, thoguh
18:28
<gsnedders>
*though
18:29
<Hixie>
nah, you know when the xml stream starts
18:30
<Philip`>
gsnedders: just define it as the earliest point such that no well-formed XML document could begin with the characters from the start of the magic XML-triggering element up to that point
18:30
<gsnedders>
That's different :P
18:30
<Philip`>
Only if you're unnecessarily pedantic and ignore what I meant :-p
18:31
<gsnedders>
That'd be me :P
18:31
Philip`
plays with floating point stuff, and discovers the 'nextafter' function, which is exciting since he never knew such a thing existed
18:32
<Hixie>
neat
18:32
<gsnedders>
Philip`: in what?
18:32
<Philip`>
gsnedders: C
18:32
<gsnedders>
eww.
18:32
gsnedders
runs
18:32
<gsnedders>
No, I should actually do something about learning C
18:33
<Philip`>
(I'm actually playing with floating point stuff in JS, so I've added a native function to expose nextafter to my scripts)
18:34
<Philip`>
(It's slightly annoying that e.g. Math.cos(DBL_MAX) == 0.905781 or 1.79769e+308 depending on compiler optimisations)
18:35
<gsnedders>
DBL_MAX?
18:35
<Philip`>
Oh, that's a C thing too
18:35
<Hixie>
does anyone know of any UAs that handle rel=alternate other than for feed autodetection and stylesheet declarations?
18:35
<Philip`>
It's just the maximum finite double
18:51
<smedero>
Hixie: rel=alternate for Opera Widgets: http://virtuelvis.com/archives/2006/07/widget-autodiscovery
18:51
<smedero>
not sure if that's still valid or not.
18:51
<smedero>
(as in, whether Opera 9.5 supports it...)
18:52
<Hixie>
cool thanks
18:54
<smedero>
Also, didn't IE implement something like uh <link rel="alternate" media="print" href="print-version.html">
18:54
<Hixie>
did they?
18:54
<smedero>
I'm vaguely remembering some half-baked feature... sadly I'm not seeing anything official in msdn land...
18:55
<Hixie>
no worries
18:56
<smedero>
This page suggest IE4 supported something like that: http://www.dynamicdrive.com/dynamicindex9/printstyle.htm
19:29
<virtuelv>
smedero: still valid, supported, and I think there's a note in one of the widget specs as well
19:29
<takkaria>
Philip`: sam ruby is doing a Decimal class, I believe, to help with that kind of thing
19:30
<virtuelv>
no, we changed that to rel="widget" http://dev.w3.org/2006/waf/widgets/#appendix
19:34
<Philip`>
takkaria: Unfortunately I need to guarantee that any arbitrary script will always give precisely the same result, so I need normal JS Numbers to work
19:35
<Philip`>
(I need to guarantee some C++ code always gives precisely the same result too, but that's easier since it can just be rewritten with fixed-point maths)
19:35
<takkaria>
Philip`: fair enough, just thought I'd mention it
19:36
<Philip`>
The most obvious problem I've seen is that (-0) % 1 == either 0 or -0 depending on compiler optimisations
19:37
<Philip`>
Also Math.pow(-1, 1e36) is NaN in GCC but 0 in MSVC
19:38
gsnedders
attempts to validate http://stuff.gsnedders.com/spec-gen/html5.html
19:38
<Philip`>
and a load of functions give different answers in the 16th decimal place
19:51
<Hixie>
gsnedders: i just mistook your version for the whatwg.org copy, so that's a good sign :-)
19:51
<gsnedders>
:)
19:52
<gsnedders>
It's creating duplicate IDs, which isn't.
19:52
<Hixie>
search for "(meaning that a regular </a> end tag"
19:53
<Hixie>
why is that linked?
19:53
gsnedders
wonders how that isn't linked in the original
19:54
<gsnedders>
hmm.
19:54
<gsnedders>
Stripping non-alphanumberic/space characters in the term, is the answer
19:54
<Hixie>
oh this is with w3c-compat enabled?
19:54
<gsnedders>
Yeah
19:54
<Hixie>
ah
19:54
<gsnedders>
But that behaviour still isn't w3c-compat
19:54
<gsnedders>
Hmm.
20:00
<gsnedders>
Why on earth am I creating duplicate IDs?
20:04
<gsnedders>
Huh.
20:04
<gsnedders>
This makes absolutely no sense.
20:05
<Hixie>
what are some of the duplicates?
20:05
<Hixie>
maybe i have "foo-bar" and "foo bar" as two different title attributes and you turn them both into "foo-bar"?
20:06
<gsnedders>
That shouldn't be an issue.
20:08
<Hixie>
it strikes me that http://www.w3.org/TR/css3-selectors/#UIstates doesn't actually define what :enabled and :disabled actually match
20:10
<gsnedders>
'HtmlElement' object has no attribute 'getroot'
20:10
gsnedders
stabs lxml, again
20:10
<gsnedders>
Oh, I see.
20:10
<gsnedders>
Element.getroottree().getroot()
20:20
gsnedders
fixes that bug
20:23
<gsnedders>
OK, the only validation errors now are either Hixie's fault or just me not making the ID valid per HTML 4.01
20:23
<gsnedders>
The former by definition are somebody else's problem, and the latter I better fix.
20:23
<Hixie>
i run the html5 validator every time i check in
20:23
<Hixie>
and right now the only error is the doctype
20:23
<Hixie>
as far as i know
20:24
<gsnedders>
Hixie: As HTML 5?
20:24
<Hixie>
yes
20:24
<gsnedders>
That makes a difference :)
20:24
Hixie
just fixed the whatwg version's doctype to be html5 too :-P
20:24
<Hixie>
(not checked in yet)
20:24
<gsnedders>
Then I don't have it, seeming I just work from SVN :P
20:24
<Hixie>
:-)
20:25
<gsnedders>
The only errors are <script> missing @type, and a table having no tbody (for lack of <!--CHARACTER-REFERENCES-->)
20:26
<Hixie>
ah ok good
20:26
<gsnedders>
And then what I've broken :)
20:26
<gsnedders>
HTML 5 allows everything except spaces in @id, right?
20:27
Hixie
looks
20:27
gsnedders
is just checking he isn't being really dumb
20:27
<Hixie>
The value must be unique in the subtree within which the element finds itself and must contain at least one character. The value must not contain any space characters.
20:27
<gsnedders>
Yeah, I have that in front of me.
20:27
<gsnedders>
Not in the WHATWG or W3C copy, though :)
20:27
<Hixie>
hm?
20:27
<gsnedders>
my copy :P
20:27
<Hixie>
aah
20:28
<Hixie>
my brain doesn't work so early in the morning
20:28
<gsnedders>
Hixie: But it isn't even morning in SF. :P
20:29
<gsnedders>
(I use SVN because then I can just change whatwg-header once to use absolute URLs, and then SVN takes care when updating it)
20:29
gsnedders
wonders
20:29
<gsnedders>
Do I default to HTML 5 @id, or HTML 4.01 @id?
20:30
<Hixie>
what characters are you outputting that aren't valid in html4?
20:30
<Hixie>
also why is my web server under such high load suddenly
20:31
<gsnedders>
Hixie: 'ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").'
20:32
<gsnedders>
And I just follow HTML 5 currently
20:32
<gsnedders>
Hixie: Not me
20:33
<Hixie>
w3c is being slow too -- 49 seconds to gen the spec!
20:33
<Hixie>
normally it's like 10
20:34
<gsnedders>
I can do it in a few seconds here in w3c-compat, in around 4s when not
20:34
<Hixie>
still slow, but much faster than w3c :-)
20:34
<gsnedders>
There again, I'm not reliant on anybody else's computer :)
20:34
<Hixie>
ok shouldn't be any conformance errors now
20:35
gsnedders
runs `make upload -j 10`
20:35
<Hixie>
ok i'm going to eat lunch. back later.
20:35
<gsnedders>
(10 is just an arbitrary number, as it only ever does 3/4 things at once)
20:51
<Philip`>
gsnedders: Only three quarters of a thing?
20:51
<gsnedders>
Philip`: three or four
20:55
<Philip`>
You could run "make -j" instead of "make -j 10", to make it do as many things as possible
21:07
<gsnedders>
spec-gen 1.0a2 available today!111!!!eleventy!
23:47
<gsnedders>
Hixie: I can't see why "meaning that a regular </a> end tag" isn't linked in the postprocessor
23:49
<Hixie>
no idea
23:49
<gsnedders>
(thus I won't fix the fact it isn't in my copy)
23:49
<gsnedders>
(in compat.)
23:53
<gsnedders>
Hixie: http://pastebin.ca/1078900 — those need to be fixed
23:54
<Hixie>
cool thanks
23:54
<Hixie>
will do
23:54
<gsnedders>
Then no need for --w3c-compat for HTML5 :)
23:57
Philip`
's attempt to test floating point numbers in SpiderMonkey ends up finding a buffer overflow in SpiderMonkey instead :-(
23:58
<gsnedders>
:D