3NAxHUEaM6RAG7rVDPL9L6DFZWkrqFtY98t · data · jquery.dataTables.js?4?4?0
{
"jquery.dataTables.js?4?4?0": "base64:KFwpJC87CgkKCS8qKgoJICogU3BsaXQgc3RyaW5nIG9uIHBlcmlvZHMsIHRha2luZyBpbnRvIGFjY291bnQgZXNjYXBlZCBwZXJpb2RzCgkgKiBAcGFyYW0gIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gc3BsaXQKCSAqIEByZXR1cm4ge2FycmF5fSBTcGxpdCBzdHJpbmcKCSAqLwoJZnVuY3Rpb24gX2ZuU3BsaXRPYmpOb3RhdGlvbiggc3RyICkKCXsKCQlyZXR1cm4gJC5tYXAoIHN0ci5tYXRjaCgvKFxcLnxbXlwuXSkrL2cpIHx8IFsnJ10sIGZ1bmN0aW9uICggcyApIHsKCQkJcmV0dXJuIHMucmVwbGFjZSgvXFxcLi9nLCAnLicpOwoJCX0gKTsKCX0KCQoJCgkvKioKCSAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGRhdGEgZnJvbSBhIHNvdXJjZSBvYmplY3QsIHRha2luZwoJICogaW50byBhY2NvdW50IHRoZSBhYmlsaXR5IHRvIHVzZSBuZXN0ZWQgb2JqZWN0cyBhcyBhIHNvdXJjZQoJICogIEBwYXJhbSB7c3RyaW5nfGludHxmdW5jdGlvbn0gbVNvdXJjZSBUaGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBvYmplY3QKCSAqICBAcmV0dXJucyB7ZnVuY3Rpb259IERhdGEgZ2V0IGZ1bmN0aW9uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkdldE9iamVjdERhdGFGbiggbVNvdXJjZSApCgl7CgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIG1Tb3VyY2UgKSApCgkJewoJCQkvKiBCdWlsZCBhbiBvYmplY3Qgb2YgZ2V0IGZ1bmN0aW9ucywgYW5kIHdyYXAgdGhlbSBpbiBhIHNpbmdsZSBjYWxsICovCgkJCXZhciBvID0ge307CgkJCSQuZWFjaCggbVNvdXJjZSwgZnVuY3Rpb24gKGtleSwgdmFsKSB7CgkJCQlpZiAoIHZhbCApIHsKCQkJCQlvW2tleV0gPSBfZm5HZXRPYmplY3REYXRhRm4oIHZhbCApOwoJCQkJfQoJCQl9ICk7CgkKCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHsKCQkJCXZhciB0ID0gb1t0eXBlXSB8fCBvLl87CgkJCQlyZXR1cm4gdCAhPT0gdW5kZWZpbmVkID8KCQkJCQl0KGRhdGEsIHR5cGUsIHJvdywgbWV0YSkgOgoJCQkJCWRhdGE7CgkJCX07CgkJfQoJCWVsc2UgaWYgKCBtU291cmNlID09PSBudWxsICkKCQl7CgkJCS8qIEdpdmUgYW4gZW1wdHkgc3RyaW5nIGZvciByZW5kZXJpbmcgLyBzb3J0aW5nIGV0YyAqLwoJCQlyZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHsgLy8gdHlwZSwgcm93IGFuZCBtZXRhIGFsc28gcGFzc2VkLCBidXQgbm90IHVzZWQKCQkJCXJldHVybiBkYXRhOwoJCQl9OwoJCX0KCQllbHNlIGlmICggdHlwZW9mIG1Tb3VyY2UgPT09ICdmdW5jdGlvbicgKQoJCXsKCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHsKCQkJCXJldHVybiBtU291cmNlKCBkYXRhLCB0eXBlLCByb3csIG1ldGEgKTsKCQkJfTsKCQl9CgkJZWxzZSBpZiAoIHR5cGVvZiBtU291cmNlID09PSAnc3RyaW5nJyAmJiAobVNvdXJjZS5pbmRleE9mKCcuJykgIT09IC0xIHx8CgkJCSAgICAgIG1Tb3VyY2UuaW5kZXhPZignWycpICE9PSAtMSB8fCBtU291cmNlLmluZGV4T2YoJygnKSAhPT0gLTEpICkKCQl7CgkJCS8qIElmIHRoZXJlIGlzIGEgLiBpbiB0aGUgc291cmNlIHN0cmluZyB0aGVuIHRoZSBkYXRhIHNvdXJjZSBpcyBpbiBhCgkJCSAqIG5lc3RlZCBvYmplY3Qgc28gd2UgbG9vcCBvdmVyIHRoZSBkYXRhIGZvciBlYWNoIGxldmVsIHRvIGdldCB0aGUgbmV4dAoJCQkgKiBsZXZlbCBkb3duLiBPbiBlYWNoIGxvb3Agd2UgdGVzdCBmb3IgdW5kZWZpbmVkLCBhbmQgaWYgZm91bmQgaW1tZWRpYXRlbHkKCQkJICogcmV0dXJuLiBUaGlzIGFsbG93cyBlbnRpcmUgb2JqZWN0cyB0byBiZSBtaXNzaW5nIGFuZCBzRGVmYXVsdENvbnRlbnQgdG8KCQkJICogYmUgdXNlZCBpZiBkZWZpbmVkLCByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBlcnJvcgoJCQkgKi8KCQkJdmFyIGZldGNoRGF0YSA9IGZ1bmN0aW9uIChkYXRhLCB0eXBlLCBzcmMpIHsKCQkJCXZhciBhcnJheU5vdGF0aW9uLCBmdW5jTm90YXRpb24sIG91dCwgaW5uZXJTcmM7CgkKCQkJCWlmICggc3JjICE9PSAiIiApCgkJCQl7CgkJCQkJdmFyIGEgPSBfZm5TcGxpdE9iak5vdGF0aW9uKCBzcmMgKTsKCQoJCQkJCWZvciAoIHZhciBpPTAsIGlMZW49YS5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCQkJCXsKCQkJCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBzcGVjaWFsIG5vdGF0aW9uCgkJCQkJCWFycmF5Tm90YXRpb24gPSBhW2ldLm1hdGNoKF9fcmVBcnJheSk7CgkJCQkJCWZ1bmNOb3RhdGlvbiA9IGFbaV0ubWF0Y2goX19yZUZuKTsKCQoJCQkJCQlpZiAoIGFycmF5Tm90YXRpb24gKQoJCQkJCQl7CgkJCQkJCQkvLyBBcnJheSBub3RhdGlvbgoJCQkJCQkJYVtpXSA9IGFbaV0ucmVwbGFjZShfX3JlQXJyYXksICcnKTsKCQoJCQkJCQkJLy8gQ29uZGl0aW9uIGFsbG93cyBzaW1wbHkgW10gdG8gYmUgcGFzc2VkIGluCgkJCQkJCQlpZiAoIGFbaV0gIT09ICIiICkgewoJCQkJCQkJCWRhdGEgPSBkYXRhWyBhW2ldIF07CgkJCQkJCQl9CgkJCQkJCQlvdXQgPSBbXTsKCQoJCQkJCQkJLy8gR2V0IHRoZSByZW1haW5kZXIgb2YgdGhlIG5lc3RlZCBvYmplY3QgdG8gZ2V0CgkJCQkJCQlhLnNwbGljZSggMCwgaSsxICk7CgkJCQkJCQlpbm5lclNyYyA9IGEuam9pbignLicpOwoJCgkJCQkJCQkvLyBUcmF2ZXJzZSBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSBnZXR0aW5nIHRoZSBwcm9wZXJ0aWVzIHJlcXVlc3RlZAoJCQkJCQkJaWYgKCAkLmlzQXJyYXkoIGRhdGEgKSApIHsKCQkJCQkJCQlmb3IgKCB2YXIgaj0wLCBqTGVuPWRhdGEubGVuZ3RoIDsgajxqTGVuIDsgaisrICkgewoJCQkJCQkJCQlvdXQucHVzaCggZmV0Y2hEYXRhKCBkYXRhW2pdLCB0eXBlLCBpbm5lclNyYyApICk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCgkJCQkJCQkvLyBJZiBhIHN0cmluZyBpcyBnaXZlbiBpbiBiZXR3ZWVuIHRoZSBhcnJheSBub3RhdGlvbiBpbmRpY2F0b3JzLCB0aGF0CgkJCQkJCQkvLyBpcyB1c2VkIHRvIGpvaW4gdGhlIHN0cmluZ3MgdG9nZXRoZXIsIG90aGVyd2lzZSBhbiBhcnJheSBpcyByZXR1cm5lZAoJCQkJCQkJdmFyIGpvaW4gPSBhcnJheU5vdGF0aW9uWzBdLnN1YnN0cmluZygxLCBhcnJheU5vdGF0aW9uWzBdLmxlbmd0aC0xKTsKCQkJCQkJCWRhdGEgPSAoam9pbj09PSIiKSA/IG91dCA6IG91dC5qb2luKGpvaW4pOwoJCgkJCQkJCQkvLyBUaGUgaW5uZXIgY2FsbCB0byBmZXRjaERhdGEgaGFzIGFscmVhZHkgdHJhdmVyc2VkIHRocm91Z2ggdGhlIHJlbWFpbmRlcgoJCQkJCQkJLy8gb2YgdGhlIHNvdXJjZSByZXF1ZXN0ZWQsIHNvIHdlIGV4aXQgZnJvbSB0aGUgbG9vcAoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJZWxzZSBpZiAoIGZ1bmNOb3RhdGlvbiApCgkJCQkJCXsKCQkJCQkJCS8vIEZ1bmN0aW9uIGNhbGwKCQkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUZuLCAnJyk7CgkJCQkJCQlkYXRhID0gZGF0YVsgYVtpXSBdKCk7CgkJCQkJCQljb250aW51ZTsKCQkJCQkJfQoJCgkJCQkJCWlmICggZGF0YSA9PT0gbnVsbCB8fCBkYXRhWyBhW2ldIF0gPT09IHVuZGVmaW5lZCApCgkJCQkJCXsKCQkJCQkJCXJldHVybiB1bmRlZmluZWQ7CgkJCQkJCX0KCQkJCQkJZGF0YSA9IGRhdGFbIGFbaV0gXTsKCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBkYXRhOwoJCQl9OwoJCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdHlwZSkgeyAvLyByb3cgYW5kIG1ldGEgYWxzbyBwYXNzZWQsIGJ1dCBub3QgdXNlZAoJCQkJcmV0dXJuIGZldGNoRGF0YSggZGF0YSwgdHlwZSwgbVNvdXJjZSApOwoJCQl9OwoJCX0KCQllbHNlCgkJewoJCQkvKiBBcnJheSBvciBmbGF0IG9iamVjdCBtYXBwaW5nICovCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdHlwZSkgeyAvLyByb3cgYW5kIG1ldGEgYWxzbyBwYXNzZWQsIGJ1dCBub3QgdXNlZAoJCQkJcmV0dXJuIGRhdGFbbVNvdXJjZV07CgkJCX07CgkJfQoJfQoJCgkKCS8qKgoJICogUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQgZGF0YSBmcm9tIGEgc291cmNlIG9iamVjdCwgdGFraW5nCgkgKiBpbnRvIGFjY291bnQgdGhlIGFiaWxpdHkgdG8gdXNlIG5lc3RlZCBvYmplY3RzIGFzIGEgc291cmNlCgkgKiAgQHBhcmFtIHtzdHJpbmd8aW50fGZ1bmN0aW9ufSBtU291cmNlIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIG9iamVjdAoJICogIEByZXR1cm5zIHtmdW5jdGlvbn0gRGF0YSBzZXQgZnVuY3Rpb24KCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuU2V0T2JqZWN0RGF0YUZuKCBtU291cmNlICkKCXsKCQlpZiAoICQuaXNQbGFpbk9iamVjdCggbVNvdXJjZSApICkKCQl7CgkJCS8qIFVubGlrZSBnZXQsIG9ubHkgdGhlIHVuZGVyc2NvcmUgKGdsb2JhbCkgb3B0aW9uIGlzIHVzZWQgZm9yIGZvcgoJCQkgKiBzZXR0aW5nIGRhdGEgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBoZXJlLiBUaGlzIGlzIHdoeSBhbiBvYmplY3QKCQkJICogb3B0aW9uIGlzIG5vdCBkb2N1bWVudGVkIGZvciBgbURhdGFgICh3aGljaCBpcyByZWFkL3dyaXRlKSwgYnV0IGl0IGlzCgkJCSAqIGZvciBgbVJlbmRlcmAgd2hpY2ggaXMgcmVhZCBvbmx5LgoJCQkgKi8KCQkJcmV0dXJuIF9mblNldE9iamVjdERhdGFGbiggbVNvdXJjZS5fICk7CgkJfQoJCWVsc2UgaWYgKCBtU291cmNlID09PSBudWxsICkKCQl7CgkJCS8qIE5vdGhpbmcgdG8gZG8gd2hlbiB0aGUgZGF0YSBzb3VyY2UgaXMgbnVsbCAqLwoJCQlyZXR1cm4gZnVuY3Rpb24gKCkge307CgkJfQoJCWVsc2UgaWYgKCB0eXBlb2YgbVNvdXJjZSA9PT0gJ2Z1bmN0aW9uJyApCgkJewoJCQlyZXR1cm4gZnVuY3Rpb24gKGRhdGEsIHZhbCwgbWV0YSkgewoJCQkJbVNvdXJjZSggZGF0YSwgJ3NldCcsIHZhbCwgbWV0YSApOwoJCQl9OwoJCX0KCQllbHNlIGlmICggdHlwZW9mIG1Tb3VyY2UgPT09ICdzdHJpbmcnICYmIChtU291cmNlLmluZGV4T2YoJy4nKSAhPT0gLTEgfHwKCQkJICAgICAgbVNvdXJjZS5pbmRleE9mKCdbJykgIT09IC0xIHx8IG1Tb3VyY2UuaW5kZXhPZignKCcpICE9PSAtMSkgKQoJCXsKCQkJLyogTGlrZSB0aGUgZ2V0LCB3ZSBuZWVkIHRvIGdldCBkYXRhIGZyb20gYSBuZXN0ZWQgb2JqZWN0ICovCgkJCXZhciBzZXREYXRhID0gZnVuY3Rpb24gKGRhdGEsIHZhbCwgc3JjKSB7CgkJCQl2YXIgYSA9IF9mblNwbGl0T2JqTm90YXRpb24oIHNyYyApLCBiOwoJCQkJdmFyIGFMYXN0ID0gYVthLmxlbmd0aC0xXTsKCQkJCXZhciBhcnJheU5vdGF0aW9uLCBmdW5jTm90YXRpb24sIG8sIGlubmVyU3JjOwoJCgkJCQlmb3IgKCB2YXIgaT0wLCBpTGVuPWEubGVuZ3RoLTEgOyBpPGlMZW4gOyBpKysgKQoJCQkJewoJCQkJCS8vIENoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gYXJyYXkgbm90YXRpb24gcmVxdWVzdAoJCQkJCWFycmF5Tm90YXRpb24gPSBhW2ldLm1hdGNoKF9fcmVBcnJheSk7CgkJCQkJZnVuY05vdGF0aW9uID0gYVtpXS5tYXRjaChfX3JlRm4pOwoJCgkJCQkJaWYgKCBhcnJheU5vdGF0aW9uICkKCQkJCQl7CgkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUFycmF5LCAnJyk7CgkJCQkJCWRhdGFbIGFbaV0gXSA9IFtdOwoJCgkJCQkJCS8vIEdldCB0aGUgcmVtYWluZGVyIG9mIHRoZSBuZXN0ZWQgb2JqZWN0IHRvIHNldCBzbyB3ZSBjYW4gcmVjdXJzZQoJCQkJCQliID0gYS5zbGljZSgpOwoJCQkJCQliLnNwbGljZSggMCwgaSsxICk7CgkJCQkJCWlubmVyU3JjID0gYi5qb2luKCcuJyk7CgkKCQkJCQkJLy8gVHJhdmVyc2UgZWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgc2V0dGluZyB0aGUgcHJvcGVydGllcyByZXF1ZXN0ZWQKCQkJCQkJaWYgKCAkLmlzQXJyYXkoIHZhbCApICkKCQkJCQkJewoJCQkJCQkJZm9yICggdmFyIGo9MCwgakxlbj12YWwubGVuZ3RoIDsgajxqTGVuIDsgaisrICkKCQkJCQkJCXsKCQkJCQkJCQlvID0ge307CgkJCQkJCQkJc2V0RGF0YSggbywgdmFsW2pdLCBpbm5lclNyYyApOwoJCQkJCQkJCWRhdGFbIGFbaV0gXS5wdXNoKCBvICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkvLyBXZSd2ZSBiZWVuIGFza2VkIHRvIHNhdmUgZGF0YSB0byBhbiBhcnJheSwgYnV0IGl0CgkJCQkJCQkvLyBpc24ndCBhcnJheSBkYXRhIHRvIGJlIHNhdmVkLiBCZXN0IHRoYXQgY2FuIGJlIGRvbmUKCQkJCQkJCS8vIGlzIHRvIGp1c3Qgc2F2ZSB0aGUgdmFsdWUuCgkJCQkJCQlkYXRhWyBhW2ldIF0gPSB2YWw7CgkJCQkJCX0KCQoJCQkJCQkvLyBUaGUgaW5uZXIgY2FsbCB0byBzZXREYXRhIGhhcyBhbHJlYWR5IHRyYXZlcnNlZCB0aHJvdWdoIHRoZSByZW1haW5kZXIKCQkJCQkJLy8gb2YgdGhlIHNvdXJjZSBhbmQgaGFzIHNldCB0aGUgZGF0YSwgdGh1cyB3ZSBjYW4gZXhpdCBoZXJlCgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoIGZ1bmNOb3RhdGlvbiApCgkJCQkJewoJCQkJCQkvLyBGdW5jdGlvbiBjYWxsCgkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUZuLCAnJyk7CgkJCQkJCWRhdGEgPSBkYXRhWyBhW2ldIF0oIHZhbCApOwoJCQkJCX0KCQoJCQkJCS8vIElmIHRoZSBuZXN0ZWQgb2JqZWN0IGRvZXNuJ3QgY3VycmVudGx5IGV4aXN0IC0gc2luY2Ugd2UgYXJlCgkJCQkJLy8gdHJ5aW5nIHRvIHNldCB0aGUgdmFsdWUgLSBjcmVhdGUgaXQKCQkJCQlpZiAoIGRhdGFbIGFbaV0gXSA9PT0gbnVsbCB8fCBkYXRhWyBhW2ldIF0gPT09IHVuZGVmaW5lZCApCgkJCQkJewoJCQkJCQlkYXRhWyBhW2ldIF0gPSB7fTsKCQkJCQl9CgkJCQkJZGF0YSA9IGRhdGFbIGFbaV0gXTsKCQkJCX0KCQoJCQkJLy8gTGFzdCBpdGVtIGluIHRoZSBpbnB1dCAtIGkuZSwgdGhlIGFjdHVhbCBzZXQKCQkJCWlmICggYUxhc3QubWF0Y2goX19yZUZuICkgKQoJCQkJewoJCQkJCS8vIEZ1bmN0aW9uIGNhbGwKCQkJCQlkYXRhID0gZGF0YVsgYUxhc3QucmVwbGFjZShfX3JlRm4sICcnKSBdKCB2YWwgKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkvLyBJZiBhcnJheSBub3RhdGlvbiBpcyB1c2VkLCB3ZSBqdXN0IHdhbnQgdG8gc3RyaXAgaXQgYW5kIHVzZSB0aGUgcHJvcGVydHkgbmFtZQoJCQkJCS8vIGFuZCBhc3NpZ24gdGhlIHZhbHVlLiBJZiBpdCBpc24ndCB1c2VkLCB0aGVuIHdlIGdldCB0aGUgcmVzdWx0IHdlIHdhbnQgYW55d2F5CgkJCQkJZGF0YVsgYUxhc3QucmVwbGFjZShfX3JlQXJyYXksICcnKSBdID0gdmFsOwoJCQkJfQoJCQl9OwoJCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdmFsKSB7IC8vIG1ldGEgaXMgYWxzbyBwYXNzZWQgaW4sIGJ1dCBub3QgdXNlZAoJCQkJcmV0dXJuIHNldERhdGEoIGRhdGEsIHZhbCwgbVNvdXJjZSApOwoJCQl9OwoJCX0KCQllbHNlCgkJewoJCQkvKiBBcnJheSBvciBmbGF0IG9iamVjdCBtYXBwaW5nICovCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdmFsKSB7IC8vIG1ldGEgaXMgYWxzbyBwYXNzZWQgaW4sIGJ1dCBub3QgdXNlZAoJCQkJZGF0YVttU291cmNlXSA9IHZhbDsKCQkJfTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBSZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgZnVsbCB0YWJsZSBkYXRhCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEByZXR1cm5zIGFycmF5IHthcnJheX0gYURhdGEgTWFzdGVyIGRhdGEgYXJyYXkKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuR2V0RGF0YU1hc3RlciAoIHNldHRpbmdzICkKCXsKCQlyZXR1cm4gX3BsdWNrKCBzZXR0aW5ncy5hb0RhdGEsICdfYURhdGEnICk7Cgl9CgkKCQoJLyoqCgkgKiBOdWtlIHRoZSB0YWJsZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQ2xlYXJUYWJsZSggc2V0dGluZ3MgKQoJewoJCXNldHRpbmdzLmFvRGF0YS5sZW5ndGggPSAwOwoJCXNldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5sZW5ndGggPSAwOwoJCXNldHRpbmdzLmFpRGlzcGxheS5sZW5ndGggPSAwOwoJCXNldHRpbmdzLmFJZHMgPSB7fTsKCX0KCQoJCgkgLyoqCgkgKiBUYWtlIGFuIGFycmF5IG9mIGludGVnZXJzIChpbmRleCBhcnJheSkgYW5kIHJlbW92ZSBhIHRhcmdldCBpbnRlZ2VyICh2YWx1ZSAtIG5vdAoJICogdGhlIGtleSEpCgkgKiAgQHBhcmFtIHthcnJheX0gYSBJbmRleCBhcnJheSB0byB0YXJnZXQKCSAqICBAcGFyYW0ge2ludH0gaVRhcmdldCB2YWx1ZSB0byBmaW5kCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkRlbGV0ZUluZGV4KCBhLCBpVGFyZ2V0LCBzcGxpY2UgKQoJewoJCXZhciBpVGFyZ2V0SW5kZXggPSAtMTsKCQoJCWZvciAoIHZhciBpPTAsIGlMZW49YS5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJaWYgKCBhW2ldID09IGlUYXJnZXQgKQoJCQl7CgkJCQlpVGFyZ2V0SW5kZXggPSBpOwoJCQl9CgkJCWVsc2UgaWYgKCBhW2ldID4gaVRhcmdldCApCgkJCXsKCQkJCWFbaV0tLTsKCQkJfQoJCX0KCQoJCWlmICggaVRhcmdldEluZGV4ICE9IC0xICYmIHNwbGljZSA9PT0gdW5kZWZpbmVkICkKCQl7CgkJCWEuc3BsaWNlKCBpVGFyZ2V0SW5kZXgsIDEgKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBNYXJrIGNhY2hlZCBkYXRhIGFzIGludmFsaWQgc3VjaCB0aGF0IGEgcmUtcmVhZCBvZiB0aGUgZGF0YSB3aWxsIG9jY3VyIHdoZW4KCSAqIHRoZSBjYWNoZWQgZGF0YSBpcyBuZXh0IHJlcXVlc3RlZC4gQWxzbyB1cGRhdGUgZnJvbSB0aGUgZGF0YSBzb3VyY2Ugb2JqZWN0LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogQHBhcmFtIHtpbnR9ICAgIHJvd0lkeCAgIFJvdyBpbmRleCB0byBpbnZhbGlkYXRlCgkgKiBAcGFyYW0ge3N0cmluZ30gW3NyY10gICAgU291cmNlIHRvIGludmFsaWRhdGUgZnJvbTogdW5kZWZpbmVkLCAnYXV0bycsICdkb20nCgkgKiAgICAgb3IgJ2RhdGEnCgkgKiBAcGFyYW0ge2ludH0gICAgW2NvbElkeF0gQ29sdW1uIGluZGV4IHRvIGludmFsaWRhdGUuIElmIHVuZGVmaW5lZCB0aGUgd2hvbGUKCSAqICAgICByb3cgd2lsbCBiZSBpbnZhbGlkYXRlZAoJICogQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKgoJICogQHRvZG8gRm9yIHRoZSBtb2R1bGFyaXNhdGlvbiBvZiB2MS4xMSB0aGlzIHdpbGwgbmVlZCB0byBiZWNvbWUgYSBjYWxsYmFjaywgc28KCSAqICAgdGhlIHNvcnQgYW5kIGZpbHRlciBtZXRob2RzIGNhbiBzdWJzY3JpYmUgdG8gaXQuIFRoYXQgd2lsbCByZXF1aXJlZAoJICogICBpbml0aWFsaXNhdGlvbiBvcHRpb25zIGZvciBzb3J0aW5nLCB3aGljaCBpcyB3aHkgaXQgaXMgbm90IGFscmVhZHkgYmFrZWQgaW4KCSAqLwoJZnVuY3Rpb24gX2ZuSW52YWxpZGF0ZSggc2V0dGluZ3MsIHJvd0lkeCwgc3JjLCBjb2xJZHggKQoJewoJCXZhciByb3cgPSBzZXR0aW5ncy5hb0RhdGFbIHJvd0lkeCBdOwoJCXZhciBpLCBpZW47CgkJdmFyIGNlbGxXcml0ZSA9IGZ1bmN0aW9uICggY2VsbCwgY29sICkgewoJCQkvLyBUaGlzIGlzIHZlcnkgZnJ1c3RyYXRpbmcsIGJ1dCBpbiBJRSBpZiB5b3UganVzdCB3cml0ZSBkaXJlY3RseQoJCQkvLyB0byBpbm5lckhUTUwsIGFuZCBlbGVtZW50cyB0aGF0IGFyZSBvdmVyd3JpdHRlbiBhcmUgR0MnZWQsCgkJCS8vIGV2ZW4gaWYgdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlbSBlbHNld2hlcmUKCQkJd2hpbGUgKCBjZWxsLmNoaWxkTm9kZXMubGVuZ3RoICkgewoJCQkJY2VsbC5yZW1vdmVDaGlsZCggY2VsbC5maXJzdENoaWxkICk7CgkJCX0KCQoJCQljZWxsLmlubmVySFRNTCA9IF9mbkdldENlbGxEYXRhKCBzZXR0aW5ncywgcm93SWR4LCBjb2wsICdkaXNwbGF5JyApOwoJCX07CgkKCQkvLyBBcmUgd2UgcmVhZGluZyBsYXN0IGRhdGEgZnJvbSBET00gb3IgdGhlIGRhdGEgb2JqZWN0PwoJCWlmICggc3JjID09PSAnZG9tJyB8fCAoKCEgc3JjIHx8IHNyYyA9PT0gJ2F1dG8nKSAmJiByb3cuc3JjID09PSAnZG9tJykgKSB7CgkJCS8vIFJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgRE9NCgkJCXJvdy5fYURhdGEgPSBfZm5HZXRSb3dFbGVtZW50cygKCQkJCQlzZXR0aW5ncywgcm93LCBjb2xJZHgsIGNvbElkeCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcm93Ll9hRGF0YQoJCQkJKQoJCQkJLmRhdGE7CgkJfQoJCWVsc2UgewoJCQkvLyBSZWFkaW5nIGZyb20gZGF0YSBvYmplY3QsIHVwZGF0ZSB0aGUgRE9NCgkJCXZhciBjZWxscyA9IHJvdy5hbkNlbGxzOwoJCgkJCWlmICggY2VsbHMgKSB7CgkJCQlpZiAoIGNvbElkeCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCWNlbGxXcml0ZSggY2VsbHNbY29sSWR4XSwgY29sSWR4ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlmb3IgKCBpPTAsIGllbj1jZWxscy5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCQkJY2VsbFdyaXRlKCBjZWxsc1tpXSwgaSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQoJCS8vIEZvciBib3RoIHJvdyBhbmQgY2VsbCBpbnZhbGlkYXRpb24sIHRoZSBjYWNoZWQgZGF0YSBmb3Igc29ydGluZyBhbmQKCQkvLyBmaWx0ZXJpbmcgaXMgbnVsbGVkIG91dAoJCXJvdy5fYVNvcnREYXRhID0gbnVsbDsKCQlyb3cuX2FGaWx0ZXJEYXRhID0gbnVsbDsKCQoJCS8vIEludmFsaWRhdGUgdGhlIHR5cGUgZm9yIGEgc3BlY2lmaWMgY29sdW1uIChpZiBnaXZlbikgb3IgYWxsIGNvbHVtbnMgc2luY2UKCQkvLyB0aGUgZGF0YSBtaWdodCBoYXZlIGNoYW5nZWQKCQl2YXIgY29scyA9IHNldHRpbmdzLmFvQ29sdW1uczsKCQlpZiAoIGNvbElkeCAhPT0gdW5kZWZpbmVkICkgewoJCQljb2xzWyBjb2xJZHggXS5zVHlwZSA9IG51bGw7CgkJfQoJCWVsc2UgewoJCQlmb3IgKCBpPTAsIGllbj1jb2xzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJY29sc1tpXS5zVHlwZSA9IG51bGw7CgkJCX0KCQoJCQkvLyBVcGRhdGUgRGF0YVRhYmxlcyBzcGVjaWFsIGBEVF8qYCBhdHRyaWJ1dGVzIGZvciB0aGUgcm93CgkJCV9mblJvd0F0dHJpYnV0ZXMoIHNldHRpbmdzLCByb3cgKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBCdWlsZCBhIGRhdGEgc291cmNlIG9iamVjdCBmcm9tIGFuIEhUTUwgcm93LCByZWFkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUKCSAqIGNlbGxzIHRoYXQgYXJlIGluIHRoZSByb3cuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiBAcGFyYW0ge25vZGV8b2JqZWN0fSBUUiBlbGVtZW50IGZyb20gd2hpY2ggdG8gcmVhZCBkYXQ="
}
Changelog:
{
"2019.12.27 20:26": "base64:KFwpJC87CgkKCS8qKgoJICogU3BsaXQgc3RyaW5nIG9uIHBlcmlvZHMsIHRha2luZyBpbnRvIGFjY291bnQgZXNjYXBlZCBwZXJpb2RzCgkgKiBAcGFyYW0gIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gc3BsaXQKCSAqIEByZXR1cm4ge2FycmF5fSBTcGxpdCBzdHJpbmcKCSAqLwoJZnVuY3Rpb24gX2ZuU3BsaXRPYmpOb3RhdGlvbiggc3RyICkKCXsKCQlyZXR1cm4gJC5tYXAoIHN0ci5tYXRjaCgvKFxcLnxbXlwuXSkrL2cpIHx8IFsnJ10sIGZ1bmN0aW9uICggcyApIHsKCQkJcmV0dXJuIHMucmVwbGFjZSgvXFxcLi9nLCAnLicpOwoJCX0gKTsKCX0KCQoJCgkvKioKCSAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGRhdGEgZnJvbSBhIHNvdXJjZSBvYmplY3QsIHRha2luZwoJICogaW50byBhY2NvdW50IHRoZSBhYmlsaXR5IHRvIHVzZSBuZXN0ZWQgb2JqZWN0cyBhcyBhIHNvdXJjZQoJICogIEBwYXJhbSB7c3RyaW5nfGludHxmdW5jdGlvbn0gbVNvdXJjZSBUaGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBvYmplY3QKCSAqICBAcmV0dXJucyB7ZnVuY3Rpb259IERhdGEgZ2V0IGZ1bmN0aW9uCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkdldE9iamVjdERhdGFGbiggbVNvdXJjZSApCgl7CgkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIG1Tb3VyY2UgKSApCgkJewoJCQkvKiBCdWlsZCBhbiBvYmplY3Qgb2YgZ2V0IGZ1bmN0aW9ucywgYW5kIHdyYXAgdGhlbSBpbiBhIHNpbmdsZSBjYWxsICovCgkJCXZhciBvID0ge307CgkJCSQuZWFjaCggbVNvdXJjZSwgZnVuY3Rpb24gKGtleSwgdmFsKSB7CgkJCQlpZiAoIHZhbCApIHsKCQkJCQlvW2tleV0gPSBfZm5HZXRPYmplY3REYXRhRm4oIHZhbCApOwoJCQkJfQoJCQl9ICk7CgkKCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHsKCQkJCXZhciB0ID0gb1t0eXBlXSB8fCBvLl87CgkJCQlyZXR1cm4gdCAhPT0gdW5kZWZpbmVkID8KCQkJCQl0KGRhdGEsIHR5cGUsIHJvdywgbWV0YSkgOgoJCQkJCWRhdGE7CgkJCX07CgkJfQoJCWVsc2UgaWYgKCBtU291cmNlID09PSBudWxsICkKCQl7CgkJCS8qIEdpdmUgYW4gZW1wdHkgc3RyaW5nIGZvciByZW5kZXJpbmcgLyBzb3J0aW5nIGV0YyAqLwoJCQlyZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHsgLy8gdHlwZSwgcm93IGFuZCBtZXRhIGFsc28gcGFzc2VkLCBidXQgbm90IHVzZWQKCQkJCXJldHVybiBkYXRhOwoJCQl9OwoJCX0KCQllbHNlIGlmICggdHlwZW9mIG1Tb3VyY2UgPT09ICdmdW5jdGlvbicgKQoJCXsKCQkJcmV0dXJuIGZ1bmN0aW9uIChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHsKCQkJCXJldHVybiBtU291cmNlKCBkYXRhLCB0eXBlLCByb3csIG1ldGEgKTsKCQkJfTsKCQl9CgkJZWxzZSBpZiAoIHR5cGVvZiBtU291cmNlID09PSAnc3RyaW5nJyAmJiAobVNvdXJjZS5pbmRleE9mKCcuJykgIT09IC0xIHx8CgkJCSAgICAgIG1Tb3VyY2UuaW5kZXhPZignWycpICE9PSAtMSB8fCBtU291cmNlLmluZGV4T2YoJygnKSAhPT0gLTEpICkKCQl7CgkJCS8qIElmIHRoZXJlIGlzIGEgLiBpbiB0aGUgc291cmNlIHN0cmluZyB0aGVuIHRoZSBkYXRhIHNvdXJjZSBpcyBpbiBhCgkJCSAqIG5lc3RlZCBvYmplY3Qgc28gd2UgbG9vcCBvdmVyIHRoZSBkYXRhIGZvciBlYWNoIGxldmVsIHRvIGdldCB0aGUgbmV4dAoJCQkgKiBsZXZlbCBkb3duLiBPbiBlYWNoIGxvb3Agd2UgdGVzdCBmb3IgdW5kZWZpbmVkLCBhbmQgaWYgZm91bmQgaW1tZWRpYXRlbHkKCQkJICogcmV0dXJuLiBUaGlzIGFsbG93cyBlbnRpcmUgb2JqZWN0cyB0byBiZSBtaXNzaW5nIGFuZCBzRGVmYXVsdENvbnRlbnQgdG8KCQkJICogYmUgdXNlZCBpZiBkZWZpbmVkLCByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBlcnJvcgoJCQkgKi8KCQkJdmFyIGZldGNoRGF0YSA9IGZ1bmN0aW9uIChkYXRhLCB0eXBlLCBzcmMpIHsKCQkJCXZhciBhcnJheU5vdGF0aW9uLCBmdW5jTm90YXRpb24sIG91dCwgaW5uZXJTcmM7CgkKCQkJCWlmICggc3JjICE9PSAiIiApCgkJCQl7CgkJCQkJdmFyIGEgPSBfZm5TcGxpdE9iak5vdGF0aW9uKCBzcmMgKTsKCQoJCQkJCWZvciAoIHZhciBpPTAsIGlMZW49YS5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCQkJCXsKCQkJCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBzcGVjaWFsIG5vdGF0aW9uCgkJCQkJCWFycmF5Tm90YXRpb24gPSBhW2ldLm1hdGNoKF9fcmVBcnJheSk7CgkJCQkJCWZ1bmNOb3RhdGlvbiA9IGFbaV0ubWF0Y2goX19yZUZuKTsKCQoJCQkJCQlpZiAoIGFycmF5Tm90YXRpb24gKQoJCQkJCQl7CgkJCQkJCQkvLyBBcnJheSBub3RhdGlvbgoJCQkJCQkJYVtpXSA9IGFbaV0ucmVwbGFjZShfX3JlQXJyYXksICcnKTsKCQoJCQkJCQkJLy8gQ29uZGl0aW9uIGFsbG93cyBzaW1wbHkgW10gdG8gYmUgcGFzc2VkIGluCgkJCQkJCQlpZiAoIGFbaV0gIT09ICIiICkgewoJCQkJCQkJCWRhdGEgPSBkYXRhWyBhW2ldIF07CgkJCQkJCQl9CgkJCQkJCQlvdXQgPSBbXTsKCQoJCQkJCQkJLy8gR2V0IHRoZSByZW1haW5kZXIgb2YgdGhlIG5lc3RlZCBvYmplY3QgdG8gZ2V0CgkJCQkJCQlhLnNwbGljZSggMCwgaSsxICk7CgkJCQkJCQlpbm5lclNyYyA9IGEuam9pbignLicpOwoJCgkJCQkJCQkvLyBUcmF2ZXJzZSBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSBnZXR0aW5nIHRoZSBwcm9wZXJ0aWVzIHJlcXVlc3RlZAoJCQkJCQkJaWYgKCAkLmlzQXJyYXkoIGRhdGEgKSApIHsKCQkJCQkJCQlmb3IgKCB2YXIgaj0wLCBqTGVuPWRhdGEubGVuZ3RoIDsgajxqTGVuIDsgaisrICkgewoJCQkJCQkJCQlvdXQucHVzaCggZmV0Y2hEYXRhKCBkYXRhW2pdLCB0eXBlLCBpbm5lclNyYyApICk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCgkJCQkJCQkvLyBJZiBhIHN0cmluZyBpcyBnaXZlbiBpbiBiZXR3ZWVuIHRoZSBhcnJheSBub3RhdGlvbiBpbmRpY2F0b3JzLCB0aGF0CgkJCQkJCQkvLyBpcyB1c2VkIHRvIGpvaW4gdGhlIHN0cmluZ3MgdG9nZXRoZXIsIG90aGVyd2lzZSBhbiBhcnJheSBpcyByZXR1cm5lZAoJCQkJCQkJdmFyIGpvaW4gPSBhcnJheU5vdGF0aW9uWzBdLnN1YnN0cmluZygxLCBhcnJheU5vdGF0aW9uWzBdLmxlbmd0aC0xKTsKCQkJCQkJCWRhdGEgPSAoam9pbj09PSIiKSA/IG91dCA6IG91dC5qb2luKGpvaW4pOwoJCgkJCQkJCQkvLyBUaGUgaW5uZXIgY2FsbCB0byBmZXRjaERhdGEgaGFzIGFscmVhZHkgdHJhdmVyc2VkIHRocm91Z2ggdGhlIHJlbWFpbmRlcgoJCQkJCQkJLy8gb2YgdGhlIHNvdXJjZSByZXF1ZXN0ZWQsIHNvIHdlIGV4aXQgZnJvbSB0aGUgbG9vcAoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJZWxzZSBpZiAoIGZ1bmNOb3RhdGlvbiApCgkJCQkJCXsKCQkJCQkJCS8vIEZ1bmN0aW9uIGNhbGwKCQkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUZuLCAnJyk7CgkJCQkJCQlkYXRhID0gZGF0YVsgYVtpXSBdKCk7CgkJCQkJCQljb250aW51ZTsKCQkJCQkJfQoJCgkJCQkJCWlmICggZGF0YSA9PT0gbnVsbCB8fCBkYXRhWyBhW2ldIF0gPT09IHVuZGVmaW5lZCApCgkJCQkJCXsKCQkJCQkJCXJldHVybiB1bmRlZmluZWQ7CgkJCQkJCX0KCQkJCQkJZGF0YSA9IGRhdGFbIGFbaV0gXTsKCQkJCQl9CgkJCQl9CgkKCQkJCXJldHVybiBkYXRhOwoJCQl9OwoJCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdHlwZSkgeyAvLyByb3cgYW5kIG1ldGEgYWxzbyBwYXNzZWQsIGJ1dCBub3QgdXNlZAoJCQkJcmV0dXJuIGZldGNoRGF0YSggZGF0YSwgdHlwZSwgbVNvdXJjZSApOwoJCQl9OwoJCX0KCQllbHNlCgkJewoJCQkvKiBBcnJheSBvciBmbGF0IG9iamVjdCBtYXBwaW5nICovCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdHlwZSkgeyAvLyByb3cgYW5kIG1ldGEgYWxzbyBwYXNzZWQsIGJ1dCBub3QgdXNlZAoJCQkJcmV0dXJuIGRhdGFbbVNvdXJjZV07CgkJCX07CgkJfQoJfQoJCgkKCS8qKgoJICogUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQgZGF0YSBmcm9tIGEgc291cmNlIG9iamVjdCwgdGFraW5nCgkgKiBpbnRvIGFjY291bnQgdGhlIGFiaWxpdHkgdG8gdXNlIG5lc3RlZCBvYmplY3RzIGFzIGEgc291cmNlCgkgKiAgQHBhcmFtIHtzdHJpbmd8aW50fGZ1bmN0aW9ufSBtU291cmNlIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIG9iamVjdAoJICogIEByZXR1cm5zIHtmdW5jdGlvbn0gRGF0YSBzZXQgZnVuY3Rpb24KCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuU2V0T2JqZWN0RGF0YUZuKCBtU291cmNlICkKCXsKCQlpZiAoICQuaXNQbGFpbk9iamVjdCggbVNvdXJjZSApICkKCQl7CgkJCS8qIFVubGlrZSBnZXQsIG9ubHkgdGhlIHVuZGVyc2NvcmUgKGdsb2JhbCkgb3B0aW9uIGlzIHVzZWQgZm9yIGZvcgoJCQkgKiBzZXR0aW5nIGRhdGEgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBoZXJlLiBUaGlzIGlzIHdoeSBhbiBvYmplY3QKCQkJICogb3B0aW9uIGlzIG5vdCBkb2N1bWVudGVkIGZvciBgbURhdGFgICh3aGljaCBpcyByZWFkL3dyaXRlKSwgYnV0IGl0IGlzCgkJCSAqIGZvciBgbVJlbmRlcmAgd2hpY2ggaXMgcmVhZCBvbmx5LgoJCQkgKi8KCQkJcmV0dXJuIF9mblNldE9iamVjdERhdGFGbiggbVNvdXJjZS5fICk7CgkJfQoJCWVsc2UgaWYgKCBtU291cmNlID09PSBudWxsICkKCQl7CgkJCS8qIE5vdGhpbmcgdG8gZG8gd2hlbiB0aGUgZGF0YSBzb3VyY2UgaXMgbnVsbCAqLwoJCQlyZXR1cm4gZnVuY3Rpb24gKCkge307CgkJfQoJCWVsc2UgaWYgKCB0eXBlb2YgbVNvdXJjZSA9PT0gJ2Z1bmN0aW9uJyApCgkJewoJCQlyZXR1cm4gZnVuY3Rpb24gKGRhdGEsIHZhbCwgbWV0YSkgewoJCQkJbVNvdXJjZSggZGF0YSwgJ3NldCcsIHZhbCwgbWV0YSApOwoJCQl9OwoJCX0KCQllbHNlIGlmICggdHlwZW9mIG1Tb3VyY2UgPT09ICdzdHJpbmcnICYmIChtU291cmNlLmluZGV4T2YoJy4nKSAhPT0gLTEgfHwKCQkJICAgICAgbVNvdXJjZS5pbmRleE9mKCdbJykgIT09IC0xIHx8IG1Tb3VyY2UuaW5kZXhPZignKCcpICE9PSAtMSkgKQoJCXsKCQkJLyogTGlrZSB0aGUgZ2V0LCB3ZSBuZWVkIHRvIGdldCBkYXRhIGZyb20gYSBuZXN0ZWQgb2JqZWN0ICovCgkJCXZhciBzZXREYXRhID0gZnVuY3Rpb24gKGRhdGEsIHZhbCwgc3JjKSB7CgkJCQl2YXIgYSA9IF9mblNwbGl0T2JqTm90YXRpb24oIHNyYyApLCBiOwoJCQkJdmFyIGFMYXN0ID0gYVthLmxlbmd0aC0xXTsKCQkJCXZhciBhcnJheU5vdGF0aW9uLCBmdW5jTm90YXRpb24sIG8sIGlubmVyU3JjOwoJCgkJCQlmb3IgKCB2YXIgaT0wLCBpTGVuPWEubGVuZ3RoLTEgOyBpPGlMZW4gOyBpKysgKQoJCQkJewoJCQkJCS8vIENoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gYXJyYXkgbm90YXRpb24gcmVxdWVzdAoJCQkJCWFycmF5Tm90YXRpb24gPSBhW2ldLm1hdGNoKF9fcmVBcnJheSk7CgkJCQkJZnVuY05vdGF0aW9uID0gYVtpXS5tYXRjaChfX3JlRm4pOwoJCgkJCQkJaWYgKCBhcnJheU5vdGF0aW9uICkKCQkJCQl7CgkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUFycmF5LCAnJyk7CgkJCQkJCWRhdGFbIGFbaV0gXSA9IFtdOwoJCgkJCQkJCS8vIEdldCB0aGUgcmVtYWluZGVyIG9mIHRoZSBuZXN0ZWQgb2JqZWN0IHRvIHNldCBzbyB3ZSBjYW4gcmVjdXJzZQoJCQkJCQliID0gYS5zbGljZSgpOwoJCQkJCQliLnNwbGljZSggMCwgaSsxICk7CgkJCQkJCWlubmVyU3JjID0gYi5qb2luKCcuJyk7CgkKCQkJCQkJLy8gVHJhdmVyc2UgZWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgc2V0dGluZyB0aGUgcHJvcGVydGllcyByZXF1ZXN0ZWQKCQkJCQkJaWYgKCAkLmlzQXJyYXkoIHZhbCApICkKCQkJCQkJewoJCQkJCQkJZm9yICggdmFyIGo9MCwgakxlbj12YWwubGVuZ3RoIDsgajxqTGVuIDsgaisrICkKCQkJCQkJCXsKCQkJCQkJCQlvID0ge307CgkJCQkJCQkJc2V0RGF0YSggbywgdmFsW2pdLCBpbm5lclNyYyApOwoJCQkJCQkJCWRhdGFbIGFbaV0gXS5wdXNoKCBvICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkvLyBXZSd2ZSBiZWVuIGFza2VkIHRvIHNhdmUgZGF0YSB0byBhbiBhcnJheSwgYnV0IGl0CgkJCQkJCQkvLyBpc24ndCBhcnJheSBkYXRhIHRvIGJlIHNhdmVkLiBCZXN0IHRoYXQgY2FuIGJlIGRvbmUKCQkJCQkJCS8vIGlzIHRvIGp1c3Qgc2F2ZSB0aGUgdmFsdWUuCgkJCQkJCQlkYXRhWyBhW2ldIF0gPSB2YWw7CgkJCQkJCX0KCQoJCQkJCQkvLyBUaGUgaW5uZXIgY2FsbCB0byBzZXREYXRhIGhhcyBhbHJlYWR5IHRyYXZlcnNlZCB0aHJvdWdoIHRoZSByZW1haW5kZXIKCQkJCQkJLy8gb2YgdGhlIHNvdXJjZSBhbmQgaGFzIHNldCB0aGUgZGF0YSwgdGh1cyB3ZSBjYW4gZXhpdCBoZXJlCgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoIGZ1bmNOb3RhdGlvbiApCgkJCQkJewoJCQkJCQkvLyBGdW5jdGlvbiBjYWxsCgkJCQkJCWFbaV0gPSBhW2ldLnJlcGxhY2UoX19yZUZuLCAnJyk7CgkJCQkJCWRhdGEgPSBkYXRhWyBhW2ldIF0oIHZhbCApOwoJCQkJCX0KCQoJCQkJCS8vIElmIHRoZSBuZXN0ZWQgb2JqZWN0IGRvZXNuJ3QgY3VycmVudGx5IGV4aXN0IC0gc2luY2Ugd2UgYXJlCgkJCQkJLy8gdHJ5aW5nIHRvIHNldCB0aGUgdmFsdWUgLSBjcmVhdGUgaXQKCQkJCQlpZiAoIGRhdGFbIGFbaV0gXSA9PT0gbnVsbCB8fCBkYXRhWyBhW2ldIF0gPT09IHVuZGVmaW5lZCApCgkJCQkJewoJCQkJCQlkYXRhWyBhW2ldIF0gPSB7fTsKCQkJCQl9CgkJCQkJZGF0YSA9IGRhdGFbIGFbaV0gXTsKCQkJCX0KCQoJCQkJLy8gTGFzdCBpdGVtIGluIHRoZSBpbnB1dCAtIGkuZSwgdGhlIGFjdHVhbCBzZXQKCQkJCWlmICggYUxhc3QubWF0Y2goX19yZUZuICkgKQoJCQkJewoJCQkJCS8vIEZ1bmN0aW9uIGNhbGwKCQkJCQlkYXRhID0gZGF0YVsgYUxhc3QucmVwbGFjZShfX3JlRm4sICcnKSBdKCB2YWwgKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkvLyBJZiBhcnJheSBub3RhdGlvbiBpcyB1c2VkLCB3ZSBqdXN0IHdhbnQgdG8gc3RyaXAgaXQgYW5kIHVzZSB0aGUgcHJvcGVydHkgbmFtZQoJCQkJCS8vIGFuZCBhc3NpZ24gdGhlIHZhbHVlLiBJZiBpdCBpc24ndCB1c2VkLCB0aGVuIHdlIGdldCB0aGUgcmVzdWx0IHdlIHdhbnQgYW55d2F5CgkJCQkJZGF0YVsgYUxhc3QucmVwbGFjZShfX3JlQXJyYXksICcnKSBdID0gdmFsOwoJCQkJfQoJCQl9OwoJCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdmFsKSB7IC8vIG1ldGEgaXMgYWxzbyBwYXNzZWQgaW4sIGJ1dCBub3QgdXNlZAoJCQkJcmV0dXJuIHNldERhdGEoIGRhdGEsIHZhbCwgbVNvdXJjZSApOwoJCQl9OwoJCX0KCQllbHNlCgkJewoJCQkvKiBBcnJheSBvciBmbGF0IG9iamVjdCBtYXBwaW5nICovCgkJCXJldHVybiBmdW5jdGlvbiAoZGF0YSwgdmFsKSB7IC8vIG1ldGEgaXMgYWxzbyBwYXNzZWQgaW4sIGJ1dCBub3QgdXNlZAoJCQkJZGF0YVttU291cmNlXSA9IHZhbDsKCQkJfTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBSZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgZnVsbCB0YWJsZSBkYXRhCgkgKiAgQHBhcmFtIHtvYmplY3R9IG9TZXR0aW5ncyBkYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogIEByZXR1cm5zIGFycmF5IHthcnJheX0gYURhdGEgTWFzdGVyIGRhdGEgYXJyYXkKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuR2V0RGF0YU1hc3RlciAoIHNldHRpbmdzICkKCXsKCQlyZXR1cm4gX3BsdWNrKCBzZXR0aW5ncy5hb0RhdGEsICdfYURhdGEnICk7Cgl9CgkKCQoJLyoqCgkgKiBOdWtlIHRoZSB0YWJsZQoJICogIEBwYXJhbSB7b2JqZWN0fSBvU2V0dGluZ3MgZGF0YVRhYmxlcyBzZXR0aW5ncyBvYmplY3QKCSAqICBAbWVtYmVyb2YgRGF0YVRhYmxlI29BcGkKCSAqLwoJZnVuY3Rpb24gX2ZuQ2xlYXJUYWJsZSggc2V0dGluZ3MgKQoJewoJCXNldHRpbmdzLmFvRGF0YS5sZW5ndGggPSAwOwoJCXNldHRpbmdzLmFpRGlzcGxheU1hc3Rlci5sZW5ndGggPSAwOwoJCXNldHRpbmdzLmFpRGlzcGxheS5sZW5ndGggPSAwOwoJCXNldHRpbmdzLmFJZHMgPSB7fTsKCX0KCQoJCgkgLyoqCgkgKiBUYWtlIGFuIGFycmF5IG9mIGludGVnZXJzIChpbmRleCBhcnJheSkgYW5kIHJlbW92ZSBhIHRhcmdldCBpbnRlZ2VyICh2YWx1ZSAtIG5vdAoJICogdGhlIGtleSEpCgkgKiAgQHBhcmFtIHthcnJheX0gYSBJbmRleCBhcnJheSB0byB0YXJnZXQKCSAqICBAcGFyYW0ge2ludH0gaVRhcmdldCB2YWx1ZSB0byBmaW5kCgkgKiAgQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKi8KCWZ1bmN0aW9uIF9mbkRlbGV0ZUluZGV4KCBhLCBpVGFyZ2V0LCBzcGxpY2UgKQoJewoJCXZhciBpVGFyZ2V0SW5kZXggPSAtMTsKCQoJCWZvciAoIHZhciBpPTAsIGlMZW49YS5sZW5ndGggOyBpPGlMZW4gOyBpKysgKQoJCXsKCQkJaWYgKCBhW2ldID09IGlUYXJnZXQgKQoJCQl7CgkJCQlpVGFyZ2V0SW5kZXggPSBpOwoJCQl9CgkJCWVsc2UgaWYgKCBhW2ldID4gaVRhcmdldCApCgkJCXsKCQkJCWFbaV0tLTsKCQkJfQoJCX0KCQoJCWlmICggaVRhcmdldEluZGV4ICE9IC0xICYmIHNwbGljZSA9PT0gdW5kZWZpbmVkICkKCQl7CgkJCWEuc3BsaWNlKCBpVGFyZ2V0SW5kZXgsIDEgKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBNYXJrIGNhY2hlZCBkYXRhIGFzIGludmFsaWQgc3VjaCB0aGF0IGEgcmUtcmVhZCBvZiB0aGUgZGF0YSB3aWxsIG9jY3VyIHdoZW4KCSAqIHRoZSBjYWNoZWQgZGF0YSBpcyBuZXh0IHJlcXVlc3RlZC4gQWxzbyB1cGRhdGUgZnJvbSB0aGUgZGF0YSBzb3VyY2Ugb2JqZWN0LgoJICoKCSAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5ncyBEYXRhVGFibGVzIHNldHRpbmdzIG9iamVjdAoJICogQHBhcmFtIHtpbnR9ICAgIHJvd0lkeCAgIFJvdyBpbmRleCB0byBpbnZhbGlkYXRlCgkgKiBAcGFyYW0ge3N0cmluZ30gW3NyY10gICAgU291cmNlIHRvIGludmFsaWRhdGUgZnJvbTogdW5kZWZpbmVkLCAnYXV0bycsICdkb20nCgkgKiAgICAgb3IgJ2RhdGEnCgkgKiBAcGFyYW0ge2ludH0gICAgW2NvbElkeF0gQ29sdW1uIGluZGV4IHRvIGludmFsaWRhdGUuIElmIHVuZGVmaW5lZCB0aGUgd2hvbGUKCSAqICAgICByb3cgd2lsbCBiZSBpbnZhbGlkYXRlZAoJICogQG1lbWJlcm9mIERhdGFUYWJsZSNvQXBpCgkgKgoJICogQHRvZG8gRm9yIHRoZSBtb2R1bGFyaXNhdGlvbiBvZiB2MS4xMSB0aGlzIHdpbGwgbmVlZCB0byBiZWNvbWUgYSBjYWxsYmFjaywgc28KCSAqICAgdGhlIHNvcnQgYW5kIGZpbHRlciBtZXRob2RzIGNhbiBzdWJzY3JpYmUgdG8gaXQuIFRoYXQgd2lsbCByZXF1aXJlZAoJICogICBpbml0aWFsaXNhdGlvbiBvcHRpb25zIGZvciBzb3J0aW5nLCB3aGljaCBpcyB3aHkgaXQgaXMgbm90IGFscmVhZHkgYmFrZWQgaW4KCSAqLwoJZnVuY3Rpb24gX2ZuSW52YWxpZGF0ZSggc2V0dGluZ3MsIHJvd0lkeCwgc3JjLCBjb2xJZHggKQoJewoJCXZhciByb3cgPSBzZXR0aW5ncy5hb0RhdGFbIHJvd0lkeCBdOwoJCXZhciBpLCBpZW47CgkJdmFyIGNlbGxXcml0ZSA9IGZ1bmN0aW9uICggY2VsbCwgY29sICkgewoJCQkvLyBUaGlzIGlzIHZlcnkgZnJ1c3RyYXRpbmcsIGJ1dCBpbiBJRSBpZiB5b3UganVzdCB3cml0ZSBkaXJlY3RseQoJCQkvLyB0byBpbm5lckhUTUwsIGFuZCBlbGVtZW50cyB0aGF0IGFyZSBvdmVyd3JpdHRlbiBhcmUgR0MnZWQsCgkJCS8vIGV2ZW4gaWYgdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlbSBlbHNld2hlcmUKCQkJd2hpbGUgKCBjZWxsLmNoaWxkTm9kZXMubGVuZ3RoICkgewoJCQkJY2VsbC5yZW1vdmVDaGlsZCggY2VsbC5maXJzdENoaWxkICk7CgkJCX0KCQoJCQljZWxsLmlubmVySFRNTCA9IF9mbkdldENlbGxEYXRhKCBzZXR0aW5ncywgcm93SWR4LCBjb2wsICdkaXNwbGF5JyApOwoJCX07CgkKCQkvLyBBcmUgd2UgcmVhZGluZyBsYXN0IGRhdGEgZnJvbSBET00gb3IgdGhlIGRhdGEgb2JqZWN0PwoJCWlmICggc3JjID09PSAnZG9tJyB8fCAoKCEgc3JjIHx8IHNyYyA9PT0gJ2F1dG8nKSAmJiByb3cuc3JjID09PSAnZG9tJykgKSB7CgkJCS8vIFJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgRE9NCgkJCXJvdy5fYURhdGEgPSBfZm5HZXRSb3dFbGVtZW50cygKCQkJCQlzZXR0aW5ncywgcm93LCBjb2xJZHgsIGNvbElkeCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcm93Ll9hRGF0YQoJCQkJKQoJCQkJLmRhdGE7CgkJfQoJCWVsc2UgewoJCQkvLyBSZWFkaW5nIGZyb20gZGF0YSBvYmplY3QsIHVwZGF0ZSB0aGUgRE9NCgkJCXZhciBjZWxscyA9IHJvdy5hbkNlbGxzOwoJCgkJCWlmICggY2VsbHMgKSB7CgkJCQlpZiAoIGNvbElkeCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCWNlbGxXcml0ZSggY2VsbHNbY29sSWR4XSwgY29sSWR4ICk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlmb3IgKCBpPTAsIGllbj1jZWxscy5sZW5ndGggOyBpPGllbiA7IGkrKyApIHsKCQkJCQkJY2VsbFdyaXRlKCBjZWxsc1tpXSwgaSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQoJCS8vIEZvciBib3RoIHJvdyBhbmQgY2VsbCBpbnZhbGlkYXRpb24sIHRoZSBjYWNoZWQgZGF0YSBmb3Igc29ydGluZyBhbmQKCQkvLyBmaWx0ZXJpbmcgaXMgbnVsbGVkIG91dAoJCXJvdy5fYVNvcnREYXRhID0gbnVsbDsKCQlyb3cuX2FGaWx0ZXJEYXRhID0gbnVsbDsKCQoJCS8vIEludmFsaWRhdGUgdGhlIHR5cGUgZm9yIGEgc3BlY2lmaWMgY29sdW1uIChpZiBnaXZlbikgb3IgYWxsIGNvbHVtbnMgc2luY2UKCQkvLyB0aGUgZGF0YSBtaWdodCBoYXZlIGNoYW5nZWQKCQl2YXIgY29scyA9IHNldHRpbmdzLmFvQ29sdW1uczsKCQlpZiAoIGNvbElkeCAhPT0gdW5kZWZpbmVkICkgewoJCQljb2xzWyBjb2xJZHggXS5zVHlwZSA9IG51bGw7CgkJfQoJCWVsc2UgewoJCQlmb3IgKCBpPTAsIGllbj1jb2xzLmxlbmd0aCA7IGk8aWVuIDsgaSsrICkgewoJCQkJY29sc1tpXS5zVHlwZSA9IG51bGw7CgkJCX0KCQoJCQkvLyBVcGRhdGUgRGF0YVRhYmxlcyBzcGVjaWFsIGBEVF8qYCBhdHRyaWJ1dGVzIGZvciB0aGUgcm93CgkJCV9mblJvd0F0dHJpYnV0ZXMoIHNldHRpbmdzLCByb3cgKTsKCQl9Cgl9CgkKCQoJLyoqCgkgKiBCdWlsZCBhIGRhdGEgc291cmNlIG9iamVjdCBmcm9tIGFuIEhUTUwgcm93LCByZWFkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUKCSAqIGNlbGxzIHRoYXQgYXJlIGluIHRoZSByb3cuCgkgKgoJICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzIERhdGFUYWJsZXMgc2V0dGluZ3Mgb2JqZWN0CgkgKiBAcGFyYW0ge25vZGV8b2JqZWN0fSBUUiBlbGVtZW50IGZyb20gd2hpY2ggdG8gcmVhZCBkYXQ="
}