diff --git a/web/devServer.js b/web/devServer.js index 86d40b813ec..b344bdefbe3 100644 --- a/web/devServer.js +++ b/web/devServer.js @@ -1,5 +1,5 @@ var WebpackDevServer = require("webpack-dev-server"); -var webpackConfig = require('./webpack.config.js'); +var webpackConfig = require('./webpack.config.dev.js'); var express = require('express'); var webpack = require('webpack'); var proxy = require('http-proxy').createProxyServer(); @@ -52,6 +52,6 @@ server.app.get(ROOT +'/*', function (req, res) { module.exports = function(){ server.listen(PORT, "localhost", function() { - console.log('Dev Server is up and running: http://location:' + PORT); + console.log('Dev Server is up and running: https://location:' + PORT +'/web'); }); } diff --git a/web/dist/app/app.js b/web/dist/app/app.js index 6eba1618f69..f7d9f016010 100644 --- a/web/dist/app/app.js +++ b/web/dist/app/app.js @@ -1,5555 +1,3 @@ -webpackJsonp([1],{ - -/***/ 0: -/***/ function(module, exports, __webpack_require__) { - - module.exports = __webpack_require__(312); - - -/***/ }, - -/***/ 7: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _nuclearJs = __webpack_require__(14); - - var reactor = new _nuclearJs.Reactor({ - debug: true - }); - - window.reactor = reactor; - - exports['default'] = reactor; - module.exports = exports['default']; - -/***/ }, - -/***/ 11: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(280); - - var formatPattern = _require.formatPattern; - - var cfg = { - - baseUrl: window.location.origin, - - helpUrl: 'https://github.com/gravitational/teleport/blob/master/README.md', - - api: { - renewTokenPath: '/v1/webapi/sessions/renew', - nodesPath: '/v1/webapi/sites/-current-/nodes', - sessionPath: '/v1/webapi/sessions', - siteSessionPath: '/v1/webapi/sites/-current-/sessions/:sid', - invitePath: '/v1/webapi/users/invites/:inviteToken', - createUserPath: '/v1/webapi/users', - sessionChunk: '/v1/webapi/sites/-current-/sessions/:sid/chunks?start=:start&end=:end', - sessionChunkCountPath: '/v1/webapi/sites/-current-/sessions/:sid/chunkscount', - - getFetchSessionChunkUrl: function getFetchSessionChunkUrl(_ref) { - var sid = _ref.sid; - var start = _ref.start; - var end = _ref.end; - - return formatPattern(cfg.api.sessionChunk, { sid: sid, start: start, end: end }); - }, - - getFetchSessionLengthUrl: function getFetchSessionLengthUrl(sid) { - return formatPattern(cfg.api.sessionChunkCountPath, { sid: sid }); - }, - - getFetchSessionsUrl: function getFetchSessionsUrl(start, end) { - var params = { - start: start.toISOString(), - end: end.toISOString() - }; - - var json = JSON.stringify(params); - var jsonEncoded = window.encodeURI(json); - - return '/v1/webapi/sites/-current-/events/sessions?filter=' + jsonEncoded; - }, - - getFetchSessionUrl: function getFetchSessionUrl(sid) { - return formatPattern(cfg.api.siteSessionPath, { sid: sid }); - }, - - getTerminalSessionUrl: function getTerminalSessionUrl(sid) { - return formatPattern(cfg.api.siteSessionPath, { sid: sid }); - }, - - getInviteUrl: function getInviteUrl(inviteToken) { - return formatPattern(cfg.api.invitePath, { inviteToken: inviteToken }); - }, - - getEventStreamConnStr: function getEventStreamConnStr(token, sid) { - var hostname = getWsHostName(); - return hostname + '/v1/webapi/sites/-current-/sessions/' + sid + '/events/stream?access_token=' + token; - }, - - getTtyConnStr: function getTtyConnStr(_ref2) { - var token = _ref2.token; - var serverId = _ref2.serverId; - var login = _ref2.login; - var sid = _ref2.sid; - var rows = _ref2.rows; - var cols = _ref2.cols; - - var params = { - server_id: serverId, - login: login, - sid: sid, - term: { - h: rows, - w: cols - } - }; - - var json = JSON.stringify(params); - var jsonEncoded = window.encodeURI(json); - var hostname = getWsHostName(); - return hostname + '/v1/webapi/sites/-current-/connect?access_token=' + token + '¶ms=' + jsonEncoded; - } - }, - - routes: { - app: '/web', - logout: '/web/logout', - login: '/web/login', - nodes: '/web/nodes', - activeSession: '/web/sessions/:sid', - newUser: '/web/newuser/:inviteToken', - sessions: '/web/sessions', - pageNotFound: '/web/notfound' - }, - - getActiveSessionRouteUrl: function getActiveSessionRouteUrl(sid) { - return formatPattern(cfg.routes.activeSession, { sid: sid }); - } - }; - - exports['default'] = cfg; - - function getWsHostName() { - var prefix = location.protocol == "https:" ? "wss://" : "ws://"; - var hostport = location.hostname + (location.port ? ':' + location.port : ''); - return '' + prefix + hostport; - } - module.exports = exports['default']; - -/***/ }, - -/***/ 17: -/***/ function(module, exports) { - - /** - * Copyright 2013-2014 Facebook, Inc. - * - * 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. - * - */ - - "use strict"; - - /** - * Constructs an enumeration with keys equal to their value. - * - * For example: - * - * var COLORS = keyMirror({blue: null, red: null}); - * var myColor = COLORS.blue; - * var isColorValid = !!COLORS[myColor]; - * - * The last line could not be performed if the values of the generated enum were - * not equal to their keys. - * - * Input: {key1: val1, key2: val2} - * Output: {key1: key1, key2: key2} - * - * @param {object} obj - * @return {object} - */ - var keyMirror = function(obj) { - var ret = {}; - var key; - if (!(obj instanceof Object && !Array.isArray(obj))) { - throw new Error('keyMirror(...): Argument must be an object.'); - } - for (key in obj) { - if (!obj.hasOwnProperty(key)) { - continue; - } - ret[key] = key; - } - return ret; - }; - - module.exports = keyMirror; - - -/***/ }, - -/***/ 25: -/***/ function(module, exports) { - - module.exports = jQuery; - -/***/ }, - -/***/ 26: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(37); - - var browserHistory = _require.browserHistory; - var createMemoryHistory = _require.createMemoryHistory; - - var AUTH_KEY_DATA = 'authData'; - - var _history = createMemoryHistory(); - - var session = { - - init: function init() { - var history = arguments.length <= 0 || arguments[0] === undefined ? browserHistory : arguments[0]; - - _history = history; - }, - - getHistory: function getHistory() { - return _history; - }, - - setUserData: function setUserData(userData) { - localStorage.setItem(AUTH_KEY_DATA, JSON.stringify(userData)); - }, - - getUserData: function getUserData() { - var item = localStorage.getItem(AUTH_KEY_DATA); - if (item) { - return JSON.parse(item); - } - - return {}; - }, - - clear: function clear() { - localStorage.clear(); - } - - }; - - module.exports = session; - -/***/ }, - -/***/ 32: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var $ = __webpack_require__(25); - var session = __webpack_require__(26); - - var api = { - - put: function put(path, data, withToken) { - return api.ajax({ url: path, data: JSON.stringify(data), type: 'PUT' }, withToken); - }, - - post: function post(path, data, withToken) { - return api.ajax({ url: path, data: JSON.stringify(data), type: 'POST' }, withToken); - }, - - get: function get(path) { - return api.ajax({ url: path }); - }, - - ajax: function ajax(cfg) { - var withToken = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; - - var defaultCfg = { - type: "GET", - dataType: "json", - beforeSend: function beforeSend(xhr) { - if (withToken) { - var _session$getUserData = session.getUserData(); - - var token = _session$getUserData.token; - - xhr.setRequestHeader('Authorization', 'Bearer ' + token); - } - } - }; - - return $.ajax($.extend({}, defaultCfg, cfg)); - } - }; - - module.exports = api; - -/***/ }, - -/***/ 43: -/***/ function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - var nodeHostNameByServerId = function nodeHostNameByServerId(serverId) { - return [['tlpt_nodes'], function (nodes) { - var server = nodes.find(function (item) { - return item.get('id') === serverId; - }); - return !server ? '' : server.get('hostname'); - }]; - }; - - var nodeListView = [['tlpt_nodes'], function (nodes) { - return nodes.map(function (item) { - var serverId = item.get('id'); - return { - id: serverId, - hostname: item.get('hostname'), - tags: getTags(item), - addr: item.get('addr') - }; - }).toJS(); - }]; - - function getTags(node) { - var allLabels = []; - var labels = node.get('labels'); - - if (labels) { - labels.entrySeq().toArray().forEach(function (item) { - allLabels.push({ - role: item[0], - value: item[1] - }); - }); - } - - labels = node.get('cmd_labels'); - - if (labels) { - labels.entrySeq().toArray().forEach(function (item) { - allLabels.push({ - role: item[0], - value: item[1].get('result'), - tooltip: item[1].get('command') - }); - }); - } - - return allLabels; - } - - exports['default'] = { - nodeListView: nodeListView, - nodeHostNameByServerId: nodeHostNameByServerId - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 44: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TRYING_TO_SIGN_UP: null, - TRYING_TO_LOGIN: null, - FETCHING_INVITE: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 45: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - exports.__esModule = true; - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } - - var React = __webpack_require__(3); - - var GrvTableTextCell = function GrvTableTextCell(_ref) { - var rowIndex = _ref.rowIndex; - var data = _ref.data; - var columnKey = _ref.columnKey; - - var props = _objectWithoutProperties(_ref, ['rowIndex', 'data', 'columnKey']); - - return React.createElement( - GrvTableCell, - props, - data[rowIndex][columnKey] - ); - }; - - /** - * Sort indicator used by SortHeaderCell - */ - var SortTypes = { - ASC: 'ASC', - DESC: 'DESC' - }; - - var SortIndicator = function SortIndicator(_ref2) { - var sortDir = _ref2.sortDir; - - var cls = 'grv-table-indicator-sort fa fa-sort'; - if (sortDir === SortTypes.DESC) { - cls += '-desc'; - } - - if (sortDir === SortTypes.ASC) { - cls += '-asc'; - } - - return React.createElement('i', { className: cls }); - }; - - /** - * Sort Header Cell - */ - var SortHeaderCell = React.createClass({ - displayName: 'SortHeaderCell', - - render: function render() { - var _props = this.props; - var sortDir = _props.sortDir; - var title = _props.title; - - var props = _objectWithoutProperties(_props, ['sortDir', 'title']); - - return React.createElement( - GrvTableCell, - props, - React.createElement( - 'a', - { onClick: this.onSortChange }, - title - ), - React.createElement(SortIndicator, { sortDir: sortDir }) - ); - }, - - onSortChange: function onSortChange(e) { - e.preventDefault(); - if (this.props.onSortChange) { - // default - var newDir = SortTypes.DESC; - if (this.props.sortDir) { - newDir = this.props.sortDir === SortTypes.DESC ? SortTypes.ASC : SortTypes.DESC; - } - this.props.onSortChange(this.props.columnKey, newDir); - } - } - }); - - /** - * Default Cell - */ - var GrvTableCell = React.createClass({ - displayName: 'GrvTableCell', - - render: function render() { - var props = this.props; - return props.isHeader ? React.createElement( - 'th', - { key: props.key, className: 'grv-table-cell' }, - props.children - ) : React.createElement( - 'td', - { key: props.key }, - props.children - ); - } - }); - - /** - * Table - */ - var GrvTable = React.createClass({ - displayName: 'GrvTable', - - renderHeader: function renderHeader(children) { - var _this = this; - - var cells = children.map(function (item, index) { - return _this.renderCell(item.props.header, _extends({ index: index, key: index, isHeader: true }, item.props)); - }); - - return React.createElement( - 'thead', - { className: 'grv-table-header' }, - React.createElement( - 'tr', - null, - cells - ) - ); - }, - - renderBody: function renderBody(children) { - var _this2 = this; - - var count = this.props.rowCount; - var rows = []; - for (var i = 0; i < count; i++) { - var cells = children.map(function (item, index) { - return _this2.renderCell(item.props.cell, _extends({ rowIndex: i, key: index, isHeader: false }, item.props)); - }); - - rows.push(React.createElement( - 'tr', - { key: i }, - cells - )); - } - - return React.createElement( - 'tbody', - null, - rows - ); - }, - - renderCell: function renderCell(cell, cellProps) { - var content = null; - if (React.isValidElement(cell)) { - content = React.cloneElement(cell, cellProps); - } else if (typeof cell === 'function') { - content = cell(cellProps); - } - - return content; - }, - - render: function render() { - var children = []; - React.Children.forEach(this.props.children, function (child) { - if (child == null) { - return; - } - - if (child.type.displayName !== 'GrvTableColumn') { - throw 'Should be GrvTableColumn'; - } - - children.push(child); - }); - - var tableClass = 'table ' + this.props.className; - - return React.createElement( - 'table', - { className: tableClass }, - this.renderHeader(children), - this.renderBody(children) - ); - } - }); - - var GrvTableColumn = React.createClass({ - displayName: 'GrvTableColumn', - - render: function render() { - throw new Error('Component should never render'); - } - }); - - exports['default'] = GrvTable; - exports.Column = GrvTableColumn; - exports.Table = GrvTable; - exports.Cell = GrvTableCell; - exports.TextCell = GrvTableTextCell; - exports.SortHeaderCell = SortHeaderCell; - exports.SortIndicator = SortIndicator; - exports.SortTypes = SortTypes; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "table.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 57: -/***/ function(module, exports) { - - module.exports = _; - -/***/ }, - -/***/ 58: -/***/ function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - var _bind = Function.prototype.bind; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - var Logger = (function () { - function Logger() { - var name = arguments.length <= 0 || arguments[0] === undefined ? 'default' : arguments[0]; - - _classCallCheck(this, Logger); - - this.name = name; - } - - Logger.prototype.log = function log() { - var level = arguments.length <= 0 || arguments[0] === undefined ? 'log' : arguments[0]; - - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - console[level].apply(console, ['%c[' + this.name + ']', 'color: blue;'].concat(args)); - }; - - Logger.prototype.trace = function trace() { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this.log.apply(this, ['trace'].concat(args)); - }; - - Logger.prototype.warn = function warn() { - for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this.log.apply(this, ['warn'].concat(args)); - }; - - Logger.prototype.info = function info() { - for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - - this.log.apply(this, ['info'].concat(args)); - }; - - Logger.prototype.error = function error() { - for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - this.log.apply(this, ['error'].concat(args)); - }; - - return Logger; - })(); - - exports['default'] = { - create: function create() { - for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { - args[_key6] = arguments[_key6]; - } - - return new (_bind.apply(Logger, [null].concat(args)))(); - } - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 59: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(113); - - var createView = _require.createView; - - var activeSession = [['tlpt_current_session'], ['tlpt_sessions'], function (activeTerm, sessions) { - if (!activeTerm) { - return null; - } - - /* - * active session needs to have its own view as an actual session might not - * exist at this point. For example, upon creating a new session we need to know - * login and serverId. It will be simplified once server API gets extended. - */ - var asView = { - isNewSession: activeTerm.get('isNewSession'), - notFound: activeTerm.get('notFound'), - addr: activeTerm.get('addr'), - serverId: activeTerm.get('serverId'), - serverIp: undefined, - login: activeTerm.get('login'), - sid: activeTerm.get('sid'), - cols: undefined, - rows: undefined - }; - - // in case if session already exists, get the data from there - // (for example, when joining an existing session) - if (sessions.has(asView.sid)) { - var sView = createView(sessions.get(asView.sid)); - - asView.parties = sView.parties; - asView.serverIp = sView.serverIp; - asView.serverId = sView.serverId; - asView.active = sView.active; - asView.cols = sView.cols; - asView.rows = sView.rows; - } - - return asView; - }]; - - exports['default'] = { - activeSession: activeSession - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 60: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports.getters = __webpack_require__(59); - module.exports.actions = __webpack_require__(98); - module.exports.activeTermStore = __webpack_require__(99); - -/***/ }, - -/***/ 61: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(102); - - var TLPT_DIALOG_SELECT_NODE_SHOW = _require.TLPT_DIALOG_SELECT_NODE_SHOW; - var TLPT_DIALOG_SELECT_NODE_CLOSE = _require.TLPT_DIALOG_SELECT_NODE_CLOSE; - - var actions = { - showSelectNodeDialog: function showSelectNodeDialog() { - reactor.dispatch(TLPT_DIALOG_SELECT_NODE_SHOW); - }, - - closeSelectNodeDialog: function closeSelectNodeDialog() { - reactor.dispatch(TLPT_DIALOG_SELECT_NODE_CLOSE); - } - }; - - exports['default'] = actions; - module.exports = exports['default']; - -/***/ }, - -/***/ 62: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - var api = __webpack_require__(32); - var cfg = __webpack_require__(11); - - var _require = __webpack_require__(108); - - var showError = _require.showError; - - var logger = __webpack_require__(58).create('Modules/Sessions'); - - var _require2 = __webpack_require__(112); - - var TLPT_SESSINS_RECEIVE = _require2.TLPT_SESSINS_RECEIVE; - var TLPT_SESSINS_UPDATE = _require2.TLPT_SESSINS_UPDATE; - exports['default'] = { - - fetchSession: function fetchSession(sid) { - return api.get(cfg.api.getFetchSessionUrl(sid)).then(function (json) { - if (json && json.session) { - reactor.dispatch(TLPT_SESSINS_UPDATE, json.session); - } - }); - }, - - fetchSessions: function fetchSessions(startDate, endDate) { - logger.info('attemp to fetch sessions', { startDate: startDate, endDate: endDate }); - return api.get(cfg.api.getFetchSessionsUrl(startDate, endDate)).done(function (json) { - reactor.dispatch(TLPT_SESSINS_RECEIVE, json.sessions); - }).fail(function (err) { - showError('Unable to retrieve list of sessions'); - logger.error('fetchSessions', err); - }); - }, - - updateSession: function updateSession(json) { - reactor.dispatch(TLPT_SESSINS_UPDATE, json); - } - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 63: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports.getters = __webpack_require__(113); - module.exports.actions = __webpack_require__(62); - module.exports.activeTermStore = __webpack_require__(114); - -/***/ }, - -/***/ 64: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(44); - - var TRYING_TO_LOGIN = _require.TRYING_TO_LOGIN; - - var _require2 = __webpack_require__(111); - - var requestStatus = _require2.requestStatus; - - var user = [['tlpt_user'], function (currentUser) { - if (!currentUser) { - return null; - } - - var name = currentUser.get('name') || ''; - var shortDisplayName = name[0] || ''; - - return { - name: name, - shortDisplayName: shortDisplayName, - logins: currentUser.get('allowed_logins').toJS() - }; - }]; - - exports['default'] = { - user: user, - loginAttemp: requestStatus(TRYING_TO_LOGIN) - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 93: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var api = __webpack_require__(32); - var session = __webpack_require__(26); - var cfg = __webpack_require__(11); - var $ = __webpack_require__(25); - - var refreshRate = 60000 * 5; // 1 min - - var refreshTokenTimerId = null; - - var auth = { - - signUp: function signUp(name, password, token, inviteToken) { - var data = { user: name, pass: password, second_factor_token: token, invite_token: inviteToken }; - return api.post(cfg.api.createUserPath, data).then(function (user) { - session.setUserData(user); - auth._startTokenRefresher(); - return user; - }); - }, - - login: function login(name, password, token) { - auth._stopTokenRefresher(); - return auth._login(name, password, token).done(auth._startTokenRefresher); - }, - - ensureUser: function ensureUser() { - var userData = session.getUserData(); - if (userData.token) { - // refresh timer will not be set in case of browser refresh event - if (auth._getRefreshTokenTimerId() === null) { - return auth._refreshToken().done(auth._startTokenRefresher); - } - - return $.Deferred().resolve(userData); - } - - return $.Deferred().reject(); - }, - - logout: function logout() { - auth._stopTokenRefresher(); - session.clear(); - session.getHistory().replace({ pathname: cfg.routes.login }); - }, - - _startTokenRefresher: function _startTokenRefresher() { - refreshTokenTimerId = setInterval(auth._refreshToken, refreshRate); - }, - - _stopTokenRefresher: function _stopTokenRefresher() { - clearInterval(refreshTokenTimerId); - refreshTokenTimerId = null; - }, - - _getRefreshTokenTimerId: function _getRefreshTokenTimerId() { - return refreshTokenTimerId; - }, - - _refreshToken: function _refreshToken() { - return api.post(cfg.api.renewTokenPath).then(function (data) { - session.setUserData(data); - return data; - }).fail(function () { - auth.logout(); - }); - }, - - _login: function _login(name, password, token) { - var data = { - user: name, - pass: password, - second_factor_token: token - }; - - return api.post(cfg.api.sessionPath, data, false).then(function (data) { - session.setUserData(data); - return data; - }); - } - }; - - module.exports = auth; - -/***/ }, - -/***/ 94: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var moment = __webpack_require__(1); - - module.exports.monthRange = function () { - var value = arguments.length <= 0 || arguments[0] === undefined ? new Date() : arguments[0]; - - var startDate = moment(value).startOf('month').toDate(); - var endDate = moment(value).endOf('month').toDate(); - return [startDate, endDate]; - }; - -/***/ }, - -/***/ 95: -/***/ function(module, exports) { - - 'use strict'; - - module.exports.isMatch = function (obj, searchValue, _ref) { - var searchableProps = _ref.searchableProps; - var cb = _ref.cb; - - searchValue = searchValue.toLocaleUpperCase(); - var propNames = searchableProps || Object.getOwnPropertyNames(obj); - for (var i = 0; i < propNames.length; i++) { - var targetValue = obj[propNames[i]]; - if (targetValue) { - if (typeof cb === 'function') { - var result = cb(targetValue, searchValue, propNames[i]); - if (result === true) { - return result; - } - } - - if (targetValue.toString().toLocaleUpperCase().indexOf(searchValue) !== -1) { - return true; - } - } - } - - return false; - }; - -/***/ }, - -/***/ 96: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var EventEmitter = __webpack_require__(313).EventEmitter; - var session = __webpack_require__(26); - var cfg = __webpack_require__(11); - - var _require = __webpack_require__(60); - - var actions = _require.actions; - - var Tty = (function (_EventEmitter) { - _inherits(Tty, _EventEmitter); - - function Tty(_ref) { - var serverId = _ref.serverId; - var login = _ref.login; - var sid = _ref.sid; - var rows = _ref.rows; - var cols = _ref.cols; - - _classCallCheck(this, Tty); - - _EventEmitter.call(this); - this.options = { serverId: serverId, login: login, sid: sid, rows: rows, cols: cols }; - this.socket = null; - } - - Tty.prototype.disconnect = function disconnect() { - this.socket.close(); - }; - - Tty.prototype.reconnect = function reconnect(options) { - this.disconnect(); - this.socket.onopen = null; - this.socket.onmessage = null; - this.socket.onclose = null; - - this.connect(options); - }; - - Tty.prototype.connect = function connect(options) { - var _this = this; - - Object.assign(this.options, options); - - var _session$getUserData = session.getUserData(); - - var token = _session$getUserData.token; - - var connStr = cfg.api.getTtyConnStr(_extends({ token: token }, this.options)); - - this.socket = new WebSocket(connStr, 'proto'); - - this.socket.onopen = function () { - _this.emit('open'); - }; - - this.socket.onmessage = function (e) { - _this.emit('data', e.data); - }; - - this.socket.onclose = function () { - _this.emit('close'); - }; - }; - - Tty.prototype.resize = function resize(cols, rows) { - actions.resize(cols, rows); - }; - - Tty.prototype.send = function send(data) { - this.socket.send(data); - }; - - return Tty; - })(EventEmitter); - - module.exports = Tty; - -/***/ }, - -/***/ 97: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_TERM_OPEN: null, - TLPT_TERM_CLOSE: null, - TLPT_TERM_CHANGE_SERVER: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 98: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - var session = __webpack_require__(26); - var uuid = __webpack_require__(282); - var api = __webpack_require__(32); - var cfg = __webpack_require__(11); - var getters = __webpack_require__(59); - var sessionModule = __webpack_require__(63); - - var logger = __webpack_require__(58).create('Current Session'); - - var _require = __webpack_require__(97); - - var TLPT_TERM_OPEN = _require.TLPT_TERM_OPEN; - var TLPT_TERM_CLOSE = _require.TLPT_TERM_CLOSE; - var TLPT_TERM_CHANGE_SERVER = _require.TLPT_TERM_CHANGE_SERVER; - - var actions = { - - changeServer: function changeServer(serverId, login) { - reactor.dispatch(TLPT_TERM_CHANGE_SERVER, { - serverId: serverId, - login: login - }); - }, - - close: function close() { - var _reactor$evaluate = reactor.evaluate(getters.activeSession); - - var isNewSession = _reactor$evaluate.isNewSession; - - reactor.dispatch(TLPT_TERM_CLOSE); - - if (isNewSession) { - session.getHistory().push(cfg.routes.nodes); - } else { - session.getHistory().push(cfg.routes.sessions); - } - }, - - resize: function resize(w, h) { - // some min values - w = w < 5 ? 5 : w; - h = h < 5 ? 5 : h; - - var reqData = { terminal_params: { w: w, h: h } }; - - var _reactor$evaluate2 = reactor.evaluate(getters.activeSession); - - var sid = _reactor$evaluate2.sid; - - logger.info('resize', 'w:' + w + ' and h:' + h); - api.put(cfg.api.getTerminalSessionUrl(sid), reqData).done(function () { - return logger.info('resized'); - }).fail(function (err) { - return logger.error('failed to resize', err); - }); - }, - - openSession: function openSession(sid) { - logger.info('attempt to open session', { sid: sid }); - sessionModule.actions.fetchSession(sid).done(function () { - var sView = reactor.evaluate(sessionModule.getters.sessionViewById(sid)); - var serverId = sView.serverId; - var login = sView.login; - - logger.info('open session', 'OK'); - reactor.dispatch(TLPT_TERM_OPEN, { - serverId: serverId, - login: login, - sid: sid, - isNewSession: false - }); - }).fail(function (err) { - logger.error('open session', err); - session.getHistory().push(cfg.routes.pageNotFound); - }); - }, - - createNewSession: function createNewSession(serverId, login) { - var sid = uuid(); - var routeUrl = cfg.getActiveSessionRouteUrl(sid); - var history = session.getHistory(); - - logger.info('createNewSession', { serverId: serverId, login: login }); - reactor.dispatch(TLPT_TERM_OPEN, { - serverId: serverId, - login: login, - sid: sid, - isNewSession: true - }); - - history.push(routeUrl); - } - - }; - - exports['default'] = actions; - module.exports = exports['default']; - -/***/ }, - -/***/ 99: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(97); - - var TLPT_TERM_OPEN = _require2.TLPT_TERM_OPEN; - var TLPT_TERM_CLOSE = _require2.TLPT_TERM_CLOSE; - var TLPT_TERM_CHANGE_SERVER = _require2.TLPT_TERM_CHANGE_SERVER; - exports['default'] = Store({ - getInitialState: function getInitialState() { - return toImmutable(null); - }, - - initialize: function initialize() { - this.on(TLPT_TERM_OPEN, setActiveTerminal); - this.on(TLPT_TERM_CLOSE, close); - this.on(TLPT_TERM_CHANGE_SERVER, changeServer); - } - }); - - function changeServer(state, _ref) { - var serverId = _ref.serverId; - var login = _ref.login; - - return state.set('serverId', serverId).set('login', login); - } - - function close() { - return toImmutable(null); - } - - function setActiveTerminal(state, _ref2) { - var serverId = _ref2.serverId; - var login = _ref2.login; - var sid = _ref2.sid; - var isNewSession = _ref2.isNewSession; - - return toImmutable({ - serverId: serverId, - login: login, - sid: sid, - isNewSession: isNewSession - }); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 100: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_APP_INIT: null, - TLPT_APP_FAILED: null, - TLPT_APP_READY: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 101: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(100); - - var TLPT_APP_INIT = _require2.TLPT_APP_INIT; - var TLPT_APP_FAILED = _require2.TLPT_APP_FAILED; - var TLPT_APP_READY = _require2.TLPT_APP_READY; - - var initState = toImmutable({ - isReady: false, - isInitializing: false, - isFailed: false - }); - - exports['default'] = Store({ - - getInitialState: function getInitialState() { - return initState.set('isInitializing', true); - }, - - initialize: function initialize() { - this.on(TLPT_APP_INIT, function () { - return initState.set('isInitializing', true); - }); - this.on(TLPT_APP_READY, function () { - return initState.set('isReady', true); - }); - this.on(TLPT_APP_FAILED, function () { - return initState.set('isFailed', true); - }); - } - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 102: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_DIALOG_SELECT_NODE_SHOW: null, - TLPT_DIALOG_SELECT_NODE_CLOSE: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 103: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(102); - - var TLPT_DIALOG_SELECT_NODE_SHOW = _require2.TLPT_DIALOG_SELECT_NODE_SHOW; - var TLPT_DIALOG_SELECT_NODE_CLOSE = _require2.TLPT_DIALOG_SELECT_NODE_CLOSE; - exports['default'] = Store({ - - getInitialState: function getInitialState() { - return toImmutable({ - isSelectNodeDialogOpen: false - }); - }, - - initialize: function initialize() { - this.on(TLPT_DIALOG_SELECT_NODE_SHOW, showSelectNodeDialog); - this.on(TLPT_DIALOG_SELECT_NODE_CLOSE, closeSelectNodeDialog); - } - }); - - function showSelectNodeDialog(state) { - return state.set('isSelectNodeDialogOpen', true); - } - - function closeSelectNodeDialog(state) { - return state.set('isSelectNodeDialogOpen', false); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 104: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_RECEIVE_USER_INVITE: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 105: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(104); - - var TLPT_RECEIVE_USER_INVITE = _require2.TLPT_RECEIVE_USER_INVITE; - exports['default'] = Store({ - getInitialState: function getInitialState() { - return toImmutable(null); - }, - - initialize: function initialize() { - this.on(TLPT_RECEIVE_USER_INVITE, receiveInvite); - } - }); - - function receiveInvite(state, invite) { - return toImmutable(invite); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 106: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_NODES_RECEIVE: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 107: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_NOTIFICATIONS_ADD: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 108: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(107); - - var TLPT_NOTIFICATIONS_ADD = _require.TLPT_NOTIFICATIONS_ADD; - exports['default'] = { - - showError: function showError(text) { - var title = arguments.length <= 1 || arguments[1] === undefined ? 'ERROR' : arguments[1]; - - dispatch({ isError: true, text: text, title: title }); - }, - - showSuccess: function showSuccess(text) { - var title = arguments.length <= 1 || arguments[1] === undefined ? 'SUCCESS' : arguments[1]; - - dispatch({ isSuccess: true, text: text, title: title }); - }, - - showInfo: function showInfo(text) { - var title = arguments.length <= 1 || arguments[1] === undefined ? 'INFO' : arguments[1]; - - dispatch({ isInfo: true, text: text, title: title }); - }, - - showWarning: function showWarning(text) { - var title = arguments.length <= 1 || arguments[1] === undefined ? 'WARNING' : arguments[1]; - - dispatch({ isWarning: true, text: text, title: title }); - } - - }; - - function dispatch(msg) { - reactor.dispatch(TLPT_NOTIFICATIONS_ADD, msg); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 109: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_REST_API_START: null, - TLPT_REST_API_SUCCESS: null, - TLPT_REST_API_FAIL: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 110: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(109); - - var TLPT_REST_API_START = _require.TLPT_REST_API_START; - var TLPT_REST_API_SUCCESS = _require.TLPT_REST_API_SUCCESS; - var TLPT_REST_API_FAIL = _require.TLPT_REST_API_FAIL; - exports['default'] = { - - start: function start(reqType) { - reactor.dispatch(TLPT_REST_API_START, { type: reqType }); - }, - - fail: function fail(reqType, message) { - reactor.dispatch(TLPT_REST_API_FAIL, { type: reqType, message: message }); - }, - - success: function success(reqType) { - reactor.dispatch(TLPT_REST_API_SUCCESS, { type: reqType }); - } - - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 111: -/***/ function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - var defaultObj = { - isProcessing: false, - isError: false, - isSuccess: false, - message: '' - }; - - var requestStatus = function requestStatus(reqType) { - return [['tlpt_rest_api', reqType], function (attemp) { - return attemp ? attemp.toJS() : defaultObj; - }]; - }; - - exports['default'] = { requestStatus: requestStatus }; - module.exports = exports['default']; - -/***/ }, - -/***/ 112: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_SESSINS_RECEIVE: null, - TLPT_SESSINS_UPDATE: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 113: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var toImmutable = _require.toImmutable; - - var reactor = __webpack_require__(7); - var cfg = __webpack_require__(11); - - var sessionsByServer = function sessionsByServer(serverId) { - return [['tlpt_sessions'], function (sessions) { - return sessions.valueSeq().filter(function (item) { - var parties = item.get('parties') || toImmutable([]); - var hasServer = parties.find(function (item2) { - return item2.get('server_id') === serverId; - }); - return hasServer; - }).toList(); - }]; - }; - - var sessionsView = [['tlpt_sessions'], function (sessions) { - return sessions.valueSeq().map(createView).toJS(); - }]; - - var sessionViewById = function sessionViewById(sid) { - return [['tlpt_sessions', sid], function (session) { - if (!session) { - return null; - } - - return createView(session); - }]; - }; - - var partiesBySessionId = function partiesBySessionId(sid) { - return [['tlpt_sessions', sid, 'parties'], function (parties) { - - if (!parties) { - return []; - } - - var lastActiveUsrName = getLastActiveUser(parties).get('user'); - - return parties.map(function (item) { - var user = item.get('user'); - return { - user: item.get('user'), - serverIp: item.get('remote_addr'), - serverId: item.get('server_id'), - isActive: lastActiveUsrName === user - }; - }).toJS(); - }]; - }; - - function getLastActiveUser(parties) { - return parties.sortBy(function (item) { - return new Date(item.get('lastActive')); - }).first(); - } - - function createView(session) { - var sid = session.get('id'); - var serverIp, serverId; - var parties = reactor.evaluate(partiesBySessionId(sid)); - - if (parties.length > 0) { - serverIp = parties[0].serverIp; - serverId = parties[0].serverId; - } - - return { - sid: sid, - sessionUrl: cfg.getActiveSessionRouteUrl(sid), - serverIp: serverIp, - serverId: serverId, - active: session.get('active'), - created: new Date(session.get('created')), - lastActive: new Date(session.get('last_active')), - login: session.get('login'), - parties: parties, - cols: session.getIn(['terminal_params', 'w']), - rows: session.getIn(['terminal_params', 'h']) - }; - } - - exports['default'] = { - partiesBySessionId: partiesBySessionId, - sessionsByServer: sessionsByServer, - sessionsView: sessionsView, - sessionViewById: sessionViewById, - createView: createView - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 114: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(112); - - var TLPT_SESSINS_RECEIVE = _require2.TLPT_SESSINS_RECEIVE; - var TLPT_SESSINS_UPDATE = _require2.TLPT_SESSINS_UPDATE; - exports['default'] = Store({ - getInitialState: function getInitialState() { - return toImmutable({}); - }, - - initialize: function initialize() { - this.on(TLPT_SESSINS_RECEIVE, receiveSessions); - this.on(TLPT_SESSINS_UPDATE, updateSession); - } - }); - - function updateSession(state, json) { - return state.set(json.id, toImmutable(json)); - } - - function receiveSessions(state) { - var jsonArray = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; - - return state.withMutations(function (state) { - jsonArray.forEach(function (item) { - state.set(item.id, toImmutable(item)); - }); - }); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 115: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _keymirror = __webpack_require__(17); - - var _keymirror2 = _interopRequireDefault(_keymirror); - - exports['default'] = _keymirror2['default']({ - TLPT_RECEIVE_USER: null - }); - module.exports = exports['default']; - -/***/ }, - -/***/ 116: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(115); - - var TLPT_RECEIVE_USER = _require.TLPT_RECEIVE_USER; - - var _require2 = __webpack_require__(44); - - var TRYING_TO_SIGN_UP = _require2.TRYING_TO_SIGN_UP; - var TRYING_TO_LOGIN = _require2.TRYING_TO_LOGIN; - - var restApiActions = __webpack_require__(110); - var auth = __webpack_require__(93); - var session = __webpack_require__(26); - var cfg = __webpack_require__(11); - - exports['default'] = { - - ensureUser: function ensureUser(nextState, replace, cb) { - auth.ensureUser().done(function (userData) { - reactor.dispatch(TLPT_RECEIVE_USER, userData.user); - cb(); - }).fail(function () { - replace({ redirectTo: nextState.location.pathname }, cfg.routes.login); - cb(); - }); - }, - - signUp: function signUp(_ref) { - var name = _ref.name; - var psw = _ref.psw; - var token = _ref.token; - var inviteToken = _ref.inviteToken; - - restApiActions.start(TRYING_TO_SIGN_UP); - auth.signUp(name, psw, token, inviteToken).done(function (sessionData) { - reactor.dispatch(TLPT_RECEIVE_USER, sessionData.user); - restApiActions.success(TRYING_TO_SIGN_UP); - session.getHistory().push({ pathname: cfg.routes.app }); - }).fail(function (err) { - restApiActions.fail(TRYING_TO_SIGN_UP, err.responseJSON.message || 'failed to sing up'); - }); - }, - - login: function login(_ref2, redirect) { - var user = _ref2.user; - var password = _ref2.password; - var token = _ref2.token; - - restApiActions.start(TRYING_TO_LOGIN); - auth.login(user, password, token).done(function (sessionData) { - restApiActions.success(TRYING_TO_LOGIN); - reactor.dispatch(TLPT_RECEIVE_USER, sessionData.user); - session.getHistory().push({ pathname: redirect }); - }).fail(function (err) { - return restApiActions.fail(TRYING_TO_LOGIN, err.responseJSON.message); - }); - } - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 117: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports.getters = __webpack_require__(64); - module.exports.actions = __webpack_require__(116); - module.exports.nodeStore = __webpack_require__(118); - -/***/ }, - -/***/ 118: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(115); - - var TLPT_RECEIVE_USER = _require2.TLPT_RECEIVE_USER; - exports['default'] = Store({ - getInitialState: function getInitialState() { - return toImmutable(null); - }, - - initialize: function initialize() { - this.on(TLPT_RECEIVE_USER, receiveUser); - } - - }); - - function receiveUser(state, user) { - return toImmutable(user); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 119: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - - var _require = __webpack_require__(60); - - var actions = _require.actions; - - var colors = ['#1ab394', '#1c84c6', '#23c6c8', '#f8ac59', '#ED5565', '#c2c2c2']; - - var UserIcon = function UserIcon(_ref) { - var name = _ref.name; - var _ref$colorIndex = _ref.colorIndex; - var colorIndex = _ref$colorIndex === undefined ? 0 : _ref$colorIndex; - - var color = colors[colorIndex % colors.length]; - var style = { - 'backgroundColor': color, - 'borderColor': color - }; - - return React.createElement( - 'li', - { title: name }, - React.createElement( - 'span', - { style: style, className: 'btn btn-primary btn-circle text-uppercase' }, - React.createElement( - 'strong', - null, - name[0] - ) - ) - ); - }; - - var SessionLeftPanel = function SessionLeftPanel(_ref2) { - var parties = _ref2.parties; - - parties = parties || []; - var userIcons = parties.map(function (item, index) { - return React.createElement(UserIcon, { key: index, colorIndex: index, name: item.user }); - }); - - return React.createElement( - 'div', - { className: 'grv-terminal-participans' }, - React.createElement( - 'ul', - { className: 'nav' }, - userIcons, - React.createElement( - 'li', - null, - React.createElement( - 'button', - { onClick: actions.close, className: 'btn btn-danger btn-circle', type: 'button' }, - React.createElement('i', { className: 'fa fa-times' }) - ) - ) - ) - ); - }; - - module.exports = SessionLeftPanel; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "sessionLeftPanel.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 120: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - "use strict"; - - exports.__esModule = true; - var React = __webpack_require__(3); - - var NotFound = React.createClass({ - displayName: "NotFound", - - render: function render() { - return React.createElement( - "div", - { className: "grv-error-page" }, - React.createElement( - "div", - { className: "grv-logo-tprt" }, - "Teleport" - ), - React.createElement( - "div", - { className: "grv-warning" }, - React.createElement("i", { className: "fa fa-warning" }), - " " - ), - React.createElement( - "h1", - null, - "Whoops, we cannot find that" - ), - React.createElement( - "div", - null, - "Looks like the page you are looking for isn't here any longer" - ), - React.createElement( - "div", - null, - "If you believe this is an error, please contact your organization administrator." - ), - React.createElement( - "div", - { className: "contact-section" }, - "If you believe this is an issue with Teleport, please ", - React.createElement( - "a", - { href: "https://github.com/gravitational/teleport/issues/new" }, - "create a GitHub issue." - ) - ) - ); - } - }); - - var ExpiredInvite = React.createClass({ - displayName: "ExpiredInvite", - - render: function render() { - return React.createElement( - "div", - { className: "grv-error-page" }, - React.createElement( - "div", - { className: "grv-logo-tprt" }, - "Teleport" - ), - React.createElement( - "div", - { className: "grv-warning" }, - React.createElement("i", { className: "fa fa-warning" }), - " " - ), - React.createElement( - "h1", - null, - "Invite code has expired" - ), - React.createElement( - "div", - null, - "Looks like your invite code isn't valid anymore" - ), - React.createElement( - "div", - { className: "contact-section" }, - "If you believe this is an issue with Teleport, please ", - React.createElement( - "a", - { href: "https://github.com/gravitational/teleport/issues/new" }, - "create a GitHub issue." - ) - ) - ); - } - }); - - exports["default"] = NotFound; - exports.NotFound = NotFound; - exports.ExpiredInvite = ExpiredInvite; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "errorPage.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 121: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - "use strict"; - - var React = __webpack_require__(3); - - var GoogleAuthInfo = React.createClass({ - displayName: "GoogleAuthInfo", - - render: function render() { - return React.createElement( - "div", - { className: "grv-google-auth" }, - React.createElement("div", { className: "grv-google-auth-icon" }), - React.createElement( - "strong", - null, - "Google Authenticator" - ), - React.createElement( - "div", - null, - "Download ", - React.createElement( - "a", - { href: "https://support.google.com/accounts/answer/1066447?hl=en" }, - "Google Authenticator" - ), - " on your phone to access your two factory token" - ) - ); - } - }); - - module.exports = GoogleAuthInfo; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "googleAuthLogo.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 122: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } - - var React = __webpack_require__(3); - - var _require = __webpack_require__(45); - - var Table = _require.Table; - var Column = _require.Column; - var Cell = _require.Cell; - var SortHeaderCell = _require.SortHeaderCell; - var SortTypes = _require.SortTypes; - - var _require2 = __webpack_require__(98); - - var createNewSession = _require2.createNewSession; - - var LinkedStateMixin = __webpack_require__(36); - var _ = __webpack_require__(57); - - var _require3 = __webpack_require__(95); - - var isMatch = _require3.isMatch; - - var TextCell = function TextCell(_ref) { - var rowIndex = _ref.rowIndex; - var data = _ref.data; - var columnKey = _ref.columnKey; - - var props = _objectWithoutProperties(_ref, ['rowIndex', 'data', 'columnKey']); - - return React.createElement( - Cell, - props, - data[rowIndex][columnKey] - ); - }; - - var TagCell = function TagCell(_ref2) { - var rowIndex = _ref2.rowIndex; - var data = _ref2.data; - - var props = _objectWithoutProperties(_ref2, ['rowIndex', 'data']); - - return React.createElement( - Cell, - props, - data[rowIndex].tags.map(function (item, index) { - return React.createElement( - 'span', - { key: index, className: 'label label-default' }, - item.role, - ' ', - React.createElement('li', { className: 'fa fa-long-arrow-right' }), - item.value - ); - }) - ); - }; - - var LoginCell = function LoginCell(_ref3) { - var logins = _ref3.logins; - var onLoginClick = _ref3.onLoginClick; - var rowIndex = _ref3.rowIndex; - var data = _ref3.data; - - var props = _objectWithoutProperties(_ref3, ['logins', 'onLoginClick', 'rowIndex', 'data']); - - if (!logins || logins.length === 0) { - return React.createElement(Cell, props); - } - - var serverId = data[rowIndex].id; - var $lis = []; - - function onClick(i) { - var login = logins[i]; - if (onLoginClick) { - return function () { - return onLoginClick(serverId, login); - }; - } else { - return function () { - return createNewSession(serverId, login); - }; - } - } - - for (var i = 0; i < logins.length; i++) { - $lis.push(React.createElement( - 'li', - { key: i }, - React.createElement( - 'a', - { onClick: onClick(i) }, - logins[i] - ) - )); - } - - return React.createElement( - Cell, - props, - React.createElement( - 'div', - { className: 'btn-group' }, - React.createElement( - 'button', - { type: 'button', onClick: onClick(0), className: 'btn btn-xs btn-primary' }, - logins[0] - ), - $lis.length > 1 ? [React.createElement( - 'button', - { key: 0, 'data-toggle': 'dropdown', className: 'btn btn-default btn-xs dropdown-toggle', 'aria-expanded': 'true' }, - React.createElement('span', { className: 'caret' }) - ), React.createElement( - 'ul', - { key: 1, className: 'dropdown-menu' }, - $lis - )] : null - ) - ); - }; - - var NodeList = React.createClass({ - displayName: 'NodeList', - - mixins: [LinkedStateMixin], - - getInitialState: function getInitialState() /*props*/{ - this.searchableProps = ['addr', 'hostname', 'tags']; - return { filter: '', colSortDirs: { hostname: SortTypes.DESC } }; - }, - - onSortChange: function onSortChange(columnKey, sortDir) { - var _colSortDirs; - - this.setState(_extends({}, this.state, { - colSortDirs: (_colSortDirs = {}, _colSortDirs[columnKey] = sortDir, _colSortDirs) - })); - }, - - searchAndFilterCb: function searchAndFilterCb(targetValue, searchValue, propName) { - if (propName === 'tags') { - return targetValue.some(function (item) { - var role = item.role; - var value = item.value; - - return role.toLocaleUpperCase().indexOf(searchValue) !== -1 || value.toLocaleUpperCase().indexOf(searchValue) !== -1; - }); - } - }, - - sortAndFilter: function sortAndFilter(data) { - var _this = this; - - var filtered = data.filter(function (obj) { - return isMatch(obj, _this.state.filter, { - searchableProps: _this.searchableProps, - cb: _this.searchAndFilterCb - }); - }); - - var columnKey = Object.getOwnPropertyNames(this.state.colSortDirs)[0]; - var sortDir = this.state.colSortDirs[columnKey]; - var sorted = _.sortBy(filtered, columnKey); - if (sortDir === SortTypes.ASC) { - sorted = sorted.reverse(); - } - - return sorted; - }, - - render: function render() { - var data = this.sortAndFilter(this.props.nodeRecords); - var logins = this.props.logins; - var onLoginClick = this.props.onLoginClick; - - return React.createElement( - 'div', - { className: 'grv-nodes grv-page' }, - React.createElement( - 'div', - { className: 'grv-flex grv-header' }, - React.createElement('div', { className: 'grv-flex-column' }), - React.createElement( - 'div', - { className: 'grv-flex-column' }, - React.createElement( - 'h1', - null, - ' Nodes ' - ) - ), - React.createElement( - 'div', - { className: 'grv-flex-column' }, - React.createElement( - 'div', - { className: 'grv-search' }, - React.createElement('input', { valueLink: this.linkState('filter'), placeholder: 'Search...', className: 'form-control input-sm' }) - ) - ) - ), - React.createElement( - 'div', - { className: '' }, - React.createElement( - Table, - { rowCount: data.length, className: 'table-striped grv-nodes-table' }, - React.createElement(Column, { - columnKey: 'hostname', - header: React.createElement(SortHeaderCell, { - sortDir: this.state.colSortDirs.hostname, - onSortChange: this.onSortChange, - title: 'Node' - }), - cell: React.createElement(TextCell, { data: data }) - }), - React.createElement(Column, { - columnKey: 'addr', - header: React.createElement(SortHeaderCell, { - sortDir: this.state.colSortDirs.addr, - onSortChange: this.onSortChange, - title: 'IP' - }), - - cell: React.createElement(TextCell, { data: data }) - }), - React.createElement(Column, { - columnKey: 'tags', - header: React.createElement(Cell, null), - cell: React.createElement(TagCell, { data: data }) - }), - React.createElement(Column, { - columnKey: 'roles', - onLoginClick: onLoginClick, - header: React.createElement( - Cell, - null, - 'Login as' - ), - cell: React.createElement(LoginCell, { data: data, logins: logins }) - }) - ) - ) - ); - } - }); - - module.exports = NodeList; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "nodeList.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 123: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(287); - - var getters = _require.getters; - - var _require2 = __webpack_require__(61); - - var closeSelectNodeDialog = _require2.closeSelectNodeDialog; - - var NodeList = __webpack_require__(122); - var activeSessionGetters = __webpack_require__(59); - var nodeGetters = __webpack_require__(43); - var $ = __webpack_require__(25); - - var SelectNodeDialog = React.createClass({ - displayName: 'SelectNodeDialog', - - mixins: [reactor.ReactMixin], - - getDataBindings: function getDataBindings() { - return { - dialogs: getters.dialogs - }; - }, - - render: function render() { - return this.state.dialogs.isSelectNodeDialogOpen ? React.createElement(Dialog, null) : null; - } - }); - - var Dialog = React.createClass({ - displayName: 'Dialog', - - onLoginClick: function onLoginClick(serverId) { - if (SelectNodeDialog.onServerChangeCallBack) { - SelectNodeDialog.onServerChangeCallBack({ serverId: serverId }); - } - - closeSelectNodeDialog(); - }, - - componentWillUnmount: function componentWillUnmount() { - $('.modal').modal('hide'); - }, - - componentDidMount: function componentDidMount() { - $('.modal').modal('show'); - }, - - render: function render() { - var activeSession = reactor.evaluate(activeSessionGetters.activeSession) || {}; - var nodeRecords = reactor.evaluate(nodeGetters.nodeListView); - var logins = [activeSession.login]; - - return React.createElement( - 'div', - { className: 'modal fade grv-dialog-select-node', tabIndex: -1, role: 'dialog' }, - React.createElement( - 'div', - { className: 'modal-dialog' }, - React.createElement( - 'div', - { className: 'modal-content' }, - React.createElement('div', { className: 'modal-header' }), - React.createElement( - 'div', - { className: 'modal-body' }, - React.createElement(NodeList, { nodeRecords: nodeRecords, logins: logins, onLoginClick: this.onLoginClick }) - ), - React.createElement( - 'div', - { className: 'modal-footer' }, - React.createElement( - 'button', - { onClick: closeSelectNodeDialog, type: 'button', className: 'btn btn-primary' }, - 'Close' - ) - ) - ) - ) - ); - } - }); - - SelectNodeDialog.onServerChangeCallBack = function () {}; - - module.exports = SelectNodeDialog; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "selectNodeDialog.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 124: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - exports.__esModule = true; - - function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(37); - - var Link = _require.Link; - - var _require2 = __webpack_require__(43); - - var nodeHostNameByServerId = _require2.nodeHostNameByServerId; - - var _require3 = __webpack_require__(45); - - var Cell = _require3.Cell; - - var moment = __webpack_require__(1); - - var DateCreatedCell = function DateCreatedCell(_ref) { - var rowIndex = _ref.rowIndex; - var data = _ref.data; - - var props = _objectWithoutProperties(_ref, ['rowIndex', 'data']); - - var created = data[rowIndex].created; - var displayDate = moment(created).format('l LTS'); - return React.createElement( - Cell, - props, - displayDate - ); - }; - - var DurationCell = function DurationCell(_ref2) { - var rowIndex = _ref2.rowIndex; - var data = _ref2.data; - - var props = _objectWithoutProperties(_ref2, ['rowIndex', 'data']); - - var created = data[rowIndex].created; - var lastActive = data[rowIndex].lastActive; - - var end = moment(created); - var now = moment(lastActive); - var duration = moment.duration(now.diff(end)); - var displayDate = duration.humanize(); - - return React.createElement( - Cell, - props, - displayDate - ); - }; - - var SingleUserCell = function SingleUserCell(_ref3) { - var rowIndex = _ref3.rowIndex; - var data = _ref3.data; - - var props = _objectWithoutProperties(_ref3, ['rowIndex', 'data']); - - return React.createElement( - Cell, - props, - React.createElement( - 'span', - { className: 'grv-sessions-user label label-default' }, - data[rowIndex].login - ) - ); - }; - - var UsersCell = function UsersCell(_ref4) { - var rowIndex = _ref4.rowIndex; - var data = _ref4.data; - - var props = _objectWithoutProperties(_ref4, ['rowIndex', 'data']); - - var $users = data[rowIndex].parties.map(function (item, itemIndex) { - return React.createElement( - 'span', - { key: itemIndex, className: 'grv-sessions-user label label-default' }, - item.user - ); - }); - - return React.createElement( - Cell, - props, - React.createElement( - 'div', - null, - $users - ) - ); - }; - - var ButtonCell = function ButtonCell(_ref5) { - var rowIndex = _ref5.rowIndex; - var data = _ref5.data; - - var props = _objectWithoutProperties(_ref5, ['rowIndex', 'data']); - - var _data$rowIndex = data[rowIndex]; - var sessionUrl = _data$rowIndex.sessionUrl; - var active = _data$rowIndex.active; - - var _ref6 = active ? ['join', 'btn-warning'] : ['play', 'btn-primary']; - - var actionText = _ref6[0]; - var actionClass = _ref6[1]; - - return React.createElement( - Cell, - props, - React.createElement( - Link, - { to: sessionUrl, className: "btn " + actionClass + " btn-xs", type: 'button' }, - actionText - ) - ); - }; - - var EmptyList = function EmptyList(_ref7) { - var text = _ref7.text; - return React.createElement( - 'div', - { className: 'grv-sessions-empty text-center text-muted' }, - React.createElement( - 'span', - null, - text - ) - ); - }; - - var NodeCell = function NodeCell(_ref8) { - var rowIndex = _ref8.rowIndex; - var data = _ref8.data; - - var props = _objectWithoutProperties(_ref8, ['rowIndex', 'data']); - - var serverId = data[rowIndex].serverId; - - var hostname = reactor.evaluate(nodeHostNameByServerId(serverId)) || 'unknown'; - - return React.createElement( - Cell, - props, - hostname - ); - }; - - exports['default'] = ButtonCell; - exports.ButtonCell = ButtonCell; - exports.UsersCell = UsersCell; - exports.DurationCell = DurationCell; - exports.DateCreatedCell = DateCreatedCell; - exports.EmptyList = EmptyList; - exports.SingleUserCell = SingleUserCell; - exports.NodeCell = NodeCell; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "listItems.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 125: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var Term = __webpack_require__(427); - var React = __webpack_require__(3); - var $ = __webpack_require__(25); - - var _require = __webpack_require__(57); - - var debounce = _require.debounce; - var isNumber = _require.isNumber; - - Term.colors[256] = '#252323'; - - var DISCONNECT_TXT = '\x1b[31mdisconnected\x1b[m\r\n'; - var CONNECTED_TXT = 'Connected!\r\n'; - - var TtyTerminal = React.createClass({ - displayName: 'TtyTerminal', - - getInitialState: function getInitialState() { - var _this = this; - - this.rows = this.props.rows; - this.cols = this.props.cols; - this.tty = this.props.tty; - - this.debouncedResize = debounce(function () { - _this.resize(); - _this.tty.resize(_this.cols, _this.rows); - }, 200); - - return {}; - }, - - componentDidMount: function componentDidMount() { - var _this2 = this; - - this.term = new Term({ - cols: 5, - rows: 5, - useStyle: true, - screenKeys: true, - cursorBlink: true - }); - - this.term.open(this.refs.container); - this.term.on('data', function (data) { - return _this2.tty.send(data); - }); - - this.resize(this.cols, this.rows); - - this.tty.on('open', function () { - return _this2.term.write(CONNECTED_TXT); - }); - this.tty.on('close', function () { - return _this2.term.write(DISCONNECT_TXT); - }); - this.tty.on('data', function (data) { - return _this2.term.write(data); - }); - this.tty.on('reset', function () { - return _this2.term.reset(); - }); - - this.tty.connect({ cols: this.cols, rows: this.rows }); - window.addEventListener('resize', this.debouncedResize); - }, - - componentWillUnmount: function componentWillUnmount() { - this.term.destroy(); - window.removeEventListener('resize', this.debouncedResize); - }, - - shouldComponentUpdate: function shouldComponentUpdate(newProps) { - var rows = newProps.rows; - var cols = newProps.cols; - - if (!isNumber(rows) || !isNumber(cols)) { - return false; - } - - if (rows !== this.rows || cols !== this.cols) { - this.resize(cols, rows); - } - - return false; - }, - - render: function render() { - return React.createElement( - 'div', - { className: 'grv-terminal', id: 'terminal-box', ref: 'container' }, - ' ' - ); - }, - - resize: function resize(cols, rows) { - // if not defined, use the size of the container - if (!isNumber(cols) || !isNumber(rows)) { - var dim = this._getDimensions(); - cols = dim.cols; - rows = dim.rows; - } - - this.cols = cols; - this.rows = rows; - - this.term.resize(this.cols, this.rows); - }, - - _getDimensions: function _getDimensions() { - var $container = $(this.refs.container); - var fakeRow = $('
 
'); - - $container.find('.terminal').append(fakeRow); - // get div height - var fakeColHeight = fakeRow[0].getBoundingClientRect().height; - // get span width - var fakeColWidth = fakeRow.children().first()[0].getBoundingClientRect().width; - - var width = $container[0].clientWidth; - var height = $container[0].clientHeight; - - var cols = Math.floor(width / fakeColWidth); - var rows = Math.floor(height / fakeColHeight); - fakeRow.remove(); - - return { cols: cols, rows: rows }; - } - - }); - - TtyTerminal.propTypes = { - tty: React.PropTypes.object.isRequired - }; - - module.exports = TtyTerminal; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "terminal.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 280: -/***/ function(module, exports, __webpack_require__) { - - /* - * The MIT License (MIT) - * Copyright (c) 2015 Ryan Florence, Michael Jackson - * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - 'use strict'; - - exports.__esModule = true; - exports.compilePattern = compilePattern; - exports.matchPattern = matchPattern; - exports.getParamNames = getParamNames; - exports.getParams = getParams; - exports.formatPattern = formatPattern; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _invariant = __webpack_require__(12); - - var _invariant2 = _interopRequireDefault(_invariant); - - function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - - function escapeSource(string) { - return escapeRegExp(string).replace(/\/+/g, '/+'); - } - - function _compilePattern(pattern) { - var regexpSource = ''; - var paramNames = []; - var tokens = []; - - var match = undefined, - lastIndex = 0, - matcher = /:([a-zA-Z_$][a-zA-Z0-9_$]*)|\*\*|\*|\(|\)/g; - /*eslint no-cond-assign: 0*/ - while (match = matcher.exec(pattern)) { - if (match.index !== lastIndex) { - tokens.push(pattern.slice(lastIndex, match.index)); - regexpSource += escapeSource(pattern.slice(lastIndex, match.index)); - } - - if (match[1]) { - regexpSource += '([^/?#]+)'; - paramNames.push(match[1]); - } else if (match[0] === '**') { - regexpSource += '([\\s\\S]*)'; - paramNames.push('splat'); - } else if (match[0] === '*') { - regexpSource += '([\\s\\S]*?)'; - paramNames.push('splat'); - } else if (match[0] === '(') { - regexpSource += '(?:'; - } else if (match[0] === ')') { - regexpSource += ')?'; - } - - tokens.push(match[0]); - - lastIndex = matcher.lastIndex; - } - - if (lastIndex !== pattern.length) { - tokens.push(pattern.slice(lastIndex, pattern.length)); - regexpSource += escapeSource(pattern.slice(lastIndex, pattern.length)); - } - - return { - pattern: pattern, - regexpSource: regexpSource, - paramNames: paramNames, - tokens: tokens - }; - } - - var CompiledPatternsCache = {}; - - function compilePattern(pattern) { - if (!(pattern in CompiledPatternsCache)) CompiledPatternsCache[pattern] = _compilePattern(pattern); - - return CompiledPatternsCache[pattern]; - } - - /** - * Attempts to match a pattern on the given pathname. Patterns may use - * the following special characters: - * - * - :paramName Matches a URL segment up to the next /, ?, or #. The - * captured string is considered a "param" - * - () Wraps a segment of the URL that is optional - * - * Consumes (non-greedy) all characters up to the next - * character in the pattern, or to the end of the URL if - * there is none - * - ** Consumes (greedy) all characters up to the next character - * in the pattern, or to the end of the URL if there is none - * - * The return value is an object with the following properties: - * - * - remainingPathname - * - paramNames - * - paramValues - */ - - function matchPattern(pattern, pathname) { - // Make leading slashes consistent between pattern and pathname. - if (pattern.charAt(0) !== '/') { - pattern = '/' + pattern; - } - if (pathname.charAt(0) !== '/') { - pathname = '/' + pathname; - } - - var _compilePattern2 = compilePattern(pattern); - - var regexpSource = _compilePattern2.regexpSource; - var paramNames = _compilePattern2.paramNames; - var tokens = _compilePattern2.tokens; - - regexpSource += '/*'; // Capture path separators - - // Special-case patterns like '*' for catch-all routes. - var captureRemaining = tokens[tokens.length - 1] !== '*'; - - if (captureRemaining) { - // This will match newlines in the remaining path. - regexpSource += '([\\s\\S]*?)'; - } - - var match = pathname.match(new RegExp('^' + regexpSource + '$', 'i')); - - var remainingPathname = undefined, - paramValues = undefined; - if (match != null) { - if (captureRemaining) { - remainingPathname = match.pop(); - var matchedPath = match[0].substr(0, match[0].length - remainingPathname.length); - - // If we didn't match the entire pathname, then make sure that the match - // we did get ends at a path separator (potentially the one we added - // above at the beginning of the path, if the actual match was empty). - if (remainingPathname && matchedPath.charAt(matchedPath.length - 1) !== '/') { - return { - remainingPathname: null, - paramNames: paramNames, - paramValues: null - }; - } - } else { - // If this matched at all, then the match was the entire pathname. - remainingPathname = ''; - } - - paramValues = match.slice(1).map(function (v) { - return v != null ? decodeURIComponent(v) : v; - }); - } else { - remainingPathname = paramValues = null; - } - - return { - remainingPathname: remainingPathname, - paramNames: paramNames, - paramValues: paramValues - }; - } - - function getParamNames(pattern) { - return compilePattern(pattern).paramNames; - } - - function getParams(pattern, pathname) { - var _matchPattern = matchPattern(pattern, pathname); - - var paramNames = _matchPattern.paramNames; - var paramValues = _matchPattern.paramValues; - - if (paramValues != null) { - return paramNames.reduce(function (memo, paramName, index) { - memo[paramName] = paramValues[index]; - return memo; - }, {}); - } - - return null; - } - - /** - * Returns a version of the given pattern with params interpolated. Throws - * if there is a dynamic segment of the pattern for which there is no param. - */ - - function formatPattern(pattern, params) { - params = params || {}; - - var _compilePattern3 = compilePattern(pattern); - - var tokens = _compilePattern3.tokens; - - var parenCount = 0, - pathname = '', - splatIndex = 0; - - var token = undefined, - paramName = undefined, - paramValue = undefined; - for (var i = 0, len = tokens.length; i < len; ++i) { - token = tokens[i]; - - if (token === '*' || token === '**') { - paramValue = Array.isArray(params.splat) ? params.splat[splatIndex++] : params.splat; - - _invariant2['default'](paramValue != null || parenCount > 0, 'Missing splat #%s for path "%s"', splatIndex, pattern); - - if (paramValue != null) pathname += encodeURI(paramValue); - } else if (token === '(') { - parenCount += 1; - } else if (token === ')') { - parenCount -= 1; - } else if (token.charAt(0) === ':') { - paramName = token.substring(1); - paramValue = params[paramName]; - - _invariant2['default'](paramValue != null || parenCount > 0, 'Missing "%s" parameter for path "%s"', paramName, pattern); - - if (paramValue != null) pathname += encodeURIComponent(paramValue); - } else { - pathname += token; - } - } - - return pathname.replace(/\/+/g, '/'); - } - -/***/ }, - -/***/ 281: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var Tty = __webpack_require__(96); - var api = __webpack_require__(32); - var cfg = __webpack_require__(11); - - var TtyPlayer = (function (_Tty) { - _inherits(TtyPlayer, _Tty); - - function TtyPlayer(_ref) { - var sid = _ref.sid; - - _classCallCheck(this, TtyPlayer); - - _Tty.call(this, {}); - this.sid = sid; - this.current = 1; - this.length = -1; - this.ttySteam = new Array(); - this.isLoaind = false; - this.isPlaying = false; - this.isError = false; - this.isReady = false; - this.isLoading = true; - } - - TtyPlayer.prototype.send = function send() {}; - - TtyPlayer.prototype.resize = function resize() {}; - - TtyPlayer.prototype.connect = function connect() { - var _this = this; - - api.get(cfg.api.getFetchSessionLengthUrl(this.sid)).done(function (data) { - _this.length = data.count; - _this.isReady = true; - }).fail(function () { - _this.isError = true; - }).always(function () { - _this._change(); - }); - }; - - TtyPlayer.prototype.move = function move(newPos) { - if (!this.isReady) { - return; - } - - if (newPos === undefined) { - newPos = this.current + 1; - } - - if (newPos > this.length) { - newPos = this.length; - this.stop(); - } - - if (newPos === 0) { - newPos = 1; - } - - if (this.isPlaying) { - if (this.current < newPos) { - this._showChunk(this.current, newPos); - } else { - this.emit('reset'); - this._showChunk(this.current, newPos); - } - } else { - this.current = newPos; - } - - this._change(); - }; - - TtyPlayer.prototype.stop = function stop() { - this.isPlaying = false; - this.timer = clearInterval(this.timer); - this._change(); - }; - - TtyPlayer.prototype.play = function play() { - if (this.isPlaying) { - return; - } - - this.isPlaying = true; - - // start from the beginning if at the end - if (this.current === this.length) { - this.current = 1; - this.emit('reset'); - } - - this.timer = setInterval(this.move.bind(this), 150); - this._change(); - }; - - TtyPlayer.prototype._shouldFetch = function _shouldFetch(start, end) { - for (var i = start; i < end; i++) { - if (this.ttySteam[i] === undefined) { - return true; - } - } - - return false; - }; - - TtyPlayer.prototype._fetch = function _fetch(start, end) { - var _this2 = this; - - end = end + 50; - end = end > this.length ? this.length : end; - return api.get(cfg.api.getFetchSessionChunkUrl({ sid: this.sid, start: start, end: end })).done(function (response) { - for (var i = 0; i < end - start; i++) { - var data = atob(response.chunks[i].data) || ''; - var delay = response.chunks[i].delay; - _this2.ttySteam[start + i] = { data: data, delay: delay }; - } - }); - }; - - TtyPlayer.prototype._showChunk = function _showChunk(start, end) { - var _this3 = this; - - var display = function display() { - for (var i = start; i < end; i++) { - _this3.emit('data', _this3.ttySteam[i].data); - } - _this3.current = end; - }; - - if (this._shouldFetch(start, end)) { - this._fetch(start, end).then(display); - } else { - display(); - } - }; - - TtyPlayer.prototype._change = function _change() { - this.emit('change'); - }; - - return TtyPlayer; - })(Tty); - - exports['default'] = TtyPlayer; - module.exports = exports['default']; - -/***/ }, - -/***/ 282: -/***/ function(module, exports) { - - 'use strict'; - - module.exports = function () { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, - v = c == 'x' ? r : r & 0x3 | 0x8; - return v.toString(16); - }); - }; - -/***/ }, - -/***/ 283: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(62); - - var fetchSessions = _require.fetchSessions; - - var _require2 = __webpack_require__(292); - - var fetchNodes = _require2.fetchNodes; - - var _require3 = __webpack_require__(94); - - var monthRange = _require3.monthRange; - - var $ = __webpack_require__(25); - - var _require4 = __webpack_require__(100); - - var TLPT_APP_INIT = _require4.TLPT_APP_INIT; - var TLPT_APP_FAILED = _require4.TLPT_APP_FAILED; - var TLPT_APP_READY = _require4.TLPT_APP_READY; - - var actions = { - - initApp: function initApp() { - reactor.dispatch(TLPT_APP_INIT); - actions.fetchNodesAndSessions().done(function () { - return reactor.dispatch(TLPT_APP_READY); - }).fail(function () { - return reactor.dispatch(TLPT_APP_FAILED); - }); - }, - - fetchNodesAndSessions: function fetchNodesAndSessions() { - var _monthRange = monthRange(); - - var start = _monthRange[0]; - var end = _monthRange[1]; - - return $.when(fetchNodes(), fetchSessions(start, end)); - } - }; - - exports['default'] = actions; - module.exports = exports['default']; - -/***/ }, - -/***/ 284: -/***/ function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - var appState = [['tlpt'], function (app) { - return app.toJS(); - }]; - - exports['default'] = { - appState: appState - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 285: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports.getters = __webpack_require__(284); - module.exports.actions = __webpack_require__(283); - module.exports.appStore = __webpack_require__(101); - -/***/ }, - -/***/ 286: -/***/ function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - var dialogs = [['tlpt_dialogs'], function (state) { - return state.toJS(); - }]; - - exports['default'] = { - dialogs: dialogs - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 287: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports.getters = __webpack_require__(286); - module.exports.actions = __webpack_require__(61); - module.exports.dialogStore = __webpack_require__(103); - -/***/ }, - -/***/ 288: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var reactor = __webpack_require__(7); - reactor.registerStores({ - 'tlpt': __webpack_require__(101), - 'tlpt_dialogs': __webpack_require__(103), - 'tlpt_current_session': __webpack_require__(99), - 'tlpt_user': __webpack_require__(118), - 'tlpt_nodes': __webpack_require__(293), - 'tlpt_invite': __webpack_require__(105), - 'tlpt_rest_api': __webpack_require__(296), - 'tlpt_sessions': __webpack_require__(114), - 'tlpt_notifications': __webpack_require__(295) - }); - -/***/ }, - -/***/ 289: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(104); - - var TLPT_RECEIVE_USER_INVITE = _require.TLPT_RECEIVE_USER_INVITE; - - var _require2 = __webpack_require__(44); - - var FETCHING_INVITE = _require2.FETCHING_INVITE; - - var restApiActions = __webpack_require__(110); - var api = __webpack_require__(32); - var cfg = __webpack_require__(11); - - exports['default'] = { - fetchInvite: function fetchInvite(inviteToken) { - var path = cfg.api.getInviteUrl(inviteToken); - restApiActions.start(FETCHING_INVITE); - api.get(path).done(function (invite) { - restApiActions.success(FETCHING_INVITE); - reactor.dispatch(TLPT_RECEIVE_USER_INVITE, invite); - }).fail(function (err) { - restApiActions.fail(FETCHING_INVITE, err.responseJSON.message); - }); - } - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 290: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(44); - - var TRYING_TO_SIGN_UP = _require.TRYING_TO_SIGN_UP; - var FETCHING_INVITE = _require.FETCHING_INVITE; - - var _require2 = __webpack_require__(111); - - var requestStatus = _require2.requestStatus; - - var invite = [['tlpt_invite'], function (invite) { - return invite; - }]; - - exports['default'] = { - invite: invite, - attemp: requestStatus(TRYING_TO_SIGN_UP), - fetchingInvite: requestStatus(FETCHING_INVITE) - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 291: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports.getters = __webpack_require__(290); - module.exports.actions = __webpack_require__(289); - module.exports.nodeStore = __webpack_require__(105); - -/***/ }, - -/***/ 292: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(106); - - var TLPT_NODES_RECEIVE = _require.TLPT_NODES_RECEIVE; - - var api = __webpack_require__(32); - var cfg = __webpack_require__(11); - - var _require2 = __webpack_require__(108); - - var showError = _require2.showError; - - var logger = __webpack_require__(58).create('Modules/Nodes'); - - exports['default'] = { - fetchNodes: function fetchNodes() { - api.get(cfg.api.nodesPath).done(function () { - var data = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; - - var nodeArray = data.nodes.map(function (item) { - return item.node; - }); - reactor.dispatch(TLPT_NODES_RECEIVE, nodeArray); - }).fail(function (err) { - showError('Unable to retrieve list of nodes'); - logger.error('fetchNodes', err); - }); - } - }; - module.exports = exports['default']; - -/***/ }, - -/***/ 293: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(106); - - var TLPT_NODES_RECEIVE = _require2.TLPT_NODES_RECEIVE; - exports['default'] = Store({ - getInitialState: function getInitialState() { - return toImmutable([]); - }, - - initialize: function initialize() { - this.on(TLPT_NODES_RECEIVE, receiveNodes); - } - }); - - function receiveNodes(state, nodeArray) { - return toImmutable(nodeArray); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 294: -/***/ function(module, exports) { - - 'use strict'; - - exports.__esModule = true; - var lastMessage = [['tlpt_notifications'], function (notifications) { - return notifications.last(); - }]; - exports.lastMessage = lastMessage; - -/***/ }, - -/***/ 295: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _nuclearJs = __webpack_require__(14); - - var _actionTypes = __webpack_require__(107); - - exports['default'] = _nuclearJs.Store({ - getInitialState: function getInitialState() { - return new _nuclearJs.Immutable.OrderedMap(); - }, - - initialize: function initialize() { - this.on(_actionTypes.TLPT_NOTIFICATIONS_ADD, addNotification); - } - }); - - function addNotification(state, message) { - return state.set(state.size, message); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 296: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var _require = __webpack_require__(14); - - var Store = _require.Store; - var toImmutable = _require.toImmutable; - - var _require2 = __webpack_require__(109); - - var TLPT_REST_API_START = _require2.TLPT_REST_API_START; - var TLPT_REST_API_SUCCESS = _require2.TLPT_REST_API_SUCCESS; - var TLPT_REST_API_FAIL = _require2.TLPT_REST_API_FAIL; - exports['default'] = Store({ - getInitialState: function getInitialState() { - return toImmutable({}); - }, - - initialize: function initialize() { - this.on(TLPT_REST_API_START, start); - this.on(TLPT_REST_API_FAIL, fail); - this.on(TLPT_REST_API_SUCCESS, success); - } - }); - - function start(state, request) { - return state.set(request.type, toImmutable({ isProcessing: true })); - } - - function fail(state, request) { - return state.set(request.type, toImmutable({ isFailed: true, message: request.message })); - } - - function success(state, request) { - return state.set(request.type, toImmutable({ isSuccess: true })); - } - module.exports = exports['default']; - -/***/ }, - -/***/ 297: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var NavLeftBar = __webpack_require__(305); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(285); - - var actions = _require.actions; - var getters = _require.getters; - - var SelectNodeDialog = __webpack_require__(123); - var NotificationHost = __webpack_require__(308); - - var App = React.createClass({ - displayName: 'App', - - mixins: [reactor.ReactMixin], - - getDataBindings: function getDataBindings() { - return { - app: getters.appState - }; - }, - - componentWillMount: function componentWillMount() { - actions.initApp(); - this.refreshInterval = setInterval(actions.fetchNodesAndSessions, 35000); - }, - - componentWillUnmount: function componentWillUnmount() { - clearInterval(this.refreshInterval); - }, - - render: function render() { - if (this.state.app.isInitializing) { - return null; - } - - return React.createElement( - 'div', - { className: 'grv-tlpt grv-flex grv-flex-row' }, - React.createElement(SelectNodeDialog, null), - React.createElement(NotificationHost, null), - this.props.CurrentSessionHost, - React.createElement(NavLeftBar, null), - this.props.children - ); - } - }); - - module.exports = App; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "app.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 298: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(43); - - var nodeHostNameByServerId = _require.nodeHostNameByServerId; - - var Tty = __webpack_require__(96); - var TtyTerminal = __webpack_require__(125); - var EventStreamer = __webpack_require__(299); - var SessionLeftPanel = __webpack_require__(119); - - var _require2 = __webpack_require__(61); - - var closeSelectNodeDialog = _require2.closeSelectNodeDialog; - - var SelectNodeDialog = __webpack_require__(123); - - var ActiveSession = React.createClass({ - displayName: 'ActiveSession', - - componentWillUnmount: function componentWillUnmount() { - closeSelectNodeDialog(); - }, - - render: function render() { - var _props$activeSession = this.props.activeSession; - var login = _props$activeSession.login; - var parties = _props$activeSession.parties; - var serverId = _props$activeSession.serverId; - - var serverLabelText = ''; - if (serverId) { - var hostname = reactor.evaluate(nodeHostNameByServerId(serverId)); - serverLabelText = login + '@' + hostname; - } - - return React.createElement( - 'div', - { className: 'grv-current-session' }, - React.createElement(SessionLeftPanel, { parties: parties }), - React.createElement( - 'div', - { className: 'grv-current-session-server-info' }, - React.createElement( - 'h3', - null, - serverLabelText - ) - ), - React.createElement(TtyConnection, this.props.activeSession) - ); - } - }); - - var TtyConnection = React.createClass({ - displayName: 'TtyConnection', - - getInitialState: function getInitialState() { - var _this = this; - - this.tty = new Tty(this.props); - this.tty.on('open', function () { - return _this.setState(_extends({}, _this.state, { isConnected: true })); - }); - - var _props = this.props; - var serverId = _props.serverId; - var login = _props.login; - - return { serverId: serverId, login: login, isConnected: false }; - }, - - componentDidMount: function componentDidMount() { - // temporary hack - SelectNodeDialog.onServerChangeCallBack = this.componentWillReceiveProps.bind(this); - }, - - componentWillUnmount: function componentWillUnmount() { - SelectNodeDialog.onServerChangeCallBack = null; - this.tty.disconnect(); - }, - - componentWillReceiveProps: function componentWillReceiveProps(nextProps) { - var serverId = nextProps.serverId; - - if (serverId && serverId !== this.state.serverId) { - this.tty.reconnect({ serverId: serverId }); - this.refs.ttyCmntInstance.term.focus(); - this.setState(_extends({}, this.state, { serverId: serverId })); - } - }, - - render: function render() { - return React.createElement( - 'div', - { style: { height: '100%' } }, - React.createElement(TtyTerminal, { ref: 'ttyCmntInstance', tty: this.tty, cols: this.props.cols, rows: this.props.rows }), - this.state.isConnected ? React.createElement(EventStreamer, { sid: this.props.sid }) : null - ); - } - }); - - module.exports = ActiveSession; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "activeSession.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 299: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - exports.__esModule = true; - var cfg = __webpack_require__(11); - var React = __webpack_require__(3); - var session = __webpack_require__(26); - - var _require = __webpack_require__(62); - - var updateSession = _require.updateSession; - - var EventStreamer = React.createClass({ - displayName: 'EventStreamer', - - componentDidMount: function componentDidMount() { - var sid = this.props.sid; - - var _session$getUserData = session.getUserData(); - - var token = _session$getUserData.token; - - var connStr = cfg.api.getEventStreamConnStr(token, sid); - - this.socket = new WebSocket(connStr, 'proto'); - this.socket.onmessage = function (event) { - try { - var json = JSON.parse(event.data); - updateSession(json.session); - } catch (err) { - console.log('failed to parse event stream data'); - } - }; - this.socket.onclose = function () {}; - }, - - componentWillUnmount: function componentWillUnmount() { - this.socket.close(); - }, - - shouldComponentUpdate: function shouldComponentUpdate() { - return false; - }, - - render: function render() { - return null; - } - }); - - exports['default'] = EventStreamer; - module.exports = exports['default']; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "eventStreamer.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 300: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(60); - - var getters = _require.getters; - var actions = _require.actions; - - var SessionPlayer = __webpack_require__(301); - var ActiveSession = __webpack_require__(298); - - var CurrentSessionHost = React.createClass({ - displayName: 'CurrentSessionHost', - - mixins: [reactor.ReactMixin], - - getDataBindings: function getDataBindings() { - return { - currentSession: getters.activeSession - }; - }, - - componentDidMount: function componentDidMount() { - var sid = this.props.params.sid; - - if (!this.state.currentSession) { - actions.openSession(sid); - } - }, - - render: function render() { - var currentSession = this.state.currentSession; - if (!currentSession) { - return null; - } - - if (currentSession.isNewSession || currentSession.active) { - return React.createElement(ActiveSession, { activeSession: currentSession }); - } - - return React.createElement(SessionPlayer, { activeSession: currentSession }); - } - }); - - module.exports = CurrentSessionHost; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "main.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 301: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - exports.__esModule = true; - var React = __webpack_require__(3); - var ReactSlider = __webpack_require__(238); - var TtyPlayer = __webpack_require__(281); - var TtyTerminal = __webpack_require__(125); - var SessionLeftPanel = __webpack_require__(119); - - var SessionPlayer = React.createClass({ - displayName: 'SessionPlayer', - - calculateState: function calculateState() { - return { - length: this.tty.length, - min: 1, - isPlaying: this.tty.isPlaying, - current: this.tty.current, - canPlay: this.tty.length > 1 - }; - }, - - getInitialState: function getInitialState() { - var sid = this.props.activeSession.sid; - this.tty = new TtyPlayer({ sid: sid }); - return this.calculateState(); - }, - - componentWillUnmount: function componentWillUnmount() { - this.tty.stop(); - this.tty.removeAllListeners(); - }, - - componentDidMount: function componentDidMount() { - var _this = this; - - this.tty.on('change', function () { - var newState = _this.calculateState(); - _this.setState(newState); - }); - }, - - togglePlayStop: function togglePlayStop() { - if (this.state.isPlaying) { - this.tty.stop(); - } else { - this.tty.play(); - } - }, - - move: function move(value) { - this.tty.move(value); - }, - - onBeforeChange: function onBeforeChange() { - this.tty.stop(); - }, - - onAfterChange: function onAfterChange(value) { - this.tty.play(); - this.tty.move(value); - }, - - render: function render() { - var isPlaying = this.state.isPlaying; - - return React.createElement( - 'div', - { className: 'grv-current-session grv-session-player' }, - React.createElement(SessionLeftPanel, null), - React.createElement(TtyTerminal, { ref: 'term', tty: this.tty, cols: '5', rows: '5' }), - React.createElement(ReactSlider, { - min: this.state.min, - max: this.state.length, - value: this.state.current, - onAfterChange: this.onAfterChange, - onBeforeChange: this.onBeforeChange, - defaultValue: 1, - withBars: true, - className: 'grv-slider' }), - React.createElement( - 'button', - { className: 'btn', onClick: this.togglePlayStop }, - isPlaying ? React.createElement('i', { className: 'fa fa-stop' }) : React.createElement('i', { className: 'fa fa-play' }) - ) - ); - } - }); - - exports['default'] = SessionPlayer; - module.exports = exports['default']; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "sessionPlayer.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 302: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - exports.__esModule = true; - var React = __webpack_require__(3); - var $ = __webpack_require__(25); - var moment = __webpack_require__(1); - - var _require = __webpack_require__(57); - - var debounce = _require.debounce; - - var DateRangePicker = React.createClass({ - displayName: 'DateRangePicker', - - getDates: function getDates() { - var startDate = $(this.refs.dpPicker1).datepicker('getDate'); - var endDate = $(this.refs.dpPicker2).datepicker('getDate'); - return [startDate, endDate]; - }, - - setDates: function setDates(_ref) { - var startDate = _ref.startDate; - var endDate = _ref.endDate; - - $(this.refs.dpPicker1).datepicker('setDate', startDate); - $(this.refs.dpPicker2).datepicker('setDate', endDate); - }, - - getDefaultProps: function getDefaultProps() { - return { - startDate: moment().startOf('month').toDate(), - endDate: moment().endOf('month').toDate(), - onChange: function onChange() {} - }; - }, - - componentWillUnmount: function componentWillUnmount() { - $(this.refs.dp).datepicker('destroy'); - }, - - componentWillReceiveProps: function componentWillReceiveProps(newProps) { - var _getDates = this.getDates(); - - var startDate = _getDates[0]; - var endDate = _getDates[1]; - - if (!(isSame(startDate, newProps.startDate) && isSame(endDate, newProps.endDate))) { - this.setDates(newProps); - } - }, - - shouldComponentUpdate: function shouldComponentUpdate() { - return false; - }, - - componentDidMount: function componentDidMount() { - this.onChange = debounce(this.onChange, 1); - $(this.refs.rangePicker).datepicker({ - todayBtn: 'linked', - keyboardNavigation: false, - forceParse: false, - calendarWeeks: true, - autoclose: true - }).on('changeDate', this.onChange); - - this.setDates(this.props); - }, - - onChange: function onChange() { - var _getDates2 = this.getDates(); - - var startDate = _getDates2[0]; - var endDate = _getDates2[1]; - - if (!(isSame(startDate, this.props.startDate) && isSame(endDate, this.props.endDate))) { - this.props.onChange({ startDate: startDate, endDate: endDate }); - } - }, - - render: function render() { - return React.createElement( - 'div', - { className: 'grv-datepicker input-group input-daterange', ref: 'rangePicker' }, - React.createElement('input', { ref: 'dpPicker1', type: 'text', className: 'input-sm form-control', name: 'start' }), - React.createElement( - 'span', - { className: 'input-group-addon' }, - 'to' - ), - React.createElement('input', { ref: 'dpPicker2', type: 'text', className: 'input-sm form-control', name: 'end' }) - ); - } - }); - - function isSame(date1, date2) { - return moment(date1).isSame(date2, 'day'); - } - - /** - * Calendar Nav - */ - var CalendarNav = React.createClass({ - displayName: 'CalendarNav', - - render: function render() { - var value = this.props.value; - - var displayValue = moment(value).format('MMMM, YYYY'); - - return React.createElement( - 'div', - { className: "grv-calendar-nav " + this.props.className }, - React.createElement( - 'button', - { onClick: this.move.bind(this, -1), className: 'btn btn-outline btn-link' }, - React.createElement('i', { className: 'fa fa-chevron-left' }) - ), - React.createElement( - 'span', - { className: 'text-muted' }, - displayValue - ), - React.createElement( - 'button', - { onClick: this.move.bind(this, 1), className: 'btn btn-outline btn-link' }, - React.createElement('i', { className: 'fa fa-chevron-right' }) - ) - ); - }, - - move: function move(at) { - var value = this.props.value; - - var newValue = moment(value).add(at, 'month').toDate(); - this.props.onValueChange(newValue); - } - }); - - CalendarNav.getMonthRange = function (value) { - var startDate = moment(value).startOf('month').toDate(); - var endDate = moment(value).endOf('month').toDate(); - return [startDate, endDate]; - }; - - exports['default'] = DateRangePicker; - exports.CalendarNav = CalendarNav; - exports.DateRangePicker = DateRangePicker; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "datePicker.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 303: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - module.exports.App = __webpack_require__(297); - module.exports.Login = __webpack_require__(304); - module.exports.NewUser = __webpack_require__(306); - module.exports.Nodes = __webpack_require__(307); - module.exports.Sessions = __webpack_require__(310); - module.exports.CurrentSessionHost = __webpack_require__(300); - module.exports.NotFound = __webpack_require__(120).NotFound; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "index.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 304: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var $ = __webpack_require__(25); - var reactor = __webpack_require__(7); - var LinkedStateMixin = __webpack_require__(36); - - var _require = __webpack_require__(117); - - var actions = _require.actions; - var getters = _require.getters; - - var GoogleAuthInfo = __webpack_require__(121); - var cfg = __webpack_require__(11); - - var LoginInputForm = React.createClass({ - displayName: 'LoginInputForm', - - mixins: [LinkedStateMixin], - - getInitialState: function getInitialState() { - return { - user: '', - password: '', - token: '' - }; - }, - - onClick: function onClick(e) { - e.preventDefault(); - if (this.isValid()) { - this.props.onClick(this.state); - } - }, - - isValid: function isValid() { - var $form = $(this.refs.form); - return $form.length === 0 || $form.valid(); - }, - - render: function render() { - var _props$attemp = this.props.attemp; - var isProcessing = _props$attemp.isProcessing; - var isFailed = _props$attemp.isFailed; - var message = _props$attemp.message; - - return React.createElement( - 'form', - { ref: 'form', className: 'grv-login-input-form' }, - React.createElement( - 'h3', - null, - ' Welcome to Teleport ' - ), - React.createElement( - 'div', - { className: '' }, - React.createElement( - 'div', - { className: 'form-group' }, - React.createElement('input', { autoFocus: true, valueLink: this.linkState('user'), className: 'form-control required', placeholder: 'User name', name: 'userName' }) - ), - React.createElement( - 'div', - { className: 'form-group' }, - React.createElement('input', { valueLink: this.linkState('password'), type: 'password', name: 'password', className: 'form-control required', placeholder: 'Password' }) - ), - React.createElement( - 'div', - { className: 'form-group' }, - React.createElement('input', { valueLink: this.linkState('token'), className: 'form-control required', name: 'token', placeholder: 'Two factor token (Google Authenticator)' }) - ), - React.createElement( - 'button', - { onClick: this.onClick, disabled: isProcessing, type: 'submit', className: 'btn btn-primary block full-width m-b' }, - 'Login' - ), - isFailed ? React.createElement( - 'label', - { className: 'error' }, - message - ) : null - ) - ); - } - }); - - var Login = React.createClass({ - displayName: 'Login', - - mixins: [reactor.ReactMixin], - - getDataBindings: function getDataBindings() { - return { - attemp: getters.loginAttemp - }; - }, - - onClick: function onClick(inputData) { - var loc = this.props.location; - var redirect = cfg.routes.app; - - if (loc.state && loc.state.redirectTo) { - redirect = loc.state.redirectTo; - } - - actions.login(inputData, redirect); - }, - - render: function render() { - return React.createElement( - 'div', - { className: 'grv-login text-center' }, - React.createElement('div', { className: 'grv-logo-tprt' }), - React.createElement( - 'div', - { className: 'grv-content grv-flex' }, - React.createElement( - 'div', - { className: 'grv-flex-column' }, - React.createElement(LoginInputForm, { attemp: this.state.attemp, onClick: this.onClick }), - React.createElement(GoogleAuthInfo, null), - React.createElement( - 'div', - { className: 'grv-login-info' }, - React.createElement('i', { className: 'fa fa-question' }), - React.createElement( - 'strong', - null, - 'New Account or forgot password?' - ), - React.createElement( - 'div', - null, - 'Ask for assistance from your Company administrator' - ) - ) - ) - ) - ); - } - }); - - module.exports = Login; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "login.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 305: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(37); - - var IndexLink = _require.IndexLink; - - var getters = __webpack_require__(64); - var cfg = __webpack_require__(11); - - var menuItems = [{ icon: 'fa fa-cogs', to: cfg.routes.nodes, title: 'Nodes' }, { icon: 'fa fa-sitemap', to: cfg.routes.sessions, title: 'Sessions' }]; - - var NavLeftBar = React.createClass({ - displayName: 'NavLeftBar', - - render: function render() { - var _this = this; - - var items = menuItems.map(function (i, index) { - var className = _this.context.router.isActive(i.to) ? 'active' : ''; - return React.createElement( - 'li', - { key: index, className: className, title: i.title }, - React.createElement( - IndexLink, - { to: i.to }, - React.createElement('i', { className: i.icon }) - ) - ); - }); - - items.push(React.createElement( - 'li', - { key: items.length, title: 'help' }, - React.createElement( - 'a', - { href: cfg.helpUrl, target: '_blank' }, - React.createElement('i', { className: 'fa fa-question' }) - ) - )); - - items.push(React.createElement( - 'li', - { key: items.length, title: 'logout' }, - React.createElement( - 'a', - { href: cfg.routes.logout }, - React.createElement('i', { className: 'fa fa-sign-out', style: { marginRight: 0 } }) - ) - )); - - return React.createElement( - 'nav', - { className: 'grv-nav navbar-default', role: 'navigation' }, - React.createElement( - 'ul', - { className: 'nav text-center', id: 'side-menu' }, - React.createElement( - 'li', - { title: 'current user' }, - React.createElement( - 'div', - { className: 'grv-circle text-uppercase' }, - React.createElement( - 'span', - null, - getUserNameLetter() - ) - ) - ), - items - ) - ); - } - }); - - NavLeftBar.contextTypes = { - router: React.PropTypes.object.isRequired - }; - - function getUserNameLetter() { - var _reactor$evaluate = reactor.evaluate(getters.user); - - var shortDisplayName = _reactor$evaluate.shortDisplayName; - - return shortDisplayName; - } - - module.exports = NavLeftBar; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "navLeftBar.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 306: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var $ = __webpack_require__(25); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(291); - - var actions = _require.actions; - var getters = _require.getters; - - var userModule = __webpack_require__(117); - var LinkedStateMixin = __webpack_require__(36); - var GoogleAuthInfo = __webpack_require__(121); - - var _require2 = __webpack_require__(120); - - var ExpiredInvite = _require2.ExpiredInvite; - - var InviteInputForm = React.createClass({ - displayName: 'InviteInputForm', - - mixins: [LinkedStateMixin], - - componentDidMount: function componentDidMount() { - $(this.refs.form).validate({ - rules: { - password: { - minlength: 6, - required: true - }, - passwordConfirmed: { - required: true, - equalTo: this.refs.password - } - }, - - messages: { - passwordConfirmed: { - minlength: $.validator.format('Enter at least {0} characters'), - equalTo: 'Enter the same password as above' - } - } - }); - }, - - getInitialState: function getInitialState() { - return { - name: this.props.invite.user, - psw: '', - pswConfirmed: '', - token: '' - }; - }, - - onClick: function onClick(e) { - e.preventDefault(); - if (this.isValid()) { - userModule.actions.signUp({ - name: this.state.name, - psw: this.state.psw, - token: this.state.token, - inviteToken: this.props.invite.invite_token }); - } - }, - - isValid: function isValid() { - var $form = $(this.refs.form); - return $form.length === 0 || $form.valid(); - }, - - render: function render() { - var _props$attemp = this.props.attemp; - var isProcessing = _props$attemp.isProcessing; - var isFailed = _props$attemp.isFailed; - var message = _props$attemp.message; - - return React.createElement( - 'form', - { ref: 'form', className: 'grv-invite-input-form' }, - React.createElement( - 'h3', - null, - ' Get started with Teleport ' - ), - React.createElement( - 'div', - { className: '' }, - React.createElement( - 'div', - { className: 'form-group' }, - React.createElement('input', { - valueLink: this.linkState('name'), - name: 'userName', - className: 'form-control required', - placeholder: 'User name' }) - ), - React.createElement( - 'div', - { className: 'form-group' }, - React.createElement('input', { - autoFocus: true, - valueLink: this.linkState('psw'), - ref: 'password', - type: 'password', - name: 'password', - className: 'form-control', - placeholder: 'Password' }) - ), - React.createElement( - 'div', - { className: 'form-group' }, - React.createElement('input', { - valueLink: this.linkState('pswConfirmed'), - type: 'password', - name: 'passwordConfirmed', - className: 'form-control', - placeholder: 'Password confirm' }) - ), - React.createElement( - 'div', - { className: 'form-group' }, - React.createElement('input', { - name: 'token', - valueLink: this.linkState('token'), - className: 'form-control required', - placeholder: 'Two factor token (Google Authenticator)' }) - ), - React.createElement( - 'button', - { type: 'submit', disabled: isProcessing, className: 'btn btn-primary block full-width m-b', onClick: this.onClick }, - 'Sign up' - ), - isFailed ? React.createElement( - 'label', - { className: 'error' }, - message - ) : null - ) - ); - } - }); - - var Invite = React.createClass({ - displayName: 'Invite', - - mixins: [reactor.ReactMixin], - - getDataBindings: function getDataBindings() { - return { - invite: getters.invite, - attemp: getters.attemp, - fetchingInvite: getters.fetchingInvite - }; - }, - - componentDidMount: function componentDidMount() { - actions.fetchInvite(this.props.params.inviteToken); - }, - - render: function render() { - var _state = this.state; - var fetchingInvite = _state.fetchingInvite; - var invite = _state.invite; - var attemp = _state.attemp; - - if (fetchingInvite.isFailed) { - return React.createElement(ExpiredInvite, null); - } - - if (!invite) { - return null; - } - - return React.createElement( - 'div', - { className: 'grv-invite text-center' }, - React.createElement('div', { className: 'grv-logo-tprt' }), - React.createElement( - 'div', - { className: 'grv-content grv-flex' }, - React.createElement( - 'div', - { className: 'grv-flex-column' }, - React.createElement(InviteInputForm, { attemp: attemp, invite: invite.toJS() }), - React.createElement(GoogleAuthInfo, null) - ), - React.createElement( - 'div', - { className: 'grv-flex-column grv-invite-barcode' }, - React.createElement( - 'h4', - null, - 'Scan bar code for auth token ', - React.createElement('br', null), - ' ', - React.createElement( - 'small', - null, - 'Scan below to generate your two factor token' - ) - ), - React.createElement('img', { className: 'img-thumbnail', src: 'data:image/png;base64,' + invite.get('qr') }) - ) - ) - ); - } - }); - - module.exports = Invite; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "newUser.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 307: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - var userGetters = __webpack_require__(64); - var nodeGetters = __webpack_require__(43); - var NodeList = __webpack_require__(122); - - var Nodes = React.createClass({ - displayName: 'Nodes', - - mixins: [reactor.ReactMixin], - - getDataBindings: function getDataBindings() { - return { - nodeRecords: nodeGetters.nodeListView, - user: userGetters.user - }; - }, - - render: function render() { - var nodeRecords = this.state.nodeRecords; - var logins = this.state.user.logins; - return React.createElement(NodeList, { nodeRecords: nodeRecords, logins: logins }); - } - }); - - module.exports = Nodes; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "main.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 308: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - var PureRenderMixin = __webpack_require__(228); - - var _require = __webpack_require__(294); - - var lastMessage = _require.lastMessage; - - var _require2 = __webpack_require__(240); - - var ToastContainer = _require2.ToastContainer; - var ToastMessage = _require2.ToastMessage; - - var ToastMessageFactory = React.createFactory(ToastMessage.animation); - - var NotificationHost = React.createClass({ - displayName: 'NotificationHost', - - mixins: [reactor.ReactMixin, PureRenderMixin], - - getDataBindings: function getDataBindings() { - return { msg: lastMessage }; - }, - - update: function update(msg) { - if (msg) { - if (msg.isError) { - this.refs.container.error(msg.text, msg.title); - } else if (msg.isWarning) { - this.refs.container.warning(msg.text, msg.title); - } else if (msg.isSuccess) { - this.refs.container.success(msg.text, msg.title); - } else { - this.refs.container.info(msg.text, msg.title); - } - } - }, - - componentDidMount: function componentDidMount() { - reactor.observe(lastMessage, this.update); - }, - - componentWillUnmount: function componentWillUnmount() { - reactor.unobserve(lastMessage, this.update); - }, - - render: function render() { - return React.createElement(ToastContainer, { ref: 'container', toastMessageFactory: ToastMessageFactory, className: 'toast-top-right' }); - } - }); - - module.exports = NotificationHost; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "notificationHost.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 309: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - - var _require = __webpack_require__(45); - - var Table = _require.Table; - var Column = _require.Column; - var Cell = _require.Cell; - var TextCell = _require.TextCell; - - var _require2 = __webpack_require__(124); - - var ButtonCell = _require2.ButtonCell; - var UsersCell = _require2.UsersCell; - var EmptyList = _require2.EmptyList; - var NodeCell = _require2.NodeCell; - var DateCreatedCell = _require2.DateCreatedCell; - - var ActiveSessionList = React.createClass({ - displayName: 'ActiveSessionList', - - render: function render() { - var data = this.props.data.filter(function (item) { - return item.active; - }); - return React.createElement( - 'div', - { className: 'grv-sessions-active' }, - React.createElement( - 'div', - { className: 'grv-header' }, - React.createElement( - 'h1', - null, - ' Active Sessions ' - ) - ), - React.createElement( - 'div', - { className: 'grv-content' }, - data.length === 0 ? React.createElement(EmptyList, { text: 'You have no active sessions.' }) : React.createElement( - 'div', - { className: '' }, - React.createElement( - Table, - { rowCount: data.length, className: 'table-striped' }, - React.createElement(Column, { - columnKey: 'sid', - header: React.createElement( - Cell, - null, - ' Session ID ' - ), - cell: React.createElement(TextCell, { data: data }) - }), - React.createElement(Column, { - header: React.createElement( - Cell, - null, - ' ' - ), - cell: React.createElement(ButtonCell, { data: data }) - }), - React.createElement(Column, { - header: React.createElement( - Cell, - null, - ' Node ' - ), - cell: React.createElement(NodeCell, { data: data }) - }), - React.createElement(Column, { - columnKey: 'created', - header: React.createElement( - Cell, - null, - ' Created ' - ), - cell: React.createElement(DateCreatedCell, { data: data }) - }), - React.createElement(Column, { - header: React.createElement( - Cell, - null, - ' Users ' - ), - cell: React.createElement(UsersCell, { data: data }) - }) - ) - ) - ) - ); - } - }); - - module.exports = ActiveSessionList; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "activeSessionList.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 310: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var reactor = __webpack_require__(7); - - var _require = __webpack_require__(63); - - var getters = _require.getters; - - var StoredSessionList = __webpack_require__(311); - var ActiveSessionList = __webpack_require__(309); - - var Sessions = React.createClass({ - displayName: 'Sessions', - - mixins: [reactor.ReactMixin], - - getDataBindings: function getDataBindings() { - return { data: getters.sessionsView }; - }, - - render: function render() { - var data = this.state.data; - - return React.createElement( - 'div', - { className: 'grv-sessions grv-page' }, - React.createElement(ActiveSessionList, { data: data }), - React.createElement('hr', { className: 'grv-divider' }), - React.createElement(StoredSessionList, { data: data }) - ); - } - }); - - module.exports = Sessions; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "main.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 311: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - var React = __webpack_require__(3); - - var _require = __webpack_require__(63); - - var actions = _require.actions; - - var LinkedStateMixin = __webpack_require__(36); - - var _require2 = __webpack_require__(45); - - var Table = _require2.Table; - var Column = _require2.Column; - var Cell = _require2.Cell; - var TextCell = _require2.TextCell; - var SortHeaderCell = _require2.SortHeaderCell; - var SortTypes = _require2.SortTypes; - - var _require3 = __webpack_require__(124); - - var ButtonCell = _require3.ButtonCell; - var SingleUserCell = _require3.SingleUserCell; - var DateCreatedCell = _require3.DateCreatedCell; - - var _require4 = __webpack_require__(302); - - var DateRangePicker = _require4.DateRangePicker; - var CalendarNav = _require4.CalendarNav; - - var moment = __webpack_require__(1); - - var _require5 = __webpack_require__(94); - - var monthRange = _require5.monthRange; - - var _require6 = __webpack_require__(95); - - var isMatch = _require6.isMatch; - - var _ = __webpack_require__(57); - - var ArchivedSessions = React.createClass({ - displayName: 'ArchivedSessions', - - mixins: [LinkedStateMixin], - - getInitialState: function getInitialState() { - var _monthRange = monthRange(new Date()); - - var startDate = _monthRange[0]; - var endDate = _monthRange[1]; - - this.searchableProps = ['serverIp', 'created', 'sid', 'login']; - return { filter: '', colSortDirs: { created: 'ASC' }, startDate: startDate, endDate: endDate }; - }, - - componentWillMount: function componentWillMount() { - actions.fetchSessions(this.state.startDate, this.state.endDate); - }, - - setDatesAndRefetch: function setDatesAndRefetch(startDate, endDate) { - actions.fetchSessions(startDate, endDate); - this.state.startDate = startDate; - this.state.endDate = endDate; - this.setState(this.state); - }, - - onSortChange: function onSortChange(columnKey, sortDir) { - var _colSortDirs; - - this.setState(_extends({}, this.state, { - colSortDirs: (_colSortDirs = {}, _colSortDirs[columnKey] = sortDir, _colSortDirs) - })); - }, - - onRangePickerChange: function onRangePickerChange(_ref) { - var startDate = _ref.startDate; - var endDate = _ref.endDate; - - this.setDatesAndRefetch(startDate, endDate); - }, - - onCalendarNavChange: function onCalendarNavChange(newValue) { - var _monthRange2 = monthRange(newValue); - - var startDate = _monthRange2[0]; - var endDate = _monthRange2[1]; - - this.setDatesAndRefetch(startDate, endDate); - }, - - searchAndFilterCb: function searchAndFilterCb(targetValue, searchValue, propName) { - if (propName === 'created') { - var displayDate = moment(targetValue).format('l LTS').toLocaleUpperCase(); - return displayDate.indexOf(searchValue) !== -1; - } - }, - - sortAndFilter: function sortAndFilter(data) { - var _this = this; - - var filtered = data.filter(function (obj) { - return isMatch(obj, _this.state.filter, { - searchableProps: _this.searchableProps, - cb: _this.searchAndFilterCb - }); - }); - - var columnKey = Object.getOwnPropertyNames(this.state.colSortDirs)[0]; - var sortDir = this.state.colSortDirs[columnKey]; - var sorted = _.sortBy(filtered, columnKey); - if (sortDir === SortTypes.ASC) { - sorted = sorted.reverse(); - } - - return sorted; - }, - - render: function render() { - var _state = this.state; - var startDate = _state.startDate; - var endDate = _state.endDate; - - var data = this.props.data.filter(function (item) { - return !item.active && moment(item.created).isBetween(startDate, endDate); - }); - data = this.sortAndFilter(data); - - return React.createElement( - 'div', - { className: 'grv-sessions-stored' }, - React.createElement( - 'div', - { className: 'grv-header' }, - React.createElement( - 'h1', - null, - ' Archived Sessions ' - ), - React.createElement( - 'div', - { className: 'grv-flex' }, - React.createElement( - 'div', - { className: 'grv-flex-row' }, - React.createElement(DateRangePicker, { startDate: startDate, endDate: endDate, onChange: this.onRangePickerChange }) - ), - React.createElement( - 'div', - { className: 'grv-flex-row' }, - React.createElement(CalendarNav, { value: startDate, onValueChange: this.onCalendarNavChange }) - ), - React.createElement( - 'div', - { className: 'grv-flex-row' }, - React.createElement( - 'div', - { className: 'grv-search' }, - React.createElement('input', { valueLink: this.linkState('filter'), placeholder: 'Search...', className: 'form-control input-sm' }) - ) - ) - ) - ), - React.createElement( - 'div', - { className: 'grv-content' }, - React.createElement( - 'div', - { className: '' }, - React.createElement( - Table, - { rowCount: data.length, className: 'table-striped' }, - React.createElement(Column, { - columnKey: 'sid', - header: React.createElement( - Cell, - null, - ' Session ID ' - ), - cell: React.createElement(TextCell, { data: data }) - }), - React.createElement(Column, { - header: React.createElement( - Cell, - null, - ' ' - ), - cell: React.createElement(ButtonCell, { data: data }) - }), - React.createElement(Column, { - columnKey: 'created', - header: React.createElement(SortHeaderCell, { - sortDir: this.state.colSortDirs.created, - onSortChange: this.onSortChange, - title: 'Created' - }), - cell: React.createElement(DateCreatedCell, { data: data }) - }), - React.createElement(Column, { - header: React.createElement( - Cell, - null, - ' User ' - ), - cell: React.createElement(SingleUserCell, { data: data }) - }) - ) - ) - ) - ); - } - }); - - module.exports = ArchivedSessions; - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "storedSessionList.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 312: -/***/ function(module, exports, __webpack_require__) { - - /* REACT HOT LOADER */ if (false) { (function () { var ReactHotAPI = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-api/modules/index.js"), RootInstanceProvider = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/RootInstanceProvider.js"), ReactMount = require("react/lib/ReactMount"), React = require("react"); module.makeHot = module.hot.data ? module.hot.data.makeHot : ReactHotAPI(function () { return RootInstanceProvider.getRootInstances(ReactMount); }, React); })(); } try { (function () { - - 'use strict'; - - var React = __webpack_require__(3); - var render = __webpack_require__(230).render; - - var _require = __webpack_require__(37); - - var Router = _require.Router; - var Route = _require.Route; - var Redirect = _require.Redirect; - - var _require2 = __webpack_require__(303); - - var App = _require2.App; - var Login = _require2.Login; - var Nodes = _require2.Nodes; - var Sessions = _require2.Sessions; - var NewUser = _require2.NewUser; - var CurrentSessionHost = _require2.CurrentSessionHost; - var NotFound = _require2.NotFound; - - var _require3 = __webpack_require__(116); - - var ensureUser = _require3.ensureUser; - - var auth = __webpack_require__(93); - var session = __webpack_require__(26); - var cfg = __webpack_require__(11); - - __webpack_require__(288); - - // init session - session.init(); - - function handleLogout() /*nextState, replace*/{ - auth.logout(); - } - - render(React.createElement( - Router, - { history: session.getHistory() }, - React.createElement(Route, { path: cfg.routes.login, component: Login }), - React.createElement(Route, { path: cfg.routes.logout, onEnter: handleLogout }), - React.createElement(Route, { path: cfg.routes.newUser, component: NewUser }), - React.createElement(Redirect, { from: cfg.routes.app, to: cfg.routes.nodes }), - React.createElement( - Route, - { path: cfg.routes.app, component: App, onEnter: ensureUser }, - React.createElement(Route, { path: cfg.routes.nodes, component: Nodes }), - React.createElement(Route, { path: cfg.routes.activeSession, components: { CurrentSessionHost: CurrentSessionHost } }), - React.createElement(Route, { path: cfg.routes.sessions, component: Sessions }) - ), - React.createElement(Route, { path: '*', component: NotFound }) - ), document.getElementById("app")); - - /* REACT HOT LOADER */ }).call(this); } finally { if (false) { (function () { var foundReactClasses = module.hot.data && module.hot.data.foundReactClasses || false; if (module.exports && module.makeHot) { var makeExportsHot = require("/home/akontsevoy/go/src/github.com/gravitational/teleport/web/node_modules/react-hot-loader/makeExportsHot.js"); if (makeExportsHot(module, require("react"))) { foundReactClasses = true; } var shouldAcceptModule = true && foundReactClasses; if (shouldAcceptModule) { module.hot.accept(function (err) { if (err) { console.error("Cannot not apply hot update to " + "index.jsx" + ": " + err.message); } }); } } module.hot.dispose(function (data) { data.makeHot = module.makeHot; data.foundReactClasses = foundReactClasses; }); })(); } } - -/***/ }, - -/***/ 313: -/***/ function(module, exports) { - - // Copyright Joyent, Inc. and other Node contributors. - // - // Permission is hereby granted, free of charge, to any person obtaining a - // copy of this software and associated documentation files (the - // "Software"), to deal in the Software without restriction, including - // without limitation the rights to use, copy, modify, merge, publish, - // distribute, sublicense, and/or sell copies of the Software, and to permit - // persons to whom the Software is furnished to do so, subject to the - // following conditions: - // - // The above copyright notice and this permission notice shall be included - // in all copies or substantial portions of the Software. - // - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - // USE OR OTHER DEALINGS IN THE SOFTWARE. - - function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; - } - module.exports = EventEmitter; - - // Backwards-compat with node 0.10.x - EventEmitter.EventEmitter = EventEmitter; - - EventEmitter.prototype._events = undefined; - EventEmitter.prototype._maxListeners = undefined; - - // By default EventEmitters will print a warning if more than 10 listeners are - // added to it. This is a useful default which helps finding memory leaks. - EventEmitter.defaultMaxListeners = 10; - - // Obviously not all Emitters should be limited to 10. This function allows - // that to be increased. Set to zero for unlimited. - EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; - }; - - EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; - - if (!this._events) - this._events = {}; - - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } - throw TypeError('Uncaught, unspecified "error" event.'); - } - } - - handler = this._events[type]; - - if (isUndefined(handler)) - return false; - - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - handler.apply(this, args); - } - } else if (isObject(handler)) { - len = arguments.length; - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } - - return true; - }; - - EventEmitter.prototype.addListener = function(type, listener) { - var m; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events) - this._events = {}; - - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); - - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; - - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - var m; - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; - } - - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); - } - } - } - - return this; - }; - - EventEmitter.prototype.on = EventEmitter.prototype.addListener; - - EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - var fired = false; - - function g() { - this.removeListener(type, g); - - if (!fired) { - fired = true; - listener.apply(this, arguments); - } - } - - g.listener = listener; - this.on(type, g); - - return this; - }; - - // emits a 'removeListener' event iff the listener was removed - EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events || !this._events[type]) - return this; - - list = this._events[type]; - length = list.length; - position = -1; - - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); - - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } - - if (this._events.removeListener) - this.emit('removeListener', type, listener); - } - - return this; - }; - - EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; - - if (!this._events) - return this; - - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } - - listeners = this._events[type]; - - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); - } - delete this._events[type]; - - return this; - }; - - EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; - }; - - EventEmitter.listenerCount = function(emitter, type) { - var ret; - if (!emitter._events || !emitter._events[type]) - ret = 0; - else if (isFunction(emitter._events[type])) - ret = 1; - else - ret = emitter._events[type].length; - return ret; - }; - - function isFunction(arg) { - return typeof arg === 'function'; - } - - function isNumber(arg) { - return typeof arg === 'number'; - } - - function isObject(arg) { - return typeof arg === 'object' && arg !== null; - } - - function isUndefined(arg) { - return arg === void 0; - } - - -/***/ }, - -/***/ 427: -/***/ function(module, exports) { - - module.exports = Terminal; - -/***/ } - -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXBwL3JlYWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9rZXltaXJyb3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwialF1ZXJ5XCIiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9zZXNzaW9uLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvc2VydmljZXMvYXBpLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9ub2Rlcy9nZXR0ZXJzLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9yZXN0QXBpL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvdGFibGUuanN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcIl9cIiIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbW1vbi9sb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsL2dldHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9kaWFsb2dzL2FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL3Nlc3Npb25zL2FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL3Nlc3Npb25zL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy91c2VyL2dldHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9hdXRoLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tbW9uL2RhdGVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbW1vbi9vYmplY3RVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbW1vbi90dHkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsL2FjdGlvblR5cGVzLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9hY3RpdmVUZXJtaW5hbC9hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9hY3RpdmVUZXJtaW5hbC9hY3RpdmVUZXJtU3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2FwcC9hY3Rpb25UeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvYXBwL2FwcFN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9kaWFsb2dzL2FjdGlvblR5cGVzLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9kaWFsb2dzL2RpYWxvZ1N0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9pbnZpdGUvYWN0aW9uVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2ludml0ZS9pbnZpdGVTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvbm9kZXMvYWN0aW9uVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL25vdGlmaWNhdGlvbnMvYWN0aW9uVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL25vdGlmaWNhdGlvbnMvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvcmVzdEFwaS9hY3Rpb25UeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvcmVzdEFwaS9hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9yZXN0QXBpL2dldHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL3Nlc3Npb25zL2FjdGlvblR5cGVzLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9zZXNzaW9ucy9nZXR0ZXJzLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9zZXNzaW9ucy9zZXNzaW9uU3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL3VzZXIvYWN0aW9uVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL3VzZXIvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvdXNlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvdXNlci91c2VyU3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21wb25lbnRzL2N1cnJlbnRTZXNzaW9uL3Nlc3Npb25MZWZ0UGFuZWwuanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9lcnJvclBhZ2UuanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9nb29nbGVBdXRoTG9nby5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21wb25lbnRzL25vZGVzL25vZGVMaXN0LmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvc2VsZWN0Tm9kZURpYWxvZy5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21wb25lbnRzL3Nlc3Npb25zL2xpc3RJdGVtcy5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21wb25lbnRzL3Rlcm1pbmFsLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbW1vbi9wYXR0ZXJuVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21tb24vdHR5UGxheWVyLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tbW9uL3V1aWQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2FwcC9hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9hcHAvZ2V0dGVycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvYXBwL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9kaWFsb2dzL2dldHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2RpYWxvZ3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9pbnZpdGUvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvaW52aXRlL2dldHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL2ludml0ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvbm9kZXMvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL21vZHVsZXMvbm9kZXMvbm9kZVN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbW9kdWxlcy9ub3RpZmljYXRpb25zL2dldHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uU3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9tb2R1bGVzL3Jlc3RBcGkvcmVzdEFwaVN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9hcHAuanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9jdXJyZW50U2Vzc2lvbi9hY3RpdmVTZXNzaW9uLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvY3VycmVudFNlc3Npb24vZXZlbnRTdHJlYW1lci5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21wb25lbnRzL2N1cnJlbnRTZXNzaW9uL21haW4uanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9jdXJyZW50U2Vzc2lvbi9zZXNzaW9uUGxheWVyLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvZGF0ZVBpY2tlci5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21wb25lbnRzL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvbG9naW4uanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9uYXZMZWZ0QmFyLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvbmV3VXNlci5qc3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb21wb25lbnRzL25vZGVzL21haW4uanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9ub3RpZmljYXRpb25Ib3N0LmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvc2Vzc2lvbnMvYWN0aXZlU2Vzc2lvbkxpc3QuanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvY29tcG9uZW50cy9zZXNzaW9ucy9tYWluLmpzeCIsIndlYnBhY2s6Ly8vLi9zcmMvYXBwL2NvbXBvbmVudHMvc2Vzc2lvbnMvc3RvcmVkU2Vzc2lvbkxpc3QuanN4Iiwid2VicGFjazovLy8uL3NyYy9hcHAvaW5kZXguanN4Iiwid2VicGFjazovLy8uL34vZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJUZXJtaW5hbFwiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O3NDQUF3QixFQUFZOztBQUVwQyxLQUFNLE9BQU8sR0FBRyx1QkFBWTtBQUMxQixRQUFLLEVBQUUsSUFBSTtFQUNaLENBQUM7O0FBRUYsT0FBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7O3NCQUVWLE9BQU87Ozs7Ozs7Ozs7OztnQkNSQSxtQkFBTyxDQUFDLEdBQXlCLENBQUM7O0tBQW5ELGFBQWEsWUFBYixhQUFhOztBQUVsQixLQUFJLEdBQUcsR0FBRzs7QUFFUixVQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNOztBQUUvQixVQUFP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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0EsZ0JBQWUsU0FBUztBQUN4Qjs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWUsU0FBUztBQUN4QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFHO0FBQ0gscUJBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7OztBQzVTQSwyQiIsImZpbGUiOiJhcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFjdG9yIH0gZnJvbSAnbnVjbGVhci1qcydcblxuY29uc3QgcmVhY3RvciA9IG5ldyBSZWFjdG9yKHtcbiAgZGVidWc6IHRydWVcbn0pXG5cbndpbmRvdy5yZWFjdG9yID0gcmVhY3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgcmVhY3RvclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL3JlYWN0b3IuanNcbiAqKi8iLCJsZXQge2Zvcm1hdFBhdHRlcm59ID0gcmVxdWlyZSgnYXBwL2NvbW1vbi9wYXR0ZXJuVXRpbHMnKTtcblxubGV0IGNmZyA9IHtcblxuICBiYXNlVXJsOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luLFxuXG4gIGhlbHBVcmw6ICdodHRwczovL2dpdGh1Yi5jb20vZ3Jhdml0YXRpb25hbC90ZWxlcG9ydC9ibG9iL21hc3Rlci9SRUFETUUubWQnLFxuXG4gIGFwaToge1xuICAgIHJlbmV3VG9rZW5QYXRoOicvdjEvd2ViYXBpL3Nlc3Npb25zL3JlbmV3JyxcbiAgICBub2Rlc1BhdGg6ICcvdjEvd2ViYXBpL3NpdGVzLy1jdXJyZW50LS9ub2RlcycsXG4gICAgc2Vzc2lvblBhdGg6ICcvdjEvd2ViYXBpL3Nlc3Npb25zJyxcbiAgICBzaXRlU2Vzc2lvblBhdGg6ICcvdjEvd2ViYXBpL3NpdGVzLy1jdXJyZW50LS9zZXNzaW9ucy86c2lkJyxcbiAgICBpbnZpdGVQYXRoOiAnL3YxL3dlYmFwaS91c2Vycy9pbnZpdGVzLzppbnZpdGVUb2tlbicsXG4gICAgY3JlYXRlVXNlclBhdGg6ICcvdjEvd2ViYXBpL3VzZXJzJyxcbiAgICBzZXNzaW9uQ2h1bms6ICcvdjEvd2ViYXBpL3NpdGVzLy1jdXJyZW50LS9zZXNzaW9ucy86c2lkL2NodW5rcz9zdGFydD06c3RhcnQmZW5kPTplbmQnLFxuICAgIHNlc3Npb25DaHVua0NvdW50UGF0aDogJy92MS93ZWJhcGkvc2l0ZXMvLWN1cnJlbnQtL3Nlc3Npb25zLzpzaWQvY2h1bmtzY291bnQnLFxuXG4gICAgZ2V0RmV0Y2hTZXNzaW9uQ2h1bmtVcmw6ICh7c2lkLCBzdGFydCwgZW5kfSk9PntcbiAgICAgIHJldHVybiBmb3JtYXRQYXR0ZXJuKGNmZy5hcGkuc2Vzc2lvbkNodW5rLCB7c2lkLCBzdGFydCwgZW5kfSk7XG4gICAgfSxcblxuICAgIGdldEZldGNoU2Vzc2lvbkxlbmd0aFVybDogKHNpZCk9PntcbiAgICAgIHJldHVybiBmb3JtYXRQYXR0ZXJuKGNmZy5hcGkuc2Vzc2lvbkNodW5rQ291bnRQYXRoLCB7c2lkfSk7XG4gICAgfSxcblxuICAgIGdldEZldGNoU2Vzc2lvbnNVcmw6IChzdGFydCwgZW5kKT0+e1xuICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGVuZDogZW5kLnRvSVNPU3RyaW5nKCkgICAgICAgIFxuICAgICAgfTtcblxuICAgICAgdmFyIGpzb24gPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpO1xuICAgICAgdmFyIGpzb25FbmNvZGVkID0gd2luZG93LmVuY29kZVVSSShqc29uKTtcblxuICAgICAgcmV0dXJuIGAvdjEvd2ViYXBpL3NpdGVzLy1jdXJyZW50LS9ldmVudHMvc2Vzc2lvbnM/ZmlsdGVyPSR7anNvbkVuY29kZWR9YDtcbiAgICB9LFxuXG4gICAgZ2V0RmV0Y2hTZXNzaW9uVXJsOiAoc2lkKT0+e1xuICAgICAgcmV0dXJuIGZvcm1hdFBhdHRlcm4oY2ZnLmFwaS5zaXRlU2Vzc2lvblBhdGgsIHtzaWR9KTtcbiAgICB9LFxuXG4gICAgZ2V0VGVybWluYWxTZXNzaW9uVXJsOiAoc2lkKT0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRQYXR0ZXJuKGNmZy5hcGkuc2l0ZVNlc3Npb25QYXRoLCB7c2lkfSk7XG4gICAgfSxcblxuICAgIGdldEludml0ZVVybDogKGludml0ZVRva2VuKSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0UGF0dGVybihjZmcuYXBpLmludml0ZVBhdGgsIHtpbnZpdGVUb2tlbn0pO1xuICAgIH0sXG5cbiAgICBnZXRFdmVudFN0cmVhbUNvbm5TdHI6ICh0b2tlbiwgc2lkKSA9PiB7XG4gICAgICB2YXIgaG9zdG5hbWUgPSBnZXRXc0hvc3ROYW1lKCk7XG4gICAgICByZXR1cm4gYCR7aG9zdG5hbWV9L3YxL3dlYmFwaS9zaXRlcy8tY3VycmVudC0vc2Vzc2lvbnMvJHtzaWR9L2V2ZW50cy9zdHJlYW0/YWNjZXNzX3Rva2VuPSR7dG9rZW59YDtcbiAgICB9LFxuXG4gICAgZ2V0VHR5Q29ublN0cjogKHt0b2tlbiwgc2VydmVySWQsIGxvZ2luLCBzaWQsIHJvd3MsIGNvbHN9KSA9PiB7XG4gICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICBzZXJ2ZXJfaWQ6IHNlcnZlcklkLFxuICAgICAgICBsb2dpbixcbiAgICAgICAgc2lkLFxuICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgaDogcm93cyxcbiAgICAgICAgICB3OiBjb2xzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGpzb24gPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpO1xuICAgICAgdmFyIGpzb25FbmNvZGVkID0gd2luZG93LmVuY29kZVVSSShqc29uKTtcbiAgICAgIHZhciBob3N0bmFtZSA9IGdldFdzSG9zdE5hbWUoKTtcbiAgICAgIHJldHVybiBgJHtob3N0bmFtZX0vdjEvd2ViYXBpL3NpdGVzLy1jdXJyZW50LS9jb25uZWN0P2FjY2Vzc190b2tlbj0ke3Rva2VufSZwYXJhbXM9JHtqc29uRW5jb2RlZH1gO1xuICAgIH1cbiAgfSxcblxuICByb3V0ZXM6IHtcbiAgICBhcHA6ICcvd2ViJyxcbiAgICBsb2dvdXQ6ICcvd2ViL2xvZ291dCcsXG4gICAgbG9naW46ICcvd2ViL2xvZ2luJyxcbiAgICBub2RlczogJy93ZWIvbm9kZXMnLFxuICAgIGFjdGl2ZVNlc3Npb246ICcvd2ViL3Nlc3Npb25zLzpzaWQnLFxuICAgIG5ld1VzZXI6ICcvd2ViL25ld3VzZXIvOmludml0ZVRva2VuJyxcbiAgICBzZXNzaW9uczogJy93ZWIvc2Vzc2lvbnMnLFxuICAgIHBhZ2VOb3RGb3VuZDogJy93ZWIvbm90Zm91bmQnXG4gIH0sXG5cbiAgZ2V0QWN0aXZlU2Vzc2lvblJvdXRlVXJsKHNpZCl7XG4gICAgcmV0dXJuIGZvcm1hdFBhdHRlcm4oY2ZnLnJvdXRlcy5hY3RpdmVTZXNzaW9uLCB7c2lkfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2ZnO1xuXG5mdW5jdGlvbiBnZXRXc0hvc3ROYW1lKCl7XG4gIHZhciBwcmVmaXggPSBsb2NhdGlvbi5wcm90b2NvbCA9PSBcImh0dHBzOlwiP1wid3NzOi8vXCI6XCJ3czovL1wiO1xuICB2YXIgaG9zdHBvcnQgPSBsb2NhdGlvbi5ob3N0bmFtZSsobG9jYXRpb24ucG9ydCA/ICc6Jytsb2NhdGlvbi5wb3J0OiAnJyk7XG4gIHJldHVybiBgJHtwcmVmaXh9JHtob3N0cG9ydH1gO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbmZpZy5qc1xuICoqLyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtMjAxNCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGFuIGVudW1lcmF0aW9uIHdpdGgga2V5cyBlcXVhbCB0byB0aGVpciB2YWx1ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgIHZhciBDT0xPUlMgPSBrZXlNaXJyb3Ioe2JsdWU6IG51bGwsIHJlZDogbnVsbH0pO1xuICogICB2YXIgbXlDb2xvciA9IENPTE9SUy5ibHVlO1xuICogICB2YXIgaXNDb2xvclZhbGlkID0gISFDT0xPUlNbbXlDb2xvcl07XG4gKlxuICogVGhlIGxhc3QgbGluZSBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGdlbmVyYXRlZCBlbnVtIHdlcmVcbiAqIG5vdCBlcXVhbCB0byB0aGVpciBrZXlzLlxuICpcbiAqICAgSW5wdXQ6ICB7a2V5MTogdmFsMSwga2V5MjogdmFsMn1cbiAqICAgT3V0cHV0OiB7a2V5MToga2V5MSwga2V5Mjoga2V5Mn1cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbnZhciBrZXlNaXJyb3IgPSBmdW5jdGlvbihvYmopIHtcbiAgdmFyIHJldCA9IHt9O1xuICB2YXIga2V5O1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBPYmplY3QgJiYgIUFycmF5LmlzQXJyYXkob2JqKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleU1pcnJvciguLi4pOiBBcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC4nKTtcbiAgfVxuICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0W2tleV0gPSBrZXk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5TWlycm9yO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34va2V5bWlycm9yL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMVxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0galF1ZXJ5O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwgXCJqUXVlcnlcIlxuICoqIG1vZHVsZSBpZCA9IDI1XG4gKiogbW9kdWxlIGNodW5rcyA9IDFcbiAqKi8iLCJ2YXIgeyBicm93c2VySGlzdG9yeSwgY3JlYXRlTWVtb3J5SGlzdG9yeSB9ID0gcmVxdWlyZSgncmVhY3Qtcm91dGVyJyk7XG5cbmNvbnN0IEFVVEhfS0VZX0RBVEEgPSAnYXV0aERhdGEnO1xuXG52YXIgX2hpc3RvcnkgPSBjcmVhdGVNZW1vcnlIaXN0b3J5KCk7XG5cbnZhciBzZXNzaW9uID0ge1xuXG4gIGluaXQoaGlzdG9yeT1icm93c2VySGlzdG9yeSl7XG4gICAgX2hpc3RvcnkgPSBoaXN0b3J5O1xuICB9LFxuXG4gIGdldEhpc3RvcnkoKXtcbiAgICByZXR1cm4gX2hpc3Rvcnk7XG4gIH0sXG5cbiAgc2V0VXNlckRhdGEodXNlckRhdGEpe1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFVVEhfS0VZX0RBVEEsIEpTT04uc3RyaW5naWZ5KHVzZXJEYXRhKSk7XG4gIH0sXG5cbiAgZ2V0VXNlckRhdGEoKXtcbiAgICB2YXIgaXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEFVVEhfS0VZX0RBVEEpO1xuICAgIGlmKGl0ZW0pe1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9LFxuXG4gIGNsZWFyKCl7XG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKClcbiAgfVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Vzc2lvbjtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9zZXNzaW9uLmpzXG4gKiovIiwidmFyICQgPSByZXF1aXJlKFwialF1ZXJ5XCIpO1xudmFyIHNlc3Npb24gPSByZXF1aXJlKCdhcHAvc2Vzc2lvbicpO1xuXG5jb25zdCBhcGkgPSB7XG5cbiAgcHV0KHBhdGgsIGRhdGEsIHdpdGhUb2tlbil7XG4gICAgcmV0dXJuIGFwaS5hamF4KHt1cmw6IHBhdGgsIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLCB0eXBlOiAnUFVUJ30sIHdpdGhUb2tlbik7XG4gIH0sXG5cbiAgcG9zdChwYXRoLCBkYXRhLCB3aXRoVG9rZW4pe1xuICAgIHJldHVybiBhcGkuYWpheCh7dXJsOiBwYXRoLCBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSwgdHlwZTogJ1BPU1QnfSwgd2l0aFRva2VuKTtcbiAgfSxcblxuICBnZXQocGF0aCl7XG4gICAgcmV0dXJuIGFwaS5hamF4KHt1cmw6IHBhdGh9KTtcbiAgfSxcblxuICBhamF4KGNmZywgd2l0aFRva2VuID0gdHJ1ZSl7XG4gICAgdmFyIGRlZmF1bHRDZmcgPSB7XG4gICAgICB0eXBlOiBcIkdFVFwiLFxuICAgICAgZGF0YVR5cGU6IFwianNvblwiLFxuICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oeGhyKSB7XG4gICAgICAgIGlmKHdpdGhUb2tlbil7XG4gICAgICAgICAgdmFyIHsgdG9rZW4gfSA9IHNlc3Npb24uZ2V0VXNlckRhdGEoKTtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQXV0aG9yaXphdGlvbicsJ0JlYXJlciAnICsgdG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAkLmFqYXgoJC5leHRlbmQoe30sIGRlZmF1bHRDZmcsIGNmZykpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL3NlcnZpY2VzL2FwaS5qc1xuICoqLyIsImNvbnN0IG5vZGVIb3N0TmFtZUJ5U2VydmVySWQgPSAoc2VydmVySWQpID0+IFsgWyd0bHB0X25vZGVzJ10sIChub2RlcykgPT57XG4gIGxldCBzZXJ2ZXIgPSBub2Rlcy5maW5kKGl0ZW09PiBpdGVtLmdldCgnaWQnKSA9PT0gc2VydmVySWQpOyAgXG4gIHJldHVybiAhc2VydmVyID8gJycgOiBzZXJ2ZXIuZ2V0KCdob3N0bmFtZScpO1xufV07XG5cbmNvbnN0IG5vZGVMaXN0VmlldyA9IFsgWyd0bHB0X25vZGVzJ10sIChub2RlcykgPT57XG4gICAgcmV0dXJuIG5vZGVzLm1hcCgoaXRlbSk9PntcbiAgICAgIHZhciBzZXJ2ZXJJZCA9IGl0ZW0uZ2V0KCdpZCcpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHNlcnZlcklkLFxuICAgICAgICBob3N0bmFtZTogaXRlbS5nZXQoJ2hvc3RuYW1lJyksXG4gICAgICAgIHRhZ3M6IGdldFRhZ3MoaXRlbSksXG4gICAgICAgIGFkZHI6IGl0ZW0uZ2V0KCdhZGRyJylcbiAgICAgIH1cbiAgICB9KS50b0pTKCk7XG4gfVxuXTtcblxuZnVuY3Rpb24gZ2V0VGFncyhub2RlKXtcbiAgdmFyIGFsbExhYmVscyA9IFtdO1xuICB2YXIgbGFiZWxzID0gbm9kZS5nZXQoJ2xhYmVscycpO1xuXG4gIGlmKGxhYmVscyl7XG4gICAgbGFiZWxzLmVudHJ5U2VxKCkudG9BcnJheSgpLmZvckVhY2goaXRlbT0+e1xuICAgICAgYWxsTGFiZWxzLnB1c2goe1xuICAgICAgICByb2xlOiBpdGVtWzBdLFxuICAgICAgICB2YWx1ZTogaXRlbVsxXVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBsYWJlbHMgPSBub2RlLmdldCgnY21kX2xhYmVscycpO1xuXG4gIGlmKGxhYmVscyl7XG4gICAgbGFiZWxzLmVudHJ5U2VxKCkudG9BcnJheSgpLmZvckVhY2goaXRlbT0+e1xuICAgICAgYWxsTGFiZWxzLnB1c2goe1xuICAgICAgICByb2xlOiBpdGVtWzBdLFxuICAgICAgICB2YWx1ZTogaXRlbVsxXS5nZXQoJ3Jlc3VsdCcpLFxuICAgICAgICB0b29sdGlwOiBpdGVtWzFdLmdldCgnY29tbWFuZCcpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBhbGxMYWJlbHM7XG59XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBub2RlTGlzdFZpZXcsXG4gIG5vZGVIb3N0TmFtZUJ5U2VydmVySWRcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL25vZGVzL2dldHRlcnMuanNcbiAqKi8iLCJpbXBvcnQga2V5TWlycm9yIGZyb20gJ2tleW1pcnJvcidcblxuZXhwb3J0IGRlZmF1bHQga2V5TWlycm9yKHtcbiAgVFJZSU5HX1RPX1NJR05fVVA6IG51bGwsXG4gIFRSWUlOR19UT19MT0dJTjogbnVsbCxcbiAgRkVUQ0hJTkdfSU5WSVRFOiBudWxsXG59KVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvcmVzdEFwaS9jb25zdGFudHMuanNcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG5jb25zdCBHcnZUYWJsZVRleHRDZWxsID0gKHtyb3dJbmRleCwgZGF0YSwgY29sdW1uS2V5LCAuLi5wcm9wc30pID0+IChcbiAgPEdydlRhYmxlQ2VsbCB7Li4ucHJvcHN9PlxuICAgIHtkYXRhW3Jvd0luZGV4XVtjb2x1bW5LZXldfVxuICA8L0dydlRhYmxlQ2VsbD5cbik7XG5cbi8qKlxuKiBTb3J0IGluZGljYXRvciB1c2VkIGJ5IFNvcnRIZWFkZXJDZWxsXG4qL1xuY29uc3QgU29ydFR5cGVzID0ge1xuICBBU0M6ICdBU0MnLFxuICBERVNDOiAnREVTQydcbn07XG5cbmNvbnN0IFNvcnRJbmRpY2F0b3IgPSAoe3NvcnREaXJ9KT0+e1xuICBsZXQgY2xzID0gJ2dydi10YWJsZS1pbmRpY2F0b3Itc29ydCBmYSBmYS1zb3J0J1xuICBpZihzb3J0RGlyID09PSBTb3J0VHlwZXMuREVTQyl7XG4gICAgY2xzICs9ICctZGVzYydcbiAgfVxuXG4gIGlmKCBzb3J0RGlyID09PSBTb3J0VHlwZXMuQVNDKXtcbiAgICBjbHMgKz0gJy1hc2MnXG4gIH1cblxuICByZXR1cm4gKDxpIGNsYXNzTmFtZT17Y2xzfT48L2k+KTtcbn07XG5cbi8qKlxuKiBTb3J0IEhlYWRlciBDZWxsXG4qL1xudmFyIFNvcnRIZWFkZXJDZWxsID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICByZW5kZXIoKSB7XG4gICAgdmFyIHtzb3J0RGlyLCB0aXRsZSwgLi4ucHJvcHN9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiAoXG4gICAgICA8R3J2VGFibGVDZWxsIHsuLi5wcm9wc30+XG4gICAgICAgIDxhIG9uQ2xpY2s9e3RoaXMub25Tb3J0Q2hhbmdlfT5cbiAgICAgICAgICB7dGl0bGV9XG4gICAgICAgIDwvYT5cbiAgICAgICAgPFNvcnRJbmRpY2F0b3Igc29ydERpcj17c29ydERpcn0vPlxuICAgICAgPC9HcnZUYWJsZUNlbGw+XG4gICAgKTtcbiAgfSxcblxuICBvblNvcnRDaGFuZ2UoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZih0aGlzLnByb3BzLm9uU29ydENoYW5nZSkge1xuICAgICAgLy8gZGVmYXVsdFxuICAgICAgbGV0IG5ld0RpciA9IFNvcnRUeXBlcy5ERVNDO1xuICAgICAgaWYodGhpcy5wcm9wcy5zb3J0RGlyKXtcbiAgICAgICAgbmV3RGlyID0gdGhpcy5wcm9wcy5zb3J0RGlyID09PSBTb3J0VHlwZXMuREVTQyA/IFNvcnRUeXBlcy5BU0MgOiBTb3J0VHlwZXMuREVTQztcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcHMub25Tb3J0Q2hhbmdlKHRoaXMucHJvcHMuY29sdW1uS2V5LCBuZXdEaXIpO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuKiBEZWZhdWx0IENlbGxcbiovXG52YXIgR3J2VGFibGVDZWxsID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICByZW5kZXIoKXtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBwcm9wcy5pc0hlYWRlciA/IDx0aCBrZXk9e3Byb3BzLmtleX0gY2xhc3NOYW1lPVwiZ3J2LXRhYmxlLWNlbGxcIj57cHJvcHMuY2hpbGRyZW59PC90aD4gOiA8dGQga2V5PXtwcm9wcy5rZXl9Pntwcm9wcy5jaGlsZHJlbn08L3RkPjtcbiAgfVxufSk7XG5cbi8qKlxuKiBUYWJsZVxuKi9cbnZhciBHcnZUYWJsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICByZW5kZXJIZWFkZXIoY2hpbGRyZW4pe1xuICAgIHZhciBjZWxscyA9IGNoaWxkcmVuLm1hcCgoaXRlbSwgaW5kZXgpPT57XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJDZWxsKGl0ZW0ucHJvcHMuaGVhZGVyLCB7aW5kZXgsIGtleTogaW5kZXgsIGlzSGVhZGVyOiB0cnVlLCAuLi5pdGVtLnByb3BzfSk7XG4gICAgfSlcblxuICAgIHJldHVybiA8dGhlYWQgY2xhc3NOYW1lPVwiZ3J2LXRhYmxlLWhlYWRlclwiPjx0cj57Y2VsbHN9PC90cj48L3RoZWFkPlxuICB9LFxuXG4gIHJlbmRlckJvZHkoY2hpbGRyZW4pe1xuICAgIHZhciBjb3VudCA9IHRoaXMucHJvcHMucm93Q291bnQ7XG4gICAgdmFyIHJvd3MgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKyspe1xuICAgICAgdmFyIGNlbGxzID0gY2hpbGRyZW4ubWFwKChpdGVtLCBpbmRleCk9PntcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ2VsbChpdGVtLnByb3BzLmNlbGwsIHtyb3dJbmRleDogaSwga2V5OiBpbmRleCwgaXNIZWFkZXI6IGZhbHNlLCAuLi5pdGVtLnByb3BzfSk7XG4gICAgICB9KVxuXG4gICAgICByb3dzLnB1c2goPHRyIGtleT17aX0+e2NlbGxzfTwvdHI+KTtcbiAgICB9XG5cbiAgICByZXR1cm4gPHRib2R5Pntyb3dzfTwvdGJvZHk+O1xuICB9LFxuXG4gIHJlbmRlckNlbGwoY2VsbCwgY2VsbFByb3BzKXtcbiAgICB2YXIgY29udGVudCA9IG51bGw7XG4gICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNlbGwpKSB7XG4gICAgICAgY29udGVudCA9IFJlYWN0LmNsb25lRWxlbWVudChjZWxsLCBjZWxsUHJvcHMpO1xuICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjZWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgY29udGVudCA9IGNlbGwoY2VsbFByb3BzKTtcbiAgICAgfVxuXG4gICAgIHJldHVybiBjb250ZW50O1xuICB9LFxuXG4gIHJlbmRlcigpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKHRoaXMucHJvcHMuY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZihjaGlsZC50eXBlLmRpc3BsYXlOYW1lICE9PSAnR3J2VGFibGVDb2x1bW4nKXtcbiAgICAgICAgdGhyb3cgJ1Nob3VsZCBiZSBHcnZUYWJsZUNvbHVtbic7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH0pO1xuXG4gICAgdmFyIHRhYmxlQ2xhc3MgPSAndGFibGUgJyArIHRoaXMucHJvcHMuY2xhc3NOYW1lO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0YWJsZSBjbGFzc05hbWU9e3RhYmxlQ2xhc3N9PlxuICAgICAgICB7dGhpcy5yZW5kZXJIZWFkZXIoY2hpbGRyZW4pfVxuICAgICAgICB7dGhpcy5yZW5kZXJCb2R5KGNoaWxkcmVuKX1cbiAgICAgIDwvdGFibGU+XG4gICAgKTtcbiAgfVxufSlcblxudmFyIEdydlRhYmxlQ29sdW1uID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IDxHcnZUYWJsZUNvbHVtbiAvPiBzaG91bGQgbmV2ZXIgcmVuZGVyJyk7XG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IEdydlRhYmxlO1xuZXhwb3J0IHtcbiAgR3J2VGFibGVDb2x1bW4gYXMgQ29sdW1uLFxuICBHcnZUYWJsZSBhcyBUYWJsZSxcbiAgR3J2VGFibGVDZWxsIGFzIENlbGwsXG4gIEdydlRhYmxlVGV4dENlbGwgYXMgVGV4dENlbGwsXG4gIFNvcnRIZWFkZXJDZWxsLFxuICBTb3J0SW5kaWNhdG9yLFxuICBTb3J0VHlwZXN9O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvdGFibGUuanN4XG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBfO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwgXCJfXCJcbiAqKiBtb2R1bGUgaWQgPSA1N1xuICoqIG1vZHVsZSBjaHVua3MgPSAxXG4gKiovIiwiY2xhc3MgTG9nZ2VyIHtcbiAgY29uc3RydWN0b3IobmFtZT0nZGVmYXVsdCcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgbG9nKGxldmVsPSdsb2cnLCAuLi5hcmdzKSB7XG4gICAgY29uc29sZVtsZXZlbF0oYCVjWyR7dGhpcy5uYW1lfV1gLCBgY29sb3I6IGJsdWU7YCwgLi4uYXJncyk7XG4gIH1cblxuICB0cmFjZSguLi5hcmdzKSB7XG4gICAgdGhpcy5sb2coJ3RyYWNlJywgLi4uYXJncyk7XG4gIH1cblxuICB3YXJuKC4uLmFyZ3MpIHtcbiAgICB0aGlzLmxvZygnd2FybicsIC4uLmFyZ3MpO1xuICB9XG5cbiAgaW5mbyguLi5hcmdzKSB7XG4gICAgdGhpcy5sb2coJ2luZm8nLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGVycm9yKC4uLmFyZ3MpIHtcbiAgICB0aGlzLmxvZygnZXJyb3InLCAuLi5hcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNyZWF0ZTogKC4uLmFyZ3MpID0+IG5ldyBMb2dnZXIoLi4uYXJncylcbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tbW9uL2xvZ2dlci5qc1xuICoqLyIsInZhciB7Y3JlYXRlVmlld30gPSByZXF1aXJlKCdhcHAvbW9kdWxlcy9zZXNzaW9ucy9nZXR0ZXJzJyk7XG5cbmNvbnN0IGFjdGl2ZVNlc3Npb24gPSBbXG5bJ3RscHRfY3VycmVudF9zZXNzaW9uJ10sIFsndGxwdF9zZXNzaW9ucyddLFxuKGFjdGl2ZVRlcm0sIHNlc3Npb25zKSA9PiB7XG4gICAgaWYoIWFjdGl2ZVRlcm0pe1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLypcbiAgICAqIGFjdGl2ZSBzZXNzaW9uIG5lZWRzIHRvIGhhdmUgaXRzIG93biB2aWV3IGFzIGFuIGFjdHVhbCBzZXNzaW9uIG1pZ2h0IG5vdFxuICAgICogZXhpc3QgYXQgdGhpcyBwb2ludC4gRm9yIGV4YW1wbGUsIHVwb24gY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiB3ZSBuZWVkIHRvIGtub3dcbiAgICAqIGxvZ2luIGFuZCBzZXJ2ZXJJZC4gSXQgd2lsbCBiZSBzaW1wbGlmaWVkIG9uY2Ugc2VydmVyIEFQSSBnZXRzIGV4dGVuZGVkLlxuICAgICovXG4gICAgbGV0IGFzVmlldyA9IHtcbiAgICAgIGlzTmV3U2Vzc2lvbjogYWN0aXZlVGVybS5nZXQoJ2lzTmV3U2Vzc2lvbicpLFxuICAgICAgbm90Rm91bmQ6IGFjdGl2ZVRlcm0uZ2V0KCdub3RGb3VuZCcpLFxuICAgICAgYWRkcjogYWN0aXZlVGVybS5nZXQoJ2FkZHInKSxcbiAgICAgIHNlcnZlcklkOiBhY3RpdmVUZXJtLmdldCgnc2VydmVySWQnKSxcbiAgICAgIHNlcnZlcklwOiB1bmRlZmluZWQsXG4gICAgICBsb2dpbjogYWN0aXZlVGVybS5nZXQoJ2xvZ2luJyksXG4gICAgICBzaWQ6IGFjdGl2ZVRlcm0uZ2V0KCdzaWQnKSxcbiAgICAgIGNvbHM6IHVuZGVmaW5lZCxcbiAgICAgIHJvd3M6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICAvLyBpbiBjYXNlIGlmIHNlc3Npb24gYWxyZWFkeSBleGlzdHMsIGdldCB0aGUgZGF0YSBmcm9tIHRoZXJlXG4gICAgLy8gKGZvciBleGFtcGxlLCB3aGVuIGpvaW5pbmcgYW4gZXhpc3Rpbmcgc2Vzc2lvbilcbiAgICBpZihzZXNzaW9ucy5oYXMoYXNWaWV3LnNpZCkpe1xuICAgICAgbGV0IHNWaWV3ID0gY3JlYXRlVmlldyhzZXNzaW9ucy5nZXQoYXNWaWV3LnNpZCkpO1xuXG4gICAgICBhc1ZpZXcucGFydGllcyA9IHNWaWV3LnBhcnRpZXM7XG4gICAgICBhc1ZpZXcuc2VydmVySXAgPSBzVmlldy5zZXJ2ZXJJcDtcbiAgICAgIGFzVmlldy5zZXJ2ZXJJZCA9IHNWaWV3LnNlcnZlcklkO1xuICAgICAgYXNWaWV3LmFjdGl2ZSA9IHNWaWV3LmFjdGl2ZTtcbiAgICAgIGFzVmlldy5jb2xzID0gc1ZpZXcuY29scztcbiAgICAgIGFzVmlldy5yb3dzID0gc1ZpZXcucm93cztcbiAgICB9XG5cbiAgICByZXR1cm4gYXNWaWV3O1xuXG4gIH1cbl07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYWN0aXZlU2Vzc2lvblxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvYWN0aXZlVGVybWluYWwvZ2V0dGVycy5qc1xuICoqLyIsIm1vZHVsZS5leHBvcnRzLmdldHRlcnMgPSByZXF1aXJlKCcuL2dldHRlcnMnKTtcbm1vZHVsZS5leHBvcnRzLmFjdGlvbnMgPSByZXF1aXJlKCcuL2FjdGlvbnMnKTtcbm1vZHVsZS5leHBvcnRzLmFjdGl2ZVRlcm1TdG9yZSA9IHJlcXVpcmUoJy4vYWN0aXZlVGVybVN0b3JlJyk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9hY3RpdmVUZXJtaW5hbC9pbmRleC5qc1xuICoqLyIsInZhciByZWFjdG9yID0gcmVxdWlyZSgnYXBwL3JlYWN0b3InKTtcbnZhciB7IFRMUFRfRElBTE9HX1NFTEVDVF9OT0RFX1NIT1csIFRMUFRfRElBTE9HX1NFTEVDVF9OT0RFX0NMT1NFIH0gPSByZXF1aXJlKCcuL2FjdGlvblR5cGVzJyk7XG5cbnZhciBhY3Rpb25zID0ge1xuICBzaG93U2VsZWN0Tm9kZURpYWxvZygpe1xuICAgIHJlYWN0b3IuZGlzcGF0Y2goVExQVF9ESUFMT0dfU0VMRUNUX05PREVfU0hPVyk7XG4gIH0sXG5cbiAgY2xvc2VTZWxlY3ROb2RlRGlhbG9nKCl7XG4gICAgcmVhY3Rvci5kaXNwYXRjaChUTFBUX0RJQUxPR19TRUxFQ1RfTk9ERV9DTE9TRSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYWN0aW9ucztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL2RpYWxvZ3MvYWN0aW9ucy5qc1xuICoqLyIsInZhciByZWFjdG9yID0gcmVxdWlyZSgnYXBwL3JlYWN0b3InKTtcbnZhciBhcGkgPSByZXF1aXJlKCdhcHAvc2VydmljZXMvYXBpJyk7XG52YXIgY2ZnID0gcmVxdWlyZSgnYXBwL2NvbmZpZycpO1xudmFyIHtzaG93RXJyb3J9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvbm90aWZpY2F0aW9ucy9hY3Rpb25zJyk7XG5cbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ2FwcC9jb21tb24vbG9nZ2VyJykuY3JlYXRlKCdNb2R1bGVzL1Nlc3Npb25zJyk7XG5jb25zdCB7IFRMUFRfU0VTU0lOU19SRUNFSVZFLCBUTFBUX1NFU1NJTlNfVVBEQVRFIH0gID0gcmVxdWlyZSgnLi9hY3Rpb25UeXBlcycpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgZmV0Y2hTZXNzaW9uKHNpZCl7XG4gICAgcmV0dXJuIGFwaS5nZXQoY2ZnLmFwaS5nZXRGZXRjaFNlc3Npb25Vcmwoc2lkKSkudGhlbihqc29uPT57XG4gICAgICBpZihqc29uICYmIGpzb24uc2Vzc2lvbil7XG4gICAgICAgIHJlYWN0b3IuZGlzcGF0Y2goVExQVF9TRVNTSU5TX1VQREFURSwganNvbi5zZXNzaW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBmZXRjaFNlc3Npb25zKHN0YXJ0RGF0ZSwgZW5kRGF0ZSl7XG4gICAgbG9nZ2VyLmluZm8oJ2F0dGVtcCB0byBmZXRjaCBzZXNzaW9ucycsIHtzdGFydERhdGUsIGVuZERhdGV9KTtcbiAgICByZXR1cm4gYXBpLmdldChjZmcuYXBpLmdldEZldGNoU2Vzc2lvbnNVcmwoc3RhcnREYXRlLCBlbmREYXRlKSlcbiAgICAgIC5kb25lKChqc29uKSA9PiB7XG4gICAgICAgIHJlYWN0b3IuZGlzcGF0Y2goVExQVF9TRVNTSU5TX1JFQ0VJVkUsIGpzb24uc2Vzc2lvbnMpO1xuICAgICAgfSlcbiAgICAgIC5mYWlsKChlcnIpPT57XG4gICAgICAgIHNob3dFcnJvcignVW5hYmxlIHRvIHJldHJpZXZlIGxpc3Qgb2Ygc2Vzc2lvbnMnKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdmZXRjaFNlc3Npb25zJywgZXJyKTtcbiAgICAgIH0pO1xuICB9LFxuXG4gIHVwZGF0ZVNlc3Npb24oanNvbil7XG4gICAgcmVhY3Rvci5kaXNwYXRjaChUTFBUX1NFU1NJTlNfVVBEQVRFLCBqc29uKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvc2Vzc2lvbnMvYWN0aW9ucy5qc1xuICoqLyIsIm1vZHVsZS5leHBvcnRzLmdldHRlcnMgPSByZXF1aXJlKCcuL2dldHRlcnMnKTtcbm1vZHVsZS5leHBvcnRzLmFjdGlvbnMgPSByZXF1aXJlKCcuL2FjdGlvbnMnKTtcbm1vZHVsZS5leHBvcnRzLmFjdGl2ZVRlcm1TdG9yZSA9IHJlcXVpcmUoJy4vc2Vzc2lvblN0b3JlJyk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9zZXNzaW9ucy9pbmRleC5qc1xuICoqLyIsInZhciB7VFJZSU5HX1RPX0xPR0lOfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL3Jlc3RBcGkvY29uc3RhbnRzJyk7XG52YXIge3JlcXVlc3RTdGF0dXN9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvcmVzdEFwaS9nZXR0ZXJzJyk7XG5cbmNvbnN0IHVzZXIgPSBbIFsndGxwdF91c2VyJ10sIChjdXJyZW50VXNlcikgPT4ge1xuICAgIGlmKCFjdXJyZW50VXNlcil7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IGN1cnJlbnRVc2VyLmdldCgnbmFtZScpIHx8ICcnO1xuICAgIHZhciBzaG9ydERpc3BsYXlOYW1lID0gbmFtZVswXSB8fCAnJztcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgc2hvcnREaXNwbGF5TmFtZSxcbiAgICAgIGxvZ2luczogY3VycmVudFVzZXIuZ2V0KCdhbGxvd2VkX2xvZ2lucycpLnRvSlMoKVxuICAgIH1cbiAgfVxuXTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICB1c2VyLFxuICBsb2dpbkF0dGVtcDogcmVxdWVzdFN0YXR1cyhUUllJTkdfVE9fTE9HSU4pXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy91c2VyL2dldHRlcnMuanNcbiAqKi8iLCJ2YXIgYXBpID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9hcGknKTtcbnZhciBzZXNzaW9uID0gcmVxdWlyZSgnLi9zZXNzaW9uJyk7XG52YXIgY2ZnID0gcmVxdWlyZSgnYXBwL2NvbmZpZycpO1xudmFyICQgPSByZXF1aXJlKCdqUXVlcnknKTtcblxuY29uc3QgcmVmcmVzaFJhdGUgPSA2MDAwMCAqIDU7IC8vIDEgbWluXG5cbnZhciByZWZyZXNoVG9rZW5UaW1lcklkID0gbnVsbDtcblxudmFyIGF1dGggPSB7XG5cbiAgc2lnblVwKG5hbWUsIHBhc3N3b3JkLCB0b2tlbiwgaW52aXRlVG9rZW4pe1xuICAgIHZhciBkYXRhID0ge3VzZXI6IG5hbWUsIHBhc3M6IHBhc3N3b3JkLCBzZWNvbmRfZmFjdG9yX3Rva2VuOiB0b2tlbiwgaW52aXRlX3Rva2VuOiBpbnZpdGVUb2tlbn07XG4gICAgcmV0dXJuIGFwaS5wb3N0KGNmZy5hcGkuY3JlYXRlVXNlclBhdGgsIGRhdGEpXG4gICAgICAudGhlbigodXNlcik9PntcbiAgICAgICAgc2Vzc2lvbi5zZXRVc2VyRGF0YSh1c2VyKTtcbiAgICAgICAgYXV0aC5fc3RhcnRUb2tlblJlZnJlc2hlcigpO1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH0pO1xuICB9LFxuXG4gIGxvZ2luKG5hbWUsIHBhc3N3b3JkLCB0b2tlbil7XG4gICAgYXV0aC5fc3RvcFRva2VuUmVmcmVzaGVyKCk7XG4gICAgcmV0dXJuIGF1dGguX2xvZ2luKG5hbWUsIHBhc3N3b3JkLCB0b2tlbikuZG9uZShhdXRoLl9zdGFydFRva2VuUmVmcmVzaGVyKTtcbiAgfSxcblxuICBlbnN1cmVVc2VyKCl7XG4gICAgdmFyIHVzZXJEYXRhID0gc2Vzc2lvbi5nZXRVc2VyRGF0YSgpO1xuICAgIGlmKHVzZXJEYXRhLnRva2VuKXtcbiAgICAgIC8vIHJlZnJlc2ggdGltZXIgd2lsbCBub3QgYmUgc2V0IGluIGNhc2Ugb2YgYnJvd3NlciByZWZyZXNoIGV2ZW50XG4gICAgICBpZihhdXRoLl9nZXRSZWZyZXNoVG9rZW5UaW1lcklkKCkgPT09IG51bGwpe1xuICAgICAgICByZXR1cm4gYXV0aC5fcmVmcmVzaFRva2VuKCkuZG9uZShhdXRoLl9zdGFydFRva2VuUmVmcmVzaGVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKHVzZXJEYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xuICB9LFxuXG4gIGxvZ291dCgpe1xuICAgIGF1dGguX3N0b3BUb2tlblJlZnJlc2hlcigpO1xuICAgIHNlc3Npb24uY2xlYXIoKTtcbiAgICBzZXNzaW9uLmdldEhpc3RvcnkoKS5yZXBsYWNlKHtwYXRobmFtZTogY2ZnLnJvdXRlcy5sb2dpbn0pO1xuICB9LFxuXG4gIF9zdGFydFRva2VuUmVmcmVzaGVyKCl7XG4gICAgcmVmcmVzaFRva2VuVGltZXJJZCA9IHNldEludGVydmFsKGF1dGguX3JlZnJlc2hUb2tlbiwgcmVmcmVzaFJhdGUpO1xuICB9LFxuXG4gIF9zdG9wVG9rZW5SZWZyZXNoZXIoKXtcbiAgICBjbGVhckludGVydmFsKHJlZnJlc2hUb2tlblRpbWVySWQpO1xuICAgIHJlZnJlc2hUb2tlblRpbWVySWQgPSBudWxsO1xuICB9LFxuXG4gIF9nZXRSZWZyZXNoVG9rZW5UaW1lcklkKCl7XG4gICAgcmV0dXJuIHJlZnJlc2hUb2tlblRpbWVySWQ7XG4gIH0sXG5cbiAgX3JlZnJlc2hUb2tlbigpe1xuICAgIHJldHVybiBhcGkucG9zdChjZmcuYXBpLnJlbmV3VG9rZW5QYXRoKS50aGVuKGRhdGE9PntcbiAgICAgIHNlc3Npb24uc2V0VXNlckRhdGEoZGF0YSk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KS5mYWlsKCgpPT57XG4gICAgICBhdXRoLmxvZ291dCgpO1xuICAgIH0pO1xuICB9LFxuXG4gIF9sb2dpbihuYW1lLCBwYXNzd29yZCwgdG9rZW4pe1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgdXNlcjogbmFtZSxcbiAgICAgIHBhc3M6IHBhc3N3b3JkLFxuICAgICAgc2Vjb25kX2ZhY3Rvcl90b2tlbjogdG9rZW5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGFwaS5wb3N0KGNmZy5hcGkuc2Vzc2lvblBhdGgsIGRhdGEsIGZhbHNlKS50aGVuKGRhdGE9PntcbiAgICAgIHNlc3Npb24uc2V0VXNlckRhdGEoZGF0YSk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGF1dGg7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvYXV0aC5qc1xuICoqLyIsInZhciBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcblxubW9kdWxlLmV4cG9ydHMubW9udGhSYW5nZSA9IGZ1bmN0aW9uKHZhbHVlID0gbmV3IERhdGUoKSl7XG4gIGxldCBzdGFydERhdGUgPSBtb21lbnQodmFsdWUpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCk7XG4gIGxldCBlbmREYXRlID0gbW9tZW50KHZhbHVlKS5lbmRPZignbW9udGgnKS50b0RhdGUoKTtcbiAgcmV0dXJuIFtzdGFydERhdGUsIGVuZERhdGVdO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbW1vbi9kYXRlVXRpbHMuanNcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cy5pc01hdGNoID0gZnVuY3Rpb24ob2JqLCBzZWFyY2hWYWx1ZSwge3NlYXJjaGFibGVQcm9wcywgY2J9KSB7XG4gIHNlYXJjaFZhbHVlID0gc2VhcmNoVmFsdWUudG9Mb2NhbGVVcHBlckNhc2UoKTtcbiAgbGV0IHByb3BOYW1lcyA9IHNlYXJjaGFibGVQcm9wcyB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCB0YXJnZXRWYWx1ZSA9IG9ialtwcm9wTmFtZXNbaV1dO1xuICAgIGlmICh0YXJnZXRWYWx1ZSkge1xuICAgICAgaWYodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGNiKHRhcmdldFZhbHVlLCBzZWFyY2hWYWx1ZSwgcHJvcE5hbWVzW2ldKTtcbiAgICAgICAgaWYocmVzdWx0ID09PSB0cnVlKXtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0YXJnZXRWYWx1ZS50b1N0cmluZygpLnRvTG9jYWxlVXBwZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWx1ZSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21tb24vb2JqZWN0VXRpbHMuanNcbiAqKi8iLCJ2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIHNlc3Npb24gPSByZXF1aXJlKCdhcHAvc2Vzc2lvbicpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcbnZhciB7YWN0aW9uc30gPSByZXF1aXJlKCdhcHAvbW9kdWxlcy9hY3RpdmVUZXJtaW5hbC8nKTtcblxuY2xhc3MgVHR5IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcblxuICBjb25zdHJ1Y3Rvcih7c2VydmVySWQsIGxvZ2luLCBzaWQsIHJvd3MsIGNvbHMgfSl7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IHNlcnZlcklkLCBsb2dpbiwgc2lkLCByb3dzLCBjb2xzIH07XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpe1xuICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gIH1cblxuICByZWNvbm5lY3Qob3B0aW9ucyl7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb2NrZXQub25vcGVuID0gbnVsbDtcbiAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSBudWxsO1xuICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSBudWxsO1xuICAgIFxuICAgIHRoaXMuY29ubmVjdChvcHRpb25zKTtcbiAgfVxuXG4gIGNvbm5lY3Qob3B0aW9ucyl7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgbGV0IHt0b2tlbn0gPSBzZXNzaW9uLmdldFVzZXJEYXRhKCk7XG4gICAgbGV0IGNvbm5TdHIgPSBjZmcuYXBpLmdldFR0eUNvbm5TdHIoe3Rva2VuLCAuLi50aGlzLm9wdGlvbnN9KTtcblxuICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChjb25uU3RyLCAncHJvdG8nKTtcblxuICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnb3BlbicpO1xuICAgIH1cblxuICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IChlKT0+e1xuICAgICAgdGhpcy5lbWl0KCdkYXRhJywgZS5kYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKCk9PntcbiAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgICB9XG4gIH1cblxuICByZXNpemUoY29scywgcm93cyl7XG4gICAgYWN0aW9ucy5yZXNpemUoY29scywgcm93cyk7XG4gIH1cblxuICBzZW5kKGRhdGEpe1xuICAgIHRoaXMuc29ja2V0LnNlbmQoZGF0YSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUdHk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tbW9uL3R0eS5qc1xuICoqLyIsImltcG9ydCBrZXlNaXJyb3IgZnJvbSAna2V5bWlycm9yJ1xuXG5leHBvcnQgZGVmYXVsdCBrZXlNaXJyb3Ioe1xuICBUTFBUX1RFUk1fT1BFTjogbnVsbCxcbiAgVExQVF9URVJNX0NMT1NFOiBudWxsLFxuICBUTFBUX1RFUk1fQ0hBTkdFX1NFUlZFUjogbnVsbFxufSlcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsL2FjdGlvblR5cGVzLmpzXG4gKiovIiwidmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHNlc3Npb24gPSByZXF1aXJlKCdhcHAvc2Vzc2lvbicpO1xudmFyIHV1aWQgPSByZXF1aXJlKCdhcHAvY29tbW9uL3V1aWQnKTtcbnZhciBhcGkgPSByZXF1aXJlKCdhcHAvc2VydmljZXMvYXBpJyk7XG52YXIgY2ZnID0gcmVxdWlyZSgnYXBwL2NvbmZpZycpO1xudmFyIGdldHRlcnMgPSByZXF1aXJlKCcuL2dldHRlcnMnKTtcbnZhciBzZXNzaW9uTW9kdWxlID0gcmVxdWlyZSgnLi8uLi9zZXNzaW9ucycpO1xuXG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCdhcHAvY29tbW9uL2xvZ2dlcicpLmNyZWF0ZSgnQ3VycmVudCBTZXNzaW9uJyk7XG5jb25zdCB7IFRMUFRfVEVSTV9PUEVOLCBUTFBUX1RFUk1fQ0xPU0UsIFRMUFRfVEVSTV9DSEFOR0VfU0VSVkVSIH0gPSByZXF1aXJlKCcuL2FjdGlvblR5cGVzJyk7XG5cbmNvbnN0IGFjdGlvbnMgPSB7XG5cbiAgY2hhbmdlU2VydmVyKHNlcnZlcklkLCBsb2dpbil7XG4gICAgcmVhY3Rvci5kaXNwYXRjaChUTFBUX1RFUk1fQ0hBTkdFX1NFUlZFUiwge1xuICAgICAgc2VydmVySWQsXG4gICAgICBsb2dpblxuICAgIH0pO1xuICB9LFxuXG4gIGNsb3NlKCl7XG4gICAgbGV0IHtpc05ld1Nlc3Npb259ID0gcmVhY3Rvci5ldmFsdWF0ZShnZXR0ZXJzLmFjdGl2ZVNlc3Npb24pO1xuXG4gICAgcmVhY3Rvci5kaXNwYXRjaChUTFBUX1RFUk1fQ0xPU0UpO1xuXG4gICAgaWYoaXNOZXdTZXNzaW9uKXtcbiAgICAgIHNlc3Npb24uZ2V0SGlzdG9yeSgpLnB1c2goY2ZnLnJvdXRlcy5ub2Rlcyk7XG4gICAgfWVsc2V7XG4gICAgICBzZXNzaW9uLmdldEhpc3RvcnkoKS5wdXNoKGNmZy5yb3V0ZXMuc2Vzc2lvbnMpO1xuICAgIH1cbiAgfSxcblxuICByZXNpemUodywgaCl7XG4gICAgLy8gc29tZSBtaW4gdmFsdWVzXG4gICAgdyA9IHcgPCA1ID8gNSA6IHc7XG4gICAgaCA9IGggPCA1ID8gNSA6IGg7XG5cbiAgICBsZXQgcmVxRGF0YSA9IHsgdGVybWluYWxfcGFyYW1zOiB7IHcsIGggfSB9O1xuICAgIGxldCB7c2lkfSA9IHJlYWN0b3IuZXZhbHVhdGUoZ2V0dGVycy5hY3RpdmVTZXNzaW9uKTtcblxuICAgIGxvZ2dlci5pbmZvKCdyZXNpemUnLCBgdzoke3d9IGFuZCBoOiR7aH1gKTtcbiAgICBhcGkucHV0KGNmZy5hcGkuZ2V0VGVybWluYWxTZXNzaW9uVXJsKHNpZCksIHJlcURhdGEpXG4gICAgICAuZG9uZSgoKT0+IGxvZ2dlci5pbmZvKCdyZXNpemVkJykpXG4gICAgICAuZmFpbCgoZXJyKT0+IGxvZ2dlci5lcnJvcignZmFpbGVkIHRvIHJlc2l6ZScsIGVycikpO1xuICB9LFxuXG4gIG9wZW5TZXNzaW9uKHNpZCl7XG4gICAgbG9nZ2VyLmluZm8oJ2F0dGVtcHQgdG8gb3BlbiBzZXNzaW9uJywge3NpZH0pO1xuICAgIHNlc3Npb25Nb2R1bGUuYWN0aW9ucy5mZXRjaFNlc3Npb24oc2lkKVxuICAgICAgLmRvbmUoKCk9PntcbiAgICAgICAgbGV0IHNWaWV3ID0gcmVhY3Rvci5ldmFsdWF0ZShzZXNzaW9uTW9kdWxlLmdldHRlcnMuc2Vzc2lvblZpZXdCeUlkKHNpZCkpO1xuICAgICAgICBsZXQgeyBzZXJ2ZXJJZCwgbG9naW4gfSA9IHNWaWV3O1xuICAgICAgICBsb2dnZXIuaW5mbygnb3BlbiBzZXNzaW9uJywgJ09LJyk7XG4gICAgICAgIHJlYWN0b3IuZGlzcGF0Y2goVExQVF9URVJNX09QRU4sIHtcbiAgICAgICAgICAgIHNlcnZlcklkLFxuICAgICAgICAgICAgbG9naW4sXG4gICAgICAgICAgICBzaWQsXG4gICAgICAgICAgICBpc05ld1Nlc3Npb246IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoKGVycik9PntcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdvcGVuIHNlc3Npb24nLCBlcnIpO1xuICAgICAgICBzZXNzaW9uLmdldEhpc3RvcnkoKS5wdXNoKGNmZy5yb3V0ZXMucGFnZU5vdEZvdW5kKTtcbiAgICAgIH0pXG4gIH0sXG5cbiAgY3JlYXRlTmV3U2Vzc2lvbihzZXJ2ZXJJZCwgbG9naW4pe1xuICAgIHZhciBzaWQgPSB1dWlkKCk7XG4gICAgdmFyIHJvdXRlVXJsID0gY2ZnLmdldEFjdGl2ZVNlc3Npb25Sb3V0ZVVybChzaWQpO1xuICAgIHZhciBoaXN0b3J5ID0gc2Vzc2lvbi5nZXRIaXN0b3J5KCk7XG5cbiAgICBsb2dnZXIuaW5mbygnY3JlYXRlTmV3U2Vzc2lvbicsIHtzZXJ2ZXJJZCwgbG9naW59KTtcbiAgICByZWFjdG9yLmRpc3BhdGNoKFRMUFRfVEVSTV9PUEVOLCB7XG4gICAgICBzZXJ2ZXJJZCxcbiAgICAgIGxvZ2luLFxuICAgICAgc2lkLFxuICAgICAgaXNOZXdTZXNzaW9uOiB0cnVlXG4gICAgfSk7XG5cbiAgICBoaXN0b3J5LnB1c2gocm91dGVVcmwpO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgYWN0aW9ucztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsL2FjdGlvbnMuanNcbiAqKi8iLCJ2YXIgeyBTdG9yZSwgdG9JbW11dGFibGUgfSA9IHJlcXVpcmUoJ251Y2xlYXItanMnKTtcbnZhciB7IFRMUFRfVEVSTV9PUEVOLCBUTFBUX1RFUk1fQ0xPU0UsIFRMUFRfVEVSTV9DSEFOR0VfU0VSVkVSIH0gID0gcmVxdWlyZSgnLi9hY3Rpb25UeXBlcycpO1xuXG5leHBvcnQgZGVmYXVsdCBTdG9yZSh7XG4gIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICByZXR1cm4gdG9JbW11dGFibGUobnVsbCk7XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLm9uKFRMUFRfVEVSTV9PUEVOLCBzZXRBY3RpdmVUZXJtaW5hbCk7XG4gICAgdGhpcy5vbihUTFBUX1RFUk1fQ0xPU0UsIGNsb3NlKTtcbiAgICB0aGlzLm9uKFRMUFRfVEVSTV9DSEFOR0VfU0VSVkVSLCBjaGFuZ2VTZXJ2ZXIpO1xuICB9XG59KVxuXG5mdW5jdGlvbiBjaGFuZ2VTZXJ2ZXIoc3RhdGUsIHtzZXJ2ZXJJZCwgbG9naW59KXtcbiAgcmV0dXJuIHN0YXRlLnNldCgnc2VydmVySWQnLCBzZXJ2ZXJJZClcbiAgICAgICAgICAgICAgLnNldCgnbG9naW4nLCBsb2dpbik7XG59XG5cbmZ1bmN0aW9uIGNsb3NlKCl7XG4gIHJldHVybiB0b0ltbXV0YWJsZShudWxsKTtcbn1cblxuZnVuY3Rpb24gc2V0QWN0aXZlVGVybWluYWwoc3RhdGUsIHtzZXJ2ZXJJZCwgbG9naW4sIHNpZCwgaXNOZXdTZXNzaW9ufSApe1xuICByZXR1cm4gdG9JbW11dGFibGUoe1xuICAgIHNlcnZlcklkLFxuICAgIGxvZ2luLFxuICAgIHNpZCxcbiAgICBpc05ld1Nlc3Npb25cbiAgfSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9hY3RpdmVUZXJtaW5hbC9hY3RpdmVUZXJtU3RvcmUuanNcbiAqKi8iLCJpbXBvcnQga2V5TWlycm9yIGZyb20gJ2tleW1pcnJvcidcblxuZXhwb3J0IGRlZmF1bHQga2V5TWlycm9yKHtcbiAgVExQVF9BUFBfSU5JVDogbnVsbCxcbiAgVExQVF9BUFBfRkFJTEVEOiBudWxsLFxuICBUTFBUX0FQUF9SRUFEWTogbnVsbFxufSlcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL2FwcC9hY3Rpb25UeXBlcy5qc1xuICoqLyIsInZhciB7IFN0b3JlLCB0b0ltbXV0YWJsZSB9ID0gcmVxdWlyZSgnbnVjbGVhci1qcycpO1xuXG52YXIgeyBUTFBUX0FQUF9JTklULCBUTFBUX0FQUF9GQUlMRUQsIFRMUFRfQVBQX1JFQURZIH0gPSByZXF1aXJlKCcuL2FjdGlvblR5cGVzJyk7XG5cbnZhciBpbml0U3RhdGUgPSB0b0ltbXV0YWJsZSh7XG4gIGlzUmVhZHk6IGZhbHNlLFxuICBpc0luaXRpYWxpemluZzogZmFsc2UsXG4gIGlzRmFpbGVkOiBmYWxzZVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0b3JlKHtcblxuICBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgcmV0dXJuIGluaXRTdGF0ZS5zZXQoJ2lzSW5pdGlhbGl6aW5nJywgdHJ1ZSk7XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLm9uKFRMUFRfQVBQX0lOSVQsICgpPT4gaW5pdFN0YXRlLnNldCgnaXNJbml0aWFsaXppbmcnLCB0cnVlKSk7XG4gICAgdGhpcy5vbihUTFBUX0FQUF9SRUFEWSwoKT0+IGluaXRTdGF0ZS5zZXQoJ2lzUmVhZHknLCB0cnVlKSk7XG4gICAgdGhpcy5vbihUTFBUX0FQUF9GQUlMRUQsKCk9PiBpbml0U3RhdGUuc2V0KCdpc0ZhaWxlZCcsIHRydWUpKTtcbiAgfVxufSlcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL2FwcC9hcHBTdG9yZS5qc1xuICoqLyIsImltcG9ydCBrZXlNaXJyb3IgZnJvbSAna2V5bWlycm9yJ1xuXG5leHBvcnQgZGVmYXVsdCBrZXlNaXJyb3Ioe1xuICBUTFBUX0RJQUxPR19TRUxFQ1RfTk9ERV9TSE9XOiBudWxsLFxuICBUTFBUX0RJQUxPR19TRUxFQ1RfTk9ERV9DTE9TRTogbnVsbFxufSlcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL2RpYWxvZ3MvYWN0aW9uVHlwZXMuanNcbiAqKi8iLCJ2YXIgeyBTdG9yZSwgdG9JbW11dGFibGUgfSA9IHJlcXVpcmUoJ251Y2xlYXItanMnKTtcblxudmFyIHsgVExQVF9ESUFMT0dfU0VMRUNUX05PREVfU0hPVywgVExQVF9ESUFMT0dfU0VMRUNUX05PREVfQ0xPU0UgfSA9IHJlcXVpcmUoJy4vYWN0aW9uVHlwZXMnKTtcblxuZXhwb3J0IGRlZmF1bHQgU3RvcmUoe1xuXG4gIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICByZXR1cm4gdG9JbW11dGFibGUoe1xuICAgICAgaXNTZWxlY3ROb2RlRGlhbG9nT3BlbjogZmFsc2VcbiAgICB9KTtcbiAgfSxcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMub24oVExQVF9ESUFMT0dfU0VMRUNUX05PREVfU0hPVywgc2hvd1NlbGVjdE5vZGVEaWFsb2cpO1xuICAgIHRoaXMub24oVExQVF9ESUFMT0dfU0VMRUNUX05PREVfQ0xPU0UsIGNsb3NlU2VsZWN0Tm9kZURpYWxvZyk7XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIHNob3dTZWxlY3ROb2RlRGlhbG9nKHN0YXRlKXtcbiAgcmV0dXJuIHN0YXRlLnNldCgnaXNTZWxlY3ROb2RlRGlhbG9nT3BlbicsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBjbG9zZVNlbGVjdE5vZGVEaWFsb2coc3RhdGUpe1xuICByZXR1cm4gc3RhdGUuc2V0KCdpc1NlbGVjdE5vZGVEaWFsb2dPcGVuJywgZmFsc2UpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvZGlhbG9ncy9kaWFsb2dTdG9yZS5qc1xuICoqLyIsImltcG9ydCBrZXlNaXJyb3IgZnJvbSAna2V5bWlycm9yJ1xuXG5leHBvcnQgZGVmYXVsdCBrZXlNaXJyb3Ioe1xuICBUTFBUX1JFQ0VJVkVfVVNFUl9JTlZJVEU6IG51bGxcbn0pXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9pbnZpdGUvYWN0aW9uVHlwZXMuanNcbiAqKi8iLCJ2YXIgeyBTdG9yZSwgdG9JbW11dGFibGUgfSA9IHJlcXVpcmUoJ251Y2xlYXItanMnKTtcbnZhciAgeyBUTFBUX1JFQ0VJVkVfVVNFUl9JTlZJVEUgfSA9IHJlcXVpcmUoJy4vYWN0aW9uVHlwZXMnKTtcblxuZXhwb3J0IGRlZmF1bHQgU3RvcmUoe1xuICBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRvSW1tdXRhYmxlKG51bGwpO1xuICB9LFxuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgdGhpcy5vbihUTFBUX1JFQ0VJVkVfVVNFUl9JTlZJVEUsIHJlY2VpdmVJbnZpdGUpXG4gIH1cbn0pXG5cbmZ1bmN0aW9uIHJlY2VpdmVJbnZpdGUoc3RhdGUsIGludml0ZSl7XG4gIHJldHVybiB0b0ltbXV0YWJsZShpbnZpdGUpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvaW52aXRlL2ludml0ZVN0b3JlLmpzXG4gKiovIiwiaW1wb3J0IGtleU1pcnJvciBmcm9tICdrZXltaXJyb3InXG5cbmV4cG9ydCBkZWZhdWx0IGtleU1pcnJvcih7XG4gIFRMUFRfTk9ERVNfUkVDRUlWRTogbnVsbFxufSlcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL25vZGVzL2FjdGlvblR5cGVzLmpzXG4gKiovIiwiaW1wb3J0IGtleU1pcnJvciBmcm9tICdrZXltaXJyb3InXG5cbmV4cG9ydCBkZWZhdWx0IGtleU1pcnJvcih7XG4gIFRMUFRfTk9USUZJQ0FUSU9OU19BREQ6IG51bGxcbn0pXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9ub3RpZmljYXRpb25zL2FjdGlvblR5cGVzLmpzXG4gKiovIiwidmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHsgVExQVF9OT1RJRklDQVRJT05TX0FERCB9ICA9IHJlcXVpcmUoJy4vYWN0aW9uVHlwZXMnKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuXG4gIHNob3dFcnJvcih0ZXh0LCB0aXRsZT0nRVJST1InKXtcbiAgICBkaXNwYXRjaCh7aXNFcnJvcjogdHJ1ZSwgdGV4dDogdGV4dCwgdGl0bGV9KTtcbiAgfSxcblxuICBzaG93U3VjY2Vzcyh0ZXh0LCB0aXRsZT0nU1VDQ0VTUycpe1xuICAgIGRpc3BhdGNoKHtpc1N1Y2Nlc3M6dHJ1ZSwgdGV4dDogdGV4dCwgdGl0bGV9KTtcbiAgfSxcblxuICBzaG93SW5mbyh0ZXh0LCB0aXRsZT0nSU5GTycpe1xuICAgIGRpc3BhdGNoKHtpc0luZm86dHJ1ZSwgdGV4dDogdGV4dCwgdGl0bGV9KTtcbiAgfSxcblxuICBzaG93V2FybmluZyh0ZXh0LCB0aXRsZT0nV0FSTklORycpe1xuICAgIGRpc3BhdGNoKHtpc1dhcm5pbmc6IHRydWUsIHRleHQ6IHRleHQsIHRpdGxlfSk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaChtc2cpe1xuICByZWFjdG9yLmRpc3BhdGNoKFRMUFRfTk9USUZJQ0FUSU9OU19BREQsIG1zZyk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9ub3RpZmljYXRpb25zL2FjdGlvbnMuanNcbiAqKi8iLCJpbXBvcnQga2V5TWlycm9yIGZyb20gJ2tleW1pcnJvcidcblxuZXhwb3J0IGRlZmF1bHQga2V5TWlycm9yKHtcbiAgVExQVF9SRVNUX0FQSV9TVEFSVDogbnVsbCxcbiAgVExQVF9SRVNUX0FQSV9TVUNDRVNTOiBudWxsLFxuICBUTFBUX1JFU1RfQVBJX0ZBSUw6IG51bGxcbn0pXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9yZXN0QXBpL2FjdGlvblR5cGVzLmpzXG4gKiovIiwidmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xuXG52YXIge1xuICBUTFBUX1JFU1RfQVBJX1NUQVJULFxuICBUTFBUX1JFU1RfQVBJX1NVQ0NFU1MsXG4gIFRMUFRfUkVTVF9BUElfRkFJTCB9ID0gcmVxdWlyZSgnLi9hY3Rpb25UeXBlcycpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgc3RhcnQocmVxVHlwZSl7XG4gICAgcmVhY3Rvci5kaXNwYXRjaChUTFBUX1JFU1RfQVBJX1NUQVJULCB7dHlwZTogcmVxVHlwZX0pO1xuICB9LFxuXG4gIGZhaWwocmVxVHlwZSwgbWVzc2FnZSl7XG4gICAgcmVhY3Rvci5kaXNwYXRjaChUTFBUX1JFU1RfQVBJX0ZBSUwsICB7dHlwZTogcmVxVHlwZSwgbWVzc2FnZX0pO1xuICB9LFxuXG4gIHN1Y2Nlc3MocmVxVHlwZSl7XG4gICAgcmVhY3Rvci5kaXNwYXRjaChUTFBUX1JFU1RfQVBJX1NVQ0NFU1MsIHt0eXBlOiByZXFUeXBlfSk7XG4gIH1cblxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvcmVzdEFwaS9hY3Rpb25zLmpzXG4gKiovIiwidmFyIGRlZmF1bHRPYmogPSB7XG4gIGlzUHJvY2Vzc2luZzogZmFsc2UsXG4gIGlzRXJyb3I6IGZhbHNlLFxuICBpc1N1Y2Nlc3M6IGZhbHNlLFxuICBtZXNzYWdlOiAnJ1xufVxuXG5jb25zdCByZXF1ZXN0U3RhdHVzID0gKHJlcVR5cGUpID0+ICBbIFsndGxwdF9yZXN0X2FwaScsIHJlcVR5cGVdLCAoYXR0ZW1wKSA9PiB7XG4gIHJldHVybiBhdHRlbXAgPyBhdHRlbXAudG9KUygpIDogZGVmYXVsdE9iajtcbiB9XG5dO1xuXG5leHBvcnQgZGVmYXVsdCB7ICByZXF1ZXN0U3RhdHVzICB9O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvcmVzdEFwaS9nZXR0ZXJzLmpzXG4gKiovIiwiaW1wb3J0IGtleU1pcnJvciBmcm9tICdrZXltaXJyb3InXG5cbmV4cG9ydCBkZWZhdWx0IGtleU1pcnJvcih7XG4gIFRMUFRfU0VTU0lOU19SRUNFSVZFOiBudWxsLFxuICBUTFBUX1NFU1NJTlNfVVBEQVRFOiBudWxsXG59KVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvc2Vzc2lvbnMvYWN0aW9uVHlwZXMuanNcbiAqKi8iLCJ2YXIgeyB0b0ltbXV0YWJsZSB9ID0gcmVxdWlyZSgnbnVjbGVhci1qcycpO1xudmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcblxuY29uc3Qgc2Vzc2lvbnNCeVNlcnZlciA9IChzZXJ2ZXJJZCkgPT4gW1sndGxwdF9zZXNzaW9ucyddLCAoc2Vzc2lvbnMpID0+e1xuICByZXR1cm4gc2Vzc2lvbnMudmFsdWVTZXEoKS5maWx0ZXIoaXRlbT0+e1xuICAgIHZhciBwYXJ0aWVzID0gaXRlbS5nZXQoJ3BhcnRpZXMnKSB8fCB0b0ltbXV0YWJsZShbXSk7XG4gICAgdmFyIGhhc1NlcnZlciA9IHBhcnRpZXMuZmluZChpdGVtMj0+IGl0ZW0yLmdldCgnc2VydmVyX2lkJykgPT09IHNlcnZlcklkKTtcbiAgICByZXR1cm4gaGFzU2VydmVyO1xuICB9KS50b0xpc3QoKTtcbn1dXG5cbmNvbnN0IHNlc3Npb25zVmlldyA9IFtbJ3RscHRfc2Vzc2lvbnMnXSwgKHNlc3Npb25zKSA9PntcbiAgcmV0dXJuIHNlc3Npb25zLnZhbHVlU2VxKCkubWFwKGNyZWF0ZVZpZXcpLnRvSlMoKTtcbn1dO1xuXG5jb25zdCBzZXNzaW9uVmlld0J5SWQgPSAoc2lkKT0+IFtbJ3RscHRfc2Vzc2lvbnMnLCBzaWRdLCAoc2Vzc2lvbik9PntcbiAgaWYoIXNlc3Npb24pe1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVZpZXcoc2Vzc2lvbik7XG59XTtcblxuY29uc3QgcGFydGllc0J5U2Vzc2lvbklkID0gKHNpZCkgPT5cbiBbWyd0bHB0X3Nlc3Npb25zJywgc2lkLCAncGFydGllcyddLCAocGFydGllcykgPT57XG5cbiAgaWYoIXBhcnRpZXMpe1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsYXN0QWN0aXZlVXNyTmFtZSA9IGdldExhc3RBY3RpdmVVc2VyKHBhcnRpZXMpLmdldCgndXNlcicpO1xuXG4gIHJldHVybiBwYXJ0aWVzLm1hcChpdGVtPT57XG4gICAgdmFyIHVzZXIgPSBpdGVtLmdldCgndXNlcicpO1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyOiBpdGVtLmdldCgndXNlcicpLFxuICAgICAgc2VydmVySXA6IGl0ZW0uZ2V0KCdyZW1vdGVfYWRkcicpLFxuICAgICAgc2VydmVySWQ6IGl0ZW0uZ2V0KCdzZXJ2ZXJfaWQnKSxcbiAgICAgIGlzQWN0aXZlOiBsYXN0QWN0aXZlVXNyTmFtZSA9PT0gdXNlclxuICAgIH1cbiAgfSkudG9KUygpO1xufV07XG5cbmZ1bmN0aW9uIGdldExhc3RBY3RpdmVVc2VyKHBhcnRpZXMpe1xuICByZXR1cm4gcGFydGllcy5zb3J0QnkoaXRlbT0+IG5ldyBEYXRlKGl0ZW0uZ2V0KCdsYXN0QWN0aXZlJykpKS5maXJzdCgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaWV3KHNlc3Npb24pe1xuICB2YXIgc2lkID0gc2Vzc2lvbi5nZXQoJ2lkJyk7XG4gIHZhciBzZXJ2ZXJJcCwgc2VydmVySWQ7XG4gIHZhciBwYXJ0aWVzID0gcmVhY3Rvci5ldmFsdWF0ZShwYXJ0aWVzQnlTZXNzaW9uSWQoc2lkKSk7XG5cbiAgaWYocGFydGllcy5sZW5ndGggPiAwKXtcbiAgICBzZXJ2ZXJJcCA9IHBhcnRpZXNbMF0uc2VydmVySXA7XG4gICAgc2VydmVySWQgPSBwYXJ0aWVzWzBdLnNlcnZlcklkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaWQ6IHNpZCxcbiAgICBzZXNzaW9uVXJsOiBjZmcuZ2V0QWN0aXZlU2Vzc2lvblJvdXRlVXJsKHNpZCksXG4gICAgc2VydmVySXAsXG4gICAgc2VydmVySWQsXG4gICAgYWN0aXZlOiBzZXNzaW9uLmdldCgnYWN0aXZlJyksXG4gICAgY3JlYXRlZDogbmV3IERhdGUoc2Vzc2lvbi5nZXQoJ2NyZWF0ZWQnKSksXG4gICAgbGFzdEFjdGl2ZTogbmV3IERhdGUoc2Vzc2lvbi5nZXQoJ2xhc3RfYWN0aXZlJykpLFxuICAgIGxvZ2luOiBzZXNzaW9uLmdldCgnbG9naW4nKSxcbiAgICBwYXJ0aWVzOiBwYXJ0aWVzLFxuICAgIGNvbHM6IHNlc3Npb24uZ2V0SW4oWyd0ZXJtaW5hbF9wYXJhbXMnLCAndyddKSxcbiAgICByb3dzOiBzZXNzaW9uLmdldEluKFsndGVybWluYWxfcGFyYW1zJywgJ2gnXSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHBhcnRpZXNCeVNlc3Npb25JZCxcbiAgc2Vzc2lvbnNCeVNlcnZlcixcbiAgc2Vzc2lvbnNWaWV3LFxuICBzZXNzaW9uVmlld0J5SWQsXG4gIGNyZWF0ZVZpZXdcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL3Nlc3Npb25zL2dldHRlcnMuanNcbiAqKi8iLCJ2YXIgeyBTdG9yZSwgdG9JbW11dGFibGUgfSA9IHJlcXVpcmUoJ251Y2xlYXItanMnKTtcbnZhciB7IFRMUFRfU0VTU0lOU19SRUNFSVZFLCBUTFBUX1NFU1NJTlNfVVBEQVRFIH0gID0gcmVxdWlyZSgnLi9hY3Rpb25UeXBlcycpO1xuXG5leHBvcnQgZGVmYXVsdCBTdG9yZSh7XG4gIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICByZXR1cm4gdG9JbW11dGFibGUoe30pO1xuICB9LFxuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgdGhpcy5vbihUTFBUX1NFU1NJTlNfUkVDRUlWRSwgcmVjZWl2ZVNlc3Npb25zKTtcbiAgICB0aGlzLm9uKFRMUFRfU0VTU0lOU19VUERBVEUsIHVwZGF0ZVNlc3Npb24pO1xuICB9XG59KVxuXG5mdW5jdGlvbiB1cGRhdGVTZXNzaW9uKHN0YXRlLCBqc29uKXtcbiAgcmV0dXJuIHN0YXRlLnNldChqc29uLmlkLCB0b0ltbXV0YWJsZShqc29uKSk7XG59XG5cbmZ1bmN0aW9uIHJlY2VpdmVTZXNzaW9ucyhzdGF0ZSwganNvbkFycmF5PVtdKXtcbiAgcmV0dXJuIHN0YXRlLndpdGhNdXRhdGlvbnMoc3RhdGUgPT4ge1xuICAgIGpzb25BcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBzdGF0ZS5zZXQoaXRlbS5pZCwgdG9JbW11dGFibGUoaXRlbSkpXG4gICAgfSlcbiAgfSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9zZXNzaW9ucy9zZXNzaW9uU3RvcmUuanNcbiAqKi8iLCJpbXBvcnQga2V5TWlycm9yIGZyb20gJ2tleW1pcnJvcidcblxuZXhwb3J0IGRlZmF1bHQga2V5TWlycm9yKHtcbiAgVExQVF9SRUNFSVZFX1VTRVI6IG51bGxcbn0pXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy91c2VyL2FjdGlvblR5cGVzLmpzXG4gKiovIiwidmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHsgVExQVF9SRUNFSVZFX1VTRVIgfSA9IHJlcXVpcmUoJy4vYWN0aW9uVHlwZXMnKTtcbnZhciB7IFRSWUlOR19UT19TSUdOX1VQLCBUUllJTkdfVE9fTE9HSU59ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvcmVzdEFwaS9jb25zdGFudHMnKTtcbnZhciByZXN0QXBpQWN0aW9ucyA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL3Jlc3RBcGkvYWN0aW9ucycpO1xudmFyIGF1dGggPSByZXF1aXJlKCdhcHAvYXV0aCcpO1xudmFyIHNlc3Npb24gPSByZXF1aXJlKCdhcHAvc2Vzc2lvbicpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuXG4gIGVuc3VyZVVzZXIobmV4dFN0YXRlLCByZXBsYWNlLCBjYil7XG4gICAgYXV0aC5lbnN1cmVVc2VyKClcbiAgICAgIC5kb25lKCh1c2VyRGF0YSk9PiB7XG4gICAgICAgIHJlYWN0b3IuZGlzcGF0Y2goVExQVF9SRUNFSVZFX1VTRVIsIHVzZXJEYXRhLnVzZXIgKTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH0pXG4gICAgICAuZmFpbCgoKT0+e1xuICAgICAgICByZXBsYWNlKHtyZWRpcmVjdFRvOiBuZXh0U3RhdGUubG9jYXRpb24ucGF0aG5hbWUgfSwgY2ZnLnJvdXRlcy5sb2dpbik7XG4gICAgICAgIGNiKCk7XG4gICAgICB9KTtcbiAgfSxcblxuICBzaWduVXAoe25hbWUsIHBzdywgdG9rZW4sIGludml0ZVRva2VufSl7XG4gICAgcmVzdEFwaUFjdGlvbnMuc3RhcnQoVFJZSU5HX1RPX1NJR05fVVApO1xuICAgIGF1dGguc2lnblVwKG5hbWUsIHBzdywgdG9rZW4sIGludml0ZVRva2VuKVxuICAgICAgLmRvbmUoKHNlc3Npb25EYXRhKT0+e1xuICAgICAgICByZWFjdG9yLmRpc3BhdGNoKFRMUFRfUkVDRUlWRV9VU0VSLCBzZXNzaW9uRGF0YS51c2VyKTtcbiAgICAgICAgcmVzdEFwaUFjdGlvbnMuc3VjY2VzcyhUUllJTkdfVE9fU0lHTl9VUCk7XG4gICAgICAgIHNlc3Npb24uZ2V0SGlzdG9yeSgpLnB1c2goe3BhdGhuYW1lOiBjZmcucm91dGVzLmFwcH0pO1xuICAgICAgfSlcbiAgICAgIC5mYWlsKChlcnIpPT57XG4gICAgICAgIHJlc3RBcGlBY3Rpb25zLmZhaWwoVFJZSU5HX1RPX1NJR05fVVAsIGVyci5yZXNwb25zZUpTT04ubWVzc2FnZSB8fCAnZmFpbGVkIHRvIHNpbmcgdXAnKTtcbiAgICAgIH0pO1xuICB9LFxuXG4gIGxvZ2luKHt1c2VyLCBwYXNzd29yZCwgdG9rZW59LCByZWRpcmVjdCl7XG4gICAgcmVzdEFwaUFjdGlvbnMuc3RhcnQoVFJZSU5HX1RPX0xPR0lOKTtcbiAgICBhdXRoLmxvZ2luKHVzZXIsIHBhc3N3b3JkLCB0b2tlbilcbiAgICAgIC5kb25lKChzZXNzaW9uRGF0YSk9PntcbiAgICAgICAgcmVzdEFwaUFjdGlvbnMuc3VjY2VzcyhUUllJTkdfVE9fTE9HSU4pO1xuICAgICAgICByZWFjdG9yLmRpc3BhdGNoKFRMUFRfUkVDRUlWRV9VU0VSLCBzZXNzaW9uRGF0YS51c2VyKTtcbiAgICAgICAgc2Vzc2lvbi5nZXRIaXN0b3J5KCkucHVzaCh7cGF0aG5hbWU6IHJlZGlyZWN0fSk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoKGVycik9PiByZXN0QXBpQWN0aW9ucy5mYWlsKFRSWUlOR19UT19MT0dJTiwgZXJyLnJlc3BvbnNlSlNPTi5tZXNzYWdlKSlcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy91c2VyL2FjdGlvbnMuanNcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cy5nZXR0ZXJzID0gcmVxdWlyZSgnLi9nZXR0ZXJzJyk7XG5tb2R1bGUuZXhwb3J0cy5hY3Rpb25zID0gcmVxdWlyZSgnLi9hY3Rpb25zJyk7XG5tb2R1bGUuZXhwb3J0cy5ub2RlU3RvcmUgPSByZXF1aXJlKCcuL3VzZXJTdG9yZScpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvdXNlci9pbmRleC5qc1xuICoqLyIsInZhciB7IFN0b3JlLCB0b0ltbXV0YWJsZSB9ID0gcmVxdWlyZSgnbnVjbGVhci1qcycpO1xudmFyICB7IFRMUFRfUkVDRUlWRV9VU0VSIH0gPSByZXF1aXJlKCcuL2FjdGlvblR5cGVzJyk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0b3JlKHtcbiAgZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIHJldHVybiB0b0ltbXV0YWJsZShudWxsKTtcbiAgfSxcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMub24oVExQVF9SRUNFSVZFX1VTRVIsIHJlY2VpdmVVc2VyKVxuICB9XG5cbn0pXG5cbmZ1bmN0aW9uIHJlY2VpdmVVc2VyKHN0YXRlLCB1c2VyKXtcbiAgcmV0dXJuIHRvSW1tdXRhYmxlKHVzZXIpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvdXNlci91c2VyU3RvcmUuanNcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIHthY3Rpb25zfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsLycpO1xudmFyIGNvbG9ycyA9IFsnIzFhYjM5NCcsICcjMWM4NGM2JywgJyMyM2M2YzgnLCAnI2Y4YWM1OScsICcjRUQ1NTY1JywgJyNjMmMyYzInXTtcblxuY29uc3QgVXNlckljb24gPSAoe25hbWUsIGNvbG9ySW5kZXg9MH0pPT57XG4gIGxldCBjb2xvciA9IGNvbG9yc1tjb2xvckluZGV4ICUgY29sb3JzLmxlbmd0aF07XG4gIGxldCBzdHlsZSA9IHtcbiAgICAnYmFja2dyb3VuZENvbG9yJzogY29sb3IsXG4gICAgJ2JvcmRlckNvbG9yJzogY29sb3JcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxsaSB0aXRsZT17bmFtZX0+XG4gICAgICA8c3BhbiBzdHlsZT17c3R5bGV9IGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeSBidG4tY2lyY2xlIHRleHQtdXBwZXJjYXNlXCI+XG4gICAgICAgIDxzdHJvbmc+e25hbWVbMF19PC9zdHJvbmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9saT5cbiAgKVxufTtcblxuY29uc3QgU2Vzc2lvbkxlZnRQYW5lbCA9ICh7cGFydGllc30pID0+IHtcbiAgcGFydGllcyA9IHBhcnRpZXMgfHwgW107XG4gIGxldCB1c2VySWNvbnMgPSBwYXJ0aWVzLm1hcCgoaXRlbSwgaW5kZXgpPT4oXG4gICAgPFVzZXJJY29uIGtleT17aW5kZXh9IGNvbG9ySW5kZXg9e2luZGV4fSBuYW1lPXtpdGVtLnVzZXJ9Lz5cbiAgKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi10ZXJtaW5hbC1wYXJ0aWNpcGFuc1wiPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cIm5hdlwiPlxuICAgICAgICB7dXNlckljb25zfVxuICAgICAgICA8bGk+XG4gICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXthY3Rpb25zLmNsb3NlfSBjbGFzc05hbWU9XCJidG4gYnRuLWRhbmdlciBidG4tY2lyY2xlXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICApXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlc3Npb25MZWZ0UGFuZWw7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tcG9uZW50cy9jdXJyZW50U2Vzc2lvbi9zZXNzaW9uTGVmdFBhbmVsLmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBOb3RGb3VuZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1lcnJvci1wYWdlXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWxvZ28tdHBydFwiPlRlbGVwb3J0PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LXdhcm5pbmdcIj48aSBjbGFzc05hbWU9XCJmYSBmYS13YXJuaW5nXCI+PC9pPiA8L2Rpdj5cbiAgICAgICAgPGgxPldob29wcywgd2UgY2Fubm90IGZpbmQgdGhhdDwvaDE+XG4gICAgICAgIDxkaXY+TG9va3MgbGlrZSB0aGUgcGFnZSB5b3UgYXJlIGxvb2tpbmcgZm9yIGlzbid0IGhlcmUgYW55IGxvbmdlcjwvZGl2PlxuICAgICAgICA8ZGl2PklmIHlvdSBiZWxpZXZlIHRoaXMgaXMgYW4gZXJyb3IsIHBsZWFzZSBjb250YWN0IHlvdXIgb3JnYW5pemF0aW9uIGFkbWluaXN0cmF0b3IuPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFjdC1zZWN0aW9uXCI+SWYgeW91IGJlbGlldmUgdGhpcyBpcyBhbiBpc3N1ZSB3aXRoIFRlbGVwb3J0LCBwbGVhc2UgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9ncmF2aXRhdGlvbmFsL3RlbGVwb3J0L2lzc3Vlcy9uZXdcIj5jcmVhdGUgYSBHaXRIdWIgaXNzdWUuPC9hPlxuICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59KVxuXG52YXIgRXhwaXJlZEludml0ZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1lcnJvci1wYWdlXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWxvZ28tdHBydFwiPlRlbGVwb3J0PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LXdhcm5pbmdcIj48aSBjbGFzc05hbWU9XCJmYSBmYS13YXJuaW5nXCI+PC9pPiA8L2Rpdj5cbiAgICAgICAgPGgxPkludml0ZSBjb2RlIGhhcyBleHBpcmVkPC9oMT5cbiAgICAgICAgPGRpdj5Mb29rcyBsaWtlIHlvdXIgaW52aXRlIGNvZGUgaXNuJ3QgdmFsaWQgYW55bW9yZTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhY3Qtc2VjdGlvblwiPklmIHlvdSBiZWxpZXZlIHRoaXMgaXMgYW4gaXNzdWUgd2l0aCBUZWxlcG9ydCwgcGxlYXNlIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vZ3Jhdml0YXRpb25hbC90ZWxlcG9ydC9pc3N1ZXMvbmV3XCI+Y3JlYXRlIGEgR2l0SHViIGlzc3VlLjwvYT5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgTm90Rm91bmQ7XG5leHBvcnQge05vdEZvdW5kLCBFeHBpcmVkSW52aXRlfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvZXJyb3JQYWdlLmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBHb29nbGVBdXRoSW5mbyA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1nb29nbGUtYXV0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1nb29nbGUtYXV0aC1pY29uXCI+PC9kaXY+XG4gICAgICAgIDxzdHJvbmc+R29vZ2xlIEF1dGhlbnRpY2F0b3I8L3N0cm9uZz5cbiAgICAgICAgPGRpdj5Eb3dubG9hZCA8YSBocmVmPVwiaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vYWNjb3VudHMvYW5zd2VyLzEwNjY0NDc/aGw9ZW5cIj5Hb29nbGUgQXV0aGVudGljYXRvcjwvYT4gb24geW91ciBwaG9uZSB0byBhY2Nlc3MgeW91ciB0d28gZmFjdG9yeSB0b2tlbjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSBHb29nbGVBdXRoSW5mbztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21wb25lbnRzL2dvb2dsZUF1dGhMb2dvLmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIge1RhYmxlLCBDb2x1bW4sIENlbGwsIFNvcnRIZWFkZXJDZWxsLCBTb3J0VHlwZXN9ID0gcmVxdWlyZSgnYXBwL2NvbXBvbmVudHMvdGFibGUuanN4Jyk7XG52YXIge2NyZWF0ZU5ld1Nlc3Npb259ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvYWN0aXZlVGVybWluYWwvYWN0aW9ucycpO1xudmFyIExpbmtlZFN0YXRlTWl4aW4gPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtbGlua2VkLXN0YXRlLW1peGluJyk7XG52YXIgXyA9IHJlcXVpcmUoJ18nKTtcbnZhciB7aXNNYXRjaH0gPSByZXF1aXJlKCdhcHAvY29tbW9uL29iamVjdFV0aWxzJyk7XG5cbmNvbnN0IFRleHRDZWxsID0gKHtyb3dJbmRleCwgZGF0YSwgY29sdW1uS2V5LCAuLi5wcm9wc30pID0+IChcbiAgPENlbGwgey4uLnByb3BzfT5cbiAgICB7ZGF0YVtyb3dJbmRleF1bY29sdW1uS2V5XX1cbiAgPC9DZWxsPlxuKTtcblxuY29uc3QgVGFnQ2VsbCA9ICh7cm93SW5kZXgsIGRhdGEsIC4uLnByb3BzfSkgPT4gKFxuICA8Q2VsbCB7Li4ucHJvcHN9PlxuICAgIHsgZGF0YVtyb3dJbmRleF0udGFncy5tYXAoKGl0ZW0sIGluZGV4KSA9PlxuICAgICAgKDxzcGFuIGtleT17aW5kZXh9IGNsYXNzTmFtZT1cImxhYmVsIGxhYmVsLWRlZmF1bHRcIj5cbiAgICAgICAge2l0ZW0ucm9sZX0gPGxpIGNsYXNzTmFtZT1cImZhIGZhLWxvbmctYXJyb3ctcmlnaHRcIj48L2xpPlxuICAgICAgICB7aXRlbS52YWx1ZX1cbiAgICAgIDwvc3Bhbj4pXG4gICAgKSB9XG4gIDwvQ2VsbD5cbik7XG5cbmNvbnN0IExvZ2luQ2VsbCA9ICh7bG9naW5zLCBvbkxvZ2luQ2xpY2ssIHJvd0luZGV4LCBkYXRhLCAuLi5wcm9wc30pID0+IHtcbiAgaWYoIWxvZ2lucyB8fGxvZ2lucy5sZW5ndGggPT09IDApe1xuICAgIHJldHVybiA8Q2VsbCB7Li4ucHJvcHN9IC8+O1xuICB9XG5cbiAgdmFyIHNlcnZlcklkID0gZGF0YVtyb3dJbmRleF0uaWQ7XG4gIHZhciAkbGlzID0gW107XG5cbiAgZnVuY3Rpb24gb25DbGljayhpKXtcbiAgICB2YXIgbG9naW4gPSBsb2dpbnNbaV07XG4gICAgaWYob25Mb2dpbkNsaWNrKXtcbiAgICAgIHJldHVybiAoKT0+IG9uTG9naW5DbGljayhzZXJ2ZXJJZCwgbG9naW4pO1xuICAgIH1lbHNle1xuICAgICAgcmV0dXJuICgpID0+IGNyZWF0ZU5ld1Nlc3Npb24oc2VydmVySWQsIGxvZ2luKTtcbiAgICB9XG4gIH1cblxuICBmb3IodmFyIGkgPSAwOyBpIDwgbG9naW5zLmxlbmd0aDsgaSsrKXtcbiAgICAkbGlzLnB1c2goPGxpIGtleT17aX0+PGEgb25DbGljaz17b25DbGljayhpKX0+e2xvZ2luc1tpXX08L2E+PC9saT4pO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q2VsbCB7Li4ucHJvcHN9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17b25DbGljaygwKX0gY2xhc3NOYW1lPVwiYnRuIGJ0bi14cyBidG4tcHJpbWFyeVwiPntsb2dpbnNbMF19PC9idXR0b24+XG4gICAgICAgIHtcbiAgICAgICAgICAkbGlzLmxlbmd0aCA+IDEgPyAoXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGtleT17MH0gZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4teHMgZHJvcGRvd24tdG9nZ2xlXCIgYXJpYS1leHBhbmRlZD1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNhcmV0XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPixcbiAgICAgICAgICAgICAgICA8dWwga2V5PXsxfSBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICB7JGxpc31cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICBdIClcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L0NlbGw+XG4gIClcbn07XG5cbnZhciBOb2RlTGlzdCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBtaXhpbnM6IFtMaW5rZWRTdGF0ZU1peGluXSxcblxuICBnZXRJbml0aWFsU3RhdGUoLypwcm9wcyovKXtcbiAgICB0aGlzLnNlYXJjaGFibGVQcm9wcyA9IFsnYWRkcicsICdob3N0bmFtZScsICd0YWdzJ107XG4gICAgcmV0dXJuIHsgZmlsdGVyOiAnJywgY29sU29ydERpcnM6IHtob3N0bmFtZTogU29ydFR5cGVzLkRFU0N9IH07XG4gIH0sXG5cbiAgb25Tb3J0Q2hhbmdlKGNvbHVtbktleSwgc29ydERpcikge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgIGNvbFNvcnREaXJzOiB7XG4gICAgICAgIFtjb2x1bW5LZXldOiBzb3J0RGlyXG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgc2VhcmNoQW5kRmlsdGVyQ2IodGFyZ2V0VmFsdWUsIHNlYXJjaFZhbHVlLCBwcm9wTmFtZSl7XG4gICAgaWYocHJvcE5hbWUgPT09ICd0YWdzJyl7XG4gICAgICByZXR1cm4gdGFyZ2V0VmFsdWUuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICBsZXQge3JvbGUsIHZhbHVlfSA9IGl0ZW07XG4gICAgICAgIHJldHVybiByb2xlLnRvTG9jYWxlVXBwZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWx1ZSkgIT09LTEgfHxcbiAgICAgICAgICB2YWx1ZS50b0xvY2FsZVVwcGVyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVmFsdWUpICE9PS0xO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNvcnRBbmRGaWx0ZXIoZGF0YSl7XG4gICAgdmFyIGZpbHRlcmVkID0gZGF0YS5maWx0ZXIob2JqPT4gaXNNYXRjaChvYmosIHRoaXMuc3RhdGUuZmlsdGVyLCB7XG4gICAgICAgIHNlYXJjaGFibGVQcm9wczogdGhpcy5zZWFyY2hhYmxlUHJvcHMsXG4gICAgICAgIGNiOiB0aGlzLnNlYXJjaEFuZEZpbHRlckNiXG4gICAgICB9KSk7XG5cbiAgICB2YXIgY29sdW1uS2V5ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5zdGF0ZS5jb2xTb3J0RGlycylbMF07XG4gICAgdmFyIHNvcnREaXIgPSB0aGlzLnN0YXRlLmNvbFNvcnREaXJzW2NvbHVtbktleV07XG4gICAgdmFyIHNvcnRlZCA9IF8uc29ydEJ5KGZpbHRlcmVkLCBjb2x1bW5LZXkpO1xuICAgIGlmKHNvcnREaXIgPT09IFNvcnRUeXBlcy5BU0Mpe1xuICAgICAgc29ydGVkID0gc29ydGVkLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydGVkO1xuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnNvcnRBbmRGaWx0ZXIodGhpcy5wcm9wcy5ub2RlUmVjb3Jkcyk7XG4gICAgdmFyIGxvZ2lucyA9IHRoaXMucHJvcHMubG9naW5zO1xuICAgIHZhciBvbkxvZ2luQ2xpY2sgPSB0aGlzLnByb3BzLm9uTG9naW5DbGljaztcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1ub2RlcyBncnYtcGFnZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1mbGV4IGdydi1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1mbGV4LWNvbHVtblwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICA8aDE+IE5vZGVzIDwvaDE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LXNlYXJjaFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdmFsdWVMaW5rPXt0aGlzLmxpbmtTdGF0ZSgnZmlsdGVyJyl9IHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sIGlucHV0LXNtXCIvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIlwiPlxuICAgICAgICAgIDxUYWJsZSByb3dDb3VudD17ZGF0YS5sZW5ndGh9IGNsYXNzTmFtZT1cInRhYmxlLXN0cmlwZWQgZ3J2LW5vZGVzLXRhYmxlXCI+XG4gICAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICAgIGNvbHVtbktleT1cImhvc3RuYW1lXCJcbiAgICAgICAgICAgICAgaGVhZGVyPXtcbiAgICAgICAgICAgICAgICA8U29ydEhlYWRlckNlbGxcbiAgICAgICAgICAgICAgICAgIHNvcnREaXI9e3RoaXMuc3RhdGUuY29sU29ydERpcnMuaG9zdG5hbWV9XG4gICAgICAgICAgICAgICAgICBvblNvcnRDaGFuZ2U9e3RoaXMub25Tb3J0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJOb2RlXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNlbGw9ezxUZXh0Q2VsbCBkYXRhPXtkYXRhfS8+IH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICAgIGNvbHVtbktleT1cImFkZHJcIlxuICAgICAgICAgICAgICBoZWFkZXI9e1xuICAgICAgICAgICAgICAgIDxTb3J0SGVhZGVyQ2VsbFxuICAgICAgICAgICAgICAgICAgc29ydERpcj17dGhpcy5zdGF0ZS5jb2xTb3J0RGlycy5hZGRyfVxuICAgICAgICAgICAgICAgICAgb25Tb3J0Q2hhbmdlPXt0aGlzLm9uU29ydENoYW5nZX1cbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiSVBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjZWxsPXs8VGV4dENlbGwgZGF0YT17ZGF0YX0vPiB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPENvbHVtblxuICAgICAgICAgICAgICBjb2x1bW5LZXk9XCJ0YWdzXCJcbiAgICAgICAgICAgICAgaGVhZGVyPXs8Q2VsbD48L0NlbGw+IH1cbiAgICAgICAgICAgICAgY2VsbD17PFRhZ0NlbGwgZGF0YT17ZGF0YX0vPiB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPENvbHVtblxuICAgICAgICAgICAgICBjb2x1bW5LZXk9XCJyb2xlc1wiXG4gICAgICAgICAgICAgIG9uTG9naW5DbGljaz17b25Mb2dpbkNsaWNrfVxuICAgICAgICAgICAgICBoZWFkZXI9ezxDZWxsPkxvZ2luIGFzPC9DZWxsPiB9XG4gICAgICAgICAgICAgIGNlbGw9ezxMb2dpbkNlbGwgZGF0YT17ZGF0YX0gbG9naW5zPXtsb2dpbnN9Lz4gfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTm9kZUxpc3Q7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tcG9uZW50cy9ub2Rlcy9ub2RlTGlzdC5qc3hcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHtnZXR0ZXJzfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL2RpYWxvZ3MnKTtcbnZhciB7Y2xvc2VTZWxlY3ROb2RlRGlhbG9nfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL2RpYWxvZ3MvYWN0aW9ucycpO1xudmFyIE5vZGVMaXN0ID0gcmVxdWlyZSgnLi9ub2Rlcy9ub2RlTGlzdC5qc3gnKTtcbnZhciBhY3RpdmVTZXNzaW9uR2V0dGVycyA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsL2dldHRlcnMnKTtcbnZhciBub2RlR2V0dGVycyA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL25vZGVzL2dldHRlcnMnKTtcbnZhciAkID0gcmVxdWlyZSgnalF1ZXJ5Jyk7XG5cbnZhciBTZWxlY3ROb2RlRGlhbG9nID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG4gIG1peGluczogW3JlYWN0b3IuUmVhY3RNaXhpbl0sXG5cbiAgZ2V0RGF0YUJpbmRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaWFsb2dzOiBnZXR0ZXJzLmRpYWxvZ3NcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmRpYWxvZ3MuaXNTZWxlY3ROb2RlRGlhbG9nT3BlbiA/IDxEaWFsb2cvPiA6IG51bGw7XG4gIH1cbn0pO1xuXG52YXIgRGlhbG9nID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG4gIG9uTG9naW5DbGljayhzZXJ2ZXJJZCl7XG4gICAgaWYoU2VsZWN0Tm9kZURpYWxvZy5vblNlcnZlckNoYW5nZUNhbGxCYWNrKXtcbiAgICAgIFNlbGVjdE5vZGVEaWFsb2cub25TZXJ2ZXJDaGFuZ2VDYWxsQmFjayh7c2VydmVySWR9KTtcbiAgICB9XG5cbiAgICBjbG9zZVNlbGVjdE5vZGVEaWFsb2coKTtcbiAgfSxcblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xuICAgICQoJy5tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gIH0sXG5cbiAgY29tcG9uZW50RGlkTW91bnQoKXtcbiAgICAkKCcubW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICB9LFxuXG4gIHJlbmRlcigpIHtcbiAgICB2YXIgYWN0aXZlU2Vzc2lvbiA9IHJlYWN0b3IuZXZhbHVhdGUoYWN0aXZlU2Vzc2lvbkdldHRlcnMuYWN0aXZlU2Vzc2lvbikgfHwge307XG4gICAgdmFyIG5vZGVSZWNvcmRzID0gcmVhY3Rvci5ldmFsdWF0ZShub2RlR2V0dGVycy5ub2RlTGlzdFZpZXcpO1xuICAgIHZhciBsb2dpbnMgPSBbYWN0aXZlU2Vzc2lvbi5sb2dpbl07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbCBmYWRlIGdydi1kaWFsb2ctc2VsZWN0LW5vZGVcIiB0YWJJbmRleD17LTF9IHJvbGU9XCJkaWFsb2dcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1kaWFsb2dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICA8Tm9kZUxpc3Qgbm9kZVJlY29yZHM9e25vZGVSZWNvcmRzfSBsb2dpbnM9e2xvZ2luc30gb25Mb2dpbkNsaWNrPXt0aGlzLm9uTG9naW5DbGlja30vPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2Nsb3NlU2VsZWN0Tm9kZURpYWxvZ30gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIENsb3NlXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufSk7XG5cblNlbGVjdE5vZGVEaWFsb2cub25TZXJ2ZXJDaGFuZ2VDYWxsQmFjayA9ICgpPT57fTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3ROb2RlRGlhbG9nO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvc2VsZWN0Tm9kZURpYWxvZy5qc3hcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHsgTGluayB9ID0gcmVxdWlyZSgncmVhY3Qtcm91dGVyJyk7XG52YXIge25vZGVIb3N0TmFtZUJ5U2VydmVySWR9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvbm9kZXMvZ2V0dGVycycpO1xudmFyIHtDZWxsfSA9IHJlcXVpcmUoJ2FwcC9jb21wb25lbnRzL3RhYmxlLmpzeCcpO1xudmFyIG1vbWVudCA9ICByZXF1aXJlKCdtb21lbnQnKTtcblxuY29uc3QgRGF0ZUNyZWF0ZWRDZWxsID0gKHsgcm93SW5kZXgsIGRhdGEsIC4uLnByb3BzIH0pID0+IHtcbiAgbGV0IGNyZWF0ZWQgPSBkYXRhW3Jvd0luZGV4XS5jcmVhdGVkO1xuICBsZXQgZGlzcGxheURhdGUgPSBtb21lbnQoY3JlYXRlZCkuZm9ybWF0KCdsIExUUycpO1xuICByZXR1cm4gKFxuICAgIDxDZWxsIHsuLi5wcm9wc30+XG4gICAgICB7IGRpc3BsYXlEYXRlIH1cbiAgICA8L0NlbGw+XG4gIClcbn07XG5cbmNvbnN0IER1cmF0aW9uQ2VsbCA9ICh7IHJvd0luZGV4LCBkYXRhLCAuLi5wcm9wcyB9KSA9PiB7XG4gIGxldCBjcmVhdGVkID0gZGF0YVtyb3dJbmRleF0uY3JlYXRlZDtcbiAgbGV0IGxhc3RBY3RpdmUgPSBkYXRhW3Jvd0luZGV4XS5sYXN0QWN0aXZlO1xuXG4gIGxldCBlbmQgPSBtb21lbnQoY3JlYXRlZCk7XG4gIGxldCBub3cgPSBtb21lbnQobGFzdEFjdGl2ZSk7XG4gIGxldCBkdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbihub3cuZGlmZihlbmQpKTtcbiAgbGV0IGRpc3BsYXlEYXRlID0gZHVyYXRpb24uaHVtYW5pemUoKTtcblxuICByZXR1cm4gKFxuICAgIDxDZWxsIHsuLi5wcm9wc30+XG4gICAgICB7IGRpc3BsYXlEYXRlIH1cbiAgICA8L0NlbGw+XG4gIClcbn07XG5cbmNvbnN0IFNpbmdsZVVzZXJDZWxsID0gKHsgcm93SW5kZXgsIGRhdGEsIC4uLnByb3BzIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8Q2VsbCB7Li4ucHJvcHN9PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZ3J2LXNlc3Npb25zLXVzZXIgbGFiZWwgbGFiZWwtZGVmYXVsdFwiPntkYXRhW3Jvd0luZGV4XS5sb2dpbn08L3NwYW4+XG4gICAgPC9DZWxsPlxuICApXG59O1xuXG5jb25zdCBVc2Vyc0NlbGwgPSAoeyByb3dJbmRleCwgZGF0YSwgLi4ucHJvcHMgfSkgPT4ge1xuICBsZXQgJHVzZXJzID0gZGF0YVtyb3dJbmRleF0ucGFydGllcy5tYXAoKGl0ZW0sIGl0ZW1JbmRleCk9PlxuICAgICg8c3BhbiBrZXk9e2l0ZW1JbmRleH0gY2xhc3NOYW1lPVwiZ3J2LXNlc3Npb25zLXVzZXIgbGFiZWwgbGFiZWwtZGVmYXVsdFwiPntpdGVtLnVzZXJ9PC9zcGFuPilcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPENlbGwgey4uLnByb3BzfT5cbiAgICAgIDxkaXY+XG4gICAgICAgIHskdXNlcnN9XG4gICAgICA8L2Rpdj5cbiAgICA8L0NlbGw+XG4gIClcbn07XG5cbmNvbnN0IEJ1dHRvbkNlbGwgPSAoeyByb3dJbmRleCwgZGF0YSwgLi4ucHJvcHMgfSkgPT4ge1xuICBsZXQgeyBzZXNzaW9uVXJsLCBhY3RpdmUgfSA9IGRhdGFbcm93SW5kZXhdO1xuICBsZXQgW2FjdGlvblRleHQsIGFjdGlvbkNsYXNzXSA9IGFjdGl2ZSA/IFsnam9pbicsICdidG4td2FybmluZyddIDogWydwbGF5JywgJ2J0bi1wcmltYXJ5J107XG4gIHJldHVybiAoXG4gICAgPENlbGwgey4uLnByb3BzfT5cbiAgICAgIDxMaW5rIHRvPXtzZXNzaW9uVXJsfSBjbGFzc05hbWU9e1wiYnRuIFwiICthY3Rpb25DbGFzcysgXCIgYnRuLXhzXCJ9IHR5cGU9XCJidXR0b25cIj57YWN0aW9uVGV4dH08L0xpbms+XG4gICAgPC9DZWxsPlxuICApXG59XG5cbmNvbnN0IEVtcHR5TGlzdCA9ICh7dGV4dH0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9XCJncnYtc2Vzc2lvbnMtZW1wdHkgdGV4dC1jZW50ZXIgdGV4dC1tdXRlZFwiPjxzcGFuPnt0ZXh0fTwvc3Bhbj48L2Rpdj5cbilcblxuY29uc3QgTm9kZUNlbGwgPSAoeyByb3dJbmRleCwgZGF0YSwgLi4ucHJvcHMgfSkgPT4ge1xuICBsZXQge3NlcnZlcklkfSA9IGRhdGFbcm93SW5kZXhdO1xuICBsZXQgaG9zdG5hbWUgPSByZWFjdG9yLmV2YWx1YXRlKG5vZGVIb3N0TmFtZUJ5U2VydmVySWQoc2VydmVySWQpKSB8fCAndW5rbm93bic7XG5cbiAgcmV0dXJuIChcbiAgICA8Q2VsbCB7Li4ucHJvcHN9PlxuICAgICAge2hvc3RuYW1lfVxuICAgIDwvQ2VsbD5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBCdXR0b25DZWxsO1xuXG5leHBvcnQge1xuICBCdXR0b25DZWxsLFxuICBVc2Vyc0NlbGwsXG4gIER1cmF0aW9uQ2VsbCxcbiAgRGF0ZUNyZWF0ZWRDZWxsLFxuICBFbXB0eUxpc3QsXG4gIFNpbmdsZVVzZXJDZWxsLFxuICBOb2RlQ2VsbFxufTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21wb25lbnRzL3Nlc3Npb25zL2xpc3RJdGVtcy5qc3hcbiAqKi8iLCJ2YXIgVGVybSA9IHJlcXVpcmUoJ1Rlcm1pbmFsJyk7XG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyICQgPSByZXF1aXJlKCdqUXVlcnknKTtcbnZhciB7ZGVib3VuY2UsIGlzTnVtYmVyfSA9IHJlcXVpcmUoJ18nKTtcblxuVGVybS5jb2xvcnNbMjU2XSA9ICcjMjUyMzIzJztcblxuY29uc3QgRElTQ09OTkVDVF9UWFQgPSAnXFx4MWJbMzFtZGlzY29ubmVjdGVkXFx4MWJbbVxcclxcbic7XG5jb25zdCBDT05ORUNURURfVFhUID0gJ0Nvbm5lY3RlZCFcXHJcXG4nO1xuXG52YXIgVHR5VGVybWluYWwgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cbiAgZ2V0SW5pdGlhbFN0YXRlKCl7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5wcm9wcy5yb3dzO1xuICAgIHRoaXMuY29scyA9IHRoaXMucHJvcHMuY29scztcbiAgICB0aGlzLnR0eSA9IHRoaXMucHJvcHMudHR5O1xuXG4gICAgdGhpcy5kZWJvdW5jZWRSZXNpemUgPSBkZWJvdW5jZSgoKT0+e1xuICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICAgIHRoaXMudHR5LnJlc2l6ZSh0aGlzLmNvbHMsIHRoaXMucm93cyk7XG4gICAgfSwgMjAwKTtcblxuICAgIHJldHVybiB7fTtcbiAgfSxcblxuICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXJtID0gbmV3IFRlcm0oe1xuICAgICAgY29sczogNSxcbiAgICAgIHJvd3M6IDUsXG4gICAgICB1c2VTdHlsZTogdHJ1ZSxcbiAgICAgIHNjcmVlbktleXM6IHRydWUsXG4gICAgICBjdXJzb3JCbGluazogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy50ZXJtLm9wZW4odGhpcy5yZWZzLmNvbnRhaW5lcik7XG4gICAgdGhpcy50ZXJtLm9uKCdkYXRhJywgKGRhdGEpID0+IHRoaXMudHR5LnNlbmQoZGF0YSkpO1xuXG4gICAgdGhpcy5yZXNpemUodGhpcy5jb2xzLCB0aGlzLnJvd3MpO1xuXG4gICAgdGhpcy50dHkub24oJ29wZW4nLCAoKT0+IHRoaXMudGVybS53cml0ZShDT05ORUNURURfVFhUKSk7XG4gICAgdGhpcy50dHkub24oJ2Nsb3NlJywgKCk9PiB0aGlzLnRlcm0ud3JpdGUoRElTQ09OTkVDVF9UWFQpKTtcbiAgICB0aGlzLnR0eS5vbignZGF0YScsIChkYXRhKSA9PiB0aGlzLnRlcm0ud3JpdGUoZGF0YSkpO1xuICAgIHRoaXMudHR5Lm9uKCdyZXNldCcsICgpPT4gdGhpcy50ZXJtLnJlc2V0KCkpO1xuXG4gICAgdGhpcy50dHkuY29ubmVjdCh7Y29sczogdGhpcy5jb2xzLCByb3dzOiB0aGlzLnJvd3N9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5kZWJvdW5jZWRSZXNpemUpO1xuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRlcm0uZGVzdHJveSgpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmRlYm91bmNlZFJlc2l6ZSk7XG4gIH0sXG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlOiBmdW5jdGlvbihuZXdQcm9wcykge1xuICAgIHZhciB7cm93cywgY29sc30gPSBuZXdQcm9wcztcblxuICAgIGlmKCAhaXNOdW1iZXIocm93cykgfHwgIWlzTnVtYmVyKGNvbHMpKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZihyb3dzICE9PSB0aGlzLnJvd3MgfHwgY29scyAhPT0gdGhpcy5jb2xzKXtcbiAgICAgIHRoaXMucmVzaXplKGNvbHMsIHJvd3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKCA8ZGl2IGNsYXNzTmFtZT1cImdydi10ZXJtaW5hbFwiIGlkPVwidGVybWluYWwtYm94XCIgcmVmPVwiY29udGFpbmVyXCI+ICA8L2Rpdj4gKTtcbiAgfSxcblxuICByZXNpemU6IGZ1bmN0aW9uKGNvbHMsIHJvd3MpIHtcbiAgICAvLyBpZiBub3QgZGVmaW5lZCwgdXNlIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXJcbiAgICBpZighaXNOdW1iZXIoY29scykgfHwgIWlzTnVtYmVyKHJvd3MpKXtcbiAgICAgIGxldCBkaW0gPSB0aGlzLl9nZXREaW1lbnNpb25zKCk7XG4gICAgICBjb2xzID0gZGltLmNvbHM7XG4gICAgICByb3dzID0gZGltLnJvd3M7XG4gICAgfVxuXG4gICAgdGhpcy5jb2xzID0gY29scztcbiAgICB0aGlzLnJvd3MgPSByb3dzO1xuXG4gICAgdGhpcy50ZXJtLnJlc2l6ZSh0aGlzLmNvbHMsIHRoaXMucm93cyk7XG4gIH0sXG5cbiAgX2dldERpbWVuc2lvbnMoKXtcbiAgICBsZXQgJGNvbnRhaW5lciA9ICQodGhpcy5yZWZzLmNvbnRhaW5lcik7XG4gICAgbGV0IGZha2VSb3cgPSAkKCc8ZGl2PjxzcGFuPiZuYnNwOzwvc3Bhbj48L2Rpdj4nKTtcblxuICAgICRjb250YWluZXIuZmluZCgnLnRlcm1pbmFsJykuYXBwZW5kKGZha2VSb3cpO1xuICAgIC8vIGdldCBkaXYgaGVpZ2h0XG4gICAgbGV0IGZha2VDb2xIZWlnaHQgPSBmYWtlUm93WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAvLyBnZXQgc3BhbiB3aWR0aFxuICAgIGxldCBmYWtlQ29sV2lkdGggPSBmYWtlUm93LmNoaWxkcmVuKCkuZmlyc3QoKVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgIGxldCB3aWR0aCA9ICRjb250YWluZXJbMF0uY2xpZW50V2lkdGg7XG4gICAgbGV0IGhlaWdodCA9ICRjb250YWluZXJbMF0uY2xpZW50SGVpZ2h0O1xuXG4gICAgbGV0IGNvbHMgPSBNYXRoLmZsb29yKHdpZHRoIC8gKGZha2VDb2xXaWR0aCkpO1xuICAgIGxldCByb3dzID0gTWF0aC5mbG9vcihoZWlnaHQgLyAoZmFrZUNvbEhlaWdodCkpO1xuICAgIGZha2VSb3cucmVtb3ZlKCk7XG5cbiAgICByZXR1cm4ge2NvbHMsIHJvd3N9O1xuICB9XG5cbn0pO1xuXG5UdHlUZXJtaW5hbC5wcm9wVHlwZXMgPSB7XG4gIHR0eTogUmVhY3QuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59XG5cbm1vZHVsZS5leHBvcnRzID0gVHR5VGVybWluYWw7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tcG9uZW50cy90ZXJtaW5hbC5qc3hcbiAqKi8iLCIvKlxuICogIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICogIENvcHlyaWdodCAoYykgMjAxNSBSeWFuIEZsb3JlbmNlLCBNaWNoYWVsIEphY2tzb25cbiAqICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuKi9cblxuaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnXG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpXG59XG5cbmZ1bmN0aW9uIGVzY2FwZVNvdXJjZShzdHJpbmcpIHtcbiAgcmV0dXJuIGVzY2FwZVJlZ0V4cChzdHJpbmcpLnJlcGxhY2UoL1xcLysvZywgJy8rJylcbn1cblxuZnVuY3Rpb24gX2NvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pIHtcbiAgbGV0IHJlZ2V4cFNvdXJjZSA9ICcnO1xuICBjb25zdCBwYXJhbU5hbWVzID0gW107XG4gIGNvbnN0IHRva2VucyA9IFtdO1xuXG4gIGxldCBtYXRjaCwgbGFzdEluZGV4ID0gMCwgbWF0Y2hlciA9IC86KFthLXpBLVpfJF1bYS16QS1aMC05XyRdKil8XFwqXFwqfFxcKnxcXCh8XFwpL2dcbiAgLyplc2xpbnQgbm8tY29uZC1hc3NpZ246IDAqL1xuICB3aGlsZSAoKG1hdGNoID0gbWF0Y2hlci5leGVjKHBhdHRlcm4pKSkge1xuICAgIGlmIChtYXRjaC5pbmRleCAhPT0gbGFzdEluZGV4KSB7XG4gICAgICB0b2tlbnMucHVzaChwYXR0ZXJuLnNsaWNlKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpKVxuICAgICAgcmVnZXhwU291cmNlICs9IGVzY2FwZVNvdXJjZShwYXR0ZXJuLnNsaWNlKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpKVxuICAgIH1cblxuICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgcmVnZXhwU291cmNlICs9ICcoW14vPyNdKyknO1xuICAgICAgcGFyYW1OYW1lcy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoWzBdID09PSAnKionKSB7XG4gICAgICByZWdleHBTb3VyY2UgKz0gJyhbXFxcXHNcXFxcU10qKSdcbiAgICAgIHBhcmFtTmFtZXMucHVzaCgnc3BsYXQnKTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoWzBdID09PSAnKicpIHtcbiAgICAgIHJlZ2V4cFNvdXJjZSArPSAnKFtcXFxcc1xcXFxTXSo/KSdcbiAgICAgIHBhcmFtTmFtZXMucHVzaCgnc3BsYXQnKTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoWzBdID09PSAnKCcpIHtcbiAgICAgIHJlZ2V4cFNvdXJjZSArPSAnKD86JztcbiAgICB9IGVsc2UgaWYgKG1hdGNoWzBdID09PSAnKScpIHtcbiAgICAgIHJlZ2V4cFNvdXJjZSArPSAnKT8nO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKG1hdGNoWzBdKTtcblxuICAgIGxhc3RJbmRleCA9IG1hdGNoZXIubGFzdEluZGV4O1xuICB9XG5cbiAgaWYgKGxhc3RJbmRleCAhPT0gcGF0dGVybi5sZW5ndGgpIHtcbiAgICB0b2tlbnMucHVzaChwYXR0ZXJuLnNsaWNlKGxhc3RJbmRleCwgcGF0dGVybi5sZW5ndGgpKVxuICAgIHJlZ2V4cFNvdXJjZSArPSBlc2NhcGVTb3VyY2UocGF0dGVybi5zbGljZShsYXN0SW5kZXgsIHBhdHRlcm4ubGVuZ3RoKSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0dGVybixcbiAgICByZWdleHBTb3VyY2UsXG4gICAgcGFyYW1OYW1lcyxcbiAgICB0b2tlbnNcbiAgfVxufVxuXG5jb25zdCBDb21waWxlZFBhdHRlcm5zQ2FjaGUgPSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVBhdHRlcm4ocGF0dGVybikge1xuICBpZiAoIShwYXR0ZXJuIGluIENvbXBpbGVkUGF0dGVybnNDYWNoZSkpXG4gICAgQ29tcGlsZWRQYXR0ZXJuc0NhY2hlW3BhdHRlcm5dID0gX2NvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgcmV0dXJuIENvbXBpbGVkUGF0dGVybnNDYWNoZVtwYXR0ZXJuXVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIG1hdGNoIGEgcGF0dGVybiBvbiB0aGUgZ2l2ZW4gcGF0aG5hbWUuIFBhdHRlcm5zIG1heSB1c2VcbiAqIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzOlxuICpcbiAqIC0gOnBhcmFtTmFtZSAgICAgTWF0Y2hlcyBhIFVSTCBzZWdtZW50IHVwIHRvIHRoZSBuZXh0IC8sID8sIG9yICMuIFRoZVxuICogICAgICAgICAgICAgICAgICBjYXB0dXJlZCBzdHJpbmcgaXMgY29uc2lkZXJlZCBhIFwicGFyYW1cIlxuICogLSAoKSAgICAgICAgICAgICBXcmFwcyBhIHNlZ21lbnQgb2YgdGhlIFVSTCB0aGF0IGlzIG9wdGlvbmFsXG4gKiAtICogICAgICAgICAgICAgIENvbnN1bWVzIChub24tZ3JlZWR5KSBhbGwgY2hhcmFjdGVycyB1cCB0byB0aGUgbmV4dFxuICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgaW4gdGhlIHBhdHRlcm4sIG9yIHRvIHRoZSBlbmQgb2YgdGhlIFVSTCBpZlxuICogICAgICAgICAgICAgICAgICB0aGVyZSBpcyBub25lXG4gKiAtICoqICAgICAgICAgICAgIENvbnN1bWVzIChncmVlZHkpIGFsbCBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBuZXh0IGNoYXJhY3RlclxuICogICAgICAgICAgICAgICAgICBpbiB0aGUgcGF0dGVybiwgb3IgdG8gdGhlIGVuZCBvZiB0aGUgVVJMIGlmIHRoZXJlIGlzIG5vbmVcbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAtIHJlbWFpbmluZ1BhdGhuYW1lXG4gKiAtIHBhcmFtTmFtZXNcbiAqIC0gcGFyYW1WYWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0dGVybihwYXR0ZXJuLCBwYXRobmFtZSkge1xuICAvLyBNYWtlIGxlYWRpbmcgc2xhc2hlcyBjb25zaXN0ZW50IGJldHdlZW4gcGF0dGVybiBhbmQgcGF0aG5hbWUuXG4gIGlmIChwYXR0ZXJuLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgcGF0dGVybiA9IGAvJHtwYXR0ZXJufWBcbiAgfVxuICBpZiAocGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHtcbiAgICBwYXRobmFtZSA9IGAvJHtwYXRobmFtZX1gXG4gIH1cblxuICBsZXQgeyByZWdleHBTb3VyY2UsIHBhcmFtTmFtZXMsIHRva2VucyB9ID0gY29tcGlsZVBhdHRlcm4ocGF0dGVybilcblxuICByZWdleHBTb3VyY2UgKz0gJy8qJyAvLyBDYXB0dXJlIHBhdGggc2VwYXJhdG9yc1xuXG4gIC8vIFNwZWNpYWwtY2FzZSBwYXR0ZXJucyBsaWtlICcqJyBmb3IgY2F0Y2gtYWxsIHJvdXRlcy5cbiAgY29uc3QgY2FwdHVyZVJlbWFpbmluZyA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gIT09ICcqJ1xuXG4gIGlmIChjYXB0dXJlUmVtYWluaW5nKSB7XG4gICAgLy8gVGhpcyB3aWxsIG1hdGNoIG5ld2xpbmVzIGluIHRoZSByZW1haW5pbmcgcGF0aC5cbiAgICByZWdleHBTb3VyY2UgKz0gJyhbXFxcXHNcXFxcU10qPyknXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHBhdGhuYW1lLm1hdGNoKG5ldyBSZWdFeHAoJ14nICsgcmVnZXhwU291cmNlICsgJyQnLCAnaScpKVxuXG4gIGxldCByZW1haW5pbmdQYXRobmFtZSwgcGFyYW1WYWx1ZXNcbiAgaWYgKG1hdGNoICE9IG51bGwpIHtcbiAgICBpZiAoY2FwdHVyZVJlbWFpbmluZykge1xuICAgICAgcmVtYWluaW5nUGF0aG5hbWUgPSBtYXRjaC5wb3AoKVxuICAgICAgY29uc3QgbWF0Y2hlZFBhdGggPVxuICAgICAgICBtYXRjaFswXS5zdWJzdHIoMCwgbWF0Y2hbMF0ubGVuZ3RoIC0gcmVtYWluaW5nUGF0aG5hbWUubGVuZ3RoKVxuXG4gICAgICAvLyBJZiB3ZSBkaWRuJ3QgbWF0Y2ggdGhlIGVudGlyZSBwYXRobmFtZSwgdGhlbiBtYWtlIHN1cmUgdGhhdCB0aGUgbWF0Y2hcbiAgICAgIC8vIHdlIGRpZCBnZXQgZW5kcyBhdCBhIHBhdGggc2VwYXJhdG9yIChwb3RlbnRpYWxseSB0aGUgb25lIHdlIGFkZGVkXG4gICAgICAvLyBhYm92ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRoLCBpZiB0aGUgYWN0dWFsIG1hdGNoIHdhcyBlbXB0eSkuXG4gICAgICBpZiAoXG4gICAgICAgIHJlbWFpbmluZ1BhdGhuYW1lICYmXG4gICAgICAgIG1hdGNoZWRQYXRoLmNoYXJBdChtYXRjaGVkUGF0aC5sZW5ndGggLSAxKSAhPT0gJy8nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZW1haW5pbmdQYXRobmFtZTogbnVsbCxcbiAgICAgICAgICBwYXJhbU5hbWVzLFxuICAgICAgICAgIHBhcmFtVmFsdWVzOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhpcyBtYXRjaGVkIGF0IGFsbCwgdGhlbiB0aGUgbWF0Y2ggd2FzIHRoZSBlbnRpcmUgcGF0aG5hbWUuXG4gICAgICByZW1haW5pbmdQYXRobmFtZSA9ICcnXG4gICAgfVxuXG4gICAgcGFyYW1WYWx1ZXMgPSBtYXRjaC5zbGljZSgxKS5tYXAoXG4gICAgICB2ID0+IHYgIT0gbnVsbCA/IGRlY29kZVVSSUNvbXBvbmVudCh2KSA6IHZcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgcmVtYWluaW5nUGF0aG5hbWUgPSBwYXJhbVZhbHVlcyA9IG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVtYWluaW5nUGF0aG5hbWUsXG4gICAgcGFyYW1OYW1lcyxcbiAgICBwYXJhbVZhbHVlc1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbU5hbWVzKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pLnBhcmFtTmFtZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmFtcyhwYXR0ZXJuLCBwYXRobmFtZSkge1xuICBjb25zdCB7IHBhcmFtTmFtZXMsIHBhcmFtVmFsdWVzIH0gPSBtYXRjaFBhdHRlcm4ocGF0dGVybiwgcGF0aG5hbWUpXG5cbiAgaWYgKHBhcmFtVmFsdWVzICE9IG51bGwpIHtcbiAgICByZXR1cm4gcGFyYW1OYW1lcy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHBhcmFtTmFtZSwgaW5kZXgpIHtcbiAgICAgIG1lbW9bcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWVzW2luZGV4XVxuICAgICAgcmV0dXJuIG1lbW9cbiAgICB9LCB7fSlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZlcnNpb24gb2YgdGhlIGdpdmVuIHBhdHRlcm4gd2l0aCBwYXJhbXMgaW50ZXJwb2xhdGVkLiBUaHJvd3NcbiAqIGlmIHRoZXJlIGlzIGEgZHluYW1pYyBzZWdtZW50IG9mIHRoZSBwYXR0ZXJuIGZvciB3aGljaCB0aGVyZSBpcyBubyBwYXJhbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFBhdHRlcm4ocGF0dGVybiwgcGFyYW1zKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fVxuXG4gIGNvbnN0IHsgdG9rZW5zIH0gPSBjb21waWxlUGF0dGVybihwYXR0ZXJuKVxuICBsZXQgcGFyZW5Db3VudCA9IDAsIHBhdGhuYW1lID0gJycsIHNwbGF0SW5kZXggPSAwXG5cbiAgbGV0IHRva2VuLCBwYXJhbU5hbWUsIHBhcmFtVmFsdWVcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHRva2VuID0gdG9rZW5zW2ldXG5cbiAgICBpZiAodG9rZW4gPT09ICcqJyB8fCB0b2tlbiA9PT0gJyoqJykge1xuICAgICAgcGFyYW1WYWx1ZSA9IEFycmF5LmlzQXJyYXkocGFyYW1zLnNwbGF0KSA/IHBhcmFtcy5zcGxhdFtzcGxhdEluZGV4KytdIDogcGFyYW1zLnNwbGF0XG5cbiAgICAgIGludmFyaWFudChcbiAgICAgICAgcGFyYW1WYWx1ZSAhPSBudWxsIHx8IHBhcmVuQ291bnQgPiAwLFxuICAgICAgICAnTWlzc2luZyBzcGxhdCAjJXMgZm9yIHBhdGggXCIlc1wiJyxcbiAgICAgICAgc3BsYXRJbmRleCwgcGF0dGVyblxuICAgICAgKVxuXG4gICAgICBpZiAocGFyYW1WYWx1ZSAhPSBudWxsKVxuICAgICAgICBwYXRobmFtZSArPSBlbmNvZGVVUkkocGFyYW1WYWx1ZSlcbiAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnKCcpIHtcbiAgICAgIHBhcmVuQ291bnQgKz0gMVxuICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICcpJykge1xuICAgICAgcGFyZW5Db3VudCAtPSAxXG4gICAgfSBlbHNlIGlmICh0b2tlbi5jaGFyQXQoMCkgPT09ICc6Jykge1xuICAgICAgcGFyYW1OYW1lID0gdG9rZW4uc3Vic3RyaW5nKDEpXG4gICAgICBwYXJhbVZhbHVlID0gcGFyYW1zW3BhcmFtTmFtZV1cblxuICAgICAgaW52YXJpYW50KFxuICAgICAgICBwYXJhbVZhbHVlICE9IG51bGwgfHwgcGFyZW5Db3VudCA+IDAsXG4gICAgICAgICdNaXNzaW5nIFwiJXNcIiBwYXJhbWV0ZXIgZm9yIHBhdGggXCIlc1wiJyxcbiAgICAgICAgcGFyYW1OYW1lLCBwYXR0ZXJuXG4gICAgICApXG5cbiAgICAgIGlmIChwYXJhbVZhbHVlICE9IG51bGwpXG4gICAgICAgIHBhdGhuYW1lICs9IGVuY29kZVVSSUNvbXBvbmVudChwYXJhbVZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRobmFtZSArPSB0b2tlblxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRobmFtZS5yZXBsYWNlKC9cXC8rL2csICcvJylcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21tb24vcGF0dGVyblV0aWxzLmpzXG4gKiovIiwidmFyIFR0eSA9IHJlcXVpcmUoJ2FwcC9jb21tb24vdHR5Jyk7XG52YXIgYXBpID0gcmVxdWlyZSgnYXBwL3NlcnZpY2VzL2FwaScpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcblxuY2xhc3MgVHR5UGxheWVyIGV4dGVuZHMgVHR5IHtcbiAgY29uc3RydWN0b3Ioe3NpZH0pe1xuICAgIHN1cGVyKHt9KTtcbiAgICB0aGlzLnNpZCA9IHNpZDtcbiAgICB0aGlzLmN1cnJlbnQgPSAxO1xuICAgIHRoaXMubGVuZ3RoID0gLTE7XG4gICAgdGhpcy50dHlTdGVhbSA9IG5ldyBBcnJheSgpO1xuICAgIHRoaXMuaXNMb2FpbmQgPSBmYWxzZTtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIHNlbmQoKXtcbiAgfVxuXG4gIHJlc2l6ZSgpe1xuICB9XG5cbiAgY29ubmVjdCgpe1xuICAgIGFwaS5nZXQoY2ZnLmFwaS5nZXRGZXRjaFNlc3Npb25MZW5ndGhVcmwodGhpcy5zaWQpKVxuICAgICAgLmRvbmUoKGRhdGEpPT57XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZGF0YS5jb3VudDtcbiAgICAgICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAuZmFpbCgoKT0+e1xuICAgICAgICB0aGlzLmlzRXJyb3IgPSB0cnVlO1xuICAgICAgfSlcbiAgICAgIC5hbHdheXMoKCk9PntcbiAgICAgICAgdGhpcy5fY2hhbmdlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG1vdmUobmV3UG9zKXtcbiAgICBpZighdGhpcy5pc1JlYWR5KXtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZihuZXdQb3MgPT09IHVuZGVmaW5lZCl7XG4gICAgICBuZXdQb3MgPSB0aGlzLmN1cnJlbnQgKyAxO1xuICAgIH1cblxuICAgIGlmKG5ld1BvcyA+IHRoaXMubGVuZ3RoKXtcbiAgICAgIG5ld1BvcyA9IHRoaXMubGVuZ3RoO1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgfVxuXG4gICAgaWYobmV3UG9zID09PSAwKXtcbiAgICAgIG5ld1BvcyA9IDE7XG4gICAgfVxuXG4gICAgaWYodGhpcy5pc1BsYXlpbmcpe1xuICAgICAgaWYodGhpcy5jdXJyZW50IDwgbmV3UG9zKXtcbiAgICAgICAgdGhpcy5fc2hvd0NodW5rKHRoaXMuY3VycmVudCwgbmV3UG9zKTtcbiAgICAgIH1lbHNle1xuICAgICAgICB0aGlzLmVtaXQoJ3Jlc2V0Jyk7XG4gICAgICAgIHRoaXMuX3Nob3dDaHVuayh0aGlzLmN1cnJlbnQsIG5ld1Bvcyk7XG4gICAgICB9XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBuZXdQb3M7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlKCk7XG4gIH1cblxuICBzdG9wKCl7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRpbWVyID0gY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcbiAgICB0aGlzLl9jaGFuZ2UoKTtcbiAgfVxuXG4gIHBsYXkoKXtcbiAgICBpZih0aGlzLmlzUGxheWluZyl7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG4gICAgLy8gc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIGlmIGF0IHRoZSBlbmRcbiAgICBpZih0aGlzLmN1cnJlbnQgPT09IHRoaXMubGVuZ3RoKXtcbiAgICAgIHRoaXMuY3VycmVudCA9IDE7XG4gICAgICB0aGlzLmVtaXQoJ3Jlc2V0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMubW92ZS5iaW5kKHRoaXMpLCAxNTApO1xuICAgIHRoaXMuX2NoYW5nZSgpO1xuICB9XG5cbiAgX3Nob3VsZEZldGNoKHN0YXJ0LCBlbmQpe1xuICAgIGZvcih2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspe1xuICAgICAgaWYodGhpcy50dHlTdGVhbVtpXSA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2ZldGNoKHN0YXJ0LCBlbmQpe1xuICAgIGVuZCA9IGVuZCArIDUwO1xuICAgIGVuZCA9IGVuZCA+IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGggOiBlbmQ7XG4gICAgcmV0dXJuIGFwaS5nZXQoY2ZnLmFwaS5nZXRGZXRjaFNlc3Npb25DaHVua1VybCh7c2lkOiB0aGlzLnNpZCwgc3RhcnQsIGVuZH0pKS5cbiAgICAgIGRvbmUoKHJlc3BvbnNlKT0+e1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZW5kLXN0YXJ0OyBpKyspe1xuICAgICAgICAgIHZhciBkYXRhID0gYXRvYihyZXNwb25zZS5jaHVua3NbaV0uZGF0YSkgfHwgJyc7XG4gICAgICAgICAgdmFyIGRlbGF5ID0gcmVzcG9uc2UuY2h1bmtzW2ldLmRlbGF5O1xuICAgICAgICAgIHRoaXMudHR5U3RlYW1bc3RhcnQraV0gPSB7IGRhdGEsIGRlbGF5fTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBfc2hvd0NodW5rKHN0YXJ0LCBlbmQpe1xuICAgIHZhciBkaXNwbGF5ID0gKCk9PntcbiAgICAgIGZvcih2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspe1xuICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCB0aGlzLnR0eVN0ZWFtW2ldLmRhdGEpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50ID0gZW5kO1xuICAgIH07XG5cbiAgICBpZih0aGlzLl9zaG91bGRGZXRjaChzdGFydCwgZW5kKSl7XG4gICAgICB0aGlzLl9mZXRjaChzdGFydCwgZW5kKS50aGVuKGRpc3BsYXkpO1xuICAgIH1lbHNle1xuICAgICAgZGlzcGxheSgpO1xuICAgIH1cbiAgfVxuXG4gIF9jaGFuZ2UoKXtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFR0eVBsYXllcjtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21tb24vdHR5UGxheWVyLmpzXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XG4gICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpKjE2fDAsIHYgPSBjID09ICd4JyA/IHIgOiAociYweDN8MHg4KTtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbW1vbi91dWlkLmpzXG4gKiovIiwidmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHtmZXRjaFNlc3Npb25zfSA9IHJlcXVpcmUoJy4vLi4vc2Vzc2lvbnMvYWN0aW9ucycpO1xudmFyIHtmZXRjaE5vZGVzfSA9IHJlcXVpcmUoJy4vLi4vbm9kZXMvYWN0aW9ucycpO1xudmFyIHttb250aFJhbmdlfSA9IHJlcXVpcmUoJ2FwcC9jb21tb24vZGF0ZVV0aWxzJyk7XG52YXIgJCA9IHJlcXVpcmUoJ2pRdWVyeScpO1xuXG5jb25zdCB7IFRMUFRfQVBQX0lOSVQsIFRMUFRfQVBQX0ZBSUxFRCwgVExQVF9BUFBfUkVBRFkgfSA9IHJlcXVpcmUoJy4vYWN0aW9uVHlwZXMnKTtcblxuY29uc3QgYWN0aW9ucyA9IHtcblxuICBpbml0QXBwKCkge1xuICAgIHJlYWN0b3IuZGlzcGF0Y2goVExQVF9BUFBfSU5JVCk7XG4gICAgYWN0aW9ucy5mZXRjaE5vZGVzQW5kU2Vzc2lvbnMoKVxuICAgICAgLmRvbmUoKCk9PiByZWFjdG9yLmRpc3BhdGNoKFRMUFRfQVBQX1JFQURZKSApXG4gICAgICAuZmFpbCgoKT0+IHJlYWN0b3IuZGlzcGF0Y2goVExQVF9BUFBfRkFJTEVEKSApO1xuICB9LFxuXG4gIGZldGNoTm9kZXNBbmRTZXNzaW9ucygpIHtcbiAgICB2YXIgW3N0YXJ0LCBlbmQgXSA9IG1vbnRoUmFuZ2UoKTtcbiAgICByZXR1cm4gJC53aGVuKGZldGNoTm9kZXMoKSwgZmV0Y2hTZXNzaW9ucyhzdGFydCwgZW5kKSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYWN0aW9ucztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL2FwcC9hY3Rpb25zLmpzXG4gKiovIiwiY29uc3QgYXBwU3RhdGUgPSBbWyd0bHB0J10sIGFwcD0+IGFwcC50b0pTKCldO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFwcFN0YXRlXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9hcHAvZ2V0dGVycy5qc1xuICoqLyIsIm1vZHVsZS5leHBvcnRzLmdldHRlcnMgPSByZXF1aXJlKCcuL2dldHRlcnMnKTtcbm1vZHVsZS5leHBvcnRzLmFjdGlvbnMgPSByZXF1aXJlKCcuL2FjdGlvbnMnKTtcbm1vZHVsZS5leHBvcnRzLmFwcFN0b3JlID0gcmVxdWlyZSgnLi9hcHBTdG9yZScpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvYXBwL2luZGV4LmpzXG4gKiovIiwiY29uc3QgZGlhbG9ncyA9IFtbJ3RscHRfZGlhbG9ncyddLCBzdGF0ZT0+IHN0YXRlLnRvSlMoKV07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGlhbG9nc1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvZGlhbG9ncy9nZXR0ZXJzLmpzXG4gKiovIiwibW9kdWxlLmV4cG9ydHMuZ2V0dGVycyA9IHJlcXVpcmUoJy4vZ2V0dGVycycpO1xubW9kdWxlLmV4cG9ydHMuYWN0aW9ucyA9IHJlcXVpcmUoJy4vYWN0aW9ucycpO1xubW9kdWxlLmV4cG9ydHMuZGlhbG9nU3RvcmUgPSByZXF1aXJlKCcuL2RpYWxvZ1N0b3JlJyk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9kaWFsb2dzL2luZGV4LmpzXG4gKiovIiwidmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xucmVhY3Rvci5yZWdpc3RlclN0b3Jlcyh7XG4gICd0bHB0JzogcmVxdWlyZSgnLi9hcHAvYXBwU3RvcmUnKSxcbiAgJ3RscHRfZGlhbG9ncyc6IHJlcXVpcmUoJy4vZGlhbG9ncy9kaWFsb2dTdG9yZScpLFxuICAndGxwdF9jdXJyZW50X3Nlc3Npb24nOiByZXF1aXJlKCcuL2FjdGl2ZVRlcm1pbmFsL2FjdGl2ZVRlcm1TdG9yZScpLFxuICAndGxwdF91c2VyJzogcmVxdWlyZSgnLi91c2VyL3VzZXJTdG9yZScpLFxuICAndGxwdF9ub2Rlcyc6IHJlcXVpcmUoJy4vbm9kZXMvbm9kZVN0b3JlJyksXG4gICd0bHB0X2ludml0ZSc6IHJlcXVpcmUoJy4vaW52aXRlL2ludml0ZVN0b3JlJyksXG4gICd0bHB0X3Jlc3RfYXBpJzogcmVxdWlyZSgnLi9yZXN0QXBpL3Jlc3RBcGlTdG9yZScpLFxuICAndGxwdF9zZXNzaW9ucyc6IHJlcXVpcmUoJy4vc2Vzc2lvbnMvc2Vzc2lvblN0b3JlJyksXG4gICd0bHB0X25vdGlmaWNhdGlvbnMnOiByZXF1aXJlKCcuL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uU3RvcmUnKVxufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9pbmRleC5qc1xuICoqLyIsInZhciByZWFjdG9yID0gcmVxdWlyZSgnYXBwL3JlYWN0b3InKTtcbnZhciB7IFRMUFRfUkVDRUlWRV9VU0VSX0lOVklURSB9ICA9IHJlcXVpcmUoJy4vYWN0aW9uVHlwZXMnKTtcbnZhciB7IEZFVENISU5HX0lOVklURX0gPSByZXF1aXJlKCdhcHAvbW9kdWxlcy9yZXN0QXBpL2NvbnN0YW50cycpO1xudmFyIHJlc3RBcGlBY3Rpb25zID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvcmVzdEFwaS9hY3Rpb25zJyk7XG52YXIgYXBpID0gcmVxdWlyZSgnYXBwL3NlcnZpY2VzL2FwaScpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBmZXRjaEludml0ZShpbnZpdGVUb2tlbil7XG4gICAgdmFyIHBhdGggPSBjZmcuYXBpLmdldEludml0ZVVybChpbnZpdGVUb2tlbik7XG4gICAgcmVzdEFwaUFjdGlvbnMuc3RhcnQoRkVUQ0hJTkdfSU5WSVRFKTtcbiAgICBhcGkuZ2V0KHBhdGgpLmRvbmUoaW52aXRlPT57XG4gICAgICByZXN0QXBpQWN0aW9ucy5zdWNjZXNzKEZFVENISU5HX0lOVklURSk7XG4gICAgICByZWFjdG9yLmRpc3BhdGNoKFRMUFRfUkVDRUlWRV9VU0VSX0lOVklURSwgaW52aXRlKTtcbiAgICB9KS5cbiAgICBmYWlsKChlcnIpPT57XG4gICAgICByZXN0QXBpQWN0aW9ucy5mYWlsKEZFVENISU5HX0lOVklURSwgZXJyLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvaW52aXRlL2FjdGlvbnMuanNcbiAqKi8iLCJ2YXIge1RSWUlOR19UT19TSUdOX1VQLCBGRVRDSElOR19JTlZJVEV9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvcmVzdEFwaS9jb25zdGFudHMnKTtcbnZhciB7cmVxdWVzdFN0YXR1c30gPSByZXF1aXJlKCdhcHAvbW9kdWxlcy9yZXN0QXBpL2dldHRlcnMnKTtcblxuY29uc3QgaW52aXRlID0gWyBbJ3RscHRfaW52aXRlJ10sIChpbnZpdGUpID0+IGludml0ZSBdO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGludml0ZSxcbiAgYXR0ZW1wOiByZXF1ZXN0U3RhdHVzKFRSWUlOR19UT19TSUdOX1VQKSxcbiAgZmV0Y2hpbmdJbnZpdGU6IHJlcXVlc3RTdGF0dXMoRkVUQ0hJTkdfSU5WSVRFKVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL21vZHVsZXMvaW52aXRlL2dldHRlcnMuanNcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cy5nZXR0ZXJzID0gcmVxdWlyZSgnLi9nZXR0ZXJzJyk7XG5tb2R1bGUuZXhwb3J0cy5hY3Rpb25zID0gcmVxdWlyZSgnLi9hY3Rpb25zJyk7XG5tb2R1bGUuZXhwb3J0cy5ub2RlU3RvcmUgPSByZXF1aXJlKCcuL2ludml0ZVN0b3JlJyk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9pbnZpdGUvaW5kZXguanNcbiAqKi8iLCJ2YXIgcmVhY3RvciA9IHJlcXVpcmUoJ2FwcC9yZWFjdG9yJyk7XG52YXIgeyBUTFBUX05PREVTX1JFQ0VJVkUgfSAgPSByZXF1aXJlKCcuL2FjdGlvblR5cGVzJyk7XG52YXIgYXBpID0gcmVxdWlyZSgnYXBwL3NlcnZpY2VzL2FwaScpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcbnZhciB7c2hvd0Vycm9yfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL25vdGlmaWNhdGlvbnMvYWN0aW9ucycpO1xuXG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCdhcHAvY29tbW9uL2xvZ2dlcicpLmNyZWF0ZSgnTW9kdWxlcy9Ob2RlcycpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGZldGNoTm9kZXMoKXtcbiAgICBhcGkuZ2V0KGNmZy5hcGkubm9kZXNQYXRoKS5kb25lKChkYXRhPVtdKT0+e1xuICAgICAgdmFyIG5vZGVBcnJheSA9IGRhdGEubm9kZXMubWFwKGl0ZW09Pml0ZW0ubm9kZSk7XG4gICAgICByZWFjdG9yLmRpc3BhdGNoKFRMUFRfTk9ERVNfUkVDRUlWRSwgbm9kZUFycmF5KTtcbiAgICB9KS5mYWlsKChlcnIpPT57ICAgICAgXG4gICAgICBzaG93RXJyb3IoJ1VuYWJsZSB0byByZXRyaWV2ZSBsaXN0IG9mIG5vZGVzJyk7XG4gICAgICBsb2dnZXIuZXJyb3IoJ2ZldGNoTm9kZXMnLCBlcnIpO1xuICAgIH0pXG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL25vZGVzL2FjdGlvbnMuanNcbiAqKi8iLCJ2YXIgeyBTdG9yZSwgdG9JbW11dGFibGUgfSA9IHJlcXVpcmUoJ251Y2xlYXItanMnKTtcbnZhciAgeyBUTFBUX05PREVTX1JFQ0VJVkUgfSA9IHJlcXVpcmUoJy4vYWN0aW9uVHlwZXMnKTtcblxuZXhwb3J0IGRlZmF1bHQgU3RvcmUoe1xuICBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRvSW1tdXRhYmxlKFtdKTtcbiAgfSxcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMub24oVExQVF9OT0RFU19SRUNFSVZFLCByZWNlaXZlTm9kZXMpXG4gIH1cbn0pXG5cbmZ1bmN0aW9uIHJlY2VpdmVOb2RlcyhzdGF0ZSwgbm9kZUFycmF5KXtcbiAgcmV0dXJuIHRvSW1tdXRhYmxlKG5vZGVBcnJheSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9ub2Rlcy9ub2RlU3RvcmUuanNcbiAqKi8iLCJleHBvcnQgY29uc3QgbGFzdE1lc3NhZ2UgPVxuICBbIFsndGxwdF9ub3RpZmljYXRpb25zJ10sIG5vdGlmaWNhdGlvbnMgPT4gbm90aWZpY2F0aW9ucy5sYXN0KCkgXTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL25vdGlmaWNhdGlvbnMvZ2V0dGVycy5qc1xuICoqLyIsImltcG9ydCB7IFN0b3JlLCBJbW11dGFibGUgfSBmcm9tICdudWNsZWFyLWpzJztcbmltcG9ydCB7VExQVF9OT1RJRklDQVRJT05TX0FERH0gZnJvbSAnLi9hY3Rpb25UeXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IFN0b3JlKHtcbiAgZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIHJldHVybiBuZXcgSW1tdXRhYmxlLk9yZGVyZWRNYXAoKTtcbiAgfSxcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMub24oVExQVF9OT1RJRklDQVRJT05TX0FERCwgYWRkTm90aWZpY2F0aW9uKTtcbiAgfSxcbn0pO1xuXG5mdW5jdGlvbiBhZGROb3RpZmljYXRpb24oc3RhdGUsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIHN0YXRlLnNldChzdGF0ZS5zaXplLCBtZXNzYWdlKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9tb2R1bGVzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uU3RvcmUuanNcbiAqKi8iLCJ2YXIgeyBTdG9yZSwgdG9JbW11dGFibGUgfSA9IHJlcXVpcmUoJ251Y2xlYXItanMnKTtcbnZhciB7XG4gIFRMUFRfUkVTVF9BUElfU1RBUlQsXG4gIFRMUFRfUkVTVF9BUElfU1VDQ0VTUyxcbiAgVExQVF9SRVNUX0FQSV9GQUlMIH0gPSByZXF1aXJlKCcuL2FjdGlvblR5cGVzJyk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0b3JlKHtcbiAgZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIHJldHVybiB0b0ltbXV0YWJsZSh7fSk7XG4gIH0sXG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLm9uKFRMUFRfUkVTVF9BUElfU1RBUlQsIHN0YXJ0KTtcbiAgICB0aGlzLm9uKFRMUFRfUkVTVF9BUElfRkFJTCwgZmFpbCk7XG4gICAgdGhpcy5vbihUTFBUX1JFU1RfQVBJX1NVQ0NFU1MsIHN1Y2Nlc3MpO1xuICB9XG59KVxuXG5mdW5jdGlvbiBzdGFydChzdGF0ZSwgcmVxdWVzdCl7XG4gIHJldHVybiBzdGF0ZS5zZXQocmVxdWVzdC50eXBlLCB0b0ltbXV0YWJsZSh7aXNQcm9jZXNzaW5nOiB0cnVlfSkpO1xufVxuXG5mdW5jdGlvbiBmYWlsKHN0YXRlLCByZXF1ZXN0KXtcbiAgcmV0dXJuIHN0YXRlLnNldChyZXF1ZXN0LnR5cGUsIHRvSW1tdXRhYmxlKHtpc0ZhaWxlZDogdHJ1ZSwgbWVzc2FnZTogcmVxdWVzdC5tZXNzYWdlfSkpO1xufVxuXG5mdW5jdGlvbiBzdWNjZXNzKHN0YXRlLCByZXF1ZXN0KXtcbiAgcmV0dXJuIHN0YXRlLnNldChyZXF1ZXN0LnR5cGUsIHRvSW1tdXRhYmxlKHtpc1N1Y2Nlc3M6IHRydWV9KSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvbW9kdWxlcy9yZXN0QXBpL3Jlc3RBcGlTdG9yZS5qc1xuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgTmF2TGVmdEJhciA9IHJlcXVpcmUoJy4vbmF2TGVmdEJhcicpO1xudmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHthY3Rpb25zLCBnZXR0ZXJzfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL2FwcCcpO1xudmFyIFNlbGVjdE5vZGVEaWFsb2cgPSByZXF1aXJlKCcuL3NlbGVjdE5vZGVEaWFsb2cuanN4Jyk7XG52YXIgTm90aWZpY2F0aW9uSG9zdCA9IHJlcXVpcmUoJy4vbm90aWZpY2F0aW9uSG9zdC5qc3gnKTtcblxudmFyIEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBtaXhpbnM6IFtyZWFjdG9yLlJlYWN0TWl4aW5dLFxuXG4gIGdldERhdGFCaW5kaW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwOiBnZXR0ZXJzLmFwcFN0YXRlXG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCgpe1xuICAgIGFjdGlvbnMuaW5pdEFwcCgpO1xuICAgIHRoaXMucmVmcmVzaEludGVydmFsID0gc2V0SW50ZXJ2YWwoYWN0aW9ucy5mZXRjaE5vZGVzQW5kU2Vzc2lvbnMsIDM1MDAwKTtcbiAgfSxcblxuICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24oKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnJlZnJlc2hJbnRlcnZhbCk7XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICBpZih0aGlzLnN0YXRlLmFwcC5pc0luaXRpYWxpemluZyl7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtdGxwdCBncnYtZmxleCBncnYtZmxleC1yb3dcIj5cbiAgICAgICAgPFNlbGVjdE5vZGVEaWFsb2cvPlxuICAgICAgICA8Tm90aWZpY2F0aW9uSG9zdC8+XG4gICAgICAgIHt0aGlzLnByb3BzLkN1cnJlbnRTZXNzaW9uSG9zdH1cbiAgICAgICAgPE5hdkxlZnRCYXIvPlxuICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn0pXG5cbm1vZHVsZS5leHBvcnRzID0gQXBwO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvYXBwLmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgcmVhY3RvciA9IHJlcXVpcmUoJ2FwcC9yZWFjdG9yJyk7XG52YXIge25vZGVIb3N0TmFtZUJ5U2VydmVySWR9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvbm9kZXMvZ2V0dGVycycpO1xudmFyIFR0eSA9IHJlcXVpcmUoJ2FwcC9jb21tb24vdHR5Jyk7XG52YXIgVHR5VGVybWluYWwgPSByZXF1aXJlKCcuLy4uL3Rlcm1pbmFsLmpzeCcpO1xudmFyIEV2ZW50U3RyZWFtZXIgPSByZXF1aXJlKCcuL2V2ZW50U3RyZWFtZXIuanN4Jyk7XG52YXIgU2Vzc2lvbkxlZnRQYW5lbCA9IHJlcXVpcmUoJy4vc2Vzc2lvbkxlZnRQYW5lbCcpO1xudmFyIHtjbG9zZVNlbGVjdE5vZGVEaWFsb2d9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvZGlhbG9ncy9hY3Rpb25zJyk7XG52YXIgU2VsZWN0Tm9kZURpYWxvZyA9IHJlcXVpcmUoJy4vLi4vc2VsZWN0Tm9kZURpYWxvZy5qc3gnKTtcblxudmFyIEFjdGl2ZVNlc3Npb24gPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcbiAgICBjbG9zZVNlbGVjdE5vZGVEaWFsb2coKTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIGxldCB7bG9naW4sIHBhcnRpZXMsIHNlcnZlcklkfSA9IHRoaXMucHJvcHMuYWN0aXZlU2Vzc2lvbjtcbiAgICBsZXQgc2VydmVyTGFiZWxUZXh0ID0gJyc7XG4gICAgaWYoc2VydmVySWQpe1xuICAgICAgbGV0IGhvc3RuYW1lID0gcmVhY3Rvci5ldmFsdWF0ZShub2RlSG9zdE5hbWVCeVNlcnZlcklkKHNlcnZlcklkKSk7XG4gICAgICBzZXJ2ZXJMYWJlbFRleHQgPSBgJHtsb2dpbn1AJHtob3N0bmFtZX1gO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWN1cnJlbnQtc2Vzc2lvblwiPlxuICAgICAgIDxTZXNzaW9uTGVmdFBhbmVsIHBhcnRpZXM9e3BhcnRpZXN9Lz5cbiAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1jdXJyZW50LXNlc3Npb24tc2VydmVyLWluZm9cIj5cbiAgICAgICAgIDxoMz57c2VydmVyTGFiZWxUZXh0fTwvaDM+XG4gICAgICAgPC9kaXY+XG4gICAgICAgPFR0eUNvbm5lY3Rpb24gey4uLnRoaXMucHJvcHMuYWN0aXZlU2Vzc2lvbn0gLz5cbiAgICAgPC9kaXY+XG4gICAgICk7XG4gIH1cbn0pO1xuXG52YXIgVHR5Q29ubmVjdGlvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgdGhpcy50dHkgPSBuZXcgVHR5KHRoaXMucHJvcHMpXG4gICAgdGhpcy50dHkub24oJ29wZW4nLCAoKT0+IHRoaXMuc2V0U3RhdGUoeyAuLi50aGlzLnN0YXRlLCBpc0Nvbm5lY3RlZDogdHJ1ZSB9KSk7XG5cbiAgICB2YXIge3NlcnZlcklkLCBsb2dpbn0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiB7c2VydmVySWQsIGxvZ2luLCBpc0Nvbm5lY3RlZDogZmFsc2V9O1xuICB9LFxuXG4gIGNvbXBvbmVudERpZE1vdW50KCl7XG4gICAgLy8gdGVtcG9yYXJ5IGhhY2tcbiAgICBTZWxlY3ROb2RlRGlhbG9nLm9uU2VydmVyQ2hhbmdlQ2FsbEJhY2sgPSB0aGlzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuYmluZCh0aGlzKTtcbiAgfSxcblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBTZWxlY3ROb2RlRGlhbG9nLm9uU2VydmVyQ2hhbmdlQ2FsbEJhY2sgPSBudWxsO1xuICAgIHRoaXMudHR5LmRpc2Nvbm5lY3QoKTtcbiAgfSxcblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7XG4gICAgdmFyIHtzZXJ2ZXJJZH0gPSBuZXh0UHJvcHM7XG4gICAgaWYoc2VydmVySWQgJiYgc2VydmVySWQgIT09IHRoaXMuc3RhdGUuc2VydmVySWQpe1xuICAgICAgdGhpcy50dHkucmVjb25uZWN0KHtzZXJ2ZXJJZH0pO1xuICAgICAgdGhpcy5yZWZzLnR0eUNtbnRJbnN0YW5jZS50ZXJtLmZvY3VzKCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsuLi50aGlzLnN0YXRlLCBzZXJ2ZXJJZCB9KTtcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXt7aGVpZ2h0OiAnMTAwJSd9fT5cbiAgICAgICAgPFR0eVRlcm1pbmFsIHJlZj1cInR0eUNtbnRJbnN0YW5jZVwiIHR0eT17dGhpcy50dHl9IGNvbHM9e3RoaXMucHJvcHMuY29sc30gcm93cz17dGhpcy5wcm9wcy5yb3dzfSAvPlxuICAgICAgICB7IHRoaXMuc3RhdGUuaXNDb25uZWN0ZWQgPyA8RXZlbnRTdHJlYW1lciBzaWQ9e3RoaXMucHJvcHMuc2lkfS8+IDogbnVsbCB9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFjdGl2ZVNlc3Npb247XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tcG9uZW50cy9jdXJyZW50U2Vzc2lvbi9hY3RpdmVTZXNzaW9uLmpzeFxuICoqLyIsInZhciBjZmcgPSByZXF1aXJlKCdhcHAvY29uZmlnJyk7XG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIHNlc3Npb24gPSByZXF1aXJlKCdhcHAvc2Vzc2lvbicpO1xudmFyIHt1cGRhdGVTZXNzaW9ufSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL3Nlc3Npb25zL2FjdGlvbnMnKTtcblxudmFyIEV2ZW50U3RyZWFtZXIgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGxldCB7c2lkfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHt0b2tlbn0gPSBzZXNzaW9uLmdldFVzZXJEYXRhKCk7XG4gICAgbGV0IGNvbm5TdHIgPSBjZmcuYXBpLmdldEV2ZW50U3RyZWFtQ29ublN0cih0b2tlbiwgc2lkKTtcblxuICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChjb25uU3RyLCAncHJvdG8nKTtcbiAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgIHRyeVxuICAgICAge1xuICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICAgIHVwZGF0ZVNlc3Npb24oanNvbi5zZXNzaW9uKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoKGVycil7XG4gICAgICAgIGNvbnNvbGUubG9nKCdmYWlsZWQgdG8gcGFyc2UgZXZlbnQgc3RyZWFtIGRhdGEnKTtcbiAgICAgIH1cblxuICAgIH07XG4gICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHt9O1xuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gIH0sXG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBFdmVudFN0cmVhbWVyO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvY3VycmVudFNlc3Npb24vZXZlbnRTdHJlYW1lci5qc3hcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIHtnZXR0ZXJzLCBhY3Rpb25zfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL2FjdGl2ZVRlcm1pbmFsLycpO1xudmFyIFNlc3Npb25QbGF5ZXIgPSByZXF1aXJlKCcuL3Nlc3Npb25QbGF5ZXIuanN4Jyk7XG52YXIgQWN0aXZlU2Vzc2lvbiA9IHJlcXVpcmUoJy4vYWN0aXZlU2Vzc2lvbi5qc3gnKTtcblxudmFyIEN1cnJlbnRTZXNzaW9uSG9zdCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBtaXhpbnM6IFtyZWFjdG9yLlJlYWN0TWl4aW5dLFxuXG4gIGdldERhdGFCaW5kaW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFNlc3Npb246IGdldHRlcnMuYWN0aXZlU2Vzc2lvblxuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnREaWRNb3VudCgpe1xuICAgIHZhciB7IHNpZCB9ID0gdGhpcy5wcm9wcy5wYXJhbXM7XG4gICAgaWYoIXRoaXMuc3RhdGUuY3VycmVudFNlc3Npb24pe1xuICAgICAgYWN0aW9ucy5vcGVuU2Vzc2lvbihzaWQpO1xuICAgIH1cbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjdXJyZW50U2Vzc2lvbiA9IHRoaXMuc3RhdGUuY3VycmVudFNlc3Npb247XG4gICAgaWYoIWN1cnJlbnRTZXNzaW9uKXtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmKGN1cnJlbnRTZXNzaW9uLmlzTmV3U2Vzc2lvbiB8fCBjdXJyZW50U2Vzc2lvbi5hY3RpdmUpe1xuICAgICAgcmV0dXJuIDxBY3RpdmVTZXNzaW9uIGFjdGl2ZVNlc3Npb249e2N1cnJlbnRTZXNzaW9ufS8+O1xuICAgIH1cblxuICAgIHJldHVybiA8U2Vzc2lvblBsYXllciBhY3RpdmVTZXNzaW9uPXtjdXJyZW50U2Vzc2lvbn0vPjtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ3VycmVudFNlc3Npb25Ib3N0O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvY3VycmVudFNlc3Npb24vbWFpbi5qc3hcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFJlYWN0U2xpZGVyID0gcmVxdWlyZSgncmVhY3Qtc2xpZGVyJyk7XG52YXIgVHR5UGxheWVyID0gcmVxdWlyZSgnYXBwL2NvbW1vbi90dHlQbGF5ZXInKVxudmFyIFR0eVRlcm1pbmFsID0gcmVxdWlyZSgnLi8uLi90ZXJtaW5hbC5qc3gnKTtcbnZhciBTZXNzaW9uTGVmdFBhbmVsID0gcmVxdWlyZSgnLi9zZXNzaW9uTGVmdFBhbmVsJyk7XG5cbnZhciBTZXNzaW9uUGxheWVyID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICBjYWxjdWxhdGVTdGF0ZSgpe1xuICAgIHJldHVybiB7XG4gICAgICBsZW5ndGg6IHRoaXMudHR5Lmxlbmd0aCxcbiAgICAgIG1pbjogMSxcbiAgICAgIGlzUGxheWluZzogdGhpcy50dHkuaXNQbGF5aW5nLFxuICAgICAgY3VycmVudDogdGhpcy50dHkuY3VycmVudCxcbiAgICAgIGNhblBsYXk6IHRoaXMudHR5Lmxlbmd0aCA+IDFcbiAgICB9O1xuICB9LFxuXG4gIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICB2YXIgc2lkID0gdGhpcy5wcm9wcy5hY3RpdmVTZXNzaW9uLnNpZDtcbiAgICB0aGlzLnR0eSA9IG5ldyBUdHlQbGF5ZXIoe3NpZH0pO1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVN0YXRlKCk7XG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy50dHkuc3RvcCgpO1xuICAgIHRoaXMudHR5LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9LFxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudHR5Lm9uKCdjaGFuZ2UnLCAoKT0+e1xuICAgICAgdmFyIG5ld1N0YXRlID0gdGhpcy5jYWxjdWxhdGVTdGF0ZSgpO1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdG9nZ2xlUGxheVN0b3AoKXtcbiAgICBpZih0aGlzLnN0YXRlLmlzUGxheWluZyl7XG4gICAgICB0aGlzLnR0eS5zdG9wKCk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnR0eS5wbGF5KCk7XG4gICAgfVxuICB9LFxuXG4gIG1vdmUodmFsdWUpe1xuICAgIHRoaXMudHR5Lm1vdmUodmFsdWUpO1xuICB9LFxuXG4gIG9uQmVmb3JlQ2hhbmdlKCl7XG4gICAgdGhpcy50dHkuc3RvcCgpO1xuICB9LFxuXG4gIG9uQWZ0ZXJDaGFuZ2UodmFsdWUpe1xuICAgIHRoaXMudHR5LnBsYXkoKTtcbiAgICB0aGlzLnR0eS5tb3ZlKHZhbHVlKTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB7aXNQbGF5aW5nfSA9IHRoaXMuc3RhdGU7XG5cbiAgICByZXR1cm4gKFxuICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1jdXJyZW50LXNlc3Npb24gZ3J2LXNlc3Npb24tcGxheWVyXCI+XG4gICAgICAgPFNlc3Npb25MZWZ0UGFuZWwvPlxuICAgICAgIDxUdHlUZXJtaW5hbCByZWY9XCJ0ZXJtXCIgdHR5PXt0aGlzLnR0eX0gY29scz1cIjVcIiByb3dzPVwiNVwiIC8+XG4gICAgICAgPFJlYWN0U2xpZGVyXG4gICAgICAgICAgbWluPXt0aGlzLnN0YXRlLm1pbn1cbiAgICAgICAgICBtYXg9e3RoaXMuc3RhdGUubGVuZ3RofVxuICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmN1cnJlbnR9ICAgIFxuICAgICAgICAgIG9uQWZ0ZXJDaGFuZ2U9e3RoaXMub25BZnRlckNoYW5nZX1cbiAgICAgICAgICBvbkJlZm9yZUNoYW5nZT17dGhpcy5vbkJlZm9yZUNoYW5nZX1cbiAgICAgICAgICBkZWZhdWx0VmFsdWU9ezF9XG4gICAgICAgICAgd2l0aEJhcnNcbiAgICAgICAgICBjbGFzc05hbWU9XCJncnYtc2xpZGVyXCI+XG4gICAgICAgPC9SZWFjdFNsaWRlcj5cbiAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e3RoaXMudG9nZ2xlUGxheVN0b3B9PlxuICAgICAgICAgeyBpc1BsYXlpbmcgPyA8aSBjbGFzc05hbWU9XCJmYSBmYS1zdG9wXCI+PC9pPiA6ICA8aSBjbGFzc05hbWU9XCJmYSBmYS1wbGF5XCI+PC9pPiB9XG4gICAgICAgPC9idXR0b24+XG4gICAgIDwvZGl2PlxuICAgICApO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU2Vzc2lvblBsYXllcjtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21wb25lbnRzL2N1cnJlbnRTZXNzaW9uL3Nlc3Npb25QbGF5ZXIuanN4XG4gKiovIiwidmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciAkID0gcmVxdWlyZSgnalF1ZXJ5Jyk7XG52YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XG52YXIge2RlYm91bmNlfSA9IHJlcXVpcmUoJ18nKTtcblxudmFyIERhdGVSYW5nZVBpY2tlciA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBnZXREYXRlcygpe1xuICAgIHZhciBzdGFydERhdGUgPSAkKHRoaXMucmVmcy5kcFBpY2tlcjEpLmRhdGVwaWNrZXIoJ2dldERhdGUnKTtcbiAgICB2YXIgZW5kRGF0ZSA9ICQodGhpcy5yZWZzLmRwUGlja2VyMikuZGF0ZXBpY2tlcignZ2V0RGF0ZScpO1xuICAgIHJldHVybiBbc3RhcnREYXRlLCBlbmREYXRlXTtcbiAgfSxcblxuICBzZXREYXRlcyh7c3RhcnREYXRlLCBlbmREYXRlfSl7XG4gICAgJCh0aGlzLnJlZnMuZHBQaWNrZXIxKS5kYXRlcGlja2VyKCdzZXREYXRlJywgc3RhcnREYXRlKTtcbiAgICAkKHRoaXMucmVmcy5kcFBpY2tlcjIpLmRhdGVwaWNrZXIoJ3NldERhdGUnLCBlbmREYXRlKTtcbiAgfSxcblxuICBnZXREZWZhdWx0UHJvcHMoKSB7XG4gICAgIHJldHVybiB7XG4gICAgICAgc3RhcnREYXRlOiBtb21lbnQoKS5zdGFydE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgIGVuZERhdGU6IG1vbWVudCgpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgIG9uQ2hhbmdlOiAoKT0+e31cbiAgICAgfTtcbiAgIH0sXG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcbiAgICAkKHRoaXMucmVmcy5kcCkuZGF0ZXBpY2tlcignZGVzdHJveScpO1xuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMpe1xuICAgIHZhciBbc3RhcnREYXRlLCBlbmREYXRlXSA9IHRoaXMuZ2V0RGF0ZXMoKTtcbiAgICBpZighKGlzU2FtZShzdGFydERhdGUsIG5ld1Byb3BzLnN0YXJ0RGF0ZSkgJiZcbiAgICAgICAgICBpc1NhbWUoZW5kRGF0ZSwgbmV3UHJvcHMuZW5kRGF0ZSkpKXtcbiAgICAgICAgdGhpcy5zZXREYXRlcyhuZXdQcm9wcyk7XG4gICAgICB9XG4gIH0sXG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCl7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIGNvbXBvbmVudERpZE1vdW50KCl7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGRlYm91bmNlKHRoaXMub25DaGFuZ2UsIDEpO1xuICAgICQodGhpcy5yZWZzLnJhbmdlUGlja2VyKS5kYXRlcGlja2VyKHtcbiAgICAgIHRvZGF5QnRuOiAnbGlua2VkJyxcbiAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogZmFsc2UsXG4gICAgICBmb3JjZVBhcnNlOiBmYWxzZSxcbiAgICAgIGNhbGVuZGFyV2Vla3M6IHRydWUsXG4gICAgICBhdXRvY2xvc2U6IHRydWVcbiAgICB9KS5vbignY2hhbmdlRGF0ZScsIHRoaXMub25DaGFuZ2UpO1xuXG4gICAgdGhpcy5zZXREYXRlcyh0aGlzLnByb3BzKTtcbiAgfSxcblxuICBvbkNoYW5nZSgpe1xuICAgIHZhciBbc3RhcnREYXRlLCBlbmREYXRlXSA9IHRoaXMuZ2V0RGF0ZXMoKVxuICAgIGlmKCEoaXNTYW1lKHN0YXJ0RGF0ZSwgdGhpcy5wcm9wcy5zdGFydERhdGUpICYmXG4gICAgICAgICAgaXNTYW1lKGVuZERhdGUsIHRoaXMucHJvcHMuZW5kRGF0ZSkpKXtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh7c3RhcnREYXRlLCBlbmREYXRlfSk7XG4gICAgfVxuICB9LFxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtZGF0ZXBpY2tlciBpbnB1dC1ncm91cCBpbnB1dC1kYXRlcmFuZ2VcIiByZWY9XCJyYW5nZVBpY2tlclwiPiAgICAgICAgXG4gICAgICAgIDxpbnB1dCByZWY9XCJkcFBpY2tlcjFcIiB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImlucHV0LXNtIGZvcm0tY29udHJvbFwiIG5hbWU9XCJzdGFydFwiIC8+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImlucHV0LWdyb3VwLWFkZG9uXCI+dG88L3NwYW4+XG4gICAgICAgIDxpbnB1dCByZWY9XCJkcFBpY2tlcjJcIiB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImlucHV0LXNtIGZvcm0tY29udHJvbFwiIG5hbWU9XCJlbmRcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGlzU2FtZShkYXRlMSwgZGF0ZTIpe1xuICByZXR1cm4gbW9tZW50KGRhdGUxKS5pc1NhbWUoZGF0ZTIsICdkYXknKTtcbn1cblxuLyoqXG4qIENhbGVuZGFyIE5hdlxuKi9cbnZhciBDYWxlbmRhck5hdiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICByZW5kZXIoKSB7XG4gICAgbGV0IHt2YWx1ZX0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBkaXNwbGF5VmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnTU1NTSwgWVlZWScpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtcImdydi1jYWxlbmRhci1uYXYgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZX0gPlxuICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e3RoaXMubW92ZS5iaW5kKHRoaXMsIC0xKX0gY2xhc3NOYW1lPVwiYnRuIGJ0bi1vdXRsaW5lIGJ0bi1saW5rXCI+PGkgY2xhc3NOYW1lPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkXCI+e2Rpc3BsYXlWYWx1ZX08L3NwYW4+XG4gICAgICAgIDxidXR0b24gb25DbGljaz17dGhpcy5tb3ZlLmJpbmQodGhpcywgMSl9IGNsYXNzTmFtZT1cImJ0biBidG4tb3V0bGluZSBidG4tbGlua1wiPjxpIGNsYXNzTmFtZT1cImZhIGZhLWNoZXZyb24tcmlnaHRcIj48L2k+PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9LFxuXG4gIG1vdmUoYXQpe1xuICAgIGxldCB7dmFsdWV9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgbmV3VmFsdWUgPSBtb21lbnQodmFsdWUpLmFkZChhdCwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgdGhpcy5wcm9wcy5vblZhbHVlQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgfVxufSk7XG5cbkNhbGVuZGFyTmF2LmdldE1vbnRoUmFuZ2UgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIGxldCBzdGFydERhdGUgPSBtb21lbnQodmFsdWUpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCk7XG4gIGxldCBlbmREYXRlID0gbW9tZW50KHZhbHVlKS5lbmRPZignbW9udGgnKS50b0RhdGUoKTtcbiAgcmV0dXJuIFtzdGFydERhdGUsIGVuZERhdGVdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRlUmFuZ2VQaWNrZXI7XG5leHBvcnQge0NhbGVuZGFyTmF2LCBEYXRlUmFuZ2VQaWNrZXJ9O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvZGF0ZVBpY2tlci5qc3hcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cy5BcHAgPSByZXF1aXJlKCcuL2FwcC5qc3gnKTtcbm1vZHVsZS5leHBvcnRzLkxvZ2luID0gcmVxdWlyZSgnLi9sb2dpbi5qc3gnKTtcbm1vZHVsZS5leHBvcnRzLk5ld1VzZXIgPSByZXF1aXJlKCcuL25ld1VzZXIuanN4Jyk7XG5tb2R1bGUuZXhwb3J0cy5Ob2RlcyA9IHJlcXVpcmUoJy4vbm9kZXMvbWFpbi5qc3gnKTtcbm1vZHVsZS5leHBvcnRzLlNlc3Npb25zID0gcmVxdWlyZSgnLi9zZXNzaW9ucy9tYWluLmpzeCcpO1xubW9kdWxlLmV4cG9ydHMuQ3VycmVudFNlc3Npb25Ib3N0ID0gcmVxdWlyZSgnLi9jdXJyZW50U2Vzc2lvbi9tYWluLmpzeCcpO1xubW9kdWxlLmV4cG9ydHMuTm90Rm91bmQgPSByZXF1aXJlKCcuL2Vycm9yUGFnZS5qc3gnKS5Ob3RGb3VuZDtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21wb25lbnRzL2luZGV4LmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgJCA9IHJlcXVpcmUoJ2pRdWVyeScpO1xudmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIExpbmtlZFN0YXRlTWl4aW4gPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtbGlua2VkLXN0YXRlLW1peGluJyk7XG52YXIge2FjdGlvbnMsIGdldHRlcnN9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvdXNlcicpO1xudmFyIEdvb2dsZUF1dGhJbmZvID0gcmVxdWlyZSgnLi9nb29nbGVBdXRoTG9nbycpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcblxudmFyIExvZ2luSW5wdXRGb3JtID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG4gIG1peGluczogW0xpbmtlZFN0YXRlTWl4aW5dLFxuXG4gIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcjogJycsXG4gICAgICBwYXNzd29yZDogJycsXG4gICAgICB0b2tlbjogJydcbiAgICB9XG4gIH0sXG5cbiAgb25DbGljazogZnVuY3Rpb24oZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHRoaXMucHJvcHMub25DbGljayh0aGlzLnN0YXRlKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNWYWxpZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyICRmb3JtID0gJCh0aGlzLnJlZnMuZm9ybSk7XG4gICAgcmV0dXJuICRmb3JtLmxlbmd0aCA9PT0gMCB8fCAkZm9ybS52YWxpZCgpO1xuICB9LFxuXG4gIHJlbmRlcigpIHtcbiAgICBsZXQge2lzUHJvY2Vzc2luZywgaXNGYWlsZWQsIG1lc3NhZ2UgfSA9IHRoaXMucHJvcHMuYXR0ZW1wO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxmb3JtIHJlZj1cImZvcm1cIiBjbGFzc05hbWU9XCJncnYtbG9naW4taW5wdXQtZm9ybVwiPlxuICAgICAgICA8aDM+IFdlbGNvbWUgdG8gVGVsZXBvcnQgPC9oMz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpbnB1dCBhdXRvRm9jdXMgdmFsdWVMaW5rPXt0aGlzLmxpbmtTdGF0ZSgndXNlcicpfSBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2wgcmVxdWlyZWRcIiBwbGFjZWhvbGRlcj1cIlVzZXIgbmFtZVwiIG5hbWU9XCJ1c2VyTmFtZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8aW5wdXQgdmFsdWVMaW5rPXt0aGlzLmxpbmtTdGF0ZSgncGFzc3dvcmQnKX0gdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sIHJlcXVpcmVkXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpbnB1dCB2YWx1ZUxpbms9e3RoaXMubGlua1N0YXRlKCd0b2tlbicpfSBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2wgcmVxdWlyZWRcIiBuYW1lPVwidG9rZW5cIiBwbGFjZWhvbGRlcj1cIlR3byBmYWN0b3IgdG9rZW4gKEdvb2dsZSBBdXRoZW50aWNhdG9yKVwiLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e3RoaXMub25DbGlja30gZGlzYWJsZWQ9e2lzUHJvY2Vzc2luZ30gdHlwZT1cInN1Ym1pdFwiIGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeSBibG9jayBmdWxsLXdpZHRoIG0tYlwiPkxvZ2luPC9idXR0b24+XG4gICAgICAgICAgeyBpc0ZhaWxlZCA/ICg8bGFiZWwgY2xhc3NOYW1lPVwiZXJyb3JcIj57bWVzc2FnZX08L2xhYmVsPikgOiBudWxsIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgKTtcbiAgfVxufSlcblxudmFyIExvZ2luID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG4gIG1peGluczogW3JlYWN0b3IuUmVhY3RNaXhpbl0sXG5cbiAgZ2V0RGF0YUJpbmRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRlbXA6IGdldHRlcnMubG9naW5BdHRlbXBcbiAgICB9XG4gIH0sXG5cbiAgb25DbGljayhpbnB1dERhdGEpe1xuICAgIHZhciBsb2MgPSB0aGlzLnByb3BzLmxvY2F0aW9uO1xuICAgIHZhciByZWRpcmVjdCA9IGNmZy5yb3V0ZXMuYXBwO1xuXG4gICAgaWYobG9jLnN0YXRlICYmIGxvYy5zdGF0ZS5yZWRpcmVjdFRvKXtcbiAgICAgIHJlZGlyZWN0ID0gbG9jLnN0YXRlLnJlZGlyZWN0VG87XG4gICAgfVxuXG4gICAgYWN0aW9ucy5sb2dpbihpbnB1dERhdGEsIHJlZGlyZWN0KTtcbiAgfSxcblxuICByZW5kZXIoKSB7ICAgIFxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1sb2dpbiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1sb2dvLXRwcnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtY29udGVudCBncnYtZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICA8TG9naW5JbnB1dEZvcm0gYXR0ZW1wPXt0aGlzLnN0YXRlLmF0dGVtcH0gb25DbGljaz17dGhpcy5vbkNsaWNrfS8+XG4gICAgICAgICAgICA8R29vZ2xlQXV0aEluZm8vPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtbG9naW4taW5mb1wiPlxuICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYSBmYS1xdWVzdGlvblwiPjwvaT5cbiAgICAgICAgICAgICAgPHN0cm9uZz5OZXcgQWNjb3VudCBvciBmb3Jnb3QgcGFzc3dvcmQ/PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxkaXY+QXNrIGZvciBhc3Npc3RhbmNlIGZyb20geW91ciBDb21wYW55IGFkbWluaXN0cmF0b3I8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExvZ2luO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvbG9naW4uanN4XG4gKiovIiwidmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciByZWFjdG9yID0gcmVxdWlyZSgnYXBwL3JlYWN0b3InKTtcbnZhciB7IEluZGV4TGluayB9ID0gcmVxdWlyZSgncmVhY3Qtcm91dGVyJyk7XG52YXIgZ2V0dGVycyA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL3VzZXIvZ2V0dGVycycpO1xudmFyIGNmZyA9IHJlcXVpcmUoJ2FwcC9jb25maWcnKTtcblxudmFyIG1lbnVJdGVtcyA9IFtcbiAge2ljb246ICdmYSBmYS1jb2dzJywgdG86IGNmZy5yb3V0ZXMubm9kZXMsIHRpdGxlOiAnTm9kZXMnfSxcbiAge2ljb246ICdmYSBmYS1zaXRlbWFwJywgdG86IGNmZy5yb3V0ZXMuc2Vzc2lvbnMsIHRpdGxlOiAnU2Vzc2lvbnMnfVxuXTtcblxudmFyIE5hdkxlZnRCYXIgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cbiAgcmVuZGVyOiBmdW5jdGlvbigpe1xuICAgIHZhciBpdGVtcyA9IG1lbnVJdGVtcy5tYXAoKGksIGluZGV4KT0+e1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuY29udGV4dC5yb3V0ZXIuaXNBY3RpdmUoaS50bykgPyAnYWN0aXZlJyA6ICcnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGxpIGtleT17aW5kZXh9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSB0aXRsZT17aS50aXRsZX0+XG4gICAgICAgICAgPEluZGV4TGluayB0bz17aS50b30+XG4gICAgICAgICAgICA8aSBjbGFzc05hbWU9e2kuaWNvbn0gLz5cbiAgICAgICAgICA8L0luZGV4TGluaz5cbiAgICAgICAgPC9saT5cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdGVtcy5wdXNoKChcbiAgICAgIDxsaSBrZXk9e2l0ZW1zLmxlbmd0aH0gdGl0bGU9XCJoZWxwXCI+XG4gICAgICAgIDxhIGhyZWY9e2NmZy5oZWxwVXJsfSB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYSBmYS1xdWVzdGlvblwiIC8+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+KSk7XG5cbiAgICBpdGVtcy5wdXNoKChcbiAgICAgIDxsaSBrZXk9e2l0ZW1zLmxlbmd0aH0gdGl0bGU9XCJsb2dvdXRcIj5cbiAgICAgICAgPGEgaHJlZj17Y2ZnLnJvdXRlcy5sb2dvdXR9PlxuICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhIGZhLXNpZ24tb3V0XCIgc3R5bGU9e3ttYXJnaW5SaWdodDogMH19PjwvaT5cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT5cbiAgICApKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8bmF2IGNsYXNzTmFtZT0nZ3J2LW5hdiBuYXZiYXItZGVmYXVsdCcgcm9sZT0nbmF2aWdhdGlvbic+XG4gICAgICAgIDx1bCBjbGFzc05hbWU9J25hdiB0ZXh0LWNlbnRlcicgaWQ9J3NpZGUtbWVudSc+XG4gICAgICAgICAgPGxpIHRpdGxlPVwiY3VycmVudCB1c2VyXCI+PGRpdiBjbGFzc05hbWU9XCJncnYtY2lyY2xlIHRleHQtdXBwZXJjYXNlXCI+PHNwYW4+e2dldFVzZXJOYW1lTGV0dGVyKCl9PC9zcGFuPjwvZGl2PjwvbGk+XG4gICAgICAgICAge2l0ZW1zfVxuICAgICAgICA8L3VsPlxuICAgICAgPC9uYXY+XG4gICAgKTtcbiAgfVxufSk7XG5cbk5hdkxlZnRCYXIuY29udGV4dFR5cGVzID0ge1xuICByb3V0ZXI6IFJlYWN0LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxufVxuXG5mdW5jdGlvbiBnZXRVc2VyTmFtZUxldHRlcigpe1xuICB2YXIge3Nob3J0RGlzcGxheU5hbWV9ID0gcmVhY3Rvci5ldmFsdWF0ZShnZXR0ZXJzLnVzZXIpO1xuICByZXR1cm4gc2hvcnREaXNwbGF5TmFtZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBOYXZMZWZ0QmFyO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvbmF2TGVmdEJhci5qc3hcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyICQgPSByZXF1aXJlKCdqUXVlcnknKTtcbnZhciByZWFjdG9yID0gcmVxdWlyZSgnYXBwL3JlYWN0b3InKTtcbnZhciB7YWN0aW9ucywgZ2V0dGVyc30gPSByZXF1aXJlKCdhcHAvbW9kdWxlcy9pbnZpdGUnKTtcbnZhciB1c2VyTW9kdWxlID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvdXNlcicpO1xudmFyIExpbmtlZFN0YXRlTWl4aW4gPSByZXF1aXJlKCdyZWFjdC1hZGRvbnMtbGlua2VkLXN0YXRlLW1peGluJyk7XG52YXIgR29vZ2xlQXV0aEluZm8gPSByZXF1aXJlKCcuL2dvb2dsZUF1dGhMb2dvJyk7XG52YXIge0V4cGlyZWRJbnZpdGV9ID0gcmVxdWlyZSgnLi9lcnJvclBhZ2UnKTtcblxudmFyIEludml0ZUlucHV0Rm9ybSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBtaXhpbnM6IFtMaW5rZWRTdGF0ZU1peGluXSxcblxuICBjb21wb25lbnREaWRNb3VudCgpe1xuICAgICQodGhpcy5yZWZzLmZvcm0pLnZhbGlkYXRlKHtcbiAgICAgIHJ1bGVzOntcbiAgICAgICAgcGFzc3dvcmQ6e1xuICAgICAgICAgIG1pbmxlbmd0aDogNixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwYXNzd29yZENvbmZpcm1lZDp7XG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgZXF1YWxUbzogdGhpcy5yZWZzLnBhc3N3b3JkXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIG1lc3NhZ2VzOiB7XG4gIFx0XHRcdHBhc3N3b3JkQ29uZmlybWVkOiB7XG4gIFx0XHRcdFx0bWlubGVuZ3RoOiAkLnZhbGlkYXRvci5mb3JtYXQoJ0VudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXJzJyksXG4gIFx0XHRcdFx0ZXF1YWxUbzogJ0VudGVyIHRoZSBzYW1lIHBhc3N3b3JkIGFzIGFib3ZlJ1xuICBcdFx0XHR9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMucHJvcHMuaW52aXRlLnVzZXIsXG4gICAgICBwc3c6ICcnLFxuICAgICAgcHN3Q29uZmlybWVkOiAnJyxcbiAgICAgIHRva2VuOiAnJ1xuICAgIH1cbiAgfSxcblxuICBvbkNsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICB1c2VyTW9kdWxlLmFjdGlvbnMuc2lnblVwKHtcbiAgICAgICAgbmFtZTogdGhpcy5zdGF0ZS5uYW1lLFxuICAgICAgICBwc3c6IHRoaXMuc3RhdGUucHN3LFxuICAgICAgICB0b2tlbjogdGhpcy5zdGF0ZS50b2tlbixcbiAgICAgICAgaW52aXRlVG9rZW46IHRoaXMucHJvcHMuaW52aXRlLmludml0ZV90b2tlbn0pO1xuICAgIH1cbiAgfSxcblxuICBpc1ZhbGlkKCkge1xuICAgIHZhciAkZm9ybSA9ICQodGhpcy5yZWZzLmZvcm0pO1xuICAgIHJldHVybiAkZm9ybS5sZW5ndGggPT09IDAgfHwgJGZvcm0udmFsaWQoKTtcbiAgfSxcblxuICByZW5kZXIoKSB7XG4gICAgbGV0IHtpc1Byb2Nlc3NpbmcsIGlzRmFpbGVkLCBtZXNzYWdlIH0gPSB0aGlzLnByb3BzLmF0dGVtcDtcbiAgICByZXR1cm4gKFxuICAgICAgPGZvcm0gcmVmPVwiZm9ybVwiIGNsYXNzTmFtZT1cImdydi1pbnZpdGUtaW5wdXQtZm9ybVwiPlxuICAgICAgICA8aDM+IEdldCBzdGFydGVkIHdpdGggVGVsZXBvcnQgPC9oMz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB2YWx1ZUxpbms9e3RoaXMubGlua1N0YXRlKCduYW1lJyl9XG4gICAgICAgICAgICAgIG5hbWU9XCJ1c2VyTmFtZVwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVXNlciBuYW1lXCIvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgICB2YWx1ZUxpbms9e3RoaXMubGlua1N0YXRlKCdwc3cnKX1cbiAgICAgICAgICAgICAgcmVmPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICBuYW1lPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB2YWx1ZUxpbms9e3RoaXMubGlua1N0YXRlKCdwc3dDb25maXJtZWQnKX1cbiAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbmFtZT1cInBhc3N3b3JkQ29uZmlybWVkXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQYXNzd29yZCBjb25maXJtXCIvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG5hbWU9XCJ0b2tlblwiXG4gICAgICAgICAgICAgIHZhbHVlTGluaz17dGhpcy5saW5rU3RhdGUoJ3Rva2VuJyl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHdvIGZhY3RvciB0b2tlbiAoR29vZ2xlIEF1dGhlbnRpY2F0b3IpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBkaXNhYmxlZD17aXNQcm9jZXNzaW5nfSBjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnkgYmxvY2sgZnVsbC13aWR0aCBtLWJcIiBvbkNsaWNrPXt0aGlzLm9uQ2xpY2t9ID5TaWduIHVwPC9idXR0b24+XG4gICAgICAgICAgeyBpc0ZhaWxlZCA/ICg8bGFiZWwgY2xhc3NOYW1lPVwiZXJyb3JcIj57bWVzc2FnZX08L2xhYmVsPikgOiBudWxsIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgKTtcbiAgfVxufSlcblxudmFyIEludml0ZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBtaXhpbnM6IFtyZWFjdG9yLlJlYWN0TWl4aW5dLFxuXG4gIGdldERhdGFCaW5kaW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW52aXRlOiBnZXR0ZXJzLmludml0ZSxcbiAgICAgIGF0dGVtcDogZ2V0dGVycy5hdHRlbXAsXG4gICAgICBmZXRjaGluZ0ludml0ZTogZ2V0dGVycy5mZXRjaGluZ0ludml0ZVxuICAgIH1cbiAgfSxcblxuICBjb21wb25lbnREaWRNb3VudCgpe1xuICAgIGFjdGlvbnMuZmV0Y2hJbnZpdGUodGhpcy5wcm9wcy5wYXJhbXMuaW52aXRlVG9rZW4pO1xuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgbGV0IHtmZXRjaGluZ0ludml0ZSwgaW52aXRlLCBhdHRlbXB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmKGZldGNoaW5nSW52aXRlLmlzRmFpbGVkKXtcbiAgICAgIHJldHVybiA8RXhwaXJlZEludml0ZS8+XG4gICAgfVxuXG4gICAgaWYoIWludml0ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWludml0ZSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1sb2dvLXRwcnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtY29udGVudCBncnYtZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICA8SW52aXRlSW5wdXRGb3JtIGF0dGVtcD17YXR0ZW1wfSBpbnZpdGU9e2ludml0ZS50b0pTKCl9Lz5cbiAgICAgICAgICAgIDxHb29nbGVBdXRoSW5mby8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtZmxleC1jb2x1bW4gZ3J2LWludml0ZS1iYXJjb2RlXCI+XG4gICAgICAgICAgICA8aDQ+U2NhbiBiYXIgY29kZSBmb3IgYXV0aCB0b2tlbiA8YnIvPiA8c21hbGw+U2NhbiBiZWxvdyB0byBnZW5lcmF0ZSB5b3VyIHR3byBmYWN0b3IgdG9rZW48L3NtYWxsPjwvaDQ+XG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImltZy10aHVtYm5haWxcIiBzcmM9eyBgZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7aW52aXRlLmdldCgncXInKX1gIH0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnZpdGU7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tcG9uZW50cy9uZXdVc2VyLmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgcmVhY3RvciA9IHJlcXVpcmUoJ2FwcC9yZWFjdG9yJyk7XG52YXIgdXNlckdldHRlcnMgPSByZXF1aXJlKCdhcHAvbW9kdWxlcy91c2VyL2dldHRlcnMnKTtcbnZhciBub2RlR2V0dGVycyA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL25vZGVzL2dldHRlcnMnKTtcbnZhciBOb2RlTGlzdCA9IHJlcXVpcmUoJy4vbm9kZUxpc3QuanN4Jyk7XG5cbnZhciBOb2RlcyA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBtaXhpbnM6IFtyZWFjdG9yLlJlYWN0TWl4aW5dLFxuXG4gIGdldERhdGFCaW5kaW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZVJlY29yZHM6IG5vZGVHZXR0ZXJzLm5vZGVMaXN0VmlldyxcbiAgICAgIHVzZXI6IHVzZXJHZXR0ZXJzLnVzZXJcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm9kZVJlY29yZHMgPSB0aGlzLnN0YXRlLm5vZGVSZWNvcmRzO1xuICAgIHZhciBsb2dpbnMgPSB0aGlzLnN0YXRlLnVzZXIubG9naW5zO1xuICAgIHJldHVybiAoIDxOb2RlTGlzdCBub2RlUmVjb3Jkcz17bm9kZVJlY29yZHN9IGxvZ2lucz17bG9naW5zfS8+ICk7XG4gIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVzO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvbm9kZXMvbWFpbi5qc3hcbiAqKi8iLCJ2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIHJlYWN0b3IgPSByZXF1aXJlKCdhcHAvcmVhY3RvcicpO1xudmFyIFB1cmVSZW5kZXJNaXhpbiA9IHJlcXVpcmUoJ3JlYWN0LWFkZG9ucy1wdXJlLXJlbmRlci1taXhpbicpO1xudmFyIHtsYXN0TWVzc2FnZX0gPSByZXF1aXJlKCdhcHAvbW9kdWxlcy9ub3RpZmljYXRpb25zL2dldHRlcnMnKTtcbnZhciB7VG9hc3RDb250YWluZXIsIFRvYXN0TWVzc2FnZX0gPSByZXF1aXJlKFwicmVhY3QtdG9hc3RyXCIpO1xudmFyIFRvYXN0TWVzc2FnZUZhY3RvcnkgPSBSZWFjdC5jcmVhdGVGYWN0b3J5KFRvYXN0TWVzc2FnZS5hbmltYXRpb24pO1xuXG52YXIgTm90aWZpY2F0aW9uSG9zdCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICBtaXhpbnM6IFtcbiAgICByZWFjdG9yLlJlYWN0TWl4aW4sIFB1cmVSZW5kZXJNaXhpblxuICBdLFxuXG4gIGdldERhdGFCaW5kaW5ncygpIHtcbiAgICByZXR1cm4ge21zZzogbGFzdE1lc3NhZ2V9XG4gIH0sXG5cbiAgdXBkYXRlKG1zZykge1xuICAgIGlmIChtc2cpIHtcbiAgICAgIGlmIChtc2cuaXNFcnJvcikge1xuICAgICAgICB0aGlzLnJlZnMuY29udGFpbmVyLmVycm9yKG1zZy50ZXh0LCBtc2cudGl0bGUpO1xuICAgICAgfSBlbHNlIGlmIChtc2cuaXNXYXJuaW5nKSB7XG4gICAgICAgIHRoaXMucmVmcy5jb250YWluZXIud2FybmluZyhtc2cudGV4dCwgbXNnLnRpdGxlKTtcbiAgICAgIH0gZWxzZSBpZiAobXNnLmlzU3VjY2Vzcykge1xuICAgICAgICB0aGlzLnJlZnMuY29udGFpbmVyLnN1Y2Nlc3MobXNnLnRleHQsIG1zZy50aXRsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZnMuY29udGFpbmVyLmluZm8obXNnLnRleHQsIG1zZy50aXRsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHJlYWN0b3Iub2JzZXJ2ZShsYXN0TWVzc2FnZSwgdGhpcy51cGRhdGUpXG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgcmVhY3Rvci51bm9ic2VydmUobGFzdE1lc3NhZ2UsIHRoaXMudXBkYXRlKTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxUb2FzdENvbnRhaW5lciByZWY9XCJjb250YWluZXJcIiB0b2FzdE1lc3NhZ2VGYWN0b3J5PXtUb2FzdE1lc3NhZ2VGYWN0b3J5fSBjbGFzc05hbWU9XCJ0b2FzdC10b3AtcmlnaHRcIi8+XG4gICAgKTtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTm90aWZpY2F0aW9uSG9zdDtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21wb25lbnRzL25vdGlmaWNhdGlvbkhvc3QuanN4XG4gKiovIiwidmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciB7VGFibGUsIENvbHVtbiwgQ2VsbCwgVGV4dENlbGx9ID0gcmVxdWlyZSgnYXBwL2NvbXBvbmVudHMvdGFibGUuanN4Jyk7XG52YXIge0J1dHRvbkNlbGwsIFVzZXJzQ2VsbCwgRW1wdHlMaXN0LCBOb2RlQ2VsbCwgRGF0ZUNyZWF0ZWRDZWxsfSA9IHJlcXVpcmUoJy4vbGlzdEl0ZW1zJyk7XG5cbnZhciBBY3RpdmVTZXNzaW9uTGlzdCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICBsZXQgZGF0YSA9IHRoaXMucHJvcHMuZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLmFjdGl2ZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LXNlc3Npb25zLWFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDE+IEFjdGl2ZSBTZXNzaW9ucyA8L2gxPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtY29udGVudFwiPlxuICAgICAgICAgIHtkYXRhLmxlbmd0aCA9PT0gMCA/IDxFbXB0eUxpc3QgdGV4dD1cIllvdSBoYXZlIG5vIGFjdGl2ZSBzZXNzaW9ucy5cIi8+IDpcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiXCI+XG4gICAgICAgICAgICAgIDxUYWJsZSByb3dDb3VudD17ZGF0YS5sZW5ndGh9IGNsYXNzTmFtZT1cInRhYmxlLXN0cmlwZWRcIj5cbiAgICAgICAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICAgICAgICBjb2x1bW5LZXk9XCJzaWRcIlxuICAgICAgICAgICAgICAgICAgaGVhZGVyPXs8Q2VsbD4gU2Vzc2lvbiBJRCA8L0NlbGw+IH1cbiAgICAgICAgICAgICAgICAgIGNlbGw9ezxUZXh0Q2VsbCBkYXRhPXtkYXRhfS8+IH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxDb2x1bW5cbiAgICAgICAgICAgICAgICAgIGhlYWRlcj17PENlbGw+IDwvQ2VsbD4gfVxuICAgICAgICAgICAgICAgICAgY2VsbD17XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25DZWxsIGRhdGE9e2RhdGF9IC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICAgICAgICBoZWFkZXI9ezxDZWxsPiBOb2RlIDwvQ2VsbD4gfVxuICAgICAgICAgICAgICAgICAgY2VsbD17PE5vZGVDZWxsIGRhdGE9e2RhdGF9IC8+IH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxDb2x1bW5cbiAgICAgICAgICAgICAgICAgIGNvbHVtbktleT1cImNyZWF0ZWRcIlxuICAgICAgICAgICAgICAgICAgaGVhZGVyPXs8Q2VsbD4gQ3JlYXRlZCA8L0NlbGw+IH1cbiAgICAgICAgICAgICAgICAgIGNlbGw9ezxEYXRlQ3JlYXRlZENlbGwgZGF0YT17ZGF0YX0vPiB9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICAgICAgICBoZWFkZXI9ezxDZWxsPiBVc2VycyA8L0NlbGw+IH1cbiAgICAgICAgICAgICAgICAgIGNlbGw9ezxVc2Vyc0NlbGwgZGF0YT17ZGF0YX0gLz4gfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvVGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBY3RpdmVTZXNzaW9uTGlzdDtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9jb21wb25lbnRzL3Nlc3Npb25zL2FjdGl2ZVNlc3Npb25MaXN0LmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgcmVhY3RvciA9IHJlcXVpcmUoJ2FwcC9yZWFjdG9yJyk7XG52YXIge2dldHRlcnN9ID0gcmVxdWlyZSgnYXBwL21vZHVsZXMvc2Vzc2lvbnMnKTtcbnZhciBTdG9yZWRTZXNzaW9uTGlzdCA9IHJlcXVpcmUoJy4vc3RvcmVkU2Vzc2lvbkxpc3QuanN4Jyk7XG52YXIgQWN0aXZlU2Vzc2lvbkxpc3QgPSByZXF1aXJlKCcuL2FjdGl2ZVNlc3Npb25MaXN0LmpzeCcpO1xuXG52YXIgU2Vzc2lvbnMgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gIG1peGluczogW3JlYWN0b3IuUmVhY3RNaXhpbl0sXG5cbiAgZ2V0RGF0YUJpbmRpbmdzKCkge1xuICAgIHJldHVybiB7ZGF0YTogZ2V0dGVycy5zZXNzaW9uc1ZpZXd9XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICBsZXQge2RhdGF9ID0gdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtc2Vzc2lvbnMgZ3J2LXBhZ2VcIj5cbiAgICAgICAgPEFjdGl2ZVNlc3Npb25MaXN0IGRhdGE9e2RhdGF9Lz5cbiAgICAgICAgPGhyIGNsYXNzTmFtZT1cImdydi1kaXZpZGVyXCIvPlxuICAgICAgICA8U3RvcmVkU2Vzc2lvbkxpc3QgZGF0YT17ZGF0YX0vPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2Vzc2lvbnM7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9hcHAvY29tcG9uZW50cy9zZXNzaW9ucy9tYWluLmpzeFxuICoqLyIsInZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgeyBhY3Rpb25zfSA9IHJlcXVpcmUoJ2FwcC9tb2R1bGVzL3Nlc3Npb25zJyk7XG52YXIgTGlua2VkU3RhdGVNaXhpbiA9IHJlcXVpcmUoJ3JlYWN0LWFkZG9ucy1saW5rZWQtc3RhdGUtbWl4aW4nKTtcbnZhciB7VGFibGUsIENvbHVtbiwgQ2VsbCwgVGV4dENlbGwsIFNvcnRIZWFkZXJDZWxsLCBTb3J0VHlwZXN9ID0gcmVxdWlyZSgnYXBwL2NvbXBvbmVudHMvdGFibGUuanN4Jyk7XG52YXIge0J1dHRvbkNlbGwsIFNpbmdsZVVzZXJDZWxsLCBEYXRlQ3JlYXRlZENlbGx9ID0gcmVxdWlyZSgnLi9saXN0SXRlbXMnKTtcbnZhciB7RGF0ZVJhbmdlUGlja2VyLCBDYWxlbmRhck5hdn0gPSByZXF1aXJlKCcuLy4uL2RhdGVQaWNrZXIuanN4Jyk7XG52YXIgbW9tZW50ID0gIHJlcXVpcmUoJ21vbWVudCcpO1xudmFyIHttb250aFJhbmdlfSA9IHJlcXVpcmUoJ2FwcC9jb21tb24vZGF0ZVV0aWxzJyk7XG52YXIge2lzTWF0Y2h9ID0gcmVxdWlyZSgnYXBwL2NvbW1vbi9vYmplY3RVdGlscycpO1xudmFyIF8gPSByZXF1aXJlKCdfJyk7XG5cbnZhciBBcmNoaXZlZFNlc3Npb25zID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG4gIG1peGluczogW0xpbmtlZFN0YXRlTWl4aW5dLFxuXG4gIGdldEluaXRpYWxTdGF0ZSgpe1xuICAgIGxldCBbc3RhcnREYXRlLCBlbmREYXRlXSA9IG1vbnRoUmFuZ2UobmV3IERhdGUoKSk7XG4gICAgdGhpcy5zZWFyY2hhYmxlUHJvcHMgPSBbJ3NlcnZlcklwJywgJ2NyZWF0ZWQnLCAnc2lkJywgJ2xvZ2luJ107XG4gICAgcmV0dXJuIHsgZmlsdGVyOiAnJywgY29sU29ydERpcnM6IHtjcmVhdGVkOiAnQVNDJ30sIHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9O1xuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCgpe1xuICAgIGFjdGlvbnMuZmV0Y2hTZXNzaW9ucyh0aGlzLnN0YXRlLnN0YXJ0RGF0ZSwgdGhpcy5zdGF0ZS5lbmREYXRlKTtcbiAgfSxcblxuICBzZXREYXRlc0FuZFJlZmV0Y2goc3RhcnREYXRlLCBlbmREYXRlKXtcbiAgICBhY3Rpb25zLmZldGNoU2Vzc2lvbnMoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICB0aGlzLnN0YXRlLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICB0aGlzLnN0YXRlLmVuZERhdGUgPSBlbmREYXRlO1xuICAgIHRoaXMuc2V0U3RhdGUodGhpcy5zdGF0ZSk7XG4gIH0sXG5cbiAgb25Tb3J0Q2hhbmdlKGNvbHVtbktleSwgc29ydERpcikge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgIGNvbFNvcnREaXJzOiB7IFtjb2x1bW5LZXldOiBzb3J0RGlyIH1cbiAgICB9KTtcbiAgfSxcblxuICBvblJhbmdlUGlja2VyQ2hhbmdlKHtzdGFydERhdGUsIGVuZERhdGV9KXtcbiAgICB0aGlzLnNldERhdGVzQW5kUmVmZXRjaChzdGFydERhdGUsIGVuZERhdGUpO1xuICB9LFxuXG4gIG9uQ2FsZW5kYXJOYXZDaGFuZ2UobmV3VmFsdWUpe1xuICAgIGxldCBbc3RhcnREYXRlLCBlbmREYXRlXSA9IG1vbnRoUmFuZ2UobmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0RGF0ZXNBbmRSZWZldGNoKHN0YXJ0RGF0ZSwgZW5kRGF0ZSk7XG4gIH0sXG5cbiAgc2VhcmNoQW5kRmlsdGVyQ2IodGFyZ2V0VmFsdWUsIHNlYXJjaFZhbHVlLCBwcm9wTmFtZSl7XG4gICAgaWYocHJvcE5hbWUgPT09ICdjcmVhdGVkJyl7XG4gICAgICB2YXIgZGlzcGxheURhdGUgPSBtb21lbnQodGFyZ2V0VmFsdWUpLmZvcm1hdCgnbCBMVFMnKS50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgICAgcmV0dXJuIGRpc3BsYXlEYXRlLmluZGV4T2Yoc2VhcmNoVmFsdWUpICE9PSAtMTtcbiAgICB9XG4gIH0sXG5cbiAgc29ydEFuZEZpbHRlcihkYXRhKXtcbiAgICB2YXIgZmlsdGVyZWQgPSBkYXRhLmZpbHRlcihvYmo9PlxuICAgICAgaXNNYXRjaChvYmosIHRoaXMuc3RhdGUuZmlsdGVyLCB7XG4gICAgICAgIHNlYXJjaGFibGVQcm9wczogdGhpcy5zZWFyY2hhYmxlUHJvcHMsXG4gICAgICAgIGNiOiB0aGlzLnNlYXJjaEFuZEZpbHRlckNiXG4gICAgICB9KSk7XG5cbiAgICB2YXIgY29sdW1uS2V5ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5zdGF0ZS5jb2xTb3J0RGlycylbMF07XG4gICAgdmFyIHNvcnREaXIgPSB0aGlzLnN0YXRlLmNvbFNvcnREaXJzW2NvbHVtbktleV07XG4gICAgdmFyIHNvcnRlZCA9IF8uc29ydEJ5KGZpbHRlcmVkLCBjb2x1bW5LZXkpO1xuICAgIGlmKHNvcnREaXIgPT09IFNvcnRUeXBlcy5BU0Mpe1xuICAgICAgc29ydGVkID0gc29ydGVkLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydGVkO1xuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgbGV0IHtzdGFydERhdGUsIGVuZERhdGV9ID0gdGhpcy5zdGF0ZTtcbiAgICBsZXQgZGF0YSA9IHRoaXMucHJvcHMuZGF0YS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5hY3RpdmUgJiYgbW9tZW50KGl0ZW0uY3JlYXRlZCkuaXNCZXR3ZWVuKHN0YXJ0RGF0ZSwgZW5kRGF0ZSkpO1xuICAgIGRhdGEgPSB0aGlzLnNvcnRBbmRGaWx0ZXIoZGF0YSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtc2Vzc2lvbnMtc3RvcmVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWhlYWRlclwiPlxuICAgICAgICAgIDxoMT4gQXJjaGl2ZWQgU2Vzc2lvbnMgPC9oMT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1mbGV4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdydi1mbGV4LXJvd1wiPlxuICAgICAgICAgICAgICA8RGF0ZVJhbmdlUGlja2VyIHN0YXJ0RGF0ZT17c3RhcnREYXRlfSBlbmREYXRlPXtlbmREYXRlfSBvbkNoYW5nZT17dGhpcy5vblJhbmdlUGlja2VyQ2hhbmdlfS8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWZsZXgtcm93XCI+XG4gICAgICAgICAgICAgIDxDYWxlbmRhck5hdiB2YWx1ZT17c3RhcnREYXRlfSBvblZhbHVlQ2hhbmdlPXt0aGlzLm9uQ2FsZW5kYXJOYXZDaGFuZ2V9Lz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncnYtc2VhcmNoXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHZhbHVlTGluaz17dGhpcy5saW5rU3RhdGUoJ2ZpbHRlcicpfSBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3J2LWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIlwiPlxuICAgICAgICAgICAgPFRhYmxlIHJvd0NvdW50PXtkYXRhLmxlbmd0aH0gY2xhc3NOYW1lPVwidGFibGUtc3RyaXBlZFwiPlxuICAgICAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICAgICAgY29sdW1uS2V5PVwic2lkXCJcbiAgICAgICAgICAgICAgICBoZWFkZXI9ezxDZWxsPiBTZXNzaW9uIElEIDwvQ2VsbD4gfVxuICAgICAgICAgICAgICAgIGNlbGw9ezxUZXh0Q2VsbCBkYXRhPXtkYXRhfS8+IH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPENvbHVtblxuICAgICAgICAgICAgICAgIGhlYWRlcj17PENlbGw+IDwvQ2VsbD4gfVxuICAgICAgICAgICAgICAgIGNlbGw9e1xuICAgICAgICAgICAgICAgICAgPEJ1dHRvbkNlbGwgZGF0YT17ZGF0YX0gLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxDb2x1bW5cbiAgICAgICAgICAgICAgICBjb2x1bW5LZXk9XCJjcmVhdGVkXCJcbiAgICAgICAgICAgICAgICBoZWFkZXI9e1xuICAgICAgICAgICAgICAgICAgPFNvcnRIZWFkZXJDZWxsXG4gICAgICAgICAgICAgICAgICAgIHNvcnREaXI9e3RoaXMuc3RhdGUuY29sU29ydERpcnMuY3JlYXRlZH1cbiAgICAgICAgICAgICAgICAgICAgb25Tb3J0Q2hhbmdlPXt0aGlzLm9uU29ydENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDcmVhdGVkXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNlbGw9ezxEYXRlQ3JlYXRlZENlbGwgZGF0YT17ZGF0YX0vPiB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxDb2x1bW5cbiAgICAgICAgICAgICAgICBoZWFkZXI9ezxDZWxsPiBVc2VyIDwvQ2VsbD4gfVxuICAgICAgICAgICAgICAgIGNlbGw9ezxTaW5nbGVVc2VyQ2VsbCBkYXRhPXtkYXRhfS8+IH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvVGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBcmNoaXZlZFNlc3Npb25zO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvYXBwL2NvbXBvbmVudHMvc2Vzc2lvbnMvc3RvcmVkU2Vzc2lvbkxpc3QuanN4XG4gKiovIiwidmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciByZW5kZXIgPSByZXF1aXJlKCdyZWFjdC1kb20nKS5yZW5kZXI7XG52YXIgeyBSb3V0ZXIsIFJvdXRlLCBSZWRpcmVjdCB9ID0gcmVxdWlyZSgncmVhY3Qtcm91dGVyJyk7XG52YXIgeyBBcHAsIExvZ2luLCBOb2RlcywgU2Vzc2lvbnMsIE5ld1VzZXIsIEN1cnJlbnRTZXNzaW9uSG9zdCwgTm90Rm91bmQgfSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cycpO1xudmFyIHtlbnN1cmVVc2VyfSA9IHJlcXVpcmUoJy4vbW9kdWxlcy91c2VyL2FjdGlvbnMnKTtcbnZhciBhdXRoID0gcmVxdWlyZSgnLi9hdXRoJyk7XG52YXIgc2Vzc2lvbiA9IHJlcXVpcmUoJy4vc2Vzc2lvbicpO1xudmFyIGNmZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG5cbnJlcXVpcmUoJy4vbW9kdWxlcycpO1xuXG4vLyBpbml0IHNlc3Npb25cbnNlc3Npb24uaW5pdCgpO1xuXG5mdW5jdGlvbiBoYW5kbGVMb2dvdXQoLypuZXh0U3RhdGUsIHJlcGxhY2UqLyl7XG4gIGF1dGgubG9nb3V0KCk7XG59XG5cbnJlbmRlcigoXG4gIDxSb3V0ZXIgaGlzdG9yeT17c2Vzc2lvbi5nZXRIaXN0b3J5KCl9PlxuICAgIDxSb3V0ZSBwYXRoPXtjZmcucm91dGVzLmxvZ2lufSBjb21wb25lbnQ9e0xvZ2lufS8+XG4gICAgPFJvdXRlIHBhdGg9e2NmZy5yb3V0ZXMubG9nb3V0fSBvbkVudGVyPXtoYW5kbGVMb2dvdXR9Lz5cbiAgICA8Um91dGUgcGF0aD17Y2ZnLnJvdXRlcy5uZXdVc2VyfSBjb21wb25lbnQ9e05ld1VzZXJ9Lz5cbiAgICA8UmVkaXJlY3QgZnJvbT17Y2ZnLnJvdXRlcy5hcHB9IHRvPXtjZmcucm91dGVzLm5vZGVzfS8+XG4gICAgPFJvdXRlIHBhdGg9e2NmZy5yb3V0ZXMuYXBwfSBjb21wb25lbnQ9e0FwcH0gb25FbnRlcj17ZW5zdXJlVXNlcn0gPlxuICAgICAgPFJvdXRlIHBhdGg9e2NmZy5yb3V0ZXMubm9kZXN9IGNvbXBvbmVudD17Tm9kZXN9Lz5cbiAgICAgIDxSb3V0ZSBwYXRoPXtjZmcucm91dGVzLmFjdGl2ZVNlc3Npb259IGNvbXBvbmVudHM9e3tDdXJyZW50U2Vzc2lvbkhvc3Q6IEN1cnJlbnRTZXNzaW9uSG9zdH19Lz5cbiAgICAgIDxSb3V0ZSBwYXRoPXtjZmcucm91dGVzLnNlc3Npb25zfSBjb21wb25lbnQ9e1Nlc3Npb25zfS8+XG4gICAgPC9Sb3V0ZT5cbiAgICA8Um91dGUgcGF0aD1cIipcIiBjb21wb25lbnQ9e05vdEZvdW5kfSAvPlxuICA8L1JvdXRlcj5cbiksIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwXCIpKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FwcC9pbmRleC5qc3hcbiAqKi8iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCFpc051bWJlcihuKSB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMuZXJyb3IgfHxcbiAgICAgICAgKGlzT2JqZWN0KHRoaXMuX2V2ZW50cy5lcnJvcikgJiYgIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKSB7XG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfVxuICAgICAgdGhyb3cgVHlwZUVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LicpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZXIpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspXG4gICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKylcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgdmFyIG07XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSAwO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKGVtaXR0ZXIuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gMTtcbiAgZWxzZVxuICAgIHJldCA9IGVtaXR0ZXIuX2V2ZW50c1t0eXBlXS5sZW5ndGg7XG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9ldmVudHMvZXZlbnRzLmpzXG4gKiogbW9kdWxlIGlkID0gMzEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDFcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IFRlcm1pbmFsO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwgXCJUZXJtaW5hbFwiXG4gKiogbW9kdWxlIGlkID0gNDI3XG4gKiogbW9kdWxlIGNodW5rcyA9IDFcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +webpackJsonp([1],{0:function(e,t,n){e.exports=n(297)},6:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(13),s=!0,i=window.__karma__;i&&1===i.config.args.length&&(s=!1);var a=new r.Reactor({debug:s});window.reactor=a,t["default"]=a,e.exports=t["default"]}).call(this)}finally{}},10:function(e,t,n){try{(function(){"use strict";function r(){var e="https:"==location.protocol?"wss://":"ws://",t=location.hostname+(location.port?":"+location.port:"");return""+e+t}t.__esModule=!0;var s=n(279),i=s.formatPattern,a={baseUrl:window.location.origin,helpUrl:"https://github.com/gravitational/teleport/blob/master/README.md",api:{renewTokenPath:"/v1/webapi/sessions/renew",nodesPath:"/v1/webapi/sites/-current-/nodes",sessionPath:"/v1/webapi/sessions",siteSessionPath:"/v1/webapi/sites/-current-/sessions/:sid",invitePath:"/v1/webapi/users/invites/:inviteToken",createUserPath:"/v1/webapi/users",sessionChunk:"/v1/webapi/sites/-current-/sessions/:sid/chunks?start=:start&end=:end",sessionChunkCountPath:"/v1/webapi/sites/-current-/sessions/:sid/chunkscount",getFetchSessionChunkUrl:function(e){var t=e.sid,n=e.start,r=e.end;return i(a.api.sessionChunk,{sid:t,start:n,end:r})},getFetchSessionLengthUrl:function(e){return i(a.api.sessionChunkCountPath,{sid:e})},getFetchSessionsUrl:function(e,t){var n={start:e.toISOString(),end:t.toISOString()},r=JSON.stringify(n),s=window.encodeURI(r);return"/v1/webapi/sites/-current-/events/sessions?filter="+s},getFetchSessionUrl:function(e){return i(a.api.siteSessionPath,{sid:e})},getTerminalSessionUrl:function(e){return i(a.api.siteSessionPath,{sid:e})},getInviteUrl:function(e){return i(a.api.invitePath,{inviteToken:e})},getEventStreamConnStr:function(e,t){var n=r();return n+"/v1/webapi/sites/-current-/sessions/"+t+"/events/stream?access_token="+e},getTtyConnStr:function(e){var t=e.token,n=e.serverId,s=e.login,i=e.sid,a=e.rows,o=e.cols,l={server_id:n,login:s,sid:i,term:{h:a,w:o}},c=JSON.stringify(l),u=window.encodeURI(c),f=r();return f+"/v1/webapi/sites/-current-/connect?access_token="+t+"¶ms="+u}},routes:{app:"/web",logout:"/web/logout",login:"/web/login",nodes:"/web/nodes",activeSession:"/web/sessions/:sid",newUser:"/web/newuser/:inviteToken",sessions:"/web/sessions",pageNotFound:"/web/notfound"},getActiveSessionRouteUrl:function(e){return i(a.routes.activeSession,{sid:e})}};t["default"]=a,e.exports=t["default"]}).call(this)}finally{}},17:function(e,t){"use strict";var n=function(e){var t,n={};if(!(e instanceof Object)||Array.isArray(e))throw new Error("keyMirror(...): Argument must be an object.");for(t in e)e.hasOwnProperty(t)&&(n[t]=t);return n};e.exports=n},24:function(e,t){e.exports=jQuery},25:function(e,t,n){try{(function(){"use strict";var t=n(37),r=t.browserHistory,s=t.createMemoryHistory,i="authData",a=s(),o={init:function(){var e=arguments.length<=0||void 0===arguments[0]?r:arguments[0];a=e},getHistory:function(){return a},setUserData:function(e){localStorage.setItem(i,JSON.stringify(e))},getUserData:function(){var e=localStorage.getItem(i);return e?JSON.parse(e):{}},clear:function(){localStorage.clear()}};e.exports=o}).call(this)}finally{}},30:function(e,t,n){try{(function(){"use strict";var t=n(24),r=n(25),s={put:function(e,t,n){return s.ajax({url:e,data:JSON.stringify(t),type:"PUT"},n)},post:function(e,t,n){return s.ajax({url:e,data:JSON.stringify(t),type:"POST"},n)},get:function(e){return s.ajax({url:e})},ajax:function(e){var n=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],s={type:"GET",dataType:"json",beforeSend:function(e){if(n){var t=r.getUserData(),s=t.token;e.setRequestHeader("Authorization","Bearer "+s)}}};return t.ajax(t.extend({},s,e))}};e.exports=s}).call(this)}finally{}},42:function(e,t,n){try{(function(){"use strict";function e(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}t.__esModule=!0;var r=Object.assign||function(e){for(var t=1;ta;a++){var o=e.map(function(e,n){return t.renderCell(e.props.cell,r({rowIndex:a,key:n,isHeader:!1},e.props))});i.push(s.createElement("tr",{key:a},o))}return s.createElement("tbody",null,i)},renderCell:function(e,t){var n=null;return s.isValidElement(e)?n=s.cloneElement(e,t):"function"==typeof e&&(n=e(t)),n},render:function(){var e=[];s.Children.forEach(this.props.children,function(t){if(null!=t){if("GrvTableColumn"!==t.type.displayName)throw"Should be GrvTableColumn";e.push(t)}});var t="table "+this.props.className;return s.createElement("table",{className:t},this.renderHeader(e),this.renderBody(e))}}),f=s.createClass({displayName:"GrvTableColumn",render:function(){throw new Error("Component should never render")}});t["default"]=u,t.Column=f,t.Table=u,t.Cell=c,t.TextCell=i,t.SortHeaderCell=l,t.SortIndicator=o,t.SortTypes=a}).call(this)}finally{}},43:function(e,t,n){try{(function(){"use strict";function n(e){var t=[],n=e.get("labels");return n&&n.entrySeq().toArray().forEach(function(e){t.push({role:e[0],value:e[1]})}),n=e.get("cmd_labels"),n&&n.entrySeq().toArray().forEach(function(e){t.push({role:e[0],value:e[1].get("result"),tooltip:e[1].get("command")})}),t}t.__esModule=!0;var r=function(e){return[["tlpt_nodes"],function(t){var n=t.find(function(t){return t.get("id")===e});return n?n.get("hostname"):""}]},s=[["tlpt_nodes"],function(e){return e.map(function(e){var t=e.get("id");return{id:t,hostname:e.get("hostname"),tags:n(e),addr:e.get("addr")}}).toJS()}];t["default"]={nodeListView:s,nodeHostNameByServerId:r},e.exports=t["default"]}).call(this)}finally{}},44:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TRYING_TO_SIGN_UP:null,TRYING_TO_LOGIN:null,FETCHING_INVITE:null}),e.exports=t["default"]}).call(this)}finally{}},56:function(e,t){e.exports=_},57:function(e,t,n){try{(function(){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var r=Function.prototype.bind,s=function(){function e(){var t=arguments.length<=0||void 0===arguments[0]?"default":arguments[0];n(this,e),this.name=t}return e.prototype.log=function(){for(var e=arguments.length<=0||void 0===arguments[0]?"log":arguments[0],t=arguments.length,n=Array(t>1?t-1:0),r=1;t>r;r++)n[r-1]=arguments[r];console[e].apply(console,["%c["+this.name+"]","color: blue;"].concat(n))},e.prototype.trace=function(){for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];this.log.apply(this,["trace"].concat(t))},e.prototype.warn=function(){for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];this.log.apply(this,["warn"].concat(t))},e.prototype.info=function(){for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];this.log.apply(this,["info"].concat(t))},e.prototype.error=function(){for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];this.log.apply(this,["error"].concat(t))},e}();t["default"]={create:function(){for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];return new(r.apply(s,[null].concat(t)))}},e.exports=t["default"]}).call(this)}finally{}},58:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(119),s=r.createView,i=[["tlpt_current_session"],["tlpt_sessions"],function(e,t){if(!e)return null;var n={isNewSession:e.get("isNewSession"),notFound:e.get("notFound"),addr:e.get("addr"),serverId:e.get("serverId"),serverIp:void 0,login:e.get("login"),sid:e.get("sid"),cols:void 0,rows:void 0};if(t.has(n.sid)){var r=s(t.get(n.sid));n.parties=r.parties,n.serverIp=r.serverIp,n.serverId=r.serverId,n.active=r.active,n.cols=r.cols,n.rows=r.rows}return n}];t["default"]={activeSession:i},e.exports=t["default"]}).call(this)}finally{}},59:function(e,t,n){try{(function(){"use strict";e.exports.getters=n(58),e.exports.actions=n(104),e.exports.activeTermStore=n(105)}).call(this)}finally{}},60:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(6),s=n(108),i=s.TLPT_DIALOG_SELECT_NODE_SHOW,a=s.TLPT_DIALOG_SELECT_NODE_CLOSE,o={showSelectNodeDialog:function(){r.dispatch(i)},closeSelectNodeDialog:function(){r.dispatch(a)}};t["default"]=o,e.exports=t["default"]}).call(this)}finally{}},61:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(6),s=n(30),i=n(10),a=n(114),o=a.showError,l=n(57).create("Modules/Sessions"),c=n(118),u=c.TLPT_SESSINS_RECEIVE,f=c.TLPT_SESSINS_UPDATE;t["default"]={fetchSession:function(e){return s.get(i.api.getFetchSessionUrl(e)).then(function(e){e&&e.session&&r.dispatch(f,e.session)})},fetchSessions:function(e,t){return l.info("attemp to fetch sessions",{startDate:e,endDate:t}),s.get(i.api.getFetchSessionsUrl(e,t)).done(function(e){r.dispatch(u,e.sessions)}).fail(function(e){o("Unable to retrieve list of sessions"),l.error("fetchSessions",e)})},updateSession:function(e){r.dispatch(f,e)}},e.exports=t["default"]}).call(this)}finally{}},62:function(e,t,n){try{(function(){"use strict";e.exports.getters=n(119),e.exports.actions=n(61),e.exports.activeTermStore=n(120)}).call(this)}finally{}},63:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(44),s=r.TRYING_TO_LOGIN,i=n(117),a=i.requestStatus,o=[["tlpt_user"],function(e){if(!e)return null;var t=e.get("name")||"",n=t[0]||"";return{name:t,shortDisplayName:n,logins:e.get("allowed_logins").toJS()}}];t["default"]={user:o,loginAttemp:a(s)},e.exports=t["default"]}).call(this)}finally{}},92:function(e,t,n){try{(function(){"use strict";var t=n(30),r=n(25),s=n(10),i=n(24),a=3e5,o=null,l={signUp:function(e,n,i,a){var o={user:e,pass:n,second_factor_token:i,invite_token:a};return t.post(s.api.createUserPath,o).then(function(e){return r.setUserData(e),l._startTokenRefresher(),e})},login:function(e,t,n){return l._stopTokenRefresher(),l._login(e,t,n).done(l._startTokenRefresher)},ensureUser:function(){var e=r.getUserData();return e.token?null===l._getRefreshTokenTimerId()?l._refreshToken().done(l._startTokenRefresher):i.Deferred().resolve(e):i.Deferred().reject()},logout:function(){l._stopTokenRefresher(),r.clear(),l._redirect()},_redirect:function(){window.location=s.routes.login},_startTokenRefresher:function(){o=setInterval(l._refreshToken,a)},_stopTokenRefresher:function(){clearInterval(o),o=null},_getRefreshTokenTimerId:function(){return o},_refreshToken:function(){return t.post(s.api.renewTokenPath).then(function(e){return r.setUserData(e),e}).fail(function(){l.logout()})},_login:function(e,n,i){var a={user:e,pass:n,second_factor_token:i};return t.post(s.api.sessionPath,a,!1).then(function(e){return r.setUserData(e),e})}};e.exports=l}).call(this)}finally{}},93:function(e,t,n){try{(function(){"use strict";var t=n(1);e.exports.monthRange=function(){var e=arguments.length<=0||void 0===arguments[0]?new Date:arguments[0],n=t(e).startOf("month").toDate(),r=t(e).endOf("month").toDate();return[n,r]}}).call(this)}finally{}},94:function(e,t,n){try{(function(){"use strict";e.exports.isMatch=function(e,t,n){var r=n.searchableProps,s=n.cb;t=t.toLocaleUpperCase();for(var i=r||Object.getOwnPropertyNames(e),a=0;a=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}var r=Object.assign||function(e){for(var t=1;t1?[s.createElement("button",{key:0,"data-toggle":"dropdown",className:"btn btn-default btn-xs dropdown-toggle","aria-expanded":"true"},s.createElement("span",{className:"caret"})),s.createElement("ul",{key:1,className:"dropdown-menu"},f)]:null))},_=s.createClass({displayName:"NodeList",mixins:[h],getInitialState:function(){return this.searchableProps=["addr","hostname","tags"],{filter:"",colSortDirs:{hostname:u.DESC}}},onSortChange:function(e,t){var n;this.setState(r({},this.state,{colSortDirs:(n={},n[e]=t,n)}))},searchAndFilterCb:function(e,t,n){return"tags"===n?e.some(function(e){var n=e.role,r=e.value;return-1!==n.toLocaleUpperCase().indexOf(t)||-1!==r.toLocaleUpperCase().indexOf(t)}):void 0},sortAndFilter:function(e){var t=this,n=e.filter(function(e){return v(e,t.state.filter,{searchableProps:t.searchableProps,cb:t.searchAndFilterCb})}),r=Object.getOwnPropertyNames(this.state.colSortDirs)[0],s=this.state.colSortDirs[r],i=p.sortBy(n,r);return s===u.ASC&&(i=i.reverse()),i},render:function(){var e=this.sortAndFilter(this.props.nodeRecords),t=this.props.logins,n=this.props.onLoginClick;return s.createElement("div",{className:"grv-nodes grv-page"},s.createElement("div",{className:"grv-flex grv-header"},s.createElement("div",{className:"grv-flex-column"}),s.createElement("div",{className:"grv-flex-column"},s.createElement("h1",null," Nodes ")),s.createElement("div",{className:"grv-flex-column"},s.createElement("div",{className:"grv-search"},s.createElement("input",{valueLink:this.linkState("filter"),placeholder:"Search...",className:"form-control input-sm"})))),s.createElement("div",{className:""},s.createElement(a,{rowCount:e.length,className:"table-striped grv-nodes-table"},s.createElement(o,{columnKey:"hostname",header:s.createElement(c,{sortDir:this.state.colSortDirs.hostname,onSortChange:this.onSortChange,title:"Node"}),cell:s.createElement(g,{data:e})}),s.createElement(o,{columnKey:"addr",header:s.createElement(c,{sortDir:this.state.colSortDirs.addr,onSortChange:this.onSortChange,title:"IP"}),cell:s.createElement(g,{data:e})}),s.createElement(o,{columnKey:"tags",header:s.createElement(l,null),cell:s.createElement(y,{data:e})}),s.createElement(o,{columnKey:"roles",onLoginClick:n,header:s.createElement(l,null,"Login as"),cell:s.createElement(E,{data:e,logins:t})}))))}});e.exports=_}).call(this)}finally{}},100:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(6),s=n(302),i=s.getters,a=n(60),o=a.closeSelectNodeDialog,l=n(99),c=n(58),u=n(43),f=n(24),d=t.createClass({displayName:"SelectNodeDialog",mixins:[r.ReactMixin],getDataBindings:function(){return{dialogs:i.dialogs}},render:function(){return this.state.dialogs.isSelectNodeDialogOpen?t.createElement(h,null):null}}),h=t.createClass({displayName:"Dialog",onLoginClick:function(e){d.onServerChangeCallBack&&d.onServerChangeCallBack({serverId:e}),o()},componentWillUnmount:function(){f(".modal").modal("hide")},componentDidMount:function(){f(".modal").modal("show")},render:function(){var e=r.evaluate(c.activeSession)||{},n=r.evaluate(u.nodeListView),s=[e.login];return t.createElement("div",{className:"modal fade grv-dialog-select-node",tabIndex:-1,role:"dialog"},t.createElement("div",{className:"modal-dialog"},t.createElement("div",{className:"modal-content"},t.createElement("div",{className:"modal-header"}),t.createElement("div",{className:"modal-body"},t.createElement(l,{nodeRecords:n,logins:s,onLoginClick:this.onLoginClick})),t.createElement("div",{className:"modal-footer"},t.createElement("button",{onClick:o,type:"button",className:"btn btn-primary"},"Close")))))}});d.onServerChangeCallBack=function(){},e.exports=d}).call(this)}finally{}},101:function(e,t,n){try{(function(){"use strict";function e(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}t.__esModule=!0;var r=n(2),s=n(6),i=n(37),a=i.Link,o=n(43),l=o.nodeHostNameByServerId,c=n(42),u=c.Cell,f=n(1),d=function(t){var n=t.rowIndex,s=t.data,i=e(t,["rowIndex","data"]),a=s[n].created,o=f(a).format("l LTS");return r.createElement(u,i,o)},h=function(t){var n=t.rowIndex,s=t.data,i=e(t,["rowIndex","data"]),a=s[n].created,o=s[n].lastActive,l=f(a),c=f(o),d=f.duration(c.diff(l)),h=d.humanize();return r.createElement(u,i,h)},p=function(t){var n=t.rowIndex,s=t.data,i=e(t,["rowIndex","data"]);return r.createElement(u,i,r.createElement("span",{className:"grv-sessions-user label label-default"},s[n].login))},m=function(t){var n=t.rowIndex,s=t.data,i=e(t,["rowIndex","data"]),a=s[n].parties.map(function(e,t){return r.createElement("span",{key:t,className:"grv-sessions-user label label-default"},e.user)});return r.createElement(u,i,r.createElement("div",null,a))},v=function(t){var n=t.rowIndex,s=t.data,i=e(t,["rowIndex","data"]),o=s[n],l=o.sessionUrl,c=o.active,f=c?["join","btn-warning"]:["play","btn-primary"],d=f[0],h=f[1];return r.createElement(u,i,r.createElement(a,{to:l,className:"btn "+h+" btn-xs",type:"button"},d))},g=function(e){var t=e.text;return r.createElement("div",{className:"grv-sessions-empty text-center text-muted"},r.createElement("span",null,t))},y=function(t){var n=t.rowIndex,i=t.data,a=e(t,["rowIndex","data"]),o=i[n].serverId,c=s.evaluate(l(o))||"unknown";return r.createElement(u,a,c)};t["default"]=v,t.ButtonCell=v,t.UsersCell=m,t.DurationCell=h,t.DateCreatedCell=d,t.EmptyList=g,t.SingleUserCell=p,t.NodeCell=y}).call(this)}finally{}},102:function(e,t,n){try{(function(){"use strict";var t=n(422),r=n(2),s=n(24),i=n(56),a=i.debounce,o=i.isNumber;t.colors[256]="#252323";var l="disconnected\r\n",c="Connected!\r\n",u=r.createClass({displayName:"TtyTerminal",getInitialState:function(){var e=this;return this.rows=this.props.rows,this.cols=this.props.cols,this.tty=this.props.tty,this.debouncedResize=a(function(){e.resize(),e.tty.resize(e.cols,e.rows)},200),{}},componentDidMount:function(){var e=this;this.term=new t({cols:5,rows:5,useStyle:!0,screenKeys:!0,cursorBlink:!0}),this.term.open(this.refs.container),this.term.on("data",function(t){return e.tty.send(t)}),this.resize(this.cols,this.rows),this.tty.on("open",function(){return e.term.write(c)}),this.tty.on("close",function(){return e.term.write(l)}),this.tty.on("data",function(t){return e.term.write(t)}),this.tty.on("reset",function(){return e.term.reset()}),this.tty.connect({cols:this.cols,rows:this.rows}),window.addEventListener("resize",this.debouncedResize)},componentWillUnmount:function(){this.term.destroy(),window.removeEventListener("resize",this.debouncedResize)},shouldComponentUpdate:function(e){var t=e.rows,n=e.cols;return o(t)&&o(n)?(t===this.rows&&n===this.cols||this.resize(n,t),!1):!1},render:function(){return r.createElement("div",{className:"grv-terminal",id:"terminal-box",ref:"container"}," ")},resize:function(e,t){if(!o(e)||!o(t)){var n=this._getDimensions();e=n.cols,t=n.rows}this.cols=e,this.rows=t,this.term.resize(this.cols,this.rows)},_getDimensions:function(){var e=s(this.refs.container),t=s("
 
");e.find(".terminal").append(t);var n=t[0].getBoundingClientRect().height,r=t.children().first()[0].getBoundingClientRect().width,i=e[0].clientWidth,a=e[0].clientHeight,o=Math.floor(i/r),l=Math.floor(a/n);return t.remove(),{cols:o,rows:l}}});u.propTypes={tty:r.PropTypes.object.isRequired},e.exports=u}).call(this)}finally{}},103:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_TERM_OPEN:null,TLPT_TERM_CLOSE:null,TLPT_TERM_CHANGE_SERVER:null}),e.exports=t["default"]}).call(this)}finally{}},104:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(6),s=n(25),i=n(281),a=n(30),o=n(10),l=n(58),c=n(62),u=n(57).create("Current Session"),f=n(103),d=f.TLPT_TERM_OPEN,h=f.TLPT_TERM_CLOSE,p=f.TLPT_TERM_CHANGE_SERVER,m={changeServer:function(e,t){r.dispatch(p,{serverId:e,login:t})},close:function(){var e=r.evaluate(l.activeSession),t=e.isNewSession;r.dispatch(h),t?s.getHistory().push(o.routes.nodes):s.getHistory().push(o.routes.sessions)},resize:function(e,t){e=5>e?5:e,t=5>t?5:t;var n={terminal_params:{w:e,h:t}},s=r.evaluate(l.activeSession),i=s.sid;u.info("resize","w:"+e+" and h:"+t),a.put(o.api.getTerminalSessionUrl(i),n).done(function(){return u.info("resized")}).fail(function(e){return u.error("failed to resize",e)})},openSession:function(e){u.info("attempt to open session",{sid:e}),c.actions.fetchSession(e).done(function(){var t=r.evaluate(c.getters.sessionViewById(e)),n=t.serverId,s=t.login;u.info("open session","OK"),r.dispatch(d,{serverId:n,login:s,sid:e,isNewSession:!1})}).fail(function(e){u.error("open session",e),s.getHistory().push(o.routes.pageNotFound)})},createNewSession:function(e,t){var n=i(),a=o.getActiveSessionRouteUrl(n),l=s.getHistory();u.info("createNewSession",{serverId:e,login:t}),r.dispatch(d,{serverId:e,login:t,sid:n,isNewSession:!0}),l.push(a)}};t["default"]=m,e.exports=t["default"]}).call(this)}finally{}},105:function(e,t,n){try{(function(){"use strict";function r(e,t){var n=t.serverId,r=t.login;return e.set("serverId",n).set("login",r)}function s(){return l(null)}function i(e,t){var n=t.serverId,r=t.login,s=t.sid,i=t.isNewSession;return l({serverId:n,login:r,sid:s,isNewSession:i})}t.__esModule=!0;var a=n(13),o=a.Store,l=a.toImmutable,c=n(103),u=c.TLPT_TERM_OPEN,f=c.TLPT_TERM_CLOSE,d=c.TLPT_TERM_CHANGE_SERVER;t["default"]=o({getInitialState:function(){return l(null)},initialize:function(){this.on(u,i),this.on(f,s),this.on(d,r)}}),e.exports=t["default"]}).call(this)}finally{}},106:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_APP_INIT:null,TLPT_APP_FAILED:null,TLPT_APP_READY:null}),e.exports=t["default"]}).call(this)}finally{}},107:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(13),s=r.Store,i=r.toImmutable,a=n(106),o=a.TLPT_APP_INIT,l=a.TLPT_APP_FAILED,c=a.TLPT_APP_READY,u=i({isReady:!1,isInitializing:!1,isFailed:!1});t["default"]=s({getInitialState:function(){return u.set("isInitializing",!0)},initialize:function(){this.on(o,function(){return u.set("isInitializing",!0)}),this.on(c,function(){return u.set("isReady",!0)}),this.on(l,function(){return u.set("isFailed",!0)})}}),e.exports=t["default"]}).call(this)}finally{}},108:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_DIALOG_SELECT_NODE_SHOW:null,TLPT_DIALOG_SELECT_NODE_CLOSE:null}),e.exports=t["default"]}).call(this)}finally{}},109:function(e,t,n){try{(function(){"use strict";function r(e){return e.set("isSelectNodeDialogOpen",!0)}function s(e){return e.set("isSelectNodeDialogOpen",!1)}t.__esModule=!0;var i=n(13),a=i.Store,o=i.toImmutable,l=n(108),c=l.TLPT_DIALOG_SELECT_NODE_SHOW,u=l.TLPT_DIALOG_SELECT_NODE_CLOSE;t["default"]=a({getInitialState:function(){return o({isSelectNodeDialogOpen:!1})},initialize:function(){this.on(c,r),this.on(u,s)}}),e.exports=t["default"]}).call(this)}finally{}},110:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_RECEIVE_USER_INVITE:null}),e.exports=t["default"]}).call(this)}finally{}},111:function(e,t,n){try{(function(){"use strict";function r(e,t){return a(t)}t.__esModule=!0;var s=n(13),i=s.Store,a=s.toImmutable,o=n(110),l=o.TLPT_RECEIVE_USER_INVITE;t["default"]=i({getInitialState:function(){return a(null)},initialize:function(){this.on(l,r)}}),e.exports=t["default"]}).call(this)}finally{}},112:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_NODES_RECEIVE:null}),e.exports=t["default"]}).call(this)}finally{}},113:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_NOTIFICATIONS_ADD:null}),e.exports=t["default"]}).call(this)}finally{}},114:function(e,t,n){try{(function(){"use strict";function r(e){s.dispatch(a,e)}t.__esModule=!0;var s=n(6),i=n(113),a=i.TLPT_NOTIFICATIONS_ADD;t["default"]={showError:function(e){var t=arguments.length<=1||void 0===arguments[1]?"ERROR":arguments[1];r({isError:!0,text:e,title:t})},showSuccess:function(e){var t=arguments.length<=1||void 0===arguments[1]?"SUCCESS":arguments[1];r({isSuccess:!0,text:e,title:t})},showInfo:function(e){var t=arguments.length<=1||void 0===arguments[1]?"INFO":arguments[1];r({isInfo:!0,text:e,title:t})},showWarning:function(e){var t=arguments.length<=1||void 0===arguments[1]?"WARNING":arguments[1];r({isWarning:!0,text:e,title:t})}},e.exports=t["default"]}).call(this)}finally{}},115:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_REST_API_START:null,TLPT_REST_API_SUCCESS:null,TLPT_REST_API_FAIL:null}),e.exports=t["default"]}).call(this)}finally{}},116:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(6),s=n(115),i=s.TLPT_REST_API_START,a=s.TLPT_REST_API_SUCCESS,o=s.TLPT_REST_API_FAIL;t["default"]={start:function(e){r.dispatch(i,{ +type:e})},fail:function(e,t){r.dispatch(o,{type:e,message:t})},success:function(e){r.dispatch(a,{type:e})}},e.exports=t["default"]}).call(this)}finally{}},117:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var n={isProcessing:!1,isError:!1,isSuccess:!1,message:""},r=function(e){return[["tlpt_rest_api",e],function(e){return e?e.toJS():n}]};t["default"]={requestStatus:r},e.exports=t["default"]}).call(this)}finally{}},118:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_SESSINS_RECEIVE:null,TLPT_SESSINS_UPDATE:null}),e.exports=t["default"]}).call(this)}finally{}},119:function(e,t,n){try{(function(){"use strict";function r(e){return e.sortBy(function(e){return new Date(e.get("lastActive"))}).last()}function s(e){var t,n,r=e.get("id"),s=o.evaluate(d(r));return s.length>0&&(t=s[0].serverIp,n=s[0].serverId),{sid:r,sessionUrl:l.getActiveSessionRouteUrl(r),serverIp:t,serverId:n,active:e.get("active"),created:new Date(e.get("created")),lastActive:new Date(e.get("last_active")),login:e.get("login"),parties:s,cols:e.getIn(["terminal_params","w"]),rows:e.getIn(["terminal_params","h"])}}t.__esModule=!0;var i=n(13),a=i.toImmutable,o=n(6),l=n(10),c=function(e){return[["tlpt_sessions"],function(t){return t.valueSeq().filter(function(t){var n=t.get("parties")||a([]),r=n.find(function(t){return t.get("server_id")===e});return r}).toList()}]},u=[["tlpt_sessions"],function(e){return e.valueSeq().map(s).toJS()}],f=function(e){return[["tlpt_sessions",e],function(e){return e?s(e):null}]},d=function(e){return[["tlpt_sessions",e,"parties"],function(e){if(!e)return[];var t=r(e).get("user");return e.map(function(e){var n=e.get("user");return{user:e.get("user"),serverIp:e.get("remote_addr"),serverId:e.get("server_id"),isActive:t===n}}).toJS()}]};t["default"]={partiesBySessionId:d,sessionsByServer:c,sessionsView:u,sessionViewById:f,createView:s},e.exports=t["default"]}).call(this)}finally{}},120:function(e,t,n){try{(function(){"use strict";function r(e,t){return e.set(t.id,o(t))}function s(e){var t=arguments.length<=1||void 0===arguments[1]?[]:arguments[1];return e.withMutations(function(e){t.forEach(function(t){e.set(t.id,o(t))})})}t.__esModule=!0;var i=n(13),a=i.Store,o=i.toImmutable,l=n(118),c=l.TLPT_SESSINS_RECEIVE,u=l.TLPT_SESSINS_UPDATE;t["default"]=a({getInitialState:function(){return o({})},initialize:function(){this.on(c,s),this.on(u,r)}}),e.exports=t["default"]}).call(this)}finally{}},121:function(e,t,n){try{(function(){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var s=n(17),i=r(s);t["default"]=i["default"]({TLPT_RECEIVE_USER:null}),e.exports=t["default"]}).call(this)}finally{}},122:function(e,t,n){try{(function(){"use strict";t.__esModule=!0;var r=n(6),s=n(121),i=s.TLPT_RECEIVE_USER,a=n(44),o=a.TRYING_TO_SIGN_UP,l=a.TRYING_TO_LOGIN,c=n(116),u=n(92),f=n(25),d=n(10);t["default"]={ensureUser:function(e,t,n){u.ensureUser().done(function(e){r.dispatch(i,e.user),n()}).fail(function(){t({redirectTo:e.location.pathname},d.routes.login),n()})},signUp:function(e){var t=e.name,n=e.psw,s=e.token,a=e.inviteToken;c.start(o),u.signUp(t,n,s,a).done(function(e){r.dispatch(i,e.user),c.success(o),f.getHistory().push({pathname:d.routes.app})}).fail(function(e){c.fail(o,e.responseJSON.message||"failed to sing up")})},login:function(e,t){var n=e.user,s=e.password,a=e.token;c.start(l),u.login(n,s,a).done(function(e){c.success(l),r.dispatch(i,e.user),f.getHistory().push({pathname:t})}).fail(function(e){return c.fail(l,e.responseJSON.message)})}},e.exports=t["default"]}).call(this)}finally{}},123:function(e,t,n){try{(function(){"use strict";e.exports.getters=n(63),e.exports.actions=n(122),e.exports.nodeStore=n(124)}).call(this)}finally{}},124:function(e,t,n){try{(function(){"use strict";function r(e,t){return a(t)}t.__esModule=!0;var s=n(13),i=s.Store,a=s.toImmutable,o=n(121),l=o.TLPT_RECEIVE_USER;t["default"]=i({getInitialState:function(){return a(null)},initialize:function(){this.on(l,r)}}),e.exports=t["default"]}).call(this)}finally{}},279:function(e,t,n){try{(function(){"use strict";function e(e){return e&&e.__esModule?e:{"default":e}}function r(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function s(e){return r(e).replace(/\/+/g,"/+")}function i(e){for(var t="",n=[],r=[],i=void 0,a=0,o=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|\*\*|\*|\(|\)/g;i=o.exec(e);)i.index!==a&&(r.push(e.slice(a,i.index)),t+=s(e.slice(a,i.index))),i[1]?(t+="([^/?#]+)",n.push(i[1])):"**"===i[0]?(t+="([\\s\\S]*)",n.push("splat")):"*"===i[0]?(t+="([\\s\\S]*?)",n.push("splat")):"("===i[0]?t+="(?:":")"===i[0]&&(t+=")?"),r.push(i[0]),a=o.lastIndex;return a!==e.length&&(r.push(e.slice(a,e.length)),t+=s(e.slice(a,e.length))),{pattern:e,regexpSource:t,paramNames:n,tokens:r}}function a(e){return e in h||(h[e]=i(e)),h[e]}function o(e,t){"/"!==e.charAt(0)&&(e="/"+e),"/"!==t.charAt(0)&&(t="/"+t);var n=a(e),r=n.regexpSource,s=n.paramNames,i=n.tokens;r+="/*";var o="*"!==i[i.length-1];o&&(r+="([\\s\\S]*?)");var l=t.match(new RegExp("^"+r+"$","i")),c=void 0,u=void 0;if(null!=l){if(o){c=l.pop();var f=l[0].substr(0,l[0].length-c.length);if(c&&"/"!==f.charAt(f.length-1))return{remainingPathname:null,paramNames:s,paramValues:null}}else c="";u=l.slice(1).map(function(e){return null!=e?decodeURIComponent(e):e})}else c=u=null;return{remainingPathname:c,paramNames:s,paramValues:u}}function l(e){return a(e).paramNames}function c(e,t){var n=o(e,t),r=n.paramNames,s=n.paramValues;return null!=s?r.reduce(function(e,t,n){return e[t]=s[n],e},{}):null}function u(e,t){t=t||{};for(var n=a(e),r=n.tokens,s=0,i="",o=0,l=void 0,c=void 0,u=void 0,f=0,h=r.length;h>f;++f)l=r[f],"*"===l||"**"===l?(u=Array.isArray(t.splat)?t.splat[o++]:t.splat,d["default"](null!=u||s>0,'Missing splat #%s for path "%s"',o,e),null!=u&&(i+=encodeURI(u))):"("===l?s+=1:")"===l?s-=1:":"===l.charAt(0)?(c=l.substring(1),u=t[c],d["default"](null!=u||s>0,'Missing "%s" parameter for path "%s"',c,e),null!=u&&(i+=encodeURIComponent(u))):i+=l;return i.replace(/\/+/g,"/")}t.__esModule=!0,t.compilePattern=a,t.matchPattern=o,t.getParamNames=l,t.getParams=c,t.formatPattern=u;var f=n(11),d=e(f),h={}}).call(this)}finally{}},280:function(e,t,n){try{(function(){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var i=n(95),a=n(30),o=n(10),l=function(e){function t(n){var s=n.sid;r(this,t),e.call(this,{}),this.sid=s,this.current=1,this.length=-1,this.ttySteam=new Array,this.isLoaind=!1,this.isPlaying=!1,this.isError=!1,this.isReady=!1,this.isLoading=!0}return s(t,e),t.prototype.send=function(){},t.prototype.resize=function(){},t.prototype.connect=function(){var e=this;a.get(o.api.getFetchSessionLengthUrl(this.sid)).done(function(t){e.length=t.count,e.isReady=!0}).fail(function(){e.isError=!0}).always(function(){e._change()})},t.prototype.move=function(e){this.isReady&&(void 0===e&&(e=this.current+1),e>this.length&&(e=this.length,this.stop()),0===e&&(e=1),this.isPlaying?this.currentn;n++)if(void 0===this.ttySteam[n])return!0;return!1},t.prototype._fetch=function(e,t){var n=this;return t+=50,t=t>this.length?this.length:t,a.get(o.api.getFetchSessionChunkUrl({sid:this.sid,start:e,end:t})).done(function(r){for(var s=0;t-e>s;s++){var i=atob(r.chunks[s].data)||"",a=r.chunks[s].delay;n.ttySteam[e+s]={data:i,delay:a}}})},t.prototype._showChunk=function(e,t){var n=this,r=function(){for(var r=e;t>r;r++)n.emit("data",n.ttySteam[r].data);n.current=t};this._shouldFetch(e,t)?this._fetch(e,t).then(r):r()},t.prototype._change=function(){this.emit("change")},t}(i);t["default"]=l,e.exports=t["default"]}).call(this)}finally{}},281:function(e,t,n){try{(function(){"use strict";e.exports=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0,n="x"==e?t:3&t|8;return n.toString(16)})}}).call(this)}finally{}},282:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(290),s=n(6),i=n(300),a=i.actions,o=i.getters,l=n(100),c=n(293),u=t.createClass({displayName:"App",mixins:[s.ReactMixin],getDataBindings:function(){return{app:o.appState}},componentWillMount:function(){a.initApp(),this.refreshInterval=setInterval(a.fetchNodesAndSessions,35e3)},componentWillUnmount:function(){clearInterval(this.refreshInterval)},render:function(){return this.state.app.isInitializing?null:t.createElement("div",{className:"grv-tlpt grv-flex grv-flex-row"},t.createElement(l,null),t.createElement(c,null),this.props.CurrentSessionHost,t.createElement(r,null),this.props.children)}});e.exports=u}).call(this)}finally{}},283:function(e,t,n){try{(function(){"use strict";var t=Object.assign||function(e){for(var t=1;t1}},getInitialState:function(){var e=this.props.activeSession.sid;return this.tty=new i({sid:e}),this.calculateState()},componentWillUnmount:function(){this.tty.stop(),this.tty.removeAllListeners()},componentDidMount:function(){var e=this;this.tty.on("change",function(){var t=e.calculateState();e.setState(t)})},togglePlayStop:function(){this.state.isPlaying?this.tty.stop():this.tty.play()},move:function(e){this.tty.move(e)},onBeforeChange:function(){this.tty.stop()},onAfterChange:function(e){this.tty.play(),this.tty.move(e)},render:function(){var e=this.state.isPlaying;return r.createElement("div",{className:"grv-current-session grv-session-player"},r.createElement(o,null),r.createElement(a,{ref:"term",tty:this.tty,cols:"5",rows:"5"}),r.createElement(s,{min:this.state.min,max:this.state.length,value:this.state.current,onAfterChange:this.onAfterChange,onBeforeChange:this.onBeforeChange,defaultValue:1,withBars:!0,className:"grv-slider"}),r.createElement("button",{className:"btn",onClick:this.togglePlayStop},e?r.createElement("i",{className:"fa fa-stop"}):r.createElement("i",{className:"fa fa-play"})))}});t["default"]=l,e.exports=t["default"]}).call(this)}finally{}},287:function(e,t,n){try{(function(){"use strict";function e(e,t){return i(e).isSame(t,"day")}t.__esModule=!0;var r=n(2),s=n(24),i=n(1),a=n(56),o=a.debounce,l=r.createClass({displayName:"DateRangePicker",getDates:function(){var e=s(this.refs.dpPicker1).datepicker("getDate"),t=s(this.refs.dpPicker2).datepicker("getDate");return[e,t]},setDates:function(e){var t=e.startDate,n=e.endDate;s(this.refs.dpPicker1).datepicker("setDate",t),s(this.refs.dpPicker2).datepicker("setDate",n)},getDefaultProps:function(){return{startDate:i().startOf("month").toDate(),endDate:i().endOf("month").toDate(),onChange:function(){}}},componentWillUnmount:function(){s(this.refs.dp).datepicker("destroy")},componentWillReceiveProps:function(t){var n=this.getDates(),r=n[0],s=n[1];e(r,t.startDate)&&e(s,t.endDate)||this.setDates(t)},shouldComponentUpdate:function(){return!1},componentDidMount:function(){this.onChange=o(this.onChange,1),s(this.refs.rangePicker).datepicker({todayBtn:"linked",keyboardNavigation:!1,forceParse:!1,calendarWeeks:!0,autoclose:!0}).on("changeDate",this.onChange),this.setDates(this.props)},onChange:function(){var t=this.getDates(),n=t[0],r=t[1];e(n,this.props.startDate)&&e(r,this.props.endDate)||this.props.onChange({startDate:n,endDate:r})},render:function(){return r.createElement("div",{className:"grv-datepicker input-group input-daterange",ref:"rangePicker"},r.createElement("input",{ref:"dpPicker1",type:"text",className:"input-sm form-control",name:"start"}),r.createElement("span",{className:"input-group-addon"},"to"),r.createElement("input",{ref:"dpPicker2",type:"text",className:"input-sm form-control",name:"end"}))}}),c=r.createClass({displayName:"CalendarNav",render:function(){var e=this.props.value,t=i(e).format("MMMM, YYYY");return r.createElement("div",{className:"grv-calendar-nav "+this.props.className},r.createElement("button",{onClick:this.move.bind(this,-1),className:"btn btn-outline btn-link"},r.createElement("i",{className:"fa fa-chevron-left"})),r.createElement("span",{className:"text-muted"},t),r.createElement("button",{onClick:this.move.bind(this,1),className:"btn btn-outline btn-link"},r.createElement("i",{className:"fa fa-chevron-right"})))},move:function(e){var t=this.props.value,n=i(t).add(e,"month").toDate();this.props.onValueChange(n)}});c.getMonthRange=function(e){var t=i(e).startOf("month").toDate(),n=i(e).endOf("month").toDate();return[t,n]},t["default"]=l,t.CalendarNav=c,t.DateRangePicker=l}).call(this)}finally{}},288:function(e,t,n){try{(function(){"use strict";e.exports.App=n(282),e.exports.Login=n(289),e.exports.NewUser=n(291),e.exports.Nodes=n(292),e.exports.Sessions=n(295),e.exports.CurrentSessionHost=n(285),e.exports.NotFound=n(97).NotFound}).call(this)}finally{}},289:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(24),s=n(6),i=n(36),a=n(123),o=a.actions,l=a.getters,c=n(98),u=n(10),f=t.createClass({displayName:"LoginInputForm",mixins:[i],getInitialState:function(){return{user:"",password:"",token:""}},onClick:function(e){e.preventDefault(),this.isValid()&&this.props.onClick(this.state)},isValid:function(){var e=r(this.refs.form);return 0===e.length||e.valid()},render:function(){var e=this.props.attemp,n=e.isProcessing,r=e.isFailed,s=e.message;return t.createElement("form",{ref:"form",className:"grv-login-input-form"},t.createElement("h3",null," Welcome to Teleport "),t.createElement("div",{className:""},t.createElement("div",{className:"form-group"},t.createElement("input",{autoFocus:!0,valueLink:this.linkState("user"),className:"form-control required",placeholder:"User name",name:"userName"})),t.createElement("div",{className:"form-group"},t.createElement("input",{valueLink:this.linkState("password"),type:"password",name:"password",className:"form-control required",placeholder:"Password"})),t.createElement("div",{className:"form-group"},t.createElement("input",{valueLink:this.linkState("token"),className:"form-control required",name:"token",placeholder:"Two factor token (Google Authenticator)"})),t.createElement("button",{onClick:this.onClick,disabled:n,type:"submit",className:"btn btn-primary block full-width m-b"},"Login"),r?t.createElement("label",{className:"error"},s):null))}}),d=t.createClass({displayName:"Login",mixins:[s.ReactMixin],getDataBindings:function(){return{attemp:l.loginAttemp}},onClick:function(e){var t=this.props.location,n=u.routes.app;t.state&&t.state.redirectTo&&(n=t.state.redirectTo),o.login(e,n)},render:function(){return t.createElement("div",{className:"grv-login text-center"},t.createElement("div",{className:"grv-logo-tprt"}),t.createElement("div",{className:"grv-content grv-flex"},t.createElement("div",{className:"grv-flex-column"},t.createElement(f,{attemp:this.state.attemp,onClick:this.onClick}),t.createElement(c,null),t.createElement("div",{className:"grv-login-info"},t.createElement("i",{className:"fa fa-question"}),t.createElement("strong",null,"New Account or forgot password?"),t.createElement("div",null,"Ask for assistance from your Company administrator")))))}});e.exports=d}).call(this)}finally{}},290:function(e,t,n){try{(function(){"use strict";function t(){var e=s.evaluate(o.user),t=e.shortDisplayName;return t}var r=n(2),s=n(6),i=n(37),a=i.IndexLink,o=n(63),l=n(10),c=[{icon:"fa fa-cogs",to:l.routes.nodes,title:"Nodes"},{icon:"fa fa-sitemap",to:l.routes.sessions,title:"Sessions"}],u=r.createClass({displayName:"NavLeftBar",render:function(){var e=this,n=c.map(function(t,n){var s=e.context.router.isActive(t.to)?"active":"";return r.createElement("li",{key:n,className:s,title:t.title},r.createElement(a,{to:t.to},r.createElement("i",{className:t.icon})))});return n.push(r.createElement("li",{key:n.length,title:"help"},r.createElement("a",{href:l.helpUrl,target:"_blank"},r.createElement("i",{className:"fa fa-question"})))),n.push(r.createElement("li",{key:n.length,title:"logout"},r.createElement("a",{href:l.routes.logout},r.createElement("i",{className:"fa fa-sign-out",style:{marginRight:0}})))),r.createElement("nav",{className:"grv-nav navbar-default",role:"navigation"},r.createElement("ul",{className:"nav text-center",id:"side-menu"},r.createElement("li",{title:"current user"},r.createElement("div",{className:"grv-circle text-uppercase"},r.createElement("span",null,t()))),n))}});u.contextTypes={router:r.PropTypes.object.isRequired},e.exports=u}).call(this)}finally{}},291:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(24),s=n(6),i=n(306),a=i.actions,o=i.getters,l=n(123),c=n(36),u=n(98),f=n(97),d=f.ExpiredInvite,h=t.createClass({displayName:"InviteInputForm",mixins:[c],componentDidMount:function(){r(this.refs.form).validate({rules:{password:{minlength:6,required:!0},passwordConfirmed:{required:!0,equalTo:this.refs.password}},messages:{passwordConfirmed:{minlength:r.validator.format("Enter at least {0} characters"),equalTo:"Enter the same password as above"}}})},getInitialState:function(){return{name:this.props.invite.user,psw:"",pswConfirmed:"",token:""}},onClick:function(e){e.preventDefault(),this.isValid()&&l.actions.signUp({name:this.state.name,psw:this.state.psw,token:this.state.token,inviteToken:this.props.invite.invite_token})},isValid:function(){var e=r(this.refs.form);return 0===e.length||e.valid()},render:function(){var e=this.props.attemp,n=e.isProcessing,r=e.isFailed,s=e.message;return t.createElement("form",{ref:"form",className:"grv-invite-input-form"},t.createElement("h3",null," Get started with Teleport "),t.createElement("div",{className:""},t.createElement("div",{className:"form-group"},t.createElement("input",{valueLink:this.linkState("name"),name:"userName",className:"form-control required",placeholder:"User name"})),t.createElement("div",{className:"form-group"},t.createElement("input",{autoFocus:!0,valueLink:this.linkState("psw"),ref:"password",type:"password",name:"password",className:"form-control",placeholder:"Password"})),t.createElement("div",{className:"form-group"},t.createElement("input",{valueLink:this.linkState("pswConfirmed"),type:"password",name:"passwordConfirmed",className:"form-control",placeholder:"Password confirm"})),t.createElement("div",{className:"form-group"},t.createElement("input",{name:"token",valueLink:this.linkState("token"),className:"form-control required",placeholder:"Two factor token (Google Authenticator)"})),t.createElement("button",{type:"submit",disabled:n,className:"btn btn-primary block full-width m-b",onClick:this.onClick},"Sign up"),r?t.createElement("label",{className:"error"},s):null))}}),p=t.createClass({displayName:"Invite",mixins:[s.ReactMixin],getDataBindings:function(){return{invite:o.invite,attemp:o.attemp,fetchingInvite:o.fetchingInvite}},componentDidMount:function(){a.fetchInvite(this.props.params.inviteToken)},render:function(){var e=this.state,n=e.fetchingInvite,r=e.invite,s=e.attemp;return n.isFailed?t.createElement(d,null):r?t.createElement("div",{className:"grv-invite text-center"},t.createElement("div",{className:"grv-logo-tprt"}),t.createElement("div",{className:"grv-content grv-flex"},t.createElement("div",{className:"grv-flex-column"},t.createElement(h,{attemp:s,invite:r.toJS()}),t.createElement(u,null)),t.createElement("div",{className:"grv-flex-column grv-invite-barcode"},t.createElement("h4",null,"Scan bar code for auth token ",t.createElement("br",null)," ",t.createElement("small",null,"Scan below to generate your two factor token")),t.createElement("img",{className:"img-thumbnail",src:"data:image/png;base64,"+r.get("qr")})))):null}});e.exports=p}).call(this)}finally{}},292:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(6),s=n(63),i=n(43),a=n(99),o=t.createClass({displayName:"Nodes",mixins:[r.ReactMixin],getDataBindings:function(){return{nodeRecords:i.nodeListView,user:s.user}},render:function(){var e=this.state.nodeRecords,n=this.state.user.logins;return t.createElement(a,{nodeRecords:e,logins:n})}});e.exports=o}).call(this)}finally{}},293:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(6),s=n(232),i=n(309),a=i.lastMessage,o=n(244),l=o.ToastContainer,c=o.ToastMessage,u=t.createFactory(c.animation),f=t.createClass({displayName:"NotificationHost",mixins:[r.ReactMixin,s],getDataBindings:function(){return{msg:a}},update:function(e){e&&(e.isError?this.refs.container.error(e.text,e.title):e.isWarning?this.refs.container.warning(e.text,e.title):e.isSuccess?this.refs.container.success(e.text,e.title):this.refs.container.info(e.text,e.title))},componentDidMount:function(){r.observe(a,this.update)},componentWillUnmount:function(){r.unobserve(a,this.update)},render:function(){return t.createElement(l,{ref:"container",toastMessageFactory:u,className:"toast-top-right"})}});e.exports=f}).call(this)}finally{}},294:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(42),s=r.Table,i=r.Column,a=r.Cell,o=r.TextCell,l=n(101),c=l.ButtonCell,u=l.UsersCell,f=l.EmptyList,d=l.NodeCell,h=l.DateCreatedCell,p=t.createClass({displayName:"ActiveSessionList",render:function(){var e=this.props.data.filter(function(e){return e.active});return t.createElement("div",{className:"grv-sessions-active"},t.createElement("div",{className:"grv-header"},t.createElement("h1",null," Active Sessions ")),t.createElement("div",{className:"grv-content"},0===e.length?t.createElement(f,{text:"You have no active sessions."}):t.createElement("div",{className:""},t.createElement(s,{rowCount:e.length,className:"table-striped"},t.createElement(i,{columnKey:"sid",header:t.createElement(a,null," Session ID "),cell:t.createElement(o,{data:e})}),t.createElement(i,{header:t.createElement(a,null," "),cell:t.createElement(c,{data:e})}),t.createElement(i,{header:t.createElement(a,null," Node "),cell:t.createElement(d,{data:e})}),t.createElement(i,{columnKey:"created",header:t.createElement(a,null," Created "),cell:t.createElement(h,{data:e})}),t.createElement(i,{header:t.createElement(a,null," Users "),cell:t.createElement(u,{data:e})})))))}});e.exports=p}).call(this)}finally{}},295:function(e,t,n){try{(function(){"use strict";var t=n(2),r=n(6),s=n(62),i=s.getters,a=n(296),o=n(294),l=t.createClass({displayName:"Sessions",mixins:[r.ReactMixin],getDataBindings:function(){return{data:i.sessionsView}},render:function(){var e=this.state.data;return t.createElement("div",{className:"grv-sessions grv-page"},t.createElement(o,{data:e}),t.createElement("hr",{className:"grv-divider"}),t.createElement(a,{data:e}))}});e.exports=l}).call(this)}finally{}},296:function(e,t,n){try{(function(){"use strict";var t=Object.assign||function(e){for(var t=1;te||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},n.prototype.emit=function(e){var t,n,s,o,l,c;if(this._events||(this._events={}),"error"===e&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;throw TypeError('Uncaught, unspecified "error" event.')}if(n=this._events[e],a(n))return!1;if(r(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:for(s=arguments.length,o=new Array(s-1),l=1;s>l;l++)o[l-1]=arguments[l];n.apply(this,o)}else if(i(n)){for(s=arguments.length,o=new Array(s-1),l=1;s>l;l++)o[l-1]=arguments[l];for(c=n.slice(),s=c.length,l=0;s>l;l++)c[l].apply(this,o)}return!0},n.prototype.addListener=function(e,t){var s;if(!r(t))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,r(t.listener)?t.listener:t),this._events[e]?i(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,i(this._events[e])&&!this._events[e].warned){var s;s=a(this._maxListeners)?n.defaultMaxListeners:this._maxListeners,s&&s>0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())}return this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(e,t){function n(){this.removeListener(e,n),s||(s=!0,t.apply(this,arguments))}if(!r(t))throw TypeError("listener must be a function");var s=!1;return n.listener=t,this.on(e,n),this},n.prototype.removeListener=function(e,t){var n,s,a,o;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(n=this._events[e],a=n.length,s=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(i(n)){for(o=a;o-- >0;)if(n[o]===t||n[o].listener&&n[o].listener===t){s=o;break}if(0>s)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},n.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(n=this._events[e],r(n))this.removeListener(e,n);else for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},n.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},n.listenerCount=function(e,t){var n;return n=e._events&&e._events[t]?r(e._events[t])?1:e._events[t].length:0}},422:function(e,t){e.exports=Terminal}}); \ No newline at end of file diff --git a/web/dist/app/styles.js b/web/dist/app/styles.js index be011dae06b..0b0e74e1e90 100644 --- a/web/dist/app/styles.js +++ b/web/dist/app/styles.js @@ -1,342 +1,3 @@ -webpackJsonp([2],{ - -/***/ 0: -/***/ function(module, exports, __webpack_require__) { - - __webpack_require__(423); - __webpack_require__(425); - module.exports = __webpack_require__(424); - - -/***/ }, - -/***/ 92: -/***/ function(module, exports, __webpack_require__) { - - /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra - */ - var stylesInDom = {}, - memoize = function(fn) { - var memo; - return function () { - if (typeof memo === "undefined") memo = fn.apply(this, arguments); - return memo; - }; - }, - isOldIE = memoize(function() { - return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase()); - }), - getHeadElement = memoize(function () { - return document.head || document.getElementsByTagName("head")[0]; - }), - singletonElement = null, - singletonCounter = 0; - - module.exports = function(list, options) { - if(false) { - if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment"); - } - - options = options || {}; - // Force single-tag solution on IE6-9, which has a hard limit on the # of