[09:47] <mandel> morning !
[09:53] <czajkowski> aloha
[10:00] <JamesTait> Merry Friday, everyone! :)
[10:01] <mandel> JamesTait, same to you
[10:02] <JamesTait> Weather is wet and miserable here today. On the plus side, though, I'm not out in it, and it does mean I won't have to keep adjusting the blinds to keep the sun out of my eyes.
[11:37] <gatox> good morning!
[11:40] <ThomS> morning
[11:53] <mandel> gatox, morning!
[11:53] <mandel> gatox, I wanted to do some FF work, but I want to sort out the windows builds first
[11:53] <gatox> mandel, how are you?
[11:53] <mandel> gatox, I hate wasting time on that :P
[11:53] <mandel> gatox, as always, fine :)
[11:54] <gatox> mandel, yes.... i have several things to do too....... and create the bunndle, the script is throwing some exceptions..... so i'm working on that.... i think that im going to sacrifice ninja this weekend and go ahead with the FF project :P
[11:55] <mandel> gatox, sounds good, did you get my tweet about ninjas?/
[11:56] <gatox> mandel, yes..... i twitted that yesterday too :P
[11:57] <mandel> gatox, really, I missed it lol
[11:57] <mandel> gatox, ok, I'm getting back tot he crazy build-bot idea I have :)
[11:57] <gatox> mandel, jejeje yes....... that ninja fight is amazing!! jeje
[11:57] <gatox> mandel, roger that
[12:12] <nessita> buenos d'ias!
[12:14] <gatox> nessita, buenas
[12:15] <nessita> will restart the session, the keyborad layout is screwed up
[12:45] <alecu> hello #ubuntuone!
[12:52] <gatox> alecu, hi
[13:00] <gatox> @ping
[13:00] <ubot4`> pong
[13:03] <alecu> @ponga
[13:07] <mandel> alecu, buenos dias!
[13:08] <mandel> gatox, the projects we depend when building for windows are ubuntuone-client, ubuntu-sso-client and ubuntuone-windows-installer, right?
[13:09] <gatox> mandel, u1-cp and storage
[13:09] <gatox> too
[13:09] <mandel> and, I forgot about storage, I had cp :)
[13:10] <mandel> gatox, cool, now my little bot is listening to changes to the trunk of those projects :)
[13:10] <gatox> mandel, coollllllll
[13:10] <mandel> gatox, in theory, if we get a new revno on those, he will know he needs to create a new build :)
[13:12] <gatox> mandel, are you testing the script to create the bundle?? i was waiting for roberto, because the script is not working here..... and reading the doc of shutil.copytree it shouldn't work.... it needs some minor modifications.... but i wanted to check with roberto
[13:13] <mandel> gatox, I'm not there jet, atm I'm listening to change by subscribing the bot to email notifications from lp. Then I used twisted to read the inbox and process those email that have not yet been read
[13:13] <mandel> gatox, processing the change is mainly using the script
[13:14] <gatox> mandel, cool..... i hope to get this working after talking with roberto before you reach that part
[13:14] <mandel> gatox, that would be perfect
[13:19] <ralsina> good (late) morning!
[13:23] <mandel> ralsina, morning!
[13:24] <mandel> ralsina, so, gatox and I are working on getting the situation of the windows build in order
[13:25] <mandel> ralsina, gatox is looking at the build script and he has some issues, at the same time I have a little bot that listens to lp mail notifications on any changes of the projects branches and uses the build script
[13:25] <mandel> can you help gatox with the script so that I can focus on the other things?
[13:26] <gatox> mandel, i'm talking with ralsina
[13:26] <gatox> on mumble
[13:26] <mandel> ack
[13:27] <ralsina> gatox: https://pastebin.canonical.com/58510/
[13:28] <ralsina> gatox: wait, wrong fragment
[13:28] <gatox> :P
[13:29] <ralsina> https://pastebin.canonical.com/58511/
[13:29] <ralsina> gatox: ^
[13:29] <gatox> ralsina, thanks!
[13:30] <ralsina> gatox: sorry for wasting your time. I blame manuel! ;-)
[13:31] <gatox> ralsina, jejeje no problem!
[13:42] <mandel> ok, lunch for me
[13:42]  * mandel lunch
[13:42] <mandel> gatox, we talk about that when I get back, ok?
[13:43] <gatox> mandel, about what?
[13:43] <mandel> gatox, building the .exe
[13:43] <gatox> mandel, ah ok.... i'm with that
[14:23] <gatox> ralsina, question: i'm getting this: "ImportError: No module named google" do you know what might be going on? i thought it was protobuf.. but now i have it and keep happening.... and searching for that in google is not very useful :P
[14:24] <dobey> gatox: a) use quotes to search for the whole string on google. b) it's protobuf
[14:25] <dobey> gatox: maybe it's not in your PYTHONPATH?
[14:25] <gatox> dobey, yes..... i use quotes.....
[14:27] <ralsina> gatox: missing protobuf
[14:27] <ralsina> gatox: maybe missing protoc.exe ?
[14:27] <gatox> ralsina, i have it too.... and i can do "import google" in a console..... but for some reason py2exe is not finding it
[14:27] <ralsina> gatox: is it an egg?
[14:28] <ralsina> gatox: I remember I had to install it using python setup.py install_lib
[14:28] <gatox> ralsina, ahhhhhhhh that is probably the problem
[14:28] <gatox> i just did: python setup.py install
[14:29] <gatox> ralsina, yes..... it's an egg
[14:29] <gatox> ralsina, thakns
[14:29] <ralsina> gatox: delete it and use install_lib that should fixit
[14:58] <mandel> ralsina, dpo we have a standup today?
[14:59] <ralsina> mandel: yes
[14:59] <mandel> ralsina, on then callLater(me, 1)
[14:59] <ralsina> so, mandel, alecu, nessita, dobey, gatox,briancurtin: standup in 1' ;-)
[14:59] <alecu> sure
[15:00] <mandel> me
[15:01] <nessita> me
[15:01] <briancurtin> me
[15:01] <nessita> @ping
[15:01] <ubot4`> pong
[15:01] <alecu> me
[15:01] <nessita> (my internet provider is sucking big time today, so I may answer with some delay)
[15:02] <nessita> gatox, ralsina, do: standup?
[15:02] <nessita> dobey: ^
[15:02] <gatox> me
[15:02] <ralsina> me
[15:02] <dobey> meh
[15:03] <nessita> DONE: lots of reviews, team call, postponed 1-1 with ralsina, more on have sso spawn a process
[15:03] <nessita> TODO: freaky friday: have the SSO GTK UI use GTK gi bindings, have controlpanel use the SSO webclient
[15:03] <nessita> BLOCKED: nopes
[15:03] <nessita> NEXT: mandel
[15:03] <mandel> DONE: worked with sidnei in getting jenkins to work with ubuntuone-client on windows. atm there are 3 failing tests :(. Worked on automating even more the build of the .exe
[15:03] <mandel> TODO: more on the .exe
[15:03] <mandel> BLOCKED: no :)
[15:03] <mandel> next: nessita
[15:03] <mandel> ups, next briancurtin
[15:03] <mandel> :P
[15:03] <briancurtin> DONE: proposed my first merge (a one liner :), got most projects building/testing successfully via buildout, added a way to download protobuf-compiler (may change how this happens, though)
[15:03] <briancurtin> TODO: figure out why installing the distribution is hanging, push on with getting the rest of the tests to run, move the env pre-setup stuff from batch file to python script.
[15:03] <briancurtin> BLOCKED: none
[15:03] <briancurtin> NEXT: alecu
[15:03] <alecu> DONE: team meeting, review for mandel, fixing tests and IRL of restful replacement
[15:03] <alecu> TODO: a bit more restful, freaky friday
[15:03] <alecu> BLOCKED: no
[15:03] <alecu> NEXT: gatox
[15:03] <gatox> DONE:
[15:03] <gatox> 1-1 with ralsina, working in several branches to get them ready. Create an environment specially to build the bundles.
[15:03] <gatox> TODO:
[15:03] <gatox> Almost done with the bundle.
[15:03] <gatox> BLOCKED:
[15:03] <gatox> No
[15:03] <gatox> ralsina, go
[15:03] <ralsina> DONE: calls, calls, calls, reviews, bureaucracy, little bit of code TODO: tweaks, contractor, CV reviews, mac interview, call with matt, etc etc BLOCKED: no
[15:03] <ralsina> dobey: !
[15:04] <dobey> NE: u1ms design call, more releases
[15:04] <dobey> λ TODO: hack day
[15:04] <dobey> λ BLCK: None.
[15:04] <dobey> wtf
[15:04] <mandel> tfw?
[15:05] <dobey> it wouldn't select all the characters to copy
[15:05] <dobey> weird
[15:10] <alecu> nessita, ping
[15:10] <alecu> nessita, I think I found a bug in the tests in sso, can you please help me confirm it?
[15:11] <alecu> nessita, in ubuntu_sso/main/tests/test_common.py, fake_err_thread_execute does except_to_errdict, but I think it should not be doing that.
[15:12] <nessita> alecu: let me check
[15:13] <nessita> alecu: you' re right, it should not do that
[15:14] <alecu> nessita, I'm getting rid of thread_execute in my branch, but I want to confirm, because the tests should change
[15:14] <alecu> nessita, great, thanks!
[15:14] <nessita> alecu: it should not call except_to_errdict
[15:14] <nessita> :-)
[15:36] <nessita> alecu: do you have a working branch for that? I would like to try it, since in the branch I' m working on that part has stoppped working
[15:36] <nessita> stopped*
[15:36] <alecu> nessita, in 10 minutes I can upload something
[15:36] <alecu> nessita, and then I'm off to the bank
[15:36] <nessita> alecu: awesome
[15:38] <dobey> alecu: did you figure out the webclient test failures?
[15:39]  * gatox lunch
[15:39] <alecu> dobey, I've been playing all morning with webclient and failures, so I'm confused at to which one you are talking about....
[15:40] <alecu> also, I slept very little in order to take an early morning ferry, so my mind is not at it best today
[15:40] <dobey> alecu: the dirty reactor in the nightlies, that is similar to the issue on windows, but not exactly the same
[15:41] <alecu> dobey, oh, right. No, and sorry, I forgot about it.
[15:45] <ralsina> nessita: I was helping matt with his problems, and it seems it's a different bug that we thought. He had one file that failed, and it seems to have been locking syncdaemon.
[15:45] <ralsina> nessita: he deleted it, and things started moving
[15:45] <dobey> alecu: ok
[15:46] <ralsina> mandel: please read your mail. Specially the ones I send you ;-)
[15:47] <mandel> ralsina, I did get no mail
[15:47] <mandel> ralsina, by the way,. I just realized we forgot our 1-1, right?
[15:47] <ralsina> mandel: let's have it then
[15:48] <mandel> ralsina, is he one about the bug in a funny state?
[15:48] <mandel> ralsina, that I read early in the morning :)
[15:48] <ralsina> mandel: exactly :-)
[15:48] <ralsina> ok, let me rephrase it: answer your email ;-)
[15:48] <mandel> ralsina, well, I have no good answer to that yet, that is why I did not answer it hehe
[15:48] <ralsina> mandel: haha
[15:49] <ralsina> mandel: on mumble whenever you are ready
[15:49] <mandel> ralsina, mejor callar y paracer tonto que hablar y demostralo :P
[15:49] <mandel> ralsina, launching the thing at the moment
[15:51] <dobey> ralsina: ah. the 1-1 thing
[16:03] <alecu> nessita, I've pushed a branch that passes the tests; it still has many lint issues, and I've not IRLd it yet
[16:03] <nessita> alecu: ack, thanks
[16:03] <alecu> nessita, https://code.launchpad.net/~alecu/ubuntu-sso-client/use-restful-client
[16:06] <alecu> ok guys, see you in a few hours.
[16:11] <mandel> dobey, why did you set bug 845659 as released?
[16:11] <ubot4`> Launchpad bug 845659 in ubuntuone-control-panel "Windows: implement the "there is a new version available" notifications (affects: 1) (heat: 7)" [High,Fix released] https://launchpad.net/bugs/845659
[16:12] <mandel> dobey, I don't thing it is, we have the auto-update we don't have he notifications, maybe some bugs got mixed?
[16:14] <dobey> mandel: i don't know. probably because you told me it was released. if it's not change it back
[16:15] <mandel> dobey, ok :)
[16:16] <dobey> i have absolutely no recollection of setting that to fix released
[16:16] <mandel> dobey, the only reason I ask you is because of lp, I was surprised too to see your name
[16:16] <mandel> ok, sorted then :)
[16:17] <mandel> ralsina, the bug set back to in progress to follow a normal life
[16:17] <ralsina> mandel: haha
[16:18] <dobey> mandel: maybe it got mixed up in bugs getting closed for the release, and it was an accident. as the day before was in fact a release day
[16:18] <dobey> at least, that's the only remotely plausible explanation i can come up with
[16:19] <mandel> dobey, seems reasonable, nevertheless is not a big problem, I simply dropped the ball and we got confused :P
[16:19] <dobey> sure
[16:20] <dobey> i share in the confusion :)
[16:23] <dobey> anyway, lunch. bbiab
[17:07] <mandel> ok, EOD and need to walk the dog
[17:08] <gatox> mandel, bye!
[17:08] <mandel> allu2, have a great weekend!
[17:08] <gatox> ralsina, bundle created -> Snapshot -> Backup
[17:08] <ralsina> gatox: awesome!
[17:08] <gatox> mandel, autocomplete problems? :P
[17:08] <briancurtin> have a good weekend mandel
[17:08] <mandel> agh, it was to all :)
[17:13] <dobey> heh
[17:14] <gatox> grrrrrrr problems executing the bundle!!!!1
[17:18] <alecu> gatox, what kind of problems?
[17:20] <gatox> alecu, it says that it doesn't have permissions to open: c:\programfiles\ubuntuone\dist\ubuntuone-installer-qt.exe.log
[17:20] <gatox> i'll try to create the bundle again..... and check if i didn't miss anything..... but i copy everything it says in the readme file
[17:21] <alecu> gatox, it makes sense: for a non admin user that folder should not be writable
[17:21] <gatox> alecu, well.... in my case..... i'm admin and executing the installer as admin..... just to try that......
[17:23] <alecu> gatox, so, probably some other error is being leaked thru the py2exe error handler which is supposed to prevent this, and when that error it's try to be written to that log then it crashes.
[17:23] <alecu> gatox, I think ralsina worked on the py2exe error handler so he might have more idea about this.
[17:24] <gatox> alecu, thanks
[17:24] <gatox> ralsina, do you saw that issue before?
[17:27] <nessita> lunchtime
[18:27] <ralsina> alecu, gatox: I have a hacked py2exe error handler
[18:27] <ralsina> I had forgotten about it
[18:27] <alecu_> ralsina, and you use that while building, right?
[18:27] <gatox> ralsina, so..... this issue was expected to happen or i have something worng?
[18:27] <ralsina> alecu_: yes
[18:27] <ralsina> gatox: it's expected
[18:28] <gatox> ralsina, i feel much better now :P
[18:28] <ralsina> gatox: you can either build it with shell output (it's an option on conf.py)
[18:28] <ralsina> gatox: or get this hacked py2exe file I am pastebining right now :-)
[18:28] <gatox> thanks!
[18:29] <alecu_> gatox, luckily we remembered about it!
[18:29] <alecu_> it's part of our "collective memory"
[18:29] <ralsina> gatox: put this: https://pastebin.canonical.com/58536/ as your boot_common.py in py2exe
[18:29] <gatox> jejeje
[18:29] <gatox> ralsina, thanks!!
[18:29] <gatox> trying again
[18:29] <ralsina> gatox: for test builds it's better to have the sheel output anyway
[18:30] <ralsina> gatox: this was only for release builds, which is why I forgot to tell you ;-)
[18:30] <ralsina> gatox: BTW: did you build this from trunk or from the stable branches?
[18:30] <gatox> ralsina, from trunk
[18:30] <gatox> ralsina, fetch get the branches from trunk
[18:30] <ralsina> gatox: if (now that it works) you could do ne from stable and send it to elopio, I would owe you a beer. Or whatever you cylons drink.
[18:31] <ralsina> gatox: it's configurable :)
[18:31] <gatox> ralsina, jejeje ok..... i'll test it.... and then build it from stable.... once it works it's fast
[18:31] <ralsina> gatox: yes, the first time hurts
[18:31] <ralsina> gatox: then, it doesn't
[18:31] <ralsina> gatox: good thing mandel is gone
[18:32] <gatox> ejejejjejej
[18:32] <gatox> so true
[18:39] <gatox> ralsina, shouldn't the installer being executed after the installation ends?
[18:39] <ralsina> gatox: only if you don't have credentials
[18:40] <gatox> i don't have
[18:40] <gatox> nothing get executed..... so...... keep testing.....
[19:05] <ralsina> briancurtin: a little note: we land the branches using tarmac, and it complains if you leave the commit mesage blank for a branch, so please add a commit message in https://code.launchpad.net/~brian.curtin/ubuntuone-dev-tools/prefer-path/+merge/89475
[19:07] <briancurtin> ralsina: whoops, my bzr config might need a change - it opened notepad.exe for me to add the message, but it looks like it didn't actually appear
[19:07] <briancurtin> i'll update it
[19:08] <ralsina> briancurtin: that's a problem in bzr on windows. Since notepad detaches from the terminal, it believes you are done
[19:08] <briancurtin> i'd prefer vim like i have in hg, so i'll get that setup
[19:08] <gatox> briancurtin, i think ralsina was talking about the commit message, when you complete the merge proposaal
[19:08] <ralsina> briancurtin: but anyway, this commit message is on the branch proposal, andyou do it onlaunchpad, when you propose formerging (hidden in "optional whatever")
[19:09] <briancurtin> i'm about to put it in the commit message right above "Description of the Change" - right?
[19:09] <ralsina> briancurtin: so, use -m , and set the commit message when you propose the branches :-)
[19:09] <ralsina> briancurtin: exactly
[19:48] <gatox> ralsina, finally.... i get it to work..... comtypes was missing
[19:48] <ralsina> gatox: oops
[19:48] <gatox> ralsina, i'm going to try it in a completely clean vm.... to see that every dependency was packaged correctly
[19:49] <ralsina> gatox: cool
[20:12] <ralsina> briancurtin: +1 on your branch
[20:12] <briancurtin> ralsina: thanks
[20:22] <nessita> ralsina, alecu: cry-for-help email sent
[20:22] <ralsina> nessita: reading it
[20:23] <nessita> ralsina: no rush
[20:23] <nessita> ralsina: I have no brain left to do anything
[20:23] <nessita> so, next week
[20:23] <nessita> will make some mate to grab some air
[20:23] <nessita> (hot air from the kitchen that does not have air condionated :-P)
[20:31] <ralsina> nessita: how can I make that branch explode? Starting ubuntu-sso-client from it?
[20:33] <ralsina> nessita: I may have a clue about the QProcess error if I can see it myself :-)
[20:33] <nessita> ralsina: there are 3 branches mentioned in the email, which one you want to explode? :-)
[20:34] <ralsina> nessita: true. How would you trigger the QProcess errors, for example
[20:34] <nessita> ralsina: and the thing about QProcess is not specific to Qt, as you can see in the email, you will get that also for " reply_handler" (a parameter)
[20:35] <nessita> ralsina: can you please first follow the instructions for the first "item"? the one that involves the branch an a custom script
[20:35] <nessita> ralsina: once that' s running, I can give you further instructions
[20:35] <ralsina> nessita:  yes, got that, but am not sure what to expect
[20:35] <nessita> (which are based on those)
[20:35] <nessita> ralsina: so, what do you have so far?
[20:38] <ralsina> nessita: sorry, otp. Let me catch up a bit
[20:38] <guntbert> In my devices list i find several instances of my phone. How can I decide which is the correct one? (i only see simple names, no additional data)
[20:49] <ralsina> nessita: is it important that the script launches the control panel in source form? Or can I make it launch the biary I have installed?
[20:49] <nessita> ralsina: any binary
[20:49] <ralsina> nessita: ack
[20:49] <dobey> guntbert: you can just remove them all, then log into u1 on your phone again. presumably the newest one is the correct one, but that might be easier to discern on the web site than in the app
[20:50] <guntbert> dobey: so I thought too - but I'm obviously too blind to see the devices on the website - where are they?
[20:51] <nessita> guntbert: https://one.ubuntu.com/account/machines/
[20:51] <nessita> :-)
[20:52] <dobey> that
[20:52] <guntbert> nessita: thx
[20:52] <dobey> i was looking for it, but unity is giving me trouble :-/
[20:52] <nessita> dobey: welcome to the club
[20:52] <nessita> I lost the dead keys
[20:52] <nessita> man'i
[20:52] <nessita> mam'a
[20:52] <ralsina> nessita: ok, running the script with "python run.py --qt --gui" I get the control panel
[20:53] <nessita> ralsina: right, so if you close the controlpanel, you will see in the terminal something like
[20:53] <nessita> succes and the exit code (0)
[20:53] <nessita> ralsina: is that so?
[20:53] <ralsina> nessita: yes
[20:54] <nessita> ralsina: ok, so, as you can see in the code, QProcess is well defined, and so is reply_handler inside child_watch
[20:54] <nessita> I' m talking about ubuntu_sso/utils/runner.py
[20:54] <ralsina> nessita: ok
[20:55] <nessita> ralsina: but when I run that code from the sso service itself using the qt mainloop as service loop, I get the NameError I mentioned
[20:55] <ralsina> nessita: ok, how do Ido that?
[20:56] <nessita> ralsina: using the third branch I mentioned, in main/linux.py, you need to change all the code that uses glib to use a QCoreApplication
[20:56] <dobey> i wish i could see what the hell you are talking about :)
[20:56] <nessita> ralsina: I' ll give you specifics in a moment
[20:57] <dobey> mostly, the error trace
[20:57] <ralsina> nessita: the third branch is lp:~nataliabidart/ubuntu-sso-client/execute-ui  ?
[20:57] <nessita> ralsina: yessir
[20:57] <nessita> ralsina:  let me give you some sort of diff for the needed change
[20:58] <dobey> also, i wish i knew what the hell was up with jackd
[21:01] <nessita> ralsina: pushed the changes to revno 848. TO run, do (in linux):
[21:01] <nessita> export PATH=bin/:$PATH
[21:01] <nessita> export PYTHONPATH=.
[21:01] <nessita> export DEBUG=True
[21:01] <nessita> bin/ubuntu-sso-login
[21:01] <nessita> ralsina: and then delete your Ubuntu One credentials and open the controlpanel, and click on the "login" button
[21:02] <ralsina> nessita: I have toswitch to linux and am already EODing :-(
[21:02] <nessita> ralsina: ok, so?
[21:02] <nessita> what can we do?
[21:02] <nessita> next week?
[21:03] <nessita> (all that can be read wrong :-))
[21:03] <ralsina> nessita: so I can't try this. Let's do itmonday morning
[21:03] <nessita> sure. But do you have any ideas that I could try?
[21:07] <nessita> ralsina: before you go, would you have any suggestion about what else can I try?
[21:07] <ralsina> nessita: I am reading the traceback to see if something pops up
[21:08] <nessita> ralsina: ack... anyways, yes, is friday late, so I guess it will be better to continue on Monday
[21:08] <ralsina> nessita: could you pastebin the other traceback, the one where you get NameErrors?
[21:08] <nessita> ralsina: there is no traceback at all but just that
[21:09] <ralsina> nessita: weird
[21:09] <nessita> (among lots of debug message that I expect)
[21:10] <ralsina> lo de que lazr no retorna nunca huele a que no estas entrando en el mismo event loop
[21:10] <nessita> ralsina: when I close the app the lazr returns with the SSL traces I added to the email
[21:10] <ralsina> entonces cuando cerras la UI termina ese segundo loop, y sigue el primero
[21:10] <nessita> hum
[21:11] <nessita> ralsina: but the UI is now a separate process
[21:11] <ralsina> then a blocking call to the process
[21:11] <nessita> ralsina: so the lazr is run in the same loop as the service
[21:13] <nessita> but you gave me the idea to try disabling the thread_execute code
[21:14] <bloodearnest> howdy folks - can anyone tell me if ubuntu one file service works from in china, behind the firewall? I know dropobx doesn't...
[21:15] <ralsina> bloodearnest: let me check
[21:15] <bloodearnest> ralsina: cheers
[21:16] <ralsina> bloodearnest: the web page at least, works
[21:16] <ralsina> bloodearnest: I don't have a way to test it directly though
[21:17] <ralsina> bloodearnest: I could ask in the internal mailing list at canonical, since there are a number of employees in china
[21:27] <nessita> ok, I' m gone crowd
[21:27] <nessita> see ya all on Monday!
[21:36] <alecu> holas!
[21:39] <alecu> no nessita still around, it seems.
[21:39] <briancurtin> alecu: she left a few minutes before you came back
[21:39] <alecu> briancurtin, cool, thanks.