# mem_moderation_image 0.4.4a # Moderation plugin that allows user to submit images. # Michael Manfre # http://manfre.net/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MjA6Im1lbV9tb2RlcmF0aW9uX2ltYWdlIjtzOjY6ImF1dGhvciI7czoxNDoiTWljaGFlbCBNYW5mcmUiO3M6MTA6ImF1dGhvcl91cmkiO3M6MTg6Imh0dHA6Ly9tYW5mcmUubmV0LyI7czo3OiJ2ZXJzaW9uIjtzOjY6IjAuNC40YSI7czoxMToiZGVzY3JpcHRpb24iO3M6NTI6Ik1vZGVyYXRpb24gcGx1Z2luIHRoYXQgYWxsb3dzIHVzZXIgdG8gc3VibWl0IGltYWdlcy4iO3M6NDoiaGVscCI7czozMjIwOiIJPGgxPkltYWdlIE1vZGVyYXRpb248L2gxPg0KDQoJPHA+VGhpcyBtb2RlcmF0aW9uIHBsdWdpbiBhbGxvd3MgdXNlcnMgdG8gc3VibWl0IGltYWdlcyBpbiB0byB0aGUgDQoJCW1vZGVyYXRpb24gcXVldWUuIElmIHRoZSBwbHVnaW4gbWVtX21vZGVyYXRpb25fYXJ0aWNsZSBpcyBpbnN0YWxsZWQsIA0KCQl0aGVuIHRoZXNlIGltYWdlcyBjYW4gYmUgd3JhcHBlZCBpbiBhIG5ldyBhcnRpY2xlLjwvcD4NCg0KCTxoMT5JbnN0YWxsYXRpb248L2gxPg0KDQoJPHA+VGhpcyBwbHVnaW4gcmVxdWlyZXMgcGx1Z2lucyBtZW1fbW9kZXJhdGlvbiBhbmQgbWVtX2FkbWluX3BhcnNlIA0KCQl0byBiZSBpbnN0YWxsZWQgYW5kIGVuYWJsZWQgdG8gZnVuY3Rpb24uPC9wPg0KDQoJPHA+PGEgaHJlZj0iaW5kZXgucGhwP2V2ZW50PWltYWdlX21vZGVyYXRlJiMzODtzdGVwPXByZWluc3RhbGwiPg0KCQlTdGFydCBJbnN0YWxsIFdpemFyZDwvYT48L3A+DQoNCg0KPHA+VGhlIHBsdWdpbiB1c2VzIHRoZSB0YWcgJiM2MDt0eHA6bW9kaW1nX2Zvcm0gLyYjNjI7DQo8cD4NCgk8Yj5Vbmxpa2U8L2I+PGk+IG1vZF9hcnRpY2xlX2ltYWdlPC9pPiwgdGhpcyBwbHVpZ24gPGI+d2lsbCBub3QgY3JlYXRlIA0KCQlyZWFkeS1tYWRlIGZvcm1zIHRvIGJlIHVzZWQ8L2I+LiBJdCB3aWxsLCB0aG91Z2gsIDxiPmV4cGVjdDwvYj4gYSBmb3JtDQoJCXRvIHVzZS4NCgkJWW91IGNhbiBzcGVjaWZ5IHRoZSBmb3JtIHVzaW5nIHRoZSBhdHRyaWJ1dGVzICAmIzYwO3R4cDptb2RpbWdfZm9ybSAvJiM2MjsgDQoJCWFjY2VwdHMuIFRoZSBhdHRyaWJ1dGVzIGFyZTo8YnIgLz4NCgkJPHVsPg0KCQkJPGxpPjxiPmlzaXplPC9iPjogSSBndWVzcyBpdCdzIGZvciB0aGUgaW1hZ2UgaW5wdXQgZmllbGQuPC9saT4NCgkJCTxsaT48Yj5mb3JtPC9iPjogVGhlIGZvcm0gdG8gdXNlIHdoaWNoIGNvbnRhaW5zIHRoZSBkYXRhIHVzZXJzIGNhbg0KCQkJCXN1cHBseSAoc2Nyb2xsIGRvd24gZm9yIGluZm8gYWJvdXQgd2hhdCB0byBwdXQgaW4gdGhlIGZvcm0pLjwvbGk+DQoJCQk8bGk+PGI+c3VjY2Vzc2Zvcm08L2I+OiBUaGUgZm9ybSB3aGljaCBjb25maXJtcyBzdWNjZXNmdWwgdXBsb2FkLjwvbGk+DQoJCTwvdWw+DQoJCTxwPk5vdywgPGI+eW91IGhhdmUgdG8gY3JlYXRlIHRoZSAnZm9ybScgYW5kIHRoZSAnc3VjY2VzZm9ybScgeW91cnNlbGYuPC9iPjxiciAvPg0KCQkJVGhleSBoYXZlIHRvIGJlIGp1c3Qgb2YgdGhlICdtaXNjJyBraW5kIChub3QgYXJ0aWNsZSwgbGluaywgY29tbWVudCBvciBmaWxlKS4NCgkJCQ0KCQkJPHA+SGVyZSBpdCBjb21lczoNCgkJCQk8cD5JbnNpZGUgdGhlICdmb3JtJyB0aGUgcGx1Z2luIGFsbG93cyBhIG51bWJlciBvZiB0YWdzLiBUaGVzZSB0YWdzDQoJCQkJCWFsbG93IDxiPnB1YmxpYy1zaWRlPC9iPiB2ZXJzaW9ucyBvZiBmaWVsZHMgaW4gPGI+Ym90aDwvYj4gdGhlDQoJCQkJCSAnd3JpdGUnIHRhYiBhbmQgaW4gdGhlICdpbWFnZSA+IGVkaXQnIHRhYi4gVGhpcyBtZWFucyB0aGV5IGFsbG93IHlvdQ0KCQkJCQl0byB3cml0ZSBhbiBhcnRpY2xlIGZyb20gdGhlIGZyb250LWVuZCwgY2F0ZWdvcml6ZSBpdCBhbmQgd2hhdGV2ZXIgZWxzZQ0KCQkJCQl5b3UgZG8gd2l0aCBpdCBpbiB0aGUgd3JpdGUgdGFiIDxiPnBsdXM8L2I+IHVwbG9hZCBhbiBpbWFnZSB3aXRoIGl0IGFuZCBwcm92aWRlDQoJCQkJCWRlc2NyaXB0aW9uIGZvciBpdC4NCgkJCQkJDQoJCQkJPHA+PGI+Tm90ZTwvYj46IEFsbCB0aGUgZGF0YSBzdXBwbGllZCB0aGlzIHdheSB3aWxsIGVuZCB1cCBpbiBhbiBhcnRpY2xlIGluIHRoZSANCgkJCQkJbW9kZXJhdGlvbiBsaXN0IHVuZGVyIHRoZSAnZXh0ZW5zaW9ucycgdGFiLiBJZiB5b3UgbG9vayBmb3IgYXJ0aWNsZXMNCgkJCQkJYW5kIGltYWdlcyB1cGxvYWRlZCB0aGlzIHdheSwgeW91J2xsIGZpbmQgdGhlbSB0aGVyZSB3YWl0aW5nIGZvciB5b3UgDQoJCQkJCXRvIGxpa2UgdGhlbS4NCgkJCQkJDQoJCQkJCTxwPjxiPkltYWdlIFRBR1M6PC9iPg0KCQkJCQkJPHVsPg0KCQkJCQkJPGxpPm1vZGltZ19maWxlX2lucHV0OiB3aWxsIG91dHB1dCBhbiBpbnB1dCBmaWVsZDwvbGk+DQoJCQkJCQkJPGxpPm1vZGltZ190aXRsZV9pbnB1dDogaW5wdXQgZmllbGQgZm9yIHRoZSBpbWFnZSB0aXRsZSAoc2hvdWxkIA0KCQkJCQkJCQlpbmhlcml0IHRoZSAnaXNpemUnIHNwZWNpZmllZCBpbiBtb2RpbWdfZm9ybSk8L2xpPg0KCQkJCQkJCTxsaT5tb2RpbWdfY2FwdGlvbl9pbnB1dDoJIHdpbGwgb3V0cHV0IGEgdGV4dGFyZWEgNDAgY29scyBieQ0KCQkJCQkJCQkJIDcgcm93cyBmb3IgdGhlIGNhcHRpb24uIEJ5IGRlZmF1bHQgdGhpcyB0ZXh0IHdpbGwgYmUgdXNlZA0KCQkJCQkJCQkJIGFzICdib2R5JyBmb3IgdGhlIGFydGljbGU8L2xpPg0KCQkJCQkJCTxsaT5tb2RpbWdfbm90ZV9pbnB1dDogb3V0cHV0cyBhIHRleHRhcmVhIHNpbWlsYXIgdG8gdGhlIG9uZSANCgkJCQkJCQkJCQlvZiB0aGUgY2FwdGlvbjwvbGk+DQoJCQkJCQk8bGk+bW9kaW1nX2F1dGhvcl9pbnB1dDogaW5wdXQgZmllbGQgZm9yIHRoZSAoaW1hZ2U/KSBhdXRob3IsIHdpbGwgaW5oZXJpdCAnaXNpemUnPC9saT4NCgkJCQkJCTwvdWw+DQoJCQkJCQk8cD48Yj5BcnRpY2xlIFRBR1M8L2I+DQoJCQkJCQk8dWw+DQoJCQkJCQkJPGxpPm1vZGltZ19hcnRpY2xlX2F1dGhvcjogaW5wdXQgZmllbGQgZm9yIHRoZSBhcnRpY2xlIGF1dGhvciANCgkJCQkJCQkJKHRoaXMgPGI+d2lsbCBub3Q8L2I+IGF1dG9tYXRpY2FsbHkgYmVjb21lIHRoZSA8Yj51c2VyPC9iPiB3aG8gDQoJCQkJCQkJCXN1Ym1pdHRlZCB0aGUgYXJ0aWNsZSEgKTwvbGk+DQoJCQkJCQkJPGxpPm1vZGltZ19hcnRpY2xlX2NhdGVnb3J5MTogcG9wdXAgb2YgYXZhaWxhYmxlIGFydGljbGUgY2F0ZWdvcmllczwvbGk+DQoJCQkJCQkJCTxsaT5tb2RpbWdfYXJ0aWNsZV9jYXRlZ29yeTI6IGlkZW08L2xpPg0KCQkJCQkJPGxpPm1vZGltZ19hcnRpY2xlX3RpdGxlOiBpbnB1dCBmb3IgdGhlIGFydGljbGUgdGl0bGUsICwgd2lsbCBpbmhlcml0ICdpc2l6ZSc8L2xpPg0KCQkJCQkJCTxsaT5tb2RpbWdfYXJ0aWNsZV9rZXl3b3Jkczogb3V0cHV0IHRleHQgYXJlYSBmb3IgdGhlIGtleXdvcmRzPC9saT4NCgkJCQkJCQk8bGk+bW9kaW1nX3N1Ym1pdDogb3VwdXRzIHRoZSBzdWJtaXQgYnV0dG9uPC9saT4NCgkJCQkJCTwvdWw+DQoJCQkJCQ0KCQkJDQoJIjtzOjQ6ImNvZGUiO3M6MTg3ODg6Ii8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLy8gUGx1Z2luOiBtZW1fbW9kZXJhdGlvbl9pbWFnZQ0KLy8gQXV0aG9yOiBNaWNoYWVsIE1hbmZyZSAoaHR0cDovL21hbmZyZS5uZXQvKQ0KLy8gUmV2aXNpb25zOiAJVEhJUyBQTFVHSU4gSEFTIE1PRElGSUVEIEJZIE5JQ08gRkVSQUdOT0xJDQovLwkJCQktTk9UIDEwMCUgU1VSRSBJVCBXT1JLUyEhIS0NCi8vCQkJCQ0KLy8JCQkJT1JJR0lOQUwgUExVR0lOIE1JU1NFRCAzICdpZCcgQVRUUklCVVRFUyBUTw0KLy8JCQkJR0VORVJBVEUgUE9QVVAgRk9STVMgSU4gTU9ERVJBVElPTiBRVUVVRQ0KLy8JCQkJQVRUUklCVVRFUyBXRVJFOg0KLy8JCQkJJ2NhdGVnb3J5LTEnLCAnY2F0ZWdvcnktMicsICdvdmVycmlkZS1mb3JtJw0KLy8NCi8vCQkJCUFEREVEIEhFUkU6CQ0KLy8JCQkJY2F0ZWdvcnlfcG9wdXAoImNhdGVnb3J5MSIsICRjYXRlZ29yeTEsICdjYXRlZ29yeS0xJykNCi8vCQkJCWxpbmUgMjIyDQovLwkJCQkNCi8vCQkJCUhFUkU6DQovLwkJCQljYXRlZ29yeV9wb3B1cCgiY2F0ZWdvcnkyIiwgJGNhdGVnb3J5MiwgJ2NhdGVnb3J5LTInKQ0KLy8JCQkJbGluZSAyMjMNCi8vCQkJCQ0KLy8JCQkJDQovLwkJCQlhbmQgSEVSRTogDQovLwkJCQlmb3JtX3BvcCgkb3ZlcnJpZGVfZm9ybSwgJ292ZXJyaWRlLWZvcm0nKQ0KLy8JCQkJbGluZSA0NzENCi8vCQkJCQkJCQkJCQkNCi8vDQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCmdsb2JhbCAkZXZlbnQsJGV4dGVuc2lvbnM7DQpnbG9iYWwgJHBhdGhfdG9fc2l0ZSwkaW1nX2RpcjsNCg0KcmVxdWlyZV9wbHVnaW4oJ21lbV9tb2RlcmF0aW9uJyk7DQpyZXF1aXJlX3BsdWdpbignbWVtX2FkbWluX3BhcnNlJyk7DQoNCmdsb2JhbCAkaW1hZ2VfdmFyczsNCiRpbWFnZV92YXJzID0gYXJyYXkoJ2lkJywnbmFtZScsJ2NhdGVnb3J5JywnZXh0JywndycsJ2gnLCdhbHQnLCdjYXB0aW9uJywnZGF0ZScsJ2F1dGhvcicsJ3RtcGZpbGUnLCd0bXBmaWxlbmFtZScsJ2RhdGVfdGFrZW4nLCdrZXl3b3JkcycsJ25vdGUnKTsNCg0KaWYgKG1lbV9nZXRfcHJlZignbW9kX2ltYWdlX3dyYXBfd2l0aF9hcnRpY2xlJywndmFsJykpIHsNCglyZXF1aXJlX3BsdWdpbignbWVtX21vZGVyYXRpb25fYXJ0aWNsZScpOw0KfQ0KDQokaW1hZ2VfdmFycyA9IGFycmF5X21lcmdlKCRpbWFnZV92YXJzLCBhcnJheSgnYXJ0aWNsZV9zZWN0aW9uJywgJ2FydGljbGVfdGl0bGUnLCAgJ2FydGljbGVfdGl0bGVfaHRtbCcsICdhcnRpY2xlX2JvZHknLCAnYXJ0aWNsZV9ib2R5X2h0bWwnLCAnYXJ0aWNsZV9leGNlcnB0JywgJ2FydGljbGVfZXhjZXJwdF9odG1sJywgJ2FydGljbGVfdGV4dGlsZV9leGNlcnB0JywgJ2FydGljbGVfaW1hZ2UnLCAnYXJ0aWNsZV90ZXh0aWxlX2JvZHknLCAnYXJ0aWNsZV9rZXl3b3JkcycsICdhcnRpY2xlX3N0YXR1cycsICdhcnRpY2xlX2NhdGVnb3J5MScsICdhcnRpY2xlX2NhdGVnb3J5MicsICdhcnRpY2xlX2Fubm90YXRlJywgJ2FydGljbGVfYW5ub3RhdGVpbnZpdGUnLCAnYXJ0aWNsZV9vdmVycmlkZV9mb3JtJywgJ2FydGljbGVfY3VzdG9tXzEnLCAnYXJ0aWNsZV9jdXN0b21fMicsICdhcnRpY2xlX2N1c3RvbV8zJywgJ2FydGljbGVfY3VzdG9tXzQnLCAnYXJ0aWNsZV9jdXN0b21fNScsICdhcnRpY2xlX2N1c3RvbV82JywgJ2FydGljbGVfY3VzdG9tXzcnLCAnYXJ0aWNsZV9jdXN0b21fOCcsICdhcnRpY2xlX2N1c3RvbV85JywgJ2FydGljbGVfY3VzdG9tXzEwJywgJ2FydGljbGVfd3JhcF9lbmFibGVkJykgKTsNCg0KDQpyZWdpc3Rlcl9tb2RlcmF0aW9uX3R5cGUoJ2ltYWdlJywkaW1hZ2VfdmFycywnaW1hZ2VfcHJlc2VudGVyJywnaW1hZ2VfYXBwcm92ZXInLCdpbWFnZV9yZWplY3RlcicpOw0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQppZiAoQHR4cGludGVyZmFjZSE9J2FkbWluJyB8fCAoQHR4cGludGVyZmFjZT09J2FkbWluJyBhbmQgKCRldmVudD09J21vZGVyYXRlJyBvciAkZXZlbnQ9PSdpbWFnZV9tb2RlcmF0ZScpKSkNCnsNCglyZXF1aXJlX29uY2UgdHhwYXRoLicvaW5jbHVkZS90eHBfaW1hZ2UucGhwJzsNCglpbmNsdWRlX29uY2UgdHhwYXRoLicvbGliL2NsYXNzLnRodW1iLnBocCc7DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsNCg0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdpbWFnZV9tb2RlcmF0ZScsJ2ltYWdlX21vZGVyYXRlJywnJywgMSk7DQoJYWRkX3ByaXZzKCdtb2RlcmF0aW9uLmltYWdlJywnMSwyLDMsNCw1LDYnKTsNCg0KCWlmICgkZXZlbnQgPT0gJ2ltYWdlX21vZGVyYXRlJyBvciAkZXZlbnQgPT0gJ21vZGVyYXRlJykgew0KDQoJCWZ1bmN0aW9uIGltYWdlX3VuaW5zdGFsbCgpIHsNCgkJCSRsb2cgPSBhcnJheSgpOw0KDQoJCQlpZiAoc2FmZV9kZWxldGUoJ3R4cF9wcmVmcycsIm5hbWUgTElLRSAnbW9kX2ltYWdlXyUnIikpDQoJCQkJJGxvZ1tdID0gJ0RlbGV0ZWQgYWxsIGltYWdlIG1vZGVyYXRpb24gcHJlZmVyZW5jZXMnOw0KCQkJZWxzZQ0KCQkJCSRsb2dbXSA9ICdGYWlsZWQgdG8gZGVsZXRlIGltYWdlIG1vZGVyYXRpb24gcHJlZmVyZW5jZXMnOw0KDQoJCQlyZXR1cm4gdGFnKCJVbkluc3RhbGwgTG9nIiwnaDInKS5kb1dyYXAoJGxvZywndWwnLCdsaScpOw0KCQl9DQoNCgkJZnVuY3Rpb24gaW1hZ2VfcHJlaW5zdGFsbCgpIHsNCgkJCXJldHVybiBpbWFnZV9pbnN0YWxsKCk7DQoJCX0NCg0KCQlmdW5jdGlvbiBpbWFnZV9pbnN0YWxsKCkgew0KCQkJJGxvZyA9IGFycmF5KCk7DQoNCgkJCS8vIHJlbW92ZSBvbGQgdmFsdWVzDQoJCQlzYWZlX2RlbGV0ZSgndHhwX3ByZWZzJywibmFtZSBMSUtFICdtb2RpbWdfJSciKTsNCg0KCQkJaWYgKG1lbV9nZXRfcHJlZignbW9kX2ltYWdlX3dyYXBfd2l0aF9hcnRpY2xlJywndmFsJyk9PT1mYWxzZSkgew0KCQkJCW1lbV9zZXRfcHJlZignbW9kX2ltYWdlX3dyYXBfd2l0aF9hcnRpY2xlJywnMCcsJ01vZGVyYXRpb24nLCcxJywwLCd5ZXNub3JhZGlvJyk7DQoJCQkJJGxvZ1tdID0gJ0FkZGVkIHByZWZlcmVuY2UgbW9kX2ltYWdlX3dyYXBfd2l0aF9hcnRpY2xlJzsNCgkJCX0NCgkJCWlmIChtZW1fZ2V0X3ByZWYoJ21vZF9pbWFnZV9zaXplX2Z1bGwnLCd2YWwnKT09PWZhbHNlKSB7DQoJCQkJbWVtX3NldF9wcmVmKCdtb2RfaW1hZ2Vfc2l6ZV9mdWxsJywnNjQweDQ4MCcsJ01vZGVyYXRpb24nLCcxJyk7DQoJCQkJJGxvZ1tdID0gJ0FkZGVkIHByZWZlcmVuY2UgbW9kX2ltYWdlX3NpemVfZnVsbCc7DQoJCQl9DQoJCQlpZiAobWVtX2dldF9wcmVmKCdtb2RfaW1hZ2Vfd3JhcF9kZWZhdWx0JywndmFsJyk9PT1mYWxzZSkgew0KCQkJCW1lbV9zZXRfcHJlZignbW9kX2ltYWdlX3dyYXBfZGVmYXVsdCcsJzAnLCdNb2RlcmF0aW9uJywnMScsMCwneWVzbm9yYWRpbycpOw0KCQkJCSRsb2dbXSA9ICdBZGRlZCBwcmVmZXJlbmNlIG1vZF9pbWFnZV93cmFwX2RlZmF1bHQnOw0KCQkJfQ0KCQkJaWYgKG1lbV9nZXRfcHJlZignbW9kX2ltYWdlX3NpemVfdGh1bWJuYWlsJywndmFsJyk9PT1mYWxzZSkgew0KCQkJCW1lbV9zZXRfcHJlZignbW9kX2ltYWdlX3NpemVfdGh1bWJuYWlsJywnMTYweDEyMCcsJ01vZGVyYXRpb24nLCcxJyk7DQoJCQkJJGxvZ1tdID0gJ0FkZGVkIHByZWZlcmVuY2UgbW9kX2ltYWdlX3NpemVfdGh1bWJuYWlsJzsNCgkJCX0NCgkJCWlmIChtZW1fZ2V0X3ByZWYoJ21vZF9pbWFnZV90aHVtYm5haWxfY3JvcCcsJ3ZhbCcpPT09ZmFsc2UpIHsNCgkJCQltZW1fc2V0X3ByZWYoJ21vZF9pbWFnZV90aHVtYm5haWxfY3JvcCcsJzAnLCdNb2RlcmF0aW9uJywnMScsMCwneWVzbm9yYWRpbycpOw0KCQkJCSRsb2dbXSA9ICdBZGRlZCBwcmVmZXJlbmNlIG1vZF9pbWFnZV90aHVtYm5haWxfY3JvcCc7DQoJCQl9DQoNCg0KCQkJcmV0dXJuIHRhZygiSW5zdGFsbCBMb2ciLCdoMicpLmRvV3JhcCgkbG9nLCd1bCcsJ2xpJyk7DQoJCX0NCg0KCQlmdW5jdGlvbiBpbWFnZV9tb2RlcmF0ZSgkZXZlbnQsICRzdGVwKSB7DQoJCQkkbXNnPScnOw0KDQoJCQlpZiAoJHN0ZXA9PSdpbWFnZV9zYXZlJyBvciAkc3RlcD09J2ltYWdlX3VwZGF0ZScpIHsNCgkJCQkvLyBzYXZlIGNoYW5nZXMNCgkJCQkkbXNnID0gbWVtX2ltYWdlX3NhdmUoJHN0ZXApOw0KCQkJfSBlbHNlIGlmICgkc3RlcD09J3ByZWluc3RhbGwnIHx8ICRzdGVwPT0naW5zdGFsbCcpIHsNCgkJCQlyZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCdpbWFnZV9tb2RlcmF0ZScsJ2ltYWdlX21vZGVyYXRlJyk7DQoJCQkJZWNobyBwYWdlVG9wKCdJbWFnZSBNb2RlcmF0aW9uJywnJyk7DQoNCgkJCQlpZiAoJHN0ZXA9PSdwcmVpbnN0YWxsJykNCgkJCQkJZWNobyBpbWFnZV9wcmVpbnN0YWxsKCk7DQoJCQkJZWxzZQ0KCQkJCQllY2hvIGltYWdlX2luc3RhbGwoKTsNCg0KCQkJCXJldHVybjsNCgkJCX0gZWxzZSBpZiAoJHN0ZXA9PSd1bmluc3RhbGwnKSB7DQoJCQkJcmVnaXN0ZXJfdGFiKCdleHRlbnNpb25zJywnaW1hZ2VfbW9kZXJhdGUnLCdpbWFnZV9tb2RlcmF0ZScpOw0KCQkJCWVjaG8gcGFnZVRvcCgnSW1hZ2UgTW9kZXJhdGlvbicsJycpOw0KCQkJCWVjaG8gaW1hZ2VfdW5pbnN0YWxsKCk7DQoJCQkJcmV0dXJuOw0KCQkJfSBlbHNlIHsNCgkJCQlyZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCdpbWFnZV9tb2RlcmF0ZScsJ2ltYWdlX21vZGVyYXRlJyk7DQoJCQkJaWYgKCRzdGVwKSB7DQoJCQkJCSRtc2cgPSAiU3RlcCBpcyAnJHN0ZXAnIjsNCgkJCQl9DQoJCQl9DQoNCgkJCXBhZ2VUb3AoJ0ltYWdlIE1vZGVyYXRpb24nLCRtc2cpOw0KCQl9DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIGltYWdlX21vZGVyYXRlX2Zvcm0oKQ0Kew0KCWdsb2JhbCAkc3RlcDsNCg0KCSRkYXRhID0gZ3BzYShhcnJheSgnYWx0JywnY2F0ZWdvcnknLCdjYXB0aW9uJywnYXV0aG9yJywnbmFtZScsJ2V4dCcsJ3RtcGZpbGUnLCdrZXl3b3JkcycsJ3Bob3RvZ3JhcGhlcicsJ2RhdGVfdGFrZW4nLCd0aXRsZScsJ25vdGUnKSk7DQoNCglyZXR1cm4gaW1hZ2VfcHJlc2VudGVyKCdpbWFnZScsJGRhdGEpOw0KfQ0KDQpmdW5jdGlvbiBtb2RpbWdfZm9ybSgkYXR0cywkdGhpbmc9JycpDQp7DQoJZ2xvYmFsICRzdGVwLCR0eHBfdXNlciwkbWVtX21vZF9pbmZvLCRtZW1fbW9kaW1nX2luZm8sJGltYWdlX3ZhcnM7DQoNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdpc2l6ZScJCT0+IDI1LA0KCQknZm9ybScJCT0+ICcnLA0KCQknc3VjY2Vzc2Zvcm0nCT0+ICcnDQoJKSwkYXR0cykpOw0KDQoJZXh0cmFjdChncHNhKGFycmF5KCdtb2RpZCcsJ2FjdGlvbicsJ2V2ZW50Jywnc3RlcCcpKSk7DQoNCglleHRyYWN0KGdwc2EoJGltYWdlX3ZhcnMpKTsNCg0KCWlmIChlbXB0eSgkYXV0aG9yKSkNCgkJJGF1dGhvciA9ICR0eHBfdXNlcjsNCg0KCSRvdXQgPSAnJzsNCg0KCWlmIChpc3NldCgkYWN0aW9uKSBhbmQgJGFjdGlvbj09Z1R4dCggJ2RlbGV0ZScgKSkNCgkJJHN0ZXAgPSAnaW1hZ2VfZGVsZXRlJzsNCg0KCWlmIChpc3NldCgkc3RlcCkgYW5kICgkc3RlcD09J2ltYWdlX3NhdmUnIG9yICRzdGVwPT0naW1hZ2VfdXBkYXRlJyBvciAkc3RlcD09J2ltYWdlX2RlbGV0ZScpKSB7DQoJCWlmICghZW1wdHkoJHN1Y2Nlc3Nmb3JtKSkNCgkJCSRGb3JtID0gZmV0Y2hfZm9ybSgkc3VjY2Vzc2Zvcm0pOw0KDQoJCWlmICgkc3RlcD09J2ltYWdlX2RlbGV0ZScpIHsNCgkJCWlmIChyZW1vdmVfbW9kZXJhdGVkX2NvbnRlbnQoJG1vZGlkKSkgew0KCQkJCS8vIGRlbGV0ZSB0aGUgZmlsZQ0KCQkJCWltYWdlX3JlamVjdGVyKCdpbWFnZScsYXJyYXkoJ3RtcGZpbGUnPT4kdG1wZmlsZSkpOw0KCQkJCSRtc2cgPSAnRGVsZXRlZCBpbWFnZSc7DQoJCQl9IGVsc2Ugew0KCQkJCSRtc2cgPSAnRmFpbGVkIHRvIGRlbGV0ZSBpbWFnZSc7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkkbXNnID0gbWVtX2ltYWdlX3NhdmUoJHN0ZXApOw0KCQl9DQoNCgkJJG91dCA9IGFkbWluX3BhcnNlKCRGb3JtKTsNCg0KCQl1bnNldCgkbWVtX21vZGltZ19pbmZvKTsNCgl9IGVsc2Ugew0KDQoJCWlmIChlbXB0eSgkZm9ybSkpDQoJCQkkRm9ybSA9ICR0aGluZzsNCgkJZWxzZQ0KCQkJJEZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsNCg0KDQoJCSRhY3Rpb25fdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107DQoJCSRxcyA9IHN0cnBvcygkYWN0aW9uX3VybCwnPycpOw0KCQlpZiAoJHFzKSAkYWN0aW9uX3VybCA9IHN1YnN0cigkYWN0aW9uX3VybCwgMCwgJHFzKTsNCg0KCQkkb3V0ID0Jbi5uLiI8Zm9ybSBlbmN0eXBlPSdtdWx0aXBhcnQvZm9ybS1kYXRhJyBhY3Rpb249J3skYWN0aW9uX3VybH0nIG1ldGhvZD0ncG9zdCc+IiAuDQoJCQkJZUlucHV0KCdpbWFnZV9tb2RlcmF0ZScpIC4NCgkJCQlzSW5wdXQoICRzdGVwPT0naW1hZ2VfZWRpdCcgPyAnaW1hZ2VfdXBkYXRlJyA6ICdpbWFnZV9zYXZlJyApOw0KDQoJCWlmIChpc3NldCgkbW9kaWQpIGFuZCAhZW1wdHkoJG1vZGlkKSkgew0KCQkJJG91dCAuPSBoSW5wdXQoJ21vZGlkJywkbW9kaWQpOw0KDQoJCQkkbWVtX21vZF9pbmZvID0gc2FmZV9yb3coJyonLCd0eHBfbW9kZXJhdGlvbicsImBpZGA9JyIuZG9TbGFzaCgkbW9kaWQpLiInIik7DQoNCgkJCWV4dHJhY3QoJG1lbV9tb2RpbWdfaW5mbz1kZWNvZGVfY29udGVudCgkbWVtX21vZF9pbmZvWydkYXRhJ10pKTsNCg0KCQkJJG91dCAuPSBAaElucHV0KCd0bXBmaWxlbmFtZScsJHRtcGZpbGVuYW1lKTsNCg0KCQkJJG91dCAuPSBAaElucHV0KCdtZW1fbW9kaW1nX2luZm9fZGF0YScsJG1lbV9tb2RfaW5mb1snZGF0YSddKTsNCgkJfQ0KDQoJCSRjYXB0aW9uX2FyZWEgPSAnPHRleHRhcmVhIG5hbWU9ImNhcHRpb24iIGNvbHM9IjQwIiByb3dzPSI3Ij4nLiRjYXB0aW9uLic8L3RleHRhcmVhPic7DQoJCSRub3RlX2FyZWEgPSAnPHRleHRhcmVhIG5hbWU9Im5vdGUiIGNvbHM9IjQwIiByb3dzPSI0Ij4nLkAkbWVtX21vZF9pbmZvWydkZXNjJ10uJzwvdGV4dGFyZWE+JzsNCgkJJHNlbGVjdHMgPSBldmVudF9jYXRlZ29yeV9wb3B1cCgiaW1hZ2UiLCAkY2F0ZWdvcnkpOw0KCQkkc2VsZWN0c19jYXQxID0gY2F0ZWdvcnlfcG9wdXAoImFydGljbGVfY2F0ZWdvcnkxIiwgQCRhcnRpY2xlX2NhdGVnb3J5MSwgJ2NhdGVnb3J5LTEnKTsNCgkJJHNlbGVjdHNfY2F0MiA9IGNhdGVnb3J5X3BvcHVwKCJhcnRpY2xlX2NhdGVnb3J5MiIsIEAkYXJ0aWNsZV9jYXRlZ29yeTIsICdjYXRlZ29yeS0yJyk7DQoJCSRrZXl3b3Jkc19hcmVhID0gJzx0ZXh0YXJlYSBuYW1lPSJhcnRpY2xlX2tleXdvcmRzIiBjbGFzcz0ibW9kX2tleXdvcmRzX2lucHV0Ij4nIC4gQCRhcnRpY2xlX2tleXdvcmRzIC4gJzwvdGV4dGFyZWE+JzsNCg0KCQkkdmFscyA9IGFycmF5KA0KCQkJJ2ZpbGVfaW5wdXQnCQk9PiAoZW1wdHkoJHRtcGZpbGVuYW1lKT9mSW5wdXQoJ2ZpbGUnLCd0aGVmaWxlJywnJywnZWRpdCcpIDogaElucHV0KCd0bXBmaWxlJywkdG1wZmlsZSkgLiAkdG1wZmlsZW5hbWUgKSwNCgkJCSd0aXRsZV9pbnB1dCcJCT0+IGZJbnB1dCgndGV4dCcsJ2FsdCcsJGFsdCwgJGlzaXplLCdtb2RpbWdfdGl0bGVfaW5wdXQnLCIwIiksDQoJCQknY2F0ZWdvcnlfaW5wdXQnCT0+ICRzZWxlY3RzLA0KCQkJJ2NhcHRpb25faW5wdXQnCQk9PiAkY2FwdGlvbl9hcmVhLA0KCQkJJ25vdGVfaW5wdXQnCQk9PiAkbm90ZV9hcmVhLA0KCQkJJ2F1dGhvcl9pbnB1dCcJCT0+IGZJbnB1dCgndGV4dCcsJ2F1dGhvcicsQCRhdXRob3IsJGlzaXplLCdtb2RpbWdfYXV0aG9yX2lucHV0JywiMCIpLA0KCQkJJ2FydGljbGVfYXV0aG9yJwk9PiBmSW5wdXQoJ3RleHQnLCdhcnRpY2xlX2F1dGhvcicsQCRhcnRpY2xfYXV0aG9yLCRpc2l6ZSwnbW9kaW1nX2F1dGhvcl9pbnB1dCcsIjAiKSwNCgkJCSdhcnRpY2xlX2NhdGVnb3J5MScJPT4gJHNlbGVjdHNfY2F0MSwNCgkJCSdhcnRpY2xlX2NhdGVnb3J5MicJPT4gJHNlbGVjdHNfY2F0MiwNCgkJCSdhcnRpY2xlX3RpdGxlJwkJPT4gZklucHV0KCd0ZXh0JywnYXJ0aWNsZV90aXRsZScsQCRhcnRpY2xlX3RpdGxlLCRpc2l6ZSwnbW9kaW1nX2FydGljbGVfdGl0bGUnLCIwIiksDQoJCQknYXJ0aWNsZV9rZXl3b3JkcycJPT4gJGtleXdvcmRzX2FyZWEsDQoJCQknc3VibWl0JwkJCT0+IGZJbnB1dCggInN1Ym1pdCIsICdhY3Rpb24nLCBnVHh0KCAnc2F2ZScgKSwgInB1Ymxpc2giICksDQoJCQknZGVsZXRlJwkJCT0+ICghZW1wdHkoJG1vZGlkKSA/IGZJbnB1dCggInN1Ym1pdCIsICdhY3Rpb24nLCBnVHh0KCAnZGVsZXRlJyApLCAiZGVsZXRlIiwgJycsICJyZXR1cm4gY29uZmlybSgnIi4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiInKSIgKSA6ICcnKSwNCgkJKTsNCgkJZm9yKCRpPTE7JGk8PTEwOyRpKyspIHsNCgkJCSRrID0gImFydGljbGVfY3VzdG9tX3skaX0iOw0KCQkJJHZhbHNbJGtdID0gZklucHV0KCd0ZXh0JywgJGssIEAkJGssICRpc2l6ZSwnbW9kaW1nXycuJGssIjAiKTsNCgkJfQ0KDQoJCWZvcmVhY2ggKCR2YWxzIGFzICRhPT4kYikgew0KCQkJJGEgPSAnPHR4cDptb2RpbWdfJy4kYS4nIC8+JzsNCgkJCSRGb3JtID0gc3RyX3JlcGxhY2UoJGEsJGIsJEZvcm0pOw0KCQl9DQoNCgkJJG91dCAuPSAkRm9ybTsNCg0KCQkkb3V0IC49ICc8L2Zvcm0+Jy5uOw0KDQoJCXVuc2V0KCRtZW1fbW9kX2luZm8pOw0KCX0NCg0KCXJldHVybiAkb3V0Ow0KfQ0KDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIG1vZGltZ19nZXRfaW1hZ2VfZGltZW5zaW9ucygkdGh1bWJuYWlsPWZhbHNlKQ0Kew0KCWlmICgkdGh1bWJuYWlsKSB7DQoJCSRkaW0gPSBtZW1fZ2V0X3ByZWYoJ21vZF9pbWFnZV9zaXplX3RodW1ibmFpbCcsJ3ZhbCcpOw0KDQoJCSR3ID0gMTYwOw0KCQkkaCA9IDEyMDsNCgl9IGVsc2Ugew0KCQkkZGltID0gbWVtX2dldF9wcmVmKCdtb2RfaW1hZ2Vfc2l6ZV9mdWxsJywndmFsJyk7DQoNCgkJJHcgPSA2NDA7DQoJCSRoID0gNDgwOw0KCX0NCg0KCWlmICgkZGltKQ0KCXsNCgkJJGRpbSA9IGV4cGxvZGUoJ3gnLCRkaW0pOw0KDQoJCWlmIChjb3VudCgkZGltKSA9PSAyKQ0KCQl7DQoJCQkkdyA9ICRkaW1bMF07DQoJCQkkaCA9ICRkaW1bMV07DQoJCX0NCgl9DQoNCgkkeiA9IGFycmF5KCR3LCRoKTsNCg0KCXJldHVybiAkejsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gbWVtX2ltYWdlX3NhdmUoJHN0ZXApDQp7DQoJZ2xvYmFsICR0eHBjZmcsJHR4cGFjLCRleHRlbnNpb25zLCRwYXRoX3RvX3NpdGUsJHR4cF91c2VyLCRpZ25fdXNlciwkbWVtX21vZGltZ19pbmZvLCAkaW1hZ2VfdmFyczsNCg0KCSR2YXJyYXkgPSBsQXR0cyhncHNhKCRpbWFnZV92YXJzKSxkZWNvZGVfY29udGVudChncHMoJ21lbV9tb2RpbWdfaW5mb19kYXRhJykpKTsNCg0KCSRtb2RpZCA9IGdwcygnbW9kaWQnKTsNCglpZiAoIWVtcHR5KCRtb2RpZCkpICR2YXJyYXlbJ2lkJ10gPSAkaWQgPSAkbW9kaWQ7DQoNCglpZiAoaXNzZXQoJGlnbl91c2VyKSkgJHR4cF91c2VyID0gJGlnbl91c2VyOw0KDQoJaWYoJHR4cGFjWyd0ZXh0aWxlX2xpbmtzJ10pIHsNCg0KCQlpbmNsdWRlX29uY2UgJHR4cGNmZ1sndHhwYXRoJ10uJy9saWIvY2xhc3NUZXh0aWxlLnBocCc7DQoJCSR0ZXh0aWxlID0gbmV3IFRleHRpbGUoKTsNCg0KCQkkdmFycmF5WydjYXB0aW9uJ10gPSAkdGV4dGlsZS0+VGV4dGlsZVRoaXMoJHZhcnJheVsnY2FwdGlvbiddLDEpOw0KCX0NCg0KCSRyZXMgPSAnJzsNCg0KCWlmICgkc3RlcD09J2ltYWdlX3VwZGF0ZScpIHsNCgkJaWYgKHVwZGF0ZV9tb2RlcmF0ZWRfY29udGVudCgkaWQsJHZhcnJheVsnbm90ZSddLCR2YXJyYXkpKSB7DQoJCQkkcmVzID0gIlVwZGF0ZSBsaW5rICckbW9kaWQnIjsNCgkJfSBlbHNlIHsNCgkJCSRyZXMgPSAiRmFpbGVkIHRvIHVwZGF0ZSBsaW5rICckbW9kaWQnIjsNCgkJfQ0KCX0gZWxzZSB7DQoNCgkJJGZpbGUgPSAkX0ZJTEVTWyd0aGVmaWxlJ11bJ3RtcF9uYW1lJ107DQoJCSRuYW1lID0gJF9GSUxFU1sndGhlZmlsZSddWyduYW1lJ107DQoNCgkJJGZpbGUgPSBnZXRfdXBsb2FkZWRfZmlsZSgkZmlsZSk7DQoNCgkJJHZhcnJheVsndG1wZmlsZW5hbWUnXSA9ICdtb2RfJyAuIGJhc2VuYW1lKCRmaWxlKSAuICRfRklMRVNbJ3RoZWZpbGUnXVsnbmFtZSddOw0KDQoJCSRwZW5kaW5nX2ZpbGUgPSAkcGF0aF90b19zaXRlIC4gJy9pbWFnZXMvJyAuICdtb2RfJyAuIGJhc2VuYW1lKCRmaWxlKSAuICRfRklMRVNbJ3RoZWZpbGUnXVsnbmFtZSddOw0KDQoNCgkJbGlzdCgkdywkaCwkZXh0ZW5zaW9uKSA9IGdldGltYWdlc2l6ZSgkZmlsZSk7DQoNCgkJaWYgKCRleHRlbnNpb25zWyRleHRlbnNpb25dKSB7DQoNCgkJCWxpc3QoJHdpZHRoLCRoZWlnaHQpID0gbW9kaW1nX2dldF9pbWFnZV9kaW1lbnNpb25zKCk7DQoNCgkJCWlmIChjbGFzc19leGlzdHMoJ3dldF90aHVtYicpKQ0KCQkJew0KCQkJCSR0ID0gbmV3IHdldF90aHVtYigpOw0KDQoJCQkJLy8gcmVtb3ZlIGljb24NCgkJCQkkdC0+aGludCA9IGZhbHNlOw0KDQoJCQkJaWYgKCR3ID4gJGgpDQoJCQkJCSR0LT53aWR0aCA9ICR3aWR0aDsNCgkJCQllbHNlDQoJCQkJCSR0LT5oZWlnaHQgPSAkaGVpZ2h0Ow0KDQoJCQkJaWYgKCR0LT53cml0ZSgkZmlsZSwkZmlsZS4nLnJlc2l6ZWQnKSkNCgkJCQl7DQoJCQkJCXVubGluaygkZmlsZSk7DQoJCQkJCSRmaWxlID0gJGZpbGUuJy5yZXNpemVkJzsNCg0KCQkJCQkkdyA9ICR0LT53aWR0aDsNCgkJCQkJJGggPSAkdC0+aGVpZ2h0Ow0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKHNoaWZ0X3VwbG9hZGVkX2ZpbGUoJGZpbGUsICRwZW5kaW5nX2ZpbGUpICE9IGZhbHNlKSB7DQoJCQkJJHZhcnJheVsndyddID0gJHc7DQoJCQkJJHZhcnJheVsnaCddID0gJGg7DQoNCgkJCQkkdmFycmF5WydleHQnXSA9ICRleHRlbnNpb25zWyRleHRlbnNpb25dOw0KCQkJCSR2YXJyYXlbJ25hbWUnXSA9IHN1YnN0cigkbmFtZSwwLHN0cnJwb3MoJG5hbWUsJy4nKSkgLiAkZXh0ZW5zaW9uOw0KCQkJCSR2YXJyYXlbJ3RtcGZpbGUnXSA9ICRwZW5kaW5nX2ZpbGU7DQoJCQkJJHZhcnJheVsndXNlciddID0gJHR4cF91c2VyOw0KCQkJCSRlbWFpbCA9IHNhZmVfZmllbGQoJ2VtYWlsJywndHhwX3VzZXJzJywibmFtZT0nIi5kb1NsYXNoKCR0eHBfdXNlcikuIiciKTsNCg0KDQoNCgkJCQkkcmVzID0gc3VibWl0X21vZGVyYXRlZF9jb250ZW50KCdpbWFnZScsJGVtYWlsLCR2YXJyYXlbJ25vdGUnXSwkdmFycmF5KTsNCg0KCQkJCWlmICgkcmVzKSB7DQoJCQkJCSRyZXMgPSAnJzsgLy8iU3VibWl0dGVkIEltYWdlICckcmVzJyI7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJHJlcyA9ICJGYWlsZWQgdG8gc3VibWl0IGltYWdlIjsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCSRyZXMgPSAiRmFpbGVkIHRvIHVwbG9hZCBpbWFnZSI7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQkkcmVzID0gIid7JGV4dGVuc2lvbn0nIGlzIGFuIHVuYXBwcm92ZWQgZXh0ZW5zaW9uIjsNCgkJfQ0KCX0NCg0KCSRtZW1fbW9kaW1nX2luZm8gPSAkdmFycmF5Ow0KDQoJcmV0dXJuICRyZXM7DQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIG1vZGltZ19pbWcoJGF0dHMpIHsNCglnbG9iYWwgJG1lbV9tb2RpbWdfaW5mbywkaW1nX2RpciwkbWVtX21vZF9pbmZvOw0KDQoJaWYgKGlzX2FycmF5KCRtZW1fbW9kaW1nX2luZm8pKQ0KCQlleHRyYWN0KCRtZW1fbW9kaW1nX2luZm8pOw0KCWVsc2UgaWYgKGlzX2FycmF5KCRtZW1fbW9kX2luZm8pIGFuZCBhcnJheV9rZXlfZXhpc3RzKCdkYXRhJywkbWVtX21vZF9pbmZvKSkNCgkJZXh0cmFjdChkZWNvZGVfY29udGVudCgkbWVtX21vZF9pbmZvWydkYXRhJ10pKTsNCg0KCWlmIChpc3NldCgkdG1wZmlsZW5hbWUpIGFuZCAhZW1wdHkoJHRtcGZpbGVuYW1lKSkNCgkJcmV0dXJuICc8aW1nIHNyYz0iJy5odS4kaW1nX2Rpci4nLycuJHRtcGZpbGVuYW1lLiciJy4NCgkJCQkoIWVtcHR5KCR3KSA/ICcgd2lkdGg9IicuJHcuJyInOicnKSAuDQoJCQkJKCFlbXB0eSgkaCkgPyAnIGhlaWdodD0iJy4kaC4nIic6JycpIC4gJyAvPic7DQp9DQoNCg0KZnVuY3Rpb24gaW1hZ2VfcHJlc2VudGVyKCR0eXBlLCRkYXRhKSB7DQoJZ2xvYmFsICRpbWdfZGlyLCRpbWFnZV92YXJzOw0KDQoJJGNyZWF0ZV9hcnRpY2xlID0gbWVtX2dldF9wcmVmKCdtb2RfaW1hZ2Vfd3JhcF93aXRoX2FydGljbGUnLCd2YWwnKTsNCgkkd3JhcF9kZWZhdWx0ID0gbWVtX2dldF9wcmVmKCdtb2RfaW1hZ2Vfd3JhcF9kZWZhdWx0JywndmFsJyk7DQoNCgkkb3V0ID0gJyc7DQoNCglpZiAoJHR5cGU9PSdpbWFnZScgYW5kIGlzX2FycmF5KCRkYXRhKSkgew0KCQlleHRyYWN0KGdldF9wcmVmcygpKTsNCg0KCQlpZiAoZW1wdHkoJGRhdGFbJ2FydGljbGVfYW5ub3RhdGUnXSkpICRkYXRhWydhcnRpY2xlX2Fubm90YXRlJ10gPSAkY29tbWVudHNfb25fZGVmYXVsdDsNCg0KCQlpZiAoZW1wdHkoJGRhdGFbJ2FydGljbGVfdGl0bGUnXSkpICRkYXRhWydhcnRpY2xlX3RpdGxlJ10gPSAkZGF0YVsnYWx0J107DQoJCWlmIChlbXB0eSgkZGF0YVsnYXJ0aWNsZV9ib2R5J10pKSAkZGF0YVsnYXJ0aWNsZV9ib2R5J10gPSAkZGF0YVsnY2FwdGlvbiddOw0KCQlpZiAoZW1wdHkoJGRhdGFbJ2FydGljbGVfdXNlciddKSkgJGRhdGFbJ2FydGljbGVfdXNlciddID0gJGRhdGFbJ2F1dGhvciddOw0KCQlpZiAoZW1wdHkoJGRhdGFbJ2FydGljbGVfd2FycF9lbmFibGVkJ10pKSAkZGF0YVsnYXJ0aWNsZV93cmFwX2VuYWJsZWQnXSA9ICR3cmFwX2RlZmF1bHQ7DQoNCgkJZXh0cmFjdCgkZGF0YSk7DQoNCgkJaWYgKCEkYXJ0aWNsZV9hbm5vdGF0ZSkgew0KCQkJJGFydGljbGVfYW5ub3RhdGUgPSAkY29tbWVudHNfb25fZGVmYXVsdDsNCgkJfQ0KDQoJCWlmIChlbXB0eSgkYXJ0aWNsZV9hbm5vdGF0ZWludml0ZSkpDQoJCQkkYXJ0aWNsZV9hbm5vdGF0ZWludml0ZSA9ICRjb21tZW50c19kZWZhdWx0X2ludml0ZTsNCg0KCQkkc2VsZWN0cyA9IGV2ZW50X2NhdGVnb3J5X3BvcHVwKCJpbWFnZSIsICRjYXRlZ29yeSk7DQoJCSR0ZXh0YXJlYSA9ICc8dGV4dGFyZWEgbmFtZT0iY2FwdGlvbiIgY29scz0iNDAiIHJvd3M9IjciIHRhYmluZGV4PSI0Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJGNhcHRpb24pLic8L3RleHRhcmVhPic7DQoNCgkJJGltZ3RhZyA9ICc8aW1nIHNyYz0iJy5odS4kaW1nX2Rpci4nLycuJHRtcGZpbGVuYW1lLiciJy4nIHdpZHRoPSInLiR3LiciIGhlaWdodD0iJy4kaC4nIiAvPic7DQoNCgkJJG91dCA9IHN0YXJ0VGFibGUoICdlZGl0JyApIC4NCgkJCQl0ciggdGRjcyggJGltZ3RhZywgMikgKSAuDQoJCQkJdHIoIGZMYWJlbENlbGwoICduYW1lJyApIC4gZklucHV0Q2VsbCggJ25hbWUnLCAkbmFtZSwgMSwgMzAgKSkgLg0KCQkJCXRyKCBmTGFiZWxDZWxsKCAnYWx0JykgLmZJbnB1dENlbGwoICdhbHQnLCAkYWx0LCAyLCAxNSApKSAuDQoJCQkJdHIoIGZMYWJlbENlbGwoICdpbWFnZV9jYXRlZ29yeScsICdjYXRlZ29yeScgKSAuIHRkKCAkc2VsZWN0cyApICkgLg0KCQkJCXRyKCBmTGFiZWxDZWxsKCAnaW1hZ2VfZGltZW5zaW9ucycgKSAuIHRkKCAkdyAuICd4JyAuICRoICkgKSAuDQoJCQkJdHIoIGZMYWJlbENlbGwoICdjYXB0aW9uJyApIC4gdGRhKCAkdGV4dGFyZWEsICcgdmFsaWduPSJ0b3AiJyApICkgLg0KCQkJCSgkY3JlYXRlX2FydGljbGUgPyB0ciggZkxhYmVsQ2VsbCggJ2FydGljbGVfd3JhcCcgKSAuIHRkYSggeWVzbm9SYWRpbygnYXJ0aWNsZV93cmFwX2VuYWJsZWQnLCAkYXJ0aWNsZV93cmFwX2VuYWJsZWQpICkpIDogJycpIC4NCgkJCQllbmRUYWJsZSgpOw0KDQoNCgkJCWlmIChlbXB0eSgkc2VjdGlvbikpICRzZWN0aW9uID0gZ2V0RGVmYXVsdFNlY3Rpb24oKTsNCgkJCSRycyA9IHNhZmVfY29sdW1uKCJuYW1lIiwgInR4cF9zZWN0aW9uIiwgIm5hbWUhPSdkZWZhdWx0JyIpOw0KDQoJCQkkc2VjdGlvbl9zZWxlY3QgPSAoJHJzKSA/IHNlbGVjdElucHV0KCJhcnRpY2xlX3NlY3Rpb24iLCAkcnMsICRhcnRpY2xlX3NlY3Rpb24pIDogJyc7DQoNCgkJCSRvdXQgLj0gJzxoMz48YSBocmVmPSIjIicuZ1R4dCgnYXJ0aWNsZScpLic8L2gzPic7DQoNCgkJCSRvdXQgLj0gJzx0YWJsZSBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgaWQ9ImVkaXQyIiBhbGlnbj0iY2VudGVyIiAnLg0KCQkJCQkoISgkY3JlYXRlX2FydGljbGUgJiYgJGFydGljbGVfd3JhcF9lbmFibGVkKSA/ICdzdHlsZT0iZGlzcGxheTpub25lO3Zpc2liaWxpdHk6aGlkZGVuOyInOicnKS4nPicgLg0KCQkJCQl0ciggdGRjcyggJzxoMz4nLmdUeHQoJ2FydGljbGUnKSAuJzwvaDM+JywgMikgKSAuDQoJCQkJCXRyKCBmTGFiZWxDZWxsKCAndGl0bGUnICkgLiBmSW5wdXRDZWxsKCAnYXJ0aWNsZV90aXRsZScsICRhcnRpY2xlX3RpdGxlLCAxLCAzMCApKSAuDQoJCQkJCShlbXB0eSgkc2VjdGlvbl9zZWxlY3QpID8gJycgOiB0ciggZkxhYmVsQ2VsbCggJ3NlY3Rpb24nICkgLiB0ZGEoICRzZWN0aW9uX3NlbGVjdCApICkpIC4NCgkJCQkJdHIoIGZMYWJlbENlbGwoICdjYXRlZ29yaXplJyApIC4gdGRhKCBjYXRlZ29yeV9wb3B1cCgiYXJ0aWNsZV9jYXRlZ29yeTEiLCAkYXJ0aWNsZV9jYXRlZ29yeTEsICdjYXRlZ29yeS0xJykgLmJyLiBjYXRlZ29yeV9wb3B1cCgiYXJ0aWNsZV9jYXRlZ29yeTIiLCAkYXJ0aWNsZV9jYXRlZ29yeTIsICdjYXRlZ29yeS0yJykgKSApIC4NCgkJCQkJdHIoIGZMYWJlbENlbGwoICdzdGF0dXMnICkgLiB0ZGEoIHNlbGVjdElucHV0KCdhcnRpY2xlX3N0YXR1cycsIGFycmF5KDE9PidEcmFmdCcsMj0+J0hpZGRlbicsMz0+J1BlbmRpbmcnLDQ9PidMaXZlJyw1PT4nU3RpY2t5JyksNCkgKSApIC4NCgkJCQkJdHIoIGZMYWJlbENlbGwoICdib2R5JyApIC4gdGRhKCAnPHRleHRhcmVhIG5hbWU9ImFydGljbGVfYm9keSIgY29scz0iNDAiIHJvd3M9IjciPicuaHRtbHNwZWNpYWxjaGFycygkYXJ0aWNsZV9ib2R5KS4nPC90ZXh0YXJlYT4nLCAnIHZhbGlnbj0idG9wIicgKSApIC4NCgkJCQkJdHIoIGZMYWJlbENlbGwoICdhbm5vdGF0ZScgKSAuIHRkYSggeWVzbm9SYWRpbygnYXJ0aWNsZV9hbm5vdGF0ZScsJGFydGljbGVfYW5ub3RhdGUpICkgKSAuDQoJCQkJCXRyKCBmTGFiZWxDZWxsKCAnYW5ub3RhdGVpbnZpdGUnICkgLiBmSW5wdXRDZWxsKCAnYXJ0aWNsZV9hbm5vdGF0ZWludml0ZScsICRhcnRpY2xlX2Fubm90YXRlaW52aXRlLCAxLCAzMCApKSAuDQoJCQkJCXRyKCBmTGFiZWxDZWxsKCAna2V5d29yZHMnICkgLiB0ZGEoICc8dGV4dGFyZWEgbmFtZT0iYXJ0aWNsZV9rZXl3b3JkcyIgY29scz0iNDAiIHJvd3M9IjMiPicuaHRtbHNwZWNpYWxjaGFycygkYXJ0aWNsZV9rZXl3b3JkcykuJzwvdGV4dGFyZWE+JywgJyB2YWxpZ249InRvcCInICkgKSAuDQoJCQkJCXRyKCBmTGFiZWxDZWxsKCAnb3ZlcnJpZGVfZGVmYXVsdF9mb3JtJyApIC4gdGRhKGZvcm1fcG9wKCRhcnRpY2xlX292ZXJyaWRlX2Zvcm0sICdvdmVycmlkZS1mb3JtJykucG9wSGVscCgnb3ZlcnJpZGVfZm9ybScpKSkgLg0KCQkJCQl0ciggZkxhYmVsQ2VsbCggJ2F1dGhvcicgKSAuIGZJbnB1dENlbGwoICdhcnRpY2xlX3VzZXInLCAkYXJ0aWNsZV91c2VyLCAxLCAzMCApKTsNCg0KCQkJCQknJzsNCg0KCQkJZm9yKCRpPTE7JGk8PTEwOyRpKyspIHsNCgkJCQkkayA9ICJhcnRpY2xlX2N1c3RvbV97JGl9IjsNCgkJCQkka3NldCA9ICJjdXN0b21feyRpfV9zZXQiOw0KCQkJCWlmIChpc3NldCgkJGtzZXQpIGFuZCAhZW1wdHkoJCRrc2V0KSkNCgkJCQkJJG91dCAuPSB0cigJZkxhYmVsQ2VsbCggJCRrc2V0ICkgLiBmSW5wdXRDZWxsKCAkaywgJCRrLCAxLCAzMCApICk7DQoJCQl9DQoNCgkJJG91dCAuPSBlbmRUYWJsZSgpOw0KCQkkb3V0IC49IGhJbnB1dCgndG1wZmlsZW5hbWUnLCR0bXBmaWxlbmFtZSk7DQoJCSRvdXQgLj0gaElucHV0KCdhdXRob3InLCAkdXNlcik7DQoJCSRvdXQgLj0gaElucHV0KCd3Jywkdyk7DQoJCSRvdXQgLj0gaElucHV0KCdoJywkaCk7DQoNCgl9DQoNCglyZXR1cm4gJG91dDsNCn0NCg0KZnVuY3Rpb24gaW1hZ2VfYXBwcm92ZXIoJHR5cGUsJGRhdGEpDQp7DQoJaWYgKCR0eXBlPT0naW1hZ2UnICYmIGlzX2FycmF5KCRkYXRhKSkgew0KCQlleHRyYWN0KCRkYXRhKTsNCg0KCQkkcnNfdHJhbnMgPSBzYWZlX3F1ZXJ5KCJTVEFSVCBUUkFOU0FDVElPTiIpOw0KDQoJCS8vIGluc2VydCByZWNvcmQNCgkJJHEgPSBzYWZlX2luc2VydCgidHhwX2ltYWdlIiwNCgkJICAgIm5hbWUJICAgID0gJyIuZG9TbGFzaCgkbmFtZSkuIicsDQoJCQljYXRlZ29yeSAgICA9ICciLmRvU2xhc2goJGNhdGVnb3J5KS4iJywNCgkJCWV4dAkJCT0gJyRleHQnLCINCgkJCS4oIWVtcHR5KCR3KSA/IncJCQk9ICR3LCIgOiAnJykNCgkJCS4oIWVtcHR5KCRoKSA/ImgJCQk9ICRoLCIgOiAnJykNCgkJCS4iDQoJCQlhbHQgICAgICAgICA9ICciLmRvU2xhc2goJGFsdCkuIicsDQoJCQljYXB0aW9uICAgICA9ICciLmRvU2xhc2goJGNhcHRpb24pLiInLA0KCQkJZGF0ZQkJPSBub3coKSwNCgkJCWF1dGhvcgkJPSAnIi5kb1NsYXNoKCRhdXRob3IpLiInIg0KCQkpOw0KDQoJCS8vIGdldCBpZA0KCQkkaWQgPSBteXNxbF9pbnNlcnRfaWQoKTsNCg0KCQlpZiAoJHE9PT1mYWxzZSkgew0KCQkJc2FmZV9xdWVyeSgiUk9MTEJBQ0siKTsNCgkJCXJldHVybiAnZmFpbGVkIHRvIGluc2VydCBpbWFnZSc7DQoJCX0NCg0KCQlpZiAoJGFydGljbGVfd3JhcF9lbmFibGVkKSB7DQoJCQkvLyBsaW5rIGltYWdlIHRvIHdyYXBwZXIgYXJ0aWNsZQ0KCQkJJGRhdGFbJ2FydGljbGVfaW1hZ2UnXSA9ICRpZDsNCg0KCQkJJHJlc3VsdCA9IG1vZGltZ193cmFwX2ltYWdlKCRkYXRhKTsNCg0KCQkJaWYgKCFlbXB0eSgkcmVzdWx0KSkgew0KCQkJCXNhZmVfcXVlcnkoIlJPTExCQUNLIik7DQoNCgkJCQlyZXR1cm4gJ2ZhaWxlZCB0byBpbnNlcnQgaW1hZ2Ugd3JhcHBlcic7DQoJCQl9DQoJCX0NCg0KCQkvLyB3cml0ZSBmaWxlIHRvIGltYWdlcyBmb2xkZXINCgkJJHBhdGggPSBJTVBBVEguJGlkLiRleHQ7DQoJCSR0bXBmaWxlID0gSU1QQVRILiR0bXBmaWxlbmFtZTsNCg0KCQlpZiAoZmlsZV9leGlzdHMoJHRtcGZpbGUpKSB7DQoJCQlpZiAoc2hpZnRfdXBsb2FkZWRfZmlsZSgkdG1wZmlsZSwkcGF0aCkpIHsNCgkJCQkkZmFpbGVkID0gZmFsc2U7DQoJCQkJY2htb2QoJHBhdGgsMDc1NSk7DQoJCQl9IGVsc2Ugew0KLy8JCQkJdW5saW5rKCR0bXBmaWxlKTsNCgkJCQlzYWZlX3F1ZXJ5KCJST0xMQkFDSyIpOw0KCQkJCXJldHVybiAnRmFpbGVkIHRvIG1vdmUgaW1hZ2UgZmlsZSc7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlzYWZlX3F1ZXJ5KCJST0xMQkFDSyIpOw0KCQkJcmV0dXJuICJJbWFnZSBmaWxlICd7JHRtcGZpbGV9JyBkb2VzIG5vdCBleGlzdC4iOw0KCQl9DQoNCgkJLy8gY29tbWl0IGl0IGFsbC4gdGh1bWJuYWlsIGlzIG5vdCBjcml0aWNhbA0KCQlzYWZlX3F1ZXJ5KCJDT01NSVQiKTsNCg0KCQkvLyBnZXQgdGh1bWJuYWlsIGRpbWVuaW9ucw0KCQlsaXN0KCR0X3dpZHRoLCR0X2hlaWdodCkgPSBtb2RpbWdfZ2V0X2ltYWdlX2RpbWVuc2lvbnModHJ1ZSk7DQoJCSR0X2Nyb3AgPSBtZW1fZ2V0X3ByZWYoJ21vZF9pbWFnZV90aHVtYm5haWxfY3JvcCcsJ3ZhbCcpOw0KDQoJCSR0ID0gbmV3IHR4cF90aHVtYiggJGlkICk7DQoJCSR0LT5jcm9wID0gKCR0X2Nyb3AgPT0gJzEnKTsNCgkJJHQtPmhpbnQgPSAnMCc7DQoJCWlmICggaXNfbnVtZXJpYygkdF93aWR0aCkgJiYgaXNfbnVtZXJpYygkdF9oZWlnaHQpICkgew0KCQkJaWYgKCR3ID4gJGgpDQoJCQkJJHQtPndpZHRoID0gJHRfd2lkdGg7DQoJCQllbHNlDQoJCQkJJHQtPmhlaWdodCA9ICR0X2hlaWdodDsNCgkJfQ0KDQoJCWlmICghJHQtPndyaXRlKCkpIHsNCgkJCXJldHVybiAnRmFpbGVkIHRvIGNyZWF0ZSB0aHVtYm5haWwnOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBtb2RpbWdfd3JhcF9pbWFnZSgkZGF0YSkNCnsNCgkkYXJ0aWNsZV9kYXRhID0gYXJyYXkoKTsNCg0KCWZvcmVhY2ggKCRkYXRhIGFzICRrZXkgPT4gJHZhbCkNCgl7DQoJCWlmIChzdHJuY21wKCdhcnRpY2xlXycsJGtleSw4KT09MCkNCgkJCSRhcnRpY2xlX2RhdGFbc3Vic3RyKCRrZXksOCldID0gJHZhbDsNCgl9DQoNCglyZXR1cm4gYXJ0aWNsZV9hcHByb3ZlcignYXJ0aWNsZScsJGFydGljbGVfZGF0YSk7DQp9DQoNCmZ1bmN0aW9uIGltYWdlX3JlamVjdGVyKCR0eXBlLCRkYXRhKQ0Kew0KCWlmICgkdHlwZT09J2ltYWdlJyBhbmQgaXNfYXJyYXkoJGRhdGEpKSB7DQoJCWV4dHJhY3QoJGRhdGEpOw0KCQlpZiAoQGZpbGVfZXhpc3RzKCR0bXBmaWxlKSkgew0KCQkJLy8gcmVtb3ZlIHRoZSByZWplY3RlZCBpbWFnZSBmaWxlDQoJCQl1bmxpbmsoJHRtcGZpbGUpOw0KCQl9DQoJfQ0KfQ0KIjtzOjQ6InR5cGUiO3M6MToiMSI7czozOiJtZDUiO3M6MzI6ImNmNTcxM2Q2NzM2OGRhODk2ZmIyNDljNGRhYzFjYTQ4Ijt9