📺 Develpreneur YouTube Episode

Video + transcript

SQL Sync Part 27

2022-11-15 •Youtube

Detailed Notes

Focus for this episode: We continue our thought process and options for pulling over limited, but valid data.

This tutorial walks through the creation of a database synchronization tool in Python. It continues our Python and SQL Tutorials with a useful application that provides a deeper look at SQL structures and commands.

Repository For Code: git clone [email protected]:rbroadhead/dbsync.git

Transcript Text
thank you
[Music]
well hello and welcome back we are
continuing what has become a little bit
of a slog of a tutorial of my Sequel and
python
last episode
was a little bit painful as we were sort
of doing some research on the fly so I
jumped ahead a little bit and continued
into my research for those of you that
uh were
yelling at me a little bit as you were
looking at what we were going through
um I'll take a look at this and we'll
show you what we came up with uh I do
want to flip back real quick so one of
the things we did is we're we're into
this synchronization of rose
and we're in a situation where we have
tables that can be synchronized whatever
you know if you want to do 100 rows you
take the 100 rows
those are good we can set that aside and
we have that when we do the SMART empty
sink is maybe what we call Root tables
those awesome we can just pull our data
in and we're off and running
but now the non-root tables is where it
gets a little more tricky because what
we have to do is we're gonna have to go
through those and figure out what the
references are
and last time we got a little bit stuck
on that
but it exists in the information schema
key column usage
and so I'm going to go ahead and I'm
going to do a star first for this just
so you can see it all
for posterity's sake I guess and I'm
just going to go all the way through uh
yep
let's reconnect here
and it's going to take a second and so
what you're going to see with these is
you'll see what your your schema is it's
got what the constraint name is which is
pretty darn important
um the catalog uh we don't really need
that one uh table schema because this is
constraint schema versus table schema
and then you have uh so table schema
table name column name and then you have
a reference table schema reference table
name now what we're going to do with
these is if you remember last time
around we were going through
uh let's see here we go
uh we're going to go through each of
these
and we're going through the referential
constraints and let me do that
um
[Music]
um
where is referential constraints
there we go
so we're going through these and we were
finding our constraint names and we were
saying okay we know that they're
referencing this other table
but how do we build that out we need to
know the column the table and the column
in both the source and the destination
so column so if table a column one is
actually a foreign key reference to
table B column
D we'll call it then or column four
then what you need to do is build the
foreign key relationship based on those
four pieces of data and we talked about
that last time
where we were looking we had sort of
like this we're trying to build out this
query here which is basically uh from
the we're trying to get from our table
our parent table
all of the values where that column
exists in the other one and so let me do
this so a little bit here so if we've
got like table
a and we have table B
then and if we have this column let's
say and let's just say it's ID and here
it's going to be FK the foreign K ID so
basically when we're getting dable uh
table B data what we need to do is
instead of or I'm sorry when we're
getting the table a data
is that right nope we're getting a table
B data we only need to fill it in with
data
where the ID is equal to the ID and
table a
and so we do this in this big
nasty query kind of thing because what
we're going to do is we're going to say
from our table which is the reference
table name and this is from here
so from our
key column usage table
we've got a reference table reference
column and then a column and a table
and so in this case we have contract
performer ID refers to performer
performer ID so in this case we're going
to take performer which we got from the
referenced table name
where performer ID which is the column
name is in and then we're going to do
select distinct column name
from
the parent so if I take that
and get rid of those just to show you in
this case
let me get rid of this
and then what we're going to see is this
is the data we're actually going to pull
because it's the only data that really
matters because the other columns that
are in
uh the other data that is in the in this
case the performer table we don't need
because contract is where we're looking
at so we only have these three fields
that care we care about from contract
and if we do
um
it's like star from
contract
there's probably only three rows in
there uh in contract
oh okay so there's a couple there but we
only need the distinct ones but if we
look at performers
we're going to see that there's probably
a butt load of sorry that's a technical
term a lot of
rows that are in performer and we only
need three because we only need to match
them up to contract at this point now
it's not necessarily because it could be
a
there could be information that we need
from performer elsewhere but from
contract we know that we're not limiting
it on
um
number of rows we're limiting it based
on what are the rows that exist in
performer
so in this case we're going to build
this thing out
and so we're going to come into here and
then what we're going to do with each of
these for the non-root tables
we're going to see if it exists so if
we've got that table then what we need
to do
is for each of the rows and this is that
referential constraints let me go back
to that one so I can sort of show you
what we're going to do with this
so this one what we're going to do for
each one of these rows we're going to
come through to this constraint name
which is a constraint name is one
uh did I actually build that out right
oh here we go
and oh I may need to
oh because that's the constraint name
that's the table name that's the parent
I may need to okay maybe I didn't get
that filled all the way out let's take a
look at that so I'm going to come
through and I'm going to say hey
here's a
in this case here's a table here's
something that I need to deal with
reference table name blah blah blah what
I really need here is the constraint
name
so what I can probably do here is for
each of these
is come through let's see load parent
data let me see if I've got it up there
I may have to
uh parent data
oh or is that below
okay let's see
parent table data
parent table data
okay all right so that's right so if I
look up at
parent
table data
then what I'm going to do with each of
those is I'm going to give it a table
and a parent which I probably don't
really need
oh and so this is going to say for that
table I need to see if it's loaded
because now what I need to do is I need
to walk in and say okay
for each of these tables
reference table reference table where's
that at oh it's over here
so for the reference table
for each of those I'm going to have to
go check to see if it is a root that has
already been loaded or not
and so what I can do here
is I've got this imported tables
so what I'm going to do is I'm going to
say
uh and so for here for example as I load
them I go into imported tables I
actually add it in so I'm going to do is
I'm going to be passing that in
and
I probably should pass it back out
uh
[Music]
yeah let's do that
so imported
whoop
tables equals so I'm going to have to
pass that back out which means for load
parent table data
which is here
one of the things I want to do is I want
to do return whoops
imported is that imported rows that
should be imported tables up
imported tables
and then imported tables
so keep that the same name so he's going
to pass it back in
so I need to do here is I'm going to say
here
I'm going to change this up a little bit
because I'm going to say
um I want to go through
okay
so I'm gonna have to go through its
parents
and so here I'm going to say go through
each of those tables
um I'm probably going to be easier to
for each of these
uh let's see if it's less than zero oh I
don't need that
so I want to get its parents so this is
I want to do this one I'm going to do
curse oh I need cursor source
um
so what I want to do for this is I'm
going to go through and I'm going to say
for each of the tables
um
FK rows what is FK rows that is fetchall
so here
uh let's see oh maybe we'll get rid of
this
I really just need here for each of
these I'm going to do
I'll probably do it this way
so I'm going to do four uh parent
in
FK Rose
and then I'm gonna do if
parent
zero so if the reference table name is
imported rows then
it's gonna uh if it's not
in imported rows then I need to import
it so I'm going to have to do load
parent table
data
I'm going to do imported
oh it's 94 rows supported tables
and then imported tables
equals that
and I'm going to give it a table which
is oops which is now parent zero
oh that's going to be parents
because I already have a parent up there
and that's going to be
that
load parent table parent zero blah blah
blah oh and then it's going to be the
table
oh all right now we have to adjust this
a little bit let me look at this wait a
minute so I'm going to come through here
and I'm going to say for each of these I
need to check it for the parent which I
can probably
oh okay let's let's clean this up a
little bit because what I can do here is
I can say let's see so if it's greater
than zero okay then rows and rows oh
here we go
I'm doing that so I'm going to load the
parent data
so the parent data basically needs to go
through this same thing
so let me see if I can get this right
this time
so he's going to go through the same
thing here
and why don't I send it parent
um
apparent is a row oh so I'm going to
back it back out I don't know why I need
the table there though
that's a good question
because if I load the parent table data
I can probably do it with just the
parent
and the imported tables
because now I'm basically going to do
actually I can do it like this
um
actually let's simplify it even a little
bit more so okay I'm going to say if
uh parent
not in
imported rows
then I'm going to load the parent
else
load data for this table
and that is going to be
I'm going to build out this little thing
and this query
so this is going to be the uh
smart load SQL equals
this big thing
but first what we need is
this guy
and actually we could probably
oh we don't need that guy
oh we do because we need it with the so
that's what the constraint name
there we go okay
so here
first we need to uh
well
first we need to get the columns
and tables
and that's going to be this is the uh
we'll call it the call SQL let's just
call it Source SQL
and this is going to be
where
where that
equals
and let's just put it like here and
this is going to be
and we need the constraint name which is
here
out of FK rows that's going to be Row
one
and then so for each of these so for
that we're going to come in and we're
going to say let's go execute it
and we want to execute it on the source
which is fine
so let's do here
Source SQL
and uh this will be we're going to call
this Source row
equals fetchall
and then all we need here uh this is
going to be
did we bring the did we grab the no we
didn't so let's go ahead and grab
with this
the constraint schema
uh constraint schema
because then
there we go
because what we need here is we're going
to be
uh where am I building that
here so
uh
let's do this schema let's do just temp
temp schema
uh
yeah we'll leave it the way it is so
we're gonna come in here and we're going
to say select from
and then this is going to be
um and let's go ahead and do these
so the first thing we get is uh row
zero oops which is because it's the
constraint schema
it's going to get really complicated so
we're going to actually end up pausing
here in a second but uh so here so you
got the constraint schema Dot
um actually I think I can do the whole
thing like this let's see what happens
dot the reference table name
is Row one
and I want the reference to column name
again will be uh
I'll do this
to protect that because we can and
that's going to be a row reference
column name is zero one two
and then it sort of says so let me do
this
speed this up a little bit so performer
ID is the column name
which is three
oh
column three
and this is
column four
and we've got to come back over here to
where we did this thing
and we do it like this let's see if this
will work uh how far do we get uh from
that that yeah there we go
so that should give us our smart load
and then what we're going to do is we're
going to execute that
uh smart
load SQL we're going to have to go ahead
and
execute that and then use that to insert
into the other we're going to build that
out and insert into the target row so
that's going to be non-trivial in itself
and loading the parent is basically
going to be the same thing
um
so we may find a way to to clean this up
a little bit but it's basically going to
be go load the parent and then possibly
load the parent possibly load the parent
so let me find a way to clean this up
but that is a little Cliffhanger for the
next time around because we've gone a
little long so I want to keep it short
I know this is a little bit of trudging
through stuff but this is really some of
the but this is really probably the most
complicated piece I think as you're
seeing of the work we're going to do in
the synchronization and once it's done
it's going to be pretty stinking cool
that being said I hope your day is
Pretty stinking cool go out there and
have yourself a great day a great week
and we will talk to you next time
foreign
Transcript Segments
10.7

