1 load libraries

2 Load 10x Visium dataset


InstallData("stxBrain")
trying URL 'http://seurat.nygenome.org/src/contrib/stxBrain.SeuratData_0.1.2.tar.gz'
Content type 'application/octet-stream' length 142661912 bytes (136.1 MB)
==================================================
downloaded 136.1 MB


The downloaded source packages are in
    ‘/tmp/RtmpsJDVnL/downloaded_packages’
brain <- LoadData("stxBrain", type = "anterior1")

3 Data preprocessing

plot1 <- VlnPlot(brain, features = "nCount_Spatial", pt.size = 0.1) + NoLegend()

plot2 <- SpatialFeaturePlot(brain, features = "nCount_Spatial") + theme(legend.position = "right")

wrap_plots(plot1, plot2)

4 Normalization

brain <- SCTransform(brain, assay = "Spatial", verbose = FALSE)

5 Gene expression visualization

SpatialFeaturePlot(brain, features = c("Hpca", "Ttr", "Mki67"))

custom_plot <- SpatialFeaturePlot(brain, features = c("Ttr")) + 
                theme(legend.text = element_text(size = 0),
                      legend.title = element_text(size = 20),
                      legend.key.size = unit(1, "cm"))

custom_plot

p1 <- SpatialFeaturePlot(brain, features = "Ttr", pt.size.factor = 1)

p2 <- SpatialFeaturePlot(brain, features = "Ttr", alpha = c(0.1, 1))

p1 + p2

6 Dimensionality reduction, clustering, and visualization

brain <- RunPCA(brain, assay = "SCT", verbose = FALSE)
brain <- FindNeighbors(brain, reduction = "pca", dims = 1:30)
brain <- FindClusters(brain, verbose = FALSE)
brain <- RunUMAP(brain, reduction = "pca", dims = 1:30)
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

7 visualize the results of the clustering either in UMAP space

p1 <- DimPlot(brain, reduction = "umap", label = TRUE) 

p2 <- SpatialDimPlot(brain, label = TRUE, label.size = 3) 

p1 + p2

8 visualize the results of the clustering either in UMAP space

SpatialDimPlot(brain,
               cells.highlight = CellsByIdentities(object = brain, idents = c(2, 1, 4, 3, 5, 8)), 
               facet.highlight = TRUE, 
               ncol = 3) & theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

9 Interactive plotting

SpatialDimPlot(brain, interactive = TRUE)

10 visualize the results of the clustering either in UMAP space

SpatialFeaturePlot(brain, features = "Ttr", interactive = TRUE)

11

LinkedDimPlot(brain)

12 Identification of Spatially Variable Features

de_markers <- FindMarkers(brain, ident.1 = 5, ident.2 = 7)

SpatialFeaturePlot(object = brain, features = rownames(de_markers)[1:3], alpha = c(0.1, 1), ncol = 3)

13 FindSpatiallyVariableFeatures

