WEBVTT

00:00.000 --> 00:11.480
So, today I am here to talk about interactive and collaborative client-side GIS and Jupyter

00:11.480 --> 00:12.480
Lab.

00:12.480 --> 00:21.920
So, I will discuss the problem statement first and what we are trying to solve and then

00:21.920 --> 00:25.320
walk through the architecture and some concrete workflows.

00:26.200 --> 00:28.920
So, let us first discuss about the current model.

00:28.920 --> 00:36.920
So, many geospital workflows still assume desktop first local single use single user environment.

00:36.920 --> 00:43.000
So, these two tools are most prominent tools in the ecosystem right now and both of these

00:43.000 --> 00:49.320
tools are so powerful and so efficient for use for single user to use.

00:49.320 --> 00:53.360
But with the power they come with a cost as well.

00:54.360 --> 00:56.360
GIS lives in a local machine.

00:56.360 --> 01:01.360
Users need to handle installation dependencies and configuration themselves manually.

01:01.360 --> 01:07.360
And this adds a lot of friction while sharing workflows and reproducing the same.

01:07.360 --> 01:11.360
And while teaching new users.

01:11.360 --> 01:15.360
These tools are driven through the rich desktop interfaces.

01:15.360 --> 01:19.360
These rich desktop interfaces are very powerful and very efficient.

01:19.360 --> 01:24.160
But they are quite overwhelming when you are a beginner and a new user getting started

01:24.160 --> 01:25.400
with these tools.

01:25.400 --> 01:34.360
You can see that there are a couple of tool bars and some nice have to populate it panels.

01:34.360 --> 01:38.600
And collaboration still relies on sharing files manually which creates a lot of friction

01:38.600 --> 01:43.920
because files are still shared by emails, get out drives and they are difficult to iterate

01:43.920 --> 01:47.960
when multiple users are working on them and when you are working on something that requires

01:47.960 --> 01:49.960
multiple people to work on it.

01:49.960 --> 01:53.960
It creates a lot of friction and back-and-forth.

01:53.960 --> 01:58.520
And consider I am working on an environment where my computation environment and my visualization

01:58.520 --> 01:59.960
environment are separate.

01:59.960 --> 02:05.960
So, then I need to do a lot of back-and-forth to between my visualization tool and my computation tool.

02:05.960 --> 02:11.960
Such as when I am using geo pandas in a python environment and I am using this.

02:11.960 --> 02:14.960
I am using QGS to visualize the same.

02:14.960 --> 02:20.960
This separation slows down the workflows and makes reproducibility very hard.

02:20.960 --> 02:23.960
So, here comes Jupiter into the picture.

02:23.960 --> 02:27.960
Jupiter already changed how we work with data.

02:27.960 --> 02:32.960
And as we know, notebooks are very reproducible and computational documents.

02:32.960 --> 02:36.960
All your code, data outputs and narrative all is in one place.

02:36.960 --> 02:41.960
So, you can share your story with a single notebook with a single document.

02:41.960 --> 02:46.960
Notebooks are very easily shareable and reproducible from one user to another.

02:46.960 --> 02:53.960
And they run on your desktop or on your browser as well as per your liking.

02:53.960 --> 02:58.960
It creates a seamless environment where the computation and its story lives together, making

02:58.960 --> 03:05.960
analyzes and analysis easier and to reproduce and analysis easier to reproduce and understand.

03:06.960 --> 03:09.960
Notebooks are not only reproducible.

03:09.960 --> 03:12.960
They are also collaborative thanks to Jupiter collaboration.

03:12.960 --> 03:17.960
Jupiter collaboration enables live multi-user editing and the real-time collaboration

03:17.960 --> 03:23.960
inside your notebook and it files format called .JGIS.

03:23.960 --> 03:29.960
It is a JSON based representation of the entire GIS state that we represent on the map.

03:29.960 --> 03:36.960
It is a fully contained file structure that contains your layers, your symbology, your collaborative

03:36.960 --> 03:38.960
metadata and your user config.

03:38.960 --> 03:44.960
Layers are live, editable objects and symbology updates instantly because it is collaborative

03:44.960 --> 03:52.960
and analysis can run directly inside the notebook.

03:52.960 --> 03:58.960
So, let us understand a bit how Jupiter GIS works and let me give you a brief overview of the

