new7 <- read.csv(file="N:/DaheeKim/April/Reef/reef.csv", header=TRUE, sep=",")
data1 <- new7
head(data1)
####################################################################################################
library(dplyr)
percent3 <- percent2
this <- c(1:9)
for(x in 1:9){
  data1 <- mutate(data1, overX = ifelse(value> x,"Pass","fail"))
  
  #change Character to Factor (for counting 0 frequency)
  data1[sapply(data1, is.character)]  <- lapply(data1[sapply(data1, is.character)],as.factor)
  
  #Relative Frequency table
  
  percent <-   data1 %>%
    group_by(Date,Tank,overX, .drop = FALSE) %>%
    summarise(count = n()) %>%
    mutate(relfreq= count / sum(count)*100) 
  
  percent2 <-  percent %>%
    filter(overX=="Pass") %>%
    select(Date,Tank, relfreq)%>%
    rename(Percent =relfreq)
  
  data1 <- na.omit(data1)
  table2<- data1 %>%
    group_by(Date,Tank) %>%
    summarise(Average = mean(value))
  
  percent2 <- as.data.frame(percent2)
  table2 <- as.data.frame(table2)
  
  #Add column from other dataframe
  percent2["Average"] <- table2["Average"]
  percent3[ , paste0("Percent", x)]<-  percent2$Percent
  #print(head(percent2))
}
head(percent3)
head(percent2)
#############################################################################################################
#package easynls(nonlinear model )
#############################################################################################################
library(easynls)
percent2$time <- as.numeric(percent2$Date)
new <-cbind(percent2$time, percent2$Percent)
new <- as.data.frame(new)
colnames(new) <- c("time","Percent")
# linear
nlsfit(new, model=1)
$Model
[1] "y~a+b*x"

$Parameters
# quadratic
nlsfit(new, model=2)
$Model
[1] "y~a+b*x+c*x^2"

$Parameters
# linear plateau
nlsfit(new, model=3)
$Model
[1] "y ~ a + b * (x - c) * (x <= c)"

$Parameters
# quadratic plateau
nlsfit(new, model=4)
$Model
[1] "y ~ (a + b * x + c * I(x^2)) * (x <= -0.5 * b/c) + (a + I(-b^2/(4 * c))) * (x > -0.5 * b/c)"

$Parameters
# two linear
#nlsfit(new, model=5, start=c(50,5,2,50))
# exponential
nlsfit(new, model=6, start=c(50,0.03))
$Model
[1] "y~a*exp(b*x)"

$Parameters
# logistic
nlsfit(new, model=7, start=c(98.20,1.4,0.03))
$Model
[1] "y~a*(1+b*(exp(-c*x)))^-1"

$Parameters
# van bertalanffy
nlsfit(new, model=8, start=c(118,1.4,0.03))
$Model
[1] "y~a*(1-b*(exp(-c*x)))^3"

$Parameters
# brody
nlsfit(new, model=9, start=c(118,4,0.05))
$Model
[1] "y~a*(1-b*(exp(-c*x)))"

$Parameters
# gompertz
nlsfit(new, model=10, start=c(100,4,0.05))
$Model
[1] "y~a*exp(-b*exp(-c*x)"

$Parameters
# linear
nlsplot(new, model=1)

# quadratic
nlsplot(new, model=2)

# linear plateau
nlsplot(new, model=3)

# quadratic plateau
nlsplot(new, model=4)

# two linear
#nlsplot(new, model=5, start=c(50,5,2,50))
# exponential
nlsplot(new, model=6, start=c(50,0.03))

# logistic
#nlsplot(new, model=7, start=c(118,1.4,0.03))
# van bertalanffy
nlsplot(new, model=8, start=c(118,1.4,0.03))

# brody
nlsplot(new, model=9, start=c(118,4,0.05))

# gompertz
nlsplot(new, model=10, start=c(100,4,0.05))

