Last updated: 2018-01-09

Code version: 1e789e8

See more puzzles

Advent of Code

Session information

sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.6

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] aocodeR_0.1.1      testthat_1.0.2     forcats_0.2.0      stringr_1.2.0      dplyr_0.7.4       
 [6] purrr_0.2.4        readr_1.1.1        tidyr_0.7.2        tibble_1.3.4       ggplot2_2.2.1.9000
[11] tidyverse_1.2.1   

loaded via a namespace (and not attached):
 [1] reshape2_1.4.2    haven_1.1.0       lattice_0.20-35   colorspace_1.3-2  htmltools_0.3.6  
 [6] base64enc_0.1-3   yaml_2.1.15       rlang_0.1.4       foreign_0.8-69    glue_1.2.0       
[11] modelr_0.1.1      readxl_1.0.0      bindrcpp_0.2      bindr_0.1         plyr_1.8.4       
[16] munsell_0.4.3     gtable_0.2.0      cellranger_1.1.0  rvest_0.3.2       evaluate_0.10.1  
[21] psych_1.7.8       knitr_1.17        parallel_3.4.2    curl_3.0          broom_0.4.2      
[26] Rcpp_0.12.14      scales_0.5.0.9000 backports_1.1.1   jsonlite_1.5      mnormt_1.5-5     
[31] digest_0.6.12     hms_0.4.0         stringi_1.1.6     grid_3.4.2        rprojroot_1.2    
[36] cli_1.0.0         tools_3.4.2       magrittr_1.5      lazyeval_0.2.1    crayon_1.3.4     
[41] pkgconfig_2.0.1   xml2_1.1.1        lubridate_1.7.1   assertthat_0.2.0  rmarkdown_1.8    
[46] httr_1.3.1        rstudioapi_0.7    R6_2.2.2          nlme_3.1-131      git2r_0.19.0     
[51] compiler_3.4.2   

Brief

You decide to head directly to the CPU and fix the printer from there. As you get close, you find an experimental coprocessor doing so much work that the local programs are afraid it will halt and catch fire. This would cause serious issues for the rest of the computer, so you head in and see what you can do.

The code it’s running seems to be a variant of the kind you saw recently on that tablet. The general functionality seems very similar, but some of the instructions are different:

set X Y sets register X to the value of Y. sub X Y decreases register X by the value of Y. mul X Y sets register X to the result of multiplying the value contained in register X by the value of Y. jnz X Y jumps with an offset of the value of Y, but only if the value of X is not zero. (An offset of 2 skips the next instruction, an offset of -1 jumps to the previous instruction, and so on.)

Only the instructions listed above are used. The eight registers here, named a through h, all start at 0.

The coprocessor is currently set to some kind of debug mode, which allows for testing, but prevents it from doing any meaningful work.

If you run the program (your puzzle input), how many times is the mul instruction invoked?

Let’s go

Packages & functions

library(devtools)
install_github("annakrystalli/aocodeR")
library(tidyverse)
── Attaching packages ─────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 2.2.1.9000     ✔ purrr   0.2.4     
✔ tibble  1.3.4          ✔ dplyr   0.7.4     
✔ tidyr   0.7.2          ✔ stringr 1.2.0     
✔ readr   1.1.1          ✔ forcats 0.2.0     
── Conflicts ────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(testthat)

Attaching package: ‘testthat’

The following object is masked from ‘package:dplyr’:

    matches

The following object is masked from ‘package:purrr’:

    is_null
library(aocodeR)

Input

input <- aoc_get_input(day = 23, cookie_path = paste0(rprojroot::find_rstudio_root_file(),
                                                 "/secrets/session_cookie.txt")) %>% 
    strsplit(., "\n") %>% unlist %>% 
    strsplit(., " ")
input %>% head
[[1]]
[1] "set" "b"   "84" 

[[2]]
[1] "set" "c"   "b"  

[[3]]
[1] "jnz" "a"   "2"  

[[4]]
[1] "jnz" "1"   "5"  

[[5]]
[1] "mul" "b"   "100"

[[6]]
[1] "sub"     "b"       "-100000"

Functions

