Goal: Assess the effect of different illuminators on
reflectance readings of the Standard Reference Target
require(ggplot2)
require(plotly)
library(RColorBrewer)
require(prospectr)
library(soilspec)
#NOTE: there is also asdreader::get_spectra() (see EspCrater_FS3_nb.Rmd)
# > getwd()
# [1] "/media/alobo/DecepNTFS2/HSI_Lab/Testllum_20230717/Rtestllum_20230717"
dirRSpect <- "/home/alobo/owncloudRSpect/RSpect"
dirdat20230717 <- "../TestllumStdRef_20230717"
1. Reading data
#testllum_20230717_samples.csv created in datadoc_log.R
#edited to become "testllum_20230717_samples_v2.csv"
f <- read.csv(file.path(dirdat20230717,"testllum_20230717_samples_v2.csv"), stringsAsFactors = FALSE)
f$ID <- paste0(f$type,"_",f$replicate)
f <- na.omit(f)
#f <- f[f$target=="StdRef",]
certif <- read.csv(file.path(dirRSpect,"RefMCAA01.csv"), stringsAsFactors = FALSE)
3. Spectra acquired under each illumination type
dW.lf <- d.lf[d.lf$target=="W",]
dStdR.lf <- d.lf[d.lf$target=="StdRef",]
3.1 White Reference
gW <- ggplot(data=dW.lf) +
geom_line(aes(x=w, y=r, color=type, group=file), linewidth=0.3) +
#geom_point(aes(x=Wavelength, y=Reflectance,color=site, group=file)) +
xlab("Wavelength") + ylab("Radiance") +
scale_color_brewer(palette = "Set1") +
theme(legend.position="bottom")
ggplotly(gW + ggtitle("White Reference Target"))
g1 <- ggplot(data=d.lf) +
geom_line(aes(x=w, y=r, color=type, linetype=target,group=file), linewidth=0.3) +
xlab("Wavelength") + ylab("Radiance") +
scale_color_brewer(palette = "Set1") +
ggtitle("White (W) and Standard (StdRef) Reference Target") +
facet_wrap(~type,nrow=3)
print(g1)

