@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.
284 lines • 33.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var fs = require("tns-core-modules/file-system");
var UIWebViewDelegateImpl = (function (_super) {
__extends(UIWebViewDelegateImpl, _super);
function UIWebViewDelegateImpl() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.uiWebViewJSNavigation = false;
return _this;
}
UIWebViewDelegateImpl.initWithOwner = function (owner) {
var delegate = UIWebViewDelegateImpl.new();
delegate.owner = owner;
return delegate;
};
UIWebViewDelegateImpl.prototype.webViewShouldStartLoadWithRequestNavigationType = function (webView, request, navigationType) {
var owner = this.owner.get();
if (!owner) {
return true;
}
if (!request.URL) {
return true;
}
var httpMethod = request.HTTPMethod;
var navType = "other";
switch (navigationType) {
case 0: {
navType = "linkClicked";
break;
}
case 1: {
navType = "formSubmitted";
break;
}
case 2: {
navType = "backForward";
break;
}
case 3: {
navType = "reload";
break;
}
case 4: {
navType = "formResubmitted";
break;
}
default: {
navType = "other";
break;
}
}
var url = request.URL.absoluteString;
owner.writeTrace("UIWebViewDelegateClass.webViewShouldStartLoadWithRequestNavigationType(\"" + url + "\", \"" + navigationType + "\")");
if (url.startsWith("js2ios:")) {
owner.writeTrace("UIWebViewDelegateClass.webViewShouldStartLoadWithRequestNavigationType(\"" + url + "\", \"" + navigationType + "\") -> onUIWebViewEvent");
owner.onUIWebViewEvent(url);
return false;
}
var shouldOverrideUrlLoading = owner._onShouldOverrideUrlLoading(url, httpMethod, navType);
if (shouldOverrideUrlLoading === true) {
owner.writeTrace("UIWebViewDelegateClass.webViewShouldStartLoadWithRequestNavigationType(\"" + url + "\", \"" + navigationType + "\") - cancel");
return false;
}
owner._onLoadStarted(url, navType);
return true;
};
UIWebViewDelegateImpl.prototype.webViewDidStartLoad = function (webView) {
var owner = this.owner.get();
if (!owner) {
return;
}
owner.writeTrace("UIWebViewDelegateClass.webViewDidStartLoad(\"" + webView.request.URL + "\")");
};
UIWebViewDelegateImpl.prototype.webViewDidFinishLoad = function (webView) {
var owner = this.owner.get();
if (!owner) {
return;
}
owner.writeTrace("UIWebViewDelegateClass.webViewDidFinishLoad(\"" + webView.request.URL + "\")");
var src = owner.src;
if (webView.request && webView.request.URL) {
src = webView.request.URL.absoluteString;
}
owner._onLoadFinished(src).catch(function () { return void 0; });
};
UIWebViewDelegateImpl.prototype.webViewDidFailLoadWithError = function (webView, error) {
var owner = this.owner.get();
if (!owner) {
return;
}
var src = owner.src;
if (webView.request && webView.request.URL) {
src = webView.request.URL.absoluteString;
}
owner.writeTrace("UIWebViewDelegateClass.webViewDidFailLoadWithError(\"" + error.localizedDescription + "\") url: \"" + src + "\"");
owner._onLoadFinished(src, error.localizedDescription).catch(function () { return void 0; });
};
UIWebViewDelegateImpl.ObjCProtocols = [UIWebViewDelegate];
return UIWebViewDelegateImpl;
}(NSObject));
exports.UIWebViewDelegateImpl = UIWebViewDelegateImpl;
var registeredCustomNSURLProtocol = false;
var UIWebViewWrapper = (function () {
function UIWebViewWrapper(owner) {
this.shouldInjectWebViewBridge = true;
this.owner = new WeakRef(owner);
}
Object.defineProperty(UIWebViewWrapper.prototype, "ios", {
get: function () {
var owner = this.owner.get();
return owner && owner.ios;
},
enumerable: true,
configurable: true
});
Object.defineProperty(UIWebViewWrapper.prototype, "autoInjectJSBridge", {
get: function () {
var owner = this.owner.get();
return owner && owner.autoInjectJSBridge;
},
enumerable: true,
configurable: true
});
UIWebViewWrapper.prototype.createNativeView = function () {
if (!registeredCustomNSURLProtocol) {
NSURLProtocol.registerClass(CustomNSURLProtocol);
registeredCustomNSURLProtocol = true;
}
var uiWebView = UIWebView.new();
uiWebView.scalesPageToFit = false;
return uiWebView;
};
UIWebViewWrapper.prototype.initNativeView = function () {
this.uiWebViewDelegate = UIWebViewDelegateImpl.initWithOwner(this.owner);
};
UIWebViewWrapper.prototype.disposeNativeView = function () {
this.uiWebViewDelegate = null;
};
UIWebViewWrapper.prototype.onLoaded = function () {
var ios = this.ios;
if (!ios) {
return;
}
ios.delegate = this.uiWebViewDelegate;
};
UIWebViewWrapper.prototype.onUnloaded = function () {
var ios = this.ios;
if (!ios) {
return;
}
ios.delegate = null;
};
UIWebViewWrapper.prototype.stopLoading = function () {
var ios = this.ios;
if (!ios) {
return;
}
ios.stopLoading();
};
UIWebViewWrapper.prototype.loadUrl = function (src) {
var owner = this.owner.get();
var ios = this.ios;
if (!owner || !ios) {
return;
}
if (src.startsWith(owner.interceptScheme)) {
var tmpSrc = owner.getRegisteredLocalResource(src);
if (!tmpSrc) {
owner._onLoadFinished(src, "x-local not found");
return;
}
src = tmpSrc;
}
var nsURL = NSURL.URLWithString(src);
var nsRequestWithUrl = NSURLRequest.requestWithURL(nsURL);
owner.writeTrace("UIWebViewWrapper.loadUrl(\"" + src + "\") -> this.ios.loadRequest(\"" + nsRequestWithUrl + "\"");
ios.loadRequest(nsRequestWithUrl);
};
UIWebViewWrapper.prototype.registerLocalResourceForNative = function (resourceName, filepath) {
CustomNSURLProtocol.registerLocalResourceForKeyFilepath(resourceName, filepath);
};
UIWebViewWrapper.prototype.unregisterLocalResourceForNative = function (resourceName) {
CustomNSURLProtocol.unregisterLocalResourceForKey(resourceName);
};
UIWebViewWrapper.prototype.getRegisteredLocalResourceFromNative = function (resourceName) {
return CustomNSURLProtocol.getRegisteredLocalResourceForKey(resourceName);
};
UIWebViewWrapper.prototype.loadData = function (content) {
var owner = this.owner.get();
var ios = this.ios;
if (!owner || !ios) {
return;
}
var baseUrl = "file:///" + fs.knownFolders.currentApp().path + "/";
var nsBaseUrl = NSURL.URLWithString(baseUrl);
owner.writeTrace("UIWebViewWrapper.loadUrl(content) -> this.ios.loadHTMLStringBaseURL(\"" + nsBaseUrl + "\")");
ios.loadHTMLStringBaseURL(content, nsBaseUrl);
};
Object.defineProperty(UIWebViewWrapper.prototype, "canGoBack", {
get: function () {
var ios = this.ios;
return ios && !!ios.canGoBack;
},
enumerable: true,
configurable: true
});
Object.defineProperty(UIWebViewWrapper.prototype, "canGoForward", {
get: function () {
var ios = this.ios;
return ios && !!ios.canGoForward;
},
enumerable: true,
configurable: true
});
UIWebViewWrapper.prototype.goBack = function () {
var ios = this.ios;
if (!ios) {
return;
}
ios.goBack();
};
UIWebViewWrapper.prototype.goForward = function () {
var ios = this.ios;
if (!ios) {
return;
}
ios.goForward();
};
UIWebViewWrapper.prototype.reload = function () {
var ios = this.ios;
if (!ios) {
return;
}
ios.reload();
};
UIWebViewWrapper.prototype.executeJavaScript = function (scriptCode) {
var ios = this.ios;
if (!ios) {
return Promise.reject(new Error("WebView is missing"));
}
try {
var result = ios.stringByEvaluatingJavaScriptFromString(scriptCode);
return Promise.resolve(result);
}
catch (error) {
return Promise.reject(error);
}
};
UIWebViewWrapper.prototype.autoLoadStyleSheetFile = function () {
throw new Error("autoLoadStyleSheetFile could not be called on UIWebView");
};
UIWebViewWrapper.prototype.removeAutoLoadStyleSheetFile = function () {
throw new Error("removeAutoLoadStyleSheetFile could not be called on UIWebView");
};
UIWebViewWrapper.prototype.autoLoadJavaScriptFile = function () {
throw new Error("removeAutoLoadJavaScriptFile could not be called on UIWebView");
};
UIWebViewWrapper.prototype.removeAutoLoadJavaScriptFile = function () {
throw new Error("removeAutoLoadJavaScriptFile could not be called on UIWebView");
};
UIWebViewWrapper.prototype.enableAutoInject = function (enable) {
};
Object.defineProperty(UIWebViewWrapper.prototype, "scrollBounce", {
get: function () {
var ios = this.ios;
if (!ios) {
return false;
}
return ios.scrollView.bounces;
},
set: function (enable) {
var ios = this.ios;
if (!ios) {
return;
}
ios.scrollView.bounces = !!enable;
},
enumerable: true,
configurable: true
});
return UIWebViewWrapper;
}());
exports.UIWebViewWrapper = UIWebViewWrapper;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vidmlldy1leHQudWl3ZWJ2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2Vidmlldy1leHQudWl3ZWJ2aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsaURBQW1EO0FBR25EO0lBQTJDLHlDQUFRO0lBQW5EO1FBQUEscUVBOEdDO1FBdkNVLDJCQUFxQixHQUFHLEtBQUssQ0FBQzs7SUF1Q3pDLENBQUM7SUF6R2lCLG1DQUFhLEdBQTNCLFVBQTRCLEtBQThCO1FBQ3RELElBQU0sUUFBUSxHQUEwQixxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwRSxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN2QixPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRU0sK0VBQStDLEdBQXRELFVBQXVELE9BQWtCLEVBQUUsT0FBcUIsRUFBRSxjQUFzQjtRQUNwSCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUV0QyxJQUFJLE9BQU8sR0FBbUIsT0FBTyxDQUFDO1FBRXRDLFFBQVEsY0FBYyxFQUFFO1lBQ3BCLE1BQXdDLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxHQUFHLGFBQWEsQ0FBQztnQkFDeEIsTUFBTTthQUNUO1lBQ0QsTUFBMEMsQ0FBQyxDQUFDO2dCQUN4QyxPQUFPLEdBQUcsZUFBZSxDQUFDO2dCQUMxQixNQUFNO2FBQ1Q7WUFDRCxNQUF3QyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sR0FBRyxhQUFhLENBQUM7Z0JBQ3hCLE1BQU07YUFDVDtZQUNELE1BQW1DLENBQUMsQ0FBQztnQkFDakMs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LEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEMsQ0FBQzs7O09BQUE7SUFVTCx1QkFBQztBQUFELENBQUMsQUEzTUQsSUEyTUM7QUEzTVksNENBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vbm9kZV9tb2R1bGVzL3Rucy1wbGF0Zm9ybS1kZWNsYXJhdGlvbnMvaW9zLmQudHNcIiAvPlxuXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwidG5zLWNvcmUtbW9kdWxlcy9maWxlLXN5c3RlbVwiO1xuaW1wb3J0IHsgSU9TV2ViVmlld1dyYXBwZXIsIE5hdmlnYXRpb25UeXBlLCBXZWJWaWV3RXh0QmFzZSB9IGZyb20gXCIuL3dlYnZpZXctZXh0LWNvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgVUlXZWJWaWV3RGVsZWdhdGVJbXBsIGV4dGVuZHMgTlNPYmplY3QgaW1wbGVtZW50cyBVSVdlYlZpZXdEZWxlZ2F0ZSB7XG4gICAgcHVibGljIHN0YXRpYyBPYmpDUHJvdG9jb2xzID0gW1VJV2ViVmlld0RlbGVnYXRlXTtcblxuICAgIHByaXZhdGUgb3duZXI6IFdlYWtSZWY8V2ViVmlld0V4dEJhc2U+O1xuXG4gICAgcHVibGljIHN0YXRpYyBpbml0V2l0aE93bmVyKG93bmVyOiBXZWFrUmVmPFdlYlZpZXdFeHRCYXNlPik6IFVJV2ViVmlld0RlbGVnYXRlSW1wbCB7XG4gICAgICAgIGNvbnN0IGRlbGVnYXRlID0gPFVJV2ViVmlld0RlbGVnYXRlSW1wbD5VSVdlYlZpZXdEZWxlZ2F0ZUltcGwubmV3KCk7XG4gICAgICAgIGRlbGVnYXRlLm93bmVyID0gb3duZXI7XG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2ViVmlld1Nob3VsZFN0YXJ0TG9hZFdpdGhSZXF1ZXN0TmF2aWdhdGlvblR5cGUod2ViVmlldzogVUlXZWJWaWV3LCByZXF1ZXN0OiBOU1VSTFJlcXVlc3QsIG5hdmlnYXRpb25UeXBlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgb3duZXIgPSB0aGlzLm93bmVyLmdldCgpO1xuICAgICAgICBpZiAoIW93bmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVxdWVzdC5VUkwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHR0cE1ldGhvZCA9IHJlcXVlc3QuSFRUUE1ldGhvZDtcblxuICAgICAgICBsZXQgbmF2VHlwZTogTmF2aWdhdGlvblR5cGUgPSBcIm90aGVyXCI7XG5cbiAgICAgICAgc3dpdGNoIChuYXZpZ2F0aW9uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBVSVdlYlZpZXdOYXZpZ2F0aW9uVHlwZS5MaW5rQ2xpY2tlZDoge1xuICAgICAgICAgICAgICAgIG5hdlR5cGUgPSBcImxpbmtDbGlja2VkXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJV2ViVmlld05hdmlnYXRpb25UeXBlLkZvcm1TdWJtaXR0ZWQ6IHtcbiAgICAgICAgICAgICAgICBuYXZUeXBlID0gXCJmb3JtU3VibWl0dGVkXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJV2ViVmlld05hdmlnYXRpb25UeXBlLkJhY2tGb3J3YXJkOiB7XG4gICAgICAgICAgICAgICAgbmF2VHlwZSA9IFwiYmFja0ZvcndhcmRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlXZWJWaWV3TmF2aWdhdGlvblR5cGUuUmVsb2FkOiB7XG4gICAgICAgICAgICAgICAgbmF2VHlwZSA9IFwicmVsb2FkXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJV2ViVmlld05hdmlnYXRpb25UeXBlLkZvcm1SZXN1Ym1pdHRlZDoge1xuICAgICAgICAgICAgICAgIG5hdlR5cGUgPSBcImZvcm1SZXN1Ym1pdHRlZFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIG5hdlR5cGUgPSBcIm90aGVyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LlVSTC5hYnNvbHV0ZVN0cmluZztcbiAgICAgICAgb3duZXIud3JpdGVUcmFjZShgVUlXZWJWaWV3RGVsZWdhdGVDbGFzcy53ZWJWaWV3U2hvdWxkU3RhcnRMb2FkV2l0aFJlcXVlc3ROYXZpZ2F0aW9uVHlwZShcIiR7dXJsfVwiLCBcIiR7bmF2aWdhdGlvblR5cGV9XCIpYCk7XG4gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImpzMmlvczpcIikpIHtcbiAgICAgICAgICAgIG93bmVyLndyaXRlVHJhY2UoYFVJV2ViVmlld0RlbGVnYXRlQ2xhc3Mud2ViVmlld1Nob3VsZFN0YXJ0TG9hZFdpdGhSZXF1ZXN0TmF2aWdhdGlvblR5cGUoXCIke3VybH1cIiwgXCIke25hdmlnYXRpb25UeXBlfVwiKSAtPiBvblVJV2ViVmlld0V2ZW50YCk7XG4gICAgICAgICAgICBvd25lci5vblVJV2ViVmlld0V2ZW50KHVybCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaG91bGRPdmVycmlkZVVybExvYWRpbmcgPSBvd25lci5fb25TaG91bGRPdmVycmlkZVVybExvYWRpbmcodXJsLCBodHRwTWV0aG9kLCBuYXZUeXBlKTtcbiAgICAgICAgaWYgKHNob3VsZE92ZXJyaWRlVXJsTG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgb3duZXIud3JpdGVUcmFjZShgVUlXZWJWaWV3RGVsZWdhdGVDbGFzcy53ZWJWaWV3U2hvdWxkU3RhcnRMb2FkV2l0aFJlcXVlc3ROYXZpZ2F0aW9uVHlwZShcIiR7dXJsfVwiLCBcIiR7bmF2aWdhdGlvblR5cGV9XCIpIC0gY2FuY2VsYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBvd25lci5fb25Mb2FkU3RhcnRlZCh1cmwsIG5hdlR5cGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyB1aVdlYlZpZXdKU05hdmlnYXRpb24gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB3ZWJWaWV3RGlkU3RhcnRMb2FkKHdlYlZpZXc6IFVJV2ViVmlldykge1xuICAgICAgICBjb25zdCBvd25lciA9IHRoaXMub3duZXIuZ2V0KCk7XG4gICAgICAgIGlmICghb3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG93bmVyLndyaXRlVHJhY2UoYFVJV2ViVmlld0RlbGVnYXRlQ2xhc3Mud2ViVmlld0RpZFN0YXJ0TG9hZChcIiR7d2ViVmlldy5yZXF1ZXN0LlVSTH1cIilgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2ViVmlld0RpZEZpbmlzaExvYWQod2ViVmlldzogVUlXZWJWaWV3KSB7XG4gICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5vd25lci5nZXQoKTtcbiAgICAgICAgaWYgKCFvd25lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3duZXIud3JpdGVUcmFjZShgVUlXZWJWaWV3RGVsZWdhdGVDbGFzcy53ZWJWaWV3RGlkRmluaXNoTG9hZChcIiR7d2ViVmlldy5yZXF1ZXN0LlVSTH1cIilgKTtcbiAgICAgICAgbGV0IHNyYyA9IG93bmVyLnNyYztcbiAgICAgICAgaWYgKHdlYlZpZXcucmVxdWVzdCAmJiB3ZWJWaWV3LnJlcXVlc3QuVVJMKSB7XG4gICAgICAgICAgICBzcmMgPSB3ZWJWaWV3LnJlcXVlc3QuVVJMLmFic29sdXRlU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG93bmVyLl9vbkxvYWRGaW5pc2hlZChzcmMpLmNhdGNoKCgpID0+IHZvaWQgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdlYlZpZXdEaWRGYWlsTG9hZFdpdGhFcnJvcih3ZWJWaWV3OiBVSVdlYlZpZXcsIGVycm9yOiBOU0Vycm9yKSB7XG4gICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5vd25lci5nZXQoKTtcbiAgICAgICAgaWYgKCFvd25lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNyYyA9IG93bmVyLnNyYztcbiAgICAgICAgaWYgKHdlYlZpZXcucmVxdWVzdCAmJiB3ZWJWaWV3LnJlcXVlc3QuVVJMKSB7XG4gICAgICAgICAgICBzcmMgPSB3ZWJWaWV3LnJlcXVlc3QuVVJMLmFic29sdXRlU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgb3duZXIud3JpdGVUcmFjZShgVUlXZWJWaWV3RGVsZWdhdGVDbGFzcy53ZWJWaWV3RGlkRmFpbExvYWRXaXRoRXJyb3IoXCIke2Vycm9yLmxvY2FsaXplZERlc2NyaXB0aW9ufVwiKSB1cmw6IFwiJHtzcmN9XCJgKTtcbiAgICAgICAgb3duZXIuX29uTG9hZEZpbmlzaGVkKHNyYywgZXJyb3IubG9jYWxpemVkRGVzY3JpcHRpb24pLmNhdGNoKCgpID0+IHZvaWQgMCk7XG4gICAgfVxufVxuXG5sZXQgcmVnaXN0ZXJlZEN1c3RvbU5TVVJMUHJvdG9jb2wgPSBmYWxzZTtcbmV4cG9ydCBjbGFzcyBVSVdlYlZpZXdXcmFwcGVyIGltcGxlbWVudHMgSU9TV2ViVmlld1dyYXBwZXIge1xuICAgIHB1YmxpYyBvd25lcjogV2Vha1JlZjxXZWJWaWV3RXh0QmFzZT47XG4gICAgcHVibGljIGdldCBpb3MoKTogVUlXZWJWaWV3IHwgdm9pZCB7XG4gICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5vd25lci5nZXQoKTtcbiAgICAgICAgcmV0dXJuIG93bmVyICYmIG93bmVyLmlvcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdWlXZWJWaWV3RGVsZWdhdGU6IFVJV2ViVmlld0RlbGVnYXRlSW1wbDtcblxuICAgIHB1YmxpYyByZWFkb25seSBzaG91bGRJbmplY3RXZWJWaWV3QnJpZGdlID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBnZXQgYXV0b0luamVjdEpTQnJpZGdlKCkge1xuICAgICAgICBjb25zdCBvd25lciA9IHRoaXMub3duZXIuZ2V0KCk7XG4gICAgICAgIHJldHVybiBvd25lciAmJiBvd25lci5hdXRvSW5qZWN0SlNCcmlkZ2U7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Iob3duZXI6IFdlYlZpZXdFeHRCYXNlKSB7XG4gICAgICAgIHRoaXMub3duZXIgPSBuZXcgV2Vha1JlZihvd25lcik7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZU5hdGl2ZVZpZXcoKSB7XG4gICAgICAgIGlmICghcmVnaXN0ZXJlZEN1c3RvbU5TVVJMUHJvdG9jb2wpIHtcbiAgICAgICAgICAgIE5TVVJMUHJvdG9jb2wucmVnaXN0ZXJDbGFzcyhDdXN0b21OU1VSTFByb3RvY29sIGFzIGFueSk7XG4gICAgICAgICAgICByZWdpc3RlcmVkQ3VzdG9tTlNVUkxQcm90b2NvbCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1aVdlYlZpZXcgPSBVSVdlYlZpZXcubmV3KCk7XG4gICAgICAgIHVpV2ViVmlldy5zY2FsZXNQYWdlVG9GaXQgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdWlXZWJWaWV3O1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0TmF0aXZlVmlldygpIHtcbiAgICAgICAgdGhpcy51aVdlYlZpZXdEZWxlZ2F0ZSA9IFVJV2ViVmlld0RlbGVnYXRlSW1wbC5pbml0V2l0aE93bmVyKHRoaXMub3duZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlTmF0aXZlVmlldygpIHtcbiAgICAgICAgdGhpcy51aVdlYlZpZXdEZWxlZ2F0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTG9hZGVkKCkge1xuICAgICAgICBjb25zdCBpb3MgPSB0aGlzLmlvcztcbiAgICAgICAgaWYgKCFpb3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlvcy5kZWxlZ2F0ZSA9IHRoaXMudWlXZWJWaWV3RGVsZWdhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVW5sb2FkZWQoKSB7XG4gICAgICAgIGNvbnN0IGlvcyA9IHRoaXMuaW9zO1xuICAgICAgICBpZiAoIWlvcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW9zLmRlbGVnYXRlID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcExvYWRpbmcoKSB7XG4gICAgICAgIGNvbnN0IGlvcyA9IHRoaXMuaW9zO1xuICAgICAgICBpZiAoIWlvcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW9zLnN0b3BMb2FkaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRVcmwoc3JjOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb3duZXIgPSB0aGlzLm93bmVyLmdldCgpO1xuICAgICAgICBjb25zdCBpb3MgPSB0aGlzLmlvcztcbiAgICAgICAgaWYgKCFvd25lciB8fCAhaW9zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3JjLnN0YXJ0c1dpdGgob3duZXIuaW50ZXJjZXB0U2NoZW1lKSkge1xuICAgICAgICAgICAgY29uc3QgdG1wU3JjID0gb3duZXIuZ2V0UmVnaXN0ZXJlZExvY2FsUmVzb3VyY2Uoc3JjKTtcbiAgICAgICAgICAgIGlmICghdG1wU3JjKSB7XG4gICAgICAgICAgICAgICAgb3duZXIuX29uTG9hZEZpbmlzaGVkKHNyYywgXCJ4LWxvY2FsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNyYyA9IHRtcFNyYztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5zVVJMID0gTlNVUkwuVVJMV2l0aFN0cmluZyhzcmMpO1xuICAgICAgICBjb25zdCBuc1JlcXVlc3RXaXRoVXJsID0gTlNVUkxSZXF1ZXN0LnJlcXVlc3RXaXRoVVJMKG5zVVJMKTtcbiAgICAgICAgb3duZXIud3JpdGVUcmFjZShgVUlXZWJWaWV3V3JhcHBlci5sb2FkVXJsKFwiJHtzcmN9XCIpIC0+IHRoaXMuaW9zLmxvYWRSZXF1ZXN0KFwiJHtuc1JlcXVlc3RXaXRoVXJsfVwiYCk7XG4gICAgICAgIGlvcy5sb2FkUmVxdWVzdChuc1JlcXVlc3RXaXRoVXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJMb2NhbFJlc291cmNlRm9yTmF0aXZlKHJlc291cmNlTmFtZTogc3RyaW5nLCBmaWxlcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIEN1c3RvbU5TVVJMUHJvdG9jb2wucmVnaXN0ZXJMb2NhbFJlc291cmNlRm9yS2V5RmlsZXBhdGgocmVzb3VyY2VOYW1lLCBmaWxlcGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHVucmVnaXN0ZXJMb2NhbFJlc291cmNlRm9yTmF0aXZlKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIEN1c3RvbU5TVVJMUHJvdG9jb2wudW5yZWdpc3RlckxvY2FsUmVzb3VyY2VGb3JLZXkocmVzb3VyY2VOYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVnaXN0ZXJlZExvY2FsUmVzb3VyY2VGcm9tTmF0aXZlKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBDdXN0b21OU1VSTFByb3RvY29sLmdldFJlZ2lzdGVyZWRMb2NhbFJlc291cmNlRm9yS2V5KHJlc291cmNlTmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWREYXRhKGNvbnRlbnQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBvd25lciA9IHRoaXMub3duZXIuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGlvcyA9IHRoaXMuaW9zO1xuICAgICAgICBpZiAoIW93bmVyIHx8ICFpb3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBgZmlsZTovLy8ke2ZzLmtub3duRm9sZGVycy5jdXJyZW50QXBwKCkucGF0aH0vYDtcbiAgICAgICAgY29uc3QgbnNCYXNlVXJsID0gTlNVUkwuVVJMV2l0aFN0cmluZyhiYXNlVXJsKTtcblxuICAgICAgICBvd25lci53cml0ZVRyYWNlKGBVSVdlYlZpZXdXcmFwcGVyLmxvYWRVcmwoY29udGVudCkgLT4gdGhpcy5pb3MubG9hZEhUTUxTdHJpbmdCYXNlVVJMKFwiJHtuc0Jhc2VVcmx9XCIpYCk7XG4gICAgICAgIGlvcy5sb2FkSFRNTFN0cmluZ0Jhc2VVUkwoY29udGVudCwgbnNCYXNlVXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNhbkdvQmFjaygpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW9zID0gdGhpcy5pb3M7XG4gICAgICAgIHJldHVybiBpb3MgJiYgISFpb3MuY2FuR29CYWNrO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2FuR29Gb3J3YXJkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpb3MgPSB0aGlzLmlvcztcbiAgICAgICAgcmV0dXJuIGlvcyAmJiAhIWlvcy5jYW5Hb0ZvcndhcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdvQmFjaygpIHtcbiAgICAgICAgY29uc3QgaW9zID0gdGhpcy5pb3M7XG4gICAgICAgIGlmICghaW9zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW9zLmdvQmFjaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnb0ZvcndhcmQoKSB7XG4gICAgICAgIGNvbnN0IGlvcyA9IHRoaXMuaW9zO1xuICAgICAgICBpZiAoIWlvcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW9zLmdvRm9yd2FyZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxvYWQoKSB7XG4gICAgICAgIGNvbnN0IGlvcyA9IHRoaXMuaW9zO1xuICAgICAgICBpZiAoIWlvcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW9zLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleGVjdXRlSmF2YVNjcmlwdChzY3JpcHRDb2RlOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBpb3MgPSB0aGlzLmlvcztcbiAgICAgICAgaWYgKCFpb3MpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXZWJWaWV3IGlzIG1pc3NpbmdcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGlvcy5zdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0RnJvbVN0cmluZyhzY3JpcHRDb2RlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXV0b0xvYWRTdHlsZVNoZWV0RmlsZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0b0xvYWRTdHlsZVNoZWV0RmlsZSBjb3VsZCBub3QgYmUgY2FsbGVkIG9uIFVJV2ViVmlld1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQXV0b0xvYWRTdHlsZVNoZWV0RmlsZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVtb3ZlQXV0b0xvYWRTdHlsZVNoZWV0RmlsZSBjb3VsZCBub3QgYmUgY2FsbGVkIG9uIFVJV2ViVmlld1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXV0b0xvYWRKYXZhU2NyaXB0RmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVtb3ZlQXV0b0xvYWRKYXZhU2NyaXB0RmlsZSBjb3VsZCBub3QgYmUgY2FsbGVkIG9uIFVJV2ViVmlld1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQXV0b0xvYWRKYXZhU2NyaXB0RmlsZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVtb3ZlQXV0b0xvYWRKYXZhU2NyaXB0RmlsZSBjb3VsZCBub3QgYmUgY2FsbGVkIG9uIFVJV2ViVmlld1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5hYmxlQXV0b0luamVjdChlbmFibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gRHVtbXlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNjcm9sbEJvdW5jZShlbmFibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgaW9zID0gdGhpcy5pb3M7XG4gICAgICAgIGlmICghaW9zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpb3Muc2Nyb2xsVmlldy5ib3VuY2VzID0gISFlbmFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzY3JvbGxCb3VuY2UoKSB7XG4gICAgICAgIGNvbnN0IGlvcyA9IHRoaXMuaW9zO1xuICAgICAgICBpZiAoIWlvcykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlvcy5zY3JvbGxWaWV3LmJvdW5jZXM7XG4gICAgfVxufVxuIl19