value.Y <- function(Y){
    Y <- type.convert(Y, as.is = T)
    if(class(Y) == "character"){as.numeric(get(Y, envir = e))}else{as.numeric(Y)}
}
#expect_equal(,)
create_inst_frm <- function(f, envir = e){
    
    f$set <- function(X, Y){
        assign(X, value.Y(Y), envir = e)    
    }
    f$sub <- function(X, Y){
        assign(X, get(X, envir = e) - value.Y(Y), envir = e)
    }
    f$mul <- function(X, Y){
        assign(X, get(X, envir = e) * value.Y(Y), envir = e)
        f$mul_track <- f$mul_track + 1
    }
    f$jnz <- function(X, Y){
        if(value.Y(X) != 0){
            assign("i", (get("i", envir = f) + value.Y(Y) - 1), envir = f)}
    }
}
run_inst <- function(input, f) {
      
    f$i <- 1
    while((1 <= f$i & f$i <= length(input))){
            #cat("i = ", i, " --- f$i = ", f$i, "\n\n")
        #input[[f$i]]
        inst <- input[[f$i]]
        f[[inst[1]]](inst[2], inst[3])
        f$i <- f$i + 1
        #i <- i + 1
    }
    cat("END")
}

Test

#expect_equal(,)

deploy

e <- new.env(parent = emptyenv())
f <- new.env(parent = emptyenv())
map(.x = letters[1:8], .f = ~assign(.x, 0, envir = e))
[[1]]
[1] 0

[[2]]
[1] 0

[[3]]
[1] 0

[[4]]
[1] 0

[[5]]
[1] 0

[[6]]
[1] 0

[[7]]
[1] 0

[[8]]
[1] 0
f$mul_track <- 0
create_inst_frm(f)
run_inst(input, f)
[1] 6724

Success!



—- Part 2 —-

❗️ HELP NEEDED ❗️

Too slow or caught in infinite loop?

Too slow

Any feedback? let me know here!


Brief

Now, it’s time to fix the problem.

The debug mode switch is wired directly to register a. You flip the switch, which makes register a now start at 1 when the program is executed.

Immediately, the coprocessor begins to overheat. Whoever wrote this program obviously didn’t choose a very efficient implementation. You’ll need to optimize the program if it has any hope of completing before Santa needs that printer working.

The coprocessor’s ultimate goal is to determine the final value left in register h once the program completes. Technically, if it had that… it wouldn’t even need to run the program.

After setting register a to 1, if the program were to run to completion, what value would be left in register h?

Let’s go

Test

#expect_equal(,)

deploy

Deploying just ends up runing forever

e <- new.env(parent = emptyenv())
f <- new.env(parent = emptyenv())
map(.x = letters[1:8], .f = ~assign(.x, 0, envir = e))
f$mul_track <- 0
e$a <- 1

create_inst_frm(f)
run_inst(input, f)

Reproducible version of my input

dput(aoc_get_input(day = 23, cookie_path = paste0(rprojroot::find_rstudio_root_file(),
                                                 "/secrets/session_cookie.txt")))
"set b 84\nset c b\njnz a 2\njnz 1 5\nmul b 100\nsub b -100000\nset c b\nsub c -17000\nset f 1\nset d 2\nset e 2\nset g d\nmul g e\nsub g b\njnz g 2\nset f 0\nsub e -1\nset g e\nsub g b\njnz g -8\nsub d -1\nset g d\nsub g b\njnz g -13\njnz f 2\nsub h -1\nset g b\nsub g c\njnz g 2\njnz 1 3\nsub b -17\njnz 1 -23"



template based on the workflowr standalone template

