Survey results
The Library Carpentry Advisory Group (LCAG, https://librarycarpentry.org/advisory/) conducted a
survey with the aim to gain a better understanding of librarians and
other information professionals in terms of their training needs,
impacts resulting from training and further engagement with The
Carpentries community. The survey has been developed by Birgit Schmidt
and Konrad Förstner.
The survey was disseminated through various channels, including The
Carpentries mailing lists and social media channels, regional mailing
lists (e.g. Australia, Asia, Africa), and direct contacts to former
workshop participants and instructors (via host institutions).
The survey consisted of 28 questions overall, and was open for
responses between 2021-06-14 and 2021-08-25. Overall 113 responses were
collected; all respondents shared some information about their
experiences with The Carpentries. About two thirds contributed as an
individual (79 responses), 25 as a representative of a member
institution and further 9 respondents did not specify a role.
## [1] "Just receive e-mails"
## [2] "Want to be more involved (mostly host \"unofficial\" workshops)"
## [3] "We've hosted one carpentries workshop"
## [4] "I only participated as an individual"
## [5] "We organise and host \"based on carpentries\" workshops/hacky hours"
Overall, 79 respondents reported that their library already engages
with The Carpentries, and several do so in multiple ways. In addition,
19 respondent libraries are not involved yet but they would like to
learn more.
Regarding their job roles, respondents were asked to choose up to
three work areas.
108 respondents shared information on their job roles. `
Of all respondents, 86 had attended at least one Carpentries workhop.
Most popular was Library Carpentry (73 respondents), followed by
Software Carpentry (42 respondents) and Data Carpentry (38 respondents).
Out of these about every second (45 respondents) had attended at least
two types of Carpentry workshops.
Application and engagement
Adopted routines
Respondents were asked to assess to what degree they have adopted
certain behaviours or routines as a result of having completed a
Carpentries workshop. The scale of responses was a 7-point Likert scale
between never (0), sometimes (3, mid-point) and regularly (6), not all
levels were spelled out in the survey questionnaire. The additional
levels can be read as very rarely (1), rarely (2), often (4), very often
(5).
## Item 0 1
## 1 Reorganising and cleaning spreadsheets 21.64948 6.185567
## 2 Using version control 28.86598 9.278351
## 3 Transforming workflows into scripts 50.51546 12.371134
## 4 Scraping or mining web content 56.25000 14.583333
## 5 Improving data management and project organisation 24.74227 7.216495
## 6 Using programming languages 35.41667 10.416667
## 7 Reusing code 34.37500 11.458333
## 8 Creating processable reports 45.83333 17.708333
## 2 3 4 5 6
## 1 3.092784 22.68041 10.309278 13.402062 22.680412
## 2 6.185567 22.68041 9.278351 8.247423 15.463918
## 3 10.309278 12.37113 8.247423 3.092784 3.092784
## 4 6.250000 14.58333 5.208333 3.125000 0.000000
## 5 7.216495 12.37113 10.309278 11.340206 26.804124
## 6 11.458333 17.70833 7.291667 9.375000 8.333333
## 7 9.375000 16.66667 14.583333 8.333333 5.208333
## 8 7.291667 15.62500 8.333333 3.125000 2.083333
Benefits, follow-up learning and further engagement
Quotes
Several respondents shared information on how they personally benefitted
from their workshop participation or further engagement with The
Carpentries. A few were confused by the question.
Demographics of respondents’ institutions
LS0tCnRpdGxlOiAiTGlicmFyeSBDYXJwZW50cnkgU3VydmV5IDIwMjEiCiNvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKYWx3YXlzX2FsbG93X2h0bWw6IHRydWUKIyBjaGVjayB3aGljaCBvZiB0aGUgYmVsb3cgY3JlYXRlcyBIVE1MIG91dHB1dCBiZWZvcmUgc3dpdGNoaW5nIG91dHB1dCBmb3JtYXQKIyAgd29yZF9kb2N1bWVudDogZGVmYXVsdCAKIyAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCICVZJylgIgphdXRob3I6IEJpcmdpdCBTY2htaWR0Cm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAjIGFkZHMgZG93bmxvYWQgYnV0dG9uCiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ193aWR0aDogNyAKICAgIGZpZ19oZWlnaHQ6IDQKICBrZWVwX21kOiB5ZXMKICB0b2M6IHllcwogIHRvY19kZXB0aDogMgogIHRvY19mbG9hdDogeWVzCiAgY29kZV9mb2xkaW5nOiBoaWRlCgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpCmBgYAoKLS0tCgpgYGB7ciBsb2FkIGxpYnJhcmllcyBhbmQgZGF0YX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoamFuaXRvcikgIyBjbGVhbiB2YXJpYWJsZXMKbGlicmFyeShocmJydGhlbWVzKSAjIHBsb3R0aW5nIHRoZW1lcwpsaWJyYXJ5KGx1YnJpZGF0ZSkgIyB0cmFuc2Zvcm0gZGF0ZXMKbGlicmFyeShVcFNldFIpICMgY3JlYXRlIHVwc2V0IGRpYWdyYW1zCmxpYnJhcnkoeHRhYmxlKQpsaWJyYXJ5KGxpa2VydCkgIyBldmFsdWF0ZSBMaWtlcnQgdHlwZSBxdWVzdGlvbnMKbGlicmFyeShncmlkKQoKbGNfc3VydmV5X3JhdyA8LSByZWFkX2NzdigiZGF0YV9yYXcvbGMtY2FjLXN1cnZleS1yZXNwb25zZXMuY3N2IikKbGNfc3VydmV5X3JhdyA8LSBsY19zdXJ2ZXlfcmF3ICU+JSBjbGVhbl9uYW1lcygpCgojIGxlYXZlIG91dCB0aGUgdGVzdCBhbnN3ZXJzLCBvZmZpY2lhbGx5IG9wZW4gZnJvbSAxNCBKdW5lIDIwMjEKIyA2IHJlc3BvbnNlcyByZW1vdmVkCmxjX3N1cnZleSA8LSBsY19zdXJ2ZXlfcmF3ICU+JSBmaWx0ZXIoc3VibWl0X2RhdGVfdXRjID49ICIyMDIxLTA2LTE0IikKCiMgcmVtb3ZlIGVtcHR5IHZhcmlhYmxlcwpsY19zdXJ2ZXkgPC0gbGNfc3VydmV5ICU+JSBzZWxlY3QoLW90aGVyXzMpCgojIHJlbmFtZSB2YXJpYWJsZSBuYW1lcwpsY19zdXJ2ZXkgPC0gbGNfc3VydmV5ICU+JSByZW5hbWUoCiAgcmVzcG9uZGVudF9yb2xlID0gaW5fd2hpY2hfcm9sZV9hcmVfeW91X3Jlc3BvbmRpbmdfdG9fdGhpc19zdXJ2ZXksIGxhc3Rfd29ya3Nob3BfYXR0ZW5kZWQgPSB3aGVuX2RpZF95b3VfbGFzdF9hdHRlbmRfYV9jYXJwZW50cmllc193b3Jrc2hvcCwKICBhcHBsaWNhdGlvbl9mcmVxdWVuY3kgPSBob3dfb2Z0ZW5fZG9feW91X25vd19hcHBseV90aGVfc2tpbGxzX2FuZF90ZWNobmlxdWVzX3doaWNoX3lvdV9oYXZlX2dhaW5lZCkKbmFtZXMobGNfc3VydmV5KSA8LSBzdHJfcmVtb3ZlKG5hbWVzKGxjX3N1cnZleSksICJpbl90aGlzX3Nlcmllc19vZl84X3F1ZXN0aW9uc195b3Vfd2lsbF9iZV9hc2tlZF90b19yYXRlX3doaWNoX29mX3RoZV9mb2xsb3dpbmdfYmVoYXZpb3Vyc19yb3V0aW5lc195b3VfaGF2ZV9hZG9wdGVkX2FzX2FfcmVzdWx0X29mX2NvbXBsZXRpbmdfYV9jYXJwZW50cmllc193b3Jrc2hvcF9wbGVhc2Vfc2VsZWN0X3RoZV9vcHRpb25fbW9zdF9jb25zaXN0ZW50X3dpdGhfeW91cl9wcmFjdGljZXNfIikKbmFtZXMobGNfc3VydmV5KSA8LSBzdHJfcmVtb3ZlKG5hbWVzKGxjX3N1cnZleSksICJ3aGF0X2lzX3RoZV8iKQpuYW1lcyhsY19zdXJ2ZXkpIDwtIHN0cl9yZW1vdmUobmFtZXMobGNfc3VydmV5KSwgIl9mdWxsX3RpbWVfZXF1aXZhbGVudCIpCgojIG5vbi10cml2aWFsIHJlc3BvbnNlcyAtIHJlc3VsdHMgaW4gdGhlIHNhbWUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucwpsY19zdXJ2ZXlfbm9uX3RyaXZpYWwgPC0gbGNfc3VydmV5ICU+JSBmaWx0ZXJfYXQodmFycyhyZXNwb25kZW50X3JvbGU6aXNfdGhlcmVfYW55dGhpbmdfZWxzZV95b3Vfd291bGRfbGlrZV90b19zaGFyZSksIGFueV92YXJzKCFpcy5uYSguKSkpCiMgY29tcGxldGUgcmVzcG9uc2VzIC0gd291bGQgbmVlZCB0byByZXNoYXBlIGludG8gbG9uZyBmb3JtIGZpcnN0IAoKIyBkYXRlcwpsY19zdXJ2ZXkgPC0gbGNfc3VydmV5ICU+JSBtdXRhdGUoc3VibWl0X2RhdGVfdXRjID0gYXNfZGF0ZShzdWJtaXRfZGF0ZV91dGMpKQoKIyBzYXZlIHByb2Nlc3NlZCBzdXJ2ZXkgZGF0YSAKI3dyaXRlX2NzdihsY19zdXJ2ZXksICJkYXRhL2xjYWdfc3VydmV5XzIwMjEuY3N2IikKCnRhYl9yZXNwb25kZW50X3JvbGUgPC0gbGNfc3VydmV5ICU+JSBjb3VudChyZXNwb25kZW50X3JvbGUpCgpgYGAKIyBTdXJ2ZXkgcmVzdWx0cwpUaGUgTGlicmFyeSBDYXJwZW50cnkgQWR2aXNvcnkgR3JvdXAgKExDQUcsIGh0dHBzOi8vbGlicmFyeWNhcnBlbnRyeS5vcmcvYWR2aXNvcnkvKSBjb25kdWN0ZWQgYSBzdXJ2ZXkgd2l0aCB0aGUgYWltIHRvIGdhaW4gYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBsaWJyYXJpYW5zIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBwcm9mZXNzaW9uYWxzIGluIHRlcm1zIG9mIHRoZWlyIHRyYWluaW5nIG5lZWRzLCBpbXBhY3RzIHJlc3VsdGluZyBmcm9tIHRyYWluaW5nIGFuZCBmdXJ0aGVyIGVuZ2FnZW1lbnQgd2l0aCBUaGUgQ2FycGVudHJpZXMgY29tbXVuaXR5LiBUaGUgc3VydmV5IGhhcyBiZWVuIGRldmVsb3BlZCBieSBCaXJnaXQgU2NobWlkdCBhbmQgS29ucmFkIEbDtnJzdG5lci4KClRoZSBzdXJ2ZXkgd2FzIGRpc3NlbWluYXRlZCB0aHJvdWdoIHZhcmlvdXMgY2hhbm5lbHMsIGluY2x1ZGluZyBUaGUgQ2FycGVudHJpZXMgbWFpbGluZyBsaXN0cyBhbmQgc29jaWFsIG1lZGlhIGNoYW5uZWxzLCByZWdpb25hbCBtYWlsaW5nIGxpc3RzIChlLmcuIEF1c3RyYWxpYSwgQXNpYSwgQWZyaWNhKSwgYW5kIGRpcmVjdCBjb250YWN0cyB0byBmb3JtZXIgd29ya3Nob3AgcGFydGljaXBhbnRzIGFuZCBpbnN0cnVjdG9ycyAodmlhIGhvc3QgaW5zdGl0dXRpb25zKS4gCgpUaGUgc3VydmV5IGNvbnNpc3RlZCBvZiAyOCBxdWVzdGlvbnMgb3ZlcmFsbCwgYW5kIHdhcyBvcGVuIGZvciByZXNwb25zZXMgYmV0d2VlbiBgciBtaW4oeW1kKGxjX3N1cnZleSRzdWJtaXRfZGF0ZV91dGMpKWAgYW5kIGByIG1heCh5bWQobGNfc3VydmV5JHN1Ym1pdF9kYXRlX3V0YykpYC4gCk92ZXJhbGwgYHIgbnJvdyhsY19zdXJ2ZXkpYCByZXNwb25zZXMgd2VyZSBjb2xsZWN0ZWQ7IGFsbCByZXNwb25kZW50cyBzaGFyZWQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBleHBlcmllbmNlcyB3aXRoIFRoZSBDYXJwZW50cmllcy4gQWJvdXQgdHdvIHRoaXJkcyBjb250cmlidXRlZCBhcyBhbiBpbmRpdmlkdWFsIChgciB0YWJfcmVzcG9uZGVudF9yb2xlJG5bMl1gIHJlc3BvbnNlcyksIGByIHRhYl9yZXNwb25kZW50X3JvbGUkblsxXWAgYXMgYSByZXByZXNlbnRhdGl2ZSBvZiBhIG1lbWJlciBpbnN0aXR1dGlvbiBhbmQgZnVydGhlciBgciB0YWJfcmVzcG9uZGVudF9yb2xlJG5bM11gIHJlc3BvbmRlbnRzIGRpZCBub3Qgc3BlY2lmeSBhIHJvbGUuIAoKYGBge3IgZW5nYWdlbWVudH0gCgojIENhcnBlbnRyaWVzIGNvbW11bml0eSBlbmdhZ2VtZW50LCBnYXRoZXIgdmFyaWFibGVzIApsY19zdXJ2ZXlfZW5nIDwtIGxjX3N1cnZleSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHdlX29yZ2FuaXNlX2FuZF9ob3N0X2NhcnBlbnRyaWVzX3dvcmtzaG9wczp3ZV9hcmVfbm90X2ludm9sdmVkX2FzX2FfbGlicmFyeV9idXRfaV9hbV9wZXJzb25hbGx5LCAtd2VfYXJlX25vdF9pbnZvbHZlZF95ZXRfYnV0X3dvdWxkX2xpa2VfdG9fbGVhcm5fbW9yZSksIG5hbWVzX3RvID0gImVuZ2FnZW1lbnRfdmFyIiwgdmFsdWVzX3RvID0gImVuZ2FnZW1lbnQiKSAlPiUgZmlsdGVyKCFpcy5uYShlbmdhZ2VtZW50KSkKCmxjX3N1cnZleV9lbmdfdGFiIDwtIGxjX3N1cnZleV9lbmcgJT4lIGNvdW50KGVuZ2FnZW1lbnQpICU+JSBhcnJhbmdlKGRlc2MobikpCm5fZW5nYWdlbWVudCA8LSBsZW5ndGgodW5pcXVlKGxjX3N1cnZleV9lbmckbnVtYmVyKSkKCiMjIERlZmluZSBsb2xsaXBvcCBwbG90IGZ1bmN0aW9uCmxvbGxpcG9wX3Bsb3QgPC0gZnVuY3Rpb24oZGF0YSwgdmFyLCB0aXRsZSwgbSwgc3VidGl0bGUpewogIHBsb3QgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gcmVvcmRlcih7e3Zhcn19LCBuKSwgeSA9IG4pKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ZW5kID0ge3t2YXJ9fSwgeSA9IDAsIHllbmQgPSBuKSwgY29sb3I9ImdyZXkiKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJvcmFuZ2UiLCBzaXplID0gNCkgKwogIHRoZW1lX2xpZ2h0KCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkKICApICsgZ2d0aXRsZSh0aXRsZSwgc3VidGl0bGUgPSBwYXN0ZShtLCBzdWJ0aXRsZSkpICsgeGxhYigiIikKICByZXR1cm4ocGxvdCkKfQoKbG9sbGlwb3BfcGxvdChsY19zdXJ2ZXlfZW5nX3RhYiwgZW5nYWdlbWVudCwgdGl0bGUgPSAiTGlicmFyeSBlbmdhZ2VtZW50IHdpdGggdGhlIENhcnBlbnRyaWVzIiwgbl9lbmdhZ2VtZW50LCBzdWJ0aXRsZSA9ICJyZXNwb25zZXMiKQoKbGNfc3VydmV5JG90aGVyXzEwWyFpcy5uYShsY19zdXJ2ZXkkb3RoZXJfMTApXQogCm5fbm90X3lldF9sZWFybiA8LSBzdW0oIWlzLm5hKGxjX3N1cnZleSR3ZV9hcmVfbm90X2ludm9sdmVkX3lldF9idXRfd291bGRfbGlrZV90b19sZWFybl9tb3JlKSkKCmBgYAoKT3ZlcmFsbCwgYHIgbl9lbmdhZ2VtZW50YCByZXNwb25kZW50cyByZXBvcnRlZCB0aGF0IHRoZWlyIGxpYnJhcnkgYWxyZWFkeSBlbmdhZ2VzIHdpdGggVGhlIENhcnBlbnRyaWVzLCBhbmQgc2V2ZXJhbCBkbyBzbyBpbiBtdWx0aXBsZSB3YXlzLiBJbiBhZGRpdGlvbiwgYHIgbl9ub3RfeWV0X2xlYXJuYCByZXNwb25kZW50IGxpYnJhcmllcyBhcmUgbm90IGludm9sdmVkIHlldCBidXQgdGhleSB3b3VsZCBsaWtlIHRvIGxlYXJuIG1vcmUuIAoKUmVnYXJkaW5nIHRoZWlyIGpvYiByb2xlcywgcmVzcG9uZGVudHMgd2VyZSBhc2tlZCB0byBjaG9vc2UgdXAgdG8gdGhyZWUgd29yayBhcmVhcy4gCgpgYGB7ciBqb2Igcm9sZXMsIGZpZy5oZWlnaHQgPSA0LCBmaWcud2lkdGggPSA3fSAKIyBKb2Igcm9sZXMKbGNfc3VydmV5X2pvYl9yb2xlcyA8LSBsY19zdXJ2ZXkgJT4lIHBpdm90X2xvbmdlcih0ZWFjaGluZ19hbmRfbGVhcm5pbmc6b3RoZXJfMjEsIG5hbWVzX3RvID0gImpvYl92YXIiLCB2YWx1ZXNfdG8gPSAiam9iX3JvbGVzIikgJT4lIGZpbHRlcighaXMubmEoam9iX3JvbGVzKSkgCgpsY19zdXJ2ZXlfam9iX3JvbGVzX3RhYiA8LSBsY19zdXJ2ZXlfam9iX3JvbGVzICU+JSBjb3VudChqb2Jfcm9sZXMpICU+JSBhcnJhbmdlKGRlc2MobikpCm5fam9iX3JvbGVzIDwtIGxlbmd0aCh1bmlxdWUobGNfc3VydmV5X2pvYl9yb2xlcyRudW1iZXIpKQoKbG9sbGlwb3BfcGxvdChsY19zdXJ2ZXlfam9iX3JvbGVzX3RhYiwgam9iX3JvbGVzLCB0aXRsZSA9ICJKb2Igcm9sZXMiLCBtID0gbl9qb2Jfcm9sZXMsIHN1YnRpdGxlID0gInJlc3BvbnNlcyIpCgpgYGAKCmByIG5fam9iX3JvbGVzYCByZXNwb25kZW50cyBzaGFyZWQgaW5mb3JtYXRpb24gb24gdGhlaXIgam9iIHJvbGVzLiBgCgoKYGBge3Igd29ya3Nob3AgYXR0ZW5kYW5jZSBhbmQgY29udGVudH0gCiMgRm9ybWVyIHdvcmtzaG9wIGF0dGVuZGFuY2UKbGNfc3VydmV5X3dvcmtzaG9wX2F0dCA8LSBsY19zdXJ2ZXkgJT4lIHBpdm90X2xvbmdlcihsaWJyYXJ5X2NhcnBlbnRyeTpvdGhlcl8yNywgbmFtZXNfdG8gPSAid29ya3Nob3BfYXR0ZW5kYW5jZV92YXIiLCB2YWx1ZXNfdG8gPSAid29ya3Nob3BfYXR0ZW5kYW5jZSIpICU+JSBmaWx0ZXIoIWlzLm5hKHdvcmtzaG9wX2F0dGVuZGFuY2UpKSAKCmxjX3N1cnZleV93b3Jrc2hvcF9hdHRfdGFiIDwtIGxjX3N1cnZleV93b3Jrc2hvcF9hdHQgJT4lIGNvdW50KHdvcmtzaG9wX2F0dGVuZGFuY2UpICU+JSBhcnJhbmdlKGRlc2MobikpIApsY19zdXJ2ZXlfd29ya3Nob3BfYXR0X3RhYgpzdWJfYW55X3dvcmtzaG9wIDwtIGxjX3N1cnZleV93b3Jrc2hvcF9hdHQgJT4lIGZpbHRlcih3b3Jrc2hvcF9hdHRlbmRhbmNlICVpbiUgYygiTGlicmFyeSBDYXJwZW50cnkiLCAiU29mdHdhcmUgQ2FycGVudHJ5IiwgIkRhdGEgQ2FycGVudHJ5IikpCm5fd29ya3Nob3BfYXR0IDwtIGxlbmd0aCh1bmlxdWUoc3ViX2FueV93b3Jrc2hvcCRudW1iZXIpKQoKeF9hdHQgPC0gbGNfc3VydmV5ICU+JSBzZWxlY3QobnVtYmVyLCBsaWJyYXJ5X2NhcnBlbnRyeTpub19idXRfaV9wbGFuX3RvX2RvX3NvKSAlPiUgZmlsdGVyX2F0KHZhcnMobGlicmFyeV9jYXJwZW50cnk6bm9fYnV0X2lfcGxhbl90b19kb19zbyksIGFueV92YXJzKCFpcy5uYSguKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyB0dXJuIGludG8gaW5jaWRlbmNlIG1hdHJpeCwgZmlsbCB6ZXJvcyBmb3IgTkFzCnhfYXR0X2luYyA8LSB4X2F0dCAlPiUgbXV0YXRlKGFjcm9zcyhsaWJyYXJ5X2NhcnBlbnRyeTpub19idXRfaV9wbGFuX3RvX2RvX3NvLCAgfmlmZWxzZShpcy5uYSguKSwgYXMuaW50ZWdlcigwKSwgYXMuaW50ZWdlcigxKSkpKSAlPiUgc2VsZWN0KGxpYnJhcnlfY2FycGVudHJ5Om5vX2J1dF9pX3BsYW5fdG9fZG9fc28pCgptZXRhZGF0YV8xIDwtIGRhdGEuZnJhbWUoc2V0cyA9IG5hbWVzKHhfYXR0X2luY1sxOjRdKSwgdmFyaWFibGUgPSBjKCJncnAxIiwgImdycDIiLCAiZ3JwMyIsICJncnA0IikpCiAgCiN1cHNldChhc19kYXRhX2ZyYW1lKHhfYXR0X2luYyksIHNldHMgPSBjKCJsaWJyYXJ5X2NhcnBlbnRyeSIsICJkYXRhX2NhcnBlbnRyeSIsICJzb2Z0d2FyZV9jYXJwZW50cnkiLCAibm9fYnV0X2lfcGxhbl90b19kb19zbyIpLCBtYi5yYXRpbyA9IGMoMC41NSwgMC40NSksIG9yZGVyLmJ5ID0gImZyZXEiKQojdXBzZXQoYXNfZGF0YV9mcmFtZSh4X2F0dF9pbmMpLCBzZXQubWV0YWRhdGEgPSBsaXN0KGRhdGEgPSBtZXRhZGF0YSwgcGxvdHMgPSBsaXN0KGxpc3QodHlwZSA9ICJtYXRyaXhfcm93cyIsIGNvbHVtbiA9ICJ2YXJpYWJsZSIpKSksIG9yZGVyLmJ5ID0gImZyZXEiKQoKZGYgPC0gZGF0YS5mcmFtZSgiTGlicmFyeSBDYXJwZW50cnkiID0geF9hdHRfaW5jJGxpYnJhcnlfY2FycGVudHJ5LCAiRGF0YSBDYXJwZW50cnkiID0geF9hdHRfaW5jJGRhdGFfY2FycGVudHJ5LCAiU29mdHdhcmUgQ2FycGVudHJ5IiA9IHhfYXR0X2luYyRzb2Z0d2FyZV9jYXJwZW50cnksICJObyBidXQgcGxhbiB0byBkbyBzbyIgPSB4X2F0dF9pbmMkbm9fYnV0X2lfcGxhbl90b19kb19zbykKbWV0YWRhdGEgPC0gZGF0YS5mcmFtZShzZXRzID0gbmFtZXMoZGYpLCB2YXJpYWJsZSA9IGMoImdycDEiLCAiZ3JwMSIsICJncnAxIiwgImdycDIiKSkKbWV0YWRhdGFfMiA8LSBkYXRhLmZyYW1lKHNldHMgPSBuYW1lcyhkZlsgLCAxOjNdKSwgdmFyaWFibGUgPSBjKCJncnAxIiwgImdycDEiLCAiZ3JwMSIpKQoKIyBpbnRlcnNlY3Rpb24gZGlhZ3JhbSAoYmFzZWQgb24gdXBzZXRyKQp1cHNldChkZiwgc2V0Lm1ldGFkYXRhID0gbGlzdChkYXRhID0gbWV0YWRhdGEsIHBsb3RzID0gbGlzdChsaXN0KHR5cGUgPSAibWF0cml4X3Jvd3MiLCBjb2x1bW4gPSAidmFyaWFibGUiKSkpLCBvcmRlci5ieSA9ICJmcmVxIikKCiMgaW50ZXJzZWN0aW9uIGRpYWdyYW0gb2YgdGhvc2Ugd2hvIGF0dGVuZGVkIGEgd29ya3Nob3AKdXBzZXRfMSA8LSB1cHNldChkZlsgLCAxOjNdLCBzZXQubWV0YWRhdGEgPSBsaXN0KGRhdGEgPSBtZXRhZGF0YV8yLCBwbG90cyA9IGxpc3QobGlzdCh0eXBlID0gIm1hdHJpeF9yb3dzIiwgY29sdW1uID0gInZhcmlhYmxlIikpKSwgb3JkZXIuYnkgPSAiZnJlcSIpIApwcmludCh1cHNldF8xKSAjKyBnZ3RpdGxlKCJNeV9UaXRsZSIpCgoKIyBRNSBXaGVuIGRpZCB5b3UgbGFzdCBhdHRlbmQgYSBDYXJwZW50cmllcyBXb3Jrc2hvcD8KIyBbMjddICJsYXN0X3dvcmtzaG9wX2F0dGVuZGVkIiAKbGNfc3VydmV5ICU+JSBmaWx0ZXIoIShsYXN0X3dvcmtzaG9wX2F0dGVuZGVkICVpbiUgYyhOQSwgIkhhdmUgbm90IGF0dGVuZGVkIGEgQ2FycGVudHJpZXMgV29ya3Nob3AiKSkpICU+JSBjb3VudChsYXN0X3dvcmtzaG9wX2F0dGVuZGVkKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAKCiMgUTYgV2hhdCBjb250ZW50IHdhcyBjb3ZlcmVkPyAoc2VsZWN0IGFsbCB0aGF0IGFwcGx5KQojIFsyOF0gImdpdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFsyOV0gImludHJvZHVjdGlvbl90b19kYXRhX2Zvcl9hcmNoaXZpc3RzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzMwXSAib3Blbl9yZWZpbmUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyBbMzFdICJweXRob24iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFszMl0gInIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzMzXSAicmVndWxhcl9leHByZXNzaW9ucyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyBbMzRdICJzcHJlYWRzaGVldHNfdGlkeV9kYXRhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFszNV0gInNxbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzM2XSAidW5peF9zaGVsbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyBbMzddICJ3ZWJfc2NyYXBpbmciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFszOF0gImlfZG9fbm90X3JlbWVtYmVyIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzM5XSAib3RoZXJfNDAiCgpsY19zdXJ2ZXlfd29ya3Nob3BfY29udGVudCA8LSBsY19zdXJ2ZXkgJT4lIHBpdm90X2xvbmdlcihnaXQ6b3RoZXJfNDAsIG5hbWVzX3RvID0gIndvcmtzaG9wX2NvbnRlbnRfdmFyIiwgdmFsdWVzX3RvID0gIndvcmtzaG9wX2NvbnRlbnQiKSAlPiUgZmlsdGVyKCEod29ya3Nob3BfY29udGVudCAlaW4lIGMoTkEsICJJIGhhdmUgbm90IGF0dGVuZGVkIiwgIkRpZCBub3QgYXR0ZW5kIG9uZS4iLCAiSSBkbyBub3QgcmVtZW1iZXIiKSkpCgpsY19zdXJ2ZXlfd29ya3Nob3BfY29udGVudF90YWIgPC0gbGNfc3VydmV5X3dvcmtzaG9wX2NvbnRlbnQgJT4lIGNvdW50KHdvcmtzaG9wX2NvbnRlbnQpICU+JSBhcnJhbmdlKGRlc2MobikpCm5fd29ya3Nob3BfY29udGVudCA8LSBsZW5ndGgodW5pcXVlKGxjX3N1cnZleV93b3Jrc2hvcF9jb250ZW50JG51bWJlcikpCgpsb2xsaXBvcF9wbG90KGxjX3N1cnZleV93b3Jrc2hvcF9jb250ZW50X3RhYiwgd29ya3Nob3BfY29udGVudCwgdGl0bGUgPSAiV29ya3Nob3AgY29udGVudCIsIG0gPSBuX3dvcmtzaG9wX2NvbnRlbnQsIHN1YnRpdGxlID0gInJlc3BvbnNlcyIpCgpsY19zdXJ2ZXlfam9iX3JvbGVzX3RhYiAlPiUgbXV0YXRlKHBlcmMgPSByb3VuZChuL25fam9iX3JvbGVzICogMTAwLDEpKQoKYGBgCgpPZiBhbGwgcmVzcG9uZGVudHMsIGByIG5fd29ya3Nob3BfYXR0YCBoYWQgYXR0ZW5kZWQgYXQgbGVhc3Qgb25lIENhcnBlbnRyaWVzIHdvcmtob3AuICBNb3N0IHBvcHVsYXIgd2FzIExpYnJhcnkgQ2FycGVudHJ5ICg3MyByZXNwb25kZW50cyksIGZvbGxvd2VkIGJ5IFNvZnR3YXJlIENhcnBlbnRyeSAoNDIgcmVzcG9uZGVudHMpIGFuZCBEYXRhIENhcnBlbnRyeSAoMzggcmVzcG9uZGVudHMpLiBPdXQgb2YgdGhlc2UgYWJvdXQgZXZlcnkgc2Vjb25kICg0NSByZXNwb25kZW50cykgaGFkIGF0dGVuZGVkIGF0IGxlYXN0IHR3byB0eXBlcyBvZiBDYXJwZW50cnkgd29ya3Nob3BzLiAKCiMgQXBwbGljYXRpb24gYW5kIGVuZ2FnZW1lbnQKCmBgYHtyIGFwcGxpY2F0aW9ucywgZmlnLmhlaWdodCA9IDMsIGZpZy53aWR0aCA9IDZ9CiMgUTcgSW4gd2hpY2ggYXJlYXMgaGF2ZSB5b3UgYXBwbGllZCB0aGUgc2tpbGxzIHdoaWNoIHlvdSBnYWluZWQgdGhyb3VnaCB0aGUgd29ya3Nob3A/CiMgQXBwbGljYXRpb24gYXJlYXMsIG9mIHNraWxscyBsZWFybmVkIHZpYSB0aGUgQ2FycGVudHJpZXMKbGNfc3VydmV5X2FwcGxfYXJlYSA8LSBsY19zdXJ2ZXkgJT4lIHBpdm90X2xvbmdlcihpbl9hX25ld193b3JrX2FyZWFfb3JfcHJvamVjdDpvdGhlcl80NCwgbmFtZXNfdG8gPSAiYXBwbGljYXRpb25fYXJlYV92YXIiLCB2YWx1ZXNfdG8gPSAiYXBwbGljYXRpb25fYXJlYSIpICU+JSBmaWx0ZXIoIWlzLm5hKGFwcGxpY2F0aW9uX2FyZWEpKQoKbGNfc3VydmV5X2FwcGxfYXJlYV9ub3ROQSA8LSBsY19zdXJ2ZXlfYXBwbF9hcmVhICU+JSBmaWx0ZXIoIShhcHBsaWNhdGlvbl9hcmVhICVpbiUgYyhOQSwgIk5vbmUiLCAibm9uZSIpKSkKbl9hcHBsX2FyZWFzIDwtIGxlbmd0aCh1bmlxdWUobGNfc3VydmV5X2FwcGxfYXJlYV9ub3ROQSRudW1iZXIpKQpsY19zdXJ2ZXlfYXBwbF9hcmVhX3RhYiA8LSBsY19zdXJ2ZXlfYXBwbF9hcmVhICU+JSBmaWx0ZXIoIShhcHBsaWNhdGlvbl9hcmVhICVpbiUgYygiTm9uZSIsICJub25lIikpKSAlPiUgY291bnQoYXBwbGljYXRpb25fYXJlYSkgJT4lIGFycmFuZ2UoZGVzYyhuKSkKCmxvbGxpcG9wX3Bsb3QobGNfc3VydmV5X2FwcGxfYXJlYV90YWIsIGFwcGxpY2F0aW9uX2FyZWEsIHRpdGxlID0gIkFwcGxpY2F0aW9uIGFyZWFzIiwgbSA9IG5fYXBwbF9hcmVhcywgc3VidGl0bGUgPSAicmVzcG9uc2VzIikKCiMgWzQ0XSAiYXBwbGljYXRpb25fZnJlcXVlbmN5IiAgCiMgUTggSG93IG9mdGVuIGRvIHlvdSBub3cgYXBwbHkgdGhlIHNraWxscyBhbmQgdGVjaG5pcXVlcyB3aGljaCB5b3UgaGF2ZSBnYWluZWQ/CiMgRnJlcXVlbmN5IG9mIGFwcGxpY2F0aW9uIG9mIHNraWxscywgdHVybiBpbnRvIGZhY3RvciB2YXJpYWJsZQpsY19zdXJ2ZXkgPC0gbGNfc3VydmV5ICU+JSBtdXRhdGUoYXBwbGljYXRpb25fZnJlcXVlbmN5ID0gZmFjdG9yKGFwcGxpY2F0aW9uX2ZyZXF1ZW5jeSwgbGV2ZWxzID0gYygiRGFpbHkiLCAiV2Vla2x5IiwgIk1vbnRobHkiLCAiU2V2ZXJhbCB0aW1lcyBwZXIgeWVhciIsICJMZXNzIHRoYW4gb25jZSBhIHllYXIiKSkpIAoKbGNfc3VydmV5ICU+JSBmaWx0ZXIoIWlzLm5hKGFwcGxpY2F0aW9uX2ZyZXF1ZW5jeSkpICU+JSBjb3VudChhcHBsaWNhdGlvbl9mcmVxdWVuY3kpICU+JSBhcnJhbmdlKGRlc2MobikpCgpgYGAKCiMjIyBBZG9wdGVkIHJvdXRpbmVzCgpSZXNwb25kZW50cyB3ZXJlIGFza2VkIHRvIGFzc2VzcyB0byB3aGF0IGRlZ3JlZSB0aGV5IGhhdmUgYWRvcHRlZCBjZXJ0YWluIGJlaGF2aW91cnMgb3Igcm91dGluZXMgYXMgYSByZXN1bHQgb2YgaGF2aW5nIGNvbXBsZXRlZCBhIENhcnBlbnRyaWVzIHdvcmtzaG9wLiBUaGUgc2NhbGUgb2YgcmVzcG9uc2VzIHdhcyBhIDctcG9pbnQgTGlrZXJ0IHNjYWxlIGJldHdlZW4gbmV2ZXIgKDApLCBzb21ldGltZXMgKDMsIG1pZC1wb2ludCkgYW5kIHJlZ3VsYXJseSAoNiksIG5vdCBhbGwgbGV2ZWxzIHdlcmUgc3BlbGxlZCBvdXQgaW4gdGhlIHN1cnZleSBxdWVzdGlvbm5haXJlLiBUaGUgYWRkaXRpb25hbCBsZXZlbHMgY2FuIGJlIHJlYWQgYXMgdmVyeSByYXJlbHkgKDEpLCByYXJlbHkgKDIpLCBvZnRlbiAoNCksIHZlcnkgb2Z0ZW4gKDUpLiAKCmBgYHtyIHJvdXRpbmVzLCBmaWcuaGVpZ2h0ID0gNCwgZmlnLndpZHRoID0gOX0KCiMgUTkgSW4gdGhpcyBzZXJpZXMgb2YgOCBxdWVzdGlvbnMsIHlvdSB3aWxsIGJlIGFza2VkIHRvIHJhdGUgd2hpY2ggb2YgdGhlIGZvbGxvd2luZyBiZWhhdmlvdXJzL3JvdXRpbmVzIHlvdSBoYXZlIGFkb3B0ZWQgYXMgYSByZXN1bHQgb2YgY29tcGxldGluZyBhIENhcnBlbnRyaWVzIHdvcmtzaG9wLiBQbGVhc2Ugc2VsZWN0IHRoZSBvcHRpb24gbW9zdCBjb25zaXN0ZW50IHdpdGggeW91ciBwcmFjdGljZXMuCiMgTGlrZXJ0IHR5cGUgcXVlc3Rpb24KIyAwIE5ldmVyLCAzIFNvbWV0aW1lcywgNiBSZWd1bGFybHkgCiMgMSBWZXJ5IHJhcmVseSwgMiBSYXJlbHkKIyA0IE9mdGVuLCA1IFZlcnkgb2Z0ZW4KIyA1LXBvaW50IExpa2VydCBzY2FsZSAobmV2ZXIsIHJhcmVseSwgc29tZXRpbWVzLCBvZnRlbiwgYWx3YXlzKQoKIyBbNDVdICJyZW9yZ2FuaXNpbmdfYW5kX2NsZWFuaW5nX3NwcmVhZHNoZWV0cyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFs0Nl0gInVzaW5nX3ZlcnNpb25fY29udHJvbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzQ3XSAidHJhbnNmb3JtaW5nX3dvcmtmbG93c19pbnRvX3NjcmlwdHMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyBbNDhdICJzY3JhcGluZ19vcl9taW5pbmdfd2ViX2NvbnRlbnQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFs0OV0gImltcHJvdmluZ19kYXRhX21hbmFnZW1lbnRfYW5kX3Byb2plY3Rfb3JnYW5pc2F0aW9uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzUwXSAidXNpbmdfcHJvZ3JhbW1pbmdfbGFuZ3VhZ2VzX3JfcHl0aG9uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzUxXSAicmV1c2luZ19jb2RlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyBbNTJdICJjcmVhdGluZ19wcm9jZXNzYWJsZV9yZXBvcnRzX2VfZ19yX21hcmtkb3duX2p1cHl0ZXJfbm90ZWJvb2siIAoKIyB0dXJuIHZhcmlhYmxlcyBpbnRvIGZhY3RvcnMKI2xjX3N1cnZleSA8LSBsY19zdXJ2ZXkgICU+JSAjbXV0YXRlKGFjcm9zcyhyZW9yZ2FuaXNpbmdfYW5kX2NsZWFuaW5nX3NwcmVhZHNoZWV0czpjcmVhdGluZ19wcm9jZXNzYWJsZV9yZXBvcnRzX2VfZ19yX21hcmtkb3duX2p1cHl0ZXJfbm90ZWJvb2ssIH4gZmFjdG9yKC54LCBsZXZlbHMgPSBjKCJuZXZlciIsICJ2ZXJ5IHJhcmVseSIsICJyYXJlbHkiLCAic29tZXRpbWVzIiwgIm9mdGVuIiwgInZlcnkgb2Z0ZW4iLCAicmVndWxhcmx5IikpKSkKbGNfc3VydmV5X3JvdXRpbmVzIDwtIGxjX3N1cnZleSAlPiUgc2VsZWN0KG51bWJlciwgcmVvcmdhbmlzaW5nX2FuZF9jbGVhbmluZ19zcHJlYWRzaGVldHM6Y3JlYXRpbmdfcHJvY2Vzc2FibGVfcmVwb3J0c19lX2dfcl9tYXJrZG93bl9qdXB5dGVyX25vdGVib29rKSAlPiUgbXV0YXRlKGFjcm9zcyhyZW9yZ2FuaXNpbmdfYW5kX2NsZWFuaW5nX3NwcmVhZHNoZWV0czpjcmVhdGluZ19wcm9jZXNzYWJsZV9yZXBvcnRzX2VfZ19yX21hcmtkb3duX2p1cHl0ZXJfbm90ZWJvb2ssIH4gZmFjdG9yKC54KSkpIApsY19zdXJ2ZXlfcm91dGluZXMkc2NyYXBpbmdfb3JfbWluaW5nX3dlYl9jb250ZW50IDwtIGZhY3RvcihsY19zdXJ2ZXlfcm91dGluZXMkc2NyYXBpbmdfb3JfbWluaW5nX3dlYl9jb250ZW50LCBsZXZlbHMgPSBsZXZlbHMobGNfc3VydmV5X3JvdXRpbmVzJHJlb3JnYW5pc2luZ19hbmRfY2xlYW5pbmdfc3ByZWFkc2hlZXRzKSkKCnJvdXRpbmVzX2FsbF9OQSA8LSBsY19zdXJ2ZXlfcm91dGluZXMgJT4lIGZpbHRlcl9hdCh2YXJzKHJlb3JnYW5pc2luZ19hbmRfY2xlYW5pbmdfc3ByZWFkc2hlZXRzOmNyZWF0aW5nX3Byb2Nlc3NhYmxlX3JlcG9ydHNfZV9nX3JfbWFya2Rvd25fanVweXRlcl9ub3RlYm9vayksIGFsbF92YXJzKGlzLm5hKC4pKSkKCmxjX3N1cnZleV9yb3V0aW5lcyA8LSBsY19zdXJ2ZXlfcm91dGluZXMgJT4lIGZpbHRlcighKG51bWJlciAlaW4lIHJvdXRpbmVzX2FsbF9OQSRudW1iZXIpKQoKbGNfc3VydmV5X3JvdXRpbmVzX3JlbmFtZWQgPC0gcmVuYW1lKGxjX3N1cnZleV9yb3V0aW5lcywgYygiUmVvcmdhbmlzaW5nIGFuZCBjbGVhbmluZyBzcHJlYWRzaGVldHMiID0gInJlb3JnYW5pc2luZ19hbmRfY2xlYW5pbmdfc3ByZWFkc2hlZXRzIiAsICJVc2luZyB2ZXJzaW9uIGNvbnRyb2wiID0gInVzaW5nX3ZlcnNpb25fY29udHJvbCIsICJUcmFuc2Zvcm1pbmcgd29ya2Zsb3dzIGludG8gc2NyaXB0cyIgPSJ0cmFuc2Zvcm1pbmdfd29ya2Zsb3dzX2ludG9fc2NyaXB0cyIsICJTY3JhcGluZyBvciBtaW5pbmcgd2ViIGNvbnRlbnQiID0gInNjcmFwaW5nX29yX21pbmluZ193ZWJfY29udGVudCIsICJJbXByb3ZpbmcgZGF0YSBtYW5hZ2VtZW50IGFuZCBwcm9qZWN0IG9yZ2FuaXNhdGlvbiIgPSAiaW1wcm92aW5nX2RhdGFfbWFuYWdlbWVudF9hbmRfcHJvamVjdF9vcmdhbmlzYXRpb24iLCAiVXNpbmcgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIiA9ICJ1c2luZ19wcm9ncmFtbWluZ19sYW5ndWFnZXNfcl9weXRob24iLCAiUmV1c2luZyBjb2RlIiA9ICJyZXVzaW5nX2NvZGUiLCAiQ3JlYXRpbmcgcHJvY2Vzc2FibGUgcmVwb3J0cyIgPSAiY3JlYXRpbmdfcHJvY2Vzc2FibGVfcmVwb3J0c19lX2dfcl9tYXJrZG93bl9qdXB5dGVyX25vdGVib29rIikpCgojIGVycm9yOiBhbGwgaXRlbXMvY29sdW1ucyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGxldmVscwpyb3V0aW5lcyA8LSBsaWtlcnQoYXMuZGF0YS5mcmFtZShsY19zdXJ2ZXlfcm91dGluZXNfcmVuYW1lZFsyOjldKSkKcm91dGluZXMgCnN1bW1hcnkocm91dGluZXMpCnBsb3Qocm91dGluZXMpCgojIE90aGVyIGFkb3B0ZWQgcm91dGluZXMgCiMgUTE3IFdoYXQgb3RoZXIgYmVoYXZpb3Vycy9yb3V0aW5lcyBoYXZlIHlvdSBhZG9wdGVkIGFzIGEgcmVzdWx0IG9mIGNvbXBsZXRpbmcgYSBDYXJwZW50cmllcyB3b3Jrc2hvcD8Kb3RoZXJfYmVoYXZpb3VycyA8LSBsY19zdXJ2ZXkgJT4lIGZpbHRlcighKHdoYXRfb3RoZXJfYmVoYXZpb3Vyc19yb3V0aW5lc19oYXZlX3lvdV9hZG9wdGVkX2FzX2FfcmVzdWx0X29mX2NvbXBsZXRpbmdfYV9jYXJwZW50cmllc193b3Jrc2hvcCAlaW4lIGMoTkEsICJJIGhhdmUgbmV2ZXIgYXR0ZW5kZWQgYSB3b3Jrc2hvcCBvbiBjYXJwZW50cnkiLCAiTkEgLSBmbGF3IGluIHlvdXIgc3VydmV5IGkgaGF2ZW4ndCBhdHRlbmRlZCBhbnkgc28gdGhlc2UgcXVlc3Rpb25zIGFyZSBpcnJlbGV2YW50LiIsICJub3QgYXBwbGljYWJsZSIsICJOb25lIiwgIm5vbmUiLCAiTm90IGFwcGxpY2FibGUiKSkpICU+JSBzZWxlY3Qod2hhdF9vdGhlcl9iZWhhdmlvdXJzX3JvdXRpbmVzX2hhdmVfeW91X2Fkb3B0ZWRfYXNfYV9yZXN1bHRfb2ZfY29tcGxldGluZ19hX2NhcnBlbnRyaWVzX3dvcmtzaG9wKSAKCm90aGVyX2JlaGF2aW91cnMKCndyaXRlX2NzdihvdGhlcl9iZWhhdmlvdXJzLCAiZGF0YS9vdGhlcl9iZWhhdmlvdXJzLmNzdiIpCgpgYGAKCiMjIyBCZW5lZml0cywgZm9sbG93LXVwIGxlYXJuaW5nIGFuZCBmdXJ0aGVyIGVuZ2FnZW1lbnQKYGBge3IgYXBwbGljYXRpb24gYW5kIGVuZ2FnZW1lbnQsIGZpZy5oZWlnaHQgPSA0LCBmaWcud2lkdGggPSA5fQojIFExOCBJbiB3aGljaCBvdGhlciB3YXlzIGRvIHlvdSBiZW5lZml0IGZyb20gd2hhdCB5b3UgaGF2ZSBsZWFybmVkPwojIFs1NF0gInN0cm9uZ2VyX2NvbmZpZGVuY2VfaW5fbGVhcm5pbmdfbmV3X3RlY2huaWNhbF9za2lsbHMiICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFs1NV0gImVuY291cmFnaW5nX3NraWxsc19kZXZlbG9wbWVudF9vZl9zdGFmZiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFs1Nl0gImRlY2lzaW9uX21ha2luZ19vbl90ZWNobmljYWxfc29sdXRpb25zX2luX2xpYnJhcmllcyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgWzU3XSAicmVjcnVpdG1lbnRfb2ZfdGVjaG5pY2FsX2FuZF9vcl9hbmFseXRpY2FsX3N0YWZmIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyBbNThdICJpbXByb3ZlZF9yZWxhdGlvbnNoaXBzX3dpdGhfYWNhZGVtaWNfb3JfdGVjaG5pY2FsX3BhcnRuZXJzIiAgICAgICAgICAgICAgICAgICAgIAojIFs1OV0gInJldGhpbmtpbmdfY3VycmVudF9hcHByb2FjaGVzX2Zvcl9kYXRhX3Byb2Nlc3NpbmdfYW5kX21hbmFnZW1lbnRfaW5fbXlfdW5pdF9kZXBhcnRtZW50IiAKIyBbNjBdICJvdGhlcl82MSIKCmxjX3N1cnZleV9iZW5lZml0cyA8LSBsY19zdXJ2ZXkgJT4lIHBpdm90X2xvbmdlcihzdHJvbmdlcl9jb25maWRlbmNlX2luX2xlYXJuaW5nX25ld190ZWNobmljYWxfc2tpbGxzOnJldGhpbmtpbmdfY3VycmVudF9hcHByb2FjaGVzX2Zvcl9kYXRhX3Byb2Nlc3NpbmdfYW5kX21hbmFnZW1lbnRfaW5fbXlfdW5pdF9kZXBhcnRtZW50LCBuYW1lc190byA9ICJiZW5lZml0c192YXIiLCB2YWx1ZXNfdG8gPSAiYmVuZWZpdHMiKSAlPiUgZmlsdGVyKCFpcy5uYShiZW5lZml0cykpIAoKbGNfc3VydmV5X2JlbmVmaXRzX3RhYiA8LSBsY19zdXJ2ZXlfYmVuZWZpdHMgJT4lIGNvdW50KGJlbmVmaXRzKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpuX2JlbmVmaXRzIDwtIGxlbmd0aCh1bmlxdWUobGNfc3VydmV5X2JlbmVmaXRzJG51bWJlcikpCgpsb2xsaXBvcF9wbG90KGxjX3N1cnZleV9iZW5lZml0c190YWIsIGJlbmVmaXRzLCB0aXRsZSA9ICJCZW5lZml0cyBmcm9tIHBhcnRpY2lwYXRpb24gaW4gd29ya3Nob3AocykiLCBtID0gbl9iZW5lZml0cywgc3VidGl0bGUgPSAicmVzcG9uc2VzIikKCiMgb3RoZXIgYmVuZWZpdHMKbGNfc3VydmV5ICU+JSBmaWx0ZXIoIShvdGhlcl82MSAlaW4lIGMoTkEpKSkgJT4lIHNlbGVjdChvdGhlcl82MSkgJT4lIGhlYWQoKQoKIyBjb250aW51ZWQgbGVhcm5pbmcKIyBRMTkgSW4gd2hpY2ggb2YgdGhlIGZvbGxvd2luZyBsZWFybmluZyBhY3Rpdml0aWVzIGhhdmUgeW91IGVuZ2FnZWQgc2luY2UgY29tcGxldGluZyBhIENhcnBlbnRyaWVzIHdvcmtzaG9wPwojIFs2MV0gInVzZWRfY2FycGVudHJ5X3NlbGZfZ3VpZGVkX21hdGVyaWFsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFs2Ml0gInVzZWRfbm9uX2NhcnBlbnRyeV9zZWxmX2d1aWRlZF9tYXRlcmlhbCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFs2M10gImNvbnRyaWJ1dGVkX2FzX2FuX2luc3RydWN0b3JfaGVscGVyX3RvX2FfY2FycGVudHJ5X3dvcmtzaG9wIiAgICAgICAgICAgICAgICAgIAojIFs2NF0gInBhcnRpY2lwYXRlZF9pbl9hX3Nob3J0X2NvdXJzZV9vcl93b3Jrc2hvcF91cF90b180X2RheXMiICAgICAgICAgICAgICAgICAgICAgIAojIFs2NV0gInBhcnRpY2lwYXRlZF9pbl9hX3NlbWVzdGVyX2xvbmdfY291cnNlIiAKIyBbNjZdICJvdGhlcl82NyIKCmxjX3N1cnZleV9sZWFybmluZyA8LSBsY19zdXJ2ZXkgJT4lIHBpdm90X2xvbmdlcih1c2VkX2NhcnBlbnRyeV9zZWxmX2d1aWRlZF9tYXRlcmlhbDpwYXJ0aWNpcGF0ZWRfaW5fYV9zZW1lc3Rlcl9sb25nX2NvdXJzZSwgbmFtZXNfdG8gPSAibGVhcm5pbmdfdmFyIiwgdmFsdWVzX3RvID0gImxlYXJuaW5nIikgJT4lIGZpbHRlcighaXMubmEobGVhcm5pbmcpKSAKCmxjX3N1cnZleV9sZWFybmluZ190YWIgPC0gbGNfc3VydmV5X2xlYXJuaW5nICU+JSBjb3VudChsZWFybmluZykgJT4lIGFycmFuZ2UoZGVzYyhuKSkKbl9sZWFybmluZyA8LSBsZW5ndGgodW5pcXVlKGxjX3N1cnZleV9sZWFybmluZyRudW1iZXIpKQoKbG9sbGlwb3BfcGxvdChsY19zdXJ2ZXlfbGVhcm5pbmdfdGFiLCBsZWFybmluZywgdGl0bGUgPSAiRm9sbG93LXVwIGxlYXJuaW5nIGFjdGl2aXRpZXMiLCBtID0gbl9iZW5lZml0cywgc3VidGl0bGUgPSAicmVzcG9uc2VzIikKCiMgb3RoZXIgYmVuZWZpdHMgCmxjX3N1cnZleSAlPiUgZmlsdGVyKCEob3RoZXJfNjcgJWluJSBjKE5BLCAibm90IGF0dGVuZGVkIikpKSAlPiUgc2VsZWN0KG90aGVyXzY3KSAlPiUgaGVhZCgpCgojIHBlcnNvbmFsIGVuZ2FnZW1lbnQgCiMgUTIwIEhhdmUgeW91IGZ1cnRoZXIgcHJvbW90ZWQgb3IgZW5nYWdlZCB3aXRoIFRoZSBDYXJwZW50cmllcz8KIyBbNjddICJpX2hhdmVfam9pbmVkX3RoZV9jYXJwZW50cmllc19jb21tdW5pdHlfYXNfYW5faW5zdHJ1Y3RvciIgCiMgWzY4XSAiaV9yZWNvbW1lbmRlZF90aGVfd29ya3Nob3BzX3RvX290aGVyX2NvbGxlYWd1ZXNfYW5kX2ZyaWVuZHMiCiMgWzY5XSAiaV9oYXZlX3Byb21vdGVkX21lbWJlcnNoaXBfdG9fdGhlX2hlYWRfb2ZfbXlfaW5zdGl0dXRpb24iIAojIFs3MF0gImlfaGF2ZV9vcmdhbmlzZWRfd29ya3Nob3BzX29yX3Nlc3Npb25zIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIFs3MV0gImlfY29udHJpYnV0ZWRfdG9fY2FycGVudHJpZXNfd29ya3Nob3BzX2FzX2FfaGVscGVyIiAgICAgICAgICAgICAgICAgICAgICAgCiMgWzcyXSAib3RoZXJfNzMiIAoKbGNfc3VydmV5X2VuZ3Byb20gPC0gbGNfc3VydmV5ICU+JSBwaXZvdF9sb25nZXIoaV9oYXZlX2pvaW5lZF90aGVfY2FycGVudHJpZXNfY29tbXVuaXR5X2FzX2FuX2luc3RydWN0b3I6aV9jb250cmlidXRlZF90b19jYXJwZW50cmllc193b3Jrc2hvcHNfYXNfYV9oZWxwZXIsIG5hbWVzX3RvID0gImVuZ3Byb21fdmFyIiwgdmFsdWVzX3RvID0gImVuZ3Byb20iKSAlPiUgZmlsdGVyKCFpcy5uYShlbmdwcm9tKSkgCgpsY19zdXJ2ZXlfZW5ncHJvbV90YWIgPC0gbGNfc3VydmV5X2VuZ3Byb20gJT4lIGNvdW50KGVuZ3Byb20pICU+JSBhcnJhbmdlKGRlc2MobikpCm5fZW5ncHJvbSA8LSBsZW5ndGgodW5pcXVlKGxjX3N1cnZleV9lbmdwcm9tJG51bWJlcikpCgpsb2xsaXBvcF9wbG90KGxjX3N1cnZleV9lbmdwcm9tX3RhYiwgZW5ncHJvbSwgdGl0bGUgPSAiRnVydGhlciBwcm9tb3Rpb24gb3IgZW5nYWdlbWVudCIsIG0gPSBuX2VuZ3Byb20sIHN1YnRpdGxlID0gInJlc3BvbnNlcyIpCgojIG90aGVyIHJlc3BvbnNlcwpsY19zdXJ2ZXkgJT4lIGZpbHRlcighKG90aGVyXzczICVpbiUgYyhOQSkpKSAlPiUgc2VsZWN0KG90aGVyXzczKSAlPiUgaGVhZCgpCgoKYGBgCgoKCiMgU3VnZ2VzdGlvbnMgYW5kIGZpbmFsIGNvbW1lbnRzClJlc3BvbmRlbnRzIHNoYXJlZCB0aGVpciBpZGVhcyBvbiB3aGF0IG90aGVyIHRvcGljcyB0aGUgTGlicmFyeSBDYXJwZW50cnkgY3VycmljdWx1bSBjb3VsZCBpbmNsdWRlIGFuZCBob3cgTGlicmFyeSBDYXJwZW50cnkgY291bGQgc3VwcG9ydCB0aGVtIGluIHRoZWlyIHdvcmsuIEF0IHRoZSBlbmQgb2YgdGhlIHN1cnZleSwgYSBmZXcgcmVzcG9uZGVudHMgc2hhcmVkIGEgY291cGxlIG9mIGZpbmFsIGNvbW1lbnRzLiAKYGBge3Igc3VnZ2VzdGlvbnN9CgojIFEyMSBXaGF0IG90aGVyIHRvcGljcyBzaG91bGQgdGhlIExpYnJhcnkgQ2FycGVudHJ5IGN1cnJpY3VsdW0gaW5jbHVkZT8Kb3RoZXJfdG9waWNzIDwtIGxjX3N1cnZleSAlPiUgZmlsdGVyKCEod2hhdF9vdGhlcl90b3BpY3Nfc2hvdWxkX3RoZV9saWJyYXJ5X2NhcnBlbnRyeV9jdXJyaWN1bHVtX2luY2x1ZGUgJWluJSBjKE5BLCAidW5zdXJlIiwgIk5vbmUiLCAibm8gaWRlYSIsICJuYSIsICJkb24ndCBrbm93IiwgIkkgZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgdGhlIENhcnBlbnRyaWVzIHlldC4iLCAiRG9uJ3Qga25vdyB3aGF0IGVsc2UgaXMgaW52b2x2ZWQiLCAiSSBoYXZlIG5vdCB0aG91Z2h0IG9mIGFueSB5ZXQiKSkpICU+JSBzZWxlY3Qod2hhdF9vdGhlcl90b3BpY3Nfc2hvdWxkX3RoZV9saWJyYXJ5X2NhcnBlbnRyeV9jdXJyaWN1bHVtX2luY2x1ZGUpCgpvdGhlcl90b3BpY3MKd3JpdGVfY3N2KG90aGVyX3RvcGljcywgImRhdGEvb3RoZXJfdG9waWNzLmNzdiIpCgojIFEyMiBEbyB5b3UgaGF2ZSBhbnkgb3RoZXIgc3VnZ2VzdGlvbnMgb24gaG93IExpYnJhcnkgQ2FycGVudHJ5IGNvdWxkIHN1cHBvcnQgeW91IGluIHlvdXIgd29yaz8Kb3RoZXJfc3VnZ2VzdGlvbnMgPC0gbGNfc3VydmV5ICU+JSBmaWx0ZXIoIShkb195b3VfaGF2ZV9hbnlfb3RoZXJfc3VnZ2VzdGlvbnNfb25faG93X2xpYnJhcnlfY2FycGVudHJ5X2NvdWxkX3N1cHBvcnRfeW91X2luX3lvdXJfd29yayAlaW4lIGMoTkEsICJubyIsICJ1bnN1cmUiLCAiTm9uZSIsICJuYSIsICJOb3QgeWV0IikpKSAlPiUgc2VsZWN0KGRvX3lvdV9oYXZlX2FueV9vdGhlcl9zdWdnZXN0aW9uc19vbl9ob3dfbGlicmFyeV9jYXJwZW50cnlfY291bGRfc3VwcG9ydF95b3VfaW5feW91cl93b3JrKSAKCm90aGVyX3N1Z2dlc3Rpb25zCndyaXRlX2NzdihvdGhlcl9zdWdnZXN0aW9ucywgImRhdGEvb3RoZXJfc3VnZ2VzdGlvbnMuY3N2IikKCiMgUTI4IElzIHRoZXJlIGFueXRoaW5nIGVsc2UgeW91IHdvdWxkIGxpa2UgdG8gc2hhcmU/Cm90aGVyX3NoYXJpbmcgPC0gbGNfc3VydmV5ICU+JSBmaWx0ZXIoIShpc190aGVyZV9hbnl0aGluZ19lbHNlX3lvdV93b3VsZF9saWtlX3RvX3NoYXJlICVpbiUgYyhOQSwgIk5vIiwgIm5vIiwgIk5vbmUiLCAiTm90IHJlYWxseSIpKSkgJT4lIHNlbGVjdChpc190aGVyZV9hbnl0aGluZ19lbHNlX3lvdV93b3VsZF9saWtlX3RvX3NoYXJlKQogCm90aGVyX3NoYXJpbmcKd3JpdGVfY3N2KG90aGVyX3NoYXJpbmcsICJkYXRhL290aGVyX3NoYXJpbmcuY3N2IikKCmBgYAoKIyBRdW90ZXMKU2V2ZXJhbCByZXNwb25kZW50cyBzaGFyZWQgaW5mb3JtYXRpb24gb24gaG93IHRoZXkgcGVyc29uYWxseSBiZW5lZml0dGVkIGZyb20gdGhlaXIgd29ya3Nob3AgcGFydGljaXBhdGlvbiBvciBmdXJ0aGVyIGVuZ2FnZW1lbnQgd2l0aCBUaGUgQ2FycGVudHJpZXMuIEEgZmV3IHdlcmUgY29uZnVzZWQgYnkgdGhlIHF1ZXN0aW9uLiAKYGBge3IgcXVvdGVzfQojIFEyMyBXZSB3b3VsZCBsaWtlIHRvIHF1b3RlIHlvdS4gUGxlYXNlIHNoYXJlIGEgc2hvcnQgc3RhdGVtZW50IG9uIGhvdyB5b3UgcGVyc29uYWxseSBiZW5lZml0dGVkIGZyb20geW91ciB3b3Jrc2hvcCBwYXJ0aWNpcGF0aW9uIG9yIGZ1cnRoZXIgZW5nYWdlbWVudCB3aXRoIFRoZSBDYXJwZW50cmllcy4KcXVvdGVzIDwtIGxjX3N1cnZleSAlPiUgZmlsdGVyKCEod2Vfd291bGRfbGlrZV90b19xdW90ZV95b3VfcGxlYXNlX3NoYXJlX2Ffc2hvcnRfc3RhdGVtZW50X29uX2hvd195b3VfcGVyc29uYWxseV9iZW5lZml0dGVkX2Zyb21feW91cl93b3Jrc2hvcF9wYXJ0aWNpcGF0aW9uX29yX2Z1cnRoZXJfZW5nYWdlbWVudF93aXRoX3RoZV9jYXJwZW50cmllcyAlaW4lIGMoTkEsICIuLi4iLCAiTm90IGFwcGxpY2FibGUiLCAibm90aGluZyBzbyBmYXIiLCAidW5zdXJlIiwgIk5vbmUiLCAibmEiLCAibm90IGFwcGxpY2FibGUiKSkpICU+JSBzZWxlY3Qod2Vfd291bGRfbGlrZV90b19xdW90ZV95b3VfcGxlYXNlX3NoYXJlX2Ffc2hvcnRfc3RhdGVtZW50X29uX2hvd195b3VfcGVyc29uYWxseV9iZW5lZml0dGVkX2Zyb21feW91cl93b3Jrc2hvcF9wYXJ0aWNpcGF0aW9uX29yX2Z1cnRoZXJfZW5nYWdlbWVudF93aXRoX3RoZV9jYXJwZW50cmllcykgCgpxdW90ZXMKd3JpdGVfY3N2KHF1b3RlcywgImRhdGEvcXVvdGVzLmNzdiIpCmBgYCAKCgojIERlbW9ncmFwaGljcyBvZiByZXNwb25kZW50cycgaW5zdGl0dXRpb25zCmBgYHtyIGRlbW9ncmFwaGljc30KIyBRMjQgSG93IHdvdWxkIHlvdSBjbGFzc2lmeSB5b3VyIGluc3RpdHV0aW9uL29yZ2FuaXNhdGlvbj8KbGNfc3VydmV5ICU+JSBmaWx0ZXIoIWlzLm5hKGhvd193b3VsZF95b3VfY2xhc3NpZnlfeW91cl9pbnN0aXR1dGlvbl9vcmdhbmlzYXRpb24pKSAlPiUgY291bnQoaG93X3dvdWxkX3lvdV9jbGFzc2lmeV95b3VyX2luc3RpdHV0aW9uX29yZ2FuaXNhdGlvbikgJT4lIGFycmFuZ2UoZGVzYyhuKSkKCiMgUTI1IFdoYXQgaXMgdGhlIHNpemUgb2YgeW91ciBvdmVyYWxsIGluc3RpdHV0aW9uIGluIHRlcm1zIG9mIHN0YWZmIChhY2FkZW1pYyBhbmQgYWRtaW5pc3RyYXRpdmUpPwpsY19zdXJ2ZXkgJT4lIGZpbHRlcighaXMubmEoc2l6ZV9vZl90aGVfbGlicmFyeV9pbl90ZXJtc19vZl9mdGVfc3RhZmYpKSAlPiUgY291bnQoc2l6ZV9vZl90aGVfbGlicmFyeV9pbl90ZXJtc19vZl9mdGVfc3RhZmYpICU+JSBhcnJhbmdlKGRlc2MobikpCiNsY19zdXJ2ZXkgJT4lIGZpbHRlcighaXMubmEod2hhdF9pc190aGVfc2l6ZV9vZl90aGVfbGlicmFyeV9pbl90ZXJtc19vZl9mdGVfc3RhZmYpKSAlPiUgY291bnQod2hhdF9pc190aGVfc2l6ZV9vZl90aGVfbGlicmFyeV9pbl90ZXJtc19vZl9mdGVfc3RhZmYpICU+JSBhcnJhbmdlKGRlc2MobikpCgojIFEyNiBXaGF0IGlzIHRoZSBzaXplIG9mIHlvdXIgb3ZlcmFsbCBpbnN0aXR1dGlvbiBpbiB0ZXJtcyBvZiBmdWxsLXRpbWUgZXF1aXZhbGVudCAoRlRFKSBlbnJvbGxlZCBzdHVkZW50cz8KbGNfc3VydmV5ICU+JSBmaWx0ZXIoIWlzLm5hKHNpemVfb2ZfeW91cl9vdmVyYWxsX2luc3RpdHV0aW9uX2luX3Rlcm1zX29mX2Z0ZV9lbnJvbGxlZF9zdHVkZW50cykpICU+JSBjb3VudChzaXplX29mX3lvdXJfb3ZlcmFsbF9pbnN0aXR1dGlvbl9pbl90ZXJtc19vZl9mdGVfZW5yb2xsZWRfc3R1ZGVudHMpICU+JSBhcnJhbmdlKGRlc2MobikpCgojIFEyNyBXaGF0IGlzIHRoZSBzaXplIG9mIHRoZSBsaWJyYXJ5IGluIHRlcm1zIG9mIEZURSBzdGFmZj8KbGNfc3VydmV5ICU+JSBmaWx0ZXIoIWlzLm5hKHNpemVfb2ZfdGhlX2xpYnJhcnlfaW5fdGVybXNfb2ZfZnRlX3N0YWZmKSkgJT4lIGNvdW50KHNpemVfb2ZfdGhlX2xpYnJhcnlfaW5fdGVybXNfb2ZfZnRlX3N0YWZmKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKYGBgCgo=