1 Star 0 Fork 56

jinzhexian / vr-stream-web-player

forked from lhbxxx / vr-stream-web-player 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
'derequire 57.58 KB
一键复制 编辑 原始数据 按行查看 历史
jinzhexian 提交于 2020-09-07 10:47 . VR 调试
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.WebVRManager = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
/*
* Copyright 2015 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var Emitter = require('./emitter.js');
var Modes = require('./modes.js');
var Util = require('./util.js');
/**
* Everything having to do with the WebVR button.
* Emits a 'click' event when it's clicked.
*/
function ButtonManager(opt_root) {
var root = opt_root || document.body;
this.loadIcons_();
// Make the fullscreen button.
var fsButton = this.createButton();
fsButton.src = this.ICONS.fullscreen;
fsButton.title = 'Fullscreen mode';
var s = fsButton.style;
s.bottom = 0;
s.right = 0;
fsButton.addEventListener('click', this.createClickHandler_('fs'));
root.appendChild(fsButton);
this.fsButton = fsButton;
// Make the VR button.
var vrButton = this.createButton();
vrButton.src = this.ICONS.cardboard;
vrButton.title = 'Virtual reality mode';
var s = vrButton.style;
s.bottom = 0;
s.right = '48px';
vrButton.addEventListener('click', this.createClickHandler_('vr'));
root.appendChild(vrButton);
this.vrButton = vrButton;
this.isVisible = true;
}
ButtonManager.prototype = new Emitter();
ButtonManager.prototype.createButton = function() {
var button = document.createElement('img');
button.className = 'webvr-button';
var s = button.style;
s.position = 'absolute';
s.width = '24px'
s.height = '24px';
s.backgroundSize = 'cover';
s.backgroundColor = 'transparent';
s.border = 0;
s.userSelect = 'none';
s.webkitUserSelect = 'none';
s.MozUserSelect = 'none';
s.cursor = 'pointer';
s.padding = '12px';
s.zIndex = 1;
s.display = 'none';
s.boxSizing = 'content-box';
// Prevent button from being selected and dragged.
button.draggable = false;
button.addEventListener('dragstart', function(e) {
e.preventDefault();
});
// Style it on hover.
button.addEventListener('mouseenter', function(e) {
s.filter = s.webkitFilter = 'drop-shadow(0 0 5px rgba(255,255,255,1))';
});
button.addEventListener('mouseleave', function(e) {
s.filter = s.webkitFilter = '';
});
return button;
};
ButtonManager.prototype.setMode = function(mode, isVRCompatible) {
isVRCompatible = isVRCompatible || WebVRConfig.FORCE_ENABLE_VR;
if (!this.isVisible) {
return;
}
switch (mode) {
case Modes.NORMAL:
this.fsButton.style.display = 'block';
this.fsButton.src = this.ICONS.fullscreen;
this.vrButton.style.display = (isVRCompatible ? 'block' : 'none');
break;
case Modes.MAGIC_WINDOW:
this.fsButton.style.display = 'block';
this.fsButton.src = this.ICONS.exitFullscreen;
this.vrButton.style.display = 'none';
break;
case Modes.VR:
this.fsButton.style.display = 'none';
this.vrButton.style.display = 'none';
break;
}
// Hack for Safari Mac/iOS to force relayout (svg-specific issue)
// http://goo.gl/hjgR6r
var oldValue = this.fsButton.style.display;
this.fsButton.style.display = 'inline-block';
this.fsButton.offsetHeight;
this.fsButton.style.display = oldValue;
};
ButtonManager.prototype.setVisibility = function(isVisible) {
this.isVisible = isVisible;
this.fsButton.style.display = isVisible ? 'block' : 'none';
this.vrButton.style.display = isVisible ? 'block' : 'none';
};
ButtonManager.prototype.createClickHandler_ = function(eventName) {
return function(e) {
e.stopPropagation();
e.preventDefault();
this.emit(eventName);
}.bind(this);
};
ButtonManager.prototype.loadIcons_ = function() {
// Preload some hard-coded SVG.
this.ICONS = {};
this.ICONS.cardboard = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMjAuNzQgNkgzLjIxQzIuNTUgNiAyIDYuNTcgMiA3LjI4djEwLjQ0YzAgLjcuNTUgMS4yOCAxLjIzIDEuMjhoNC43OWMuNTIgMCAuOTYtLjMzIDEuMTQtLjc5bDEuNC0zLjQ4Yy4yMy0uNTkuNzktMS4wMSAxLjQ0LTEuMDFzMS4yMS40MiAxLjQ1IDEuMDFsMS4zOSAzLjQ4Yy4xOS40Ni42My43OSAxLjExLjc5aDQuNzljLjcxIDAgMS4yNi0uNTcgMS4yNi0xLjI4VjcuMjhjMC0uNy0uNTUtMS4yOC0xLjI2LTEuMjh6TTcuNSAxNC42MmMtMS4xNyAwLTIuMTMtLjk1LTIuMTMtMi4xMiAwLTEuMTcuOTYtMi4xMyAyLjEzLTIuMTMgMS4xOCAwIDIuMTIuOTYgMi4xMiAyLjEzcy0uOTUgMi4xMi0yLjEyIDIuMTJ6bTkgMGMtMS4xNyAwLTIuMTMtLjk1LTIuMTMtMi4xMiAwLTEuMTcuOTYtMi4xMyAyLjEzLTIuMTNzMi4xMi45NiAyLjEyIDIuMTMtLjk1IDIuMTItMi4xMiAyLjEyeiIvPgogICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgwVjB6Ii8+Cjwvc3ZnPgo=');
this.ICONS.fullscreen = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiLz4KPC9zdmc+Cg==');
this.ICONS.exitFullscreen = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIvPgo8L3N2Zz4K');
this.ICONS.settings = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==');
};
module.exports = ButtonManager;
},{"./emitter.js":2,"./modes.js":3,"./util.js":4}],2:[function(require,module,exports){
/*
* Copyright 2015 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function Emitter() {
this.callbacks = {};
}
Emitter.prototype.emit = function(eventName) {
var callbacks = this.callbacks[eventName];
if (!callbacks) {
//console.log('No valid callback specified.');
return;
}
var args = [].slice.call(arguments);
// Eliminate the first param (the callback).
args.shift();
for (var i = 0; i < callbacks.length; i++) {
callbacks[i].apply(this, args);
}
};
Emitter.prototype.on = function(eventName, callback) {
if (eventName in this.callbacks) {
this.callbacks[eventName].push(callback);
} else {
this.callbacks[eventName] = [callback];
}
};
module.exports = Emitter;
},{}],3:[function(require,module,exports){
/*
* Copyright 2015 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var Modes = {
UNKNOWN: 0,
// Not fullscreen, just tracking.
NORMAL: 1,
// Magic window immersive mode.
MAGIC_WINDOW: 2,
// Full screen split screen VR mode.
VR: 3,
};
module.exports = Modes;
},{}],4:[function(require,module,exports){
/*
* Copyright 2015 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var Util = {};
Util.base64 = function(mimeType, base64) {
return 'data:' + mimeType + ';base64,' + base64;
};
Util.isMobile = function() {
var check = false;
(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
return check;
};
Util.isFirefox = function() {
return /firefox/i.test(navigator.userAgent);
};
Util.isIOS = function() {
return /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
};
Util.isIFrame = function() {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
};
Util.appendQueryParameter = function(url, key, value) {
// Determine delimiter based on if the URL already GET parameters in it.
var delimiter = (url.indexOf('?') < 0 ? '?' : '&');
url += delimiter + key + '=' + value;
return url;
};
// From http://goo.gl/4WX3tg
Util.getQueryParameter = function(name) {
var name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
};
Util.isLandscapeMode = function() {
return (window.orientation == 90 || window.orientation == -90);
};
Util.getScreenWidth = function() {
return Math.max(window.screen.width, window.screen.height) *
window.devicePixelRatio;
};
Util.getScreenHeight = function() {
return Math.min(window.screen.width, window.screen.height) *
window.devicePixelRatio;
};
module.exports = Util;
},{}],5:[function(require,module,exports){
/*
* Copyright 2015 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var ButtonManager = require('./button-manager.js');
var Emitter = require('./emitter.js');
var Modes = require('./modes.js');
var Util = require('./util.js');
/**
* Helper for getting in and out of VR mode.
*/
function WebVRManager(renderer, effect, params) {
this.params = params || {};
this.mode = Modes.UNKNOWN;
// Set option to hide the button.
this.hideButton = this.params.hideButton || false;
// Whether or not the FOV should be distorted or un-distorted. By default, it
// should be distorted, but in the case of vertex shader based distortion,
// ensure that we use undistorted parameters.
this.predistorted = !!this.params.predistorted;
// Save the THREE.js renderer and effect for later.
this.renderer = renderer;
this.effect = effect;
var polyfillWrapper = document.querySelector('.webvr-polyfill-fullscreen-wrapper');
this.button = new ButtonManager(polyfillWrapper);
this.isFullscreenDisabled = !!Util.getQueryParameter('no_fullscreen');
this.startMode = Modes.NORMAL;
var startModeParam = parseInt(Util.getQueryParameter('start_mode'));
if (!isNaN(startModeParam)) {
this.startMode = startModeParam;
}
if (this.hideButton) {
this.button.setVisibility(false);
}
// Check if the browser is compatible with WebVR.
this.getDeviceByType_(VRDisplay).then(function(hmd) {
this.hmd = hmd;
// Only enable VR mode if there's a VR device attached or we are running the
// polyfill on mobile.
if (!this.isVRCompatibleOverride) {
this.isVRCompatible = !hmd.isPolyfilled || Util.isMobile();
}
switch (this.startMode) {
case Modes.MAGIC_WINDOW:
this.setMode_(Modes.MAGIC_WINDOW);
break;
case Modes.VR:
this.enterVRMode_();
this.setMode_(Modes.VR);
break;
default:
this.setMode_(Modes.NORMAL);
}
this.emit('initialized');
}.bind(this));
// Hook up button listeners.
this.button.on('fs', this.onFSClick_.bind(this));
this.button.on('vr', this.onVRClick_.bind(this));
// Bind to fullscreen events.
document.addEventListener('webkitfullscreenchange',
this.onFullscreenChange_.bind(this));
document.addEventListener('mozfullscreenchange',
this.onFullscreenChange_.bind(this));
document.addEventListener('msfullscreenchange',
this.onFullscreenChange_.bind(this));
// Bind to VR* specific events.
window.addEventListener('vrdisplaypresentchange',
this.onVRDisplayPresentChange_.bind(this));
window.addEventListener('vrdisplaydeviceparamschange',
this.onVRDisplayDeviceParamsChange_.bind(this));
}
WebVRManager.prototype = new Emitter();
// Expose these values externally.
WebVRManager.Modes = Modes;
WebVRManager.prototype.render = function(scene, camera, timestamp) {
// Scene may be an array of two scenes, one for each eye.
if (scene instanceof Array) {
this.effect.render(scene[0], camera);
} else {
this.effect.render(scene, camera);
}
};
WebVRManager.prototype.setVRCompatibleOverride = function(isVRCompatible) {
this.isVRCompatible = isVRCompatible;
this.isVRCompatibleOverride = true;
// Don't actually change modes, just update the buttons.
this.button.setMode(this.mode, this.isVRCompatible);
};
WebVRManager.prototype.setFullscreenCallback = function(callback) {
this.fullscreenCallback = callback;
};
WebVRManager.prototype.setVRCallback = function(callback) {
this.vrCallback = callback;
};
WebVRManager.prototype.setExitFullscreenCallback = function(callback) {
this.exitFullscreenCallback = callback;
}
/**
* Promise returns true if there is at least one HMD device available.
*/
WebVRManager.prototype.getDeviceByType_ = function(type) {
return new Promise(function(resolve, reject) {
navigator.getVRDisplays().then(function(displays) {
// Promise succeeds, but check if there are any displays actually.
for (var i = 0; i < displays.length; i++) {
if (displays[i] instanceof type) {
resolve(displays[i]);
break;
}
}
resolve(null);
}, function() {
// No displays are found.
resolve(null);
});
});
};
/**
* Helper for entering VR mode.
*/
WebVRManager.prototype.enterVRMode_ = function() {
this.hmd.requestPresent([{
source: this.renderer.domElement,
predistorted: this.predistorted
}]);
};
WebVRManager.prototype.setMode_ = function(mode) {
var oldMode = this.mode;
if (mode == this.mode) {
console.warn('Not changing modes, already in %s', mode);
return;
}
// console.log('Mode change: %s => %s', this.mode, mode);
this.mode = mode;
this.button.setMode(mode, this.isVRCompatible);
// Emit an event indicating the mode changed.
this.emit('modechange', mode, oldMode);
};
/**
* Main button was clicked.
*/
WebVRManager.prototype.onFSClick_ = function() {
switch (this.mode) {
case Modes.NORMAL:
// TODO: Remove this hack if/when iOS gets real fullscreen mode.
// If this is an iframe on iOS, break out and open in no_fullscreen mode.
if (Util.isIOS() && Util.isIFrame()) {
if (this.fullscreenCallback) {
this.fullscreenCallback();
} else {
var url = window.location.href;
url = Util.appendQueryParameter(url, 'no_fullscreen', 'true');
url = Util.appendQueryParameter(url, 'start_mode', Modes.MAGIC_WINDOW);
top.location.href = url;
return;
}
}
this.setMode_(Modes.MAGIC_WINDOW);
this.requestFullscreen_();
break;
case Modes.MAGIC_WINDOW:
if (this.isFullscreenDisabled) {
window.history.back();
return;
}
if (this.exitFullscreenCallback) {
this.exitFullscreenCallback();
}
this.setMode_(Modes.NORMAL);
this.exitFullscreen_();
break;
}
};
/**
* The VR button was clicked.
*/
WebVRManager.prototype.onVRClick_ = function() {
// TODO: Remove this hack when iOS has fullscreen mode.
// If this is an iframe on iOS, break out and open in no_fullscreen mode.
if (this.mode == Modes.NORMAL && Util.isIOS() && Util.isIFrame()) {
if (this.vrCallback) {
this.vrCallback();
} else {
var url = window.location.href;
url = Util.appendQueryParameter(url, 'no_fullscreen', 'true');
url = Util.appendQueryParameter(url, 'start_mode', Modes.VR);
top.location.href = url;
return;
}
}
this.enterVRMode_();
};
WebVRManager.prototype.requestFullscreen_ = function() {
var canvas = document.body;
//var canvas = this.renderer.domElement;
if (canvas.requestFullscreen) {
canvas.requestFullscreen();
} else if (canvas.mozRequestFullScreen) {
canvas.mozRequestFullScreen();
} else if (canvas.webkitRequestFullscreen) {
canvas.webkitRequestFullscreen();
} else if (canvas.msRequestFullscreen) {
canvas.msRequestFullscreen();
}
};
WebVRManager.prototype.exitFullscreen_ = function() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
};
WebVRManager.prototype.onVRDisplayPresentChange_ = function(e) {
console.log('onVRDisplayPresentChange_', e);
if (this.hmd.isPresenting) {
this.setMode_(Modes.VR);
} else {
this.setMode_(Modes.NORMAL);
}
};
WebVRManager.prototype.onVRDisplayDeviceParamsChange_ = function(e) {
console.log('onVRDisplayDeviceParamsChange_', e);
};
WebVRManager.prototype.onFullscreenChange_ = function(e) {
// If we leave full-screen, go back to normal mode.
if (document.webkitFullscreenElement === null ||
document.mozFullScreenElement === null) {
this.setMode_(Modes.NORMAL);
}
};
module.exports = WebVRManager;
},{"./button-manager.js":1,"./emitter.js":2,"./modes.js":3,"./util.js":4}]},{},[5])(5)
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9fYnJvd3Nlci1wYWNrQDYuMS4wQGJyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9idXR0b24tbWFuYWdlci5qcyIsInNyYy9lbWl0dGVyLmpzIiwic3JjL21vZGVzLmpzIiwic3JjL3V0aWwuanMiLCJzcmMvd2VidnItbWFuYWdlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKlxyXG4gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcblxyXG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJy4vZW1pdHRlci5qcycpO1xyXG52YXIgTW9kZXMgPSByZXF1aXJlKCcuL21vZGVzLmpzJyk7XHJcbnZhciBVdGlsID0gcmVxdWlyZSgnLi91dGlsLmpzJyk7XHJcblxyXG4vKipcclxuICogRXZlcnl0aGluZyBoYXZpbmcgdG8gZG8gd2l0aCB0aGUgV2ViVlIgYnV0dG9uLlxyXG4gKiBFbWl0cyBhICdjbGljaycgZXZlbnQgd2hlbiBpdCdzIGNsaWNrZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBCdXR0b25NYW5hZ2VyKG9wdF9yb290KSB7XHJcbiAgdmFyIHJvb3QgPSBvcHRfcm9vdCB8fCBkb2N1bWVudC5ib2R5O1xyXG4gIHRoaXMubG9hZEljb25zXygpO1xyXG5cclxuICAvLyBNYWtlIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbi5cclxuICB2YXIgZnNCdXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbigpO1xyXG4gIGZzQnV0dG9uLnNyYyA9IHRoaXMuSUNPTlMuZnVsbHNjcmVlbjtcclxuICBmc0J1dHRvbi50aXRsZSA9ICdGdWxsc2NyZWVuIG1vZGUnO1xyXG4gIHZhciBzID0gZnNCdXR0b24uc3R5bGU7XHJcbiAgcy5ib3R0b20gPSAwO1xyXG4gIHMucmlnaHQgPSAwO1xyXG4gIGZzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jcmVhdGVDbGlja0hhbmRsZXJfKCdmcycpKTtcclxuICByb290LmFwcGVuZENoaWxkKGZzQnV0dG9uKTtcclxuICB0aGlzLmZzQnV0dG9uID0gZnNCdXR0b247XHJcblxyXG4gIC8vIE1ha2UgdGhlIFZSIGJ1dHRvbi5cclxuICB2YXIgdnJCdXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbigpO1xyXG4gIHZyQnV0dG9uLnNyYyA9IHRoaXMuSUNPTlMuY2FyZGJvYXJkO1xyXG4gIHZyQnV0dG9uLnRpdGxlID0gJ1ZpcnR1YWwgcmVhbGl0eSBtb2RlJztcclxuICB2YXIgcyA9IHZyQnV0dG9uLnN0eWxlO1xyXG4gIHMuYm90dG9tID0gMDtcclxuICBzLnJpZ2h0ID0gJzQ4cHgnO1xyXG4gIHZyQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jcmVhdGVDbGlja0hhbmRsZXJfKCd2cicpKTtcclxuICByb290LmFwcGVuZENoaWxkKHZyQnV0dG9uKTtcclxuICB0aGlzLnZyQnV0dG9uID0gdnJCdXR0b247XHJcblxyXG4gIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuXHJcbn1cclxuQnV0dG9uTWFuYWdlci5wcm90b3R5cGUgPSBuZXcgRW1pdHRlcigpO1xyXG5cclxuQnV0dG9uTWFuYWdlci5wcm90b3R5cGUuY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gIGJ1dHRvbi5jbGFzc05hbWUgPSAnd2VidnItYnV0dG9uJztcclxuICB2YXIgcyA9IGJ1dHRvbi5zdHlsZTtcclxuICBzLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICBzLndpZHRoID0gJzI0cHgnXHJcbiAgcy5oZWlnaHQgPSAnMjRweCc7XHJcbiAgcy5iYWNrZ3JvdW5kU2l6ZSA9ICdjb3Zlcic7XHJcbiAgcy5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xyXG4gIHMuYm9yZGVyID0gMDtcclxuICBzLnVzZXJTZWxlY3QgPSAnbm9uZSc7XHJcbiAgcy53ZWJraXRVc2VyU2VsZWN0ID0gJ25vbmUnO1xyXG4gIHMuTW96VXNlclNlbGVjdCA9ICdub25lJztcclxuICBzLmN1cnNvciA9ICdwb2ludGVyJztcclxuICBzLnBhZGRpbmcgPSAnMTJweCc7XHJcbiAgcy56SW5kZXggPSAxO1xyXG4gIHMuZGlzcGxheSA9ICdub25lJztcclxuICBzLmJveFNpemluZyA9ICdjb250ZW50LWJveCc7XHJcblxyXG4gIC8vIFByZXZlbnQgYnV0dG9uIGZyb20gYmVpbmcgc2VsZWN0ZWQgYW5kIGRyYWdnZWQuXHJcbiAgYnV0dG9uLmRyYWdnYWJsZSA9IGZhbHNlO1xyXG4gIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfSk7XHJcblxyXG4gIC8vIFN0eWxlIGl0IG9uIGhvdmVyLlxyXG4gIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oZSkge1xyXG4gICAgcy5maWx0ZXIgPSBzLndlYmtpdEZpbHRlciA9ICdkcm9wLXNoYWRvdygwIDAgNXB4IHJnYmEoMjU1LDI1NSwyNTUsMSkpJztcclxuICB9KTtcclxuICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGUpIHtcclxuICAgIHMuZmlsdGVyID0gcy53ZWJraXRGaWx0ZXIgPSAnJztcclxuICB9KTtcclxuICByZXR1cm4gYnV0dG9uO1xyXG59O1xyXG5cclxuQnV0dG9uTWFuYWdlci5wcm90b3R5cGUuc2V0TW9kZSA9IGZ1bmN0aW9uKG1vZGUsIGlzVlJDb21wYXRpYmxlKSB7XHJcbiAgaXNWUkNvbXBhdGlibGUgPSBpc1ZSQ29tcGF0aWJsZSB8fCBXZWJWUkNvbmZpZy5GT1JDRV9FTkFCTEVfVlI7XHJcbiAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgIGNhc2UgTW9kZXMuTk9STUFMOlxyXG4gICAgICB0aGlzLmZzQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB0aGlzLmZzQnV0dG9uLnNyYyA9IHRoaXMuSUNPTlMuZnVsbHNjcmVlbjtcclxuICAgICAgdGhpcy52ckJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gKGlzVlJDb21wYXRpYmxlID8gJ2Jsb2NrJyA6ICdub25lJyk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSBNb2Rlcy5NQUdJQ19XSU5ET1c6XHJcbiAgICAgIHRoaXMuZnNCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgIHRoaXMuZnNCdXR0b24uc3JjID0gdGhpcy5JQ09OUy5leGl0RnVsbHNjcmVlbjtcclxuICAgICAgdGhpcy52ckJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgTW9kZXMuVlI6XHJcbiAgICAgIHRoaXMuZnNCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgdGhpcy52ckJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICBicmVhaztcclxuICB9XHJcblxyXG4gIC8vIEhhY2sgZm9yIFNhZmFyaSBNYWMvaU9TIHRvIGZvcmNlIHJlbGF5b3V0IChzdmctc3BlY2lmaWMgaXNzdWUpXHJcbiAgLy8gaHR0cDovL2dvby5nbC9oamdSNnJcclxuICB2YXIgb2xkVmFsdWUgPSB0aGlzLmZzQnV0dG9uLnN0eWxlLmRpc3BsYXk7XHJcbiAgdGhpcy5mc0J1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbiAgdGhpcy5mc0J1dHRvbi5vZmZzZXRIZWlnaHQ7XHJcbiAgdGhpcy5mc0J1dHRvbi5zdHlsZS5kaXNwbGF5ID0gb2xkVmFsdWU7XHJcbn07XHJcblxyXG5CdXR0b25NYW5hZ2VyLnByb3RvdHlwZS5zZXRWaXNpYmlsaXR5ID0gZnVuY3Rpb24oaXNWaXNpYmxlKSB7XHJcbiAgdGhpcy5pc1Zpc2libGUgPSBpc1Zpc2libGU7XHJcbiAgdGhpcy5mc0J1dHRvbi5zdHlsZS5kaXNwbGF5ID0gaXNWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJztcclxuICB0aGlzLnZyQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSBpc1Zpc2libGUgPyAnYmxvY2snIDogJ25vbmUnO1xyXG59O1xyXG5cclxuQnV0dG9uTWFuYWdlci5wcm90b3R5cGUuY3JlYXRlQ2xpY2tIYW5kbGVyXyA9IGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xyXG4gIHJldHVybiBmdW5jdGlvbihlKSB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5lbWl0KGV2ZW50TmFtZSk7XHJcbiAgfS5iaW5kKHRoaXMpO1xyXG59O1xyXG5cclxuQnV0dG9uTWFuYWdlci5wcm90b3R5cGUubG9hZEljb25zXyA9IGZ1bmN0aW9uKCkge1xyXG4gIC8vIFByZWxvYWQgc29tZSBoYXJkLWNvZGVkIFNWRy5cclxuICB0aGlzLklDT05TID0ge307XHJcbiAgdGhpcy5JQ09OUy5jYXJkYm9hcmQgPSBVdGlsLmJhc2U2NCgnaW1hZ2Uvc3ZnK3htbCcsICdQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0l5TkhCNElpQm9aV2xuYUhROUlqSTBjSGdpSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJZ1ptbHNiRDBpSTBaR1JrWkdSaUkrQ2lBZ0lDQThjR0YwYUNCa1BTSk5NakF1TnpRZ05rZ3pMakl4UXpJdU5UVWdOaUF5SURZdU5UY2dNaUEzTGpJNGRqRXdMalEwWXpBZ0xqY3VOVFVnTVM0eU9DQXhMakl6SURFdU1qaG9OQzQzT1dNdU5USWdNQ0F1T1RZdExqTXpJREV1TVRRdExqYzViREV1TkMwekxqUTRZeTR5TXkwdU5Ua3VOemt0TVM0d01TQXhMalEwTFRFdU1ERnpNUzR5TVM0ME1pQXhMalExSURFdU1ERnNNUzR6T1NBekxqUTRZeTR4T1M0ME5pNDJNeTQzT1NBeExqRXhMamM1YURRdU56bGpMamN4SURBZ01TNHlOaTB1TlRjZ01TNHlOaTB4TGpJNFZqY3VNamhqTUMwdU55MHVOVFV0TVM0eU9DMHhMakkyTFRFdU1qaDZUVGN1TlNBeE5DNDJNbU10TVM0eE55QXdMVEl1TVRNdExqazFMVEl1TVRNdE1pNHhNaUF3TFRFdU1UY3VPVFl0TWk0eE15QXlMakV6TFRJdU1UTWdNUzR4T0NBd0lESXVNVEl1T1RZZ01pNHhNaUF5TGpFemN5MHVPVFVnTWk0eE1pMHlMakV5SURJdU1USjZiVGtnTUdNdE1TNHhOeUF3TFRJdU1UTXRMamsxTFRJdU1UTXRNaTR4TWlBd0xURXVNVGN1T1RZdE1pNHhNeUF5TGpFekxUSXVNVE56TWk0eE1pNDVOaUF5TGpFeUlESXVNVE10TGprMUlESXVNVEl0TWk0eE1pQXlMakV5ZWlJdlBnb2dJQ0FnUEhCaGRHZ2dabWxzYkQwaWJtOXVaU0lnWkQwaVRUQWdNR2d5TkhZeU5FZ3dWakI2SWk4K0Nqd3ZjM1puUGdvPScpO1xyXG4gIHRoaXMuSUNPTlMuZnVsbHNjcmVlbiA9IFV0aWwuYmFzZTY0KCdpbWFnZS9zdmcreG1sJywgJ1BITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSXlOSEI0SWlCb1pXbG5hSFE5SWpJMGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lnWm1sc2JEMGlJMFpHUmtaR1JpSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhREkwZGpJMFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTnlBeE5FZzFkalZvTlhZdE1rZzNkaTB6ZW0wdE1pMDBhREpXTjJnelZqVklOWFkxZW0weE1pQTNhQzB6ZGpKb05YWXROV2d0TW5ZemVrMHhOQ0ExZGpKb00zWXphREpXTldndE5Yb2lMejRLUEM5emRtYytDZz09Jyk7XHJcbiAgdGhpcy5JQ09OUy5leGl0RnVsbHNjcmVlbiA9IFV0aWwuYmFzZTY0KCdpbWFnZS9zdmcreG1sJywgJ1BITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSXlOSEI0SWlCb1pXbG5hSFE5SWpJMGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lnWm1sc2JEMGlJMFpHUmtaR1JpSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhREkwZGpJMFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTlNBeE5tZ3pkak5vTW5ZdE5VZzFkako2YlRNdE9FZzFkakpvTlZZMVNEaDJNM3B0TmlBeE1XZ3lkaTB6YUROMkxUSm9MVFYyTlhwdE1pMHhNVlkxYUMweWRqVm9OVlk0YUMwemVpSXZQZ284TDNOMlp6NEsnKTtcclxuICB0aGlzLklDT05TLnNldHRpbmdzID0gVXRpbC5iYXNlNjQoJ2ltYWdlL3N2Zyt4bWwnLCAnUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJeU5IQjRJaUJvWldsbmFIUTlJakkwY0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSWdabWxzYkQwaUkwWkdSa1pHUmlJK0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTUNBd2FESTBkakkwU0RCNklpQm1hV3hzUFNKdWIyNWxJaTgrQ2lBZ0lDQThjR0YwYUNCa1BTSk5NVGt1TkRNZ01USXVPVGhqTGpBMExTNHpNaTR3TnkwdU5qUXVNRGN0TGprNGN5MHVNRE10TGpZMkxTNHdOeTB1T1Roc01pNHhNUzB4TGpZMVl5NHhPUzB1TVRVdU1qUXRMalF5TGpFeUxTNDJOR3d0TWkwekxqUTJZeTB1TVRJdExqSXlMUzR6T1MwdU15MHVOakV0TGpJeWJDMHlMalE1SURGakxTNDFNaTB1TkMweExqQTRMUzQzTXkweExqWTVMUzQ1T0d3dExqTTRMVEl1TmpWRE1UUXVORFlnTWk0eE9DQXhOQzR5TlNBeUlERTBJREpvTFRSakxTNHlOU0F3TFM0ME5pNHhPQzB1TkRrdU5ESnNMUzR6T0NBeUxqWTFZeTB1TmpFdU1qVXRNUzR4Tnk0MU9TMHhMalk1TGprNGJDMHlMalE1TFRGakxTNHlNeTB1TURrdExqUTVJREF0TGpZeExqSXliQzB5SURNdU5EWmpMUzR4TXk0eU1pMHVNRGN1TkRrdU1USXVOalJzTWk0eE1TQXhMalkxWXkwdU1EUXVNekl0TGpBM0xqWTFMUzR3Tnk0NU9ITXVNRE11TmpZdU1EY3VPVGhzTFRJdU1URWdNUzQyTldNdExqRTVMakUxTFM0eU5DNDBNaTB1TVRJdU5qUnNNaUF6TGpRMll5NHhNaTR5TWk0ek9TNHpMall4TGpJeWJESXVORGt0TVdNdU5USXVOQ0F4TGpBNExqY3pJREV1TmprdU9UaHNMak00SURJdU5qVmpMakF6TGpJMExqSTBMalF5TGpRNUxqUXlhRFJqTGpJMUlEQWdMalEyTFM0eE9DNDBPUzB1TkRKc0xqTTRMVEl1TmpWakxqWXhMUzR5TlNBeExqRTNMUzQxT1NBeExqWTVMUzQ1T0d3eUxqUTVJREZqTGpJekxqQTVMalE1SURBZ0xqWXhMUzR5TW13eUxUTXVORFpqTGpFeUxTNHlNaTR3TnkwdU5Ea3RMakV5TFM0Mk5Hd3RNaTR4TVMweExqWTFlazB4TWlBeE5TNDFZeTB4TGpreklEQXRNeTQxTFRFdU5UY3RNeTQxTFRNdU5YTXhMalUzTFRNdU5TQXpMalV0TXk0MUlETXVOU0F4TGpVM0lETXVOU0F6TGpVdE1TNDFOeUF6TGpVdE15NDFJRE11TlhvaUx6NEtQQzl6ZG1jK0NnPT0nKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQnV0dG9uTWFuYWdlcjtcclxuIiwiLypcclxuICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gRW1pdHRlcigpIHtcclxuICB0aGlzLmNhbGxiYWNrcyA9IHt9O1xyXG59XHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7XHJcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzW2V2ZW50TmFtZV07XHJcbiAgaWYgKCFjYWxsYmFja3MpIHtcclxuICAgIC8vY29uc29sZS5sb2coJ05vIHZhbGlkIGNhbGxiYWNrIHNwZWNpZmllZC4nKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XHJcbiAgLy8gRWxpbWluYXRlIHRoZSBmaXJzdCBwYXJhbSAodGhlIGNhbGxiYWNrKS5cclxuICBhcmdzLnNoaWZ0KCk7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIGNhbGxiYWNrc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICB9XHJcbn07XHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcclxuICBpZiAoZXZlbnROYW1lIGluIHRoaXMuY2FsbGJhY2tzKSB7XHJcbiAgICB0aGlzLmNhbGxiYWNrc1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLmNhbGxiYWNrc1tldmVudE5hbWVdID0gW2NhbGxiYWNrXTtcclxuICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVtaXR0ZXI7XHJcbiIsIi8qXHJcbiAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuXHJcbnZhciBNb2RlcyA9IHtcclxuICBVTktOT1dOOiAwLFxyXG4gIC8vIE5vdCBmdWxsc2NyZWVuLCBqdXN0IHRyYWNraW5nLlxyXG4gIE5PUk1BTDogMSxcclxuICAvLyBNYWdpYyB3aW5kb3cgaW1tZXJzaXZlIG1vZGUuXHJcbiAgTUFHSUNfV0lORE9XOiAyLFxyXG4gIC8vIEZ1bGwgc2NyZWVuIHNwbGl0IHNjcmVlbiBWUiBtb2RlLlxyXG4gIFZSOiAzLFxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNb2RlcztcclxuIiwiLypcclxuICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxudmFyIFV0aWwgPSB7fTtcclxuXHJcblV0aWwuYmFzZTY0ID0gZnVuY3Rpb24obWltZVR5cGUsIGJhc2U2NCkge1xyXG4gIHJldHVybiAnZGF0YTonICsgbWltZVR5cGUgKyAnO2Jhc2U2NCwnICsgYmFzZTY0O1xyXG59O1xyXG5cclxuVXRpbC5pc01vYmlsZSA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBjaGVjayA9IGZhbHNlO1xyXG4gIChmdW5jdGlvbihhKXtpZigvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2kudGVzdChhKXx8LzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChhLnN1YnN0cigwLDQpKSljaGVjayA9IHRydWV9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yfHx3aW5kb3cub3BlcmEpO1xyXG4gIHJldHVybiBjaGVjaztcclxufTtcclxuXHJcblV0aWwuaXNGaXJlZm94ID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIC9maXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcclxufTtcclxuXHJcblV0aWwuaXNJT1MgPSBmdW5jdGlvbigpIHtcclxuICByZXR1cm4gLyhpUGFkfGlQaG9uZXxpUG9kKS9nLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XHJcbn07XHJcblxyXG5VdGlsLmlzSUZyYW1lID0gZnVuY3Rpb24oKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcDtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn07XHJcblxyXG5VdGlsLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyID0gZnVuY3Rpb24odXJsLCBrZXksIHZhbHVlKSB7XHJcbiAgLy8gRGV0ZXJtaW5lIGRlbGltaXRlciBiYXNlZCBvbiBpZiB0aGUgVVJMIGFscmVhZHkgR0VUIHBhcmFtZXRlcnMgaW4gaXQuXHJcbiAgdmFyIGRlbGltaXRlciA9ICh1cmwuaW5kZXhPZignPycpIDwgMCA/ICc/JyA6ICcmJyk7XHJcbiAgdXJsICs9IGRlbGltaXRlciArIGtleSArICc9JyArIHZhbHVlO1xyXG4gIHJldHVybiB1cmw7XHJcbn07XHJcblxyXG4vLyBGcm9tIGh0dHA6Ly9nb28uZ2wvNFdYM3RnXHJcblV0aWwuZ2V0UXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgdmFyIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgXCJcXFxcW1wiKS5yZXBsYWNlKC9bXFxdXS8sIFwiXFxcXF1cIik7XHJcbiAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cChcIltcXFxcPyZdXCIgKyBuYW1lICsgXCI9KFteJiNdKilcIiksXHJcbiAgICAgIHJlc3VsdHMgPSByZWdleC5leGVjKGxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgcmV0dXJuIHJlc3VsdHMgPT09IG51bGwgPyBcIlwiIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csIFwiIFwiKSk7XHJcbn07XHJcblxyXG5VdGlsLmlzTGFuZHNjYXBlTW9kZSA9IGZ1bmN0aW9uKCkge1xyXG4gIHJldHVybiAod2luZG93Lm9yaWVudGF0aW9uID09IDkwIHx8IHdpbmRvdy5vcmllbnRhdGlvbiA9PSAtOTApO1xyXG59O1xyXG5cclxuVXRpbC5nZXRTY3JlZW5XaWR0aCA9IGZ1bmN0aW9uKCkge1xyXG4gIHJldHVybiBNYXRoLm1heCh3aW5kb3cuc2NyZWVuLndpZHRoLCB3aW5kb3cuc2NyZWVuLmhlaWdodCkgKlxyXG4gICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxufTtcclxuXHJcblV0aWwuZ2V0U2NyZWVuSGVpZ2h0ID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIE1hdGgubWluKHdpbmRvdy5zY3JlZW4ud2lkdGgsIHdpbmRvdy5zY3JlZW4uaGVpZ2h0KSAqXHJcbiAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBVdGlsO1xyXG4iLCIvKlxyXG4gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcblxyXG52YXIgQnV0dG9uTWFuYWdlciA9IHJlcXVpcmUoJy4vYnV0dG9uLW1hbmFnZXIuanMnKTtcclxudmFyIEVtaXR0ZXIgPSByZXF1aXJlKCcuL2VtaXR0ZXIuanMnKTtcclxudmFyIE1vZGVzID0gcmVxdWlyZSgnLi9tb2Rlcy5qcycpO1xyXG52YXIgVXRpbCA9IHJlcXVpcmUoJy4vdXRpbC5qcycpO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBmb3IgZ2V0dGluZyBpbiBhbmQgb3V0IG9mIFZSIG1vZGUuXHJcbiAqL1xyXG5mdW5jdGlvbiBXZWJWUk1hbmFnZXIocmVuZGVyZXIsIGVmZmVjdCwgcGFyYW1zKSB7XHJcbiAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwge307XHJcblxyXG4gIHRoaXMubW9kZSA9IE1vZGVzLlVOS05PV047XHJcblxyXG4gIC8vIFNldCBvcHRpb24gdG8gaGlkZSB0aGUgYnV0dG9uLlxyXG4gIHRoaXMuaGlkZUJ1dHRvbiA9IHRoaXMucGFyYW1zLmhpZGVCdXR0b24gfHwgZmFsc2U7XHJcbiAgLy8gV2hldGhlciBvciBub3QgdGhlIEZPViBzaG91bGQgYmUgZGlzdG9ydGVkIG9yIHVuLWRpc3RvcnRlZC4gQnkgZGVmYXVsdCwgaXRcclxuICAvLyBzaG91bGQgYmUgZGlzdG9ydGVkLCBidXQgaW4gdGhlIGNhc2Ugb2YgdmVydGV4IHNoYWRlciBiYXNlZCBkaXN0b3J0aW9uLFxyXG4gIC8vIGVuc3VyZSB0aGF0IHdlIHVzZSB1bmRpc3RvcnRlZCBwYXJhbWV0ZXJzLlxyXG4gIHRoaXMucHJlZGlzdG9ydGVkID0gISF0aGlzLnBhcmFtcy5wcmVkaXN0b3J0ZWQ7XHJcblxyXG4gIC8vIFNhdmUgdGhlIFRIUkVFLmpzIHJlbmRlcmVyIGFuZCBlZmZlY3QgZm9yIGxhdGVyLlxyXG4gIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuICB0aGlzLmVmZmVjdCA9IGVmZmVjdDtcclxuICB2YXIgcG9seWZpbGxXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYnZyLXBvbHlmaWxsLWZ1bGxzY3JlZW4td3JhcHBlcicpO1xyXG4gIHRoaXMuYnV0dG9uID0gbmV3IEJ1dHRvbk1hbmFnZXIocG9seWZpbGxXcmFwcGVyKTtcclxuXHJcbiAgdGhpcy5pc0Z1bGxzY3JlZW5EaXNhYmxlZCA9ICEhVXRpbC5nZXRRdWVyeVBhcmFtZXRlcignbm9fZnVsbHNjcmVlbicpO1xyXG4gIHRoaXMuc3RhcnRNb2RlID0gTW9kZXMuTk9STUFMO1xyXG4gIHZhciBzdGFydE1vZGVQYXJhbSA9IHBhcnNlSW50KFV0aWwuZ2V0UXVlcnlQYXJhbWV0ZXIoJ3N0YXJ0X21vZGUnKSk7XHJcbiAgaWYgKCFpc05hTihzdGFydE1vZGVQYXJhbSkpIHtcclxuICAgIHRoaXMuc3RhcnRNb2RlID0gc3RhcnRNb2RlUGFyYW07XHJcbiAgfVxyXG5cclxuICBpZiAodGhpcy5oaWRlQnV0dG9uKSB7XHJcbiAgICB0aGlzLmJ1dHRvbi5zZXRWaXNpYmlsaXR5KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIGlzIGNvbXBhdGlibGUgd2l0aCBXZWJWUi5cclxuICB0aGlzLmdldERldmljZUJ5VHlwZV8oVlJEaXNwbGF5KS50aGVuKGZ1bmN0aW9uKGhtZCkge1xyXG4gICAgdGhpcy5obWQgPSBobWQ7XHJcblxyXG4gICAgLy8gT25seSBlbmFibGUgVlIgbW9kZSBpZiB0aGVyZSdzIGEgVlIgZGV2aWNlIGF0dGFjaGVkIG9yIHdlIGFyZSBydW5uaW5nIHRoZVxyXG4gICAgLy8gcG9seWZpbGwgb24gbW9iaWxlLlxyXG4gICAgaWYgKCF0aGlzLmlzVlJDb21wYXRpYmxlT3ZlcnJpZGUpIHtcclxuICAgICAgdGhpcy5pc1ZSQ29tcGF0aWJsZSA9ICAhaG1kLmlzUG9seWZpbGxlZCB8fCBVdGlsLmlzTW9iaWxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnN0YXJ0TW9kZSkge1xyXG4gICAgICBjYXNlIE1vZGVzLk1BR0lDX1dJTkRPVzpcclxuICAgICAgICB0aGlzLnNldE1vZGVfKE1vZGVzLk1BR0lDX1dJTkRPVyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTW9kZXMuVlI6XHJcbiAgICAgICAgdGhpcy5lbnRlclZSTW9kZV8oKTtcclxuICAgICAgICB0aGlzLnNldE1vZGVfKE1vZGVzLlZSKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnNldE1vZGVfKE1vZGVzLk5PUk1BTCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbWl0KCdpbml0aWFsaXplZCcpO1xyXG4gIH0uYmluZCh0aGlzKSk7XHJcblxyXG4gIC8vIEhvb2sgdXAgYnV0dG9uIGxpc3RlbmVycy5cclxuICB0aGlzLmJ1dHRvbi5vbignZnMnLCB0aGlzLm9uRlNDbGlja18uYmluZCh0aGlzKSk7XHJcbiAgdGhpcy5idXR0b24ub24oJ3ZyJywgdGhpcy5vblZSQ2xpY2tfLmJpbmQodGhpcykpO1xyXG5cclxuICAvLyBCaW5kIHRvIGZ1bGxzY3JlZW4gZXZlbnRzLlxyXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLFxyXG4gICAgICB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZV8uYmluZCh0aGlzKSk7XHJcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96ZnVsbHNjcmVlbmNoYW5nZScsXHJcbiAgICAgIHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlXy5iaW5kKHRoaXMpKTtcclxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtc2Z1bGxzY3JlZW5jaGFuZ2UnLFxyXG4gICAgICB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZV8uYmluZCh0aGlzKSk7XHJcblxyXG4gIC8vIEJpbmQgdG8gVlIqIHNwZWNpZmljIGV2ZW50cy5cclxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsXHJcbiAgICAgIHRoaXMub25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlXy5iaW5kKHRoaXMpKTtcclxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndnJkaXNwbGF5ZGV2aWNlcGFyYW1zY2hhbmdlJyxcclxuICAgICAgdGhpcy5vblZSRGlzcGxheURldmljZVBhcmFtc0NoYW5nZV8uYmluZCh0aGlzKSk7XHJcbn1cclxuXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUgPSBuZXcgRW1pdHRlcigpO1xyXG5cclxuLy8gRXhwb3NlIHRoZXNlIHZhbHVlcyBleHRlcm5hbGx5LlxyXG5XZWJWUk1hbmFnZXIuTW9kZXMgPSBNb2RlcztcclxuXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oc2NlbmUsIGNhbWVyYSwgdGltZXN0YW1wKSB7XHJcbiAgLy8gU2NlbmUgbWF5IGJlIGFuIGFycmF5IG9mIHR3byBzY2VuZXMsIG9uZSBmb3IgZWFjaCBleWUuXHJcbiAgaWYgKHNjZW5lIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgIHRoaXMuZWZmZWN0LnJlbmRlcihzY2VuZVswXSwgY2FtZXJhKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5lZmZlY3QucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xyXG4gIH1cclxufTtcclxuXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUuc2V0VlJDb21wYXRpYmxlT3ZlcnJpZGUgPSBmdW5jdGlvbihpc1ZSQ29tcGF0aWJsZSkge1xyXG4gIHRoaXMuaXNWUkNvbXBhdGlibGUgPSBpc1ZSQ29tcGF0aWJsZTtcclxuICB0aGlzLmlzVlJDb21wYXRpYmxlT3ZlcnJpZGUgPSB0cnVlO1xyXG5cclxuICAvLyBEb24ndCBhY3R1YWxseSBjaGFuZ2UgbW9kZXMsIGp1c3QgdXBkYXRlIHRoZSBidXR0b25zLlxyXG4gIHRoaXMuYnV0dG9uLnNldE1vZGUodGhpcy5tb2RlLCB0aGlzLmlzVlJDb21wYXRpYmxlKTtcclxufTtcclxuXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUuc2V0RnVsbHNjcmVlbkNhbGxiYWNrID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICB0aGlzLmZ1bGxzY3JlZW5DYWxsYmFjayA9IGNhbGxiYWNrO1xyXG59O1xyXG5cclxuV2ViVlJNYW5hZ2VyLnByb3RvdHlwZS5zZXRWUkNhbGxiYWNrID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICB0aGlzLnZyQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxufTtcclxuXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUuc2V0RXhpdEZ1bGxzY3JlZW5DYWxsYmFjayA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgdGhpcy5leGl0RnVsbHNjcmVlbkNhbGxiYWNrID0gY2FsbGJhY2s7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm9taXNlIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgSE1EIGRldmljZSBhdmFpbGFibGUuXHJcbiAqL1xyXG5XZWJWUk1hbmFnZXIucHJvdG90eXBlLmdldERldmljZUJ5VHlwZV8gPSBmdW5jdGlvbih0eXBlKSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgbmF2aWdhdG9yLmdldFZSRGlzcGxheXMoKS50aGVuKGZ1bmN0aW9uKGRpc3BsYXlzKSB7XHJcbiAgICAgIC8vIFByb21pc2Ugc3VjY2VlZHMsIGJ1dCBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGRpc3BsYXlzIGFjdHVhbGx5LlxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BsYXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlzW2ldIGluc3RhbmNlb2YgdHlwZSkge1xyXG4gICAgICAgICAgcmVzb2x2ZShkaXNwbGF5c1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgIH0sIGZ1bmN0aW9uKCkge1xyXG4gICAgICAvLyBObyBkaXNwbGF5cyBhcmUgZm91bmQuXHJcbiAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgZm9yIGVudGVyaW5nIFZSIG1vZGUuXHJcbiAqL1xyXG5XZWJWUk1hbmFnZXIucHJvdG90eXBlLmVudGVyVlJNb2RlXyA9IGZ1bmN0aW9uKCkge1xyXG4gIHRoaXMuaG1kLnJlcXVlc3RQcmVzZW50KFt7XHJcbiAgICBzb3VyY2U6IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCxcclxuICAgIHByZWRpc3RvcnRlZDogdGhpcy5wcmVkaXN0b3J0ZWRcclxuICB9XSk7XHJcbn07XHJcblxyXG5XZWJWUk1hbmFnZXIucHJvdG90eXBlLnNldE1vZGVfID0gZnVuY3Rpb24obW9kZSkge1xyXG4gIHZhciBvbGRNb2RlID0gdGhpcy5tb2RlO1xyXG4gIGlmIChtb2RlID09IHRoaXMubW9kZSkge1xyXG4gICAgY29uc29sZS53YXJuKCdOb3QgY2hhbmdpbmcgbW9kZXMsIGFscmVhZHkgaW4gJXMnLCBtb2RlKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgLy8gY29uc29sZS5sb2coJ01vZGUgY2hhbmdlOiAlcyA9PiAlcycsIHRoaXMubW9kZSwgbW9kZSk7XHJcbiAgdGhpcy5tb2RlID0gbW9kZTtcclxuICB0aGlzLmJ1dHRvbi5zZXRNb2RlKG1vZGUsIHRoaXMuaXNWUkNvbXBhdGlibGUpO1xyXG5cclxuICAvLyBFbWl0IGFuIGV2ZW50IGluZGljYXRpbmcgdGhlIG1vZGUgY2hhbmdlZC5cclxuICB0aGlzLmVtaXQoJ21vZGVjaGFuZ2UnLCBtb2RlLCBvbGRNb2RlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBNYWluIGJ1dHRvbiB3YXMgY2xpY2tlZC5cclxuICovXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUub25GU0NsaWNrXyA9IGZ1bmN0aW9uKCkge1xyXG4gIHN3aXRjaCAodGhpcy5tb2RlKSB7XHJcbiAgICBjYXNlIE1vZGVzLk5PUk1BTDpcclxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgaGFjayBpZi93aGVuIGlPUyBnZXRzIHJlYWwgZnVsbHNjcmVlbiBtb2RlLlxyXG4gICAgICAvLyBJZiB0aGlzIGlzIGFuIGlmcmFtZSBvbiBpT1MsIGJyZWFrIG91dCBhbmQgb3BlbiBpbiBub19mdWxsc2NyZWVuIG1vZGUuXHJcbiAgICAgIGlmIChVdGlsLmlzSU9TKCkgJiYgVXRpbC5pc0lGcmFtZSgpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnVsbHNjcmVlbkNhbGxiYWNrKSB7XHJcbiAgICAgICAgICB0aGlzLmZ1bGxzY3JlZW5DYWxsYmFjaygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICB1cmwgPSBVdGlsLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHVybCwgJ25vX2Z1bGxzY3JlZW4nLCAndHJ1ZScpO1xyXG4gICAgICAgICAgdXJsID0gVXRpbC5hcHBlbmRRdWVyeVBhcmFtZXRlcih1cmwsICdzdGFydF9tb2RlJywgTW9kZXMuTUFHSUNfV0lORE9XKTtcclxuICAgICAgICAgIHRvcC5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldE1vZGVfKE1vZGVzLk1BR0lDX1dJTkRPVyk7XHJcbiAgICAgIHRoaXMucmVxdWVzdEZ1bGxzY3JlZW5fKCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSBNb2Rlcy5NQUdJQ19XSU5ET1c6XHJcbiAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbkRpc2FibGVkKSB7XHJcbiAgICAgICAgd2luZG93Lmhpc3RvcnkuYmFjaygpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5leGl0RnVsbHNjcmVlbkNhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5leGl0RnVsbHNjcmVlbkNhbGxiYWNrKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRNb2RlXyhNb2Rlcy5OT1JNQUwpO1xyXG4gICAgICB0aGlzLmV4aXRGdWxsc2NyZWVuXygpO1xyXG4gICAgICBicmVhaztcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogVGhlIFZSIGJ1dHRvbiB3YXMgY2xpY2tlZC5cclxuICovXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUub25WUkNsaWNrXyA9IGZ1bmN0aW9uKCkge1xyXG4gIC8vIFRPRE86IFJlbW92ZSB0aGlzIGhhY2sgd2hlbiBpT1MgaGFzIGZ1bGxzY3JlZW4gbW9kZS5cclxuICAvLyBJZiB0aGlzIGlzIGFuIGlmcmFtZSBvbiBpT1MsIGJyZWFrIG91dCBhbmQgb3BlbiBpbiBub19mdWxsc2NyZWVuIG1vZGUuXHJcbiAgaWYgKHRoaXMubW9kZSA9PSBNb2Rlcy5OT1JNQUwgJiYgVXRpbC5pc0lPUygpICYmIFV0aWwuaXNJRnJhbWUoKSkge1xyXG4gICAgaWYgKHRoaXMudnJDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLnZyQ2FsbGJhY2soKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgdXJsID0gVXRpbC5hcHBlbmRRdWVyeVBhcmFtZXRlcih1cmwsICdub19mdWxsc2NyZWVuJywgJ3RydWUnKTtcclxuICAgICAgdXJsID0gVXRpbC5hcHBlbmRRdWVyeVBhcmFtZXRlcih1cmwsICdzdGFydF9tb2RlJywgTW9kZXMuVlIpO1xyXG4gICAgICB0b3AubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuICB0aGlzLmVudGVyVlJNb2RlXygpO1xyXG59O1xyXG5cclxuV2ViVlJNYW5hZ2VyLnByb3RvdHlwZS5yZXF1ZXN0RnVsbHNjcmVlbl8gPSBmdW5jdGlvbigpIHtcclxuICB2YXIgY2FudmFzID0gZG9jdW1lbnQuYm9keTtcclxuICAvL3ZhciBjYW52YXMgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQ7XHJcbiAgaWYgKGNhbnZhcy5yZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgY2FudmFzLnJlcXVlc3RGdWxsc2NyZWVuKCk7XHJcbiAgfSBlbHNlIGlmIChjYW52YXMubW96UmVxdWVzdEZ1bGxTY3JlZW4pIHtcclxuICAgIGNhbnZhcy5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xyXG4gIH0gZWxzZSBpZiAoY2FudmFzLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICBjYW52YXMud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICB9IGVsc2UgaWYgKGNhbnZhcy5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICBjYW52YXMubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG4gIH1cclxufTtcclxuXHJcbldlYlZSTWFuYWdlci5wcm90b3R5cGUuZXhpdEZ1bGxzY3JlZW5fID0gZnVuY3Rpb24oKSB7XHJcbiAgaWYgKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xyXG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbikge1xyXG4gICAgZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xyXG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7XHJcbiAgfSBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7XHJcbiAgfVxyXG59O1xyXG5cclxuV2ViVlJNYW5hZ2VyLnByb3RvdHlwZS5vblZSRGlzcGxheVByZXNlbnRDaGFuZ2VfID0gZnVuY3Rpb24oZSkge1xyXG4gIGNvbnNvbGUubG9nKCdvblZSRGlzcGxheVByZXNlbnRDaGFuZ2VfJywgZSk7XHJcbiAgaWYgKHRoaXMuaG1kLmlzUHJlc2VudGluZykge1xyXG4gICAgdGhpcy5zZXRNb2RlXyhNb2Rlcy5WUik7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuc2V0TW9kZV8oTW9kZXMuTk9STUFMKTtcclxuICB9XHJcbn07XHJcblxyXG5XZWJWUk1hbmFnZXIucHJvdG90eXBlLm9uVlJEaXNwbGF5RGV2aWNlUGFyYW1zQ2hhbmdlXyA9IGZ1bmN0aW9uKGUpIHtcclxuICBjb25zb2xlLmxvZygnb25WUkRpc3BsYXlEZXZpY2VQYXJhbXNDaGFuZ2VfJywgZSk7XHJcbn07XHJcblxyXG5XZWJWUk1hbmFnZXIucHJvdG90eXBlLm9uRnVsbHNjcmVlbkNoYW5nZV8gPSBmdW5jdGlvbihlKSB7XHJcbiAgLy8gSWYgd2UgbGVhdmUgZnVsbC1zY3JlZW4sIGdvIGJhY2sgdG8gbm9ybWFsIG1vZGUuXHJcbiAgaWYgKGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50ID09PSBudWxsIHx8XHJcbiAgICAgIGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50ID09PSBudWxsKSB7XHJcbiAgICB0aGlzLnNldE1vZGVfKE1vZGVzLk5PUk1BTCk7XHJcbiAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXZWJWUk1hbmFnZXI7XHJcbiJdfQ==
JavaScript
1
https://gitee.com/jinzhexian/vr-stream-web-player.git
git@gitee.com:jinzhexian/vr-stream-web-player.git
jinzhexian
vr-stream-web-player
vr-stream-web-player
master

搜索帮助