@nota/nativescript-webview-ext
Version:
Extended WebView for NativeScript which adds 'x-local' scheme for local-files. events between WebView and native-layer, javascript execution, injecting CSS and JS-files.
7 lines • 65.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fetchPolyfill = "!function(global,factory){\"object\"==typeof exports&&\"undefined\"!=typeof module?factory(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],factory):factory(global.WHATWGFetch={})}(this,(function(exports){\"use strict\";var support_searchParams=\"URLSearchParams\"in self,support_iterable=\"Symbol\"in self&&\"iterator\"in Symbol,support_blob=\"FileReader\"in self&&\"Blob\"in self&&function(){try{return new Blob,!0}catch(e){return!1}}(),support_formData=\"FormData\"in self,support_arrayBuffer=\"ArrayBuffer\"in self;if(support_arrayBuffer)var viewClasses=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],isArrayBufferView=ArrayBuffer.isView||function(obj){return obj&&viewClasses.indexOf(Object.prototype.toString.call(obj))>-1};function normalizeName(name){if(\"string\"!=typeof name&&(name=String(name)),/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name))throw new TypeError(\"Invalid character in header field name\");return name.toLowerCase()}function normalizeValue(value){return\"string\"!=typeof value&&(value=String(value)),value}function iteratorFor(items){var iterator={next:function(){var value=items.shift();return{done:void 0===value,value:value}}};return support_iterable&&(iterator[Symbol.iterator]=function(){return iterator}),iterator}function Headers(headers){this.map={},headers instanceof Headers?headers.forEach((function(value,name){this.append(name,value)}),this):Array.isArray(headers)?headers.forEach((function(header){this.append(header[0],header[1])}),this):headers&&Object.getOwnPropertyNames(headers).forEach((function(name){this.append(name,headers[name])}),this)}function consumed(body){if(body.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));body.bodyUsed=!0}function fileReaderReady(reader){return new Promise((function(resolve,reject){reader.onload=function(){resolve(reader.result)},reader.onerror=function(){reject(reader.error)}}))}function readBlobAsArrayBuffer(blob){var reader=new FileReader,promise=fileReaderReady(reader);return reader.readAsArrayBuffer(blob),promise}function bufferClone(buf){if(buf.slice)return buf.slice(0);var view=new Uint8Array(buf.byteLength);return view.set(new Uint8Array(buf)),view.buffer}function Body(){return this.bodyUsed=!1,this._initBody=function(body){var obj;this._bodyInit=body,body?\"string\"==typeof body?this._bodyText=body:support_blob&&Blob.prototype.isPrototypeOf(body)?this._bodyBlob=body:support_formData&&FormData.prototype.isPrototypeOf(body)?this._bodyFormData=body:support_searchParams&&URLSearchParams.prototype.isPrototypeOf(body)?this._bodyText=body.toString():support_arrayBuffer&&support_blob&&((obj=body)&&DataView.prototype.isPrototypeOf(obj))?(this._bodyArrayBuffer=bufferClone(body.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):support_arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(body)||isArrayBufferView(body))?this._bodyArrayBuffer=bufferClone(body):this._bodyText=body=Object.prototype.toString.call(body):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof body?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):support_searchParams&&URLSearchParams.prototype.isPrototypeOf(body)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},support_blob&&(this.blob=function(){var rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?consumed(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(readBlobAsArrayBuffer)}),this.text=function(){var blob,reader,promise,rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return blob=this._bodyBlob,reader=new FileReader,promise=fileReaderReady(reader),reader.readAsText(blob),promise;if(this._bodyArrayBuffer)return Promise.resolve(function(buf){for(var view=new Uint8Array(buf),chars=new Array(view.length),i=0;i<view.length;i++)chars[i]=String.fromCharCode(view[i]);return chars.join(\"\")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)},support_formData&&(this.formData=function(){return this.text().then(decode)}),this.json=function(){return this.text().then(JSON.parse)},this}Headers.prototype.append=function(name,value){name=normalizeName(name),value=normalizeValue(value);var oldValue=this.map[name];this.map[name]=oldValue?oldValue+\", \"+value:value},Headers.prototype.delete=function(name){delete this.map[normalizeName(name)]},Headers.prototype.get=function(name){return name=normalizeName(name),this.has(name)?this.map[name]:null},Headers.prototype.has=function(name){return this.map.hasOwnProperty(normalizeName(name))},Headers.prototype.set=function(name,value){this.map[normalizeName(name)]=normalizeValue(value)},Headers.prototype.forEach=function(callback,thisArg){for(var name in this.map)this.map.hasOwnProperty(name)&&callback.call(thisArg,this.map[name],name,this)},Headers.prototype.keys=function(){var items=[];return this.forEach((function(value,name){items.push(name)})),iteratorFor(items)},Headers.prototype.values=function(){var items=[];return this.forEach((function(value){items.push(value)})),iteratorFor(items)},Headers.prototype.entries=function(){var items=[];return this.forEach((function(value,name){items.push([name,value])})),iteratorFor(items)},support_iterable&&(Headers.prototype[Symbol.iterator]=Headers.prototype.entries);var methods=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];function Request(input,options){var method,upcased,body=(options=options||{}).body;if(input instanceof Request){if(input.bodyUsed)throw new TypeError(\"Already read\");this.url=input.url,this.credentials=input.credentials,options.headers||(this.headers=new Headers(input.headers)),this.method=input.method,this.mode=input.mode,this.signal=input.signal,body||null==input._bodyInit||(body=input._bodyInit,input.bodyUsed=!0)}else this.url=String(input);if(this.credentials=options.credentials||this.credentials||\"same-origin\",!options.headers&&this.headers||(this.headers=new Headers(options.headers)),this.method=(method=options.method||this.method||\"GET\",upcased=method.toUpperCase(),methods.indexOf(upcased)>-1?upcased:method),this.mode=options.mode||this.mode||null,this.signal=options.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&body)throw new TypeError(\"Body not allowed for GET or HEAD requests\");this._initBody(body)}function decode(body){var form=new FormData;return body.trim().split(\"&\").forEach((function(bytes){if(bytes){var split=bytes.split(\"=\"),name=split.shift().replace(/\\+/g,\" \"),value=split.join(\"=\").replace(/\\+/g,\" \");form.append(decodeURIComponent(name),decodeURIComponent(value))}})),form}function Response(bodyInit,options){options||(options={}),this.type=\"default\",this.status=void 0===options.status?200:options.status,this.ok=this.status>=200&&this.status<300,this.statusText=\"statusText\"in options?options.statusText:\"OK\",this.headers=new Headers(options.headers),this.url=options.url||\"\",this._initBody(bodyInit)}Request.prototype.clone=function(){return new Request(this,{body:this._bodyInit})},Body.call(Request.prototype),Body.call(Response.prototype),Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})},Response.error=function(){var response=new Response(null,{status:0,statusText:\"\"});return response.type=\"error\",response};var redirectStatuses=[301,302,303,307,308];Response.redirect=function(url,status){if(-1===redirectStatuses.indexOf(status))throw new RangeError(\"Invalid status code\");return new Response(null,{status:status,headers:{location:url}})},exports.DOMException=self.DOMException;try{new exports.DOMException}catch(err){exports.DOMException=function(message,name){this.message=message,this.name=name;var error=Error(message);this.stack=error.stack},exports.DOMException.prototype=Object.create(Error.prototype),exports.DOMException.prototype.constructor=exports.DOMException}function fetch(input,init){return new Promise((function(resolve,reject){var request=new Request(input,init);if(request.signal&&request.signal.aborted)return reject(new exports.DOMException(\"Aborted\",\"AbortError\"));var xhr=new XMLHttpRequest;function abortXhr(){xhr.abort()}xhr.onload=function(){var rawHeaders,headers,options={status:xhr.status,statusText:xhr.statusText,headers:(rawHeaders=xhr.getAllResponseHeaders()||\"\",headers=new Headers,rawHeaders.replace(/\\r?\\n[\\t ]+/g,\" \").split(/\\r?\\n/).forEach((function(line){var parts=line.split(\":\"),key=parts.shift().trim();if(key){var value=parts.join(\":\").trim();headers.append(key,value)}})),headers)};options.url=\"responseURL\"in xhr?xhr.responseURL:options.headers.get(\"X-Request-URL\");var body=\"response\"in xhr?xhr.response:xhr.responseText;resolve(new Response(body,options))},xhr.onerror=function(){reject(new TypeError(\"Network request failed\"))},xhr.ontimeout=function(){reject(new TypeError(\"Network request failed\"))},xhr.onabort=function(){reject(new exports.DOMException(\"Aborted\",\"AbortError\"))},xhr.open(request.method,request.url,!0),\"include\"===request.credentials?xhr.withCredentials=!0:\"omit\"===request.credentials&&(xhr.withCredentials=!1),\"responseType\"in xhr&&support_blob&&(xhr.responseType=\"blob\"),request.headers.forEach((function(value,name){xhr.setRequestHeader(name,value)})),request.signal&&(request.signal.addEventListener(\"abort\",abortXhr),xhr.onreadystatechange=function(){4===xhr.readyState&&request.signal.removeEventListener(\"abort\",abortXhr)}),xhr.send(void 0===request._bodyInit?null:request._bodyInit)}))}fetch.polyfill=!0,self.fetch||(self.fetch=fetch,self.Headers=Headers,self.Request=Request,self.Response=Response),exports.Headers=Headers,exports.Request=Request,exports.Response=Response,exports.fetch=fetch,Object.defineProperty(exports,\"__esModule\",{value:!0})}));";
exports.promisePolyfill = "!function(global,factory){\"object\"==typeof exports&&\"undefined\"!=typeof module?factory():\"function\"==typeof define&&define.amd?define(factory):factory()}(0,(function(){\"use strict\";function finallyConstructor(callback){var constructor=this.constructor;return this.then((function(value){return constructor.resolve(callback()).then((function(){return value}))}),(function(reason){return constructor.resolve(callback()).then((function(){return constructor.reject(reason)}))}))}var setTimeoutFunc=setTimeout;function isArray(x){return Boolean(x&&void 0!==x.length)}function noop(){}function Promise(fn){if(!(this instanceof Promise))throw new TypeError(\"Promises must be constructed via new\");if(\"function\"!=typeof fn)throw new TypeError(\"not a function\");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],doResolve(fn,this)}function handle(self,deferred){for(;3===self._state;)self=self._value;0!==self._state?(self._handled=!0,Promise._immediateFn((function(){var cb=1===self._state?deferred.onFulfilled:deferred.onRejected;if(null!==cb){var ret;try{ret=cb(self._value)}catch(e){return void reject(deferred.promise,e)}resolve(deferred.promise,ret)}else(1===self._state?resolve:reject)(deferred.promise,self._value)}))):self._deferreds.push(deferred)}function resolve(self,newValue){try{if(newValue===self)throw new TypeError(\"A promise cannot be resolved with itself.\");if(newValue&&(\"object\"==typeof newValue||\"function\"==typeof newValue)){var then=newValue.then;if(newValue instanceof Promise)return self._state=3,self._value=newValue,void finale(self);if(\"function\"==typeof then)return void doResolve((fn=then,thisArg=newValue,function(){fn.apply(thisArg,arguments)}),self)}self._state=1,self._value=newValue,finale(self)}catch(e){reject(self,e)}var fn,thisArg}function reject(self,newValue){self._state=2,self._value=newValue,finale(self)}function finale(self){2===self._state&&0===self._deferreds.length&&Promise._immediateFn((function(){self._handled||Promise._unhandledRejectionFn(self._value)}));for(var i=0,len=self._deferreds.length;i<len;i++)handle(self,self._deferreds[i]);self._deferreds=null}function Handler(onFulfilled,onRejected,promise){this.onFulfilled=\"function\"==typeof onFulfilled?onFulfilled:null,this.onRejected=\"function\"==typeof onRejected?onRejected:null,this.promise=promise}function doResolve(fn,self){var done=!1;try{fn((function(value){done||(done=!0,resolve(self,value))}),(function(reason){done||(done=!0,reject(self,reason))}))}catch(ex){if(done)return;done=!0,reject(self,ex)}}Promise.prototype.catch=function(onRejected){return this.then(null,onRejected)},Promise.prototype.then=function(onFulfilled,onRejected){var prom=new this.constructor(noop);return handle(this,new Handler(onFulfilled,onRejected,prom)),prom},Promise.prototype.finally=finallyConstructor,Promise.all=function(arr){return new Promise((function(resolve,reject){if(!isArray(arr))return reject(new TypeError(\"Promise.all accepts an array\"));var args=Array.prototype.slice.call(arr);if(0===args.length)return resolve([]);var remaining=args.length;function res(i,val){try{if(val&&(\"object\"==typeof val||\"function\"==typeof val)){var then=val.then;if(\"function\"==typeof then)return void then.call(val,(function(val){res(i,val)}),reject)}args[i]=val,0==--remaining&&resolve(args)}catch(ex){reject(ex)}}for(var i=0;i<args.length;i++)res(i,args[i])}))},Promise.resolve=function(value){return value&&\"object\"==typeof value&&value.constructor===Promise?value:new Promise((function(resolve){resolve(value)}))},Promise.reject=function(value){return new Promise((function(resolve,reject){reject(value)}))},Promise.race=function(arr){return new Promise((function(resolve,reject){if(!isArray(arr))return reject(new TypeError(\"Promise.race accepts an array\"));for(var i=0,len=arr.length;i<len;i++)Promise.resolve(arr[i]).then(resolve,reject)}))},Promise._immediateFn=\"function\"==typeof setImmediate&&function(fn){setImmediate(fn)}||function(fn){setTimeoutFunc(fn,0)},Promise._unhandledRejectionFn=function(err){\"undefined\"!=typeof console&&console&&console.warn(\"Possible Unhandled Promise Rejection:\",err)};var globalNS=function(){if(\"undefined\"!=typeof self)return self;if(\"undefined\"!=typeof window)return window;if(\"undefined\"!=typeof global)return global;throw new Error(\"unable to locate global object\")}();\"Promise\"in globalNS?globalNS.Promise.prototype.finally||(globalNS.Promise.prototype.finally=finallyConstructor):globalNS.Promise=Promise}));";
exports.webViewBridge = "var e_1,_a,__awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P((function(resolve){resolve(value)}))).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))},__generator=this&&this.__generator||function(thisArg,body){var f,y,t,g,_={label:0,sent:function(){if(1&t[0])throw t[1];return t[1]},trys:[],ops:[]};return g={next:verb(0),throw:verb(1),return:verb(2)},\"function\"==typeof Symbol&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return function(op){if(f)throw new TypeError(\"Generator is already executing.\");for(;_;)try{if(f=1,y&&(t=2&op[0]?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[2&op[0],t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(!(t=_.trys,(t=t.length>0&&t[t.length-1])||6!==op[0]&&2!==op[0])){_=0;continue}if(3===op[0]&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(6===op[0]&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(5&op[0])throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}([n,v])}}},__values=this&&this.__values||function(o){var s=\"function\"==typeof Symbol&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&\"number\"==typeof o.length)return{next:function(){return o&&i>=o.length&&(o=void 0),{value:o&&o[i++],done:!o}}};throw new TypeError(s?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},__read=this&&this.__read||function(o,n){var m=\"function\"==typeof Symbol&&o[Symbol.iterator];if(!m)return o;var r,e,i=m.call(o),ar=[];try{for(;(void 0===n||n-- >0)&&!(r=i.next()).done;)ar.push(r.value)}catch(error){e={error:error}}finally{try{r&&!r.done&&(m=i.return)&&m.call(i)}finally{if(e)throw e.error}}return ar};function getWkWebViewMessageHandler(){var _a,_b,w=window;if(null===(_b=null===(_a=null==w?void 0:w.webkit)||void 0===_a?void 0:_a.messageHandlers)||void 0===_b?void 0:_b.nsBridge)return w.webkit.messageHandlers.nsBridge;console.error(\"Cannot get the window.webkit.messageHandlers.nsBridge - we can't communicate with native-layer\")}Object.keys||(Object.keys=function(){\"use strict\";var hasOwnProperty=Object.prototype.hasOwnProperty,hasDontEnumBug=!{toString:null}.propertyIsEnumerable(\"toString\"),dontEnums=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],dontEnumsLength=dontEnums.length;return function(obj){if(\"function\"!=typeof obj&&(\"object\"!=typeof obj||null===obj))throw new TypeError(\"Object.keys called on non-object\");var result=new Array;for(var prop in obj)hasOwnProperty.call(obj,prop)&&result.push(prop);if(hasDontEnumBug)for(var i=0;i<dontEnumsLength;i++)hasOwnProperty.call(obj,dontEnums[i])&&result.push(dontEnums[i]);return result}}()),Object.entries||(Object.entries=function(obj){for(var ownProps=Object.keys(obj),i=ownProps.length,resArray=new Array(i);i--;)resArray[i]=[ownProps[i],obj[ownProps[i]]];return resArray});var NSWebViewBridge=function(){function NSWebViewBridge(){this.eventListenerMap={}}return Object.defineProperty(NSWebViewBridge.prototype,\"androidWebViewBridge\",{get:function(){if(\"undefined\"!=typeof androidWebViewBridge)return androidWebViewBridge},enumerable:!0,configurable:!0}),NSWebViewBridge.prototype.onNativeEvent=function(eventName,data){var e_2,_a,events=this.eventListenerMap[eventName];if(null==events?void 0:events.length)try{for(var events_1=__values(events),events_1_1=events_1.next();!events_1_1.done;events_1_1=events_1.next()){var listener=events_1_1.value;if(!1===(null==listener?void 0:listener(data)))break}}catch(e_2_1){e_2={error:e_2_1}}finally{try{events_1_1&&!events_1_1.done&&(_a=events_1.return)&&_a.call(events_1)}finally{if(e_2)throw e_2.error}}},NSWebViewBridge.prototype.emitEventToIOS=function(eventName,data){var messageHandler=getWkWebViewMessageHandler();messageHandler?messageHandler.postMessage(JSON.stringify({eventName:eventName,data:data})):console.error(\"NSWebViewBridge cannot emit to UIWebView - no longer supported\")},NSWebViewBridge.prototype.emitEventToAndroid=function(eventName,data){var androidWebViewBridge=this.androidWebViewBridge;androidWebViewBridge?androidWebViewBridge.emitEvent(eventName,data):console.error(\"Tried to emit to android without the androidWebViewBridge\")},NSWebViewBridge.prototype.on=function(eventName,callback){callback&&(this.eventListenerMap[eventName]||(this.eventListenerMap[eventName]=[]),this.eventListenerMap[eventName].push(callback))},NSWebViewBridge.prototype.addEventListener=function(eventName,callback){this.on(eventName,callback)},NSWebViewBridge.prototype.off=function(eventName,callback){eventName?this.eventListenerMap[eventName]&&(callback?(this.eventListenerMap[eventName]=this.eventListenerMap[eventName].filter((function(oldCallback){return oldCallback!==callback})),0===this.eventListenerMap[eventName].length&&delete this.eventListenerMap[eventName]):delete this.eventListenerMap[eventName]):this.eventListenerMap={}},NSWebViewBridge.prototype.removeEventListener=function(eventName,callback){return this.off(eventName,callback)},NSWebViewBridge.prototype.emit=function(eventName,data){this.androidWebViewBridge?this.emitEventToAndroid(eventName,JSON.stringify(data)):this.emitEventToIOS(eventName,data)},NSWebViewBridge.prototype.injectJavaScriptFile=function(href){var _this=this,elId=this.elementIdFromHref(href);return document.getElementById(elId)?(console.log(elId+\" already exists\"),Promise.resolve()):new Promise((function(resolve,reject){var scriptElement=document.createElement(\"script\");scriptElement.async=!0,scriptElement.setAttribute(\"id\",elId),scriptElement.addEventListener(\"error\",(function(error){console.error(\"Failed to load \"+href+\" - error: \"+error),reject(_this.serializeError(error)),scriptElement.parentElement&&scriptElement.parentElement.removeChild(scriptElement)})),scriptElement.addEventListener(\"load\",(function(){console.info(\"Loaded \"+href),window.requestAnimationFrame((function(){resolve()})),scriptElement.parentElement&&scriptElement.parentElement.removeChild(scriptElement)})),scriptElement.src=href,document.body.appendChild(scriptElement)}))},NSWebViewBridge.prototype.injectJavaScript=function(elId,scriptCode){return document.getElementById(elId)?(console.log(elId+\" already exists\"),Promise.resolve()):new Promise((function(resolve,reject){var scriptElement=document.createElement(\"script\");scriptElement.setAttribute(\"id\",elId),scriptElement.addEventListener(\"error\",(function(error){console.error(\"Failed to inject javascript- error: \"+error),reject(error),scriptElement.parentElement&&scriptElement.parentElement.removeChild(scriptElement)})),scriptElement.text=scriptCode,document.body.appendChild(scriptElement),window.requestAnimationFrame((function(){return resolve()}))}))},NSWebViewBridge.prototype.injectStyleSheetFile=function(href,insertBefore){var elId=this.elementIdFromHref(href);return document.getElementById(elId)?(console.log(elId+\" already exists\"),Promise.resolve()):new Promise((function(resolve,reject){var linkElement=document.createElement(\"link\");linkElement.addEventListener(\"error\",(function(error){console.error(\"Failed to load \"+href+\" - error: \"+error),reject(error),linkElement.parentElement&&linkElement.parentElement.removeChild(linkElement)})),linkElement.addEventListener(\"load\",(function(){console.info(\"Loaded \"+href),window.requestAnimationFrame((function(){resolve()}))})),linkElement.setAttribute(\"id\",elId),linkElement.setAttribute(\"rel\",\"stylesheet\"),linkElement.setAttribute(\"type\",\"text/css\"),linkElement.setAttribute(\"href\",href),document.head&&(insertBefore&&document.head.childElementCount>0?document.head.insertBefore(linkElement,document.head.firstElementChild):document.head.appendChild(linkElement))}))},NSWebViewBridge.prototype.injectStyleSheet=function(elId,stylesheet,insertBefore){return document.getElementById(elId)?(console.log(elId+\" already exists\"),Promise.resolve()):new Promise((function(resolve,reject){var _a,styleElement=document.createElement(\"style\");styleElement.addEventListener(\"error\",reject),styleElement.textContent=stylesheet,styleElement.setAttribute(\"id\",elId);var parentElement=null!==(_a=document.head)&&void 0!==_a?_a:document.body;parentElement?(insertBefore&&parentElement.childElementCount>0?document.head.insertBefore(styleElement,parentElement.firstElementChild):document.head.appendChild(styleElement),resolve()):reject(new Error(\"Couldn't find parent element\"))}))},NSWebViewBridge.prototype.executePromise=function(promise,eventName){return __awaiter(this,void 0,void 0,(function(){var data,err_1;return __generator(this,(function(_a){switch(_a.label){case 0:return _a.trys.push([0,2,,3]),[4,promise];case 1:return data=_a.sent(),this.emit(eventName,{data:data}),[3,3];case 2:return err_1=_a.sent(),this.emitError(err_1,eventName),[3,3];case 3:return[2]}}))}))},NSWebViewBridge.prototype.emitError=function(err,eventName){void 0===eventName&&(eventName=\"web-error\"),\"object\"==typeof err&&(null==err?void 0:err.message)?this.emit(eventName,{err:this.serializeError(err)}):this.emit(eventName,{err:err})},NSWebViewBridge.prototype.elementIdFromHref=function(href){return href.replace(/^[:]*:\\/\\//,\"\").replace(/[^a-z0-9]/g,\"\")},NSWebViewBridge.prototype.serializeError=function(error){var e_3,_a,res={name:error.name,message:error.message,stack:error.stack};try{for(var _b=__values(Object.entries(error)),_c=_b.next();!_c.done;_c=_b.next()){var _d=__read(_c.value,2),key=_d[0],value=_d[1];value instanceof HTMLElement||(key in res||(res[key]=value))}}catch(e_3_1){e_3={error:e_3_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_3)throw e_3.error}}return res},NSWebViewBridge}(),nsBridgeReadyEventName=\"ns-bridge-ready\",w=window;if(!w.nsWebViewBridge){w.nsWebViewBridge=new NSWebViewBridge;try{for(var _b=__values([nsBridgeReadyEventName,\"ns-brige-ready\"]),_c=_b.next();!_c.done;_c=_b.next()){var eventName=_c.value;\"undefined\"!=typeof CustomEvent?window.dispatchEvent(new CustomEvent(eventName,{detail:w.nsWebViewBridge})):window.dispatchEvent(new Event(eventName))}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_1)throw e_1.error}}}";
exports.metadataViewPort = "!function(window){var defaultViewPort={initialScale:1},document=window.document,meta=document.querySelector('head meta[name=\"viewport\"]');meta||((meta=document.createElement(\"meta\")).setAttribute(\"name\",\"viewport\"),document.head.appendChild(meta));var viewPortValues=defaultViewPort;var _a=viewPortValues.initialScale,initialScale=void 0===_a?defaultViewPort.initialScale:_a,width=viewPortValues.width,height=viewPortValues.height,userScalable=viewPortValues.userScalable,minimumScale=viewPortValues.minimumScale,maximumScale=viewPortValues.maximumScale,content=[\"initial-scale=\"+initialScale];if(width&&content.push(\"width=\"+width),height&&content.push(\"height=\"+height),\"boolean\"==typeof userScalable)content.push(\"user-scalable=\"+(userScalable?\"yes\":\"no\"));else if(\"string\"==typeof userScalable){var lcUserScalable=(\"\"+userScalable).toLowerCase();\"yes\"===lcUserScalable?content.push(\"user-scalable=yes\"):\"no\"===lcUserScalable?content.push(\"user-scalable=no\"):console.error(\"userScalable=\"+JSON.stringify(userScalable)+\" is an unknown value\")}minimumScale&&content.push(\"minimum-scale=\"+minimumScale),maximumScale&&content.push(\"maximum-scale=\"+maximumScale),meta.setAttribute(\"content\",content.join(\", \"))}(window);";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlc2NyaXB0LXdlYnZpZXctYnJpZGdlLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5hdGl2ZXNjcmlwdC13ZWJ2aWV3LWJyaWRnZS1sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBYSxRQUFBLGFBQWEsR0FBVyxnelVBQWd6VSxDQUFDO0FBQ3owVSxRQUFBLGVBQWUsR0FBVyxvNklBQW82SSxDQUFDO0FBQy83SSxRQUFBLGFBQWEsR0FBVyx3cFZBQXdwVixDQUFDO0FBQ2pyVixRQUFBLGdCQUFnQixHQUFXLGt2Q0FBa3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgZmV0Y2hQb2x5ZmlsbDogc3RyaW5nID0gXCIhZnVuY3Rpb24oZ2xvYmFsLGZhY3Rvcnkpe1xcXCJvYmplY3RcXFwiPT10eXBlb2YgZXhwb3J0cyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBtb2R1bGU/ZmFjdG9yeShleHBvcnRzKTpcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXFxcImV4cG9ydHNcXFwiXSxmYWN0b3J5KTpmYWN0b3J5KGdsb2JhbC5XSEFUV0dGZXRjaD17fSl9KHRoaXMsKGZ1bmN0aW9uKGV4cG9ydHMpe1xcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgc3VwcG9ydF9zZWFyY2hQYXJhbXM9XFxcIlVSTFNlYXJjaFBhcmFtc1xcXCJpbiBzZWxmLHN1cHBvcnRfaXRlcmFibGU9XFxcIlN5bWJvbFxcXCJpbiBzZWxmJiZcXFwiaXRlcmF0b3JcXFwiaW4gU3ltYm9sLHN1cHBvcnRfYmxvYj1cXFwiRmlsZVJlYWRlclxcXCJpbiBzZWxmJiZcXFwiQmxvYlxcXCJpbiBzZWxmJiZmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEJsb2IsITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLHN1cHBvcnRfZm9ybURhdGE9XFxcIkZvcm1EYXRhXFxcImluIHNlbGYsc3VwcG9ydF9hcnJheUJ1ZmZlcj1cXFwiQXJyYXlCdWZmZXJcXFwiaW4gc2VsZjtpZihzdXBwb3J0X2FycmF5QnVmZmVyKXZhciB2aWV3Q2xhc3Nlcz1bXFxcIltvYmplY3QgSW50OEFycmF5XVxcXCIsXFxcIltvYmplY3QgVWludDhBcnJheV1cXFwiLFxcXCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XVxcXCIsXFxcIltvYmplY3QgSW50MTZBcnJheV1cXFwiLFxcXCJbb2JqZWN0IFVpbnQxNkFycmF5XVxcXCIsXFxcIltvYmplY3QgSW50MzJBcnJheV1cXFwiLFxcXCJbb2JqZWN0IFVpbnQzMkFycmF5XVxcXCIsXFxcIltvYmplY3QgRmxvYXQzMkFycmF5XVxcXCIsXFxcIltvYmplY3QgRmxvYXQ2NEFycmF5XVxcXCJdLGlzQXJyYXlCdWZmZXJWaWV3PUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZ2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKT4tMX07ZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKXtpZihcXFwic3RyaW5nXFxcIiE9dHlwZW9mIG5hbWUmJihuYW1lPVN0cmluZyhuYW1lKSksL1teYS16MC05XFxcXC0jJCUmJyorLl5fYHx+XS9pLnRlc3QobmFtZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcXFwiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWVcXFwiKTtyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKXtyZXR1cm5cXFwic3RyaW5nXFxcIiE9dHlwZW9mIHZhbHVlJiYodmFsdWU9U3RyaW5nKHZhbHVlKSksdmFsdWV9ZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpe3ZhciBpdGVyYXRvcj17bmV4dDpmdW5jdGlvbigpe3ZhciB2YWx1ZT1pdGVtcy5zaGlmdCgpO3JldHVybntkb25lOnZvaWQgMD09PXZhbHVlLHZhbHVlOnZhbHVlfX19O3JldHVybiBzdXBwb3J0X2l0ZXJhYmxlJiYoaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBpdGVyYXRvcn0pLGl0ZXJhdG9yfWZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycyl7dGhpcy5tYXA9e30saGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnM/aGVhZGVycy5mb3JFYWNoKChmdW5jdGlvbih2YWx1ZSxuYW1lKXt0aGlzLmFwcGVuZChuYW1lLHZhbHVlKX0pLHRoaXMpOkFycmF5LmlzQXJyYXkoaGVhZGVycyk/aGVhZGVycy5mb3JFYWNoKChmdW5jdGlvbihoZWFkZXIpe3RoaXMuYXBwZW5kKGhlYWRlclswXSxoZWFkZXJbMV0pfSksdGhpcyk6aGVhZGVycyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaCgoZnVuY3Rpb24obmFtZSl7dGhpcy5hcHBlbmQobmFtZSxoZWFkZXJzW25hbWVdKX0pLHRoaXMpfWZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpe2lmKGJvZHkuYm9keVVzZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoXFxcIkFscmVhZHkgcmVhZFxcXCIpKTtib2R5LmJvZHlVc2VkPSEwfWZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3JlYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXtyZXNvbHZlKHJlYWRlci5yZXN1bHQpfSxyZWFkZXIub25lcnJvcj1mdW5jdGlvbigpe3JlamVjdChyZWFkZXIuZXJyb3IpfX0pKX1mdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYil7dmFyIHJlYWRlcj1uZXcgRmlsZVJlYWRlcixwcm9taXNlPWZpbGVSZWFkZXJSZWFkeShyZWFkZXIpO3JldHVybiByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYikscHJvbWlzZX1mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpe2lmKGJ1Zi5zbGljZSlyZXR1cm4gYnVmLnNsaWNlKDApO3ZhciB2aWV3PW5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKTtyZXR1cm4gdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSksdmlldy5idWZmZXJ9ZnVuY3Rpb24gQm9keSgpe3JldHVybiB0aGlzLmJvZHlVc2VkPSExLHRoaXMuX2luaXRCb2R5PWZ1bmN0aW9uKGJvZHkpe3ZhciBvYmo7dGhpcy5fYm9keUluaXQ9Ym9keSxib2R5P1xcXCJzdHJpbmdcXFwiPT10eXBlb2YgYm9keT90aGlzLl9ib2R5VGV4dD1ib2R5OnN1cHBvcnRfYmxvYiYmQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KT90aGlzLl9ib2R5QmxvYj1ib2R5OnN1cHBvcnRfZm9ybURhdGEmJkZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpP3RoaXMuX2JvZHlGb3JtRGF0YT1ib2R5OnN1cHBvcnRfc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSk/dGhpcy5fYm9keVRleHQ9Ym9keS50b1N0cmluZygpOnN1cHBvcnRfYXJyYXlCdWZmZXImJnN1cHBvcnRfYmxvYiYmKChvYmo9Ym9keSkmJkRhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iaikpPyh0aGlzLl9ib2R5QXJyYXlCdWZmZXI9YnVmZmVyQ2xvbmUoYm9keS5idWZmZXIpLHRoaXMuX2JvZHlJbml0PW5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk6c3VwcG9ydF9hcnJheUJ1ZmZlciYmKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpfHxpc0FycmF5QnVmZmVyVmlldyhib2R5KSk/dGhpcy5fYm9keUFycmF5QnVmZmVyPWJ1ZmZlckNsb25lKGJvZHkpOnRoaXMuX2JvZHlUZXh0PWJvZHk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpOnRoaXMuX2JvZHlUZXh0PVxcXCJcXFwiLHRoaXMuaGVhZGVycy5nZXQoXFxcImNvbnRlbnQtdHlwZVxcXCIpfHwoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBib2R5P3RoaXMuaGVhZGVycy5zZXQoXFxcImNvbnRlbnQtdHlwZVxcXCIsXFxcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFxcXCIpOnRoaXMuX2JvZHlCbG9iJiZ0aGlzLl9ib2R5QmxvYi50eXBlP3RoaXMuaGVhZGVycy5zZXQoXFxcImNvbnRlbnQtdHlwZVxcXCIsdGhpcy5fYm9keUJsb2IudHlwZSk6c3VwcG9ydF9zZWFyY2hQYXJhbXMmJlVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSYmdGhpcy5oZWFkZXJzLnNldChcXFwiY29udGVudC10eXBlXFxcIixcXFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLThcXFwiKSl9LHN1cHBvcnRfYmxvYiYmKHRoaXMuYmxvYj1mdW5jdGlvbigpe3ZhciByZWplY3RlZD1jb25zdW1lZCh0aGlzKTtpZihyZWplY3RlZClyZXR1cm4gcmVqZWN0ZWQ7aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYik7aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKFxcXCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2JcXFwiKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKX0sdGhpcy5hcnJheUJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib2R5QXJyYXlCdWZmZXI/Y29uc3VtZWQodGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpOnRoaXMuYmxvYigpLnRoZW4ocmVhZEJsb2JBc0FycmF5QnVmZmVyKX0pLHRoaXMudGV4dD1mdW5jdGlvbigpe3ZhciBibG9iLHJlYWRlcixwcm9taXNlLHJlamVjdGVkPWNvbnN1bWVkKHRoaXMpO2lmKHJlamVjdGVkKXJldHVybiByZWplY3RlZDtpZih0aGlzLl9ib2R5QmxvYilyZXR1cm4gYmxvYj10aGlzLl9ib2R5QmxvYixyZWFkZXI9bmV3IEZpbGVSZWFkZXIscHJvbWlzZT1maWxlUmVhZGVyUmVhZHkocmVhZGVyKSxyZWFkZXIucmVhZEFzVGV4dChibG9iKSxwcm9taXNlO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZ1bmN0aW9uKGJ1Zil7Zm9yKHZhciB2aWV3PW5ldyBVaW50OEFycmF5KGJ1ZiksY2hhcnM9bmV3IEFycmF5KHZpZXcubGVuZ3RoKSxpPTA7aTx2aWV3Lmxlbmd0aDtpKyspY2hhcnNbaV09U3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKTtyZXR1cm4gY2hhcnMuam9pbihcXFwiXFxcIil9KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpO2lmKHRoaXMuX2JvZHlGb3JtRGF0YSl0aHJvdyBuZXcgRXJyb3IoXFxcImNvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dFxcXCIpO3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpfSxzdXBwb3J0X2Zvcm1EYXRhJiYodGhpcy5mb3JtRGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSl9KSx0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX0sdGhpc31IZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obmFtZSx2YWx1ZSl7bmFtZT1ub3JtYWxpemVOYW1lKG5hbWUpLHZhbHVlPW5vcm1hbGl6ZVZhbHVlKHZhbHVlKTt2YXIgb2xkVmFsdWU9dGhpcy5tYXBbbmFtZV07dGhpcy5tYXBbbmFtZV09b2xkVmFsdWU/b2xkVmFsdWUrXFxcIiwgXFxcIit2YWx1ZTp2YWx1ZX0sSGVhZGVycy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG5hbWUpe2RlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXX0sSGVhZGVycy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG5hbWUpe3JldHVybiBuYW1lPW5vcm1hbGl6ZU5hbWUobmFtZSksdGhpcy5oYXMobmFtZSk/dGhpcy5tYXBbbmFtZV06bnVsbH0sSGVhZGVycy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG5hbWUpe3JldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKX0sSGVhZGVycy5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG5hbWUsdmFsdWUpe3RoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldPW5vcm1hbGl6ZVZhbHVlKHZhbHVlKX0sSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihjYWxsYmFjayx0aGlzQXJnKXtmb3IodmFyIG5hbWUgaW4gdGhpcy5tYXApdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkmJmNhbGxiYWNrLmNhbGwodGhpc0FyZyx0aGlzLm1hcFtuYW1lXSxuYW1lLHRoaXMpfSxIZWFkZXJzLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7dmFyIGl0ZW1zPVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKHZhbHVlLG5hbWUpe2l0ZW1zLnB1c2gobmFtZSl9KSksaXRlcmF0b3JGb3IoaXRlbXMpfSxIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgaXRlbXM9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24odmFsdWUpe2l0ZW1zLnB1c2godmFsdWUpfSkpLGl0ZXJhdG9yRm9yKGl0ZW1zKX0sSGVhZGVycy5wcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3ZhciBpdGVtcz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChmdW5jdGlvbih2YWx1ZSxuYW1lKXtpdGVtcy5wdXNoKFtuYW1lLHZhbHVlXSl9KSksaXRlcmF0b3JGb3IoaXRlbXMpfSxzdXBwb3J0X2l0ZXJhYmxlJiYoSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzKTt2YXIgbWV0aG9kcz1bXFxcIkRFTEVURVxcXCIsXFxcIkdFVFxcXCIsXFxcIkhFQURcXFwiLFxcXCJPUFRJT05TXFxcIixcXFwiUE9TVFxcXCIsXFxcIlBVVFxcXCJdO2Z1bmN0aW9uIFJlcXVlc3QoaW5wdXQsb3B0aW9ucyl7dmFyIG1ldGhvZCx1cGNhc2VkLGJvZHk9KG9wdGlvbnM9b3B0aW9uc3x8e30pLmJvZHk7aWYoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KXtpZihpbnB1dC5ib2R5VXNlZCl0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJBbHJlYWR5IHJlYWRcXFwiKTt0aGlzLnVybD1pbnB1dC51cmwsdGhpcy5jcmVkZW50aWFscz1pbnB1dC5jcmVkZW50aWFscyxvcHRpb25zLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycykpLHRoaXMubWV0aG9kPWlucHV0Lm1ldGhvZCx0aGlzLm1vZGU9aW5wdXQubW9kZSx0aGlzLnNpZ25hbD1pbnB1dC5zaWduYWwsYm9keXx8bnVsbD09aW5wdXQuX2JvZHlJbml0fHwoYm9keT1pbnB1dC5fYm9keUluaXQsaW5wdXQuYm9keVVzZWQ9ITApfWVsc2UgdGhpcy51cmw9U3RyaW5nKGlucHV0KTtpZih0aGlzLmNyZWRlbnRpYWxzPW9wdGlvbnMuY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHN8fFxcXCJzYW1lLW9yaWdpblxcXCIsIW9wdGlvbnMuaGVhZGVycyYmdGhpcy5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycykpLHRoaXMubWV0aG9kPShtZXRob2Q9b3B0aW9ucy5tZXRob2R8fHRoaXMubWV0aG9kfHxcXFwiR0VUXFxcIix1cGNhc2VkPW1ldGhvZC50b1VwcGVyQ2FzZSgpLG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKT4tMT91cGNhc2VkOm1ldGhvZCksdGhpcy5tb2RlPW9wdGlvbnMubW9kZXx8dGhpcy5tb2RlfHxudWxsLHRoaXMuc2lnbmFsPW9wdGlvbnMuc2lnbmFsfHx0aGlzLnNpZ25hbCx0aGlzLnJlZmVycmVyPW51bGwsKFxcXCJHRVRcXFwiPT09dGhpcy5tZXRob2R8fFxcXCJIRUFEXFxcIj09PXRoaXMubWV0aG9kKSYmYm9keSl0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJCb2R5IG5vdCBhbGxvd2VkIGZvciBHRVQgb3IgSEVBRCByZXF1ZXN0c1xcXCIpO3RoaXMuX2luaXRCb2R5KGJvZHkpfWZ1bmN0aW9uIGRlY29kZShib2R5KXt2YXIgZm9ybT1uZXcgRm9ybURhdGE7cmV0dXJuIGJvZHkudHJpbSgpLnNwbGl0KFxcXCImXFxcIikuZm9yRWFjaCgoZnVuY3Rpb24oYnl0ZXMpe2lmKGJ5dGVzKXt2YXIgc3BsaXQ9Ynl0ZXMuc3BsaXQoXFxcIj1cXFwiKSxuYW1lPXNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFxcXCsvZyxcXFwiIFxcXCIpLHZhbHVlPXNwbGl0LmpvaW4oXFxcIj1cXFwiKS5yZXBsYWNlKC9cXFxcKy9nLFxcXCIgXFxcIik7Zm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpfX0pKSxmb3JtfWZ1bmN0aW9uIFJlc3BvbnNlKGJvZHlJbml0LG9wdGlvbnMpe29wdGlvbnN8fChvcHRpb25zPXt9KSx0aGlzLnR5cGU9XFxcImRlZmF1bHRcXFwiLHRoaXMuc3RhdHVzPXZvaWQgMD09PW9wdGlvbnMuc3RhdHVzPzIwMDpvcHRpb25zLnN0YXR1cyx0aGlzLm9rPXRoaXMuc3RhdHVzPj0yMDAmJnRoaXMuc3RhdHVzPDMwMCx0aGlzLnN0YXR1c1RleHQ9XFxcInN0YXR1c1RleHRcXFwiaW4gb3B0aW9ucz9vcHRpb25zLnN0YXR1c1RleHQ6XFxcIk9LXFxcIix0aGlzLmhlYWRlcnM9bmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKSx0aGlzLnVybD1vcHRpb25zLnVybHx8XFxcIlxcXCIsdGhpcy5faW5pdEJvZHkoYm9keUluaXQpfVJlcXVlc3QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMse2JvZHk6dGhpcy5fYm9keUluaXR9KX0sQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKSxCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKSxSZXNwb25zZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LHtzdGF0dXM6dGhpcy5zdGF0dXMsc3RhdHVzVGV4dDp0aGlzLnN0YXR1c1RleHQsaGVhZGVyczpuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLHVybDp0aGlzLnVybH0pfSxSZXNwb25zZS5lcnJvcj1mdW5jdGlvbigpe3ZhciByZXNwb25zZT1uZXcgUmVzcG9uc2UobnVsbCx7c3RhdHVzOjAsc3RhdHVzVGV4dDpcXFwiXFxcIn0pO3JldHVybiByZXNwb25zZS50eXBlPVxcXCJlcnJvclxcXCIscmVzcG9uc2V9O3ZhciByZWRpcmVjdFN0YXR1c2VzPVszMDEsMzAyLDMwMywzMDcsMzA4XTtSZXNwb25zZS5yZWRpcmVjdD1mdW5jdGlvbih1cmwsc3RhdHVzKXtpZigtMT09PXJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpKXRocm93IG5ldyBSYW5nZUVycm9yKFxcXCJJbnZhbGlkIHN0YXR1cyBjb2RlXFxcIik7cmV0dXJuIG5ldyBSZXNwb25zZShudWxsLHtzdGF0dXM6c3RhdHVzLGhlYWRlcnM6e2xvY2F0aW9uOnVybH19KX0sZXhwb3J0cy5ET01FeGNlcHRpb249c2VsZi5ET01FeGNlcHRpb247dHJ5e25ldyBleHBvcnRzLkRPTUV4Y2VwdGlvbn1jYXRjaChlcnIpe2V4cG9ydHMuRE9NRXhjZXB0aW9uPWZ1bmN0aW9uKG1lc3NhZ2UsbmFtZSl7dGhpcy5tZXNzYWdlPW1lc3NhZ2UsdGhpcy5uYW1lPW5hbWU7dmFyIGVycm9yPUVycm9yKG1lc3NhZ2UpO3RoaXMuc3RhY2s9ZXJyb3Iuc3RhY2t9LGV4cG9ydHMuRE9NRXhjZXB0aW9uLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksZXhwb3J0cy5ET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV4cG9ydHMuRE9NRXhjZXB0aW9ufWZ1bmN0aW9uIGZldGNoKGlucHV0LGluaXQpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3ZhciByZXF1ZXN0PW5ldyBSZXF1ZXN0KGlucHV0LGluaXQpO2lmKHJlcXVlc3Quc2lnbmFsJiZyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKXJldHVybiByZWplY3QobmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKFxcXCJBYm9ydGVkXFxcIixcXFwiQWJvcnRFcnJvclxcXCIpKTt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDtmdW5jdGlvbiBhYm9ydFhocigpe3hoci5hYm9ydCgpfXhoci5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgcmF3SGVhZGVycyxoZWFkZXJzLG9wdGlvbnM9e3N0YXR1czp4aHIuc3RhdHVzLHN0YXR1c1RleHQ6eGhyLnN0YXR1c1RleHQsaGVhZGVyczoocmF3SGVhZGVycz14aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl8fFxcXCJcXFwiLGhlYWRlcnM9bmV3IEhlYWRlcnMscmF3SGVhZGVycy5yZXBsYWNlKC9cXFxccj9cXFxcbltcXFxcdCBdKy9nLFxcXCIgXFxcIikuc3BsaXQoL1xcXFxyP1xcXFxuLykuZm9yRWFjaCgoZnVuY3Rpb24obGluZSl7dmFyIHBhcnRzPWxpbmUuc3BsaXQoXFxcIjpcXFwiKSxrZXk9cGFydHMuc2hpZnQoKS50cmltKCk7aWYoa2V5KXt2YXIgdmFsdWU9cGFydHMuam9pbihcXFwiOlxcXCIpLnRyaW0oKTtoZWFkZXJzLmFwcGVuZChrZXksdmFsdWUpfX0pKSxoZWFkZXJzKX07b3B0aW9ucy51cmw9XFxcInJlc3BvbnNlVVJMXFxcImluIHhocj94aHIucmVzcG9uc2VVUkw6b3B0aW9ucy5oZWFkZXJzLmdldChcXFwiWC1SZXF1ZXN0LVVSTFxcXCIpO3ZhciBib2R5PVxcXCJyZXNwb25zZVxcXCJpbiB4aHI/eGhyLnJlc3BvbnNlOnhoci5yZXNwb25zZVRleHQ7cmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSxvcHRpb25zKSl9LHhoci5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBUeXBlRXJyb3IoXFxcIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWRcXFwiKSl9LHhoci5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXtyZWplY3QobmV3IFR5cGVFcnJvcihcXFwiTmV0d29yayByZXF1ZXN0IGZhaWxlZFxcXCIpKX0seGhyLm9uYWJvcnQ9ZnVuY3Rpb24oKXtyZWplY3QobmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKFxcXCJBYm9ydGVkXFxcIixcXFwiQWJvcnRFcnJvclxcXCIpKX0seGhyLm9wZW4ocmVxdWVzdC5tZXRob2QscmVxdWVzdC51cmwsITApLFxcXCJpbmNsdWRlXFxcIj09PXJlcXVlc3QuY3JlZGVudGlhbHM/eGhyLndpdGhDcmVkZW50aWFscz0hMDpcXFwib21pdFxcXCI9PT1yZXF1ZXN0LmNyZWRlbnRpYWxzJiYoeGhyLndpdGhDcmVkZW50aWFscz0hMSksXFxcInJlc3BvbnNlVHlwZVxcXCJpbiB4aHImJnN1cHBvcnRfYmxvYiYmKHhoci5yZXNwb25zZVR5cGU9XFxcImJsb2JcXFwiKSxyZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaCgoZnVuY3Rpb24odmFsdWUsbmFtZSl7eGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSx2YWx1ZSl9KSkscmVxdWVzdC5zaWduYWwmJihyZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxcXCJhYm9ydFxcXCIsYWJvcnRYaHIpLHhoci5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09eGhyLnJlYWR5U3RhdGUmJnJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXFxcImFib3J0XFxcIixhYm9ydFhocil9KSx4aHIuc2VuZCh2b2lkIDA9PT1yZXF1ZXN0Ll9ib2R5SW5pdD9udWxsOnJlcXVlc3QuX2JvZHlJbml0KX0pKX1mZXRjaC5wb2x5ZmlsbD0hMCxzZWxmLmZldGNofHwoc2VsZi5mZXRjaD1mZXRjaCxzZWxmLkhlYWRlcnM9SGVhZGVycyxzZWxmLlJlcXVlc3Q9UmVxdWVzdCxzZWxmLlJlc3BvbnNlPVJlc3BvbnNlKSxleHBvcnRzLkhlYWRlcnM9SGVhZGVycyxleHBvcnRzLlJlcXVlc3Q9UmVxdWVzdCxleHBvcnRzLlJlc3BvbnNlPVJlc3BvbnNlLGV4cG9ydHMuZmV0Y2g9ZmV0Y2gsT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXFxcIl9fZXNNb2R1bGVcXFwiLHt2YWx1ZTohMH0pfSkpO1wiO1xuZXhwb3J0IGNvbnN0IHByb21pc2VQb2x5ZmlsbDogc3RyaW5nID0gXCIhZnVuY3Rpb24oZ2xvYmFsLGZhY3Rvcnkpe1xcXCJvYmplY3RcXFwiPT10eXBlb2YgZXhwb3J0cyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBtb2R1bGU/ZmFjdG9yeSgpOlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGZhY3RvcnkpOmZhY3RvcnkoKX0oMCwoZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7ZnVuY3Rpb24gZmluYWxseUNvbnN0cnVjdG9yKGNhbGxiYWNrKXt2YXIgY29uc3RydWN0b3I9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGNvbnN0cnVjdG9yLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gdmFsdWV9KSl9KSwoZnVuY3Rpb24ocmVhc29uKXtyZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBjb25zdHJ1Y3Rvci5yZWplY3QocmVhc29uKX0pKX0pKX12YXIgc2V0VGltZW91dEZ1bmM9c2V0VGltZW91dDtmdW5jdGlvbiBpc0FycmF5KHgpe3JldHVybiBCb29sZWFuKHgmJnZvaWQgMCE9PXgubGVuZ3RoKX1mdW5jdGlvbiBub29wKCl7fWZ1bmN0aW9uIFByb21pc2UoZm4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIFByb21pc2UpKXRocm93IG5ldyBUeXBlRXJyb3IoXFxcIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ld1xcXCIpO2lmKFxcXCJmdW5jdGlvblxcXCIhPXR5cGVvZiBmbil0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJub3QgYSBmdW5jdGlvblxcXCIpO3RoaXMuX3N0YXRlPTAsdGhpcy5faGFuZGxlZD0hMSx0aGlzLl92YWx1ZT12b2lkIDAsdGhpcy5fZGVmZXJyZWRzPVtdLGRvUmVzb2x2ZShmbix0aGlzKX1mdW5jdGlvbiBoYW5kbGUoc2VsZixkZWZlcnJlZCl7Zm9yKDszPT09c2VsZi5fc3RhdGU7KXNlbGY9c2VsZi5fdmFsdWU7MCE9PXNlbGYuX3N0YXRlPyhzZWxmLl9oYW5kbGVkPSEwLFByb21pc2UuX2ltbWVkaWF0ZUZuKChmdW5jdGlvbigpe3ZhciBjYj0xPT09c2VsZi5fc3RhdGU/ZGVmZXJyZWQub25GdWxmaWxsZWQ6ZGVmZXJyZWQub25SZWplY3RlZDtpZihudWxsIT09Y2Ipe3ZhciByZXQ7dHJ5e3JldD1jYihzZWxmLl92YWx1ZSl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgcmVqZWN0KGRlZmVycmVkLnByb21pc2UsZSl9cmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLHJldCl9ZWxzZSgxPT09c2VsZi5fc3RhdGU/cmVzb2x2ZTpyZWplY3QpKGRlZmVycmVkLnByb21pc2Usc2VsZi5fdmFsdWUpfSkpKTpzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCl9ZnVuY3Rpb24gcmVzb2x2ZShzZWxmLG5ld1ZhbHVlKXt0cnl7aWYobmV3VmFsdWU9PT1zZWxmKXRocm93IG5ldyBUeXBlRXJyb3IoXFxcIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuXFxcIik7aWYobmV3VmFsdWUmJihcXFwib2JqZWN0XFxcIj09dHlwZW9mIG5ld1ZhbHVlfHxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgbmV3VmFsdWUpKXt2YXIgdGhlbj1uZXdWYWx1ZS50aGVuO2lmKG5ld1ZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSlyZXR1cm4gc2VsZi5fc3RhdGU9MyxzZWxmLl92YWx1ZT1uZXdWYWx1ZSx2b2lkIGZpbmFsZShzZWxmKTtpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgdGhlbilyZXR1cm4gdm9pZCBkb1Jlc29sdmUoKGZuPXRoZW4sdGhpc0FyZz1uZXdWYWx1ZSxmdW5jdGlvbigpe2ZuLmFwcGx5KHRoaXNBcmcsYXJndW1lbnRzKX0pLHNlbGYpfXNlbGYuX3N0YXRlPTEsc2VsZi5fdmFsdWU9bmV3VmFsdWUsZmluYWxlKHNlbGYpfWNhdGNoKGUpe3JlamVjdChzZWxmLGUpfXZhciBmbix0aGlzQXJnfWZ1bmN0aW9uIHJlamVjdChzZWxmLG5ld1ZhbHVlKXtzZWxmLl9zdGF0ZT0yLHNlbGYuX3ZhbHVlPW5ld1ZhbHVlLGZpbmFsZShzZWxmKX1mdW5jdGlvbiBmaW5hbGUoc2VsZil7Mj09PXNlbGYuX3N0YXRlJiYwPT09c2VsZi5fZGVmZXJyZWRzLmxlbmd0aCYmUHJvbWlzZS5faW1tZWRpYXRlRm4oKGZ1bmN0aW9uKCl7c2VsZi5faGFuZGxlZHx8UHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oc2VsZi5fdmFsdWUpfSkpO2Zvcih2YXIgaT0wLGxlbj1zZWxmLl9kZWZlcnJlZHMubGVuZ3RoO2k8bGVuO2krKyloYW5kbGUoc2VsZixzZWxmLl9kZWZlcnJlZHNbaV0pO3NlbGYuX2RlZmVycmVkcz1udWxsfWZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsb25SZWplY3RlZCxwcm9taXNlKXt0aGlzLm9uRnVsZmlsbGVkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBvbkZ1bGZpbGxlZD9vbkZ1bGZpbGxlZDpudWxsLHRoaXMub25SZWplY3RlZD1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygb25SZWplY3RlZD9vblJlamVjdGVkOm51bGwsdGhpcy5wcm9taXNlPXByb21pc2V9ZnVuY3Rpb24gZG9SZXNvbHZlKGZuLHNlbGYpe3ZhciBkb25lPSExO3RyeXtmbigoZnVuY3Rpb24odmFsdWUpe2RvbmV8fChkb25lPSEwLHJlc29sdmUoc2VsZix2YWx1ZSkpfSksKGZ1bmN0aW9uKHJlYXNvbil7ZG9uZXx8KGRvbmU9ITAscmVqZWN0KHNlbGYscmVhc29uKSl9KSl9Y2F0Y2goZXgpe2lmKGRvbmUpcmV0dXJuO2RvbmU9ITAscmVqZWN0KHNlbGYsZXgpfX1Qcm9taXNlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihvblJlamVjdGVkKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsb25SZWplY3RlZCl9LFByb21pc2UucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24ob25GdWxmaWxsZWQsb25SZWplY3RlZCl7dmFyIHByb209bmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7cmV0dXJuIGhhbmRsZSh0aGlzLG5ldyBIYW5kbGVyKG9uRnVsZmlsbGVkLG9uUmVqZWN0ZWQscHJvbSkpLHByb219LFByb21pc2UucHJvdG90eXBlLmZpbmFsbHk9ZmluYWxseUNvbnN0cnVjdG9yLFByb21pc2UuYWxsPWZ1bmN0aW9uKGFycil7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7aWYoIWlzQXJyYXkoYXJyKSlyZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoXFxcIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXlcXFwiKSk7dmFyIGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtpZigwPT09YXJncy5sZW5ndGgpcmV0dXJuIHJlc29sdmUoW10pO3ZhciByZW1haW5pbmc9YXJncy5sZW5ndGg7ZnVuY3Rpb24gcmVzKGksdmFsKXt0cnl7aWYodmFsJiYoXFxcIm9iamVjdFxcXCI9PXR5cGVvZiB2YWx8fFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiB2YWwpKXt2YXIgdGhlbj12YWwudGhlbjtpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgdGhlbilyZXR1cm4gdm9pZCB0aGVuLmNhbGwodmFsLChmdW5jdGlvbih2YWwpe3JlcyhpLHZhbCl9KSxyZWplY3QpfWFyZ3NbaV09dmFsLDA9PS0tcmVtYWluaW5nJiZyZXNvbHZlKGFyZ3MpfWNhdGNoKGV4KXtyZWplY3QoZXgpfX1mb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKylyZXMoaSxhcmdzW2ldKX0pKX0sUHJvbWlzZS5yZXNvbHZlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWUmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgdmFsdWUmJnZhbHVlLmNvbnN0cnVjdG9yPT09UHJvbWlzZT92YWx1ZTpuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSl7cmVzb2x2ZSh2YWx1ZSl9KSl9LFByb21pc2UucmVqZWN0PWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWplY3QodmFsdWUpfSkpfSxQcm9taXNlLnJhY2U9ZnVuY3Rpb24oYXJyKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtpZighaXNBcnJheShhcnIpKXJldHVybiByZWplY3QobmV3IFR5cGVFcnJvcihcXFwiUHJvbWlzZS5yYWNlIGFjY2VwdHMgYW4gYXJyYXlcXFwiKSk7Zm9yKHZhciBpPTAsbGVuPWFyci5sZW5ndGg7aTxsZW47aSsrKVByb21pc2UucmVzb2x2ZShhcnJbaV0pLnRoZW4ocmVzb2x2ZSxyZWplY3QpfSkpfSxQcm9taXNlLl9pbW1lZGlhdGVGbj1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihmbil7c2V0SW1tZWRpYXRlKGZuKX18fGZ1bmN0aW9uKGZuKXtzZXRUaW1lb3V0RnVuYyhmbiwwKX0sUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm49ZnVuY3Rpb24oZXJyKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUmJmNvbnNvbGUud2FybihcXFwiUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOlxcXCIsZXJyKX07dmFyIGdsb2JhbE5TPWZ1bmN0aW9uKCl7aWYoXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBzZWxmKXJldHVybiBzZWxmO2lmKFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3c7aWYoXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBnbG9iYWwpcmV0dXJuIGdsb2JhbDt0aHJvdyBuZXcgRXJyb3IoXFxcInVuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdFxcXCIpfSgpO1xcXCJQcm9taXNlXFxcImluIGdsb2JhbE5TP2dsb2JhbE5TLlByb21pc2UucHJvdG90eXBlLmZpbmFsbHl8fChnbG9iYWxOUy5Qcm9taXNlLnByb3RvdHlwZS5maW5hbGx5PWZpbmFsbHlDb25zdHJ1Y3Rvcik6Z2xvYmFsTlMuUHJvbWlzZT1Qcm9taXNlfSkpO1wiO1xuZXhwb3J0IGNvbnN0IHdlYlZpZXdCcmlkZ2U6IHN0cmluZyA9IFwidmFyIGVfMSxfYSxfX2F3YWl0ZXI9dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKHRoaXNBcmcsX2FyZ3VtZW50cyxQLGdlbmVyYXRvcil7cmV0dXJuIG5ldyhQfHwoUD1Qcm9taXNlKSkoKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpe3RyeXtzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSl9Y2F0Y2goZSl7cmVqZWN0KGUpfX1mdW5jdGlvbiByZWplY3RlZCh2YWx1ZSl7dHJ5e3N0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSl9Y2F0Y2goZSl7cmVqZWN0KGUpfX1mdW5jdGlvbiBzdGVwKHJlc3VsdCl7dmFyIHZhbHVlO3Jlc3VsdC5kb25lP3Jlc29sdmUocmVzdWx0LnZhbHVlKToodmFsdWU9cmVzdWx0LnZhbHVlLHZhbHVlIGluc3RhbmNlb2YgUD92YWx1ZTpuZXcgUCgoZnVuY3Rpb24ocmVzb2x2ZSl7cmVzb2x2ZSh2YWx1ZSl9KSkpLnRoZW4oZnVsZmlsbGVkLHJlamVjdGVkKX1zdGVwKChnZW5lcmF0b3I9Z2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsX2FyZ3VtZW50c3x8W10pKS5uZXh0KCkpfSkpfSxfX2dlbmVyYXRvcj10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbih0aGlzQXJnLGJvZHkpe3ZhciBmLHksdCxnLF89e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmdFswXSl0aHJvdyB0WzFdO3JldHVybiB0WzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIGc9e25leHQ6dmVyYigwKSx0aHJvdzp2ZXJiKDEpLHJldHVybjp2ZXJiKDIpfSxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgU3ltYm9sJiYoZ1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxnO2Z1bmN0aW9uIHZlcmIobil7cmV0dXJuIGZ1bmN0aW9uKHYpe3JldHVybiBmdW5jdGlvbihvcCl7aWYoZil0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXFxcIik7Zm