03:58.960 --> 04:01.960
architecture that we have on Jupiter GIS.

04:01.960 --> 04:07.960
So, we merely divide Jupiter GIS into three components, first of which is rendering.

04:07.960 --> 04:14.960
So, for rendering we use open layers that enables us to dynamically render vector and

04:14.960 --> 04:18.960
raster data and also to dynamically style style it.

04:18.960 --> 04:23.960
And for the second, secondly we have analysis component for the analysis path we use

04:24.960 --> 04:26.960
gdile compiled to web assembly.

04:26.960 --> 04:32.960
It also enables us to do a lot of things inside the browser itself and some of the examples

04:32.960 --> 04:38.960
are that we can do processing right inside the browser such as buffer, dissolve, rasterization

04:38.960 --> 04:39.960
etc.

04:39.960 --> 04:43.960
And third and the most important component is obviously collaboration.

04:43.960 --> 04:50.960
We use YJC addities to enable live multi-user editing without conflicts and live

04:50.960 --> 04:55.960
synchronization between multiple user sitting different parts of the world.

04:55.960 --> 05:01.960
And in all of this that dot gdice file works as a single source of truth for the entire

05:01.960 --> 05:04.960
GIS state that you are working in.

05:04.960 --> 05:13.960
So, now that we know how Jupiter GIS works lets dive a little bit into the demo and see

05:13.960 --> 05:19.960
how it works and what other things that we can do with Jupiter GIS.

05:19.960 --> 05:34.960
So, when you would open Jupiter GIS in your just give me a second.

05:34.960 --> 05:43.960
So, when you would open Jupiter GIS you would see a window like this and here is your

05:43.960 --> 05:49.960
Saturn to create a GIS project by clicking on which your GIS project will create and you

05:49.960 --> 05:56.960
would see a nice UI with a single toolbar that is not too overwhelming with some like you

05:56.960 --> 06:03.960
can see that these panels are not those populated like not that populated as I shown previously.

06:03.960 --> 06:09.960
So, in this toolbar we have some buttons I will later explain in the demo what we can do

06:09.960 --> 06:10.960
with these buttons.

06:10.960 --> 06:15.960
But, for now we can look into the layer browser with the help of layer browser you have

06:15.960 --> 06:18.960
many example base maps that you can add to your map.

06:18.960 --> 06:27.960
I will just add open sheet map and see how it looks.

06:27.960 --> 06:34.960
Next we have so, Jupiter GIS comes with vector and like vector and raster data support.

06:35.960 --> 06:41.960
You can directly load your vector and raster data either it is either it is saved locally

06:41.960 --> 06:50.960
or it is served on cloud.

06:50.960 --> 06:55.960
Next so, I want to show sphere.

06:55.960 --> 07:01.960
So, in this visualization so, this is live demo working inside the presentation only.

07:01.960 --> 07:08.960
It is I frame I frame so, these blue dots are vector data representing some vector data

07:08.960 --> 07:15.960
and this green layer you see is the raster data that I can toggle it on and off I can just

07:15.960 --> 07:27.960
see the vector data if I want I can zoom in and same I can do with the raster data as well.

07:28.960 --> 07:32.960
So, next we have so, we also support because we use open layers.

07:32.960 --> 07:36.960
We also support advanced symbology with vector data.

07:36.960 --> 07:38.960
So, I would like to show you how it works.

07:38.960 --> 07:44.960
So, I would select this layer and right click on it and you see this option to add it

07:44.960 --> 07:50.960
symbology I would select this and I would select a symbology style based upon my like

07:51.960 --> 07:54.960
I would select graduated.

07:54.960 --> 08:01.960
The value for which I want to classify my symbology would be magnitude of earthquake

08:01.960 --> 08:06.960
and I would select a nice color them based upon my liking may be select cool

08:06.960 --> 08:11.960
and I would classify it would automatically classify your data based upon the ranges of

08:11.960 --> 08:16.960
magnitude like for instance this is magnitude and I would apply this symbology and you

08:16.960 --> 08:25.960
can see my layer has been updated with the nice symbology.

08:25.960 --> 08:30.960
Exactly similar to vector data you can also style raster data as well.

08:30.960 --> 08:35.960
You can do single bands symbology and multi band rendering or two raster data.

08:35.960 --> 08:42.960
So, similarly I would select my layer and I would do the same to add it symbology it