Note that in some parts of the spectra acquired under PROLAMP
illumination, the radiance of the Standard Reference is higher than that
of the White Reference, which will imply some reflectance values >
1.
3.2 Standard Reference
a <- data.frame(file=NA, type="Certification", grade=NA, target="StdRef", replicate=NA, time=NA, ID="certif", w=certif$Wavelength, r=NA, rf=NA, s=certif$Reflectance)
micolor <- c(Certification="black", brewer.pal(3,"Set1") )
names(micolor) <- c("Certification", "KAISER", "PROLAMP", "VILALTA")
g2 <- ggplot(data=rbind(dStdR.lf,a)) +
geom_line(aes(x=w, y=s, color=type, group=file), linewidth=0.3) +
#geom_line(data=certif, aes(x=Wavelength, y=Reflectance), color="black")+
#geom_point(aes(x=Wavelength, y=Reflectance,color=site, group=file)) +
xlab("Wavelength") + ylab("Reflectance") +
scale_color_manual(values=micolor) +
theme(legend.position="bottom")
ggplotly(g2 + ggtitle("Standard Reference Target"))
We observe
- There is a notorious variability of reflectance readings with
consumer-grade illumination systems (VILLALTA and KAISER), in particular
after 1000 nm.
- Reflectance readings under VILALTA illumination are more variable
than under KAISER illumination (but we did not control for the same
warming up of the bulbs).
- Reflectance values are lower with consumer-grade illumination
(VILLALTA and KAISER), despite the fact that both optimization and white
reference readings were performed for each type of illumination
type.
4. Paired Comparison of illumination systems
TBD using the resampled certification spectra as the X
axis
dK <- dStdR.lf[dStdR.lf$type=="KAISER", c(8,9,11)]
dV <- dStdR.lf[dStdR.lf$type=="VILALTA",c(8,9,11)]
dP <- dStdR.lf[dStdR.lf$type=="PROLAMP", c(8,9,11)]
#head(dK)
#head(dV)
dKVP <- cbind(dK,rV=dV$r, sV=dV$s, sP=dP$s)
#head(dKV)
names(dKVP)[2:3] <- c("rK", "sK", "sP")
dKVP$detector <- "1"
dKVP$detector[dKV$w>1000 & dKV$w<=1800] <- "2"
dKVP$detector[dKV$w>1800] <- "3"
g3a <- ggplot(data=dKVP) +
geom_point(aes(x=sP,y=sV, color=detector),shape=21, size=0.5)+
xlab("Prolamp") + ylab("Vilalta") +
theme(aspect.ratio = 1) +
ggtitle("Reflectance of Standard Target: Vilalta vs Prolamp illumination")
#print(g3a + facet_wrap(~detector, ncol=2, scales="free"))
g3b <- ggplot(data=dKVP) +
geom_point(aes(x=sP,y=sK, color=detector),shape=21, size=0.5)+
xlab("Prolamp") + ylab("Kaiser") +
theme(aspect.ratio = 1) +
ggtitle("Reflectance of Standard Target: Kaiser vs Prolamp illumination")
#print(g3b + facet_wrap(~detector, ncol=2, scales="free"))
g3c <- ggplot(data=dKVP) +
geom_point(aes(x=sK,y=sV, color=detector),shape=21, size=0.5)+
xlab("Kaiser") + ylab("Vilalta") +
theme(aspect.ratio = 1) +
ggtitle("Reflectance of Standard Target: Vilalta vs Kaiser bulbs")
#print(g3c + facet_wrap(~detector, ncol=2, scales="free"))
#(Note that we are not reading a uniform white target but a standard reference target with very different #reflectance values along wavelength).
5. Conclusions
- Consumer-grade illumination systems (VILLALTA and KAISER) cannot be
used for reflectance readings after 1000 nm of wavelength, but can be
used with the Specim IQ.
- Kaiser bulbs appear to be more powerful and slightly more stable
than Vilalta bulbs.
LS0tCnRpdGxlOiAnUmFkaWFuY2UgYW5kIFJlZmxlY3RhbmNlIHNwZWN0cmEgb2YgU3RhbmRhcmQgUmVmZXJlbmNlIFRhcmdldCB1bmRlciBkaWZmZXJlbnQgbGFiIGlsbHVtaW5hdG9ycycKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogbm8KICAgIHRvY19mbG9hdDogbm8KLS0tCgoqIEFndXN0aW4uTG9ib0BnZW8zYmNuLmNzaWMuZXMKKiAyMDIzMDcxNwoKKipHb2FsKio6IEFzc2VzcyB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCBpbGx1bWluYXRvcnMgb24gcmVmbGVjdGFuY2UgcmVhZGluZ3Mgb2YgdGhlIFN0YW5kYXJkIFJlZmVyZW5jZSBUYXJnZXQKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShwbG90bHkpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpyZXF1aXJlKHByb3NwZWN0cikKbGlicmFyeShzb2lsc3BlYykKI05PVEU6IHRoZXJlIGlzIGFsc28gYXNkcmVhZGVyOjpnZXRfc3BlY3RyYSgpIChzZWUgRXNwQ3JhdGVyX0ZTM19uYi5SbWQpCgojID4gZ2V0d2QoKQojIFsxXSAiL21lZGlhL2Fsb2JvL0RlY2VwTlRGUzIvSFNJX0xhYi9UZXN0bGx1bV8yMDIzMDcxNy9SdGVzdGxsdW1fMjAyMzA3MTciCgpkaXJSU3BlY3QgPC0gIi9ob21lL2Fsb2JvL293bmNsb3VkUlNwZWN0L1JTcGVjdCIKZGlyZGF0MjAyMzA3MTcgPC0gIi4uL1Rlc3RsbHVtU3RkUmVmXzIwMjMwNzE3IgoKYGBgCgojIyAxLiBSZWFkaW5nIGRhdGEKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI3Rlc3RsbHVtXzIwMjMwNzE3X3NhbXBsZXMuY3N2IGNyZWF0ZWQgaW4gZGF0YWRvY19sb2cuUgojZWRpdGVkIHRvIGJlY29tZSAidGVzdGxsdW1fMjAyMzA3MTdfc2FtcGxlc192Mi5jc3YiCgpmIDwtIHJlYWQuY3N2KGZpbGUucGF0aChkaXJkYXQyMDIzMDcxNywidGVzdGxsdW1fMjAyMzA3MTdfc2FtcGxlc192Mi5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpmJElEIDwtIHBhc3RlMChmJHR5cGUsIl8iLGYkcmVwbGljYXRlKQpmIDwtIG5hLm9taXQoZikKI2YgPC0gZltmJHRhcmdldD09IlN0ZFJlZiIsXQpgYGAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY2VydGlmIDwtIHJlYWQuY3N2KGZpbGUucGF0aChkaXJSU3BlY3QsIlJlZk1DQUEwMS5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCiMjIDIuIEJ1aWxkIGRhdGEgZnJhbWUgKGxvbmcgZm9ybWF0KQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkLmxmIDwtICBOVUxMCmZvciAoaSBpbiAxOm5yb3coZikpIHsKICByIDwtIHJlYWRBU0QoZmlsZS5wYXRoKGRpcmRhdDIwMjMwNzE3LGYkZmlsZVtpXSksIG91dF9mb3JtYXQgPSAnbGlzdCcpW1sxXV0kcmFkaWFuY2UKICByZiA8LSByZWFkQVNEKGZpbGUucGF0aChkaXJkYXQyMDIzMDcxNyxmJGZpbGVbaV0pLCBvdXRfZm9ybWF0ID0gJ2xpc3QnKVtbMV1dJHJlZmVyZW5jZQogIHMgPC0gcmVhZEFTRChmaWxlLnBhdGgoZGlyZGF0MjAyMzA3MTcsZiRmaWxlW2ldKSwgb3V0X2Zvcm1hdCA9ICdsaXN0JylbWzFdXSRyZWZsZWN0YW5jZQogIHcgPC0gcmVhZEFTRChmaWxlLnBhdGgoZGlyZGF0MjAyMzA3MTcsZiRmaWxlW2ldKSwgb3V0X2Zvcm1hdCA9ICdsaXN0JylbWzFdXSR3YXZlbGVuZ3RoCiAgI3NjIDwtIHNwbGljZUNvcnJlY3Rpb24ocyx3YXY9dywgc3BsaWNlID0gYygxMDAwLCAxODAwKSkKICBkLmxmIDwtIHJiaW5kKGQubGYsZGF0YS5mcmFtZShmW2ksXSx3LHIscmYscykpCiAgI2QgPC0gY2JpbmQoZCwpCn0KaGVhZChkLmxmLDMpCmBgYAojIyAzLiBTcGVjdHJhIGFjcXVpcmVkIHVuZGVyIGVhY2ggaWxsdW1pbmF0aW9uIHR5cGUKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZFcubGYgPC0gZC5sZltkLmxmJHRhcmdldD09IlciLF0KZFN0ZFIubGYgPC0gZC5sZltkLmxmJHRhcmdldD09IlN0ZFJlZiIsXQpgYGAKCiMjIDMuMSBXaGl0ZSBSZWZlcmVuY2UKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CmdXIDwtIGdncGxvdChkYXRhPWRXLmxmKSArCiAgZ2VvbV9saW5lKGFlcyh4PXcsIHk9ciwgY29sb3I9dHlwZSwgZ3JvdXA9ZmlsZSksIGxpbmV3aWR0aD0wLjMpICsKICAjZ2VvbV9wb2ludChhZXMoeD1XYXZlbGVuZ3RoLCB5PVJlZmxlY3RhbmNlLGNvbG9yPXNpdGUsIGdyb3VwPWZpbGUpKSArCiAgeGxhYigiV2F2ZWxlbmd0aCIpICsgeWxhYigiUmFkaWFuY2UiKSArIAogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpnZ3Bsb3RseShnVyArIGdndGl0bGUoIldoaXRlIFJlZmVyZW5jZSBUYXJnZXQiKSkKCmcxIDwtIGdncGxvdChkYXRhPWQubGYpICsKICBnZW9tX2xpbmUoYWVzKHg9dywgeT1yLCBjb2xvcj10eXBlLCBsaW5ldHlwZT10YXJnZXQsZ3JvdXA9ZmlsZSksIGxpbmV3aWR0aD0wLjMpICsKICB4bGFiKCJXYXZlbGVuZ3RoIikgKyB5bGFiKCJSYWRpYW5jZSIpICsgCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsKICBnZ3RpdGxlKCJXaGl0ZSAoVykgYW5kIFN0YW5kYXJkIChTdGRSZWYpIFJlZmVyZW5jZSBUYXJnZXQiKSArCiAgZmFjZXRfd3JhcCh+dHlwZSxucm93PTMpCnByaW50KGcxKQpgYGAKTm90ZSB0aGF0IGluIHNvbWUgcGFydHMgb2YgdGhlIHNwZWN0cmEgYWNxdWlyZWQgdW5kZXIgUFJPTEFNUCBpbGx1bWluYXRpb24sIHRoZSByYWRpYW5jZSBvZiB0aGUgU3RhbmRhcmQgUmVmZXJlbmNlIGlzIGhpZ2hlciB0aGFuIHRoYXQgb2YgdGhlIFdoaXRlIFJlZmVyZW5jZSwgd2hpY2ggd2lsbCBpbXBseSBzb21lIHJlZmxlY3RhbmNlIHZhbHVlcyA+IDEuCgoKIyMgMy4yIFN0YW5kYXJkIFJlZmVyZW5jZQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KYSA8LSBkYXRhLmZyYW1lKGZpbGU9TkEsIHR5cGU9IkNlcnRpZmljYXRpb24iLCBncmFkZT1OQSwgdGFyZ2V0PSJTdGRSZWYiLCByZXBsaWNhdGU9TkEsIHRpbWU9TkEsIElEPSJjZXJ0aWYiLCB3PWNlcnRpZiRXYXZlbGVuZ3RoLCByPU5BLCByZj1OQSwgcz1jZXJ0aWYkUmVmbGVjdGFuY2UpCgptaWNvbG9yIDwtIGMoQ2VydGlmaWNhdGlvbj0iYmxhY2siLCBicmV3ZXIucGFsKDMsIlNldDEiKSApCm5hbWVzKG1pY29sb3IpIDwtIGMoIkNlcnRpZmljYXRpb24iLCAiS0FJU0VSIiwgIlBST0xBTVAiLCAiVklMQUxUQSIpCmcyIDwtIGdncGxvdChkYXRhPXJiaW5kKGRTdGRSLmxmLGEpKSArCiAgZ2VvbV9saW5lKGFlcyh4PXcsIHk9cywgY29sb3I9dHlwZSwgZ3JvdXA9ZmlsZSksIGxpbmV3aWR0aD0wLjMpICsKICAjZ2VvbV9saW5lKGRhdGE9Y2VydGlmLCBhZXMoeD1XYXZlbGVuZ3RoLCB5PVJlZmxlY3RhbmNlKSwgY29sb3I9ImJsYWNrIikrCiAgI2dlb21fcG9pbnQoYWVzKHg9V2F2ZWxlbmd0aCwgeT1SZWZsZWN0YW5jZSxjb2xvcj1zaXRlLCBncm91cD1maWxlKSkgKwogIHhsYWIoIldhdmVsZW5ndGgiKSArIHlsYWIoIlJlZmxlY3RhbmNlIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPW1pY29sb3IpICArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpnZ3Bsb3RseShnMiArIGdndGl0bGUoIlN0YW5kYXJkIFJlZmVyZW5jZSBUYXJnZXQiKSkKYGBgCldlIG9ic2VydmUgCgoqIFRoZXJlIGlzIGEgbm90b3Jpb3VzIHZhcmlhYmlsaXR5IG9mIHJlZmxlY3RhbmNlIHJlYWRpbmdzIHdpdGggY29uc3VtZXItZ3JhZGUgaWxsdW1pbmF0aW9uIHN5c3RlbXMgKFZJTExBTFRBIGFuZCBLQUlTRVIpLCBpbiBwYXJ0aWN1bGFyIGFmdGVyIDEwMDAgbm0uIAoqIFJlZmxlY3RhbmNlIHJlYWRpbmdzIHVuZGVyIFZJTEFMVEEgaWxsdW1pbmF0aW9uIGFyZSBtb3JlIHZhcmlhYmxlIHRoYW4gdW5kZXIgS0FJU0VSIGlsbHVtaW5hdGlvbiAoYnV0IHdlIGRpZCBub3QgY29udHJvbCBmb3IgdGhlIHNhbWUgd2FybWluZyB1cCBvZiB0aGUgYnVsYnMpLgoqIFJlZmxlY3RhbmNlIHZhbHVlcyBhcmUgbG93ZXIgd2l0aCBjb25zdW1lci1ncmFkZSBpbGx1bWluYXRpb24gKFZJTExBTFRBIGFuZCBLQUlTRVIpLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgYm90aCBvcHRpbWl6YXRpb24gYW5kIHdoaXRlIHJlZmVyZW5jZSByZWFkaW5ncyB3ZXJlIHBlcmZvcm1lZCBmb3IgZWFjaCB0eXBlIG9mIGlsbHVtaW5hdGlvbiB0eXBlLgoKIyMgNC4gUGFpcmVkIENvbXBhcmlzb24gb2YgaWxsdW1pbmF0aW9uIHN5c3RlbXMKKlRCRCB1c2luZyB0aGUgcmVzYW1wbGVkIGNlcnRpZmljYXRpb24gc3BlY3RyYSBhcyB0aGUgWCBheGlzKgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KZEsgPC0gZFN0ZFIubGZbZFN0ZFIubGYkdHlwZT09IktBSVNFUiIsIGMoOCw5LDExKV0KZFYgPC0gZFN0ZFIubGZbZFN0ZFIubGYkdHlwZT09IlZJTEFMVEEiLGMoOCw5LDExKV0KZFAgPC0gZFN0ZFIubGZbZFN0ZFIubGYkdHlwZT09IlBST0xBTVAiLCBjKDgsOSwxMSldCiNoZWFkKGRLKQojaGVhZChkVikKCmRLVlAgPC0gY2JpbmQoZEssclY9ZFYkciwgc1Y9ZFYkcywgc1A9ZFAkcykKI2hlYWQoZEtWKQpuYW1lcyhkS1ZQKVsyOjNdIDwtIGMoInJLIiwgInNLIiwgInNQIikKZEtWUCRkZXRlY3RvciA8LSAiMSIKZEtWUCRkZXRlY3RvcltkS1Ykdz4xMDAwICYgZEtWJHc8PTE4MDBdIDwtICIyIgpkS1ZQJGRldGVjdG9yW2RLViR3PjE4MDBdIDwtICIzIgoKZzNhIDwtIGdncGxvdChkYXRhPWRLVlApICsKICBnZW9tX3BvaW50KGFlcyh4PXNQLHk9c1YsIGNvbG9yPWRldGVjdG9yKSxzaGFwZT0yMSwgc2l6ZT0wLjUpKwogIHhsYWIoIlByb2xhbXAiKSArIHlsYWIoIlZpbGFsdGEiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSkgKwogIGdndGl0bGUoIlJlZmxlY3RhbmNlIG9mIFN0YW5kYXJkIFRhcmdldDogVmlsYWx0YSB2cyBQcm9sYW1wIGlsbHVtaW5hdGlvbiIpCiNwcmludChnM2EgKyBmYWNldF93cmFwKH5kZXRlY3RvciwgbmNvbD0yLCBzY2FsZXM9ImZyZWUiKSkKCmczYiA8LSBnZ3Bsb3QoZGF0YT1kS1ZQKSArCiAgZ2VvbV9wb2ludChhZXMoeD1zUCx5PXNLLCBjb2xvcj1kZXRlY3Rvciksc2hhcGU9MjEsIHNpemU9MC41KSsKICB4bGFiKCJQcm9sYW1wIikgKyB5bGFiKCJLYWlzZXIiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSkgKwogIGdndGl0bGUoIlJlZmxlY3RhbmNlIG9mIFN0YW5kYXJkIFRhcmdldDogS2Fpc2VyIHZzIFByb2xhbXAgaWxsdW1pbmF0aW9uIikKI3ByaW50KGczYiArIGZhY2V0X3dyYXAofmRldGVjdG9yLCBuY29sPTIsIHNjYWxlcz0iZnJlZSIpKQoKZzNjIDwtIGdncGxvdChkYXRhPWRLVlApICsKICBnZW9tX3BvaW50KGFlcyh4PXNLLHk9c1YsIGNvbG9yPWRldGVjdG9yKSxzaGFwZT0yMSwgc2l6ZT0wLjUpKwogIHhsYWIoIkthaXNlciIpICsgeWxhYigiVmlsYWx0YSIpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxKSArCiAgZ2d0aXRsZSgiUmVmbGVjdGFuY2Ugb2YgU3RhbmRhcmQgVGFyZ2V0OiBWaWxhbHRhIHZzIEthaXNlciBidWxicyIpCiNwcmludChnM2MgKyBmYWNldF93cmFwKH5kZXRlY3RvciwgbmNvbD0yLCBzY2FsZXM9ImZyZWUiKSkKIyhOb3RlIHRoYXQgd2UgYXJlIG5vdCByZWFkaW5nIGEgdW5pZm9ybSB3aGl0ZSB0YXJnZXQgYnV0IGEgc3RhbmRhcmQgcmVmZXJlbmNlIHRhcmdldCB3aXRoIHZlcnkgZGlmZmVyZW50ICNyZWZsZWN0YW5jZSB2YWx1ZXMgYWxvbmcgd2F2ZWxlbmd0aCkuCmBgYAoKIyMgNS4gQ29uY2x1c2lvbnMKCjEuIENvbnN1bWVyLWdyYWRlIGlsbHVtaW5hdGlvbiBzeXN0ZW1zIChWSUxMQUxUQSBhbmQgS0FJU0VSKSBjYW5ub3QgYmUgdXNlZCBmb3IgcmVmbGVjdGFuY2UgcmVhZGluZ3MgYWZ0ZXIgMTAwMCBubSBvZiB3YXZlbGVuZ3RoLCBidXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgU3BlY2ltIElRLgoyLiBLYWlzZXIgYnVsYnMgYXBwZWFyIHRvIGJlIG1vcmUgcG93ZXJmdWwgYW5kIHNsaWdodGx5IG1vcmUgc3RhYmxlIHRoYW4gVmlsYWx0YSBidWxicy4KCiAK