thank you

18.89

[Music]

27.359

well hello and welcome back we are

29.88

continuing what has become a little bit

31.8

of a slog of a tutorial of my Sequel and

35.16

python

36.48

last episode

38.219

was a little bit painful as we were sort

40.8

of doing some research on the fly so I

43.86

jumped ahead a little bit and continued

46.02

into my research for those of you that

49.379

uh were

50.64

yelling at me a little bit as you were

52.5

looking at what we were going through

54.96

um I'll take a look at this and we'll

56.16

show you what we came up with uh I do

58.379

want to flip back real quick so one of

60.18

the things we did is we're we're into

61.68

this synchronization of rose

64.5

and we're in a situation where we have

66.72

tables that can be synchronized whatever

70.86

you know if you want to do 100 rows you

73.14

take the 100 rows

74.76

those are good we can set that aside and

77.4

we have that when we do the SMART empty

80.159

sink is maybe what we call Root tables

82.5

those awesome we can just pull our data

85.68

in and we're off and running

88.08

but now the non-root tables is where it

91.259

gets a little more tricky because what

92.82

we have to do is we're gonna have to go

95.1

through those and figure out what the

97.799

references are

99.659

and last time we got a little bit stuck

101.7

on that

102.6

but it exists in the information schema

106.259

key column usage