LS0tCnRpdGxlOiAiLS0tIERheSAyMzogQ29wcm9jZXNzb3IgQ29uZmxhZ3JhdGlvbiAtLS0iCmF1dGhvcjogImFubmFrcnlzdGFsbGkiCmRhdGU6IDIwMTctMTItMjMKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKYGBge3Iga25pdHItb3B0cy1jaHVuaywgaW5jbHVkZT1GQUxTRX0KIyBVcGRhdGUga25pdHIgY2h1bmsgb3B0aW9ucwojIGh0dHBzOi8veWlodWkubmFtZS9rbml0ci9vcHRpb25zLyNjaHVuay1vcHRpb25zCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBjb21tZW50ID0gTkEsCiAgZmlnLmFsaWduID0gImNlbnRlciIsCiAgdGlkeSA9IEZBTFNFLAogIGZpZy5wYXRoID0gcGFzdGUwKCJmaWd1cmUvIiwga25pdHI6OmN1cnJlbnRfaW5wdXQoKSwgIi8iKQopCmBgYAoKYGBge3IgbGFzdC11cGRhdGVkLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30KIyBJbnNlcnQgdGhlIGRhdGUgdGhlIGZpbGUgd2FzIGxhc3QgdXBkYXRlZApjYXQoc3ByaW50ZigiKipMYXN0IHVwZGF0ZWQ6KiogJXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgpgYGB7ciBjb2RlLXZlcnNpb24sIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojIEluc2VydCB0aGUgY29kZSB2ZXJzaW9uIChHaXQgY29tbWl0IFNIQTEpIGlmIEdpdCByZXBvc2l0b3J5IGV4aXN0cyBhbmQgUgojIHBhY2thZ2UgZ2l0MnIgaXMgaW5zdGFsbGVkCmlmKHJlcXVpcmVOYW1lc3BhY2UoImdpdDJyIiwgcXVpZXRseSA9IFRSVUUpKSB7CiAgaWYoZ2l0MnI6OmluX3JlcG9zaXRvcnkoKSkgewogICAgY29kZV92ZXJzaW9uIDwtIHN1YnN0cihnaXQycjo6Y29tbWl0cygpW1sxXV1Ac2hhLCAxLCA3KQogIH0gZWxzZSB7CiAgICBjb2RlX3ZlcnNpb24gPC0gIlVuYXZhaWxhYmxlLiBJbml0aWFsaXplIEdpdCByZXBvc2l0b3J5IHRvIGVuYWJsZS4iCiAgfQp9IGVsc2UgewogIGNvZGVfdmVyc2lvbiA8LSAiVW5hdmFpbGFibGUuIEluc3RhbGwgZ2l0MnIgcGFja2FnZSB0byBlbmFibGUuIgp9CmNhdChzcHJpbnRmKCIqKkNvZGUgdmVyc2lvbjoqKiAlcyIsIGNvZGVfdmVyc2lvbikpCnJtKGNvZGVfdmVyc2lvbikKYGBgCgoKPiBbKioqU2VlIG1vcmUgcHV6emxlcyoqKl0oaHR0cDovL2FubmFrcnlzdGFsbGkubWUvYWR2ZW50X29mX2NvZGUvKQoKWyoqQWR2ZW50IG9mIENvZGUqKl0oaHR0cHM6Ly9hZHZlbnRvZmNvZGUuY29tLzIwMTcvKQoKCiMjIFNlc3Npb24gaW5mb3JtYXRpb24KCjwhLS0gSW5zZXJ0IHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uIGludG8gdGhlIGRvY3VtZW50IC0tPgpgYGB7ciBzZXNzaW9uLWluZm99CnNlc3Npb25JbmZvKCkKYGBgCgoKIyMgQnJpZWYKCjwhLS0gSW5zZXJ0IFBhcnQgMSBvZiB0aGUgcHV6emxlIGJyaWVmIGhlcmUgLS0+CgoKWW91IGRlY2lkZSB0byBoZWFkIGRpcmVjdGx5IHRvIHRoZSBDUFUgYW5kIGZpeCB0aGUgcHJpbnRlciBmcm9tIHRoZXJlLiBBcyB5b3UgZ2V0IGNsb3NlLCB5b3UgZmluZCBhbiBleHBlcmltZW50YWwgY29wcm9jZXNzb3IgZG9pbmcgc28gbXVjaCB3b3JrIHRoYXQgdGhlIGxvY2FsIHByb2dyYW1zIGFyZSBhZnJhaWQgaXQgd2lsbCBoYWx0IGFuZCBjYXRjaCBmaXJlLiBUaGlzIHdvdWxkIGNhdXNlIHNlcmlvdXMgaXNzdWVzIGZvciB0aGUgcmVzdCBvZiB0aGUgY29tcHV0ZXIsIHNvIHlvdSBoZWFkIGluIGFuZCBzZWUgd2hhdCB5b3UgY2FuIGRvLgoKVGhlIGNvZGUgaXQncyBydW5uaW5nIHNlZW1zIHRvIGJlIGEgdmFyaWFudCBvZiB0aGUga2luZCB5b3Ugc2F3IHJlY2VudGx5IG9uIHRoYXQgdGFibGV0LiBUaGUgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5IHNlZW1zIHZlcnkgc2ltaWxhciwgYnV0IHNvbWUgb2YgdGhlIGluc3RydWN0aW9ucyBhcmUgZGlmZmVyZW50OgoKYHNldCBYIFlgIHNldHMgcmVnaXN0ZXIgWCB0byB0aGUgdmFsdWUgb2YgWS4KYHN1YiBYIFlgIGRlY3JlYXNlcyByZWdpc3RlciBYIGJ5IHRoZSB2YWx1ZSBvZiBZLgpgbXVsIFggWWAgc2V0cyByZWdpc3RlciBYIHRvIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiByZWdpc3RlciBYIGJ5IHRoZSB2YWx1ZSBvZiBZLgpgam56IFggWWAgKipqdW1wcyB3aXRoIGFuIG9mZnNldCBvZiB0aGUgdmFsdWUgb2YgWSoqLCBidXQgKipvbmx5IGlmIHRoZSB2YWx1ZSBvZiBYIGlzIG5vdCB6ZXJvKiouIChBbiBvZmZzZXQgb2YgMiBza2lwcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgYW4gb2Zmc2V0IG9mIC0xIGp1bXBzIHRvIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgYW5kIHNvIG9uLikKCk9ubHkgdGhlIGluc3RydWN0aW9ucyBsaXN0ZWQgYWJvdmUgYXJlIHVzZWQuIFRoZSAqKmVpZ2h0IHJlZ2lzdGVycyBoZXJlLCBuYW1lZCBhIHRocm91Z2ggaCwgYWxsIHN0YXJ0IGF0IGAwYC4qKgoKVGhlIGNvcHJvY2Vzc29yIGlzIGN1cnJlbnRseSBzZXQgdG8gc29tZSBraW5kIG9mIGRlYnVnIG1vZGUsIHdoaWNoIGFsbG93cyBmb3IgdGVzdGluZywgYnV0IHByZXZlbnRzIGl0IGZyb20gZG9pbmcgYW55IG1lYW5pbmdmdWwgd29yay4KCklmIHlvdSBydW4gdGhlIHByb2dyYW0gKHlvdXIgcHV6emxlIGlucHV0KSwgaG93IG1hbnkgdGltZXMgaXMgdGhlIG11bCBpbnN0cnVjdGlvbiBpbnZva2VkPwoKCgojIExldCdzIGdvCgojIyMgUGFja2FnZXMgJiBmdW5jdGlvbnMKYGBge3IsIGV2YWw9RkFMU0V9CmxpYnJhcnkoZGV2dG9vbHMpCmluc3RhbGxfZ2l0aHViKCJhbm5ha3J5c3RhbGxpL2FvY29kZVIiKQpgYGAKCgpgYGB7ciwgbWVzc2FnZSA9IEZ9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRlc3R0aGF0KQpsaWJyYXJ5KGFvY29kZVIpCmBgYAoKCiMjIElucHV0Cgo8IS0tIFN1cHBseSBkYXkuIGNvb2tpZV9wYXRoIGRlZmF1bHRzIHRvIHBhdGggaW4gbXkgcHJvamVjdCAtLT4KYGBge3J9CmlucHV0IDwtIGFvY19nZXRfaW5wdXQoZGF5ID0gMjMsIGNvb2tpZV9wYXRoID0gcGFzdGUwKHJwcm9qcm9vdDo6ZmluZF9yc3R1ZGlvX3Jvb3RfZmlsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zZWNyZXRzL3Nlc3Npb25fY29va2llLnR4dCIpKSAlPiUgCiAgICBzdHJzcGxpdCguLCAiXG4iKSAlPiUgdW5saXN0ICU+JSAKICAgIHN0cnNwbGl0KC4sICIgIikKaW5wdXQgJT4lIGhlYWQKYGBgCgojIyBGdW5jdGlvbnMKYGBge3J9CnZhbHVlLlkgPC0gZnVuY3Rpb24oWSl7CiAgICBZIDwtIHR5cGUuY29udmVydChZLCBhcy5pcyA9IFQpCiAgICBpZihjbGFzcyhZKSA9PSAiY2hhcmFjdGVyIil7YXMubnVtZXJpYyhnZXQoWSwgZW52aXIgPSBlKSl9ZWxzZXthcy5udW1lcmljKFkpfQp9CgojZXhwZWN0X2VxdWFsKCwpCmNyZWF0ZV9pbnN0X2ZybSA8LSBmdW5jdGlvbihmLCBlbnZpciA9IGUpewogICAgCiAgICBmJHNldCA8LSBmdW5jdGlvbihYLCBZKXsKICAgICAgICBhc3NpZ24oWCwgdmFsdWUuWShZKSwgZW52aXIgPSBlKSAgICAKICAgIH0KICAgIGYkc3ViIDwtIGZ1bmN0aW9uKFgsIFkpewogICAgICAgIGFzc2lnbihYLCBnZXQoWCwgZW52aXIgPSBlKSAtIHZhbHVlLlkoWSksIGVudmlyID0gZSkKICAgIH0KICAgIGYkbXVsIDwtIGZ1bmN0aW9uKFgsIFkpewogICAgICAgIGFzc2lnbihYLCBnZXQoWCwgZW52aXIgPSBlKSAqIHZhbHVlLlkoWSksIGVudmlyID0gZSkKICAgICAgICBmJG11bF90cmFjayA8LSBmJG11bF90cmFjayArIDEKICAgIH0KICAgIGYkam56IDwtIGZ1bmN0aW9uKFgsIFkpewogICAgICAgIGlmKHZhbHVlLlkoWCkgIT0gMCl7CiAgICAgICAgICAgIGFzc2lnbigiaSIsIChnZXQoImkiLCBlbnZpciA9IGYpICsgdmFsdWUuWShZKSAtIDEpLCBlbnZpciA9IGYpfQogICAgfQp9CgpydW5faW5zdCA8LSBmdW5jdGlvbihpbnB1dCwgZikgewogICAgICAKICAgIGYkaSA8LSAxCiAgICB3aGlsZSgoMSA8PSBmJGkgJiBmJGkgPD0gbGVuZ3RoKGlucHV0KSkpewogICAgICAgICAgICAjY2F0KCJpID0gIiwgaSwgIiAtLS0gZiRpID0gIiwgZiRpLCAiXG5cbiIpCiAgICAgICAgI2lucHV0W1tmJGldXQogICAgICAgIGluc3QgPC0gaW5wdXRbW2YkaV1dCiAgICAgICAgZltbaW5zdFsxXV1dKGluc3RbMl0sIGluc3RbM10pCiAgICAgICAgZiRpIDwtIGYkaSArIDEKICAgICAgICAjaSA8LSBpICsgMQogICAgfQogICAgY2F0KCJFTkQiKQp9CgpgYGAKCiMjIFRlc3QKYGBge3J9CiNleHBlY3RfZXF1YWwoLCkKYGBgCgojIyBkZXBsb3kKCmBgYHtyfQplIDwtIG5ldy5lbnYocGFyZW50ID0gZW1wdHllbnYoKSkKZiA8LSBuZXcuZW52KHBhcmVudCA9IGVtcHR5ZW52KCkpCm1hcCgueCA9IGxldHRlcnNbMTo4XSwgLmYgPSB+YXNzaWduKC54LCAwLCBlbnZpciA9IGUpKQpmJG11bF90cmFjayA8LSAwCgpjcmVhdGVfaW5zdF9mcm0oZikKcnVuX2luc3QoaW5wdXQsIGYpCmYkbXVsX3RyYWNrCmBgYAoKCiMjIFN1Y2Nlc3MhCgoKPGJyPgoKKioqCgojIC0tLS0gUGFydCAyIC0tLS0KCiMgYHIgZW1vamlmb250OjplbW9qaSgnaGVhdnlfZXhjbGFtYXRpb25fbWFyaycpYCBIRUxQIE5FRURFRCBgciBlbW9qaWZvbnQ6OmVtb2ppKCdoZWF2eV9leGNsYW1hdGlvbl9tYXJrJylgCiMjIyBUb28gc2xvdyBvciBjYXVnaHQgaW4gaW5maW5pdGUgbG9vcD8gCgojIyMjIFRvbyBzbG93IAoKPiAqKkFueSBmZWVkYmFjaz8gbGV0IG1lIGtub3cgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbm5ha3J5c3RhbGxpL2FkdmVudF9vZl9jb2RlL2lzc3Vlcy82KSEqKgoKKioqCgoKIyMgQnJpZWYKPCEtLSBJbnNlcnQgUGFydCAyIG9mIHRoZSBwdXp6bGUgYnJpZWYgaGVyZSAtLT4KCk5vdywgaXQncyB0aW1lIHRvIGZpeCB0aGUgcHJvYmxlbS4KClRoZSBkZWJ1ZyBtb2RlIHN3aXRjaCBpcyB3aXJlZCBkaXJlY3RseSB0byByZWdpc3RlciBhLiBZb3UgZmxpcCB0aGUgc3dpdGNoLCB3aGljaCBtYWtlcyByZWdpc3RlciBhIG5vdyBzdGFydCBhdCAxIHdoZW4gdGhlIHByb2dyYW0gaXMgZXhlY3V0ZWQuCgpJbW1lZGlhdGVseSwgdGhlIGNvcHJvY2Vzc29yIGJlZ2lucyB0byBvdmVyaGVhdC4gV2hvZXZlciB3cm90ZSB0aGlzIHByb2dyYW0gb2J2aW91c2x5IGRpZG4ndCBjaG9vc2UgYSB2ZXJ5IGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbi4gWW91J2xsIG5lZWQgdG8gb3B0aW1pemUgdGhlIHByb2dyYW0gaWYgaXQgaGFzIGFueSBob3BlIG9mIGNvbXBsZXRpbmcgYmVmb3JlIFNhbnRhIG5lZWRzIHRoYXQgcHJpbnRlciB3b3JraW5nLgoKVGhlIGNvcHJvY2Vzc29yJ3MgdWx0aW1hdGUgZ29hbCBpcyB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIHZhbHVlIGxlZnQgaW4gcmVnaXN0ZXIgaCBvbmNlIHRoZSBwcm9ncmFtIGNvbXBsZXRlcy4gVGVjaG5pY2FsbHksIGlmIGl0IGhhZCB0aGF0Li4uIGl0IHdvdWxkbid0IGV2ZW4gbmVlZCB0byBydW4gdGhlIHByb2dyYW0uCgpBZnRlciBzZXR0aW5nIHJlZ2lzdGVyIGEgdG8gMSwgaWYgdGhlIHByb2dyYW0gd2VyZSB0byBydW4gdG8gY29tcGxldGlvbiwgd2hhdCB2YWx1ZSB3b3VsZCBiZSBsZWZ0IGluIHJlZ2lzdGVyIGg/CgoKCiMgTGV0J3MgZ28KCiMjIFRlc3QKYGBge3J9CiNleHBlY3RfZXF1YWwoLCkKYGBgCgojIyBkZXBsb3kKCkRlcGxveWluZyBqdXN0IGVuZHMgdXAgcnVuaW5nIGZvcmV2ZXIKCmBgYHtyfQplIDwtIG5ldy5lbnYocGFyZW50ID0gZW1wdHllbnYoKSkKZiA8LSBuZXcuZW52KHBhcmVudCA9IGVtcHR5ZW52KCkpCm1hcCgueCA9IGxldHRlcnNbMTo4XSwgLmYgPSB+YXNzaWduKC54LCAwLCBlbnZpciA9IGUpKQpmJG11bF90cmFjayA8LSAwCmUkYSA8LSAxCgpjcmVhdGVfaW5zdF9mcm0oZikKcnVuX2luc3QoaW5wdXQsIGYpCmBgYAoKIyMjIFJlcHJvZHVjaWJsZSB2ZXJzaW9uIG9mIG15IGlucHV0CgpgYGB7cn0KZHB1dChhb2NfZ2V0X2lucHV0KGRheSA9IDIzLCBjb29raWVfcGF0aCA9IHBhc3RlMChycHJvanJvb3Q6OmZpbmRfcnN0dWRpb19yb290X2ZpbGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc2VjcmV0cy9zZXNzaW9uX2Nvb2tpZS50eHQiKSkpCmBgYAoKCgoKPGJyPgoKKioqCgp0ZW1wbGF0ZSBiYXNlZCBvbiB0aGUgW3dvcmtmbG93cl0oaHR0cHM6Ly9naXRodWIuY29tL2pkYmxpc2NoYWsvd29ya2Zsb3dyKSBzdGFuZGFsb25lIHRlbXBsYXRlCg==