08:42.960 --> 08:43.960
would open up our dialog box.

08:43.960 --> 08:49.960
This time the options are a little different because obviously it is raster data raster

08:49.960 --> 08:50.960
data.

08:50.960 --> 08:57.960
So, I would let it be single band symbology and I would select a color ramp maybe you

08:57.960 --> 09:04.960
use bring this time I would apply it it takes a little bit time because it is cloud

09:04.960 --> 09:16.960
optimized you to but yeah you can see that the symbology has been updated.

09:16.960 --> 09:23.960
So, now I want to show you like that we can do dynamic layer management and you like in

09:23.960 --> 09:30.960
jupiter GIS just similar to QGIS you can reorder layers like by dragging them up and down

09:30.960 --> 09:40.960
I just did and as I shown you you can toggle a layer on and off like this you can

09:40.960 --> 09:48.960
if I just want to see one layer I can do that I can even remove a layer like this I can even

09:48.960 --> 09:58.960
rename a layer and if I and there are several options that I can do I can zoom to a layer

09:58.960 --> 10:07.960
and yeah so this is like this is like we are layer browser is also like the layer panel

10:07.960 --> 10:12.960
is also inspired by QGIS similar to QGIS we can do a lot of things with this.

10:12.960 --> 10:19.960
So, we also have identify panel you can select and click on features to which you want

10:19.960 --> 10:26.960
to see properties and attributes of so I would show you how it works so I would select

10:26.960 --> 10:33.960
the layer again and I would enable the identify panel and then I would select some attributes

10:33.960 --> 10:41.960
over here it would show me which attributes I have selected it would give me a list of all

10:41.960 --> 10:47.960
attributes that are selected I have this nice search button which I can use to highlight the

10:47.960 --> 10:59.960
attribute which I want to which I want to focus on I can do the same for others it also goes

10:59.960 --> 11:06.960
with a nice zoom animation and I can see I can do it with all the type of vector data

11:06.960 --> 11:10.960
I can do it with a polygon I can do it with a line and I can do it with a point as well

11:10.960 --> 11:16.960
so I would select some polygons over here so it gives me all the list of all the selected

11:16.960 --> 11:22.960
polygons and we also have a search button over here so I can use it to highlight my

11:22.960 --> 11:30.960
attribute that I am looking at I can study and see all the things that this feature

11:30.960 --> 11:38.960
have next I have next we have time slider so this is some fancy stuff that that is also

11:38.960 --> 11:45.960
that Jupiter GIS is also enabling so we can visualize data with respect to time so I

11:45.960 --> 11:52.960
would take this for example I would enable time slider and then we have this nice menu

11:52.960 --> 11:58.960
over here which has this slider I can move this slider to see how my data changes over time

11:58.960 --> 12:09.960
so I would I can maybe also change the time interval that we are rendering the data

12:09.960 --> 12:14.960
for instead of week I would select day then I can see how it changes over time

12:14.960 --> 12:21.960
and if you and if you do not want to move this slider we have this nice play and pause

12:21.960 --> 12:30.960
button you can use this as well to automatically see how your data transforms over time

12:30.960 --> 12:40.960
I would may pause it and next so people who are already familiar with Q GIS and who are already using Q GIS

12:40.960 --> 12:48.960
and do not want to like directly jump into Jupiter GIS we also have Q GIS compatibility so you can

12:48.960 --> 12:56.960
export dot GIS file to Q GIS format and you can even import Q GIS format to Jupiter GIS directly

12:56.960 --> 13:03.960
although we do not claim that we support everything that Q GIS have but we are still in process to

13:03.960 --> 13:12.960
support all the all the things that Q GIS provides but yeah it works nicely with it works nicely with

13:12.960 --> 13:23.960
exporting styles and all the properties that your map have so next we have annotation and

13:23.960 --> 13:28.960
collaboration like I have already talked a lot about collaboration and already emphasized a lot

13:28.960 --> 13:36.960
now you can see how it works so you consider that there are two different users working on this project file

13:36.960 --> 13:42.960
the one on the left and one on the right because there there are these are two different browsers so

13:42.960 --> 13:48.960
if I change the map on the left you can already see that it automatically changes in the right as well

13:48.960 --> 13:58.960
and I can also like talk on the map I can annotate I can make comment I can reply to those comments and I can see what's going on