108.24

and so I'm going to go ahead and I'm

111

going to do a star first for this just

113.34

so you can see it all

116.82

for posterity's sake I guess and I'm

119.579

just going to go all the way through uh

122.04

yep

123.18

let's reconnect here

126.659

and it's going to take a second and so

129.239

what you're going to see with these is

130.5

you'll see what your your schema is it's

133.44

got what the constraint name is which is

135.42

pretty darn important

138

um the catalog uh we don't really need

139.92

that one uh table schema because this is

142.86

constraint schema versus table schema

145.08

and then you have uh so table schema

148.02

table name column name and then you have

151.379

a reference table schema reference table

153.3

name now what we're going to do with

156.18

these is if you remember last time

158.459

around we were going through

160.94

uh let's see here we go

164.819

uh we're going to go through each of

166.68

these

167.819

and we're going through the referential

170.34

constraints and let me do that

174

um

176.5

[Music]

177.12

um

178.2

where is referential constraints

182.04

there we go

183.48

so we're going through these and we were

184.98

finding our constraint names and we were

187.26

saying okay we know that they're

189.3

referencing this other table

191.459

but how do we build that out we need to

194.34

know the column the table and the column

196.739

in both the source and the destination

199.26

so column so if table a column one is

204.06

actually a foreign key reference to

