From 8a0879f387bf9ce8d33393d7aeb1d945fb0e102e Mon Sep 17 00:00:00 2001 From: Kevin Martin Date: Wed, 27 Aug 2014 13:11:12 -0400 Subject: [PATCH] Add Ajax, querySelector util --- dist/z.js | 176 ++++++++++++++++++++++++++++++++++++++++++++- dist/z.min.js | 2 +- dist/z.sm.js | 178 +++++++++++++++++++++++++++++++++++++++++++++- dist/z.sm.min.js | 4 +- lib/_base.js | 4 +- lib/ajax.js | 70 ++++++++++++++++++ lib/ajax_types.js | 72 +++++++++++++++++++ lib/utils.js | 25 +++++++ package.json | 2 +- 9 files changed, 523 insertions(+), 10 deletions(-) create mode 100644 lib/ajax.js create mode 100644 lib/ajax_types.js diff --git a/dist/z.js b/dist/z.js index 2f444a3..6577f44 100644 --- a/dist/z.js +++ b/dist/z.js @@ -1,12 +1,12 @@ /*! - * z.js JavaScript Library v0.0.2 + * z.js JavaScript Library v0.0.3 * https://github.com/NEURS/z.js * * Copyright 2014 NEURS LLC, Kevin J. Martin, and other contributors * Released under the MIT license * https://github.com/NEURS/z.js/blob/master/LICENSE * - * Date: 2014-08-15T15:10Z + * Date: 2014-08-27T17:10Z */ ;(function (window, document) { @@ -36,6 +36,8 @@ function z(elem, scope) { return _find(scope, elem); } +function noop(){} + try { iframe = document.createElement("iframe"); @@ -65,6 +67,151 @@ z.fn.find = function (strElem) { return _find(this, strElem); }; + +var ajaxDefaults, ajaxTypes, + ajaxMimes = {} + +ajaxDefaults = { + method: "GET", + requestType: "text", + responseType: "text", + url: window.location + "", + query: null, + data: null, + setup: noop, + success: noop, + error: noop +}; + +ajaxTypes = { + text: function (data) { + return (data || "") + ""; + } +}; + +z.ajax = function (options) { + var data, + req = new XMLHttpRequest(); + + options = z.extend({ + context: req + }, ajaxDefaults, options); + + if (!ajaxTypes[options.requestType]) { + throw new Error("Invalid option `requestType`"); + } else if (!ajaxTypes[options.responseType]) { + throw new Error("Invalid option `responseType`"); + } + + if (options.query && ~["HEAD", "GET"].indexOf(options.method.toUpperCase())) { + options.url += ~options.url.indexOf("?") ? "&" : "?"; + options.url += z.queryString(options.query); + options.url = options.url.replace(/(\?|&)&/g, "$1"); + } + + req.open(options.method, options.url, true); + + req.onload = function () { + var resp; + + if (req.status >= 200 && req.status < 400) { + resp = ajaxTypes[options.responseType].call(req, req.responseText, true); + options.success.call(options.context, resp); + } else { + options.error.call(options.context, req.status, req.statusText); + } + }; + + req.onerror = function () { + options.error.call(options.context, req.status, req.statusText); + }; + + if (!~["HEAD", "GET"].indexOf(options.method.toUpperCase())) { + req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + } + + if (options.data) { + options.data = ajaxTypes[options.requestType].call(req, options.data, false); + } + + options.setup.call(req, req); + + req.send(options.data); +}; + +ajaxDefaults.requestType = "detect"; +ajaxDefaults.responseType = "detect"; + +z.registerAjaxType = function (type, mime, fn) { + if (!fn && typeof mime === "function") { + fn = mime; + mime = false; + } + + ajaxTypes[type] = fn; + + if (mime) { + ajaxMimes[mime] = type; + } +}; + +z.registerAjaxType("detect", function (data, isResponse) { + var header, + type = "text"; + + if (isResponse) { + header = this.getResponseHeader("Content-Type") || "", + header = header.split(";")[0].trim(); + type = ajaxMimes[header] || "text"; + } else { + if (data && typeof data === "object" && data.toString === ({}).toString) { + type = "json"; + } + } + + return ajaxTypes[type].call(this, data, isResponse); +}); + +z.registerAjaxType("json", "application/json", function (data, isResponse) { + return isResponse ? JSON.parse(data) : JSON.stringify(data); +}); + +z.registerAjaxType("html", "text/html", function (data, isResponse) { + var doc, arr; + + if (!isResponse) { + return data.outerHTML; + } + + arr = new zArray(); + doc = document.implementation.createHTMLDocument(); + + doc.documentElement.innerHTML = data; + + arr.push.apply(arr, arr.slice.call(doc.body.children, 0)); + + return arr; +}); + +z.registerAjaxType("xml", "text/xml", ajaxXMLParser); +z.registerAjaxType("xml", "application/xml", ajaxXMLParser); + +function ajaxXMLParser(data, isResponse) { + var parser; + + if (!isResponse) { + parser = new XMLSerializer(); + return parser.serializeToString(data); + } + + if (this.responseXML) { + return this.responseXML; + } + + parser = new DOMParser(); + return parser.parseFromString(data, "application/xml"); +} + if ("dataset" in document.body) { z.fn.data = function (key, value) { var i, l; @@ -538,4 +685,29 @@ z.fn.each = _each(function each(fn) { return this; }); +z.queryString = function (obj, prefix) { + var i, key, val, + strings = []; + + for (i in obj) { + if (obj.hasOwnProperty(i)) { + if (prefix) { + key = prefix + "[" + i + "]"; + } else { + key = i; + } + + val = obj[i]; + + if (val && typeof val === "object") { + strings.push(queryString(val, key)); + } else { + strings.push(encodeURIComponent(key) + "=" + encodeURIComponent(val)); + } + } + } + + return strings.join("&"); +}; + })(window, document); diff --git a/dist/z.min.js b/dist/z.min.js index c62747c..bf03c7d 100644 --- a/dist/z.min.js +++ b/dist/z.min.js @@ -1 +1 @@ -!function(t,e){function n(t,e){if(t instanceof l)return t;if(t instanceof EventTarget)return new l(t);if(void 0===t||null===t)return new l;if("string"!=typeof t)throw new Error("First parameter is invalid");if(e){if(!u(e))throw new Error("Second parameter is invalid");e=n(e)}else e=p;return s(e,t)}function r(t,e){return e.call(t,t)}function i(t,e){return t===e}function s(t,e){var n=new l;return t.forEach(function(t){n.push.apply(n,o(t,e))}),n}function o(t,e){return~e.indexOf(":")&&void 0!==m?(m===!1&&f(),e.match(m)?a(t,e):t.querySelectorAll(e)):t.querySelectorAll(e)}function a(t,e){for(var n,r,i=new l(t),s="",o=e.split(/\s+/);n=o.shift();)r=n.match(m),r?(s+=n.replace(m,"")||"*",n=new l,i.forEach(function(t){var e=new l;r.forEach(function(n){e.push.apply(e,y[n].call(t,s))}),n.push.apply(n,e)}),i=n,s=""):s+=n+" ";return s&&(n=new l,i.forEach(function(t){n.push.apply(n,t.querySelectorAll(s))}),i=n),i}function f(){var t=Object.keys(y).join("|").replace(/:/g,"");m=new RegExp(":("+t+")","g")}function u(t){return t instanceof l?!0:t instanceof EventTarget?!0:"string"==typeof t?!0:void 0}function c(t){return function(){for(var e=0,n=this.length;n>e;e++)t.apply(this[e],arguments);return this}}function h(t){return function(){for(var e,n=0,r=this.length,i=new l;r>n;n++)e=t.apply(this[n],arguments),e&&(Array.isArray(e)&&e.length?i.push.apply(i,e):i.push(e));return i}}var l,d,p,v;try{v=e.createElement("iframe"),v.style.width=0,v.style.height=0,v.style.borderStyle="none",e.body.appendChild(v),l=v.contentWindow.Array,e.body.removeChild(v)}catch(g){l=Array}t.z=n,n.fn=l.prototype,d=n(t),p=n(e),n.fn.find=function(t){if("string"!=typeof t)throw new Error("First paramater of z#find() should be a string");return s(this,t)},n.fn.data="dataset"in e.body?function(t,e){var n,r;if(this.length){if(void 0===t)return this[0].dataset;if(void 0===e)return this[0].dataset[t];for(n=0,r=this.length;r>n;n++)this[n].dataset[t]=e;return this}}:function(t,e){var n,r,i="data-"+(t||"");if(this.length){if(void 0===t)return n={},[].forEach.call(this[0].attributes,function(t){return n[t.name]=t.value}),n;if(void 0===e)return this[0].attributes[i];for(n=0,r=this.length;r>n;n++)this[n].dataset[i]=e;return this}},n.fn.on=n.fn.bind=c(function(t,e){this.addEventListener(t,e,!1)}),n.fn.off=n.fn.unbind=c(function(t,e){this.removeEventListener(t,e,!1)}),n.fn.trigger=function(t,n){var r,i,s=0,o=this.length;try{i=n?{detail:n}:void 0,r=new CustomEvent(t,i)}catch(a){r=e.createEvent("CustomEvent"),r.initCustomEvent(t,!0,!0,n)}for(;o>s;s++)this[s].dispatchEvent(r);return this},n.fn.is=function(){var t,n=e.body;return t=n.matches||n.matchesSelector||n.msMatchesSelector,t=t||n.mozMatchesSelector||n.webkitMatchesSelector||n.oMatchesSelector,function(e){var n,s,o=0,a=this.length;switch(typeof e){case"string":n=t;break;case"function":n=r;break;case"object":if(!(e instanceof EventTarget))throw new Error("First parameter of z#is is invalid");n=i;default:throw new Error("First parameter of z#is is invalid")}for(;a>o;o++)if(s=n(this[o],e))return s;return!1}}(),n.fn.hide=c(function(){return this.style.display="none",this}),n.fn.show=c(function(){return this.style.display="",this}),n.fn.clone=function(t){var e=0;for((void 0===t||null===t)&&(t=!1);ee;e++)this[e].innerHTML=t;return this},n.fn.text=function(t){var e,n;if(void 0===t)return this.textContent;for(e=0,n=this.length;n>e;e++)this[e].textContent=t;return this},n.fn.getAttr=function(t){if(!t)throw new Error("First parameter of z#getAttr is required");return this[0]&&this[0].getAttribute(t)},n.fn.setAttr=c(function(t,e){if(!t)throw new Error("First parameter of z#setAttr is required");if(void 0===e)throw new Error("Second parameter of z#setAttr is required");return this.setAttribute(t,e),this}),n.fn.attr=function(t,e){return void 0===e?this.getAttr(t):(this.setAttr(t,e),this)},n.fn.replaceWith=n.fn.replace=c(function(t){if(void 0===t)throw new Error("First parameter of z#replace is required");this.outerHTML=t}),"classList"in e.documentElement?(n.fn.addClass=c(function(t){this.classList.add(t)}),n.fn.removeClass=c(function(t){this.classList.remove(t)}),n.fn.toggleClass=c(function(t,e){return void 0===e?void this.classList.toggle(t):void this.classList[e?"add":"remove"](t)})):(n.fn.addClass=c(function(t){this.className+=" "+t}),n.fn.removeClass=c(function(t){this.className+=this.className.replace(new RegExp("(^|\\b)"+t+"(\\b|$)","g")," ")}),n.fn.toggleClass=function(t,e){return this[e?"addClass":"removeClass"](t),this});var m,y={};n.registerSelector=function(t,e){if(!t||"string"!=typeof t)throw new Error("First parameter of z#registerSelector must be a string selector");if(!e||"function"!=typeof e)throw new Error("Second parameter of z#registerSelector must be a function");":"!==t[0]&&(t=":"+t),m=!1,y[t]=e},n.registerSelector(":first",function(t){return n(this.querySelector(t))}),n.registerSelector(":input",function(){function t(t){return~e.indexOf(t.tagName)}var e="INPUT,TEXTAREA,SELECT,BUTTON".split(",");return function(e){var n=new l;return n.push.apply(n,[].filter.call(this.querySelectorAll(e),t)),n}}()),n.fn.parent=h(function(){return this.parentNode}),n.fn.next=h(function(){return this.nextElementSibling}),n.fn.prev=n.fn.previous=h(function(){return this.previousElementSibling}),n.fn.siblings=h(function(){return[].filter.call(this.parentNode.children,function(t){return t!==this},this)}),n.deepExtend=function w(t){var e,n,r=2;for("object"==typeof t?(n=t||{},t=1/0):(t=t===!0?1/0:0|t,n=arguments[1]||{});re;e++)t.apply(this[e],arguments);return this}}function p(t){return function(){for(var e,r=0,n=this.length,i=new d;n>r;r++)e=t.apply(this[r],arguments),e&&(Array.isArray(e)&&e.length?i.push.apply(i,e):i.push(e));return i}}var d,y,g,v;try{v=e.createElement("iframe"),v.style.width=0,v.style.height=0,v.style.borderStyle="none",e.body.appendChild(v),d=v.contentWindow.Array,e.body.removeChild(v)}catch(m){d=Array}t.z=r,r.fn=d.prototype,y=r(t),g=r(e),r.fn.find=function(t){if("string"!=typeof t)throw new Error("First paramater of z#find() should be a string");return a(this,t)};var w,E,x={};w={method:"GET",requestType:"text",responseType:"text",url:t.location+"",query:null,data:null,setup:n,success:n,error:n},E={text:function(t){return(t||"")+""}},r.ajax=function(t){var e=new XMLHttpRequest;if(t=r.extend({context:e},w,t),!E[t.requestType])throw new Error("Invalid option `requestType`");if(!E[t.responseType])throw new Error("Invalid option `responseType`");t.query&&~["HEAD","GET"].indexOf(t.method.toUpperCase())&&(t.url+=~t.url.indexOf("?")?"&":"?",t.url+=r.queryString(t.query),t.url=t.url.replace(/(\?|&)&/g,"$1")),e.open(t.method,t.url,!0),e.onload=function(){var r;e.status>=200&&e.status<400?(r=E[t.responseType].call(e,e.responseText,!0),t.success.call(t.context,r)):t.error.call(t.context,e.status,e.statusText)},e.onerror=function(){t.error.call(t.context,e.status,e.statusText)},~["HEAD","GET"].indexOf(t.method.toUpperCase())||e.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),t.data&&(t.data=E[t.requestType].call(e,t.data,!1)),t.setup.call(e,e),e.send(t.data)},w.requestType="detect",w.responseType="detect",r.registerAjaxType=function(t,e,r){r||"function"!=typeof e||(r=e,e=!1),E[t]=r,e&&(x[e]=t)},r.registerAjaxType("detect",function(t,e){var r,n="text";return e?(r=this.getResponseHeader("Content-Type")||"",r=r.split(";")[0].trim(),n=x[r]||"text"):t&&"object"==typeof t&&t.toString==={}.toString&&(n="json"),E[n].call(this,t,e)}),r.registerAjaxType("json","application/json",function(t,e){return e?JSON.parse(t):JSON.stringify(t)}),r.registerAjaxType("html","text/html",function(t,r){var n,i;return r?(i=new d,n=e.implementation.createHTMLDocument(),n.documentElement.innerHTML=t,i.push.apply(i,i.slice.call(n.body.children,0)),i):t.outerHTML}),r.registerAjaxType("xml","text/xml",i),r.registerAjaxType("xml","application/xml",i),r.fn.data="dataset"in e.body?function(t,e){var r,n;if(this.length){if(void 0===t)return this[0].dataset;if(void 0===e)return this[0].dataset[t];for(r=0,n=this.length;n>r;r++)this[r].dataset[t]=e;return this}}:function(t,e){var r,n,i="data-"+(t||"");if(this.length){if(void 0===t)return r={},[].forEach.call(this[0].attributes,function(t){return r[t.name]=t.value}),r;if(void 0===e)return this[0].attributes[i];for(r=0,n=this.length;n>r;r++)this[r].dataset[i]=e;return this}},r.fn.on=r.fn.bind=h(function(t,e){this.addEventListener(t,e,!1)}),r.fn.off=r.fn.unbind=h(function(t,e){this.removeEventListener(t,e,!1)}),r.fn.trigger=function(t,r){var n,i,o=0,s=this.length;try{i=r?{detail:r}:void 0,n=new CustomEvent(t,i)}catch(a){n=e.createEvent("CustomEvent"),n.initCustomEvent(t,!0,!0,r)}for(;s>o;o++)this[o].dispatchEvent(n);return this},r.fn.is=function(){var t,r=e.body;return t=r.matches||r.matchesSelector||r.msMatchesSelector,t=t||r.mozMatchesSelector||r.webkitMatchesSelector||r.oMatchesSelector,function(e){var r,n,i=0,a=this.length;switch(typeof e){case"string":r=t;break;case"function":r=o;break;case"object":if(!(e instanceof EventTarget))throw new Error("First parameter of z#is is invalid");r=s;default:throw new Error("First parameter of z#is is invalid")}for(;a>i;i++)if(n=r(this[i],e))return n;return!1}}(),r.fn.hide=h(function(){return this.style.display="none",this}),r.fn.show=h(function(){return this.style.display="",this}),r.fn.clone=function(t){var e=0;for((void 0===t||null===t)&&(t=!1);ee;e++)this[e].innerHTML=t;return this},r.fn.text=function(t){var e,r;if(void 0===t)return this.textContent;for(e=0,r=this.length;r>e;e++)this[e].textContent=t;return this},r.fn.getAttr=function(t){if(!t)throw new Error("First parameter of z#getAttr is required");return this[0]&&this[0].getAttribute(t)},r.fn.setAttr=h(function(t,e){if(!t)throw new Error("First parameter of z#setAttr is required");if(void 0===e)throw new Error("Second parameter of z#setAttr is required");return this.setAttribute(t,e),this}),r.fn.attr=function(t,e){return void 0===e?this.getAttr(t):(this.setAttr(t,e),this)},r.fn.replaceWith=r.fn.replace=h(function(t){if(void 0===t)throw new Error("First parameter of z#replace is required");this.outerHTML=t}),"classList"in e.documentElement?(r.fn.addClass=h(function(t){this.classList.add(t)}),r.fn.removeClass=h(function(t){this.classList.remove(t)}),r.fn.toggleClass=h(function(t,e){return void 0===e?void this.classList.toggle(t):void this.classList[e?"add":"remove"](t)})):(r.fn.addClass=h(function(t){this.className+=" "+t}),r.fn.removeClass=h(function(t){this.className+=this.className.replace(new RegExp("(^|\\b)"+t+"(\\b|$)","g")," ")}),r.fn.toggleClass=function(t,e){return this[e?"addClass":"removeClass"](t),this});var T,S={};r.registerSelector=function(t,e){if(!t||"string"!=typeof t)throw new Error("First parameter of z#registerSelector must be a string selector");if(!e||"function"!=typeof e)throw new Error("Second parameter of z#registerSelector must be a function");":"!==t[0]&&(t=":"+t),T=!1,S[t]=e},r.registerSelector(":first",function(t){return r(this.querySelector(t))}),r.registerSelector(":input",function(){function t(t){return~e.indexOf(t.tagName)}var e="INPUT,TEXTAREA,SELECT,BUTTON".split(",");return function(e){var r=new d;return r.push.apply(r,[].filter.call(this.querySelectorAll(e),t)),r}}()),r.fn.parent=p(function(){return this.parentNode}),r.fn.next=p(function(){return this.nextElementSibling}),r.fn.prev=r.fn.previous=p(function(){return this.previousElementSibling}),r.fn.siblings=p(function(){return[].filter.call(this.parentNode.children,function(t){return t!==this},this)}),r.deepExtend=function b(t){var e,r,n=2;for("object"==typeof t?(r=t||{},t=1/0):(t=t===!0?1/0:0|t,r=arguments[1]||{});n= 200 && req.status < 400) { + resp = ajaxTypes[options.responseType].call(req, req.responseText, true); + options.success.call(options.context, resp); + } else { + options.error.call(options.context, req.status, req.statusText); + } + }; + + req.onerror = function () { + options.error.call(options.context, req.status, req.statusText); + }; + + if (!~["HEAD", "GET"].indexOf(options.method.toUpperCase())) { + req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + } + + if (options.data) { + options.data = ajaxTypes[options.requestType].call(req, options.data, false); + } + + options.setup.call(req, req); + + req.send(options.data); +}; + +ajaxDefaults.requestType = "detect"; +ajaxDefaults.responseType = "detect"; + +z.registerAjaxType = function (type, mime, fn) { + if (!fn && typeof mime === "function") { + fn = mime; + mime = false; + } + + ajaxTypes[type] = fn; + + if (mime) { + ajaxMimes[mime] = type; + } +}; + +z.registerAjaxType("detect", function (data, isResponse) { + var header, + type = "text"; + + if (isResponse) { + header = this.getResponseHeader("Content-Type") || "", + header = header.split(";")[0].trim(); + type = ajaxMimes[header] || "text"; + } else { + if (data && typeof data === "object" && data.toString === ({}).toString) { + type = "json"; + } + } + + return ajaxTypes[type].call(this, data, isResponse); +}); + +z.registerAjaxType("json", "application/json", function (data, isResponse) { + return isResponse ? JSON.parse(data) : JSON.stringify(data); +}); + +z.registerAjaxType("html", "text/html", function (data, isResponse) { + var doc, arr; + + if (!isResponse) { + return data.outerHTML; + } + + arr = new zArray(); + doc = document.implementation.createHTMLDocument(); + + doc.documentElement.innerHTML = data; + + arr.push.apply(arr, arr.slice.call(doc.body.children, 0)); + + return arr; +}); + +z.registerAjaxType("xml", "text/xml", ajaxXMLParser); +z.registerAjaxType("xml", "application/xml", ajaxXMLParser); + +function ajaxXMLParser(data, isResponse) { + var parser; + + if (!isResponse) { + parser = new XMLSerializer(); + return parser.serializeToString(data); + } + + if (this.responseXML) { + return this.responseXML; + } + + parser = new DOMParser(); + return parser.parseFromString(data, "application/xml"); +} + if ("dataset" in document.body) { z.fn.data = function (key, value) { var i, l; @@ -538,6 +685,31 @@ z.fn.each = _each(function each(fn) { return this; }); +z.queryString = function (obj, prefix) { + var i, key, val, + strings = []; + + for (i in obj) { + if (obj.hasOwnProperty(i)) { + if (prefix) { + key = prefix + "[" + i + "]"; + } else { + key = i; + } + + val = obj[i]; + + if (val && typeof val === "object") { + strings.push(queryString(val, key)); + } else { + strings.push(encodeURIComponent(key) + "=" + encodeURIComponent(val)); + } + } + } + + return strings.join("&"); +}; + })(window, document); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9oZWFkZXIuanMiLCJfYmFzZS5qcyIsImRhdGEuanMiLCJldmVudHMuanMiLCJmaWx0ZXJpbmcuanMiLCJtYW5pcHVsYXRpb24uanMiLCJzZWxlY3RvcnMuanMiLCJzZWxlY3RvcnNfY3VzdG9tLmpzIiwidHJhdmVyc2luZy5qcyIsInV0aWxzLmpzIiwiX2Zvb3Rlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN2SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVGQTtBQUNBIiwiZmlsZSI6Inouc20uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIHouanMgSmF2YVNjcmlwdCBMaWJyYXJ5IHZAVkVSU0lPTlxuICogaHR0cHM6Ly9naXRodWIuY29tL05FVVJTL3ouanNcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNCBORVVSUyBMTEMsIEtldmluIEouIE1hcnRpbiwgYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTkVVUlMvei5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKlxuICogRGF0ZTogQERBVEVcbiAqL1xuOyhmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xuIiwidmFyIHpBcnJheSwgX3dpbmRvdywgX2RvY3VtZW50LCBpZnJhbWU7XG5cbmZ1bmN0aW9uIHooZWxlbSwgc2NvcGUpIHtcblx0aWYgKGVsZW0gaW5zdGFuY2VvZiB6QXJyYXkpIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpIHtcblx0XHRyZXR1cm4gbmV3IHpBcnJheShlbGVtKTtcblx0fSBlbHNlIGlmIChlbGVtID09PSB1bmRlZmluZWQgfHwgZWxlbSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBuZXcgekFycmF5KCk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGVsZW0gIT09IFwic3RyaW5nXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWV0ZXIgaXMgaW52YWxpZFwiKTtcblx0fVxuXG5cdGlmIChzY29wZSkge1xuXHRcdGlmICghX2NoZWNrVmFsaWRFbGVtZW50KHNjb3BlKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2Vjb25kIHBhcmFtZXRlciBpcyBpbnZhbGlkXCIpO1xuXHRcdH1cblxuXHRcdHNjb3BlID0geihzY29wZSk7XG5cdH0gZWxzZSB7XG5cdFx0c2NvcGUgPSBfZG9jdW1lbnQ7XG5cdH1cblxuXHRyZXR1cm4gX2ZpbmQoc2NvcGUsIGVsZW0pO1xufVxuXG50cnkge1xuXHRpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuXG5cdGlmcmFtZS5zdHlsZS53aWR0aFx0XHRcdD0gMDtcblx0aWZyYW1lLnN0eWxlLmhlaWdodFx0XHRcdD0gMDtcblx0aWZyYW1lLnN0eWxlLmJvcmRlclN0eWxlXHQ9IFwibm9uZVwiO1xuXG5cdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuXHR6QXJyYXkgPSBpZnJhbWUuY29udGVudFdpbmRvdy5BcnJheTtcblxuXHRkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlmcmFtZSk7XG59IGNhdGNoIChlKSB7XG5cdHpBcnJheSA9IEFycmF5O1xufVxuXG4vL3dpbmRvdy4kXHQ9IHo7XG53aW5kb3cuelx0PSB6O1xuei5mblx0XHQ9IHpBcnJheS5wcm90b3R5cGU7XG5fd2luZG93XHRcdD0geih3aW5kb3cpO1xuX2RvY3VtZW50XHQ9IHooZG9jdW1lbnQpO1xuXG56LmZuLmZpbmQgPSBmdW5jdGlvbiAoc3RyRWxlbSkge1xuXHRpZiAodHlwZW9mIHN0ckVsZW0gIT09IFwic3RyaW5nXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWF0ZXIgb2YgeiNmaW5kKCkgc2hvdWxkIGJlIGEgc3RyaW5nXCIpO1xuXHR9XG5cblx0cmV0dXJuIF9maW5kKHRoaXMsIHN0ckVsZW0pO1xufTsiLCJpZiAoXCJkYXRhc2V0XCIgaW4gZG9jdW1lbnQuYm9keSkge1xuXHR6LmZuLmRhdGEgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdHZhciBpLCBsO1xuXG5cdFx0aWYgKCF0aGlzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXNbMF0uZGF0YXNldDtcblx0XHR9IGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzWzBdLmRhdGFzZXRba2V5XTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHRoaXNbaV0uZGF0YXNldFtrZXldID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG59IGVsc2Uge1xuXHR6LmZuLmRhdGEgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdHZhciBpLCBsLFxuXHRcdFx0ZGF0YUtleSA9IFwiZGF0YS1cIiArIChrZXkgfHwgXCJcIik7XG5cblx0XHRpZiAoIXRoaXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpID0ge307XG5cblx0XHRcdFtdLmZvckVhY2guY2FsbCh0aGlzWzBdLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uIChhdHRyKSB7XG5cdFx0XHRcdHJldHVybiBpW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBpO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXNbMF0uYXR0cmlidXRlc1tkYXRhS2V5XTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHRoaXNbaV0uZGF0YXNldFtkYXRhS2V5XSA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xufVxuIiwiei5mbi5vbiA9IHouZm4uYmluZCA9IF9lYWNoKGZ1bmN0aW9uIF9vbihldmVudFR5cGUsIGZuKSB7XG5cdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGZuLCBmYWxzZSk7XG59KTtcblxuei5mbi5vZmYgPSB6LmZuLnVuYmluZCA9IF9lYWNoKGZ1bmN0aW9uIF9vZmYoZXZlbnRUeXBlLCBmbikge1xuXHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBmbiwgZmFsc2UpO1xufSk7XG5cbnouZm4udHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudFR5cGUsIGRhdGEpIHtcblx0dmFyIGV2ZW50LCBfZGF0YSxcblx0XHRpID0gMCxcblx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0dHJ5IHtcblx0XHRfZGF0YVx0PSBkYXRhID8ge2RldGFpbDogZGF0YX0gOiB1bmRlZmluZWQ7XG5cdFx0ZXZlbnRcdD0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50VHlwZSwgX2RhdGEpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuXHRcdGV2ZW50LmluaXRDdXN0b21FdmVudChldmVudFR5cGUsIHRydWUsIHRydWUsIGRhdGEpO1xuXHR9XG5cblx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHR0aGlzW2ldLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuIiwiZnVuY3Rpb24gX2lzV2l0aEZ1bmN0aW9uKGVsZW0sIGZuKSB7XG5cdHJldHVybiBmbi5jYWxsKGVsZW0sIGVsZW0pO1xufVxuXG5mdW5jdGlvbiBfaXNXaXRoRWxlbWVudChlbGVtMSwgZWxlbTIpIHtcblx0cmV0dXJuIGVsZW0xID09PSBlbGVtMjtcbn1cblxuei5mbi5pcyA9IChmdW5jdGlvbiBfaXMoKSB7XG5cdHZhciBtYXRjaGVzLFxuXHRcdGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXG5cdG1hdGNoZXNcdD0gYm9keS5tYXRjaGVzIHx8IGJvZHkubWF0Y2hlc1NlbGVjdG9yIHx8IGJvZHkubXNNYXRjaGVzU2VsZWN0b3I7XG5cdG1hdGNoZXMgPSBtYXRjaGVzIHx8IGJvZHkubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGJvZHkud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGJvZHkub01hdGNoZXNTZWxlY3RvcjtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG5cdFx0dmFyIF9pc1dpdGgsIHJldCxcblx0XHRcdGlcdD0gMCxcblx0XHRcdGxcdD0gdGhpcy5sZW5ndGg7XG5cblx0XHRzd2l0Y2ggKHR5cGVvZiBzZWxlY3Rvcikge1xuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdFx0XHRfaXNXaXRoID0gbWF0Y2hlcztcblx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZnVuY3Rpb25cIjpcblx0XHRcdFx0X2lzV2l0aCA9IF9pc1dpdGhGdW5jdGlvbjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwib2JqZWN0XCI6XG5cdFx0XHRcdGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7XG5cdFx0XHRcdFx0X2lzV2l0aCA9IF9pc1dpdGhFbGVtZW50O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZpcnN0IHBhcmFtZXRlciBvZiB6I2lzIGlzIGludmFsaWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZpcnN0IHBhcmFtZXRlciBvZiB6I2lzIGlzIGludmFsaWRcIik7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRmb3IgKDsgaSA8IGw7IGkrKykge1xuXHRcdFx0cmV0ID0gX2lzV2l0aCh0aGlzW2ldLCBzZWxlY3Rvcik7XG5cblx0XHRcdGlmIChyZXQpIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59KSgpO1xuIiwiei5mbi5oaWRlID0gX2VhY2goZnVuY3Rpb24gaGlkZSgpIHtcblx0dGhpcy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdHJldHVybiB0aGlzO1xufSk7XG5cbnouZm4uc2hvdyA9IF9lYWNoKGZ1bmN0aW9uIHNob3coKSB7XG5cdHRoaXMuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdHJldHVybiB0aGlzO1xufSk7XG5cbnouZm4uY2xvbmUgPSBmdW5jdGlvbiAoZGVlcCkge1xuXHR2YXIgaSA9IDA7XG5cblx0aWYgKGRlZXAgPT09IHVuZGVmaW5lZCB8fCBkZWVwID09PSBudWxsKSB7XG5cdFx0ZGVlcCA9IGZhbHNlO1xuXHR9XG5cblx0Zm9yICg7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dGhpc1tpXSA9IHRoaXNbaV0uY2xvbmVOb2RlKGRlZXApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG56LmZuLmh0bWwgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0dmFyIGksIGw7XG5cblx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdGhpcy5pbm5lckhUTUw7XG5cdH1cblxuXHRmb3IgKGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHR0aGlzW2ldLmlubmVySFRNTCA9IHZhbHVlO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG56LmZuLnRleHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0dmFyIGksIGw7XG5cblx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0Q29udGVudDtcblx0fVxuXG5cdGZvciAoaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdHRoaXNbaV0udGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuei5mbi5nZXRBdHRyID0gZnVuY3Rpb24gKGtleSkge1xuXHRpZiAoIWtleSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkZpcnN0IHBhcmFtZXRlciBvZiB6I2dldEF0dHIgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHRyZXR1cm4gdGhpc1swXSAmJiB0aGlzWzBdLmdldEF0dHJpYnV0ZShrZXkpO1xufTtcblxuei5mbi5zZXRBdHRyID0gX2VhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0aWYgKCFrZXkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWV0ZXIgb2YgeiNzZXRBdHRyIGlzIHJlcXVpcmVkXCIpO1xuXHR9IGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTZWNvbmQgcGFyYW1ldGVyIG9mIHojc2V0QXR0ciBpcyByZXF1aXJlZFwiKTtcblx0fVxuXG5cdHRoaXMuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuXHRyZXR1cm4gdGhpcztcbn0pO1xuXG56LmZuLmF0dHIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHIoa2V5KTtcblx0fVxuXG5cdHRoaXMuc2V0QXR0cihrZXksIHZhbHVlKTtcblx0cmV0dXJuIHRoaXM7XG59O1xuXG56LmZuLnJlcGxhY2VXaXRoID0gei5mbi5yZXBsYWNlID0gX2VhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgcGFyYW1ldGVyIG9mIHojcmVwbGFjZSBpcyByZXF1aXJlZFwiKTtcblx0fVxuXG5cdHRoaXMub3V0ZXJIVE1MID0gdmFsdWU7XG59KTtcblxuaWYgKFwiY2xhc3NMaXN0XCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG5cdHouZm4uYWRkQ2xhc3MgPSBfZWFjaChmdW5jdGlvbiBhZGRDbGFzcyhjbGFzc05hbWUpIHtcblx0XHR0aGlzLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcblx0fSk7XG5cblx0ei5mbi5yZW1vdmVDbGFzcyA9IF9lYWNoKGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGNsYXNzTmFtZSkge1xuXHRcdHRoaXMuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuXHR9KTtcblxuXHR6LmZuLnRvZ2dsZUNsYXNzID0gX2VhY2goZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCBmb3JjZSkge1xuXHRcdGlmIChmb3JjZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmNsYXNzTGlzdFtmb3JjZSA/IFwiYWRkXCIgOiBcInJlbW92ZVwiXShjbGFzc05hbWUpO1xuXHR9KTtcbn0gZWxzZSB7XG5cdHouZm4uYWRkQ2xhc3MgPSBfZWFjaChmdW5jdGlvbiBhZGRDbGFzcyhjbGFzc05hbWUpIHtcblx0XHR0aGlzLmNsYXNzTmFtZSArPSBcIiBcIiArIGNsYXNzTmFtZTtcblx0fSk7XG5cblx0ei5mbi5yZW1vdmVDbGFzcyA9IF9lYWNoKGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGNsYXNzTmFtZSkge1xuXHRcdHRoaXMuY2xhc3NOYW1lICs9IHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cChcIihefFxcXFxiKVwiICsgY2xhc3NOYW1lICsgXCIoXFxcXGJ8JClcIiwgXCJnXCIpLCBcIiBcIik7XG5cdH0pO1xuXG5cdHouZm4udG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCBmb3JjZSkge1xuXHRcdHRoaXNbZm9yY2UgPyBcImFkZENsYXNzXCIgOiBcInJlbW92ZUNsYXNzXCJdKGNsYXNzTmFtZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG59XG4iLCJ2YXIgX3NlbGVjdG9yc0NhY2hlLFxuXHRfc2VsZWN0b3JzID0ge307XG5cbmZ1bmN0aW9uIF9maW5kKHNjb3BlLCBzdHJFbGVtKSB7XG5cdHZhciByZXQgPSBuZXcgekFycmF5KCk7XG5cblx0c2NvcGUuZm9yRWFjaChmdW5jdGlvbiBfZmluZEZvckVhY2goc2NvcGVkRWxlbSkge1xuXHRcdHJldC5wdXNoLmFwcGx5KHJldCwgX3NlbGVjdChzY29wZWRFbGVtLCBzdHJFbGVtKSk7XG5cdH0pO1xuXG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIF9zZWxlY3Qoc2NvcGVkRWxlbSwgc3RyRWxlbSkge1xuXHRpZiAoIX5zdHJFbGVtLmluZGV4T2YoXCI6XCIpIHx8IF9zZWxlY3RvcnNDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHNjb3BlZEVsZW0ucXVlcnlTZWxlY3RvckFsbChzdHJFbGVtKTtcblx0fVxuXG5cdGlmIChfc2VsZWN0b3JzQ2FjaGUgPT09IGZhbHNlKSB7XG5cdFx0X2dlbmVyYXRlU2VsZWN0b3JzQ2FjaGUoKTtcblx0fVxuXG5cdGlmICghc3RyRWxlbS5tYXRjaChfc2VsZWN0b3JzQ2FjaGUpKSB7XG5cdFx0cmV0dXJuIHNjb3BlZEVsZW0ucXVlcnlTZWxlY3RvckFsbChzdHJFbGVtKTtcblx0fVxuXG5cdHJldHVybiBfc2VsZWN0MihzY29wZWRFbGVtLCBzdHJFbGVtKTtcbn1cblxuZnVuY3Rpb24gX3NlbGVjdDIoc2NvcGVkRWxlbSwgc3RyRWxlbSkge1xuXHR2YXIgZW50cnksIHNlbGVjdG9ycyxcblx0XHRzY29wZVx0PSBuZXcgekFycmF5KHNjb3BlZEVsZW0pLFxuXHRcdGN1cnJlbnRcdD0gXCJcIixcblx0XHRlbnRyaWVzXHQ9IHN0ckVsZW0uc3BsaXQoL1xccysvKTtcblxuXHR3aGlsZSAoZW50cnkgPSBlbnRyaWVzLnNoaWZ0KCkpIHtcblx0XHRzZWxlY3RvcnMgPSBlbnRyeS5tYXRjaChfc2VsZWN0b3JzQ2FjaGUpO1xuXG5cdFx0aWYgKCFzZWxlY3RvcnMpIHtcblx0XHRcdGN1cnJlbnQgKz0gZW50cnkgKyBcIiBcIjtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGN1cnJlbnRcdCs9IGVudHJ5LnJlcGxhY2UoX3NlbGVjdG9yc0NhY2hlLCBcIlwiKSB8fCBcIipcIjtcblx0XHRlbnRyeVx0PSBuZXcgekFycmF5KCk7XG5cblx0XHRzY29wZS5mb3JFYWNoKGZ1bmN0aW9uIF9zZWxlY3RGb3JFYWNoKHNjb3BlZEVsZW0pIHtcblx0XHRcdHZhciByZXQgPSBuZXcgekFycmF5KCk7XG5cblx0XHRcdHNlbGVjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIHNlbGVjdG9yc0ZvckVhY2goc2VsZWN0b3IpIHtcblx0XHRcdFx0cmV0LnB1c2guYXBwbHkocmV0LCBfc2VsZWN0b3JzW3NlbGVjdG9yXS5jYWxsKHNjb3BlZEVsZW0sIGN1cnJlbnQpKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRlbnRyeS5wdXNoLmFwcGx5KGVudHJ5LCByZXQpO1xuXHRcdH0pO1xuXG5cdFx0c2NvcGVcdD0gZW50cnk7XG5cdFx0Y3VycmVudFx0PSBcIlwiO1xuXHR9XG5cblx0aWYgKGN1cnJlbnQpIHtcblx0XHRlbnRyeSA9IG5ldyB6QXJyYXkoKTtcblxuXHRcdHNjb3BlLmZvckVhY2goZnVuY3Rpb24gY3VycmVudEZvckVhY2goc2NvcGVkRWxlbSkge1xuXHRcdFx0ZW50cnkucHVzaC5hcHBseShlbnRyeSwgc2NvcGVkRWxlbS5xdWVyeVNlbGVjdG9yQWxsKGN1cnJlbnQpKTtcblx0XHR9KTtcblxuXHRcdHNjb3BlID0gZW50cnk7XG5cdH1cblxuXHRyZXR1cm4gc2NvcGU7XG59XG5cbmZ1bmN0aW9uIF9nZW5lcmF0ZVNlbGVjdG9yc0NhY2hlKCkge1xuXHR2YXIgc2VsZWN0b3JzXHQ9IE9iamVjdC5rZXlzKF9zZWxlY3RvcnMpLmpvaW4oXCJ8XCIpLnJlcGxhY2UoLzovZywgXCJcIik7XG5cdF9zZWxlY3RvcnNDYWNoZVx0PSBuZXcgUmVnRXhwKFwiOihcIiArIHNlbGVjdG9ycyArIFwiKVwiLCBcImdcIik7XG59XG4iLCJ6LnJlZ2lzdGVyU2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGZuKSB7XG5cdGlmICghc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgcGFyYW1ldGVyIG9mIHojcmVnaXN0ZXJTZWxlY3RvciBtdXN0IGJlIGEgc3RyaW5nIHNlbGVjdG9yXCIpO1xuXHR9IGVsc2UgaWYgKCFmbiB8fCB0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlNlY29uZCBwYXJhbWV0ZXIgb2YgeiNyZWdpc3RlclNlbGVjdG9yIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblx0fVxuXG5cdGlmIChzZWxlY3RvclswXSAhPT0gXCI6XCIpIHtcblx0XHRzZWxlY3RvciA9IFwiOlwiICsgc2VsZWN0b3I7XG5cdH1cblxuXHRfc2VsZWN0b3JzQ2FjaGVcdFx0XHQ9IGZhbHNlO1xuXHRfc2VsZWN0b3JzW3NlbGVjdG9yXVx0PSBmbjtcbn07XG5cbnoucmVnaXN0ZXJTZWxlY3RvcihcIjpmaXJzdFwiLCBmdW5jdGlvbiBzZWxlY3RvckZpcnN0KHF1ZXJ5KSB7XG5cdHJldHVybiB6KHRoaXMucXVlcnlTZWxlY3RvcihxdWVyeSkpO1xufSk7XG5cbnoucmVnaXN0ZXJTZWxlY3RvcihcIjppbnB1dFwiLCAoZnVuY3Rpb24gc2VsZWN0b3JGaXJzdCgpIHtcblx0dmFyIHRhZ3MgPSBcIklOUFVULFRFWFRBUkVBLFNFTEVDVCxCVVRUT05cIi5zcGxpdChcIixcIik7XG5cblx0ZnVuY3Rpb24gZmlsdGVyKGVsZW1lbnQpIHtcblx0XHRyZXR1cm4gfnRhZ3MuaW5kZXhPZihlbGVtZW50LnRhZ05hbWUpO1xuXHR9XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHNlbGVjdG9ySW5wdXQocXVlcnkpIHtcblx0XHR2YXIgZWxlbWVudHMgPSBuZXcgekFycmF5KCk7XG5cblx0XHRlbGVtZW50cy5wdXNoLmFwcGx5KGVsZW1lbnRzLCBbXS5maWx0ZXIuY2FsbCh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLCBmaWx0ZXIpKTtcblxuXHRcdHJldHVybiBlbGVtZW50cztcblx0fTtcbn0pKCkpO1xuIiwiei5mbi5wYXJlbnQgPSBfZWFjaE5ldyhmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB0aGlzLnBhcmVudE5vZGU7XG59KTtcblxuei5mbi5uZXh0ID0gX2VhY2hOZXcoZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdGhpcy5uZXh0RWxlbWVudFNpYmxpbmc7XG59KTtcblxuei5mbi5wcmV2ID0gei5mbi5wcmV2aW91cyA9IF9lYWNoTmV3KGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMucHJldmlvdXNFbGVtZW50U2libGluZztcbn0pO1xuXG56LmZuLnNpYmxpbmdzID0gX2VhY2hOZXcoZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gW10uZmlsdGVyLmNhbGwodGhpcy5wYXJlbnROb2RlLmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuXHRcdHJldHVybiBjaGlsZCAhPT0gdGhpcztcblx0fSwgdGhpcyk7XG59KTtcbiIsImZ1bmN0aW9uIF9jaGVja1ZhbGlkRWxlbWVudChlbGVtKSB7XG5cdGlmIChlbGVtIGluc3RhbmNlb2YgekFycmF5KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoZWxlbSBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAodHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBfZWFjaChmbikge1xuXHRyZXR1cm4gZnVuY3Rpb24gcnVuRWFjaCgpIHtcblx0XHR2YXIgaVx0PSAwLFxuXHRcdFx0bFx0PSB0aGlzLmxlbmd0aDtcblxuXHRcdGZvciAoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRmbi5hcHBseSh0aGlzW2ldLCBhcmd1bWVudHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBfZWFjaE5ldyhmbikge1xuXHRyZXR1cm4gZnVuY3Rpb24gcnVuRWFjaCgpIHtcblx0XHR2YXIgcmV0LFxuXHRcdFx0aVx0PSAwLFxuXHRcdFx0bFx0PSB0aGlzLmxlbmd0aCxcblx0XHRcdGFyclx0PSBuZXcgekFycmF5KCk7XG5cblx0XHRmb3IgKDsgaSA8IGw7IGkrKykge1xuXHRcdFx0cmV0ID0gZm4uYXBwbHkodGhpc1tpXSwgYXJndW1lbnRzKTtcblxuXHRcdFx0aWYgKHJldCkge1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShyZXQpICYmIHJldC5sZW5ndGgpIHtcblx0XHRcdFx0XHRhcnIucHVzaC5hcHBseShhcnIsIHJldCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXJyLnB1c2gocmV0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBhcnI7XG5cdH07XG59XG5cbnouZGVlcEV4dGVuZCA9IGZ1bmN0aW9uIF9leHRlbmQoZGVlcCkge1xuXHR2YXIgb2JqLCB0YXJnZXQsXG5cdFx0aSA9IDI7XG5cblx0aWYgKHR5cGVvZiBkZWVwID09PSBcIm9iamVjdFwiKSB7XG5cdFx0dGFyZ2V0XHQ9IGRlZXAgfHwge307XG5cdFx0ZGVlcFx0PSBJbmZpbml0eTtcblx0fSBlbHNlIHtcblx0XHRkZWVwXHQ9IGRlZXAgPT09IHRydWUgPyBJbmZpbml0eSA6IChkZWVwIHwgMCk7XG5cdFx0dGFyZ2V0XHQ9IGFyZ3VtZW50c1sxXSB8fCB7fTtcblx0fVxuXG5cdGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b2JqID0gYXJndW1lbnRzW2ldO1xuXG5cdFx0aWYgKCFvYmopIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGtleSBpbiBvYmopIHtcblx0XHRcdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRpZiAoZGVlcCAmJiB0eXBlb2Ygb2JqW2tleV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRfZXh0ZW5kKGRlZXAgLSAxLCB0YXJnZXRba2V5XSwgb2JqW2tleV0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRhcmdldFtrZXldID0gb2JqW2tleV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxuei5leHRlbmQgPSBmdW5jdGlvbiAoKSB7XG5cdFtdLnVuc2hpZnQuY2FsbChhcmd1bWVudHMsIDApO1xuXHRyZXR1cm4gei5kZWVwRXh0ZW5kLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59O1xuXG56LmZuLmVhY2ggPSBfZWFjaChmdW5jdGlvbiBlYWNoKGZuKSB7XG5cdGZuLmNhbGwodGhpcywgdGhpcyk7XG5cdHJldHVybiB0aGlzO1xufSk7XG4iLCJ9KSh3aW5kb3csIGRvY3VtZW50KTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9oZWFkZXIuanMiLCJfYmFzZS5qcyIsImFqYXguanMiLCJhamF4X3R5cGVzLmpzIiwiZGF0YS5qcyIsImV2ZW50cy5qcyIsImZpbHRlcmluZy5qcyIsIm1hbmlwdWxhdGlvbi5qcyIsInNlbGVjdG9ycy5qcyIsInNlbGVjdG9yc19jdXN0b20uanMiLCJ0cmF2ZXJzaW5nLmpzIiwidXRpbHMuanMiLCJfZm9vdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JIQTtBQUNBIiwiZmlsZSI6Inouc20uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIHouanMgSmF2YVNjcmlwdCBMaWJyYXJ5IHZAVkVSU0lPTlxuICogaHR0cHM6Ly9naXRodWIuY29tL05FVVJTL3ouanNcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNCBORVVSUyBMTEMsIEtldmluIEouIE1hcnRpbiwgYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTkVVUlMvei5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKlxuICogRGF0ZTogQERBVEVcbiAqL1xuOyhmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xuIiwidmFyIHpBcnJheSwgX3dpbmRvdywgX2RvY3VtZW50LCBpZnJhbWU7XG5cbmZ1bmN0aW9uIHooZWxlbSwgc2NvcGUpIHtcblx0aWYgKGVsZW0gaW5zdGFuY2VvZiB6QXJyYXkpIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpIHtcblx0XHRyZXR1cm4gbmV3IHpBcnJheShlbGVtKTtcblx0fSBlbHNlIGlmIChlbGVtID09PSB1bmRlZmluZWQgfHwgZWxlbSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBuZXcgekFycmF5KCk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGVsZW0gIT09IFwic3RyaW5nXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWV0ZXIgaXMgaW52YWxpZFwiKTtcblx0fVxuXG5cdGlmIChzY29wZSkge1xuXHRcdGlmICghX2NoZWNrVmFsaWRFbGVtZW50KHNjb3BlKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2Vjb25kIHBhcmFtZXRlciBpcyBpbnZhbGlkXCIpO1xuXHRcdH1cblxuXHRcdHNjb3BlID0geihzY29wZSk7XG5cdH0gZWxzZSB7XG5cdFx0c2NvcGUgPSBfZG9jdW1lbnQ7XG5cdH1cblxuXHRyZXR1cm4gX2ZpbmQoc2NvcGUsIGVsZW0pO1xufVxuXG5mdW5jdGlvbiBub29wKCl7fVxuXG50cnkge1xuXHRpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuXG5cdGlmcmFtZS5zdHlsZS53aWR0aFx0XHRcdD0gMDtcblx0aWZyYW1lLnN0eWxlLmhlaWdodFx0XHRcdD0gMDtcblx0aWZyYW1lLnN0eWxlLmJvcmRlclN0eWxlXHQ9IFwibm9uZVwiO1xuXG5cdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuXHR6QXJyYXkgPSBpZnJhbWUuY29udGVudFdpbmRvdy5BcnJheTtcblxuXHRkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlmcmFtZSk7XG59IGNhdGNoIChlKSB7XG5cdHpBcnJheSA9IEFycmF5O1xufVxuXG4vL3dpbmRvdy4kXHQ9IHo7XG53aW5kb3cuelx0PSB6O1xuei5mblx0XHQ9IHpBcnJheS5wcm90b3R5cGU7XG5fd2luZG93XHRcdD0geih3aW5kb3cpO1xuX2RvY3VtZW50XHQ9IHooZG9jdW1lbnQpO1xuXG56LmZuLmZpbmQgPSBmdW5jdGlvbiAoc3RyRWxlbSkge1xuXHRpZiAodHlwZW9mIHN0ckVsZW0gIT09IFwic3RyaW5nXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWF0ZXIgb2YgeiNmaW5kKCkgc2hvdWxkIGJlIGEgc3RyaW5nXCIpO1xuXHR9XG5cblx0cmV0dXJuIF9maW5kKHRoaXMsIHN0ckVsZW0pO1xufTtcbiIsInZhciBhamF4RGVmYXVsdHMsIGFqYXhUeXBlcyxcblx0YWpheE1pbWVzXHQ9IHt9XG5cbmFqYXhEZWZhdWx0cyA9IHtcblx0bWV0aG9kOiBcIkdFVFwiLFxuXHRyZXF1ZXN0VHlwZTogXCJ0ZXh0XCIsXG5cdHJlc3BvbnNlVHlwZTogXCJ0ZXh0XCIsXG5cdHVybDogd2luZG93LmxvY2F0aW9uICsgXCJcIixcblx0cXVlcnk6IG51bGwsXG5cdGRhdGE6IG51bGwsXG5cdHNldHVwOiBub29wLFxuXHRzdWNjZXNzOiBub29wLFxuXHRlcnJvcjogbm9vcFxufTtcblxuYWpheFR5cGVzID0ge1xuXHR0ZXh0OiBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdHJldHVybiAoZGF0YSB8fCBcIlwiKSArIFwiXCI7XG5cdH1cbn07XG5cbnouYWpheCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdHZhciBkYXRhLFxuXHRcdHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG5cdG9wdGlvbnMgPSB6LmV4dGVuZCh7XG5cdFx0Y29udGV4dDogcmVxXG5cdH0sIGFqYXhEZWZhdWx0cywgb3B0aW9ucyk7XG5cblx0aWYgKCFhamF4VHlwZXNbb3B0aW9ucy5yZXF1ZXN0VHlwZV0pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9wdGlvbiBgcmVxdWVzdFR5cGVgXCIpO1xuXHR9IGVsc2UgaWYgKCFhamF4VHlwZXNbb3B0aW9ucy5yZXNwb25zZVR5cGVdKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvcHRpb24gYHJlc3BvbnNlVHlwZWBcIik7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5xdWVyeSAmJiB+W1wiSEVBRFwiLCBcIkdFVFwiXS5pbmRleE9mKG9wdGlvbnMubWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG5cdFx0b3B0aW9ucy51cmxcdCs9IH5vcHRpb25zLnVybC5pbmRleE9mKFwiP1wiKSA/IFwiJlwiIDogXCI/XCI7XG5cdFx0b3B0aW9ucy51cmxcdCs9IHoucXVlcnlTdHJpbmcob3B0aW9ucy5xdWVyeSk7XG5cdFx0b3B0aW9ucy51cmxcdD0gb3B0aW9ucy51cmwucmVwbGFjZSgvKFxcP3wmKSYvZywgXCIkMVwiKTtcblx0fVxuXG5cdHJlcS5vcGVuKG9wdGlvbnMubWV0aG9kLCBvcHRpb25zLnVybCwgdHJ1ZSk7XG5cblx0cmVxLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmVzcDtcblxuXHRcdGlmIChyZXEuc3RhdHVzID49IDIwMCAmJiByZXEuc3RhdHVzIDwgNDAwKSB7XG5cdFx0XHRyZXNwID0gYWpheFR5cGVzW29wdGlvbnMucmVzcG9uc2VUeXBlXS5jYWxsKHJlcSwgcmVxLnJlc3BvbnNlVGV4dCwgdHJ1ZSk7XG5cdFx0XHRvcHRpb25zLnN1Y2Nlc3MuY2FsbChvcHRpb25zLmNvbnRleHQsIHJlc3ApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvcHRpb25zLmVycm9yLmNhbGwob3B0aW9ucy5jb250ZXh0LCByZXEuc3RhdHVzLCByZXEuc3RhdHVzVGV4dCk7XG5cdFx0fVxuXHR9O1xuXG5cdHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuXHRcdG9wdGlvbnMuZXJyb3IuY2FsbChvcHRpb25zLmNvbnRleHQsIHJlcS5zdGF0dXMsIHJlcS5zdGF0dXNUZXh0KTtcblx0fTtcblxuXHRpZiAoIX5bXCJIRUFEXCIsIFwiR0VUXCJdLmluZGV4T2Yob3B0aW9ucy5tZXRob2QudG9VcHBlckNhc2UoKSkpIHtcblx0XHRyZXEuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmRhdGEpIHtcblx0XHRvcHRpb25zLmRhdGEgPSBhamF4VHlwZXNbb3B0aW9ucy5yZXF1ZXN0VHlwZV0uY2FsbChyZXEsIG9wdGlvbnMuZGF0YSwgZmFsc2UpO1xuXHR9XG5cblx0b3B0aW9ucy5zZXR1cC5jYWxsKHJlcSwgcmVxKTtcblxuXHRyZXEuc2VuZChvcHRpb25zLmRhdGEpO1xufTtcbiIsImFqYXhEZWZhdWx0cy5yZXF1ZXN0VHlwZVx0PSBcImRldGVjdFwiO1xuYWpheERlZmF1bHRzLnJlc3BvbnNlVHlwZVx0PSBcImRldGVjdFwiO1xuXG56LnJlZ2lzdGVyQWpheFR5cGUgPSBmdW5jdGlvbiAodHlwZSwgbWltZSwgZm4pIHtcblx0aWYgKCFmbiAmJiB0eXBlb2YgbWltZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0Zm5cdFx0PSBtaW1lO1xuXHRcdG1pbWVcdD0gZmFsc2U7XG5cdH1cblxuXHRhamF4VHlwZXNbdHlwZV0gPSBmbjtcblxuXHRpZiAobWltZSkge1xuXHRcdGFqYXhNaW1lc1ttaW1lXSA9IHR5cGU7XG5cdH1cbn07XG5cbnoucmVnaXN0ZXJBamF4VHlwZShcImRldGVjdFwiLCBmdW5jdGlvbiAoZGF0YSwgaXNSZXNwb25zZSkge1xuXHR2YXIgaGVhZGVyLFxuXHRcdHR5cGUgPSBcInRleHRcIjtcblxuXHRpZiAoaXNSZXNwb25zZSkge1xuXHRcdGhlYWRlclx0PSB0aGlzLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpIHx8IFwiXCIsXG5cdFx0aGVhZGVyXHQ9IGhlYWRlci5zcGxpdChcIjtcIilbMF0udHJpbSgpO1xuXHRcdHR5cGVcdD0gYWpheE1pbWVzW2hlYWRlcl0gfHwgXCJ0ZXh0XCI7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YS50b1N0cmluZyA9PT0gKHt9KS50b1N0cmluZykge1xuXHRcdFx0dHlwZSA9IFwianNvblwiO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhamF4VHlwZXNbdHlwZV0uY2FsbCh0aGlzLCBkYXRhLCBpc1Jlc3BvbnNlKTtcbn0pO1xuXG56LnJlZ2lzdGVyQWpheFR5cGUoXCJqc29uXCIsIFwiYXBwbGljYXRpb24vanNvblwiLCBmdW5jdGlvbiAoZGF0YSwgaXNSZXNwb25zZSkge1xuXHRyZXR1cm4gaXNSZXNwb25zZSA/IEpTT04ucGFyc2UoZGF0YSkgOiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbn0pO1xuXG56LnJlZ2lzdGVyQWpheFR5cGUoXCJodG1sXCIsIFwidGV4dC9odG1sXCIsIGZ1bmN0aW9uIChkYXRhLCBpc1Jlc3BvbnNlKSB7XG5cdHZhciBkb2MsIGFycjtcblxuXHRpZiAoIWlzUmVzcG9uc2UpIHtcblx0XHRyZXR1cm4gZGF0YS5vdXRlckhUTUw7XG5cdH1cblxuXHRhcnJcdD0gbmV3IHpBcnJheSgpO1xuXHRkb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcblxuXHRkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IGRhdGE7XG5cblx0YXJyLnB1c2guYXBwbHkoYXJyLCBhcnIuc2xpY2UuY2FsbChkb2MuYm9keS5jaGlsZHJlbiwgMCkpO1xuXG5cdHJldHVybiBhcnI7XG59KTtcblxuei5yZWdpc3RlckFqYXhUeXBlKFwieG1sXCIsIFwidGV4dC94bWxcIiwgYWpheFhNTFBhcnNlcik7XG56LnJlZ2lzdGVyQWpheFR5cGUoXCJ4bWxcIiwgXCJhcHBsaWNhdGlvbi94bWxcIiwgYWpheFhNTFBhcnNlcik7XG5cbmZ1bmN0aW9uIGFqYXhYTUxQYXJzZXIoZGF0YSwgaXNSZXNwb25zZSkge1xuXHR2YXIgcGFyc2VyO1xuXG5cdGlmICghaXNSZXNwb25zZSkge1xuXHRcdHBhcnNlciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XG5cdFx0cmV0dXJuIHBhcnNlci5zZXJpYWxpemVUb1N0cmluZyhkYXRhKTtcblx0fVxuXG5cdGlmICh0aGlzLnJlc3BvbnNlWE1MKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVzcG9uc2VYTUw7XG5cdH1cblxuXHRwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGRhdGEsIFwiYXBwbGljYXRpb24veG1sXCIpO1xufVxuIiwiaWYgKFwiZGF0YXNldFwiIGluIGRvY3VtZW50LmJvZHkpIHtcblx0ei5mbi5kYXRhID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHR2YXIgaSwgbDtcblxuXHRcdGlmICghdGhpcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzWzBdLmRhdGFzZXQ7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1swXS5kYXRhc2V0W2tleV07XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR0aGlzW2ldLmRhdGFzZXRba2V5XSA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xufSBlbHNlIHtcblx0ei5mbi5kYXRhID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHR2YXIgaSwgbCxcblx0XHRcdGRhdGFLZXkgPSBcImRhdGEtXCIgKyAoa2V5IHx8IFwiXCIpO1xuXG5cdFx0aWYgKCF0aGlzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aSA9IHt9O1xuXG5cdFx0XHRbXS5mb3JFYWNoLmNhbGwodGhpc1swXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbiAoYXR0cikge1xuXHRcdFx0XHRyZXR1cm4gaVthdHRyLm5hbWVdID0gYXR0ci52YWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gaTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzWzBdLmF0dHJpYnV0ZXNbZGF0YUtleV07XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR0aGlzW2ldLmRhdGFzZXRbZGF0YUtleV0gPSB2YWx1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcbn1cbiIsInouZm4ub24gPSB6LmZuLmJpbmQgPSBfZWFjaChmdW5jdGlvbiBfb24oZXZlbnRUeXBlLCBmbikge1xuXHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBmbiwgZmFsc2UpO1xufSk7XG5cbnouZm4ub2ZmID0gei5mbi51bmJpbmQgPSBfZWFjaChmdW5jdGlvbiBfb2ZmKGV2ZW50VHlwZSwgZm4pIHtcblx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4sIGZhbHNlKTtcbn0pO1xuXG56LmZuLnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnRUeXBlLCBkYXRhKSB7XG5cdHZhciBldmVudCwgX2RhdGEsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IHRoaXMubGVuZ3RoO1xuXG5cdHRyeSB7XG5cdFx0X2RhdGFcdD0gZGF0YSA/IHtkZXRhaWw6IGRhdGF9IDogdW5kZWZpbmVkO1xuXHRcdGV2ZW50XHQ9IG5ldyBDdXN0b21FdmVudChldmVudFR5cGUsIF9kYXRhKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0ZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcblx0XHRldmVudC5pbml0Q3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB0cnVlLCB0cnVlLCBkYXRhKTtcblx0fVxuXG5cdGZvciAoOyBpIDwgbDsgaSsrKSB7XG5cdFx0dGhpc1tpXS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcbiIsImZ1bmN0aW9uIF9pc1dpdGhGdW5jdGlvbihlbGVtLCBmbikge1xuXHRyZXR1cm4gZm4uY2FsbChlbGVtLCBlbGVtKTtcbn1cblxuZnVuY3Rpb24gX2lzV2l0aEVsZW1lbnQoZWxlbTEsIGVsZW0yKSB7XG5cdHJldHVybiBlbGVtMSA9PT0gZWxlbTI7XG59XG5cbnouZm4uaXMgPSAoZnVuY3Rpb24gX2lzKCkge1xuXHR2YXIgbWF0Y2hlcyxcblx0XHRib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuXHRtYXRjaGVzXHQ9IGJvZHkubWF0Y2hlcyB8fCBib2R5Lm1hdGNoZXNTZWxlY3RvciB8fCBib2R5Lm1zTWF0Y2hlc1NlbGVjdG9yO1xuXHRtYXRjaGVzID0gbWF0Y2hlcyB8fCBib2R5Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBib2R5LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBib2R5Lm9NYXRjaGVzU2VsZWN0b3I7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuXHRcdHZhciBfaXNXaXRoLCByZXQsXG5cdFx0XHRpXHQ9IDAsXG5cdFx0XHRsXHQ9IHRoaXMubGVuZ3RoO1xuXG5cdFx0c3dpdGNoICh0eXBlb2Ygc2VsZWN0b3IpIHtcblx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0X2lzV2l0aCA9IG1hdGNoZXM7XG5cdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImZ1bmN0aW9uXCI6XG5cdFx0XHRcdF9pc1dpdGggPSBfaXNXaXRoRnVuY3Rpb247XG5cdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIm9iamVjdFwiOlxuXHRcdFx0XHRpZiAoc2VsZWN0b3IgaW5zdGFuY2VvZiBFdmVudFRhcmdldCkge1xuXHRcdFx0XHRcdF9pc1dpdGggPSBfaXNXaXRoRWxlbWVudDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWV0ZXIgb2YgeiNpcyBpcyBpbnZhbGlkXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWV0ZXIgb2YgeiNpcyBpcyBpbnZhbGlkXCIpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHJldCA9IF9pc1dpdGgodGhpc1tpXSwgc2VsZWN0b3IpO1xuXG5cdFx0XHRpZiAocmV0KSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xufSkoKTtcbiIsInouZm4uaGlkZSA9IF9lYWNoKGZ1bmN0aW9uIGhpZGUoKSB7XG5cdHRoaXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRyZXR1cm4gdGhpcztcbn0pO1xuXG56LmZuLnNob3cgPSBfZWFjaChmdW5jdGlvbiBzaG93KCkge1xuXHR0aGlzLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRyZXR1cm4gdGhpcztcbn0pO1xuXG56LmZuLmNsb25lID0gZnVuY3Rpb24gKGRlZXApIHtcblx0dmFyIGkgPSAwO1xuXG5cdGlmIChkZWVwID09PSB1bmRlZmluZWQgfHwgZGVlcCA9PT0gbnVsbCkge1xuXHRcdGRlZXAgPSBmYWxzZTtcblx0fVxuXG5cdGZvciAoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuXHRcdHRoaXNbaV0gPSB0aGlzW2ldLmNsb25lTm9kZShkZWVwKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuei5mbi5odG1sID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHZhciBpLCBsO1xuXG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHRoaXMuaW5uZXJIVE1MO1xuXHR9XG5cblx0Zm9yIChpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0dGhpc1tpXS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuei5mbi50ZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdHZhciBpLCBsO1xuXG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHRoaXMudGV4dENvbnRlbnQ7XG5cdH1cblxuXHRmb3IgKGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHR0aGlzW2ldLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbnouZm4uZ2V0QXR0ciA9IGZ1bmN0aW9uIChrZXkpIHtcblx0aWYgKCFrZXkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBwYXJhbWV0ZXIgb2YgeiNnZXRBdHRyIGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cblx0cmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXS5nZXRBdHRyaWJ1dGUoa2V5KTtcbn07XG5cbnouZm4uc2V0QXR0ciA9IF9lYWNoKGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdGlmICgha2V5KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgcGFyYW1ldGVyIG9mIHojc2V0QXR0ciBpcyByZXF1aXJlZFwiKTtcblx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiU2Vjb25kIHBhcmFtZXRlciBvZiB6I3NldEF0dHIgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHR0aGlzLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcblx0cmV0dXJuIHRoaXM7XG59KTtcblxuei5mbi5hdHRyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyKGtleSk7XG5cdH1cblxuXHR0aGlzLnNldEF0dHIoa2V5LCB2YWx1ZSk7XG5cdHJldHVybiB0aGlzO1xufTtcblxuei5mbi5yZXBsYWNlV2l0aCA9IHouZm4ucmVwbGFjZSA9IF9lYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkZpcnN0IHBhcmFtZXRlciBvZiB6I3JlcGxhY2UgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHR0aGlzLm91dGVySFRNTCA9IHZhbHVlO1xufSk7XG5cbmlmIChcImNsYXNzTGlzdFwiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuXHR6LmZuLmFkZENsYXNzID0gX2VhY2goZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3NOYW1lKSB7XG5cdFx0dGhpcy5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG5cdH0pO1xuXG5cdHouZm4ucmVtb3ZlQ2xhc3MgPSBfZWFjaChmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc05hbWUpIHtcblx0XHR0aGlzLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcblx0fSk7XG5cblx0ei5mbi50b2dnbGVDbGFzcyA9IF9lYWNoKGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzTmFtZSwgZm9yY2UpIHtcblx0XHRpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5jbGFzc0xpc3RbZm9yY2UgPyBcImFkZFwiIDogXCJyZW1vdmVcIl0oY2xhc3NOYW1lKTtcblx0fSk7XG59IGVsc2Uge1xuXHR6LmZuLmFkZENsYXNzID0gX2VhY2goZnVuY3Rpb24gYWRkQ2xhc3MoY2xhc3NOYW1lKSB7XG5cdFx0dGhpcy5jbGFzc05hbWUgKz0gXCIgXCIgKyBjbGFzc05hbWU7XG5cdH0pO1xuXG5cdHouZm4ucmVtb3ZlQ2xhc3MgPSBfZWFjaChmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc05hbWUpIHtcblx0XHR0aGlzLmNsYXNzTmFtZSArPSB0aGlzLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxcXFxcYilcIiArIGNsYXNzTmFtZSArIFwiKFxcXFxifCQpXCIsIFwiZ1wiKSwgXCIgXCIpO1xuXHR9KTtcblxuXHR6LmZuLnRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gKGNsYXNzTmFtZSwgZm9yY2UpIHtcblx0XHR0aGlzW2ZvcmNlID8gXCJhZGRDbGFzc1wiIDogXCJyZW1vdmVDbGFzc1wiXShjbGFzc05hbWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xufVxuIiwidmFyIF9zZWxlY3RvcnNDYWNoZSxcblx0X3NlbGVjdG9ycyA9IHt9O1xuXG5mdW5jdGlvbiBfZmluZChzY29wZSwgc3RyRWxlbSkge1xuXHR2YXIgcmV0ID0gbmV3IHpBcnJheSgpO1xuXG5cdHNjb3BlLmZvckVhY2goZnVuY3Rpb24gX2ZpbmRGb3JFYWNoKHNjb3BlZEVsZW0pIHtcblx0XHRyZXQucHVzaC5hcHBseShyZXQsIF9zZWxlY3Qoc2NvcGVkRWxlbSwgc3RyRWxlbSkpO1xuXHR9KTtcblxuXHRyZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBfc2VsZWN0KHNjb3BlZEVsZW0sIHN0ckVsZW0pIHtcblx0aWYgKCF+c3RyRWxlbS5pbmRleE9mKFwiOlwiKSB8fCBfc2VsZWN0b3JzQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBzY29wZWRFbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoc3RyRWxlbSk7XG5cdH1cblxuXHRpZiAoX3NlbGVjdG9yc0NhY2hlID09PSBmYWxzZSkge1xuXHRcdF9nZW5lcmF0ZVNlbGVjdG9yc0NhY2hlKCk7XG5cdH1cblxuXHRpZiAoIXN0ckVsZW0ubWF0Y2goX3NlbGVjdG9yc0NhY2hlKSkge1xuXHRcdHJldHVybiBzY29wZWRFbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoc3RyRWxlbSk7XG5cdH1cblxuXHRyZXR1cm4gX3NlbGVjdDIoc2NvcGVkRWxlbSwgc3RyRWxlbSk7XG59XG5cbmZ1bmN0aW9uIF9zZWxlY3QyKHNjb3BlZEVsZW0sIHN0ckVsZW0pIHtcblx0dmFyIGVudHJ5LCBzZWxlY3RvcnMsXG5cdFx0c2NvcGVcdD0gbmV3IHpBcnJheShzY29wZWRFbGVtKSxcblx0XHRjdXJyZW50XHQ9IFwiXCIsXG5cdFx0ZW50cmllc1x0PSBzdHJFbGVtLnNwbGl0KC9cXHMrLyk7XG5cblx0d2hpbGUgKGVudHJ5ID0gZW50cmllcy5zaGlmdCgpKSB7XG5cdFx0c2VsZWN0b3JzID0gZW50cnkubWF0Y2goX3NlbGVjdG9yc0NhY2hlKTtcblxuXHRcdGlmICghc2VsZWN0b3JzKSB7XG5cdFx0XHRjdXJyZW50ICs9IGVudHJ5ICsgXCIgXCI7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjdXJyZW50XHQrPSBlbnRyeS5yZXBsYWNlKF9zZWxlY3RvcnNDYWNoZSwgXCJcIikgfHwgXCIqXCI7XG5cdFx0ZW50cnlcdD0gbmV3IHpBcnJheSgpO1xuXG5cdFx0c2NvcGUuZm9yRWFjaChmdW5jdGlvbiBfc2VsZWN0Rm9yRWFjaChzY29wZWRFbGVtKSB7XG5cdFx0XHR2YXIgcmV0ID0gbmV3IHpBcnJheSgpO1xuXG5cdFx0XHRzZWxlY3RvcnMuZm9yRWFjaChmdW5jdGlvbiBzZWxlY3RvcnNGb3JFYWNoKHNlbGVjdG9yKSB7XG5cdFx0XHRcdHJldC5wdXNoLmFwcGx5KHJldCwgX3NlbGVjdG9yc1tzZWxlY3Rvcl0uY2FsbChzY29wZWRFbGVtLCBjdXJyZW50KSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0ZW50cnkucHVzaC5hcHBseShlbnRyeSwgcmV0KTtcblx0XHR9KTtcblxuXHRcdHNjb3BlXHQ9IGVudHJ5O1xuXHRcdGN1cnJlbnRcdD0gXCJcIjtcblx0fVxuXG5cdGlmIChjdXJyZW50KSB7XG5cdFx0ZW50cnkgPSBuZXcgekFycmF5KCk7XG5cblx0XHRzY29wZS5mb3JFYWNoKGZ1bmN0aW9uIGN1cnJlbnRGb3JFYWNoKHNjb3BlZEVsZW0pIHtcblx0XHRcdGVudHJ5LnB1c2guYXBwbHkoZW50cnksIHNjb3BlZEVsZW0ucXVlcnlTZWxlY3RvckFsbChjdXJyZW50KSk7XG5cdFx0fSk7XG5cblx0XHRzY29wZSA9IGVudHJ5O1xuXHR9XG5cblx0cmV0dXJuIHNjb3BlO1xufVxuXG5mdW5jdGlvbiBfZ2VuZXJhdGVTZWxlY3RvcnNDYWNoZSgpIHtcblx0dmFyIHNlbGVjdG9yc1x0PSBPYmplY3Qua2V5cyhfc2VsZWN0b3JzKS5qb2luKFwifFwiKS5yZXBsYWNlKC86L2csIFwiXCIpO1xuXHRfc2VsZWN0b3JzQ2FjaGVcdD0gbmV3IFJlZ0V4cChcIjooXCIgKyBzZWxlY3RvcnMgKyBcIilcIiwgXCJnXCIpO1xufVxuIiwiei5yZWdpc3RlclNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBmbikge1xuXHRpZiAoIXNlbGVjdG9yIHx8IHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkZpcnN0IHBhcmFtZXRlciBvZiB6I3JlZ2lzdGVyU2VsZWN0b3IgbXVzdCBiZSBhIHN0cmluZyBzZWxlY3RvclwiKTtcblx0fSBlbHNlIGlmICghZm4gfHwgdHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTZWNvbmQgcGFyYW1ldGVyIG9mIHojcmVnaXN0ZXJTZWxlY3RvciBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG5cdH1cblxuXHRpZiAoc2VsZWN0b3JbMF0gIT09IFwiOlwiKSB7XG5cdFx0c2VsZWN0b3IgPSBcIjpcIiArIHNlbGVjdG9yO1xuXHR9XG5cblx0X3NlbGVjdG9yc0NhY2hlXHRcdFx0PSBmYWxzZTtcblx0X3NlbGVjdG9yc1tzZWxlY3Rvcl1cdD0gZm47XG59O1xuXG56LnJlZ2lzdGVyU2VsZWN0b3IoXCI6Zmlyc3RcIiwgZnVuY3Rpb24gc2VsZWN0b3JGaXJzdChxdWVyeSkge1xuXHRyZXR1cm4geih0aGlzLnF1ZXJ5U2VsZWN0b3IocXVlcnkpKTtcbn0pO1xuXG56LnJlZ2lzdGVyU2VsZWN0b3IoXCI6aW5wdXRcIiwgKGZ1bmN0aW9uIHNlbGVjdG9yRmlyc3QoKSB7XG5cdHZhciB0YWdzID0gXCJJTlBVVCxURVhUQVJFQSxTRUxFQ1QsQlVUVE9OXCIuc3BsaXQoXCIsXCIpO1xuXG5cdGZ1bmN0aW9uIGZpbHRlcihlbGVtZW50KSB7XG5cdFx0cmV0dXJuIH50YWdzLmluZGV4T2YoZWxlbWVudC50YWdOYW1lKTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiBzZWxlY3RvcklucHV0KHF1ZXJ5KSB7XG5cdFx0dmFyIGVsZW1lbnRzID0gbmV3IHpBcnJheSgpO1xuXG5cdFx0ZWxlbWVudHMucHVzaC5hcHBseShlbGVtZW50cywgW10uZmlsdGVyLmNhbGwodGhpcy5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZmlsdGVyKSk7XG5cblx0XHRyZXR1cm4gZWxlbWVudHM7XG5cdH07XG59KSgpKTtcbiIsInouZm4ucGFyZW50ID0gX2VhY2hOZXcoZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdGhpcy5wYXJlbnROb2RlO1xufSk7XG5cbnouZm4ubmV4dCA9IF9lYWNoTmV3KGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMubmV4dEVsZW1lbnRTaWJsaW5nO1xufSk7XG5cbnouZm4ucHJldiA9IHouZm4ucHJldmlvdXMgPSBfZWFjaE5ldyhmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB0aGlzLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG59KTtcblxuei5mbi5zaWJsaW5ncyA9IF9lYWNoTmV3KGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIFtdLmZpbHRlci5jYWxsKHRoaXMucGFyZW50Tm9kZS5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcblx0XHRyZXR1cm4gY2hpbGQgIT09IHRoaXM7XG5cdH0sIHRoaXMpO1xufSk7XG4iLCJmdW5jdGlvbiBfY2hlY2tWYWxpZEVsZW1lbnQoZWxlbSkge1xuXHRpZiAoZWxlbSBpbnN0YW5jZW9mIHpBcnJheSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKGVsZW0gaW5zdGFuY2VvZiBFdmVudFRhcmdldCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gX2VhY2goZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIHJ1bkVhY2goKSB7XG5cdFx0dmFyIGlcdD0gMCxcblx0XHRcdGxcdD0gdGhpcy5sZW5ndGg7XG5cblx0XHRmb3IgKDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Zm4uYXBwbHkodGhpc1tpXSwgYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcbn1cblxuZnVuY3Rpb24gX2VhY2hOZXcoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIHJ1bkVhY2goKSB7XG5cdFx0dmFyIHJldCxcblx0XHRcdGlcdD0gMCxcblx0XHRcdGxcdD0gdGhpcy5sZW5ndGgsXG5cdFx0XHRhcnJcdD0gbmV3IHpBcnJheSgpO1xuXG5cdFx0Zm9yICg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHJldCA9IGZuLmFwcGx5KHRoaXNbaV0sIGFyZ3VtZW50cyk7XG5cblx0XHRcdGlmIChyZXQpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkocmV0KSAmJiByZXQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0YXJyLnB1c2guYXBwbHkoYXJyLCByZXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFyci5wdXNoKHJldCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyO1xuXHR9O1xufVxuXG56LmRlZXBFeHRlbmQgPSBmdW5jdGlvbiBfZXh0ZW5kKGRlZXApIHtcblx0dmFyIG9iaiwgdGFyZ2V0LFxuXHRcdGkgPSAyO1xuXG5cdGlmICh0eXBlb2YgZGVlcCA9PT0gXCJvYmplY3RcIikge1xuXHRcdHRhcmdldFx0PSBkZWVwIHx8IHt9O1xuXHRcdGRlZXBcdD0gSW5maW5pdHk7XG5cdH0gZWxzZSB7XG5cdFx0ZGVlcFx0PSBkZWVwID09PSB0cnVlID8gSW5maW5pdHkgOiAoZGVlcCB8IDApO1xuXHRcdHRhcmdldFx0PSBhcmd1bWVudHNbMV0gfHwge307XG5cdH1cblxuXHRmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdG9iaiA9IGFyZ3VtZW50c1tpXTtcblxuXHRcdGlmICghb2JqKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdFx0XHRpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0aWYgKGRlZXAgJiYgdHlwZW9mIG9ialtrZXldID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0X2V4dGVuZChkZWVwIC0gMSwgdGFyZ2V0W2tleV0sIG9ialtrZXldKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YXJnZXRba2V5XSA9IG9ialtrZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbnouZXh0ZW5kID0gZnVuY3Rpb24gKCkge1xuXHRbXS51bnNoaWZ0LmNhbGwoYXJndW1lbnRzLCAwKTtcblx0cmV0dXJuIHouZGVlcEV4dGVuZC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufTtcblxuei5mbi5lYWNoID0gX2VhY2goZnVuY3Rpb24gZWFjaChmbikge1xuXHRmbi5jYWxsKHRoaXMsIHRoaXMpO1xuXHRyZXR1cm4gdGhpcztcbn0pO1xuXG56LnF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24gKG9iaiwgcHJlZml4KSB7XG5cdHZhciBpLCBrZXksIHZhbCxcblx0XHRzdHJpbmdzID0gW107XG5cblx0Zm9yIChpIGluIG9iaikge1xuXHRcdGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdGlmIChwcmVmaXgpIHtcblx0XHRcdFx0a2V5ID0gcHJlZml4ICsgXCJbXCIgKyBpICsgXCJdXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrZXkgPSBpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YWwgPSBvYmpbaV07XG5cblx0XHRcdGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRzdHJpbmdzLnB1c2gocXVlcnlTdHJpbmcodmFsLCBrZXkpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0cmluZ3MucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzdHJpbmdzLmpvaW4oXCImXCIpO1xufTtcbiIsIn0pKHdpbmRvdywgZG9jdW1lbnQpO1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 \ No newline at end of file diff --git a/dist/z.sm.min.js b/dist/z.sm.min.js index b4dfc79..edfef5c 100644 --- a/dist/z.sm.min.js +++ b/dist/z.sm.min.js @@ -1,2 +1,2 @@ -!function(t,e){function n(t,e){if(t instanceof l)return t;if(t instanceof EventTarget)return new l(t);if(void 0===t||null===t)return new l;if("string"!=typeof t)throw new Error("First parameter is invalid");if(e){if(!u(e))throw new Error("Second parameter is invalid");e=n(e)}else e=p;return s(e,t)}function r(t,e){return e.call(t,t)}function i(t,e){return t===e}function s(t,e){var n=new l;return t.forEach(function(t){n.push.apply(n,o(t,e))}),n}function o(t,e){return~e.indexOf(":")&&void 0!==m?(m===!1&&f(),e.match(m)?a(t,e):t.querySelectorAll(e)):t.querySelectorAll(e)}function a(t,e){for(var n,r,i=new l(t),s="",o=e.split(/\s+/);n=o.shift();)r=n.match(m),r?(s+=n.replace(m,"")||"*",n=new l,i.forEach(function(t){var e=new l;r.forEach(function(n){e.push.apply(e,y[n].call(t,s))}),n.push.apply(n,e)}),i=n,s=""):s+=n+" ";return s&&(n=new l,i.forEach(function(t){n.push.apply(n,t.querySelectorAll(s))}),i=n),i}function f(){var t=Object.keys(y).join("|").replace(/:/g,"");m=new RegExp(":("+t+")","g")}function u(t){return t instanceof l?!0:t instanceof EventTarget?!0:"string"==typeof t?!0:void 0}function c(t){return function(){for(var e=0,n=this.length;n>e;e++)t.apply(this[e],arguments);return this}}function h(t){return function(){for(var e,n=0,r=this.length,i=new l;r>n;n++)e=t.apply(this[n],arguments),e&&(Array.isArray(e)&&e.length?i.push.apply(i,e):i.push(e));return i}}var l,d,p,v;try{v=e.createElement("iframe"),v.style.width=0,v.style.height=0,v.style.borderStyle="none",e.body.appendChild(v),l=v.contentWindow.Array,e.body.removeChild(v)}catch(g){l=Array}t.z=n,n.fn=l.prototype,d=n(t),p=n(e),n.fn.find=function(t){if("string"!=typeof t)throw new Error("First paramater of z#find() should be a string");return s(this,t)},n.fn.data="dataset"in e.body?function(t,e){var n,r;if(this.length){if(void 0===t)return this[0].dataset;if(void 0===e)return this[0].dataset[t];for(n=0,r=this.length;r>n;n++)this[n].dataset[t]=e;return this}}:function(t,e){var n,r,i="data-"+(t||"");if(this.length){if(void 0===t)return n={},[].forEach.call(this[0].attributes,function(t){return n[t.name]=t.value}),n;if(void 0===e)return this[0].attributes[i];for(n=0,r=this.length;r>n;n++)this[n].dataset[i]=e;return this}},n.fn.on=n.fn.bind=c(function(t,e){this.addEventListener(t,e,!1)}),n.fn.off=n.fn.unbind=c(function(t,e){this.removeEventListener(t,e,!1)}),n.fn.trigger=function(t,n){var r,i,s=0,o=this.length;try{i=n?{detail:n}:void 0,r=new CustomEvent(t,i)}catch(a){r=e.createEvent("CustomEvent"),r.initCustomEvent(t,!0,!0,n)}for(;o>s;s++)this[s].dispatchEvent(r);return this},n.fn.is=function(){var t,n=e.body;return t=n.matches||n.matchesSelector||n.msMatchesSelector,t=t||n.mozMatchesSelector||n.webkitMatchesSelector||n.oMatchesSelector,function(e){var n,s,o=0,a=this.length;switch(typeof e){case"string":n=t;break;case"function":n=r;break;case"object":if(!(e instanceof EventTarget))throw new Error("First parameter of z#is is invalid");n=i;default:throw new Error("First parameter of z#is is invalid")}for(;a>o;o++)if(s=n(this[o],e))return s;return!1}}(),n.fn.hide=c(function(){return this.style.display="none",this}),n.fn.show=c(function(){return this.style.display="",this}),n.fn.clone=function(t){var e=0;for((void 0===t||null===t)&&(t=!1);ee;e++)this[e].innerHTML=t;return this},n.fn.text=function(t){var e,n;if(void 0===t)return this.textContent;for(e=0,n=this.length;n>e;e++)this[e].textContent=t;return this},n.fn.getAttr=function(t){if(!t)throw new Error("First parameter of z#getAttr is required");return this[0]&&this[0].getAttribute(t)},n.fn.setAttr=c(function(t,e){if(!t)throw new Error("First parameter of z#setAttr is required");if(void 0===e)throw new Error("Second parameter of z#setAttr is required");return this.setAttribute(t,e),this}),n.fn.attr=function(t,e){return void 0===e?this.getAttr(t):(this.setAttr(t,e),this)},n.fn.replaceWith=n.fn.replace=c(function(t){if(void 0===t)throw new Error("First parameter of z#replace is required");this.outerHTML=t}),"classList"in e.documentElement?(n.fn.addClass=c(function(t){this.classList.add(t)}),n.fn.removeClass=c(function(t){this.classList.remove(t)}),n.fn.toggleClass=c(function(t,e){return void 0===e?void this.classList.toggle(t):void this.classList[e?"add":"remove"](t)})):(n.fn.addClass=c(function(t){this.className+=" "+t}),n.fn.removeClass=c(function(t){this.className+=this.className.replace(new RegExp("(^|\\b)"+t+"(\\b|$)","g")," ")}),n.fn.toggleClass=function(t,e){return this[e?"addClass":"removeClass"](t),this});var m,y={};n.registerSelector=function(t,e){if(!t||"string"!=typeof t)throw new Error("First parameter of z#registerSelector must be a string selector");if(!e||"function"!=typeof e)throw new Error("Second parameter of z#registerSelector must be a function");":"!==t[0]&&(t=":"+t),m=!1,y[t]=e},n.registerSelector(":first",function(t){return n(this.querySelector(t))}),n.registerSelector(":input",function(){function t(t){return~e.indexOf(t.tagName)}var e="INPUT,TEXTAREA,SELECT,BUTTON".split(",");return function(e){var n=new l;return n.push.apply(n,[].filter.call(this.querySelectorAll(e),t)),n}}()),n.fn.parent=h(function(){return this.parentNode}),n.fn.next=h(function(){return this.nextElementSibling}),n.fn.prev=n.fn.previous=h(function(){return this.previousElementSibling}),n.fn.siblings=h(function(){return[].filter.call(this.parentNode.children,function(t){return t!==this},this)}),n.deepExtend=function w(t){var e,n,r=2;for("object"==typeof t?(n=t||{},t=1/0):(t=t===!0?1/0:0|t,n=arguments[1]||{});re;e++)t.apply(this[e],arguments);return this}}function p(t){return function(){for(var e,r=0,n=this.length,i=new d;n>r;r++)e=t.apply(this[r],arguments),e&&(Array.isArray(e)&&e.length?i.push.apply(i,e):i.push(e));return i}}var d,y,g,v;try{v=e.createElement("iframe"),v.style.width=0,v.style.height=0,v.style.borderStyle="none",e.body.appendChild(v),d=v.contentWindow.Array,e.body.removeChild(v)}catch(m){d=Array}t.z=r,r.fn=d.prototype,y=r(t),g=r(e),r.fn.find=function(t){if("string"!=typeof t)throw new Error("First paramater of z#find() should be a string");return a(this,t)};var w,E,x={};w={method:"GET",requestType:"text",responseType:"text",url:t.location+"",query:null,data:null,setup:n,success:n,error:n},E={text:function(t){return(t||"")+""}},r.ajax=function(t){var e=new XMLHttpRequest;if(t=r.extend({context:e},w,t),!E[t.requestType])throw new Error("Invalid option `requestType`");if(!E[t.responseType])throw new Error("Invalid option `responseType`");t.query&&~["HEAD","GET"].indexOf(t.method.toUpperCase())&&(t.url+=~t.url.indexOf("?")?"&":"?",t.url+=r.queryString(t.query),t.url=t.url.replace(/(\?|&)&/g,"$1")),e.open(t.method,t.url,!0),e.onload=function(){var r;e.status>=200&&e.status<400?(r=E[t.responseType].call(e,e.responseText,!0),t.success.call(t.context,r)):t.error.call(t.context,e.status,e.statusText)},e.onerror=function(){t.error.call(t.context,e.status,e.statusText)},~["HEAD","GET"].indexOf(t.method.toUpperCase())||e.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),t.data&&(t.data=E[t.requestType].call(e,t.data,!1)),t.setup.call(e,e),e.send(t.data)},w.requestType="detect",w.responseType="detect",r.registerAjaxType=function(t,e,r){r||"function"!=typeof e||(r=e,e=!1),E[t]=r,e&&(x[e]=t)},r.registerAjaxType("detect",function(t,e){var r,n="text";return e?(r=this.getResponseHeader("Content-Type")||"",r=r.split(";")[0].trim(),n=x[r]||"text"):t&&"object"==typeof t&&t.toString==={}.toString&&(n="json"),E[n].call(this,t,e)}),r.registerAjaxType("json","application/json",function(t,e){return e?JSON.parse(t):JSON.stringify(t)}),r.registerAjaxType("html","text/html",function(t,r){var n,i;return r?(i=new d,n=e.implementation.createHTMLDocument(),n.documentElement.innerHTML=t,i.push.apply(i,i.slice.call(n.body.children,0)),i):t.outerHTML}),r.registerAjaxType("xml","text/xml",i),r.registerAjaxType("xml","application/xml",i),r.fn.data="dataset"in e.body?function(t,e){var r,n;if(this.length){if(void 0===t)return this[0].dataset;if(void 0===e)return this[0].dataset[t];for(r=0,n=this.length;n>r;r++)this[r].dataset[t]=e;return this}}:function(t,e){var r,n,i="data-"+(t||"");if(this.length){if(void 0===t)return r={},[].forEach.call(this[0].attributes,function(t){return r[t.name]=t.value}),r;if(void 0===e)return this[0].attributes[i];for(r=0,n=this.length;n>r;r++)this[r].dataset[i]=e;return this}},r.fn.on=r.fn.bind=h(function(t,e){this.addEventListener(t,e,!1)}),r.fn.off=r.fn.unbind=h(function(t,e){this.removeEventListener(t,e,!1)}),r.fn.trigger=function(t,r){var n,i,o=0,s=this.length;try{i=r?{detail:r}:void 0,n=new CustomEvent(t,i)}catch(a){n=e.createEvent("CustomEvent"),n.initCustomEvent(t,!0,!0,r)}for(;s>o;o++)this[o].dispatchEvent(n);return this},r.fn.is=function(){var t,r=e.body;return t=r.matches||r.matchesSelector||r.msMatchesSelector,t=t||r.mozMatchesSelector||r.webkitMatchesSelector||r.oMatchesSelector,function(e){var r,n,i=0,a=this.length;switch(typeof e){case"string":r=t;break;case"function":r=o;break;case"object":if(!(e instanceof EventTarget))throw new Error("First parameter of z#is is invalid");r=s;default:throw new Error("First parameter of z#is is invalid")}for(;a>i;i++)if(n=r(this[i],e))return n;return!1}}(),r.fn.hide=h(function(){return this.style.display="none",this}),r.fn.show=h(function(){return this.style.display="",this}),r.fn.clone=function(t){var e=0;for((void 0===t||null===t)&&(t=!1);ee;e++)this[e].innerHTML=t;return this},r.fn.text=function(t){var e,r;if(void 0===t)return this.textContent;for(e=0,r=this.length;r>e;e++)this[e].textContent=t;return this},r.fn.getAttr=function(t){if(!t)throw new Error("First parameter of z#getAttr is required");return this[0]&&this[0].getAttribute(t)},r.fn.setAttr=h(function(t,e){if(!t)throw new Error("First parameter of z#setAttr is required");if(void 0===e)throw new Error("Second parameter of z#setAttr is required");return this.setAttribute(t,e),this}),r.fn.attr=function(t,e){return void 0===e?this.getAttr(t):(this.setAttr(t,e),this)},r.fn.replaceWith=r.fn.replace=h(function(t){if(void 0===t)throw new Error("First parameter of z#replace is required");this.outerHTML=t}),"classList"in e.documentElement?(r.fn.addClass=h(function(t){this.classList.add(t)}),r.fn.removeClass=h(function(t){this.classList.remove(t)}),r.fn.toggleClass=h(function(t,e){return void 0===e?void this.classList.toggle(t):void this.classList[e?"add":"remove"](t)})):(r.fn.addClass=h(function(t){this.className+=" "+t}),r.fn.removeClass=h(function(t){this.className+=this.className.replace(new RegExp("(^|\\b)"+t+"(\\b|$)","g")," ")}),r.fn.toggleClass=function(t,e){return this[e?"addClass":"removeClass"](t),this});var T,S={};r.registerSelector=function(t,e){if(!t||"string"!=typeof t)throw new Error("First parameter of z#registerSelector must be a string selector");if(!e||"function"!=typeof e)throw new Error("Second parameter of z#registerSelector must be a function");":"!==t[0]&&(t=":"+t),T=!1,S[t]=e},r.registerSelector(":first",function(t){return r(this.querySelector(t))}),r.registerSelector(":input",function(){function t(t){return~e.indexOf(t.tagName)}var e="INPUT,TEXTAREA,SELECT,BUTTON".split(",");return function(e){var r=new d;return r.push.apply(r,[].filter.call(this.querySelectorAll(e),t)),r}}()),r.fn.parent=p(function(){return this.parentNode}),r.fn.next=p(function(){return this.nextElementSibling}),r.fn.prev=r.fn.previous=p(function(){return this.previousElementSibling}),r.fn.siblings=p(function(){return[].filter.call(this.parentNode.children,function(t){return t!==this},this)}),r.deepExtend=function b(t){var e,r,n=2;for("object"==typeof t?(r=t||{},t=1/0):(t=t===!0?1/0:0|t,r=arguments[1]||{});n= 200 && req.status < 400) { + resp = ajaxTypes[options.responseType].call(req, req.responseText, true); + options.success.call(options.context, resp); + } else { + options.error.call(options.context, req.status, req.statusText); + } + }; + + req.onerror = function () { + options.error.call(options.context, req.status, req.statusText); + }; + + if (!~["HEAD", "GET"].indexOf(options.method.toUpperCase())) { + req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + } + + if (options.data) { + options.data = ajaxTypes[options.requestType].call(req, options.data, false); + } + + options.setup.call(req, req); + + req.send(options.data); +}; diff --git a/lib/ajax_types.js b/lib/ajax_types.js new file mode 100644 index 0000000..ea82401 --- /dev/null +++ b/lib/ajax_types.js @@ -0,0 +1,72 @@ +ajaxDefaults.requestType = "detect"; +ajaxDefaults.responseType = "detect"; + +z.registerAjaxType = function (type, mime, fn) { + if (!fn && typeof mime === "function") { + fn = mime; + mime = false; + } + + ajaxTypes[type] = fn; + + if (mime) { + ajaxMimes[mime] = type; + } +}; + +z.registerAjaxType("detect", function (data, isResponse) { + var header, + type = "text"; + + if (isResponse) { + header = this.getResponseHeader("Content-Type") || "", + header = header.split(";")[0].trim(); + type = ajaxMimes[header] || "text"; + } else { + if (data && typeof data === "object" && data.toString === ({}).toString) { + type = "json"; + } + } + + return ajaxTypes[type].call(this, data, isResponse); +}); + +z.registerAjaxType("json", "application/json", function (data, isResponse) { + return isResponse ? JSON.parse(data) : JSON.stringify(data); +}); + +z.registerAjaxType("html", "text/html", function (data, isResponse) { + var doc, arr; + + if (!isResponse) { + return data.outerHTML; + } + + arr = new zArray(); + doc = document.implementation.createHTMLDocument(); + + doc.documentElement.innerHTML = data; + + arr.push.apply(arr, arr.slice.call(doc.body.children, 0)); + + return arr; +}); + +z.registerAjaxType("xml", "text/xml", ajaxXMLParser); +z.registerAjaxType("xml", "application/xml", ajaxXMLParser); + +function ajaxXMLParser(data, isResponse) { + var parser; + + if (!isResponse) { + parser = new XMLSerializer(); + return parser.serializeToString(data); + } + + if (this.responseXML) { + return this.responseXML; + } + + parser = new DOMParser(); + return parser.parseFromString(data, "application/xml"); +} diff --git a/lib/utils.js b/lib/utils.js index fffd20b..6b8f257 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -90,3 +90,28 @@ z.fn.each = _each(function each(fn) { fn.call(this, this); return this; }); + +z.queryString = function (obj, prefix) { + var i, key, val, + strings = []; + + for (i in obj) { + if (obj.hasOwnProperty(i)) { + if (prefix) { + key = prefix + "[" + i + "]"; + } else { + key = i; + } + + val = obj[i]; + + if (val && typeof val === "object") { + strings.push(queryString(val, key)); + } else { + strings.push(encodeURIComponent(key) + "=" + encodeURIComponent(val)); + } + } + } + + return strings.join("&"); +}; diff --git a/package.json b/package.json index 24f0a83..df5fd7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "z.js", - "version": "0.0.2", + "version": "0.0.3", "description": "Simple DOM Manipulator", "main": "", "scripts": {