Parcel 06092-050-007 is overvalued by between $19,000 and $28,000 from the proposed TRIM assessment for 2017 based on a detailed market analysis of property appraiser’s data.
Multiple methods were used to determine the overvaluation. Similar homes sold in 2016 and 2017 were selected. This home was in the 50th percentile in terms of its price per square foot, meaning the market determined it was an average quality home.
However the home was in the 79th percentile based on the ratio of appraised value to sales price, and in the 75th percentile based on its ratio of appraised value to square footage. Additionally, the home is listed as an “above average quality home” but is has $28,000 in deferred maintenance and repairs that are needed.
Linear modeling of all similar properties sold in the last two years suggests that the fair value of the home is between $227,369 and $235,555. Based on deferred maintenance the value would be $226,100. By all metrics this property is worth less less than the proposed tax appraisal of $254,100.
Because sales price is the best predictor of true market value and this home sold less than 3 months ago, we think that the assessed value of the property for 2017 should be $227,369.
Data for comparison
To compare the appraisal for Parcel 06092-050-007 to other recently sold homes in the county, data were downloaded from the Alachua County Property Appraiser’s Database on October 4, 2017 using the following search criteria:
- Property use code: Residential
- Sales price range: $50,000 to $1,000,000
- Vacant or Improved: Improved
- Sales Date: 01/2016 - 10/2017
- Bedrooms: 3-4
- Type: Single Family
Data was cleaned up by removing records with missing values, and homes with extremely low tax valuations relative to sales price. After filtering, 4142 homes were used for comparison. The exact transformations were:
# Load R libraries
library("ggplot2")
library("viridis")
library("viridisLite")
# On October 4, 2017 Sales data were downloaded from the propery appraiser's site
# and are stored on google drive, accessed with this url
data <- read.csv("http://gdurl.com/IkiP")
# Set date format
data$Sale_Date <-as.Date(data$Sale_Date, format="%m/%d/%y")
# filter out records with NA's and homes over 800k
data<-data[is.na(data$HtdSqFt) ==FALSE,]
data<-data[data$HtdSqFt > 0,]
data<-data[is.na(data$Bldg_Value)==FALSE,]
data<-data[is.na(data$Sale_Price)==FALSE,]
data<-data[data$Sale_Price<800000,]
data<-data[is.na(data$Sale_Date)==FALSE,]
# Calculate cost per heated square foot
data$costPerSqFt<-data$Sale_Price/data$HtdSqFt
# Add land, extras and building value together to get appraised value
data$appraised <- data$Land_Value + data$Bldg_Value +data$OBXFValue
# Filter out extreamly low value sales that are likely to be interfamily transfers etc.
data<-data[data$Sale_Price>50000,]
# filter homes with extreamly high sale prices relative to appraised values
# (tear downs etc.)
data<-data[abs(log10(data$Sale_Price/data$appraised))<0.5, ]
Proposed tax appraisal for parcel 06092-050-007
hoi <- data.frame(Sale_Date=as.Date("2017-07-21"), appraised=254100, HtdSqFt=2629,
costPerSqFt=310000/2629, Sale_Price=310000, Land_Value=36000,
Bldg_Value=208200, OBXFValue=9900 )
Parcel 06092-050-007 is appraised in the 79th percentile given the ratio of its sales price to appraised value
The ratio for all properties is seen in the histogram. The blue line represents the median ratio and the red line represents Parcel 06092-050-007 which falls in the 79th percentile.
ggplot(data = data, aes(x=(appraised/Sale_Price))) +
geom_histogram(bins=100) +
xlab("The ratio of appraised value to sale price") +
geom_vline(xintercept=hoi$appraised/hoi$Sale_Price,color="red") +
geom_vline(xintercept=median(data$appraised/data$Sale_Price), color="blue") +
ggtitle("The ratio of appraised value to sales price")