205.62

table B column

208.739

D we'll call it then or column four

213.239

then what you need to do is build the

215.72

foreign key relationship based on those

219.3

four pieces of data and we talked about

221.819

that last time

223.379

where we were looking we had sort of

225.299

like this we're trying to build out this

227.34

query here which is basically uh from

231.659

the we're trying to get from our table

237.659

our parent table

240.18

all of the values where that column

244.799

exists in the other one and so let me do

248.04

this so a little bit here so if we've

249.659

got like table

250.98

a and we have table B

254.939

then and if we have this column let's

257.459

say and let's just say it's ID and here

260.579

it's going to be FK the foreign K ID so

263.58

basically when we're getting dable uh

265.5

table B data what we need to do is

269.28

instead of or I'm sorry when we're

271.86

getting the table a data

273.6

is that right nope we're getting a table

275.699

B data we only need to fill it in with

278.52

data

279.9

where the ID is equal to the ID and

282.54

table a

284.4

and so we do this in this big

287.12

nasty query kind of thing because what

289.979

we're going to do is we're going to say

291.06

from our table which is the reference

293.04

table name and this is from here

298.259

so from our

301.259

key column usage table

303.54

we've got a reference table reference

305.34

column and then a column and a table

308.46

and so in this case we have contract

311.4

performer ID refers to performer

314.639

performer ID so in this case we're going

317.52

to take performer which we got from the

319.199

referenced table name

321.479

where performer ID which is the column

324.72

name is in and then we're going to do

327.419

select distinct column name

330.3

from

331.74

the parent so if I take that

336.84

and get rid of those just to show you in

340.08

this case

344.4

let me get rid of this

347.039

and then what we're going to see is this

348.539

is the data we're actually going to pull

349.979

because it's the only data that really

351.3

matters because the other columns that

353.22

are in

354.419

uh the other data that is in the in this

358.08

case the performer table we don't need

361.199

because contract is where we're looking

362.759

at so we only have these three fields

364.199

that care we care about from contract

366.12

and if we do

368.039

um

369.539

it's like star from

372.66

contract

377.639

there's probably only three rows in

378.96

there uh in contract

383.28

oh okay so there's a couple there but we

384.84

only need the distinct ones but if we

386.22

look at performers

388.919

we're going to see that there's probably

390.479

a butt load of sorry that's a technical

393.12

term a lot of

396.3

rows that are in performer and we only

398.34

need three because we only need to match

400.44

them up to contract at this point now

403.08

it's not necessarily because it could be

404.819

a

406.44

there could be information that we need

407.819

from performer elsewhere but from

410.16

contract we know that we're not limiting

413.039

it on

414.419

um

415.199

number of rows we're limiting it based

417.9

on what are the rows that exist in

420.12

performer

421.68

so in this case we're going to build

424.08

this thing out

426.84

and so we're going to come into here and

429.84

then what we're going to do with each of

430.86

these for the non-root tables

433.62

we're going to see if it exists so if

435.66

we've got that table then what we need

437.759

to do

439.199

is for each of the rows and this is that

442.819

referential constraints let me go back

444.72

to that one so I can sort of show you

446.34

what we're going to do with this

448.44

so this one what we're going to do for

449.819

each one of these rows we're going to

451.259

come through to this constraint name

453.919

which is a constraint name is one

459.24

uh did I actually build that out right

461.28

oh here we go

465.86

and oh I may need to

469.68

oh because that's the constraint name

471.72

that's the table name that's the parent

475.139

I may need to okay maybe I didn't get

477.599

that filled all the way out let's take a

479.16

look at that so I'm going to come

480.36

through and I'm going to say hey

481.979

here's a

483.9

in this case here's a table here's

486.66

something that I need to deal with

487.74

reference table name blah blah blah what

489.78

I really need here is the constraint

490.979

name

492.539

so what I can probably do here is for

495.72

each of these

497.4

is come through let's see load parent

499.379

data let me see if I've got it up there

501.599

I may have to

503.94

uh parent data

507.96

