# tru_tags v2.3
# Article tagging
# Nathan Arthur
# http://www.truist.com/

# ......................................................................
# This is a plugin for Textpattern - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# ......................................................................

YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjIu
MyI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki
O3M6MjI6Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE1
OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoidHlwZSI7aToxO3M6NDoibmFtZSI7czo4OiJ0cnVf
dGFncyI7czo0OiJoZWxwIjtzOjU2ODoiCTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgdHJ1X3Rh
Z3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iL2Jsb2cvNDkzL3RydXRhZ3MtYS10YWdnaW5n
LXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPmludHJvZHVjdG9yeSBhcnRpY2xlPC9hPiwgPGEg
aHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs
ZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5j
b20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0PC9h
PiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3Ry
dXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj51c2FnZSBpbnN0cnVjdGlvbnM8L2E+LjwvcD4K
Cgk8cD5JJiM4MjE3O3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1
Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0
byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uPC9wPiI7
czo0OiJjb2RlIjtzOjIwNjUzOiIKI0NvcHlyaWdodCAyMDA3IE5hdGhhbiBBcnRodXIKI1Jl
bGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9w
ZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCBmb3IgZGV0YWlscwojVGhp
cyB3b3JrIGlzIGluc3BpcmVkIGJ5IHJhbl90YWdzIGJ5IFJhbiBBcm91c3NpLCBvcmlnaW5h
bGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1L3RhZ2dpbmctdGV4
dHBhdHRlcm4KCgojIyMgQ09ORklHVVJBVElPTiAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMj
CgojU2VlIGh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRhZ3MtdXNh
Z2UtaW5zdHJ1Y3Rpb25zIGZvciBpbnN0cnVjdGlvbnMKCiMgU3dpdGNoIHRoaXMgdG8gJzEn
IHRvIGdldCBjbGVhbiB1cmwgc3VwcG9ydCBvciAnMCcgdG8gdHVybiBpdCBvZmYuCiMgSXQg
d2lsbCBwcm9iYWJseSBmaWd1cmUgaXQgb3V0LCB0aG91Z2gsIHNvIHlvdSBzaG91bGRuJ3Qg
aGF2ZSB0byBjaGFuZ2UgaXQuCmdsb2JhbCAkcGVybWxpbmtfbW9kZTsKZGVmaW5lKCdUUlVf
VEFHU19VU0VfQ0xFQU5fVVJMUycsICRwZXJtbGlua19tb2RlICE9ICdtZXNzeScpOwoKIyBU
aGlzIHRlbGxzIHRydV90YWdzIHdoaWNoIHNlY3Rpb24gdG8gdXNlIGZvciB0YWdzLgpkZWZp
bmUoJ1RSVV9UQUdTX1NFQ1RJT04nLCAndGFnJyk7CgojIFRoaXMgdGVsbHMgdHJ1X3RhZ3Mg
d2hhdCBhdHRyaWJ1dGUgbmFtZSB0byB1c2UgZm9yIHRhZyBzZWFyY2hlcy4KZGVmaW5lKCdU
UlVfVEFHU19UQUdfUEFSQU1FVEVSX05BTUUnLCAndCcpOwoKIyBUaGlzIHRlbGxzIHRydV90
YWdzIHRvIHB1dCB0YWdzIGludG8gdGhlIFJTUyBhbmQgQXRvbSBmZWVkcywgaW4gJ0NhdGVn
b3J5JyBlbGVtZW50cy4KIyBZb3UgcHJvYmFibHkgd2FudCB0aGlzLgpkZWZpbmUoJ1RSVV9U
QUdTX0FERF9UQUdTX1RPX0ZFRURfWE1MJywgMSk7CgojIEJ5IGRlZmF1bHQsIHRoaXMgd2ls
bCBhcHBlbmQgYSB0YWcgbGlzdCBsaWtlICJ0YWdzOiB0cmVlcywgZmxvd2VycywgYW5pbWFs
cywgZXRjIgojICh3aXRoIGxpbmtzLCBhbmQgd2l0aCByZWw9InRhZyIpIHRvIHRoZSBib2R5
IG9mIFJTUy9BdG9tIGZlZWRzLiBJZiB5b3UgZGVmaW5lIGEKIyAnbWlzYycgZm9ybSBuYW1l
ZCB0cnVfdGFnc19mZWVkX3RhZ3MsIHRydV90YWdzIHdpbGwgdXNlIHRoYXQgZm9ybSB0byBy
ZW5kZXIgdGhlIHRhZ3MKIyBmb3IgdGhlIGZlZWQsIGluc3RlYWQuCmRlZmluZSgnVFJVX1RB
R1NfQUREX1RBR1NfVE9fRkVFRF9CT0RZJywgMCk7CgojIFRoaXMgc2hvd3MgYSBsaXN0IG9m
IGNsaWNrYWJsZSB0YWdzIGluIHRoZSBhZG1pbiBzaWRlIG9uIHRoZSAnV3JpdGUnIHBhZ2UK
ZGVmaW5lKCdUUlVfVEFHU19TSE9XX1RBR1NfSU5fQURNSU4nLCAxKTsKCiMgQ2hhbmdpbmcg
dGhpcyB3b24ndCBkbyBhbnkgZ29vZC4gIEl0J3MganVzdCBoZXJlIGFzIGEgY29udmVuaWVu
Y2UgZm9yIGRldmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRz
Jyk7CgoKIyMjIFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdf
cGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7Cglp
ZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgewoJCSRhdHRzID0gdHJ1X3RhZ3NfZml4dXBf
cXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJCXJldHVybiBkb0FydGljbGVz
KCRhdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAgY29kZQoJfSBlbHNlIHsKCQlyZXR1
cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xv
dWQoJGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFy
ZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoKCmZ1bmN0aW9uIHRydV90
YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3Vk
X2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3Vk
X3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAk
YWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGlj
bGUoJGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNs
ZSk7CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNp
ZCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywg
ZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7CglpZiAo
JGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g
dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVybiB0cnVfdGFnc19yZW5k
ZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOwp9CgoK
ZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFs
ICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9
IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBh
dHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJcmV0dXJu
IHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19p
Zl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3Rh
Z3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CgkkY29uZGl0aW9uID0gKCFlbXB0
eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOwoJcmV0dXJuIHBhcnNlKEV2YWxF
bHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3Bh
cmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkKewoJZXh0cmFjdChsQXR0cyhhcnJh
eSgnc3RyaXBoeXBoZW5zJyA9PiAwLCAndXJsZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7
CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoVFJVX1RBR1NfVEFHX1BBUkFN
RVRFUl9OQU1FKSkpOwoJJHBhcm0gPSAoJHN0cmlwaHlwaGVucyA/IHN0cl9yZXBsYWNlKCct
JywgJyAnLCAkcGFybSkgOiAkcGFybSk7CglpZiAoJHVybGVuY29kZSkgewoJCSRwYXJtID0g
dXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJCSRwYXJtID0g
aHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9CgoKZnVuY3Rp
b24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJldHVybiBzdHJpcF90YWdzKGdw
cygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJj
aCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFy
cmF5KCksIGZhbHNlKTsKCWlmICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7CgkgICAgICAg
ICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsK
CgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFn
X3BhcmFtZXRlcik7CgkJJHJzID0gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVl
cnlfYXR0cyk7CgkJaWYgKCRycykgewoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsK
CQkJCSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xv
d2VyKCRhWyR0YWdzX2ZpZWxkXSkpKTsKCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRh
bGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0K
CgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFy
YW1ldGVyKTsKCQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlm
ICgkdGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVy
KSB7CgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0
cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFs
c2UpOwoJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRf
YXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g
dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90
YWdzX3JlbmRlcl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9y
X3dlaWdodCk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQ
T1JUIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVu
Y3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3Qs
ICRpc0FydGljbGUpIHsKCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xp
c3QgPyAndWwnIDogJycpLAoJCQknYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAn
KSwKCQkJJ2NsYXNzJwkJPT4gJycsCgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3NlY3Rp
b24nCT0+ICcnLAoJCQknbWlucGVyY2VudCcJPT4gJzEwMCcsCgkJCSdtYXhwZXJjZW50Jwk9
PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksCgkJCSdzaG93Y291
bnRzJwk9PiAnJywKCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkndXNlcmVsdGFn
Jwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6ICcnKSwKCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcx
JywKCQkJJ21pbnRhZ2NvdW50Jwk9PiAnMCcsCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAn
LAoJCQknc2V0c2l6ZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwKCQkJJ3VzZW5v
Zm9sbG93Jwk9PiAnJywKCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLAoJCQkndXNlb3ZlcmFsbGNv
dW50cycJPT4gJycsCgkJCSdzZXRjbGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcx
JyksCgkJCSd0aXRsZScJCT0+ICcnLAoJCQknbGlzdGxpbWl0Jwk9PiAnJywKCQkJJ2tlZXAn
CQk9PiAnbGFyZ2VzdCcsCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsCgkJCSd0ZXh0dHJhbnNm
b3JtJwk9PiAnbm9uZScsCgkJCSdsaW5rcGF0aCcJPT4gJycsCgkJCSdsaW5rcGF0aHRhaWwn
CT0+ICcnLAoJCQknZmlsdGVyc2VhcmNoJwk9PiAnMScsCgkJCSdleGNsdWRlc2VjdGlvbic9
PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJwoJCSksJGF0dHMsIDApOwp9
CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0
dHMpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJ
JGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5
KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIici
OwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5
cGFydHMpIC4gIikiOwoJfQoKCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CglpbmNs
dWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsKCgkkZmlsdGVyID0gdHJ1
X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbik7CgkkZmlsdGVyIC49ICgk
ZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7CgoJJGFsbF90YWdzID0gYXJy
YXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAi
JHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5k
IFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglmb3JlYWNoICgkcnMgYXMg
JHJvdykgewoJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3Ry
dG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsKCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJn
ZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkpOwoJfQoKCXJl
dHVybiAkYWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMo
JGV4Y2x1ZGVzZWN0aW9uKSB7Cgkkc2VjdGlvbnMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVz
ZWN0aW9uKTsKCSRmaWx0ZXJzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAk
c2VjdGlvbikgewoJCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgk
c2VjdGlvbikuIiciOwoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7Cn0KCgpmdW5j
dGlvbiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdz
X2Zvcl93ZWlnaHQpIHsKCWV4dHJhY3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5
X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3NfZm9yX3dlaWdodCk7CgoJZm9yZWFjaCAoJHRhZ3Nf
d2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFs
bF90YWdzKQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudAoJCSAg
IHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgewoJCQl1bnNldCgkdGFn
c193ZWlnaHRbJHRhZ10pOwoJCX0KCX0KCgkkc29ydF9ieV9jb3VudCA9IChzdHJwb3MoJHNv
cnQsICdjb3VudCcpICE9PSBmYWxzZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRz
b3J0LCAnYXNjJykgIT09IGZhbHNlKTsKCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRf
dGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOwoK
CWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0
KSkgewoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAgPT0gJ2xhcmdl
c3QnKSB7CgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3Rh
Z3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJCWlmICgka2Vl
cCA9PSAncmFuZG9tJykgewoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4g
JHdlaWdodCkgewoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0
KTsKCQkJCX0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0
X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7CgkJCX0gZWxzZSBpZiAoJGtl
ZXAgPT0gJ2FscGhhJykgewoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKCR0YWdz
X3dlaWdodCk7CgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJCX0KCQkJJGN1
dG9mZiA9ICdleGFjdCc7CgkJfQoKCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAt
IDE7CgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFj
dCcKCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRsaXN0bGlt
aXQgKyAxOyAkaSsrKSB7CgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0
ZWRfdGFnc1skaV1dOwoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dlaWdodCkgewoJ
CQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5l
d193ZWlnaHQ7CgkJCQl9CgkJCX0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7CgkJ
CQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9CgoJCSRyZXNv
cnRlZF90YWdzID0gYXJyYXlfY2h1bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0X2dvb2RfaW5k
ZXggKyAxKTsKCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOwoKCQlmb3Jl
YWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlmICghaW5fYXJy
YXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7CgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRh
Z10pOwoJCQl9CgkJfQoJfQoKCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCWlmICgkbGlua3Bh
dGgpIHsKCQkJJHVybHByZWZpeCA9ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZpeCA9ICRsaW5r
cGF0aHRhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKFRSVV9UQUdTX1VTRV9DTEVBTl9VUkxTKSB7
CgkJCQkkdXJscHJlZml4ID0gaHUgLiBUUlVfVEFHU19TRUNUSU9OIC4gJy8nOwoJCQl9IGVs
c2UgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiBUUlVfVEFHU19TRUNUSU9OIC4g
JyZhbXA7dD0nOwoJCQl9CgkJCSR1cmxzdWZmaXggPSAoVFJVX1RBR1NfVVNFX0NMRUFOX1VS
TFMgPyAnLycgOiAnJyk7CgkJfQoKCQlpZiAoJHVzZXJlbHRhZykgewoJCQlpZiAoJHVzZW5v
Zm9sbG93KSB7CgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsKCQkJ
fSBlbHNlIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcnOwoJCQl9CgkJfSBlbHNl
IGlmICgkdXNlbm9mb2xsb3cpIHsKCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9Im5vZm9sbG93
JzsKCQl9Cgl9CgoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7CgkJJG1heCA9IG1h
eCgkdGFnc193ZWlnaHQpOwoJCSRtaW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCX0gZWxzZSB7
CgkJJG1heCA9ICRtaW4gPSAwOwoJfQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8g
MCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7CgoJJHRh
Z3NfaHRtbCA9IGFycmF5KCk7CgkkdGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFy
YW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICcxJykpOwoJZm9yZWFjaCAoJHRhZ3Nf
d2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1p
bnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICogJHN0ZXB2YWx1ZSk7CgoJCSRzdHlsZSA9
ICcnOwoJCWlmICgkc2V0c2l6ZXMpCgkJCSRzdHlsZSA9ICcgc3R5bGU9ImZvbnQtc2l6ZTog
JyAuICR0YWdfd2VpZ2h0IC4gJyU7Iic7CgoJCSR0YWdfY2xhc3MgPSAnJzsKCQlpZiAoJHNl
dGNsYXNzZXMpIHsKCQkJJHRhZ19jbGFzcyA9ICcgY2xhc3M9Iic7CgkJCWlmICgkd2VpZ2h0
ID09ICRtaW4pIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVTbWFsbGVzdCI7CgkJCX0g
ZWxzZSBpZiAoJHdlaWdodCA9PSAkbWF4KSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXpl
TGFyZ2VzdCI7CgkJCX0gZWxzZSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTWVkaXVt
IjsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICcgdGFnU2l6ZScgLiAoJHdlaWdodCArIDEgLSAk
bWluKTsKCQkJaWYgKCR0YWcgPT0gJHRhZ19zZWFyY2hfdGFnKSB7CgkJCQkkdGFnX2NsYXNz
IC49ICcgJyAuICRhY3RpdmVjbGFzczsKCQkJfQoJCQkkdGFnX2NsYXNzIC49ICciJzsKCQl9
CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUgYnkgZ2R0cm9pYW5vLCBzZWUgaHR0cDovL2ZvcnVt
LnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0xMDI4NzUjcDEwMjg3NQoJCSR0
aXRsZWNvdW50ID0gJyc7CgkJaWYgKCR0aXRsZSkKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxl
PSInIC4gJHRpdGxlIC4gJyInOwoJCSRkaXNwbGF5Y291bnQ9ICcnOwoJCSRjb3VudCA9ICRj
b3VudHdyYXBjaGFyc3swfSAuICR3ZWlnaHQgLiAkY291bnR3cmFwY2hhcnN7MX07CgkJaWYg
KCRzaG93Y291bnRzID09ICd0aXRsZScgfHwgJHNob3djb3VudHMgPT0gJ2JvdGgnKQoJCQkk
dGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7CgkJaWYg
KCRzaG93Y291bnRzICYmICRzaG93Y291bnRzICE9ICd0aXRsZScpCgkJCSRkaXNwbGF5Y291
bnQgPSAnICcgLiAkY291bnQ7CgoJCWlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwaXRhbGl6
ZScpIHsKCQkJJHRhZyA9IHVjd29yZHMoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5z
Zm9ybSA9PSAndXBwZXJjYXNlJykgewoJCQkkdGFnID0gc3RydG91cHBlcigkdGFnKTsKCQl9
IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdsb3dlcmNhc2UnKSB7CgkJCSR0YWcgPSBz
dHJ0b2xvd2VyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGZp
cnN0JykgewoJCQkkdGFnID0gdWNmaXJzdCgkdGFnKTsKCQl9CgoJCWlmICgkZ2VuZXJhdGVs
aW5rcykgewoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0
cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4IC4gJyInOwoJCQkkdGFn
c19odG1sW10gPSAnPGEgaHJlZj0nIC4gJHdob2xldXJsIC4gJHRhZ19jbGFzcyAuICRzdHls
ZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2E+
JyAuICRkaXNwbGF5Y291bnQ7CgkJfSBlbHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8
fCAkdGl0bGVjb3VudCkgewoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFz
cyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gJHRhZyAuICc8L3NwYW4+JyAuICRk
aXNwbGF5Y291bnQ7CgkJfSBlbHNlIHsKCQkJJHRhZ3NfaHRtbFtdID0gJHRhZyAuICRkaXNw
bGF5Y291bnQ7CgkJfQoJfQoJcmV0dXJuIHRydV90YWdzX2RvX3dyYXAoJHRhZ3NfaHRtbCwg
JHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgojIyMgQ0xFQU4g
VVJMIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoVFJV
X1RBR1NfVVNFX0NMRUFOX1VSTFMpIHsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19j
bGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCmZ1bmN0aW9uIHRydV90YWdzX2Ns
ZWFuX3VybF9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsKCSRzdWJwYXRoID0gcHJlZ19yZXBs
YWNlKCIvaHR0cHM/OlwvXC8uKihcLy4qKS9VaSIsIiQxIixodSk7CgkkcmVnc2FmZXN1YnBh
dGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAnLycpOwoJJHJlcSA9IHByZWdfcmVwbGFjZSgi
L14kcmVnc2FmZXN1YnBhdGgvaSIsJy8nLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsKCgkk
cXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsKCSRxYXR0cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRy
ZXEsICRxcyArIDEpIDogJycpOwoJaWYgKCRxcykgJHJlcSA9IHN1YnN0cigkcmVxLCAwLCAk
cXMpOwoKCSRwYXJ0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoc3BsaXQoJy8nLCAk
cmVxKSkpOwoJaWYgKGNvdW50KCRwYXJ0cykgPT0gMiAmJiAkcGFydHNbMF0gPT0gVFJVX1RB
R1NfU0VDVElPTikgewoJCSR0YWcgPSAkcGFydHNbMV07CgkJJF9TRVJWRVJbJ1FVRVJZX1NU
UklORyddID0gVFJVX1RBR1NfVEFHX1BBUkFNRVRFUl9OQU1FIC4gJz0nIC4gJHRhZyAuICRx
YXR0czsKCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRoIC4gVFJVX1RBR1Nf
U0VDVElPTiAuICcvPycgLiAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ107CgkJaWYgKGNvdW50
KCRfUE9TVCkgPiAwKSB7CgkJCSRfUE9TVFsnc2VjdGlvbiddID0gVFJVX1RBR1NfU0VDVElP
TjsKCQkJJF9QT1NUW1RSVV9UQUdTX1RBR19QQVJBTUVURVJfTkFNRV0gPSAkdGFnOwoJCX0g
ZWxzZSB7CgkJCSRfR0VUWydzZWN0aW9uJ10gPSBUUlVfVEFHU19TRUNUSU9OOwoJCQkkX0dF
VFtUUlVfVEFHU19UQUdfUEFSQU1FVEVSX05BTUVdID0gJHRhZzsKCQl9Cgl9Cn0KCgojIyMg
QURNSU4gU0lERSBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK
CmlmIChUUlVfVEFHU19TSE9XX1RBR1NfSU5fQURNSU4pCglyZWdpc3Rlcl9jYWxsYmFjaygn
dHJ1X3RhZ3NfYWRtaW5faGFuZGxlcicsICdhcnRpY2xlJyk7CgpmdW5jdGlvbiB0cnVfdGFn
c19hZG1pbl9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsKCSRjbG91ZCA9IGFycmF5X3VuaXF1
ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0
cyhhcnJheSgpLCB0cnVlLCB0cnVlKSkpOwoJc29ydCgkY2xvdWQpOwoKCSRpZCA9IChlbXB0
eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lEJykgOiAkR0xPQkFMU1snSUQnXSk7CgkkYXJ0
aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBhcnJheSgpIDogdHJ1X3RhZ3NfZ2V0X3RhZ3Nf
Zm9yX2FydGljbGUoJGlkKSk7CgoJJGxpbmtzID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRjbG91
ZCBhcyAkdGFnKSB7CgkJJHN0eWxlID0gKGluX2FycmF5KCR0YWcsICRhcnRpY2xlX3RhZ3Mp
ID8gJyBjbGFzcz0idGFnX2Nob3NlbiInIDogJycpOwoJCSRsaW5rc1tdID0gJzxhIGhyZWY9
IiNhZHZhbmNlZCInLiRzdHlsZS4nIG9uY2xpY2s9InRoaXMuc2V0QXR0cmlidXRlKFxcXCdj
bGFzc1xcXCcsIHRvZ2dsZVRhZyhcXFwnJy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoJHRhZykp
LidcXFwnKSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hh
cnMoJHRhZykpIC4gJzxcL2E+JzsKCX0KCSR0b19pbnNlcnQgPSBqb2luKCcsICcsICRsaW5r
cyk7CgkkdG9faW5zZXJ0ID0gIjxzdHlsZT5hLnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xv
cjogI0ZFQjsgY29sb3I6IGJsYWNrO308L3N0eWxlPiIgLiAkdG9faW5zZXJ0OwoKCSRqcyA9
IDw8PEVPRgp2YXIga2V5d29yZHNGaWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdr
ZXl3b3JkcycpOwp2YXIgcGFyZW50ID0ga2V5d29yZHNGaWVsZC5wYXJlbnROb2RlOwpwYXJl
bnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7CnZhciBjbG91
ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKY2xvdWQuc2V0QXR0cmlidXRl
KCdjbGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CmNsb3VkLmlubmVySFRNTCA9ICd7
JHRvX2luc2VydH0nOwpwYXJlbnQuYXBwZW5kQ2hpbGQoY2xvdWQpOwoKZnVuY3Rpb24gdG9n
Z2xlVGFnKHRhZ05hbWUpIHsKCXZhciByZWdleFRhZyA9IHRhZ05hbWUucmVwbGFjZSgvKFtc
XFxcXF5cXCQqK1tcXF0/e30uPSE6KHwpXSkvZywiXFxcXCQxIik7Cgl2YXIgdGFnUmVnZXgg
PSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyooLFxcXHMq
fCQpIik7Cgl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29y
ZHMnKTsKCXZhciBjdXJ2YWwgPSB0ZXh0YXJlYS52YWx1ZS5yZXBsYWNlKC8sP1xzKyQvLCAn
Jyk7CglpZiAoJycgPT0gY3VydmFsKSB7CgkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOwoJ
fSBlbHNlIGlmIChjdXJ2YWwubWF0Y2godGFnUmVnZXgpKSB7CgkJdGV4dGFyZWEudmFsdWUg
PSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdleCwgJyQxJykucmVwbGFjZSgvLD9ccyskLywgJycp
OwoJCXJldHVybiAnJzsKCX0gZWxzZSBpZiAoJywnID09IGN1cnZhbC5jaGFyQXQoY3VydmFs
Lmxlbmd0aCAtIDEpKSB7CgkJdGV4dGFyZWEudmFsdWUgKz0gJyAnICsgdGFnTmFtZTsKCX0g
ZWxzZSB7CgkJdGV4dGFyZWEudmFsdWUgKz0gJywgJyArIHRhZ05hbWU7Cgl9CglyZXR1cm4g
J3RhZ19jaG9zZW4nOwp9CkVPRjsKCgllY2hvIHNjcmlwdF9qcygkanMpOwp9CgoKIyMjIEFU
T00vUlNTIEZFRUQgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjCgpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYXRvbV9oYW5kbGVyJywgJ2F0b21f
ZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfYXRvbV9oYW5kbGVyKCRldmVudCwgJHN0ZXAp
IHsgcmV0dXJuIHRydV90YWdzX2ZlZWRfaGFuZGxlcih0cnVlKTsgfQpyZWdpc3Rlcl9jYWxs
YmFjaygndHJ1X3RhZ3NfcnNzX2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7CmZ1bmN0aW9uIHRy
dV90YWdzX3Jzc19oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90YWdzX2Zl
ZWRfaGFuZGxlcihmYWxzZSk7IH0KCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigk
YXRvbSkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsK
CgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQpOwoKCWlm
IChUUlVfVEFHU19BRERfVEFHU19UT19GRUVEX0JPRFkpIHsKCQkkZXh0cmFib2R5ID0gJyc7
CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOwoJCWlmIChmZXRjaCgnZm9y
bScsICd0eHBfZm9ybScsICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCQkJJGZvcm0gPSBmZXRj
aF9mb3JtKCRGT1JNX05BTUUpOwoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkp
OwoJCX0gZWxzZSB7CgkJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0
dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUpOwoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcg
LiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7
CgkJfQoJCWdsb2JhbCAkdGhpc2FydGljbGU7CgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydl
eGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJpbSgkdGhpc2Fy
dGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0cmFib2R5Lm47CgkJfQoJCSR0aGlzYXJ0aWNsZVsn
Ym9keSddID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47Cgl9
CgoJaWYgKFRSVV9UQUdTX0FERF9UQUdTX1RPX0ZFRURfWE1MKSB7CgkJJG91dHB1dCA9IGFy
cmF5KCk7CgkJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJ
CSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnkgdGVybT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRh
ZykgLiAnIiAvPic7CgkJCX0gZWxzZSB7CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5Picg
LiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQly
ZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47Cgl9Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBG
VU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9u
IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRhcnRpY2xlSUQpIHsKCSR0YWdzX2Zp
ZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRl
eHRwYXR0ZXJuIiwgIklEPSckYXJ0aWNsZUlEJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsK
CSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93ZXIoJHJz
WyR0YWdzX2ZpZWxkXSkpKTsKCglyZXR1cm4gdHJ1X3RhZ3NfdHJpbV90YWdzKCRhbGxfdGFn
cyk7Cn0KCgojIGZpeGVzIGJ1ZyB3aXRoIDQuMC40J3MgdmVyc2lvbiBvZiBkb1dyYXAgdGhh
dCBjYXVzZWQgc3BhY2VzIHRvIHNob3cgdXAgYmVmb3JlIHRoZSBjb21tYXMKZnVuY3Rpb24g
dHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJl
YWtjbGFzcykgewoJaWYgKCEkd3JhcHRhZyAmJiAhcHJlZ19tYXRjaCgnL15cdyskLycsICRi
cmVhaykpIHsKCQlyZXR1cm4gam9pbigkYnJlYWsubiwgJGxpc3QpOwoJfSBlbHNlIHsKCQly
ZXR1cm4gZG9XcmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2Ns
YXNzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFncygkdGFnX2FycmF5KSB7
CgkkdHJpbW1lZCA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGFnX2FycmF5IGFzICR0YWcpIHsK
CQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgewoJCQkkdHJpbW1lZFtdID0gdHJpbSgkdGFnKTsK
CQl9Cgl9CglyZXR1cm4gJHRyaW1tZWQ7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maXh1cF9x
dWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcikgewoJJGtleXdvcmRzID0gZXhwbG9k
ZSgnLCcsIHF1b3RlbWV0YSgkdGFnX3BhcmFtZXRlcikpOwoJZm9yZWFjaCAoJGtleXdvcmRz
IGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2Up
IHsKCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJ
CX0KCX0KCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJ
aWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbidd
LCAnLCcpICE9PSBmYWxzZSkKCQkkYXR0c1snc2VjdGlvbiddID0gJyc7CgoJaWYgKGlzc2V0
KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJCXVuc2V0KCRhdHRzWydleGNsdWRlc2Vj
dGlvbiddKTsKCX0KCglpZiAoIWlzc2V0KCRhdHRzWydsaW1pdCddKSkKCQkkYXR0c1snbGlt
aXQnXSA9ICcxMDAwJzsKCgkkYXR0c1snYWxsb3dvdmVycmlkZSddID0gdHJ1ZTsKCglyZXR1
cm4gJGF0dHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zdHJ0b2xvd2VyKCRzdHIpIHsKCWlm
IChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIiKSkgewoJLy9pZiAodmVyc2lvbl9j
b21wYXJlKHBocHZlcnNpb24oKSwgIjQuMy4wIiwgIj49IikpIHsKCQlyZXR1cm4gbWJfc3Ry
dG9sb3dlcigkc3RyLCAiVVRGLTgiKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHN0cnRvbG93ZXIo
JHN0cik7Cgl9Cn0KCgovL3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jvc3MsIGJ1
dCBJIGNhbid0IGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8gaXQKZnVuY3Rpb24gdHJ1
X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2Fz
Y2VuZGluZykgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3Nv
cnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsKCgkkdHJ1X3RhZ3NfdGFn
c193ZWlnaHQgPSAkdGFnc193ZWlnaHQ7CgkkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCA9ICRz
b3J0X2J5X2NvdW50OwoJJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nID0gJHNvcnRfYXNjZW5k
aW5nOwoKCSR0ZW1wX2FycmF5ID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOwoJdXNvcnQo
JHRlbXBfYXJyYXksICJ0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvciIpOwoKCSRzb3J0
ZWRfYXJyYXkgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHRlbXBfYXJyYXkgYXMgJHRhZykgewoJ
CSRzb3J0ZWRfYXJyYXlbJHRhZ10gPSAkdGFnc193ZWlnaHRbJHRhZ107Cgl9CgoJcmV0dXJu
ICRzb3J0ZWRfYXJyYXk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFy
YXRvcigkbGVmdCwgJHJpZ2h0KSB7CglnbG9iYWwgJHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAk
dHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCWlm
ICgkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCkgewoJCSRsZWZ0X3dlaWdodCA9ICR0cnVfdGFn
c190YWdzX3dlaWdodFskbGVmdF07CgkJJHJpZ2h0X3dlaWdodCA9ICR0cnVfdGFnc190YWdz
X3dlaWdodFskcmlnaHRdOwoJCWlmICgkbGVmdF93ZWlnaHQgPT0gJHJpZ2h0X3dlaWdodCkg
ewoJCQlyZXR1cm4gc3RybmF0Y2FzZWNtcCgkbGVmdCwgJHJpZ2h0KTsKCQl9IGVsc2UgaWYg
KCR0cnVfdGFnc19zb3J0X2FzY2VuZGluZykgewoJCQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0g
JHJpZ2h0X3dlaWdodDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJpZ2h0X3dlaWdodCAtICRs
ZWZ0X3dlaWdodDsKCQl9Cgl9IGVsc2UgewoJCXJldHVybiBzdHJuYXRjYXNlY21wKCRsZWZ0
LCAkcmlnaHQpOwoJfQp9CgoKCiMjIyBCQVNUQVJEIEZVTkNUSU9OUyBUSEFUIFNIT1VMRE4n
VCBIQVZFIFRPIEVYSVNUICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVf
c2VhcmNoKCRhdHRzKSB7CgkkdGhlQXR0cyA9IGxBdHRzKGFycmF5KCdsaW1pdCcgICAgID0+
IDEwMDAsCgkJCQknY2F0ZWdvcnknICA9PiAnJywKCQkJCSdzZWN0aW9uJyAgID0+ICcnLAoJ
CQkJJ2V4Y2VycHRlZCcgPT4gJycsCgkJCQknYXV0aG9yJyAgICA9PiAnJywKCQkJCSdzb3J0
YnknICAgID0+ICdQb3N0ZWQnLAoJCQkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLAoJCQkJJ21v
bnRoJyAgICAgPT4gJycsCgkJCQkna2V5d29yZHMnICA9PiAnJywKCQkJCSdmcm9udHBhZ2Un
ID0+ICcnLAoJCQkJJ2lkJyAgICAgICAgPT4gJycsCgkJCQkndGltZScgICAgICA9PiAncGFz
dCcsCgkJCQknc3RhdHVzJyAgICA9PiAnNCcsCgkJCQknb2Zmc2V0JyAgICA9PiAwCgkJCSks
JGF0dHMsIDApOwoJZXh0cmFjdCgkdGhlQXR0cyk7CgoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0
cwoJJGZyb250cGFnZSA9ICgkZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7
CgkkY2F0ZWdvcnkgID0gKCEkY2F0ZWdvcnkpICA/ICcnIDogIiBhbmQgKChDYXRlZ29yeTE9
JyIuZG9zbGFzaCgkY2F0ZWdvcnkpLiInKSBvciAoQ2F0ZWdvcnkyPSciLmRvU2xhc2goJGNh
dGVnb3J5KS4iJykpICI7Cgkkc2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBh
bmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24pLiInIjsKCSRleGNlcnB0ZWQgPSAo
JGV4Y2VycHRlZD09J3knKSAgPyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7CgkkYXV0aG9y
ICAgID0gKCEkYXV0aG9yKSAgICA/ICcnIDogIiBhbmQgQXV0aG9ySUQgPSAnIi5kb3NsYXNo
KCRhdXRob3IpLiInIjsKCSRtb250aCAgICAgPSAoISRtb250aCkgICAgID8gJycgOiAiIGFu
ZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIjsKCSRpZCAgICAgICAgPSAo
ISRpZCkgICAgICAgID8gJycgOiAiIGFuZCBJRCA9ICciLmludHZhbCgkaWQpLiInIjsKCXN3
aXRjaCAoJHRpbWUpIHsKCQljYXNlICdhbnknOgoJCQkkdGltZSA9ICIiOyBicmVhazsKCQlj
YXNlICdmdXR1cmUnOgoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7
CgkJZGVmYXVsdDoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPCBub3coKSI7Cgl9CglpZiAo
IWlzX251bWVyaWMoJHN0YXR1cykpCgkJJHN0YXR1cyA9IGdldFN0YXR1c051bSgkc3RhdHVz
KTsKCgkkY3VzdG9tID0gJyc7CgkvLyB0cnlpbmcgY3VzdG9tIGZpZWxkcyBoZXJlCgkkY3Vz
dG9tRmllbGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7CglpZiAoJGN1c3RvbUZpZWxkcykgewoJ
CWZvcmVhY2goJGN1c3RvbUZpZWxkcyBhcyAkY0ZpZWxkKSB7CgkJCWlmIChpc3NldCgkYXR0
c1skY0ZpZWxkXSkpCgkJCQkkY3VzdG9tUGFpcnNbJGNGaWVsZF0gPSAkYXR0c1skY0ZpZWxk
XTsKCQl9CgkJaWYoIWVtcHR5KCRjdXN0b21QYWlycykpCgkJCSRjdXN0b20gPSAgYnVpbGRD
dXN0b21TcWwoJGN1c3RvbUZpZWxkcywkY3VzdG9tUGFpcnMpOwoJCWVsc2UKCQkJJGN1c3Rv
bSA9ICcnOwoJfQoKCS8vQWxsb3cga2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4g
VGhhdCB0YWdnaW5nIG1vZGUsIHlvdSBrbm93CglpZiAoJGtleXdvcmRzKSB7CgkJJGtleXMg
PSBzcGxpdCgnLCcsJGtleXdvcmRzKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJ
CSRrZXlwYXJ0c1tdID0gIiBLZXl3b3JkcyBsaWtlICclIi5kb1NsYXNoKHRyaW0oJGtleSkp
LiIlJyI7CgkJfQoJCSRrZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBh
cnRzKSAuICIpIjsKCX0KCglpZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49
ICc0JyI7CgllbHNlCgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3Rh
dHVzKS4iJyI7CgoJJHdoZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRj
YXRlZ29yeSAuICRzZWN0aW9uIC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAk
a2V5d29yZHMgLiAkY3VzdG9tIC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNl
dCAuICcsICc7CgoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQ
b3N0ZWQpIGFzIHVQb3N0ZWQiLCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBi
eSAnIC4gZG9zbGFzaCgkc29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBs
aW1pdCAnIC4gZG9TbGFzaCgkbGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKIjtzOjg6Imhl
bHBfcmF3IjtzOjQ5ODoiVG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0
IHRoZSAiaW50cm9kdWN0b3J5IGFydGljbGUiOi9ibG9nLzQ5My90cnV0YWdzLWEtdGFnZ2lu
Zy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuLCAicmVsZWFzZXMgcGFnZSI6aHR0cDovL3d3dy50
cnVpc3QuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMsICJmZWF0dXJlIGxp
c3QiOmh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVy
ZS1saXN0LCBhbmQgInVzYWdlIGluc3RydWN0aW9ucyI6aHR0cDovL3d3dy50cnVpc3QuY29t
L3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMuCgpJJ3ZlIHRha2Vu
IHRoZSBkZXRhaWxlZCBoZWxwIG91dCBvZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJ
dCB3YXMgdG9vIGJpZyBhbmQgdG9vIGRpZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9u
IG15IHNpdGUgYW5kIGluIHRoZSBwbHVnaW4uIjtzOjM6Im1kNSI7czozMjoiNTc0NGQ2Yzli
NDQ0NzU4MGY3NWNlZTcxNzRmNjYzNmUiO30=
