# upm_file v.0.3.3 # Associate single or multiple files with an article. # Mary Fredborg # http://utterplush.com/txp-plugins/upm-file # .......................................................................... # A plugin for Textpattern # http://textpattern.com/ # # Adding Plugins to Your Textpattern Installation # http://textpattern.net/wiki/index.php?title=Intermediate_Weblog_Model#Adding_Plugins_to_Your_Textpattern_Installation # .......................................................................... YToxMTp7czo0OiJuYW1lIjtzOjg6InVwbV9maWxlIjtzOjExOiJkZXNjcmlwdGlvbiI7czo1 MToiQXNzb2NpYXRlIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlcyB3aXRoIGFuIGFydGljbGUu IjtzOjc6InZlcnNpb24iO3M6NToiMC4zLjMiO3M6NDoidHlwZSI7aToxO3M6NjoiYXV0aG9y IjtzOjEzOiJNYXJ5IEZyZWRib3JnIjtzOjEwOiJhdXRob3JfdXJpIjtzOjQyOiJodHRwOi8v dXR0ZXJwbHVzaC5jb20vdHhwLXBsdWdpbnMvdXBtLWZpbGUiO3M6NDoiY29kZSI7czoxMjcz NDoiaWYgKHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKQoJewoJCXVwbV9maWxlX2luc3RhbGwo KTsKCgkJYWRkX3ByaXZzKCd1cG1fZmlsZV9wcmVmcycsICcxLDInKTsKCQlyZWdpc3Rlcl90 YWIoJ2V4dGVuc2lvbnMnLCAndXBtX2ZpbGVfcHJlZnMnLCAndXBtX2ZpbGUnKTsKCQlyZWdp c3Rlcl9jYWxsYmFjaygndXBtX2ZpbGVfcHJlZnMnLCAndXBtX2ZpbGVfcHJlZnMnKTsKCgkJ YWRkX3ByaXZzKCd1cG1fZmlsZV9pbnN0YWxsJywgJzEsMicpOwoJCXJlZ2lzdGVyX2NhbGxi YWNrKCd1cG1fZmlsZV9pbnN0YWxsJywgJ3VwbV9maWxlX3ByZWZzJywgJycsIDEpOwoJfQoK Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQoKCWZ1bmN0aW9uIHVwbV9hcnRpY2xlX2ZpbGVfbGlzdCgkYXR0cyA9IGFy cmF5KCkpCgl7CgkJZ2xvYmFsICR0aGlzZmlsZSwgJHRoaXNhcnRpY2xlLCAkZmlsZV9iYXNl X3BhdGgsICRwcmVmczsKCgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ2JyZWFrJwkJCQkJ PT4gYnIsCgkJCSdjbGFzcycJCQkJCT0+ICcnLAoJCQknaWQnCQkJCQkJPT4gJHRoaXNhcnRp Y2xlWyd0aGlzaWQnXSwKCQkJJ2ZpbGVfY2F0ZWdvcnknID0+ICcnLAoJCQknZm9ybScJCQkJ CT0+ICdmaWxlcycsCgkJCSdsYWJlbCcJCQkJCT0+ICcnLAoJCQknbGFiZWx0YWcnCQkJPT4g JycsCgkJCSdsaW1pdCcJCQkJCT0+IDAsCgkJCSdvZmZzZXQnCQkJCT0+IDAsCgkJCSdzb3J0 JwkJCQkJPT4gJycsCgkJCSdzb3J0YnknCQkJCT0+ICcnLCAvLyBkZXByZWNhdGVkCgkJCSd3 cmFwdGFnJwkJCQk9PiAnJwoJCSksICRhdHRzKSk7CgoJCSR1cG1fZmlsZV9maWVsZCA9ICRw cmVmc1sndXBtX2ZpbGVfZmllbGQnXTsKCgkJLy8gY3VzdG9tIGFydGljbGUKCQlpZiAoJGlk KQoJCXsKCQkJJGlkID0gZG9TbGFzaCgkaWQpOwoKCQkJJGZpZWxkID0gZmV0Y2goJHVwbV9m aWxlX2ZpZWxkLCAndGV4dHBhdHRlcm4nLCAnSUQnLCAkaWQpOwoJCX0KCgkJLy8gY3VycmVu dGx5IHZpZXdlZCBhcnRpY2xlCgkJZWxzZWlmICgkdGhpc2FydGljbGUpCgkJewoJCQkkZmll bGQgPSAkdGhpc2FydGljbGVbJHVwbV9maWxlX2ZpZWxkXTsKCQl9CgoJCS8vIG5vIGN1c3Rv bSBpZCB3YXMgc3VwcGxpZWQsIG5vciB3ZXJlIHdlIGxvb2tpbmcgYXQgYW4gYXJ0aWNsZQoJ CWVsc2UKCQl7CgkJCXJldHVybjsKCQl9CgoJCS8vIGZpZWxkIHdhcyBlbXB0eQoJCWlmIChl bXB0eSgkZmllbGQpKQoJCXsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCRmaWxlX2NhdGVnb3J5 KQoJCXsKCQkJJGZpbGVfY2F0ZWdvcnkgPSBqb2luKCInLCciLCBkb1NsYXNoKGRvX2xpc3Qo JGZpbGVfY2F0ZWdvcnkpKSk7CgoJCQkkZmlsZV9jYXRlZ29yeV9zcWwgPSAiYW5kIGNhdGVn b3J5IGluKCckZmlsZV9jYXRlZ29yeScpIjsKCQl9CgoJCWVsc2UKCQl7CgkJCSRmaWxlX2Nh dGVnb3J5X3NxbCA9ICcnOwoJCX0KCgkJJGZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsKCgkJ aWYgKCRsaW1pdCkKCQl7CgkJCSRsaXN0ID0gYXJyYXlfc2xpY2Uoc3BsaXQoJywnLCAkZmll bGQpLCAkb2Zmc2V0LCAkbGltaXQpOwoJCX0KCgkJZWxzZQoJCXsKCQkJJGxpc3QgPSBhcnJh eV9zbGljZShzcGxpdCgnLCcsICRmaWVsZCksICRvZmZzZXQpOwoJCX0KCgkJJGxpc3QgPSBk b1NsYXNoKGpvaW4oJywnLCAkbGlzdCkpOwoKCQlpZiAoJHNvcnRieSkKCQl7CgkJCSRzb3J0 ID0gJHNvcnRieTsKCQl9CgoJCSRzb3J0ID0gKCRzb3J0KSA/IGRvU2xhc2goJHNvcnQpIDog ImZpZWxkKGlkLCAkbGlzdCkiOwoKCQkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoJyonLCAndHhw X2ZpbGUnLCAiaWQgaW4oJGxpc3QpICRmaWxlX2NhdGVnb3J5X3NxbCBvcmRlciBieSAkc29y dCIpOwoKCQlpZiAoJHJzKQoJCXsKCQkJJG91dCA9IGFycmF5KCk7CgoJCQl3aGlsZSAoJGEg PSBuZXh0Um93KCRycykpCgkJCXsKCQkJCSRHTE9CQUxTWyd0aGlzZmlsZSddID0gZmlsZV9k b3dubG9hZF9mb3JtYXRfaW5mbygkYSk7CgoJCQkJJG91dFtdID0gcGFyc2UoJGZvcm0pOwoK CQkJCSRHTE9CQUxTWyd0aGlzZmlsZSddID0gJyc7CgkJCX0KCgkJCWlmICgkb3V0KQoJCQl7 CgkJCQlpZiAoJHdyYXB0YWcgPT0gJ3VsJyBvciAkd3JhcHRhZyA9PSAnb2wnKQoJCQkJewoJ CQkJCXJldHVybiBkb0xhYmVsKCRsYWJlbCwgJGxhYmVsdGFnKS5kb1dyYXAoJG91dCwgJHdy YXB0YWcsICRicmVhaywgJGNsYXNzKTsKCQkJCX0KCgkJCQkkb3V0ID0gKCR3cmFwdGFnKSA/ IHRhZyhqb2luKCRicmVhaywgJG91dCksICR3cmFwdGFnKSA6IGpvaW4obiwgJG91dCk7CgoJ CQkJcmV0dXJuIGRvTGFiZWwoJGxhYmVsLCAkbGFiZWx0YWcpLiRvdXQ7CgkJCX0KCQl9CgoJ CXJldHVybiAnJzsKCX0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCglmdW5jdGlvbiB1cG1fZmlsZV9hcnRpY2xl KCRhdHRzID0gYXJyYXkoKSkKCXsKCQlyZXR1cm4gdXBtX2ZpbGVfcGFyc2VBcnRpY2xlcygk YXR0cyk7Cgl9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVfZG9BcnRpY2xlcygk YXR0cywgJGlzY3VzdG9tKQoJewoJCWdsb2JhbCAkcHJldGV4dCwgJHByZWZzLCAkdHhwY2Zn OwoKCQlleHRyYWN0KCRwcmV0ZXh0KTsKCQlleHRyYWN0KCRwcmVmcyk7CgoJCSR0aGVBdHRz ID0gbEF0dHMoYXJyYXkoCgkJCSdhbGxvd292ZXJyaWRlJyA9PiAoISRxIGFuZCAhJGlzY3Vz dG9tKSwKCQkJJ2F1dGhvcicJCQkJPT4gJycsCgkJCSdjYXRlZ29yeScJCQk9PiAnJywKCQkJ J2V4Y2VycHRlZCcJCQk9PiAnJywKCQkJJ2Zvcm0nCQkJCQk9PiAnZGVmYXVsdCcsCgkJCSdm cm9udHBhZ2UnCQkJPT4gJycsCgkJCSdpZCcJCQkJCQk9PiAnJywKCQkJJ2tleXdvcmRzJwkJ CT0+ICcnLAoJCQknbGltaXQnCQkJCQk9PiAxMCwKCQkJJ2xpc3Rmb3JtJwkJCT0+ICcnLAoJ CQknbW9udGgnCQkJCQk9PiAnJywKCQkJJ29mZnNldCcJCQkJPT4gMCwKCQkJJ3BhZ2VieScJ CQkJPT4gJycsCgkJCSdwZ29ubHknCQkJCT0+IDAsCgkJCSdzZWFyY2hhbGwnCQkJPT4gMSwK CQkJJ3NlYXJjaGZvcm0nCQk9PiAnJywKCQkJJ3NlYXJjaHN0aWNreScJPT4gMCwKCQkJJ3Nl Y3Rpb24nCQkJCT0+ICcnLAoJCQknc29ydCcJCQkJCT0+ICcnLAoJCQknc29ydGJ5JwkJCQk9 PiAnJywKCQkJJ3NvcnRkaXInCQkJCT0+ICcnLAoJCQknc3RhdHVzJwkJCQk9PiAnNCcsCgkJ CSd0aW1lJwkJCQkJPT4gJ3Bhc3QnLAoJCQknd2l0aGZpbGVzJwkJCT0+IGZhbHNlCgkJKSwg JGF0dHMpOwoKCQkkaXNjdXN0b20gPSAhZW1wdHkoJHRoZUF0dHNbJ2lkJ10pID8gdHJ1ZSA6 ICRpc2N1c3RvbTsKCgkJLy8gZm9yIHRoZSBhcnRpY2xlIHRhZywgc29tZSBhdHRyaWJ1dGVz IGFyZSB0YWtlbiBmcm9tIGdsb2JhbHMKCQkvLyBvdmVycmlkZSB0aGVtIGJlZm9yZSBleHRy YWN0CgkJaWYgKCEkaXNjdXN0b20pCgkJewoJCQkkdGhlQXR0c1snYXV0aG9yJ10JCT0gIWVt cHR5KCRhdXRob3IpID8gImEuJGF1dGhvciIgOiAnJzsKCQkJJHRoZUF0dHNbJ2NhdGVnb3J5 J10JPSAoJGMpID8gImEuJGMiIDogJyc7CgkJCSR0aGVBdHRzWydleGNlcnB0ZWQnXSA9ICcn OwoJCQkkdGhlQXR0c1snZnJvbnRwYWdlJ10gPSAoJHMgJiYgJHMgPT0gJ2RlZmF1bHQnKSA/ IHRydWUgOiBmYWxzZTsKCQkJJHRoZUF0dHNbJ21vbnRoJ10JCQk9ICFlbXB0eSgkbW9udGgp ID8gImEuJG1vbnRoIiA6ICcnOwoJCQkkdGhlQXR0c1snc2VjdGlvbiddCQk9ICgkcyAmJiAk cyAhPSAnZGVmYXVsdCcpID8gImEuJHMiIDogJyc7CgkJfQoKCQlleHRyYWN0KCR0aGVBdHRz KTsKCgkJJHBhZ2VieSA9IChlbXB0eSgkcGFnZWJ5KSA/ICRsaW1pdCA6ICRwYWdlYnkpOwoK CQkvLyB0cmVhdCBzdGlja3kgYXJ0aWNsZXMgZGlmZmVyZW50bHkgd3J0IHNlYXJjaCBmaWx0 ZXJpbmcsIGV0YwoJCWlmICghaXNfbnVtZXJpYygkc3RhdHVzKSkKCQl7CgkJCSRzdGF0dXMg PSBnZXRTdGF0dXNOdW0oJHN0YXR1cyk7CgkJfQoKCQkkaXNzdGlja3kgPSAoJHN0YXR1cyA9 PSA1KTsKCgkJLy8gZ2l2ZSBjb250cm9sIHRvIHNlYXJjaCwgaWYgbmVjZXNhcnkKCgkJaWYg KCRxICYmICEkaXNjdXN0b20gJiYgISRpc3N0aWNreSkKCQl7CgkJCWluY2x1ZGVfb25jZSh0 eHBhdGguJy9wdWJsaXNoL3NlYXJjaC5waHAnKTsKCgkJCSRzX2ZpbHRlciA9ICgkc2VhcmNo YWxsKSA/IHVwbV9maWxlX2ZpbHRlclNlYXJjaCgpIDogJyc7CgoJCQkkcSA9IGRvU2xhc2go JHEpOwoKCQkJJG1hdGNoID0gIiwgbWF0Y2goYS5UaXRsZSwgYS5Cb2R5KSBhZ2FpbnN0KCck cScpIGFzIHNjb3JlIjsKCQkJJHNlYXJjaCA9ICIgYW5kIChhLlRpdGxlIHJsaWtlICckcScg b3IgYS5Cb2R5IHJsaWtlICckcScpICRzX2ZpbHRlciI7CgoJCQkvLyBzZWFyY2hhbGw9MCBj YW4gYmUgdXNlZCB0byBzaG93IHNlYXJjaCByZXN1bHRzIGZvciB0aGUgY3VycmVudCBzZWN0 aW9uIG9ubHkKCQkJaWYgKCRzZWFyY2hhbGwpCgkJCXsKCQkJCSRzZWN0aW9uID0gJyc7CgkJ CX0KCgkJCWlmICghJHNvcnQpCgkJCXsKCQkJCSRzb3J0ID0gImRvd25sb2FkcyBkZXNjLCBz Y29yZSBkZXNjIjsKCQkJfQoJCX0KCgkJZWxzZQoJCXsKCQkJJG1hdGNoID0gJHNlYXJjaCA9 ICcnOwoKCQkJaWYgKCEkc29ydCkKCQkJewoJCQkJJHNvcnQgPSAiZG93bmxvYWRzIGRlc2Ms IFBvc3RlZCBkZXNjIjsKCQkJfQoJCX0KCgkJLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmls aXR5CgkJLy8gc29ydGJ5IGFuZCBzb3J0ZGlyIGFyZSBkZXByZWNhdGVkCgkJaWYgKCRzb3J0 YnkpCgkJewoJCQlpZiAoISRzb3J0ZGlyKQoJCQl7CgkJCQkkc29ydGRpciA9ICdkZXNjJzsK CQkJfQoKCQkJJHNvcnQgPSAiJHNvcnRieSAkc29ydGRpciI7CgkJfQoKCQllbHNlaWYgKCRz b3J0ZGlyKQoJCXsKCQkJJHNvcnQgPSAiYS5Qb3N0ZWQgJHNvcnRkaXIiOwoJCX0KCgkJLy8g YnVpbGRpbmcgcXVlcnkgcGFydHMKCQkkYXV0aG9yCT0gKCRhdXRob3IpCT8gIiBhbmQgYS5B dXRob3JJRCA9ICciLmRvU2xhc2goJGF1dGhvcikuIiciIDogJyc7CgkJJGNhdGVnb3J5CT0g KCRjYXRlZ29yeSkJPyAiIGFuZCAoKGEuQ2F0ZWdvcnkxPSciLmRvU2xhc2goJGNhdGVnb3J5 KS4iJykgb3IgKGEuQ2F0ZWdvcnkyPSciLmRvU2xhc2goJGNhdGVnb3J5KS4iJykpICIgOiAn JzsKCQkkZXhjZXJwdGVkID0gKCRleGNlcnB0ZWQgPT0gJ3knKSA/ICIgYW5kIGEuRXhjZXJw dCAhPSAnJyIgOiAnJzsKCQkkZnJvbnRwYWdlID0gKCRmcm9udHBhZ2UgYW5kICEkcSkgPyB1 cG1fZmlsZV9maWx0ZXJGcm9udFBhZ2UoKSA6ICcnOwoJCSRpZAk9ICgkaWQpCT8gIiBhbmQg YS5JRCA9ICciLmludHZhbCgkaWQpLiInIiA6ICcnOwoJCSRtb250aCA9ICgkbW9udGgpID8g IiBhbmQgYS5Qb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIiA6ICcnOwoJCSRz ZWN0aW9uID0gKCRzZWN0aW9uKQk/ICIgYW5kIGEuU2VjdGlvbiA9ICciLmRvU2xhc2goJHNl Y3Rpb24pLiInIiA6ICcnOwoKCQlzd2l0Y2ggKCR0aW1lKQoJCXsKCQkJY2FzZSAnYW55JzoK CQkJCSR0aW1lID0gJyc7CgkJCWJyZWFrOwoKCQkJY2FzZSAnZnV0dXJlJzoKCQkJCSR0aW1l ID0gIiBhbmQgYS5Qb3N0ZWQgPiBub3coKSI7CgkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJ CSR0aW1lID0gIiBhbmQgYS5Qb3N0ZWQgPD0gbm93KCkiOwoJCQlicmVhazsKCQl9CgoJCWlm ICghaXNfbnVtZXJpYygkc3RhdHVzKSkKCQl7CgkJCSRzdGF0dXMgPSBnZXRTdGF0dXNOdW0o JHN0YXR1cyk7CgkJfQoKCQkvLyB0cnlpbmcgY3VzdG9tIGZpZWxkcyBoZXJlCgoJCSRjdXN0 b20gPSAnJzsKCgkJJGN1c3RvbUZpZWxkcyA9IGdldEN1c3RvbUZpZWxkcygpOwoKCQlpZiAo JGN1c3RvbUZpZWxkcykKCQl7CgkJCWZvcmVhY2ggKCRjdXN0b21GaWVsZHMgYXMgJGNGaWVs ZCkKCQkJewoJCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmllbGRdKSkKCQkJCXsKCQkJCQkkY3Vz dG9tUGFpcnNbJGNGaWVsZF0gPSAkYXR0c1skY0ZpZWxkXTsKCQkJCX0KCQkJfQoKCQkJaWYg KCFlbXB0eSgkY3VzdG9tUGFpcnMpKQoJCQl7CgkJCQkkY3VzdG9tID0JIGJ1aWxkQ3VzdG9t U3FsKCRjdXN0b21GaWVsZHMsICRjdXN0b21QYWlycyk7CgkJCX0KCgkJCWVsc2UKCQkJewoJ CQkJJGN1c3RvbSA9ICcnOwoJCQl9CgkJfQoKCQkvLyBBbGxvdyBrZXl3b3JkcyBmb3Igbm8t Y3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtub3cKCQlpZiAoJGtl eXdvcmRzKQoJCXsKCQkJJGtleXMgPSBzcGxpdCgnLCcsICRrZXl3b3Jkcyk7CgoJCQlmb3Jl YWNoICgka2V5cyBhcyAka2V5KQoJCQl7CgkJCQkka2V5cGFydHNbXSA9ICIgYS5LZXl3b3Jk cyBsaWtlICclIi5kb1NsYXNoKHRyaW0oJGtleSkpLiIlJyI7CgkJCX0KCgkJCSRrZXl3b3Jk cyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7CgkJfQoKCQlp ZiAoJHEgYW5kICRzZWFyY2hzdGlja3kpCgkJewoJCQkkc3RhdHVzcSA9ICcgYW5kIGEuU3Rh dHVzID49IDQnOwoJCX0KCgkJZWxzZWlmICgkaWQpCgkJewoJCQkkc3RhdHVzcSA9ICcgYW5k IGEuU3RhdHVzID49IDQnOwoJCX0KCgkJZWxzZQoJCXsKCQkJJHN0YXR1c3EgPSAnIGFuZCBh LlN0YXR1cyA9ICcuaW50dmFsKCRzdGF0dXMpOwoJCX0KCgkJJHdoZXJlID0gIjEiLiAkc3Rh dHVzcS4gJHRpbWUuICRzZWFyY2guICRpZC4gJGNhdGVnb3J5LiAkc2VjdGlvbi4gJGV4Y2Vy cHRlZC4gJG1vbnRoLiAkYXV0aG9yLiAka2V5d29yZHMuICRjdXN0b20uICRmcm9udHBhZ2U7 CgoJCS8vZG8gbm90IHBhZ2luYXRlIGlmIHdlIGFyZSBvbiBhIGN1c3RvbSBsaXN0CgkJaWYg KCEkaXNjdXN0b20gYW5kICEkaXNzdGlja3kpCgkJewoJCQkkZ3JhbmRfdG90YWwgPSBzYWZl X2NvdW50KCd0ZXh0cGF0dGVybicsICR3aGVyZSk7CgkJCSR0b3RhbCA9ICRncmFuZF90b3Rh bCAtICRvZmZzZXQ7CgkJCSRudW1QYWdlcyA9IGNlaWwoJHRvdGFsIC8gJHBhZ2VieSk7CgkJ CSRwZyA9ICghJHBnKSA/IDEgOiAkcGc7CgkJCSRwZ29mZnNldCA9ICRvZmZzZXQgKyAoKCRw ZyAtIDEpICogJHBhZ2VieSkuJywgJzsKCgkJCS8vIHNlbmQgcGFnaW5nIGluZm8gdG8gdHhw Om5ld2VyIGFuZCB0eHA6b2xkZXIKCQkJJHBhZ2VvdXRbJ3MnXQkJCQkJCT0gJHM7CgkJCSRw YWdlb3V0WydjJ10JCQkJCQk9ICRjOwoJCQkkcGFnZW91dFsncGcnXQkJCQkJPSAkcGc7CgkJ CSRwYWdlb3V0Wyd0b3RhbCddCQkJCT0gJHRvdGFsOwoJCQkkcGFnZW91dFsnZ3JhbmRfdG90 YWwnXSA9ICRncmFuZF90b3RhbDsKCQkJJHBhZ2VvdXRbJ251bVBhZ2VzJ10JCT0gJG51bVBh Z2VzOwoKCQkJZ2xvYmFsICR0aGlzcGFnZTsKCgkJCWlmIChlbXB0eSgkdGhpc3BhZ2UpKQoJ CQl7CgkJCQkkdGhpc3BhZ2UgPSAkcGFnZW91dDsKCQkJfQoKCQkJaWYgKCRwZ29ubHkpCgkJ CXsKCQkJCXJldHVybjsKCQkJfQoJCX0KCgkJZWxzZQoJCXsKCQkJJHBnb2Zmc2V0ID0gJG9m ZnNldDsKCQl9CgoJCSRqb2luX3R5cGUgPSAoJHdpdGhmaWxlcykgPyAncmlnaHQnIDogJ2xl ZnQnOwoKCQkkcnMgPSBzYWZlX3F1ZXJ5KCJzZWxlY3QgYS4qLCB1bml4X3RpbWVzdGFtcChh LlBvc3RlZCkgYXMgdVBvc3RlZAoJCQkkbWF0Y2gKCQkJZnJvbSAiLnNhZmVfcGZ4KCd0ZXh0 cGF0dGVybicpLiIgYXMgYSAkam9pbl90eXBlIG91dGVyIGpvaW4gIi5zYWZlX3BmeCgndHhw X2ZpbGUnKS4iIGFzIGYgb24oYS4kdXBtX2ZpbGVfZmllbGQgPSBmLmlkKQoJCQl3aGVyZSAk d2hlcmUgb3JkZXIgYnkgIi5kb1NsYXNoKCRzb3J0KS4iIGxpbWl0ICIuaW50dmFsKCRwZ29m ZnNldCkuIiwgIi5pbnR2YWwoJGxpbWl0KSk7CgoJCS8vIGdldCB0aGUgZm9ybSBuYW1lCgkJ aWYgKCRxIGFuZCAhJGlzY3VzdG9tIGFuZCAhJGlzc3RpY2t5KQoJCXsKCQkJJGZvcm0gPSAo JHNlYXJjaGZvcm0gPyAkc2VhcmNoZm9ybSA6ICdzZWFyY2hfcmVzdWx0cycpOwoJCX0KCgkJ ZWxzZQoJCXsgLy8gcXVlc3Rpb246IHdoYXQgYWJvdXQgYXJ0aWNsZV9jdXN0b20/CgkJCSRm b3JtID0gKCRsaXN0Zm9ybSA/ICRsaXN0Zm9ybSA6ICRmb3JtKTsKCQl9CgoJCWlmICgkcnMp CgkJewoJCQkkY291bnQgPSAwOwoKCQkJJGFydGljbGVzID0gYXJyYXkoKTsKCgkJCXdoaWxl ICgkYSA9IG5leHRSb3coJHJzKSkKCQkJewoJCQkJKyskY291bnQ7CgoJCQkJcG9wdWxhdGVB cnRpY2xlRGF0YSgkYSk7CgoJCQkJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHVQb3N0ZWQsICRs aW1pdDsKCgkJCQkkdGhpc2FydGljbGVbJ2lzX2ZpcnN0J10gPSAoJGNvdW50ID09IDEpOwoJ CQkJJHRoaXNhcnRpY2xlWydpc19sYXN0J10gPSAoJGNvdW50ID09IG51bVJvd3MoJHJzKSk7 CgoJCQkJaWYgKEBjb25zdGFudCgndHhwaW50ZXJmYWNlJykgPT09ICdhZG1pbicgYW5kIGdw cygnRm9ybScpKQoJCQkJewoJCQkJCSRhcnRpY2xlc1tdID0gcGFyc2UoZ3BzKCdGb3JtJykp OwoJCQkJfQoKCQkJCWVsc2VpZiAoJGFsbG93b3ZlcnJpZGUgYW5kICRhWydvdmVycmlkZV9m b3JtJ10pCgkJCQl7CgkJCQkJJGFydGljbGVzW10gPSBwYXJzZShmZXRjaF9mb3JtKCRhWydv dmVycmlkZV9mb3JtJ10pKTsKCQkJCX0KCgkJCQllbHNlCgkJCQl7CgkJCQkJJGFydGljbGVz W10gPSBwYXJzZShmZXRjaF9mb3JtKCRmb3JtKSk7CgkJCQl9CgoJCQkJLy8gc2VuZGluZyB0 aGVzZSB0byBwYWdpbmdfbGluaygpOyBSZXF1aXJlZD8KCQkJCSR1UG9zdGVkID0gJGFbJ3VQ b3N0ZWQnXTsKCQkJCSRsaW1pdCA9ICRsaW1pdDsKCgkJCQl1bnNldCgkR0xPQkFMU1sndGhp c2FydGljbGUnXSk7CgkJCQl1bnNldCgkR0xPQkFMU1sndGhlc2VhdHRzJ10pOyAvL1JlcXVp cmVkPwoJCQl9CgoJCQlyZXR1cm4gam9pbignJywgJGFydGljbGVzKTsKCQl9Cgl9CgovLyAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVfZmlsdGVyRnJvbnRQYWdlKCkKCXsKCQlzdGF0 aWMgJGZpbHRlckZyb250UGFnZTsKCgkJaWYgKGlzc2V0KCRmaWx0ZXJGcm9udFBhZ2UpKQoJ CXsKCQkJcmV0dXJuICRmaWx0ZXJGcm9udFBhZ2U7CgkJfQoKCQkkcnMgPSBzYWZlX2NvbHVt bignbmFtZScsICd0eHBfc2VjdGlvbicsICJvbl9mcm9udHBhZ2UgIT0gJzEnIik7CgoJCWlm ICgkcnMpCgkJewoJCQlmb3JlYWNoICgkcnMgYXMgJG5hbWUpCgkJCXsKCQkJCSRmaWx0ZXJz W10gPSAiIGFuZCBhLlNlY3Rpb24gIT0gJyIuZG9TbGFzaCgkbmFtZSkuIiciOwoJCQl9CgoJ CQkkZmlsdGVyRnJvbnRQYWdlID0gam9pbignICcsICRmaWx0ZXJzKTsKCQl9CgoJCWVsc2UK CQl7CgkJCSRmaWx0ZXJGcm9udFBhZ2UgPSBmYWxzZTsKCQl9CgoJCXJldHVybiAkZmlsdGVy RnJvbnRQYWdlOwoJfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIHVwbV9maWxlX2ZpbHRlclNl YXJjaCgpCgl7CgkJJHJzID0gc2FmZV9jb2x1bW4oJ25hbWUnLCAndHhwX3NlY3Rpb24nLCAi c2VhcmNoYWJsZSAhPSAnMSciKTsKCgkJaWYgKCRycykKCQl7CgkJCWZvcmVhY2ggKCRycyBh cyAkbmFtZSkKCQkJewoJCQkJJGZpbHRlcnNbXSA9ICIgYW5kIGEuU2VjdGlvbiAhPSAnIi5k b1NsYXNoKCRuYW1lKS4iJyI7CgkJCX0KCgkJCXJldHVybiBqb2luKCcgJywgJGZpbHRlcnMp OwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0aW9uIHVwbV9m aWxlX2FydGljbGVfY3VzdG9tKCRhdHRzID0gYXJyYXkoKSkKCXsKCQlyZXR1cm4gdXBtX2Zp bGVfcGFyc2VBcnRpY2xlcygkYXR0cywgJzEnKTsKCX0KCi8vIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCglmdW5jdGlv biB1cG1fZmlsZV9wYXJzZUFydGljbGVzKCRhdHRzLCAkaXNjdXN0b20gPSAnJykKCXsKCQln bG9iYWwgJHByZXRleHQsICRpc19hcnRpY2xlX2xpc3Q7CgoJCSRvbGRfaWFsID0gJGlzX2Fy dGljbGVfbGlzdDsKCgkJJGlzX2FydGljbGVfbGlzdCA9ICgkcHJldGV4dFsnaWQnXSAmJiAh JGlzY3VzdG9tKSA/IGZhbHNlIDogdHJ1ZTsKCgkJYXJ0aWNsZV9wdXNoKCk7CgoJCSRyID0g KCRpc19hcnRpY2xlX2xpc3QpID8gdXBtX2ZpbGVfZG9BcnRpY2xlcygkYXR0cywgJGlzY3Vz dG9tKSA6IGRvQXJ0aWNsZSgkYXR0cyk7CgoJCWFydGljbGVfcG9wKCk7CgoJCSRpc19hcnRp Y2xlX2xpc3QgPSAkb2xkX2lhbDsKCgkJcmV0dXJuICRyOwoJfQoKCi8vIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCglm dW5jdGlvbiB1cG1fZmlsZV9wcmVmcygkZXZlbnQsICRzdGVwKQoJewoJCWdsb2JhbCAkcHJl ZnM7CgoJCWlmICgkc3RlcCA9PSAndXBkYXRlJykKCQl7CgkJCSRmaWVsZCA9IGRvU2xhc2go c3RyaXBfdGFncyhwcygnZmllbGQnKSkpOwoKCQkJc2FmZV91cGRhdGUoJ3R4cF9wcmVmcycs ICJ2YWwgPSAnJGZpZWxkJyIsICJuYW1lID0gJ3VwbV9maWxlX2ZpZWxkJyIpOwoJCX0KCgkJ ZXh0cmFjdChnZXRfcHJlZnMoKSk7CgoJCXBhZ2V0b3AoJ3VwbV9maWxlJy5zcC5nVHh0KCdw cmVmcycpLCAoJHN0ZXAgPT0gJ3VwZGF0ZScgPyBnVHh0KCdwcmVmZXJlbmNlc19zYXZlZCcp IDogJycpKTsKCgkJJG9wdGlvbnMgPSBhcnJheSgKCQkJICdjdXN0b21fMScgPT4gJHByZWZz WydjdXN0b21fMV9zZXQnXSwKCQkJICdjdXN0b21fMicgPT4gJHByZWZzWydjdXN0b21fMl9z ZXQnXSwKCQkJICdjdXN0b21fMycgPT4gJHByZWZzWydjdXN0b21fM19zZXQnXSwKCQkJICdj dXN0b21fNCcgPT4gJHByZWZzWydjdXN0b21fNF9zZXQnXSwKCQkJICdjdXN0b21fNScgPT4g JHByZWZzWydjdXN0b21fNV9zZXQnXSwKCQkJICdjdXN0b21fNicgPT4gJHByZWZzWydjdXN0 b21fNl9zZXQnXSwKCQkJICdjdXN0b21fNycgPT4gJHByZWZzWydjdXN0b21fN19zZXQnXSwK CQkJICdjdXN0b21fOCcgPT4gJHByZWZzWydjdXN0b21fOF9zZXQnXSwKCQkJICdjdXN0b21f OScgPT4gJHByZWZzWydjdXN0b21fOV9zZXQnXSwKCQkJJ2N1c3RvbV8xMCcgPT4gJHByZWZz WydjdXN0b21fMTBfc2V0J10sCgkJKTsKCgkJJG9wdGlvbl9saXN0ID0gYXJyYXkoKTsKCgkJ Zm9yZWFjaCAoJG9wdGlvbnMgYXMgJGtleSA9PiAkdmFsdWUpCgkJewoJCQlpZiAoJGtleSA9 PSAkdXBtX2ZpbGVfZmllbGQpCgkJCXsKCQkJCSRvcHRpb25fbGlzdFtdID0gbi50Lic8b3B0 aW9uIHZhbHVlPSInLiRrZXkuJyIgc2VsZWN0ZWQ9InNlbGVjdGVkIj4nLiR2YWx1ZS4nPC9v cHRpb24+JzsKCQkJfQoKCQkJZWxzZWlmICghZW1wdHkoJHZhbHVlKSkKCQkJewoJCQkJJG9w dGlvbl9saXN0W10gPSBuLnQuJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWx1ZS4n PC9vcHRpb24+JzsKCQkJfQoJCX0KCgkJZWNobyBuLic8ZGl2IHN0eWxlPSJtYXJnaW46IDNl bSBhdXRvIGF1dG8gYXV0bzsgd2lkdGg6IDE2ZW07Ij4nLgoJCW4uaGVkKCd1cG1fZmlsZScu c3AuZ1R4dCgncHJlZnMnKSwnMScpLgoJCW4ubi5mb3JtKAoJCQluLmVJbnB1dCgndXBtX2Zp bGVfcHJlZnMnKS4KCQkJbi5zSW5wdXQoJ3VwZGF0ZScpLgoJCQluLnVwbV9maWxlX2dUeHQo J2N1c3RvbV9maWVsZCcpLmJyLm4uJzxzZWxlY3QgbmFtZT0iZmllbGQiIGNsYXNzPSJsaXN0 Ij4nLmpvaW4obiwgJG9wdGlvbl9saXN0KS4nPC9zZWxlY3Q+Jy4KCQkJYnIuYnIuCgkJCW4u ZklucHV0KCdzdWJtaXQnLCAndXBkYXRlJywgJ1VwZGF0ZScsICdzbWFsbGVyYm94JykKCQkp Lm4uJzwvZGl2Pic7Cgl9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVfaW5zdGFs bCgpCgl7CgkJZ2xvYmFsICRwcmVmczsKCgkJJGZpZWxkID0gJ2N1c3RvbV8xJzsKCgkJLy8g Zm9yIHVwZ3JhZGVycwoJCWlmIChpc3NldCgkcHJlZnNbJ3VwbV9maWxlX3BhY2tldHNfZmll bGQnXSkpCgkJewoJCQkkZmllbGQgPSAkcHJlZnNbJ3VwbV9maWxlX3BhY2tldHNfZmllbGQn XTsKCgkJCXNhZmVfZGVsZXRlKCd0eHBfcHJlZnMnLCAibmFtZSA9ICd1cG1fZmlsZV9wYWNr ZXRzX2ZpZWxkJyBsaW1pdCAxIik7CgkJfQoKCQlpZiAoIWlzc2V0KCRwcmVmc1sndXBtX2Zp bGVfZmllbGQnXSkpCgkJewoJCQlzYWZlX2luc2VydCgndHhwX3ByZWZzJywgIgoJCQkJbmFt ZSA9ICd1cG1fZmlsZV9maWVsZCcsCgkJCQl2YWwgPSAnJGZpZWxkJywKCQkJCWh0bWwgPSAn dGV4dF9pbnB1dCcsCgkJCQlwcmVmc19pZCA9IDEsCgkJCQl0eXBlID0gMiwKCQkJCWV2ZW50 ID0gJ2FkbWluJywKCQkJCXBvc2l0aW9uID0gMAoJCQkiKTsKCQl9Cgl9CgovLyAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CgoJZnVuY3Rpb24gdXBtX2ZpbGVfZ1R4dCgkdmFyLCAkYXR0cyA9IGFycmF5KCkpCgl7CgkJ JGxhbmcgPSBhcnJheSgKCQkJJ2N1c3RvbV9maWVsZCcgPT4gJ0ZpbGUgQ3VzdG9tIEZpZWxk JywKCQkpOwoKCQlyZXR1cm4gc3RydHIoJGxhbmdbJHZhcl0sICRhdHRzKTsKCX0iO3M6NDoi aGVscCI7czo1MDU1OiI8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4scHJv amVjdGlvbiI+CjwhLS0KdmFyIHsKcGFkZGluZzogMC4xZW07CmZvbnQtc3R5bGU6IG5vcm1h bDsKZm9udC13ZWlnaHQ6IGJvbGQ7CmZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CmJhY2tncm91 bmQtY29sb3I6ICNlZWU7Cn0KCnRhYmxlLnVwbV90YWdfYXR0cyB7Cm1hcmdpbjogMCAwIDE1 cHggMDsKYm9yZGVyOiAxcHggc29saWQgI2VlZTsKYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBz ZTsKfQoKdGFibGUudXBtX3RhZ19hdHRzIGNhcHRpb24gewpwYWRkaW5nOiAwLjVlbTsKZm9u dC13ZWlnaHQ6IGJvbGQ7CnRleHQtYWxpZ246IGxlZnQ7CmJhY2tncm91bmQtY29sb3I6ICNk ZGQ7Cn0KCnRhYmxlLnVwbV90YWdfYXR0cyB0ciB7CmJvcmRlci1ib3R0b206IDFweCBzb2xp ZCAjZWVlOwp9Cgp0YWJsZS51cG1fdGFnX2F0dHMgdGgsIHRhYmxlLnVwbV90YWdfYXR0cyB0 ZCB7Cm1hcmdpbjogMDsKcGFkZGluZzogMC41ZW0gMWVtOwp9Cgp0YWJsZS51cG1fdGFnX2F0 dHMgdGggewpmb250LXdlaWdodDogbm9ybWFsOwp0ZXh0LWFsaWduOiBsZWZ0OwpiYWNrZ3Jv dW5kLWNvbG9yOiAjZWVlOwp9CgotLT4KPC9zdHlsZT4KCjxoMT51cG1fZmlsZTwvaDE+Cgo8 b2wgaWQ9InN0YXJ0Ij4KCTxsaT48YSBocmVmPSIjaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rp b248L2E+PC9saT4KCTxsaT48YSBocmVmPSIjdGFncyI+VGFnczwvYT48L2xpPgoJPGxpPjxh IGhyZWY9IiNmb290bm90ZXMiPkZvb3Rub3RlczwvYT48L2xpPgo8L29sPgoKCgo8aDIgaWQ9 ImludHJvIj5JbnRyb2R1Y3Rpb248L2gyPgoKPHA+VGhpcyBwbHVnaW4gYWxsb3dzIHlvdSB0 byBhc3NvY2lhdGUgc2luZ2xlIG9yIG11bHRpcGxlIGZpbGVzIHdpdGggYW4gYXJ0aWNsZS4g SXQgcmVxdWlyZXMKCXlvdSB0byB1c2Ugb25lIG9mIHlvdXIgY3VzdG9tIGZpZWxkcyB0byBo b2xkIHRoZSBmaWxlIGxpc3QuIFRoZSBmaWVsZCYjODIxNztzIGh1bWFuLWZyaWVuZGx5Cglu YW1lIG1heSBiZSBhbnl0aGluZyB5b3Ugd2lzaC4gQWxsIHRoYXQgeW91IG5lZWQgdG8gZG8g aXMgcGljayBvbmUgdG8gYmUgdXNlZCwgdGhlbiB1cGRhdGUKCXRoZSBwbHVnaW4mIzgyMTc7 cyBwcmVmZXJlbmNlIHRvIHBvaW50IHRvIGl0LjwvcD4KCjxoMiBpZD0idGFncyI+VGFnczwv aDI+Cgo8dGFibGUgY2xhc3M9InVwbV90YWdfYXR0cyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxz cGFjaW5nPSIwIj4KCgk8Y2FwdGlvbj51cG1fYXJ0aWNsZV9maWxlX2xpc3Q8L2NhcHRpb24+ CgoJPHRyPgoJCTx0aD5BdHRyaWJ1dGU8L3RoPgoJCTx0aD5EZXNjcmlwdGlvbjwvdGg+CgkJ PHRoPlJlcXVpcmVkPzwvdGg+CgkJPHRoPkF2YWlsYWJsZSBWYWx1ZXM8L3RoPgoJCTx0aD5E ZWZhdWx0IFZhbHVlPC90aD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5icmVhazwvdGQ+CgkJPHRk PihYKUhUTUwgdGFnIHRvIGJlIHVzZWQgZm9yIGxpbmUgYnJlYWtzLjwvdGQ+CgkJPHRkPk5v PC90ZD4KCQk8dGQ+QW55IHZhbGlkIChYKUhUTUwgZWxlbWVudCBuYW1lLjwvdGQ+CgkJPHRk Pjx2YXI+YnI8L3Zhcj48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPmNsYXNzPC90ZD4KCQk8 dGQ+KFgpSFRNTC9DU1MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGZpbGUgb3IgaWYgc3BlY2lm aWVkLCB0aGUgPHZhcj53cmFwdGFnPC92YXI+LjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+ QW55IHZhbGlkIChYKUhUTUwvQ1NTIGNsYXNzIG5hbWUuPC90ZD4KCQk8dGQ+VW5zZXQ8L3Rk PgoJPC90cj4KCgk8dHI+CgkJPHRkPmlkPC90ZD4KCQk8dGQ+UmVzdHJpY3QgdG8gZmlsZXMg Zm9yIHNwZWNpZmljIGFydGljbGUuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgdmFs aWQgYXJ0aWNsZSBJRCBudW1iZXIuPC90ZD4KCQk8dGQ+VW5zZXQuIFRoZSBjdXJyZW50IGFy dGljbGUgaXMgdXNlZC48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPmZpbGVfY2F0ZWdvcnk8 L3RkPgoJCTx0ZD5SZXN0cmljdCB0byBmaWxlcyB3aXRoIHNwZWNpZmllZCBjYXRlZ29yeS48 L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxpZCBmaWxlIGNhdGVnb3J5IG5hbWUu PC90ZD4KCQk8dGQ+VW5zZXQ8L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPmZvcm08L3RkPgoJ CTx0ZD5DdXN0b21pemUgdGhlIGZpbGUgZGV0YWlscyBvdXRwdXQuPC90ZD4KCQk8dGQ+Tm88 L3RkPgoJCTx0ZD5BbnkgdmFsaWQgZm9ybSBvZiB0aGUgdHlwZSAmIzgyMjA7ZmlsZSYjODIy MTsuPC90ZD4KCQk8dGQ+PHZhcj5maWxlczwvdmFyPjwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8 dGQ+bGFiZWw8L3RkPgoJCTx0ZD5MYWJlbCBmb3IgdGhlIHRvcCBvZiB0aGUgbGlzdC48L3Rk PgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSBkZXNpcmVkIHRleHQuPC90ZD4KCQk8dGQ+VW5z ZXQ8L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPmxhYmVsdGFnPC90ZD4KCQk8dGQ+KFgpSFRN TCB0YWcgdG8gd3JhcCBhcm91bmQgdGhlIGxhYmVsLjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8 dGQ+QW55IHZhbGlkIChYKUhUTUwgZWxlbWVudCBuYW1lPC90ZD4KCQk8dGQ+VW5zZXQ8L3Rk PgoJPC90cj4KCgk8dHI+CgkJPHRkPmxpbWl0PC90ZD4KCQk8dGQ+TWF4aW11bSBudW1iZXIg b2YgZmlsZXMgdG8gZGlzcGxheS48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxp ZCB3aG9sZSBudW1iZXIuPC90ZD4KCQk8dGQ+VW5zZXQgKGRpc3BsYXkgYWxsKTwvdGQ+Cgk8 L3RyPgoKCTx0cj4KCQk8dGQ+b2Zmc2V0PC90ZD4KCQk8dGQ+RnJvbSB0aGUgYmVnaW5uaW5n IG9mIHRoZSBsaXN0LCB0aGUgbnVtYmVyIG9mIGZpbGVzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUg bGlzdC48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxpZCB3aG9sZSBudW1iZXIu PC90ZD4KCQk8dGQ+VW5zZXQgKGRpc3BsYXkgYWxsKTwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8 dGQ+c29ydDwvdGQ+CgkJPHRkPkhvdyB0byBzb3J0IHJldHJpZXZlZCBmaWxlcyAoY29tbWEt c2VwYXJhdGVkKS48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPgoJCQk8dWw+CgkJCQk8bGk+ PHZhcj5jYXRlZ29yeTwvdmFyPjwvbGk+CgkJCQk8bGk+PHZhcj5kZXNjcmlwdGlvbjwvdmFy PjwvbGk+CgkJCQk8bGk+PHZhcj5kb3dubG9hZHM8L3Zhcj48L2xpPgoJCQkJPGxpPjx2YXI+ ZmlsZW5hbWU8L3Zhcj48L2xpPgoJCQkJPGxpPjx2YXI+aWQ8L3Zhcj48L2xpPgoJCQk8L3Vs PgoJCQk8cD48dmFyPmFzYzwvdmFyPmVuZGluZyBvciA8dmFyPmRlc2M8L3Zhcj5lbmRpbmc8 L3A+CgkJPC90ZD4KCQk8dGQ+U29ydHMgYnkgdGhlIG9yZGVyIGVudGVyZWQgaW50byBhcnRp Y2xlIGZpbGUgcGFja2V0cyBmaWVsZC48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPndyYXB0 YWc8L3RkPgoJCTx0ZD4oWClIVE1MIHRhZyB0byB3cmFwIGFyb3VuZCB0aGUgZmlsZSAob3Ig dGhlIGxpc3QsIGlmIHVzaW5nIG11bHRpcGxlIGZpbGVzKS48L3RkPgoJCTx0ZD5ObzwvdGQ+ CgkJPHRkPkFueSB2YWxpZCAoWClIVE1MIGVsZW1lbnQgbmFtZS48L3RkPgoJCTx0ZD5VbnNl dDwvdGQ+Cgk8L3RyPgo8L3RhYmxlPgoKPHA+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFy ZSBpZGVudGljYWwgdG8gdGhvc2UgYmVsb25naW5nIHRvIHRoZSBidWlsdC1pbiB0YWdzPHN1 cD5bPGEgaHJlZj0iI2ZuMSI+MTwvYT5dPC9zdXA+LCB3aXRoIG9uZSBhZGRpdGlvbiBhbmQg b25lIHNsaWdodGx5IG1vZGlmaWVkOjwvcD4KCjx0YWJsZSBjbGFzcz0idXBtX3RhZ19hdHRz IiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoKCTxjYXB0aW9uPnVwbV9maWxl X2FydGljbGUgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij5hbmQ8L3NwYW4+ IHVwbV9maWxlX2FydGljbGVfY3VzdG9tPC9jYXB0aW9uPgoKCTx0cj4KCQk8dGg+QXR0cmli dXRlPC90aD4KCQk8dGg+RGVzY3JpcHRpb248L3RoPgoJCTx0aD5SZXF1aXJlZD88L3RoPgoJ CTx0aD5BdmFpbGFibGUgVmFsdWVzPC90aD4KCQk8dGg+RGVmYXVsdCBWYWx1ZTwvdGg+Cgk8 L3RyPgoKCTx0cj4KCQk8dGQ+c29ydDwvdGQ+CgkJPHRkPkhvdyB0byBzb3J0IHJldHJpZXZl ZCBmaWxlcyAoY29tbWEtc2VwYXJhdGVkKS48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFu eSBzb3J0IHZhbHVlIGF2YWlsYWJsZSBmb3IgYXJ0aWNsZTxzdXA+WzxhIGhyZWY9IiNmbjEi PjE8L2E+XTwvc3VwPiBhbmQgZmlsZV9kb3dubG9hZF9saXN0PHN1cD5bPGEgaHJlZj0iI2Zu MiI+MjwvYT5dPC9zdXA+PC90ZD4KCQk8dGQ+PHZhcj5kb3dubG9hZHMgZGVzYywgUG9zdGVk IGRlc2M8L3Zhcj48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPndpdGhmaWxlczwvdGQ+CgkJ PHRkPk9ubHkgcmV0dXJuIGFydGljbGVzIHdpdGggb25lIG9yIG1vcmUgYXNzb2NpYXRlZCBm aWxlcy48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPjx2YXI+MTwvdmFyPiAoeWVzKSBvciA8 dmFyPjA8L3Zhcj4gKG5vKTwvdGQ+CgkJPHRkPjx2YXI+MDwvdmFyPjwvdGQ+Cgk8L3RyPgoK PC90YWJsZT4KCjxwPjxhIGhyZWY9IiNzdGFydCIgdGl0bGU9Ikp1bXAgYmFjayBjb250ZW50 cyBsaXN0Ij4mIzg2MTc7PC9hPjwvcD4KCgoKPGgyIGlkPSJmb290bm90ZXMiPkZvb3Rub3Rl czwvaDI+Cgo8b2w+Cgk8bGkgaWQ9ImZuMSI+VGV4dEJvb2s6IDxhIGhyZWY9Imh0dHA6Ly90 ZXh0cGF0dGVybi5uZXQvd2lraS9pbmRleC5waHA/dGl0bGU9VHhwOmFydGljbGVfLyI+YXJ0 aWNsZTwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVybi5uZXQvd2lraS9pbmRl eC5waHA/dGl0bGU9VHhwOmFydGljbGVfY3VzdG9tXy8iPmFydGljbGVfY3VzdG9tPC9hPjwv bGk+Cgk8bGkgaWQ9ImZuMiI+VGV4dEJvb2s6IDxhIGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVy bi5uZXQvd2lraS9pbmRleC5waHA/dGl0bGU9VHhwOmZpbGVfZG93bmxvYWRfbGlzdF8vIj5m aWxlX2Rvd25sb2FkX2xpc3Q8L2E+PC9saT4KPC9vbD4KCjxwPjxhIGhyZWY9IiNzdGFydCIg dGl0bGU9Ikp1bXAgYmFjayBjb250ZW50cyBsaXN0Ij4mIzg2MTc7PC9hPjwvcD4iO3M6ODoi aGVscF9yYXciO3M6NTA1NToiPHN0eWxlIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVu LHByb2plY3Rpb24iPgo8IS0tCnZhciB7CnBhZGRpbmc6IDAuMWVtOwpmb250LXN0eWxlOiBu b3JtYWw7CmZvbnQtd2VpZ2h0OiBib2xkOwpmb250LWZhbWlseTogbW9ub3NwYWNlOwpiYWNr Z3JvdW5kLWNvbG9yOiAjZWVlOwp9Cgp0YWJsZS51cG1fdGFnX2F0dHMgewptYXJnaW46IDAg MCAxNXB4IDA7CmJvcmRlcjogMXB4IHNvbGlkICNlZWU7CmJvcmRlci1jb2xsYXBzZTogY29s bGFwc2U7Cn0KCnRhYmxlLnVwbV90YWdfYXR0cyBjYXB0aW9uIHsKcGFkZGluZzogMC41ZW07 CmZvbnQtd2VpZ2h0OiBib2xkOwp0ZXh0LWFsaWduOiBsZWZ0OwpiYWNrZ3JvdW5kLWNvbG9y OiAjZGRkOwp9Cgp0YWJsZS51cG1fdGFnX2F0dHMgdHIgewpib3JkZXItYm90dG9tOiAxcHgg c29saWQgI2VlZTsKfQoKdGFibGUudXBtX3RhZ19hdHRzIHRoLCB0YWJsZS51cG1fdGFnX2F0 dHMgdGQgewptYXJnaW46IDA7CnBhZGRpbmc6IDAuNWVtIDFlbTsKfQoKdGFibGUudXBtX3Rh Z19hdHRzIHRoIHsKZm9udC13ZWlnaHQ6IG5vcm1hbDsKdGV4dC1hbGlnbjogbGVmdDsKYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsKfQoKLS0+Cjwvc3R5bGU+Cgo8aDE+dXBtX2ZpbGU8L2gx PgoKPG9sIGlkPSJzdGFydCI+Cgk8bGk+PGEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9k dWN0aW9uPC9hPjwvbGk+Cgk8bGk+PGEgaHJlZj0iI3RhZ3MiPlRhZ3M8L2E+PC9saT4KCTxs aT48YSBocmVmPSIjZm9vdG5vdGVzIj5Gb290bm90ZXM8L2E+PC9saT4KPC9vbD4KCgoKPGgy IGlkPSJpbnRybyI+SW50cm9kdWN0aW9uPC9oMj4KCjxwPlRoaXMgcGx1Z2luIGFsbG93cyB5 b3UgdG8gYXNzb2NpYXRlIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlcyB3aXRoIGFuIGFydGlj bGUuIEl0IHJlcXVpcmVzCgl5b3UgdG8gdXNlIG9uZSBvZiB5b3VyIGN1c3RvbSBmaWVsZHMg dG8gaG9sZCB0aGUgZmlsZSBsaXN0LiBUaGUgZmllbGQmIzgyMTc7cyBodW1hbi1mcmllbmRs eQoJbmFtZSBtYXkgYmUgYW55dGhpbmcgeW91IHdpc2guIEFsbCB0aGF0IHlvdSBuZWVkIHRv IGRvIGlzIHBpY2sgb25lIHRvIGJlIHVzZWQsIHRoZW4gdXBkYXRlCgl0aGUgcGx1Z2luJiM4 MjE3O3MgcHJlZmVyZW5jZSB0byBwb2ludCB0byBpdC48L3A+Cgo8aDIgaWQ9InRhZ3MiPlRh Z3M8L2gyPgoKPHRhYmxlIGNsYXNzPSJ1cG1fdGFnX2F0dHMiIGNlbGxwYWRkaW5nPSIwIiBj ZWxsc3BhY2luZz0iMCI+CgoJPGNhcHRpb24+dXBtX2FydGljbGVfZmlsZV9saXN0PC9jYXB0 aW9uPgoKCTx0cj4KCQk8dGg+QXR0cmlidXRlPC90aD4KCQk8dGg+RGVzY3JpcHRpb248L3Ro PgoJCTx0aD5SZXF1aXJlZD88L3RoPgoJCTx0aD5BdmFpbGFibGUgVmFsdWVzPC90aD4KCQk8 dGg+RGVmYXVsdCBWYWx1ZTwvdGg+Cgk8L3RyPgoKCTx0cj4KCQk8dGQ+YnJlYWs8L3RkPgoJ CTx0ZD4oWClIVE1MIHRhZyB0byBiZSB1c2VkIGZvciBsaW5lIGJyZWFrcy48L3RkPgoJCTx0 ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxpZCAoWClIVE1MIGVsZW1lbnQgbmFtZS48L3RkPgoJ CTx0ZD48dmFyPmJyPC92YXI+PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5jbGFzczwvdGQ+ CgkJPHRkPihYKUhUTUwvQ1NTIGNsYXNzIHRvIGFwcGx5IHRvIHRoZSBmaWxlIG9yIGlmIHNw ZWNpZmllZCwgdGhlIDx2YXI+d3JhcHRhZzwvdmFyPi48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJ PHRkPkFueSB2YWxpZCAoWClIVE1ML0NTUyBjbGFzcyBuYW1lLjwvdGQ+CgkJPHRkPlVuc2V0 PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5pZDwvdGQ+CgkJPHRkPlJlc3RyaWN0IHRvIGZp bGVzIGZvciBzcGVjaWZpYyBhcnRpY2xlLjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+QW55 IHZhbGlkIGFydGljbGUgSUQgbnVtYmVyLjwvdGQ+CgkJPHRkPlVuc2V0LiBUaGUgY3VycmVu dCBhcnRpY2xlIGlzIHVzZWQuPC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5maWxlX2NhdGVn b3J5PC90ZD4KCQk8dGQ+UmVzdHJpY3QgdG8gZmlsZXMgd2l0aCBzcGVjaWZpZWQgY2F0ZWdv cnkuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgdmFsaWQgZmlsZSBjYXRlZ29yeSBu YW1lLjwvdGQ+CgkJPHRkPlVuc2V0PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5mb3JtPC90 ZD4KCQk8dGQ+Q3VzdG9taXplIHRoZSBmaWxlIGRldGFpbHMgb3V0cHV0LjwvdGQ+CgkJPHRk Pk5vPC90ZD4KCQk8dGQ+QW55IHZhbGlkIGZvcm0gb2YgdGhlIHR5cGUgJiM4MjIwO2ZpbGUm IzgyMjE7LjwvdGQ+CgkJPHRkPjx2YXI+ZmlsZXM8L3Zhcj48L3RkPgoJPC90cj4KCgk8dHI+ CgkJPHRkPmxhYmVsPC90ZD4KCQk8dGQ+TGFiZWwgZm9yIHRoZSB0b3Agb2YgdGhlIGxpc3Qu PC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgZGVzaXJlZCB0ZXh0LjwvdGQ+CgkJPHRk PlVuc2V0PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5sYWJlbHRhZzwvdGQ+CgkJPHRkPihY KUhUTUwgdGFnIHRvIHdyYXAgYXJvdW5kIHRoZSBsYWJlbC48L3RkPgoJCTx0ZD5ObzwvdGQ+ CgkJPHRkPkFueSB2YWxpZCAoWClIVE1MIGVsZW1lbnQgbmFtZTwvdGQ+CgkJPHRkPlVuc2V0 PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5saW1pdDwvdGQ+CgkJPHRkPk1heGltdW0gbnVt YmVyIG9mIGZpbGVzIHRvIGRpc3BsYXkuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD5Bbnkg dmFsaWQgd2hvbGUgbnVtYmVyLjwvdGQ+CgkJPHRkPlVuc2V0IChkaXNwbGF5IGFsbCk8L3Rk PgoJPC90cj4KCgk8dHI+CgkJPHRkPm9mZnNldDwvdGQ+CgkJPHRkPkZyb20gdGhlIGJlZ2lu bmluZyBvZiB0aGUgbGlzdCwgdGhlIG51bWJlciBvZiBmaWxlcyB0byBleGNsdWRlIGZyb20g dGhlIGxpc3QuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgdmFsaWQgd2hvbGUgbnVt YmVyLjwvdGQ+CgkJPHRkPlVuc2V0IChkaXNwbGF5IGFsbCk8L3RkPgoJPC90cj4KCgk8dHI+ CgkJPHRkPnNvcnQ8L3RkPgoJCTx0ZD5Ib3cgdG8gc29ydCByZXRyaWV2ZWQgZmlsZXMgKGNv bW1hLXNlcGFyYXRlZCkuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD4KCQkJPHVsPgoJCQkJ PGxpPjx2YXI+Y2F0ZWdvcnk8L3Zhcj48L2xpPgoJCQkJPGxpPjx2YXI+ZGVzY3JpcHRpb248 L3Zhcj48L2xpPgoJCQkJPGxpPjx2YXI+ZG93bmxvYWRzPC92YXI+PC9saT4KCQkJCTxsaT48 dmFyPmZpbGVuYW1lPC92YXI+PC9saT4KCQkJCTxsaT48dmFyPmlkPC92YXI+PC9saT4KCQkJ PC91bD4KCQkJPHA+PHZhcj5hc2M8L3Zhcj5lbmRpbmcgb3IgPHZhcj5kZXNjPC92YXI+ZW5k aW5nPC9wPgoJCTwvdGQ+CgkJPHRkPlNvcnRzIGJ5IHRoZSBvcmRlciBlbnRlcmVkIGludG8g YXJ0aWNsZSBmaWxlIHBhY2tldHMgZmllbGQuPC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD53 cmFwdGFnPC90ZD4KCQk8dGQ+KFgpSFRNTCB0YWcgdG8gd3JhcCBhcm91bmQgdGhlIGZpbGUg KG9yIHRoZSBsaXN0LCBpZiB1c2luZyBtdWx0aXBsZSBmaWxlcykuPC90ZD4KCQk8dGQ+Tm88 L3RkPgoJCTx0ZD5BbnkgdmFsaWQgKFgpSFRNTCBlbGVtZW50IG5hbWUuPC90ZD4KCQk8dGQ+ VW5zZXQ8L3RkPgoJPC90cj4KPC90YWJsZT4KCjxwPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRl cyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGJlbG9uZ2luZyB0byB0aGUgYnVpbHQtaW4gdGFn czxzdXA+WzxhIGhyZWY9IiNmbjEiPjE8L2E+XTwvc3VwPiwgd2l0aCBvbmUgYWRkaXRpb24g YW5kIG9uZSBzbGlnaHRseSBtb2RpZmllZDo8L3A+Cgo8dGFibGUgY2xhc3M9InVwbV90YWdf YXR0cyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCgk8Y2FwdGlvbj51cG1f ZmlsZV9hcnRpY2xlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogbm9ybWFsOyI+YW5kPC9z cGFuPiB1cG1fZmlsZV9hcnRpY2xlX2N1c3RvbTwvY2FwdGlvbj4KCgk8dHI+CgkJPHRoPkF0 dHJpYnV0ZTwvdGg+CgkJPHRoPkRlc2NyaXB0aW9uPC90aD4KCQk8dGg+UmVxdWlyZWQ/PC90 aD4KCQk8dGg+QXZhaWxhYmxlIFZhbHVlczwvdGg+CgkJPHRoPkRlZmF1bHQgVmFsdWU8L3Ro PgoJPC90cj4KCgk8dHI+CgkJPHRkPnNvcnQ8L3RkPgoJCTx0ZD5Ib3cgdG8gc29ydCByZXRy aWV2ZWQgZmlsZXMgKGNvbW1hLXNlcGFyYXRlZCkuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0 ZD5Bbnkgc29ydCB2YWx1ZSBhdmFpbGFibGUgZm9yIGFydGljbGU8c3VwPls8YSBocmVmPSIj Zm4xIj4xPC9hPl08L3N1cD4gYW5kIGZpbGVfZG93bmxvYWRfbGlzdDxzdXA+WzxhIGhyZWY9 IiNmbjIiPjI8L2E+XTwvc3VwPjwvdGQ+CgkJPHRkPjx2YXI+ZG93bmxvYWRzIGRlc2MsIFBv c3RlZCBkZXNjPC92YXI+PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD53aXRoZmlsZXM8L3Rk PgoJCTx0ZD5Pbmx5IHJldHVybiBhcnRpY2xlcyB3aXRoIG9uZSBvciBtb3JlIGFzc29jaWF0 ZWQgZmlsZXMuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD48dmFyPjE8L3Zhcj4gKHllcykg b3IgPHZhcj4wPC92YXI+IChubyk8L3RkPgoJCTx0ZD48dmFyPjA8L3Zhcj48L3RkPgoJPC90 cj4KCjwvdGFibGU+Cgo8cD48YSBocmVmPSIjc3RhcnQiIHRpdGxlPSJKdW1wIGJhY2sgY29u dGVudHMgbGlzdCI+JiM4NjE3OzwvYT48L3A+CgoKCjxoMiBpZD0iZm9vdG5vdGVzIj5Gb290 bm90ZXM8L2gyPgoKPG9sPgoJPGxpIGlkPSJmbjEiPlRleHRCb29rOiA8YSBocmVmPSJodHRw Oi8vdGV4dHBhdHRlcm4ubmV0L3dpa2kvaW5kZXgucGhwP3RpdGxlPVR4cDphcnRpY2xlXy8i PmFydGljbGU8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vdGV4dHBhdHRlcm4ubmV0L3dpa2kv aW5kZXgucGhwP3RpdGxlPVR4cDphcnRpY2xlX2N1c3RvbV8vIj5hcnRpY2xlX2N1c3RvbTwv YT48L2xpPgoJPGxpIGlkPSJmbjIiPlRleHRCb29rOiA8YSBocmVmPSJodHRwOi8vdGV4dHBh dHRlcm4ubmV0L3dpa2kvaW5kZXgucGhwP3RpdGxlPVR4cDpmaWxlX2Rvd25sb2FkX2xpc3Rf LyI+ZmlsZV9kb3dubG9hZF9saXN0PC9hPjwvbGk+Cjwvb2w+Cgo8cD48YSBocmVmPSIjc3Rh cnQiIHRpdGxlPSJKdW1wIGJhY2sgY29udGVudHMgbGlzdCI+JiM4NjE3OzwvYT48L3A+Ijtz OjE1OiJhbGxvd19odG1sX2hlbHAiO2k6MTtzOjM6Im1kNSI7czozMjoiYTYxOTQ0MzM4YTFk MWM4YzA2NTljZDI4OWVlMzA2MGYiO30=