percentile = ecdf(data$appraised/data$Sale_Price)(hoi$appraised/hoi$Sale_Price)
paste("Parcel 06092-050-007 is in the", percentile ,"percentile")
[1] "Parcel 06092-050-007 is in the 0.790922259777885 percentile"
Parcel 06092-050-007 is appraised is higher than average given its sales price.
ggplot(data= data, aes(x=Sale_Price, y= appraised)) +
geom_point(aes(color=log10(HtdSqFt)), size=0.5) +
scale_color_viridis() +
geom_smooth(method ="lm") +
ylab("Appraised value") +
xlab("Sale price") +
geom_point(data = hoi, colour = "red")

What is a fair apprasial of the property?
With sales price alone, a linear model appraises the parcel at $227,369. Given that sales price is what determines market value and that this home sold less than 3 months ago, we recommend using that valuation of $227.369.
mod1<- lm(appraised ~ Sale_Price, data = data)
summary(mod1)
Call:
lm(formula = appraised ~ Sale_Price, data = data)
Residuals:
Min 1Q Median 3Q Max
-278335 -13436 -426 12439 414096
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.957e+03 1.003e+03 2.949 0.00321 **
Sale_Price 7.239e-01 4.164e-03 173.834 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 29270 on 4140 degrees of freedom
Multiple R-squared: 0.8795, Adjusted R-squared: 0.8795
F-statistic: 3.022e+04 on 1 and 4140 DF, p-value: < 2.2e-16
p.df<- data.frame(Sale_Price=310000, HtdSqFt=2629)
predict(mod1, p.df,se.fit=T, level=.05, interval = "prediction")
$fit
fit lwr upr
1 227368.7 225532.5 229204.9
$se.fit
[1] 603.9863
$df
[1] 4140
$residual.scale
[1] 29274.44
A linear model of price and square footage combined can also be used. Using that less direct approach an appraisal a value of $235,555 is estimated.
mod0<- lm(appraised ~ Sale_Price + HtdSqFt, data = data)
summary(mod0)
Call:
lm(formula = appraised ~ Sale_Price + HtdSqFt, data = data)
Residuals:
Min 1Q Median 3Q Max
-235374 -12669 1040 13370 361617
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.835e+04 1.394e+03 -13.16 <2e-16 ***
Sale_Price 6.045e-01 6.941e-03 87.09 <2e-16 ***
HtdSqFt 2.530e+01 1.207e+00 20.96 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 27840 on 4139 degrees of freedom
Multiple R-squared: 0.8911, Adjusted R-squared: 0.891
F-statistic: 1.693e+04 on 2 and 4139 DF, p-value: < 2.2e-16
p.df<- data.frame(Sale_Price=310000, HtdSqFt=2629)
predict(mod0, p.df,se.fit=T, level=.05, interval = "prediction")
$fit
fit lwr upr
1 235554.9 233808.6 237301.2
$se.fit
[1] 694.5933
$df
[1] 4139
$residual.scale
[1] 27838.18
LS0tCnRpdGxlOiAiU3VwcG9ydGluZyBtYXJrZXQgaW5mb3JtYXRpb24gZm9yIGFwcGVhbCBvZiAyMDE3IGFzc2Vzc21lbnQgZm9yIHBhcmNlbCAwNjA5Mi0wNTAtMDA3IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCgpQYXJjZWwgMDYwOTItMDUwLTAwNyBpcyBvdmVydmFsdWVkIGJ5IGJldHdlZW4gJDE5LDAwMCBhbmQgJDI4LDAwMCBmcm9tIHRoZSBwcm9wb3NlZCBUUklNIGFzc2Vzc21lbnQgZm9yIDIwMTcgYmFzZWQgb24gYSBkZXRhaWxlZCBtYXJrZXQgYW5hbHlzaXMgb2YgcHJvcGVydHkgYXBwcmFpc2VyJ3MgZGF0YS4KCk11bHRpcGxlIG1ldGhvZHMgd2VyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgb3ZlcnZhbHVhdGlvbi4gU2ltaWxhciBob21lcyBzb2xkIGluIDIwMTYgYW5kIDIwMTcgd2VyZSBzZWxlY3RlZC4gVGhpcyBob21lIHdhcyBpbiB0aGUgNTB0aCBwZXJjZW50aWxlIGluIHRlcm1zIG9mIGl0cyBwcmljZSBwZXIgc3F1YXJlIGZvb3QsIG1lYW5pbmcgdGhlIG1hcmtldCBkZXRlcm1pbmVkIGl0IHdhcyBhbiBhdmVyYWdlIHF1YWxpdHkgaG9tZS4KCkhvd2V2ZXIgdGhlIGhvbWUgd2FzIGluIHRoZSA3OXRoIHBlcmNlbnRpbGUgYmFzZWQgb24gdGhlIHJhdGlvIG9mIGFwcHJhaXNlZCB2YWx1ZSB0byBzYWxlcyBwcmljZSwgYW5kIGluIHRoZSA3NXRoIHBlcmNlbnRpbGUgYmFzZWQgb24gIGl0cyByYXRpbyBvZiBhcHByYWlzZWQgdmFsdWUgdG8gc3F1YXJlIGZvb3RhZ2UuIEFkZGl0aW9uYWxseSwgdGhlIGhvbWUgaXMgbGlzdGVkIGFzIGFuICJhYm92ZSBhdmVyYWdlIHF1YWxpdHkgaG9tZSIgYnV0IGlzIGhhcyAkMjgsMDAwIGluIGRlZmVycmVkIG1haW50ZW5hbmNlIGFuZCByZXBhaXJzIHRoYXQgYXJlIG5lZWRlZC4gCgpMaW5lYXIgbW9kZWxpbmcgb2YgYWxsIHNpbWlsYXIgcHJvcGVydGllcyBzb2xkIGluIHRoZSBsYXN0IHR3byB5ZWFycyBzdWdnZXN0cyB0aGF0IHRoZSBmYWlyIHZhbHVlIG9mIHRoZSBob21lIGlzIGJldHdlZW4gJDIyNywzNjkgYW5kICQyMzUsNTU1LiBCYXNlZCBvbiBkZWZlcnJlZCBtYWludGVuYW5jZSB0aGUgdmFsdWUgd291bGQgYmUgJDIyNiwxMDAuIEJ5IGFsbCBtZXRyaWNzIHRoaXMgcHJvcGVydHkgaXMgd29ydGggbGVzcyBsZXNzIHRoYW4gdGhlIHByb3Bvc2VkIHRheCBhcHByYWlzYWwgb2YgJDI1NCwxMDAuCgpCZWNhdXNlIHNhbGVzIHByaWNlIGlzIHRoZSBiZXN0IHByZWRpY3RvciBvZiB0cnVlIG1hcmtldCB2YWx1ZSBhbmQgdGhpcyBob21lIHNvbGQgbGVzcyB0aGFuIDMgbW9udGhzIGFnbywgd2UgdGhpbmsgdGhhdCB0aGUgYXNzZXNzZWQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGZvciAyMDE3IHNob3VsZCBiZSAkMjI3LDM2OS4KCgojIyBEYXRhIGZvciBjb21wYXJpc29uClRvIGNvbXBhcmUgdGhlIGFwcHJhaXNhbCBmb3IgUGFyY2VsIDA2MDkyLTA1MC0wMDcgdG8gb3RoZXIgcmVjZW50bHkgc29sZCBob21lcyBpbiB0aGUgY291bnR5LCBkYXRhIHdlcmUgZG93bmxvYWRlZCBmcm9tIHRoZSBBbGFjaHVhIENvdW50eSBQcm9wZXJ0eSBBcHByYWlzZXIncyBEYXRhYmFzZSBvbiBPY3RvYmVyIDQsIDIwMTcgdXNpbmcgdGhlIGZvbGxvd2luZyBzZWFyY2ggY3JpdGVyaWE6CgoqIFByb3BlcnR5IHVzZSBjb2RlOiBSZXNpZGVudGlhbAoqIFNhbGVzIHByaWNlIHJhbmdlOiAkNTAsMDAwIHRvICQxLDAwMCwwMDAKKiBWYWNhbnQgb3IgSW1wcm92ZWQ6IEltcHJvdmVkCiogU2FsZXMgRGF0ZTogMDEvMjAxNiAtIDEwLzIwMTcKKiBCZWRyb29tczogMy00CiogVHlwZTogU2luZ2xlIEZhbWlseQoKRGF0YSB3YXMgY2xlYW5lZCB1cCBieSByZW1vdmluZyByZWNvcmRzIHdpdGggbWlzc2luZyB2YWx1ZXMsIGFuZCBob21lcyB3aXRoIGV4dHJlbWVseSBsb3cgdGF4IHZhbHVhdGlvbnMgcmVsYXRpdmUgdG8gc2FsZXMgcHJpY2UuIEFmdGVyIGZpbHRlcmluZywgNDE0MiBob21lcyB3ZXJlIHVzZWQgZm9yIGNvbXBhcmlzb24uIFRoZSBleGFjdCB0cmFuc2Zvcm1hdGlvbnMgd2VyZTogCmBgYHtyfQojIExvYWQgUiBsaWJyYXJpZXMKbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoInZpcmlkaXMiKQpsaWJyYXJ5KCJ2aXJpZGlzTGl0ZSIpCgojIE9uIE9jdG9iZXIgNCwgMjAxNyBTYWxlcyBkYXRhIHdlcmUgZG93bmxvYWRlZCBmcm9tIHRoZSBwcm9wZXJ5IGFwcHJhaXNlcidzIHNpdGUKIyBhbmQgYXJlIHN0b3JlZCBvbiBnb29nbGUgZHJpdmUsIGFjY2Vzc2VkIHdpdGggdGhpcyB1cmwKZGF0YSA8LSByZWFkLmNzdigiaHR0cDovL2dkdXJsLmNvbS9Ja2lQIikKCiMgU2V0IGRhdGUgZm9ybWF0CmRhdGEkU2FsZV9EYXRlIDwtYXMuRGF0ZShkYXRhJFNhbGVfRGF0ZSwgZm9ybWF0PSIlbS8lZC8leSIpCgojIGZpbHRlciBvdXQgcmVjb3JkcyB3aXRoIE5BJ3MgYW5kIGhvbWVzIG92ZXIgODAwawpkYXRhPC1kYXRhW2lzLm5hKGRhdGEkSHRkU3FGdCkgPT1GQUxTRSxdCmRhdGE8LWRhdGFbZGF0YSRIdGRTcUZ0ID4gMCxdCmRhdGE8LWRhdGFbaXMubmEoZGF0YSRCbGRnX1ZhbHVlKT09RkFMU0UsXQpkYXRhPC1kYXRhW2lzLm5hKGRhdGEkU2FsZV9QcmljZSk9PUZBTFNFLF0KZGF0YTwtZGF0YVtkYXRhJFNhbGVfUHJpY2U8ODAwMDAwLF0KZGF0YTwtZGF0YVtpcy5uYShkYXRhJFNhbGVfRGF0ZSk9PUZBTFNFLF0KCiMgQ2FsY3VsYXRlIGNvc3QgcGVyIGhlYXRlZCBzcXVhcmUgZm9vdApkYXRhJGNvc3RQZXJTcUZ0PC1kYXRhJFNhbGVfUHJpY2UvZGF0YSRIdGRTcUZ0CgojIEFkZCBsYW5kLCBleHRyYXMgYW5kIGJ1aWxkaW5nIHZhbHVlIHRvZ2V0aGVyIHRvIGdldCBhcHByYWlzZWQgdmFsdWUKZGF0YSRhcHByYWlzZWQgPC0gZGF0YSRMYW5kX1ZhbHVlICsgZGF0YSRCbGRnX1ZhbHVlICtkYXRhJE9CWEZWYWx1ZQoKIyBGaWx0ZXIgb3V0IGV4dHJlYW1seSBsb3cgdmFsdWUgc2FsZXMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIGludGVyZmFtaWx5IHRyYW5zZmVycyBldGMuCmRhdGE8LWRhdGFbZGF0YSRTYWxlX1ByaWNlPjUwMDAwLF0KCiMgZmlsdGVyIGhvbWVzIHdpdGggZXh0cmVhbWx5IGhpZ2ggc2FsZSBwcmljZXMgcmVsYXRpdmUgdG8gYXBwcmFpc2VkIHZhbHVlcwojICh0ZWFyIGRvd25zIGV0Yy4pCmRhdGE8LWRhdGFbYWJzKGxvZzEwKGRhdGEkU2FsZV9QcmljZS9kYXRhJGFwcHJhaXNlZCkpPDAuNSwgXQpgYGAKCiMjIyBQcm9wb3NlZCB0YXggYXBwcmFpc2FsIGZvciBwYXJjZWwgMDYwOTItMDUwLTAwNwpgYGB7cn0KaG9pIDwtIGRhdGEuZnJhbWUoU2FsZV9EYXRlPWFzLkRhdGUoIjIwMTctMDctMjEiKSwgYXBwcmFpc2VkPTI1NDEwMCwgSHRkU3FGdD0yNjI5LAogICAgICAgICAgICAgICAgICBjb3N0UGVyU3FGdD0zMTAwMDAvMjYyOSwgU2FsZV9QcmljZT0zMTAwMDAsIExhbmRfVmFsdWU9MzYwMDAsIAogICAgICAgICAgICAgICAgICBCbGRnX1ZhbHVlPTIwODIwMCwgT0JYRlZhbHVlPTk5MDAgKQpgYGAKCgojIyMgUHJpY2UgcGVyIHNxdWFyZSBmb290IG92ZXIgdGltZSBmb3IgNCBhbmQgMyBiZWRyb29tIGhvbWVzIGluIEFsYWNodWEgQ291bnR5IDIwMTYtMjAxNy4KClRoZSByZWQgZG90IGluZGljYXRlcyBwYXJjZWwgMDYwOTItMDUwLTAwNy4gUGFyY2VsIDA2MDkyLTA1MC0wMDcgaXMgYW4gYXZlcmFnZSAzIG9yIDQgYmVkcm9vbSBob21lIGluIHRlcm1zIG9mIGl0J3MgcHJpY2UgcGVyIHNxdWFyZSBmb290LiBXaGVuIGhvbWVzIHNvbGQgYSBtb250aCBiZWZvcmUgb3IgYWZ0ZXIgaXQgYXJlIHNlbGVjdGVkLCB0aGUgaG9tZSBpcyBpbiB0aGUgNTAlIHBlcmNlbnRpbGU7IGl0IGlzIGFuIGV4YWN0bHkgYXZlcmFnZSB2YWx1ZSBob21lIGdpdmVuIGl0cyBzaXplLgoKYGBge3J9CmdncGxvdChkYXRhPWRhdGEsIGFlcyh4PVNhbGVfRGF0ZSwgeT1jb3N0UGVyU3FGdCkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9bG9nMTAoU2FsZV9QcmljZSkpLCBzaXplPTAuNSkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIikgKwogIHlsYWIoIkRvbGxhcnMgcGVyIFNxdWFyZSBGb290IikgKwogIHhsYWIoIlllYXIiKSArCiAgZ2d0aXRsZSgiUHJpY2UgcGVyIHNxdWFyZSBmb290IGZvciA0IGFuZCAzIGJlZHJvb20gaG9tZXMgaW4gQWxhY2h1YSBDb3VudHkgMjAxNi0yMDE3IikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGhvaSwgY29sb3VyID0gInJlZCIpCgoKYGBgCgojIyMgVGhlIGhvbWUgaXMgaW4gdGhlIDUwdGggcGVyY2VudGlsZSBpbiB0ZXJtcyBvZiBpdCdzIHNhbGVzIHByaWNlIHBlciBzcXVhcmUgZm9vdAoKYGBge3J9CiMgU2VsZWN0IHRoZSBtb250aCBiZWZvcmUgYW5kIGFmdGVyIHB1cmNoYXNlIHNpbmNlIHByaWNlIHBlciBzcXVhcmUgZm9vdCBpcyB0cmVuZGluZyB1cApzZGF0YSA8LWRhdGFbKGRhdGEkU2FsZV9EYXRlIDwgIjIwMTctMDgtMjEiICYgZGF0YSRTYWxlX0RhdGUgPiAiMjAxNy0wNi0yMSIpLF0KIyBDYWxjdWxhdGUgdGhlIHBlcmNlbnRpbGUKZWNkZihzZGF0YSRjb3N0UGVyU3FGdCkoaG9pJGNvc3RQZXJTcUZ0KQpgYGAKCiMjIyBQYXJjZWwgMDYwOTItMDUwLTAwNyBpcyBhcHByYWlzZWQgaW4gdGhlIDc5dGggcGVyY2VudGlsZSBnaXZlbiB0aGUgcmF0aW8gb2YgaXRzIHNhbGVzIHByaWNlIHRvIGFwcHJhaXNlZCB2YWx1ZQpUaGUgcmF0aW8gZm9yIGFsbCBwcm9wZXJ0aWVzIGlzIHNlZW4gaW4gdGhlIGhpc3RvZ3JhbS4gVGhlIGJsdWUgbGluZSByZXByZXNlbnRzIHRoZSBtZWRpYW4gcmF0aW8gYW5kIHRoZSByZWQgbGluZSByZXByZXNlbnRzIFBhcmNlbCAwNjA5Mi0wNTAtMDA3IHdoaWNoIGZhbGxzIGluIHRoZSA3OXRoIHBlcmNlbnRpbGUuCmBgYHtyfQoKZ2dwbG90KGRhdGEgPSBkYXRhLCBhZXMoeD0oYXBwcmFpc2VkL1NhbGVfUHJpY2UpKSkgKyAKICAgICAgICBnZW9tX2hpc3RvZ3JhbShiaW5zPTEwMCkgKwogICAgICAgIHhsYWIoIlRoZSByYXRpbyBvZiBhcHByYWlzZWQgdmFsdWUgdG8gc2FsZSBwcmljZSIpICsKICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9aG9pJGFwcHJhaXNlZC9ob2kkU2FsZV9QcmljZSxjb2xvcj0icmVkIikgKyAKICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9bWVkaWFuKGRhdGEkYXBwcmFpc2VkL2RhdGEkU2FsZV9QcmljZSksIGNvbG9yPSJibHVlIikgKwogICAgICAgIGdndGl0bGUoIlRoZSByYXRpbyBvZiBhcHByYWlzZWQgdmFsdWUgdG8gc2FsZXMgcHJpY2UiKQpwZXJjZW50aWxlID0gZWNkZihkYXRhJGFwcHJhaXNlZC9kYXRhJFNhbGVfUHJpY2UpKGhvaSRhcHByYWlzZWQvaG9pJFNhbGVfUHJpY2UpCnBhc3RlKCJQYXJjZWwgMDYwOTItMDUwLTAwNyBpcyBpbiB0aGUiLCBwZXJjZW50aWxlICwicGVyY2VudGlsZSIpCmBgYAoKCiMjIyBQYXJjZWwgMDYwOTItMDUwLTAwNyBpcyBhcHByYWlzZWQgaXMgaGlnaGVyIHRoYW4gYXZlcmFnZSBnaXZlbiBpdHMgc2FsZXMgcHJpY2UuCgpgYGB7cn0KZ2dwbG90KGRhdGE9IGRhdGEsIGFlcyh4PVNhbGVfUHJpY2UsIHk9IGFwcHJhaXNlZCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvcj1sb2cxMChIdGRTcUZ0KSksICBzaXplPTAuNSkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSJsbSIpICsKICB5bGFiKCJBcHByYWlzZWQgdmFsdWUiKSArCiAgeGxhYigiU2FsZSBwcmljZSIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBob2ksIGNvbG91ciA9ICJyZWQiKQpgYGAKCiMjIyBQYXJjZWwgMDYwOTItMDUwLTAwNyBpcyBhcHByYWlzZWQgaW4gdGhlIDc1JSBwZXJjZW50aWxlIGdpdmVuIGl0cyBzcXVhcmUgZm9vdGFnZQoKYGBge3J9CgpnZ3Bsb3QoZGF0YSA9IGRhdGEsIGFlcyh4PShhcHByYWlzZWQvSHRkU3FGdCkpKSArIAogICAgICAgICBnZW9tX2hpc3RvZ3JhbShiaW5zPTEwMCkgKwogICAgICAgIHhsYWIoIlRoZSByYXRpbyBvZiBhcHByYWlzZWQgdmFsdWUgdG8gaGVhdGVkIHNxdWFyZSBmZWV0IikgKwogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1ob2kkYXBwcmFpc2VkL2hvaSRIdGRTcUZ0LGNvbG9yPSJyZWQiKSArIAogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1tZWRpYW4oZGF0YSRhcHByYWlzZWQvZGF0YSRIdGRTcUZ0KSwgY29sb3I9ImJsdWUiKSArCiAgICAgICAgZ2d0aXRsZSgiVGhlIHJhdGlvIG9mIGFwcHJhaXNlZCB2YWx1ZSB0byBoZWF0ZWQgc3F1YXJlIGZlZXQiKQoKcGVyY2VudGlsZSA9IGVjZGYoZGF0YSRhcHByYWlzZWQvZGF0YSRIdGRTcUZ0KShob2kkYXBwcmFpc2VkL2hvaSRIdGRTcUZ0KQpwYXN0ZSgiUGFyY2VsIDA2MDkyLTA1MC0wMDcgaXMgaW4gdGhlIiwgcGVyY2VudGlsZSAsInBlcmNlbnRpbGUiKQoKYGBgCgoKIyMjIFdoYXQgaXMgYSBmYWlyIGFwcHJhc2lhbCBvZiB0aGUgcHJvcGVydHk/CldpdGggc2FsZXMgcHJpY2UgYWxvbmUsIGEgbGluZWFyIG1vZGVsIGFwcHJhaXNlcyB0aGUgcGFyY2VsIGF0ICQyMjcsMzY5LiBHaXZlbiB0aGF0IHNhbGVzIHByaWNlIGlzIHdoYXQgZGV0ZXJtaW5lcyBtYXJrZXQgdmFsdWUgYW5kIHRoYXQgdGhpcyBob21lIHNvbGQgbGVzcyB0aGFuIDMgbW9udGhzIGFnbywgd2UgcmVjb21tZW5kIHVzaW5nIHRoYXQgdmFsdWF0aW9uIG9mICQyMjcuMzY5LgpgYGB7cn0KbW9kMTwtIGxtKGFwcHJhaXNlZCB+IFNhbGVfUHJpY2UsIGRhdGEgPSBkYXRhKQpzdW1tYXJ5KG1vZDEpCnAuZGY8LSBkYXRhLmZyYW1lKFNhbGVfUHJpY2U9MzEwMDAwLCBIdGRTcUZ0PTI2MjkpCnByZWRpY3QobW9kMSwgcC5kZixzZS5maXQ9VCwgbGV2ZWw9LjA1LCBpbnRlcnZhbCA9ICJwcmVkaWN0aW9uIikKYGBgCkEgbGluZWFyIG1vZGVsIG9mIHByaWNlIGFuZCBzcXVhcmUgZm9vdGFnZSBjb21iaW5lZCBjYW4gYWxzbyBiZSB1c2VkLiBVc2luZyB0aGF0IGxlc3MgZGlyZWN0IGFwcHJvYWNoIGFuIGFwcHJhaXNhbCBhIHZhbHVlIG9mICQyMzUsNTU1IGlzIGVzdGltYXRlZC4gCmBgYHtyfQptb2QwPC0gbG0oYXBwcmFpc2VkIH4gU2FsZV9QcmljZSArIEh0ZFNxRnQsIGRhdGEgPSBkYXRhKQpzdW1tYXJ5KG1vZDApCnAuZGY8LSBkYXRhLmZyYW1lKFNhbGVfUHJpY2U9MzEwMDAwLCBIdGRTcUZ0PTI2MjkpCnByZWRpY3QobW9kMCwgcC5kZixzZS5maXQ9VCwgbGV2ZWw9LjA1LCBpbnRlcnZhbCA9ICJwcmVkaWN0aW9uIikKYGBgCgoKCiMjIEFkZGl0aW9uYWwgY29uZGl0aW9uIGZhY3RvcnMKClRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIGhvbWUgaXMgbGlzdGVkIGFzICJhYm92ZSBhdmVyYWdlIHF1YWxpdHkiLiBVbmZvcnR1bmF0ZWx5IGRlZmVycmVkIG1haW50ZW5hbmNlIG9uIHRoZSBwcm9wZXJ0eSBoYXMgbG93ZXJlZCB0aGUgcXVhbGl0eSBhbmQgdmFsdWUgb2YgdGhlIGJ1aWxkaW5nLgoKKiBUaGUgSFZBQyBzeXN0ZW0gd2FzIGluc3RhbGxlZCBpbiAxOTk5IGFuZCBpcyBhdCB0aGUgZW5kIG9mIGl0cyBzZXJ2aWNlYWJsZSBsaWZlLiBFc3RpbWF0ZWQgcmVwbGFjZW1lbnQgY29zdCBpcyAkODAwMC4KKiBUaGUgd2F0ZXIgaGVhdGVyIHdhcyBpbnN0YWxsZWQgaW4gMTk5OSBhbmQgaXQgYXQgdGhlIGVuZCBvZiBpdHMgc2VydmljZWFibGUgbGlmZS4gRXN0aW1hdGVkIHJlcGxhY2VtZW50IGNvc3QgaXMgJDEwMDAuCiogVGhlIHJvb2Ygd2FzIGluc3RhbGxlZCBwcmlvciB0byAyMDAzICh0aGUgZXhhY3QgZGF0ZSBpcyBub3Qga25vd24pIGFuZCBpcyBpbiBuZWVkIG9mIHJlcGxhY2VtZW50LiBFc3RpbWF0ZWQgcmVwbGFjZW1lbnQgY29zdCBpcyAkMTUsMDAwLgoqIFRoZSBnYXJhZ2UgZG9vciBoYXMgd2F0ZXIgZGFtYWdlIGFuZCBpcyBpbiBuZWVkIG9mIHJlcGxhY2VtZW50LiBFc3RpbWF0ZWQgcmVwbGFjZW1lbnQgY29zdCBpcyAkMjAwMC4KKiBQb29sIGRlY2tpbmcgaXMgY3JhY2tlZCBhbmQgaW4gbmVlZCBvciByZXBhaXIuIEV4cGVjdGVkIHJlcGFpciBjb3N0IGlzICQyMDAwLgoKVG90YWwgZGVmZXJyZWQgbWFpbnRlbmFuY2Ugb24gdGhlIHByb3BlcnR5IGlzIGV4cGVjdGVkIHRvIGxvd2VyIHRoZSB2YWx1ZSBvZiB0aGUgaG9tZSBieSAkMjgsMDAwLgoKCgoKCg==