reg.Gompertz= nls("Percent~A*exp(-exp(mu*exp(1)/A*(lambda-time)+1))", percent3, start=list(A=100,mu=7.185374,lambda=21.000000))
Error in nls("Percent~A*exp(-exp(mu*exp(1)/A*(lambda-time)+1))", percent3,  : 
  singular gradient
SS<-getInitial(Percent~SSlogis(time,alpha,xmid,scale),percent2)
fm1 <- nls(Percent ~ SSlogis(time, Asym, xmid, scal), data = percent2)
summary(fm1)

Formula: Percent ~ SSlogis(time, Asym, xmid, scal)

Parameters:
     Estimate Std. Error t value Pr(>|t|)    
Asym 97.73746    0.70410  138.81   <2e-16 ***
xmid  7.42913    0.06600  112.56   <2e-16 ***
scal  1.38983    0.05683   24.45   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.446 on 57 degrees of freedom

Number of iterations to convergence: 0 
Achieved convergence tolerance: 2.448e-06
reg.Logistic= nls(Percent~(Asym)/(1+exp((xmid-time)/scal)),data=percent2, start=list(Asym=98.1750,xmid=24.3177,scal=4.9204))
Error in nls(Percent ~ (Asym)/(1 + exp((xmid - time)/scal)), data = percent2,  : 
  singular gradient
#############################################################################################################
# Nonlinear Regression for (Richards) function
#############################################################################################################
#install.packages("NRAIA", repos="http://R-Forge.R-project.org")
library(NRAIA)
Loading required package: lattice
Registered S3 methods overwritten by 'NRAIA':
  method           from 
  plot.nls         nlme 
  plot.profile.nls stats
reg.Richards <- nls(Percent ~ SSRichards(time, Asym, xmid, scal, lpow), percent2)
summary(reg.Richards <- nls(Percent ~ SSRichards(time, Asym, xmid, scal, lpow), percent2))

Formula: Percent ~ SSRichards(time, Asym, xmid, scal, lpow)

Parameters:
     Estimate Std. Error t value Pr(>|t|)    
Asym  99.1846     0.7688 129.017   <2e-16 ***
xmid   3.0067     2.6619   1.130   0.2635    
scal   1.9750     0.1642  12.028   <2e-16 ***
lpow  -1.8813     1.1107  -1.694   0.0959 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.005 on 56 degrees of freedom

Number of iterations to convergence: 0 
Achieved convergence tolerance: 3.004e-06
reg.Richards=  nls(Percent ~ A*(1+exp((xmid-time)/scal))^(-exp(-lpow)),data=percent2,start=list(A=99.4454,xmid=6.2748,scal=7.0667,lpow=-2.1747))
Error in nls(Percent ~ A * (1 + exp((xmid - time)/scal))^(-exp(-lpow)),  : 
  singular gradient
#############################################################################################################
# Nonlinear Regression for (van bertalanffy) function
#############################################################################################################
reg.van=  nls(Percent ~ a*(1-b*(exp(-c*time)))^3,data=percent2,start=list(a=103.6684,b=2.3165,c=0.083))
#compare graph
AIC(reg.Logistic, reg.Richards,reg.Gompertz,reg.van)
Error in AIC(reg.Logistic, reg.Richards, reg.Gompertz, reg.van) : 
  object 'reg.Logistic' not found

#############################################################################################################  
#table 
library(knitr)
kable(new2, format = "rst")
Error in kable(new2, format = "rst") : object 'new2' not found
LS0tDQp0aXRsZTogIkdyb3d0aCBNb2RlbCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KbmV3NyA8LSByZWFkLmNzdihmaWxlPSJOOi9EYWhlZUtpbS9BcHJpbC9SZWVmL3JlZWYuY3N2IiwgaGVhZGVyPVRSVUUsIHNlcD0iLCIpDQpkYXRhMSA8LSBuZXc3DQpoZWFkKGRhdGExKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbGlicmFyeShkcGx5cikNCnBlcmNlbnQzIDwtIHBlcmNlbnQyDQp0aGlzIDwtIGMoMTo5KQ0KZm9yKHggaW4gMTo5KXsNCiAgZGF0YTEgPC0gbXV0YXRlKGRhdGExLCBvdmVyWCA9IGlmZWxzZSh2YWx1ZT4geCwiUGFzcyIsImZhaWwiKSkNCiAgDQogICNjaGFuZ2UgQ2hhcmFjdGVyIHRvIEZhY3RvciAoZm9yIGNvdW50aW5nIDAgZnJlcXVlbmN5KQ0KICBkYXRhMVtzYXBwbHkoZGF0YTEsIGlzLmNoYXJhY3RlcildICA8LSBsYXBwbHkoZGF0YTFbc2FwcGx5KGRhdGExLCBpcy5jaGFyYWN0ZXIpXSxhcy5mYWN0b3IpDQogIA0KICAjUmVsYXRpdmUgRnJlcXVlbmN5IHRhYmxlDQogIA0KICBwZXJjZW50IDwtICAgZGF0YTEgJT4lDQogICAgZ3JvdXBfYnkoRGF0ZSxUYW5rLG92ZXJYLCAuZHJvcCA9IEZBTFNFKSAlPiUNCiAgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQ0KICAgIG11dGF0ZShyZWxmcmVxPSBjb3VudCAvIHN1bShjb3VudCkqMTAwKSANCiAgDQogIHBlcmNlbnQyIDwtICBwZXJjZW50ICU+JQ0KICAgIGZpbHRlcihvdmVyWD09IlBhc3MiKSAlPiUNCiAgICBzZWxlY3QoRGF0ZSxUYW5rLCByZWxmcmVxKSU+JQ0KICAgIHJlbmFtZShQZXJjZW50ID1yZWxmcmVxKQ0KICANCiAgZGF0YTEgPC0gbmEub21pdChkYXRhMSkNCiAgdGFibGUyPC0gZGF0YTEgJT4lDQogICAgZ3JvdXBfYnkoRGF0ZSxUYW5rKSAlPiUNCiAgICBzdW1tYXJpc2UoQXZlcmFnZSA9IG1lYW4odmFsdWUpKQ0KICANCiAgcGVyY2VudDIgPC0gYXMuZGF0YS5mcmFtZShwZXJjZW50MikNCiAgdGFibGUyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUyKQ0KICANCiAgI0FkZCBjb2x1bW4gZnJvbSBvdGhlciBkYXRhZnJhbWUNCiAgcGVyY2VudDJbIkF2ZXJhZ2UiXSA8LSB0YWJsZTJbIkF2ZXJhZ2UiXQ0KICBwZXJjZW50M1sgLCBwYXN0ZTAoIlBlcmNlbnQiLCB4KV08LSAgcGVyY2VudDIkUGVyY2VudA0KICAjcHJpbnQoaGVhZChwZXJjZW50MikpDQp9DQpoZWFkKHBlcmNlbnQzKQ0KaGVhZChwZXJjZW50MikNCmBgYA0KDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KI3BhY2thZ2UgZWFzeW5scyhub25saW5lYXIgbW9kZWwgKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbGlicmFyeShlYXN5bmxzKQ0KcGVyY2VudDIkdGltZSA8LSBhcy5udW1lcmljKHBlcmNlbnQyJERhdGUpDQpuZXcgPC1jYmluZChwZXJjZW50MiR0aW1lLCBwZXJjZW50MiRQZXJjZW50KQ0KbmV3IDwtIGFzLmRhdGEuZnJhbWUobmV3KQ0KY29sbmFtZXMobmV3KSA8LSBjKCJ0aW1lIiwiUGVyY2VudCIpDQojIGxpbmVhcg0KbmxzZml0KG5ldywgbW9kZWw9MSkNCiMgcXVhZHJhdGljDQpubHNmaXQobmV3LCBtb2RlbD0yKQ0KIyBsaW5lYXIgcGxhdGVhdQ0KbmxzZml0KG5ldywgbW9kZWw9MykNCiMgcXVhZHJhdGljIHBsYXRlYXUNCm5sc2ZpdChuZXcsIG1vZGVsPTQpDQojIHR3byBsaW5lYXINCiNubHNmaXQobmV3LCBtb2RlbD01LCBzdGFydD1jKDUwLDUsMiw1MCkpDQojIGV4cG9uZW50aWFsDQpubHNmaXQobmV3LCBtb2RlbD02LCBzdGFydD1jKDUwLDAuMDMpKQ0KIyBsb2dpc3RpYw0KbmxzZml0KG5ldywgbW9kZWw9Nywgc3RhcnQ9Yyg5OC4yMCwxLjQsMC4wMykpDQojIHZhbiBiZXJ0YWxhbmZmeQ0KbmxzZml0KG5ldywgbW9kZWw9OCwgc3RhcnQ9YygxMTgsMS40LDAuMDMpKQ0KIyBicm9keQ0KbmxzZml0KG5ldywgbW9kZWw9OSwgc3RhcnQ9YygxMTgsNCwwLjA1KSkNCiMgZ29tcGVydHoNCm5sc2ZpdChuZXcsIG1vZGVsPTEwLCBzdGFydD1jKDEwMCw0LDAuMDUpKQ0KDQojIGxpbmVhcg0KbmxzcGxvdChuZXcsIG1vZGVsPTEpDQojIHF1YWRyYXRpYw0KbmxzcGxvdChuZXcsIG1vZGVsPTIpDQojIGxpbmVhciBwbGF0ZWF1DQpubHNwbG90KG5ldywgbW9kZWw9MykNCiMgcXVhZHJhdGljIHBsYXRlYXUNCm5sc3Bsb3QobmV3LCBtb2RlbD00KQ0KIyB0d28gbGluZWFyDQojbmxzcGxvdChuZXcsIG1vZGVsPTUsIHN0YXJ0PWMoNTAsNSwyLDUwKSkNCiMgZXhwb25lbnRpYWwNCm5sc3Bsb3QobmV3LCBtb2RlbD02LCBzdGFydD1jKDUwLDAuMDMpKQ0KIyBsb2dpc3RpYw0KI25sc3Bsb3QobmV3LCBtb2RlbD03LCBzdGFydD1jKDExOCwxLjQsMC4wMykpDQojIHZhbiBiZXJ0YWxhbmZmeQ0KbmxzcGxvdChuZXcsIG1vZGVsPTgsIHN0YXJ0PWMoMTE4LDEuNCwwLjAzKSkNCiMgYnJvZHkNCm5sc3Bsb3QobmV3LCBtb2RlbD05LCBzdGFydD1jKDExOCw0LDAuMDUpKQ0KIyBnb21wZXJ0eg0KbmxzcGxvdChuZXcsIG1vZGVsPTEwLCBzdGFydD1jKDEwMCw0LDAuMDUpKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBOb25saW5lYXIgUmVncmVzc2lvbiBmb3IgR29tcGVydHogZnVuY3Rpb24NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmZpdC5nb21wZXJ0eiA8LSBmdW5jdGlvbihkYXRhLCB0aW1lKXsNCiAgZCA8LSBkYXRhLmZyYW1lKHk9ZGF0YSwgdD10aW1lKQ0KICANCiAgIyBNdXN0IGhhdmUgYXQgbGVhc3QgMyBkYXRhcG9pbnRzIGF0IGRpZmZlcmVudCB0aW1lcw0KICBpZiAobGVuZ3RoKHVuaXF1ZShkJHQpKSA8IDMpIHN0b3AoInRvbyBmZXcgZGF0YSBwb2ludHMgdG8gZml0IGN1cnZlIikNCiAgDQogICMgUGljayBzdGFydGluZyB2YWx1ZXMgIyMjDQogIGkgPC0gd2hpY2gubWF4KGRpZmYoZCR5KSkNCiAgc3RhcnRpbmcudmFsdWVzIDwtIGMoYT1tYXgoZCR5KSwgDQogICAgICAgICAgICAgICAgICAgICAgIG11PW1heChkaWZmKGQkeSkpLyhkW2krMSwidCJdLWRbaSwgInQiXSksIA0KICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE9aSkNCiAgcHJpbnQoIlN0YXJ0aW5nIFZhbHVlcyBmb3IgT3B0aW1pemF0aW9uOiAiKQ0KICBwcmludChzdGFydGluZy52YWx1ZXMpDQogIA0KICBmb3JtdWxhLmdvbXBlcnR6IDwtICJ5fmEqZXhwKC1leHAobXUqZXhwKDEpL2EqKGxhbWJkYS10KSsxKSkiDQogIG5scyhmb3JtdWxhLmdvbXBlcnR6LCBkLCBzdGFydGluZy52YWx1ZXMpDQp9DQpwZXJjZW50MyA9IHBlcmNlbnQyW3BlcmNlbnQyJFBlcmNlbnQgIT0gMCwgXQ0KZml0IDwtIGZpdC5nb21wZXJ0eihwZXJjZW50MyRQZXJjZW50LCBwZXJjZW50MyR0aW1lKQ0KDQpyZWcuR29tcGVydHo9IG5scygiUGVyY2VudH5BKmV4cCgtZXhwKG11KmV4cCgxKS9BKihsYW1iZGEtdGltZSkrMSkpIiwgcGVyY2VudDMsIHN0YXJ0PWxpc3QoQT0xMDAsbXU9Ny4xODUzNzQsbGFtYmRhPTIxLjAwMDAwMCkpDQpwbG90KFBlcmNlbnR+IHRpbWUscGVyY2VudDIpDQpBPC1jb2VmKHJlZy5Hb21wZXJ0eilbMV0NCm11PC1jb2VmKHJlZy5Hb21wZXJ0eilbMl0NCmxhbWJkYTwtY29lZihyZWcuR29tcGVydHopWzNdDQpsaW5lcyh0aW1lPC1wZXJjZW50MiR0aW1lLEEqZXhwKC1leHAobXUqZXhwKDEpL0EqKGxhbWJkYS10aW1lKSsxKSksY29sPSdyZWQnKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KI05vbmxpbmVhciBSZWdyZXNzaW9uIGZvciAoTG9naXN0aWMpIGZ1bmN0aW9uDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojaW5zdGFsbC5wYWNrYWdlcygidmlnbmV0dGVzIikNCmxpYnJhcnkodmlnbmV0dGVzKQ0KbGlicmFyeShubG1lKQ0KI2ZpbmQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcXVhdGlvbg0KU1M8LWdldEluaXRpYWwoUGVyY2VudH5TU2xvZ2lzKHRpbWUsYWxwaGEseG1pZCxzY2FsZSkscGVyY2VudDIpDQpmbTEgPC0gbmxzKFBlcmNlbnQgfiBTU2xvZ2lzKHRpbWUsIEFzeW0sIHhtaWQsIHNjYWwpLCBkYXRhID0gcGVyY2VudDIpDQpzdW1tYXJ5KGZtMSkNCnJlZy5Mb2dpc3RpYz0gbmxzKFBlcmNlbnR+KEFzeW0pLygxK2V4cCgoeG1pZC10aW1lKS9zY2FsKSksZGF0YT1wZXJjZW50Miwgc3RhcnQ9bGlzdChBc3ltPTk4LjE3NTAseG1pZD0yNC4zMTc3LHNjYWw9NC45MjA0KSkNCnBsb3QoUGVyY2VudH4gdGltZSxwZXJjZW50MikNCmxpbmVzKHBlcmNlbnQyJHRpbWUsIHByZWRpY3QocmVnLkxvZ2lzdGljKSxjb2w9InJlZCIpDQpgYGANCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIE5vbmxpbmVhciBSZWdyZXNzaW9uIGZvciAoUmljaGFyZHMpIGZ1bmN0aW9uDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojaW5zdGFsbC5wYWNrYWdlcygiTlJBSUEiLCByZXBvcz0iaHR0cDovL1ItRm9yZ2UuUi1wcm9qZWN0Lm9yZyIpDQpsaWJyYXJ5KE5SQUlBKQ0KcmVnLlJpY2hhcmRzIDwtIG5scyhQZXJjZW50IH4gU1NSaWNoYXJkcyh0aW1lLCBBc3ltLCB4bWlkLCBzY2FsLCBscG93KSwgcGVyY2VudDIpDQpzdW1tYXJ5KHJlZy5SaWNoYXJkcyA8LSBubHMoUGVyY2VudCB+IFNTUmljaGFyZHModGltZSwgQXN5bSwgeG1pZCwgc2NhbCwgbHBvdyksIHBlcmNlbnQyKSkNCnJlZy5SaWNoYXJkcz0gIG5scyhQZXJjZW50IH4gQSooMStleHAoKHhtaWQtdGltZSkvc2NhbCkpXigtZXhwKC1scG93KSksZGF0YT1wZXJjZW50MixzdGFydD1saXN0KEE9OTkuNDQ1NCx4bWlkPTYuMjc0OCxzY2FsPTcuMDY2NyxscG93PS0yLjE3NDcpKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBOb25saW5lYXIgUmVncmVzc2lvbiBmb3IgKHZhbiBiZXJ0YWxhbmZmeSkgZnVuY3Rpb24NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlZy52YW49ICBubHMoUGVyY2VudCB+IGEqKDEtYiooZXhwKC1jKnRpbWUpKSleMyxkYXRhPXBlcmNlbnQyLHN0YXJ0PWxpc3QoYT0xMDMuNjY4NCxiPTIuMzE2NSxjPTAuMDgzKSkNCiNjb21wYXJlIGdyYXBoDQpBSUMocmVnLkxvZ2lzdGljLCByZWcuUmljaGFyZHMscmVnLkdvbXBlcnR6LHJlZy52YW4pDQpgYGANCg0KDQpgYGB7cn0NCiNwbG90MQ0KcGxvdChwZXJjZW50MiwgeWxhYj0iR3Jvd3RoIE1vZGVsIikNCmxpbmVzKHBlcmNlbnQyJHRpbWUsIHByZWRpY3QocmVnLkdvbXBlcnR6KSxjb2w9InJlZCIsbHR5PTIsIGx3ZD0yKQ0KbGluZXMocGVyY2VudDIkdGltZSwgcHJlZGljdChyZWcuTG9naXN0aWMpLGNvbD0iYmx1ZSIsbHR5PTIsIGx3ZD0yKQ0KbGluZXMocGVyY2VudDIkdGltZSwgcHJlZGljdChyZWcuUmljaGFyZHMpLGNvbD0iZ3JlZW4iLGx0eT0yLCBsd2Q9MikNCg0KI3Bsb3QyDQphYSA8LSBjYmluZChwZXJjZW50MiR0aW1lLHByZWRpY3QocmVnLkdvbXBlcnR6KSwgcHJlZGljdChyZWcuTG9naXN0aWMpLCBwcmVkaWN0KHJlZy5SaWNoYXJkcykgKQ0KYWEgPC0gYXMuZGF0YS5mcmFtZShhYSkNCmNvbG5hbWVzKGFhKSA8LWMoImRhdGUiLCJHb21wZXJ0eiIsIkxvZ2lzdGljIiwiUmljaGFyZHMiKQ0KbGlicmFyeShyZXNoYXBlMikNCmFhMiA8LSBtZWx0KGFhLCBpZC52YXJzPWMoImRhdGUiKSkNCg0KZ2dwbG90KHBlcmNlbnQyLGFlcyh0aW1lLFBlcmNlbnQpKSArIA0KICBnZW9tX3BvaW50KGNvbG91cj0iYmxhY2siLHNpemU9NC41KSsNCiAgZ2VvbV9wb2ludChjb2xvdXIgPSAiZ3JleSIsc2l6ZT00LGFscGhhPTAuOSkgICsNCiAgZ2VvbV9saW5lKGRhdGE9YWEyLCBhZXMoZGF0ZSx2YWx1ZSxjb2xvcj12YXJpYWJsZSksbHR5PTEsIGx3ZD0xLjEpKw0KICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIk1vZGVsIiwgbGFiZWxzID0gYygiR29tcGVydHoiLCAiTG9naXN0aWMiLCJSaWNoYXJkcyIpKSsNCiAgbGFicyh4ID0iVGVudXJlIiwgeSA9ICJQZXJjZW50IG9mIHNocmltcCBvdmVyIDlnIikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNzcsIGxpbmV0eXBlPSJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMTAwLCBsaW5ldHlwZT0iZG90dGVkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTEpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45LCAwLjIpKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAsOTUpLCBicmVha3M9c2VxKDAsOTUsNSkpICsNCiAgdGV4dCh4PTEwOCx5PTMyLjQ0MDA3OCwgYWRmPTAsIGxhYmVsPSIoOSwgMzIuNDQpIixjb2w9MikNCmBgYA0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KI3RhYmxlIA0KbGlicmFyeShrbml0cikNCmthYmxlKG5ldzIsIGZvcm1hdCA9ICJyc3QiKQ0KcGVyY2VudDIkdGltZQ0KcGVyY2VudDIyIDwtIHVuaXF1ZShwZXJjZW50MiREYXRlKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIzEgPSAieX5hK2IqeCIgbGluZWFyDQojMiA9ICJ5fmErYip4K2MqeF4yIiBxdWFkcmF0aWMNCiMzID0gInkgfiBhICsgYiAqICh4IC0gYykgKiAoeCA8PSBjKSIgbGluZWFyIHBsYXRlYXUNCiM0ID0gInkgfiAoYSArIGIgKiB4ICsgYyAqIEkoeF4yKSkgKiAoeCA8PSAtMC41ICogYi9jKSArIChhICsgSSgtYl4yLyg0ICogYykpKSAqICh4ID4gLTAuNSAqIGIvYykiIHF1YWRyYXRpYyBwbGF0ZWF1DQojNSA9ICJpZmVsc2UoeD49ZCwoYS1jKmQpKyhiK2MpKngsIGErYip4KSIgdHdvIGxpbmVhcg0KIzYgPSAieX5hKmV4cChiKngpIiBleHBvbmVudGlhbA0KIzcgPSAieX5hKigxK2IqKGV4cCgtYyp4KSkpXi0xIiBsb2dpc3RpYw0KIzggPSAieX5hKigxLWIqKGV4cCgtYyp4KSkpXjMiIHZhbiBiZXJ0YWxhbmZmeQ0KIzkgPSAieX5hKigxLWIqKGV4cCgtYyp4KSkpIiBicm9keQ0KIzEwID0gInl+YSpleHAoLWIqZXhwKC1jKngpIiBnb21wZXJ0eg0KIzExID0gInl+KGEqeF5iKSpleHAoLWMqeCkiIGxhY3RhdGlvbiBjdXJ2ZQ0KIzEyID0gInkgfiBhICsgYiAqICgxIC0gZXhwKC1jICogeCkpIiBydW1pbmFsIGRlZ3JhZGF0aW9uIGN1cnZlDQojMTMgPSAieX4oYS8oMStleHAoMi00KmMqKHgtZSkpKSkrKGIvKDErZXhwKDItNCpkKih4LWUpKSkpIiBsb2dpc3RpYyBiaS1jb21wYXJ0bWVudGFsDQpgYGANCg0KYGBge3J9DQoNCmBgYA0KDQpgYGB7cn0NCg0KYGBgDQoNCmBgYHtyfQ0KDQpgYGANCg0K