brain <- FindSpatiallyVariableFeatures(brain,
                                       features = VariableFeatures(brain)[1:1000],
                                       selection.method = "moransi")

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05m 08s      
  |+                                                 | 2 % ~04m 48s      
  |++                                                | 3 % ~04m 47s      
  |++                                                | 4 % ~04m 42s      
  |+++                                               | 5 % ~04m 39s      
  |+++                                               | 6 % ~04m 34s      
  |++++                                              | 7 % ~04m 26s      
  |++++                                              | 8 % ~04m 19s      
  |+++++                                             | 9 % ~04m 14s      
  |+++++                                             | 10% ~04m 09s      
  |++++++                                            | 11% ~04m 07s      
  |++++++                                            | 12% ~04m 02s      
  |+++++++                                           | 13% ~04m 01s      
  |+++++++                                           | 14% ~03m 56s      
  |++++++++                                          | 15% ~03m 52s      
  |++++++++                                          | 16% ~03m 48s      
  |+++++++++                                         | 17% ~03m 47s      
  |+++++++++                                         | 18% ~03m 43s      
  |++++++++++                                        | 19% ~03m 40s      
  |++++++++++                                        | 20% ~03m 36s      
  |+++++++++++                                       | 21% ~03m 32s      
  |+++++++++++                                       | 22% ~03m 30s      
  |++++++++++++                                      | 23% ~03m 26s      
  |++++++++++++                                      | 24% ~03m 24s      
  |+++++++++++++                                     | 25% ~03m 21s      
  |+++++++++++++                                     | 26% ~03m 18s      
  |++++++++++++++                                    | 27% ~03m 15s      
  |++++++++++++++                                    | 28% ~03m 13s      
  |+++++++++++++++                                   | 29% ~03m 10s      
  |+++++++++++++++                                   | 30% ~03m 07s      
  |++++++++++++++++                                  | 31% ~03m 04s      
  |++++++++++++++++                                  | 32% ~03m 02s      
  |+++++++++++++++++                                 | 33% ~02m 58s      
  |+++++++++++++++++                                 | 34% ~02m 56s      
  |++++++++++++++++++                                | 35% ~02m 53s      
  |++++++++++++++++++                                | 36% ~02m 50s      
  |+++++++++++++++++++                               | 37% ~02m 47s      
  |+++++++++++++++++++                               | 38% ~02m 44s      
  |++++++++++++++++++++                              | 39% ~02m 41s      
  |++++++++++++++++++++                              | 40% ~02m 38s      
  |+++++++++++++++++++++                             | 41% ~02m 36s      
  |+++++++++++++++++++++                             | 42% ~02m 33s      
  |++++++++++++++++++++++                            | 43% ~02m 30s      
  |++++++++++++++++++++++                            | 44% ~02m 27s      
  |+++++++++++++++++++++++                           | 45% ~02m 25s      
  |+++++++++++++++++++++++                           | 46% ~02m 22s      
  |++++++++++++++++++++++++                          | 47% ~02m 20s      
  |++++++++++++++++++++++++                          | 48% ~02m 17s      
  |+++++++++++++++++++++++++                         | 49% ~02m 14s      
  |+++++++++++++++++++++++++                         | 50% ~02m 11s      
  |++++++++++++++++++++++++++                        | 51% ~02m 09s      
  |++++++++++++++++++++++++++                        | 52% ~02m 06s      
  |+++++++++++++++++++++++++++                       | 53% ~02m 04s      
  |+++++++++++++++++++++++++++                       | 54% ~02m 01s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 58s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 56s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 53s      
  |+++++++++++++++++++++++++++++                     | 58% ~01m 50s      
  |++++++++++++++++++++++++++++++                    | 59% ~01m 47s      
  |++++++++++++++++++++++++++++++                    | 60% ~01m 45s      
  |+++++++++++++++++++++++++++++++                   | 61% ~01m 42s      
  |+++++++++++++++++++++++++++++++                   | 62% ~01m 39s      
  |++++++++++++++++++++++++++++++++                  | 63% ~01m 37s      
  |++++++++++++++++++++++++++++++++                  | 64% ~01m 34s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~01m 31s      
  |+++++++++++++++++++++++++++++++++                 | 66% ~01m 29s      
  |++++++++++++++++++++++++++++++++++                | 67% ~01m 26s      
  |++++++++++++++++++++++++++++++++++                | 68% ~01m 24s      
  |+++++++++++++++++++++++++++++++++++               | 69% ~01m 21s      
  |+++++++++++++++++++++++++++++++++++               | 70% ~01m 18s      
  |++++++++++++++++++++++++++++++++++++              | 71% ~01m 16s      
  |++++++++++++++++++++++++++++++++++++              | 72% ~01m 13s      
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 10s      
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01m 08s      
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 05s      
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01m 03s      
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01m 00s      
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~57s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~55s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~52s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~50s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~47s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~44s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~42s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~39s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~36s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~34s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~31s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~29s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~26s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~23s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~16s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04m 21s
top.features <- head(SpatiallyVariableFeatures(brain, method = "moransi"), 6)