oh or is that below

512.76

okay let's see

515.58

parent table data

517.979

parent table data

520.38

okay all right so that's right so if I

522.539

look up at

523.919

parent

525.48

table data

527.64

then what I'm going to do with each of

529.2

those is I'm going to give it a table

530.519

and a parent which I probably don't

532.32

really need

538.32

oh and so this is going to say for that

540.3

table I need to see if it's loaded

543.12

because now what I need to do is I need

544.8

to walk in and say okay

547.339

for each of these tables

551.24

reference table reference table where's

553.38

that at oh it's over here

555.779

so for the reference table

557.7

for each of those I'm going to have to

560.399

go check to see if it is a root that has

564.6

already been loaded or not

568.2

and so what I can do here

571.62

is I've got this imported tables

575.88

so what I'm going to do is I'm going to

577.62

say

578.76

uh and so for here for example as I load

581.22

them I go into imported tables I

583.08

actually add it in so I'm going to do is

584.7

I'm going to be passing that in

588.06

and

589.74

I probably should pass it back out

594.6

uh

595.83

[Music]

597.019

yeah let's do that

600.18

so imported

602.16

whoop

603.899

tables equals so I'm going to have to

606.36

pass that back out which means for load

609.959

parent table data

611.64

which is here

614.58

one of the things I want to do is I want

616.32

to do return whoops

620.7

imported is that imported rows that

623.64

should be imported tables up

627.18

imported tables

632.94

and then imported tables

636.12

so keep that the same name so he's going

638.04

to pass it back in

640.56

so I need to do here is I'm going to say

642.36

here

644.579

I'm going to change this up a little bit

646.079

because I'm going to say

650.339

um I want to go through

657.3

okay

658.38

so I'm gonna have to go through its

660.18

parents

662.1

and so here I'm going to say go through

664.56

each of those tables

666.6

um I'm probably going to be easier to

668.64

for each of these

671.04

uh let's see if it's less than zero oh I

673.8

don't need that

677.16

so I want to get its parents so this is

679.8

I want to do this one I'm going to do

681.48

curse oh I need cursor source

684.899

um

689.64

so what I want to do for this is I'm

691.38

going to go through and I'm going to say

692.7

for each of the tables

699.06

um

699.66

FK rows what is FK rows that is fetchall

703.74

so here

706.8

uh let's see oh maybe we'll get rid of

709.92

this

712.019

I really just need here for each of

714.42

these I'm going to do

718.079

I'll probably do it this way

720.66

so I'm going to do four uh parent

724.38

in

726.959

FK Rose

732.54

and then I'm gonna do if

736.079

parent

739.32

zero so if the reference table name is

743.1

imported rows then

747.24

it's gonna uh if it's not

750.3

in imported rows then I need to import

752.64

it so I'm going to have to do load

756

parent table

758.88

data

762.48

I'm going to do imported

766.26

oh it's 94 rows supported tables

772.44

and then imported tables

775.2

equals that

778.019

and I'm going to give it a table which

780.899

is oops which is now parent zero

785.88

oh that's going to be parents

787.92

because I already have a parent up there

795.48

and that's going to be

801.24

that

804.959

load parent table parent zero blah blah

807.899

blah oh and then it's going to be the

810.18

table

815.1

oh all right now we have to adjust this

818.16

a little bit let me look at this wait a

819.66

minute so I'm going to come through here

823.019

and I'm going to say for each of these I

825.42

need to check it for the parent which I

829.079

can probably

832.62

oh okay let's let's clean this up a

835.86

little bit because what I can do here is

837.959

I can say let's see so if it's greater

839.76

than zero okay then rows and rows oh

841.62

here we go

843.06

I'm doing that so I'm going to load the

844.74

parent data

846.12

so the parent data basically needs to go

849.24

through this same thing

854.339

so let me see if I can get this right

855.779

this time

857.1

so he's going to go through the same

858.6

thing here

862.86

and why don't I send it parent

865.74

um

868.2

apparent is a row oh so I'm going to

869.88

back it back out I don't know why I need

871.62

the table there though

876.839

that's a good question

881.399

because if I load the parent table data

884.22

I can probably do it with just the

885.959

parent

886.86

and the imported tables

889.98

because now I'm basically going to do

891.6

actually I can do it like this

893.76

um

897.48

actually let's simplify it even a little

899.1

bit more so okay I'm going to say if

902.399