13:58.960 --> 14:04.960
this makes like obviously this makes collaborative work flows much smoother than file based

14:04.960 --> 14:15.960
shading so we also have Python API for Jupiter GIS that lets you interact with your GIS document

14:15.960 --> 14:21.960
programmatically you can use it to create layers and perform operations right inside your notebook

14:21.960 --> 14:29.960
Python API works same as same as a collaborative working on your file so it is also like real time collaborative

14:29.960 --> 14:36.960
and everything that you do with Python API as well they this show up on the map to you and to the other user that

14:36.960 --> 14:42.960
is working with you on the same file.

14:42.960 --> 14:48.960
We also have client site processing so I in between of the presentation I talked about that we use

14:49.960 --> 14:55.960
to perform operations inside the browser so everything that I will show you here would be

14:55.960 --> 15:03.960
happening inside the browser I am not using any server so I will select a layer and we have this processing option

15:03.960 --> 15:11.960
in which we have some option that what we can do with our data so this is the earthquake data that you are seeing

15:11.960 --> 15:18.960
so maybe I will perform buffer to see what is the risk risk area of these earthquakes

15:18.960 --> 15:30.960
I will give it 10 units that lets consider that everything in the radius of 10 is in the risk of these earthquakes

15:30.960 --> 15:45.960
so I will just give it another name at quicks buffered and I would yeah so you can see that

15:45.960 --> 15:53.960
our new layer has been created which is a polygon layer it uses earthquakes as a base to calculate

15:53.960 --> 15:59.960
what is the risk area of all these earthquakes and you can do a lot more with the processing options

15:59.960 --> 16:09.960
processing menu that we have and we are still extending that menu with time.

16:09.960 --> 16:16.960
So we also have stack browser so Jupyter GIS stack browser lets you connect to your stack catalogs

16:16.960 --> 16:23.960
and load satellite imagery right inside your notebook or geospatial data directly into

16:23.960 --> 16:30.960
Jupyter GIS you can use it to load any satellite imagery that is available in your stack

16:30.960 --> 16:44.960
API just like this.

16:44.960 --> 16:50.960
And we also have a detailed integration so a detailed it is a nice tool a detailed

16:50.960 --> 16:57.960
let's you serve and explore like big vector and asset data sets dynamically using Python plus

16:57.960 --> 17:05.960
T Tyler this lets you explore large data sets interactively although this requires a server

17:05.960 --> 17:13.960
that's why we cannot yet do it in Jupyter light because it requires a kernel component but yes

17:13.960 --> 17:30.960
if you want to explore large data sets with Jupyter GIS, T Tyler is the answer for you

17:30.960 --> 17:35.960
So there are some in progress things that we are working on one of these is story maps

17:35.960 --> 17:41.960
so with the help of Jupyter GIS story maps you can tell I story with your map

17:41.960 --> 17:44.960
you can like you can present your map like just like a presentation.

17:44.960 --> 17:51.960
So story maps are approach to turn GIS into narratives and text combines with interactive

17:51.960 --> 17:57.960
stories live live nice text for teaching communication or decision making.

17:57.960 --> 18:03.960
This is like this looks good it is still in progress but yeah it is close to being

18:03.960 --> 18:11.960
completion so in next release maybe you would be able to use it.

18:11.960 --> 18:19.960
Next we are also exploring integrating the power of LLMs and agents within Jupyter GIS

18:19.960 --> 18:27.960
we are exploring natural language interaction with GIS so that if you are like if you are a very

18:27.960 --> 18:32.960
beginner if you do not want to know like if you do not want to learn GIS concepts if you just

18:32.960 --> 18:36.960
want to do something with GIS you can just interact with Jupyter GIS in natural language

18:36.960 --> 18:42.960
and ask questions manipulate data or analyze maps by simply typing instructions in your

18:42.960 --> 18:50.960
natural language and yeah obviously no prior GIS knowledge required.

18:50.960 --> 18:56.960
So yeah that was mostly about the demo yeah maybe you would want to see.

18:56.960 --> 19:02.960
In the left I am interacting with an LLM I am telling it to add a new layer although

19:02.960 --> 19:07.960
I because I am using an old Gemini model so that is why I need to confirm it every

19:07.960 --> 19:13.960
time so it adds layer automatically and then I would tell it to create a buffer of the same