SpatialFeaturePlot(brain, features = top.features, ncol = 3, alpha = c(0.1, 1)) & 
  theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

14 Subset out anatomical regions

brain_sub <- subset(brain, idents = c(1, 2, 3, 4, 6, 7))

SpatialDimPlot(brain_sub, label = T, crop = T, label.size = 3) + NoLegend() + 
  SpatialDimPlot(brain_sub, label = T, crop = F, label.size = 3)

theme_axis_labels <- theme(axis.text.x = element_text(size = 10), 
                           axis.text.y = element_text(size = 10),
                           axis.title.x = element_text(size = 10),
                           axis.title.y = element_text(size = 10))

SpatialDimPlot(brain_sub, label = T, label.size = 3, crop = T) + theme_axis_labels

brain_sub[["anterior1"]] <- Crop(brain_sub[["anterior1"]],
                              x = c(150, 500),
                              y = c(0, 425))

SpatialDimPlot(brain_sub, label = T) + theme_axis_labels

m <- 0.6; b <- -550

cortex_coords <- GetTissueCoordinates(brain_sub, scale = "lowres") %>%
                  subset(-y >= (m * x + b))

cortex <- subset(brain_sub, 
                 cells = cortex_coords$cell)

SpatialDimPlot(cortex, label = T, label.size = 3, crop = F)

c1 <- SpatialDimPlot(cortex, images = "anterior1", crop = T, label = T)
c2 <- SpatialDimPlot(cortex, images = "anterior1", crop = F, label = T, pt.size.factor = 1, label.size = 3)

c1 + c2

15 Integration with single-cell data