uh parent

904.339

not in

907.579

imported rows

910.139

then I'm going to load the parent

915.36

else

918.48

load data for this table

926.1

and that is going to be

931.68

I'm going to build out this little thing

937.8

and this query

941.399

so this is going to be the uh

944.94

smart load SQL equals

948.899

this big thing

951.18

but first what we need is

955.26

this guy

957.6

and actually we could probably

961.98

oh we don't need that guy

964.74

oh we do because we need it with the so

966.72

that's what the constraint name

973.68

there we go okay

977.399

so here

980.639

first we need to uh

983.82

well

986.459

first we need to get the columns

991.38

and tables

993.6

and that's going to be this is the uh

996.12

we'll call it the call SQL let's just

998.639

call it Source SQL

1002.56

and this is going to be

1005.779

where

1008.779

where that

1010.759

equals

1015.079

and let's just put it like here and

1020.54

this is going to be

1026

and we need the constraint name which is

1029

here

1030.98

out of FK rows that's going to be Row

1033.62

one

1040.24

and then so for each of these so for

1044.78

that we're going to come in and we're

1045.919

going to say let's go execute it

1048.74

and we want to execute it on the source

1051.26

which is fine

1052.7

so let's do here

1055.46

Source SQL

1059.419

and uh this will be we're going to call

1061.82

this Source row

1064.1

equals fetchall

1067.16

and then all we need here uh this is

1070.039

going to be

1077.12

did we bring the did we grab the no we

1081.02

didn't so let's go ahead and grab

1083.86

with this

1087.14

the constraint schema

1093.44

uh constraint schema

1097.76

because then

1101.36

there we go

1103.22

because what we need here is we're going

1105.559

to be

1107.12

uh where am I building that

1109.58

here so

1111.86

uh

1113.78

let's do this schema let's do just temp

1118.34

temp schema

1122.72

uh

1126.5

yeah we'll leave it the way it is so

1128.36

we're gonna come in here and we're going

1129.559

to say select from

1132.559

and then this is going to be

1135.799

um and let's go ahead and do these

1139.58

so the first thing we get is uh row

1143.9

zero oops which is because it's the

1147.02

constraint schema

1149.299

it's going to get really complicated so

1151.34

we're going to actually end up pausing

1153.2

here in a second but uh so here so you

1155.78

got the constraint schema Dot

1160.88

um actually I think I can do the whole

1162.2

thing like this let's see what happens

1167.419

dot the reference table name

1171.38

is Row one

1174.38

and I want the reference to column name

1181.94

again will be uh

1184.46

I'll do this

1187.7

to protect that because we can and

1190.28

that's going to be a row reference

1193.039

column name is zero one two

1198.559

and then it sort of says so let me do

1200.36

this

1201.799

speed this up a little bit so performer

1203.78

ID is the column name

1206.66

which is three

1209.84

oh

1211.4

column three

1212.679

and this is

1217.24

column four

1220.46

and we've got to come back over here to

1223.16

where we did this thing

1228.44

and we do it like this let's see if this

1230.419

will work uh how far do we get uh from

1232.76

that that yeah there we go

1237.32

so that should give us our smart load

1241.28

and then what we're going to do is we're

1243.26

going to execute that

1247.22

uh smart

1249.2

load SQL we're going to have to go ahead

1252.2

and

1253.12

execute that and then use that to insert

1257.299

into the other we're going to build that

1260

out and insert into the target row so

1261.98

that's going to be non-trivial in itself

1264.5

and loading the parent is basically

1267.86

going to be the same thing

1272.059

um

1273.2

so we may find a way to to clean this up

1275.84

a little bit but it's basically going to

1276.799

be go load the parent and then possibly

1278.78

load the parent possibly load the parent

1281.36

so let me find a way to clean this up

1283.82

but that is a little Cliffhanger for the

1286.7

next time around because we've gone a

1288.32

little long so I want to keep it short

1291.02

I know this is a little bit of trudging

1293.6

through stuff but this is really some of

1295.94

the but this is really probably the most

1297.2

complicated piece I think as you're

1298.64

seeing of the work we're going to do in

1300.86

the synchronization and once it's done

1302.72

it's going to be pretty stinking cool

1305.36

that being said I hope your day is

1307.22

Pretty stinking cool go out there and

1308.6

have yourself a great day a great week

1310.4

and we will talk to you next time

1314.419

foreign