SlideShare a Scribd company logo
1 of 30
Download to read offline
OrienteeRing!
Sheffield R user group
Pete Dodd
March, 2015
This talk
Using R to grab, visualize, and analyse data from a mini mountain
marathon
getting data from web tables with rvest
manipulating the data
visualisation with ggplot2
mapping with ggmap
analysis of speeds and leg lengths
genetic algorithms for optimisation with GA
Mountain marathons: what are they?
Figure 1: A real event map
The data
Figure 2: The data at sportident.co.uk
rvest
library(rvest)
library(ggplot2)
rurl <- 'http://www.sportident.co.uk/results/....html'
rurl %>% html() %>% html_table() %>% as.data.frame() %>%
ggplot(.,aes(x=Score)) %>%
+geom_histogram(binwidth=10) %>% print
rvest
Figure 3: Distribution of scores.
Data manipulation
data frame sdf with position, score and route:
## [1] "Pos" "Name"
## [3] "Team" "Category"
## [5] "Score" "Time"
## [7] "Points" "Bonus.Penalty"
## [9] "Manual.Adj" "Controls..in.order.vi
data frame sdf splits:
## [1] "Pos" "Name" "Category" "Score
## [5] "Time" "X.U.00A0." "X.U.00A0..1" "X.U.0
## [9] "X.U.00A0..3" "X.U.00A0..4" "X.U.00A0..5" "X.U.0
## [13] "X.U.00A0..7" "X.U.00A0..8" "X.U.00A0..9" "X.U.0
## [17] "X.U.00A0..11" "X.U.00A0..12" "X.U.00A0..13" "X.U.0
## [21] "X.U.00A0..15" "X.U.00A0..16" "X.U.00A0..17" "X.U.0
## [25] "X.U.00A0..19"
Data manipulation
CN <- c('S1',paste0('10',1:9),paste0('1',10:24),'F1')
getpath <- function(pos){
tt <- tdf$Controls..in.order.visited[pos]
tt2 <- unlist(strsplit(tt,', '))
tt3 <- sapply(X=tt2,FUN = function(x)which(CN==x))
g <- G[tt3,] #df of controls
g$Pos <- pos
g$Pos <- factor(g$Pos)
tt <- gettimez(sdf[pos,6:ncol(sdf)]) #splits
g$split <- tt[!is.na(tt)]
return(g)
}
Data manipulation
library(grid) #for arrow
BP <- ggplot(data=G,aes(x=LON,y=LAT,label=Value)) +
geom_point(shape=1,size=3) +
geom_text(size=4,hjust=-.5,color='red') +
scale_shape_discrete(solid=FALSE)
for(i in 1:nrow(tdf)){
GP <- BP+
geom_segment(data=getpath(i),aes(xend=c(tail(LON,n=-1),NA)
arrow = arrow(angle = 15, ends = "last", length = unit(0.2
+ggtitle(paste0(i,': ',tdf[i,2],'nScore: ',tdf$Score[i],
+scale_colour_gradient(limits=c(0,45),high='red',low='blu
ggsave(GP,file=paste0('graphs/GP',sprintf("%03d",i),'.p
}
Use FFMPEG to make movie!
Example routes
Example routes
Example routes
Example routes
Example routes
Mapping
library(ggmap)
bbox <- make_bbox(LON, LAT, G, f = .8)
map <- get_map(location = bbox,maptype='terrain')
mp <- ggmap(map) + geom_point(data=G,aes(x=LON,y=LAT),shape
geom_text(data=G,aes(x=LON,y=LAT,label=Value),size=4,hj
scale_shape_discrete(solid=FALSE) + ylim(c(min(G$LA
xlim(c(min(G$LON)-eps,max(G$LON)+eps))
NB geom_leg needed rather than arrow for some reason.
Example routes
Example routes
Example routes
Example routes
Example routes
Mapping
Lessons:
easy to use & integrates well with ggplot2
osm can be used rather than google, but service only runs in
middle of night!
discrete zoom levels can be awkward if you’re in between
bbox’s are square; although you can trim the display with xlim
etc.
usual shenanigans with different coordinate systems
Analysis
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
30
40
20
20
30
20
20
30
30
20
10
30
20 30
30
20
20
20
20
10
20
40
30
30
53.23
53.25
53.27
53.29
53.31
−1.64 −1.62 −1.60 −1.58 −1.56
LON
LAT
Analysis
Need a way of standardizing the leg durations, given splits from
different runners.
One might imagine for leg i and runner j, split Tij
Tij = di /sj
where di is an inherent leg duration, and sj is a relative speed. Then
log Tij = log di − log sj
Suggests linear regression:
lm(log(split) ~ leg + Pos + 0)
Analysis
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
qqq
q
q
q
qqqq
qq
q
q
q
qqq
q
qq
q
q
q
qq
q
q
qq
q
q
q
q
q
q
qq
q
qqq
q
q
q
qq
q
q
q
qqq
q
q
q
q
q
q
q
qqqq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
0.00
0.25
0.50
0.75
1.00
0 50 100 150
position
Speedrelativetowinner
Optimization problem
Combinatorial optimisation problem, similar to the travelling
salesman problem
These problems are (NP) hard
Need to encode routes and their fitness (including penalties)
sample a route as a permutation of 1:no_checkpoints,
extracting the points between 1 and no_checkpoints
26! ≈ 4 × 1026
(cf Avogadro’s number)
=⇒ need heuristics; not true solutions
Genetic algorithms
A class of optimization algorithms inspired by evolution.
There is a population of solutions with:
a notion of fitness
generations
mutation
crossover (sex)
Package GA
Makes using these techniques pretty easy:
GA <- ga(type = "permutation", fitness = fitness,
min = 1, max = length(ptz),
popSize = 1e2, maxiter = 1e4,
run = 5e3, pmutation = 0.2)
Package GA
0 2000 4000 6000 8000 10000
0100200300400
Generation
Fitnessvalue
qqqqqq
q
qqqqqqqqq
qqqqqqqq
qqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqq
qqqqqq
qqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqq
qqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqq
qqq
qq
qqqq
qqqq
q
qq
qq
qq
q
qq
q
qq
qqqqq
qqqq
q
qq
q
q
q
qq
qq
q
q
qq
qqq
q
qq
qqq
q
q
q
qq
q
q
qq
q
qq
q
q
q
q
qq
q
q
qqqq
q
q
qq
qq
q
q
q
qq
q
qq
q
q
q
q
q
q
q
qq
q
qq
qq
qq
qq
q
qqqqq
q
q
q
qqqqq
q
q
qqqqq
q
q
q
q
qq
qq
qqqqqq
q
q
q
q
q
q
qqq
qq
q
q
q
qq
qq
q
q
q
q
qq
qq
qq
q
q
qq
qq
q
q
q
qq
q
qqqq
q
qq
q
qqq
qq
qq
qq
q
q
q
q
qq
q
q
qqqq
qq
qq
qqq
q
qq
q
q
q
q
qqq
qqqqq
q
q
qq
q
q
qqq
q
qq
q
q
qq
qqqqq
q
q
q
qq
q
q
q
q
q
qq
q
q
qqq
qq
qqq
q
q
q
qq
q
q
q
q
q
qq
q
qq
qqq
q
q
qq
q
q
qq
q
q
q
qq
q
q
qq
q
q
q
q
qqq
q
qq
q
q
q
q
qq
q
q
q
q
q
qq
qq
q
q
q
qq
q
qq
q
q
qq
q
qqq
q
qq
qqq
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qqq
qqqqqqq
q
q
q
qq
q
q
qq
q
q
q
q
q
qq
qqq
q
q
qq
q
q
q
q
q
q
q
q
qq
q
qqq
qq
q
q
q
q
qqq
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
qq
qq
q
q
q
qqq
q
q
qq
q
q
q
q
q
qqq
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qqq
qq
qqqqq
qq
qq
q
qq
q
q
q
q
q
q
qq
qq
qq
q
q
qqq
q
q
q
q
qq
q
q
q
q
q
qqqq
q
q
q
q
q
qq
q
q
q
qq
q
q
qqqq
q
q
qq
q
q
q
q
q
q
q
q
qqq
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qq
qq
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
qqqq
qq
q
qqqq
q
qqqq
q
q
q
q
qq
q
q
qqq
qqq
q
q
qq
qq
q
qq
q
qq
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
qq
qq
q
q
q
q
q
qq
q
q
q
q
qq
q
qq
q
qq
qq
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
qqq
q
q
q
qq
qq
q
q
qq
q
q
qq
qq
qqq
qq
q
q
q
qq
q
q
q
q
q
qqq
q
q
qqq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
qq
qq
q
qq
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qqq
qq
q
q
qq
q
q
q
q
qqq
qq
qqqq
q
q
q
qq
q
q
q
q
q
q
q
qq
qq
q
qq
qq
q
q
qqq
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
qq
q
q
qq
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qqq
qq
q
q
q
q
qqqq
qq
q
q
q
q
q
qqq
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qqq
q
qqq
q
q
qq
q
qq
q
qqq
q
q
q
q
q
q
q
qq
q
q
q
q
q
qqq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qqq
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
qq
qq
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
qqqq
q
q
qq
qq
qq
qq
qq
q
qq
q
q
q
q
q
q
q
qqqq
q
q
q
q
q
q
q
qq
q
qq
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
qqq
q
qq
qq
q
q
q
q
q
q
q
q
q
qqq
qqq
q
q
q
q
q
qq
qq
q
q
qq
q
q
q
q
q
q
qq
qqqq
q
q
q
q
q
q
q
q
q
q
qqq
q
qq
q
q
q
q
q
qq
q
qq
q
q
qq
q
qq
q
qq
q
q
q
q
qq
q
qq
q
q
q
q
q
q
qq
q
q
q
qqqq
q
qq
q
q
q
q
q
q
qq
q
q
qqq
q
qqq
q
q
q
q
q
qqq
q
qqq
qq
qq
q
q
q
q
q
qq
qq
q
q
q
qq
q
q
qq
qq
qqqq
q
qqq
q
q
q
q
q
qq
qq
q
q
q
q
q
qqqq
qq
q
qq
qq
qq
q
q
qq
q
q
q
q
qq
qq
q
q
q
q
q
qq
q
q
q
q
qqqqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
qqq
q
q
qq
q
q
q
q
q
q
qq
q
q
qqq
q
qqq
q
q
qqqq
q
qq
qq
q
q
q
qqq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
qqq
q
q
qqq
qq
q
q
qqq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
qqqq
q
qq
q
q
q
q
q
qq
q
q
q
q
qq
q
qqqq
q
q
q
q
q
q
qqqq
q
q
q
q
q
q
q
q
q
q
qq
q
qqq
q
q
q
qqqq
q
q
qq
qqq
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qqq
q
q
q
qq
q
qqq
qqqqq
qq
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
qq
q
qq
qqq
q
q
q
q
qq
q
q
q
q
q
qq
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
qqqq
q
qq
q
q
q
qqq
q
qqq
qq
q
q
qqq
qqq
q
qq
qqq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qqq
q
q
qqq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
qq
qqq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qqq
qq
q
q
qq
q
q
q
q
qq
q
qqq
q
q
qq
q
qqq
qq
q
q
q
qqq
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
qqq
q
qq
q
q
qqqqq
q
qq
q
q
q
q
q
q
q
qq
q
qqq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qqq
qq
q
q
q
q
q
q
q
q
q
qqq
q
qq
qqq
q
q
q
qqqq
qq
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
qq
q
q
q
q
q
q
qq
q
q
q
qqq
q
q
q
q
q
q
q
qq
q
qq
qqq
qq
q
q
q
q
q
q
qq
q
q
qq
q
qqq
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
qqq
q
q
qq
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
qq
q
qqq
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qqq
q
q
qqq
q
q
q
qq
q
qq
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
qqqq
q
q
qqq
q
qqqq
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
qq
q
qq
q
qqq
q
q
qqq
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
qqqq
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
qq
q
qq
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qqqq
q
q
q
q
qq
q
q
q
q
qqqqq
q
q
q
q
q
qq
q
qq
q
qq
q
q
q
q
q
qq
q
qqq
q
qq
q
q
q
q
q
qq
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
qq
q
q
qq
q
q
qqq
qq
q
q
q
q
qq
qqq
qq
qq
q
q
q
q
qq
q
q
q
qq
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qqq
qq
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
qq
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
qq
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqqq
q
qq
q
q
q
q
qq
qqq
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
qqq
q
q
q
q
qq
qqq
q
q
q
q
qq
qq
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
qq
q
q
q
q
q
q
qq
qq
q
q
qq
q
q
qq
q
q
q
qqq
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
qq
qqqq
q
q
q
q
q
q
q
q
qqq
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
qq
q
q
q
qqq
qq
q
q
q
q
q
q
qqq
q
q
q
q
qqq
q
q
qqq
q
q
q
q
q
qq
q
qq
q
q
q
q
qq
qq
q
qqq
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
qqqq
q
q
q
q
q
q
q
q
qqqqq
q
q
qq
q
qqq
qq
q
q
q
q
q
qqq
qq
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qqq
q
q
q
q
qq
q
q
qq
q
qqq
q
q
q
qq
qq
q
q
q
q
q
qq
qqqq
q
q
q
qq
qq
q
q
q
q
qq
q
qq
q
qqqq
q
q
q
qq
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qqq
qqq
q
q
qq
q
q
qq
q
q
qq
q
q
q
qqq
q
q
q
q
q
q
q
qqq
q
q
q
qq
qq
q
q
q
q
qq
qqq
q
q
qq
q
q
q
q
qq
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
qq
q
qq
q
qq
q
q
q
qq
q
qq
qq
qq
q
q
q
q
q
qqq
q
qq
q
q
q
q
q
q
qq
q
q
q
qq
qqqq
qq
q
qq
q
q
q
q
q
q
qq
q
qq
q
q
qqq
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
qq
qq
q
q
q
q
q
q
q
qq
q
q
qq
qqqq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
qqq
q
qq
q
q
qq
q
qq
q
q
qq
qqq
q
qq
q
q
q
q
q
q
q
q
q
qq
qqq
q
qq
q
q
q
q
qq
q
q
qq
q
qqq
q
qqq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qqq
q
q
q
q
qq
q
q
qq
q
q
q
q
qq
q
qq
qqqq
q
q
qq
q
q
qq
q
qq
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qqq
q
q
q
qq
q
qq
qq
qqq
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
qq
q
q
q
q
q
qqqq
q
q
qqqq
qq
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
qqq
q
q
q
qq
qq
qq
q
q
q
qq
q
q
q
q
q
qq
q
qq
qq
q
q
q
qqq
q
q
q
q
q
q
q
qq
q
q
q
qqq
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
qq
q
qq
qqqqq
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
qqq
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
qq
q
q
qq
q
q
q
qq
qq
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
qq
q
qq
q
q
qq
q
q
q
qqqq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
qq
qqqq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
qqqq
q
q
q
qqq
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
qq
q
q
qqqq
q
qq
qqq
q
qqq
q
qqq
qq
q
qq
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
qqq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
qq
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
qqq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
qqqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
qq
q
q
qq
q
q
qq
qq
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
qq
q
q
q
q
q
q
q
q
qq
q
q
qqqq
qq
qq
q
q
q
q
q
q
q
q
q
qqq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
qq
qqqq
q
q
q
qq
q
qqq
q
q
q
q
q
q
q
q
qq
q
q
qqqq
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qqq
q
qq
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qqqq
q
qq
q
q
qq
q
qqq
q
q
qq
qq
q
qq
q
qq
qq
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qqqq
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
qq
q
qqq
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
qq
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
qq
q
qq
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
qq
q
q
qq
q
q
qq
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
qq
q
qq
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
qq
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
qqq
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
qq
qqq
qq
q
q
q
q
q
q
qqq
q
qq
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
qqq
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
qqq
q
q
q
q
q
qq
qq
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
qq
qqq
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
qq
q
q
q
q
qq
q
q
q
qq
q
q
q
q
qq
q
q
q
qq
qq
qqqq
qqq
q
q
q
q
q
qqq
q
q
q
q
q
qq
q
qqq
q
qq
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
qqq
q
qq
q
q
q
q
q
q
q
q
q
q
qq
qq
qq
q
q
q
qq
q
qq
q
q
q
qq
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
qq
q
q
q
qq
qqq
q
qq
q
q
q
q
q
q
q
qq
q
q
qq
q
q
qq
q
q
q
q
q
qq
q
qq
q
q
qq
q
q
q
q
qq
q
q
qqq
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
qq
q
qqq
q
qq
qq
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
qq
q
q
q
qqq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
qq
q
qq
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
qq
q
q
qq
q
qq
q
q
qqq
q
qq
q
q
q
qqqq
q
q
q
q
q
q
qq
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
qqq
qqq
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
qq
q
qq
q
q
qqq
q
q
qq
q
q
qqq
qq
q
q
qq
q
q
qqq
q
qq
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
qq
q
qqq
qqq
qqq
q
qq
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
qq
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qqq
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
qq
qq
qq
q
qq
q
q
qq
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
qq
q
q
q
q
qq
qq
q
q
qq
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
qqq
q
qqq
q
qq
qq
q
q
qq
qq
q
q
qq
q
q
q
q
qqqq
q
q
qqq
q
q
q
q
q
q
q
q
qq
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
qq
q
q
qq
q
q
qqq
q
q
q
q
q
qq
q
q
qq
q
q
qq
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qqq
qq
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
qqq
q
q
qqqqq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qqq
q
q
q
q
q
qq
q
q
q
qqqqq
q
q
q
q
q
q
qq
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
qq
q
qq
q
q
q
qq
q
q
qqq
q
q
qq
qq
q
q
q
q
qq
q
qq
qq
q
q
qqq
q
q
qq
q
qq
qq
qq
q
q
q
q
q
q
q
qq
qq
q
q
q
q
qqqq
q
q
q
q
q
qqq
q
qq
q
q
qq
q
qqqq
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
qqq
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
qq
q
q
qq
q
q
q
q
q
qq
q
q
qq
q
q
q
qqq
qq
q
q
q
q
q
q
q
q
qq
q
q
qq
qq
q
q
qq
qqq
q
qq
qq
q
qqq
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qqq
q
qq
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
qqq
q
q
qq
qq
q
q
q
q
qqq
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
qq
qq
qq
q
q
q
q
q
q
q
qq
q
q
q
q
qq
q
q
qqq
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
qq
q
q
qq
q
q
q
q
q
q
qq
q
q
q
qq
q
q
qqq
q
q
qqq
q
q
q
q
q
qq
q
q
qq
q
q
q
q
qq
qq
qq
qq
q
q
q
q
q
q
q
qq
q
q
qq
qq
q
q
q
q
q
q
qqqqqq
qq
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qqq
qqq
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
qq
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
qq
qq
qq
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
qq
q
qq
qq
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qq
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
qq
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
qqq
q
q
q
q
qq
q
q
q
qq
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
qq
q
qq
q
qq
q
q
qq
q
q
q
q
q
q
qqq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
qqq
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
q
q
q
q
q
qqqqq
qq
q
q
q
q
q
q
q
q
qqq
q
q
qq
q
q
q
qq
qqq
q
qq
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
qq
q
q
q
q
q
q
q
qq
q
q
qq
q
qq
q
q
q
qq
q
qq
q
q
q
q
q
q
q
q
q
q
q
q
q
q
qq
q
q
q
q
q
qq
q
q
q
qq
q
q
q
q
q
q
q
q
qq
q
qq
qq
q
q
q
q
q
q
q
qq
q
q
q
Best
Mean
Solution
q
q
q
q
q
q
q
q
q
q
q
q
q
q q
q
q
q
q
q
q
q
q
q
q
q
30
40
20
20
30
20
20
30
30
20
10
30
20 30
30
20
20
20
20
10
20
40
3030
0
10
20
30
40
split
Final Score: 463, Raw Score: 470
Time: 246mins, penalty: 7
Figure 4: Cf winner’s score of 440
Winner’s actual route

More Related Content

Featured

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

OrienteeRing - using R to optimise mini mountain marathon routes - Pete Dodd Sheffield R Users March 2015

  • 1. OrienteeRing! Sheffield R user group Pete Dodd March, 2015
  • 2. This talk Using R to grab, visualize, and analyse data from a mini mountain marathon getting data from web tables with rvest manipulating the data visualisation with ggplot2 mapping with ggmap analysis of speeds and leg lengths genetic algorithms for optimisation with GA
  • 3. Mountain marathons: what are they? Figure 1: A real event map
  • 4. The data Figure 2: The data at sportident.co.uk
  • 5. rvest library(rvest) library(ggplot2) rurl <- 'http://www.sportident.co.uk/results/....html' rurl %>% html() %>% html_table() %>% as.data.frame() %>% ggplot(.,aes(x=Score)) %>% +geom_histogram(binwidth=10) %>% print
  • 7. Data manipulation data frame sdf with position, score and route: ## [1] "Pos" "Name" ## [3] "Team" "Category" ## [5] "Score" "Time" ## [7] "Points" "Bonus.Penalty" ## [9] "Manual.Adj" "Controls..in.order.vi data frame sdf splits: ## [1] "Pos" "Name" "Category" "Score ## [5] "Time" "X.U.00A0." "X.U.00A0..1" "X.U.0 ## [9] "X.U.00A0..3" "X.U.00A0..4" "X.U.00A0..5" "X.U.0 ## [13] "X.U.00A0..7" "X.U.00A0..8" "X.U.00A0..9" "X.U.0 ## [17] "X.U.00A0..11" "X.U.00A0..12" "X.U.00A0..13" "X.U.0 ## [21] "X.U.00A0..15" "X.U.00A0..16" "X.U.00A0..17" "X.U.0 ## [25] "X.U.00A0..19"
  • 8. Data manipulation CN <- c('S1',paste0('10',1:9),paste0('1',10:24),'F1') getpath <- function(pos){ tt <- tdf$Controls..in.order.visited[pos] tt2 <- unlist(strsplit(tt,', ')) tt3 <- sapply(X=tt2,FUN = function(x)which(CN==x)) g <- G[tt3,] #df of controls g$Pos <- pos g$Pos <- factor(g$Pos) tt <- gettimez(sdf[pos,6:ncol(sdf)]) #splits g$split <- tt[!is.na(tt)] return(g) }
  • 9. Data manipulation library(grid) #for arrow BP <- ggplot(data=G,aes(x=LON,y=LAT,label=Value)) + geom_point(shape=1,size=3) + geom_text(size=4,hjust=-.5,color='red') + scale_shape_discrete(solid=FALSE) for(i in 1:nrow(tdf)){ GP <- BP+ geom_segment(data=getpath(i),aes(xend=c(tail(LON,n=-1),NA) arrow = arrow(angle = 15, ends = "last", length = unit(0.2 +ggtitle(paste0(i,': ',tdf[i,2],'nScore: ',tdf$Score[i], +scale_colour_gradient(limits=c(0,45),high='red',low='blu ggsave(GP,file=paste0('graphs/GP',sprintf("%03d",i),'.p } Use FFMPEG to make movie!
  • 15. Mapping library(ggmap) bbox <- make_bbox(LON, LAT, G, f = .8) map <- get_map(location = bbox,maptype='terrain') mp <- ggmap(map) + geom_point(data=G,aes(x=LON,y=LAT),shape geom_text(data=G,aes(x=LON,y=LAT,label=Value),size=4,hj scale_shape_discrete(solid=FALSE) + ylim(c(min(G$LA xlim(c(min(G$LON)-eps,max(G$LON)+eps)) NB geom_leg needed rather than arrow for some reason.
  • 21. Mapping Lessons: easy to use & integrates well with ggplot2 osm can be used rather than google, but service only runs in middle of night! discrete zoom levels can be awkward if you’re in between bbox’s are square; although you can trim the display with xlim etc. usual shenanigans with different coordinate systems
  • 23. Analysis Need a way of standardizing the leg durations, given splits from different runners. One might imagine for leg i and runner j, split Tij Tij = di /sj where di is an inherent leg duration, and sj is a relative speed. Then log Tij = log di − log sj Suggests linear regression: lm(log(split) ~ leg + Pos + 0)
  • 25. Optimization problem Combinatorial optimisation problem, similar to the travelling salesman problem These problems are (NP) hard Need to encode routes and their fitness (including penalties) sample a route as a permutation of 1:no_checkpoints, extracting the points between 1 and no_checkpoints 26! ≈ 4 × 1026 (cf Avogadro’s number) =⇒ need heuristics; not true solutions
  • 26. Genetic algorithms A class of optimization algorithms inspired by evolution. There is a population of solutions with: a notion of fitness generations mutation crossover (sex)
  • 27. Package GA Makes using these techniques pretty easy: GA <- ga(type = "permutation", fitness = fitness, min = 1, max = length(ptz), popSize = 1e2, maxiter = 1e4, run = 5e3, pmutation = 0.2)
  • 28. Package GA 0 2000 4000 6000 8000 10000 0100200300400 Generation Fitnessvalue qqqqqq q qqqqqqqqq qqqqqqqq qqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqq qqqqqq qqqqqqqqqqqqq qqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqq qqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqq qqq qq qqqq qqqq q qq qq qq q qq q qq qqqqq qqqq q qq q q q qq qq q q qq qqq q qq qqq q q q qq q q qq q qq q q q q qq q q qqqq q q qq qq q q q qq q qq q q q q q q q qq q qq qq qq qq q qqqqq q q q qqqqq q q qqqqq q q q q qq qq qqqqqq q q q q q q qqq qq q q q qq qq q q q q qq qq qq q q qq qq q q q qq q qqqq q qq q qqq qq qq qq q q q q qq q q qqqq qq qq qqq q qq q q q q qqq qqqqq q q qq q q qqq q qq q q qq qqqqq q q q qq q q q q q qq q q qqq qq qqq q q q qq q q q q q qq q qq qqq q q qq q q qq q q q qq q q qq q q q q qqq q qq q q q q qq q q q q q qq qq q q q qq q qq q q qq q qqq q qq qqq q qq q q qq q q q q q q q q qqq qqqqqqq q q q qq q q qq q q q q q qq qqq q q qq q q q q q q q q qq q qqq qq q q q q qqq qq q q q q q q qq q q q q q q q q qq q q q q q q qq q q q q qq qq q q q qqq q q qq q q q q q qqq q q qq q q q q q q q q qq q q q q q qqq qq qqqqq qq qq q qq q q q q q q qq qq qq q q qqq q q q q qq q q q q q qqqq q q q q q qq q q q qq q q qqqq q q qq q q q q q q q q qqq q qq q q q q q q q q q qq q q qq q q q q q q q q qq qq qq q qq q q q q q q q q q q q qq q qqqq qq q qqqq q qqqq q q q q qq q q qqq qqq q q qq qq q qq q qq q q q qq qq q q q q q q q q q q q q qq qq qq qq q q q q q qq q q q q qq q qq q qq qq q q qq q q q q q q q qq q q q qqq q q q qq qq q q qq q q qq qq qqq qq q q q qq q q q q q qqq q q qqq qq q q q q q q q q q q q q q q qq q qq q q qq q q q q q q q q qq q q q q q qq q q q q q qq qq q qq q qq q q qq q q q q q q q q qqq qq q q qq q q q q qqq qq qqqq q q q qq q q q q q q q qq qq q qq qq q q qqq qqq q q q q q q q q q q q q q q q q q q q q q q qq q qq qq q q qq qq q q q q q qq q q q q q q q q q q q qqq qq q q q q qqqq qq q q q q q qqq q q q q q q q qq qq q q q q q q q q q q q qq q q qqq q qqq q q qq q qq q qqq q q q q q q q qq q q q q q qqq qq q q q q q q q q q q q q q q q q qq q q qqq q qq q q q q qq q q q q q q q q qqq q q q q q q q q q qq q q q q q q q q qq q q q q q q qq qq qq q q q qq q q q q q q q q qq q q q q qqqq q q qq qq qq qq qq q qq q q q q q q q qqqq q q q q q q q qq q qq q qq q q q q q q q q q qq q q q q q q q q qq qq q q q q q q qqq q qq qq q q q q q q q q q qqq qqq q q q q q qq qq q q qq q q q q q q qq qqqq q q q q q q q q q q qqq q qq q q q q q qq q qq q q qq q qq q qq q q q q qq q qq q q q q q q qq q q q qqqq q qq q q q q q q qq q q qqq q qqq q q q q q qqq q qqq qq qq q q q q q qq qq q q q qq q q qq qq qqqq q qqq q q q q q qq qq q q q q q qqqq qq q qq qq qq q q qq q q q q qq qq q q q q q qq q q q q qqqqq q q q q q q q q q q q q q q qq q q q qq q q q qqq q q qq q q q q q q qq q q qqq q qqq q q qqqq q qq qq q q q qqq q q q q q q qq q q q q q q q q qq q q q q q qq q qqq q q qqq qq q q qqq qq q q q q q q q q q q q q q q q q q q q q q qqq qqqq q qq q q q q q qq q q q q qq q qqqq q q q q q q qqqq q q q q q q q q q q qq q qqq q q q qqqq q q qq qqq q qq q q q q q q q q qq q q q q q q q qqq q q q qq q qqq qqqqq qq q q q q qq q q q q q qq q q q q q q qq q q q q qq q qq qqq q q q q qq q q q q q qq qq q qq q q q q q q q q q q q qqqq q qq q q q qqq q qqq qq q q qqq qqq q qq qqq q q q q q q q q q q qq q q q q q qqq q q qqq q q q qq q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q qq q q q q q q q q q q q q q q q qq q q q qq q q q q qq qqq q q q q q q q q q q qq q q q q q qqq qq q q qq q q q q qq q qqq q q qq q qqq qq q q q qqq q q q q q q q qq q q q qq q q q q q qq q q q q q q qqq q qq q q qqqqq q qq q q q q q q q qq q qqq q q qq q q q q q q q q q q q q q q qq q q q q q qqq qq q q q q q q q q q qqq q qq qqq q q q qqqq qq qq q q q qq q q q q q q q q q q q qq q q qq q q qq q q q q q q qq q q q qqq q q q q q q q qq q qq qqq qq q q q q q q qq q q qq q qqq q q qq q q q q q q q q q qq q q q qq q q qqq q q qq q q qq q q q qq q q q q q q q qq q qqq q q q q qq q q q q q q qq q q q q q q q q q q q q q q qq q q q q qqq q q qqq q q q qq q qq q q q q qq q q q q q q qq q q q qqqq q q qqq q qqqq qq q q q q q q q qq q q q q q q q qq q q q q qq q qq q qq q qqq q q qqq q q q qq q qq q q q q q q q q q q q q q q q qqqq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q qq qqqq q q q q q q qq q q q q qq q q q qq q qq q qq q q q qq q q q q q q q q q q q qq q q q q q q q q q q qq q q qq q q qq q q q q q q q q q q q q q q q qq q q q qq q q q q qq q q q q q q q q q q q q q q q qq q q q q q q q q q qq q q q qq q q q q q q q q q qq q q q q q q q qqqq q q q q qq q q q q qqqqq q q q q q qq q qq q qq q q q q q qq q qqq q qq q q q q q qq q qq q q qq q q q q q q q q q q q q q q qq qq q q q qq q q qq q q qqq qq q q q q qq qqq qq qq q q q q qq q q q qq q q q q qq q q q qq q q q q q q q qq q q q q qq qq q q q q q q q q q q q qqq q q qq q q q q q q q qq q q q q q q q q qq q qq q q q q q q q q q q q q qq qq q q q q q q q q q q q q q q q qq q qqq qq q q q q qqq q q q q q q q q q q q q q qq qq q q q q q q qq q q q q q qq qq q q q q q q q q q q q q qqq q q q q q q q q q qq q q q q q qq q q q q q q qq qq q q q qq q q q q q q q q q q q q q q q qqqq q qq q q q q qq qqq q q q q qq qq q q q q q q q q q q q qq q q qq q q qqq q q q q qq qqq q q q q qq qq q q q q q q q qq q qq q q q q q q q q q q q q q q q q q q q q q q q qq q qq q q q q qq q q q q q q qq qq q q qq q q qq q q q qqq q q q q q q q qqq q q q q q q q q qq qqqq q q q q q q q q qqq q qq q q q qq q q q q q q q q q q qq q q qq q q q q q q q q qq q q q q q qq q q q q qq q q q q qq q q q q q q qq q q qq q q q qqq qq q q q q q q qqq q q q q qqq q q qqq q q q q q qq q qq q q q q qq qq q qqq q q q q q q q q q qq qq q q q q q q q q q q qq q q q qq q q qqqq q q q q q q q q qqqqq q q qq q qqq qq q q q q q qqq qq q q q q q q q qq q q q q qq q qq q q q q q qq q q q q q q q q q q q q q q q q q q qq q q q qqq q q q q qq q q qq q qqq q q q qq qq q q q q q qq qqqq q q q qq qq q q q q qq q qq q qqqq q q q qq qqq q q q q q q q q q q q q q q q q q q q q q q qq q qqq qqq q q qq q q qq q q qq q q q qqq q q q q q q q qqq q q q qq qq q q q q qq qqq q q qq q q q q qq q q q q q qqq q q q q q q q q qq q qq q qq q q q qq q qq qq qq q q q q q qqq q qq q q q q q q qq q q q qq qqqq qq q qq q q q q q q qq q qq q q qqq q q qq q q q q qq q q q q q q q q q qq q qq qq q q q q q q q qq q q qq qqqq q q q q q q q qq q q q q q q q q q q q q q q q q qq q q qq q q q q qqq q qq q q qq q qq q q qq qqq q qq q q q q q q q q q qq qqq q qq q q q q qq q q qq q qqq q qqq q q qq q q q q q q q q q q q q q q q q q q q q q q qq q q qqq q q q q qq q q qq q q q q qq q qq qqqq q q qq q q qq q qq q q q qq q q qq q q q q q q q q qqq q q q qq q qq qq qqq q q qq q q q q q q qq q q q q q q qq qq q q q q q qqqq q q qqqq qq q q q q q q q q q q qqq q q q qqq q q q qq qq qq q q q qq q q q q q qq q qq qq q q q qqq q q q q q q q qq q q q qqq q qq q q q q q q q q qq q q q q q q q q q q q qq q q q qq q qq q qq qqqqq qqq q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q qqq q q q qqq qq q q q q q q q q qq q q q q q q q qq q q qq q q qq q q q qq qq q q q q q qq q q q q q q qq q q q q q q q q q q q q qq q q q q q q q q q qq q q q q q q q q q q q q q q qq qq qq q qq q q qq q q q qqqq q qq q q q q q q q q q q q q q q q q q qq q q q qq q q q qq qqqq q q q q qq q q q q q q q q q q q q qqq q q q q qqqq q q q qqq q qq q q q q q q q q q q q qq q q q q q q q qq qq q q qqqq q qq qqq q qqq q qqq qq q qq qq q q qq q q q q q q q q q q qqq q q qq q q q q q q q q q q q q q qqq q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q qq qq qq q q q q q q qq q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q qq q q q q q q q q q q q q qq q q qq q q q q q q q q q q q q q qq q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q qqq q q qq q q q q q q q qq q q q q q q q q q q q q q q qq q q q qq q q q q q q q q q q q q q q q q qq q q qq qqq q q q q q q q q q q q q qq q q qq q q q q q q q q q q q qq q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qqq q q q q q q q q q q q q q qq q q q qq q q qq q q qq q q q q q q q q q q q q q q q q q q q q q qq q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q qq qq q q q q qqqq q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q qq q q q q qq q q q q q q q q q qq q q q qq q q qq q q qq q q qq qq q q q q qq q q qq q q q q q q q q q qq q q q q q q q q q q qq q q q q q q q q q q q q q qq q q qq q q q q q q q q q q q q q q q q q q qqq q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q qq q q q qq q q q q q q q q q q q q q q q q q qq qq q qq q q q q q q q q qq q q qqqq qq qq q q q q q q q q q qqq q q qq q q q q q q q q q q q q q q q q q qq q q q q q qq q q qq q q q q q q q q qq q q q q qq q qq q q q q q q q q q q q q q q qqq q q q q q q q q q q q q q q qq q q q q qq q q q q q qq qqqq q q q qq q qqq q q q q q q q q qq q q qqqq qq q q q q q q q q q q qq q q q q q q qq q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q qqq q qq q qq qq q q q q q q q q q q q qq q q q q q q q q q q q q qq q q q q q qq q q q q q q q q q qqqq q qq q q qq q qqq q q qq qq q qq q qq qq q q q q qq q q q q qq q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q qq q q qq q qq q q q q q q q q q q q q q q q q qq q q q q q qqqq q q qq q q qq q q q q q q q q q q q q q q q q q q q q q qq q q q q q qq q q q q q qq q q q q q q q q q q q q q q q q q q q q q q qq q q q q q qq q q q q q qq q qqq q q q q q qq q q q q q qq q q qq q q q q q q qq q q q qq qq q q q q q q q q q qq q qq q qq q q qq q q q q q q q q q q q q q qq q q q q q q q q qq q q q q q q q q q q q q q q q q q q qq q q q q qq q q qq q q qq q q qq q q q qq qq q q q q q q q q q q qq q q qq q q q q q qq q q q q q q q q q q qq q q qq q qq q qq q q q q qq q q qq q q q q q q q q q q q q q q q q q q q q qqq q q q q qq q q qq q q qq q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q qq q q q q q qq q q q q q q q q q q q q q q q qq q q q q q q q q q q q qqq q q qqq q q q q q q q qq q q qq q q q q q q q q q q q qq q q q q q q q q q q q q q q q qq qq q q q q q q q q q q q qq q q q q qq qq q q q q q q q q q q q q q q q q q q q q q q qq qq qq q q q q q q q q q q q qq q q q q qq q q q q q q q q q q q q qq q q q q qq q qq q q q q q q q q qq qqq qq q q q q q q qqq q qq q qq q q q q qq q q q q q q q q qq qq q q q q q qq q q q q q q q qqq q q q q qq q q q q qq q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q qq q q q q q q q q q q q q q q q q q q q q q qq qq q q q q q q q q q q q q q q q q q q q q q q q q q q qq q qq q q q q qqq q q q q q qq qq q qq qq q q q q q q q q q q q q q qq q qq q q q q q q q q q q qq qqq q q q q q q q q q qq q q q qq q q qq q q q q qq q q q qq q q q q qq q q q qq qq qqqq qqq q q q q q qqq q q q q q qq q qqq q qq q q q qqq q q q q q q q q q q qqq q q q q q q q q q q qq q q q q q q q q q q qqq q q q q q q q qq q q q q q q q q q qq q qqq q qq q q q q q q q q q q qq qq qq q q q qq q qq q q q qq qq q q q q q q qq q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q qqq q q q q q q qq q q q qq qqq q qq q q q q q q q qq q q qq q q qq q q q q q qq q qq q q qq q q q q qq q q qqq q q q q q q q qqq q q q q q q q q q q q qq q q qq q q q q q qq q qqq q qq qq q qq q q q q qq q q q q q q q q qq q q q q qq q q q q q q q q qq q q qq q q q q q qq qq q q q q q q q qq q q q qqq q q qq q q q q q q q q q q q q q q q qq qq q q qq q qq q q q q q qq q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q qq qq q q q q q q qq q q q q q q q q qq q q q q q q q qq q q q q q qq q q q q q q q q q q qq qq q q q q q q q q q q q q qq q q q q q q q q q q qq q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q qq q q q q q q q q qq q q q q q q qq q q qq q q q q q qq q q q qq q q q q qqq q q q q q q q q q q qqq q q q q q q q q qq q q qq q qq q q qqq q qq q q q qqqq q q q q q q qq qq qq q q q q q q q q q q q q q qqq q q q q q q q qqq qqq qq q q q qq q q q q q q q q q q q q q q q qq qq q qq q qq q q qqq q q qq q q qqq qq q q qq q q qqq q qq q q qq q q q q q q q q qq q q q q q q q q qq qq q qqq qqq qqq q qq q q q q q q q qqq q q q q q q qq q q q q q q q q q q q q q q qq q q q qq q q q q q q q q q qq q q q q q q q q q q qq q q q q q qq q q q q q q q q q q q qq q qq q qq q q q q q q qq q q qq q q q q q q qq q q q q q q q q q q q q qq q q q q q q q q q q q q q qq q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q qqq q q q q q q qq q q q q qq q q qq qq qq q qq q q qq q q q q q qq q q qq q q q q q q q q q q q q q q q qq q qq q q q qq q q q q qq qq q q qq q q q q q q q q qq qq q q q q q q q q q q q q q q q q qq q q q q q qq q qq qq q q q q q q q q q q q q q q q q q q q q qq q q q q q q qq q q q q q q q qq q q q q q qq qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q qq q q q q qq q q q q q q qq q q q q q q qq q qq q q q q q q q q q q q q qq q q qq q q q q q q q q q q q q q q q q q q qq q q q q q q qq q q q q qq q q q q q q q q qq q qq q q q qq q q q qq q q q q q q q qq q q q q q q q q q q qq q qq q q q q q q q q q q q q q q qqq q q q q q q qq q q qq q q q q q q q qqq q qqq q qq qq q q qq qq q q qq q q q q qqqq q q qqq q q q q q q q q qq q q qq qq q q q q q q q q q q q qq q q q q q q q qq q q q q q q q q q q q q q q q q qq qq q q q q qq q q q q q qq q q q qq q q q q q q q q q q q q q q qq q q q q q qq q qq q q qq q q qqq q q q q q qq q q qq q q qq q q qq q q q q q q qq q q q q q q q qq q q q q qq q q q q q q q q qq q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q qq q q q q q qq q q q q q qq q q q q q q q q qq q q q q q q q qq q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q qq q q q qq q q q q q q q q q q q q qq q q q q q q q q q q q qq q q q q q q q qqq qq q qq q q q qq q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q qqq qq q q q q q q q q q q q q q qq q q q q q q q q q q q q q qq q qq q q q q q q q q q q q q q q q q q q q qq q qqq q q q q q q q q q q q q q q q q q q qq q q q q q q q qq q qq q q q q q q q q q q q q q qq q q q q q q q q q qq q q q qqq q q qqqqq q q q q q q qq q q q q q q q q q q q q q qqq q qq q q qq q q q q q q q q q q q q qq q qqq q q q q q qq q q q qqqqq q q q q q q qq q q q q qqq q q q q q q q q q q q q qq q q q q q q q q q qq q qq q q q q q q qq q qq q q q qq q q qqq q q qq qq q q q q qq q qq qq q q qqq q q qq q qq qq qq q q q q q q q qq qq q q q q qqqq q q q q q qqq q qq q q qq q qqqq qq q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q qqq q q q qq q qq q q q q q q q q q q q q qq q q q q q qq q qq q q qq q q q q q qq q q qq q q q qqq qq q q q q q q q q qq q q qq qq q q qq qqq q qq qq q qqq q qq q q q q q q q q q qq q q q q q q q q q q q qqq q qq q q q q q q q q q q qq qq q q q q q qq q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q qq q q q q q q q q q qq qq q q q q q q q q q q q q q q q q qqq q q q q q q q qqq q q qq qq q q q q qqq qq q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q qq q q q qq q q q q q q q q q qq qq qq qq q q q q q q q qq q q q q qq q q qqq q q q q q q qq q qq q q q q q q q q q q q q q q q q qq q q q qq q q q qq q q qq q q q q q q qq q q q qq q q qqq q q qqq q q q q q qq q q qq q q q q qq qq qq qq q q q q q q q qq q q qq qq q q q q q q qqqqqq qq q q q qq q qq q q q q q q q q q qq q q q q q q qqq qqq q q q q qq q q qq q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qqq q qq q q q q q qq qq q q q q q q q q qq qq qq q q q q q q q qq qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq qq q q q q q q q q q q qq q q q qq q q q q q q q q q q q q q q q q q q qq q qq qq q q q q q q qq q q q q q q q q q q q q q q q q q q qq q q q qq q q q q q q q q q q q q q q q q q qq q q q q q qq q q q q qq q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q qqq q q q q q q q q q q q qq qq q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q qq q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q qq q q q q q qq q q q q q q q q q q q q qq q q q q q q q qq q qq q q q q q q q q qq q q q q q q qq q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q qqq q q q q q q q q q q q q q q q q q q q q qq q q q qq q q q q q q q q q qq q qq q qq qq q q q q q q q q q q qq q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q q q qq q q q q q q q q q q q q q q qq q q q q q q q qq q q q q q q q q q q q q q qq q q q q q qq q q q qq q q q q q q q q q q q qq qq q q q q qq q qq q q q q q q q q q qq q q q q q qq q q q q q q q q q q q q qq q qq qq q q q q q q q q q qq q q q q q q q q q q q q qq qq qq qq q q q q q q q q q q q q q q q q q q q qq q q q q q q q q q qq q q q q q q qq q q q q q q q q q q q qqq q q q q qq q q q qq q q q q qq q q q q q q q q q q q q q q q q q q qq qq q qq q qq q q qq q q q q q q qqq q q q q q q q q q q q q q q q q q q q q q q q q q q qq q qqq q q q q qq q q q qq q q q q q q qq q q q q q q q qq q q q q q q q q q q q q qq q q q q q q q q q q qqqqq qq q q q q q q q q qqq q q qq q q q qq qqq q qq q q q q q q q q qq q q q q q qq q q qq q q q q q q q qq q q qq q qq q q q qq q qq q q q q q q q q q q q q q q qq q q q q q qq q q q qq q q q q q q q q qq q qq qq q q q q q q q qq q q q Best Mean