19:13.960 --> 19:19.960
like the same I showed you with processing manually this time it would be happening automatically

19:19.960 --> 19:28.960
in the LLM.

19:28.960 --> 19:39.960
Yeah I need to confirm it every time because it is acting.

19:39.960 --> 19:48.960
So again I again give it 10 units and yeah this is what that results look like.

19:48.960 --> 19:56.960
It is exactly same to what I showed you manually but you have this time with an LLM.

19:56.960 --> 20:03.960
So this was all about the demo but all the live demos that you saw today were entirely

20:03.960 --> 20:07.960
made within the browser and with the help of Jupyter light.

20:07.960 --> 20:14.960
So it can be it works within fully Jupyter light setup and it can be embedded in your

20:14.960 --> 20:15.960
frames.

20:15.960 --> 20:21.960
No installation required python runs in the client as well because we use use python kernel

20:21.960 --> 20:26.960
and G dial is compiled to web assembly so still we do not require as a component there.

20:26.960 --> 20:31.960
And even the full Jupyter environment works inside your browser this makes it like very easy

20:31.960 --> 20:35.960
for anyone to try or share Jupyter GIS instantly.

20:35.960 --> 20:44.960
So next if you want to like try out Jupyter GIS right now this is the easiest way that I can

20:44.960 --> 20:45.960
think of.

20:45.960 --> 20:51.960
So for anyone who wants to try it notebook link make it image it.

20:51.960 --> 20:57.960
You can open Jupyter GIS repository in your browser and just prefix the link with notebook

20:57.960 --> 21:00.960
dot link and you have the full environment ready.

21:00.960 --> 21:04.960
So no set up no installs just start exploring GIS in your browser.

21:04.960 --> 21:10.960
So I would just prefix the URL and I would accept the terms and it would open Jupyter GIS

21:10.960 --> 21:12.960
inside my browser.

21:12.960 --> 21:24.960
And I can do everything that I show you.

21:24.960 --> 21:31.960
So now that you have seen that what Jupyter GIS can do next we can discuss what you can do

21:31.960 --> 21:37.960
with Jupyter GIS there there is a lot that you can do with Jupyter GIS obviously but

21:37.960 --> 21:42.960
there are some main ways which people can use Jupyter GIS for obviously for environment

21:42.960 --> 21:49.960
and environmental analysis you can combine climate land use and biodiversity mapping data

21:49.960 --> 21:54.960
to do environmental analysis and secondly we have earth observation we already have

21:54.960 --> 22:00.960
stack browsers you can load satellite clusters and you can do times time forecasting like

22:00.960 --> 22:03.960
you can visualize time forecasting data as well.

22:03.960 --> 22:07.960
So yeah it helps you to do earth observation as well.

22:07.960 --> 22:15.960
And thirdly let's you do urban planning as well because you can load infrastructure data

22:16.960 --> 22:21.960
and what not and obviously for teaching and workshop because the installation and

22:21.960 --> 22:24.960
like the reproducibility of this tool is very easy.

22:24.960 --> 22:28.960
It makes teaching and workshops really easy then compared to these traditional tools

22:28.960 --> 22:33.960
which require big installations and hefty setups.

22:33.960 --> 22:39.960
And next we have reproducibility search obviously I have emphasized on it a lot that it is

22:40.960 --> 22:46.960
really easy to reproduce and again collaborative mapping you can collaborate

22:46.960 --> 22:55.960
with a lot of people multiple people at the same time and you can communicate what

22:55.960 --> 23:01.960
you are seeing right in real time.

23:01.960 --> 23:05.960
So what next for Jupyter GIS?

23:06.960 --> 23:10.960
So looking at there is a lot that we want to do with Jupyter GIS one of which is

23:10.960 --> 23:12.960
suggestion support.

23:12.960 --> 23:18.960
So suggestion suggestion support lets you do a split view comparison when you collaborate

23:18.960 --> 23:20.960
in real time.

23:20.960 --> 23:26.960
It lets you create a precise suggestion to the other user that you are working with

23:26.960 --> 23:32.960
that makes the chance of confusion very minute very little.

23:32.960 --> 23:37.960
So it is something that already works in the sister project of Jupyter GIS which is

23:37.960 --> 23:43.960
Jupyter CAD it is the same like it uses the same infrastructure the same backend

