UNPKG

use-stomp

Version:

react provider, class decorator, and a hook for websockets using the stomp protocol

383 lines (322 loc) 52.6 kB
import "core-js/modules/es.array.concat"; import "core-js/modules/es.array.filter"; import "core-js/modules/es.array.for-each"; import "core-js/modules/es.array.iterator"; import "core-js/modules/es.map"; import "core-js/modules/es.object.get-own-property-descriptor"; import "core-js/modules/es.object.to-string"; import "core-js/modules/es.set"; import "core-js/modules/es.string.iterator"; import "core-js/modules/web.dom-collections.for-each"; import "core-js/modules/web.dom-collections.iterator"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _typeof from "@babel/runtime/helpers/typeof"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } import SockJS from 'sockjs-client'; import { v4 } from 'uuid'; import Stomp from './stomp'; import { Events, States } from './webSocketConfigs'; var _self = self; var ctx = { WEBSOCKET: null, WEBSOCKET_AUTH_HEADER: '', WEBSOCKET_CONNECTION: States.DISCONNECTED, WEBSOCKET_HEADER: '', WEBSOCKET_EXPLICIT_DISCONNECT: false, WEBSOCKET_URL: '', WEBSOCKET_STATE: {}, WEBSOCKET_PORTS: new Map(), WEBSOCKET_CHANNELS: new Map(), WEBSOCKET_RECONNECT_COUNT: 0, WEBSOCKET_RECONNECT_INTERVAL: null, WEBSOCKET_RECONNECT_INTERVAL_MS: 10000, WEBSOCKET_RECONNECT_MAX_ATTEMPTS: 10, WEBSOCKET_SUBSCRIPTIONS: new Map(), WEBSOCKET_VISIBLE_TABS: new Set() }; function packageMessage(message) { try { return _typeof(message) === 'object' && message !== null ? JSON.stringify(message) : message; } catch (e) { return message; } } function parseMessage(message) { try { var parsed = JSON.parse(message); return _typeof(parsed) === 'object' && parsed !== null && parsed.content ? parsed.content : parsed; } catch (e) { return message; } } var broadcast = function broadcast(type, payload) { ctx.WEBSOCKET_PORTS.forEach(function (port, id) { emit(id, type, payload); }); }; var emit = function emit(id, type, payload) { var onlyVisible = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; if (ctx.WEBSOCKET_PORTS.has(id)) { // if (!onlyVisible || ctx.WEBSOCKET_VISIBLE_TABS.has(id)) { ctx.WEBSOCKET_PORTS.get(id).postMessage({ type: type, payload: payload }); } }; var onConnected = function onConnected() { console.log('[use-stomp::ws::connected]'); resubscribeAll(); setState(States.CONNECTED); }; var onChannelMessage = function onChannelMessage(channel) { return function (msg) { var message = parseMessage(msg.body); if ((message === null || message === void 0 ? void 0 : message.status) === 'END') { disconnect(); } else { // if (isAnyTabVisible()) { ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel).forEach(function (id) { emit(id, Events.MESSAGE, { channel: channel, message: message }); }); // } else { // } } }; }; var onChannelMessageSync = function onChannelMessageSync(channel) { return function (msg) { var message = parseMessage(msg.body); if ((message === null || message === void 0 ? void 0 : message.status) === 'END') { disconnect(); } else { ctx.WEBSOCKET_STATE[channel] = [].concat(_toConsumableArray(ctx.WEBSOCKET_STATE[channel] || []), [{ id: v4(), message: message }]); (ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel) || []).forEach(function (id) { emit(id, Events.MESSAGE, { channel: channel, message: ctx.WEBSOCKET_STATE[channel] }); }); } }; }; var onDismissSync = function onDismissSync(e) { ctx.WEBSOCKET_STATE[e.data.payload.channel] = ctx.WEBSOCKET_STATE[e.data.payload.channel].filter(function (message) { return message.id !== e.data.payload.id; }); (ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel) || []).forEach(function (id) { emit(id, Events.MESSAGE, { channel: e.data.payload.channel, message: ctx.WEBSOCKET_STATE[e.data.payload.channel] }); }); }; var onDisconnected = function onDisconnected() { console.log('[use-stomp::ws::disconnected]'); setState(States.DISCONNECTED); if (!ctx.WEBSOCKET_EXPLICIT_DISCONNECT && !ctx.WEBSOCKET_RECONNECT_INTERVAL && !ctx.WEBSOCKET_RECONNECT_COUNT) { ctx.WEBSOCKET_RECONNECT_COUNT = 1; var maxAttempts = ctx.WEBSOCKET_RECONNECT_MAX_ATTEMPTS; var reconnect = function reconnect() { console.log('[use-stomp::ws::reconnecting]', "".concat(ctx.WEBSOCKET_RECONNECT_COUNT, " / ").concat(maxAttempts)); var hasMaxAttempts = ctx.WEBSOCKET_RECONNECT_COUNT > maxAttempts; var canTerminate = isConnected() || hasMaxAttempts; if (canTerminate) { console.log('[use-stomp::ws::reconnected]'); clearInterval(ctx.WEBSOCKET_RECONNECT_INTERVAL); ctx.WEBSOCKET_RECONNECT_COUNT = 0; ctx.WEBSOCKET_RECONNECT_INTERVAL = null; } else if (!isConnecting() && !isConnected() && !hasMaxAttempts) { ctx.WEBSOCKET_RECONNECT_COUNT = ctx.WEBSOCKET_RECONNECT_COUNT + 1; connect(); } }; ctx.WEBSOCKET_RECONNECT_INTERVAL = setInterval(reconnect, ctx.WEBSOCKET_RECONNECT_INTERVAL_MS); reconnect(); } }; var onError = function onError(e) { broadcast(Events.ERROR, e); }; var isConnected = function isConnected() { return ctx.WEBSOCKET_CONNECTION === States.CONNECTED; }; var isConnecting = function isConnecting() { return ctx.WEBSOCKET_CONNECTION === States.CONNECTING; }; var isDisconnected = function isDisconnected() { return ctx.WEBSOCKET_CONNECTION === States.DISCONNECTED; }; var isDisconnecting = function isDisconnecting() { return ctx.WEBSOCKET_CONNECTION === States.DISCONNECTING; }; var isAnyTabVisible = function isAnyTabVisible() { return ctx.WEBSOCKET_VISIBLE_TABS.size > 0; }; var connect = function connect() { if (isConnecting() || isConnected() || isDisconnecting()) { return; } disconnect(); setState(States.CONNECTING); ctx.WEBSOCKET = Stomp.over(new SockJS(ctx.WEBSOCKET_URL, null, {})); ctx.WEBSOCKET.connect(ctx.WEBSOCKET_AUTH_HEADER ? { Authorization: ctx.WEBSOCKET_AUTH_HEADER } : ctx.WEBSOCKET_HEADER, onConnected, onDisconnected, onError); }; var disconnect = function disconnect() { if (isDisconnecting() || isDisconnected()) { return; } ctx.WEBSOCKET_EXPLICIT_DISCONNECT = true; setState(States.DISCONNECTING); unsubscribeAll(); if (ctx.WEBSOCKET) { ctx.WEBSOCKET.disconnect(function () { ctx.WEBSOCKET_EXPLICIT_DISCONNECT = false; }); } setState(States.DISCONNECTED); }; var testDisconnect = function testDisconnect() { if (isConnected() && !(isDisconnected() || isDisconnecting())) { setState(States.DISCONNECTING); unsubscribeAll(); if (ctx.WEBSOCKET) { ctx.WEBSOCKET.disconnect(); } setState(States.DISCONNECTED); } }; var resubscribeAll = function resubscribeAll() { var _ctx$WEBSOCKET, _ctx$WEBSOCKET2; if ((_ctx$WEBSOCKET = ctx.WEBSOCKET) !== null && _ctx$WEBSOCKET !== void 0 && _ctx$WEBSOCKET.subscribe && (_ctx$WEBSOCKET2 = ctx.WEBSOCKET) !== null && _ctx$WEBSOCKET2 !== void 0 && _ctx$WEBSOCKET2.connected && isConnected()) { ctx.WEBSOCKET_CHANNELS.forEach(function (subscription, channel) { ctx.WEBSOCKET_CHANNELS.set(channel, ctx.WEBSOCKET.subscribe(channel, onChannelMessage(channel))); }); } }; var subscribe = function subscribe(e) { if (isConnected() && !ctx.WEBSOCKET_CHANNELS.has(e.data.payload.channel)) { ctx.WEBSOCKET_CHANNELS.set(e.data.payload.channel, ctx.WEBSOCKET.subscribe(e.data.payload.channel, onChannelMessage(e.data.payload.channel))); } // if channel has no subscriptions, set it as an array and add id if (!ctx.WEBSOCKET_SUBSCRIPTIONS.has(e.data.payload.channel)) { ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [e.data.payload.id]); } else { // if channel does exist, update the ids to include id ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [].concat(_toConsumableArray(ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel)), [e.data.payload.id])); } }; var subscribeSync = function subscribeSync(e) { if (isConnected() && !ctx.WEBSOCKET_CHANNELS.has(e.data.payload.channel)) { ctx.WEBSOCKET_CHANNELS.set(e.data.payload.channel, ctx.WEBSOCKET.subscribe(e.data.payload.channel, onChannelMessageSync(e.data.payload.channel))); } // if channel has no subscriptions, set it as an array and add id if (!ctx.WEBSOCKET_SUBSCRIPTIONS.has(e.data.payload.channel)) { ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [e.data.payload.id]); } else { // if channel does exist, update the ids to include id ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [].concat(_toConsumableArray(ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel)), [e.data.payload.id])); } }; var sendMessage = function sendMessage(e) { if (ctx.WEBSOCKET && isConnected()) { ctx.WEBSOCKET.send(e.data.payload.channel, null, packageMessage(e.data.payload.message)); } }; var setAuthHeader = function setAuthHeader(e) { ctx.WEBSOCKET_AUTH_HEADER = e.data.payload; }; var setHeader = function setHeader(e) { ctx.WEBSOCKET_HEADER = e.data.payload; }; var setUrl = function setUrl(e) { ctx.WEBSOCKET_URL = e.data.payload; }; var setVisibility = function setVisibility(e) { var visible = e.data.payload.visibility; var current = ctx.WEBSOCKET_VISIBLE_TABS.has(e.data.payload.id); if (visible && !current) { ctx.WEBSOCKET_VISIBLE_TABS.add(e.data.payload.id); } if (!visible && current) { ctx.WEBSOCKET_VISIBLE_TABS.delete(e.data.payload.id); } }; var setState = function setState(state) { ctx.WEBSOCKET_CONNECTION = state; broadcast(Events.CONNECTION, ctx.WEBSOCKET_CONNECTION); }; var unregister = function unregister(e) { ctx.WEBSOCKET_PORTS.delete(e.data.payload.id); ctx.WEBSOCKET_VISIBLE_TABS.delete(e.data.payload.id); ctx.WEBSOCKET_SUBSCRIPTIONS.forEach(function (ids, channel) { unsubscribe(_objectSpread(_objectSpread({}, e), {}, { data: { payload: _objectSpread(_objectSpread({}, e.data.payload), {}, { channel: channel }) } })); }); }; var unsubscribe = function unsubscribe(e) { var uuid = e.data.payload.id; var channel = e.data.payload.channel; if (ctx.WEBSOCKET_SUBSCRIPTIONS.has(channel)) { var ids = ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel).filter(function (name, callable) { callable.displayName = name; Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, { value: name })); return callable; }("ids", function (id) { return id !== uuid; })); if (!ids.length) { ctx.WEBSOCKET_SUBSCRIPTIONS.delete(channel); ctx.WEBSOCKET_CHANNELS.get(channel).unsubscribe(); ctx.WEBSOCKET_CHANNELS.delete(channel); } else { ctx.WEBSOCKET_SUBSCRIPTIONS.set(channel, ids); } } }; var unsubscribeAll = function unsubscribeAll() { ctx.WEBSOCKET_CHANNELS.forEach(function (subscription, channel) { subscription.unsubscribe(); ctx.WEBSOCKET_CHANNELS.delete(channel); ctx.WEBSOCKET_SUBSCRIPTIONS.delete(channel); }); }; _self.addEventListener('connect', function (e) { var port = e.ports[0]; var register = function register(e) { ctx.WEBSOCKET_PORTS.set(e.data.payload.id, port); ctx.WEBSOCKET_RECONNECT_INTERVAL_MS = e.data.payload.reconnectInterval; ctx.WEBSOCKET_RECONNECT_MAX_ATTEMPTS = e.data.payload.reconnectMaxAttempts; if (e.data.payload.visible) { ctx.WEBSOCKET_VISIBLE_TABS.add(e.data.payload.id); } }; port.addEventListener('message', function (e) { var _messageBroker; var messageBroker = (_messageBroker = {}, _defineProperty(_messageBroker, Events.CONNECT, connect), _defineProperty(_messageBroker, Events.DISMISS_SYNC, onDismissSync), _defineProperty(_messageBroker, Events.DISCONNECT, disconnect), _defineProperty(_messageBroker, Events.REGISTER, register), _defineProperty(_messageBroker, Events.SEND_MESSAGE, sendMessage), _defineProperty(_messageBroker, Events.SET_AUTH_HEADER, setAuthHeader), _defineProperty(_messageBroker, Events.SET_HEADER, setHeader), _defineProperty(_messageBroker, Events.SET_URL, setUrl), _defineProperty(_messageBroker, Events.SET_VISIBILITY, setVisibility), _defineProperty(_messageBroker, Events.SUBSCRIBE, subscribe), _defineProperty(_messageBroker, Events.SUBSCRIBE_SYNC, subscribeSync), _defineProperty(_messageBroker, Events.TEST_DISCONNECT, testDisconnect), _defineProperty(_messageBroker, Events.UNREGISTER, unregister), _defineProperty(_messageBroker, Events.UNSUBSCRIBE, unsubscribe), _defineProperty(_messageBroker, Events.UNSUBSCRIBE_SYNC, unsubscribe), _messageBroker); if (messageBroker[e.data.type]) { messageBroker[e.data.type](e); } }); port.start(); console.log('[use-stomp::port::connected]'); port.postMessage({ type: Events.CONNECTION, payload: ctx.WEBSOCKET_CONNECTION }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJTb2NrZXRXb3JrZXJJbnN0YW5jZS50cyJdLCJuYW1lcyI6WyJTb2NrSlMiLCJ2NCIsIlN0b21wIiwiRXZlbnRzIiwiU3RhdGVzIiwiX3NlbGYiLCJzZWxmIiwiY3R4IiwiV0VCU09DS0VUIiwiV0VCU09DS0VUX0FVVEhfSEVBREVSIiwiV0VCU09DS0VUX0NPTk5FQ1RJT04iLCJESVNDT05ORUNURUQiLCJXRUJTT0NLRVRfSEVBREVSIiwiV0VCU09DS0VUX0VYUExJQ0lUX0RJU0NPTk5FQ1QiLCJXRUJTT0NLRVRfVVJMIiwiV0VCU09DS0VUX1NUQVRFIiwiV0VCU09DS0VUX1BPUlRTIiwiTWFwIiwiV0VCU09DS0VUX0NIQU5ORUxTIiwiV0VCU09DS0VUX1JFQ09OTkVDVF9DT1VOVCIsIldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUwiLCJXRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMX01TIiwiV0VCU09DS0VUX1JFQ09OTkVDVF9NQVhfQVRURU1QVFMiLCJXRUJTT0NLRVRfU1VCU0NSSVBUSU9OUyIsIldFQlNPQ0tFVF9WSVNJQkxFX1RBQlMiLCJTZXQiLCJwYWNrYWdlTWVzc2FnZSIsIm1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsInBhcnNlTWVzc2FnZSIsInBhcnNlZCIsInBhcnNlIiwiY29udGVudCIsImJyb2FkY2FzdCIsInR5cGUiLCJwYXlsb2FkIiwiZm9yRWFjaCIsInBvcnQiLCJpZCIsImVtaXQiLCJvbmx5VmlzaWJsZSIsImhhcyIsImdldCIsInBvc3RNZXNzYWdlIiwib25Db25uZWN0ZWQiLCJjb25zb2xlIiwibG9nIiwicmVzdWJzY3JpYmVBbGwiLCJzZXRTdGF0ZSIsIkNPTk5FQ1RFRCIsIm9uQ2hhbm5lbE1lc3NhZ2UiLCJjaGFubmVsIiwibXNnIiwiYm9keSIsInN0YXR1cyIsImRpc2Nvbm5lY3QiLCJNRVNTQUdFIiwib25DaGFubmVsTWVzc2FnZVN5bmMiLCJvbkRpc21pc3NTeW5jIiwiZGF0YSIsImZpbHRlciIsIm9uRGlzY29ubmVjdGVkIiwibWF4QXR0ZW1wdHMiLCJyZWNvbm5lY3QiLCJoYXNNYXhBdHRlbXB0cyIsImNhblRlcm1pbmF0ZSIsImlzQ29ubmVjdGVkIiwiY2xlYXJJbnRlcnZhbCIsImlzQ29ubmVjdGluZyIsImNvbm5lY3QiLCJzZXRJbnRlcnZhbCIsIm9uRXJyb3IiLCJFUlJPUiIsIkNPTk5FQ1RJTkciLCJpc0Rpc2Nvbm5lY3RlZCIsImlzRGlzY29ubmVjdGluZyIsIkRJU0NPTk5FQ1RJTkciLCJpc0FueVRhYlZpc2libGUiLCJzaXplIiwib3ZlciIsIkF1dGhvcml6YXRpb24iLCJ1bnN1YnNjcmliZUFsbCIsInRlc3REaXNjb25uZWN0Iiwic3Vic2NyaWJlIiwiY29ubmVjdGVkIiwic3Vic2NyaXB0aW9uIiwic2V0Iiwic3Vic2NyaWJlU3luYyIsInNlbmRNZXNzYWdlIiwic2VuZCIsInNldEF1dGhIZWFkZXIiLCJzZXRIZWFkZXIiLCJzZXRVcmwiLCJzZXRWaXNpYmlsaXR5IiwidmlzaWJsZSIsInZpc2liaWxpdHkiLCJjdXJyZW50IiwiYWRkIiwiZGVsZXRlIiwic3RhdGUiLCJDT05ORUNUSU9OIiwidW5yZWdpc3RlciIsImlkcyIsInVuc3Vic2NyaWJlIiwidXVpZCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwb3J0cyIsInJlZ2lzdGVyIiwicmVjb25uZWN0SW50ZXJ2YWwiLCJyZWNvbm5lY3RNYXhBdHRlbXB0cyIsIm1lc3NhZ2VCcm9rZXIiLCJDT05ORUNUIiwiRElTTUlTU19TWU5DIiwiRElTQ09OTkVDVCIsIlJFR0lTVEVSIiwiU0VORF9NRVNTQUdFIiwiU0VUX0FVVEhfSEVBREVSIiwiU0VUX0hFQURFUiIsIlNFVF9VUkwiLCJTRVRfVklTSUJJTElUWSIsIlNVQlNDUklCRSIsIlNVQlNDUklCRV9TWU5DIiwiVEVTVF9ESVNDT05ORUNUIiwiVU5SRUdJU1RFUiIsIlVOU1VCU0NSSUJFIiwiVU5TVUJTQ1JJQkVfU1lOQyIsInN0YXJ0Il0sIm1hcHBpbmdz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O0FBQ2JULElBQUFBLElBQUksRUFBRWpDLE1BQU0sQ0FBQ21HLFVBREE7QUFFYmpFLElBQUFBLE9BQU8sRUFBRTlCLEdBQUcsQ0FBQ0c7QUFGQSxHQUFqQjtBQUlILENBOUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNvY2tKUyBmcm9tICdzb2NranMtY2xpZW50JztcbmltcG9ydCB0eXBlIHtDbGllbnQsIFN1YnNjcmlwdGlvbn0gZnJvbSAnc3RvbXBqcyc7XG5pbXBvcnQge3Y0fSBmcm9tICd1dWlkJztcblxuaW1wb3J0IFN0b21wIGZyb20gJy4vc3RvbXAnO1xuaW1wb3J0IHtFdmVudHMsIFN0YXRlc30gZnJvbSAnLi93ZWJTb2NrZXRDb25maWdzJztcblxudHlwZSBXRUJTT0NLRVRfQ09OTkVDVElPTiA9IHtcbiAgICBXRUJTT0NLRVQ6IENsaWVudDtcbiAgICBXRUJTT0NLRVRfQVVUSF9IRUFERVI6IHN0cmluZztcbiAgICBXRUJTT0NLRVRfQ09OTkVDVElPTjogc3RyaW5nO1xuICAgIFdFQlNPQ0tFVF9FWFBMSUNJVF9ESVNDT05ORUNUOiBib29sZWFuO1xuICAgIFdFQlNPQ0tFVF9IRUFERVI6IHN0cmluZztcbiAgICBXRUJTT0NLRVRfVVJMOiBzdHJpbmc7XG4gICAgV0VCU09DS0VUX1NUQVRFOiB7XG4gICAgICAgIFtjaGFubmVsOiBzdHJpbmddOiB7aWQ6IHN0cmluZzsgbWVzc2FnZTogYW55fVtdO1xuICAgIH07XG4gICAgV0VCU09DS0VUX1BPUlRTOiBNYXA8c3RyaW5nLCBNZXNzYWdlUG9ydD47XG4gICAgV0VCU09DS0VUX0NIQU5ORUxTOiBNYXA8c3RyaW5nLCBTdWJzY3JpcHRpb24+O1xuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQ6IG51bWJlcjtcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMOiBOb2RlSlMuVGltZXI7XG4gICAgV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTF9NUzogbnVtYmVyO1xuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfTUFYX0FUVEVNUFRTOiBudW1iZXI7XG4gICAgV0VCU09DS0VUX1NVQlNDUklQVElPTlM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgICBXRUJTT0NLRVRfVklTSUJMRV9UQUJTOiBTZXQ8c3RyaW5nPjtcbn07XG5cbmludGVyZmFjZSBTaGFyZWRXb3JrZXJHbG9iYWxTY29wZSB7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBsaXN0ZW5lcjogKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHZvaWQsXG4gICAgICAgIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnNcbiAgICApOiB2b2lkO1xuICAgIG9uY29ubmVjdDogKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHZvaWQ7XG4gICAgd3M6IENsaWVudDtcbn1cblxuY29uc3QgX3NlbGY6IFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlID0gc2VsZiBhcyBhbnk7XG5cbmNvbnN0IGN0eDogV0VCU09DS0VUX0NPTk5FQ1RJT04gPSB7XG4gICAgV0VCU09DS0VUOiBudWxsLFxuICAgIFdFQlNPQ0tFVF9BVVRIX0hFQURFUjogJycsXG4gICAgV0VCU09DS0VUX0NPTk5FQ1RJT046IFN0YXRlcy5ESVNDT05ORUNURUQsXG4gICAgV0VCU09DS0VUX0hFQURFUjogJycsXG4gICAgV0VCU09DS0VUX0VYUExJQ0lUX0RJU0NPTk5FQ1Q6IGZhbHNlLFxuICAgIFdFQlNPQ0tFVF9VUkw6ICcnLFxuICAgIFdFQlNPQ0tFVF9TVEFURToge30sXG4gICAgV0VCU09DS0VUX1BPUlRTOiBuZXcgTWFwKCksXG4gICAgV0VCU09DS0VUX0NIQU5ORUxTOiBuZXcgTWFwKCksXG4gICAgV0VCU09DS0VUX1JFQ09OTkVDVF9DT1VOVDogMCxcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMOiBudWxsLFxuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUxfTVM6IDEwMDAwLFxuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfTUFYX0FUVEVNUFRTOiAxMCxcbiAgICBXRUJTT0NLRVRfU1VCU0NSSVBUSU9OUzogbmV3IE1hcCgpLFxuICAgIFdFQlNPQ0tFVF9WSVNJQkxFX1RBQlM6IG5ldyBTZXQoKVxufTtcblxuZnVuY3Rpb24gcGFja2FnZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ29iamVjdCcgJiYgbWVzc2FnZSAhPT0gbnVsbFxuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShtZXNzYWdlKVxuICAgICAgICAgICAgOiBtZXNzYWdlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJzZWQgPT09ICdvYmplY3QnICYmIHBhcnNlZCAhPT0gbnVsbCAmJiBwYXJzZWQuY29udGVudFxuICAgICAgICAgICAgPyBwYXJzZWQuY29udGVudFxuICAgICAgICAgICAgOiBwYXJzZWQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG59XG5cbmNvbnN0IGJyb2FkY2FzdCA9ICh0eXBlLCBwYXlsb2FkKSA9PiB7XG4gICAgY3R4LldFQlNPQ0tFVF9QT1JUUy5mb3JFYWNoKChwb3J0LCBpZCkgPT4ge1xuICAgICAgICBlbWl0KGlkLCB0eXBlLCBwYXlsb2FkKTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGVtaXQgPSAoaWQsIHR5cGUsIHBheWxvYWQsIG9ubHlWaXNpYmxlID0gZmFsc2UpID0+IHtcbiAgICBpZiAoY3R4LldFQlNPQ0tFVF9QT1JUUy5oYXMoaWQpKSB7XG4gICAgICAgIC8vIGlmICghb25seVZpc2libGUgfHwgY3R4LldFQlNPQ0tFVF9WSVNJQkxFX1RBQlMuaGFzKGlkKSkge1xuICAgICAgICBjdHguV0VCU09DS0VUX1BPUlRTLmdldChpZCkucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuY29uc3Qgb25Db25uZWN0ZWQgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ1t1c2Utc3RvbXA6OndzOjpjb25uZWN0ZWRdJyk7XG5cbiAgICByZXN1YnNjcmliZUFsbCgpO1xuXG4gICAgc2V0U3RhdGUoU3RhdGVzLkNPTk5FQ1RFRCk7XG59O1xuXG5jb25zdCBvbkNoYW5uZWxNZXNzYWdlID0gKGNoYW5uZWwpID0+IChtc2cpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gcGFyc2VNZXNzYWdlKG1zZy5ib2R5KTtcblxuICAgIGlmIChtZXNzYWdlPy5zdGF0dXMgPT09ICdFTkQnKSB7XG4gICAgICAgIGRpc2Nvbm5lY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiAoaXNBbnlUYWJWaXNpYmxlKCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmdldChjaGFubmVsKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgICAgZW1pdChpZCwgRXZlbnRzLk1FU1NBR0UsIHtcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gfVxuICAgIH1cbn07XG5cbmNvbnN0IG9uQ2hhbm5lbE1lc3NhZ2VTeW5jID0gKGNoYW5uZWwpID0+IChtc2cpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gcGFyc2VNZXNzYWdlKG1zZy5ib2R5KTtcblxuICAgIGlmIChtZXNzYWdlPy5zdGF0dXMgPT09ICdFTkQnKSB7XG4gICAgICAgIGRpc2Nvbm5lY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdHguV0VCU09DS0VUX1NUQVRFW2NoYW5uZWxdID0gW1xuICAgICAgICAgICAgLi4uKGN0eC5XRUJTT0NLRVRfU1RBVEVbY2hhbm5lbF0gfHwgW10pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiB2NCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcblxuICAgICAgICAoY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmdldChjaGFubmVsKSB8fCBbXSkuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGVtaXQoaWQsIEV2ZW50cy5NRVNTQUdFLCB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjdHguV0VCU09DS0VUX1NUQVRFW2NoYW5uZWxdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuY29uc3Qgb25EaXNtaXNzU3luYyA9IChlKSA9PiB7XG4gICAgY3R4LldFQlNPQ0tFVF9TVEFURVtlLmRhdGEucGF5bG9hZC5jaGFubmVsXSA9IGN0eC5XRUJTT0NLRVRfU1RBVEVbXG4gICAgICAgIGUuZGF0YS5wYXlsb2FkLmNoYW5uZWxcbiAgICBdLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCAhPT0gZS5kYXRhLnBheWxvYWQuaWQpO1xuXG4gICAgKGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5nZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCkgfHwgW10pLmZvckVhY2goXG4gICAgICAgIChpZCkgPT4ge1xuICAgICAgICAgICAgZW1pdChpZCwgRXZlbnRzLk1FU1NBR0UsIHtcbiAgICAgICAgICAgICAgICBjaGFubmVsOiBlLmRhdGEucGF5bG9hZC5jaGFubmVsLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGN0eC5XRUJTT0NLRVRfU1RBVEVbZS5kYXRhLnBheWxvYWQuY2hhbm5lbF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgKTtcbn07XG5cbmNvbnN0IG9uRGlzY29ubmVjdGVkID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdbdXNlLXN0b21wOjp3czo6ZGlzY29ubmVjdGVkXScpO1xuXG4gICAgc2V0U3RhdGUoU3RhdGVzLkRJU0NPTk5FQ1RFRCk7XG5cbiAgICBpZiAoXG4gICAgICAgICFjdHguV0VCU09DS0VUX0VYUExJQ0lUX0RJU0NPTk5FQ1QgJiZcbiAgICAgICAgIWN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMICYmXG4gICAgICAgICFjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9DT1VOVFxuICAgICkge1xuICAgICAgICBjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9DT1VOVCA9IDE7XG5cbiAgICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSBjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9NQVhfQVRURU1QVFM7XG5cbiAgICAgICAgY29uc3QgcmVjb25uZWN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgJ1t1c2Utc3RvbXA6OndzOjpyZWNvbm5lY3RpbmddJyxcbiAgICAgICAgICAgICAgICBgJHtjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9DT1VOVH0gLyAke21heEF0dGVtcHRzfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhc01heEF0dGVtcHRzID0gY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQgPiBtYXhBdHRlbXB0cztcblxuICAgICAgICAgICAgY29uc3QgY2FuVGVybWluYXRlID0gaXNDb25uZWN0ZWQoKSB8fCBoYXNNYXhBdHRlbXB0cztcblxuICAgICAgICAgICAgaWYgKGNhblRlcm1pbmF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbdXNlLXN0b21wOjp3czo6cmVjb25uZWN0ZWRdJyk7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCk7XG4gICAgICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQgPSAwO1xuICAgICAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ29ubmVjdGluZygpICYmICFpc0Nvbm5lY3RlZCgpICYmICFoYXNNYXhBdHRlbXB0cykge1xuICAgICAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UID1cbiAgICAgICAgICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQgKyAxO1xuICAgICAgICAgICAgICAgIGNvbm5lY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCA9IHNldEludGVydmFsKFxuICAgICAgICAgICAgcmVjb25uZWN0LFxuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUxfTVNcbiAgICAgICAgKTtcblxuICAgICAgICByZWNvbm5lY3QoKTtcbiAgICB9XG59O1xuXG5jb25zdCBvbkVycm9yID0gKGUpID0+IHtcbiAgICBicm9hZGNhc3QoRXZlbnRzLkVSUk9SLCBlKTtcbn07XG5cbmNvbnN0IGlzQ29ubmVjdGVkID0gKCkgPT4gY3R4LldFQlNPQ0tFVF9DT05ORUNUSU9OID09PSBTdGF0ZXMuQ09OTkVDVEVEO1xuY29uc3QgaXNDb25uZWN0aW5nID0gKCkgPT4gY3R4LldFQlNPQ0tFVF9DT05ORUNUSU9OID09PSBTdGF0ZXMuQ09OTkVDVElORztcbmNvbnN0IGlzRGlzY29ubmVjdGVkID0gKCkgPT4gY3R4LldFQlNPQ0tFVF9DT05ORUNUSU9OID09PSBTdGF0ZXMuRElTQ09OTkVDVEVEO1xuY29uc3QgaXNEaXNjb25uZWN0aW5nID0gKCkgPT4gY3R4LldFQlNPQ0tFVF9DT05ORUNUSU9OID09PSBTdGF0ZXMuRElTQ09OTkVDVElORztcbmNvbnN0IGlzQW55VGFiVmlzaWJsZSA9ICgpID0+IGN0eC5XRUJTT0NLRVRfVklTSUJMRV9UQUJTLnNpemUgPiAwO1xuXG5jb25zdCBjb25uZWN0ID0gKCkgPT4ge1xuICAgIGlmIChpc0Nvbm5lY3RpbmcoKSB8fCBpc0Nvbm5lY3RlZCgpIHx8IGlzRGlzY29ubmVjdGluZygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaXNjb25uZWN0KCk7XG5cbiAgICBzZXRTdGF0ZShTdGF0ZXMuQ09OTkVDVElORyk7XG5cbiAgICBjdHguV0VCU09DS0VUID0gU3RvbXAub3ZlcihuZXcgU29ja0pTKGN0eC5XRUJTT0NLRVRfVVJMLCBudWxsLCB7fSkpO1xuXG4gICAgKGN0eC5XRUJTT0NLRVQuY29ubmVjdCBhcyBhbnkpKFxuICAgICAgICBjdHguV0VCU09DS0VUX0FVVEhfSEVBREVSXG4gICAgICAgICAgICA/IHtBdXRob3JpemF0aW9uOiBjdHguV0VCU09DS0VUX0FVVEhfSEVBREVSfVxuICAgICAgICAgICAgOiBjdHguV0VCU09DS0VUX0hFQURFUixcbiAgICAgICAgb25Db25uZWN0ZWQsXG4gICAgICAgIG9uRGlzY29ubmVjdGVkLFxuICAgICAgICBvbkVycm9yXG4gICAgKTtcbn07XG5cbmNvbnN0IGRpc2Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgaWYgKGlzRGlzY29ubmVjdGluZygpIHx8IGlzRGlzY29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN0eC5XRUJTT0NLRVRfRVhQTElDSVRfRElTQ09OTkVDVCA9IHRydWU7XG5cbiAgICBzZXRTdGF0ZShTdGF0ZXMuRElTQ09OTkVDVElORyk7XG4gICAgdW5zdWJzY3JpYmVBbGwoKTtcblxuICAgIGlmIChjdHguV0VCU09DS0VUKSB7XG4gICAgICAgIChjdHguV0VCU09DS0VULmRpc2Nvbm5lY3QgYXMgYW55KSgoKSA9PiB7XG4gICAgICAgICAgICBjdHguV0VCU09DS0VUX0VYUExJQ0lUX0RJU0NPTk5FQ1QgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0U3RhdGUoU3RhdGVzLkRJU0NPTk5FQ1RFRCk7XG59O1xuXG5jb25zdCB0ZXN0RGlzY29ubmVjdCA9ICgpID0+IHtcbiAgICBpZiAoaXNDb25uZWN0ZWQoKSAmJiAhKGlzRGlzY29ubmVjdGVkKCkgfHwgaXNEaXNjb25uZWN0aW5nKCkpKSB7XG4gICAgICAgIHNldFN0YXRlKFN0YXRlcy5ESVNDT05ORUNUSU5HKTtcbiAgICAgICAgdW5zdWJzY3JpYmVBbGwoKTtcblxuICAgICAgICBpZiAoY3R4LldFQlNPQ0tFVCkge1xuICAgICAgICAgICAgKGN0eC5XRUJTT0NLRVQuZGlzY29ubmVjdCBhcyBhbnkpKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRTdGF0ZShTdGF0ZXMuRElTQ09OTkVDVEVEKTtcbiAgICB9XG59O1xuXG5jb25zdCByZXN1YnNjcmliZUFsbCA9ICgpID0+IHtcbiAgICBpZiAoY3R4LldFQlNPQ0tFVD8uc3Vic2NyaWJlICYmIGN0eC5XRUJTT0NLRVQ/LmNvbm5lY3RlZCAmJiBpc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfQ0hBTk5FTFMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uLCBjaGFubmVsKSA9PiB7XG4gICAgICAgICAgICBjdHguV0VCU09DS0VUX0NIQU5ORUxTLnNldChcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIGN0eC5XRUJTT0NLRVQuc3Vic2NyaWJlKGNoYW5uZWwsIG9uQ2hhbm5lbE1lc3NhZ2UoY2hhbm5lbCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5jb25zdCBzdWJzY3JpYmUgPSAoZSkgPT4ge1xuICAgIGlmIChpc0Nvbm5lY3RlZCgpICYmICFjdHguV0VCU09DS0VUX0NIQU5ORUxTLmhhcyhlLmRhdGEucGF5bG9hZC5jaGFubmVsKSkge1xuICAgICAgICBjdHguV0VCU09DS0VUX0NIQU5ORUxTLnNldChcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwsXG4gICAgICAgICAgICBjdHguV0VCU09DS0VULnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICBlLmRhdGEucGF5bG9hZC5jaGFubmVsLFxuICAgICAgICAgICAgICAgIG9uQ2hhbm5lbE1lc3NhZ2UoZS5kYXRhLnBheWxvYWQuY2hhbm5lbClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLy8gaWYgY2hhbm5lbCBoYXMgbm8gc3Vic2NyaXB0aW9ucywgc2V0IGl0IGFzIGFuIGFycmF5IGFuZCBhZGQgaWRcbiAgICBpZiAoIWN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5oYXMoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLnNldChlLmRhdGEucGF5bG9hZC5jaGFubmVsLCBbXG4gICAgICAgICAgICBlLmRhdGEucGF5bG9hZC5pZFxuICAgICAgICBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBjaGFubmVsIGRvZXMgZXhpc3QsIHVwZGF0ZSB0aGUgaWRzIHRvIGluY2x1ZGUgaWRcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLnNldChlLmRhdGEucGF5bG9hZC5jaGFubmVsLCBbXG4gICAgICAgICAgICAuLi5jdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuZ2V0KGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpLFxuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuaWRcbiAgICAgICAgXSk7XG4gICAgfVxufTtcblxuY29uc3Qgc3Vic2NyaWJlU3luYyA9IChlKSA9PiB7XG4gICAgaWYgKGlzQ29ubmVjdGVkKCkgJiYgIWN0eC5XRUJTT0NLRVRfQ0hBTk5FTFMuaGFzKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfQ0hBTk5FTFMuc2V0KFxuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuY2hhbm5lbCxcbiAgICAgICAgICAgIGN0eC5XRUJTT0NLRVQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgb25DaGFubmVsTWVzc2FnZVN5bmMoZS5kYXRhLnBheWxvYWQuY2hhbm5lbClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLy8gaWYgY2hhbm5lbCBoYXMgbm8gc3Vic2NyaXB0aW9ucywgc2V0IGl0IGFzIGFuIGFycmF5IGFuZCBhZGQgaWRcbiAgICBpZiAoIWN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5oYXMoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLnNldChlLmRhdGEucGF5bG9hZC5jaGFubmVsLCBbXG4gICAgICAgICAgICBlLmRhdGEucGF5bG9hZC5pZFxuICAgICAgICBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBjaGFubmVsIGRvZXMgZXhpc3QsIHVwZGF0ZSB0aGUgaWRzIHRvIGluY2x1ZGUgaWRcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLnNldChlLmRhdGEucGF5bG9hZC5jaGFubmVsLCBbXG4gICAgICAgICAgICAuLi5jdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuZ2V0KGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpLFxuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuaWRcbiAgICAgICAgXSk7XG4gICAgfVxufTtcblxuY29uc3Qgc2VuZE1lc3NhZ2UgPSAoZSkgPT4ge1xuICAgIGlmIChjdHguV0VCU09DS0VUICYmIGlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVC5zZW5kKFxuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuY2hhbm5lbCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYWNrYWdlTWVzc2FnZShlLmRhdGEucGF5bG9hZC5tZXNzYWdlKVxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmNvbnN0IHNldEF1dGhIZWFkZXIgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfQVVUSF9IRUFERVIgPSBlLmRhdGEucGF5bG9hZDtcbn07XG5cbmNvbnN0IHNldEhlYWRlciA9IChlKSA9PiB7XG4gICAgY3R4LldFQlNPQ0tFVF9IRUFERVIgPSBlLmRhdGEucGF5bG9hZDtcbn07XG5cbmNvbnN0IHNldFVybCA9IChlKSA9PiB7XG4gICAgY3R4LldFQlNPQ0tFVF9VUkwgPSBlLmRhdGEucGF5bG9hZDtcbn07XG5cbmNvbnN0IHNldFZpc2liaWxpdHkgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHZpc2libGUgPSBlLmRhdGEucGF5bG9hZC52aXNpYmlsaXR5O1xuICAgIGNvbnN0IGN1cnJlbnQgPSBjdHguV0VCU09DS0VUX1ZJU0lCTEVfVEFCUy5oYXMoZS5kYXRhLnBheWxvYWQuaWQpO1xuXG4gICAgaWYgKHZpc2libGUgJiYgIWN1cnJlbnQpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9WSVNJQkxFX1RBQlMuYWRkKGUuZGF0YS5wYXlsb2FkLmlkKTtcbiAgICB9XG5cbiAgICBpZiAoIXZpc2libGUgJiYgY3VycmVudCkge1xuICAgICAgICBjdHguV0VCU09DS0VUX1ZJU0lCTEVfVEFCUy5kZWxldGUoZS5kYXRhLnBheWxvYWQuaWQpO1xuICAgIH1cbn07XG5cbmNvbnN0IHNldFN0YXRlID0gKHN0YXRlKSA9PiB7XG4gICAgY3R4LldFQlNPQ0tFVF9DT05ORUNUSU9OID0gc3RhdGU7XG4gICAgYnJvYWRjYXN0KEV2ZW50cy5DT05ORUNUSU9OLCBjdHguV0VCU09DS0VUX0NPTk5FQ1RJT04pO1xufTtcblxuY29uc3QgdW5yZWdpc3RlciA9IChlKSA9PiB7XG4gICAgY3R4LldFQlNPQ0tFVF9QT1JUUy5kZWxldGUoZS5kYXRhLnBheWxvYWQuaWQpO1xuICAgIGN0eC5XRUJTT0NLRVRfVklTSUJMRV9UQUJTLmRlbGV0ZShlLmRhdGEucGF5bG9hZC5pZCk7XG5cbiAgICBjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuZm9yRWFjaCgoaWRzLCBjaGFubmVsKSA9PiB7XG4gICAgICAgIHVuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5lLmRhdGEucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5jb25zdCB1bnN1YnNjcmliZSA9IChlKSA9PiB7XG4gICAgY29uc3QgdXVpZCA9IGUuZGF0YS5wYXlsb2FkLmlkO1xuICAgIGNvbnN0IGNoYW5uZWwgPSBlLmRhdGEucGF5bG9hZC5jaGFubmVsO1xuXG4gICAgaWYgKGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5oYXMoY2hhbm5lbCkpIHtcbiAgICAgICAgY29uc3QgaWRzID0gY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmdldChjaGFubmVsKS5maWx0ZXIoXG4gICAgICAgICAgICAoaWQpID0+IGlkICE9PSB1dWlkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuZGVsZXRlKGNoYW5uZWwpO1xuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9DSEFOTkVMUy5nZXQoY2hhbm5lbCkudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfQ0hBTk5FTFMuZGVsZXRlKGNoYW5uZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgI