 Ja siis olen tulelpist ja olen pealud kõik on ära iOS-app, tuli see onnud ka ipad, et selle onnud ka iga-päiv, et see ei ole väga kõik põlvab, et see ei ole põlvab, et see ei ole põlvab, et see ei ole põlvab, et see ei ole põlvab, et see ei ole põlvab, et see ei ole põlvab. Kõik kõik kollabora, juba olen maile maast kõik kõik kõik kõik. Tulem tehti. Tulem maast peale. Naturen pärk, kui meil on tues. Korstkompilis, liberafis. Ma ei ole kõik ühvõl. Ma olen kõik, kui meil on kõik. Ühke põhveri, et nüüdka on tihad on põhveri. Juhu ei väga puhaonani röömi põhveri. Siin ei ole põhveri kes. Ei ole põhveri kes, bedegu sabi. Ma huaza palju, mita põhmu osu. Kui on kõige pealeda, maab, nime vaadik. ja sõtlastu ajastanud ka nüüd platforma, olema kõikest, kui autokonfig kõik. Ja kui on see platforma, kui on maak, siis on see püüle, kui on kõikid, kui on kõikid, kui on kõikid ka kõikid, taagetasel. Ja kaandroid, on see püüle, taadast, arcaives ei ole dinamicliibris. Seis on suurid, seda on onnud kõik on Android. Onnud mea, et on IOS ja on app ei läheb minu dinamicliibris. See on saavad kõik. Onnud on saavad, Aga näeb käahud tähti, et on püüv, et teidime, lähebgi kaidile kluid, et on tähti, see främbõrk, et ei ole, siis kui kaidile kluid. Ja kui ei ole tekistelt ühvõll, kui kuskompiilis. Ja koordi selle ei ole nii IOS kodilere, See on ka, juba ei ole kõik, et ei ole jõudu. Tõlpaks, kui kundi kõik on järgid, on aastele aastalist, et on kõikid kauda, et 2014-tus, üleks, et jõudu, et jõudu, et jõudu, teha või saab lieprofisid koorda. Tegel on teha maastu, aga kompanii oli kõivad ja see ei ole kõigud. Tegel on see, et see ei onnud, et see on see, et see ei onnud, et see ei ole kõigud. Meil oli testab for IOS, et kõik kõik kõik või peab, ja jõn õversen, jõu kõik TDF. Kõik kõik kõik kõik või peab, aga see ei kõik kõik või peab. Ja kõik kõik kõik kõik kõik kõik või peab. 2018, kõik kõik kõik või peab, The idea to use the collaborative online code base for this kind of app was introduced and it uses both the C++ code from online and also the javascript user interface. And thanks to Nikolas and Adfitis for funding this stuff. Libra Office Kit, et teed, et olid, et olid, et olid, et olid, mis teed, et olid, et ka jõud, ka mõtmast, ka kõik, ka tõlmast ja ka sõhvast kõik, ta on ka läheb, ja teda, et siin tõhvast, kas teed, ja see on saavad, et on või, et olid, ka tõlmast, ka ka mõtmast, ka ka mõtmast, kaabnast põhselt, et siin tehta kõik või tehturikus. Kolaboras online lihtsvõi, kui tehtu kaab või on oma, see on palju proosist. See on maastar proosist, WSD. Ja websocket demonil. See on või või kaab proosist ja see on ka kaabnast, kui tehtu kõik oma, ja on üle kaidus, kui on kõikid. Ja kaidus ja kaidus on laukas javaskriptin kliit ja kaidus. Kui on kõikidus ja kaidus ja kaidus ja kaidus on kõikidus, kui on kõikidus, kui on kui kõikidus view of TCP sockets. And also the communication between these processes on the server is using web sockets. And here is the city hall in Malaga, very nice building. And then if you want to combine all this into one iOS app, you need to run both the core LibraFish code ja seda seda seda C++ koodi või online, seda seda proses, ja seda nativ iOS koodi seda seda interfesioida, või bits ja javaskripta. Ja seda platformi seda seda seda koodi või objektiv C, või objektiv C++ või seda koodi või seda, või seda seda objektiv C ja objektiv C++ ja seda või seda librafiskid API või seda seda ja teda ei kõik kõik või seda HTML-page online ja javaskript taba või või või webkit, webview Aas, et see võib läheb teidab kõikid hiid,Onakus on kõikid, eda seet, et see see on ka ei tule. Ja siis on naenud läheb, nii on see aga kõikid, ka et Madadi näheb et, auhti類i, teadepis on oha nii laukue on ta teid, ta see ta teidab, nii mekanistus kõikime jahvele ja nativislutis. Ja taht, et ülle põhvada on siit põhvada. WSD ja röökarad, et jahvele, ei tule nii sokkid, seda ei ole, ka oleks ka oleks, kui on see, jahe-põhvada, põhvada ja... Ja kui. Ja, kundit all about Android already and there is also a very simple GTK plus app that can be used if you want to check this out but don't have any mobile device or want to just use your Linux machine for it. Then you build the core LibreOffice, all these static libraries are put in the file or a list of their names and that is then used when linking the app in Xcode. As we don't do any dynamic linking all the mapping from a UNO component name or constructor name or whatever to actual code has to be through a static map. And here is how the file list or list of these libraries looks a part of it. And here is the linker command line that Xcode generates the thing in bold mode there in the middle is the file list that is passed to it. And here is part of the core code that calls the function pointer that looks up from the map. And that's Alhambra. And these maps from UNO component names to function pointers is generated by a Python script. This script is a bit ad hoc written and always when you notice that something is missing at runtime when you run the app you need to add one more line to that script. But otherwise for instance all the configuration files, the RC files exist in the app more or less like in normal LibreOffice. And here for instance you see what the Python script uses it. It has this list of library names and corresponding UNO component creation function and more of the same and blah blah blah. And this is for the well did, no this is for the non well did widgets or controls. Oops, well there is some tapas. I missed one slide. Yeah, but now it's the same. Then I thought I would show some code also. Let's see what time it is. Well, I can show something. When it starts it needs to initialize various things. Let me start X code. Or maybe it's not a good idea to show much code. Let me just continue this. The initialization is not very complicated. The interesting thing is that when it creates this object that corresponds to the WSD process in real online it just starts a thread that creates such an object and lets it run and when it exits it creates a new one and runs that and so on. When the app starts it shows you first document browser and at least on iOS this was very trivial to do because you can use the system libraries to get this for free kind of and you can browse local files or files on any so called file storage extension or file storage provider or something. So that if you have for instance installed next cloud on your iOS device you can browse also documents in next cloud and the same for own cloud I guess. And also documents in this iCloud drive that are shared then with your Macs and iOS devices. And when document then is selected it creates a controller for this and the name of the document or the URL of it is passed to this HTML file that then loads all the JavaScript and then the actual startup of this application is a bit complicated. Because it has to correspond to what happens in the browser in normal online where the JavaScript code sends a separate get request but there is no. But anyway it's not really the same but it looks more or less the same from the point of view of most of the JavaScript code. And this send to JS and function is what sends a message to the JavaScript. It's as can be described for the Android app. It executes one line of JavaScript or one expression. And in this file you have the code that receives these messages that the JavaScript code invokes in the app native code. The HTML file is actually generated from an M4 file which is quite interesting but it's mostly the same as in normal online. This M4 is used to get some conditional context contents into it. Localization of the app is much different from normal online because we have all the localizations all the time available. All the translated strings are combined into one JavaScript structure that's part of the code that is loaded. While in normal online it does the translations at runtime from the server I think. Or maybe note that it loads only the translation actually used by the user for his language. And here is some details about this. The same fake paper sockets are used here also compared to normal online on a mobile device. We use a bit more. We have more screen real estate to use and for instance the menu bar is shown all the time. And the pool bar is at the top while on the iPhone or on Android phones it's on the bottom. And some of the things that the JavaScript does in normal online using HTTP cannot use that in an app. Because there is no web server involved so these have to be handled differently. And when you build the app it's several steps. First you build the core repository parts and this produces the static archives. And then at the moment when I build the JavaScript bits I do it on a Linux machine because I didn't want to install some NPM and whatever things on my Mac without knowing how much they will disturb my other stuff or possibly. Corrupt my environment or whatever. So I do that on a Linux machine but it could be done on the Mac also. And this generates one bundle.js that is then copied over to the Mac. And the online C++ and objective C parts are compiled just in Xcode using the normal click-to-click mechanism. And debugging this is quite easy actually. You can debug it inside Xcode where you have built it and you can set breakpoints in the core code or in the objective C code. If you want to debug the JavaScript code you need to use the Mac for that and if you have the iPad connected to your Mac as you must have when you run Xcode on the Mac. You can just use the develop menu in Safari and you will see the name of your iPad and the name of the HTML page being shown in the app and then you can browse the JavaScript code and set breakpoints and so on. And you notice when you get unquote exceptions and that's all. Thank you.