allen_reference <- readRDS("/brahms/shared/vignette-data/allen_cortex.rds")
LS0tCnRpdGxlOiAiU2V1cmF0IFNwYXRpYWwgVHV0b3JpYWwiCmF1dGhvcjogIk5hc2lyIE1haG1vb2QgQWJiYXNpIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICB0aGVtZTogam91cm5hbAotLS0KCgojIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShTZXVyYXREYXRhKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCgojIExvYWQgMTB4IFZpc2l1bSBkYXRhc2V0CmBgYHtyfQoKSW5zdGFsbERhdGEoInN0eEJyYWluIikKCmJyYWluIDwtIExvYWREYXRhKCJzdHhCcmFpbiIsIHR5cGUgPSAiYW50ZXJpb3IxIikKYGBgCgojIERhdGEgcHJlcHJvY2Vzc2luZwpgYGB7cn0KcGxvdDEgPC0gVmxuUGxvdChicmFpbiwgZmVhdHVyZXMgPSAibkNvdW50X1NwYXRpYWwiLCBwdC5zaXplID0gMC4xKSArIE5vTGVnZW5kKCkKCnBsb3QyIDwtIFNwYXRpYWxGZWF0dXJlUGxvdChicmFpbiwgZmVhdHVyZXMgPSAibkNvdW50X1NwYXRpYWwiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgp3cmFwX3Bsb3RzKHBsb3QxLCBwbG90MikKYGBgCiMgTm9ybWFsaXphdGlvbgpgYGB7cn0KYnJhaW4gPC0gU0NUcmFuc2Zvcm0oYnJhaW4sIGFzc2F5ID0gIlNwYXRpYWwiLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCgoKIyBHZW5lIGV4cHJlc3Npb24gdmlzdWFsaXphdGlvbgpgYGB7cn0KU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9IGMoIkhwY2EiLCAiVHRyIiwgIk1raTY3IikpCmBgYAoKCmBgYHtyfQpjdXN0b21fcGxvdCA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoYnJhaW4sIGZlYXR1cmVzID0gYygiVHRyIikpICsgCiAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMCksCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMSwgImNtIikpCgpjdXN0b21fcGxvdApgYGAKCgpgYGB7cn0KcDEgPC0gU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9ICJUdHIiLCBwdC5zaXplLmZhY3RvciA9IDEpCgpwMiA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoYnJhaW4sIGZlYXR1cmVzID0gIlR0ciIsIGFscGhhID0gYygwLjEsIDEpKQoKcDEgKyBwMgpgYGAKCgoKCiMgRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLCBjbHVzdGVyaW5nLCBhbmQgdmlzdWFsaXphdGlvbgpgYGB7cn0KYnJhaW4gPC0gUnVuUENBKGJyYWluLCBhc3NheSA9ICJTQ1QiLCB2ZXJib3NlID0gRkFMU0UpCmJyYWluIDwtIEZpbmROZWlnaGJvcnMoYnJhaW4sIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKYnJhaW4gPC0gRmluZENsdXN0ZXJzKGJyYWluLCB2ZXJib3NlID0gRkFMU0UpCmJyYWluIDwtIFJ1blVNQVAoYnJhaW4sIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKYGBgCgoKCgojIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cyBvZiB0aGUgY2x1c3RlcmluZyBlaXRoZXIgaW4gVU1BUCBzcGFjZSAKYGBge3J9CnAxIDwtIERpbVBsb3QoYnJhaW4sIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFKSAKCnAyIDwtIFNwYXRpYWxEaW1QbG90KGJyYWluLCBsYWJlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAzKSAKCnAxICsgcDIKYGBgCgojIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cyBvZiB0aGUgY2x1c3RlcmluZyBlaXRoZXIgaW4gVU1BUCBzcGFjZSAKYGBge3J9ClNwYXRpYWxEaW1QbG90KGJyYWluLAogICAgICAgICAgICAgICBjZWxscy5oaWdobGlnaHQgPSBDZWxsc0J5SWRlbnRpdGllcyhvYmplY3QgPSBicmFpbiwgaWRlbnRzID0gYygyLCAxLCA0LCAzLCA1LCA4KSksIAogICAgICAgICAgICAgICBmYWNldC5oaWdobGlnaHQgPSBUUlVFLCAKICAgICAgICAgICAgICAgbmNvbCA9IDMpICYgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMSwgMSksICJtbSIpKQpgYGAKCgojIEludGVyYWN0aXZlIHBsb3R0aW5nCmBgYHtyfQpTcGF0aWFsRGltUGxvdChicmFpbiwgaW50ZXJhY3RpdmUgPSBUUlVFKQpgYGAKCgoKCiMgdmlzdWFsaXplIHRoZSByZXN1bHRzIG9mIHRoZSBjbHVzdGVyaW5nIGVpdGhlciBpbiBVTUFQIHNwYWNlIApgYGB7cn0KU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9ICJUdHIiLCBpbnRlcmFjdGl2ZSA9IFRSVUUpCmBgYAoKCgojIApgYGB7cn0KTGlua2VkRGltUGxvdChicmFpbikKYGBgCgoKIyBJZGVudGlmaWNhdGlvbiBvZiBTcGF0aWFsbHkgVmFyaWFibGUgRmVhdHVyZXMKYGBge3J9CmRlX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoYnJhaW4sIGlkZW50LjEgPSA1LCBpZGVudC4yID0gNykKClNwYXRpYWxGZWF0dXJlUGxvdChvYmplY3QgPSBicmFpbiwgZmVhdHVyZXMgPSByb3duYW1lcyhkZV9tYXJrZXJzKVsxOjNdLCBhbHBoYSA9IGMoMC4xLCAxKSwgbmNvbCA9IDMpCmBgYAoKCgojIEZpbmRTcGF0aWFsbHlWYXJpYWJsZUZlYXR1cmVzCmBgYHtyfQpicmFpbiA8LSBGaW5kU3BhdGlhbGx5VmFyaWFibGVGZWF0dXJlcyhicmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKGJyYWluKVsxOjEwMDBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubWV0aG9kID0gIm1vcmFuc2kiKQoKdG9wLmZlYXR1cmVzIDwtIGhlYWQoU3BhdGlhbGx5VmFyaWFibGVGZWF0dXJlcyhicmFpbiwgbWV0aG9kID0gIm1vcmFuc2kiKSwgNikKClNwYXRpYWxGZWF0dXJlUGxvdChicmFpbiwgZmVhdHVyZXMgPSB0b3AuZmVhdHVyZXMsIG5jb2wgPSAzLCBhbHBoYSA9IGMoMC4xLCAxKSkgJiAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAxLCAxKSwgIm1tIikpCmBgYAoKCgoKIyBTdWJzZXQgb3V0IGFuYXRvbWljYWwgcmVnaW9ucwpgYGB7cn0KYnJhaW5fc3ViIDwtIHN1YnNldChicmFpbiwgaWRlbnRzID0gYygxLCAyLCAzLCA0LCA2LCA3KSkKClNwYXRpYWxEaW1QbG90KGJyYWluX3N1YiwgbGFiZWwgPSBULCBjcm9wID0gVCwgbGFiZWwuc2l6ZSA9IDMpICsgTm9MZWdlbmQoKSArIAogIFNwYXRpYWxEaW1QbG90KGJyYWluX3N1YiwgbGFiZWwgPSBULCBjcm9wID0gRiwgbGFiZWwuc2l6ZSA9IDMpCmBgYAoKCgoKCmBgYHtyfQp0aGVtZV9heGlzX2xhYmVscyA8LSB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQoKU3BhdGlhbERpbVBsb3QoYnJhaW5fc3ViLCBsYWJlbCA9IFQsIGxhYmVsLnNpemUgPSAzLCBjcm9wID0gVCkgKyB0aGVtZV9heGlzX2xhYmVscwpgYGAKCgoKYGBge3J9CmJyYWluX3N1YltbImFudGVyaW9yMSJdXSA8LSBDcm9wKGJyYWluX3N1YltbImFudGVyaW9yMSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGMoMTUwLCA1MDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYygwLCA0MjUpKQoKU3BhdGlhbERpbVBsb3QoYnJhaW5fc3ViLCBsYWJlbCA9IFQpICsgdGhlbWVfYXhpc19sYWJlbHMKYGBgCgoKCgoKYGBge3J9Cm0gPC0gMC42OyBiIDwtIC01NTAKCmNvcnRleF9jb29yZHMgPC0gR2V0VGlzc3VlQ29vcmRpbmF0ZXMoYnJhaW5fc3ViLCBzY2FsZSA9ICJsb3dyZXMiKSAlPiUKICAgICAgICAgICAgICAgICAgc3Vic2V0KC15ID49IChtICogeCArIGIpKQoKY29ydGV4IDwtIHN1YnNldChicmFpbl9zdWIsIAogICAgICAgICAgICAgICAgIGNlbGxzID0gY29ydGV4X2Nvb3JkcyRjZWxsKQoKU3BhdGlhbERpbVBsb3QoY29ydGV4LCBsYWJlbCA9IFQsIGxhYmVsLnNpemUgPSAzLCBjcm9wID0gRikKYGBgCgpgYGB7cn0KYzEgPC0gU3BhdGlhbERpbVBsb3QoY29ydGV4LCBpbWFnZXMgPSAiYW50ZXJpb3IxIiwgY3JvcCA9IFQsIGxhYmVsID0gVCkKYzIgPC0gU3BhdGlhbERpbVBsb3QoY29ydGV4LCBpbWFnZXMgPSAiYW50ZXJpb3IxIiwgY3JvcCA9IEYsIGxhYmVsID0gVCwgcHQuc2l6ZS5mYWN0b3IgPSAxLCBsYWJlbC5zaXplID0gMykKCmMxICsgYzIKYGBgCgoKIyBJbnRlZ3JhdGlvbiB3aXRoIHNpbmdsZS1jZWxsIGRhdGEKYGBge3J9CmFsbGVuX3JlZmVyZW5jZSA8LSByZWFkUkRTKCIvYnJhaG1zL3NoYXJlZC92aWduZXR0ZS1kYXRhL2FsbGVuX2NvcnRleC5yZHMiKQpgYGAKCg==