# Name: smd_imagery v0.10 # Type: Admin/AJAX plugin # A Textpattern CMS plugin for managing images in the Write panel. # Author: Stef Dawson # URL: http://stefdawson.com/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern CMS - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMjp7czo0OiJuYW1lIjtzOjExOiJzbWRfaW1hZ2VyeSI7czo2OiJhdXRob3IiO3M6MTE6 IlN0ZWYgRGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vc3RlZmRhd3Nv bi5jb20vIjtzOjc6InZlcnNpb24iO3M6NDoiMC4xMCI7czoxMToiZGVzY3JpcHRpb24iO3M6 NjQ6IkEgVGV4dHBhdHRlcm4gQ01TIHBsdWdpbiBmb3IgbWFuYWdpbmcgaW1hZ2VzIGluIHRo ZSBXcml0ZSBwYW5lbC4iO3M6NDoiY29kZSI7czoyODM3NjoiLyoqCiAqIHNtZF9pbWFnZXJ5 CiAqCiAqIEEgVGV4dHBhdHRlcm4gQ01TIHBsdWdpbiBmb3IgbWFuYWdpbmcgaW1hZ2VzIGlu IHRoZSBXcml0ZSBwYW5lbC4KICoKICogQGF1dGhvciBTdGVmIERhd3NvbgogKiBAbGluayAg IGh0dHA6Ly9zdGVmZGF3c29uLmNvbS8KICovCmlmICh0eHBpbnRlcmZhY2UgPT09ICdhZG1p bicpIHsKICAgIG5ldyBzbWRfaW1hZ2VyeSgpOwp9CgovLyA0LjUueCBwb2x5ZmlsbC4KaWYg KCFmdW5jdGlvbl9leGlzdHMoJ3NlbmRfanNvbl9yZXNwb25zZScpKSB7CiAgICBmdW5jdGlv biBzZW5kX2pzb25fcmVzcG9uc2UoJG91dCA9ICcnKQogICAgewogICAgICAgIHN0YXRpYyAk aGVhZGVyc19zZW50ID0gZmFsc2U7CgogICAgICAgIGlmICghJGhlYWRlcnNfc2VudCkgewog ICAgICAgICAgICBvYl9jbGVhbigpOwogICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlw ZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpOwogICAgICAgICAgICB0eHBf c3RhdHVzX2hlYWRlcignMjAwIE9LJyk7CiAgICAgICAgICAgICRoZWFkZXJzX3NlbnQgPSB0 cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpc19zdHJpbmcoJG91dCkpIHsKICAgICAg ICAgICAgJG91dCA9IGpzb25fZW5jb2RlKCRvdXQpOwogICAgICAgIH0KCiAgICAgICAgZWNo byAkb3V0OwogICAgfQp9CgovKioKICogQWRtaW4gaW50ZXJmYWNlLgogKi8KY2xhc3Mgc21k X2ltYWdlcnkKewogICAgLyoqCiAgICAgKiBUaGUgcGx1Z2luJ3MgZXZlbnQgYXMgcmVnaXN0 ZXJlZCBpbiBUeHAuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJv dGVjdGVkICRwbHVnaW5fZXZlbnQgPSAnc21kX2ltYWdlcnknOwoKICAgIC8qKgogICAgICog Q29uc3RydWN0b3IgdG8gc2V0IHVwIGNhbGxiYWNrcyBhbmQgZW52aXJvbm1lbnQuCiAgICAg Ki8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgYWRk X3ByaXZzKCR0aGlzLT5wbHVnaW5fZXZlbnQsICcxLDIsMyw0LDUsNicpOwogICAgICAgIHJl Z2lzdGVyX2NhbGxiYWNrKGFycmF5KCR0aGlzLCAnd2VsY29tZScpLCAncGx1Z2luX2xpZmVj eWNsZS4nIC4gJHRoaXMtPnBsdWdpbl9ldmVudCk7CiAgICAgICAgcmVnaXN0ZXJfY2FsbGJh Y2soYXJyYXkoJHRoaXMsICdyZW5kZXJfdWknKSwgJ2FydGljbGVfdWknLCAnYXJ0aWNsZV9p bWFnZScpOwogICAgICAgIHJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCR0aGlzLCAnaW5qZWN0 X2hlYWQnKSwgJ2FkbWluX3NpZGUnLCAnaGVhZF9lbmQnKTsKCiAgICAgICAgLy8gSGFuZGxl ciBmb3IgY2FsbHMgZnJvbSB0aGUgcGx1Z2luJ3MgVUkgYnV0dG9ucy4KICAgICAgICByZWdp c3Rlcl9jYWxsYmFjayhhcnJheSgkdGhpcywgJ2Rpc3BhdGNoJyksICR0aGlzLT5wbHVnaW5f ZXZlbnQpOwoKICAgICAgICAvLyBIYW5kbGVycyBmb3IgNC42KyBjb3JlIFR4cC1iYXNlZCBl dmVudHMuCiAgICAgICAgLy8gVGhlc2UgcnVuICdwcmUnIHNvIHRoZXkgY2FuIGluamVjdCBz dHVmZiBpbnRvIHRoZSBQT1NUZWQgYXJyYXkKICAgICAgICAvLyBwcmlvciB0byBUeHAncyBp bnZvbHZlbWVudC4KICAgICAgICAvLyBUaGUgcmVhc29uIGl0J3Mgbm90IGZvciBlYXJsaWVy IHZlcnNpb25zIGlzIHRoYXQgdGhlIEFydGljbGUgSW1hZ2UgZmllbGQKICAgICAgICAvLyB3 YXNuJ3Qgdm9sYXRpbGUsIHNvIHRoZSBuZXcgaWQgdmFsdWVzIGFyZW4ndCBpbmplY3RlZC4K ICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHR4cF92ZXJzaW9uLCAnNC42LjAnLCAnPj0n KSkgewogICAgICAgICAgICByZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgkdGhpcywgJ3JlcGxh Y2VQT1NUJyksICdhcnRpY2xlJywgJ2VkaXQnLCAxKTsKICAgICAgICAgICAgcmVnaXN0ZXJf Y2FsbGJhY2soYXJyYXkoJHRoaXMsICdyZXBsYWNlUE9TVCcpLCAnYXJ0aWNsZScsICdjcmVh dGUnLCAxKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBJbnN0YWxsL3VuaW5z dGFsbCBqdW1wb2ZmIHBvaW50LgogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICRldnQg IFRleHRwYXR0ZXJuIGV2ZW50IChsaWZlY3ljbGUpCiAgICAgKiBAcGFyYW0gIHN0cmluZyAk c3RwICBUZXh0cGF0dGVybiBzdGVwIChhY3Rpb24pCiAgICAgKi8KICAgIHB1YmxpYyBmdW5j dGlvbiB3ZWxjb21lKCRldnQsICRzdHApCiAgICB7CiAgICAgICAgc3dpdGNoICgkc3RwKSB7 CiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZWQnOgogICAgICAgICAgICAgICAgc2FmZV9kZWxl dGUoJ3R4cF9sYW5nJywgImV2ZW50IGxpa2UgJyIgLiAkdGhpcy0+cGx1Z2luX2V2ZW50IC4g IiUnIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVy bjsKICAgIH0KCiAgICAvKioKICAgICAqIERpdmVydCBwbHVnaW4gY2FsbGJhY2tzIHRvIHRo ZSBjb3JyZWN0IGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICRldnQg VGV4dHBhdHRlcm4gZXZlbnQgKHBhbmVsKQogICAgICogQHBhcmFtICBzdHJpbmcgJHN0cCBU ZXh0cGF0dGVybiBzdGVwIChhY3Rpb24pCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBk aXNwYXRjaCgkZXZ0LCAkc3RwKQogICAgewogICAgICAgICRhdmFpbGFibGVfc3RlcHMgPSBh cnJheSgKICAgICAgICAgICAgJ2ZldGNoSW1hZ2VzJyAgPT4gdHJ1ZSwKICAgICAgICAgICAg J3JlbmRlckRpYWxvZycgPT4gdHJ1ZSwKICAgICAgICAgICAgJ3JlcGxhY2VKU09OJyAgPT4g dHJ1ZSwKICAgICAgICAgICAgJ3NhdmVTdGF0ZScgICAgPT4gdHJ1ZSwKICAgICAgICApOwoK ICAgICAgICBpZiAoIWJvdW5jZXIoJHN0cCwgJGF2YWlsYWJsZV9zdGVwcykpIHsKICAgICAg ICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPiRzdHAoJGV2dCwgJHN0 cCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbmplY3Qgc3R5bGUgcnVsZXMgLyBoZWFkZXIg bWF0ZXJpYWwgaW50byB0aGUgJmx0O2hlYWQmZ3Q7IG9mIHRoZSBwYWdlLgogICAgICoKICAg ICAqIEBwYXJhbSAgc3RyaW5nICRldnQgVGV4dHBhdHRlcm4gZXZlbnQgKHBhbmVsKQogICAg ICogQHBhcmFtICBzdHJpbmcgJHN0cCBUZXh0cGF0dGVybiBzdGVwIChhY3Rpb24pCiAgICAg KiBAcmV0dXJuIHN0cmluZyAgICAgIENvbnRlbnQgdG8gaW5qZWN0LCBvciBub3RoaW5nIGlm IG5vdCB0aGUgcGx1Z2luJ3MgJGV2ZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBp bmplY3RfaGVhZCgkZXZ0LCAkc3RwKQogICAgewogICAgICAgIGdsb2JhbCAkZXZlbnQ7Cgog ICAgICAgIC8vIEFsc28gYWRkIGZhbGxiYWNrIHRvIGxvYWQgalF1ZXJ5IFVJIGluIGNhc2Ug d2UncmUgb24gPCBUeHAgNC42LgogICAgICAgIGlmICgkZXZlbnQgPT09ICdhcnRpY2xlJykg ewogICAgICAgICAgICBlY2hvICc8c3R5bGU+Ci51aS1kaWFsb2cgeyBtaW4td2lkdGg6IDUw dnc7IH0KLmNvbnRlbnQtaW1hZ2UgeyBwYWRkaW5nOiAwOyBib3JkZXItcmFkaXVzOiBub25l OyB9CmltZyB7IG1heC13aWR0aDogMTAwJTsgfQouc21kX2ltYWdlcnlfaW1hZ2VzIHsgZGlz cGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyB9Ci5zbWRfaW1hZ2VyeV9pbWFnZSB7IG1h eC13aWR0aDogMzMlOyBwb3NpdGlvbjogcmVsYXRpdmU7IH0KLnNtZF9pbWFnZXJ5X2ltYWdl IC5kZXN0cm95IHsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMDsgei1pbmRleDogMTU7 IH0KLnNtZF9pbWFnZXJ5X2J0biB7IG1hcmdpbi1ib3R0b206IDFyZW07IH0KPC9zdHlsZT4n CiAgICAgICAgICAgICAgICAubi5zY3JpcHRfanMoPDw8RU9KUwp3aW5kb3cualF1ZXJ5LnVp IHx8IGRvY3VtZW50LndyaXRlKCc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBz Oi8vY29kZS5qcXVlcnkuY29tL3VpLzEuMTIuMS90aGVtZXMvc21vb3RobmVzcy9qcXVlcnkt dWkuY3NzIiBtZWRpYT0ic2NyZWVuIiAvPjxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1 ZXJ5LmNvbS91aS8xLjEyLjEvanF1ZXJ5LXVpLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEyNTYt VmF6UDk3WkN3dGVrQXN2Z1BCU1V3UEZLZHJ3RDN1blVmU0dWWXJhaFVxVT0iIGNyb3Nzb3Jp Z2luPSJhbm9ueW1vdXMiPjxcL3NjcmlwdD4nKTsKRU9KUwogICAgICAgICAgICApOwogICAg ICAgIH0KCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGJ1dHRv bnMgdG8gdGhlIGFydGljbGUgaW1hZ2UgZmllbGQuCiAgICAgKgogICAgICogQHBhcmFtICBz dHJpbmcgJGV2dCAgVGV4dHBhdHRlcm4gZXZlbnQgKHBhbmVsKQogICAgICogQHBhcmFtICBz dHJpbmcgJHN0cCAgVGV4dHBhdHRlcm4gc3RlcCAoYWN0aW9uKQogICAgICogQHBhcmFtICBz dHJpbmcgJGRhdGEgT3JpZ2luYWwgbWFya3VwCiAgICAgKiBAcGFyYW0gIGFycmF5ICAkcnMg ICBBY2NvbXBhbnluZyByZWNvcmQgc2V0CiAgICAgKiBAcmV0dXJuIHN0cmluZyAgICAgICBI VE1MCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZW5kZXJfdWkoJGV2dCwgJHN0cCwg JGRhdGEsICRycykKICAgIHsKICAgICAgICAkYnRuID0gJzxidXR0b24gY2xhc3M9IicgLiAk dGhpcy0+cGx1Z2luX2V2ZW50IC4gJ19mZXRjaCAnLiR0aGlzLT5wbHVnaW5fZXZlbnQuJ19i dG4iPicgLiBnVHh0KCdzbWRfaW1hZ2VyeV9pZF9idG4nKSAuICc8L2J1dHRvbj4nCiAgICAg ICAgICAgIC5uLiAnPGJ1dHRvbiBjbGFzcz0iJyAuICR0aGlzLT5wbHVnaW5fZXZlbnQgLiAn X29yZ2FuaXNlICcuJHRoaXMtPnBsdWdpbl9ldmVudC4nX2J0biI+JyAuIGdUeHQoJ3NtZF9p bWFnZXJ5X29yZ2FuaXNlX2J0bicpIC4gJzwvYnV0dG9uPicKICAgICAgICAgICAgLm4uICc8 ZGl2IGNsYXNzPSInIC4gJHRoaXMtPnBsdWdpbl9ldmVudCAuICdfZGlhbG9nIiB0aXRsZT0i JyAuIGdUeHQoJ3NtZF9pbWFnZXJ5X2RpYWxvZ190aXRsZScpIC4gJyI+JwogICAgICAgICAg ICAubi4gJzwvZGl2Pic7CgogICAgICAgICRqcyA9IHNjcmlwdF9qcyg8PDwgRU9KUwpqUXVl cnkoZnVuY3Rpb24oKSB7CiAgICAvKioKICAgICAqIEZldGNoIGJ1dHRvbiBoYW5kbGVyLgog ICAgICoKICAgICAqIEdyYWJzIGltYWdlcyBieSBjYXRlZ29yeSBuYW1lIGFuZCBzdHVmZnMg dGhlbSBkaXJlY3RseSBpbiB0aGUgYXJ0aWNsZSBpbWFnZSBmaWVsZC4KICAgICAqLwogICAg alF1ZXJ5KCcueyR0aGlzLT5wbHVnaW5fZXZlbnR9X2ZldGNoJykub24oJ2NsaWNrJywgZnVu Y3Rpb24oZXYpIHsKICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHZhciBt ZSA9IGpRdWVyeSh0aGlzKTsKICAgICAgICB2YXIgYm9keSA9IGpRdWVyeSgnYm9keScpOwog ICAgICAgIHZhciBzcGlubmVyID0galF1ZXJ5KCc8c3BhbiAvPicpLmFkZENsYXNzKCdzcGlu bmVyJyk7CgogICAgICAgIC8vIFNob3cgZmVlZGJhY2sgd2hpbGUgcHJvY2Vzc2luZy4KICAg ICAgICBtZS5hZGRDbGFzcygnYnVzeScpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSkuYWZ0ZXIo c3Bpbm5lcik7CiAgICAgICAgYm9keS5hZGRDbGFzcygnYnVzeScpOwoKICAgICAgICB2YXIg ZGVzdCA9IGpRdWVyeSgnLmFydGljbGUtaW1hZ2UgaW5wdXQnKTsKCiAgICAgICAgc2VuZEFz eW5jRXZlbnQoewogICAgICAgICAgICAgICAgZXZlbnQgICAgICAgIDogJ3skdGhpcy0+cGx1 Z2luX2V2ZW50fScsCiAgICAgICAgICAgICAgICBzdGVwICAgICAgICAgOiAncmVwbGFjZUpT T04nLAogICAgICAgICAgICAgICAgYXJ0aWNsZUltYWdlIDogZGVzdC52YWwoKSwKICAgICAg ICAgICAgfSwgZnVuY3Rpb24oKSB7fSwgJ2pzb24nKQogICAgICAgICAgICAuZG9uZShmdW5j dGlvbiAoZGF0YSwgdGV4dFN0YXR1cywganFYSFIpIHsKICAgICAgICAgICAgICAgIGRlc3Qu dmFsKGRhdGEpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAuYWx3YXlzKGZ1bmN0aW9u ICgpIHsKICAgICAgICAgICAgICAgIG1lLnJlbW92ZUNsYXNzKCdidXN5JykucmVtb3ZlQXR0 cignZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgIHNwaW5uZXIucmVtb3ZlKCk7CiAgICAg ICAgICAgICAgICBib2R5LnJlbW92ZUNsYXNzKCdidXN5Jyk7CiAgICAgICAgICAgIH0pOwog ICAgfSk7CgogICAgLyoqCiAgICAgKiBUaHJvdyB1cCBhIGRpYWxvZyB0byBhbGxvdyBpbWFn ZSBvcmRlciB0byBiZSBtYW5pcHVsYXRlZCBieSBoYW5kLgogICAgICovCiAgICBqUXVlcnko Jy57JHRoaXMtPnBsdWdpbl9ldmVudH1fb3JnYW5pc2UnKS5vbignY2xpY2snLCBmdW5jdGlv bihldikgewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIG1lID0g alF1ZXJ5KHRoaXMpOwogICAgICAgIHZhciBib2R5ID0galF1ZXJ5KCdib2R5Jyk7CiAgICAg ICAgdmFyIHNwaW5uZXIgPSBqUXVlcnkoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3NwaW5uZXIn KTsKCiAgICAgICAgLy8gU2hvdyBmZWVkYmFjayB3aGlsZSBwcm9jZXNzaW5nLgogICAgICAg IG1lLmFkZENsYXNzKCdidXN5JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKS5hZnRlcihzcGlu bmVyKTsKICAgICAgICBib2R5LmFkZENsYXNzKCdidXN5Jyk7CgogICAgICAgIHZhciBkZXN0 ID0galF1ZXJ5KCcueyR0aGlzLT5wbHVnaW5fZXZlbnR9X2RpYWxvZycpOwoKICAgICAgICBz ZW5kQXN5bmNFdmVudCh7CiAgICAgICAgICAgICAgICBldmVudCA6ICd7JHRoaXMtPnBsdWdp bl9ldmVudH0nLAogICAgICAgICAgICAgICAgc3RlcCAgOiAncmVuZGVyRGlhbG9nJywKICAg ICAgICAgICAgfSwgZnVuY3Rpb24oKSB7fSwgJ2pzb24nKQogICAgICAgICAgICAuZG9uZShm dW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cywganFYSFIpIHsKICAgICAgICAgICAgICAgIGRl c3QuZW1wdHkoKS5odG1sKGRhdGEuY29udGVudCk7CiAgICAgICAgICAgICAgICBkZXN0LmRp YWxvZyh7CiAgICAgICAgICAgICAgICAgICAgLy8gRXhwZW5zaXZlLCBidXQgcHJldmVudHMg bXVsdGlwbGUgZGlhbG9ncyBhcHBlYXJpbmcKICAgICAgICAgICAgICAgICAgICAvLyBhZnRl ciBhcnRpY2xlIFNhdmUuCiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKGV2 ZW50LCB1aSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmVtcHR5KCkuZGlhbG9n KCdkZXN0cm95Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7 CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5hbHdheXMoZnVuY3Rpb24gKCkgewogICAg ICAgICAgICAgICAgbWUucmVtb3ZlQ2xhc3MoJ2J1c3knKS5yZW1vdmVBdHRyKCdkaXNhYmxl ZCcpOwogICAgICAgICAgICAgICAgc3Bpbm5lci5yZW1vdmUoKTsKICAgICAgICAgICAgICAg IGJvZHkucmVtb3ZlQ2xhc3MoJ2J1c3knKTsKICAgICAgICAgICAgfSk7CgogICAgfSk7Cn0p OwpFT0pTCiAgICApOwoKICAgICAgICByZXR1cm4gJGRhdGEuJGJ0bi4kanM7CiAgICB9Cgog ICAgLyoqCiAgICAgKiBEcmF3IHRoZSBiYXJlLCBzdGFydGluZyBVSSBmb3IgdGhlIGRpYWxv Zy4KICAgICAqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAkZXZ0IFRleHRwYXR0ZXJuIGV2ZW50 IChwYW5lbCkKICAgICAqIEBwYXJhbSAgc3RyaW5nICRzdHAgVGV4dHBhdHRlcm4gc3RlcCAo YWN0aW9uKQogICAgICogQHJldHVybiBIVE1MCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlv biByZW5kZXJEaWFsb2coJGV2dCwgJHN0cCkKICAgIHsKICAgICAgICBnbG9iYWwgJHBsdWdp bnM7CgogICAgICAgICRvdXQgPSAnJzsKICAgICAgICAkc21kdGh1bWIgPSAoaXNfYXJyYXko JHBsdWdpbnMpIGFuZCBpbl9hcnJheSgnc21kX3RodW1ibmFpbCcsICRwbHVnaW5zKSkgPyAn MScgOiAnMCc7CiAgICAgICAgJHRodW1iX3NpemVzID0gYXJyYXkoKTsKICAgICAgICAkdGh1 bWJfc2l6ZXNbJ3R4cF90aHVtYiddID0gZ1R4dCgndGh1bWJuYWlsJyk7CiAgICAgICAgJHRo dW1iX3NpemVzWyd0eHBfaW1hZ2UnXSA9IGdUeHQoJ3NtZF9pbWFnZXJ5X2ltYWdlJyk7Cgog ICAgICAgIGlmICgkc21kdGh1bWIgPT0gJzEnKSB7CiAgICAgICAgICAgICRycyA9IHNtZF90 aHVtYl9nZXRfcHJvZmlsZXMoKTsKCiAgICAgICAgICAgIGlmICgkcnMpIHsKICAgICAgICAg ICAgICAgIGZvcmVhY2ggKCRycyBhcyAkcm93KSB7CiAgICAgICAgICAgICAgICAgICAgJHRo dW1iX3NpemVzWyRyb3dbJ25hbWUnXV0gPSAkcm93WyduYW1lJ107CiAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aHVtYlNlbGVjdG9yID0g c2VsZWN0SW5wdXQoCiAgICAgICAgICAgICdzbWRfaW1hZ2VyeV9zaXplJywKICAgICAgICAg ICAgJHRodW1iX3NpemVzLAogICAgICAgICAgICBnZXRfcHJlZignc21kX2ltYWdlcnlfc2l6 ZScpLAogICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICdz bWRfaW1hZ2VyeV9zaXplJwogICAgICAgICk7CgogICAgICAgICRjYXRMaXN0ID0gZXZlbnRf Y2F0ZWdvcnlfcG9wdXAoJ2ltYWdlJywgJycsICR0aGlzLT5wbHVnaW5fZXZlbnQgLiAnX2xp c3QnKTsKCiAgICAgICAgJGZsZENob2ljZXMgPSBhcnJheSgKICAgICAgICAgICAgJ2FydGlj bGUtaW1hZ2UnID0+IGdUeHQoJ2FydGljbGVfaW1hZ2UnKSwKICAgICAgICAgICAgJ2JvZHkn ICAgICAgICAgID0+IGdUeHQoJ2JvZHknKSwKICAgICAgICAgICAgJ2V4Y2VycHQnICAgICAg ID0+IGdUeHQoJ2V4Y2VycHQnKSwKICAgICAgICAgICAgKTsKICAgICAgICAkY2ZzID0gZ2V0 Q3VzdG9tRmllbGRzKCk7CgogICAgICAgIGZvcmVhY2ggKCRjZnMgYXMgJGkgPT4gJGNmX25h bWUpIHsKICAgICAgICAgICAgJGZsZENob2ljZXNbJ2N1c3RvbS0nLiRpXSA9IGdldF9wcmVm KCJjdXN0b21feyRpfV9zZXQiKTsKICAgICAgICB9CgogICAgICAgICRjaG9zZW5NZXRob2Qg PSBnZXRfcHJlZignc21kX2ltYWdlcnlfbG9hZF9tZXRob2QnLCAnYnljYXQnKTsKCiAgICAg ICAgJGZsZExpc3QgPSBzZWxlY3RJbnB1dCgkdGhpcy0+cGx1Z2luX2V2ZW50IC4gJ19maWVs ZCcsICRmbGRDaG9pY2VzLCBnZXRfcHJlZignc21kX2ltYWdlcnlfZmllbGQnKSwgZmFsc2Us ICcnLCAkdGhpcy0+cGx1Z2luX2V2ZW50IC4gJ19maWVsZCcpOwoKICAgICAgICAkbG9hZENo b2ljZXMgPSBhcnJheSgKICAgICAgICAgICAgJ2J5Y2F0JyA9PiBnVHh0KCdzbWRfaW1hZ2Vy eV9vcHRfY2F0JyksCiAgICAgICAgICAgICdieWZsZCcgPT4gZ1R4dCgnc21kX2ltYWdlcnlf b3B0X2ZsZCcpLAogICAgICAgICAgICApOwoKICAgICAgICAkbG9hZE1ldGhvZCA9IHJhZGlv U2V0KCRsb2FkQ2hvaWNlcywgJHRoaXMtPnBsdWdpbl9ldmVudCAuICdfbG9hZF9tZXRob2Qn LCAkY2hvc2VuTWV0aG9kKTsKCiAgICAgICAgJGFjdGlvbnMgPSAnPGJ1dHRvbiBjbGFzcz0i JyAuICR0aGlzLT5wbHVnaW5fZXZlbnQgLiAnX2ZldGNoX2ltZyI+JyAuIGdUeHQoJ3NtZF9p bWFnZXJ5X2ZldGNoX2J0bicpIC4gJzwvYnV0dG9uPic7CgogICAgICAgICRzb3J0YWJsZSA9 ICR0aGlzLT5zb3J0T3B0cygpOwogICAgICAgICRzb3J0ID0gZ2V0X3ByZWYoJ3NtZF9pbWFn ZXJ5X3NvcnRfb3JkZXInLCBrZXkoJHNvcnRhYmxlKSk7CiAgICAgICAgJGRpciA9IGdldF9w cmVmKCdzbWRfaW1hZ2VyeV9zb3J0X2RpcicsICdhc2MnKTsKCiAgICAgICAgJGxpc3RBY3Rp b25zID0gJzxzcGFuIGNsYXNzPSJzbWRfaW1hZ2VyeV9zb3J0b3B0cyI+JwogICAgICAgICAg ICAuIHNlbGVjdElucHV0KCdzbWRfaW1hZ2VyeV9zb3J0X29yZGVyJywgJHNvcnRhYmxlLCAk c29ydCwgZmFsc2UsICcnLCAnc21kX2ltYWdlcnlfc29ydF9vcmRlcicpCiAgICAgICAgICAg IC4gKCgkZGlyID09PSAnYXNjJykKICAgICAgICAgICAgICAgID8gaHJlZignPHNwYW4gY2xh c3M9InVpLWljb24gdWktaWNvbi1hcnJvd3RoaWNrLTEtbiBzbWRfaW1hZ2VyeV9zb3J0X2Rp ciI+PC9zcGFuPiAnLCAnIycpCiAgICAgICAgICAgICAgICA6IGhyZWYoJzxzcGFuIGNsYXNz PSJ1aS1pY29uIHVpLWljb24tYXJyb3d0aGljay0xLXMgc21kX2ltYWdlcnlfc29ydF9kaXIi Pjwvc3Bhbj4gJywgJyMnKQogICAgICAgICAgICApCiAgICAgICAgICAgIC4gJzwvc3Bhbj4n OwoKICAgICAgICAkcGFuZWwgPSAnPGRpdiBjbGFzcz0iJyAuICR0aGlzLT5wbHVnaW5fZXZl bnQgLiAnX2ltYWdlcyI+JwogICAgICAgICAgICAubi4gJzwvZGl2Pic7CiAgICAgICAgJHBs YXRlID0gJzxsYWJlbCBmb3I9IicgLiAkdGhpcy0+cGx1Z2luX2V2ZW50IC4gJ190ZW1wbGF0 ZSI+JyAuIGdUeHQoJ3NtZF9pbWFnZXJ5X3RlbXBsYXRlJykgLiAnPC9sYWJlbD4nCiAgICAg ICAgICAgIC5uLiAnPHRleHRhcmVhIG5hbWU9IicgLiAkdGhpcy0+cGx1Z2luX2V2ZW50IC4g J190ZW1wbGF0ZSIgaWQ9IicgLiAkdGhpcy0+cGx1Z2luX2V2ZW50IC4gJ190ZW1wbGF0ZSIg Y2xhc3M9IicgLiAkdGhpcy0+cGx1Z2luX2V2ZW50IC4gJ190ZW1wbGF0ZSI+Jy50eHBzcGVj aWFsY2hhcnMoZ2V0X3ByZWYoJ3NtZF9pbWFnZXJ5X3RlbXBsYXRlJykpLic8L3RleHRhcmVh Pic7CiAgICAgICAgJHJlc3VsdCA9ICc8bGFiZWwgZm9yPSInIC4gJHRoaXMtPnBsdWdpbl9l dmVudCAuICdfcmVzdWx0Ij4nIC4gZ1R4dCgnc21kX2ltYWdlcnlfcmVzdWx0JykgLiAnPC9s YWJlbD4nCiAgICAgICAgICAgIC5uLiAnPHRleHRhcmVhIG5hbWU9IicgLiAkdGhpcy0+cGx1 Z2luX2V2ZW50IC4gJ19yZXN1bHQiIGlkPSInIC4gJHRoaXMtPnBsdWdpbl9ldmVudCAuICdf cmVzdWx0IiBjbGFzcz0iJyAuICR0aGlzLT5wbHVnaW5fZXZlbnQgLiAnX3Jlc3VsdCIgcm93 cz00Ij48L3RleHRhcmVhPic7CiAgICAgICAgJGpzID0gc2NyaXB0X2pzKDw8PCBFT0pTCmpR dWVyeShmdW5jdGlvbigpIHsKCiAgICAvKioKICAgICAqIEZldGNoIGJ1dHRvbiBoYW5kbGVy LgogICAgICoKICAgICAqIEdyYWJzIGltYWdlcyBieSBjYXRlZ29yeSBuYW1lIGFuZCBzaG93 cyB0aGVtIGluIHRoZSBkaWFsb2cuCiAgICAgKi8KICAgIGpRdWVyeSgnLnskdGhpcy0+cGx1 Z2luX2V2ZW50fV9mZXRjaF9pbWcnKS5vbignY2xpY2snLCBmdW5jdGlvbihldikgewogICAg ICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIG1lID0galF1ZXJ5KHRoaXMp OwogICAgICAgIHZhciBib2R5ID0galF1ZXJ5KCdib2R5Jyk7CiAgICAgICAgdmFyIHNwaW5u ZXIgPSBqUXVlcnkoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3NwaW5uZXInKTsKCiAgICAgICAg Ly8gU2hvdyBmZWVkYmFjayB3aGlsZSBwcm9jZXNzaW5nLgogICAgICAgIG1lLmFkZENsYXNz KCdidXN5JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKS5hZnRlcihzcGlubmVyKTsKICAgICAg ICBib2R5LmFkZENsYXNzKCdidXN5Jyk7CgogICAgICAgIHZhciB0eXBlID0galF1ZXJ5KCdb bmFtZT17JHRoaXMtPnBsdWdpbl9ldmVudH1fbG9hZF9tZXRob2RdOmNoZWNrZWQnKS52YWwo KQogICAgICAgIHZhciBjYXROYW1lID0gbnVsbDsKICAgICAgICB2YXIgaWRMaXN0ID0gW107 CiAgICAgICAgdmFyIG5hbWVMaXN0ID0gW107CgogICAgICAgIGlmICh0eXBlID09PSAnYnlj YXQnKSB7CiAgICAgICAgICAgIGNhdE5hbWUgPSBqUXVlcnkoJyN7JHRoaXMtPnBsdWdpbl9l dmVudH1fbGlzdCcpLnZhbCgpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2J5Zmxk JykgewogICAgICAgICAgICB2YXIgdGhlRmllbGQgPSBqUXVlcnkoJyN7JHRoaXMtPnBsdWdp bl9ldmVudH1fZmllbGQnKS52YWwoKTsKICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBqUXVl cnkoJyMnICsgdGhlRmllbGQpLnZhbCgpOwoKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFu IGVudGlyZSBsaXN0IG9mIGlkcy4KICAgICAgICAgICAgdmFyIHJleCA9IC9eKFswLTksIF0r KSQvZzsKICAgICAgICAgICAgcmVzdWx0ID0gcmV4LmV4ZWMoY29udGVudCk7CgogICAgICAg ICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9m KHJlc3VsdFsxXSkgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICBpZExp c3QucHVzaChyZXN1bHRbMV0pOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAg ICAgICAgICAgIC8vIENoZWNrIGZvciB0eHA6aW1hZ2UvdHhwOmltYWdlcyB0YWdzIGFuZCBw dWxsIG91dCBpZHMvbmFtZXMuCiAgICAgICAgICAgIC8vIFZlcnkgc2ltcGxpc3RpYy4gVGhl IGRvd25zaWRlIHRvIHNlcGFyYXRpbmcgcGFzc2VzIHdpbGwgb25seQogICAgICAgICAgICAv LyBiZWNvbWUgYXBwYXJlbnQgaWYgcGVvcGxlIG1peCBIVE1MIGFuZCBUeHAgdGFncywgYXMg dGhlCiAgICAgICAgICAgIC8vIGltYWdlcyB3aWxsIG5vdCBiZSBpbiBzb3VyY2Ugb3JkZXIu CiAgICAgICAgICAgIC8vIEluIHJlYWxpdHkgdGhpcyBwcm9iYWJseSB3b24ndCBiZSBhbiBp c3N1ZS4KICAgICAgICAgICAgdmFyIHJleCA9IC88dHhwOmltYWdlW3NdPy4qKChpZClccyo9 XHMqIihbMC05LCBdKykifChuYW1lKVxzKj1ccyoiKC4rPykiKS4qP1wvPz4vZzsKCiAgICAg ICAgICAgIHdoaWxlICgocmVzdWx0ID0gcmV4LmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7 CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHJlc3VsdCkgIT0gJ3VuZGVmaW5lZCcpIHsK ICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHJlc3VsdFszXSkgIT0gJ3VuZGVmaW5l ZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWQgbWF0Y2hlcwogICAgICAgICAg ICAgICAgICAgICAgICBpZExpc3QucHVzaChyZXN1bHRbM10udHJpbSgpKTsKICAgICAgICAg ICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihyZXN1bHRbNV0pICE9ICd1bmRlZmluZWQn KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgbWF0Y2hlcwogICAgICAgICAg ICAgICAgICAgICAgICBuYW1lTGlzdC5wdXNoKHJlc3VsdFs1XS50cmltKCkpOwogICAgICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAg ICAgICAgLy8gTmV4dCwgY2hlY2sgZm9yIEhUTUwgaW1nIHRhZ3MgYW5kIGV4dHJhY3QgZmls ZSBpZHMuCiAgICAgICAgICAgIHZhciByZXggPSAvPGltZy4qKHNyYylccyo9XHMqIi4qP1wv KFswLTldKylcLi57Myw0fSIuKj9cLz8+L2c7CgogICAgICAgICAgICB3aGlsZSAoKHJlc3Vs dCA9IHJleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYg KHR5cGVvZihyZXN1bHQpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAg aWYgKHR5cGVvZihyZXN1bHRbMl0pICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAg ICAgICAgICAgIC8vIGlkIGZvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGlkTGlzdC5w dXNoKHJlc3VsdFsyXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg fQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2l6ZSA9IGpRdWVyeSgn I3skdGhpcy0+cGx1Z2luX2V2ZW50fV9zaXplJykudmFsKCk7CiAgICAgICAgdmFyIGRlc3Qg PSBqUXVlcnkoJy57JHRoaXMtPnBsdWdpbl9ldmVudH1faW1hZ2VzJyk7CgogICAgICAgIHNl bmRBc3luY0V2ZW50KHsKICAgICAgICAgICAgICAgIGV2ZW50ICAgIDogJ3skdGhpcy0+cGx1 Z2luX2V2ZW50fScsCiAgICAgICAgICAgICAgICBzdGVwICAgICA6ICdmZXRjaEltYWdlcycs CiAgICAgICAgICAgICAgICB0eXBlICAgICA6IHR5cGUsCiAgICAgICAgICAgICAgICBjYXRl Z29yeSA6IGNhdE5hbWUsCiAgICAgICAgICAgICAgICBpZExpc3QgICA6IGlkTGlzdC5qb2lu KCcsJyksCiAgICAgICAgICAgICAgICBuYW1lTGlzdCA6IG5hbWVMaXN0LmpvaW4oJywnKSwK ICAgICAgICAgICAgICAgIHNpemUgICAgIDogc2l6ZSwKICAgICAgICAgICAgfSwgZnVuY3Rp b24oKSB7fSwgJ2pzb24nKQogICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAoZGF0YSwgdGV4 dFN0YXR1cywganFYSFIpIHsKICAgICAgICAgICAgICAgIC8vIERyYWcgJiBkcm9wLCB5ZWFo IQogICAgICAgICAgICAgICAgZGVzdC5lbXB0eSgpLmh0bWwoZGF0YS5jb250ZW50KS5zb3J0 YWJsZSh7CiAgICAgICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAicG9pbnRlciIsCiAgICAg ICAgICAgICAgICAgICAgb3BhY2l0eTogMC45LAogICAgICAgICAgICAgICAgICAgIGNyZWF0 ZTogc21kX2ltYWdlcnlfcmVzdWx0LAogICAgICAgICAgICAgICAgICAgIGNoYW5nZTogc21k X2ltYWdlcnlfcmVzdWx0LAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZTogc21kX2ltYWdl cnlfcmVzdWx0CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBqUXVlcnko Jy57JHRoaXMtPnBsdWdpbl9ldmVudH1faW1hZ2UgLmRlc3Ryb3knKS5jbGljayhmdW5jdGlv bihldikgewogICAgICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAg ICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGpRdWVyeSh0aGlzKS5jbG9zZXN0KCcueyR0 aGlzLT5wbHVnaW5fZXZlbnR9X2ltYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0 LmhpZGUoJ2Zhc3QnLCBmdW5jdGlvbigpIHsgdGFyZ2V0LnJlbW92ZSgpOyBzbWRfaW1hZ2Vy eV9yZXN1bHQoKTsgfSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBz bWRfaW1hZ2VyeV9yZXN1bHQoKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmFsd2F5 cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBtZS5yZW1vdmVDbGFzcygnYnVzeScp LnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgICAgICBzcGlubmVyLnJlbW92 ZSgpOwogICAgICAgICAgICAgICAgYm9keS5yZW1vdmVDbGFzcygnYnVzeScpOwogICAgICAg ICAgICB9KTsKICAgIH0pOwoKICAgIC8qKgogICAgICogU2F2ZSBwYW5lIHN0YXRlOiBsb2Fk TWV0aG9kLgogICAgICovCiAgICBqUXVlcnkoJ1tuYW1lPXskdGhpcy0+cGx1Z2luX2V2ZW50 fV9sb2FkX21ldGhvZF0nKS5vbignY2hhbmdlJywgZnVuY3Rpb24oZXYpIHsKICAgICAgICB2 YXIgbWVWYWwgPSBqUXVlcnkodGhpcykuZmlsdGVyKCc6Y2hlY2tlZCcpLnZhbCgpOwogICAg ICAgIHZhciBjYXRPYmogPSBqUXVlcnkoJyN7JHRoaXMtPnBsdWdpbl9ldmVudH1fbGlzdCcp OwogICAgICAgIHZhciBmbGRPYmogPSBqUXVlcnkoJyN7JHRoaXMtPnBsdWdpbl9ldmVudH1f ZmllbGQnKTsKICAgICAgICB2YXIgb3JkT2JqID0galF1ZXJ5KCcueyR0aGlzLT5wbHVnaW5f ZXZlbnR9X3NvcnRvcHRzJyk7CgogICAgICAgIGlmIChtZVZhbCA9PT0gJ2J5Y2F0Jykgewog ICAgICAgICAgICBmbGRPYmouaGlkZSgpOwogICAgICAgICAgICBjYXRPYmouc2hvdygpOwog ICAgICAgICAgICBvcmRPYmouc2hvdygpOwogICAgICAgIH0gZWxzZSBpZiAobWVWYWwgPT09 ICdieWZsZCcpIHsKICAgICAgICAgICAgZmxkT2JqLnNob3coKTsKICAgICAgICAgICAgY2F0 T2JqLmhpZGUoKTsKICAgICAgICAgICAgb3JkT2JqLmhpZGUoKTsKICAgICAgICB9CgogICAg ICAgIHNtZF9pbWFnZXJ5X3N0YXNoKFsnbG9hZF9tZXRob2QnXSk7CiAgICB9KS5jaGFuZ2Uo KTsKCiAgICAvKioKICAgICAqIFNhdmUgcGFuZSBzdGF0ZTogc2l6ZSwgZmllbGQgYW5kIHNv cnQgb3JkZXIuCiAgICAgKi8KICAgIGpRdWVyeSgnI3skdGhpcy0+cGx1Z2luX2V2ZW50fV9z aXplLCAjeyR0aGlzLT5wbHVnaW5fZXZlbnR9X2ZpZWxkLCAjeyR0aGlzLT5wbHVnaW5fZXZl bnR9X3NvcnRfb3JkZXInKS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFy IHRvU3Rhc2ggPSBbCiAgICAgICAgICAgICdzaXplJywKICAgICAgICAgICAgJ2ZpZWxkJywK ICAgICAgICAgICAgJ3NvcnRfb3JkZXInCiAgICAgICAgXTsKCiAgICAgICAgc21kX2ltYWdl cnlfc3Rhc2godG9TdGFzaCk7CiAgICB9KTsKCiAgICAvKioKICAgICAqIFNhdmUgcGFuZSBz dGF0ZTogc29ydCBkaXIuCiAgICAgKi8KICAgIGpRdWVyeSgnLnskdGhpcy0+cGx1Z2luX2V2 ZW50fV9zb3J0X2RpcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgZXYu cHJldmVudERlZmF1bHQoKTsKICAgICAgICBqUXVlcnkodGhpcykudG9nZ2xlQ2xhc3MoJ3Vp LWljb24tYXJyb3d0aGljay0xLXMgdWktaWNvbi1hcnJvd3RoaWNrLTEtbicpOwogICAgICAg IHNtZF9pbWFnZXJ5X3N0YXNoKFsnc29ydF9kaXInXSk7CiAgICB9KTsKCiAgICAvKioKICAg ICAqIFNhdmUgcGFuZSBzdGF0ZTogdGVtcGxhdGUuCiAgICAgKi8KICAgIGpRdWVyeSgnLnsk dGhpcy0+cGx1Z2luX2V2ZW50fV90ZW1wbGF0ZScpLm9uKCdibHVyJywgZnVuY3Rpb24oKSB7 CiAgICAgICAgc21kX2ltYWdlcnlfc3Rhc2goWydwbGF0ZSddKTsKICAgICAgICBzbWRfaW1h Z2VyeV9yZXN1bHQoKTsKICAgIH0pOwp9KTsKCi8qKgogKiBTdG9yZSBwYW5lIHN0YXRlLgog Ki8KZnVuY3Rpb24gc21kX2ltYWdlcnlfc3Rhc2godGhpbmdzKSB7CiAgICBzb3J0X2RpciA9 IGpRdWVyeSgnLnskdGhpcy0+cGx1Z2luX2V2ZW50fV9zb3J0X2RpcicpLmhhc0NsYXNzKCd1 aS1pY29uLWFycm93dGhpY2stMS1uJykgPyAnYXNjJyA6ICdkZXNjJwoKICAgIHZhciBvcHRz ID0gewogICAgICAgIGV2ZW50ICAgICAgOiAneyR0aGlzLT5wbHVnaW5fZXZlbnR9JywKICAg ICAgICBzdGVwICAgICAgIDogJ3NhdmVTdGF0ZScsCiAgICAgICAgbG9hZE1ldGhvZCA6ICdu dWxsJywKICAgICAgICBzaXplICAgICAgIDogJ251bGwnLAogICAgICAgIGZpZWxkICAgICAg OiAnbnVsbCcsCiAgICAgICAgc29ydF9vcmRlciA6ICdudWxsJywKICAgICAgICBzb3J0X2Rp ciAgIDogJ251bGwnLAogICAgICAgIHBsYXRlICAgICAgOiAnbnVsbCcsCiAgICB9OwoKICAg IGpRdWVyeSh0aGluZ3MpLmVhY2goZnVuY3Rpb24oaWR4LCB0aGluZykgewogICAgICAgIHN3 aXRjaCAodGhpbmcpIHsKICAgICAgICAgICAgY2FzZSAnbG9hZF9tZXRob2QnOgogICAgICAg ICAgICAgICAgb3B0cy5sb2FkTWV0aG9kID0galF1ZXJ5KCdbbmFtZT17JHRoaXMtPnBsdWdp bl9ldmVudH1fbG9hZF9tZXRob2RdOmNoZWNrZWQnKS52YWwoKTsKICAgICAgICAgICAgICAg IGJyZWFrOwogICAgICAgICAgICBjYXNlICdzaXplJzoKICAgICAgICAgICAgICAgIG9wdHMu c2l6ZSA9IGpRdWVyeSgnI3skdGhpcy0+cGx1Z2luX2V2ZW50fV9zaXplJykudmFsKCk7CiAg ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZmllbGQnOgogICAgICAg ICAgICAgICAgb3B0cy5maWVsZCA9IGpRdWVyeSgnI3skdGhpcy0+cGx1Z2luX2V2ZW50fV9m aWVsZCcpLnZhbCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ug J3NvcnRfb3JkZXInOgogICAgICAgICAgICAgICAgb3B0cy5zb3J0X29yZGVyID0galF1ZXJ5 KCcjeyR0aGlzLT5wbHVnaW5fZXZlbnR9X3NvcnRfb3JkZXInKS52YWwoKTsKICAgICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzb3J0X2Rpcic6CiAgICAgICAgICAg ICAgICBvcHRzLnNvcnRfZGlyID0gc29ydF9kaXI7CiAgICAgICAgICAgICAgICBicmVhazsK ICAgICAgICAgICAgY2FzZSAncGxhdGUnOgogICAgICAgICAgICAgICAgb3B0cy5wbGF0ZSA9 IGpRdWVyeSgnLnskdGhpcy0+cGx1Z2luX2V2ZW50fV90ZW1wbGF0ZScpLnZhbCgpOwogICAg ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfSk7CgogICAgc2VuZEFzeW5jRXZl bnQob3B0cyk7Cn0KCi8qKgogKiBqUXVlcnkgVUkgY2FsbGJhY2sgdG8gdXBkYXRlIHRoZSBy ZXN1bHRzIHRleHRhcmVhLgogKi8KZnVuY3Rpb24gc21kX2ltYWdlcnlfcmVzdWx0KGV2ZW50 LCB1aSkgewogICAgdmFyIG1ldGEgPSB7CiAgICAgICAgImlkIiAgIDogW10sCiAgICAgICAg Im5hbWUiIDogW10sCiAgICB9OwoKICAgIHZhciBvdXQgPSAnJzsKICAgIHZhciByZXBzID0g e307CgogICAgalF1ZXJ5KCcueyR0aGlzLT5wbHVnaW5fZXZlbnR9X2ltYWdlcyBpbWcnKS5l YWNoKGZ1bmN0aW9uKGlkeCkgewogICAgICAgIG1ldGEuaWQucHVzaChqUXVlcnkodGhpcyku ZGF0YSgncmVmJykpOwogICAgICAgIG1ldGEubmFtZS5wdXNoKGpRdWVyeSh0aGlzKS5kYXRh KCduYW1lJykpOwogICAgfSk7CgogICAgdmFyIGltZ0lkTGlzdCA9IG1ldGEuaWQuam9pbign LCcpOwogICAgdmFyIGltZ05hbWVMaXN0ID0gbWV0YS5uYW1lLmpvaW4oJywnKTsKCiAgICB2 YXIgcGxhdGUgPSBqUXVlcnkoJy57JHRoaXMtPnBsdWdpbl9ldmVudH1fdGVtcGxhdGUnKS52 YWwoKTsKICAgIHZhciByZTEgPSAvXHtzbWRfaW1hZ2VyeV9saXN0XyguKylcfS9pOwogICAg dmFyIHJlMiA9IC9ce3NtZF9pbWFnZXJ5XyhpZHxuYW1lKVx9L2k7CiAgICB2YXIgZm91bmRM aXN0ID0gcGxhdGUubWF0Y2gocmUxKTsKICAgIHZhciBmb3VuZFNpbmdsZSA9IHBsYXRlLm1h dGNoKHJlMik7CgogICAgLy8gRGVmYXVsdCBvdXRwdXQgaXMgYW4gaWQgbGlzdCwgaWYgbm8g bWF0Y2hlcyBmb3VuZC4KICAgIG91dCA9IGltZ0lkTGlzdDsKCiAgICBpZiAoZm91bmRMaXN0 KSB7CiAgICAgICAgcmVwc1sie3skdGhpcy0+cGx1Z2luX2V2ZW50fV9saXN0X2lkfSJdID0g aW1nSWRMaXN0OwogICAgICAgIHJlcHNbInt7JHRoaXMtPnBsdWdpbl9ldmVudH1fbGlzdF9u YW1lfSJdID0gaW1nTmFtZUxpc3Q7CiAgICAgICAgcmVwc1sie3skdGhpcy0+cGx1Z2luX2V2 ZW50fV9saXN0X2lkX3F1b3RlZH0iXSA9ICInIiArIG1ldGEuaWQuam9pbigiJywnIikgKyAi JyI7CiAgICAgICAgcmVwc1sie3skdGhpcy0+cGx1Z2luX2V2ZW50fV9saXN0X25hbWVfcXVv dGVkfSJdID0gIiciICsgbWV0YS5uYW1lLmpvaW4oIicsJyIpICsgIiciOwogICAgICAgIG91 dCA9IHBsYXRlLnN0cnRyKHJlcHMpOwogICAgfSBlbHNlIGlmIChmb3VuZFNpbmdsZSkgewog ICAgICAgIG91dCA9ICcnOwoKICAgICAgICBqUXVlcnkobWV0YS5pZCkuZWFjaChmdW5jdGlv bihpZHgsIHZhbCkgewogICAgICAgICAgICByZXBzWyJ7eyR0aGlzLT5wbHVnaW5fZXZlbnR9 X2lkfSJdID0gdmFsOwogICAgICAgICAgICByZXBzWyJ7eyR0aGlzLT5wbHVnaW5fZXZlbnR9 X25hbWV9Il0gPSBtZXRhLm5hbWVbaWR4XTsKICAgICAgICAgICAgb3V0ICs9IHBsYXRlLnN0 cnRyKHJlcHMpICsgJ1xcbic7CiAgICAgICAgfSk7CiAgICB9CgogICAgalF1ZXJ5KCcueyR0 aGlzLT5wbHVnaW5fZXZlbnR9X3Jlc3VsdCcpLnZhbChvdXQpOwp9CgovKioKICogRXF1aXZh bGVudCB0byBQSFAncyBzdHJ0cigpLgogKgogKiBGcm9tIGh0dHBzOi8vZ2lzdC5naXRodWIu Y29tL2RzaGVpa28vMjc3NDUzMy4KICovClN0cmluZy5wcm90b3R5cGUuc3RydHIgPSBmdW5j dGlvbiAocmVwbGFjZVBhaXJzKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgc3RyID0g dGhpcy50b1N0cmluZygpLCBrZXksIHJlOwoKICAgIGZvciAoa2V5IGluIHJlcGxhY2VQYWly cykgewogICAgICAgIGlmIChyZXBsYWNlUGFpcnMuaGFzT3duUHJvcGVydHkoa2V5KSkgewog ICAgICAgICAgICByZSA9IG5ldyBSZWdFeHAoa2V5LCAiZyIpOwogICAgICAgICAgICBzdHIg PSBzdHIucmVwbGFjZShyZSwgcmVwbGFjZVBhaXJzW2tleV0pOwogICAgICAgIH0KICAgIH0K CiAgICByZXR1cm4gc3RyOwp9CkVPSlMKICAgICAgICApOwoKICAgICAgICAkb3V0ID0gJGxv YWRNZXRob2QKICAgICAgICAgICAgLmJyLiAkY2F0TGlzdAogICAgICAgICAgICAubi4gJGZs ZExpc3QKICAgICAgICAgICAgLm4uICR0aHVtYlNlbGVjdG9yCiAgICAgICAgICAgIC5uLiAk bGlzdEFjdGlvbnMuJGFjdGlvbnMKICAgICAgICAgICAgLm4uICRwYW5lbAogICAgICAgICAg ICAubi4gJHBsYXRlCiAgICAgICAgICAgIC5uLiAkcmVzdWx0CiAgICAgICAgICAgIC5uLiAk anM7CgogICAgICAgIC8vIEhhdmUgdG8gc2VuZCB0aGUgdGVtcGxhdGUgY29udGVudCBzZXBh cmF0ZWx5IHNvIGl0IGNhbiBiZSByZW5kZXJlZAogICAgICAgIC8vIGFmdGVyIHRoZSBjb250 ZW50LiBPdGhlcndpc2UsIGpRdWVyeSBjb252ZXJ0cyBzZWxmLWNsb3NlZCB0YWdzIHRvCiAg ICAgICAgLy8gZnVsbHkgY2xvc2VkIHdoZW4gcmVuZGVyaW5nIHZpYSB0aGUgaHRtbCgpIG1l dGhvZC4KICAgICAgICBzZW5kX2pzb25fcmVzcG9uc2UoYXJyYXkoJ2NvbnRlbnQnID0+ICRv dXQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdyYWIgdGhlIGltYWdlcyBmcm9tIHRoZSBQ T1NUZWQgY2F0ZWdvcnkuCiAgICAgKgogICAgICogUGVybWl0cyBzZWxlY3Rpb24gb2YgdW5j YXRlZ29yaXNlZCBpbWFnZXMgYnkgZGVsaWJlcmF0ZWx5IG5vdAogICAgICogY2hlY2tpbmcg aWYgdGhlIHBhc3NlZCBjYXRlZ29yeSBpcyBlbXB0eS4KICAgICAqCiAgICAgKiBAcGFyYW0g IHN0cmluZyAkZXZ0IFRleHRwYXR0ZXJuIGV2ZW50IChwYW5lbCkKICAgICAqIEBwYXJhbSAg c3RyaW5nICRzdHAgVGV4dHBhdHRlcm4gc3RlcCAoYWN0aW9uKQogICAgICogQHJldHVybiBI VE1MCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBmZXRjaEltYWdlcygkZXZ0LCAkc3Rw KQogICAgewogICAgICAgIGdsb2JhbCAkaW1nX2RpcjsKCiAgICAgICAgJHR5cGUgPSBwcygn dHlwZScpOwogICAgICAgICR3aGVyZSA9ICcnOwoKICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7 CiAgICAgICAgICAgIGNhc2UgJ2J5Y2F0JzoKICAgICAgICAgICAgICAgICRzb3J0YWJsZSA9 ICR0aGlzLT5zb3J0T3B0cygpOwogICAgICAgICAgICAgICAgJGRpcmFibGUgPSBhcnJheSgn YXNjJywgJ2Rlc2MnKTsKICAgICAgICAgICAgICAgICRjYXROYW1lID0gcHMoJ2NhdGVnb3J5 Jyk7CiAgICAgICAgICAgICAgICAkc29ydCA9IGdldF9wcmVmKCdzbWRfaW1hZ2VyeV9zb3J0 X29yZGVyJyk7CiAgICAgICAgICAgICAgICAkZGlyID0gZ2V0X3ByZWYoJ3NtZF9pbWFnZXJ5 X3NvcnRfZGlyJyk7CgogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRz b3J0LCAkc29ydGFibGUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHNvcnQgPSBrZXkoJHNv cnRhYmxlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWluX2Fy cmF5KCRkaXIsICRkaXJhYmxlKSkgewogICAgICAgICAgICAgICAgICAgICRkaXIgPSAkZGly YWJsZVswXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkb3JkZXJCeSA9 ICcgT1JERVIgQlkgJyAuIGRvU2xhc2goJHNvcnQpIC4gJyAnIC4gZG9TbGFzaCgkZGlyKTsK ICAgICAgICAgICAgICAgICR3aGVyZSA9ICJjYXRlZ29yeSA9ICciIC4gZG9TbGFzaCgkY2F0 TmFtZSkgLiAiJyIgLiAkb3JkZXJCeTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAg ICAgICBjYXNlICdieWZsZCc6CiAgICAgICAgICAgICAgICAkaWRMaXN0ID0gcHMoJ2lkTGlz dCcpOwogICAgICAgICAgICAgICAgJG5hbWVMaXN0ID0gcHMoJ25hbWVMaXN0Jyk7CgogICAg ICAgICAgICAgICAgaWYgKCRpZExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAkaWRzID0g ZG9TbGFzaCgkaWRMaXN0KTsKICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSAiaWQgSU4o IiAuICRpZHMgLiAiKSBPUkRFUiBCWSBmaWVsZChpZCwgIiAuICRpZHMgLiAiKSI7CiAgICAg ICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRuYW1lTGlzdCkgewogICAgICAg ICAgICAgICAgICAgICRuYW1lcyA9IGltcGxvZGUoJywgJywgcXVvdGVfbGlzdChkb19saXN0 KCRuYW1lTGlzdCkpKTsKICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSAibmFtZSBJTigi IC4gJG5hbWVzIC4gIikgT1JERVIgQlkgZmllbGQobmFtZSwgIiAuICRuYW1lcyAuICIpIjsK ICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgoK ICAgICAgICAkc2l6ZSA9IHBzKCdzaXplJyk7CiAgICAgICAgJGltZyA9IGFycmF5KCk7Cgog ICAgICAgICRycyA9IHNhZmVfcm93cygnKicsICd0eHBfaW1hZ2UnLCAkd2hlcmUpOwoKICAg ICAgICBmb3JlYWNoICgkcnMgYXMgJHJvdykgewogICAgICAgICAgICBzd2l0Y2ggKCRzaXpl KSB7CiAgICAgICAgICAgICAgICBjYXNlICd0eHBfdGh1bWInOgogICAgICAgICAgICAgICAg ICAgIC8vIFRodW1ibmFpbC4KICAgICAgICAgICAgICAgICAgICAkdXJsID0gaW1hZ2VzcmN1 cmwoJHJvd1snaWQnXSwgJHJvd1snZXh0J10sIHRydWUpOwogICAgICAgICAgICAgICAgICAg IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndHhwX2ltYWdlJzoKICAgICAgICAgICAg ICAgICAgICAvLyBGdWxsLXNpemUgaW1hZ2UuCiAgICAgICAgICAgICAgICAgICAgJHVybCA9 IGltYWdlc3JjdXJsKCRyb3dbJ2lkJ10sICRyb3dbJ2V4dCddKTsKICAgICAgICAgICAgICAg ICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAg ICAgLy8gc21kX3RodW1ibmFpbCBwcm9maWxlLgogICAgICAgICAgICAgICAgICAgICR1cmwg PSBpaHUgLiAkaW1nX2RpciAuICcvJyAuICRzaXplIC4gJy8nIC4gJHJvd1snaWQnXSAuICRy b3dbJ2V4dCddOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9Cgog ICAgICAgICAgICAkYXNwZWN0ID0gKCRyb3dbJ2gnXSA9PSAkcm93Wyd3J10pID8gJyBzcXVh cmUnIDogKCgkcm93WydoJ10gPiAkcm93Wyd3J10pID8gJyBwb3J0cmFpdCcgOiAnIGxhbmRz Y2FwZScpOwogICAgICAgICAgICAkaW1nX2luZm8gPSAkcm93WydpZCddLiRyb3dbJ2V4dCdd LicgKCcuJHJvd1sndyddLicgJiMyMTU7ICcuJHJvd1snaCddLicpJzsKICAgICAgICAgICAg JGltZ1tdID0gJzxkaXYgY2xhc3M9IicuJHRoaXMtPnBsdWdpbl9ldmVudC4nX2ltYWdlJyAu ICRhc3BlY3QgLiAnIj4nCiAgICAgICAgICAgICAgICAubi4gJzxidXR0b24KICAgICAgICAg ICAgICAgICAgICBjbGFzcz0iZGVzdHJveSIKICAgICAgICAgICAgICAgICAgICB0aXRsZT0i Jy5nVHh0KCdkZWxldGUnKS4nIgogICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9Iicg LiBnVHh0KCdkZWxldGUnKSAuICciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2xv c2UiPicgLiBnVHh0KCdkZWxldGUnKSAuICc8L2J1dHRvbj4nCiAgICAgICAgICAgICAgICAu bi4gJzxpbWcgY2xhc3M9ImNvbnRlbnQtaW1hZ2UiCiAgICAgICAgICAgICAgICAgICAgc3Jj PSInIC4gJHVybCAuICciCiAgICAgICAgICAgICAgICAgICAgYWx0PSInIC4gJGltZ19pbmZv IC4gJyIKICAgICAgICAgICAgICAgICAgICB0aXRsZT0iJyAuICRpbWdfaW5mbyAuICciCiAg ICAgICAgICAgICAgICAgICAgZGF0YS1yZWY9IicgLiAkcm93WydpZCddIC4gJyIKICAgICAg ICAgICAgICAgICAgICBkYXRhLW5hbWU9IicgLiAkcm93WyduYW1lJ10gLiAnIgogICAgICAg ICAgICAgICAgICAgIC8+JwogICAgICAgICAgICAgICAgLm4uICc8L2Rpdj4nOwogICAgICAg IH0KCiAgICAgICAgJG91dCA9IGltcGxvZGUobiwgJGltZyk7CgogICAgICAgIHNlbmRfanNv bl9yZXNwb25zZShhcnJheSgnY29udGVudCcgPT4gJG91dCkpOwogICAgfQoKICAgIC8qKgog ICAgICogU3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBVSSBmb3IgbGF5dGVyIHJlY2FsbC4KICAg ICAqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAkZXZ0IFRleHRwYXR0ZXJuIGV2ZW50IChwYW5l bCkKICAgICAqIEBwYXJhbSAgc3RyaW5nICRzdHAgVGV4dHBhdHRlcm4gc3RlcCAoYWN0aW9u KQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZVN0YXRlKCRldnQsICRzdHApCiAg ICB7CiAgICAgICAgJGxvYWRNZXRob2QgPSBwcygnbG9hZE1ldGhvZCcpOwogICAgICAgICRz aXplID0gcHMoJ3NpemUnKTsKICAgICAgICAkZmllbGQgPSBwcygnZmllbGQnKTsKICAgICAg ICAkc29ydCA9IHBzKCdzb3J0X29yZGVyJyk7CiAgICAgICAgJGRpciA9IHBzKCdzb3J0X2Rp cicpOwogICAgICAgICRwbGF0ZSA9IHBzKCdwbGF0ZScpOwoKICAgICAgICBpZiAoJGxvYWRN ZXRob2QgIT09ICJudWxsIikgewogICAgICAgICAgICBzZXRfcHJlZignc21kX2ltYWdlcnlf bG9hZF9tZXRob2QnLCAkbG9hZE1ldGhvZCwgJHRoaXMtPnBsdWdpbl9ldmVudCwgMiwgbnVs bCwgMCwgUFJFRl9QUklWQVRFKTsKICAgICAgICB9CgogICAgICAgIGlmICgkc2l6ZSAhPT0g Im51bGwiKSB7CiAgICAgICAgICAgIHNldF9wcmVmKCdzbWRfaW1hZ2VyeV9zaXplJywgJHNp emUsICR0aGlzLT5wbHVnaW5fZXZlbnQsIDIsIG51bGwsIDAsIFBSRUZfUFJJVkFURSk7CiAg ICAgICAgfQoKICAgICAgICBpZiAoJGZpZWxkICE9PSAibnVsbCIpIHsKICAgICAgICAgICAg c2V0X3ByZWYoJ3NtZF9pbWFnZXJ5X2ZpZWxkJywgJGZpZWxkLCAkdGhpcy0+cGx1Z2luX2V2 ZW50LCAyLCBudWxsLCAwLCBQUkVGX1BSSVZBVEUpOwogICAgICAgIH0KCiAgICAgICAgaWYg KCRzb3J0ICE9PSAibnVsbCIpIHsKICAgICAgICAgICAgc2V0X3ByZWYoJ3NtZF9pbWFnZXJ5 X3NvcnRfb3JkZXInLCAkc29ydCwgJHRoaXMtPnBsdWdpbl9ldmVudCwgMiwgbnVsbCwgMCwg UFJFRl9QUklWQVRFKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZGlyICE9PSAibnVsbCIp IHsKICAgICAgICAgICAgc2V0X3ByZWYoJ3NtZF9pbWFnZXJ5X3NvcnRfZGlyJywgJGRpciwg JHRoaXMtPnBsdWdpbl9ldmVudCwgMiwgbnVsbCwgMCwgUFJFRl9QUklWQVRFKTsKICAgICAg ICB9CgogICAgICAgIGlmICgkcGxhdGUgIT09ICJudWxsIikgewogICAgICAgICAgICBzZXRf cHJlZignc21kX2ltYWdlcnlfdGVtcGxhdGUnLCAkcGxhdGUsICR0aGlzLT5wbHVnaW5fZXZl bnQsIDIsIG51bGwsIDAsIFBSRUZfUFJJVkFURSk7CiAgICAgICAgfQoKICAgICAgICBzZW5k X2pzb25fcmVzcG9uc2UoYXJyYXkoJ2xtJyA9PiAkbG9hZE1ldGhvZCwgJ3N6JyA9PiAkc2l6 ZSwgJ2ZsJyA9PiAkZmllbGQsICdzbycgPT4gJHNvcnQsICdkcicgPT4gJGRpciwgJ3BsJyA9 PiAkcGxhdGUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIExvb2sgdXAgYW55IGNhdGVnb3Jp ZXMgYW5kIHJldHVybiBhbGwgaWQgdmFsdWVzIHZpYSBKU09OLgogICAgICoKICAgICAqIEBw YXJhbSAgc3RyaW5nICRldnQgVGV4dHBhdHRlcm4gZXZlbnQgKHBhbmVsKQogICAgICogQHBh cmFtICBzdHJpbmcgJHN0cCBUZXh0cGF0dGVybiBzdGVwIChhY3Rpb24pCiAgICAgKiBAcmV0 dXJuIEpTT04gICAgICAgIExpc3Qgb2YgSURzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlv biByZXBsYWNlSlNPTigkZXZ0LCAkc3RwKQogICAgewogICAgICAgICRkYXRhID0gcHMoJ2Fy dGljbGVJbWFnZScpOwogICAgICAgICRpZExpc3QgPSAkdGhpcy0+cmVwbGFjZSgkZGF0YSk7 CiAgICAgICAgc2VuZF9qc29uX3Jlc3BvbnNlKGpzb25fZW5jb2RlKCRpZExpc3QpKTsKICAg IH0KCiAgICAvKioKICAgICAqIExvb2sgdXAgYW55IGNhdGVnb3JpZXMgYW5kIHJldHVybiBh bGwgaWQgdmFsdWVzIGR1cmluZyBzYXZlLgogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5n ICRldnQgVGV4dHBhdHRlcm4gZXZlbnQgKHBhbmVsKQogICAgICogQHBhcmFtICBzdHJpbmcg JHN0cCBUZXh0cGF0dGVybiBzdGVwIChhY3Rpb24pCiAgICAgKiBAcmV0dXJuIHN0cmluZyAg ICAgIExpc3Qgb2YgSURzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZXBsYWNlUE9T VCgkZXZ0LCAkc3RwKQogICAgewogICAgICAgICRkYXRhID0gcHMoJ0ltYWdlJyk7CiAgICAg ICAgJGlkTGlzdCA9ICR0aGlzLT5yZXBsYWNlKCRkYXRhKTsKICAgICAgICAkX1BPU1RbJ0lt YWdlJ10gPSAkaWRMaXN0OwogICAgfQoKICAgIC8qKgogICAgICogUmVwbGFjZSBhbnkgY2F0 ZWdvcmllcyBpbiB0aGUgcGFzc2VkIHN0cmluZyB3aXRoIGlkIHZhbHVlcy4KICAgICAqCiAg ICAgKiBBbnkgZHVwbGljYXRlIHZhbHVlcyBhcmUgb25seSBpbmNsdWRlZCBvbmNlLgogICAg ICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICRkYXRhIFRoZSBsaXN0IG9mIElEcyAvIGNhdCBu YW1lcwogICAgICogQHJldHVybiBzdHJpbmcgICAgICAgTGlzdCBvZiBJRHMKICAgICAqLwog ICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHJlcGxhY2UoJGRhdGEpCiAgICB7CiAgICAgICAgaWYg KCRkYXRhKSB7CiAgICAgICAgICAgICRyZXBzID0gYXJyYXkoKTsKCiAgICAgICAgICAgIC8v IENyZWF0ZSBhbiBhcnJheSBvZiBJRHMvY2F0IG5hbWVzLgogICAgICAgICAgICAkaXRlbXMg PSBkb19saXN0KCRkYXRhKTsKCiAgICAgICAgICAgIC8vIEdldCBqdXN0IHRoZSBjYXRlZ29y eSBuYW1lcyAoaWYgYW55KS4KICAgICAgICAgICAgJGNhdHMgPSBhcnJheV9maWx0ZXIoJGl0 ZW1zLCBhcnJheSgkdGhpcywgJ2ZpbHRlckNhdHMnKSk7CgogICAgICAgICAgICBpZiAoJGNh dHMpIHsKICAgICAgICAgICAgICAgIC8vIENvdWxkIHVzZSBncm91cF9jb25jYXQsIGJ1dCBp dCdzIE15U1FMIHNwZWNpZmljLiBUaGluayBvZiB0aGUgZnV0dXJlLgogICAgICAgICAgICAg ICAgJHJzID0gc2FmZV9yb3dzKCdpZCwgY2F0ZWdvcnknLCAndHhwX2ltYWdlJywgJ2NhdGVn b3J5IElOKCcgLiBpbXBsb2RlKCcsJywgcXVvdGVfbGlzdCgkY2F0cykpIC4gJyknKTsKCiAg ICAgICAgICAgICAgICAvLyBFeHRyYWN0IElEcyBpbnRvIGEgY2F0ZWdvcnktaW5kZXhlZCBh cnJheSwgYXMgbG9uZyBhcyB0aGV5CiAgICAgICAgICAgICAgICAvLyBoYXZlbid0IGJlZW4g c2VlbiBiZWZvcmUuCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcnMgYXMgJHJvdykgewog ICAgICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJHJvd1snaWQnXSwgJGl0ZW1zKSkg ewogICAgICAgICAgICAgICAgICAgICAgICAkcmVwc1skcm93WydjYXRlZ29yeSddXVtdID0g JHJvd1snaWQnXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9Cgog ICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBhbnkgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwg JGl0ZW1zIGFycmF5IHRoYXQKICAgICAgICAgICAgICAgIC8vIG1hdGNoZXMgYSBjYXRlZ29y eSBuYW1lIHB1bGxlZCBmcm9tIHRoZSBEQiwgd2l0aCB0aGUKICAgICAgICAgICAgICAgIC8v IGNvbmNhdGVuYXRlZCBsaXN0IG9mIGlkIHZhbHVlcyBpdCByZXByZXNlbnRzLgogICAgICAg ICAgICAgICAgaWYgKCRyZXBzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJl cHMgYXMgJGNhdCA9PiAkaWRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwb3MgPSBh cnJheV9zZWFyY2goJGNhdCwgJGl0ZW1zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlm ICgkcG9zICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1z WyRwb3NdID0gaW1wbG9kZSgnLCcsICRpZHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAg ICAgIC8vIFNxdWlzaCBhbCBpdGVtcyBpbnRvIGEgc2luZ2xlIGNvbW1hLXNlcGFyYXRlZCBs aXN0LgogICAgICAgICAgICAgICAgJGRhdGEgPSBpbXBsb2RlKCcsJywgJGl0ZW1zKTsKICAg ICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRkYXRhOwogICAgfQoKICAg IC8qKgogICAgICogYXJyYXlfZmlsdGVyIGNhbGxiYWNrIHRvIHJlbW92ZSBwdXJlbHkgbnVt ZXJpYyBpZCB2YWx1ZXMuCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgJHYgVmFsdWUg dG8gY29tcGFyZSwgZnJvbSBhcnJheV9maWx0ZXIoKSBmdW5jdGlvbgogICAgICogQHJldHVy biBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmaWx0ZXJDYXRzKCR2KQog ICAgewogICAgICAgIHJldHVybiAhaXNfbnVtZXJpYygkdik7CiAgICB9CgogICAgLyoqCiAg ICAgKiBHZXQgYSBsaXN0IG9mIHZhbGlkIGltYWdlIGZpZWxkcyB0byBzb3J0IGJ5LgogICAg ICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9u IHNvcnRPcHRzKCkKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdu YW1lJyAgID0+IGdUeHQoJ25hbWUnKSwKICAgICAgICAgICAgJ2lkJyAgICAgPT4gZ1R4dCgn SUQnKSwKICAgICAgICAgICAgJ2RhdGUnICAgPT4gZ1R4dCgnZGF0ZScpLAogICAgICAgICAg ICAnYXV0aG9yJyA9PiBnVHh0KCdhdXRob3InKSwKICAgICAgICAgICAgJ2V4dCcgICAgPT4g Z1R4dCgnZXh0ZW5zaW9uJyksCiAgICAgICAgICAgICd3JyAgICAgID0+IGdUeHQoJ3dpZHRo JyksCiAgICAgICAgICAgICdoJyAgICAgID0+IGdUeHQoJ2hlaWdodCcpLAogICAgICAgICk7 CiAgICB9Cn0iO3M6NDoidHlwZSI7czoxOiI0IjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6NToi ZmxhZ3MiO3M6MToiMiI7czo0OiJoZWxwIjtzOjg5OTc6IjxoMT5zbWRfaW1hZ2VyeTwvaDE+ Cgo8cD5JbnNlcnQgaW1hZ2VzIGludG8geW91ciBXcml0ZSBwYW5lbC4gVmVyeSBoYW5keSBm b3IgcGVvcGxlIHdobyBydW4gcGhvdG9ibG9nIG9yIGltYWdlLWhlYXZ5IHNpdGVzLCBvciB0 aG9zZSB3aG8gY2F0ZWdvcmlzZSBpbWFnZXMgZm9yIGluY2x1c2lvbiBpbiBhcnRpY2xlcy48 L3A+Cgo8aDI+RmVhdHVyZXM8L2gyPgoKPHVsPgoJPGxpPlJlcGxhY2UgY2F0ZWdvcnkgbmFt ZXMgd2l0aCBpbWFnZSBpZCB2YWx1ZXMgaW4gdGhlIEFydGljbGUgSW1hZ2UgZmllbGQuPC9s aT4KCTxsaT5Db21tYS1zZXBhcmF0ZSBjYXRlZ29yeSBuYW1lcyB0byBncmFiIGlkIHZhbHVl cyBmcm9tIHRoZW0gYWxsIGF0IG9uY2UuPC9saT4KCTxsaT5PcmRlciBvZiBpbWFnZSBpZCB2 YWx1ZXMgaXMgcHJlc2VydmVkLjwvbGk+Cgk8bGk+Q3JhZnQgY3VzdG9tIGltYWdlIHNldHMg YmFzZWQgb24gYW4gaW1hZ2UgY2F0ZWdvcnksIG9yIGxvYWQgaW1hZ2VzIGZyb20gYW4gYXJ0 aWNsZSBmaWVsZC48L2xpPgoJPGxpPkJ1aWxkIGEgbGlzdCBvZiBpZCB2YWx1ZXMgb3IgYSBj b21wbGV0ZSB0YWcgdG8gcGFzdGUgaW50byB5b3VyIGFydGljbGUgdmlhIGEgdGVtcGxhdGUu PC9saT4KCTxsaT5GYXN0IGFuZCBlZmZpY2llbnQ6IG9ubHkgb25lIHF1ZXJ5LjwvbGk+Cjwv dWw+Cgo8aDI+SW5zdGFsbGF0aW9uIC8gVW5pbnN0YWxsYXRpb248L2gyPgoKPHAgY2xhc3M9 ImluZm9ybWF0aW9uIj5SZXF1aXJlcyBUZXh0cGF0dGVybiA0LjUrPC9wPgoKPHAgY2xhc3M9 ImluZm9ybWF0aW9uIj5SZWNvbW1lbmRlZDogVGV4dHBhdHRlcm4gNC42KzwvcD4KCjxwPjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9CbG9rZS9zbWRfaW1hZ2VyeS9yZWxlYXNlcyI+ RG93bmxvYWQgdGhlIHBsdWdpbjwvYT4sIHBhc3RlIHRoZSBjb2RlIGludG8gdGhlIFRleHRw YXR0ZXJuIDxlbT5BZG1pbi0mZ3Q7UGx1Z2luczwvZW0+IHBhbmVsLCBpbnN0YWxsIGFuZCBl bmFibGUgdGhlIHBsdWdpbi4gRm9yIGJ1ZyByZXBvcnRzLCBwbGVhc2UgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL0Jsb2tlL3NtZF9pbWFnZXJ5L2lzc3VlcyI+cmFpc2UgYW4gaXNz dWU8L2E+LjwvcD4KCjxwPlRvIHVuaW5zdGFsbCwgZGVsZXRlIHRoZSBwbHVnaW4gZnJvbSB0 aGUgPGVtPkFkbWluLSZndDtQbHVnaW5zPC9lbT4gcGFuZWwuPC9wPgoKPGgyPlVzYWdlPC9o Mj4KCjxwPk9uY2UgaW5zdGFsbGVkLCB0d28gbmV3IGJ1dHRvbnMgbGFiZWxsZWQgPGVtPkZl dGNoPC9lbT4gYW5kIDxlbT5NYW5hZ2U8L2VtPiBhcHBlYXIgYmVsb3cgdGhlIEFydGljbGUg SW1hZ2UgZmllbGQuIEJvdGggb2YgdGhlc2UgYWxsb3cgeW91IHRvIGluc2VydCBpbWFnZXMg aW50byB5b3VyIGFydGljbGUsIGJ1dCB0aGV5IGRvIGl0IGluIGRpZmZlcmVudCB3YXlzLCBh cyBkZXRhaWxlZCBiZWxvdy48L3A+Cgo8aDM+UG9wdWxhdGluZyBBcnRpY2xlIEltYWdlIGJ5 IGNhdGVnb3J5PC9oMz4KCjxwPlVzZSB0aGUgPGVtPkZldGNoPC9lbT4gYnV0dG9uIHRvIGlt bWVkaWF0ZWx5IGFzayB0aGUgZGF0YWJhc2UgdG8gZ3JhYiB0aGUgaW1hZ2UgaWQgdmFsdWVz IGZyb20gYW55IGNhdGVnb3J5IG5hbWVzIGxpc3RlZCBpbiB0aGUgPGVtPkFydGljbGUgSW1h Z2U8L2VtPiBmaWVsZC4gSWYgeW91IGFyZSB1c2luZyBUZXh0cGF0dGVybiB2NC42LjAgb3Ig bGF0ZXIsIGp1c3Qgc2F2ZSBvciBwdWJsaXNoIHRoZSBhcnRpY2xlOiB0aGUgaW1hZ2UgaWQg dmFsdWVzIHdpbGwgYmUgZmV0Y2hlZCBmb3IgeW91IGF1dG9tYXRpY2FsbHkgYW5kIHBvcHVs YXRlZCBpbiB0aGUgPGVtPkFydGljbGUgSW1hZ2U8L2VtPiBib3guPC9wPgoKPHA+Tm90ZXM6 PC9wPgoKPHVsPgoJPGxpPlRoZSBvcmRlciBvZiBpZCB2YWx1ZXMgYWxyZWFkeSBwcmVzZW50 IGluIHRoZSBBcnRpY2xlIEltYWdlIGZpZWxkIGlzIHBlcnNlcnZlZCBhZnRlciByZXBsYWNl bWVudC48L2xpPgoJPGxpPkFueSBjYXRlZ29yaWVzIHRoYXQgZG8gbm90IGV4aXN0IChvciB0 eXBvcykgd2lsbCByZW1haW4gaW4gdGhlIGxpc3QuPC9saT4KCTxsaT5BbnkgY2F0ZWdvcnkg bmFtZXMgdGhhdCBhcmUgd2hvbGx5IG51bWVyaWMgd2lsbCA8ZW0+bm90PC9lbT4gYmUgZmV0 Y2hlZCwgYXMgdGhlIHBsdWdpbiBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIGFu ZCBpZCB2YWx1ZXMuPC9saT4KCTxsaT5UaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVy cyAmIzgyMTI7IGluY3VkaW5nIGNvbW1hcyBhbmQgc3BhY2VzICYjODIxMjsgdGhhdCBjYW4g YmUgc3RvcmVkIGluIHRoZSBBcnRpY2xlIEltYWdlIGZpZWxkIGlzIDI1NSBieSBkZWZhdWx0 LiBUaGlzIGlzIHdoeSB0aGUgcGx1Z2luIGRvZXNuJiM4MjE3O3QgcHV0IHNwYWNlcyBiZXR3 ZWVuIGl0cyBpZCB2YWx1ZXMuIElmIHlvdSBpbnNlcnQgYSBjYXRlZ29yeSBuYW1lIHRoYXQg cmVzdWx0cyBpbiB0aGUgaW1hZ2UgaWQgbGlzdCBleGNlZWRpbmcgdGhpcyBudW1iZXIgb2Yg Y2hhcmFjdGVycywgdGhlIGFydGljbGUgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuIHNhdmlu Zy48L2xpPgo8L3VsPgoKPGgzPkV4YW1wbGVzPC9oMz4KCjxoND5FeGFtcGxlIDE8L2g0PgoK PHVsPgoJPGxpPkNyZWF0ZSBhbiBpbWFnZSBjYXRlZ29yeSBjYWxsZWQgPGNvZGU+aG9saWRh eV9zbmFwczwvY29kZT4uPC9saT4KCTxsaT5VcGxvYWQgc29tZSBpbWFnZXMgYW5kIGFzc2ln biB0aGVtIHRvIHRoYXQgY2F0ZWdvcnkuPC9saT4KCTxsaT5PbiB0aGUgV3JpdGUgcGFuZWws IHR5cGUgPGNvZGU+aG9saWRheV9zbmFwczwvY29kZT4gaW50byB0aGUgQXJ0aWNsZSBJbWFn ZSBmaWVsZC48L2xpPgoJPGxpPkhpdCA8ZW0+RmV0Y2g8L2VtPi48L2xpPgoJPGxpPk5vdGUg dGhhdCA8Y29kZT5ob2xpZGF5X3NuYXBzPC9jb2RlPiBoYXMgYmVlbiByZXBsYWNlZCB3aXRo IGEgbGlzdCBvZiBpbWFnZSBpZCB2YWx1ZXMgdGhhdCB3ZXJlIGFzc29hY2lhdGVkIHdpdGgg dGhhdCBjYXRlZ29yeS48L2xpPgo8L3VsPgoKPGg0PkV4YW1wbGUgMjwvaDQ+Cgo8dWw+Cgk8 bGk+Q3JlYXRlIGEgZmV3IGltYWdlIGNhdGVnb3JpZXMuPC9saT4KCTxsaT5VcGxvYWQgc29t ZSBpbWFnZXMgdG8gZWFjaC48L2xpPgoJPGxpPk9uIHRoZSBXcml0ZSBwYW5lbCwgbGlzdCB0 aGUgaW1hZ2UgY2F0ZWdvcnkgbmFtZXMgaW4gdGhlIEFydGljbGUgSW1hZ2UgZmllbGQuPC9s aT4KCTxsaT5IaXQgPGVtPkZldGNoPC9lbT4gYW5kIG5vdGUgdGhlIGNvbnRlbnQgb2YgdGhl IEFydGljbGUgSW1hZ2UgZmllbGQgaGFzIGJlZW4gcG9wdWxhdGVkIHdpdGggdGhlIGlkIHZh bHVlcyBmcm9tIGVhY2ggb2YgdGhlIGNhdGVnb3JpZXMuPC9saT4KPC91bD4KCjxoND5FeGFt cGxlIDM8L2g0PgoKPHA+RG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gRXhhbXBsZSAyLCBidXQg YmVmb3JlIGh0dG5nIHRoZSA8ZW0+RmV0Y2g8L2VtPiBidXR0b24sIHNwcmlua2xlIHNvbWUg b3RoZXIgaW1hZ2UgaWQgdmFsdWVzIGluIHRoZSBBcnRpY2xlIEltYWdlIGZpZWxkLiBGb3Ig ZXhhbXBsZTo8L3A+Cgo8cHJlPjxjb2RlPjE1LCA0MiwgaG9saWRheV9zbmFwcywgNiwgbmln aHQtb3V0LCAxMjk8L2NvZGU+PC9wcmU+Cgo8cD5BZnRlciBoaXR0aW5nIDxlbT5GZXRjaDwv ZW0+LCBub3RlIHRoYXQgdGhlIGlkIHZhbHVlcyBwdWxsZWQgZnJvbSB0aGUgZGF0YWJhc2Ug YXJlIHJlcGxhY2VkIGluLXNpdHUuIEFsc28gbm90ZSB0aGF0IGlmIG9uZSBvciBtb3JlIG9m IHRoZSBpZCB2YWx1ZXMgeW91JiM4MjE3O3ZlIHR5cGVkIGFyZSB0aGUgc2FtZSBhcyBhbnkg aW4gdGhlIGNhdGVnb3JpZXMgeW91JiM4MjE3O3JlIGZldGNoaW5nLCB0aGUgZHVwbGljYXRl cyB3aWxsIG5vdCBiZSBmZXRjaGVkLiBGdXJ0aGVyLCBpZiBhbGwgb2YgdGhlIGlkIHZhbHVl cyB0aGF0IGNvbXByaXNlIGEgY2F0ZWdvcnkgYXJlIGFscmVhZHkgaW4gdGhlIEFydGljbGUg SW1hZ2UgZmllbGQsIHRoYXQgY2F0ZWdvcnkgbmFtZSB3aWxsIHJlbWFpbiBpbiB0aGUgbGlz dC48L3A+Cgo8aDM+Q3JhZnRpbmcgaW1hZ2UgbGlzdHMgYnkgaGFuZDwvaDM+Cgo8cD5Gb3Ig bW9yZSBjb250cm9sIG92ZXIgeW91ciBpbWFnZSBsaXN0cywgYW5kIHdoZXJlIHlvdSBjYW4g aW5zZXJ0IHRoZSByZXN1bHRpbmcgdmFsdWVzLCB1c2UgdGhlIDxlbT5NYW5hZ2U8L2VtPiBi dXR0b24uIFRoaXMgd2lsbCBwb3AgdXAgYSBkaWFsb2cgYm94IHRoYXQgY29udGFpbnMgYSBy YWRpbyBidXR0b24gdG8gYWxsb3cgeW91IHRvIGNob29zZSBiZXR3ZWVuIHR3byBtZXRob2Rz IG9mIGZldGNoaW5nIGltYWdlczo8L3A+Cgo8dWw+Cgk8bGk+QnkgY2F0ZWdvcnk6IHRvIGxv YWQgaW1hZ2VzIGJ5IHRoZSBjaG9zZW4gY2F0ZWdvcnksIGF0IHRoZSBjaG9zZW4gc2l6ZSwg b3JkZXJlZCBieSB0aGUgY2hvc2VuIHByb3BlcnR5IGluIHRoZSBkZXNpcmVkIG9yZGVyIGRl cGljdGVkIGJ5IHRoZSBhcnJvdy48L2xpPgoJPGxpPkZyb20gZmllbGQ6IHRvIGxvYWQgaW1h Z2VzIGZyb20gdGhlIHNlbGVjdGVkIGFydGljbGUgZmllbGQsIGluIHRoZSBvcmRlciBkZWZp bmVkIGluIHRoYXQgZmllbGQuPC9saT4KPC91bD4KCjxwPkluIHRoZSBsYXR0ZXIgY2FzZSwg dGhlIHBsdWdpbiBzZWFyY2hlcyBmb3IgaW1hZ2VzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6 PC9wPgoKPG9sPgoJPGxpPkEgc3RyYWlnaHQgbGlzdCBvZiBpZCB2YWx1ZXMuPC9saT4KCTxs aT48Y29kZT4mbHQ7dHhwOmltYWdlcyBpZD0mcXVvdDt4LCB5LCB6LCAuLi4mcXVvdDsmZ3Q7 PC9jb2RlPi48L2xpPgoJPGxpPjxjb2RlPiZsdDt0eHA6aW1hZ2VzIG5hbWU9JnF1b3Q7Zmls ZTEuanBnLCBmaWxlMi5wbmcsIGZpbGUzLmpwZywgLi4uJnF1b3Q7Jmd0OzwvY29kZT4uPC9s aT4KCTxsaT48Y29kZT4mbHQ7dHhwOmltYWdlIGlkPSZxdW90O3gmcXVvdDsgLyZndDs8L2Nv ZGU+IDxjb2RlPiZsdDt0eHA6aW1hZ2UgaWQ9JnF1b3Q7eSZxdW90OyAvJmd0OzwvY29kZT4g PGNvZGU+Jmx0O3R4cDppbWFnZSBpZD0mcXVvdDt6JnF1b3Q7IC8mZ3Q7PC9jb2RlPiAmIzgy MzA7PC9saT4KCTxsaT48Y29kZT4mbHQ7aW1nIHNyYz0mcXVvdDtodHRwOi8vZXhhbXBsZS5v cmcvaW1hZ2VzL3guanBnJnF1b3Q7IC8mZ3Q7PC9jb2RlPiA8Y29kZT4mbHQ7aW1nIHNyYz0m cXVvdDtodHRwOi8vZXhhbXBsZS5vcmcvaW1hZ2VzL3kucG5nJnF1b3Q7IC8mZ3Q7PC9jb2Rl PiA8Y29kZT4mbHQ7aW1nIHNyYz0mcXVvdDtodHRwOi8vZXhhbXBsZS5vcmcvaW1hZ2VzL3ou anBnJnF1b3Q7IC8mZ3Q7PC9jb2RlPiAmIzgyMzA7PC9saT4KPC9vbD4KCjxwPk5vdGVzOjwv cD4KCjx1bD4KCTxsaT5TZWxlY3RpbmcgdGhlIGVtcHR5IGVudHJ5IGF0IHRoZSB0b3Agb2Yg dGhlIGNhdGVnb3J5IGxpc3Qgd2lsbCBmZXRjaCBhbGwgdW5jYXRlZ29yaXplZCBpbWFnZXMu PC9saT4KCTxsaT5JZiB5b3UgaGF2ZSB0aGUgc21kX3RodW1ibmFpbCBwbHVnaW4gaW5zdGFs bGVkLCBhbnkgYWN0aXZlIHByb2ZpbGVzIHlvdSBoYXZlIGRlZmluZWQgYXJlIGFsc28gYXZh aWxhYmxlIGluIHRoZSAmIzgyMTY7c2l6ZSYjODIxNzsgZHJvcGRvd24uPC9saT4KCTxsaT5J ZiB5b3UgY2hvb3NlICYjODIxNjtJbWFnZSYjODIxNzsgYXMgdGhlIHNpemUsIGl0IHdpbGwg ZmV0Y2ggZXZlcnkgZnVsbC1zaXplIGltYWdlIGluIHRoZSBjaG9zZW4gY2F0ZWdvcnkuIFRo aXMgbWF5IHRha2Ugc29tZSB0aW1lIGlmIHRoZSBudW1iZXIgb2YgaW1hZ2VzIGlzIGxhcmdl ITwvbGk+CjwvdWw+Cgo8cD5PbmNlIHlvdSBoYXZlIHNlbGVjdGVkIHlvdXIgaW1hZ2UgY2F0 ZWdvcnkvZmllbGQgYW5kIHByb3BlcnRpZXMsIGhpdCB0aGUgbmVhcmJ5IDxlbT5GZXRjaDwv ZW0+IGJ1dHRvbi4gQWxsIGltYWdlcyB0aGF0IG1hdGNoIHRoZSBjcml0ZXJpYSBvZiB0aGF0 IHNpemUgd2lsbCBiZSBsb2FkZWQgaW4gdGhlIGRpYWxvZyB3aW5kb3cgZm9yIHlvdXIgY29u c2lkZXJhdGlvbi4gWW91IG1heSBkcmFnIGFuZCBkcm9wIHRoZSBpbWFnZXMgdG8gcmVvcmRl ciB0aGVtIHRvIHRhc3RlLCBvciBoaXQgdGhlICYjODIxNjt4JiM4MjE3OyBidXR0b24gdG8g cmVtb3ZlIGFuIGltYWdlIGZyb20gdGhlIGxpc3QuIEl0IDxzdHJvbmc+d2lsbCBub3Q8L3N0 cm9uZz4gZGVsZXRlIHRoZSByZWFsIGltYWdlIG9uIGRpc2ssIGp1c3QgcmVtb3ZlIGl0IGZy b20gdGhlIGxpc3QgaW4gdGhlIGRpYWxvZyBib3guPC9wPgoKPHA+QXMgeW91IGFsdGVyIHRo ZSBpbWFnZXMgaW4gdGhlIGRpYWxvZyBib3gsIHRoZSA8ZW0+UmVzdWx0PC9lbT4gdGV4dGFy ZWEgYm94IGF0IHRoZSBib3R0b20gb2YgdGhlIGRpYWxvZyBpcyB1cGRhdGVkIGluIHJlYWwt dGltZSB0byByZWZsZWN0IHRoZSBsaXN0IG9mIGlkIHZhbHVlcyB0aGF0IHJlcHJlc2VudCB5 b3VyIGNob3NlbiBpbWFnZSBzZXQuIEF0IGFueSB0aW1lIHlvdSBjYW4gY29weSB0aGF0IGxp c3QgYW5kIHBhc3RlIGl0IGludG8gdGhlIEFydGljbGUgSW1hZ2UgZmllbGQsIGEgY3VzdG9t IGZpZWxkLCB0aGUgYm9keSwgZXRjIGluIG9yZGVyIHRvIGJ1aWxkIHlvdXIgZ2FsbGVyeS48 L3A+Cgo8cD5Zb3UgbWF5IGFsc28gdXNlIHRoZSA8ZW0+VGVtcGxhdGU8L2VtPiBib3ggdG8g c3BlY2lmeSBhIHRlbXBsYXRlIGludG8gd2hpY2ggdGhlIGxpc3Qgd2lsbCBiZSBpbnNlcnRl ZC4gVGhlIGVudGlyZSBzZXQgd2lsbCB0aGVuIGJlIGF2YWlsYWJsZSBpbiB0aGUgPGVtPlJl c3VsdDwvZW0+IGJveC4gVGhpcyBpcyBwcmltYXJpbHkgZGVzaWduZWQgZm9yIGNyZWF0aW5n IHRhZ3Mgc3VjaCBhcyA8Y29kZT4mbHQ7dHhwOmltYWdlcyZndDs8L2NvZGU+IGZyb20geW91 ciBsaXN0cy4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBkZWZpbmUgeW91ciB0YWcgdGVtcGxh dGUgYXM6PC9wPgoKPHByZT48Y29kZT4mbHQ7dHhwOmltYWdlcyBpZD0mcXVvdDt7c21kX2lt YWdlcnlfbGlzdF9pZH0mcXVvdDsgZm9ybT0mcXVvdDtnYWxsZXJ5JnF1b3Q7IC8mZ3Q7PC9j b2RlPjwvcHJlPgoKPHA+V2hpY2hldmVyIGltYWdlcyB5b3UgY2hvb3NlIGluIHRoZSBsaXN0 LCB0aGVpciBpZCB2YWx1ZXMgd2lsbCBiZSBpbnNlcnRlZCBpbiBwbGFjZSBvZiB0aGUgPGNv ZGU+e3NtZF9pbWFnZXJ5X2xpc3RfaWR9PC9jb2RlPiwgaW4gcmVhbC10aW1lLiBJZiB5b3Ug cHJlZmVyIGltYWdlIG5hbWVzLCB5b3UgbWF5IGVsZWN0IHRvIGRlZmluZSB5b3VyIHRhZyBz b21ldGhpbmcgbGlrZSB0aGlzOjwvcD4KCjxwcmU+PGNvZGU+Jmx0O3R4cDppbWFnZXMgbmFt ZT0mcXVvdDt7c21kX2ltYWdlcnlfbGlzdF9uYW1lfSZxdW90OyBmb3JtPSZxdW90O2dhbGxl cnkmcXVvdDsKICAgd3JhcHRhZz0mcXVvdDtkaXYmcXVvdDsgY2xhc3M9JnF1b3Q7cGhvdG9z JnF1b3Q7IC8mZ3Q7PC9jb2RlPjwvcHJlPgoKPHA+VGhlcmUgYXJlIGFsc28gYSBwYWlyIG9m IHNwZWNpYWxpc2VkIHJlcGxhY2VtZW50IHRhZ3MgdG8gcmV0dXJuIHF1b3RlZCBsaXN0cyBv ZiBpZHMgb3IgbmFtZXM6IDxjb2RlPntzbWRfaW1hZ2VyeV9saXN0X2lkX3F1b3RlZH08L2Nv ZGU+IG9yIDxjb2RlPntzbWRfaW1hZ2VyeV9saXN0X25hbWVfcXVvdGVkfTwvY29kZT4uPC9w PgoKPHA+SWYgeW91IHdpc2ggdG8gaW5zZXJ0IGVhY2ggaW1hZ2UgaW5kaXZpZHVhbGx5LCB5 b3UgbWlnaHQgbGlrZSBvbmUgb2YgdGhlc2UgdGVtcGxhdGVzOjwvcD4KCjxwcmU+PGNvZGU+ Jmx0O3R4cDppbWFnZSBpZD0mcXVvdDt7c21kX2ltYWdlcnlfaWR9JnF1b3Q7IC8mZ3Q7PC9j b2RlPjwvcHJlPgoKPHA+b3I8L3A+Cgo8cHJlPjxjb2RlPiZsdDt0eHA6aW1hZ2UgbmFtZT0m cXVvdDt7c21kX2ltYWdlcnlfbmFtZX0mcXVvdDsgLyZndDs8L2NvZGU+PC9wcmU+Cgo8cD5Z b3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSBjb21wbGV0ZSB0YWcocykgZnJvbSB0aGUgPGVt PlJlc3VsdDwvZW0+IGJveCBhbmQgcGFzdGUgaXQgaW50byB5b3VyIGFydGljbGUgc29tZXdo ZXJlLCBvciB1c2UgaXQgYXMgYSBzbmVha3kgdGFnIGJ1aWxkZXIgZm9yIGdhbGxlcmllcy4g WW91ciB0ZW1wbGF0ZSBjb3VsZCBldmVuIGluY2x1ZGUgYW4gc21kX21hY3JvISBJZiB1c2lu ZyB0aGUgY29yZSB0YWdzLCB5b3VyIDxjb2RlPmdhbGxlcnk8L2NvZGU+IEZvcm0gY2FuLCBv ZiBjb3Vyc2UsIGJlIHVzZWQgdG8gcmVuZGVyIGFueXRoaW5nIHlvdSBsaWtlIHVzaW5nIHRo ZSA8Y29kZT4mbHQ7dHhwOmltYWdlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDt0eHA6aW1hZ2Vf aW5mbyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7dHhwOmltYWdlX3VybCZndDs8L2NvZGU+ IGV0IGFsIHRhZ3MuPC9wPgoKPHA+Tm90ZXM6PC9wPgoKPHVsPgoJPGxpPllvdXIgY2hvc2Vu IGltYWdlIHNpemUsIGZpZWxkLCB0ZW1wbGF0ZSB0YWcgYW5kIHNvcnQgb3B0aW9ucyBhcmUg YXV0b21hdGljYWxseSByZW1lbWJlcmVkIGFuZCByZWNhbGxlZCBlYWNoIHRpbWUgeW91IG9w ZW4gdGhlIGRpYWxvZyBib3ggc28geW91IGNhbiByYXBpZGx5IGJ1aWxkIGdhbGxlcmllcyBv biBwaG90by1oZWF2eSBzaXRlcy48L2xpPgoJPGxpPldoZW4gdXNpbmcgdGhlIDxjb2RlPiZs dDt0eHA6aW1hZ2VzJmd0OzwvY29kZT4gdGFnIHRvIGNvbnN0cnVjdCBnYWxsZXJpZXMgdXNp bmcgaXRzIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSwgdGhlIHJlc3VsdGluZyBnYWxs ZXJ5IDxlbT53aWxsIG5vdCBjb250YWluIGltYWdlcyBpbiB0aGUgb3JkZXIgeW91IHNwZWNp Znk8L2VtPi4gT25seSBpdHMgPGNvZGU+aWQ8L2NvZGU+IGF0dHJidXRlIHdpbGwgcmV0dXJu IHRoZW0gaW4gdGhlIGRlZmluZWQgb3JkZXIuPC9saT4KCTxsaT5UaGUgZGlhbG9nIGJveCBp cyBkb2cgdWdseSB1bmRlciBUeHAgNC41LnggYmVjYXVzZSBqUXVlcnkgVUkgaXMgbm90IGlu Y2x1ZGVkLCBub3Igc3R5bGVkIHRvIG1hdGNoIHRoZSBhZG1pbiB0aGVtZS4gVXNpbmcgdGhl IHBsdWdpbiB1bmRlciBUeHAgNC42KyBvZmZlcnMgYSBtdWNoIGNsZWFuZXIgZXhwZXJpZW5j ZS48L2xpPgo8L3VsPiI7czozOiJtZDUiO3M6MzI6ImUzYWYwNDYyYTgzZTBiMjNlMWM1YzU4 ZGRkMzQ0ZmEzIjtzOjg6InRleHRwYWNrIjtzOjMwOToiI0BzbWRfaW1hZ2VyeQpzbWRfaW1h Z2VyeV9kaWFsb2dfdGl0bGUgPT4gSW5zZXJ0IGltYWdlcwpzbWRfaW1hZ2VyeV9mZXRjaF9i dG4gPT4gRmV0Y2gKc21kX2ltYWdlcnlfaWRfYnRuID0+IEdldCBJRHMKc21kX2ltYWdlcnlf aW1hZ2UgPT4gSW1hZ2UKc21kX2ltYWdlcnlfb3B0X2NhdCA9PiBCeSBjYXRlZ29yeQpzbWRf aW1hZ2VyeV9vcHRfZmxkID0+IEZyb20gZmllbGQKc21kX2ltYWdlcnlfb3JnYW5pc2VfYnRu ID0+IE1hbmFnZQpzbWRfaW1hZ2VyeV9yZXN1bHQgPT4gUmVzdWx0CnNtZF9pbWFnZXJ5X3Rl bXBsYXRlID0+IFRlbXBsYXRlIjt9