23:43.960 --> 23:49.960
but for instead of GIS for CAD for 3D modeling and all.

23:49.960 --> 23:53.960
So we want to also make it work in Jupyter GIS as well.

23:53.960 --> 23:57.960
We would also like to do more cloud optimization support.

23:57.960 --> 24:04.960
So we would also want to extend our five support to Geoparkage Euro so that we can load

24:04.960 --> 24:12.960
big data very seamlessly in Jupyter GIS and we are also working on vector layer editing

24:12.960 --> 24:17.960
and creation so that you can create new vector layers in real time and they are also

24:17.960 --> 24:22.960
collaborative and you can edit the existing vector layers.

24:23.960 --> 24:28.960
And next we have advanced table viewer just like the attribute table in QRIS you would also

24:28.960 --> 24:33.960
like to have some we are working on this as well.

24:33.960 --> 24:38.960
We would also like to have some advanced table viewer for Jupyter GIS with which you

24:38.960 --> 24:45.960
can do analysis you can export data and all.

24:45.960 --> 24:51.960
So here I would like to acknowledge the support that Jupyter GIS has gained over time.

24:51.960 --> 24:58.960
So yes funded the initial development of Jupyter GIS under permanent open call with

24:58.960 --> 25:06.960
for EU innovation and stack and XRA extension had been funded by Venice.

25:06.960 --> 25:12.960
It Jupyter GIS has been built by Constack in collaboration with similar research lab with

25:12.960 --> 25:20.960
major contributors from UC Berkeley DSE and over 30 open source contributors from all around the world.

25:20.960 --> 25:29.960
So if you want to get involved we welcome contributions of all kinds you can contribute code,

25:29.960 --> 25:35.960
bug fixes or develop plugins you can help with documentation tutorials or example

25:35.960 --> 25:38.960
notebooks and your feedback is very crucial for us.

25:38.960 --> 25:46.960
It lets us prioritize things and this is how the community keeps growing and if you want

25:46.960 --> 25:53.960
to join Jupyter GIS community check out geojupyter.org we have bi-weekly we organize bi-weekly

25:53.960 --> 26:01.960
hackathons and we also have a geolip channel which you can join and interact with us.

26:01.960 --> 26:03.960
And thank you so much.

26:03.960 --> 26:11.960
These are QR codes that you can scan for the live deployment of Jupyter CAD and Jupyter GIS.

26:11.960 --> 26:21.960
And the questions.

26:21.960 --> 26:36.960
No problem if there's no questions.

26:36.960 --> 26:43.960
Thanks, that looks very fantastic.

26:43.960 --> 26:50.960
Maybe you can comment like why did you choose open layers as the map?

26:50.960 --> 26:57.960
So it has been like it has been quite directos that we have discussed a lot about this.

26:57.960 --> 27:05.960
We in past we have been using map library although we wanted to enable advanced styling

27:05.960 --> 27:08.960
for vector layers and oscillators.

27:08.960 --> 27:14.960
That's when we realized that we have hit a ceiling over there.

27:14.960 --> 27:20.960
But we are also exploring that we are not just settling to open layers.

27:20.960 --> 27:27.960
We are still exploring to have custom like you can plug in any viewport and customizable viewport

27:27.960 --> 27:31.960
you can use any other viewport we are exploring that feature as well.

27:31.960 --> 27:37.960
And maybe in future we would also like to support 3D rendering for our maps.

27:37.960 --> 27:48.960
So we would also like to extend the view like to explore that direction as well.

27:48.960 --> 27:53.960
I saw in your one of your timers that with a real time element.

27:53.960 --> 27:56.960
Does that require some sort of backhand of some point?

27:56.960 --> 27:57.960
Yes.

27:57.960 --> 28:03.960
So Jupyter collaboration yet does not work in Jupyter light because it requires us

28:03.960 --> 28:08.960
I have a component it requires some sockets and stuff.

28:08.960 --> 28:15.960
But there has been work going on in order to support collaboration inside Jupyter light

28:15.960 --> 28:18.960
in our team.

28:18.960 --> 28:25.960
Obviously we cannot do that yet but maybe in the near future we would be able to collaborate

28:25.960 --> 28:28.960
without a server component as well.

28:28.960 --> 28:29.960
Okay, great.

28:29.960 --> 28:30.960
Thank you.

