/** * Created by denak on 07.04.2016. */ var module = angular.module("teleds.blocks", []); /** * Created by denak on 07.04.2016. */ (function () { var module = angular.module("teleds.auth", ["vcRecaptcha", "LocalStorageModule"]); config.$inject = ['$stateProvider', '$httpProvider', "$urlRouterProvider"]; function config($stateProvider, $httpProvider, $urlRouterProvider) { $httpProvider.interceptors.push('AuthInterceptorService'); $urlRouterProvider.otherwise('/personalAccount/home'); $urlRouterProvider.when('', '/personalAccount/home'); $stateProvider .state('auth', { url: "/auth", abstract: true, templateUrl: 'auth/auth.layout.html', controller: 'AuthController', controllerAs: "vm" }) .state('auth.login', { url: '^/login?{disableRegistration}&&{lang}', templateUrl: 'auth/login/login.html', controller: 'LoginController', controllerAs: "vm" }) .state('auth.signup', { url: '^/signup?{lang}&{cid}', templateUrl: 'auth/signup/signup.html', controller: 'SignupController', controllerAs: "vm", data: { permissions: { only: ['allowRegistration'], redirectTo: function () { return { state: 'auth.login', params: { // custom redirection parameters disableRegistration: 'true' }, options: { // custom ui-router transition params location: false, reload: true } } } } } }) .state('auth.logout', { url: '^/logout', templateUrl: 'auth/logout/logoutController.html', controller: 'LogoutController', controllerAs: "vm" }) .state('auth.confirmEmail', { url: '^/confirm/?{key}', templateUrl: 'auth/confirmEmail/confirmEmail.html', controller: 'ConfirmEmailController', controllerAs: "vm" }) .state('auth.loginExternal', { url: '^/loginExternal/?{token}&{userId}&{remember}', templateUrl: 'auth/loginExternal/loginExternal.html', controller: 'LoginExternalController', controllerAs: "vm" }) .state('auth.rememberPassword', { url: '^/rememberPassword', templateUrl: 'auth/rememberPasswordRequest/rememberPasswordRequest.html', controller: 'RememberPasswordRequestController', controllerAs: "vm" }) .state('auth.rememberPasswordChange', { url: '^/password-recovery/?{key}', templateUrl: 'auth/rememberPasswordChange/rememberPasswordChange.html', controller: 'RememberPasswordChangeController', controllerAs: "vm" }).state('auth.lock', { url: '^/lock', templateUrl: 'auth/lock/lock.html', controller: 'LockController', controllerAs: "vm" }); ; } module.config(config); })(); /** * Created by denak on 05.05.2016. */ (function () { var module = angular.module("teleds.campaigns", []); })(); /** * Created by denak on 05.05.2016. */ (function () { var module = angular.module("teleds.contents", []); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.content', { url: '/content', abstract: true, template:'
' }) .state('personalAccount.content.list', { url: '/list', component: "listContents" }) .state('personalAccount.content.add', { url: '/add', templateUrl: 'content/pages/addContent/addContent.html', controller: 'AddContentController', controllerAs: "vm" }) } module.config(config); })(); (function () { angular.module("teleds.dashboard", []); })(); /** * Created by denak on 12.04.2016. */ (function () { var module = angular.module("teleds.layout", []); })(); /** * Created by denak on 13.04.2016. */ (function () { var module = angular.module("teleds.players", []); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.player', { url: '/player', abstract: true, template: '
' }) .state('personalAccount.player.tracking', { url: '/:id/tracking', templateUrl: 'players/pages/playerTracking/playerTracking.html', controller: 'PlayerTrackingController', controllerAs: "vm" }) .state('personalAccount.player.list', { url: '/list', templateUrl: 'players/players/players.html', controller: 'PlayersController', controllerAs: "vm" }) .state('personalAccount.player.create', { url: '/create', templateUrl: 'players/pages/createNewPlayer/createNewPlayer.html', controller: 'CreateNewPlayerController', controllerAs: "vm" }) .state('personalAccount.player.devStats', { url: '/devStats', templateUrl: 'players/pages/devLastPlayEvents/devLastPlayEvents.html', controller: 'DevLastPlayEventsController', controllerAs: "vm" }) } module.config(config); })(); (function () { var module = angular.module("teleds.user", []); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.preference', { url: '/preference', abstract: true, template: '' }); /*.state('personalAccount.preference.profile', { url: '/profile', templateUrl: 'user/preference/preference.html', controller: 'PreferenceController' });*/ } module.config(config); })(); /** * Created by denak on 05.05.2016. */ (function () { var module = angular.module("teleds.virtualScreens", []); })(); /** * Created by denak on 05.05.2016. */ (function () { var module = angular.module("teleds.statistics", []); })(); /** * Created by denak on 05.05.2016. */ (function () { var module = angular.module("teleds.subscribe", []); })(); 'use strict'; /** * @ngdoc overview * @name newappApp * @description * # newappApp * * Main module of the application. */ (function () { config.$inject = ["$stateProvider", "$urlRouterProvider", "RestangularProvider", "BASE_INFO", "uiGmapGoogleMapApiProvider", "$httpProvider"]; run.$inject = ["PermPermissionStore", "settings", "$q", "AuthService", "billingService", "backService"]; var MakeApp = angular .module('newApp', [ 'ngAnimate', 'ngCookies', 'ngResource', 'restangular', 'ui.router', 'ui.select2', 'ui.select', 'ngSanitize', 'ngTouch', 'ui.bootstrap', 'ui.sortable', 'ngLocalize', 'ngLocalize.Config', 'angular-ladda', 'ui.router.state.events', 'ct.ui.router.extras.core', 'permission', 'permission.ui', 'datatables', 'puElasticInput', 'angular-click-outside', 'angularMoment', 'ngMask', 'ngDragDrop', 'ui.event', 'uiGmapgoogle-maps', 'angular.filter', 'vs-repeat', 'scrollable-table', 'cgBusy', 'templates', "tc.chartjs", "ngOnload", 'angular-cache', 'jQueryScrollbar', "teleds.blocks", 'teleds.auth', "teleds.dashboard", 'teleds.layout', 'teleds.user', 'teleds.players', 'teleds.contents', 'teleds.virtualScreens', 'teleds.campaigns', "teleds.statistics", "teleds.subscribe" ]); function config($stateProvider, $urlRouterProvider, RestangularProvider, BASE_INFO, uiGmapGoogleMapApiProvider, $httpProvider) { "ngInject"; uiGmapGoogleMapApiProvider.configure({ // key: 'your api key', v: '3', //defaults to latest 3.X anyhow libraries: 'geometry,visualization,places,drawing' }); Chart.defaults.global.maintainAspectRatio = false; $httpProvider.useApplyAsync(true); RestangularProvider.setBaseUrl(BASE_INFO.URL + "/"); $stateProvider .state('personalAccount', { url: '/personalAccount', templateUrl: 'layout/layout.html', controller: 'mainCtrl', data: { permissions: { only: ['isAuth'], except: ['isLock'], redirectTo: { isLock: function () { return { state: 'auth.lock' } }, default: function () { return { state: 'auth.login' } } } } } }); } MakeApp.config(config); MakeApp.run(run); function run(PermPermissionStore, settings, $q, AuthService,billingService,backService) { "ngInject" PermPermissionStore // A different example for admin .definePermission('allowRegistration', function (stateParams) { var deferred = $q.defer(); settings.isAllow().then(function (signup) { if (signup.allowed == true) { deferred.resolve(); } else { deferred.reject(); } }).catch(function () { deferred.reject(); }); return deferred.promise; }); PermPermissionStore.definePermission('isAuth', function () { return !!AuthService.authentication.isAuth; }); PermPermissionStore.definePermission('isLock', function () { return !!AuthService.authentication.isLock; }); PermPermissionStore.definePermission('IsPaid', function () { return billingService.getBillingStatus().then(function (status) { if(!status.paid) { return $q.reject(status.paid); } }) }); backService.configure(); } MakeApp.directive('ngSpinnerLoader', ['$rootScope', function ($rootScope) { return { link: function (scope, element, attrs) { // by defult hide the spinner bar element.addClass('hide'); // hide spinner bar by default // display the spinner bar whenever the route changes(the content part started loading) $rootScope.$on('$stateChangeStart', function () { element.removeClass('hide'); // show spinner bar }); // hide the spinner bar on rounte change success(after the content loaded) $rootScope.$on('$stateChangeSuccess', function () { setTimeout(function () { element.addClass('hide'); // hide spinner bar }, 500); $("html, body").animate({ scrollTop: 0 }, 500); }); } }; } ]); MakeApp.value('localeConf', { basePath: '../languages', defaultLocale: 'ru', sharedDictionary: 'common', fileExtension: '.lang.json', persistSelection: true, cookieName: 'COOKIE_LOCALE_LANG', observableAttrs: new RegExp('^data-(?!ng-|i18n)'), delimiter: '::' }).value('localeSupported', [ 'en', 'ru' ]).value('localeFallbacks', { 'en': 'en' }); })(); (function () { controller.$inject = ["$scope", "AuthService"]; angular.module('newApp').controller('mainCtrl', ['$scope', 'applicationService', 'pluginsService', '$location', '$timeout', function ($scope, applicationService, pluginsService, $location, $timeout) { $scope.$emit('isAuth', false); $timeout(function () { $(document).ready(function () { applicationService.init(); pluginsService.init(); // Dropzone.autoDiscover = false; }); $scope.$on('$viewContentLoaded', function () { /* $('.nav.nav-sidebar .nav-active').removeClass('nav-active active'); $('.nav.nav-sidebar .active:not(.nav-parent)').closest('.nav-parent').addClass('nav-active active'); */ if ($location.$$path == '/' || $location.$$path == '/layout-api') { $('.nav.nav-sidebar .nav-parent').removeClass('nav-active active'); $('.nav.nav-sidebar .nav-parent .children').removeClass('nav-active active'); if ($('body').hasClass('sidebar-collapsed') && !$('body').hasClass('sidebar-hover')) return; if ($('body').hasClass('submenu-hover')) return; $('.nav.nav-sidebar .nav-parent .children').slideUp(200); $('.nav-sidebar .arrow').removeClass('active'); } if ($location.$$path == '/') { $('body').addClass('dashboard'); } else { $('body').removeClass('dashboard'); } }); $scope.isActive = function (viewLocation) { return viewLocation === $location.path(); }; }, 0, false) }]); angular.module("newApp") .controller("BodyController", controller); function controller($scope, AuthService) { "ngInject"; var vm =this; $scope.$on('isAuth', function (event, data) { vm.isAuth = data; }); vm.loadFrame = function () { AuthService.frameLoaded.resolve(); } }; })(); /** * Created by denak on 20.05.2016. */ if (!Array.prototype.find) { Array.prototype.find = function (predicate) { if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } return undefined; }; } if (!String.prototype.includes) { String.prototype.includes = function () { 'use strict'; return String.prototype.indexOf.apply(this, arguments) !== -1; }; } if (!String.prototype.isTimeNull) { String.prototype.isTimeNull = function () { 'use strict'; return this === "0000-00-00 00:00:00" }; } function isEmpty(str) { return (!str || 0 === str.length); } function getMaxOfArray(numArray) { return Math.max.apply(null, numArray); } if (!Array.from) { Array.from = (function () { var toStr = Object.prototype.toString; var isCallable = function (fn) { return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; }; var toInteger = function (value) { var number = Number(value); if (isNaN(number)) { return 0; } if (number === 0 || !isFinite(number)) { return number; } return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); }; var maxSafeInteger = Math.pow(2, 53) - 1; var toLength = function (value) { var len = toInteger(value); return Math.min(Math.max(len, 0), maxSafeInteger); }; // Свойство length метода from равно 1. return function from(arrayLike/*, mapFn, thisArg */) { // 1. Положим C равным значению this. var C = this; // 2. Положим items равным ToObject(arrayLike). var items = Object(arrayLike); // 3. ReturnIfAbrupt(items). if (arrayLike == null) { throw new TypeError('Array.from requires an array-like object - not null or undefined'); } // 4. Если mapfn равен undefined, положим mapping равным false. var mapFn = arguments[1]; if (typeof mapFn !== 'undefined') { mapFn = arguments.length > 1 ? arguments[1] : void undefined; // 5. иначе // 5. a. Если вызов IsCallable(mapfn) равен false, выкидываем исключение TypeError. if (!isCallable(mapFn)) { throw new TypeError('Array.from: when provided, the second argument must be a function'); } // 5. b. Если thisArg присутствует, положим T равным thisArg; иначе положим T равным undefined. if (arguments.length > 2) { T = arguments[2]; } } // 10. Положим lenValue равным Get(items, "length"). // 11. Положим len равным ToLength(lenValue). var len = toLength(items.length); // 13. Если IsConstructor(C) равен true, то // 13. a. Положим A равным результату вызова внутреннего метода [[Construct]] // объекта C со списком аргументов, содержащим единственный элемент len. // 14. a. Иначе, положим A равным ArrayCreate(len). var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Положим k равным 0. var k = 0; // 17. Пока k < len, будем повторять... (шаги с a по h) var kValue; while (k < len) { kValue = items[k]; if (mapFn) { A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); } else { A[k] = kValue; } k += 1; } // 18. Положим putStatus равным Put(A, "length", len, true). A.length = len; // 20. Вернём A. return A; }; }()); } if (!Array.fromObject) { Array.fromObject = function (object) { var array = []; for (var prop in object) { if (object.hasOwnProperty(prop)) { array.push(object[prop]); } } return array }; } function cloneObject(source) { var key,value; var clone = Object.create(source); for (key in source) { if (source.hasOwnProperty(key) === true) { value = source[key]; if (value!==null && typeof value==="object") { clone[key] = cloneObject(value); } else { clone[key] = value; } } } return clone; } Array.prototype.move = function (old_index, new_index) { if (new_index >= this.length) { var k = new_index - this.length; while ((k--) + 1) { this.push(undefined); } } this.splice(new_index, 0, this.splice(old_index, 1)[0]); return this; // for testing purposes }; if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; } $.fn.bootstrapDP.dates['ru'] = { days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"], daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб"], daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"], months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"], monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"], today: "Сегодня", clear: "Очистить", format: "dd.mm.yyyy", weekStart: 1 }; function setCaretPosition(elem, caretPos) { if(elem != null) { if(elem.createTextRange) { var range = elem.createTextRange(); range.move('character', caretPos); range.select(); } else { if(elem.selectionStart) { elem.focus(); elem.setSelectionRange(caretPos, caretPos); } else elem.focus(); } } } /** * Created by denak on 07.04.2016. */ (function () { authController.$inject = ["$state", "$scope"]; angular.module("teleds.auth") .controller("AuthController", authController); function authController($state, $scope) { "ngInject"; this.state = $state; $scope.$emit('isAuth', true); }; })(); /** * Created by denak on 17.05.2016. */ (function () { Controller.$inject = ["statistics"]; angular.module("teleds.dashboard").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.home', { url: '/home', templateUrl: 'dashboard/dashboard.html', controller: Controller, controllerAs: 'vm' }); } function Controller(statistics) { "ngInject" var vm = this; vm.items = statistics.getTopPlayerViews().then(function (results) { return results.map(function (item) { item.name = item.player_name; return item; }) }); vm.itemsInactive = statistics.getNoLastActivity(); } })(); 'use strict'; angular.module('newApp') .controller('apiCtrl', ["$scope", "layoutApiService", "applicationService", "pluginsService", function ($scope, layoutApiService, applicationService,pluginsService) { $scope.$on('$viewContentLoaded', function () { //applicationService.init(); $('[data-toggle]').on('click', function (event) { event.preventDefault(); var toggleLayout = $(this).data('toggle'); if (toggleLayout == 'sidebar-behaviour') applicationService.toggleSidebar(); if (toggleLayout == 'submenu') applicationService.toggleSubmenuHover(); if (toggleLayout == 'sidebar-hover') applicationService.toggleSidebarHover(); if (toggleLayout == 'boxed') applicationService.toggleboxedLayout(); if (toggleLayout == 'topbar') applicationService.toggleTopbar(); }); layoutApiService.init(); }); }]); /** * Created by denak on 07.04.2016. */ (function () { angular.module("teleds.blocks") .directive("compareTo", confirmPassword); confirmPassword.$inject = ["$document"]; function confirmPassword($document) { return { require: "ngModel", scope: { otherModelValue: "=compareTo" }, link: function(scope, element, attributes, ngModel) { ngModel.$validators.compareTo = function(modelValue) { return modelValue == scope.otherModelValue; }; scope.$watch("otherModelValue", function() { ngModel.$validate(); }); } }; } })(); /** * Created by denak on 07.04.2016. */ (function () { angular.module("teleds.blocks") .constant('BASE_INFO', { "URL": "https://dev.api.teleds.com", "API_URL": "/api", "DEV":true }) .constant('AcceptFile', { video: ['3GP', 'ASF', 'AVI', 'M2TS', 'M4V', 'MKV', 'MOV', 'QT', 'MP4', 'mpeg', 'MTS', 'VOB', 'WMV', 'WebM', 'divx', 'xvid'].map( function (item) { return 'video/' + item; } ).concat(['.divx']).join(), audio: ['aac', 'amr', 'flac', 'm4a', 'm4b', 'm4p', 'mp3', 'ogg', 'wav', 'wma', 'webm', 'oga', 'mogg', 'mpeg'].map( function (item) { return 'audio/' + item; } ).join(), html5_zip: ["application/octet-stream", "application/zip", "application/x-zip", "application/x-zip-compressed"], image: ['image/*'] } ) .constant('Qualities', [{name: '4k'}, {name: '1080p'}, {name: '720p'}, {name: '480p'}] ) .constant('FillModes', [ { name: "default" }, { name: "preserveAspectCrop" }, { name: "stretch" } ] ) .constant('ContentTypes', [{name: 'video'}, {name: 'image'}, {name: 'audio'}, {name: 'html5_online'}, {name: 'html5_zip'}] ) .constant('ContentStatus', [{name: 'created'}, {name: 'processing'}, {name: 'ready'}, {name: 'error'}] ) .constant('TimezonesForSelect', moment.tz.names().map(function (item) { return {name: item}; }) ) .constant('AudioPriority', [{name: 'fullscreen', default: true}, {name: 'audio'}, {name: "widgets"}]) .constant('TypeScreenVirtualScreen', [{name: 'fullscreen', default: true}, {name: 'video_widget'}] ) .constant('PaymentType', [{name: 'fixed', default: true}, {name: 'views'}] ) .constant('CampaignStatus', [{name: 'active'}, {name: 'archive'}] ) .constant('PlayTimeContent', [{name: 'free'}, {name: 'only_empty'}, {name: 'normal'}] ) .constant('RotationContent', [{name: '0'}, {name: '90'}, {name: '180'}, {name: '270'}] ) .constant('RotationCampaign', [{name: '0'}, {name: '90'}, {name: '180'}, {name: '270'}] ) .constant('PositionType', [{name: 'static'}, {name: 'mobile'}] ) .constant('Countries', [ {"name": "Afghanistan", "code": "AF"}, {"name": "land Islands", "code": "AX"}, {"name": "Albania", "code": "AL"}, {"name": "Algeria", "code": "DZ"}, {"name": "American Samoa", "code": "AS"}, {"name": "AndorrA", "code": "AD"}, {"name": "Angola", "code": "AO"}, {"name": "Anguilla", "code": "AI"}, {"name": "Antarctica", "code": "AQ"}, {"name": "Antigua and Barbuda", "code": "AG"}, {"name": "Argentina", "code": "AR"}, {"name": "Armenia", "code": "AM"}, {"name": "Aruba", "code": "AW"}, {"name": "Australia", "code": "AU"}, {"name": "Austria", "code": "AT"}, {"name": "Azerbaijan", "code": "AZ"}, {"name": "Bahamas", "code": "BS"}, {"name": "Bahrain", "code": "BH"}, {"name": "Bangladesh", "code": "BD"}, {"name": "Barbados", "code": "BB"}, {"name": "Belarus", "code": "BY"}, {"name": "Belgium", "code": "BE"}, {"name": "Belize", "code": "BZ"}, {"name": "Benin", "code": "BJ"}, {"name": "Bermuda", "code": "BM"}, {"name": "Bhutan", "code": "BT"}, {"name": "Bolivia", "code": "BO"}, {"name": "Bosnia and Herzegovina", "code": "BA"}, {"name": "Botswana", "code": "BW"}, {"name": "Bouvet Island", "code": "BV"}, {"name": "Brazil", "code": "BR"}, {"name": "British Indian Ocean Territory", "code": "IO"}, {"name": "Brunei Darussalam", "code": "BN"}, {"name": "Bulgaria", "code": "BG"}, {"name": "Burkina Faso", "code": "BF"}, {"name": "Burundi", "code": "BI"}, {"name": "Cambodia", "code": "KH"}, {"name": "Cameroon", "code": "CM"}, {"name": "Canada", "code": "CA"}, {"name": "Cape Verde", "code": "CV"}, {"name": "Cayman Islands", "code": "KY"}, {"name": "Central African Republic", "code": "CF"}, {"name": "Chad", "code": "TD"}, {"name": "Chile", "code": "CL"}, {"name": "China", "code": "CN"}, {"name": "Christmas Island", "code": "CX"}, {"name": "Cocos (Keeling) Islands", "code": "CC"}, {"name": "Colombia", "code": "CO"}, {"name": "Comoros", "code": "KM"}, {"name": "Congo", "code": "CG"}, {"name": "Congo, The Democratic Republic of the", "code": "CD"}, {"name": "Cook Islands", "code": "CK"}, {"name": "Costa Rica", "code": "CR"}, {"name": "Croatia", "code": "HR"}, {"name": "Cuba", "code": "CU"}, {"name": "Cyprus", "code": "CY"}, {"name": "Czech Republic", "code": "CZ"}, {"name": "Denmark", "code": "DK"}, {"name": "Djibouti", "code": "DJ"}, {"name": "Dominica", "code": "DM"}, {"name": "Dominican Republic", "code": "DO"}, {"name": "Ecuador", "code": "EC"}, {"name": "Egypt", "code": "EG"}, {"name": "El Salvador", "code": "SV"}, {"name": "Equatorial Guinea", "code": "GQ"}, {"name": "Eritrea", "code": "ER"}, {"name": "Estonia", "code": "EE"}, {"name": "Ethiopia", "code": "ET"}, {"name": "Falkland Islands (Malvinas)", "code": "FK"}, {"name": "Faroe Islands", "code": "FO"}, {"name": "Fiji", "code": "FJ"}, {"name": "Finland", "code": "FI"}, {"name": "France", "code": "FR"}, {"name": "French Guiana", "code": "GF"}, {"name": "French Polynesia", "code": "PF"}, {"name": "French Southern Territories", "code": "TF"}, {"name": "Gabon", "code": "GA"}, {"name": "Gambia", "code": "GM"}, {"name": "Georgia", "code": "GE"}, {"name": "Germany", "code": "DE"}, {"name": "Ghana", "code": "GH"}, {"name": "Gibraltar", "code": "GI"}, {"name": "Greece", "code": "GR"}, {"name": "Greenland", "code": "GL"}, {"name": "Grenada", "code": "GD"}, {"name": "Guadeloupe", "code": "GP"}, {"name": "Guam", "code": "GU"}, {"name": "Guatemala", "code": "GT"}, {"name": "Guernsey", "code": "GG"}, {"name": "Guinea", "code": "GN"}, {"name": "Guinea-Bissau", "code": "GW"}, {"name": "Guyana", "code": "GY"}, {"name": "Haiti", "code": "HT"}, {"name": "Heard Island and Mcdonald Islands", "code": "HM"}, {"name": "Holy See (Vatican City State)", "code": "VA"}, {"name": "Honduras", "code": "HN"}, {"name": "Hong Kong", "code": "HK"}, {"name": "Hungary", "code": "HU"}, {"name": "Iceland", "code": "IS"}, {"name": "India", "code": "IN"}, {"name": "Indonesia", "code": "ID"}, {"name": "Iran, Islamic Republic Of", "code": "IR"}, {"name": "Iraq", "code": "IQ"}, {"name": "Ireland", "code": "IE"}, {"name": "Isle of Man", "code": "IM"}, {"name": "Israel", "code": "IL"}, {"name": "Italy", "code": "IT"}, {"name": "Jamaica", "code": "JM"}, {"name": "Japan", "code": "JP"}, {"name": "Jersey", "code": "JE"}, {"name": "Jordan", "code": "JO"}, {"name": "Kazakhstan", "code": "KZ"}, {"name": "Kenya", "code": "KE"}, {"name": "Kiribati", "code": "KI"}, {"name": "Korea, Democratic People Republic of", "code": "KP"}, {"name": "Korea, Republic of", "code": "KR"}, {"name": "Kuwait", "code": "KW"}, {"name": "Kyrgyzstan", "code": "KG"}, {"name": "Lao People Democratic Republic", "code": "LA"}, {"name": "Latvia", "code": "LV"}, {"name": "Lebanon", "code": "LB"}, {"name": "Lesotho", "code": "LS"}, {"name": "Liberia", "code": "LR"}, {"name": "Libyan Arab Jamahiriya", "code": "LY"}, {"name": "Liechtenstein", "code": "LI"}, {"name": "Lithuania", "code": "LT"}, {"name": "Luxembourg", "code": "LU"}, {"name": "Macao", "code": "MO"}, {"name": "Macedonia, The Former Yugoslav Republic of", "code": "MK"}, {"name": "Madagascar", "code": "MG"}, {"name": "Malawi", "code": "MW"}, {"name": "Malaysia", "code": "MY"}, {"name": "Maldives", "code": "MV"}, {"name": "Mali", "code": "ML"}, {"name": "Malta", "code": "MT"}, {"name": "Marshall Islands", "code": "MH"}, {"name": "Martinique", "code": "MQ"}, {"name": "Mauritania", "code": "MR"}, {"name": "Mauritius", "code": "MU"}, {"name": "Mayotte", "code": "YT"}, {"name": "Mexico", "code": "MX"}, {"name": "Micronesia, Federated States of", "code": "FM"}, {"name": "Moldova, Republic of", "code": "MD"}, {"name": "Monaco", "code": "MC"}, {"name": "Mongolia", "code": "MN"}, {"name": "Montenegro", "code": "ME"}, {"name": "Montserrat", "code": "MS"}, {"name": "Morocco", "code": "MA"}, {"name": "Mozambique", "code": "MZ"}, {"name": "Myanmar", "code": "MM"}, {"name": "Namibia", "code": "NA"}, {"name": "Nauru", "code": "NR"}, {"name": "Nepal", "code": "NP"}, {"name": "Netherlands", "code": "NL"}, {"name": "Netherlands Antilles", "code": "AN"}, {"name": "New Caledonia", "code": "NC"}, {"name": "New Zealand", "code": "NZ"}, {"name": "Nicaragua", "code": "NI"}, {"name": "Niger", "code": "NE"}, {"name": "Nigeria", "code": "NG"}, {"name": "Niue", "code": "NU"}, {"name": "Norfolk Island", "code": "NF"}, {"name": "Northern Mariana Islands", "code": "MP"}, {"name": "Norway", "code": "NO"}, {"name": "Oman", "code": "OM"}, {"name": "Pakistan", "code": "PK"}, {"name": "Palau", "code": "PW"}, {"name": "Palestinian Territory, Occupied", "code": "PS"}, {"name": "Panama", "code": "PA"}, {"name": "Papua New Guinea", "code": "PG"}, {"name": "Paraguay", "code": "PY"}, {"name": "Peru", "code": "PE"}, {"name": "Philippines", "code": "PH"}, {"name": "Pitcairn", "code": "PN"}, {"name": "Poland", "code": "PL"}, {"name": "Portugal", "code": "PT"}, {"name": "Puerto Rico", "code": "PR"}, {"name": "Qatar", "code": "QA"}, {"name": "Reunion", "code": "RE"}, {"name": "Romania", "code": "RO"}, {"name": "Russian Federation", "code": "RU"}, {"name": "RWANDA", "code": "RW"}, {"name": "Saint Helena", "code": "SH"}, {"name": "Saint Kitts and Nevis", "code": "KN"}, {"name": "Saint Lucia", "code": "LC"}, {"name": "Saint Pierre and Miquelon", "code": "PM"}, {"name": "Saint Vincent and the Grenadines", "code": "VC"}, {"name": "Samoa", "code": "WS"}, {"name": "San Marino", "code": "SM"}, {"name": "Sao Tome and Principe", "code": "ST"}, {"name": "Saudi Arabia", "code": "SA"}, {"name": "Senegal", "code": "SN"}, {"name": "Serbia", "code": "RS"}, {"name": "Seychelles", "code": "SC"}, {"name": "Sierra Leone", "code": "SL"}, {"name": "Singapore", "code": "SG"}, {"name": "Slovakia", "code": "SK"}, {"name": "Slovenia", "code": "SI"}, {"name": "Solomon Islands", "code": "SB"}, {"name": "Somalia", "code": "SO"}, {"name": "South Africa", "code": "ZA"}, {"name": "South Georgia and the South Sandwich Islands", "code": "GS"}, {"name": "Spain", "code": "ES"}, {"name": "Sri Lanka", "code": "LK"}, {"name": "Sudan", "code": "SD"}, {"name": "Suriname", "code": "SR"}, {"name": "Svalbard and Jan Mayen", "code": "SJ"}, {"name": "Swaziland", "code": "SZ"}, {"name": "Sweden", "code": "SE"}, {"name": "Switzerland", "code": "CH"}, {"name": "Syrian Arab Republic", "code": "SY"}, {"name": "Taiwan, Province of China", "code": "TW"}, {"name": "Tajikistan", "code": "TJ"}, {"name": "Tanzania, United Republic of", "code": "TZ"}, {"name": "Thailand", "code": "TH"}, {"name": "Timor-Leste", "code": "TL"}, {"name": "Togo", "code": "TG"}, {"name": "Tokelau", "code": "TK"}, {"name": "Tonga", "code": "TO"}, {"name": "Trinidad and Tobago", "code": "TT"}, {"name": "Tunisia", "code": "TN"}, {"name": "Turkey", "code": "TR"}, {"name": "Turkmenistan", "code": "TM"}, {"name": "Turks and Caicos Islands", "code": "TC"}, {"name": "Tuvalu", "code": "TV"}, {"name": "Uganda", "code": "UG"}, {"name": "Ukraine", "code": "UA"}, {"name": "United Arab Emirates", "code": "AE"}, {"name": "United Kingdom", "code": "GB"}, {"name": "United States", "code": "US"}, {"name": "United States Minor Outlying Islands", "code": "UM"}, {"name": "Uruguay", "code": "UY"}, {"name": "Uzbekistan", "code": "UZ"}, {"name": "Vanuatu", "code": "VU"}, {"name": "Venezuela", "code": "VE"}, {"name": "Viet Nam", "code": "VN"}, {"name": "Virgin Islands, British", "code": "VG"}, {"name": "Virgin Islands, U.S.", "code": "VI"}, {"name": "Wallis and Futuna", "code": "WF"}, {"name": "Western Sahara", "code": "EH"}, {"name": "Yemen", "code": "YE"}, {"name": "Zambia", "code": "ZM"}, {"name": "Zimbabwe", "code": "ZW"} ] ).constant('Timezones', [{"name": "Africa/Abidjan", "offset": "+00:00"}, { "name": "Africa/Accra", "offset": "+00:00" }, {"name": "Africa/Addis_Ababa", "offset": "+03:00"}, { "name": "Africa/Algiers", "offset": "+01:00" }, {"name": "Africa/Asmara", "offset": "+03:00"}, { "name": "Africa/Asmera", "offset": "+03:00" }, {"name": "Africa/Bamako", "offset": "+00:00"}, { "name": "Africa/Bangui", "offset": "+01:00" }, {"name": "Africa/Banjul", "offset": "+00:00"}, { "name": "Africa/Bissau", "offset": "+00:00" }, {"name": "Africa/Blantyre", "offset": "+02:00"}, { "name": "Africa/Brazzaville", "offset": "+01:00" }, {"name": "Africa/Bujumbura", "offset": "+02:00"}, { "name": "Africa/Cairo", "offset": "+02:00" }, {"name": "Africa/Casablanca", "offset": "+00:00"}, { "name": "Africa/Ceuta", "offset": "+01:00" }, {"name": "Africa/Conakry", "offset": "+00:00"}, { "name": "Africa/Dakar", "offset": "+00:00" }, {"name": "Africa/Dar_es_Salaam", "offset": "+03:00"}, { "name": "Africa/Djibouti", "offset": "+03:00" }, {"name": "Africa/Douala", "offset": "+01:00"}, { "name": "Africa/El_Aaiun", "offset": "+00:00" }, {"name": "Africa/Freetown", "offset": "+00:00"}, { "name": "Africa/Gaborone", "offset": "+02:00" }, {"name": "Africa/Harare", "offset": "+02:00"}, { "name": "Africa/Johannesburg", "offset": "+02:00" }, {"name": "Africa/Juba", "offset": "+03:00"}, { "name": "Africa/Kampala", "offset": "+03:00" }, {"name": "Africa/Khartoum", "offset": "+03:00"}, { "name": "Africa/Kigali", "offset": "+02:00" }, {"name": "Africa/Kinshasa", "offset": "+01:00"}, { "name": "Africa/Lagos", "offset": "+01:00" }, {"name": "Africa/Libreville", "offset": "+01:00"}, { "name": "Africa/Lome", "offset": "+00:00" }, {"name": "Africa/Luanda", "offset": "+01:00"}, { "name": "Africa/Lubumbashi", "offset": "+02:00" }, {"name": "Africa/Lusaka", "offset": "+02:00"}, { "name": "Africa/Malabo", "offset": "+01:00" }, {"name": "Africa/Maputo", "offset": "+02:00"}, { "name": "Africa/Maseru", "offset": "+02:00" }, {"name": "Africa/Mbabane", "offset": "+02:00"}, { "name": "Africa/Mogadishu", "offset": "+03:00" }, {"name": "Africa/Monrovia", "offset": "+00:00"}, { "name": "Africa/Nairobi", "offset": "+03:00" }, {"name": "Africa/Ndjamena", "offset": "+01:00"}, { "name": "Africa/Niamey", "offset": "+01:00" }, {"name": "Africa/Nouakchott", "offset": "+00:00"}, { "name": "Africa/Ouagadougou", "offset": "+00:00" }, {"name": "Africa/Porto-Novo", "offset": "+01:00"}, { "name": "Africa/Sao_Tome", "offset": "+00:00" }, {"name": "Africa/Timbuktu", "offset": "+00:00"}, { "name": "Africa/Tripoli", "offset": "+02:00" }, {"name": "Africa/Tunis", "offset": "+01:00"}, { "name": "Africa/Windhoek", "offset": "+02:00" }, {"name": "America/Adak", "offset": "-10:00"}, { "name": "America/Anchorage", "offset": "-09:00" }, {"name": "America/Anguilla", "offset": "-04:00"}, { "name": "America/Antigua", "offset": "-04:00" }, {"name": "America/Araguaina", "offset": "-03:00"}, { "name": "America/Argentina/Buenos_Aires", "offset": "-03:00" }, {"name": "America/Argentina/Catamarca", "offset": "-03:00"}, { "name": "America/Argentina/ComodRivadavia", "offset": "-03:00" }, {"name": "America/Argentina/Cordoba", "offset": "-03:00"}, { "name": "America/Argentina/Jujuy", "offset": "-03:00" }, {"name": "America/Argentina/La_Rioja", "offset": "-03:00"}, { "name": "America/Argentina/Mendoza", "offset": "-03:00" }, {"name": "America/Argentina/Rio_Gallegos", "offset": "-03:00"}, { "name": "America/Argentina/Salta", "offset": "-03:00" }, {"name": "America/Argentina/San_Juan", "offset": "-03:00"}, { "name": "America/Argentina/San_Luis", "offset": "-03:00" }, {"name": "America/Argentina/Tucuman", "offset": "-03:00"}, { "name": "America/Argentina/Ushuaia", "offset": "-03:00" }, {"name": "America/Aruba", "offset": "-04:00"}, { "name": "America/Asuncion", "offset": "-03:00" }, {"name": "America/Atikokan", "offset": "-05:00"}, { "name": "America/Atka", "offset": "-10:00" }, {"name": "America/Bahia", "offset": "-03:00"}, { "name": "America/Bahia_Banderas", "offset": "-06:00" }, {"name": "America/Barbados", "offset": "-04:00"}, { "name": "America/Belem", "offset": "-03:00" }, {"name": "America/Belize", "offset": "-06:00"}, { "name": "America/Blanc-Sablon", "offset": "-04:00" }, {"name": "America/Boa_Vista", "offset": "-04:00"}, { "name": "America/Bogota", "offset": "-05:00" }, {"name": "America/Boise", "offset": "-07:00"}, { "name": "America/Buenos_Aires", "offset": "-03:00" }, {"name": "America/Cambridge_Bay", "offset": "-07:00"}, { "name": "America/Campo_Grande", "offset": "-03:00" }, {"name": "America/Cancun", "offset": "-05:00"}, { "name": "America/Caracas", "offset": "-04:30" }, {"name": "America/Catamarca", "offset": "-03:00"}, { "name": "America/Cayenne", "offset": "-03:00" }, {"name": "America/Cayman", "offset": "-05:00"}, { "name": "America/Chicago", "offset": "-06:00" }, {"name": "America/Chihuahua", "offset": "-07:00"}, { "name": "America/Coral_Harbour", "offset": "-05:00" }, {"name": "America/Cordoba", "offset": "-03:00"}, { "name": "America/Costa_Rica", "offset": "-06:00" }, {"name": "America/Creston", "offset": "-07:00"}, { "name": "America/Cuiaba", "offset": "-03:00" }, {"name": "America/Curacao", "offset": "-04:00"}, { "name": "America/Danmarkshavn", "offset": "+00:00" }, {"name": "America/Dawson", "offset": "-08:00"}, { "name": "America/Dawson_Creek", "offset": "-07:00" }, {"name": "America/Denver", "offset": "-07:00"}, { "name": "America/Detroit", "offset": "-05:00" }, {"name": "America/Dominica", "offset": "-04:00"}, { "name": "America/Edmonton", "offset": "-07:00" }, {"name": "America/Eirunepe", "offset": "-05:00"}, { "name": "America/El_Salvador", "offset": "-06:00" }, {"name": "America/Ensenada", "offset": "-08:00"}, { "name": "America/Fort_Nelson", "offset": "-07:00" }, {"name": "America/Fort_Wayne", "offset": "-05:00"}, { "name": "America/Fortaleza", "offset": "-03:00" }, {"name": "America/Glace_Bay", "offset": "-04:00"}, { "name": "America/Godthab", "offset": "-03:00" }, {"name": "America/Goose_Bay", "offset": "-04:00"}, { "name": "America/Grand_Turk", "offset": "-04:00" }, {"name": "America/Grenada", "offset": "-04:00"}, { "name": "America/Guadeloupe", "offset": "-04:00" }, {"name": "America/Guatemala", "offset": "-06:00"}, { "name": "America/Guayaquil", "offset": "-05:00" }, {"name": "America/Guyana", "offset": "-04:00"}, { "name": "America/Halifax", "offset": "-04:00" }, {"name": "America/Havana", "offset": "-05:00"}, { "name": "America/Hermosillo", "offset": "-07:00" }, {"name": "America/Indiana/Indianapolis", "offset": "-05:00"}, { "name": "America/Indiana/Knox", "offset": "-06:00" }, {"name": "America/Indiana/Marengo", "offset": "-05:00"}, { "name": "America/Indiana/Petersburg", "offset": "-05:00" }, {"name": "America/Indiana/Tell_City", "offset": "-06:00"}, { "name": "America/Indiana/Vevay", "offset": "-05:00" }, {"name": "America/Indiana/Vincennes", "offset": "-05:00"}, { "name": "America/Indiana/Winamac", "offset": "-05:00" }, {"name": "America/Indianapolis", "offset": "-05:00"}, { "name": "America/Inuvik", "offset": "-07:00" }, {"name": "America/Iqaluit", "offset": "-05:00"}, { "name": "America/Jamaica", "offset": "-05:00" }, {"name": "America/Jujuy", "offset": "-03:00"}, { "name": "America/Juneau", "offset": "-09:00" }, {"name": "America/Kentucky/Louisville", "offset": "-05:00"}, { "name": "America/Kentucky/Monticello", "offset": "-05:00" }, {"name": "America/Knox_IN", "offset": "-06:00"}, { "name": "America/Kralendijk", "offset": "-04:00" }, {"name": "America/La_Paz", "offset": "-04:00"}, { "name": "America/Lima", "offset": "-05:00" }, {"name": "America/Los_Angeles", "offset": "-08:00"}, { "name": "America/Louisville", "offset": "-05:00" }, {"name": "America/Lower_Princes", "offset": "-04:00"}, { "name": "America/Maceio", "offset": "-03:00" }, {"name": "America/Managua", "offset": "-06:00"}, { "name": "America/Manaus", "offset": "-04:00" }, {"name": "America/Marigot", "offset": "-04:00"}, { "name": "America/Martinique", "offset": "-04:00" }, {"name": "America/Matamoros", "offset": "-06:00"}, { "name": "America/Mazatlan", "offset": "-07:00" }, {"name": "America/Mendoza", "offset": "-03:00"}, { "name": "America/Menominee", "offset": "-06:00" }, {"name": "America/Merida", "offset": "-06:00"}, { "name": "America/Metlakatla", "offset": "-09:00" }, {"name": "America/Mexico_City", "offset": "-06:00"}, { "name": "America/Miquelon", "offset": "-03:00" }, {"name": "America/Moncton", "offset": "-04:00"}, { "name": "America/Monterrey", "offset": "-06:00" }, {"name": "America/Montevideo", "offset": "-03:00"}, { "name": "America/Montreal", "offset": "-05:00" }, {"name": "America/Montserrat", "offset": "-04:00"}, { "name": "America/Nassau", "offset": "-05:00" }, {"name": "America/New_York", "offset": "-05:00"}, { "name": "America/Nipigon", "offset": "-05:00" }, {"name": "America/Nome", "offset": "-09:00"}, { "name": "America/Noronha", "offset": "-02:00" }, {"name": "America/North_Dakota/Beulah", "offset": "-06:00"}, { "name": "America/North_Dakota/Center", "offset": "-06:00" }, {"name": "America/North_Dakota/New_Salem", "offset": "-06:00"}, { "name": "America/Ojinaga", "offset": "-07:00" }, {"name": "America/Panama", "offset": "-05:00"}, { "name": "America/Pangnirtung", "offset": "-05:00" }, {"name": "America/Paramaribo", "offset": "-03:00"}, { "name": "America/Phoenix", "offset": "-07:00" }, {"name": "America/Port-au-Prince", "offset": "-05:00"}, { "name": "America/Port_of_Spain", "offset": "-04:00" }, {"name": "America/Porto_Acre", "offset": "-05:00"}, { "name": "America/Porto_Velho", "offset": "-04:00" }, {"name": "America/Puerto_Rico", "offset": "-04:00"}, { "name": "America/Rainy_River", "offset": "-06:00" }, {"name": "America/Rankin_Inlet", "offset": "-06:00"}, { "name": "America/Recife", "offset": "-03:00" }, {"name": "America/Regina", "offset": "-06:00"}, { "name": "America/Resolute", "offset": "-06:00" }, {"name": "America/Rio_Branco", "offset": "-05:00"}, { "name": "America/Rosario", "offset": "-03:00" }, {"name": "America/Santa_Isabel", "offset": "-08:00"}, { "name": "America/Santarem", "offset": "-03:00" }, {"name": "America/Santiago", "offset": "-03:00"}, { "name": "America/Santo_Domingo", "offset": "-04:00" }, {"name": "America/Sao_Paulo", "offset": "-02:00"}, { "name": "America/Scoresbysund", "offset": "-01:00" }, {"name": "America/Shiprock", "offset": "-07:00"}, { "name": "America/Sitka", "offset": "-09:00" }, {"name": "America/St_Barthelemy", "offset": "-04:00"}, { "name": "America/St_Johns", "offset": "-03:30" }, {"name": "America/St_Kitts", "offset": "-04:00"}, { "name": "America/St_Lucia", "offset": "-04:00" }, {"name": "America/St_Thomas", "offset": "-04:00"}, { "name": "America/St_Vincent", "offset": "-04:00" }, {"name": "America/Swift_Current", "offset": "-06:00"}, { "name": "America/Tegucigalpa", "offset": "-06:00" }, {"name": "America/Thule", "offset": "-04:00"}, { "name": "America/Thunder_Bay", "offset": "-05:00" }, {"name": "America/Tijuana", "offset": "-08:00"}, { "name": "America/Toronto", "offset": "-05:00" }, {"name": "America/Tortola", "offset": "-04:00"}, { "name": "America/Vancouver", "offset": "-08:00" }, {"name": "America/Virgin", "offset": "-04:00"}, { "name": "America/Whitehorse", "offset": "-08:00" }, {"name": "America/Winnipeg", "offset": "-06:00"}, { "name": "America/Yakutat", "offset": "-09:00" }, {"name": "America/Yellowknife", "offset": "-07:00"}, { "name": "Antarctica/Casey", "offset": "+08:00" }, {"name": "Antarctica/Davis", "offset": "+07:00"}, { "name": "Antarctica/DumontDUrville", "offset": "+10:00" }, {"name": "Antarctica/Macquarie", "offset": "+11:00"}, { "name": "Antarctica/Mawson", "offset": "+05:00" }, {"name": "Antarctica/McMurdo", "offset": "+13:00"}, { "name": "Antarctica/Palmer", "offset": "-03:00" }, {"name": "Antarctica/Rothera", "offset": "-03:00"}, { "name": "Antarctica/South_Pole", "offset": "+13:00" }, {"name": "Antarctica/Syowa", "offset": "+03:00"}, { "name": "Antarctica/Troll", "offset": "+00:00" }, {"name": "Antarctica/Vostok", "offset": "+06:00"}, { "name": "Arctic/Longyearbyen", "offset": "+01:00" }, {"name": "Asia/Aden", "offset": "+03:00"}, {"name": "Asia/Almaty", "offset": "+06:00"}, { "name": "Asia/Amman", "offset": "+02:00" }, {"name": "Asia/Anadyr", "offset": "+12:00"}, {"name": "Asia/Aqtau", "offset": "+05:00"}, { "name": "Asia/Aqtobe", "offset": "+05:00" }, {"name": "Asia/Ashgabat", "offset": "+05:00"}, { "name": "Asia/Ashkhabad", "offset": "+05:00" }, {"name": "Asia/Baghdad", "offset": "+03:00"}, {"name": "Asia/Bahrain", "offset": "+03:00"}, { "name": "Asia/Baku", "offset": "+04:00" }, {"name": "Asia/Bangkok", "offset": "+07:00"}, {"name": "Asia/Barnaul", "offset": "+07:00"}, { "name": "Asia/Beirut", "offset": "+02:00" }, {"name": "Asia/Bishkek", "offset": "+06:00"}, {"name": "Asia/Brunei", "offset": "+08:00"}, { "name": "Asia/Calcutta", "offset": "+05:30" }, {"name": "Asia/Chita", "offset": "+09:00"}, { "name": "Asia/Choibalsan", "offset": "+08:00" }, {"name": "Asia/Chongqing", "offset": "+08:00"}, { "name": "Asia/Chungking", "offset": "+08:00" }, {"name": "Asia/Colombo", "offset": "+05:30"}, {"name": "Asia/Dacca", "offset": "+06:00"}, { "name": "Asia/Damascus", "offset": "+02:00" }, {"name": "Asia/Dhaka", "offset": "+06:00"}, {"name": "Asia/Dili", "offset": "+09:00"}, { "name": "Asia/Dubai", "offset": "+04:00" }, {"name": "Asia/Dushanbe", "offset": "+05:00"}, {"name": "Asia/Gaza", "offset": "+02:00"}, { "name": "Asia/Harbin", "offset": "+08:00" }, {"name": "Asia/Hebron", "offset": "+02:00"}, { "name": "Asia/Ho_Chi_Minh", "offset": "+07:00" }, {"name": "Asia/Hong_Kong", "offset": "+08:00"}, {"name": "Asia/Hovd", "offset": "+07:00"}, { "name": "Asia/Irkutsk", "offset": "+08:00" }, {"name": "Asia/Istanbul", "offset": "+02:00"}, { "name": "Asia/Jakarta", "offset": "+07:00" }, {"name": "Asia/Jayapura", "offset": "+09:00"}, { "name": "Asia/Jerusalem", "offset": "+02:00" }, {"name": "Asia/Kabul", "offset": "+04:30"}, {"name": "Asia/Kamchatka", "offset": "+12:00"}, { "name": "Asia/Karachi", "offset": "+05:00" }, {"name": "Asia/Kashgar", "offset": "+06:00"}, { "name": "Asia/Kathmandu", "offset": "+05:45" }, {"name": "Asia/Katmandu", "offset": "+05:45"}, { "name": "Asia/Khandyga", "offset": "+09:00" }, {"name": "Asia/Kolkata", "offset": "+05:30"}, { "name": "Asia/Krasnoyarsk", "offset": "+07:00" }, {"name": "Asia/Kuala_Lumpur", "offset": "+08:00"}, { "name": "Asia/Kuching", "offset": "+08:00" }, {"name": "Asia/Kuwait", "offset": "+03:00"}, {"name": "Asia/Macao", "offset": "+08:00"}, { "name": "Asia/Macau", "offset": "+08:00" }, {"name": "Asia/Magadan", "offset": "+10:00"}, {"name": "Asia/Makassar", "offset": "+08:00"}, { "name": "Asia/Manila", "offset": "+08:00" }, {"name": "Asia/Muscat", "offset": "+04:00"}, { "name": "Asia/Nicosia", "offset": "+02:00" }, {"name": "Asia/Novokuznetsk", "offset": "+07:00"}, { "name": "Asia/Novosibirsk", "offset": "+06:00" }, {"name": "Asia/Omsk", "offset": "+06:00"}, {"name": "Asia/Oral", "offset": "+05:00"}, { "name": "Asia/Phnom_Penh", "offset": "+07:00" }, {"name": "Asia/Pontianak", "offset": "+07:00"}, { "name": "Asia/Pyongyang", "offset": "+08:30" }, {"name": "Asia/Qatar", "offset": "+03:00"}, {"name": "Asia/Qyzylorda", "offset": "+06:00"}, { "name": "Asia/Rangoon", "offset": "+06:30" }, {"name": "Asia/Riyadh", "offset": "+03:00"}, {"name": "Asia/Saigon", "offset": "+07:00"}, { "name": "Asia/Sakhalin", "offset": "+11:00" }, {"name": "Asia/Samarkand", "offset": "+05:00"}, { "name": "Asia/Seoul", "offset": "+09:00" }, {"name": "Asia/Shanghai", "offset": "+08:00"}, { "name": "Asia/Singapore", "offset": "+08:00" }, {"name": "Asia/Srednekolymsk", "offset": "+11:00"}, { "name": "Asia/Taipei", "offset": "+08:00" }, {"name": "Asia/Tashkent", "offset": "+05:00"}, {"name": "Asia/Tbilisi", "offset": "+04:00"}, { "name": "Asia/Tehran", "offset": "+03:30" }, {"name": "Asia/Tel_Aviv", "offset": "+02:00"}, {"name": "Asia/Thimbu", "offset": "+06:00"}, { "name": "Asia/Thimphu", "offset": "+06:00" }, {"name": "Asia/Tokyo", "offset": "+09:00"}, { "name": "Asia/Ujung_Pandang", "offset": "+08:00" }, {"name": "Asia/Ulaanbaatar", "offset": "+08:00"}, { "name": "Asia/Ulan_Bator", "offset": "+08:00" }, {"name": "Asia/Urumqi", "offset": "+06:00"}, { "name": "Asia/Ust-Nera", "offset": "+10:00" }, {"name": "Asia/Vientiane", "offset": "+07:00"}, { "name": "Asia/Vladivostok", "offset": "+10:00" }, {"name": "Asia/Yakutsk", "offset": "+09:00"}, { "name": "Asia/Yekaterinburg", "offset": "+05:00" }, {"name": "Asia/Yerevan", "offset": "+04:00"}, { "name": "Atlantic/Azores", "offset": "-01:00" }, {"name": "Atlantic/Bermuda", "offset": "-04:00"}, { "name": "Atlantic/Canary", "offset": "+00:00" }, {"name": "Atlantic/Cape_Verde", "offset": "-01:00"}, { "name": "Atlantic/Faeroe", "offset": "+00:00" }, {"name": "Atlantic/Faroe", "offset": "+00:00"}, { "name": "Atlantic/Jan_Mayen", "offset": "+01:00" }, {"name": "Atlantic/Madeira", "offset": "+00:00"}, { "name": "Atlantic/Reykjavik", "offset": "+00:00" }, {"name": "Atlantic/South_Georgia", "offset": "-02:00"}, { "name": "Atlantic/St_Helena", "offset": "+00:00" }, {"name": "Atlantic/Stanley", "offset": "-03:00"}, { "name": "Australia/ACT", "offset": "+11:00" }, {"name": "Australia/Adelaide", "offset": "+10:30"}, { "name": "Australia/Brisbane", "offset": "+10:00" }, {"name": "Australia/Broken_Hill", "offset": "+10:30"}, { "name": "Australia/Canberra", "offset": "+11:00" }, {"name": "Australia/Currie", "offset": "+11:00"}, { "name": "Australia/Darwin", "offset": "+09:30" }, {"name": "Australia/Eucla", "offset": "+08:45"}, { "name": "Australia/Hobart", "offset": "+11:00" }, {"name": "Australia/LHI", "offset": "+11:00"}, { "name": "Australia/Lindeman", "offset": "+10:00" }, {"name": "Australia/Lord_Howe", "offset": "+11:00"}, { "name": "Australia/Melbourne", "offset": "+11:00" }, {"name": "Australia/NSW", "offset": "+11:00"}, { "name": "Australia/North", "offset": "+09:30" }, {"name": "Australia/Perth", "offset": "+08:00"}, { "name": "Australia/Queensland", "offset": "+10:00" }, {"name": "Australia/South", "offset": "+10:30"}, { "name": "Australia/Sydney", "offset": "+11:00" }, {"name": "Australia/Tasmania", "offset": "+11:00"}, { "name": "Australia/Victoria", "offset": "+11:00" }, {"name": "Australia/West", "offset": "+08:00"}, { "name": "Australia/Yancowinna", "offset": "+10:30" }, {"name": "Brazil/Acre", "offset": "-05:00"}, { "name": "Brazil/DeNoronha", "offset": "-02:00" }, {"name": "Brazil/East", "offset": "-02:00"}, {"name": "Brazil/West", "offset": "-04:00"}, { "name": "CET", "offset": "+01:00" }, {"name": "CST6CDT", "offset": "-06:00"}, {"name": "Canada/Atlantic", "offset": "-04:00"}, { "name": "Canada/Central", "offset": "-06:00" }, {"name": "Canada/East-Saskatchewan", "offset": "-06:00"}, { "name": "Canada/Eastern", "offset": "-05:00" }, {"name": "Canada/Mountain", "offset": "-07:00"}, { "name": "Canada/Newfoundland", "offset": "-03:30" }, {"name": "Canada/Pacific", "offset": "-08:00"}, { "name": "Canada/Saskatchewan", "offset": "-06:00" }, {"name": "Canada/Yukon", "offset": "-08:00"}, { "name": "Chile/Continental", "offset": "-03:00" }, {"name": "Chile/EasterIsland", "offset": "-05:00"}, {"name": "Cuba", "offset": "-05:00"}, { "name": "EET", "offset": "+02:00" }, {"name": "EST", "offset": "-05:00"}, {"name": "EST5EDT", "offset": "-05:00"}, { "name": "Egypt", "offset": "+02:00" }, {"name": "Eire", "offset": "+00:00"}, {"name": "Etc/GMT", "offset": "+00:00"}, { "name": "Etc/GMT+0", "offset": "+00:00" }, {"name": "Etc/GMT+1", "offset": "-01:00"}, {"name": "Etc/GMT+10", "offset": "-10:00"}, { "name": "Etc/GMT+11", "offset": "-11:00" }, {"name": "Etc/GMT+12", "offset": "-12:00"}, {"name": "Etc/GMT+2", "offset": "-02:00"}, { "name": "Etc/GMT+3", "offset": "-03:00" }, {"name": "Etc/GMT+4", "offset": "-04:00"}, {"name": "Etc/GMT+5", "offset": "-05:00"}, { "name": "Etc/GMT+6", "offset": "-06:00" }, {"name": "Etc/GMT+7", "offset": "-07:00"}, {"name": "Etc/GMT+8", "offset": "-08:00"}, { "name": "Etc/GMT+9", "offset": "-09:00" }, {"name": "Etc/GMT-0", "offset": "+00:00"}, {"name": "Etc/GMT-1", "offset": "+01:00"}, { "name": "Etc/GMT-10", "offset": "+10:00" }, {"name": "Etc/GMT-11", "offset": "+11:00"}, {"name": "Etc/GMT-12", "offset": "+12:00"}, { "name": "Etc/GMT-13", "offset": "+13:00" }, {"name": "Etc/GMT-14", "offset": "+14:00"}, {"name": "Etc/GMT-2", "offset": "+02:00"}, { "name": "Etc/GMT-3", "offset": "+03:00" }, {"name": "Etc/GMT-4", "offset": "+04:00"}, {"name": "Etc/GMT-5", "offset": "+05:00"}, { "name": "Etc/GMT-6", "offset": "+06:00" }, {"name": "Etc/GMT-7", "offset": "+07:00"}, {"name": "Etc/GMT-8", "offset": "+08:00"}, { "name": "Etc/GMT-9", "offset": "+09:00" }, {"name": "Etc/GMT0", "offset": "+00:00"}, {"name": "Etc/Greenwich", "offset": "+00:00"}, { "name": "Etc/UCT", "offset": "+00:00" }, {"name": "Etc/UTC", "offset": "+00:00"}, {"name": "Etc/Universal", "offset": "+00:00"}, { "name": "Etc/Zulu", "offset": "+00:00" }, {"name": "Europe/Amsterdam", "offset": "+01:00"}, { "name": "Europe/Andorra", "offset": "+01:00" }, {"name": "Europe/Astrakhan", "offset": "+04:00"}, { "name": "Europe/Athens", "offset": "+02:00" }, {"name": "Europe/Belfast", "offset": "+00:00"}, { "name": "Europe/Belgrade", "offset": "+01:00" }, {"name": "Europe/Berlin", "offset": "+01:00"}, { "name": "Europe/Bratislava", "offset": "+01:00" }, {"name": "Europe/Brussels", "offset": "+01:00"}, { "name": "Europe/Bucharest", "offset": "+02:00" }, {"name": "Europe/Budapest", "offset": "+01:00"}, { "name": "Europe/Busingen", "offset": "+01:00" }, {"name": "Europe/Chisinau", "offset": "+02:00"}, { "name": "Europe/Copenhagen", "offset": "+01:00" }, {"name": "Europe/Dublin", "offset": "+00:00"}, { "name": "Europe/Gibraltar", "offset": "+01:00" }, {"name": "Europe/Guernsey", "offset": "+00:00"}, { "name": "Europe/Helsinki", "offset": "+02:00" }, {"name": "Europe/Isle_of_Man", "offset": "+00:00"}, { "name": "Europe/Istanbul", "offset": "+02:00" }, {"name": "Europe/Jersey", "offset": "+00:00"}, { "name": "Europe/Kaliningrad", "offset": "+02:00" }, {"name": "Europe/Kiev", "offset": "+02:00"}, { "name": "Europe/Lisbon", "offset": "+00:00" }, {"name": "Europe/Ljubljana", "offset": "+01:00"}, { "name": "Europe/London", "offset": "+00:00" }, {"name": "Europe/Luxembourg", "offset": "+01:00"}, { "name": "Europe/Madrid", "offset": "+01:00" }, {"name": "Europe/Malta", "offset": "+01:00"}, { "name": "Europe/Mariehamn", "offset": "+02:00" }, {"name": "Europe/Minsk", "offset": "+03:00"}, { "name": "Europe/Monaco", "offset": "+01:00" }, {"name": "Europe/Moscow", "offset": "+03:00"}, { "name": "Europe/Nicosia", "offset": "+02:00" }, {"name": "Europe/Oslo", "offset": "+01:00"}, { "name": "Europe/Paris", "offset": "+01:00" }, {"name": "Europe/Podgorica", "offset": "+01:00"}, { "name": "Europe/Prague", "offset": "+01:00" }, {"name": "Europe/Riga", "offset": "+02:00"}, {"name": "Europe/Rome", "offset": "+01:00"}, { "name": "Europe/Samara", "offset": "+04:00" }, {"name": "Europe/San_Marino", "offset": "+01:00"}, { "name": "Europe/Sarajevo", "offset": "+01:00" }, {"name": "Europe/Simferopol", "offset": "+03:00"}, { "name": "Europe/Skopje", "offset": "+01:00" }, {"name": "Europe/Sofia", "offset": "+02:00"}, { "name": "Europe/Stockholm", "offset": "+01:00" }, {"name": "Europe/Tallinn", "offset": "+02:00"}, { "name": "Europe/Tirane", "offset": "+01:00" }, {"name": "Europe/Tiraspol", "offset": "+02:00"}, { "name": "Europe/Ulyanovsk", "offset": "+04:00" }, {"name": "Europe/Uzhgorod", "offset": "+02:00"}, { "name": "Europe/Vaduz", "offset": "+01:00" }, {"name": "Europe/Vatican", "offset": "+01:00"}, { "name": "Europe/Vienna", "offset": "+01:00" }, {"name": "Europe/Vilnius", "offset": "+02:00"}, { "name": "Europe/Volgograd", "offset": "+03:00" }, {"name": "Europe/Warsaw", "offset": "+01:00"}, { "name": "Europe/Zagreb", "offset": "+01:00" }, {"name": "Europe/Zaporozhye", "offset": "+02:00"}, {"name": "Europe/Zurich", "offset": "+01:00"}, { "name": "GB", "offset": "+00:00" }, {"name": "GB-Eire", "offset": "+00:00"}, {"name": "GMT", "offset": "+00:00"}, { "name": "GMT+0", "offset": "+00:00" }, {"name": "GMT-0", "offset": "+00:00"}, {"name": "GMT0", "offset": "+00:00"}, { "name": "Greenwich", "offset": "+00:00" }, {"name": "HST", "offset": "-10:00"}, {"name": "Hongkong", "offset": "+08:00"}, { "name": "Iceland", "offset": "+00:00" }, {"name": "Indian/Antananarivo", "offset": "+03:00"}, { "name": "Indian/Chagos", "offset": "+06:00" }, {"name": "Indian/Christmas", "offset": "+07:00"}, { "name": "Indian/Cocos", "offset": "+06:30" }, {"name": "Indian/Comoro", "offset": "+03:00"}, { "name": "Indian/Kerguelen", "offset": "+05:00" }, {"name": "Indian/Mahe", "offset": "+04:00"}, { "name": "Indian/Maldives", "offset": "+05:00" }, {"name": "Indian/Mauritius", "offset": "+04:00"}, { "name": "Indian/Mayotte", "offset": "+03:00" }, {"name": "Indian/Reunion", "offset": "+04:00"}, {"name": "Iran", "offset": "+03:30"}, { "name": "Israel", "offset": "+02:00" }, {"name": "Jamaica", "offset": "-05:00"}, {"name": "Japan", "offset": "+09:00"}, { "name": "Kwajalein", "offset": "+12:00" }, {"name": "Libya", "offset": "+02:00"}, {"name": "MET", "offset": "+01:00"}, { "name": "MST", "offset": "-07:00" }, {"name": "MST7MDT", "offset": "-07:00"}, { "name": "Mexico/BajaNorte", "offset": "-08:00" }, {"name": "Mexico/BajaSur", "offset": "-07:00"}, {"name": "Mexico/General", "offset": "-06:00"}, { "name": "NZ", "offset": "+13:00" }, {"name": "NZ-CHAT", "offset": "+13:45"}, {"name": "Navajo", "offset": "-07:00"}, { "name": "PRC", "offset": "+08:00" }, {"name": "PST8PDT", "offset": "-08:00"}, {"name": "Pacific/Apia", "offset": "+14:00"}, { "name": "Pacific/Auckland", "offset": "+13:00" }, {"name": "Pacific/Bougainville", "offset": "+11:00"}, { "name": "Pacific/Chatham", "offset": "+13:45" }, {"name": "Pacific/Chuuk", "offset": "+10:00"}, { "name": "Pacific/Easter", "offset": "-05:00" }, {"name": "Pacific/Efate", "offset": "+11:00"}, { "name": "Pacific/Enderbury", "offset": "+13:00" }, {"name": "Pacific/Fakaofo", "offset": "+13:00"}, { "name": "Pacific/Fiji", "offset": "+13:00" }, {"name": "Pacific/Funafuti", "offset": "+12:00"}, { "name": "Pacific/Galapagos", "offset": "-06:00" }, {"name": "Pacific/Gambier", "offset": "-09:00"}, { "name": "Pacific/Guadalcanal", "offset": "+11:00" }, {"name": "Pacific/Guam", "offset": "+10:00"}, { "name": "Pacific/Honolulu", "offset": "-10:00" }, {"name": "Pacific/Johnston", "offset": "-10:00"}, { "name": "Pacific/Kiritimati", "offset": "+14:00" }, {"name": "Pacific/Kosrae", "offset": "+11:00"}, { "name": "Pacific/Kwajalein", "offset": "+12:00" }, {"name": "Pacific/Majuro", "offset": "+12:00"}, { "name": "Pacific/Marquesas", "offset": "-09:30" }, {"name": "Pacific/Midway", "offset": "-11:00"}, { "name": "Pacific/Nauru", "offset": "+12:00" }, {"name": "Pacific/Niue", "offset": "-11:00"}, { "name": "Pacific/Norfolk", "offset": "+11:00" }, {"name": "Pacific/Noumea", "offset": "+11:00"}, { "name": "Pacific/Pago_Pago", "offset": "-11:00" }, {"name": "Pacific/Palau", "offset": "+09:00"}, { "name": "Pacific/Pitcairn", "offset": "-08:00" }, {"name": "Pacific/Pohnpei", "offset": "+11:00"}, { "name": "Pacific/Ponape", "offset": "+11:00" }, {"name": "Pacific/Port_Moresby", "offset": "+10:00"}, { "name": "Pacific/Rarotonga", "offset": "-10:00" }, {"name": "Pacific/Saipan", "offset": "+10:00"}, { "name": "Pacific/Samoa", "offset": "-11:00" }, {"name": "Pacific/Tahiti", "offset": "-10:00"}, { "name": "Pacific/Tarawa", "offset": "+12:00" }, {"name": "Pacific/Tongatapu", "offset": "+13:00"}, { "name": "Pacific/Truk", "offset": "+10:00" }, {"name": "Pacific/Wake", "offset": "+12:00"}, { "name": "Pacific/Wallis", "offset": "+12:00" }, {"name": "Pacific/Yap", "offset": "+10:00"}, {"name": "Poland", "offset": "+01:00"}, { "name": "Portugal", "offset": "+00:00" }, {"name": "ROC", "offset": "+08:00"}, {"name": "ROK", "offset": "+09:00"}, { "name": "Singapore", "offset": "+08:00" }, {"name": "Turkey", "offset": "+02:00"}, {"name": "UCT", "offset": "+00:00"}, { "name": "US/Alaska", "offset": "-09:00" }, {"name": "US/Aleutian", "offset": "-10:00"}, {"name": "US/Arizona", "offset": "-07:00"}, { "name": "US/Central", "offset": "-06:00" }, {"name": "US/East-Indiana", "offset": "-05:00"}, {"name": "US/Eastern", "offset": "-05:00"}, { "name": "US/Hawaii", "offset": "-10:00" }, {"name": "US/Indiana-Starke", "offset": "-06:00"}, { "name": "US/Michigan", "offset": "-05:00" }, {"name": "US/Mountain", "offset": "-07:00"}, {"name": "US/Pacific", "offset": "-08:00"}, { "name": "US/Pacific-New", "offset": "-08:00" }, {"name": "US/Samoa", "offset": "-11:00"}, {"name": "UTC", "offset": "+00:00"}, { "name": "Universal", "offset": "+00:00" }, {"name": "W-SU", "offset": "+03:00"}, {"name": "WET", "offset": "+00:00"}, {"name": "Zulu", "offset": "+00:00"}] ) })(); /** * Created by denak on 31.05.2016. */ 'use strict'; angular.module('teleds.blocks') .service('Phone', function () { return phoneUtils; }) .filter('phone', ["Phone", function (Phone) { return function (phoneNumber, filter, regionCode) { switch (filter) { case 'getRegionCodeForNumber': return Phone.getRegionCodeForNumber(phoneNumber, regionCode); case 'getNumberType': return Phone.getNumberType(phoneNumber, regionCode); case 'formatE164': return Phone.formatE164(phoneNumber, regionCode); case 'formatNational': return Phone.formatNational(phoneNumber, regionCode); case 'formatInternational': return Phone.formatInternational(phoneNumber, regionCode); case 'formatInOriginalFormat': return Phone.formatInOriginalFormat(phoneNumber, regionCode); case 'formatOutOfCountryCallingNumber': return Phone.formatOutOfCountryCallingNumber(phoneNumber, regionCode); } }; }]); /** * Created by denak on 11.05.2016. */ angular.module('teleds.blocks').filter('convertToBinarySize', function () { return function (val) { if (val == undefined) { return ""; } if (val > 700000000) return (val / 1073741824).toFixed(0) + " Gb"; if (val > 700000) return (val / 1048576).toFixed(0) + " Mb"; else if (val > 700) return (val / 1024).toFixed(0) + " Kb"; else return val + " b"; }; }).filter('convertFromKBToBinarySize', function () { return function (val) { if (val == undefined) { return ""; } if (val > 70000000) return (val / 1000000).toFixed(0) + " Gb"; if (val > 70000) return (val / 1000).toFixed(0) + " Mb"; else return (val ).toFixed(0) + " Kb"; }; }).filter('millSecondsToTimeString', function () { return function (millseconds) { var seconds = Math.floor( millseconds / 1000); var sec = Math.floor((millseconds % 60000) / 1000); var days = Math.floor(seconds / 3600); var hours = Math.floor((seconds % 86400) / 3600); var minutes = Math.floor(((seconds % 86400) % 3600) / 60); var timeString = ''; if (days > 0) timeString += (days > 1) ? (days + " дней ") : (days + " день "); if (hours > 0) timeString += (hours > 1) ? (hours + " часа ") : (hours + " час "); if (minutes > 0) timeString += (minutes != 1) ? (minutes == 2 || minutes == 3 || minutes == 4) ? (minutes + " минуты ") : (minutes + " минут ") : (minutes + " минута "); if (sec >= 0) timeString += (sec != 1) ? (sec == 2 || sec == 3 || sec == 4) ? (sec + " секунды ") : (sec + " секунд ") : (sec + " секунда "); return timeString; } }).filter('secondsToTimeString', function () { return function (seconds) { var days = Math.floor(seconds / 86400); var hours = Math.floor((seconds % 86400) / 3600); var minutes = Math.floor(((seconds % 86400) % 3600) / 60); var sec = Math.floor(((seconds % 86400) % 3600) % 60); var timeString = ''; if (days > 0) timeString += (days > 1) ? (days + " дней ") : (days + " день "); if (hours > 0) timeString += (hours > 1) ? (hours + " часа ") : (hours + " час "); if (minutes > 0) timeString += (minutes != 1) ? (minutes == 2 || minutes == 3 || minutes == 4) ? (minutes + " минуты ") : (minutes + " минут ") : (minutes + " минута "); if (sec >= 0) timeString += (sec != 1) ? (sec == 2 || sec == 3 || sec == 4) ? (sec + " секунды ") : (sec + " секунд ") : (sec + " секунда "); return timeString; } }).filter('secondsToString', function () { return function (sec) { return (sec != 1) ? (sec == 2 || sec == 3 || sec == 4) ? ("common.Seconds1") : ("common.Second2") : ("common.Second3"); } }).filter('formatText', function () { return function (input) { if (!input) return input; var output = input //replace possible line breaks. .replace(/(\r\n|\r|\n)/g, '
') //replace tabs .replace(/\t/g, '   ') //replace spaces. .replace(/ /g, ' '); return output; }; }); formatToShortDate.$inject = ["$filter"];angular.module('teleds.blocks').filter('standardDate', formatToStandartDate); formatToStandartDate.$inject = ['$filter']; function formatToStandartDate($filter) { // Create the return function and set the required parameter name to **input** return function (date) { var outDate = $filter('amDateFormat')($filter('amLocal')($filter('amUtc')(date)), 'DD.MM.YYYY HH:mm:ss'); return outDate; } }; angular.module('teleds.blocks').filter('shortDate', formatToShortDate); function formatToShortDate($filter) { "ngInject"; return function (date) { var outDate = $filter('amDateFormat')($filter('amLocal')($filter('amUtc')(date)), 'DD.MM.YYYY'); return outDate; } }; angular.module('teleds.blocks').filter('durationMin', durationMin); function durationMin() { "ngInject"; return function (ms) { return Math.floor((( (ms / 1000) % 86400) % 3600) / 60); } }; angular.module('teleds.blocks').filter('durationSec', durationSec); function durationSec() { "ngInject"; return function (ms) { return Math.floor((ms % 60000) / 1000); } }; angular.module('teleds.blocks').filter('durationMinFromSec', durationMinFromSec); function durationMinFromSec() { "ngInject"; return function (ms) { return Math.floor((( (ms) % 86400) % 3600) / 60); } }; angular.module('teleds.blocks').filter('durationSecFromSec', durationSecFromSec); function durationSecFromSec() { "ngInject"; return function (ms) { return Math.floor(((ms*1000) % 60000) / 1000); } }; (function () { angular.module("teleds.blocks") .service('areasStyleHelper', service); function service() { "ngInject"; return { getStyle: getStyle, getStyleForDisplayCurrent: getStyleForDisplayCurrent, getStyleForCustom: getStyleForCustom }; function getStyle(areas) { var rows = toRows(areas); calculateSize(rows); rows.forEach(function (row, index) { if ((index + 1) != rows.length) { row.forEach(function (area) { area.style["border-bottom"] = "2px solid rgb(210, 216, 227)"; }); } row.forEach(function (area, index) { if (index + 1 != row.length) { area.style["border-right"] = "2px solid rgb(210, 216, 227)"; } }) }); return rows.reduce(function (a, b) { return a.concat(b); }); } function getStyleForDisplayCurrent(areas, selectArea, width, height) { if (areas.find(function (area) { return area.name.includes('custom'); })) { return getStyleForCustom(areas, width, height,areas.find(function (area) { return area.name.includes('vertical'); }), selectArea,77,55) } var rows = toRows(areas); calculateSize(rows); var selectRowIndex = 0; var selectAreaIndex = 0; rows.forEach(function (row, indexRow) { row.forEach(function (area, indexArea) { if (selectArea == area.area) { selectRowIndex = indexRow; selectAreaIndex = indexArea; } }) }); rows.forEach(function (row, indexRow) { row.forEach(function (area, indexArea) { if (indexRow == selectRowIndex && indexArea == selectAreaIndex) { area.style["border"] = "2px solid rgb(75, 133, 223)"; } else { if (indexRow > selectRowIndex) { area.style["border"] = "2px solid rgb(210, 216, 227)"; area.style["border-top"] = 'none'; if (indexArea != 0) { area.style["border-left"] = 'none'; } } else if (indexRow == selectRowIndex) { if (indexArea > selectAreaIndex) { area.style["border"] = "2px solid rgb(210, 216, 227)"; area.style["border-left"] = 'none'; } else { area.style["border"] = "2px solid rgb(210, 216, 227)"; area.style["border-right"] = 'none'; } } else { area.style["border"] = "2px solid rgb(210, 216, 227)"; area.style["border-bottom"] = 'none'; if (indexArea != 0) { area.style["border-left"] = 'none'; } } } }) }); return rows.reduce(function (a, b) { return a.concat(b); }); } function toRows(areas) { var areas = areas.filter(function (area) { return !(area.y == 0 && area.x == 0 && area.width == 0 && area.height == 0); }); var i = 0; var y = null; var result = [[]]; var row = result[0]; while (i < areas.length) { if (areas[i].y == y) { row.push({number: i, area: areas[i], style: {}}) } else { if (row.length > 0) { row = []; result.push(row); } y = areas[i].y; row.push({number: i, area: areas[i], style: {}}) } i++; } return result; } function calculateSize(rows) { var height = 100; for (var i = 0; i < rows.length; i++) { if ((i + 1) == rows.length) { rows[i].forEach(function (area) { area.style.height = height + "%"; }) } else { var heightRow = Math.floor((rows[i][0].area.height / 1080) * 100); rows[i].forEach(function (area) { area.style.height = heightRow + "%"; }); height = height - heightRow; } } rows.forEach(function (row, index) { var width = 100; row.forEach(function (area, index) { if (index + 1 == row.length) { area.style["flex-basis"] = width + "%"; } else { var widthArea = (area.area.width / 1920) * 100; width = width - widthArea; area.style["flex-basis"] = widthArea + "%"; } }) }); } function getStyleForCustom(areas, width, height,isVertical, selectArea, boxWidth, boxHeight) { var orgWidth = 146; var borderWidth =4; var div =4; if (boxWidth) { borderWidth=2; div =0; orgWidth = boxWidth; } var orgHeight = 103; if (boxHeight) { orgHeight = boxHeight; } var koefWidth = orgWidth / width; var koefHeight = orgHeight / height; var result = []; if(isVertical) { var temp = koefWidth; koefWidth=koefHeight; koefHeight=temp; } areas.forEach(function (area, indexRow) { var areaResult = {number: indexRow, area: area, style: {}}; if (selectArea == area) { areaResult.style["border"] = borderWidth+"px solid rgb(75, 133, 223) "; } else { areaResult.style["border"] = borderWidth+"px solid #d2d8e3"; } areaResult.style["position"] = "absolute"; var resWidth = Math.round(koefWidth * area.width); var resHeight = Math.round(koefHeight * area.height); var resTop = Math.round(koefHeight * area.y); var resLeft = Math.round(koefWidth * area.x); areaResult.style["width"] = (resWidth) + 'px'; areaResult.style["height"] = (resHeight) + 'px'; areaResult.style["top"] = (resTop - div ) + 'px'; areaResult.style["left"] = (resLeft - div) + 'px'; result.push(areaResult); }); return result; } } })(); (function () { backService.$inject = ["$transitions", "$state"]; angular.module("teleds.blocks") .service('backService', backService); function backService($transitions, $state) { "ngInject" var from = null; return { back: back, configure: configure }; function configure() { $transitions.onEnter({}, ["$transition$", function ($transition$) { "ngInject"; from = $transition$.$from(); }] ); } function back(defaultState) { if (from.name != '') { try { history.go(-1); } catch (e) { $state.go(defaultState); } } else { $state.go(defaultState); } } } })(); (function () { factory.$inject = ["Restangular", "$q", "CacheFactory", "$rootScope"]; angular.module("teleds.blocks") .service('billingService', factory); function factory(Restangular, $q, CacheFactory,$rootScope) { if (!CacheFactory.get('billingCache')) { CacheFactory.createCache('billingCache', { maxAge: 600000, storageMode: 'memory', deleteOnExpire: 'aggressive', capacity: 600 }); } var billingCache = CacheFactory.get('billingCache'); "ngInject"; return { getBraintreeToken: getBraintreeToken, getBillingAddress: getBillingAddress, createUpdateBillingAddress: createUpdateBillingAddress, getPrice: getPrice, getLimits: getLimits, getBalance: getBalance, getSubscription: getSubscription, getPaymentMethod: getPaymentMethod, savePaymentMethod: savePaymentMethod, updateSubscription: updateSubscription, cancelSubscription: cancelSubscription, getInvoice: getInvoice, getLinkInvoice: getLinkInvoice, enterCode: enterCode, getBillingStatus: getBillingStatus, clearCache: clearCache, getBillingStatusWithCatch: getBillingStatusWithCatch }; function getBraintreeToken() { return Restangular.one("billing").one("braintree-client-token").get(); } function getBillingAddress() { return Restangular.one("billing").one("billing-address").get(); } function createUpdateBillingAddress(model) { return Restangular.one("billing").one("billing-address").customPUT(model); } function getPaymentMethod() { return Restangular.one("billing").one("payment-method").get(); } function savePaymentMethod(model) { return Restangular.one("billing").one("payment-method").customPUT(model); } function getPrice(params) { return Restangular.one("billing").one("estimate-cost").get(params); } function getBalance() { return Restangular.one("billing").one("balance").get(); } function getLimits() { return Restangular.one("billing").one("limits").get(); } function getSubscription() { return Restangular.one("billing").one("subscription").get(); } function updateSubscription(model) { return Restangular.one("billing").one("subscription").customPUT(model).then(function (response) { clearCache(); getBillingStatus(); return response; }); } function cancelSubscription() { return Restangular.one("billing").one("subscription").customDELETE().then(function (response) { clearCache(); getBillingStatus(); return response; }); } function getInvoice() { return Restangular.one("billing").one("invoice").getList(); } function enterCode(code) { return Restangular.one("billing").one("promocode", code).customPUT().then(function (response) { clearCache(); getBillingStatus(); return response; }); } function clearCache() { billingCache.removeAll(); $rootScope.$emit('subscription.Update'); } function getLinkInvoice(id) { return Restangular.one("billing").one("invoice", id).one('pdf').get(); } function getBillingStatus() { var promise = $q.all([ Restangular.one("billing").one("limits").withHttpConfig({cache: billingCache}).get(), Restangular.one("billing").one("subscription").withHttpConfig({cache: billingCache}).get()]); return promise.then(function (result) { var status = { paid: false, active: false, limits: result[0], endDate: result[1].end_date, subscription: result[1] }; var limits = result[0]; status.paid = limits.paid.total > 0; return status; }) } function getBillingStatusWithCatch() { return getBillingStatus().catch(function () { var limits = { "free": { "total": "0", "left": "0", "used": "0" }, "paid": { "total": "0", "left": "0", "used": "0" } }; var subscription = { end_date: '' }; return { paid: false, limits: limits, subscription: subscription }; }) } } })(); /** * Created by denak on 23.05.2016. */ /** * Created by denak on 05.05.2016. */ (function () { factory.$inject = ["Restangular", "$q", "contents"]; angular.module("teleds.blocks") .service('campaigns', factory); function factory(Restangular, $q, contents) { "ngInject"; return { get: get, getList: getList, add: add, update: update, remove: remove, attachContent: attachContent, updateContent: updateContent, attachContents: attachContents, detachContent: detachContent, getContent: getContent, moveToContent: moveToContent, moveUpContent: moveUpContent, moveDownContent: moveDownContent, getAreas: getAreas, getArea: getArea, updateArea: updateArea, getListFromFilterOption: getListFromFilterOption, getListForArea: getListForArea, getPlayers: getPlayers }; function get(id) { return Restangular.one("campaign", id).get(); } function getList(param) { var list = Restangular.all("campaign").getList(param); var count = Restangular.one("campaign", 'count').get(param); return $q.all([list, count]).then(function (value) { var result = {}; result.data = value[0]; result.recordsTotal = value[1].total; result.recordsFiltered = result.recordsTotal; return result; }).catch(function () { $q.reject({data: [], recordsTotal: 0, recordsFiltered: 0} ); }); } function update(model) { var copyModel = Restangular.copy(model); copyModel.tags = copyModel.tags.map(function (v) { return v.id; }).join(); if (!copyModel.area_layout[0].id) { if (copyModel.has_audio_area_new) { copyModel.area_layout.push({ name: 'audio', x: 0, y: 0, width: 0, height: 0, opacity: 100, z_index: 1 }) } } else { if (copyModel.has_audio_area_new != copyModel.has_audio_area) { if (copyModel.has_audio_area_new) { copyModel.area_layout.push({ name: 'audio', x: 0, y: 0, width: 0, height: 0, opacity: 100, z_index: 1 }) } else { var area = copyModel.area_layout.find(function (area) { return (area.y == 0 && area.x == 0 && area.width == 0 && area.height == 0) }); copyModel.area_layout.splice(copyModel.area_layout.indexOf(area), 1); } } } if(!copyModel.end_timestamp) { copyModel.end_timestamp="0000-00-00 00:00:00"; } copyModel.area_layout = JSON.stringify(copyModel.area_layout.map(function (item) { return item; })); return copyModel.put(); } function add(param) { var copyModel = Restangular.copy(param); copyModel.tags = copyModel.tags.map(function (v) { return v.id; }).join(); if (copyModel.has_audio_area) { copyModel.area_layout.push({ name: 'audio', x: 0, y: 0, width: 0, height: 0, opacity: 100, z_index: 1 }) } copyModel.area_layout = JSON.stringify(copyModel.area_layout); return Restangular.all("campaign").post(copyModel); } function remove(id) { return Restangular.one("campaign", id).remove(); } function attachContents(id, selected) { var promises = selected.map(function (contentId) { return Restangular.one("campaign", id).post("content", { content_id: contentId, id: id, play_time: 'free' }); }); return $q.all(promises); } function attachContent(id, content, area) { return Restangular.one("campaign", id).one("area", area.id).one('content', content.content_id).customPUT(content); } function updateContent(content) { var copyModel = Restangular.copy(content); copyModel.id = copyModel.content.id; return copyModel.put(); } function detachContent(id, areaId, selected) { var promises = selected.map(function (contentId) { return Restangular.one("campaign", id).one("area", areaId).one("content", contentId).remove(); }); return $q.all(promises); } function getContent(id, areaId) { return Restangular.one("campaign", id).one('area', areaId).getList("content").then(function (result) { return result.sort(function (a, b) { return a.play_order - b.play_order; }) }); } function moveToContent(campaignId,areaId, contentId, pos) { return Restangular.one("campaign", campaignId).one("area", areaId).one("content", contentId).post('move-to', {position: pos}); } function moveUpContent(campaignId, contentId) { return Restangular.one("campaign", campaignId).one("content", contentId).post('move-up'); } function moveDownContent(campaignId, contentId) { return Restangular.one("campaign", campaignId).one("content", contentId).post('move-down'); } function getAreas(id) { return Restangular.one("campaign", id).getList("areas"); } function updateArea(area) { return Restangular.one("campaign", area.campaign_id).one("area", area.id).customPUT(area); } function getArea(area) { return Restangular.one("campaign", area.campaign_id).one("area", area.id).get(); } function getPlayers(id) { return Restangular.one("campaign", id).getList("players"); } function getListForArea(param) { var _this = this; return getList(param).then(function (result) { return $q.all(result.data.map(function (campaign) { return _this.getContent(campaign.id).then(function (contents) { return {campaign: campaign, contents: contents}; }); })).then(function (listCampaingsContents) { var campaigns = listCampaingsContents.map(function (campaingContents) { var campaign = campaingContents.campaign; campaign.existHtml = !!campaingContents.contents.find(function (content) { return content.content.type == 'html5_online' || content.content.type == 'html5_zip'; }); return campaign; }); result.data = campaigns; return result; }) }); } function getListFromFilterOption(option) { var param = {}; if (option.name) { param['filter[name]'] = option.name; } if (!option.status) { param['filter[status]'] = 'active'; } if (option.tags && option.tags.length > 0) { param['filter[tags]'] = option.tags.map(function (v) { return v.id; }).join(); } param['page[offset]'] = 0; param['page[limit]'] = 500; return getList(param) } } })(); /** * Created by denak on 05.05.2016. */ (function () { service.$inject = ["Restangular", "$q", "restHelper", "locale", "billingService"]; angular.module("teleds.blocks") .service('contents', service); function service(Restangular, $q, restHelper, locale,billingService) { "ngInject"; return { getContents: getContents, addContent: addContent, getContent: getContent, getFiles: getFilesContents, getMediaInfo: getMediaInfo, getCampaigns: getCampaigns, updateContent: updateContent, removeContent: removeContent, get: getContent, getList: getContents, update: updateContent, updateFile: updateFile, getListFromFilterOption: getListFromFilterOption, showSelectFileModal: showSelectFileModal }; function getContents(param) { var list = Restangular.all("content").getList(param); var count = Restangular.one("content", 'count').get(param); return $q.all([list, count]).then(function (value) { var result = {}; result.data = value[0]; result.recordsTotal = value[1].total; result.recordsFiltered = result.recordsTotal; return result; }).catch(function () { $q.reject({data: [], recordsTotal: 0, recordsFiltered: 0}) }); } function getContent(id) { return Restangular.one("content", id).get().then(function (response) { response._backup = angular.copy(response); return response; }); } function getCampaigns(id) { return Restangular.one("content", id).getList('campaigns'); } function getFilesContents(id) { return Restangular.one("content", id).getList('files'); } function getMediaInfo(id) { return Restangular.one("content").one('mediainfo', id).get(); } function addContent(model) { var copyContent = Restangular.copy(model); copyContent.tags = copyContent.tags.map(function (v) { return v.id; }).join(); return Restangular.all("content").post(copyContent); } function updateFile(contentOrig) { return SendXhrRequest(contentOrig.plain(), 'PUT'); } /*deprecated*/ function SendXhrRequest(contentOrig, type) { var defer = $q.defer(); var content = angular.copy(contentOrig); content.tags = content.tags.map(function (v) { return v.id; }).join(); if (type == 'POST') { content.play_duration *= 1000; content.play_start *= 1000; } content.file = contentOrig.file; return restHelper.sendXhrRequest("/content" + ((type == 'PUT') ? ("/" + content.id ) : ""), type, content); } function updateContent(content) { var copyContent = Restangular.copy(content); copyContent.tags = copyContent.tags.map(function (v) { return v.id; }).join(); copyContent = copyContent.plain(); if(copyContent.name===copyContent._backup.name) { delete copyContent.name; } delete copyContent._backup; return Restangular.one("content", copyContent.id).customPUT(copyContent); } function removeContent(id) { return Restangular.one("content", id).remove(); } function getListFromFilterOption(option) { var param = {}; if (option.name) { param['filter[name]'] = option.name; } if (option.types && option.types.length > 0) { param['filter[type]'] = option.types.map(function (v) { return v.name; }).join(); } if (option.tags && option.tags.length > 0) { param['filter[tags]'] = option.tags.map(function (v) { return v.id; }).join(); } param['page[offset]'] = 0; param['page[limit]'] = 500; return getContents(param); } function showSelectFileModal(accept) { var _this = this; return $q.all([ Restangular.one("content").one('security').get(),billingService.getBillingStatus().catch(function () { return {paid:false}; })]).then(function (response) { var defer = $q.defer(); filepicker.setKey('ADbxOiMAIQAuCmbecwAjcz'); filepicker.pickAndStore( { mimetypes: accept, container: 'modal', services: '*', maxSize: (response[1].paid? 250:50) * 1024 * 1024, language: locale.getLocale(), multiple: false, policy: response[0].policy, signature: response[0].signature }, { location: 'S3' }, function (Blobs) { var fsid = Blobs[0].url.split('/').reverse()[0]; var name = Blobs[0].filename.substring(0, Blobs[0].filename.lastIndexOf('.')); _this.getMediaInfo(Blobs[0].key).then(function (response) { defer.resolve({blob: Blobs[0], name: name, fsid: fsid, mediaInfo: response}); }).catch(function () { defer.reject(true) }); }, function () { defer.reject(false) }); return defer.promise; }); } } })(); (function () { angular.module("teleds.blocks") .service('errorHandlerHelper', service) service.$inject = ['notificationService', 'locale']; function service(notificationService, locale) { this.handleErrorResponse = function (response, form, vm) { for (var formProp in form) { if (form.hasOwnProperty(formProp)) { if (formProp[0] != '$' && form[formProp].serverMessage != "") { form[formProp].serverMessage = null; } } } if (response.status == 500) { if( response.data) { vm.error = response.data.error; } notificationService.showError('common.InternalServerError'); return; } if (response.data.error) { vm.error = response.data.error; return; } else { vm.error = ""; } for (var prop in response.data) { if (response.data.hasOwnProperty(prop) && form[prop]) { if (response.data[prop].length) { form[prop].serverMessage = response.data[prop][0][locale.getLocale()]; } else { form[prop].serverMessage = response.data[prop][locale.getLocale()]; } } } }; this.handleErrorResponseForEdit = function (response) { if (response.status == 500) { notificationService.showError('common.InternalServerError'); return; } if (response.data.error) { return { serverError: response.data.error[locale.getLocale()] }; } var error = {}; for (var prop in response.data) { if (response.data.hasOwnProperty(prop)) { if (response.data[prop].length) { error[prop] = response.data[prop][0][locale.getLocale()]; } else { error[prop] = response.data[prop][locale.getLocale()]; } } } return error; } } })(); (function () { service.$inject = ["locale", "$q"]; angular.module("teleds.blocks") .service('fileService', service); function service(locale, $q) { "ngInject"; return { getFile: getFile }; function getFile(url, name) { var defer = $q.defer(); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'blob'; xhr.onload = function (e) { if (this.status == 200) { var blob = this.response; var fileOfBlob = new File([blob], name); defer.resolve(fileOfBlob) } }; xhr.send(); return defer.promise; } } })(); (function () { service.$inject = ["locale"]; angular.module("teleds.blocks") .service('filterHelper', service); function service(locale) { "ngInject"; return { getSeconds: getFile }; function getFile(url, name) { var defer = $q.defer(); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'blob'; xhr.onload = function (e) { if (this.status == 200) { var blob = this.response; var fileOfBlob = new File([blob], name); defer.resolve(fileOfBlob) } }; xhr.send(); return defer.promise; } } })(); /** * Created by denak on 24.05.2016. */ (function () { angular.module("teleds.blocks") .service('geoTargeting', factory) factory.$inject = ["Restangular", "$q"]; function factory(Restangular, $q) { return { get: get, getList: getList, add: add, update: update, remove: remove }; function get(id) { return Restangular.one("geo-targeting", id).get().then(function (result) { result.polygons = contentToPolygons(angular.fromJson(result.content)); return result; }); } function getList() { return Restangular.all("geo-targeting").getList().then(function (result) { result.forEach(function (area) { area.polygons = contentToPolygons(angular.fromJson(area.content)); }); return result; }); } function contentToPolygons(contentServer) { return contentServer.map(function (content) { return { name: content.name, paths: content.coords.map(function (coords) { return { latitude: coords[0], longitude: coords[1] } }) } }) } function update(model) { var copyModel = Restangular.copy(model); copyModel.content = copyModel.polygons.map(function (polygon) { return { name: polygon.name, coords: polygon.paths.map(function (coord) { return [coord.latitude, coord.longitude]; }) }; }); delete copyModel.polygons; return copyModel.put(); } function add(param) { var copyModel = Restangular.copy(param); copyModel.content = copyModel.polygons.map(function (polygon) { return { name: polygon.name, coords: polygon.paths.map(function (coord) { return [coord.latitude, coord.longitude]; }) }; }); copyModel.description = "d"; delete copyModel.polygons; return Restangular.all("geo-targeting").post(copyModel).then(function (area) { area.polygons = param.polygons; return area; }); } function remove(id) { return Restangular.one("geo-targeting", id).remove(); } } })(); /** * Created by denak on 07.04.2016. */ (function () { angular.module("teleds.blocks") .service('notificationService', service) service.$inject = ["locale"]; function service(locale){ var self = this; var method = 3000; var openAnimation = 'animated bounceIn'; var closeAnimation = 'animated bounceOut'; self._showMessage=function (message,type) { noty({ text: '

'+message+'

', type: type, dismissQueue: true, layout: "topCenter", closeWith: ['click'], theme: 'made', maxVisible: 10, animation: { open: openAnimation, close: closeAnimation, easing: 'swing', speed: 100 }, timeout:method}); }; self.showMessage = function (code) { locale.ready(getGroupName(code)).then(function() { self._showMessage(locale.getString(code),"info") }); }; self.showError =function (code) { locale.ready(getGroupName(code)).then(function() { self._showMessage(locale.getString(code),"danger") }); }; self.showWarning =function (code) { locale.ready(getGroupName(code)).then(function() { self._showMessage(locale.getString(code),"warning") }); } } function getGroupName(code){ return code.split('.')[0]; } })(); /** * Created by denak on 25.04.2016. */ (function () { angular.module("teleds.blocks") .service('playerDevice', factory) factory.$inject = ["Restangular", "$q", 'moment']; function factory(Restangular, $q, moment) { return { getToken: getToken }; function getToken() { return Restangular.all("player").post( { timestamp: moment().format("YYYY-MM-DD HH:mm:ss"), timezone: 'Europe/Moskow', uniqid: "0dabfdc5-c353-4996-8d26-6373bb8ec295" } ); } } })(); /** * Created by denak on 14.04.2016. */ (function () { angular.module("teleds.blocks") .service('players', factory); factory.$inject = ["Restangular", "$q", "restHelper"]; function factory(Restangular, $q, restHelper) { return { getPlayers: getPlayers, activatePlayer: activatePlayer, checkPlayer: checkPlayer, replaceCode: replaceCode, getPlayer: getPlayer, updatePlayer: updatePlayer, removePlayer: removePlayer, get: getPlayer, getList: getPlayers, getAll: getAll, update: updatePlayer, remove: removePlayer, getImages: getImages, addImage: addImage, removeImage: removeImage, getListFromFilterOption: getListFromFilterOption, attachCampaign: attachCampaign, detachCampaign: detachCampaign, getCampaigns: getCampaigns, moveToCampaign: moveToCampaign }; function getPlayers(param) { var list = Restangular.all("player").getList(param); var count = Restangular.one("player", 'count').get(param); return $q.all([list, count]).then(function (value) { var result = {}; result.data = value[0]; result.recordsTotal = value[1].total; result.recordsFiltered = result.recordsTotal; return result; }).catch(function () { $q.reject({data: [], recordsTotal: 0, recordsFiltered: 0} ); }); } function getPlayer(id) { return Restangular.one("player", id).get(); } function getAll() { return Restangular.all("player").getList({ "page[limit]": 500, "page[offset]": "0" }) } function checkPlayer(code) { return Restangular.one("player").one('check-code', code).get(); } function activatePlayer(model) { return Restangular.one("player?code=" + model.code + '&&type=' + model.type).customPUT(); } function updatePlayer(player) { var copyPlayer = Restangular.copy(player); copyPlayer.tags = copyPlayer.tags.map(function (v) { return v.id; }).join(); if (copyPlayer.gps_type == "unknown") { copyPlayer.gps_type = 'static'; } return copyPlayer.put(); } function replaceCode(id, code) { return Restangular.one("player", id).post("replace", {code: code}); } function removePlayer(id) { return Restangular.one("player", id).remove(); } function getImages(id) { return Restangular.one("player", id).getList("photos"); } function addImage(playerId, image) { return restHelper.sendXhrRequest("player/" + playerId + "/photos", "POST", image); } function removeImage(playerId, imageId) { return Restangular.one("player", playerId).one("photos", imageId).remove(); } function attachCampaign(playerId, campaignId) { return Restangular.one("player", playerId).one("campaign", campaignId).customPUT(); } function detachCampaign(playerId, campaignId) { return Restangular.one("player", playerId).one("campaign", campaignId).remove(); } function getCampaigns(id) { return Restangular.one("player", id).getList("campaigns"); } function moveToCampaign(playerId, campaignId, pos) { return Restangular.one("player", playerId).one("campaign", campaignId).post('move-to', {position: pos}); } function getListFromFilterOption(option) { var param = {}; if (option.name) { param['filter[name]'] = option.name; } if (option.quality && option.quality.length > 0) { param['filter[video_quality]'] = option.quality.map(function (v) { return v.name; }).join(); } if (option.tags && option.tags.length > 0) { param['filter[tags]'] = option.tags.map(function (v) { return v.id; }).join(); } param['page[offset]'] = 0; param['page[limit]'] = 500; return getPlayers(param); } } })(); /** * Created by denak on 12.06.2016. */ (function () { angular.module("teleds.blocks") .service('restHelper', service) service.$inject = ['$q', 'BASE_INFO', 'AuthService']; function service($q, BASE_INFO, AuthService) { return { sendXhrRequest: sendXhrRequest, formatDate: formatDate }; function sendXhrRequest(path, method, model) { var defer = $q.defer(); var fd = new FormData(); for (var property in model) { fd.append(property, model[property]); } var xhr = new XMLHttpRequest(); xhr.upload.onprogress = function (event) { var progress = event.lengthComputable ? event.loaded / event.total : 0; defer.notify(progress); }; xhr.open(method, BASE_INFO.URL + '/' + path, true); xhr.onload = function () { if (xhr.status == 200) { defer.resolve({data: angular.fromJson(xhr.response)}) } else { defer.reject({data: angular.fromJson(xhr.response)}) } }; xhr.onerror = function () { defer.reject({data: angular.fromJson(xhr.response)}) }; xhr.onabort = function () { defer.reject({data: angular.fromJson(xhr.response)}) }; if (AuthService.authentication.token) { xhr.setRequestHeader("Authorization", "Bearer " + AuthService.authentication.token); } xhr.send(fd); return defer.promise; } function formatDate(date) { return moment(date).utc().format("YYYY-MM-DD HH:mm:ss"); } } })(); /** * Created by denak on 08.04.2016. */ (function () { angular.module("teleds.blocks") .service('settings', service) service.$inject = ["$http",'BASE_INFO','$q']; function service($http,BASE_INFO,$q){ this.isAllow= function(){ var deferred = $q.defer(); $http.get( BASE_INFO.URL +"/settings").then(function (response) { deferred.resolve(response.data.signup); }).catch(function () { deferred.reject(); }); return deferred.promise; } } })(); /** * Created by denak on 06.06.2016. */ (function () { factory.$inject = ["Restangular", "$q", "CacheFactory", "restHelper", "$filter", "timeHelper", "AuthService"]; angular.module("teleds.blocks") .service('statistics', factory); function factory(Restangular, $q, CacheFactory, restHelper, $filter, timeHelper, AuthService) { "ngInject"; if (!CacheFactory.get('statCache')) { CacheFactory.createCache('statCache', { maxAge: 600000, storageMode: 'localStorage', deleteOnExpire: 'aggressive', capacity: 600 }); } var currentPlayerStatRequest = []; var statCache = CacheFactory.get('statCache'); return { getStatsForPlayers: getStatsForPlayers, getRequestStatsForPlayers: getRequestStatsForPlayers, getPlayerConnect: getPlayerConnect, getPlayerMonitor: getPlayerMonitor, getPlayerViews: getPlayerViews, getForSummaryPlayerChart: getForSummaryPlayerChart, getLastPlayEvent: getLastPlayEvent, getListGroupBy: getListGroupBy, getNoLastActivity: getNoLastActivity, getTopPlayerViews: getTopPlayerViews, getDistinctContent: getDistinctContent, getStatsPlayedContent: getStatsPlayedContent, getListGroupByForHours: getListGroupByForHours }; function getStatsForPlayers(players, start, end, groupByDay) { var requestId = moment().format(); var promise = $q .all( [ getChartPlayerConnect(players, start, end), getChartPlayerViews(players, start, end) ] ) .then(function (result) { var request = {}; for (var prop in result[0]) { if (result[0].hasOwnProperty(prop)) { var connectStats = ObjectToArray(result[0][prop]).map(function (item) { return {time: item.time, value: item.value.connect} }); var viewStatsAll = ObjectToArray(result[1][prop]); var monitorStats = viewStatsAll.map(function (item) { return {time: item.time, value: item.value.monitor} }); var viewsStats = viewStatsAll.map(function (item) { return {time: item.time, value: item.value.views} }); if (groupByDay) { connectStats = _.groupBy(connectStats, function (item) { return moment.utc(moment.unix(item.time)).local().format('MMDD'); }); monitorStats = _.groupBy(monitorStats, function (item) { return moment.utc(moment.unix(item.time)).local().format('MMDD'); }); viewsStats = _.groupBy(viewsStats, function (item) { return moment.utc(moment.unix(item.time)).local().format('MMDD'); }); } request[prop] = { connect: connectStats, monitor: monitorStats, view: viewsStats }; } } return request; }); var request = { requestId: requestId, promise: promise }; //requests.push(request); currentPlayerStatRequest = request; return request; } function getRequestStatsForPlayers(requestId, playerId) { /* return requests.find(function (request) { return request.requestId === requestId; })*/ return currentPlayerStatRequest.promise.then(function (stats) { return stats[playerId]; }); } function getChartPlayerConnect(players, start, end) { var param = {}; param.interval = 600; param.start_timestamp = moment(start).utc().floor(10, 'minutes').format(); param.end_timestamp = moment(end).utc().floor(10, 'minutes').format(); param.player_id = players.join(); return Restangular.all("stats").withHttpConfig({cache: statCache}).get("chart-player-connects", param); } function getChartPlayerViews(players, start, end) { var param = {}; param.interval = 1800; param.start_timestamp = moment(start).utc().floor(30, 'minutes').format(); param.end_timestamp = moment(end).utc().floor(30, 'minutes').format(); param.player_id = players.join(); return Restangular.all("stats").withHttpConfig({cache: statCache}).get("chart-player-views", param); } function getListGroupBy(groupBy, option) { var params = {}; params.start_timestamp = restHelper.formatDate(option.startDate); params.end_timestamp = restHelper.formatDate(option.endDate); switch (groupBy) { case "date": case "hour": { if (option.players.length > 0) { params.player_id = option.players.join(); } if (option.campaigns.length > 0) { params.campaign_id = option.campaigns.join(); } if (option.contents.length > 0) { params.content_id = option.contents.join(); } break; } case "campaign": { if (option.players.length > 0) { params.player_id = option.players.join(); } if (option.campaigns.length > 0) { params.campaign_id = option.campaigns.join(); } if (option.contents.length > 0) { params.content_id = option.contents.join(); } break; } case "content": { if (option.players.length > 0) { params.player_id = option.players.join(); } if (option.campaigns.length > 0) { params.campaign_id = option.campaigns.join(); } if (option.contents.length > 0) { params.content_id = option.contents.join(); } break; } case "player": { if (option.players.length > 0) { params.player_id = option.players.join(); } if (option.campaigns.length > 0) { params.campaign_id = option.campaigns.join(); } if (option.contents.length > 0) { params.content_id = option.contents.join(); } break; } } return getListGroupByReal(groupBy, params).then(function (result) { result.forEach(function (item) { item.totalOrigin = item.total; item.total = formatNumber(item.total); item.screen_onOrigin = item.screen_on; item.screen_on = formatNumber(item.screen_on); item.screen_offOrigin = item.screen_off; item.screen_off = formatNumber(item.screen_off); item.pay_$Origin = item.pay_$; item.pay_$ = formatNumber(item.pay_$); item.pay_freeOrigin = item.pay_free; item.pay_free = formatNumber(item.pay_free); item.costOrigin = item.cost; item.cost = formatNumber(item.cost); }); return result; }) } function getListGroupByForHours(entity, option, selectedHours) { var promises = selectedHours.map(function (hour) { var tempOption = angular.copy(option); tempOption.startDate = moment(option.startDate).add(hour, 'hours').format(); tempOption.endDate = moment(option.startDate).add(parseInt(hour) + 1, 'hours').format(); return getListGroupBy(entity, tempOption); }); return $q.all(promises).then(function (result) { var arrays = result.reduce(function (a, b) { return a.concat(b); }); var groupsObj = $filter('groupBy')(arrays, 'id'); var groups = Array.fromObject(groupsObj); var merged = groups.map(function (group) { return group.reduce(function (a, b) { a.totalOrigin += b.totalOrigin; a.total = formatNumber(a.totalOrigin); a.screen_onOrigin += b.screen_onOrigin; a.screen_on = formatNumber(a.screen_onOrigin); a.screen_offOrigin += b.screen_offOrigin; a.screen_off = formatNumber(a.screen_offOrigin); a.pay_$Origin += b.pay_$Origin; a.pay_$ = formatNumber(a.pay_$Origin); a.pay_freeOrigin += b.pay_freeOrigin; a.pay_free = formatNumber(a.pay_freeOrigin); a.costOrigin += b.costOrigin; a.cost = formatNumber(a.costOrigin); return a; }); }); return merged; }) } function formatNumber(number) { return $filter('number')(number, 0); } function getListGroupByReal(groupBy, option) { return Restangular.one("stats").getList(groupBy, option).then(function (result) { return result.map(function (item, index) { return { id: item.grouping, name: item.name, total: item.no_screen_views + item.views, screen_on: item.views, screen_off: item.no_screen_views, pay_$: 0, pay_free: 0, cost: 0, deleted: item.deleted } }) }); } function getForSummaryPlayerChart(param) { return $q.all( [getPlayerConnect(param), getPlayerMonitor(param), getPlayerViews(param)] ).then(function (result) { return { connect: result[0], monitor: result[1], views: result[2] }; }); } function getPlayerConnect(param) { param.interval = 600; param.start_timestamp = moment(param.start_timestamp).utc().floor(10, 'minutes').format(); param.end_timestamp = moment(param.end_timestamp).utc().floor(10, 'minutes').format(); return Restangular.all("stats").withHttpConfig({cache: statCache}).get("chart-connect", param).then(function (result) { return ObjectToArray(result.plain()); }); } function getPlayerMonitor(param) { param.interval = 600; param.start_timestamp = moment(param.start_timestamp).utc().floor(10, 'minutes').format(); param.end_timestamp = moment(param.end_timestamp).utc().floor(10, 'minutes').format(); return Restangular.all("stats").withHttpConfig({cache: statCache}).get("chart-monitor", param).then(function (result) { return ObjectToArray(result.plain()); }); } function getPlayerViews(param) { param.interval = 1800; param.start_timestamp = moment(param.start_timestamp).utc().floor(30, 'minutes').format(); param.end_timestamp = moment(param.end_timestamp).utc().floor(30, 'minutes').format(); return Restangular.all("stats").withHttpConfig({cache: statCache}).get("chart-views", param).then(function (result) { return ObjectToArray(result.plain()); }); } function getLastPlayEvent(param) { return Restangular.all("stats").get("last-play-events", param); } function getStatsPlayedContent(param) { return Restangular.all("stats").get("played-content", param); } function getNoLastActivity() { var param = {}; param.userId = AuthService.authentication.userId; return Restangular.all("stats").withHttpConfig({cache: statCache}).get("no-last-activity", param).then(function (result) { result.forEach(function (stat) { stat.value = timeHelper.getDurationFromSeconds(stat.fromLatestActivity); }); return result; }); } function getTopPlayerViews() { var param = {}; param.userId = AuthService.authentication.userId; return Restangular.all("stats").withHttpConfig({cache: statCache}).get("top-players-views", param).then(function (result) { result.forEach(function (stat) { stat.value = stat.views; }); return result; }); } function ObjectToArray(object) { var array = []; for (var prop in object) { if (object.hasOwnProperty(prop)) { array.push({ time: prop, value: object[prop] }); } } return array } function getDistinctContent(startDate, endDate, groupType) { var param = {}; param.start_timestamp = moment(startDate).utc().floor(1, 'hours').format(); param.end_timestamp = moment(endDate).utc().floor(1, 'hours').format(); param.group_by = groupType; param.userId = AuthService.authentication.userId; return Restangular.all("stats").withHttpConfig({cache: statCache}).get("distinct-content", param); } function rand(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } } })(); (function () { angular.module("teleds.blocks") .service('tableHelper', service) service.$inject = ['locale', 'DTColumnDefBuilder', 'DTOptionsBuilder']; function service(locale, DTColumnDefBuilder, DTOptionsBuilder) { return { wrapList: wrapList, getEmptyList:getEmptyList, getOptionsForAngularWayTable: getOptionsForAngularWayTable, getFunctionForSelectedTable: getFunctionForSelectedTable }; function wrapList(list) { var result = {}; result.data = list; result.recordsTotal = list.length; result.recordsFiltered = list.length; return result; } function getEmptyList() { var result = {}; result.data = []; result.recordsTotal = 0; result.recordsFiltered = 0; return result; } function getOptionsForAngularWayTable(columns) { var dtOptions = DTOptionsBuilder .newOptions() .withOption('paging', false) .withOption("searching", false) .withOption("info", false); if (locale.getLocale() == 'ru') { dtOptions.withLanguageSource('//cdn.datatables.net/plug-ins/1.10.9/i18n/Russian.json'); } var dtColumnDefs = columns.map(function (column, index) { var defColumn = DTColumnDefBuilder.newColumnDef(index); if (!column) { defColumn = defColumn.notSortable() } return defColumn; }); return {dtOptions: dtOptions, dtColumnDefs: dtColumnDefs}; } function getFunctionForSelectedTable(callback, selectedItems) { var selectAll = false; return { toggleAll: toggleAll, toggleOne: toggleOne, isSelectAny: isSelectAny }; function isSelectAny() { if (selectAll) { return true; } for (var p in selectedItems) { if (selectedItems.hasOwnProperty(p) && selectedItems[p] == true) { return true; } } return false; }; function toggleAll(selectVal) { selectAll = selectVal; for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { selectedItems[id] = selectVal; } } onSelected(selectedItems); } function toggleOne() { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { if (!selectedItems[id]) { selectAll = false; onSelected(selectedItems); return; } } } selectAll = true; onSelected(selectedItems); } function onSelected(selectedItems) { var selected = []; var all = true; for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id) && selectedItems[id]) { selected.push(id); } else { all = false; } } callback(selected, selectAll); } } } })(); (function () { angular.module("teleds.blocks") .service('tagsService', factory) factory.$inject = ["Restangular", "$q"]; function factory(Restangular, $q) { return { getPlayersTags: getPlayersTags, addPlayerTag: addPlayerTag, getContentTags: getContentTags, addContentTag: addContentTag, getTagsBuyType: getTagsBuyType, addTagsBuyType: addTagsBuyType, removeTag: removeTag }; function getPlayersTags() { return getTagsBuyType('player'); } function addPlayerTag(value) { return addTagsBuyType(value, 'player'); } function getContentTags() { return getTagsBuyType('content'); } function addContentTag(value) { return addTagsBuyType(value, 'content'); } function getTagsBuyType(type) { return Restangular.all("tag").getList({type: type}); } function addTagsBuyType(value, type) { return Restangular.all("tag").post({name: value, type: type}); } function removeTag(tag) { return tag.remove(); } } })(); /** * Created by denak on 20.07.2016. */ (function () { service.$inject = ["locale"]; angular.module("teleds.blocks") .service('timeHelper', service); function service(locale) { "ngInject"; return { getDurationFromSeconds: getDurationFromSeconds }; function getDurationFromSeconds(seconds) { var dim = {}; switch (locale.getLocale()) { case 'ru': { dim = { months: "мес.", days: " дн.", hours: "ч.", minutes: "мин." }; break; } case "en": { dim = { months: "m", days: "d", hours: "h", minutes: "m" }; break; } } var dr = moment.duration(seconds, "seconds"); var result = ""; var count = 0; var prev=""; for (var prop in dim) { if (dim.hasOwnProperty(prop)) { if (dr[prop]() > 0) { count++; if (count >=2&&prop!='hours') { break; } result += dr[prop]() + dim[prop] + ","; } } } if (result.length > 0) { result = result.substr(0, result.length - 1); } return result; } } })(); (function () { angular.module("teleds.blocks") .service('timeTargeting', factory) factory.$inject = ["Restangular" ]; function factory(Restangular) { return { createTimeTargeting: createTimeTargeting, updateTimeTargeting: updateTimeTargeting, getTimeTargeting: getTimeTargeting }; function createTimeTargeting(timeTargeting) { return Restangular.all('time-targeting').post(timeTargeting); } function getTimeTargeting(id) { return Restangular.one('time-targeting',id).get(); } function updateTimeTargeting(timeTargeting) { return timeTargeting.put(); } } })(); (function () { factory.$inject = ["Restangular", "AuthService", "restHelper"]; angular.module("teleds.blocks") .service('user', factory); function factory(Restangular, AuthService, restHelper) { "ngInject"; var data = { user: {} }; return { getCurrentUser: getCurrentUser, update: update, updateXhr: updateXhr, changePassword: changePassword, data: data }; function getCurrentUser() { return Restangular.one('user', AuthService.authentication.userId).get().then(function (result) { data.user = result; return result; }); } function update(user) { user = Restangular.copy(user); return Restangular.one('user').post('update',user.plain()).then(function (result) { data.user = result; return result; }); } function updateXhr(user) { var plainUser = (Restangular.copy(user)).plain(); plainUser.brand_background = user.brand_background; plainUser.brand_logo = user.brand_logo; plainUser.brand_background_second_screen = user.brand_background_second_screen; plainUser.brand_logo_second_screen = user.brand_logo_second_screen; return restHelper.sendXhrRequest("user/update", "POST", plainUser); } function changePassword(model) { return Restangular.one('user').post('password', model); } } })(); /** * Created by denak on 22.04.2016. */ /** * Created by denak on 14.04.2016. */ (function () { angular.module("teleds.blocks") .service('virtualScreens', factory) factory.$inject = ["Restangular", "$q"]; function factory(Restangular, $q) { return { getVirtualScreenAll: getVirtualScreenAll, createVirtualScreen: createVirtualScreen, attachPlayer: attachPlayer, add: createVirtualScreen, get: get, getList: getList, update: update, remove: remove, getPlayers: getPlayers, getAreas: getAreas }; function getVirtualScreenAll() { return Restangular.all("virtual-screen").getList({ "page[limit]": 100, "page[offset]": "0", "filter[type]": "shared" }); } function attachPlayer(id,selected) { return Restangular.one("virtual-screen", id).post("players",{player_ids:selected.join()}); } function get(id) { return Restangular.one("virtual-screen",id).get(); } function getList(param) { var list = Restangular.all("virtual-screen").getList(param); var count = Restangular.one("virtual-screen", 'count').get(param); return $q.all([list, count]).then(function (value) { var result = {}; result.data = value[0]; result.recordsTotal = value[1].total; result.recordsFiltered = result.recordsTotal; return result; }).catch(function () { $q.reject({data: [], recordsTotal: 0, recordsFiltered: 0} ); }); } function createVirtualScreen(param) { return Restangular.all("virtual-screen").post(param); } function remove(id) { return Restangular.one("virtual-screen", id).remove(); } function update(model) { var copyModel =Restangular.copy(model); return copyModel.put(); } function getPlayers(id) { return Restangular.one("virtual-screen", id).getList("players"); } function getAreas(id) { return Restangular.one("virtual-screen", id).getList("areas"); } } })(); /** * Created by denak on 07.04.2016. */ (function () { angular.module("teleds.auth") .controller("ConfirmEmailController", controller); controller.$inject = ['$stateParams', 'AuthService', '$state', 'notificationService']; function controller($stateParams, AuthService, $state, notificationService) { var vm = this; vm.succesConfirm = false; vm.skipForm = $stateParams.key != undefined; vm.confirmForm = function (form, key) { vm.submitted = true; if (form.$valid) { vm.confirm(key); } }; vm.confirm = function (key) { AuthService.confirmEmail({code: key}).then(function () { vm.succesConfirm = true; notificationService.showMessage("auth.SuccessConfirmCodeRegistration"); $state.go('personalAccount.home'); }).catch(function (response) { if(response.status ==500) { notificationService.showError('common.InternalServerError'); return; } notificationService.showError("auth.IncorrectCodeRegistration"); vm.succesConfirm = false; }); } if (vm.skipForm) { vm.confirm($stateParams.key); } }; })(); /** * Created by denak on 13.04.2016. */ (function () { angular.module("teleds.auth") .controller("LockController", controller); controller.$inject = [ 'AuthService', '$state', 'notificationService',"user"]; function controller(AuthService, $state, notificationService,user) { var vm =this; user.getCurrentUser().then(function (response) { vm.user = response; }); vm.unlock = function(form){ vm.submitted = true; if (form.$valid) { vm.loginLoading =true; AuthService.unlock({email:vm.user.email,password: vm.password}).then(function(){ vm.loginLoading =false; $state.go("personalAccount.home") }).catch(function (response) { vm.loginLoading =false; for (var prop in form) { if (prop[0]!='$'&& form[prop].serverMessage !="") { form[prop].serverMessage = null; } } if(response.status ==500) { notificationService.showError('common.InternalServerError') return; } if( response.data.error){ vm.error = response.data.error; return; } else { vm.error =""; } for (var prop in response.data) { if (form[prop]) { form[prop].serverMessage = response.data[prop][0][locale.getLocale()]; } } }) } } }; })(); /** * Created by denak on 07.04.2016. */ (function () { controller.$inject = ["AuthService", "$state", "$stateParams", "notificationService", "errorHandlerHelper", "$stateParams", "locale"]; angular.module("teleds.auth") .controller("LoginController", controller); function controller(AuthService, $state, $stateParams, notificationService, errorHandlerHelper, $stateParams, locale) { "ngInject"; var vm = this; vm.user = {}; vm.user.remember = false; if ($stateParams.disableRegistration == "true") { notificationService.showWarning('auth.DisableRegistration') } if ($stateParams.lang) { locale.setLocale($stateParams.lang); } vm.signIn = function (form) { vm.submitted = true; if (form.$valid) { vm.loginLoading = true; AuthService.signIn(vm.user).then(function () { vm.loginLoading = false; $state.go('personalAccount.player.list'); }).catch(function (response) { vm.loginLoading = false; errorHandlerHelper.handleErrorResponse(response, form, vm); }); } } }; })(); /** * Created by denak on 07.04.2016. */ (function () { controller.$inject = ["$stateParams", "AuthService", "$state", "notificationService", "$timeout"]; angular.module("teleds.auth") .controller("LoginExternalController", controller); function controller($stateParams, AuthService, $state, notificationService,$timeout) { "ngInject"; var vm = this; $timeout(function () { loginExternal(); }); function loginExternal() { AuthService.loginExternal($stateParams.token, $stateParams.userId, $stateParams.remember).then(function () { vm.succesConfirm = true; notificationService.showMessage("auth.SuccessExternalLogin"); $state.go('personalAccount.player.list'); }).catch(function (response) { if (response.status == 500) { notificationService.showError('common.InternalServerError'); return; } notificationService.showError("auth.IncorrectCodeRegistration"); vm.succesConfirm = false; }); } }; })(); /** * Created by denak on 07.04.2016. */ (function () { controller.$inject = ["AuthService", "$window", "$timeout"]; angular.module("teleds.auth") .controller("LogoutController", controller); function controller(AuthService,$window,$timeout) { "ngInject"; var vm = this; $timeout(function () { AuthService.signOutExternal().then(function () { $window.location.href="https://teleds.com/"; }); }); }; })(); /** * Created by denak on 07.04.2016. */ (function () { angular.module("teleds.auth") .controller("RememberPasswordChangeController", controller); controller.$inject = ['$stateParams', 'AuthService', '$state', 'notificationService']; function controller($stateParams, AuthService, $state, notificationService) { var vm = this; vm.succesConfirm = false; vm.changePassword = function (form) { vm.submitted =true; if(form.$valid) { vm.loading =true; vm.data.code = $stateParams.key; AuthService.resetPassword(vm.data).then(function () { vm.succesConfirm = true; vm.loading =false; notificationService.showMessage('auth.SuccessChangePassword'); $state.go('personalAccount.home'); }).catch(function (response) { vm.loading =false; if(response.status ==500) { notificationService.showError('common.InternalServerError') return; } notificationService.showError("auth.IncorrectCodeRegistration"); vm.succesConfirm = false; }); } }; }; })(); /** * Created by denak on 07.04.2016. */ (function () { angular.module("teleds.auth") .controller("RememberPasswordRequestController", controller); controller.$inject = ["AuthService"]; function controller(AuthService) { var vm = this; vm.succesRequest = false; vm.lang = "en"; vm.rememberPasswordRequest= function (form) { vm.submitted = true; if(form.$valid){ vm.loading=true; AuthService.rememberPasswordRequest({email:vm.email}).then(function () { vm.loading=false; vm.succesRequest = true; }).catch(function (response) { vm.loading=false; for (var prop in form) { if (prop[0]!='$'&& form[prop].serverMessage !="") { form[prop].serverMessage = null; } } if(response.status ==500) { notificationService.showError('common.InternalServerError') return; } for(prop in response.data) { if(form[prop]) { form[prop].serverMessage = response.data[prop][0][vm.lang ]; } } }); } } }; })(); /** * Created by denak on 07.04.2016. */ var privateServiceForExternal=null; var frameLoaded = false; var frameLoaded$q =null; (function () { var authService = (function () { authService.$inject = ["$http", "$q", "localStorageService", "BASE_INFO", "$state", "$timeout", "billingService"]; function authService($http, $q, localStorageService, BASE_INFO, $state,$timeout,billingService) { "ngInject"; this.$http = $http; this.$q = $q; this.localStorageService = localStorageService; this.pendingGettingRequest = []; this.authentication = {}; this.fillAuthData(); this.$state = $state; this.$timeout = $timeout; this.serviceBase = BASE_INFO.URL + "/"; this.billingService = billingService; this.frameLoaded=$q.defer(); if(!frameLoaded) { frameLoaded$q =this.frameLoaded; } } authService.prototype.register = function (user) { var deferred = this.$q.defer(); this.$http.post(this.serviceBase + "user", user).success(function (response) { deferred.resolve(response); }).catch(function (error) { deferred.reject(error); }); return deferred.promise; }; authService.prototype.lock = function (user) { var deferred = this.$q.defer(); var _this = this; if (_this.authentication.isAuth) { _this.authentication.isLock = true; _this.updateLock(true); deferred.resolve(); } else { deferred.reject(); } return deferred.promise; }; authService.prototype.unlock = function (form) { var _this = this; var deferred = this.$q.defer(); if (_this.authentication.isAuth) { form.rememberMe = true; _this.signIn( form, true ).then(function (response) { _this.authentication.isLock = false; _this.updateLock(false); deferred.resolve(response); } ).catch(function (error) { deferred.reject(error); }); } return deferred.promise; }; authService.prototype.resetPassword = function (form) { var deferred = this.$q.defer(); var _this = this; this.$http.post(this.serviceBase + "/user/recover-confirm", form).success(function (response) { _this._fiilData(response, false); deferred.resolve(response); }).catch(function (error) { deferred.reject(error); }); return deferred.promise; }; authService.prototype.rememberPasswordRequest = function (email) { var deferred = this.$q.defer(); this.$http.post(this.serviceBase + "/user/recover-password", email).success(function (response) { deferred.resolve(response); }).catch(function (error) { deferred.reject(error); }); return deferred.promise; }; function transformRequest(obj) { var str = []; for (var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); return str.join("&"); }; authService.prototype._fiilData = function (response, remebmer) { var authData = { token: response.token, userId: response.user_id, isAuth: true, isLock: false, remember: remebmer }; this.localStorageService.set("authorizationData", authData); this.fillAuthData(); }; authService.prototype.loginExternal = function (token, userId, remember) { var _this = this; return _this.signOut() .then(function () { _this._fiilData({token: token, user_id: userId}, remember); return _this.frameLoaded.promise.then(function () { window.frames.teledscom.postMessage( "s"+token, "https://teleds.com/"); return _this.$http.get(_this.serviceBase + "user/" + userId); }); }).catch(function () { _this.signOut(); return _this.$q.reject(); }) }; authService.prototype.signIn = function (user, notSignOut) { var _this = this; var deferred = this.$q.defer(); this.billingService.clearCache(); var signIn = function () { var data = transformRequest(user); _this.$http.post( _this.serviceBase + "user/login", data, { headers: {"Content-Type": "application/x-www-form-urlencoded"} }).success(function (response) { _this.billingService.clearCache(); _this._fiilData(response, user.remember); window.frames.teledscom.postMessage( "s"+response.token, "https://teleds.com/"); if (!user.remember) { _this.$timeout(function () { _this.signOut().then(function () { _this.$state.go("auth.login", null, {reload: true}); }) }, response.keep_alive_ttl*1000) } deferred.resolve(response); }).catch(function (error) { deferred.reject(error); }); }; if (notSignOut) { signIn(); } else { this.signOut().then(signIn).catch(function (error) { deferred.reject(error); }); } return deferred.promise; }; authService.prototype.removeAuthorizationData = function () { this.localStorageService.remove("authorizationData"); this.authentication.isAuth = false; this.authentication.userName = ""; this.authentication.userId = ""; this.authentication.roles = []; this.authentication.isLock = false; this.authentication.remember = false; this.authentication.token = ""; }; authService.prototype.signOutExternal = function () { var _this = this; var deferred = this.$q.defer(); var authData = this.localStorageService.get("authorizationData"); if (authData) { _this.frameLoaded.promise.then(function () { window.frames.teledscom.postMessage( "d", "https://teleds.com/"); deferred.resolve(); }); this.removeAuthorizationData(); } else { deferred.resolve(); } return deferred.promise; }; authService.prototype.signOut = function () { var _this = this; var deferred = this.$q.defer(); var authData = this.localStorageService.get("authorizationData"); if (authData) { this.billingService.clearCache(); this.removeAuthorizationData(); window.frames.teledscom.postMessage( "d", "https://teleds.com/"); deferred.resolve(); } else { deferred.resolve(); } return deferred.promise; }; authService.prototype.confirmEmail = function (confirmEmail) { var deferred = this.$q.defer(); this.$http.post(this.serviceBase + "user/confirm", confirmEmail).success(function (response) { deferred.resolve(response); }).catch(function (error) { deferred.reject(error); }); return deferred.promise; }; authService.prototype.extendTokenLifeTime = function (confirmEmail) { var _this = this; var deferred = this.$q.defer(); var authData = this.localStorageService.get("authorizationData"); if (this.extendTokenLifeTimePending) { this.pendingGettingRequest.push(deferred); } else { this.extendTokenLifeTimePending = true; this.$http.get(this.serviceBase + "user/refresh-token").success(function (response) { _this._fiilData(response, false); _this.extendTokenLifeTimePending = false; deferred.resolve(true); for (var _i = 0, _a = _this.pendingGettingRequest; _i < _a.length; _i++) { var def = _a[_i]; def.resolve(false); } }).error(function (err) { _this.extendTokenLifeTimePending = false; var error = function () { deferred.reject(true); for (var _i = 0, _a = _this.pendingGettingRequest; _i < _a.length; _i++) { var def = _a[_i]; def.reject(false); } }; _this.signOut().then(error).catch(error); }); } return deferred.promise; }; authService.prototype.updateLock = function (isLock) { var authDate = this.localStorageService.get("authorizationData"); authDate.isLock = isLock; this.localStorageService.set("authorizationData", authDate); }; authService.prototype.fillAuthData = function () { var authData = this.localStorageService.get("authorizationData"); if (authData) { this.authentication.isAuth = true; this.authentication.userId = authData.userId; this.authentication.isLock = authData.isLock; this.authentication.remember = authData.remember; this.authentication.token = authData.token; } }; privateServiceForExternal =authService; return authService; }()); angular.module("teleds.auth") .service("AuthService", authService); })(); function onloadFrame() { if(frameLoaded$q) { frameLoaded$q.resolve(); } else { frameLoaded=true; } }; (function () { angular.module("teleds.auth") .factory('AuthInterceptorService', authInterceptorService); authInterceptorService.$inject = ['$q', '$injector', 'localStorageService']; function authInterceptorService($q, $injector, localStorageService) { var $http; var $state; var authService; var request = function (config) { config.headers = config.headers || {}; var authData = localStorageService.get("authorizationData"); if (authData && config.url.indexOf('cdn') == -1) { config.headers.Authorization = "Bearer " + authData.token; authData.lastUpdate = moment(); localStorageService.set("authorizationData",authData); } return config; }; var retryHttpRequest = function (config, deferred) { $http = $http || $injector.get("$http"); return $http(config); }; var responseError = function (rejection) { var deferred = $q.defer(); if (rejection.status === 401) { if (rejection.config.url.includes("/user/login")) { deferred.reject(rejection); return deferred.promise; } authService = authService || $injector.get("AuthService"); if (!authService.authentication.isAuth) { $state = $state || $injector.get("$state"); $state.go("auth.login", null, {reload: true}); deferred.reject(rejection); return deferred.promise; } function signOut() { authService.signOut().then(function () { $state = $state || $injector.get("$state"); $state.go("auth.login", null, {reload: true}); }).finally(function () { deferred.reject(rejection); }); } if (authService.authentication.remember ) { authService.extendTokenLifeTime().then(function (response) { retryHttpRequest(rejection.config, deferred); }, function (result) { if (result) { signOut(); } else { deferred.reject(rejection); } }); } else { signOut(); } } else { deferred.reject(rejection); } return deferred.promise; }; var authInterceptorServiceFactory = {}; authInterceptorServiceFactory.request = request; authInterceptorServiceFactory.responseError = responseError; return authInterceptorServiceFactory; } })(); /** * Created by denak on 07.04.2016. */ (function () { signupController.$inject = ["AuthService", "locale", "errorHandlerHelper", "$stateParams", "locale", "$timeout"]; angular.module("teleds.auth") .controller("SignupController", signupController); function signupController(AuthService, locale, errorHandlerHelper, $stateParams,locale,$timeout) { "ngInject"; var vm = this; vm.user = {}; vm.user.max_players = "5"; vm.submitted = false; vm.successRegistration = false; vm.setResponse = function (response) { vm.user["g-recaptcha-response"] = response; }; vm.setWidgetId = function (widgetId) { vm.widgetId = widgetId; }; if ($stateParams.lang) { locale.setLocale($stateParams.lang); } vm.lang = function () { return locale.getLocale(); }; vm.register = function (form) { vm.submitted = true; if (form.$valid) { vm.loginLoading = true; vm.user.lang = locale.getLocale(); vm.user['g-recaptcha-response'] = "1111"; AuthService.register(vm.user).then(function () { if($stateParams.cid) { $('body').append(''); yaCounter40364385.reachGoal('FORM'); $timeout(function () { vm.successRegistration = true; vm.loginLoading = false; },1000) } else { vm.successRegistration = true; vm.loginLoading = false; } }).catch(function (response) { vm.loginLoading = false; errorHandlerHelper.handleErrorResponse(response, form, vm); }); } } } })(); /** * Created by denak on 13.04.2016. */ /** * Created by denak on 08.04.2016. */ (function () { angular.module("teleds.layout") .service('menu', service) service.$inject = ["localStorageService", '$filter']; function service(localStorageService, $filter) { this.getOrder = function (menu, reset) { var localMenu = JSON.parse(localStorageService.get("menu")); if (localMenu && !reset) { angular.forEach(menu, function (item) { var result = $filter('filter')(localMenu, {key: item.key}); if (result.length > 0) { item.i = parseInt(result[0].i); } else { item.i = null } }); var ordered = $filter('orderBy')(menu, "i"); for (var i = 0; i < ordered.length; i++) { if (ordered[i].i == null) { ordered[i].i = i } } menu = ordered; } else { for (var i = 0; i < menu.length; i++) { menu[i].i = i } } this.save(menu); return menu; } this.save = function (menu) { localStorageService.set("menu", JSON.stringify(menu)); } } })(); /** * Created by denak on 13.04.2016. */ (function () { controller.$inject = ["players", "notificationService", "moment", "$timeout", "removeModalService", "assignCampaignService", "$state", "controlTagServiceModal", "playerStatModalService", "$q", "statistics"]; angular.module("teleds.players") .controller("PlayersController", controller); function controller(players, notificationService, moment, $timeout, removeModalService, assignCampaignService, $state, controlTagServiceModal, playerStatModalService, $q, statistics) { "ngInject"; var vm = this; var request = null; vm.option = { tags: [], name: "", quality: [], quicktype: '' }; vm.data = []; vm.promises = []; vm.columns = [ { type: 'custom', name: 'created_at', render: function (data, full) { if (full.timezone == "Europe/Moskow") { full.timezone = "Europe/Moscow"; } if (isEmpty(full.timezone)) { full.timezone = "Europe/Moscow"; } var date = moment.utc(data).format("DD.MM.YYYY HH:mm:ss"); return '
' + date + '
'; }, title: "players.DateCreated" }, { type: 'name', name: 'name', align: "left", title: "common.Name", width: "50%", cellClass: "name-cell one-string table-link" }, { type: 'tags', name: 'tags', notSort: true }, { type: 'custom', name: 'video_quality', render: function (data, full) { return '' + data + ''; }, title: "players.Quality" }, { type: 'custom', name: 'id', notSort: true, titlePopoverTemplateUrl: 'players/players/helpChart.html', titlePopoverClass: 'help-popover_popover--chart', render: function (data, full) { return '
' + '' + ' ' + '
'; }, title: "players.Stat", cellClass: "chart-cell" }, { type: 'custom', name: 'last_activity', render: function (data, full) { return '
'; }, title: "players.Status" } , { type: 'custom', name: 'null', notSort: true, render: function (data, full) { var control_row = '
' + '' + '' + '
'; return control_row; } } ]; vm.defaultSort = [1, 'desc']; var first = true; vm.actionCallback = function (action, val) { switch (action) { case "info": { vm.goToPlayer(val); break; } case "tracking": { $state.go('personalAccount.player.tracking', {id: val}); break; } case 'doubleClick': { vm.goToPlayer(val); break; } case 'clickName': { vm.goToPlayer(val); break; } case 'chart': { vm.showChart(val); break; } case "remove": { removeModalService.showRemoveModal([val], "players").then(function () { vm.instance.reloadData(false); }); break; } case "setPromise": { vm.promises.push(val); if (vm.promises.length === vm.data.data.length) { $q.all(vm.promises).finally(function () { vm.defer.resolve(); }) } break; } } }; vm.showChart = function (id) { playerStatModalService.show(id); }; vm.goToPlayer = function (id) { $state.go('personalAccount.player.one', {id: id}) }; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { var param = {}; if (vm.option.name) { param['filter[name]'] = vm.option.name; } if (vm.option.quality && vm.option.quality.length > 0) { param['filter[video_quality]'] = vm.option.quality.map(function (v) { return v.name; }).join(); } if (vm.option.tags && vm.option.tags.length > 0) { param['filter[tags]'] = vm.option.tags.map(function (v) { return v.id; }).join(); } var order = aoData[2].value; if (order.length > 0) { var columnIndex = order[0].column; var dir = order[0].dir; var nameParam = 'sort[' + aoData[1].value[columnIndex].data + ']'; param[nameParam] = dir; } param['page[offset]'] = aoData[3].value; param['page[limit]'] = aoData[4].value; var defer = $q.defer(); return players.getPlayers(param).then(function (result) { vm.data = result; vm.promises.length = 0; if (vm.data.data.length > 0) { var startDate = moment().add(-1, 'days'); var endDate = moment(); request = statistics.getStatsForPlayers(vm.data.data.map(function (player) { return player.id }), startDate, endDate); } else { vm.notExist = vm.option.quality.length === 0 && vm.option.tags.length === 0 && vm.option.name === '' && vm.option.quicktype === ''; } if (first) { first = false; $timeout(function () { fnCallback(result); }); } else { fnCallback(result); } $timeout(function () { vm.instance.dtInstance.DataTable.columns.adjust() }); }).catch(function (result) { notificationService.showWarning('common.FailedGet'); fnCallback(result); }); }; vm.intanceCallback = function (instance) { vm.instance = instance; }; vm.onReset = function () { vm.option.quicktype = ''; vm.option.tags.length = 0; vm.option.quality.length = 0; vm.option.name = ''; vm.instance.reloadData(true); }; vm.onApply = function (option) { vm.option.quicktype = option.quicktype; vm.option.tags = option.tags; vm.option.name = option.name; vm.option.quality = option.quality; vm.notExist = false; vm.instance.reloadData(true); }; vm.onSelected = function (ids, all) { vm.selectedIds = ids; vm.all = all; }; vm.removePlayers = function () { removeModalService.showRemoveModal(vm.selectedIds, "players").then(function () { vm.instance.reloadData(vm.all, function () { vm.unselect = false; vm.selectAll = false; }); }); }; vm.assignCampaign = function () { assignCampaignService.showAssignCampaignModal(vm.selectedIds).then(function () { vm.instance.unToggleAll(); }); }; vm.addTags = function () { controlTagServiceModal.showControlTagModal(vm.selectedIds, 'player').then(function () { vm.instance.reloadData(vm.all, function () { vm.unselect = false; vm.selectAll = false; }); }); }; vm.reload = function () { vm.instance.reloadData(false); } } })(); /** * Created by denak on 17.05.2016. */ (function () { Controller.$inject = ["profile", "user", "$state", "fileService", "$q"]; angular.module("teleds.user").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.preference.brand', { url: '/brand', templateUrl: 'user/brand/brand.html', controller: Controller, controllerAs: "vm", resolve: { profile: ["user", function (user) { return user.getCurrentUser(); }] } }) } function Controller(profile, user, $state, fileService, $q) { "ngInject" var vm = this; vm.model = profile; vm.changeStatus = function () { vm.model.brand_active = vm.model.brand_active == 1 ? 0 : 1; if (vm.model.brand_active == 0) { $q.all([resetLogo(), resetBackground(), resetLogoSecondScreen('images/logo_example.png'), resetBackgroundSecondScreen('images/background_example_second_screen.png')]).then(function () { vm.model.brand_color_1 = '#ffffff'; vm.model.brand_color_2 = '#00cdc1'; vm.model.brand_color_1_second_screen = "#ffffff"; vm.model.brand_color_2_second_screen = "#0086e3"; vm.model.brand_teleds_copyright = 1; vm.model.brand_teleds_copyright_second_screen = 1; vm.onSave(0); }) } else { vm.onSave(0); } }; vm.accept = "image/*"; vm.brandBackground = vm.model.brand_background; vm.brandLogo = vm.model.brand_logo; vm.brandBackgroundSecondScreen = vm.model.brand_background_second_screen; vm.brandLogoSecondScreen = vm.model.brand_logo_second_screen; vm.onChangeBackground = function (file) { vm.model.brand_background = file; vm.changeBackgroundPromise = vm.onSave(1); }; vm.onChangeLogo = function (file) { vm.model.brand_logo = file; vm.changeLogoPromise = vm.onSave(1); }; vm.onChangeBackgroundSecondScreen = function (file) { vm.model.brand_background_second_screen = file; vm.changeBackgroundSecondScreenPromise = vm.onSave(2); }; vm.onChangeLogoSecondScreen = function (file) { vm.model.brand_logo_second_screen = file; vm.changeLogoPromiseSecondScreenPromise = vm.onSave(2); }; vm.resetLogo = function () { resetLogo().then(function () { return vm.onSave(1); }); }; vm.resetBackground = function () { resetBackground().then(function () { return vm.onSave(1); }) }; vm.resetLogoSecondScreen = function () { resetLogoSecondScreen('images/logo_example.png').then(function () { return vm.onSave(2); }); }; vm.resetBackgroundSecondScreen = function () { resetBackgroundSecondScreen('images/background_example_second_screen.png').then(function () { return vm.onSave(2); }) }; function resetBackground() { return fileService.getFile('images/background_example.png', 'default-background.png').then(function (file) { vm.model.brand_background = file; }) } function resetLogo() { return fileService.getFile('images/logo_example.png', 'default-logo.png').then(function (file) { vm.model.brand_logo = file; }) } function resetBackgroundSecondScreen(url) { return fileService.getFile(url, 'default-background.png').then(function (file) { vm.model.brand_background_second_screen = file; }) } function resetLogoSecondScreen(url) { return fileService.getFile(url, 'default-logo.png').then(function (file) { vm.model.brand_logo_second_screen = file; }) } vm.control = { get brand_teleds_copyright() { return vm.model.brand_teleds_copyright != 1; }, set brand_teleds_copyright(val) { vm.model.brand_teleds_copyright = val ? 0 : 1; vm.onSave(1); }, get brand_teleds_copyright_second_screen() { return vm.model.brand_teleds_copyright_second_screen != 1; }, set brand_teleds_copyright_second_screen(val) { vm.model.brand_teleds_copyright_second_screen = val ? 0 : 1; vm.onSave(2); }, get repeat() { return vm.model.repeat == 1; }, set repeat(val) { vm.model.repeat = val ? 1 : 0; vm.onSave(1); }, get repeatSecondScreen() { return vm.model.repeat_second_screen == 1; }, set repeatSecondScreen(val) { vm.model.repeat_second_screen = val ? 1 : 0; vm.onSave(2); }, set duplicate(val) { vm.model.duplicate = val?1:0; if (val) { $q.all([resetLogoSecondScreen(vm.brandLogo), resetBackgroundSecondScreen(vm.brandBackground)]).then(function () { vm.model.brand_color_1_second_screen = vm.model.brand_color_1; vm.model.brand_color_2_second_screen = vm.model.brand_color_2; vm.model.brand_teleds_copyright_second_screen = vm.model.brand_teleds_copyright; vm.model.repeat_second_screen = vm.model.repeat; vm.onSave(2); }) } else { vm.onSave(2); } }, get duplicate() { return vm.model.duplicate==1; } }; vm.onSave = function (screen) { var promise = user.updateXhr(vm.model).then(function (result) { vm.brandBackground = result.data.brand_background; vm.brandLogo = result.data.brand_logo; vm.brandBackgroundSecondScreen = result.data.brand_background_second_screen; vm.brandLogoSecondScreen = result.data.brand_logo_second_screen; vm.model.brand_background = result.data.brand_background; vm.model.brand_logo = result.data.brand_logo; vm.model.brand_background_second_screen = result.data.brand_background_second_screen; vm.model.brand_logo_second_screen = result.data.brand_logo_second_screen; return result; }); if (screen == 1) { vm.updateFirst = promise; } else if (screen == 2) { vm.updateSecond = promise; } else { vm.updateFirst = promise; vm.updateSecond = promise; } return promise; }; vm.back = function () { $state.go("personalAccount.home") } } })(); /** * Created by denak on 12.04.2016. */ /** * Created by denak on 07.04.2016. */ (function () { angular.module("teleds.user") .controller("PreferenceController", controller); controller.$inject = []; function controller() { }; })(); /** * Created by denak on 17.05.2016. */ (function () { Controller.$inject = ["profile", "user", "locale", "changePasswordModalService", "confirmModalService", "$state", "editService"]; angular.module("teleds.user").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.preference.profile', { url: '/profile', templateUrl: 'user/profile/profile.html', controller: Controller, controllerAs: "vm", resolve: { profile: ["user", function (user) { return user.getCurrentUser(); }] } }) } function Controller(profile, user, locale, changePasswordModalService, confirmModalService, $state, editService) { var vm = this; vm.model = profile; vm.editModel = editService.getEditModelForRestAngularModel(vm); vm.onChange = function (obj) { vm.model = obj.value; }; vm.onSave = function () { return user.update(vm.model); }; vm.subs = false; vm.locale = locale.getLocale(); if (vm.locale == "en") { vm.locale = 'us'; } vm.changePassword = function () { changePasswordModalService.show().then(function () { vm.editModel.endEdit(); }); }; vm.unSubscribe = function () { confirmModalService.show('user.NewslettersUnSubscribeMessage', function () { vm.model.newsletters = false; return user.update(vm.model) }).then(function () { vm.model.newsletters = false; }).catch(function () { vm.model.newsletters = true; }); }; vm.subscribe = function () { vm.model.newsletters = true; user.update(vm.model).then(function (result) { vm.model.newsletters = true; }).catch(function () { vm.model.newsletters = false; }) }; vm.back = function () { $state.go("personalAccount.home") } } })(); angular.module('newApp').controller('sessionTimeoutCtrl', ["$scope", "$location", function ($scope, $location) { $scope.$on('$viewContentLoaded', function () { function sessionTimeout() { var $countdown; $('body').append(''); /* Start the idle timer plugin */ $.idleTimeout('#session-timeout', '.modal-content button:last', { idleAfter: 5, // 5 seconds before a dialog appear (very short for demo purpose) timeout: 30000, // 30 seconds to timeout pollingInterval: 5, // 5 seconds keepAliveURL: '../../../assets/global/plugins/idle-timeout/keepalive.php', serverResponseEquals: 'OK', onTimeout: function () { if ($location.path() === '/user-sessionTimeout') {//remove this condition to apply timout for all the pages window.location = "../../user-lockscreen.html"; } }, onIdle: onIdle, onCountdown: function (counter) { /* We update the counter */ if ($countdown) $countdown.html(counter); } }); }; var onIdle = function () { $('#session-timeout').modal('show'); $countdown = $('#idle-timeout-counter'); $('#idle-timeout-dialog-keepalive').on('click', function () { $('#session-timeout').modal('hide'); }); $('#idle-timeout-dialog-logout').on('click', function () { $('#session-timeout').modal('hide'); $.idleTimeout.options.onTimeout.call(this); }); } sessionTimeout(); $('body').append(''); }); $scope.$on('$destroy', function () { $(document).unbind("idle.idleTimer"); delete onIdle; }); }]); /** * Created by denak on 15.05.2016. */ (function () { angular.module("teleds.blocks") .factory('controlTag', factory); factory.$inject = ["contents", "players", "$q", "$filter"]; function factory(contents, players, $q, $filter) { return function (type) { var resource = null; switch (type) { case "player": resource = players; break; case "content": { resource = contents; break; } } var service = { getResource: getResource, updateResource: updateResource, add: add, remove: remove }; return service; function getResource(id) { return resource.get(id); } function updateResource(item) { return resource.update(item); } function add(selected, tags) { var defer = $q.defer(); var promises = []; angular.forEach(selected, function (id) { var updatePromise = $q.defer(); promises.push(updatePromise.promise); resource.get(id) .then(function (item) { var needAddTag = []; angular.forEach(tags, function (tag) { var result = $filter('filter')(item.tags, {id: tag.id}); if (result.length == 0) { needAddTag.push(tag); } }); if(needAddTag.length>0) { item.tags =item.tags.concat(needAddTag); service.updateResource(item).then(function () { updatePromise.resolve(); }).catch(function (result) { updatePromise.reject(result) }) } else { updatePromise.resolve(); } }) .catch(function (result) { updatePromise.reject(result) }); }); $q.all(promises).then(function (value) { defer.resolve(); }).catch(function (result) { defer.reject(result[0]); }); return defer.promise; } function remove(selected, tags) { var defer = $q.defer(); var promises = []; angular.forEach(selected, function (id) { var updatePromise = $q.defer(); promises.push(updatePromise.promise); resource.get(id) .then(function (item) { var needRemoveTag = []; angular.forEach(tags, function (tag) { var result = $filter('filter')(item.tags, {id: tag.id}); if (result.length != 0) { needRemoveTag.push(result[0]); } }); if(needRemoveTag.length>0) { angular.forEach(needRemoveTag, function (tag) { item.tags.splice(item.tags.indexOf(tag),1) }); service.updateResource(item).then(function () { updatePromise.resolve(); }).catch(function (result) { updatePromise.reject(result) }) } else { updatePromise.resolve(); } }) .catch(function (result) { updatePromise.reject(result) }); }); $q.all(promises).then(function (value) { defer.resolve(); }).catch(function (result) { defer.reject(result[0]); }); return defer.promise; } } ; } })(); /** * Created by denak on 15.05.2016. */ (function () { angular.module("teleds.blocks") .service('controlTagServiceModal', service) service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.showControlTagModal = function (selected, type) { if (selected.length == 1) { var modalInstance = $uibModal.open({ backdrop : 'static', templateUrl: 'blocks/components/controlTag/controlOneItemModal/controlOneItemModal.html', controller: 'controlOneItemController as vm', windowClass: 'control-modal', resolve: { id: function () { return selected[0]; }, type: function () { return type; } } }); return modalInstance.result; } else { var modalInstance = $uibModal.open({ backdrop : 'static', templateUrl: 'blocks/components/controlTag/controlManyItemModal/controlManyItemModal.html', controller: 'controlManyItemController as vm', windowClass: 'control-modal', resolve: { selected: function () { return selected; }, type: function () { return type; } } }); return modalInstance.result; } } } })(); /** * Created by denak on 31.05.2016. */ (function () { angular.module("teleds.blocks").value('cgBusyDefaults', { templateUrl: 'blocks/components/angular-busy/angular-busy.html' }); })(); /** * Created by denak on 18.04.2016. */ (function () { angular.module("teleds.blocks").component("durationView", component()); function component() { return { bindings: { ngDuration: "<", ngSec:"<" }, templateUrl: 'blocks/components/durationView/durationView.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['tagsService']; function Controller(tagsService) { var vm = this; vm.koef =1; if(vm.ngSec) { vm.koef=1000; } } })(); /** * Created by denak on 12.04.2016. */ (function () { angular.module("teleds.blocks").component('fileInput', component()); function component() { return { bindings: { file: "<", onChange: "&", name: "@", ngRequired: "@", accept: "<", placementName:"@", buttonWord:"@" }, templateUrl: 'blocks/components/fileInput/fileInput.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$compile', '$element', '$scope']; function Controller($compile, $element, $scope) { var vm = this; var input = $element.find('input'); if(isEmpty(vm.placementName)) { vm.placementName='inside' } if (isEmpty(vm.buttonWord)) { vm.buttonWord = 'common.SelectFile'; } input.bind("change", function (changeEvent) { if (changeEvent.target.files.length == 0) { return; } $scope.$apply(function () { vm.onChange({ file: input[0].files[0] }) }) }); var fileInputBootstrap = input.bootstrapFileInput(vm.buttonWord); $compile(angular.element($element.find('input')))($scope); $compile(angular.element($element.find('span')))($scope); this.$onChanges = function (changesObj) { if (changesObj.file != null && changesObj.file.currentValue == null) { input.val(null); input.trigger("change"); } }; } })(); /** * Created by denak on 19.04.2016. */ (function () { angular.module("teleds.blocks").directive('focusMe', directive); directive.$inject = ['$timeout', '$parse']; function directive($timeout, $parse) { return { link: function (scope, element, attrs) { var model = $parse(attrs.focusMe); scope.$watch(model, function (value) { if (value === true) { $timeout(function () { setTimeout(function() { $( element[0]).focus(); }, 100); }); } }); element.bind('blur', function () { $timeout(function () { model.assign(scope, false) }); }); } }; } })(); /** * Created by denak on 18.04.2016. */ (function () { angular.module("teleds.blocks").component("formsWizards", component()); function component() { return { transclude: true, bindings: { style: "@", nav: "@" }, templateUrl: 'blocks/components/formWizards/formWizards.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$element', '$scope', '$timeout', '$q', '$compile','localeEvents']; function Controller($element, $scope, $timeout, $q, $compile,localeEvents) { var vm = this; vm.next = false; vm.steps = []; $timeout( checkOrInit, 200 ); function checkOrInit() { if (vm.steps.length == 0) { $timeout( checkOrInit, 200 ); } else { init(); } } function init() { vm.sf = $element.find('form').stepFormWizard({ startStep:0 , theme: vm.style ? vm.style : "circle", showNav: vm.nav ? vm.nav : "top", height: "auto", showButtons: false, rtl: $('body').hasClass('rtl') ? true : false, onNext: function (i, wizard) { if (vm.allowNext) { vm.allowNext = false; return true; } return false; }, onFinish: function (i) { }, onPrev: function (i, wizard) { return false; } }) $compile(angular.element($element.find('.sf-controls')).contents())($scope); $element.data('initiated', true); vm.isInit=true; } vm.addStep = function (step) { vm.steps.push(step); }; vm.next= function () { var stepCtrl = vm.steps[vm.sf.stepActive]; if (stepCtrl) { var value = stepCtrl.nextStep(); vm.loading = true; $q.when(value).then(function (result) { if (result) { vm.allowNext = true; vm.sf.next(); } vm.loading = false; }).catch(function () { vm.loading = false; }) } } vm.prevStep = function () { /*реализуем если понадобится**/ } $scope.$on(localeEvents.localeChanges, function (event, data) { vm.sf.refresh() }); } })(); /** * Created by denak on 21.04.2016. */ (function () { function wizardButtonDirective(action) { angular.module("teleds.blocks") .directive(action, function () { return { restrict: 'A', replace: false, require: '^formsWizards', link: function ($scope, $element, $attrs, formsWizards) { $element.on("click", function (e) { e.preventDefault(); $scope.$eval($attrs[action]); formsWizards[action.replace("fw", "").toLowerCase()](); }); } }; }); } wizardButtonDirective('fwNext'); wizardButtonDirective('fwPrevious'); wizardButtonDirective('fwFinish'); wizardButtonDirective('fwCancel'); wizardButtonDirective('fwReset'); })(); /** * Created by denak on 19.04.2016. */ /** * Created by denak on 18.04.2016. */ (function () { angular.module("teleds.blocks").component("formsWizardsStep", component()); function component() { return { transclude: true, require: { formsWizardsCtrl: '^formsWizards' }, bindings: { nextStep: "&" }, templateUrl: 'blocks/components/formWizards/formWizardsStep.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$element', '$scope', '$timeout']; function Controller($element, $scope, $timeout) { var vm = this; vm.$onInit = function () { this.formsWizardsCtrl.addStep(vm); }; } })(); /** * Created by denak on 12.04.2016. */ (function () { angular.module("teleds.blocks").directive('icheck',directive); directive.$inject=['$timeout','$parse'] function directive($timeout, $parse) { return { require: 'ngModel', link: function ($scope, element, $attrs, ngModel) { if($attrs.performance) { return checkbox(); } return $timeout(checkbox); function checkbox () { var value; value = $attrs['value']; var checkboxClass = $(element).attr('data-checkbox') ? $(element).attr('data-checkbox') : 'icheckbox_minimal-grey'; var radioClass = $(element).attr('data-radio') ? $(element).attr('data-radio') : 'iradio_minimal-grey'; var icheck ; if (checkboxClass.indexOf('_line') > -1 || radioClass.indexOf('_line') > -1) { icheck = $(element).iCheck({ checkboxClass: checkboxClass, radioClass: radioClass, insert: '
' + $(this).attr("data-label") }); } else { icheck= $(element).iCheck({ checkboxClass: checkboxClass, radioClass: radioClass }); } $scope.$watch($attrs['ngModel'], function (newValue) { $(element).iCheck('update'); }); $(element).iCheck('update'); return icheck.on('ifChanged', function (event) { if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) { $scope.$apply(function () { return ngModel.$setViewValue(event.target.checked); }); } if ($(element).attr('type') === 'radio' && $attrs['ngModel']) { return $scope.$apply(function () { if(value=='true'||value==1) { value=true; } else if(value=='false'||value==0) { value=false; } return ngModel.$setViewValue(value); }); } }); } } }; } })(); /** * Created by denak on 22.04.2016. */ (function () { angular.module("teleds.blocks") .component("ionRangeSlider", component()); function component() { return { bindings: { min: "<", max: "<", type: "@", prefix: "@", maxPostfix: "@", prettify: "@", grid: "@", gridMargin: "@", postfix: "@", step: "@", hideMinMax: "@", hideFromTo: "@", from: "<", to: "<", disable: "=", onChange: "&", onFinish: "&", ngDisabled: "<" }, controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$element', '$scope', '$timeout']; function Controller($element, $scope, $timeout) { var vm = this; vm.init = false; var slider = {}; $timeout(function () { $element.ionRangeSlider({ min: vm.min, type: vm.type, postfix: vm.postfix, step: vm.step, hide_min_max: vm.hideMinMax, hide_from_to: vm.hideFromTo, from: vm.from, to: vm.to, disable:vm.ngDisabled, onChange: function (a) { if (a.to == 0) { a.to = 1; } if (a.from > vm.max) { a.from = vm.max; slider.update( {from: a.from} ); } $scope.$apply( function () { vm.onChange( { from: a.from, to: a.to } ) } ); }, onFinish: function (a) { if (a.to == 0) { a.to = 1; } if (a.from > vm.max) { a.from = vm.max; } if (vm.from == a.from) { slider.update( {from: vm.from} ); } $scope.$apply( function () { vm.onFinish( { from: a.from, to: a.to }); } ); } }); slider = $element.data("ionRangeSlider"); vm.init = true; }); this.$onChanges = function (changesObj) { if (vm.init) { for (var prop in changesObj) { var elem = {}; elem[prop] = changesObj[prop].currentValue; if (prop == 'to' || prop == 'from') { vm[prop] = elem[prop]; slider.update( elem ); } if (prop == 'max') { if (vm.from > changesObj['max'].currentValue) { vm.from = changesObj['max'].currentValue; vm.onFinish( { from: vm.from, to: vm.to }); } } if (prop == 'ngDisabled') { slider.update( {disable: changesObj[prop].currentValue} ); } } } } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.campaigns") .component("helpPopover", component()); function component() { return { restrict: "EA", bindings: { templateUrl:"<", ngContent:"<", ngTitle:"<", ngPosition:'@', popoverClass:'@', ngIcon:"@" }, templateUrl: 'blocks/components/helpPopover/helpPopover.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['ContentTypes']; function Controller(ContentTypes) { var vm = this; vm.$onInit = function () { if(!vm.ngIcon) { vm.ngIcon='fa-question-circle' } if(!vm.ngPosition) { vm.ngPosition='top'; } } } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["tableHelper", "$"]; angular.module("teleds.players") .component("lastPlayEventsTable", component()); function component() { return { restrict: "EA", bindings: { items: '<', name:"@" }, templateUrl: 'blocks/components/lastPlayEventsTable/lastPlayEventsTable.html', controller: Controller, controllerAs: 'vm' }; } function Controller(tableHelper, $) { "ngInject"; var vm = this; var options = tableHelper.getOptionsForAngularWayTable([false, false, false]); options.dtOptions = options.dtOptions.withOption("scrollY", '291px'); vm.dtOptions = options.dtOptions; vm.dtColumnDefs = options.dtColumnDefs; $q.when(vm.items).then(function (result) { vm.events = result; }); } })(); /** * Created by denak on 19.04.2016. */ (function () { angular.module("teleds.blocks").directive('popoverClose', ["$timeout", function ($timeout) { return { scope: { excludeClass: '@' }, link: function (scope, element, attrs) { var trigger = document.getElementsByClassName('trigger'); function closeTrigger(i) { $timeout(function () { angular.element(trigger[0]).triggerHandler('click').removeClass('trigger'); }); } element.on('click', function (event) { var etarget = angular.element(event.target); var tlength = trigger.length; if (!etarget.hasClass('trigger') && !etarget.hasClass(scope.excludeClass)) { for (var i = 0; i < tlength; i++) { closeTrigger(i) } } }); } }; }]); angular.module("teleds.blocks").directive('popoverElem', function () { return { link: function (scope, element, attrs) { element.on('click', function () { element.addClass('trigger'); }); } }; }); })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["$filter", "$q", "$scope", "confirmModalService", "$timeout"]; angular.module("teleds.blocks").component("multipleSelect", component()); function component() { return { bindings: { items: "<", text: "@", key: "@", ngModel: "<", multiplePlaceholder: "@", title: "@", allowAdd: "@", allowRemove: "@", onItemAdd: '&', onItemRemove: '&', translate: "@", typeTranslate: '@', selectIcon: "@", onChange:"&", appendToBody:"@" }, templateUrl: 'blocks/components/multipleSelect/miltipleSelect.html', controller: Controller, controllerAs: 'vm' }; } function Controller($filter, $q, $scope, confirmModalService,$timeout) { "ngInject"; var vm = this; vm.getClassForItem = function (item) { var translateClass = vm.translate ? 'constants-' + vm.typeTranslate + '-' + item[vm.key] : ""; return [{'label-danger': item.hover}, translateClass]; }; if(!vm.appendToBody) { vm.appendToBody='true'; } if (vm.key == null) { vm.key = "id"; } vm.focus = false; vm.isOpen = false; vm.filterModel = { select: false }; vm.filterPopover = { templateUrl: 'blocks/components/multipleSelect/miltipleSelectPopever.html' }; function UpdateItems() { angular.forEach(vm.items, function (item) { item.select = false; }); } function UpdateSelect() { angular.forEach(vm.ngModel, function (item) { var result = getById(item[vm.key]); if (result) { result.select = true; } }); } function getById(key) { var filter = {}; filter[vm.key] = key; if (vm.items) { var result = $filter('filter')(vm.items, filter); if (result.length > 0) { return result[0]; } else { return undefined } } else { return undefined; } } UpdateItems(); UpdateSelect(); this.$onChanges = function (changesObj) { if (changesObj.items && changesObj.items.length != 0) { UpdateItems(); UpdateSelect(); } if (changesObj.ngModel && changesObj.ngModel.length != 0) { UpdateSelect(); } }; vm.getText = function (data) { if (vm.text) { return data[vm.text] } else { return data } }; vm.select = function (item) { item.select = true; vm.ngModel.push(item); vm.onChange(); vm.filterModel[vm.text] = ''; }; vm.count = 0; vm.unSelect = function (selected) { var item = getById(selected[vm.key]); if (item) { item.select = false; } vm.ngModel.splice(vm.ngModel.indexOf(selected), 1); vm.onChange(); }; vm.reset = function () { angular.forEach(vm.ngModel, function (item) { var i = vm.items.indexOf(item); if (i != -1) { vm.items[i].select = false; } }); vm.ngModel.length = 0; }; vm.keyUp = function ($event) { if ($event.keyCode == 13) { var items = getStrongItem(); if (items.length >= 1 && !items[0].select) { vm.select(items[0]); } else if (vm.allowAdd) { vm.addItem(); } } }; vm.addItem = function () { vm.onItemAdd({value: vm.filterModel[vm.text]}).then(function () { vm.filterModel[vm.text] = ''; }); }; vm.notExist = function () { return getStrongItem().length == 0; }; function getStrongItem() { var result = $filter('filter')(vm.items, function (item) { return vm.filterModel[vm.text] == item[vm.text]; }); return result } /*popup*/ vm.focus = function () { vm.showInput = true; vm.isFocus = true; }; vm.focusInput = function () { vm.showInput = true; vm.isFocus = true; }; vm.blur = function () { vm.showInput = false; vm.isOpen = false; }; /*removing*/ vm.removeItem = { set remove(val) { var index = vm.items.indexOf(val); vm.items.splice(index, 1); vm.isOpen = false; val.hover = false; confirmModalService.show("blocks.ConfirmActionModalHint", function () { return vm.onItemRemove({item: val}).then(function () { }); }).catch(function () { $timeout(function () { vm.isOpen = true; vm.items.splice(index, 0, val); }); }); } }; vm.droppedModel = {}; vm.onStart = function (e, ui) { setDragBegin(true); }; vm.onStop = function (e, ui) { setDragBegin(false); }; vm.onOver = function (e, ui) { var droppedOn = angular.element(ui.draggable).attr('id'); setHoverOnItem(droppedOn, true) }; vm.onOut = function (e, ui) { var droppedOn = angular.element(ui.draggable).attr('id'); setHoverOnItem(droppedOn, false) }; function setDragBegin(value) { $scope.$apply(function () { vm.droppedModel.begining = value; }); } ; function setHoverOnItem(key, value) { var item = getById(key); $scope.$apply(function () { item.hover = value; }); } } })(); /** * Created by denak on 18.05.2016. */ (function () { Controller.$inject = ["$q"]; angular.module("teleds.blocks").component("preloader", component()); function component() { return { bindings: { show: "<" }, templateUrl: 'blocks/components/preloader/preloader.html', controller: Controller, controllerAs: 'vm' }; } function Controller($q) { "ngInject"; var vm = this; vm.$onChanges = function (changesObj) { if (changesObj.show) { vm.showPreloader=true; $q.when(vm.show).then(function () { vm.showPreloader=false; }).catch(function () { vm.showPreloader=false; }) } }; } })(); /** * Created by denak on 07.04.2016. */ (function () { directive.$inject = ["$timeout", "$parse"]; angular.module("teleds.blocks").directive("select2", directive); function directive($timeout, $parse) { return { restrict: 'AC', require: 'ngModel', link: function (scope, element, attrs, model) { var options = [], el = $(element); $timeout(function () { var format = function (state) { var state_id = state.id; if (!state_id) return state.text; var res = state_id.split("-"); if (res[0] == 'image') { if (res[2]) return "" + state.text; else return "" + state.text; } else { return state.text; } } var option = { formatResult: format, formatSelection: format, placeholder: el.data('placeholder') ? el.data('placeholder') : '', allowClear: el.data('allowclear') ? el.data('allowclear') : true, minimumInputLength: el.data('minimumInputLength') ? el.data('minimumInputLength') : -1, minimumResultsForSearch: el.data('search') ? 1 : -1, dropdownCssClass: el.data('style') ? 'form-white' : '' }; var sel=el.select2(option); model.$render = function () { // el.select2("val", model.$viewValue); } sel.on('change', function () { scope.$apply(function () { model.$setViewValue(el.select2("val")); }); }) }, 0, false); } } } })(); /** * Created by denak on 15.04.2016. */ /** * Created by denak on 07.04.2016. */ /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.blocks").component("tagsInput", component()); function component() { return { bindings: { onChange: '&', tags: '<', source: '<' }, templateUrl: 'blocks/components/tags/tags.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$element', '$scope']; function Controller($element, $scope) { var vm = this; if (vm.source) { if(vm.source.then =='function') { vm.source.then(function (result) { initTags(result); }); } else { initTags(vm.source); } } else { $element.tagsinput({ tagClass: 'label label-success' }); } if (vm.tags.length > 0) { for(var i=0;i>" + "<'row'<'col-sm-5'l><'col-sm-7'p>>") .withOption('createdRow', function (row, data, dataIndex) { angular.element(row).attr("ng-dblclick", "vm.doubleClickRow('" + data.id + "')"); angular.element(row).attr("ng-click", "vm.clickRow('" + data.id + "')"); if(vm.onCreatedRow) { vm.onCreatedRow({row:{rowElement:$(row)},data:data}) } $compile(angular.element(row))($scope); }) .withPaginationType('full_numbers'); if (!isEmpty(vm.scrollY)) { if (vm.scrollCollapse == 'false') { vm.dtOptions.withOption("bScrollCollapse", false); } else { vm.dtOptions.withOption("bScrollCollapse", true); } vm.dtOptions.withOption("scrollY", vm.scrollY); } if (vm.rowReorder) { vm.dtOptions.withOption("rowReorder", {selector: '.reorder'}); } if (locale.getLocale() == 'ru') { vm.dtOptions.withLanguageSource('//cdn.datatables.net/plug-ins/1.10.12/i18n/Russian.json'); } else { vm.dtOptions.withLanguageSource('//cdn.datatables.net/plug-ins/1.10.12/i18n/English.json'); } if(vm.defaultSort) { vm.dtOptions.withOption('order', vm.defaultSort); } if (vm.columns) { if (vm.rowReorder) { vm.columns.unshift( { type: "custom", name: "created_at", render: function (data, full) { return ''; }, notSort: true, cellClass: "reorder icon-cell", title: {class: 'icon-sort', name: ""} }); } vm.title = teledsTableService.getTitle(vm.columns); vm.columns.unshift( { type: "custom", name: "created_at", render: function (data, full) { vm.selected[full.id] = false; return '
'; }, notSort: true, cellClass: "one-checkbox" }); vm.dtColumnss = teledsTableService.getDtColumns(vm.columns); } else { vm.dtColumns.unshift(DTColumnBuilder.newColumn('created_at') .renderWith(function (data, type, full, meta) { vm.selected[full.id] = false; return '
'; }).notSortable().withOption("sClass", "one-checkbox")); vm.dtColumnss = vm.dtColumns; } function serverData(sSource, aoData, fnCallback, oSettings) { vm.selected = {}; vm.serverData(sSource, aoData, fnCallback, oSettings); } vm.reloadData = function (resetPaging, func) { vm.dtInstance.reloadData(function () { unToggleAll(); if (func) { func(); } }, resetPaging); }; vm.reload = function () { vm.reloadData(function () { }, false); }; vm.doubleClickRow = function (id) { vm.action('doubleClick', id); }; vm.clickRow = function (id) { vm.action('click', id); }; vm.dtInstance = {}; vm.dtIntanceCallback = function (instance) { vm.dtInstance = instance; vm.dtInstance.DataTable.on('row-reorder', function (e, diff, edit) { if (vm.rowReorder && diff && diff.length > 0) { var index = edit.triggerRow.index(); var changed = diff.find(function (it) { return it.oldPosition == index; }); var newPos = changed.newPosition; var oldPos = changed.oldPosition; vm.onRowReorder({newPos: newPos, oldPos: oldPos}) } }); vm.intanceCallback({intance: vm}) }; vm.action = function (action, id) { vm.actionCallback({action: action, id: id}); }; vm.selected = {}; vm.selectAll = false; vm.toggleAll = toggleAll; vm.toggleOne = toggleOne; vm.unToggleAll = unToggleAll(); vm.isSelectAny = function () { if (vm.selectAll) { return true; } for (var p in vm.selected) { if (vm.selected[p] == true) { return true; } } return false; }; vm.isSelectMuch2 = function () { if (vm.selectAll) { return true; } var i = 0; for (var p in vm.selected) { if (vm.selected[p] == true) { i++; if (i == 2) { return true; } } } return false; }; function unToggleAll() { vm.unselect = false; vm.unselectHover = false; vm.selectAll = false; vm.toggleAll(false, vm.selected); } function toggleAll(selectAll, selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { selectedItems[id] = selectAll; } } onSelected(); } function toggleOne(selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { if (!selectedItems[id]) { vm.selectAll = false; onSelected(); return; } } } vm.selectAll = true; onSelected(); } function onSelected() { var selected = []; var all = true; for (var id in vm.selected) { if (vm.selected[id]) { selected.push(id); } else { all = false; } } vm.onSelected({ids: selected, all: all}); } } })(); /** * Created by denak on 22.06.2016. */ (function () { factory.$inject = ["DTColumnBuilder"]; angular.module("teleds.blocks") .service('teledsTableService', factory); function factory(DTColumnBuilder) { "ngInject"; return { getDtColumns: getDtColumns, getTitle: getTitle }; function getDtColumns(columns) { var dtColumns = columns.map(function (item) { var dtColumn; switch (item.type) { case "date": { var formatString = "DD.MM.YYYY HH:mm:ss"; if (item.formatDate != null) { formatString = item.formatDate; } dtColumn = DTColumnBuilder.newColumn(item.name).renderWith(function (data, type, full, meta) { if (data === '0000-00-00 00:00:00') { return ''; } return moment.utc(data).local().format(formatString); }); break; } case "number": { dtColumn = DTColumnBuilder.newColumn(item.name).renderWith(function (data, type, full, meta) { return '' + data + ''; }); break; } case "string": { dtColumn = DTColumnBuilder.newColumn(item.name).renderWith(function (data, type, full, meta) { return '' + data + ''; }); break; } case "tags": { dtColumn = DTColumnBuilder.newColumn(item.name).renderWith(function (data, type, full, meta) { var result = ""; return result; }); break; } case "name": { dtColumn = DTColumnBuilder.newColumn(item.name).renderWith(function (data, type, full, meta) { var result = "" + data + ""; return result; }); break; } case "link": { dtColumn = DTColumnBuilder.newColumn(item.name).renderWith(function (data, type, full, meta) { var result = "" + data + ""; return result; }); break; } case "custom": { dtColumn = DTColumnBuilder.newColumn(item.name).renderWith(function (data, type, full, meta) { return item.render(data, full); }); break; } } var clasess = ""; if (item.align) { clasess += " text-align-" + item.align; } if (item.cellClass) { clasess += " " + item.cellClass; } if (item.oneString) { clasess += " one-string"; } dtColumn = dtColumn.withOption("sClass", clasess); if(item.sType) { dtColumn = dtColumn.withOption("sType", item.sType); } if (item.notSort) { dtColumn = dtColumn.notSortable(); } if (item.width) { dtColumn = dtColumn.withOption('sWidth', item.width); } return dtColumn; }); return dtColumns; } function getTitle(columns) { return columns.map(function (item) { if (item.title) { return item; } switch (item.type) { case "date": { item.title = "common.DateCreated"; return item; } case "tags": { item.title = "common.Tags"; return item; } } if (item.name == null) { return undefined; } }).filter(function (item) { return item; }) } } })(); /** * Created by denak on 08.04.2016. */ (function () { angular.module("teleds.auth") .component("switchLanguage", component()); function component() { return { restrict: "EA", templateUrl: 'auth/components/switch-language/switch-language.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ["locale"]; function Controller(locale) { var vm = this; vm.switch = function () { var value = locale.getLocale(); value = value == "ru" ? "en" : "ru"; locale.setLocale(value); } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.campaigns") .component("attachArea", component()); function component() { return { restrict: "EA", bindings: { campaignId: '@', onChange: "&", onGo:"&" }, templateUrl: 'campaigns/components/attachArea/attachArea.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$state', 'virtualScreens', 'campaigns', 'DTColumnBuilder', 'tableHelper']; function Controller($state, virtualScreens, campaigns, DTColumnBuilder, tableHelper) { var vm = this; vm.title = [ "campaigns.VirtualScreen", "campaigns.Area", "campaigns.CountPlayers", "campaigns.CountCampaigns" ]; vm.option = { _params: { "filter[name]": "", "page[limit]": 500, "page[offset]": 0 }, get params() { if (isEmpty(this.name)) { return undefined; } else { return this._params; } }, get name() { return this._params["filter[name]"]; }, set name(val) { this._params["filter[name]"] = val; vm.instance.reloadData(false); } }; var limits = 0; vm.dtColumns = [ DTColumnBuilder.newColumn('virtualScreen').renderWith(function (data, type, full, meta) { var result = "" + data.name + ""; return result; }), DTColumnBuilder.newColumn('area').renderWith(function (data, type, full, meta) { return data.type; }), DTColumnBuilder.newColumn('virtualScreen').renderWith(function (data, type, full, meta) { return data.players_count; }), DTColumnBuilder.newColumn('area').renderWith(function (data, type, full, meta) { return data.campaigns_count; }), DTColumnBuilder.newColumn('null').notSortable() .renderWith(function (data, type, full, meta) { var control_row = '
' + '
'; return control_row; }) ]; vm.actionCallback = function (action, id) { switch (action) { case "info": { vm.goToOne(id); break; } case 'doubleClick': { vm.goToOne(id); break; } case 'clickName': { vm.goToOne(id); break; } } }; vm.goToOne = function (id) { $state.go('personalAccount.virtualScreen.one', {id: id}) vm.onGo(); }; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { return virtualScreens.getList(vm.option.params).then(function (result) { if (result.data.length > 0) { var data = result.data.map(function (virtualScreen) { return virtualScreen.areas.map(function (area) { return {area: area, virtualScreen: virtualScreen, id: area.id}; }) }).reduce(function (a, b) { return a.concat(b); }); fnCallback(tableHelper.wrapList(data)); } else { fnCallback(result); } }).catch(function (result) { notificationService.showWarning('common.FailedGet'); fnCallback(result); }); }; vm.intanceCallback = function (instance) { vm.instance = instance; }; vm.onSelected = function (ids, all) { vm.selectedIds = ids; vm.all = all; vm.onChange({value: ids}); }; } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.campaigns") .controller('attachAreaModalController', controller) controller.$inject = [ '$uibModalInstance', 'id', 'name', 'campaigns', 'errorHandlerHelper']; function controller($uibModalInstance, id, name, campaigns, errorHandlerHelper) { var vm = this; vm.id = id; vm.name = name; vm.save = function () { vm.loading = true; campaigns.attachAreas(id, vm.selected).then(function () { $uibModalInstance.close( vm.selected); }).finally(function () { vm.loading = false; }); }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.campaigns") .service('attachAreaModalService', service) service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (id,name) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'campaigns/components/attachAreaModal/attachAreaModal.html', controller: 'attachAreaModalController as vm', size: 'lg', resolve: { id: function () { return id; }, name:function () { return name; } } }); return modalInstance.result; } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.campaigns") .component("attachContent", component()); function component() { return { restrict: "EA", bindings: { campaignId: '@', name:"@", onChange: "&" }, transclude: true, templateUrl: 'campaigns/components/attachContent/attachContent.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['contents', '$q', 'campaigns']; function Controller(contents, $q, campaigns) { var vm = this; vm.checked = true; vm.unChecked = false; vm.selected = {}; vm.model = { param: { "filter[name]": "", "page[limit]": 100, "page[offset]": 0 }, isInit: false, open: false, get name() { return this.param["filter[name]"]; }, set name(val) { this.param["filter[name]"] = val; update(); } }; update(); function update() { vm.loading = true; vm.selectAll = false; var param = angular.copy(vm.model.param); if (vm.model.name.length == "") { delete param["filter[name]"]; } var getContents = contents.getList(param); var getAttachedContents = campaigns.getContent(vm.campaignId); vm.promise = $q.all([getContents, getAttachedContents]); vm.promise.then(function (result) { allContents = result[0].data; attachedContents = result[1]; for (var p in vm.selected) { delete vm.selected[p]; } vm.existFree = false; allContents.forEach(function (content) { if (attachedContents.length > 0) { var attachedContent = attachedContents.find(function (attachedContent) { return attachedContent.content_id == content.id; }); if (attachedContent) { content.notAttach = false; } else { vm.existFree = true; content.notAttach = true; } } else { content.notAttach = true; vm.existFree = true; } vm.selected[content.id] = false; if (content.status == 'ready' && content.type == 'video') { content.showPreview = true; } }); vm.contents = allContents; }); } vm.isSelectAny = function () { if (vm.selectAll) { return true; } for (var p in vm.selected) { if (vm.selected[p] == true) { return true; } } return false; }; vm.toggleAll = toggleAll; vm.toggleOne = toggleOne; function toggleAll(selectAll, selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { selectedItems[id] = selectAll; } } onSelected(); } function toggleOne(selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { if (!selectedItems[id]) { vm.selectAll = false; onSelected(); return; } } } vm.selectAll = true; onSelected(); } function onSelected() { var selected = []; var all = true; for (var id in vm.selected) { if (vm.selected[id]) { selected.push(id); } else { all = false; } } vm.onChange({value: selected}); } } })(); /** * Created by denak on 18.05.2016. */ (function () { controller.$inject = ["contents", "$uibModalInstance", "id", "name", "campaigns", "end_timestamp", "content", "errorHandlerHelper", "moment", "controlTargetingModalService", "controlGeoTargetingService", "$filter", "locale", "addedContents", "attachPlaylistToContentId", "campaign", "area", "ContentTypes", "$timeout"]; angular.module("teleds.campaigns") .controller('attachContentDetailModalController', controller) function controller(contents, $uibModalInstance, id, name, campaigns, end_timestamp, content, errorHandlerHelper, moment, controlTargetingModalService, controlGeoTargetingService, $filter, locale, addedContents, attachPlaylistToContentId, campaign, area, ContentTypes, $timeout) { "ngInject"; var vm = this; vm.id = id; vm.name = name; vm.end_timestamp = end_timestamp; vm.contentTypes = angular.copy(ContentTypes); vm.contentTypes.unshift({name: "all"}); vm.option = { name: "", tags: [], type: {name: "all"} }; var secWord = ""; locale.ready('blocks').then(function () { secWord = ' ' + locale.getString('common.SecondShort'); }); var startCampaign = moment.utc(); var endCampaign; if (isEmpty(end_timestamp) || end_timestamp == "0000-00-00 00:00:00") { endCampaign = null } else { endCampaign = moment.utc(campaign.end_timestamp); if (endCampaign < startCampaign) { endCampaign = moment(startCampaign).add(1, 'day'); } } var control = { set end_date(val) { if (!val) { vm.model.end_timestamp = null; } else { vm.model.end_timestamp = endCampaign ? endCampaign.format() : ""; } }, get end_date() { return vm.model.end_timestamp == (endCampaign ? endCampaign.format() : ""); }, get minStartDate() { return content?null:startCampaign; }, get maxStartDate() { return endCampaign; }, get maxEndDate() { return endCampaign; }, updateInterval: function () { if (!vm.model.play_timeout) { vm.model.play_time = 'free' } else if (this._fillEmpty) { vm.model.play_time = 'only_empty' } else { vm.model.play_time = 'normal' } }, set play_timeout(val) { if (val == null || val == '') { vm.play_timeout = 0; } vm.model.play_timeout = parseInt(val) || 0; this.updateInterval(); }, get play_timeout() { if (vm.model.play_timeout == 0) { return ''; } return vm.model.play_timeout; }, _fillEmpty: false, get fillEmpty() { return this._fillEmpty; }, set fillEmpty(val) { this._fillEmpty = val; this.updateInterval(); }, get content_id() { return vm.model.content_id }, set content_id(val) { vm.model.content_id = val; vm.control.fullDuration = false; } }; vm.control = control; vm.edit = !!content; var initContent = null; if (content) { initContent = content; initContent.cost = parseFloat(initContent.cost); vm.contentType = content.content.type; if (initContent.play_timeout) { control._fillEmpty = initContent.play_time == 'only_empty'; } vm.addOpen = true; vm.disabledAnimation = true; $timeout( function () { vm.disabledAnimation=false; } , 1000) } else { initContent = { start_timestamp: startCampaign, play_order: 65535, play_timeout: 0, cost: 0, fill_mode: 'default' }; } vm.campaignId = id; vm.model = initContent; vm.selectOption = { dropdownCssClass: "form-white" }; if (content) { } else { vm.control.end_date = true; vm.model.payment_type = 'fixed'; vm.model.play_time = 0; } vm.attachPlaylistToContentId = attachPlaylistToContentId; vm.control.play_timeout = Math.floor(vm.model.play_timeout); vm.onSelectContent = function (item, model) { vm.contentType = item.type; }; vm.refreshByName = function (search) { vm.option.name = search; vm.update(); }; vm.update = function (clear) { if (clear) { vm.control.content_id = null; } var param = {}; if (vm.option.name) { param['filter[name]'] = vm.option.name; } if (vm.option.type.name != 'all') { param['filter[type]'] = vm.option.type.name; } if (vm.option.tags && vm.option.tags.length > 0) { param['filter[tags]'] = vm.option.tags.map(function (v) { return v.id; }).join(); } contents.getList(param).then(function (contents) { var notAddedContent = contents.data.filter(function (contentItem) { return !addedContents.find(function (addedContent) { return addedContent.content.id == contentItem.id && !(content && addedContent.content.id == content.id ); }) }); vm.contents = $filter('orderBy')(notAddedContent, "-type"); }); }; vm.onChangeStartDate = function (value) { vm.model.start_timestamp = value; }; vm.onChangeEndDate = function (value) { vm.model.end_timestamp = value; }; vm.showControlTargeting = function () { controlTargetingModalService.showControlTargetingModal(vm.model.time_targeting_id).then( function (id) { vm.model.time_targeting_id = id; } ); }; vm.showControlGeoTargeting = function () { controlGeoTargetingService.show(vm.model.geo_targeting_id).then( function (id) { vm.model.geo_targeting_id = id; } ); }; vm.getPlaceholder = function () { if (!vm.contents) { return locale.getString('campaigns.SelectContentPlaceholder'); } else if (vm.contents.length == 0) { return locale.getString('campaigns.SelectContentPlaceholderNotExist'); } else if (vm.contents.length == 1) { return locale.getString('campaigns.SelectContentPlaceholderCount1', {count: vm.contents.length}); } else if (vm.contents.length <= 4) { return locale.getString('campaigns.SelectContentPlaceholderCount24', {count: vm.contents.length}); } else { return locale.getString('campaigns.SelectContentPlaceholderCount5', {count: vm.contents.length}); } }; vm.save = function () { vm.submitted = true; var promise = null; if (!vm.form.$valid) { return; } if (content) { promise = campaigns.updateContent(vm.model); } else { /* if (addedContents.find(function (addedContent) { return addedContent.content_id == contentItem.id })) { vm.messageAlreadyAdd = true; return; }*/ promise = campaigns.attachContent(vm.campaignId, vm.model, area); } vm.saving = true; promise.then(function () { $uibModalInstance.close(); }).finally(function (response) { vm.saving = false; errorHandlerHelper.handleErrorResponse(response, vm.form, vm); }); }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.campaigns") .service('attachContentDetailModalService', service) service.$inject = ["$uibModal", "campaigns"]; function service($uibModal, campaigns) { var self = this; self.show = function (campaign,area, addedContents, content) { return show({ id: function () { return campaign.id; }, content: function () { return content; }, name: function () { return campaign.name; }, end_timestamp: function () { return campaign.end_timestamp; }, addedContents: function () { return addedContents; }, attachPlaylistToContentId: function () { return null; }, attachedPlaylists: function () { return null; }, area:function () { return area; }, campaign:function () { return campaign; } }); }; self.showAttachToContent = function (name,attachPlaylistToContentId, attachedPlaylists) { return show({ id: function () { return null; }, content: function () { return null; }, name: function () { return name; }, end_timestamp: function () { return null; }, addedContents: function () { return null; }, attachPlaylistToContentId: function () { return attachPlaylistToContentId; }, attachedPlaylists: function () { return attachedPlaylists; } }) }; function show(resolve) { var modalInstance = $uibModal.open({ backdrop: 'static', templateUrl: 'campaigns/components/attachContentDetailModal/attachContentModal.html', controller: 'attachContentDetailModalController as vm', windowClass: 'attach-content-modal', resolve: resolve }); return modalInstance.result; } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.campaigns") .controller('attachContentModalController', controller) controller.$inject = ['$uibModalInstance', 'id', 'name', 'campaigns', 'errorHandlerHelper']; function controller($uibModalInstance, id, name, campaigns, errorHandlerHelper) { var vm = this; vm.id = id; vm.name = name; vm.save = function () { vm.loading = true; campaigns.attachContents(id, vm.selected).then(function () { $uibModalInstance.close(vm.selected); }).finally(function () { vm.loading = false; }); }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.campaigns") .service('attachContentModalService', service) service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (id,name) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'campaigns/components/attachContentModal/attachContentModal.html', controller: 'attachContentModalController as vm', windowClass: 'control-modal', resolve: { id: function () { return id; }, name:function () { return name; } } }); return modalInstance.result; } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.campaigns") .component("campaignsSearch", component()); function component() { return { restrict: "EA", bindings: { onApply: '&', onReset: '&', tagsCurrent: " 0 && !vm.isFilter(); }; vm.isAnyFilter = function () { return vm.isFilter() || vm.name.length > 0; } } })(); /** * Created by denak on 15.04.2016. */ (function () { Controller.$inject = ["$state", "confirmModalService", "campaigns", "players", "DTColumnBuilder", "tableHelper", "selectEntityModalService", "notificationService", "$q"]; angular.module("teleds.campaigns") .component("attachedPlayers", component()); function component() { return { restrict: "EA", bindings: { campaign: '<' }, templateUrl: 'campaigns/components/attachedPlayers/attachedPlayers.html', controller: Controller, controllerAs: 'vm' }; } function Controller($state, confirmModalService, campaigns, players, DTColumnBuilder, tableHelper, selectEntityModalService, notificationService, $q) { "ngInject"; var vm = this; var limits = 0; var dataTemp = []; vm.columns = [ { type: 'link', name: 'name', notSort: true, state:"personalAccount.player.one", title: "common.Name", width:"100%" }, { type: 'tags', name: 'tags', notSort: true }, { type: 'custom', name: 'null', notSort: true, render: function (data, full) { var control_row = '
' + '' + '
'; return control_row; } } ]; vm.attachArea = function () { selectEntityModalService.show('players', dataTemp.map((function (item) { return item.id; }))).then(function (selectedIDs) { if (selectedIDs.length > 0) { vm.attaching =true; var promises = selectedIDs.map(function (item) { return players.attachCampaign(item, vm.campaign.id); }); $q.all(promises).then(function () { }).finally(function () { vm.instance.reloadData(false); vm.attaching =false; }) } }) }; vm.actionCallback = function (action, id) { switch (action) { case "remove": { confirmModalService.show('campaigns.ConfirmDetachPlayer', function () { return players.detachCampaign(id,vm.campaign.id); }).then(function () { vm.instance.reloadData(false); }); break; } case 'doubleClick': case 'clickName': { vm.goToOne(id); break; } } }; vm.goToOne = function (id) { $state.go('personalAccount.player.one', {id: id}) }; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { return campaigns.getPlayers(vm.campaign.id).then(function (result) { dataTemp = result; fnCallback(tableHelper.wrapList(result)); }).catch(function (result) { dataTemp = []; notificationService.showWarning('common.FailedGet'); fnCallback(tableHelper.getEmptyList()); }); }; vm.intanceCallback = function (instance) { vm.instance = instance; }; vm.onSelected = function (ids, all) { vm.selectedIds = ids; vm.all = all; }; vm.detach = function () { if (vm.selectedIds.length > 1) { var confirmText = 'campaigns.ConfirmDetachPlayers'; } else { var confirmText = 'campaigns.ConfirmDetachPlayer'; } confirmModalService.show(confirmText, function () { var promises = vm.selectedIds.map(function (id) { return players.detachCampaign(id,vm.campaign.id); }); return $q.all(promises); }).then(function () { vm.instance.reloadData(false); }) }; } })(); /** * Created by denak on 15.04.2016. */ (function () { Controller.$inject = ["attachContentDetailModalService", "campaigns", "notificationService", "$state", "confirmModalService", "tableHelper", "$timeout", "downloadContentModalService", "campaigns"]; angular.module("teleds.campaigns") .component("controlArea", component()); function component() { return { restrict: "EA", bindings: { ngArea: '<', ngAreas: '<', ngCampaign: '<', onChange: '&' }, templateUrl: 'campaigns/components/controlArea/controlArea.html', controller: Controller, controllerAs: 'vm' }; } function Controller(attachContentDetailModalService, campaigns, notificationService, $state, confirmModalService, tableHelper, $timeout, downloadContentModalService, campaigns) { "ngInject"; var vm = this; var data = []; vm.index = vm.ngAreas.indexOf(vm.ngArea) + 1; vm.isAudio = vm.ngArea.x == 0 && vm.ngArea.y == 0 && vm.ngArea.height == 0 && vm.ngArea.width == 0; vm.attachContent = function () { attachContentDetailModalService.show(vm.ngCampaign, vm.ngArea, data).then(function () { updateArea(); }) }; vm.changeSound = function () { vm.ngArea.sound_enabled = !vm.ngArea.sound_enabled; campaigns.updateArea(vm.ngArea); }; vm.columns = [ { type: 'custom', name: 'content.name', align: "left", render: function (data, full) { var result = ""; if (full.content.status == 'ready' && full.content.type == 'video') { result = ''; } if (full.content.status == 'ready' && full.content.type == 'image') { result = ''; } var name = ""; if (data.length > 8) { name = ""; name += data name += "" } else { name = data; } result += "" + name + ""; result = "
" + result + "
"; return result; }, notSort: true, title: "campaigns.Content", cellClass: "name-cell", width: "30%" }, { type: 'custom', name: 'play_timeout', notSort: true, title: "campaigns.ContentInterval", render: function (data, full) { var result = ''; if (data === 0) { result= '' } else { result =''; } if(full.play_timeout &&full.play_time==='only_empty' || data === 0) { result+= ''; result ='
'+result+'
' } return result; } }, { type: 'date', name: 'start_timestamp', notSort: true, title: "common.StartDate", formatDate:'DD.MM.YYYY HH:mm' }, { type: 'custom', name: 'end_timestamp', notSort: true, title: "common.EndDate", cellClass:'control-area-end-date', render: function (data, full) { if (data === '0000-00-00 00:00:00') { return '' } return moment.utc(data).local().format("DD.MM.YYYY HH:mm") } }, { type: 'custom', name: 'geo_targeting_id', render: function (data, full) { var nameIcon = data ? "set_targeting" : "notset_targeting"; return '
'; }, notSort: true, cellClass: "icon-cell", title: {class: 'geotargeting-icon', name: ""} }, { type: 'custom', name: 'time_targeting_id', render: function (data, full) { var nameIcon = data ? "set_targeting" : "notset_targeting"; return '
'; }, notSort: true, cellClass: "icon-cell", title: {class: 'timetargeting-icon', name: ""} }, { type: 'custom', name: 'null', notSort: true, render: function (data, full) { var control_row = '
' + ' ' + '' + '
'; return control_row; } } ]; var limits = 0; vm.actionCallback = function (action, id) { switch (action) { case "info": { vm.goToOne(id); break; } case "remove": { confirmModalService.show('campaigns.ConfirmDetachContent', function () { return campaigns.detachContent(vm.ngCampaign.id, vm.ngArea.id, [id]); }).then(function () { updateArea(); }); break; } case 'doubleClick': { vm.goToOne(id); break; } case 'clickName': { vm.goToOne(id); break; } case 'up': { ChangePosition(id, -1); break; } case 'down': { ChangePosition(id, 1); break; } case 'edit': { var content = data.find(function (content) { return content.content.id == id.id; }); attachContentDetailModalService.show(vm.ngCampaign, vm.ngArea, data, content).then(function () { updateArea(); }) } } }; vm.goToOne = function (id) { $state.go('personalAccount.content.one', {id: id}) }; vm.overloading = false; vm.blackscreen = false; vm.overloading = vm.ngArea.load_percentage > 100; vm.updatingArea = null; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { if (!vm.disableServerLoading) { return campaigns.getContent(vm.ngCampaign.id, vm.ngArea.id).then(function (result) { vm.containWithInterval = false; var freeFile = false; result.forEach(function (content) { content.id = content.content.id; if (content.play_timeout && content.play_timeout > 0) { vm.containWithInterval = true; } if (content.play_time == 'only_empty' || content.play_time == 'free') { freeFile = true; } }); if (vm.updatingArea) { vm.updatingArea.then(function (area) { vm.overloading = vm.ngArea.load_percentage > 100; vm.blackscreen = !vm.overloading && !freeFile; }); } else { if (!vm.overloading && !freeFile) { vm.blackscreen = !vm.overloading && !freeFile; } } data = result; fnCallback(tableHelper.wrapList(result)); }).catch(function (result) { notificationService.showWarning('common.FailedGet'); fnCallback(tableHelper.getEmptyList()); }); } else { //fnCallback(tableHelper.wrapList(data)); vm.disableServerLoading = false; } }; vm.downloadContent = function () { downloadContentModalService.show(vm.ngCampaign, vm.ngArea).then(function () { updateArea(); }); }; vm.onRowReorder = function (newPos, oldPos) { var content = data[oldPos]; data.splice(oldPos, 1); data.splice(newPos, 0, content); campaigns.moveToContent(vm.ngCampaign.id, vm.ngArea.id, content.content.id, newPos + 1).then(function () { vm.instance.reloadData(false); }); vm.disableServerLoading = true; }; vm.onCreatedRow = function (row, data) { if (data.content_overdue) { row.rowElement.addClass('content-overdue'); row.rowElement.attr('title', '{{"campaigns.ContentOverdue"|i18n}}') } if(moment.utc(data.start_timestamp)>moment.utc()) { row.rowElement.addClass('content-not-start'); }else if(data.end_timestamp &&moment.utc(data.end_timestamp)= this.height) { e.setTop(this.height - 1) } if (e.left < 0) { e.setScaleX((e.getWidth() + e.left) / e.width); e.setLeft(0) } else if (e.left >= this.width) { e.setLeft(this.width - 1) } if (e.top + e.getHeight() >= this.height) { e.setScaleY((this.height - e.top) / e.height) } if (e.left + e.getWidth() >= this.width) { e.setScaleX((this.width - e.left) / e.width) } var text = event.target.item(1); text.setScaleX(240 / event.target.getWidth()); text.setScaleY(135 / event.target.getHeight()); if (!$scope.$$phase) { $scope.$apply(); } }); canvas.observe('object:moving', function (t) { var e = t.target; e.setTop(Math.floor(Math.min(Math.max(0, e.top), this.height - e.getHeight()))); e.setLeft(Math.floor(Math.min(Math.max(0, e.left), this.width - e.getWidth()))) }); canvas.on({ 'object:moving': onChange, 'object:scaling': onChange, 'object:rotating': onChange }); function onChange(event) { if (!$scope.$$phase) { $scope.$apply(); } var text = event.target.item(1); text.setScaleX(240 / event.target.getWidth()); text.setScaleY(135 / event.target.getHeight()); } if (areas&&areas.length>0) { vm.resolution = vm.resolutions.find(function (item) { return item.width === resolution.width; }); notUpdate = true; areas.forEach(function (area, index) { var result = createAreaObject(0, 0, index, area.z_index, area.opacity); result.X = area.x; result.Y = area.y; result.width = area.width; result.height = area.height; vm.areas.push(result); }); notUpdate = false; updateCanvas(); canvas.setActiveObject( vm.areas[ vm.areas.length-1].object); updateCanvas(); $timeout(updateCanvas, 100); } }); vm.close = function () { $uibModalInstance.dismiss(); }; vm.canvasParam = { width: 480, height: 270 }; vm.model = { _orientation: false, get orientation() { return this._orientation; }, set orientation(val) { this._orientation = val; vm.resolution.scaleX = val ? vm.canvasParam.height / vm.resolution.height : vm.canvasParam.width / vm.resolution.width; vm.resolution.scaleY = val ? vm.canvasParam.width / vm.resolution.width : vm.canvasParam.height / vm.resolution.height; var width = val ? vm.canvasParam.height : vm.canvasParam.width; var height = val ? vm.canvasParam.width : vm.canvasParam.height; var origWidth = canvas.width; var origHeight = canvas.height; var scaleX = width / origWidth; var scaleY = height / origHeight; canvas.setDimensions({ width: width, height: height }); canvas.forEachObject(function (obj) { obj.left = obj.left * scaleX; obj.scaleX = obj.scaleX * scaleX; obj.top = obj.top * scaleY; obj.scaleY = obj.scaleY * scaleY; canvas.fire("object:modified", { target: obj, e: null }); obj.setCoords() }); canvas.renderAll(); canvas.calcOffset() } }; var koefWide = 1280 / 720; vm.resolutions = [{ name: "HD", width: 1280, height: 720, scaleX: vm.canvasParam.width / 1280, scaleY: vm.canvasParam.height / 720 }, { name: "FullHD", width: 1920, height: 1080, scaleX: vm.canvasParam.width / 1920, scaleY: vm.canvasParam.height / 1080 }, { name: "UltraHD", width: 3840, height: 2160, scaleX: vm.canvasParam.width / 3840, scaleY: vm.canvasParam.height / 2160 }, { name: "Custom", _width: 1280, get width() { return this._width; }, set width(val) { if (val < 640) { return; } this._width = val; this._height = Math.round(this._width / koefWide); }, _height: 720, get height() { return this._height; }, set height(val) { if (val < 360) { return; } this._height = val; this._width = Math.round(koefWide * this._height); }, get scaleX() { return vm.canvasParam.width / this._width; }, get scaleY() { return vm.canvasParam.height / this._height; } }]; vm.resolution = vm.resolutions[0]; vm.areas = []; var colors = ['rgba(186,104,200 ,0.9)', 'rgba(0, 150, 136, 0.9)', 'rgba(255,202,40 ,0.9)', 'rgba(255,112,67 ,0.9)', 'rgba(120,144,156 ,0.9)', 'rgba(102,187,106 ,0.9)', 'rgba(236,64,122 ,0.9)', 'rgba(239,83,80 ,0.9)', 'rgba(141,110,99 ,0.9)', 'rgba(212,225,87 ,0.9)']; function getArea() { var i = 0; if (vm.areas.length > 0) { i = vm.areas[vm.areas.length - 1].index + 1; } var left = vm.model.orientation ? Math.round(Math.random() * 30) : Math.round(Math.random() * 240); var top = vm.model.orientation ? Math.round(Math.random() * 240) : Math.round(Math.random() * 135); var result = createAreaObject(top, left, i, i, 100); i++; canvas.setActiveObject(result.object); return result; } function createAreaObject(top, left, i, z_index, opacity) { var rect = new fabric.Rect({ originX: 'center', originY: 'center', width: 240, height: 135, fill: colors[i < 10 ? i : i % 10] }); var text = new fabric.Text((i + 1).toString(), { fontFamily: 'Lato', fontSize: 30, originX: 'center', originY: 'center' }); var group = new fabric.Group([rect, text], { left: left, top: top, width: 240, height: 135, hasRotatingPoint: false, padding: 0, borderColor: "#dddddd", cornerColor: "#dddddd", cornerSize: 10, transparentCorners: false, lockRotation: true // lockScalingFlip: true }); canvas.add(group); var result = { object: group, index: i, z_index: z_index, opacity: opacity, _width: 640, _height: 360, get width() { var width = Math.round(this._width * vm.resolution.scaleX); if (width != Math.round(group.getWidth())) { var k = group.getWidth(); this._width = Math.round(group.getWidth() / vm.resolution.scaleX); } return this._width; }, set width(val) { this._width = val; val = Math.round(val * vm.resolution.scaleX); group.scaleX = group.scaleX * (val / group.getWidth()); canvas.fire("object:modified", { target: group, e: null }); updateCanvas() }, get height() { var height = Math.round(this._height * vm.resolution.scaleY); if (height != Math.round(group.getHeight())) { this._height = Math.round(group.getHeight() / vm.resolution.scaleY); } return this._height; }, set height(val) { this._height = val; val = Math.round(val * vm.resolution.scaleY); group.scaleY = group.scaleY * (val / group.getHeight()); canvas.fire("object:modified", { target: group, e: null }); updateCanvas() }, get X() { var x = Math.round(this._x * vm.resolution.scaleX); if (x != Math.round(group.getLeft())) { this._x = Math.round(group.getLeft() / vm.resolution.scaleX); } return this._x; }, set X(val) { this._x = val; val = Math.round(val * vm.resolution.scaleX); this.object.left = val; canvas.fire("object:modified", { target: group, e: null }); updateCanvas() }, get Y() { var y = Math.round(this._y * vm.resolution.scaleY); if (y != Math.round(group.getTop())) { this._y = Math.round(group.getTop() / vm.resolution.scaleY); } return this._y; }, set Y(val) { this._y = val; val = Math.round(val * vm.resolution.scaleY); this.object.top = val; canvas.fire("object:modified", { target: group, e: null }); updateCanvas() }, remove: function () { canvas.remove(this.object); }, get isActive() { return canvas.getActiveObject() == this.object; } }; return result; } function updateCanvas() { if (notUpdate) { return; } canvas.renderAll(); } vm.createArea = function () { var area = getArea(); vm.areas.push(area); }; vm.removeArea = function (area) { if (!area) { area = vm.areas.find(function (item) { return item.isActive; }) } if (area) { area.remove(); vm.areas.splice(vm.areas.indexOf(area), 1); } }; vm.toTop = function () { var area = canvas.getActiveObject(); if (area) { area.bringForward(); } }; vm.toBottom = function () { var area = canvas.getActiveObject(); if (area) { area.sendBackwards(); } }; vm.clear = function () { vm.areas.forEach(function (area) { area.remove(); }); vm.areas.splice(0, vm.areas.length); }; vm.selectArea = function (area) { canvas.setActiveObject(area.object); }; vm.createLayout = function () { var layout = []; vm.areas.forEach(function (area) { var idx = canvas.getObjects().indexOf(area.object); var layoutArea = {}; layoutArea.name = "custom" + idx + (vm.model.orientation ? "_vertical" : ''); layoutArea.width = area.width; layoutArea.height = area.height; layoutArea.opacity = area.opacity; layoutArea.z_index = idx; layoutArea.x = area.X; layoutArea.y = area.Y; layout.push(layoutArea) }); if (layout.length > 0) { $uibModalInstance.close({ layout: layout, width: vm.resolution.width, height: vm.resolution.height, isVertical: vm.model.orientation }); } else { $uibModalInstance.dismiss(); } } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.campaigns") .component("displayAreaValue", component()); function component() { return { restrict: "EA", bindings: { ngAreas: '<', }, templateUrl: 'campaigns/components/displayAreaValue/displayAreaValue.html', controller: Controller, controllerAs: 'vm' }; } function Controller() { "ngInject"; var vm = this; this.$onChanges = function (changesObj) { if (changesObj.ngAreas && vm.ngAreas) { vm.hasAudio = vm.ngAreas.find(function (area) { return (area.y == 0 && area.x == 0 && area.width == 0 && area.height == 0) }); vm.countArea = vm.ngAreas.length - (vm.hasAudio ? 1 : 0); } }; } })(); /** * Created by denak on 15.04.2016. */ (function () { Controller.$inject = ["areasStyleHelper"]; angular.module("teleds.campaigns") .component("displayCurrentArea", component()); function component() { return { restrict: "EA", bindings: { ngAreas: "<", ngArea: '<', ngCampaign:"<" }, templateUrl: 'campaigns/components/displayCurrentArea/displayCurrentArea.html', controller: Controller, controllerAs: 'vm' }; } function Controller(areasStyleHelper) { "ngInject"; var vm = this; var split = vm.ngArea.name.split('_'); if(split.length>1) { vm.isVertical =true; } if(vm.ngArea.x ==0&&vm.ngArea.y==0&&vm.ngArea.height==0&&vm.ngArea.width==0) { vm.isAudio =true; } else { vm.areaStyles = areasStyleHelper.getStyleForDisplayCurrent(vm.ngAreas,vm.ngArea,vm.ngCampaign.width,vm.ngCampaign.height); } } })(); /** * Created by denak on 18.05.2016. */ (function () { controller.$inject = ["contents", "$uibModalInstance", "id", "name", "campaigns", "end_timestamp", "errorHandlerHelper", "moment", "AcceptFile", "controlTargetingModalService", "controlGeoTargetingService", "$filter", "area", "ContentTypes", "locale", "campaign"]; angular.module("teleds.campaigns") .controller('downloadContentModalController', controller) function controller(contents, $uibModalInstance, id, name, campaigns, end_timestamp, errorHandlerHelper, moment, AcceptFile, controlTargetingModalService, controlGeoTargetingService, $filter, area, ContentTypes, locale, campaign) { "ngInject"; var vm = this; vm.id = id; vm.name = name; vm.end_timestamp = end_timestamp; vm.contentTypes = angular.copy(ContentTypes); vm.contentTypes.unshift({name: "all"}); vm.option = { name: "", tags: [], type: {name: "all"} }; var secWord = ""; locale.ready('blocks').then(function () { secWord =' '+ locale.getString('common.SecondShort'); }); var startCampaign = moment.utc(); var endCampaign; if (isEmpty(end_timestamp) || end_timestamp == "0000-00-00 00:00:00") { endCampaign = null } else { endCampaign = moment(campaign.end_timestamp); if(endCampaign 0 && vm.option[type].find(function (item) { return item === id; }))) { vm.option[type].push(id); } var value = angular.copy(vm.option); vm.onChange(value); } else { $state.go('personalAccount.day', vm.getStats(id)); } }; vm.getStats = function (day) { if (vm.urlParams) { var urlParams = angular.copy(vm.urlParams); return angular.extend({day: day}, urlParams); } else { return {day: day}; } }; } })(); /** * Created by denak on 17.05.2016. */ (function () { Controller.$inject = ["$state", "errorHandlerHelper", "campaigns", "controlTargetingModalService", "controlGeoTargetingService", "billingService"]; angular.module("teleds.campaigns").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.campaign.add', { url: '/add', templateUrl: 'campaigns/pages/addCampaign/addCampaign.html', controller: Controller, controllerAs: "vm" }) } function Controller($state, errorHandlerHelper, campaigns, controlTargetingModalService, controlGeoTargetingService, billingService) { "ngInject"; var vm = this; vm.selectPaymentType = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; vm.model = { tags: [], start_timestamp: moment().utc().format(), end_timestamp: null, orientation: "landscape", content_spacing: 250, area_layout: [ { name: 'area1', x: 0, y: 0, width: 1920, height: 1080, opacity: 100, z_index: 1 } ] }; vm.billingStatus = false; billingService.getBillingStatus().then(function (status) { vm.billingStatus = status.paid; }); vm.minDurationSeconds = 5; vm.control = { get infinity() { return vm.model.end_timestamp == null; }, set infinity(val) { if (val == true) { vm.model.end_timestamp = null; } else { vm.model.end_timestamp = moment().utc().add(1, 'day').floor(24, 'hours').format(); } }, get auto_duration() { return vm.model.auto_duration; }, set auto_duration(value) { if (value) { this.durationMin = 0; this.durationSec = 5; } vm.model.auto_duration = value; }, _durationMin: 0, get durationMin() { return this._durationMin; }, set durationMin(val) { if (val <= 0) { this._durationMin = 0; } else { this._durationMin = val; } this.updateDuration(); }, _durationSec: 0, get durationSec() { return this._durationSec; }, set durationSec(val) { if (val <= 0) { this._durationSec = 0; } else { this._durationSec = val; } this.updateDuration(); }, updateDuration: function () { vm.model.duration = (this.durationMin * 60 + this.durationSec) * 1000; if (vm.model.duration < 5000) { this._durationSec = vm.minDurationSeconds = 5; vm.model.duration = 5000; } else { vm.minDurationSeconds = 0; } }, _seamlessPlayback: false, get seamlessPlayback() { return this._seamlessPlayback; }, set seamlessPlayback(val) { this._seamlessPlayback = val; if (val) { vm.model.content_spacing = 0; } }, get content_spacing() { return vm.model.content_spacing; }, set content_spacing(val) { val = parseInt(val) || 0; if (!vm.billingStatus && val < 250) { val = 250; } vm.model.content_spacing = val; } }; vm.control.auto_duration = true; vm.onChangeStartDate = function (value) { vm.model.start_timestamp = value; }; vm.onChangeEndDate = function (value) { vm.model.end_timestamp = value; }; vm.add = function () { vm.submitted = true; if (vm.form.$valid) { vm.loading = true; var orientation = vm.model.area_layout.find(function (item) { return item.name.includes('vertical'); }) == null ? 'landscape' : 'portrait'; vm.model.orientation = orientation; campaigns.add(vm.model).then(function (result) { $state.go("personalAccount.campaign.one", {id: result.id}); vm.loading = false; }).catch(function (response) { errorHandlerHelper.handleErrorResponse(response, vm.form, vm); vm.loading = false; }); } }; vm.showControlTargeting = function () { controlTargetingModalService.showControlTargetingModal(vm.model.time_targeting_id).then( function (id) { vm.model.time_targeting_id = id; } ); }; vm.showControlGeoTargeting = function () { controlGeoTargetingService.show(vm.model.geo_targeting_id).then( function (id) { vm.model.geo_targeting_id = id; } ); }; vm.close = function () { $state.go('personalAccount.campaign.list') }; } })(); /** * Created by denak on 17.05.2016. */ (function () { config.$inject = ["$stateProvider"]; Controller.$inject = ["$stateParams", "campaigns", "campaign", "removeModalService", "moment", "controlTargetingModalService", "controlGeoTargetingService", "editService", "confirmModalService", "backService", "billingService"]; angular.module("teleds.campaigns").config(config); function config($stateProvider) { $stateProvider .state('personalAccount.campaign.one', { url: '/one/{id}', templateUrl: 'campaigns/pages/campaign/campaign.html', controller: Controller, controllerAs: "vm", resolve: { campaign: ["campaigns", "$stateParams", function (campaigns, $stateParams) { return campaigns.get($stateParams.id); }] } }) } function Controller($stateParams, campaigns, campaign, removeModalService, moment, controlTargetingModalService, controlGeoTargetingService, editService, confirmModalService, backService, billingService) { var vm = this; vm.campaignId = $stateParams.id; vm.model = campaign; vm.model.cost = parseFloat(vm.model.cost); if(!vm.model.auto_duration) { if (vm.model.duration < 5000) { vm.model.duration = 5000; } } var sec = parseInt(vm.model.duration / 1000); vm.model._durationMin = Math.floor(sec / 60); vm.model._durationSec = sec - vm.model._durationMin * 60; vm.minDurationSeconds = 5; vm.control = { _seamlessPlayback: false, get seamlessPlayback() { return this._seamlessPlayback; }, set seamlessPlayback(val) { this._seamlessPlayback = val; if (val) { vm.editModel.value.content_spacing = 0; } }, get content_spacing() { return vm.editModel.value.content_spacing; }, set content_spacing(val) { val = parseInt(val) || 0; if (!vm.billingStatus && val < 250) { val = 250; } vm.editModel.value.content_spacing = val; } }; vm.model.updateDuration = function () { this.duration = (this.durationMin * 60 + this.durationSec) * 1000; if (this.duration < 5000) { this._durationSec = vm.minDurationSeconds = 5; this.duration = 5000; } else { vm.minDurationSeconds = 0; } }; Object.defineProperty(vm.model, "infinity", { get: function () { return this.end_timestamp == null || this.end_timestamp == '0000-00-00 00:00:00'; }, set: function (val) { if (val == true) { this.end_timestamp = null; } else { this.end_timestamp = moment().utc().add(1, 'day').floor(24, 'hours').format(); } } }); Object.defineProperty(vm.model, "auto_duration_prop", { get: function () { return this.auto_duration == 1; }, set: function (val) { this.auto_duration = val; } }); Object.defineProperty(vm.model, "durationMin", { get: function () { return this._durationMin; }, set: function (val) { if (val <= 0) { this._durationMin = 0; } else { this._durationMin = val; } this.updateDuration(); } }); Object.defineProperty(vm.model, "durationSec", { get: function () { return this._durationSec; }, set: function (val) { if (val <= 0) { this._durationSec = 0; } else { this._durationSec = val; } this.updateDuration(); } }); Object.defineProperty(vm.model, "minEndDate", { get: function () { return moment(); } }); update(true); vm.editModel = editService.getEditModelForRestAngularModel(vm); vm.billingStatus = false; billingService.getBillingStatus().then(function (status) { vm.billingStatus = status.paid; }); vm.onChange = function (obj) { vm.model = obj.value; return vm.form.$invalid; }; vm.onSave = function () { var updateAreas = !vm.model.area_layout[0].id || vm.model.has_audio_area != vm.model.has_audio_area_new; if (updateAreas && (vm.areas.length > vm.model.area_layout.length || (vm.model.has_audio_area && !vm.model.has_audio_area_new))) { return confirmModalService.show('campaigns.ConfirmUpdateArea').then(function () { updateCampaign(updateAreas); }) } return updateCampaign(updateAreas); }; vm.update = function () { return campaigns.update(vm.model); }; vm.onChangeStartDate = function (value) { vm.editModel.value.start_timestamp = value; }; vm.onChangeEndDate = function (value) { vm.editModel.value.end_timestamp = value; }; vm.showControlTargeting = function () { vm.updateTimeTargeting = true; controlTargetingModalService.showControlTargetingModal(vm.model.time_targeting_id).then( function (id) { if (vm.editModel.value.time_targeting_id !== id) { vm.editModel.value.time_targeting_id = id; } else { vm.updateTimeTargeting = false } } ).finally(function () { vm.updateTimeTargeting = false }); }; vm.showControlGeoTargeting = function () { vm.updateGeoTargeting = true; controlGeoTargetingService.show(vm.model.geo_targeting_id).then( function (id) { if (vm.editModel.value.geo_targeting_id !== id) { vm.editModel.value.geo_targeting_id = id; } else { vm.updateGeoTargeting = false; } } ).finally(function () { vm.updateGeoTargeting = false }); }; vm.onChangeArea = function () { campaigns.get($stateParams.id).then(function (response) { vm.model.duration = response.duration? response.duration:0; }); }; vm.remove = function () { removeModalService.showRemoveModal([vm.model.id], "campaigns").then(function () { vm.back(); }); }; vm.back = function () { backService.back('personalAccount.campaign.list'); }; function update(updateAreas) { if (updateAreas) { campaigns.getAreas(vm.campaignId).then(function (result) { vm.areas = result; vm.model.area_layout = result.plain(); vm.model.has_audio_area = vm.model.has_audio_area_new = !!vm.areas.find(function (area) { return (area.y == 0 && area.x == 0 && area.width == 0 && area.height == 0); }); }); } vm.control._seamlessPlayback = vm.model.content_spacing === 0; } function updateCampaign(updateAreas) { var orientation = vm.model.area_layout.find(function (item) { return item.name.includes('vertical'); }) == null ? 'landscape' : 'portrait'; vm.model.orientation = orientation; return campaigns.update(vm.model).then(function (response) { update(updateAreas); }); } } })(); /** * Created by denak on 17.05.2016. */ (function () { Controller.$inject = ["DTColumnBuilder", "campaigns", "notificationService", "moment", "$state", "attachContentModalService", "removeModalService"]; angular.module("teleds.campaigns").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.campaign', { url: '/campaign', abstract: true, template: '
' }) .state('personalAccount.campaign.list', { url: '/list', templateUrl: 'campaigns/pages/campaigns/campaigns.html', controller: Controller, controllerAs: "vm" }) } function Controller(DTColumnBuilder, campaigns, notificationService, moment, $state, attachContentModalService, removeModalService) { var vm = this; vm.option = { tags: [], name: "", status: false }; var limits = 0; vm.columns = [ { type: 'date', name: 'created_at' }, { type: 'name', name: 'name', align: "left", title: "common.Name", width: "40%", cellClass: "name-cell table-link" }, { type: 'custom', name: 'status', render: function (data, full) { var result = '
' + '{{"constants.CampaignStatus_' + data + '"|i18n}}' + '
'; return result; }, title: "common.Status" }, { type: "number", name: "content_count", title: "campaigns.AmountContent" }, { type: 'tags', name: 'tags', notSort: true }, { type: 'custom', name: 'null', notSort: true, render: function (data, full) { var control_row = '
' + '' + '
'; return control_row; } } ]; vm.defaultSort = [1, 'desc']; vm.actionCallback = function (action, id) { switch (action) { case "info": { vm.goToOne(id); break; } case "remove": { removeModalService.showRemoveModal([id], "campaigns").then(function () { vm.instance.reloadData(false); }); break; } case 'doubleClick': { vm.goToOne(id); break; } case 'clickName': { vm.goToOne(id); break; } case 'attach': { attachContentModalService.show(id.id, id.name).then(function () { vm.instance.reloadData(false); }); } } }; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { var param = {}; if (vm.option.name) { param['filter[name]'] = vm.option.name; } if (!vm.option.status) { param['filter[status]'] = 'active'; } if (vm.option.tags && vm.option.tags.length > 0) { param['filter[tags]'] = vm.option.tags.map(function (v) { return v.id; }).join(); } var order = aoData[2].value; if (order.length > 0) { var columnIndex = order[0].column; var dir = order[0].dir; var nameParam = 'sort[' + aoData[1].value[columnIndex].data + ']'; param[nameParam] = dir; } param['page[offset]'] = aoData[3].value; param['page[limit]'] = aoData[4].value; limits = param['page[limit]']; return campaigns.getList(param).then(function (result) { vm.notExist = result.data.length === 0 && !vm.option.status && vm.option.tags.length === 0 && vm.option.name === ''; fnCallback(result); vm.reloading = false; }).catch(function (result) { notificationService.showWarning('common.FailedGet'); fnCallback(result); }); }; vm.intanceCallback = function (instance) { vm.instance = instance; }; vm.onSelected = function (ids, all) { vm.selectedIds = ids; vm.all = all; }; vm.remove = function () { removeModalService.showRemoveModal(vm.selectedIds, "campaigns").then(function () { vm.instance.reloadData(vm.all, function () { vm.unselect = false; vm.selectAll = false; }); }); }; vm.goToOne = function (id) { $state.go('personalAccount.campaign.one', {id: id}) }; vm.onReset = function () { vm.option.name = ""; vm.option.status = false; vm.option.tags.length = 0; vm.instance.reloadData(true); }; vm.onApply = function (option) { vm.option.name = option.name; vm.option.status = option.status; vm.option.tags = option.tags; vm.notExist = false; vm.instance.reloadData(true); }; vm.reload = function () { vm.reloading = true; vm.instance.reloadData(false); } } })(); /** * Created by denak on 12.05.2016. */ /** * Created by denak on 23.04.2016. */ (function () { controller.$inject = ["$uibModalInstance", "url", "$sce"]; angular.module("teleds.contents") .service('audioPreviewModalService', service) service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (url) { var modalInstance = $uibModal.open({ templateUrl: 'content/components/audioPreviewModal/audioPreviewModal.html', controller: controller, windowClass: "", controllerAs:'vm', size: "lg", resolve: { url: function () { return url; } } }); return modalInstance.result; } } function controller( $uibModalInstance,url,$sce) { "ngInject"; var vm = this; vm.url =$sce.trustAsResourceUrl(url); vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["contents", "DTOptionsBuilder", "DTColumnDefBuilder", "locale", "tableHelper", "campaigns", "$q", "confirmModalService"]; angular.module("teleds.contents") .component("campaignTable", component()); function component() { return { restrict: "EA", bindings: { contentId: '<', campaigns: '<', promise: "<", onUpdate: "&" }, templateUrl: 'content/components/campaignTable/campaignTable.html', controller: Controller, controllerAs: 'vm' }; } function Controller(contents, DTOptionsBuilder, DTColumnDefBuilder, locale, tableHelper,campaigns,$q,confirmModalService) { "ngInject"; var vm = this; var options = tableHelper.getOptionsForAngularWayTable([true, false]); vm.dtOptions = options.dtOptions; vm.dtColumnDefs = options.dtColumnDefs; vm.remove = function (campaign) { confirmModalService.show('contents.ConfirmDetachCampaign',function () { return $q.all(campaign.areaIds.map(function (id) { return campaigns.detachContent(campaign.campaign.id,id, [vm.contentId]); })).then(function () { vm.onUpdate(); } ) }); } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.contents") .controller('changeFileModalController', controller); controller.$inject = ['$uibModalInstance', 'content', 'contents', 'errorHandlerHelper']; function controller($uibModalInstance, content, contents, errorHandlerHelper) { var vm = this; vm.model = content; switch (content.type) { case 'video': { this.model.accept = "video/*"; break; } case 'audio': { this.model.accept = "audio/*"; break; } case 'html5_zip': { this.model.accept = "application/zip"; break; } } vm.save = function () { vm.submitted = true; if (vm.form.$valid) { vm.loading = true; vm.progress = 0; contents.updateFile(content) .then(function () { $uibModalInstance.close(); }, function () { errorHandlerHelper.handleErrorResponse(response, vm.form, vm); }, function (progress) { vm.progress = Math.round(progress * 100); }).finally(function () { vm.loading = false; }); } }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.contents") .service('changeFileModalService', service); service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (content) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'content/components/changeFileModal/changeFileModal.html', controller: 'changeFileModalController as vm', resolve: { content: function () { return content; } } }); return modalInstance.result; } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["attachContentDetailModalService", "contents", "$filter"]; angular.module("teleds.contents") .component("contentCampaign", component()); function component() { return { restrict: "EA", bindings: { contentId: '<', name: "<" }, templateUrl: 'content/components/contentCampaign/contentCampaign.html', controller: Controller, controllerAs: 'vm' }; } function Controller(attachContentDetailModalService, contents, $filter) { "ngInject"; var vm = this; update(); vm.attachPlaylist = function () { attachContentDetailModalService.showAttachToContent(vm.name, vm.contentId, vm.campaigns).then(function () { update(); }); }; vm.onUpdate = function () { update(); }; function update() { vm.promise = contents.getCampaigns(vm.contentId).then(function (campaigns) { vm.campaigns = $filter('groupBy')(campaigns, 'campaign.id'); var l = Array.fromObject(vm.campaigns); vm.campaigns = l.map(function (groupCampaign) { return { campaign: groupCampaign[0].campaign, areaIds: groupCampaign.map(function (campaign) { return campaign.area.id; }) } }); }); } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["contents", "DTOptionsBuilder", "DTColumnDefBuilder", "videoPlayerService", "locale", "notificationService", "$scope"]; angular.module("teleds.contents") .component("contentFile", component()); function component() { return { restrict: "EA", bindings: { contentId: '<', contentName: "<", contentType:"<", contentStatus:"<", contentUpdated:"<" }, templateUrl: 'content/components/contentFile/contentFile.html', controller: Controller, controllerAs: 'vm' }; } function Controller(contents, DTOptionsBuilder, DTColumnDefBuilder, videoPlayerService, locale, notificationService, $scope) { "ngInject"; var vm = this; } })(); /** * Created by denak on 10.05.2016. */ (function () { Controller.$inject = ["contents"]; angular.module("teleds.blocks").component("contentPreview", component()); function component() { return { bindings: { contentId: "@" }, templateUrl: 'content/components/contentPreview/contentPreview.html', controller: Controller, controllerAs: 'vm' }; } function Controller(contents) { "ngInject"; var vm = this; var first = true; vm.hover = function () { if (first) { first = false; vm.loading = true; contents.get(vm.contentId).then(function (content) { vm.content = content; if(!vm.leave ) { vm.isOpen = true; } }).finally(function () { vm.loading = false; }) } }; vm.leave = function () { vm.leave = true; }; } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.contents") .component("contentsSearch", component()); function component() { return { restrict: "EA", bindings: { onApply: '&', onReset: '&', tagsCurrent: " 0 && !vm.isFilter(); }; vm.isAnyFilter = function () { return vm.isFilter()||vm.name.length > 0; } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["contents", "DTOptionsBuilder", "DTColumnDefBuilder", "videoPlayerService", "locale", "notificationService", "$scope", "imageModalService", "audioPreviewModalService"]; angular.module("teleds.contents") .component("fileTable", component()); function component() { return { restrict: "EA", bindings: { contentId: '<', contentType: "<", contentName: "<", contentStatus: "<" }, templateUrl: 'content/components/fileTable/fileTable.html', controller: Controller, controllerAs: 'vm' }; } function Controller(contents, DTOptionsBuilder, DTColumnDefBuilder, videoPlayerService, locale, notificationService, $scope, imageModalService, audioPreviewModalService) { "ngInject"; var vm = this; vm.dtOptions = DTOptionsBuilder .newOptions() .withOption('paging', false) .withOption("searching", false) .withOption("info", false); vm.dtColumnDefs = [ DTColumnDefBuilder.newColumnDef(0), DTColumnDefBuilder.newColumnDef(1), DTColumnDefBuilder.newColumnDef(2), DTColumnDefBuilder.newColumnDef(3).notSortable() ]; if (locale.getLocale() == 'ru') { vm.dtOptions.withLanguageSource('//cdn.datatables.net/plug-ins/1.10.9/i18n/Russian.json'); } vm.reload = function () { if (vm.contentStatus == 'processing') { vm.files = []; return; } contents.getFiles(vm.contentId).then(function (files) { files = files.filter(function (item) { return item.angle === 0; }); angular.forEach(files, function (item) { switch (item.quality) { case "lq": { item.quality = "480p"; item.qualitySort = 0; break; } case "sq": { item.quality = "720p"; item.qualitySort = 1; break; } case "hq": { item.quality = "1080p"; item.qualitySort = 2; break; } case "ultra": { item.quality = "4K"; item.qualitySort = 3; break; } } }); vm.files = files; }); }; vm.showPlayer = function (file) { if (vm.contentType == 'video') { videoPlayerService.showPlayerModal(file.url); } else if (vm.contentType == 'image') { imageModalService.show(file); } else { audioPreviewModalService.show(file.url); } }; vm.download = function (file) { var xhr = new XMLHttpRequest(); xhr.open('GET', file.url, true); xhr.responseType = "blob"; xhr.onreadystatechange = function () { if (xhr.readyState == 4) { $scope.$apply(function () { file.loading = false; }); if (xhr.status == 200) { saveAs(xhr.response, vm.contentName + "_" + file.quality); } else { notificationService.showError('common.InternalServerError'); } } }; file.loading = true; xhr.send(null); }; vm.$onChanges = function (changes) { if (changes.contentStatus) { vm.reload(); } } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["contents"]; angular.module("teleds.contents") .component("imageFile", component()); function component() { return { restrict: "EA", bindings: { contentId: '<', onInstance: "&", contentStatus: "<", contentUpdated:"<" }, templateUrl: 'content/components/imageFile/imageFile.html', controller: Controller, controllerAs: 'vm' }; } function Controller(contents) { "ngInject"; var vm = this; function update() { contents.getFiles(vm.contentId).then(function (files) { vm.url = files.find(function (item) { return item.angle===0; }).url; }); } vm.$onChanges = function (changes) { if (changes.contentUpdated) { update(); } } } })(); /** * Created by denak on 10.05.2016. */ (function () { angular.module("teleds.blocks").component("imagePreview", component()); function component() { return { bindings: { ngOpen: "<", contentId: "@", position: "@" }, templateUrl: 'content/components/imagePreview/imagePreview.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$timeout', 'contents', '$sce', '$filter']; function Controller($timeout, contents, $sce, $filter) { var vm = this; vm.popover = { templateUrl: 'content/components/imagePreview/imagePreviewPopover.html' }; vm.height = 240; if (!vm.position) { vm.position = 'right'; } vm.$onChanges = function (changes) { if (changes.ngOpen && vm.ngOpen) { vm.show(); } }; vm.show = function () { vm.hide = false; $timeout(function () { if (!vm.hide) { vm.isOpen = true; if (!vm.url) { contents.getFiles(vm.contentId).then(function (result) { var image = result.find(function (item) { return item.angle === 0; }); if (image) { vm.url = $sce.trustAsResourceUrl(image.url); } else { vm.error = true; } }).catch(function () { vm.error = true; }); } } }, 100) }; vm.close = function () { vm.hide = true; $timeout(function () { if (vm.hide) { vm.isOpen = false; } }, 100) } } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["tableHelper", "statistics"]; angular.module("teleds.players") .component("lastPlayEventsContent", component()); function component() { return { restrict: "EA", bindings: { contentId: '<' }, templateUrl: 'content/components/lastPlayEventsContent/lastPlayEventsContent.html', controller: Controller, controllerAs: 'vm' }; } function Controller(tableHelper, statistics) { "ngInject"; var vm = this; var options = tableHelper.getOptionsForAngularWayTable([false, false, false]); options.dtOptions = options.dtOptions.withOption("scrollY", '291px'); options.dtOptions = options.dtOptions.withOption("bScrollCollapse", 'true'); vm.dtOptions = options.dtOptions.withOption('order', []); vm.dtColumnDefs = options.dtColumnDefs; vm.promise =statistics.getLastPlayEvent({content_id: vm.contentId, limit: 25}).then(function (result) { _.each(result, function (value) { value.orderProp = moment(value.player_timestamp, 'YYYY-MM-DD HH:mm:ss'); value.player_timestamp = moment(value.player_timestamp, 'YYYY-MM-DD HH:mm:ss').format("DD.MM.YYYY HH:mm:ss") }); vm.events = _.orderBy(result, 'orderProp'); }); } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.contents") .controller('removeContentController', controller) controller.$inject = ['$uibModalInstance', 'selectedContent', 'contents', '$q', 'errorHandlerHelper']; function controller($uibModalInstance, selectedContent, contents, $q, errorHandlerHelper) { var vm = this; vm.generatedCode = Math.floor(Math.random() * 9000) + 1000; vm.oneContent = selectedContent.length == 1; vm.remove = function (form) { var promises = []; angular.forEach(selectedContent, function (item) { promises.push(contents.removeContent(item)); }); $q.all(promises).then(function () { $uibModalInstance.close(); }).catch(function (result) { errorHandlerHelper.handleErrorResponse(result, form, vm); }) }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.contents") .service('removeContentService', service) service.$inject = ["$uibModal"]; function service($uibModal){ var self = this; self.showRemoveContentModal = function (content) { var modalInstance = $uibModal.open({ templateUrl: 'content/components/removeContentModal/removeContentModal.html', controller: 'removeContentController as vm', resolve: { selectedContent: function () { return content; } } }); return modalInstance.result; } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.contents") .controller('videoPlayerController', controller) controller.$inject = ['$uibModalInstance','url','$sce']; function controller( $uibModalInstance, url,$sce) { var vm = this; vm.url =$sce.trustAsResourceUrl(url); vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 12.05.2016. */ /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.contents") .service('videoPlayerService', service) service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.showPlayerModal = function (url) { var modalInstance = $uibModal.open({ templateUrl: 'content/components/videoPlayer/videoPlayer.html', controller: 'videoPlayerController as vm', windowClass: "modal-image video-player", size: "lg", resolve: { url: function () { return url; } } }); return modalInstance.result; } } })(); /** * Created by denak on 10.05.2016. */ (function () { angular.module("teleds.blocks").component("videoPreview", component()); function component() { return { bindings: { ngOpen:"<", contentId: "@", position: "@" }, templateUrl: 'content/components/videoPreview/videoPreview.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$timeout', 'contents', '$sce', '$filter']; function Controller($timeout, contents, $sce, $filter) { var vm = this; vm.popover = { templateUrl: 'content/components/videoPreview/videoPreviewPopover.html' }; vm.height = 240; if (!vm.position) { vm.position = 'right'; } vm.$onChanges = function (changes) { if (changes.ngOpen && vm.ngOpen) { vm.show(); } }; vm.show = function () { vm.hide = false; $timeout(function () { if (!vm.hide) { if (!vm.url) { contents.getFiles(vm.contentId).then(function (result) { var video = {}; if (result.length == 0) { vm.error = true; return; } var resultFilter = $filter('filter')(result, function (item) { return item.quality === 'lq'; }); if (resultFilter.length == 0) { video = result[0]; } else { var videoPrev = resultFilter.find(function (item) { return item.angle === 0; }); if (videoPrev) { video = videoPrev; } else { video = resultFilter[0]; } } vm.width = video.width / 2; vm.url = $sce.trustAsResourceUrl(video.url); }).catch(function () { vm.error = true; }); } vm.isOpen = true; } }, 100) }; vm.close = function () { vm.hide = true; $timeout(function () { if (vm.hide) { vm.isOpen = false; } }, 100) } } })(); /** * Created by denak on 06.05.2016. */ (function () { Controller.$inject = ["$state", "ContentTypes", "contents", "errorHandlerHelper", "AcceptFile", "locale", "$filter"]; angular.module("teleds.contents") .controller("AddContentController", Controller); function Controller($state, ContentTypes, contents, errorHandlerHelper, AcceptFile, locale, $filter) { "ngInject"; var vm = this; vm.maxDuration = 5000; vm.content = { tags: [], play_duration: 5000, duration: 0, play_start: 0, rotate: "0", get type() { return this._type; }, get typeModel() { return this._typeModel; }, set typeModel(value) { this._typeModel = value; this._type = value.name; vm.successLoading = false; vm.errorLoading = false; vm.btnDisabled = true; switch (value.name) { case 'video': { this.accept = AcceptFile.video; vm.maxDuration = this.duration ? this.duration : 5000; break; } case 'audio': { this.accept = AcceptFile.audio; vm.maxDuration = this.duration ? this.duration : 5000; break; } case 'html5_zip': { this.accept = AcceptFile.html5_zip; vm.maxDuration = Number.MAX_VALUE; break; } case 'html5_online': { vm.btnDisabled = false; vm.maxDuration = Number.MAX_VALUE; break; } case 'image': { this.accept = AcceptFile.image; vm.maxDuration = Number.MAX_VALUE; break; } } }, _intervalType: "full", get intervalType() { return this._intervalType; }, set intervalType(val) { this._intervalType = val; switch (val) { case "full": { this.play_duration = this.duration; this.play_start = 0; break; } case "custom": { this.play_duration = 5000; this.play_start = 0; break; } } } }; vm.content.typeModel = ContentTypes[0]; vm.btnDisabled = true; vm.selectTypeOption = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; vm.getClassAdditionOptionBlock = function () { var result = []; result.push('addition-option-block--' + vm.content.type); result.push('addition-option-block--' + vm.content.intervalType); return result; }; vm.addContent = function () { vm.submitted = true; if (vm.form.$valid) { vm.loading = true; vm.progress = 0; contents.addContent(vm.content).then(function () { $state.go("personalAccount.content.list") }, function (response) { errorHandlerHelper.handleErrorResponse(response, vm.form, vm); }, function (progress) { vm.progress = Math.round(progress * 100); }).catch().finally(function () { vm.loading = false; }); } }; vm.loadFile = function () { vm.successLoading = false; vm.errorLoading = false; vm.checkingFile = true; vm.btnDisabled = true; vm.smallFile = false; contents.showSelectFileModal(vm.content.accept).then(function (result) { if (( vm.content.typeModel.name == 'audio' || vm.content.typeModel.name == 'video') && result.mediaInfo.duration < 5000) { vm.checkingFile = false; vm.smallFile = true; vm.errorLoading = true; return; } vm.content.s3key = result.blob.key; vm.content.fsid = result.fsid; vm.content.valid_zip = result.mediaInfo.valid_zip; vm.content.filesize = result.mediaInfo.filesize; vm.content.filehash = result.mediaInfo.filehash; vm.content.video_width = result.mediaInfo.width; vm.content.video_height = result.mediaInfo.height; vm.content.bitrate = result.mediaInfo.bitrate; vm.content.duration = result.mediaInfo.duration; vm.maxDuration = vm.content.duration; vm.content.play_duration = result.mediaInfo.duration; if (!( vm.content.typeModel.name == 'audio' || vm.content.typeModel.name == 'video')) { vm.content.duration = 5000; vm.content.play_duration = 5000; vm.maxDuration = Number.MAX_VALUE; } vm.content.name = result.name; vm.btnDisabled = false; vm.checkingFile = false; vm.successLoading = true; vm.fileLoaded = true; }).catch(function (result) { if (result) { vm.errorLoading = true; } else { vm.errorLoading = false; } vm.checkingFile = false; }); }; vm.close = function () { $state.go('personalAccount.content.list') }; } })(); /** * Created by denak on 11.05.2016. */ (function () { config.$inject = ["$stateProvider"]; controller.$inject = ["contents", "content", "$state", "$stateParams", "removeContentService", "changeFileModalService", "editService", "AcceptFile", "$filter", "$timeout", "backService"]; angular.module("teleds.contents").config(config); function config($stateProvider) { $stateProvider .state('personalAccount.content.one', { url: '/one/{id}', templateUrl: 'content/pages/content/content.html', controller: 'ContentController', controllerAs: "vm", resolve: { content: ["contents", "$stateParams", "$state", function (contents, $stateParams, $state) { return contents.get($stateParams.id).catch(function () { $state.go('personalAccount.content.list', null, {reload: true}); }); }] } }) } angular.module("teleds.contents") .controller("ContentController", controller); function controller(contents, content, $state, $stateParams, removeContentService, changeFileModalService, editService, AcceptFile, $filter, $timeout, backService) { "ngInject" var vm = this; vm.model = content; var full = vm.model.play_duration == vm.model.duration; vm.model._intervalType = full ? 'full' : 'custom'; vm.maxDuration = vm.model.duration; switch (vm.model.type) { case 'video': { vm.model.accept = AcceptFile.video; break; } case 'audio': { vm.model.accept = AcceptFile.audio; break; } case 'image': { vm.model.accept = AcceptFile.image; break; } case 'html5_zip': { vm.model.accept = AcceptFile.html5_zip; break; } } Object.defineProperty(vm.model, "intervalType", { get: function () { return this._intervalType; }, set: function (val) { this._intervalType = val; switch (val) { case "full": { this.play_duration = this.duration; this.play_start = 0; break; } case "custom": { this.play_duration = 5000; this.play_start = 0; break; } } } }); Object.defineProperty(vm.model, "playDurationView", { get: function () { return Math.round(this.play_duration / 1000); } }); vm.editModel = editService.getEditModelForRestAngularModel(vm); vm.onChange = function (obj) { vm.model = obj.value; return vm.form.$invalid; }; vm.onSave = function () { return contents.update(vm.model).then(function (response) { vm.successLoading = false; vm.errorLoading = false; vm.model.status = response.status; vm.model.updated_at = response.updated_at; }) }; vm.useFiles = function () { return vm.model && (vm.model.type == 'video' || vm.model.type == 'audio'); }; vm.remove = function () { removeContentService.showRemoveContentModal([$stateParams.id]).then(function () { vm.back(); }); }; vm.changeFile = function () { vm.editModel.startEdit(); vm.loadFile().then(function () { vm.editModel.endEdit(); }).catch(function () { vm.editModel.cancelEdit(); }) }; vm.loadFile = function () { vm.checkingFile = true; vm.successLoading = false; vm.errorLoading = false; vm.btnSaveDisabled = false; return contents.showSelectFileModal(vm.model.accept).then(function (result) { if (( vm.model.type == 'audio' || vm.model.type == 'video') && result.mediaInfo.duration < 5000) { vm.checkingFile = false; vm.smallFile = true; vm.errorLoading = true; vm.btnSaveDisabled = true; return; } vm.editModel.value.s3key = result.blob.key; vm.editModel.value.fsid = result.fsid; vm.checkingFile = false; vm.editModel.value.valid_zip = result.mediaInfo.valid_zip; vm.editModel.value.filesize = result.mediaInfo.filesize; vm.editModel.value.filehash = result.mediaInfo.filehash; vm.editModel.value.video_width = result.mediaInfo.width; vm.editModel.value.video_height = result.mediaInfo.height; vm.editModel.value.bitrate = result.mediaInfo.bitrate; if (result.mediaInfo.duration) { vm.editModel.value.duration = result.mediaInfo.duration; vm.maxDuration = result.mediaInfo.duration; vm.editModel.value.play_duration = result.mediaInfo.duration; if (!( vm.model.type == 'audio' || vm.model.type == 'video')) { vm.editModel.value.duration = 5000; vm.editModel.value.play_duration = 5000; vm.maxDuration = Number.MAX_VALUE; } } vm.successLoading = true; }).catch(function (result) { if (result) { vm.errorLoading = true; vm.btnSaveDisabled = true; } vm.checkingFile = false; }); }; vm.back = function () { backService.back('personalAccount.content.list'); }; vm.updateContent = function () { return contents.update(vm.model); }; updateStatusLabel(); vm.timer = null; vm.$onDestroy = function () { if (vm.timer) { $timeout.cancel(vm.timer) } }; vm.timer = $timeout(update, 5000); function update() { if (vm.model.status == 'processing') { contents.get($stateParams.id).then(function (content) { vm.timer = vm.model.status = content.status; updateStatusLabel(); vm.timer = $timeout(update, 5000); }) } else { vm.timer = $timeout(update, 1000); } } function updateStatusLabel() { var labelClass = ""; switch (vm.model.status) { case 'created': { labelClass = "label-primary"; break; } case 'processing': { labelClass = "label-warning"; break; } case 'ready': { labelClass = "label-success"; break; } case 'error': { labelClass = "label-danger"; break; } } vm.labelClass = labelClass; } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["statistics"]; angular.module("teleds.dashboard") .component("dashboardChart", component()); function component() { return { restrict: "EA", bindings: {}, templateUrl: 'dashboard/components/dashboardChart/dashboardChart.html', controller: Controller, controllerAs: 'vm' }; } function Controller(statistics) { "ngInject" var vm = this; vm.startDate = moment().add(-7, 'days'); vm.endDate = moment(); vm.groupType = 'day_hour'; vm.result = false; vm.onChangeDate = function (startDate, endDate) { vm.startDate = startDate; vm.endDate = endDate; var diff = moment(vm.endDate).diff(moment(vm.startDate), 'days'); if (diff > 7) { vm.groupType = 'day'; } else { vm.groupType = 'day_hour'; } updateChart(); }; vm.onResetRange = function () { vm.startDate = moment().add('days', -7); vm.endDate = moment(); vm.groupType = 'day_hour'; }; vm.data = { labels: [], datasets: [ { label: "Просмотров", borderWidth: 2, pointHoverRadius: 3, pointHitRadius:7, pointRadius: 2, fill: true, backgroundColor: "rgba(115, 204, 192,0.5)", borderColor: "rgba(115, 204, 192,1)", data: [] }] }; vm.options = { responsive: true, animation: { duration: 1000 }, legend: { display: false }, scales: { xAxes: [{ display: true, type: "time", time: { parser: val, displayFormats: { quarter: 'MMM YYYY', hour:"DD.MM HH:mm" }, unitStepSize:24 }, ticks: { display: true } }], yAxes: [ { display: true, position: "left", id: "y-axis-1", ticks: { beginAtZero: true, min: 0, maxTicksLimit: 5, fontFamily: "'Lato'" }, gridLines: { display: true } } ] }, tooltips: { enabled: true } }; updateChart(); function updateChart() { vm.loading=true; vm.promise = statistics.getDistinctContent(vm.startDate, vm.endDate, vm.groupType).then(function (result) { if(!result ||result&&result.length==0) { result.push({ "quantity": "0", "report_day": "20160227", "report_hour": "11" }); result.push({ "quantity": "0", "report_day": "20160227", "report_hour": "12" }); vm.options.scales.yAxes[0].ticks.max=50; } var prepared = result.map(function (item) { return {y: item.quantity, x: moment( item.report_day + ' ' + item.report_hour , 'YYYYMMDD HH') .format('DD.MM.YY HH:mm')} }); var startDate =moment() vm.data.datasets[0].data = prepared; vm.result = prepared.length > 0; }).finally(function () { vm.loading=false; }); } function rand(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } function val(value) { return moment(value, 'DD.MM.YY HH:mm'); } } })(); /** * Created by denak on 13.04.2016. */ (function () { controller.$inject = ["contents", "notificationService", "moment", "$state", "$timeout", "removeContentService", "controlTagServiceModal"]; angular.module("teleds.contents") .component("listContents", component()); function component() { return { templateUrl: 'content/pages/contents/contents.html', controller: controller, controllerAs: 'vm' }; } function controller(contents, notificationService, moment, $state, $timeout, removeContentService, controlTagServiceModal) { "ngInject"; var vm = this; vm.timer = null; vm.option = { tags: [], name: "", types: [] }; var data = []; vm.columns = [ { type: 'date', name: 'created_at' }, { type: 'custom', name: 'name', render: function (data, full) { var result = "
"; if (full.status == 'ready' && full.type == 'video') { result = ''; } if (full.status == 'ready' && full.type == 'image') { result = ''; } result += "" + data + "
"; return result; }, align: "left", title: "common.Name", width: "40%", cellClass: "name-cell" }, { type: 'custom', name: 'type', render: function (data, full) { var result = '
' + '{{"constants.' + data + '"|i18n}}' + '
'; return result; }, title: "common.Type" }, { type: 'tags', name: 'tags', notSort: true }, { type: 'custom', name: 'status', render: function (data, full) { var labelClass = ""; switch (data) { case 'created': { labelClass = "label-primary"; break; } case 'processing': { labelClass = "label-warning"; break; } case 'ready': { labelClass = "label-success"; break; } case 'error': { labelClass = "label-danger"; break; } } var result = '
' + '{{"constants.' + data + '"|i18n}}' + '
'; return result; }, title: "common.Status" }, { type: 'custom', name: 'null', notSort: true, render: function (data, full) { var control_row = '
' + '
'; return control_row; } } ]; vm.defaultSort = [1, 'desc']; vm.actionCallback = function (action, id) { switch (action) { case "info": { vm.goToContent(id); break; } case "remove": { removeContentService.showRemoveContentModal([id]).then(function () { vm.instance.reloadData(false); }); break; } case 'doubleClick': { vm.goToContent(id); break; } case 'clickName': { vm.goToContent(id); break; } } }; vm.goToContent = function (id) { $state.go('personalAccount.content.one', {id: id}) }; var first = true; vm.$onDestroy = function () { if (vm.timer) { $timeout.cancel(vm.timer) } }; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { var param = {}; if (vm.option.name) { param['filter[name]'] = vm.option.name; } if (vm.option.types && vm.option.types.length > 0) { param['filter[type]'] = vm.option.types.map(function (v) { return v.name; }).join(); } if (vm.option.tags && vm.option.tags.length > 0) { param['filter[tags]'] = vm.option.tags.map(function (v) { return v.id; }).join(); } var order = aoData[2].value; if (order.length > 0) { var columnIndex = order[0].column; var dir = order[0].dir; var nameParam = 'sort[' + aoData[1].value[columnIndex].data + ']'; param[nameParam] = dir; } param['page[offset]'] = aoData[3].value; param['page[limit]'] = aoData[4].value; return contents.getContents(param).then(function (result) { vm.notExist = result.data.length === 0 && vm.option.types.length === 0 && vm.option.tags.length === 0 && vm.option.name === ''; data = result.data; if (first) { first = false; $timeout(function () { fnCallback(result); }, 0); } else { fnCallback(result); } vm.reloading = false; }).catch(function (result) { notificationService.showWarning('common.FailedGet'); fnCallback(result); }); }; vm.intanceCallback = function (instance) { vm.instance = instance; }; vm.onReset = function () { vm.option.types = []; vm.option.tags.length = 0; vm.option.name = ''; vm.instance.reloadData(true); }; vm.onApply = function (option) { vm.option.types = option.types; vm.option.tags = option.tags; vm.option.name = option.name; vm.notExist = false; vm.instance.reloadData(true); }; vm.onSelected = function (ids, all) { vm.selectedIds = ids; vm.all = all; }; vm.removePlayers = function () { removeContentService.showRemoveContentModal(vm.selectedIds).then(function () { vm.instance.reloadData(vm.all, function () { vm.unselect = false; vm.selectAll = false; }); }); }; vm.addTags = function () { controlTagServiceModal.showControlTagModal(vm.selectedIds, 'content').then(function () { vm.instance.reloadData(vm.all, function () { vm.unselect = false; vm.selectAll = false; }); }); }; vm.reload = function () { vm.reloading = true; vm.instance.reloadData(false); }; vm.timer = $timeout(update, 10000); function update() { if (data.find(function (item) { return item.status === 'processing' })) { vm.reload(); vm.timer = $timeout(update, 10000); } else { vm.timer = $timeout(update, 1000); } } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["players", "uiGmapIsReady", "$timeout", "$scope", "$state"]; angular.module("teleds.dashboard") .component("playersMap", component()); function component() { return { restrict: "EA", bindings: {}, templateUrl: 'dashboard/components/playersMap/playersMap.html', controller: Controller, controllerAs: 'vm' }; } function Controller(players, uiGmapIsReady, $timeout, $scope,$state) { "ngInject"; var vm = this; vm.markers = []; vm.active = 0; vm.inactive = 0; vm.inactiveMoreDay = 0; vm.map = { center: { longitude: 30.747, latitude: 50.626 }, zoom: 4, polygons: [], control: {} }; vm.window = { show: false, control: {}, coords: { latitude: "", longitude: "", }, options: { disableAutoPan: true, pixelOffset: { height: -35, width: 0 } } }; var k = 0; vm.markerOption = { event: { mouseover: function (map, eventName, originalEventArgs) { var marker = originalEventArgs; vm.currentPlayer = marker.player; vm.window.coords.latitude = marker.latitude; vm.window.coords.longitude = marker.longitude; vm.window.show = true; }, mouseout: function (map, eventName, originalEventArgs) { vm.window.show = false; }, dblclick: function (map, eventName, originalEventArgs) { var marker = originalEventArgs; var currentPlayer = marker.player; $state.go('personalAccount.player.one',{id:currentPlayer.id}) } } }; uiGmapIsReady.promise(1).then(function (instances) { }); UpdateMarkers(); vm.updateMarkers = UpdateMarkers; $timeout(UpdateMarkers, 300000); function UpdateMarkers(notFit) { vm.loading =true; players.getAll().then(function (result) { var markers = []; var activeCount = 0; var inactiveCount = 0; var inactiveMoreDayCount = 0; result.forEach(function (item, index) { var now = moment(); if (item.last_activity) { var lastActivity = moment.utc(item.last_activity).local(); var active = now.diff(lastActivity, 'minutes') < 5; var inactiveMoreDay = now.diff(lastActivity, 'days') > 1; } else { var active = false; var inactiveMoreDay = true; } if (item.gps_lat && item.gps_long) { item.active = active; markers.push( { id: index, latitude: item.gps_lat, longitude: item.gps_long, icon: active ? "images/enabled-player-icon.png" : "images/disabled-player-icon.png", player: item } ) } if (active) { activeCount++; } else if (inactiveMoreDay) { inactiveMoreDayCount++; } else { inactiveCount++; } }); vm.markers = markers; vm.active = activeCount; vm.inactive = inactiveCount; vm.inactiveMoreDay = inactiveMoreDayCount; if(!notFit) { if (markers.length > 0) { $timeout(function () { var bounds = new google.maps.LatLngBounds(); markers.forEach(function (marker) { bounds.extend(new google.maps.LatLng(marker.latitude, marker.longitude)); }); var map = vm.map.control.getGMap(); map.fitBounds(bounds); },100); } else if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function (position) { vm.map.center.latitude = position.coords.latitude; vm.map.center.longitude = position.coords.longitude; vm.map.zoom=11; $scope.$apply(); }, function () { }); } } }).finally(function () { vm.loading =false; }); } } })(); (function () { angular.module("teleds.dashboard") .component("popoverPlayer", component()); function component() { return { restrict: "EA", bindings: { currentPlayer:'<' }, templateUrl: 'dashboard/components/playersMap/popoverPlayer.html', controller: Controller, controllerAs: 'vm' }; } function Controller() { "ngInject"; var vm = this; updateWindow (); function updateWindow () { var iwOuter = $('.gm-style-iw'); var iwCloseBtn = iwOuter.next(); iwCloseBtn.remove(); var iwBackground = iwOuter.prev(); // Remove the background shadow DIV iwBackground.children(':nth-child(2)').css({'opacity': '0'}); // Remove the white background DIV iwBackground.children(':nth-child(4)').css({'opacity': '0'}); // Changes the desired tail shadow color. iwBackground.children(':nth-child(3)').find('div').children().css({'z-index': '1'}); //iwOuter.children().first().css({'display': 'block'}); iwOuter.css({'opacity': '1'}); }; } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["$q"]; angular.module("teleds.dashboard") .component("topPlayers", component()); function component() { return { restrict: "EA", bindings: { items: "<", colorClass: "@", typeKey: "@", typeTitleKey: "@" }, templateUrl: 'dashboard/components/topPlayers/topPlayers.html', controller: Controller, controllerAs: 'vm' }; } function Controller($q) { "ngInject"; var vm = this; $q.when(vm.items).then(function (result) { vm.players = result; }) } })(); /** * Created by denak on 12.04.2016. */ /** * Created by denak on 12.04.2016. */ (function () { directive.$inject = ["$timeout", "locale", "$q"]; angular.module("teleds.layout") .directive("pagePreloader", directive); function directive($timeout, locale,$q) { "ngInject"; return { link: function (scope, element, attrs) { $q.all([locale.ready('common'),locale.ready('layout')]) .finally(function () { $timeout(function () { element.addClass("loaded"); $('body > section').animate({ opacity: 1 }, 400); }, 900); }); } }; } })(); /** * Created by denak on 12.04.2016. */ (function () { angular.module("teleds.layout") .component("sideBar", component()); function component() { return { restrict: "EA", templateUrl: 'layout/components/sideBar/sideBar.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ["AuthService", "$state", "menu"]; function Controller(AuthService, $state, menu) { var vm = this; vm.$state = $state; vm.logout = function () { AuthService.signOut().then(function () { $state.go("auth.login") }) }; vm.lock = function () { AuthService.lock().then(function () { $state.go("auth.lock") }).catch(function () { $state.go("auth.login") }) }; vm.isActive = function (state) { var k =vm.$state.includes(state); return vm.$state.includes(state); }; var menuItem = [ { key: "layout.Dashboard", sref: "personalAccount.home", active: "personalAccount.home", icon: "icon-home" }, { key: "layout.Statistics", sref: "personalAccount.summaryStatistic", active: "personalAccount.summaryStatistic", icon: "icon-bar-chart" }, { key: "layout.Contents", sref: "personalAccount.content.list", active: "personalAccount.content", icon: "icon-film" }, { key: "layout.Campaigns", sref: "personalAccount.campaign.list", active: "personalAccount.campaign", icon: "icon-tag" }, { key: "layout.Players", sref: "personalAccount.player.list", active: "personalAccount.player", icon: "icon-control-play" }, { key: "layout.Settings", sref: "personalAccount.preference", active: "personalAccount.preference", icon: "fa fa-gear", isParent: true, children: [ { key: "layout.MyProfile", sref: "personalAccount.preference.profile", icon: "fa fa-gear" } ] }, { key: "layout.Subscription", sref: "personalAccount.subscribe", active: "personalAccount.subscribe", icon: "fa fa-dollar fa-dollar--layout" }, ]; var orig = angular.copy(menuItem); vm.menu = menu.getOrder(menuItem); vm.resetOrder = function () { vm.menu = menu.getOrder(angular.copy(orig), true); }; vm.saveOrder = function () { menu.save(vm.menu); vm.sortableOptions.disabled = true }; vm.sortableOptions = { stop: function (e, ui) { for (var index in vm.menu) { vm.menu[index].i = index; } }, placeholder: "nav-sidebar-placeholder", connectWith: ".nav-sidebar > li", handle: "a", opacity: 0.5, axis: "y", dropOnEmpty: true, forcePlaceholderSize: true, disabled: true }; } })(); /** * Created by denak on 12.04.2016. */ /** * Created by denak on 08.04.2016. */ (function () { angular.module("teleds.layout") .component("topBar", component()); function component() { return { restrict: "EA", templateUrl: 'layout/components/topBar/topBar.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = []; function Controller() { } })(); /** * Created by denak on 12.04.2016. */ (function () { angular.module("teleds.layout") .component("userProfile", component()); function component() { return { restrict: "EA", templateUrl: 'layout/components/userProfile/userProfile.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ["locale",'AuthService','$state',"user"]; function Controller(locale,AuthService,$state,user) { var vm = this; user.getCurrentUser().then(function () { vm.userServiceData = user.data; }); vm.change = function (lan) { locale.setLocale(lan); }; vm.logout =function () { AuthService.signOut().then(function () { $state.go("auth.login") }) } } })(); /** * Created by denak on 12.05.2016. */ (function () { angular.module("teleds.players") .controller('addImageModalController', controller); controller.$inject = ['$uibModalInstance', 'playerId', 'players', 'errorHandlerHelper']; function controller($uibModalInstance, playerId, players, errorHandlerHelper) { var vm = this; vm.playerId = playerId; vm.model = { accept: "image/*" }; vm.apply = function () { vm.submitted = true; if (vm.form.$valid) { vm.loading = true; players.addImage(vm.playerId, vm.model).then(function (result) { $uibModalInstance.close(result.data); }).catch(function (result) { errorHandlerHelper.handleErrorResponse(result, vm.form, vm) }).finally(function () { vm.loading = false; }); } }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 12.05.2016. */ (function () { angular.module("teleds.players") .service('addImageModalService', service) service.$inject = ["$uibModal"]; function service($uibModal){ var self = this; self.show = function (playerId) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'players/components/addImageModal/addImageModal.html', controller: 'addImageModalController as vm', resolve: { playerId: function () { return playerId; } } }); return modalInstance.result; } } })(); /** * Created by denak on 12.05.2016. */ (function () { controller.$inject = ["$uibModalInstance", "selectedPlayers", "players", "errorHandlerHelper", "campaigns", "$q"]; angular.module("teleds.players") .controller('assignCampaignController', controller); function controller($uibModalInstance, selectedPlayers, players, errorHandlerHelper, campaigns, $q) { "ngInject"; var vm = this; vm.onePlayer = selectedPlayers.length == 1; vm.remove = function (form) { vm.submitted = true; if (form.$valid) { vm.loading = true; $q.all(selectedPlayers.map(function (id) { return players.attachCampaign(id, vm.campaignId); })).then(function () { $uibModalInstance.close(); }).catch(function (result) { if (result.data.error.en == "Already linked") { $uibModalInstance.close(); } else { errorHandlerHelper.handleErrorResponse(result, form, vm); } }).finally(function () { vm.loading = false; }) } }; var params = {limit: 500}; params["sort[created_at]"] = 'desc'; params['filter[status]'] = 'active'; campaigns.getList(params).then(function (result) { vm.campaigns = result.data; if (vm.campaigns.length > 0) { vm.campaignId = vm.campaigns[0].id; } }); vm.selectVirtualScreenOption = { dropdownCssClass: "form-white" }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 12.05.2016. */ (function () { service.$inject = ["$uibModal"]; angular.module("teleds.players") .service('assignCampaignService', service) function service($uibModal){ "ngInject"; var self = this; self.showAssignCampaignModal = function (players) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'players/components/assignCampaign/assignCampaignModal.html', controller: 'assignCampaignController as vm', windowClass:'assign-virtual-screen-modal', resolve: { selectedPlayers: function () { return players; } } }); return modalInstance.result; } } })(); /** * Created by denak on 12.05.2016. */ (function () { angular.module("teleds.players") .controller('imageModalController', controller); controller.$inject = ['$uibModalInstance', 'image']; function controller($uibModalInstance, image) { var vm = this; vm.model = image; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 12.05.2016. */ (function () { angular.module("teleds.players") .service('imageModalService', service); service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (image) { var modalInstance = $uibModal.open({ templateUrl: 'players/components/imageModal/imageModal.html', controller: 'imageModalController as vm', windowClass: "modal-image", resolve: { image: function () { return image; } } }); return modalInstance.result; } } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["addImageModalService", "players", "imageModalService", "confirmModalService"]; angular.module("teleds.players") .component("playerImages", component()); function component() { return { restrict: "EA", bindings: { playerId: '<' }, templateUrl: 'players/components/playerImages/playerImages.html', controller: Controller, controllerAs: 'vm' }; } function Controller(addImageModalService, players, imageModalService, confirmModalService) { "ngInject"; var vm = this; update(); vm.add = function () { addImageModalService.show(vm.playerId).then(function () { update(); }); }; vm.show = function (image) { imageModalService.show(image); }; vm.remove = function (image) { confirmModalService.show('blocks.ConfirmActionModalHint',function () { image.removing = true; return players.removeImage(vm.playerId, image.id).then(function () { vm.images.splice(vm.images.indexOf(image), 1); }).catch(function () { image.removing = false; }) }) }; function update() { players.getImages(vm.playerId).then(function (images) { vm.images = images; }); } } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["tableHelper", "statistics"]; angular.module("teleds.players") .component("playerLastPlayEventsTable", component()); function component() { return { restrict: "EA", bindings: { playerId: '<' }, templateUrl: 'players/components/playerLastPlayEventsTable/playerLastPlayEventsTable.html', controller: Controller, controllerAs: 'vm' }; } function Controller(tableHelper, statistics) { "ngInject"; var vm = this; var options = tableHelper.getOptionsForAngularWayTable([false,false]); options.dtOptions = options.dtOptions.withOption("scrollY", '291px').withOption('order', []); vm.dtOptions = options.dtOptions; vm.dtColumnDefs = options.dtColumnDefs; vm.promise = statistics.getLastPlayEvent({player_id: vm.playerId, limit: 25}).then(function (result) { _.each(result, function (value) { value.player_timestamp = moment(value.player_timestamp, 'YYYY-MM-DD HH:mm:ss').format("DD.MM.YYYY HH:mm:ss") }); vm.events = result; }); } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["playerStatModalService", "players"]; angular.module("teleds.players") .component("playerNotes", component()); function component() { return { restrict: "EA", bindings: { model: '<' }, templateUrl: 'players/components/playerNotes/playerNotes.html', controller: Controller, controllerAs: 'vm' }; } function Controller(playerStatModalService, players) { "ngInject"; var vm = this; vm.startEdit = function () { vm.edit = true; vm.tempDescription = angular.copy(vm.model.description); }; vm.cancelEdit = function () { vm.edit = false; vm.model.description = vm.tempDescription; }; vm.endEdit = function () { players.update(vm.model).then(function () { vm.edit = false; }); } } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["tableHelper", "players", "confirmModalService", "selectEntityModalService", "$q"]; angular.module("teleds.players") .component("playerAttachedCampaigns", component()); function component() { return { restrict: "EA", bindings: { player: '<' }, templateUrl: 'players/components/playersAttachedCampaign/playersAttachedCampaigns.html', controller: Controller, controllerAs: 'vm' }; } function Controller(tableHelper, players, confirmModalService, selectEntityModalService, $q) { "ngInject"; var vm = this; var dataTemp = []; vm.$onChanges = function () { if (vm.player) { // vm.instance.reload(); } }; vm.columns = [ { type: 'link', name: 'name', notSort: true, state: "personalAccount.campaign.one", title: "common.Name", width: "100%" }, { type: 'tags', name: 'tags', notSort: true }, { type: 'custom', name: 'null', notSort: true, render: function (data, full) { var control_row = '
' + '' + '
'; return control_row; } } ]; vm.attach = function () { selectEntityModalService.show('campaigns', dataTemp.map((function (item) { return item.id; }))).then(function (selectedIDs) { if (selectedIDs.length > 0) { vm.attaching = true; var promises = selectedIDs.map(function (item) { return players.attachCampaign(vm.player.id, item); }); $q.all(promises).then(function () { }).finally(function () { vm.instance.reloadData(false); vm.attaching = false; }) } }) }; vm.actionCallback = function (action, id) { switch (action) { case "remove": { confirmModalService.show('players.AttachedCampaign_ConfirmDetachCampaign', function () { return players.detachCampaign(vm.player.id, id); }).then(function () { vm.instance.reloadData(false); }); break; } case 'doubleClick': case 'clickName': { vm.goToOne(id); break; } } }; vm.goToOne = function (id) { $state.go('personalAccount.campaign.one', {id: id}) }; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { if (!vm.disableServerLoading) { if (!vm.player) { dataTemp = []; return $q.when(fnCallback(tableHelper.getEmptyList())); } return players.getCampaigns(vm.player.id).then(function (result) { dataTemp = result; fnCallback(tableHelper.wrapList(result)); }).catch(function (result) { dataTemp = []; notificationService.showWarning('common.FailedGet'); fnCallback(tableHelper.getEmptyList()); }); } else { vm.disableServerLoading = false; } }; vm.intanceCallback = function (instance) { vm.instance = instance; }; vm.onSelected = function (ids, all) { vm.selectedIds = ids; vm.all = all; }; vm.onRowReorder = function (newPos, oldPos) { var campaign = dataTemp[oldPos]; dataTemp.splice(oldPos, 1); dataTemp.splice(newPos, 0, campaign); players.moveToCampaign(vm.player.id, campaign.id, newPos + 1).then(function () { vm.instance.reloadData(false); }); vm.disableServerLoading = true; }; vm.detach = function () { var confirmText = ""; if (vm.selectedIds.length > 1) { confirmText = 'players.AttachedCampaign_ConfirmDetachCampaigns'; } else { confirmText = 'players.AttachedCampaign_ConfirmDetachCampaign'; } confirmModalService.show(confirmText, function () { var promises = vm.selectedIds.map(function (id) { return players.detachCampaign(vm.player.id, id); }); return $q.all(promises); }).then(function () { vm.instance.reloadData(false); }) }; } }) (); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.players") .component("playerSearch", component()); function component() { return { restrict: "EA", bindings: { onApply: '&', onReset: '&', tagsCurrent: " 0 && !vm.isFilter()&&!vm.isOneQuicktype(); }; vm.isAnyFilter = function () { return vm.isOneQuicktype() || vm.isFilter()||vm.name.length > 0; } } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["playerStatModalService"]; angular.module("teleds.players") .component("playerStat", component()); function component() { return { restrict: "EA", bindings: { playerId: '<' }, templateUrl: 'players/components/playerStat/playerStat.html', controller: Controller, controllerAs: 'vm' }; } function Controller(playerStatModalService) { "ngInject"; var vm = this; vm.startTableStat = moment().ceil(24, 'hours').add('-7', 'd'); vm.endTableStat = moment().ceil(24, 'hours'); vm.showStat = function () { playerStatModalService.show(vm.playerId); }; } })(); /** * Created by denak on 12.05.2016. */ (function () { angular.module("teleds.players") .controller('playerStatModalController', controller); controller.$inject = ['$uibModalInstance', 'playerId']; function controller($uibModalInstance, playerId) { var vm = this; vm.playerId = playerId; vm.model = { _typeRange: "last30", _customEndDate: moment(moment().format("yyyy MM"), "yyyy MM").format(), get customEndDate() { return this._customEndDate; }, set customEndDate(val) { this._customEndDate = val; this.tempStartDate = moment(val); this.tempEndDate = moment(val).add(1, 'M'); vm.model.startDate = vm.model.tempStartDate; vm.model.endDate = vm.model.tempEndDate; }, _startDate: moment().add(-15, 'days'), _endDate: moment().add(1,'days'), get startDate() { return this._startDate; }, get endDate() { return this._endDate; }, set endDate(val) { this._endDate = val; }, set startDate(val) { this._startDate = val; } }; vm.options = { minViewMode: "months", format: "yyyy MM" }; vm.selectVirtualScreenOption = { dropdownCssClass: "form-white" }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 12.05.2016. */ (function () { angular.module("teleds.players") .service('playerStatModalService', service) service.$inject = ["$uibModal"]; function service($uibModal){ var self = this; self.show = function (playerId) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'players/components/playerStatModal/playerStatModal.html', controller: 'playerStatModalController as vm', resolve: { playerId: function () { return playerId; } } }); return modalInstance.result; } } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["DTOptionsBuilder", "DTColumnDefBuilder", "locale", "$q", "$scope", "$compile", "tableHelper", "DTColumnBuilder", "$timeout", "statistics"]; angular.module("teleds.players") .component("playerStatTable", component()); function component() { return { restrict: "EA", bindings: { playerId: '<', startDate: "<", endDate: "<", scrollY: '@' }, templateUrl: 'players/components/playerStatTable/playerStatTable.html', controller: Controller, controllerAs: 'vm' }; } function Controller(DTOptionsBuilder, DTColumnDefBuilder, locale, $q, $scope, $compile, tableHelper, DTColumnBuilder, $timeout,statistics) { "ngInject"; var vm = this; vm.dtOptions = DTOptionsBuilder .newOptions() .withFnServerData(serverData) .withDataProp('data') .withOption('paging', false) .withOption('ajax', true) .withOption("searching", false) .withOption('processing', false) .withOption('loadingTemplate', "") .withOption('order', [0, 'desc']) .withOption("info", false) .withOption('createdRow', function (row, data, dataIndex) { $compile(angular.element(row))($scope); }); if (vm.scrollY) { vm.dtOptions = vm.dtOptions.withOption("scrollY", 400); } vm.promises = []; var request =null; if (locale.getLocale() == 'ru') { vm.dtOptions.withLanguageSource('//cdn.datatables.net/plug-ins/1.10.9/i18n/Russian.json'); } vm.show = false; $timeout(function () { vm.show = true; }, 100); jQuery.fn.dataTableExt.oSort["playerStatDates-desc"] = function (x, y) { var diff = moment(y, 'DD.MM.YYYY').diff(moment(x, 'DD.MM.YYYY')); return diff; }; jQuery.fn.dataTableExt.oSort["playerStatDates-asc"] = function (x, y) { return jQuery.fn.dataTableExt.oSort["playerStatDates-desc"](y, x); }; vm.dtColumns = vm.dtColumns = [ DTColumnBuilder.newColumn('view').renderWith(function (data, type, full, meta) { return data; }).withOption("sType", 'playerStatDates'), DTColumnBuilder.newColumn('null').notSortable().renderWith(function (data, type, full, meta) { return " "; }) ]; vm.dtInstance = {}; vm.dtIntanceCallback = function (instance) { vm.dtInstance = instance; $timeout(function () { vm.dtInstance.DataTable.columns.adjust() }); }; function serverData(sSource, aoData, fnCallback, oSettings) { return $q.when(vm.dates).then(function (dates) { fnCallback(tableHelper.wrapList(dates)); }) } vm.onSetLoadingPromise = function (promise) { vm.promises.push(promise); if (vm.promises.length == vm.dates.length) { $q.all(vm.promises).finally(function () { vm.defer.resolve(); }) } }; var first = true; this.$onChanges = function (changesObj) { if (changesObj.startDate || changesObj.endDate) { request = statistics.getStatsForPlayers([vm.playerId],vm.startDate,vm.endDate,true); var countDays = moment(vm.endDate).diff(moment(vm.startDate), 'days'); var dates = []; for (var i = 0; i < countDays; i++) { dates.push({ view: moment(vm.startDate).add(i, 'days').format("DD.MM.YYYY"), start: moment(vm.startDate).add(i, 'days').utc().format(), end: moment(vm.startDate).add(i + 1, 'days').utc().format() }); } vm.promises.length = 0; vm.dates = dates; var defer = $q.defer(); vm.defer = defer; vm.promise = vm.defer.promise; if (!first) { vm.dtInstance.reloadData(); } first = false; } }; } })(); /** * Created by denak on 07.06.2016. */ (function () { Controller.$inject = ["tableHelper", "virtualScreens", "assignVirtualScreenService", "players", "confirmModalService"]; angular.module("teleds.players") .component("playerVurtualScreenArea", component()); function component() { return { restrict: "EA", bindings: { player: '<' }, templateUrl: 'players/components/playerVirtualScreenArea/playerVirtualScreenArea.html', controller: Controller, controllerAs: 'vm' }; } function Controller(tableHelper, virtualScreens, assignVirtualScreenService, players,confirmModalService) { "ngInject"; var vm = this; var options = tableHelper.getOptionsForAngularWayTable([true, true, true]); options.dtOptions.withOption("scrollY", '291px'); options.dtOptions.withOption("bScrollCollapse", true); vm.dtOptions = options.dtOptions; vm.dtColumnDefs = options.dtColumnDefs; update(); vm.attachVirtualScreen = function () { assignVirtualScreenService.showAssignVirtualScreenModal([vm.player.id]).then(function (virtualScreenId) { vm.player.virtual_screen_id = virtualScreenId; update(); }); }; vm.detachVirtualScreen = function () { confirmModalService.show("blocks.ConfirmActionModalHint",function () { return players.update(vm.player).finally(function () { vm.player.virtual_screen_id = null; update(); }); }); }; function update() { if (vm.player.virtual_screen_id) { virtualScreens.get(vm.player.virtual_screen_id).then(function (virtualScreen) { vm.virtualScreen = virtualScreen; }); virtualScreens.getAreas(vm.player.virtual_screen_id).then(function (areas) { var campaigns = {}; areas.forEach(function (area) { area.campaigns.forEach(function (campaign) { if (!campaigns[campaign.id]) { campaigns[campaign.id] = campaign; campaign.area = area; } }) }); vm.campaigns = Array.fromObject(campaigns); }); } else { vm.virtualScreen = null; vm.campaigns = []; } } } }) (); /** * Created by denak on 17.05.2016. */ (function () { angular.module("teleds.blocks").component("playerStatus", component()); function component() { return { bindings: { date: "<" }, template: '{{"players.Inactive"|i18n}}' + '{{"players.Active"|i18n}}', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("playerStatusText", componentText()); function componentText() { return { bindings: { date: "<" }, template: '{{"players.Inactive"|i18n}}' + '{{"players.Active"|i18n}}', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = []; function Controller() { var vm = this; vm.active = false; if (vm.date && vm.date !== "null") { var now = moment(); var lastActivity = moment.utc(vm.date).local(); vm.active = now.diff(lastActivity, 'minute') < 5; } else { vm.active = false; } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.players") .controller('removePlayerController', controller) controller.$inject = ['$uibModalInstance', 'selectedPlayers','players','$q','errorHandlerHelper']; function controller($uibModalInstance, selectedPlayers,players,$q,errorHandlerHelper) { var vm = this; vm.generatedCode = Math.floor(Math.random() * 9000) + 1000; vm.onePlayer =selectedPlayers.length==1; vm.remove = function (form) { vm.submitted = true; if (form.$valid) { var promises =[]; angular.forEach(selectedPlayers,function (item) { promises.push(players.removePlayer(item)); }); $q.all(promises).then(function () { $uibModalInstance.close(); }).catch(function (result) { errorHandlerHelper.handleErrorResponse(result,form, vm); }) } } vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.players") .service('removePlayerService', service) service.$inject = ["$uibModal"]; function service($uibModal){ var self = this; self.showRemovePlayerModal = function (players) { var modalInstance = $uibModal.open({ templateUrl: 'players/components/removePlayerModal/removePlayerModal.html', controller: 'removePlayerController as vm', windowClass:'remove-player-modal', resolve: { selectedPlayers: function () { return players; } } }); return modalInstance.result; } } })(); /** * Created by denak on 11.05.2016. */ (function () { Controller.$inject = ["statistics", "$q", "$timeout", "$element", "locale"]; angular.module("teleds.players") .component("playerStatChart", component()); function component() { return { restrict: "EA", bindings: { playerId: '@', startDate: "@", requestId: "@", endDate: "@", chartHeight: '@', onSetLoadingPromise: '&' }, templateUrl: 'players/components/playerStatChart/playerStatChart.html', controller: Controller, controllerAs: 'vm' }; } var cacheDates = {}; var countDatesInCache = 0; function Controller(statistics, $q, $timeout, $element,locale) { "ngInject"; var vm = this; var viewsWord ='Views'; locale.ready('players').then(function () { viewsWord = locale.getString('players.ChartViewsTooltip'); }); vm.data = { labels: [], datasets: [ { yAxisID: "y-axis-1", borderWidth: 1, pointHoverRadius: 4, pointRadius: 2, fill: false, borderColor: "rgb(46, 184, 46)", pointHoverBackgroundColor: "rgb(46, 184, 46)", data: [] }, { yAxisID: "y-axis-2", backgroundColor: 'rgba(153, 153, 153,0.3)', borderColor: 'rgba(153, 153, 153,0.7)', lineTension: 0, pointRadius: 0, borderWidth: 2, pointHoverRadius: 0, data: [] }, { yAxisID: "y-axis-2", lineTension: 0, backgroundColor: 'rgba(26, 117, 255,0.3)', borderColor: 'rgba(26, 117, 255,0.7)', pointRadius: 0, pointHoverRadius: 0, borderWidth: 2, data: [] }] }; vm.options = { maintainAspectRatio: false, animation: false, responsive: true, borderJoinStyle: 'miter', legend: { display: false }, scales: { xAxes: [{ display: false, type: "time", time: { parser: val } }], yAxes: [ { display: false, position: "left", id: "y-axis-1", ticks: { min: 0 } }, { display: false, position: "right", id: "y-axis-2", gridLines: { drawOnChartArea: false }, ticks: { min: 0, max: 1.15, step: 1 } } ] }, tooltips: { enabled: false, mode: 'index', position: 'nearest', custom: function (tooltip) { // Tooltip Element var tooltipEl = document.getElementById('chartjs-tooltip'); if (!tooltipEl) { tooltipEl = document.createElement('div'); tooltipEl.id = 'chartjs-tooltip'; tooltipEl.innerHTML = "
"; document.body.appendChild(tooltipEl); } // Hide if no tooltip if (tooltip.opacity === 0) { tooltipEl.style.opacity = 0; return; } // Set caret Position tooltipEl.classList.remove('above', 'below', 'no-transform'); if (tooltip.yAlign) { tooltipEl.classList.add(tooltip.yAlign); } else { tooltipEl.classList.add('no-transform'); } function getBody(bodyItem) { return bodyItem.lines; } // Set Text if (tooltip.body) { var titleLines = tooltip.title || []; var bodyLines = tooltip.body.map(getBody); var innerHtml = ''; titleLines.forEach(function (title) { innerHtml += '' + val(title).format('DD.MM.YYYY HH:mm') + ''; }); innerHtml += ''; /* bodyLines.forEach(function (body, i) { var span = ''; innerHtml += '' + span + body + ''; });*/ innerHtml += '' + viewsWord + ''+bodyLines[0][0]+''+''; innerHtml += ''; var tableRoot = tooltipEl.querySelector('table'); tableRoot.innerHTML = innerHtml; } var position = this._chart.canvas.getBoundingClientRect(); // Display, position, and set styles for font tooltipEl.style.opacity = 1; tooltipEl.style.left = position.left + tooltip.caretX + 'px'; tooltipEl.style.top = position.top + tooltip.caretY -'58'+ 'px' ; tooltipEl.style.fontFamily = tooltip._fontFamily; tooltipEl.style.fontSize = tooltip.fontSize; tooltipEl.style.fontStyle = tooltip._fontStyle; tooltipEl.style.padding = tooltip.yPadding + 'px ' + tooltip.xPadding + 'px'; } } }; if (isEmpty(vm.chartHeight)) { vm.chartHeight = '30'; } vm.chartHeight += 'px'; var promise = statistics.getRequestStatsForPlayers(vm.requestId, vm.playerId).then(function (stat) { var ctx = $element.find(".player-stat_canvas"); var views; var monitor; var connect; if (vm.startDate) { var day = moment.utc(vm.startDate).local().format('MMDD'); views = prepareArray(stat.view[day]); monitor = prepareArrayForStepChart(prepareArray(stat.monitor[day])); connect = prepareArrayForStepChart(prepareArray(stat.connect[day])); } else { views = prepareArray(stat.view); monitor = prepareArrayForStepChart(prepareArray(stat.monitor)); connect = prepareArrayForStepChart(prepareArray(stat.connect)); } vm.data.datasets[0].data = views; vm.data.datasets[1].data = monitor; vm.data.datasets[2].data = connect; var myChart = new Chart(ctx, { type: 'line', data: vm.data, options: vm.options } ); }); if (vm.onSetLoadingPromise) { vm.onSetLoadingPromise({promise: promise}); } function prepareArrayForStepChart(array) { return array.reduce(function (previousValue, currentValue) { if (previousValue.length > 0) { var lastPoint = previousValue[previousValue.length - 1]; if (lastPoint.y != currentValue.y) { return previousValue.concat([{x: lastPoint.x, y: currentValue.y}, currentValue]); } else { return previousValue.concat([currentValue]); } } else { return previousValue.concat([currentValue]); } }, []); } function prepareArray(array) { return array.map(function (item) { return {y: item.value, x: parseInt(item.time)} }) } vm.onClick = function (points, evt) { console.log(points, evt); }; function val(value) { var data = cacheDates[value]; if (!data) { data = moment.unix(value); cacheDates[value] = data; countDatesInCache++; if (countDatesInCache > 2000) { cacheDates = {}; } } else { } return data; } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.players") .controller('setPositionModalController', controller) controller.$inject = ["$scope", '$uibModalInstance', 'position']; function controller($scope, $uibModalInstance, position) { var vm = this; vm.show = true; vm.position = { id: Date.now(), coords: { latitude: 55.747, longitude: 37.626 } }; vm.map = { center: { latitude: 55.747, longitude: 37.626 }, markers: [], events: { click: function (map, eventName, originalEventArgs) { $scope.$apply(function () { var e = originalEventArgs[0]; var lat = e.latLng.lat(), lon = e.latLng.lng(); setPosition({latitude: lat, longitude: lon}, false); }); } }, zoom: 11 }; if (position.latitude) { setPosition(position, true) } vm.save = function (form) { if (form.$valid) { $uibModalInstance.close(vm.position.coords); vm.show = false; } }; function setPosition(position, center) { vm.position.coords.latitude = position.latitude; vm.position.coords.longitude = position.longitude; if (center) { vm.map.center.latitude = position.latitude; vm.map.center.longitude = position.longitude; } } vm.geolocationAvailable = navigator.geolocation ? true : false; vm.findMe = function () { if (vm.geolocationAvailable) { navigator.geolocation.getCurrentPosition(function (position) { setPosition(position.coords, true) $scope.$apply(); }, function () { }); } }; var events = { places_changed: function (searchBox) { var place = searchBox.getPlaces(); if (!place || place == 'undefined' || place.length == 0) { console.log('no place data :('); return; } setPosition({ latitude: place[0].geometry.location.lat(), longitude: place[0].geometry.location.lng() }, true); } }; vm.searchbox = {template: 'searchbox.tpl.html', events: events}; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.players") .service('setPositionModalService', service) service.$inject = ["$uibModal"]; function service($uibModal){ var self = this; self.showSetPositionModal = function (position) { var modalInstance = $uibModal.open({ templateUrl: 'players/components/setPositionModal/setPositionModal.html', controller: 'setPositionModalController as vm', windowClass:"scroll-modal", resolve: { position: function () { return position; } } }); return modalInstance.result; } } })(); /** * Created by denak on 11.05.2016. */ (function () { config.$inject = ["$stateProvider"]; controller.$inject = ["players", "$state", "$stateParams", "removeModalService", "player", "setPositionModalService", "showPositionService", "editService", "controlTargetingModalService", "timeTargeting", "backService"]; angular.module("teleds.players").config(config); function config($stateProvider) { $stateProvider .state('personalAccount.player.one', { url: '/one/{id}', templateUrl: 'players/pages/player/player.html', controller: 'PlayerController', controllerAs: "vm", resolve: { player: ["players", "$stateParams", function (players, $stateParams) { return players.get($stateParams.id); }] } }) } angular.module("teleds.players") .controller("PlayerController", controller); function controller(players, $state, $stateParams, removeModalService, player, setPositionModalService, showPositionService, editService, controlTargetingModalService, timeTargeting,backService) { "ngInject"; var vm = this; if (!player.tags) { player.tags = []; } vm.model = player; vm.model.screen_flip = vm.model.screen_flip == 1; Object.defineProperty(vm.model, "bright", { get: function () { if (!this._tempBright) { this._tempBright = { autobright: this.autobright, brightDay: this.bright_day, brightNight: this.bright_night }; } return this._tempBright; }, set: function (val) { this.autobright = val.autobright; this.bright_day = val.brightDay; this.bright_night = val.brightNight; this._tempBright = val; } }); Object.defineProperty(vm.model, "enablePowerLoss", { get: function () { var val = this.autooff_by_discharging_time_active == 1; if (!val) { this.off_power_loss = ""; } return val; }, set: function (val) { this.autooff_by_discharging_time_active = val ? 1 : 0; if (!this.autooff_by_discharging_time_active) { this.off_power_loss = ""; } else { this.off_power_loss = 5; } } }); Object.defineProperty(vm.model, "enableMinCharge", { get: function () { var val = this.autooff_by_battery_level_active == 1; if (!val) { this.off_charge_percent = ""; } return val; }, set: function (val) { this.autooff_by_battery_level_active = val ? 1 : 0; if (!this.autooff_by_battery_level_active) { this.off_charge_percent = ""; } else { this.off_charge_percent = 5; } } }); vm.editModel = editService.getEditModelForRestAngularModel(vm); vm.onChange = function (obj) { vm.model = obj.value; }; vm.onSave = function () { return players.update(vm.model).then(function () { updateRelay(1); updateRelay(2); }); }; vm.update = function () { return players.update(vm.model); }; vm.changePosition = function () { vm.backup_gps_lat = angular.copy(vm.editModel.value.gps_lat); vm.backup_gps_long = angular.copy(vm.editModel.value.gps_long); setPositionModalService.showSetPositionModal({ latitude: vm.editModel.value.gps_lat, longitude: vm.editModel.value.gps_long }).then(function (position) { vm.editModel.value.gps_lat = position.latitude; vm.editModel.value.gps_long = position.longitude; }).catch(function () { vm.editModel.value.gps_lat = vm.backup_gps_lat; vm.editModel.value.gps_long = vm.backup_gps_long; }); }; vm.showControlRelay = function (i) { controlTargetingModalService.showControlTargetingModal(vm.editModel.value['time_targeting_relay_' + i + '_id']).then( function (id) { vm.editModel.value['time_targeting_relay_' + i + '_id'] = id; updateRelay(i, true); } ); }; vm.showPosition = function () { showPositionService.show({ latitude: vm.model.gps_lat, longitude: vm.model.gps_long }, vm.model.name) }; vm.remove = function () { removeModalService.showRemoveModal([$stateParams.id], "players").then(function () { vm.back(); }); }; vm.back = function () { backService.back('personalAccount.player.list'); }; updateRelay(1); updateRelay(2); function updateRelay(number, useEdit) { var id = null; if (useEdit) { id = vm.editModel.value['time_targeting_relay_' + number + '_id']; } else { id = vm.model['time_targeting_relay_' + number + '_id']; } if (id&&id!='') { timeTargeting.getTimeTargeting(id).then(function (targeting) { var content = angular.fromJson(targeting.content); vm['relay' + number + '_enabled'] = content.some(function (item) { return item.length != 0; }); }) } else { vm['relay' + number + '_enabled'] = false; } } } })(); /** * Created by denak on 13.04.2016. */ (function () { controller.$inject = ["tableHelper", "statistics", "players"]; angular.module("teleds.players") .controller("DevLastPlayEventsController", controller); function controller(tableHelper, statistics,players) { var vm = this; var options = tableHelper.getOptionsForAngularWayTable([false,false]); vm.dtOptions = options.dtOptions; vm.dtColumnDefs = options.dtColumnDefs; var param={}; param['page[offset]'] = 0; param['page[limit]'] = 500; players.getPlayers(param).then(function (result) { vm.players =result.data; }); vm.startDate = moment().add('days',-2); vm.endDate = moment(); vm.apply = function () { vm.param ={player_id: vm.playerId}; if(vm.startDate) { vm.param.start_timestamp =moment.utc(vm.startDate).format("YYYY-MM-DD HH:mm:ss"); } if(vm.endDate) { vm.param.end_timestamp =moment.utc(vm.endDate).format("YYYY-MM-DD HH:mm:ss"); } statistics.getStatsPlayedContent(vm.param).then(function (result) { vm.events = result; }); } } })(); /** * Created by denak on 13.04.2016. */ (function () { controller.$inject = ["$q", "players", "errorHandlerHelper", "tagsService", "Qualities", "campaigns", "setPositionModalService", "$state", "moment", "controlTargetingModalService", "confirmModalService", "billingService", "changeSubscriptionModal", "locale"]; angular.module("teleds.players") .controller("CreateNewPlayerController", controller); function controller($q, players, errorHandlerHelper, tagsService, Qualities, campaigns, setPositionModalService, $state, moment, controlTargetingModalService, confirmModalService, billingService, changeSubscriptionModal, locale) { "ngInject"; var vm = this; vm.submitted = false; vm.close = function () { if (vm.playerCreated) { confirmModalService.show("players.ConfirmBackFromWizards", null, 'info', null).then(function () { $state.go("personalAccount.player.list") } ); } else { $state.go("personalAccount.player.list") } }; vm.locale = locale.getLocale() == 'ru' ? "ru/" : ''; var selectWhiteOption = { dropdownCssClass: "form-white" }; vm.checkPlayer = function () { vm.submitted = true; if (vm.formCode.$valid) { return players.checkPlayer(vm.code.replace('-', '')).then(function (response) { vm.enterCode = true; return true }).catch(function (response) { if (response.status = 404) { vm.formCode.code.error = true; } errorHandlerHelper.handleErrorResponse(response, vm.formCode, vm); return false; }) } return false; }; updateBillingData(); function updateBillingData() { billingService.getLimits().then(function (limits) { vm.limits = limits; vm.allowFree = vm.limits.free.total > vm.limits.free.used; vm.allowPaid = vm.limits.paid.total > vm.limits.paid.used; vm.countFree = vm.limits.free.total - vm.limits.free.used; vm.countFree = vm.countFree < 0 ? 0 : vm.countFree; vm.countPaid = vm.limits.paid.total - vm.limits.paid.used; }); billingService.getSubscription().then(function (subscription) { vm.subscription = subscription; }).catch(function () { vm.subscription = { end_date: '' } }); } vm.controlSubscription = function () { changeSubscriptionModal.show(vm.limits.paid.total, vm.limits.paid.used, vm.subscription.end_date).then(function () { updateBillingData(); }) }; vm.activatePlayer = function (type) { if (type == 'free' && !vm.allowFree) { return; } else if (type == 'paid' && !vm.allowPaid) { return; } vm.submitted = true; if (vm.formCode.$valid) { return players.activatePlayer({code: vm.code.replace('-', ''), type: type}).then(function (response) { var id = response.id; return players.getPlayer(id).then(function (response) { vm.player = response; vm.player.gps_type = vm.player.gps_type == 'unknown' ? 'static' : vm.player.gps_type; if (vm.player.timezone == "Europe/Moskow") { vm.player.timezone = "Europe/Moscow"; } vm.player.position = {}; vm.player.position.latitude = 40.785091; vm.player.position.longitude = -73.968285; vm.player.gps_lat = vm.player.position.latitude; vm.player.gps_long = vm.player.position.longitude; vm.playerCreated = true; return true; }); }).catch(function (response) { errorHandlerHelper.handleErrorResponse(response, vm.formCode, vm); return false; }) } return false; }; /*player settings*/ vm.selectQualityOption = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; vm.player = { tags: [], name: '', gps_type: '', position: '', video_quality: '', max_bright: 100, min_bright: 0 }; vm.player.off_charge_percent = 0; vm.player.off_power_loss = 0; Object.defineProperty(vm.player, "enablePowerLoss", { get: function () { var val = this.autooff_by_discharging_time_active == 1; if (!val) { this.off_power_loss = ""; } return val; }, set: function (val) { this.autooff_by_discharging_time_active = val ? 1 : 0; if (!this.autooff_by_discharging_time_active) { this.off_power_loss = ""; } else { this.off_power_loss = 5; } } }); Object.defineProperty(vm.player, "enableMinCharge", { get: function () { var val = this.autooff_by_battery_level_active == 1; if (!val) { this.off_charge_percent = ""; } return val; }, set: function (val) { this.autooff_by_battery_level_active = val ? 1 : 0; if (!this.autooff_by_battery_level_active) { this.off_charge_percent = ""; } else { this.off_charge_percent = 5; } } }); Object.defineProperty(vm.player, "bright", { get: function () { if (!this._tempBright) { this._tempBright = { autobright: this.autobright, brightDay: this.bright_day, brightNight: this.bright_night }; } return this._tempBright; }, set: function (val) { this.autobright = val.autobright; this.bright_day = val.brightDay; this.bright_night = val.brightNight; this._tempBright = val; } }); tagsService.getPlayersTags().then(function (result) { vm.playersTags = result; }); vm.qualities = Qualities; vm.updatePlayer = function () { vm.submitted = true; return players.updatePlayer(vm.player).then(function (response) { return true; }).catch(function (response) { return true; }); }; vm.createTag = function (value) { var promise = tagsService.addPlayerTag(value); promise.then(function (result) { vm.playersTags.push(result); vm.player.tags.push(result); }); return promise; }; vm.showSetPositionModal = function () { setPositionModalService.showSetPositionModal(vm.player.position).then(function (position) { vm.player.position = position; vm.player.gps_lat = vm.player.position.latitude; vm.player.gps_long = vm.player.position.longitude; }); }; vm.showControlRelay = function (i) { var id = vm.player['time_targeting_relay_' + i + '_id']; controlTargetingModalService.showControlTargetingModal(id).then( function (id) { vm.player['time_targeting_relay_' + i + '_id'] = id; } ); }; vm.onFinishSlider = function (from, to) { vm.player.max_bright = to; vm.player.min_bright = from; }; vm.onFinishNightSlider = function (from, to) { if (to > vm.player.max_bright) { to = vm.player.max_bright; } vm.player.max_bright_night = to; vm.player.min_bright_night = from; }; /*select campaign*/ vm.selectCampaignOption = selectWhiteOption; vm.endAction = 'create'; var params = {limit: 500}; params["sort[created_at]"] = 'desc'; params['filter[status]'] = 'active'; campaigns.getList(params).then(function (result) { vm.campaigns = result.data; if (vm.campaigns.length > 0) { vm.campaignId = vm.campaigns[0].id; } }); vm.finish = function () { vm.loading = true; switch (vm.endAction) { case 'create': { var campaign = { name: "Campaign " + moment().format('DD.MM.YYYY HH:mm:ss'), tags: [], auto_duration: true, duration: 5, orientation: "landscape", start_timestamp: moment().utc().floor(24, 'hours').format(), end_timestamp: null, width: 1920, height: 1080, area_layout: [ { name: 'area1', x: 0, y: 0, width: 1920, height: 1080, opacity: 100, z_index: 1 } ] }; campaigns.add(campaign).then(function (result) { return players.attachCampaign(vm.player.id, result.id).then(function () { $state.go("personalAccount.campaign.one", {id: result.id}); }); }).catch(function (response) { vm.loading = false; }).finally(function () { vm.loading = false; }); break; } case 'select': { players.attachCampaign(vm.player.id, vm.campaignId).then(function () { if (vm.goToCampaign) { $state.go("personalAccount.campaign.one", {id: vm.campaignId}); } else { $state.go("personalAccount.player.list"); } }).finally(function () { vm.loading = false; }); break; } case 'none': { $state.go("personalAccount.player.list"); break; } } } } })(); /** * Created by denak on 13.04.2016. */ (function () { angular.module("teleds.players") .controller("PlayerTrackingController", controller); function controller() { var vm = this; } })(); /** * Created by denak on 13.04.2016. */ (function () { config.$inject = ["$stateProvider"]; controller.$inject = ["$state", "$stateParams", "players", "errorHandlerHelper"]; angular.module("teleds.players").config(config); function config($stateProvider) { $stateProvider .state('personalAccount.player.replaceCodePlayer', { url: '/replaceCodePlayer/{playerId}', templateUrl: 'players/pages/replaceCode/replaceCode.html', controller: controller, controllerAs: "vm" }) } function controller($state,$stateParams,players,errorHandlerHelper) { "ngInject" var vm = this; vm.submitted = false; vm.close = function () { $state.go("personalAccount.player.one",{id:$stateParams.playerId}) }; vm.replace = function () { vm.submitted = true; if (vm.formCode.$valid) { vm.loading =true; return players.replaceCode($stateParams.playerId,vm.code.replace('-', '')).then(function (response) { $state.go("personalAccount.player.one",{id:$stateParams.playerId}) }).catch(function (response) { errorHandlerHelper.handleErrorResponse(response, vm.formCode, vm); return false; }).finally(function () { vm.loading =false; }) } return false; }; } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.user") .controller('ChangePasswordModalController', controller) controller.$inject = ['$uibModalInstance','user', 'errorHandlerHelper']; function controller($uibModalInstance,user, errorHandlerHelper) { var vm = this; vm.save = function (form) { vm.submitted = true; if (form.$valid) { vm.loading = true; user.changePassword(vm.model) .then(function () { $uibModalInstance.close(vm.selected); }) .catch(function (response) { errorHandlerHelper.handleErrorResponse(response, form, vm); }) .finally(function () { vm.loading = false; }); } }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.user") .service('changePasswordModalService', service) service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (id,name) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'user/components/changePasswordModal/changePasswordModal.html', controller: 'ChangePasswordModalController as vm', }); return modalInstance.result; } } })(); /** * Created by denak on 17.05.2016. */ (function () { angular.module("teleds.virtualScreens").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.virtualScreen.add', { url: '/add', templateUrl: 'virtualScreens/pages/addVirtualScreen/addVirtualScreen.html', controller: Controller, controllerAs: "vm" }) } Controller.$inject = ["$state", "errorHandlerHelper", "TypeScreenVirtualScreen", "AudioPriority", "virtualScreens"]; function Controller($state, errorHandlerHelper, TypeScreenVirtualScreen, AudioPriority, virtualScreens) { var vm = this; vm.typeScreenVirtualScreen = TypeScreenVirtualScreen; vm.audioPriority = AudioPriority.filter(function (item) { return item.name != "widgets"; }); vm.model = { audio_priority: AudioPriority[0].name, type: "shared", type_areas: TypeScreenVirtualScreen[0].name, set typeScreen(val) { switch (val) { case "video_widget": { vm.audioPriority = AudioPriority; break; } default: { vm.audioPriority = AudioPriority.filter(function (item) { return item.name != "widgets"; }); break; } } this.type_areas = val; }, get typeScreen() { return this.type_areas; } }; vm.add = function () { vm.submitted = true; if (vm.form.$valid) { vm.loading = true; virtualScreens.add(vm.model).then(function (result) { $state.go("personalAccount.virtualScreen.one", {id: result.id}); }).catch(function (response) { errorHandlerHelper.handleErrorResponse(response, vm.form, vm); }).finally(function () { vm.loading = false; }); } }; vm.onChange = function (file) { vm.content.file = file; }; vm.close = function () { $state.go('personalAccount.virtualScreen.list') }; vm.selectAudioPriority = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; } })(); /** * Created by denak on 17.05.2016. */ (function () { angular.module("teleds.virtualScreens").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.virtualScreen', { url: '/virtualScreen', abstract: true, template:'
' }) .state('personalAccount.virtualScreen.list', { url: '/list', templateUrl: 'virtualScreens/pages/virtualScreens/virtualScreens.html', controller: Controller, controllerAs: "vm" }) } Controller.$inject = ['DTColumnBuilder', 'virtualScreens', 'notificationService', 'moment', '$state', 'attachPlayerModalService', 'removeModalService']; function Controller(DTColumnBuilder, virtualScreens, notificationService, moment, $state, attachPlayerModalService, removeModalService) { var vm = this; vm.option = { name: "", dateStart: "", dateEnd: "" }; vm.columns = [ { type: 'date', name: 'created_at' }, { type: 'name', name: 'name', align:"left", title:"common.Name", width:"40%", cellClass:"name-cell" }, { type:"number", name:"players_count", title: "common.PlayersCount" }, { type: 'custom', name: 'null', notSort:true, render: function (data, full) { var control_row = '
' + ' ' + '' + '
'; return control_row; } } ]; var limits = 0; vm.actionCallback = function (action, id) { switch (action) { case "info": { vm.goToOne(id); break; } case "remove": { removeModalService.showRemoveModal([id], "virtualScreens").then(function () { vm.instance.reloadData(false); }); break; } case 'doubleClick': { vm.goToOne(id); break; } case 'clickName': { vm.goToOne(id); break; } case 'attachPlayer': { attachPlayerModalService.show(id.id, id.name).then(function () { vm.instance.reloadData(false); }); } } }; vm.goToOne = function (id) { $state.go('personalAccount.virtualScreen.one', {id: id}) }; var first = true; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { var param = {}; param['filter[type]'] = "shared"; if (vm.option.name) { param['filter[name]'] = vm.option.name; } var order = aoData[2].value; if (order.length > 0) { var columnIndex = order[0].column; var dir = order[0].dir; var nameParam = 'sort[' + aoData[1].value[columnIndex].data + ']'; param[nameParam] = dir; } param['page[offset]'] = aoData[3].value; param['page[limit]'] = aoData[4].value; limits = param['page[limit]']; return virtualScreens.getList(param).then(function (result) { fnCallback(result); }).catch(function (result) { notificationService.showWarning('common.FailedGet'); fnCallback(result); }); }; vm.intanceCallback = function (instance) { vm.instance = instance; }; vm.onReset = function () { vm.option.name = ""; vm.option.dateStart = ""; vm.option.dateEnd = ""; vm.instance.reloadData(true); }; vm.onApply = function (option) { vm.option.name = option.name; vm.option.dateStart = option.dateStart; vm.option.dateEnd = option.dateEnd; vm.instance.reloadData(true); }; vm.onSelected = function (ids, all) { vm.selectedIds = ids; vm.all = all; }; vm.removePlayers = function () { removeModalService.showRemoveModal(vm.selectedIds, "virtualScreens").then(function () { vm.instance.reloadData(vm.all,function () { vm.unselect = false; vm.selectAll = false; }); }); }; vm.reload =function () { vm.instance.reloadData(false); } } })(); /** * Created by denak on 17.05.2016. */ (function () { config.$inject = ["$stateProvider"]; Controller.$inject = ["$state", "errorHandlerHelper", "TypeScreenVirtualScreen", "AudioPriority", "virtualScreens", "virtualScreen", "removeModalService", "editService"]; angular.module("teleds.virtualScreens").config(config); function config($stateProvider) { $stateProvider .state('personalAccount.virtualScreen.one', { url: '/one/{id}', templateUrl: 'virtualScreens/pages/virtualScreen/virtualScreen.html', controller: Controller, controllerAs: "vm", resolve: { virtualScreen: ["virtualScreens", "$stateParams", function (virtualScreens, $stateParams) { return virtualScreens.get($stateParams.id); }] } }) } function Controller($state, errorHandlerHelper, TypeScreenVirtualScreen, AudioPriority, virtualScreens, virtualScreen, removeModalService, editService) { var vm = this; vm.typeScreenVirtualScreen = TypeScreenVirtualScreen; vm.model = virtualScreen; vm.editModel = editService.getEditModelForRestAngularModel(vm); vm.onChange = function (obj) { vm.model = obj.value; }; vm.onSave = function () { return virtualScreens.update(vm.model); }; Object.defineProperty(vm.model, "audioPriority", { get : function() { var sort = this.areas.sort(compareAreasAudioPriority); if (sort[0].type == 'audio') { return 'audio'; } else { return 'fullscreen'; } }, set :function(val){ switch (val) { case 'audio': { this.areas.forEach(function (item) { item.audio_priority = 0; }); var item = getByType(this.areas,'audio'); item.audio_priority = 5; break; } case 'fullscreen': { this.areas.forEach(function (item) { item.audio_priority = 0; }); var item = getByType(this.areas,'fullscreen'); item.audio_priority = 5; break; } } this._audioPriority=val; } }); function compareAreasAudioPriority(a, b) { return b.audio_priority- a.audio_priority; } function getByType(items,type) { return items.find(function (item) { return type == item.type || (type == "video" && item.type == 'fullscreen'); }); } vm.update = function () { return virtualScreens.update(vm.model); }; vm.remove = function () { removeModalService.showRemoveModal([vm.model.id], "virtualScreens").then(function () { $state.go("personalAccount.virtualScreen.list") }); }; vm.back = function () { $state.go('personalAccount.virtualScreen.list') }; } })(); /** * Created by denak on 15.04.2016. */ (function () { Controller.$inject = ["virtualScreens", "attachPlaylistModal", "campaigns", "$q", "confirmModalService", "$filter", "locale"]; angular.module("teleds.virtualScreens") .component("areas", component()); function component() { return { restrict: "EA", bindings: { virtualScreen: '<' }, transclude: true, templateUrl: 'virtualScreens/components/areas/areas.html', controller: Controller, controllerAs: 'vm' }; } function Controller(virtualScreens, attachPlaylistModal, campaigns, $q, confirmModalService, $filter, locale) { "ngInject"; var vm = this; Update(); vm.detach = function () { locale.ready('virtualScreens').then(function () { var key = 'virtualScreens.DetachPlaylist' + (vm.selectedIds.length > 1 ? "s" : ""); confirmModalService.show(key, function () { vm.removing = true; var promises = []; vm.selectedIds.forEach(function (campaignId) { var campaign = vm.allCampaigns.find(function (campaign) { return campaign.id == campaignId; }); if (campaign) { promises.push(campaigns.detachAreas(campaign.idOrigin, [campaign.area.id])) } }); return $q.all(promises).then(function () { Update(); }).finally(function () { vm.removing = false; }) }, null,{ virtualScreen: vm.virtualScreen.name }); }); }; vm.attach = function () { vm.promise.then(function (areas) { return attachPlaylistModal.show(vm.virtualScreen.id, vm.virtualScreen.name, areas); }).then(function () { Update(); }); }; vm.selected = {}; vm.selectAll = false; vm.selectedIds = []; vm.isSelectAny = function () { if (vm.selectAll) { return true; } for (var p in vm.selected) { if (vm.selected[p] == true) { return true; } } return false; }; function Update() { vm.promise = virtualScreens.getAreas(vm.virtualScreen.id); vm.promise.then(function (areas) { var counter = 0; var result = []; vm.allCampaigns = []; areas.forEach(function (area, i) { var campaigns = area.campaigns.map(function (campaign) { campaign = angular.copy(campaign); campaign.idOrigin = campaign.id; campaign.id = campaign.id + area.id; campaign.child = true; campaign.show = true; campaign.area = area; return campaign; }); area.isOpen = true; area.show = true; vm.allCampaigns = vm.allCampaigns.concat(campaigns); result.push(area); result = result.concat(campaigns); }); result.forEach(function (item) { vm.selected[item.id] = false; }); vm.areas = result; return areas; }); } vm.toggleAll = toggleAll; vm.toggleOne = toggleOne; vm.toggleArea = toggleArea; function toggleArea(area) { area.campaigns.forEach(function (item) { item.show = !item.show; }) } function toggleAll(selectAll, selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { selectedItems[id] = selectAll; } } onSelected(); } function toggleOne(selectedItems, area) { if (!area.child) { area.campaigns.forEach(function (item) { selectedItems[item.id] = selectedItems[area.id] }) } for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { if (!selectedItems[id]) { vm.selectAll = false; onSelected(); return; } } } vm.selectAll = true; onSelected(); } function onSelected() { var selected = []; var all = true; for (var id in vm.selected) { if (vm.selected[id]) { selected.push(id); } else { all = false; } } vm.selectedIds = selected; } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.virtualScreens") .component("attachPlayer", component()); function component() { return { restrict: "EA", bindings: { virtualScreenId: '@', name: "@nameVirtualScreen", onChange: "&" }, transclude: true, templateUrl: 'virtualScreens/components/attachPlayer/attachPlayer.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['players']; function Controller(players) { var vm = this; vm.checked = true; vm.unChecked = false; vm.selected = {}; vm.model = { param: { "filter[name]": "", "page[limit]": 100, "page[offset]": 0 }, isInit: false, open: false, get name() { return this.param["filter[name]"]; }, set name(val) { this.param["filter[name]"] = val; update(); } }; update(); function update() { vm.loading = true; vm.selectAll = false; var param = angular.copy(vm.model.param); if (vm.model.name.length == "") { delete param["filter[name]"]; } vm.promise=players.getList(param).then(function (result) { for (var p in vm.selected) { delete vm.selected[p]; } vm.existFree = false; result.data.forEach(function (item) { if (!(item.virtual_screen_id && item.virtual_screen_id != '')) { vm.existFree = true; item.notAttach = true; vm.selected[item.id] = false; } else if (item.virtual_screen_id != vm.virtualScreenId) { item.attachToOther = true; } else { item.attachToCurrent = true; } }); vm.players = result.data; vm.loading = false; }).catch(function () { vm.loading = false; }); } vm.isSelectAny = function () { if (vm.selectAll) { return true; } for (var p in vm.selected) { if (vm.selected[p] == true) { return true; } } return false; }; vm.toggleAll = toggleAll; vm.toggleOne = toggleOne; function toggleAll(selectAll, selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { selectedItems[id] = selectAll; } } onSelected(); } function toggleOne(selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { if (!selectedItems[id]) { vm.selectAll = false; onSelected(); return; } } } vm.selectAll = true; onSelected(); } function onSelected() { var selected = []; var all = true; for (var id in vm.selected) { if (vm.selected[id]) { selected.push(id); } else { all = false; } } vm.onChange({value: selected}); } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.virtualScreens") .component("attachedPlayersOld", component()); function component() { return { restrict: "EA", bindings: { virtualScreen: '<' }, transclude: true, templateUrl: 'virtualScreens/components/attachedPlayers/attachedPlayers.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['virtualScreens', 'confirmModalService', 'players', '$q', 'attachPlayerModalService']; function Controller(virtualScreens, confirmModalService, players, $q, attachPlayerModalService) { var vm = this; vm.promise=virtualScreens.getPlayers(vm.virtualScreen.id).then(function (result) { result.forEach(function (item) { vm.selected[item.id] = false; }); vm.players = result; }); vm.detach = function () { vm.removing = true; var copyIds = angular.copy(vm.selectedIds); confirmModalService.show("blocks.ConfirmActionModalHint").then(function () { var promises = []; angular.forEach(copyIds, function (item) { var promise = players.get(item).then(function (result) { result.virtual_screen_id = null; return players.update(result); }); promises.push(promise); }); vm.promise =$q.all(promises).then(function () { vm.removing = false; angular.forEach(copyIds, function (id) { var player = vm.players.find(function (item) { return item.id === id; }); if (player) { delete vm.selected[id]; vm.players.splice(vm.players.indexOf(player), 1); } }); vm.selectAll = false; vm.selectedIds = []; }).catch(function (result) { vm.removing = false; }) } ).catch(function () { vm.removing = false; }); }; vm.attach = function () { vm.attaching = true; attachPlayerModalService.show(vm.virtualScreen.id, vm.virtualScreen.name).then(function (result) { var promises = []; result.forEach(function (id) { promises.push(players.get(id)) }); vm.promise = $q.all(promises).then(function (result) { result.forEach(function (item) { vm.players.push(item); vm.selected[item.id] = false; }); vm.attaching = false; }); }).catch(function () { vm.attaching = false; }); }; vm.selected = {}; vm.selectAll = false; vm.selectedIds = []; vm.isSelectAny = function () { if (vm.selectAll) { return true; } for (var p in vm.selected) { if (vm.selected[p] == true) { return true; } } return false; }; vm.toggleAll = toggleAll; vm.toggleOne = toggleOne; function toggleAll(selectAll, selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { selectedItems[id] = selectAll; } } onSelected(); } function toggleOne(selectedItems) { for (var id in selectedItems) { if (selectedItems.hasOwnProperty(id)) { if (!selectedItems[id]) { vm.selectAll = false; onSelected(); return; } } } vm.selectAll = true; onSelected(); } function onSelected() { var selected = []; var all = true; for (var id in vm.selected) { if (vm.selected[id]) { selected.push(id); } else { all = false; } } vm.selectedIds = selected; } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.blocks") .controller('attachPlayerModalController', controller) controller.$inject = ['$uibModalInstance', 'id', 'name', 'virtualScreens', 'errorHandlerHelper']; function controller( $uibModalInstance, id, name, virtualScreens, errorHandlerHelper) { var vm = this; vm.id = id; vm.name = name; vm.save = function () { virtualScreens.attachPlayer(id, vm.selected).then(function () { $uibModalInstance.close( vm.selected); }); }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.05.2016. */ (function () { angular.module("teleds.blocks") .service('attachPlayerModalService', service) service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (id,name) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'virtualScreens/components/attachPlayerModal/attachPlayerModal.html', controller: 'attachPlayerModalController as vm', windowClass: 'control-modal', resolve: { id: function () { return id; }, name:function () { return name; } } }); return modalInstance.result; } } })(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.virtualScreens") .component("attachPlayerPopover", component()); function component() { return { restrict: "EA", bindings: { virtualScreenId: '@', position: "@" }, transclude: true, templateUrl: 'virtualScreens/components/attachPlayer/attachPlayer.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['players']; function Controller(players) { var vm = this; vm.positionPopover = vm.position == "" ? "bottom-right" : vm.position; vm.popover = { templateUrl: 'virtualScreens/components/attachPlayer/attachPlayerPopover.html' }; vm.model = { param: { "filter[name]": "", "page[limit]": 10, "page[offset]": 0 }, isInit: false, open: false, get isOpen() { return this.open; }, set isOpen(val) { if (val == true && !this.isInit) { init(); this.isInit = true; } this.open = val; }, get name() { return this.param["filter[name]"]; }, set name(val) { this.param["filter[name]"] = val; update(); } }; function init() { update(); } function update() { vm.loading =true; players.getList(vm.model.param).then(function (result) { vm.players = result.data; vm.loading =false; }) } } })(); /** * Created by denak on 19.07.2016. */ (function () { controller.$inject = ["$uibModalInstance", "id", "name", "areas", "campaigns"]; angular.module("teleds.blocks") .service('attachPlaylistModal', service); service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (id, name, areas) { var modalInstance = $uibModal.open({ templateUrl: 'virtualScreens/components/attachPlaylistModal/attachPlaylistModal.html', controller: controller, controllerAs: "vm", windowClass: 'control-modal', resolve: { id: function () { return id; }, name: function () { return name; }, areas: function () { return areas; } } }); return modalInstance.result; } } function controller($uibModalInstance, id, name, areas, campaigns) { "ngInject" var vm = this; vm.model = { _area: "", set area(val) { this._area = val; var area = areas.find(function (item) { return item.type == val; }); if (vm.allCampaigns) vm.campaigns = vm.allCampaigns.filter(function (campaign) { return area.campaigns.find(function (areaCampaign) { return areaCampaign.id == campaign.id; }) == null; }); if(val=='widget') { vm.campaigns = vm.campaigns.filter(function (campaign) { return campaign.existHtml; }); } if(vm.campaigns.length>0) { vm.model.campaignId =vm.campaigns[0].id; } }, get area() { return this._area; } }; vm.selectOption = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; vm.id = id; vm.name = name; vm.areas = areas; var param = {}; param["page[limit]"] = 500; param["page[offset]"] = 0; campaigns.getListForArea(param).then(function (result) { vm.allCampaigns = result.data; vm.model.area = areas[0].type; }); vm.save = function () { vm.loading=true; var area = areas.find(function (item) { return item.type == vm.model.area; }); campaigns.attachAreas(vm.model.campaignId,[area.id]).then(function () { $uibModalInstance.close(); }).finally(function () { vm.loading=false; }) }; vm.close = function () { $uibModalInstance.dismiss(); } }})(); /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.virtualScreens") .component("virtualScreensSearch", component()); function component() { return { restrict: "EA", bindings: { onApply: '&', onReset: '&', dateStart: " 0 && !vm.isFilter(); }; vm.isAnyFilter = function () { return vm.isFilter() || vm.name.length > 0; }; } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.blocks") .controller('controlOneItemController', controller) controller.$inject = ["$uibModal", "$scope", '$uibModalInstance', 'id', 'type', '$q', 'errorHandlerHelper', 'controlTag']; function controller($uibModal, $scope, $uibModalInstance, id, type, $q, errorHandlerHelper, controlTag) { var vm = this; vm.type = type; var currentControlTag = new controlTag(type); currentControlTag.getResource(id).then(function (result) { vm.resource = result; }); vm.save = function () { vm.loading=true; currentControlTag.updateResource(vm.resource).then(function () { vm.loading=false; $uibModalInstance.close(); }); }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.blocks") .controller('controlManyItemController', controller) controller.$inject = ["$uibModal", "$scope", '$uibModalInstance', 'selected', 'type', 'controlTag', '$q', 'errorHandlerHelper','confirmModalService']; function controller($uibModal, $scope, $uibModalInstance, selected, type, controlTag, $q, errorHandlerHelper,confirmModalService) { var vm = this; vm.tags=[]; vm.action="add"; vm.type = type; var currentControlTag = new controlTag(type); vm.save=function () { vm.loading =true; switch (vm.action) { case "add": { currentControlTag.add(selected,vm.tags).then(function () { vm.loading=false; $uibModalInstance.close(); }); break; } case "remove": { confirmModalService.show("blocks.ConfirmActionModalHint").then(function () { currentControlTag.remove(selected,vm.tags).then(function () { vm.loading=false; $uibModalInstance.close(); }) } ).catch(function () { vm.loading=false; $uibModalInstance.close(); }); break; } } } vm.close = function () { $uibModalInstance.dismiss(); }; } })(); (function () { Controller.$inject = ["dateHelper"]; angular.module("teleds.blocks").component("complexRangeDatepicker", component()); function component() { return { bindings: { startDate: "<", endDate: "<", maxRange: "<", onChange: "&", notSelected:"<", onReset: "&" }, templateUrl: 'blocks/components/date/complexRangeDatepicker/complexRangeDatepicker.html', controller: Controller, controllerAs: 'vm' }; } function Controller(dateHelper) { "ngInject"; var vm = this; vm.filterPopover = { templateUrl: 'blocks/components/date/complexRangeDatepicker/complexRangeDatepickerPopover.html' }; vm.model = { _period: "", customStartDate: null, customEndDate: null, set period(val) { this._period = val; switch (val) { case "today": { vm.endDate = moment().toDate(); vm.startDate = moment().add(-1, 'days').toDate(); break; } case "last3": { vm.startDate = moment().add(-3, 'days').toDate(); vm.endDate = moment().toDate(); break; } case "week": { vm.startDate = moment().add(-7, 'days').toDate(); vm.endDate = moment().toDate(); break; } case "month": { vm.startDate = moment().add(-1, 'month').toDate(); vm.endDate = moment().toDate(); break; } case "custom": { if (vm.maxRange) { var maxDate = moment(vm.startDate).add(vm.maxRange.val, vm.maxRange.type); if (moment(vm.endDate) > maxDate) { vm.endDate = maxDate.toDate(); this.customEndDate = maxDate.toDate(); } } break; } } if (val != 'custom') { this.customStartDate = null; this.customEndDate = null; } updateRangeDisplay(); vm.onChange({startDate: vm.startDate, endDate: vm.endDate}); }, get period() { return this._period; } }; function updateRangeDisplay() { vm.range = dateHelper.getRangeText(vm.startDate, vm.endDate); } vm.onChangeDatepicker = function (startDate, endDate) { vm.model.customStartDate = startDate; vm.model.customEndDate = endDate; vm.startDate = startDate; vm.endDate = endDate; vm.model.period = 'custom'; }; vm.reset = function () { vm.startDate = null; vm.endDate = null; vm.model.customStartDate = null; vm.model.customEndDate = null; vm.model.period = ''; vm.onReset(); }; this.$onChanges = function (changesObj) { if (changesObj.startDate) { if (!vm.startDate) { vm.model.customStartDate = vm.startDate; } } if (changesObj.endDate) { if (!vm.endDate) { vm.model.customEndDate = vm.endDate } } updateRangeDisplay(); } } })(); /** * Created by denak on 15.04.2016. */ /** * Created by denak on 07.04.2016. */ /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.blocks").component("datepicker", component()); function component() { return { bindings: { date: "<", onChange: "&" }, templateUrl: 'blocks/components/date/datepicker/datepicker.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("datepickerLight", componentLight()); function componentLight() { return { bindings: { date: "<", onChange: "&", options: "<" }, templateUrl: 'blocks/components/date/datepicker/datepickerLight.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$element','$scope']; function Controller($element,$scope) { var vm = this; var datePickerElem = $element.find('.input-daterange'); var dateField = datePickerElem.find('.date'); var options = { orientation: "bottom auto", container: ".page-content" }; if (vm.options) { angular.extend(options, vm.options); } var datepicker = datePickerElem.bootstrapDP(options); var disableEvent = false; datepicker.on('changeDate', function (e) { if (!disableEvent) { $scope.$apply(function () { var date = dateField.bootstrapDP('getDate'); vm.date = date; vm.onChange({value: date}); }); } }); datepicker.on('clearDate', function (e) { if (!disableEvent) { $scope.$apply(function () { var date = dateField.bootstrapDP('getDate'); vm.date = date; vm.onChange({value: date}); }); } }); this.$onChanges = function (changesObj) { if (changesObj.date) { disableEvent = true; if (vm.date && vm.date != "") { dateField.bootstrapDP('setDate', moment.utc(vm.date).toDate()); } else { dateField.bootstrapDP('clearDates'); } disableEvent = false; } }; } })(); (function () { Controller.$inject = ["$element", "locale", "$scope", "$timeout"]; angular.module("teleds.blocks").component("datetimepicker", component()); function component() { return { bindings: { date: "<", onChange: "&", emptyValue: "@", minDate: "<", maxDate: "<" }, templateUrl: 'blocks/components/date/datetimepicker/datetimepicker.html', controller: Controller, controllerAs: 'vm' }; } function Controller($element, locale, $scope, $timeout) { "ngInject" var vm = this; var dateField = $element.find('.date'); var locale = locale.getLocale(); var option = $.timepicker.regional[locale]; $.datepicker.setDefaults($.datepicker.regional[locale]); option = angular.extend({ onSelect: function (datetimeText, datepickerInstance) { if (!disableEvent) { $scope.$apply(function () { if (locale == 'ru') { vm.date = moment(datetimeText, "DD.MM.YYYY hh:mm"); } else { vm.date = moment(datetimeText, "MM/DD/YYYY hh:mm"); } if (vm.minDate && vm.date < moment(vm.minDate)) { vm.date = moment(vm.minDate); setDate(); } if (vm.maxDate && vm.date > moment(vm.maxDate)) { vm.date = moment(vm.maxDate); setDate(); } vm.onChange({value: vm.date.utc().format()}); }); } } }, option); var datepicker = dateField.datetimepicker(option); var disableEvent = false; dateField.change(function (ev) { if (isEmpty(this.value)) { $scope.$apply(function () { }); } if (ev.originalEvent) { var val = this.value; $scope.$apply(function () { if (locale == 'ru') { vm.date = moment(val, "DD.MM.YYYY hh:mm"); } else { vm.date = moment(val, "MM/DD/YYYY hh:mm"); } if (vm.minDate && vm.date < moment(vm.minDate)) { vm.date = moment(vm.minDate); setDate(); } if (vm.maxDate && vm.date > moment(vm.maxDate)) { vm.date = moment(vm.maxDate); setDate(); } vm.onChange({value: vm.date.utc().format()}); }); } }); function setDate() { disableEvent = true; if (vm.date && vm.date != "" && vm.date != "0000-00-00 00:00:00") { dateField.datepicker('setDate', moment.utc(vm.date).toDate()); } else { dateField.datepicker('setDate', null); if (vm.emptyValue) { dateField.val(vm.emptyValue) } } disableEvent = false; } this.$onChanges = function (changesObj) { if (changesObj.date) { setDate(); } if (changesObj.minDate) { if (vm.minDate) { if (!moment.isMoment(vm.minDate)) { vm.minDate = moment.utc(vm.minDate); } if (moment(vm.date) < moment(vm.minDate)) { vm.date = moment(vm.minDate); setDate(); vm.onChange({value: vm.date}); } } } if (changesObj.maxDate) { if (vm.maxDate) { if (!moment.isMoment(vm.maxDate)) { vm.maxDate = moment.utc(vm.maxDate); } if (moment(vm.date) > moment(vm.maxDate)) { vm.date = moment(vm.maxDate); setDate(); vm.onChange({value: vm.date}); } } } }; } })(); /** * Created by denak on 24.06.2016. */ (function () { service.$inject = ["locale"]; angular.module("teleds.blocks") .service('dateHelper', service); function service(locale) { "ngInject"; var now = ""; locale.ready("blocks").then(function () { now = locale.getString("blocks.Now"); }); return { getRangeText:getRangeText }; function getRangeText(startDate,endDate) { var range=""; if (startDate) { if (!endDate) { if (startDate.getTime() < moment().toDate().getTime()) { range = getMomentDateFormat(startDate) + " - " + now; } else { range = now + " - " + getMomentDateFormat(startDate); } } else { range = getMomentDateFormat(startDate) + " - " + getMomentDateFormat(endDate); } } else { range = ""; } return range; } function getMomentDateFormat(date) { return moment(date).format("DD.MM.YYYY"); } } })(); /** * Created by denak on 15.04.2016. */ /** * Created by denak on 07.04.2016. */ /** * Created by denak on 15.04.2016. */ (function () { angular.module("teleds.blocks").component("rangeDatepicker", component()); function component() { return { bindings: { dateStart: "<", dateEnd: "<", onChange: "&" }, templateUrl: 'blocks/components/date/rangeDatepicker/rangeDatepicker.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("rangeDatepickerLight", componentLight()); function componentLight() { return { bindings: { dateStart: "<", dateEnd: "<", onChange: "&" }, templateUrl: 'blocks/components/date/rangeDatepicker/rangeDatepickerLight.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$element', '$scope']; function Controller($element, $scope) { var vm = this; var datePickerElem = $element.find('.input-daterange'); var fromDate = datePickerElem.find('.from-date'); var toDate = datePickerElem.find('.to-date'); var datepicker = datePickerElem.bootstrapDP({ orientation: "bottom auto", container: ".page-content" }); var disableEvent = false; datepicker.on('changeDate', function (e) { if (!disableEvent) { var from = fromDate.bootstrapDP('getDate'); var to = toDate.bootstrapDP('getDate'); vm.dateStart = from; vm.dateEnd = to; vm.onChange({value: {from: from, to: to}}); } }); this.$onChanges = function (changesObj) { if (changesObj.dateStart || changesObj.dateEnd) { disableEvent = true; if (vm.dateStart&&vm.dateStart != "") { fromDate.bootstrapDP('setDate', moment(vm.dateStart).toDate()); } else { fromDate.bootstrapDP('clearDates'); } if (vm.dateEnd&&vm.dateEnd != "") { toDate.bootstrapDP('setDate', moment(vm.dateEnd).toDate()); } else { toDate.bootstrapDP('clearDates'); } disableEvent = false; } }; } })(); (function () { Controller.$inject = ["$element", "locale", "$scope", "dateHelper"]; angular.module("teleds.blocks").component("rangeDatepickerOneCalendar", component()); function component() { return { bindings: { startDate: "<", endDate: "<", onChange: "&" }, templateUrl: 'blocks/components/date/rangeDatepickerOneCalendar/rangeDatepickerOneCalendar.html', controller: Controller, controllerAs: 'vm' }; } function Controller($element, locale, $scope, dateHelper) { "ngInject"; var vm = this; var datePickerElem = $element.find('.input-daterange'); var startDateField = datePickerElem.find('.start-date'); var endDateField = datePickerElem.find('.end-date'); var localeName = locale.getLocale(); var options = { orientation: "bottom auto", container: ".page-content", language: localeName }; if (vm.options) { angular.extend(options, vm.options); } var datepicker = datePickerElem.bootstrapDP(options); var disableEvent = false; vm.startDate = null; vm.endDate = null; vm.now = ""; locale.ready("blocks").then(function () { vm.now = locale.getString("blocks.Now"); updateRangeDisplay(); }); datepicker.on('changeDate', function (e) { if (!disableEvent) { $scope.$apply(function () { var startDate = startDateField.bootstrapDP('getDate'); if (e.target.name == "end") { if (vm.endDate && vm.endDate.getTime() === startDate.getTime()) { return; } } if (e.target.name == "start") { if (vm.startDate && vm.startDate.getTime() === startDate.getTime()) { return; } } if (vm.startDate && !vm.endDate) { if (startDate < vm.startDate) { vm.endDate = vm.startDate; vm.startDate = startDate; } else { vm.endDate = startDate; } } else { if (vm.endDate) { vm.endDate = null; } vm.startDate = startDate; } disableEvent = true; updateDate(); disableEvent = false; updateRangeDisplay(); vm.onChange({startDate: vm.startDate, endDate: vm.endDate}); }); } }); function updateDate() { if (vm.startDate) { startDateField.bootstrapDP('setDate', moment.utc(vm.startDate).toDate()); } else { startDateField.bootstrapDP('clearDates'); } if (vm.endDate) { endDateField.bootstrapDP('setDate', moment.utc(vm.endDate).toDate()); } else { endDateField.bootstrapDP('clearDates'); } } function updateRangeDisplay() { vm.range = dateHelper.getRangeText(vm.startDate, vm.endDate); } datepicker.on('clearDate', function (e) { if (!disableEvent) { $scope.$apply(function () { vm.onChange({startDate: "", endDate: ""}); }); } }); vm.show = function () { startDateField.bootstrapDP('show'); }; this.$onChanges = function (changesObj) { disableEvent = true; if (changesObj.startDate) { if (vm.startDate && vm.startDate != "") { startDateField.bootstrapDP('setDate', moment.utc(vm.startDate).toDate()); } else { startDateField.bootstrapDP('clearDates'); } updateDate(); } if (changesObj.endDate) { if (vm.endDate && vm.endDate != "") { endDateField.bootstrapDP('setDate', moment.utc(vm.endDate).toDate()); } else { endDateField.bootstrapDP('clearDates'); } updateDate(); } updateRangeDisplay(); disableEvent = false; }; } })(); /** * Created by denak on 09.06.2016. */ (function () { service.$inject = ["errorHandlerHelper", "Restangular"]; angular.module("teleds.blocks") .service('editService', service); function service(errorHandlerHelper, Restangular) { return { getEditModel: getEditModel, getEditModelForRestAngularModel: getEditModelForRestAngularModel }; function getEditModel(vm) { return { edit: false, backup: null, value: '', startEdit: function () { this.edit = true; this.value = angular.copy(vm.ngModel); this.backup = angular.copy(vm.ngModel); }, endEdit: function () { vm.onChange({value: this.value}); vm.saving = true; vm.error = null; vm.onSave({value: this.value}).then(function () { vm.model.saveEdit(); }).catch(function (response) { vm.error = errorHandlerHelper.handleErrorResponseForEdit(response); if (!vm.error) { vm.model.cancelEdit(); } } ).finally(function () { vm.saving = false; }); }, saveEdit: function () { this.edit = false; }, cancelEdit: function () { if (vm.saving) { return; } this.edit = false; vm.onChange({value: this.backup}); } }; } function getEditModelForRestAngularModel(vm) { return { edit: false, backup: null, value: cloneObject(vm.model), startEdit: function () { vm.submitted = false; this.edit = true; this.value = cloneObject(vm.model); this.backup = cloneObject(vm.model); }, endEdit: function () { vm.submitted = true; var self = this; var invalid = vm.onChange({value: this.value}); if (invalid) { return; } vm.saving = true; vm.error = null; vm.onSave({value: this.value}).then(function () { self.saveEdit(); }).catch(function (response) { if (!response) { vm.saving =false; self.cancelEdit(); return; } vm.error = errorHandlerHelper.handleErrorResponseForEdit(response); if (!vm.error) { vm.saving =false; self.cancelEdit(); } } ).finally(function () { vm.saving = false; }); }, saveEdit: function () { this.edit = false; }, cancelEdit: function () { if (vm.saving) { return; } vm.submitted = false; this.edit = false; vm.onChange({value: this.backup}); } }; } } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("editBright", component()); function component() { return { bindings: { ngModel: "<", fieldName: "@", onSave: "&", onChange: '&' }, transclude: { 'display': '?display' }, templateUrl: 'blocks/components/edit/editBright/editBright.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['errorHandlerHelper', '$transclude', 'editService']; function Controller(errorHandlerHelper, $transclude, editService) { var vm = this; vm.finish = function (from, to) { vm.model.value.min = from; vm.model.value.max = to; }; vm.defineTransclude = $transclude.isSlotFilled('display'); vm.model = editService.getEditModel(vm); } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("editConstantsSelect", component()); function component() { return { bindings: { ngModel: "<", onSave: "&", onChange: '&', constantName: "@", disableTranslate: '@' }, transclude: { 'display': '?display' }, templateUrl: 'blocks/components/edit/editConstantsSelect/editConstantsSelect.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$injector', '$transclude']; function Controller($injector, $transclude) { var vm = this; vm.items = $injector.get(vm.constantName); vm.selectOption = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; vm.defineTransclude = $transclude.isSlotFilled('display'); if (vm.disableTranslate) { vm.isTranslate = false; } else { vm.isTranslate = true; } vm.model = { edit: false, backup: null, value: '', startEdit: function () { this.edit = true; this.value = angular.copy(vm.ngModel); this.backup = angular.copy(vm.ngModel); }, endEdit: function () { vm.onChange({value: this.value}); vm.saving = true; vm.onSave({value: this.value}).then(function () { vm.model.saveEdit(); vm.saving = false; }).catch(function () { vm.saving = false; vm.model.cancelEdit(); } ); }, saveEdit: function () { this.edit = false; }, cancelEdit: function () { if (vm.saving) { return; } this.edit = false; vm.onChange({value: this.backup}); } }; } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("editDate", component()); function component() { return { bindings: { ngModel: "<", onSave: "&", onChange:'&' }, transclude: true, templateUrl: 'blocks/components/edit/editDate/editDate.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("editDatetime", datetimepicker()); function datetimepicker() { return { bindings: { ngModel: "<", onSave: "&", onChange:'&' }, transclude: true, templateUrl: 'blocks/components/edit/editDate/editDatetime.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = []; function Controller() { var vm = this; vm.model = { edit: false, backup: null, value: '', startEdit: function () { this.edit = true; this.value = angular.copy(vm.ngModel); this.backup = angular.copy(vm.ngModel); }, endEdit: function () { vm.onChange({value: this.value}); vm.saving=true; vm.onSave({value: this.value}).then(function () { vm.model.saveEdit(); vm.saving=false; }).catch(function () { vm.saving=false; vm.model.cancelEdit(); } ); }, saveEdit: function () { this.edit = false; }, cancelEdit: function () { if(vm.saving) { return; } this.edit = false; vm.onChange({value: this.backup}); } }; vm.keyUpEditInput = function ($event) { if ($event.keyCode == 13) { vm.model.endEdit(); } }; } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("editTags", component()); function component() { return { bindings: { ngModel: "<", onSave: "&", onChange: '&', tagsType: "@" }, templateUrl: 'blocks/components/edit/editTags/editTags.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = []; function Controller() { var vm = this; vm.model = { edit: false, value: [], backup: null, startEdit: function () { this.edit = true; this.value = angular.copy(vm.ngModel); this.backup = angular.copy(vm.ngModel); }, endEdit: function () { vm.onChange({value: this.value}); vm.onSave({value: this.value}).then(function () { vm.model.saveEdit(); }).catch(function () { vm.model.cancelEdit(); } ); }, saveEdit: function () { this.edit = false; }, cancelEdit: function () { this.edit = false; vm.onChange({value: this.backup}); } }; } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("editNumber", component()); function component() { return { bindings: { ngModel: "<", onSave: "&", onChange:'&' }, transclude: true, templateUrl: 'blocks/components/edit/editNumber/editNumber.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = []; function Controller() { var vm = this; vm.model = { edit: false, backup: null, value: '', startEdit: function () { this.edit = true; this.value = angular.copy(parseInt(vm.ngModel)); this.backup = angular.copy(parseInt(vm.ngModel)); }, endEdit: function () { vm.onChange({value: this.value}); vm.saving=true; vm.onSave({value: this.value}).then(function () { vm.model.saveEdit(); vm.saving=false; }).catch(function () { vm.saving=false; vm.model.cancelEdit(); } ); }, saveEdit: function () { this.edit = false; }, cancelEdit: function () { if(vm.saving) { return; } this.edit = false; vm.onChange({value: this.backup}); } }; vm.keyUpEditInput = function ($event) { if ($event.keyCode == 13) { vm.model.endEdit(); } }; } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("editText", component()); function component() { return { bindings: { ngModel: "<", fieldName: "@", onSave: "&", onChange: '&' }, transclude: { 'display': '?display' }, templateUrl: 'blocks/components/edit/editText/editText.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['errorHandlerHelper', '$transclude']; function Controller(errorHandlerHelper, $transclude) { var vm = this; vm.defineTransclude = $transclude.isSlotFilled('display'); vm.model = { edit: false, backup: null, value: '', startEdit: function () { this.edit = true; this.value = angular.copy(vm.ngModel); this.backup = angular.copy(vm.ngModel); }, endEdit: function () { vm.onChange({value: this.value}); vm.saving = true; vm.onSave({value: this.value}).then(function () { vm.model.saveEdit(); }).catch(function (response) { vm.error = errorHandlerHelper.handleErrorResponseForEdit(response); if (!vm.error) { vm.model.cancelEdit(); } } ).finally(function () { vm.saving = false; }); }, saveEdit: function () { this.edit = false; }, cancelEdit: function () { if (vm.saving) { return; } this.edit = false; vm.onChange({value: this.backup}); } }; vm.keyUpEditInput = function ($event) { if ($event.keyCode == 13) { vm.model.endEdit(); } }; } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("editTextarea", component()); function component() { return { bindings: { ngModel: "<", fieldName: "@", onSave: "&", onChange: '&' }, transclude: { 'display': '?display' }, templateUrl: 'blocks/components/edit/editTextArea/editTextArea.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$transclude', 'editService']; function Controller($transclude, editService) { var vm = this; vm.defineTransclude = $transclude.isSlotFilled('display'); vm.model = editService.getEditModel(vm); } })(); /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("brightComponent", component()); function component() { return { bindings: { ngModel: "<", onChange: '&' }, templateUrl: 'blocks/components/form/brightComponent/brightComponent.html', controller: Controller, controllerAs: 'vm' }; } function Controller() { var vm = this; vm.finish = function (from) { vm.model.brightDay = from; }; vm.finishNight = function (from) { vm.model.brightNight = from; }; vm.$onChanges = function (changesObj) { if (changesObj.ngModel && vm.ngModel) { vm.model._brightDay = vm.ngModel.brightDay; vm.model.maxValueNight = vm.ngModel.brightDay; vm.model._brightNight = vm.ngModel.brightNight; vm.model._autobright = vm.ngModel.autobright; } }; vm.model = { maxValueNight: 100, set brightDay(val) { this.maxValueNight = val; this._brightDay = val; changed(); }, get brightDay() { return this._brightDay; }, set brightNight(val) { this._brightNight = val; changed(); }, get brightNight() { return this._brightNight; }, set autobright(val) { if(val) { this._autobright=1; } else { this._autobright=0; } changed(); }, get autobright() { return this._autobright==1; } }; function changed() { vm.onChange({ value: { autobright: vm.model.autobright, brightDay: vm.model.brightDay, brightNight: vm.model.brightNight } }); } } })(); /** * Created by denak on 26.05.2016. */ /** * Created by denak on 16.05.2016. */ (function () { angular.module("teleds.blocks").component("constantsSelect", component()); function component() { return { bindings: { ngModel: "<", onChange: '&', constantName: "@", disableTranslate: '@', name: "@", key: "@", search: "@" }, templateUrl: 'blocks/components/form/constantSelect/constantSelect.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("constantsSelectRadio", componentRadio()); function componentRadio() { return { bindings: { ngModel: "<", onChange: '&', constantName: "@", disableTranslate: '@' }, templateUrl: 'blocks/components/form/constantSelect/contstantSelectRadio.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("constantsSelectUi", componentUi()); function componentUi() { return { bindings: { ngModel: "<", onChange: '&', constantName: "@", disableTranslate: '@' }, templateUrl: 'blocks/components/form/constantSelect/constantUiSelect.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("constantsSelectTab", componentTab()); function componentTab() { return { bindings: { ngModel: "<", ngDisabledSelect: "<", onChange: '&', constantName: "@", disableTranslate: '@' }, templateUrl: 'blocks/components/form/constantSelect/constantsSelectTab.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("constantsSelectPills", componentPills()); function componentPills() { return { bindings: { ngModel: "<", onChange: '&', constantName: "@", ngItems: "<", disableTranslate: '@' }, templateUrl: 'blocks/components/form/constantSelect/constantSelectPills.html', controller: Controller, controllerAs: 'vm' }; } Controller.$inject = ['$injector']; function Controller($injector) { var vm = this; if (vm.ngItems) { vm.items = vm.ngItems; } else { vm.items = $injector.get(vm.constantName); } vm.isTranslate = !vm.disableTranslate; if (!vm.key) { vm.key = 'name'; } vm.selectOption = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; if (!!vm.search) { vm.selectOption.minimumResultsForSearch = 10; } vm.model = { set value(value) { if (!vm.ngDisabledSelect) { vm.onChange({value: value}); } }, get value() { return vm.ngModel; } }; } })(); /** * Created by denak on 16.05.2016. */ (function () { Controller.$inject = ["$filter"]; angular.module("teleds.blocks").component("durationInterval", component()); function component() { return { bindings: { ngModel: "<", ngMin: "<", ngMax: "<", onChange: '&' }, templateUrl: 'blocks/components/form/durationInterval/durationInterval.component.html', controller: Controller, controllerAs: 'vm' }; } function Controller($filter) { "ngInject"; var vm = this; vm.$onChanges = function (changesObj) { if (changesObj.ngModel && vm.ngModel) { vm.model._playDurationMin = $filter('durationMin')(this.ngModel); vm.model._playDurationSec = $filter('durationSec')(this.ngModel); this.model.updateDuration(); } if (changesObj.ngMax || changesObj.ngMin) { this.model.updateDuration(); } }; vm.model = { play_duration: 0, _playDurationMin: 0, get playDuration() { return this._playDurationMin; }, set playDuration(val) { if (val <= 0) { this._playDurationMin = 0; } else { this._playDurationMin = val; } this.updateDuration(); }, _playDurationSec: 0, get playDurationSec() { return this._playDurationSec; }, set playDurationSec(val) { if (val <= 0) { this._playDurationSec = 0; } else { this._playDurationSec = val; } this.updateDuration(); }, updateDuration: function () { this.play_duration = (this._playDurationMin * 60 + this._playDurationSec) * 1000; if (vm.ngMin != null && this.play_duration < vm.ngMin) { this.play_duration = vm.ngMin; } if (vm.ngMax != null && this.play_duration > vm.ngMax) { this.play_duration = vm.ngMax; } if (vm.ngMin != null) { var minSec = $filter('durationSec')(vm.ngMin); var minMin = $filter('durationMin')(vm.ngMin); vm.minDurationMinutes = minMin; if (minMin == this.playDuration) { vm.minDurationSeconds = minSec; } else { vm.minDurationSeconds = 0; } } else { vm.minDurationSeconds = 0; } if (vm.ngMax != null) { var maxSec = $filter('durationSec')(vm.ngMax); var maxMin = $filter('durationMin')(vm.ngMax); vm.maxDurationMinutes = maxMin; if (maxMin == 0) { vm.maxDurationSeconds = maxSec; } else if (maxMin == this.playDuration) { vm.maxDurationSeconds = maxSec; } else { vm.maxDurationSeconds = 60; } } else { vm.maxDurationSeconds = 60; } vm.onChange({value: this.play_duration}); } } } })(); /** * Created by denak on 26.05.2016. */ /** * Created by denak on 16.05.2016. */ (function () { Controller.$inject = ["$q"]; angular.module("teleds.blocks").component("ngSelect", component()); function component() { return { bindings: { ngModel: "<", onChange: '&', disableTranslate: '@', items: "<", translateKey:"@" }, templateUrl: 'blocks/components/form/ngSelect/ngSelect.html', controller: Controller, controllerAs: 'vm' }; } angular.module("teleds.blocks").component("ngSelectRadio", componentRadio()); function componentRadio() { return { bindings: { ngModel: "<", onChange: '&', disableTranslate: '@', items: "<", translateKey:"@" }, templateUrl: 'blocks/components/form/ngSelect/ngSelectRadio.html', controller: Controller, controllerAs: 'vm' }; } function Controller($q) { "ngInject"; var vm = this; if (vm.disableTranslate) { vm.isTranslate = false; } else { vm.isTranslate = true; } vm.selectOption = { dropdownCssClass: "form-white", minimumResultsForSearch: -1 }; vm.model = { set value(value) { vm.onChange({value: value}); }, get value() { return vm.ngModel; } }; this.$onChanges = function (changesObj) { if (changesObj.items) { $q.when(vm.items).then(function (result) { vm.itemsFromPromise = result; }); } } } })(); /** * Created by denak on 26.05.2016. */ /** * Created by denak on 16.05.2016. */ (function () { Controller.$inject = ["$element"]; angular.module("teleds.blocks").component("numberPicker", component()); function component() { return { bindings: { ngModel: "<", onChange: "&", ngDisabled:"<", min: "<", max: "<", error:"<", required:"<", name:"@" }, templateUrl: 'blocks/components/form/numberPicker/numberPicker.html', controller: Controller, controllerAs: 'vm' }; } function Controller($element) { "ngInject"; var vm = this; vm.up = function () { vm.model.value++; }; vm.down = function () { vm.model.value -= 1; }; vm.model = { set value(value) { if(vm.ngDisabled) { return; } value = parseInt(value); if(!value) { value=0; } if ((vm.max||vm.max===0) && vm.max < value) { value =vm.max; } if ((vm.min ||vm.min===0)&& vm.min > value) { value =vm.min; } vm.ngModel = value; vm.onChange({value: value}); }, get value() { return vm.ngModel; } }; this.$onChanges = function (changesObj) { if (changesObj.ngModel) { vm.model.value = vm.ngModel; } if(changesObj.min) { if ((vm.min ||vm.min===0)&& vm.min > vm.ngModel) { vm.ngModel =vm.min; } } if(changesObj.max) { if ((vm.max ||vm.max===0)&& vm.max < vm.ngModel) { vm.ngModel =vm.max; } } } } })(); /** * Created by denak on 16.05.2016. */ (function () { Controller.$inject = ["$filter"]; angular.module("teleds.blocks").component("pickIntervalWithInterval", component()); function component() { return { bindings: { ngOuterStart: " 1) { some = some && area.name.split('_').length > 1; } } }); } return some }); return area; } vm.config = { autoHideScrollbar: false, theme: 'light', advanced: { updateOnContentResize: true }, setWidth: 520, axis: 'x', scrollInertia: 0 } } })(); /** * Created by denak on 26.05.2016. */ /** * Created by denak on 16.05.2016. */ (function () { Controller.$inject = ["locale", "selectEntityModalService"]; angular.module("teleds.blocks").component("selectEntity", component()); function component() { return { bindings: { selectedIds: "<", entity: "@", onChange: "&", icon: "@" }, templateUrl: 'blocks/components/form/selectEntity/selectEntity.html', controller: Controller, controllerAs: 'vm' }; } function Controller(locale, selectEntityModalService) { "ngInject"; var vm = this; vm.show = function () { selectEntityModalService.show(vm.entity).then( function (selectedIds) { vm.selectedIds = selectedIds; updateSelected(); vm.onChange({value: selectedIds}); } ); }; vm.reset = function () { vm.selectedIds.length = 0; vm.onChange({value: vm.selectedIds}); updateSelected(); }; updateSelected(); locale.ready("blocks").then(function () { vm.notSelectedMessage = locale.getString("blocks.NotSelectedEntity"); vm.selectedMessageStart = locale.getString("blocks.SelectedEntityStart"); vm.selectedMessageEnd = locale.getString("blocks.SelectedEntityEnd_" + vm.entity); updateSelected(); }); function updateSelected() { if (vm.selectedIds.length > 0) { vm.selected = vm.selectedMessageStart + " " + vm.selectedIds.length + " " + vm.selectedMessageEnd; } else { vm.selected = vm.notSelectedMessage; } } this.$onInit = function () { if(!vm.selectedIds) { vm.selectedIds = []; } }; this.$onChanges = function (changesObj) { if (changesObj.selectedIds) { updateSelected(); } } } })(); /** * Created by denak on 18.05.2016. */ (function () { controller.$inject = ["$uibModalInstance", "entity", "filterIds"]; angular.module("teleds.blocks") .controller('selectEntityModalController', controller); function controller($uibModalInstance, entity, filterIds) { "ngInject"; var vm = this; vm.selectedIds = []; vm.entity = entity; vm.filterIds = filterIds; vm.save = function () { $uibModalInstance.close(vm.selectedIds); }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.05.2016. */ (function () { service.$inject = ["$uibModal"]; angular.module("teleds.campaigns") .service('selectEntityModalService', service); function service($uibModal) { "ngInject"; var self = this; self.show = function (entity,filterIds) { var modalInstance = $uibModal.open({ backdrop: 'static', templateUrl: 'blocks/components/form/selectEntityModal/selectEntityModal.html', controller: 'selectEntityModalController as vm', resolve: { entity: function () { return entity; }, filterIds:function () { return filterIds; } } }); return modalInstance.result; } } })(); /** * Created by denak on 26.05.2016. */ /** * Created by denak on 16.05.2016. */ (function () { Controller.$inject = ["$injector", "tableHelper"]; angular.module("teleds.blocks").component("selectEntityTable", component()); function component() { return { bindings: { selectedIds: "<", filterIds: "<", entity: "@", onChange: "&" }, templateUrl: 'blocks/components/form/selectEntityTable/selectEntityTable.html', controller: Controller, controllerAs: 'vm' }; } function Controller($injector, tableHelper) { "ngInject"; var vm = this; var service = $injector.get(vm.entity); vm.option = { tags: [], name: "", status: false, types: [], quality: [], quicktype: '' }; update(); vm.onReset = function () { vm.option.types.length = 0; vm.option.tags.length = 0; vm.option.name = ''; vm.option.quality.length = 0; vm.option.quicktype = ''; update(); }; vm.onApply = function (option) { vm.option.tags = option.tags; vm.option.name = option.name; switch (vm.entity) { case "campaigns": { vm.option.status = option.status; break; } case "contents": { vm.option.types = option.types; break; } case "players": { vm.option.quicktype = option.quicktype; vm.option.quality = option.quality; break; } } update(); }; function update() { vm.promise =service.getListFromFilterOption(vm.option).then(function (result) { for (var p in vm.selected) { delete vm.selected[p]; } if (vm.filterIds) { vm.items = result.data.filter(function (item) { return !vm.filterIds.find(function (filterItem) { return filterItem == item.id; }) }); } else { vm.items = result.data; } vm.items.forEach(function (item) { vm.selected[item.id] = false; }); } ); } vm.selected = {}; var functions = tableHelper.getFunctionForSelectedTable(onSelected, vm.selected); vm.toggleAll = functions.toggleAll; vm.toggleOne = functions.toggleOne; vm.isSelectAny = functions.isSelectAny; function onSelected(selected, selectAll) { vm.selectAll = selectAll; vm.onChange({value: selected}) } } })(); /** * Created by denak on 26.05.2016. */ /** * Created by denak on 16.05.2016. */ (function () { Controller.$inject = ["$element"]; angular.module("teleds.blocks").component("spectrumColorpicker", component()); function component() { return { bindings: { option: "<", ngModel: "<", onChange: "&", label: "@" }, templateUrl: 'blocks/components/form/spectrumColorpicker/spectrumColorpicker.html', controller: Controller, controllerAs: 'vm' }; } function Controller($element) { "ngInject"; var vm = this; var localOpt = { change: function (color) { vm.ngModel = color.toHexString(); vm.onChange({value: color.toHexString()}) } }; angular.extend(localOpt, vm.option); vm.model = { set value(val) { vm.ngModel = val; if(val.length>6) { $element.find('input').spectrum("set", val); } }, get value() { return vm.ngModel; } }; $element.find('input').spectrum(localOpt); $element.find('input').show(); this.$onChanges = function (changesObj) { if (changesObj.ngModel) { vm.model.value=vm.ngModel; $element.find('input').spectrum("set", vm.ngModel); } } } })(); /** * Created by denak on 25.04.2016. */ (function () { controller.$inject = ["$uibModal", "$scope", "$uibModalInstance", "geoTargetingId", "moment", "timeTargeting", "locale", "uiGmapGoogleMapApi", "uiGmapIsReady", "geoTargeting", "confirmModalService"]; angular.module("teleds.blocks") .controller('controlGeoTargetingModalController', controller); function controller($uibModal, $scope, $uibModalInstance, geoTargetingId, moment, timeTargeting, locale, uiGmapGoogleMapApi, uiGmapIsReady, geoTargeting, confirmModalService) { "ngInject"; var vm = this; vm.index = 0; vm.position = { id: Date.now(), coords: { latitude: '', longitude: '' } }; vm.model = { name: moment().format(), polygons: [] }; if (geoTargetingId && geoTargetingId != "") { geoTargeting.get(geoTargetingId).then(function (area) { area.polygons.forEach(function (polygon) { polygon.isEdit = false; angular.extend(polygon, getDefaultPolygon()); }); vm.model = area; updatePolygons(); }); } else { updatePolygons(); } vm.show = true; vm.map = { center: { latitude: 55.747, longitude: 37.626 }, zoom: 11, polygons: [], control: {} }; vm.currentPolygon = null; vm.edit = false; vm.create = false; var backupPolygon = {}; vm.polygons = []; vm.events = { click: function (map, eventName, originalEventArgs) { if (vm.edit) { return; } vm.selectPolygon(originalEventArgs.$parent.polygon); } }; vm.addPolygon = function () { if (vm.create) { return; } var polygon = {name: 'default', polygons: [], isEdit: true}; vm.currentPolygon = polygon; vm.model.polygons.unshift(vm.currentPolygon); vm.edit = true; vm.create = true; vm.drawingManagerOptions.drawingMode = google.maps.drawing.OverlayType.POLYGON; vm.drawingManagerOptions.drawingControl = true; updatePolygons(); }; vm.selectPolygon = function (polygon) { if (vm.currentPolygon != polygon) { vm.index = vm.model.polygons.indexOf(polygon); if (vm.currentPolygon && vm.currentPolygon.isEdit) { vm.cancelEditPolygon(); } vm.currentPolygon = polygon; vm.drawingManagerOptions.drawingMode = null; vm.drawingManagerOptions.drawingControl = false; var bounds = getBounds(vm.currentPolygon); var map = vm.map.control.getGMap(); map.fitBounds(bounds); updatePolygons(); } }; vm.startEditPolygon = function (polygon) { if (vm.currentPolygon != polygon) { vm.selectPolygon(polygon); } backupPolygon = angular.copy(vm.currentPolygon); vm.currentPolygon.isEdit = true; vm.edit = true; vm.create = false; updatePolygons(); }; vm.cancelEditPolygon = function () { if (vm.create) { vm.model.polygons.shift(); } vm.currentPolygon.isEdit = false; vm.edit = false; vm.create = false; vm.currentPolygon = backupPolygon; updatePolygons(); }; vm.savePolygon = function (polygon) { polygon.saving = true; if (vm.create) { vm.create = false; vm.edit = false; vm.currentPolygon.isEdit = false; polygon.saving = false; updatePolygons(); return; } if (vm.edit) { vm.edit = false; polygon.saving = false; vm.currentPolygon.isEdit = false; updatePolygons(); } }; vm.remove = function (polygon) { polygon.removing = true; confirmModalService.show("blocks.ConfirmActionModalHint").then(function () { vm.model.polygons.splice(vm.model.polygons.indexOf(polygon), 1); updatePolygons(); }).finally(function () { polygon.removing = false; }) }; updatePolygons(); function updatePolygons() { vm.polygons = getPolygons(); } function getBounds(polygon) { var bounds = new google.maps.LatLngBounds(); polygon.paths.forEach(function (path) { bounds.extend(new google.maps.LatLng(path.latitude, path.longitude)); }); return bounds; } function getPolygons() { var cleanPolygonsArrays = vm.model.polygons.map(function (polygon) { if (!polygon.paths) { return; } if (polygon.isEdit) { polygon.editable = true; polygon.draggable = true; polygon.fill.color = '#619DDD'; polygon.stroke.color = '#5B98D2'; polygon.fill.opacity = 0.7; } else if (vm.currentPolygon == polygon) { polygon.fill.color = '#619DDD'; polygon.stroke.color = '#5B98D2'; polygon.fill.opacity = 0.7; polygon.editable = false; polygon.draggable = false; } else { polygon.fill.color = '#5C9BD1'; polygon.stroke.color = '#84C0ED'; polygon.editable = false; polygon.draggable = false; polygon.fill.opacity = 0.2; } return polygon; }); if (cleanPolygonsArrays.length == 0) { return []; } cleanPolygonsArrays =cleanPolygonsArrays.filter(function (item) { return item; }); return cleanPolygonsArrays; } function getDefaultPolygon() { var defaultFillColor = '#5C9BD1'; var defaultStrokeColor = '#5B98D2'; return { fill: { color: defaultFillColor, opacity: 0.7 }, fillColor: defaultFillColor, fillOpacity: 0.7, stroke: { color: defaultStrokeColor, weight: 2 }, strokeColor: defaultStrokeColor, strokeWeight: 2, clickable: false, zIndex: 1 } } vm.drawingManagerControl = {}; uiGmapIsReady.promise(1).then(function (instances) { google.maps.event.addListener(vm.drawingManagerControl.getDrawingManager(), 'polygoncomplete', function (polygon) { $scope.$apply(function () { var path = polygon.getPath(); var polygonItem = getDefaultPolygon(); polygonItem.paths = []; for (var i = 0; i < path.getLength(); i++) { var xy = path.getAt(i); polygonItem.paths.push({ latitude: xy.lat(), longitude: xy.lng() }); } angular.extend(vm.currentPolygon, polygonItem); polygon.setMap(null); vm.drawingManagerOptions.drawingMode = null; vm.drawingManagerOptions.drawingControl = false; updatePolygons(); }); }); }); uiGmapGoogleMapApi.then(function (maps) { vm.drawingManagerOptions = { drawingMode: null, drawingControl: false, drawingControlOptions: { position: google.maps.ControlPosition.TOP_RIGHT, drawingModes: [ google.maps.drawing.OverlayType.POLYGON ] }, polygonOptions: getDefaultPolygon() }; }); vm.save = function (form) { vm.loading = true; var promise; if(vm.model.polygons.length==0) { $uibModalInstance.close(null); } if (geoTargetingId && geoTargetingId != "") { promise = geoTargeting.update(vm.model).then(function () { $uibModalInstance.close(vm.model.id); vm.show = false; }); } else { promise = geoTargeting.add(vm.model).then(function (result) { $uibModalInstance.close(result.id); vm.show = false; }); } promise.finally(function () { vm.loading = false; }) }; vm.geolocationAvailable = navigator.geolocation ? true : false; vm.findMe = function () { if (vm.geolocationAvailable) { navigator.geolocation.getCurrentPosition(function (position) { vm.position.coords.latitude = position.coords.latitude; vm.position.coords.longitude = position.coords.longitude; setPosition(position.coords); $scope.$apply(); }, function () { }); } }; vm.searchbox = { template: 'searchbox.tpl.html', events: { places_changed: function (searchBox) { var place = searchBox.getPlaces(); if (!place || place == 'undefined' || place.length == 0) { console.log('no place data :('); return; } setPosition({ latitude: place[0].geometry.location.lat(), longitude: place[0].geometry.location.lng() }); } } }; function setPosition(position) { vm.map.center.latitude = position.latitude; vm.map.center.longitude = position.longitude; } vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 25.04.2016. */ (function () { angular.module("teleds.blocks") .service('controlGeoTargetingService', service) service.$inject = ["$uibModal"]; function service($uibModal){ var self = this; self.show = function (geoTargetingId) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'blocks/components/modals/controlGeoTargetingModal/controlGeoTargetingModal.html', controller: 'controlGeoTargetingModalController as vm', size:"lg", windowClass: 'control-geo-modal', resolve: { geoTargetingId: function () { return geoTargetingId; } } }); return modalInstance.result; } } })(); /** * Created by denak on 23.04.2016. */ (function () { controller.$inject = ["$uibModalInstance", "message", "func", "type", "messageData", "isMessage"]; angular.module("teleds.blocks") .controller('confirmController', controller); function controller($uibModalInstance, message, func, type, messageData,isMessage) { "ngInject"; var vm = this; vm.message = message; vm.messageData = messageData; vm.isMessage =isMessage; vm.type=type; switch (type) { case 'danger': { vm.classHeader = 'bg-danger'; break; } case 'info': { vm.classHeader = 'bg-blue'; break; } case 'success': { vm.classHeader = 'bg-green'; break; } default: { vm.classHeader = 'bg-danger'; } } vm.apply = function (form) { if (func) { vm.loading = true; func().then(function () { $uibModalInstance.close(); }).catch(function () { $uibModalInstance.dismiss(); }).finally(function () { vm.loading = false; }) } else { $uibModalInstance.close(); } }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.blocks") .service('confirmModalService', service); service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (message, func, type,messageData,isMessage) { var modalInstance = $uibModal.open({ templateUrl: 'blocks/components/modals/confirmModal/confirmModal.html', controller: 'confirmController as vm', windowClass: 'remove-modal ', resolve: { message: function () { return message; }, func: function () { return func; }, type: function () { return type; }, messageData: function () { return messageData; }, isMessage: function () { return isMessage; } } }); return modalInstance.result; }; } })(); /** * Created by denak on 25.04.2016. */ (function () { angular.module("teleds.blocks") .controller('controlTargetingModalController', controller) controller.$inject = ["$uibModal", "$scope", '$uibModalInstance', 'timeTargetingId', 'moment', 'timeTargeting', 'locale']; function controller($uibModal, $scope, $uibModalInstance, timeTargetingId, moment, timeTargeting, locale) { var vm = this; vm.locale = locale.getLocale(); vm.model = [ { name: { ru: "Пн", en: "Mon" }, hours: [] }, { name: { ru: "Вт", en: "Tue" }, hours: [] }, { name: { ru: "Ср", en: "Wed" }, hours: [] }, { name: { ru: "Чт", en: "Thu" }, hours: [] }, { name: { ru: "Пт", en: "Fri" }, hours: [] }, { name: { ru: "Сб", en: "Sat" }, hours: [] }, { name: { ru: "Вс", en: "Sun" }, hours: [] } ]; vm.ranges = { startDay: 0, endDay: 6, endHour: 0, startHour: 23, endHourSecond: 0, startHourThird: 23 }; if (timeTargetingId) { timeTargeting.getTimeTargeting(timeTargetingId).then(function (response) { vm.timeTargeting = response; updateModel(vm.timeTargeting); }) } vm.save = function () { vm.loading = true; if (timeTargetingId) { vm.timeTargeting.content = getContentFromTimeTable(vm.model); timeTargeting.updateTimeTargeting(vm.timeTargeting) .then(function () { vm.loading = false; $uibModalInstance.close(timeTargetingId) } ).catch(function () { vm.loading = false; }); } else { var timeTargetingModel = { name: moment().format("DD.MM.YYYY/HH:mm:ss"), description: moment().format("DD.MM.YYYY/HH:mm:ss"), content: getContentFromTimeTable(vm.model) }; timeTargeting.createTimeTargeting(timeTargetingModel) .then(function (response) { vm.loading = false; $uibModalInstance.close(response.id) } ).catch(function () { vm.loading = false; }); } }; vm.close = function () { $uibModalInstance.dismiss(); }; vm.onHourStartSelect = null; vm.startSelect = function () { vm.select = true; if (vm.onHourStartSelect) { vm.onHourStartSelect.selected = !vm.onHourStartSelect.selected; vm.value = vm.onHourStartSelect.selected; } }; vm.endSelect = function () { vm.select = false; vm.onHourStartSelect = null; }; vm.selectHour = function (item) { if (vm.select) { item.selected = vm.value ; } }; vm.startSelectOnHour = function (item) { vm.onHourStartSelect = item; }; angular.forEach(vm.model, function (item) { for (var i = 0; i < 24; i++) { item.hours.push({selected: true}) } }); vm.selectDays = function (start, end) { unSelectAll(); for (var i = start; i < end + 1; i++) { vm.selectHoursInDay(vm.model[i], 0, 23); } vm.ranges.startDay = start; vm.ranges.endDay = end; }; vm.selectHours = function (start, end, notReset) { if (!notReset) { unSelectAll(); } angular.forEach(vm.model, function (item, index) { if (vm.ranges.startDay <= index && index <= vm.ranges.endDay) { vm.selectHoursInDay(item, start, end); } }) }; vm.selectHoursInDay = function (day, start, end) { for (var i = start; i < end + 1; i++) { day.hours[i].selected = true; } }; function unSelectAll() { angular.forEach(vm.model, function (item) { for (var i = 0; i < 24; i++) { item.hours[i].selected = false; } }) } function getContentFromTimeTable(model) { var result = {}; angular.forEach(model, function (item, index) { var daysHours = []; for (var i = 0; i < 24; i++) { if (item.hours[i].selected) { daysHours.push(i); } } result[index] = daysHours }); return result; } function updateModel(timeTargeting) { unSelectAll(); var content = angular.fromJson(timeTargeting.content); for (var i = 0; i < 7; i++) { for (var j = 0; j < content[i].length; j++) { vm.model[i].hours[content[i][j]].selected = true; } } } } })(); /** * Created by denak on 25.04.2016. */ (function () { angular.module("teleds.blocks") .service('controlTargetingModalService', service) service.$inject = ["$uibModal"]; function service($uibModal){ var self = this; self.showControlTargetingModal = function (timeTargetingId) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'blocks/components/modals/controlTargetingModal/controlTargetingModal.html', controller: 'controlTargetingModalController as vm', size:'lg', resolve: { timeTargetingId: function () { return timeTargetingId; } } }); return modalInstance.result; } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.blocks") .controller('removeController', controller) controller.$inject = ["$uibModal", "$scope", '$uibModalInstance', 'selected', 'service', 'type', 'additionalType', '$q', 'errorHandlerHelper']; function controller($uibModal, $scope, $uibModalInstance, selected, service, type, additionalType, $q, errorHandlerHelper) { var vm = this; vm.type = type; vm.onePlayer = selected.length == 1; vm.remove = function (form) { vm.loading = true; if (isEmpty(additionalType)) { additionalType = ""; } var promises = selected.map(function (item) { return service["remove" + additionalType](item); }); $q.all(promises).then(function () { vm.loading = false; $uibModalInstance.close(); }).catch(function (result) { vm.loading = false; errorHandlerHelper.handleErrorResponse(result, form, vm); }) }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.players") .service('removeModalService', service) service.$inject = ["$uibModal", "players", "virtualScreens","campaigns"]; function service($uibModal, players, virtualScreens,campaigns) { var self = this; self.showRemoveModal = function (selected, type) { switch (type) { case 'players': { return ShowProtectedModal(selected, players,type) } case 'campaigns': { return ShowProtectedModal(selected, campaigns,type) } case 'virtualScreens': { return ShowProtectedModal(selected, virtualScreens,type) } } }; function ShowProtectedModal(selected, service,type) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'blocks/components/modals/removeModals/removeProtectedModal.html', controller: 'removeProtectedController as vm', windowClass: 'remove-modal', resolve: { selected: function () { return selected; }, type: function () { return type; }, service: function () { return service; } } }); return modalInstance.result; } function ShowModal(selected, service) { var modalInstance = $uibModal.open({ backdrop : 'static',templateUrl: 'players/components/modals/removePlayerModal/removePlayerModal.html', controller: 'removePlayerController as vm', windowClass: 'remove-player-modal', resolve: { selectedPlayers: function () { return players; } } }); return modalInstance.result; } } })(); /** * Created by denak on 23.04.2016. */ (function () { angular.module("teleds.blocks") .controller('removeProtectedController', controller) controller.$inject = ["$uibModal", "$scope", '$uibModalInstance', 'selected','service','type','$q','errorHandlerHelper']; function controller($uibModal, $scope, $uibModalInstance, selected,service,type,$q,errorHandlerHelper) { var vm = this; vm.generatedCode = Math.floor(Math.random() * 9000) + 1000; vm.type=type; vm.onePlayer =selected.length==1; vm.remove = function (form) { vm.submitted = true; if (form.$valid) { vm.loading=true; var promises =[]; angular.forEach(selected,function (item) { promises.push(service.remove(item)); }); $q.all(promises).then(function () { vm.loading=false; $uibModalInstance.close(); }).catch(function (result) { vm.loading=false; errorHandlerHelper.handleErrorResponse(result,form, vm); }) } }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); (function () { controller.$inject = ["$uibModalInstance", "position", "name"]; angular.module("teleds.blocks") .service('showPositionService', service); service.$inject = ["$uibModal"]; function service($uibModal) { var self = this; self.show = function (position, name) { var modalInstance = $uibModal.open({ templateUrl: 'blocks/components/modals/showPosition/showPosition.html', controller: controller, controllerAs: "vm", size: "lg", resolve: { position: function () { return position; }, name: function () { return name; } } }); return modalInstance.result; } } function controller($uibModalInstance, position, name) { "ngInject" var vm = this; vm.name = name; vm.show = true; vm.position = { id: Date.now(), coords: { latitude: 55.747, longitude: 37.626 } }; vm.map = { center: { latitude: 55.747, longitude: 37.626 }, markers: [], zoom: 11 }; if (position.latitude) { setPosition(position, true) } function setPosition(position, center) { vm.position.coords.latitude = position.latitude; vm.position.coords.longitude = position.longitude; if (center) { vm.map.center.latitude = position.latitude; vm.map.center.longitude = position.longitude; } } vm.close = function () { $uibModalInstance.dismiss(); } } })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["$timeout"]; angular.module("teleds.blocks").component("viewTag", component()); function component() { return { bindings: { tagsString: "@" }, templateUrl: 'blocks/components/tagComponents/viewTag/viewTag.html', controller: Controller, controllerAs: 'vm' }; } function Controller($timeout) { "ngInject"; var vm = this; if (vm.tagsString) { vm.tags = angular.fromJson(vm.tagsString); } vm.length = vm.tags.length; if (vm.length == 1) { vm.tag = vm.tags[0]; } else if (vm.length == 0) { vm.none = true; } else if (vm.length > 1 && vm.length < 5) { vm.less5 = true; } else { vm.many = true; } vm.popover = { templateUrl: 'blocks/components/tagComponents/viewTag/popupTag.html' }; vm.show = function () { vm.hide = false; $timeout(function () { if (!vm.hide) { vm.isOpen = true; } }, 100) }; vm.close = function () { vm.hide = true; $timeout(function () { if (vm.hide) { vm.isOpen = false; } }, 100) } } })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["DTOptionsBuilder", "$compile", "$scope", "locale", "$timeout", "teledsTableService", "statistics", "tableHelper", "notificationService", "$rootScope", "$filter", "$state", "$element", "$q"]; angular.module("teleds.blocks").component("statsTable", component()); function component() { return { bindings: { entity: "@", option: "<", index: "@", selectedHours: "<", onUpdateSelectedHours: "&", onAddFilter: "&" }, transclude: { 'buttons': '?funcButtons' }, templateUrl: 'components/statistics/components/statsTable/statsTable.html', controller: Controller, controllerAs: 'vm' }; } function Controller(DTOptionsBuilder, $compile, $scope, locale, $timeout, teledsTableService, statistics, tableHelper, notificationService, $rootScope, $filter, $state, $element, $q) { "ngInject"; var vm = this; vm.dtOptions = DTOptionsBuilder .newOptions() .withFnServerData(serverData) .withDataProp('data') .withOption('processing', false) .withOption('ajax', true) .withOption('responsive', true) .withOption("info", false) .withOption("searching", false) .withOption("paging", false) .withOption("lengthChange", false) .withOption("scrollY", "calc(100vh - 485px)") .withOption('createdRow', function (row, data) { angular.element(row).attr("ng-click", "vm.action('click','" + data.id + "')"); $compile(angular.element(row))($scope); }); jQuery.fn.dataTableExt.oSort["hour-desc"] = function (x, y) { return parseInt(y) - parseInt(x); }; jQuery.fn.dataTableExt.oSort["hour-asc"] = function (x, y) { return jQuery.fn.dataTableExt.oSort["hour-desc"](y, x); }; jQuery.fn.dataTableExt.oSort["statDates-desc"] = function (x, y) { var diff = moment(y, 'YYYY-MM-DD').diff(moment(x, 'YYYY-MM-DD')); return diff; }; jQuery.fn.dataTableExt.oSort["statDates-asc"] = function (x, y) { return jQuery.fn.dataTableExt.oSort["statDates-desc"](y, x); }; vm.serverData = function serverData(sSource, aoData, fnCallback, oSettings) { var query = null; if (vm.selectedHours && vm.selectedHours.length > 0) { query = statistics.getListGroupByForHours(vm.entity, vm.option, vm.selectedHours); } else { query = statistics.getListGroupBy(vm.entity, vm.option); } return query.then(function (result) { fnCallback(tableHelper.wrapList(result)); UpdateTotal(result); }).catch(function () { fnCallback(tableHelper.getEmptyList()); notificationService.showWarning('common.FailedGet'); }); }; var selectedHours = []; var timer; $element.find('.stats-table').on('click', 'tr:not(.stats-table_header , .stats-table_over-header)', function () { var elem = $(this); if (vm.entity == 'hour') { var hour = elem.children().first().text().split(':')[0]; if (elem.hasClass('selected')) { elem.removeClass('selected'); var item = selectedHours.find(function (item) { return item == hour; }); selectedHours.splice(selectedHours.indexOf(item), 1); } else { elem.addClass('selected'); selectedHours.push(hour); } } if (timer) { $timeout.cancel(timer); } timer = $timeout(function () { vm.onUpdateSelectedHours({hours: selectedHours}); timer = null; } , 1000); }); if (locale.getLocale() == 'ru') { vm.dtOptions.withLanguageSource('//cdn.datatables.net/plug-ins/1.10.9/i18n/Russian.json'); } vm.dtIntanceCallback = function (instance) { vm.dtInstance = instance; }; var resizeEv = $rootScope.$on('resize.statsTable', function (ev, index) { if (index === vm.index && vm.dtInstance) { vm.dtInstance.DataTable.columns.adjust() } }); var resizeAllEv = $rootScope.$on('resize.allTables', function (ev, index) { if (vm.dtInstance) { vm.dtInstance.DataTable.columns.adjust() } }); vm.reloadData = function (resetPaging, func) { if (vm.dtInstance && vm.dtInstance.reloadData) { vm.dtInstance.reloadData(function () { if (func) { func(); } }, resetPaging); } }; vm.reload = function () { vm.reloadData(function () { }, false); }; vm.selectDay = function (day) { }; vm.columns = []; vm.action = function (action, id) { switch (action) { case 'doubleClick': { vm.goToOne(id); break; } case 'click': { vm.onAddFilter({id: id}); break; } case 'clickName': { vm.goToOne(id); break; } } }; vm.goToOne = function (id) { switch (vm.entity) { case 'content': { $state.go('personalAccount.content.one', {id: id}); break; } case 'campaign': { $state.go('personalAccount.campaign.one', {id: id}); break; } case 'player': { $state.go('personalAccount.player.one', {id: id}); break; } case 'date': { $state.go('personalAccount.day', vm.getStats(id)); break; } } }; this.$onDestroy = function () { resizeEv(); resizeAllEv(); }; this.$onChanges = function (changesObj) { if (changesObj.option) { var option = angular.copy(vm.option); option.startDate = moment(vm.option.startDate).format(); option.endDate = moment(vm.option.endDate).format(); if (option.players && option.players.length == 0) { option.players = null; } if (option.campaigns && option.campaigns.length == 0) { option.campaigns = null; } if (option.contents && option.contents.length == 0) { option.contents = null; } vm.urlParams = option; vm.reload(); } if (changesObj.selectedHours && !changesObj.selectedHours.isFirstChange()) { vm.reload(); } }; vm.getStats = function (day) { if (vm.urlParams) { var urlParams = angular.copy(vm.urlParams); return angular.extend({day: day}, urlParams); } else { return {day: day}; } }; switch (vm.entity) { case 'date': { vm.columns.push({ type: 'custom', name: 'id', sType: 'statDates', title: "common.Name", render: function (data, full) { return "" + moment(data, "YYYY-MM-DD").format('DD.MM.YYYY') + ""; } }); break; } case 'hour': { vm.columns.push({ type: 'custom', name: 'id', sType: 'hour', title: "common.Name", render: function (data, full) { return moment.utc(data).local().format('HH:00'); ; } }); break; } case 'content': { vm.columns.push({ type: 'custom', name: 'name', title: "common.Name", cellClass: "stats-body_cell--color-black stats-body_cell--name table-link", render: function (data, full) { var result = "
"; result += ""; var popover = data.length > 6 ? " uib-popover='" + data + "'" + "popover-append-to-body='true '" + "popover-popup-delay='500'" + "popover-trigger='mouseenter'" : ""; result += "" + data + "
"; result = "
" + result + "
"; return result; } }); break; } default: { vm.columns.push({ type: 'custom', name: 'name', title: "common.Name", width: "30%", cellClass: "stats-body_cell--color-black stats-body_cell--name table-link", render: function (data, full) { var result = ""; if (!data) { data = ""; } if (data.length > 8) { result = ""; result += data result += "" } else { result += data; } result = "
" + result + "
"; return result; } }); break; } } vm.columns.push({ type: "number", name: "total", cellClass: "stats-body_cell--color-black" }, { type: "number", name: "screen_on", cellClass: "stats-body_cell--color-green" }, { type: "number", name: "screen_off", cellClass: "stats-body_cell--color-red" }, { type: "number", name: "pay_$", cellClass: "stats-body_cell--color-green" }, { type: "number", name: "pay_free", cellClass: "stats-body_cell--color-red" }, { type: 'number', name: 'cost', cellClass: "stats-body_cell--color-black", }); vm.dtColumns = teledsTableService.getDtColumns(vm.columns); function serverData(sSource, aoData, fnCallback, oSettings) { vm.promise = vm.serverData(sSource, aoData, fnCallback, oSettings); } function UpdateTotal(stat) { var total = stat.reduce(function (prev, curr) { return { total: prev.total + curr.totalOrigin, screen_on: prev.screen_on + curr.screen_onOrigin, screen_off: prev.screen_off + curr.screen_offOrigin, pay_$: prev.pay_$ + curr.pay_$Origin, pay_free: prev.pay_free + curr.pay_freeOrigin, cost: prev.cost + curr.costOrigin } }, { total: 0, screen_on: 0, screen_off: 0, pay_$: 0, pay_free: 0, cost: 0 }); total.total = $filter('number')(total.total, 0); total.screen_on = $filter('number')(total.screen_on, 0); total.screen_off = $filter('number')(total.screen_off, 0); total.pay_$ = $filter('number')(total.pay_$, 0); total.pay_free = $filter('number')(total.pay_free, 0); total.cost = $filter('number')(total.cost, 0); vm.total = total; } } })(); (function () { Controller.$inject = ["locale", "$state"]; angular.module("teleds.statistics").component("filterSummaryStatistic", component()); function component() { return { bindings: { onChange: "&", ngOption: "<", day: "<" }, templateUrl: 'components/statistics/components/filterSummaryStatistic/filterSummaryStatistic.html', controller: Controller, controllerAs: 'vm' }; } function Controller(locale, $state) { "ngInject"; var vm = this; vm.players = []; vm.campaigns = []; vm.contents = []; vm.maxRange = {val: 1, type: "month"}; vm.$onChanges = function (changes) { if (vm.ngOption) { vm.players = vm.ngOption.players ? vm.ngOption.players : []; vm.campaigns = vm.ngOption.campaigns ? vm.ngOption.campaigns : []; vm.contents = vm.ngOption.contents ? vm.ngOption.contents : []; vm.startDate = moment(vm.ngOption.startDate); vm.endDate = moment(vm.ngOption.endDate); } }; vm.apply = function () { vm.onChange({ value: { players: vm.players, campaigns: vm.campaigns, contents: vm.contents, startDate: vm.startDate, endDate: vm.endDate } }) }; vm.reset = function () { vm.players = []; vm.campaigns = []; vm.contents = []; setDate(); vm.apply(); }; vm.onResetRange = function () { setDate(); }; function setDate() { if (vm.day) { vm.startDate = moment(vm.day).toDate(); vm.endDate = moment(vm.day).add(1, 'day').toDate(); } else { vm.endDate = moment().toDate(); vm.startDate = moment().add(-1, 'month').toDate(); } } } })(); (function () { service.$inject = ["$uibModal"]; Controller.$inject = ["$uibModalInstance", "countPlayer", "totalPlayer", "endDate", "price", "billingService", "billingInfoModal", "payMethodModal", "$q"]; angular.module("teleds.subscribe") .service('changeSubscriptionConfirmModal', service); function service($uibModal) { "ngInject" var self = this; self.show = function (countPlayer, totalPlayer, endDate, price) { var modalInstance = $uibModal.open({ templateUrl: 'components/subscribe/components/changeSubscriptionConfirmModal/changeSubscriptionConfirmModal.html', controller: Controller, controllerAs: "vm", windowClass: 'subscribe-info-modal change-subscription-modal', backdrop: 'static', resolve: { countPlayer: function () { return countPlayer; }, totalPlayer: function () { return totalPlayer; }, endDate: function () { return endDate }, price: function () { return price; } } }); return modalInstance.result; } } function Controller($uibModalInstance, countPlayer, totalPlayer, endDate, price, billingService, billingInfoModal, payMethodModal, $q) { "ngInject"; var vm = this; vm.countPlayer = countPlayer; vm.totalPlayer = totalPlayer; vm.addedPlayer = vm.countPlayer - vm.totalPlayer; vm.removedPlayer = vm.totalPlayer - vm.countPlayer; vm.added = vm.addedPlayer > 0; vm.removed = vm.removedPlayer > 0; vm.endDate = endDate; if (!vm.endDate) { vm.endDate = moment().add('1', 'months').unix(); } vm.price = price; if (vm.price.surcharge == 0 && vm.price.refund == 0) { if (vm.countPlayer == 0) { vm.price.refund = vm.price.total; vm.price.total = 0; } else { vm.price.surcharge = vm.price.total; } } vm.isActive = vm.totalPlayer == 0; vm.isCancel = vm.countPlayer == 0; vm.notChanged = !vm.isActive && !vm.isCancel; vm.close = function () { $uibModalInstance.dismiss(); }; vm.next = function () { vm.loading = true; billingService .getBillingAddress() .catch(function () { return billingInfoModal.show().catch(function () { return $q.reject({dismiss:true}); }) }) .then(function () { return billingService.getPaymentMethod() }) .catch(function (error) { if(error&&error.dismiss) { return $q.reject(error); } return payMethodModal.show(); }) .then(function () { if (countPlayer > 0) { return billingService.updateSubscription({quantity: countPlayer}) } else { return billingService.cancelSubscription() } }) .then(function () { // return $a.all([billingService.getLimits(),billingService.getSubscription()]) }) .then(function () { $uibModalInstance.close(); }) .catch(function (error) { if(error&&error.dismiss) { vm.loading = false; return $q.reject(error); } else { $uibModalInstance.close(); } }) ; }; vm.selectTab = function (tab) { vm.showTab = tab; }; vm.showTab = 1; } })(); (function () { service.$inject = ["$uibModal"]; Controller.$inject = ["$uibModalInstance", "user", "billingService", "errorHandlerHelper", "billingInfo", "Restangular"]; angular.module("teleds.subscribe") .service('billingInfoModal', service); function service($uibModal) { "ngInject" var self = this; self.show = function (billingInfo) { var modalInstance = $uibModal.open({ templateUrl: 'components/subscribe/components/billingInfoModal/billingInfoModal.html', controller: Controller, controllerAs: "vm", windowClass: 'subscribe-info-modal subscribe-billing-info-modal', backdrop: 'static', resolve: { billingInfo: function () { return billingInfo; } } }); return modalInstance.result; } } function Controller($uibModalInstance, user, billingService, errorHandlerHelper, billingInfo, Restangular) { "ngInject"; var vm = this; vm.isEdit = !!billingInfo; if (!billingInfo) { vm.model = { country: '', email: user.data.user.email }; } else { vm.model = Restangular.copy(billingInfo); } vm.next = function () { vm.submitted = true; if (vm.form.$valid && vm.model.country != '') { vm.loading = true; billingService.createUpdateBillingAddress(vm.model).then(function () { $uibModalInstance.close(); }).catch(function (response) { errorHandlerHelper.handleErrorResponse(response, vm.form, vm); }).finally(function () { vm.loading = false; }) } }; vm.close = function () { $uibModalInstance.dismiss(); } } })(); (function () { service.$inject = ["$uibModal", "changeSubscriptionConfirmModal"]; Controller.$inject = ["$uibModalInstance", "totalCountPlayer", "usedCountPlayer", "billingService", "endDate", "$timeout"]; angular.module("teleds.subscribe") .service('changeSubscriptionModal', service); function service($uibModal,changeSubscriptionConfirmModal) { "ngInject" var self = this; self.show = function (totalCountPlayer, usedCountPlayer, endDate) { var modalInstance = $uibModal.open({ templateUrl: 'components/subscribe/components/changeSubscriptionModal/changeSubscriptionModal.html', controller: Controller, controllerAs: "vm", windowClass: 'subscribe-info-modal change-subscription-modal', resolve: { totalCountPlayer: function () { return totalCountPlayer; }, usedCountPlayer: function () { return usedCountPlayer; }, endDate: function () { return endDate; } } }); return modalInstance.result.then(function (resultSelect) { return changeSubscriptionConfirmModal.show(resultSelect.countPlayer,totalCountPlayer, endDate,resultSelect.price) }); } } function Controller($uibModalInstance, totalCountPlayer, usedCountPlayer, billingService, endDate,$timeout) { "ngInject"; var vm = this; vm.totalCountPlayer = totalCountPlayer; vm.usedCountPlayer = usedCountPlayer; vm.close = function () { $uibModalInstance.dismiss(); }; vm.next = function () { $uibModalInstance.close({price: vm.allPrice,countPlayer:vm.model.countPlayer}); }; vm.endDate = endDate; if (vm.totalCountPlayer==0) { vm.inactive = true; } vm.count = 0; vm.up = function () { vm.model.countPlayer++; }; vm.down = function () { vm.model.countPlayer -= 1; }; var prevTimer=null; vm.model = { _countPlayer: 0, get countPlayer() { return this._countPlayer; }, set countPlayer(val) { if(val<0) { val=0; } this._countPlayer = val; if(val==0) { vm.price = 0; vm.priceFraction=0; } else { if (prevTimer) { $timeout.cancel(prevTimer); } prevTimer = $timeout(function () { updatePrice(); }, 700); } } }; vm.model.countPlayer=vm.totalCountPlayer; function updatePrice() { vm.loading=true; vm.price="--"; vm.priceFraction='--'; billingService.getPrice({quantity: vm.model.countPlayer}).then(function (price) { vm.price = parseInt(price.total); vm.priceFraction = parseInt((price.total - vm.price) * 100); vm.allPrice=price; }).catch(function () { vm.price = 0; vm.priceFraction=0; vm.allPrice = { "total": "0", "surcharge": "0", "refund": "0" } }).finally(function () { vm.loading=false; }); } } })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["changeSubscriptionModal", "billingService"]; angular.module("teleds.subscribe").component("currentSubscription", component()); function component() { return { bindings: { onChanged: "&" }, templateUrl: 'components/subscribe/components/currentSubscription/currentSubscription.html', controller: Controller, controllerAs: 'vm' }; } function Controller(changeSubscriptionModal, billingService) { "ngInject"; var vm = this; vm.inactive = true; vm.hideSubscribe = true; update(); function update() { billingService.getLimits().then(function (limits) { vm.limits = limits; vm.left = ((vm.limits.storage.total - vm.limits.storage.used) / vm.limits.storage.total) * 100; vm.left = Math.round(vm.left); if (vm.left == 100) { vm.left = 99; } }).catch(function () { vm.limits = { "free": { "total": "0", "left": "0", "used": "0" }, "paid": { "total": "0", "left": "0", "used": "0" } } }).finally(function () { vm.hideSubscribe = false; }); billingService.getSubscription().then(function (subscription) { vm.subscription = subscription; vm.inactive = vm.subscription.status != 'active'; }).catch(function () { vm.inactive = true; vm.subscription = { end_date: '' } }); } vm.changeSubscription = function () { changeSubscriptionModal.show(vm.limits.paid.total, vm.limits.paid.used, vm.subscription.end_date ).then(function () { update(); vm.onChanged(); }) } } })(); (function () { service.$inject = ["$uibModal", "confirmModalService"]; Controller.$inject = ["$uibModalInstance", "billingService", "$timeout"]; angular.module("teleds.subscribe") .service('enterPromoCodeModal', service); function service($uibModal, confirmModalService) { "ngInject" var self = this; self.show = function () { var modalInstance = $uibModal.open({ templateUrl: 'components/subscribe/components/enterPromoCodeModal/enterPromoCodeModal.html', controller: Controller, controllerAs: "vm", windowClass: 'subscribe-info-modal enter-code-modal', resolve: {} }); return modalInstance.result.then(function () { confirmModalService.show('subscribe.SuccessEnterPromoCode',null,'success',null,true); }).catch(function (show) { if(show=='show') { confirmModalService.show('subscribe.ErrorEnterPromoCode',null,null,null,true); } }); } } function Controller($uibModalInstance, billingService, $timeout) { "ngInject"; var vm = this; vm.close = function () { $uibModalInstance.dismiss(); }; vm.enter = function () { vm.submitted = true; if (!vm.form.$valid) { return; } billingService.enterCode(vm.code).then(function () { $uibModalInstance.close(); }).catch(function () { $uibModalInstance.dismiss('show'); }); }; } })(); (function () { service.$inject = ["$uibModal"]; Controller.$inject = ["$uibModalInstance"]; angular.module("teleds.subscribe") .service('buyPaidModal', service); function service($uibModal) { "ngInject" var self = this; self.show = function () { var modalInstance = $uibModal.open({ templateUrl: 'components/subscribe/components/paidSign/buyPaidModal.html', controller: Controller, controllerAs: "vm", windowClass: 'remove-modal buy-paid-modal' }); return modalInstance.result; } } function Controller($uibModalInstance) { "ngInject"; var vm = this; vm.close = function () { $uibModalInstance.dismiss(); }; vm.goToBuy = function () { $uibModalInstance.close(); }; } })(); /** * Created by denak on 19.04.2016. */ (function () { angular.module("teleds.blocks").directive('paidPlayer', ["$q", "confirmModalService", "$rootScope", function ($q, confirmModalService, $rootScope) { "ngInject"; return { transclude: true, template: '', link: function (scope, element, attrs) { var added = false; scope.$watch(attrs.paidPlayer, function (newVal, OldVal) { if (newVal && added) { element.removeClass("paid-required-wrap"); element.children().removeClass('paid-required'); element.off('click'); } else if (!newVal) { added = true; element.addClass('paid-required-wrap'); element.children().addClass('paid-required'); element.on('click', function () { confirmModalService.show("subscribe.PaidPlayer_ModalMessage", null, 'info', null,true).then(function () { } ); }); } }); $rootScope.$on('subscription.Update', function (ev, index) { }); } }; }]); })(); (function () { service.$inject = ["$uibModal"]; Controller.$inject = ["$uibModalInstance"]; angular.module("teleds.subscribe") .service('buyPaidModal', service); function service($uibModal) { "ngInject" var self = this; self.show = function () { var modalInstance = $uibModal.open({ templateUrl: 'components/subscribe/components/paidSign/buyPaidModal.html', controller: Controller, controllerAs: "vm", windowClass: 'remove-modal buy-paid-modal' }); return modalInstance.result; } } function Controller($uibModalInstance) { "ngInject"; var vm = this; vm.close = function () { $uibModalInstance.dismiss(); }; vm.goToBuy = function () { $uibModalInstance.close(); }; } })(); /** * Created by denak on 19.04.2016. */ (function () { angular.module("teleds.blocks").directive('paidSign', ["$q", "billingService", "confirmModalService", "buyPaidModal", "changeSubscriptionModal", "$rootScope", function ($q, billingService, confirmModalService, buyPaidModal, changeSubscriptionModal, $rootScope) { return { transclude: true, template: '', link: function (scope, element, attrs) { update(); $rootScope.$on('subscription.Update', function (ev, index) { update(); }); function update() { billingService.getBillingStatusWithCatch().then(function (status) { if (!status.paid) { element.addClass('paid-required-wrap'); element.children().addClass('paid-required'); element.on('click', function () { buyPaidModal.show().then(function () { changeSubscriptionModal.show(status.limits.paid.total, status.limits.paid.used, status.subscription.end_date); }); }); element.find('input').prop('disabled', true); } else { element.removeClass("paid-required-wrap"); element.children().removeClass('paid-required'); element.off('click'); element.find('input').prop('disabled', false); } }); } } }; }]); })(); (function () { service.$inject = ["$uibModal"]; Controller.$inject = ["$uibModalInstance", "$timeout", "billingService", "$scope"]; angular.module("teleds.subscribe") .service('payMethodModal', service); function service($uibModal) { "ngInject" var self = this; self.show = function () { var modalInstance = $uibModal.open({ templateUrl: 'components/subscribe/components/payMethodModal/payMethodModal.html', controller: Controller, controllerAs: "vm", windowClass: 'subscribe-info-modal subscribe-pay-method-modal', backdrop : 'static', resolve: { } }); return modalInstance.result; } } function Controller($uibModalInstance,$timeout,billingService,$scope) { "ngInject"; var vm = this; vm.close = function () { $uibModalInstance.dismiss(); }; vm.disabled =true; billingService.getBraintreeToken().then(function (result) { braintree.setup(result.token, "dropin", { container: "braintree-payment-form", onReady:function() { $scope.$apply(function () { vm.disabled =false; }) }, onPaymentMethodReceived: function (response) { vm.loading =true; var type = response.type == 'PayPalAccount' ? 'paypal_express_checkout' : 'card'; var tmp_token = response.nonce; billingService.savePaymentMethod({ 'type': type, 'token': tmp_token }).then(function () { $uibModalInstance.close(); }).catch(function (err) { console.log(err); vm.loading =false; }); return false; } }); }); } })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["billingService", "billingInfoModal", "payMethodModal"]; angular.module("teleds.subscribe").component("payMethods", component()); function component() { return { bindings: { paymentMethod:'<', billingAddress: "<", onChanged: "&" }, templateUrl: 'components/subscribe/components/payMethods/payMethods.html', controller: Controller, controllerAs: 'vm' }; } function Controller(billingService,billingInfoModal,payMethodModal) { "ngInject"; var vm = this; vm.showBillingInfo = function () { billingInfoModal.show(vm.billingAddress).then(function () { vm.onChanged(); }); }; vm.fillPaymentInfo =function () { billingInfoModal.show(vm.billingAddress).then(function () { vm.onChanged(); payMethodModal.show(); }); }; vm.changePayMethod = function () { payMethodModal.show(); } } })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["locale"]; angular.module("teleds.subscribe").component("playerDiscount", component()); function component() { return { bindings: { countPlayer:"<" }, templateUrl: 'components/subscribe/components/playerDiscount/playerDiscount.html', controller: Controller, controllerAs: 'vm' }; } function Controller(locale) { "ngInject"; var vm = this; vm.locale = locale.getLocale(); } })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["enterPromoCodeModal", "confirmModalService"]; angular.module("teleds.subscribe").component("userBalance", component()); function component() { return { bindings: { ngBalance: "<", billingAddress: "<", onChanged: "&" }, templateUrl: 'components/subscribe/components/userBalance/userBalance.html', controller: Controller, controllerAs: 'vm' }; } function Controller(enterPromoCodeModal, confirmModalService) { "ngInject"; var vm = this; vm.enterCode = function () { enterPromoCodeModal.show().then(function () { vm.onChanged(); }); }; vm.$onChanges = function () { if (vm.ngBalance) { var sum = vm.ngBalance.promotional + vm.ngBalance.refundable + vm.ngBalance.excess; vm.price = parseInt(sum); vm.priceFraction = parseInt(( sum - vm.price) * 100); if (vm.priceFraction < 9) { vm.priceFraction += "0"; } } }; } })(); /** * Created by denak on 18.04.2016. */ (function () { Controller.$inject = ["tableHelper", "notificationService", "billingService"]; angular.module("teleds.subscribe").component("userPayments", component()); function component() { return { bindings: {}, templateUrl: 'components/subscribe/components/userPayments/userPayments.html', controller: Controller, controllerAs: 'vm' }; } function Controller(tableHelper, notificationService, billingService) { "ngInject"; var vm = this; var options = tableHelper.getOptionsForAngularWayTable([false, false, false, false, false]); //options.dtOptions = options.dtOptions.withOption("scrollY", '600px'); vm.dtOptions = options.dtOptions; vm.dtColumnDefs = options.dtColumnDefs; billingService.getInvoice().then(function (result) { vm.payments = result.map(function (item) { item.date = moment.unix(item.date).format('DD.MM.YYYY HH:mm:ss'); item.url=""; return item; }); vm.payments.forEach(function (item) { billingService.getLinkInvoice(item.invoice_id).then(function (link) { item.url =link.url; }); }); return vm.payments; }); vm.download = function (payment) { billingService.getLinkInvoice(payment.invoice_id).then(function (link) { var xhr = new XMLHttpRequest(); xhr.open('GET', link.url, true); xhr.responseType = "blob"; xhr.onreadystatechange = function () { if (xhr.readyState == 4) { $scope.$apply(function () { payment.loading = false; }); if (xhr.status == 200) { saveAs(xhr.response, "invoice_" + payment.date); } else { notificationService.showError('common.InternalServerError'); } } }; payment.loading = true; xhr.send(null); }) } } })(); /** * Created by denak on 17.05.2016. */ (function () { Controller.$inject = ["$state", "billingService", "$timeout"]; angular.module("teleds.subscribe").config(config); config.$inject = ['$stateProvider']; function config($stateProvider) { $stateProvider .state('personalAccount.subscribe', { url: '/subscribe', templateUrl: 'components/subscribe/pages/subscribe/subscribe.html', controller: Controller, controllerAs: "vm" }) } function Controller($state, billingService, $timeout) { "ngInject"; var vm = this; function update() { billingService.getPaymentMethod().then(function (paymentMethod) { vm.paymentMethod = paymentMethod; }); updateBalance(); billingService.getBillingAddress().then(function (address) { vm.billingAddress = address; }) } update(); vm.onChanged = function () { update(); $timeout(updateBalance, 5000); $timeout(updateBalance, 10000); $timeout(updateBalance, 15000); }; function updateBalance() { billingService.getBalance().then(function (balance) { vm.balance = balance; }).catch(function () { vm.balance = { promotional: 0, refundable: 0, excess: 0 }; }); } } })(); /**** Variables Initiation ****/ var doc = document; var docEl = document.documentElement; var $body = $('body'); var $sidebar = $('.sidebar'); var $sidebarFooter = $('.sidebar .sidebar-footer'); var $mainContent = $('.main-content'); var $pageContent = $('.page-content'); var $topbar = $('.topbar'); var $logopanel = $('.logopanel'); var $sidebarWidth = $(".sidebar").width(); var content = document.querySelector('.page-content'); var is_RTL = false; var $loader = $('#preloader'); var docHeight = $(document).height(); var windowHeight = $(window).height(); var topbarWidth = $('.topbar').width(); var headerLeftWidth = $('.header-left').width(); var headerRightWidth = $('.header-right').width(); var start = delta = end = 0; $.cookie.defaults.path = '/'; angular.module('newApp').factory('applicationService', ['pluginsService','$rootScope', function (pluginsService,$rootScope) { /* $(document).ready(function(){ "use strict"; setTimeout(function () { $('.loader-overlay').addClass('loaded'); $('body > section').animate({ opacity: 1, }, 400); }, 500); });*/ /* ==========================================================*/ /* LAYOUTS API */ /* ========================================================= */ /* Create RTL: Sidebar on Right Side */ function enableRTL() { $('#switch-rtl').prop('checked', true); $('body').removeClass('rtl').addClass('rtl'); $('html').removeClass('rtl').addClass('rtl'); $('.sidebar').css('width', ''); $('.sidebar .searchform input').css('width', ''); $('.sidebar .sidebar-footer').css('width', ''); $('.logopanel').css('width', ''); $('.searchform input').css('width', ''); $('.sidebar .sidebar-footer .pull-left').css(''); $('.main-content').css('margin-left', ''); $('.topbar').css('left', ''); if ($('body').hasClass('sidebar-hover')) sidebarHover(); $('#switch-rtl').prop('checked', true); handleboxedLayout(); $.cookie('rtl', 1, {path: '/'}); } /* Remove RTL: Sidebar on Left Side */ function disableRTL() { $('#switch-rtl').prop('checked', false); $('html').removeClass('rtl'); $('body').removeClass('rtl'); $('.sidebar').css('width', ''); $('.sidebar').css('left', ''); $('.sidebar .searchform input').css('width', ''); $('.sidebar .sidebar-footer').css('width', ''); $('.logopanel').css('width', ''); $('.searchform input').css('width', ''); $('.sidebar .sidebar-footer .pull-left').css(''); $('.main-content').css('margin-right', ''); $('.topbar').css('right', ''); if ($('body').hasClass('sidebar-hover')) sidebarHover(); handleboxedLayout(); $.removeCookie('rtl', {path: '/'}); } /* Toggle RTL */ function toggleRTL() { if ($('html').hasClass('rtl')) disableRTL(); else enableRTL(); } /* Create Sidebar Fixed */ function handleSidebarFixed() { // removeSidebarHover(); $('#switch-sidebar').prop('checked', true); $('#switch-submenu').prop('checked', false); $.removeCookie('submenu-hover'); if ($('body').hasClass('sidebar-top')) { $('body').removeClass('fixed-topbar').addClass('fixed-topbar'); $.removeCookie('fluid-topbar'); $('#switch-topbar').prop('checked', true); } $('body').removeClass('fixed-sidebar').addClass('fixed-sidebar'); $('.sidebar').height(''); handleboxedLayout(); if (!$('body').hasClass('sidebar-collapsed')) removeSubmenuHover(); createSideScroll(); $.removeCookie('fluid-sidebar', {path: '/'}); $.cookie('fixed-sidebar', 1, {path: '/'}); } /* Create Sidebar Fluid / Remove Sidebar Fixed */ function handleSidebarFluid() { $('#switch-sidebar').prop('checked', false); if ($('body').hasClass('sidebar-hover')) { removeSidebarHover(); $('#switch-sidebar-hover').prop('checked', false); } $('body').removeClass('fixed-sidebar'); handleboxedLayout(); destroySideScroll(); $.removeCookie('fixed-sidebar', {path: '/'}); $.cookie('fluid-sidebar', 1, {path: '/'}); } /* Toggle Sidebar Fixed / Fluid */ function toggleSidebar() { if ($('body').hasClass('fixed-sidebar')) handleSidebarFluid(); else handleSidebarFixed(); } /* Create Sidebar only visible on Hover */ function createSidebarHover() { $('body').addClass('sidebar-hover'); $('body').removeClass('fixed-sidebar').addClass('fixed-sidebar'); $('.main-content').css('margin-left', '').css('margin-right', ''); $('.topbar').css('left', '').css('right', ''); $('body').removeClass('sidebar-top'); removeSubmenuHover(); removeBoxedLayout(); removeCollapsedSidebar(); sidebarHover(); handleSidebarFixed(); $('#switch-sidebar-hover').prop('checked', true); $('#switch-sidebar').prop('checked', true); $('#switch-sidebar-top').prop('checked', false); $('#switch-boxed').prop('checked', false); $.removeCookie('fluid-topbar'); $.removeCookie('fluid-topbar', {path: '/'}); $.removeCookie('sidebar-top', {path: '/'}); $.cookie('sidebar-hover', 1, {path: '/'}); } /* Remove Sidebar on Hover */ function removeSidebarHover() { $('#switch-sidebar-hover').prop('checked', false); $('body').removeClass('sidebar-hover'); if (!$('body').hasClass('boxed')) $('.sidebar, .sidebar-footer').attr('style', ''); $('.logopanel2').remove(); $.removeCookie('sidebar-hover', {path: '/'}); } /* Toggle Sidebar on Top */ function toggleSidebarHover() { if ($('body').hasClass('sidebar-hover')) removeSidebarHover(); else createSidebarHover(); } /* Create Sidebar Submenu visible on Hover */ function createSubmenuHover() { removeSidebarHover(); handleSidebarFluid(); $('#switch-submenu-hover').prop('checked', true); $('body').addClass('submenu-hover'); $('.nav-sidebar .children').css('display', ''); $.cookie('submenu-hover', 1, {path: '/'}); $('#switch-sidebar').prop('checked', false); } /* Remove Submenu on Hover */ function removeSubmenuHover() { $('#switch-submenu-hover').prop('checked', false); $('body').removeClass('submenu-hover'); $('.nav-sidebar .nav-parent.active .children').css('display', 'block'); $.removeCookie('submenu-hover', {path: '/'}); } /* Toggle Submenu on Hover */ function toggleSubmenuHover() { if ($('body').hasClass('submenu-hover')) removeSubmenuHover(); else createSubmenuHover(); } /* Create Topbar Fixed */ function handleTopbarFixed() { $('#switch-topbar').prop('checked', true); $('body').removeClass('fixed-topbar').addClass('fixed-topbar'); $.removeCookie('fluid-topbar'); $.removeCookie('fluid-topbar', {path: '/'}); } /* Create Topbar Fluid / Remove Topbar Fixed */ function handleTopbarFluid() { $('#switch-topbar').prop('checked', false); $('body').removeClass('fixed-topbar'); if ($('body').hasClass('sidebar-top') && $('body').hasClass('fixed-sidebar')) { $('body').removeClass('fixed-sidebar'); $('#switch-sidebar').prop('checked', false); } $.cookie('fluid-topbar', 1, {path: '/'}); } /* Toggle Topbar Fixed / Fluid */ function toggleTopbar() { if ($('body').hasClass('fixed-topbar')) handleTopbarFluid(); else handleTopbarFixed(); } /* Adjust margin of content for boxed layout */ function handleboxedLayout() { if ($('body').hasClass('builder-admin')) return; $logopanel.css('left', '').css('right', ''); $topbar.css('width', ''); $sidebar.css('margin-left', '').css('margin-right', ''); $sidebarFooter.css('left', '').css('right', ''); if ($('body').hasClass('boxed')) { windowWidth = $(window).width(); windowHeight = $(window).height(); pageContentHeight = $('.page-content').height(); var container = 1200; topbarWidth = (container - $sidebarWidth); var margin = (windowWidth - 1200) / 2; if (!$('body').hasClass('sidebar-top') && windowWidth > 1220) { if ($('body').hasClass('rtl')) { $logopanel.css('right', margin); if ($('body').hasClass('sidebar-collapsed')) { $topbar.css('width', 1200); } else { if ($('body').hasClass('fixed-sidebar')) { $sidebar.css('margin-right', margin); topbarWidth = (1200 - $sidebarWidth); $('.topbar').css('width', topbarWidth); } $sidebarFooter.css('right', margin); $topbar.css('width', topbarWidth); } } else { $logopanel.css('left', margin); if ($('body').hasClass('sidebar-collapsed')) { $topbar.css('width', 1200); } else { if ($('body').hasClass('fixed-sidebar')) { $sidebar.css('margin-left', margin); topbarWidth = (1200 - $sidebarWidth); $('.topbar').css('width', topbarWidth); } $sidebarFooter.css('left', margin); $topbar.css('width', topbarWidth); } } $.backstretch(["../../../assets/global/images/gallery/bg1.jpg", "../../../assets/global/images/gallery/bg2.jpg", "../../../assets/global/images/gallery/bg3.jpg", "../../../assets/global/images/gallery/bg4.jpg"], { fade: 3000, duration: 4000 }); } else { $('.backstretch').remove(); } } } /* Create Boxed Layout */ function createBoxedLayout() { removeSidebarHover(); $('body').addClass('boxed'); handleboxedLayout(); $('#switch-boxed').prop('checked', true); $.cookie('boxed-layout', 1, {path: '/'}); } /* Remove boxed layout */ function removeBoxedLayout() { if ($('body').hasClass('boxed')) { $('body').removeClass('boxed'); $logopanel.css('left', '').css('right', ''); $topbar.css('width', ''); $sidebar.css('margin-left', '').css('margin-right', ''); $sidebarFooter.css('left', '').css('right', ''); $.removeCookie('boxed-layout', {path: '/'}); $('#switch-boxed').prop('checked', false); $.backstretch("destroy"); } } function toggleboxedLayout() { if ($('body').hasClass('boxed')) removeBoxedLayout(); else createBoxedLayout(); } /* Toggle Sidebar Collapsed */ function collapsedSidebar() { if ($body.width() >= 1100) { if (!$body.hasClass('sidebar-collapsed')) createCollapsedSidebar(); else removeCollapsedSidebar(); } else { if ($body.hasClass('sidebar-show')) $body.removeClass('sidebar-show'); else $body.addClass('sidebar-show'); } handleboxedLayout(); $rootScope.$emit('resize.allTables'); } function createCollapsedSidebar() { $body.addClass('sidebar-collapsed'); $('.sidebar').css('width', '').resizable().resizable('destroy'); $('.nav-sidebar ul').attr('style', ''); $(this).addClass('menu-collapsed'); destroySideScroll(); $('#switch-sidebar').prop('checked'); $.cookie('sidebar-collapsed', 1, {path: '/'}); } function removeCollapsedSidebar() { $body.removeClass('sidebar-collapsed'); if (!$body.hasClass('submenu-hover')) $('.nav-sidebar li.active ul').css({ display: 'block' }); $(this).removeClass('menu-collapsed'); if ($body.hasClass('sidebar-light') && !$body.hasClass('sidebar-fixed')) { $('.sidebar').height(''); } createSideScroll(); $.removeCookie('sidebar-collapsed', {path: '/'}); } /* Reset to Default Style, remove all cookie and custom layouts */ function resetStyle() { $('#reset-style').on('click', function (event) { event.preventDefault(); removeBoxedLayout(); removeSidebarHover(); removeSubmenuHover(); removeCollapsedSidebar(); disableRTL(); $.removeCookie('rtl'); $.removeCookie('main-color'); $.removeCookie('main-name'); $.removeCookie('theme'); $.removeCookie('bg-name'); $.removeCookie('bg-color'); $.removeCookie('submenu-hover'); $.removeCookie('sidebar-collapsed'); $.removeCookie('boxed-layout'); $.removeCookie('boxed-layout', {path: '/'}); $.removeCookie('rtl', {path: '/'}); $.removeCookie('main-color', {path: '/'}); $.removeCookie('main-name', {path: '/'}); $.removeCookie('theme', {path: '/'}); $.removeCookie('bg-name', {path: '/'}); $.removeCookie('bg-color', {path: '/'}); $.removeCookie('submenu-hover', {path: '/'}); $.removeCookie('sidebar-collapsed', {path: '/'}); $('body').removeClass(function (index, css) { return (css.match(/(^|\s)bg-\S+/g) || []).join(' '); }); $('body').removeClass(function (index, css) { return (css.match(/(^|\s)color-\S+/g) || []).join(' '); }); $('body').removeClass(function (index, css) { return (css.match(/(^|\s)theme-\S+/g) || []).join(' '); }); $('body').addClass('theme-sdtl').addClass('color-default'); $('.builder .theme-color').removeClass('active'); $('.theme-color').each(function () { if ($(this).data('color') == '#319DB5') $(this).addClass('active'); }); $('.builder .theme').removeClass('active'); $('.builder .theme-default').addClass('active'); $('.builder .sp-replacer').removeClass('active'); }); } /******************** END LAYOUT API ************************/ /* ========================================================= */ /**** Full Screen Toggle ****/ function toggleFullScreen() { if (!doc.fullscreenElement && !doc.msFullscreenElement && !doc.webkitIsFullScreen && !doc.mozFullScreenElement) { if (docEl.requestFullscreen) { docEl.requestFullscreen(); } else if (docEl.webkitRequestFullScreen) { docEl.webkitRequestFullscreen(); } else if (docEl.webkitRequestFullScreen) { docEl.webkitRequestFullScreen(); } else if (docEl.msRequestFullscreen) { docEl.msRequestFullscreen(); } else if (docEl.mozRequestFullScreen) { docEl.mozRequestFullScreen(); } } else { if (doc.exitFullscreen) { doc.exitFullscreen(); } else if (doc.webkitExitFullscreen) { doc.webkitExitFullscreen(); } else if (doc.webkitCancelFullScreen) { doc.webkitCancelFullScreen(); } else if (doc.msExitFullscreen) { doc.msExitFullscreen(); } else if (doc.mozCancelFullScreen) { doc.mozCancelFullScreen(); } } } /* Simulate Ajax call on Panel with reload effect */ function blockUI(item) { $(item).block({ message: '', css: { border: 'none', width: '14px', backgroundColor: 'none' }, overlayCSS: { backgroundColor: '#fff', opacity: 0.6, cursor: 'wait' } }); } function unblockUI(item) { $(item).unblock(); } /**** PANEL ACTIONS ****/ /* Create Portlets Controls automatically: reload, fullscreen, toggle, remove, popout */ function handlePanelControls() { $('.panel-controls').each(function () { var controls_html = '
' + '' + '' + '' + '' + '' + '' + '' + '
'; $(this).append(controls_html); }); } function handlePanelAction() { handlePanelControls(); // Remove Panel $(".panel-header .panel-close").click(function (event) { event.preventDefault(); $item = $(this).parents(".panel:first"); bootbox.confirm("Are you sure to remove this panel?", function (result) { if (result === true) { $item.addClass("animated bounceOutRight"); window.setTimeout(function () { $item.remove(); }, 300); } }); }); // Toggle Panel Content $(".panel-header .panel-toggle").click(function (event) { event.preventDefault(); $(this).toggleClass("closed").parents(".panel:first").find(".panel-content").slideToggle(); }); // Popout / Popin Panel $(".panel-header .panel-popout").click(function (event) { event.preventDefault(); var panel = $(this).parents(".panel:first"); if (panel.hasClass("modal-panel")) { $("i", this).removeClass("icons-office-55").addClass("icons-office-58"); panel.removeAttr("style").removeClass("modal-panel"); panel.find(".panel-maximize,.panel-toggle").removeClass("nevershow"); panel.draggable("destroy").resizable("destroy"); } else { panel.removeClass("maximized"); panel.find(".panel-maximize,.panel-toggle").addClass("nevershow"); $("i", this).removeClass("icons-office-58").addClass("icons-office-55"); var w = panel.width(); var h = panel.height(); panel.addClass("modal-panel").removeAttr("style").width(w).height(h); $(panel).draggable({ handle: ".panel-header", containment: ".page-content" }).css({ "left": panel.position().left - 10, "top": panel.position().top + 2 }).resizable({ minHeight: 150, minWidth: 200 }); } window.setTimeout(function () { $("body").trigger("resize"); }, 300); }); // Reload Panel Content $('.panel-header .panel-reload').click(function (event) { event.preventDefault(); event.stopPropagation(); var el = $(this).parents(".panel:first"); blockUI(el); window.setTimeout(function () { unblockUI(el); }, 1800); }); // Maximize Panel Dimension $(".panel-header .panel-maximize").click(function (event) { event.preventDefault(); var panel = $(this).parents(".panel:first"); $body.toggleClass("maximized-panel"); panel.removeAttr("style").toggleClass("maximized"); maximizePanel(); if (panel.hasClass("maximized")) { panel.parents(".portlets:first").sortable("destroy"); $(window).trigger('resize'); } else { $(window).trigger('resize'); panel.parent().height(''); pluginsService.sortablePortlets(); } $("i", this).toggleClass("icon-size-fullscreen").toggleClass("icon-size-actual"); panel.find(".panel-toggle").toggleClass("nevershow"); $("body").trigger("resize"); return false; }); } function maximizePanel() { if ($('.maximized').length) { var panel = $('.maximized'); var windowHeight = $(window).height() - 2; panelHeight = panel.find('.panel-header').height() + panel.find('.panel-content').height() + 100; if (panel.hasClass('maximized')) { if (windowHeight > panelHeight) panel.parent().height(windowHeight); else { if ($('.main-content').height() > panelHeight) { panel.parent().height($('.main-content').height()); } else { panel.parent().height(panelHeight); } } } else { panel.parent().height(''); } } } /**** Custom Scrollbar ****/ /* Create Custom Scroll for elements like Portlets or Dropdown menu */ function customScroll() { if ($.fn.mCustomScrollbar) { $('.withScroll').each(function () { $(this).mCustomScrollbar("destroy"); var scroll_height = $(this).data('height') ? $(this).data('height') : 'auto'; var data_padding = $(this).data('padding') ? $(this).data('padding') : 0; if ($(this).data('height') == 'window') { thisHeight = $(this).height(); windowHeight = $(window).height() - data_padding - 50; if (thisHeight < windowHeight) scroll_height = thisHeight; else scroll_height = windowHeight; } $(this).mCustomScrollbar({ scrollButtons: { enable: false }, autoHideScrollbar: $(this).hasClass('show-scroll') ? false : true, scrollInertia: 150, theme: "light", set_height: scroll_height, advanced: { updateOnContentResize: true } }); }); } } /* ==========================================================*/ /* BEGIN SIDEBAR */ /* Sidebar Sortable menu & submenu */ function handleSidebarSortable() { $('.menu-settings').on('click', '#reorder-menu', function (e) { e.preventDefault(); $('.nav-sidebar').removeClass('remove-menu'); $(".nav-sidebar").sortable({ connectWith: ".nav-sidebar > li", handle: "a", placeholder: "nav-sidebar-placeholder", opacity: 0.5, axis: "y", dropOnEmpty: true, forcePlaceholderSize: true, receive: function (event, ui) { $("body").trigger("resize") } }); /* Sortable children */ $(".nav-sidebar .children").sortable({ connectWith: "li", handle: "a", opacity: 0.5, dropOnEmpty: true, forcePlaceholderSize: true, receive: function (event, ui) { $("body").trigger("resize") } }); $(this).attr("id", "end-reorder-menu"); $(this).html('End reorder menu'); $('.remove-menu').attr("id", "remove-menu").html('Remove menu'); }); /* End Sortable Menu Elements*/ $('.menu-settings').on('click', '#end-reorder-menu', function (e) { e.preventDefault(); $(".nav-sidebar").sortable(); $(".nav-sidebar").sortable("destroy"); $(".nav-sidebar .children").sortable().sortable("destroy"); $(this).attr("id", "remove-menu").html('Reorder menu'); }); } /* Sidebar Remove Menu Elements*/ function handleSidebarRemove() { /* Remove Menu Elements*/ $('.menu-settings').on('click', '#remove-menu', function (e) { e.preventDefault(); $(".nav-sidebar").sortable(); $(".nav-sidebar").sortable("destroy"); $(".nav-sidebar .children").sortable().sortable("destroy"); $('.nav-sidebar').removeClass('remove-menu').addClass('remove-menu'); $(this).attr("id", "end-remove-menu").html('End remove menu'); $('.reorder-menu').attr("id", "reorder-menu").html('Reorder menu'); }); /* End Remove Menu Elements*/ $('.menu-settings').on('click', '#end-remove-menu', function (e) { e.preventDefault(); $('.nav-sidebar').removeClass('remove-menu'); $(this).attr("id", "remove-menu").html('Remove menu'); }); $('.sidebar').on('click', '.remove-menu > li', function () { $menu = $(this); if ($(this).hasClass('nav-parent')) $remove_txt = "Are you sure to remove this menu (all submenus will be deleted too)?"; else $remove_txt = "Are you sure to remove this menu?"; bootbox.confirm($remove_txt, function (result) { if (result === true) { $menu.addClass("animated bounceOutLeft"); window.setTimeout(function () { $menu.remove(); }, 300); } }); }); } /* Hide User & Search Sidebar */ function handleSidebarHide() { hiddenElements = $(':hidden'); visibleElements = $(':visible'); $('.menu-settings').on('click', '#hide-top-sidebar', function (e) { e.preventDefault(); var this_text = $(this).text(); $('.sidebar .sidebar-top').slideToggle(300); if (this_text == 'Hide user & search') { $(this).text('Show user & search'); } }); $('.topbar').on('click', '.toggle-sidebar-top', function (e) { e.preventDefault(); $('.sidebar .sidebar-top').slideToggle(300); if ($('.toggle-sidebar-top span').hasClass('icon-user-following')) { $('.toggle-sidebar-top span').removeClass('icon-user-following').addClass('icon-user-unfollow'); } else { $('.toggle-sidebar-top span').removeClass('icon-user-unfollow').addClass('icon-user-following'); } }); } /* Change statut of user in sidebar: available, busy, away, invisible */ function changeUserStatut() { $('.sidebar').on('click', '.user-login li a', function (e) { e.preventDefault(); var statut = $(this).find('span').text(); currentStatut = $('.user-login button span').text(); $('.user-login button span').text(statut); if (statut == 'Busy') { $('.user-login button i:not(.fa)').removeClass().addClass('busy'); } if (statut == 'Invisible') { $('.user-login button i:not(.fa)').removeClass().addClass('turquoise'); } if (statut == 'Away') { $('.user-login button i:not(.fa)').removeClass().addClass('away'); } }); } /* Create custom scroll for sidebar used for fixed sidebar */ function createSideScroll() { if ($.fn.mCustomScrollbar) { destroySideScroll(); if (!$('body').hasClass('sidebar-collapsed') && !$('body').hasClass('sidebar-collapsed') && !$('body').hasClass('submenu-hover') && $('body').hasClass('fixed-sidebar')) { $('.sidebar-inner').mCustomScrollbar({ scrollButtons: { enable: false }, autoHideScrollbar: true, scrollInertia: 150, theme: "light-thin", advanced: { updateOnContentResize: true } }); } if ($('body').hasClass('sidebar-top')) { destroySideScroll(); } } } /* Destroy sidebar custom scroll */ function destroySideScroll() { $('.sidebar-inner').mCustomScrollbar("destroy"); } /* Toggle submenu open */ function toggleSidebarMenu() { // Check if sidebar is collapsed if ($('body').hasClass('sidebar-collapsed') || $('body').hasClass('sidebar-top') || $('body').hasClass('submenu-hover')) $('.nav-sidebar .children').css({ display: '' }); else $('.nav-active.active .children').css('display', 'block'); $('.sidebar').on('click', '.nav-sidebar li:not(.nav-parent) > a', function (e) { e.preventDefault(); if ($('body').hasClass('sidebar-collapsed') && !$('body').hasClass('sidebar-hover')) return; if ($('body').hasClass('submenu-hover')) return; var parent = $(this).parent().parent(); parent.children('li.active').children('.children').slideUp(200); $('.nav-sidebar .arrow').removeClass('active'); // parent.children('li.active').removeClass('active'); if(!$(this).hasClass('nav-parent')) { parent.children('li.active.nav-parent').removeClass('active'); } }); $('.sidebar').on('click', '.nav-sidebar li.nav-parent > a', function (e) { e.preventDefault(); if ($('body').hasClass('sidebar-collapsed') && !$('body').hasClass('sidebar-hover')) return; if ($('body').hasClass('submenu-hover')) return; var parent = $(this).parent().parent(); parent.children('li.active').children('.children').slideUp(200); $('.nav-sidebar .arrow').removeClass('active'); //parent.children('li.active').removeClass('active'); var sub = $(this).next(); if (sub.is(":visible")) { sub.children().addClass('hidden-item') $(this).parent().removeClass("active"); sub.slideUp(200, function () { sub.children().removeClass('hidden-item') }); } else { //$(this).find('.arrow').addClass('active'); sub.children().addClass('is-hidden'); setTimeout(function () { sub.children().addClass('is-shown'); }, 0); sub.slideDown(200, function () { // $(this).parent().addClass("active"); setTimeout(function () { sub.children().removeClass('is-hidden').removeClass('is-shown'); }, 500); }); } }); } /**** Handle Sidebar Widgets ****/ function sidebarWidgets() { /* Folders Widget */ if ($('.sidebar-widgets .folders').length) { $('.new-folder').on('click', function () { $('.sidebar-widgets .add-folder').show(); return false; }); $(".add-folder input").keypress(function (e) { if (e.which == 13) { $('.sidebar-widgets .add-folder').hide(); $('
  • ' + $(this).val() + '
  • ').insertBefore(".add-folder"); $(this).val(''); } }); $('.main-content').click(function (ev) { addFolder = document.getElementById('add-folder'); var target = ev.target; if (target !== addFolder) { $('.sidebar-widgets .add-folder').hide(); } }); } /* Labels Widget */ if ($('.sidebar-widgets .folders').length) { $('.new-label').on('click', function () { $('.sidebar-widgets .add-label').show(); return false; }); $(".add-label input").keypress(function (e) { if (e.which == 13) { $('.sidebar-widgets .add-label').hide(); $('
  • ' + $(this).val() + '
  • ').insertBefore(".add-label"); $(this).val(''); } }); $('.main-content').click(function (ev) {// addFolder = document.getElementById('add-label'); var target = ev.target; if (target !== addFolder) { $('.sidebar-widgets .add-label').hide(); } }); } /* Sparkline Widget */ if ($.fn.sparkline && $('.dynamicbar1').length) { var myvalues1 = [13, 14, 16, 15, 11, 14, 20, 14, 12, 16, 11, 17, 19, 16]; var myvalues2 = [14, 17, 16, 12, 18, 16, 22, 15, 14, 17, 11, 18, 11, 12]; var myvalues3 = [18, 14, 15, 14, 15, 12, 21, 16, 18, 14, 12, 15, 17, 19]; var sparkline1 = $('.dynamicbar1').sparkline(myvalues1, { type: 'bar', barColor: '#319DB5', barWidth: 4, barSpacing: 1, height: '28px' }); var sparkline2 = $('.dynamicbar2').sparkline(myvalues2, { type: 'bar', barColor: '#C75757', barWidth: 4, barSpacing: 1, height: '28px' }); var sparkline3 = $('.dynamicbar3').sparkline(myvalues3, { type: 'bar', barColor: '#18A689', barWidth: 4, barSpacing: 1, height: '28px' }); } ; /* Progress Bar Widget */ if ($('.sidebar-widgets .progress-chart').length) { $(window).load(function () { setTimeout(function () { $('.sidebar-widgets .progress-chart .stat1').progressbar(); }, 900); setTimeout(function () { $('.sidebar-widgets .progress-chart .stat2').progressbar(); }, 1200); setTimeout(function () { $('.sidebar-widgets .progress-chart .stat3').progressbar(); }, 1500); }); } ; $('.sidebar').on('click', '.hide-widget', function (e) { e.preventDefault(); if (start == 0) { start = new Date().getTime(); $(this).toggleClass('widget-hidden'); var this_widget = $(this).parent().parent().next(); this_widget.slideToggle(200, function () { createSideScroll(); }); end = new Date().getTime(); delta = end - start; } else { end = new Date().getTime(); delta = end - start; if (delta > 200) { start = new Date().getTime(); $(this).toggleClass('widget-hidden'); var this_widget = $(this).parent().parent().next(); this_widget.slideToggle(200, function () { createSideScroll(); }); end = new Date().getTime(); delta = end - start; } } }); } /* END SIDEBAR */ /* ========================================================= */ /* Switch Top navigation to Sidebar */ function reposition_topnav() { if ($('.nav-horizontal').length > 0) { topbarWidth = $('.topbar').width(); headerRightWidth = $('.header-right').width(); if ($('.header-left .nav-horizontal').length) headerLeftWidth = $('.header-left').width() + 40; else headerLeftWidth = $('.nav-sidebar.nav-horizontal > li').length * 140; var topbarSpace = topbarWidth - headerLeftWidth - headerRightWidth; // top navigation move to left nav if not enough space in topbar if ($('.nav-horizontal').css('position') == 'initial' || topbarSpace < 0) { if ($('.sidebar .nav-sidebar').length == 2) { $('.nav-horizontal').insertAfter('.nav-sidebar:eq(1)'); } else { // only add to bottom if .nav-horizontal is not yet in the left panel if ($('.sidebar .nav-horizontal').length == 0) { $('.nav-horizontal').appendTo('.sidebar-inner'); $('.sidebar-widgets').css('margin-bottom', 20); } } $('.nav-horizontal').css({ display: 'block' }).addClass('nav-sidebar').css('margin-bottom', 100); createSideScroll(); $('.nav-horizontal .children').removeClass('dropdown-menu'); $('.nav-horizontal > li').each(function () { $(this).removeClass('open'); $(this).find('a').removeAttr('class'); $(this).find('a').removeAttr('data-toggle'); }); /* We hide mega menu in sidebar since video / images are too big and not adapted to sidebar */ if ($('.nav-horizontal').hasClass('mmenu')) $('.nav-horizontal.mmenu').css('height', 0).css('overflow', 'hidden'); } else { if ($('.sidebar .nav-horizontal').length > 0) { $('.sidebar-widgets').css('margin-bottom', 100); $('.nav-horizontal').removeClass('nav-sidebar').appendTo('.topnav'); $('.nav-horizontal .children').addClass('dropdown-menu').removeAttr('style'); $('.nav-horizontal li:last-child').show(); $('.nav-horizontal > li > a').each(function () { $(this).parent().removeClass('active'); if ($(this).parent().find('.dropdown-menu').length > 0) { $(this).attr('class', 'dropdown-toggle'); $(this).attr('data-toggle', 'dropdown'); } }); } /* If mega menu, we make it visible */ if ($('.nav-horizontal').hasClass('mmenu')) $('.nav-horizontal.mmenu').css('height', '').css('overflow', ''); } } } /***** Scroll to top button *****/ function scrollTop() { $(window).scroll(function () { if ($(this).scrollTop() > 100) { $('.scrollup').fadeIn(); } else { $('.scrollup').fadeOut(); } }); $('.scrollup').click(function () { $("html, body").animate({ scrollTop: 0 }, 1000); return false; }); } function sidebarBehaviour() { windowWidth = $(window).width(); windowHeight = $(window).height() - $('.topbar').height(); sidebarMenuHeight = $('.nav-sidebar').height(); if (windowWidth < 1024) { $('body').removeClass('sidebar-collapsed'); } if ($('body').hasClass('sidebar-collapsed') && sidebarMenuHeight > windowHeight) { $('body').removeClass('fixed-sidebar'); destroySideScroll(); } } /* Function for datables filter in head */ function stopPropagation(evt) { if (evt.stopPropagation !== undefined) { evt.stopPropagation(); } else { evt.cancelBubble = true; } } function detectIE() { var ua = window.navigator.userAgent; var msie = ua.indexOf('MSIE '); var trident = ua.indexOf('Trident/'); var edge = ua.indexOf('Edge/'); if (msie > 0 || trident > 0 || edge > 0) { $('html').addClass('ie-browser'); } } function mobileSidebar() { $('html').on('click', '.sidebar-show .nav-sidebar li:not(.nav-parent) > a', function () { $('body').removeClass('sidebar-show'); }); } /**** Initiation of Main Functions ****/ function init() { /* ==========================================================*/ /* APPLICATION SCRIPTS */ /* ========================================================= */ doc = document; docEl = document.documentElement; $body = $('body'); $sidebar = $('.sidebar'); $sidebarFooter = $('.sidebar .sidebar-footer'); $mainContent = $('.main-content'); $pageContent = $('[ng-view]'); $topbar = $('.topbar'); $logopanel = $('.logopanel'); $sidebarWidth = $(".sidebar").width(); content = document.querySelector('[ng-view]'); is_RTL = false; $loader = $('#preloader'); docHeight = $(document).height(); windowHeight = $(window).height(); topbarWidth = $('.topbar').width(); headerLeftWidth = $('.header-left').width(); headerRightWidth = $('.header-right').width(); start = delta = end = 0; $('[data-toggle]').on('click', function (event) { event.preventDefault(); var toggleLayout = $(this).data('toggle'); if (toggleLayout == 'rtl') toggleRTL(); if (toggleLayout == 'sidebar-behaviour') toggleSidebar(); if (toggleLayout == 'submenu') toggleSubmenuHover(); if (toggleLayout == 'sidebar-collapsed') collapsedSidebar(); if (toggleLayout == 'sidebar-hover') toggleSidebarHover(); if (toggleLayout == 'boxed') toggleboxedLayout(); if (toggleLayout == 'topbar') toggleTopbar(); }); if ($('body').hasClass('rtl')) { is_RTL = true; } $('.toggle_fullscreen').click(function () { toggleFullScreen(); }); // Add class everytime a mouse pointer hover over it var hoverTimeout; $('.nav-sidebar > li').hover(function () { clearTimeout(hoverTimeout); $(this).siblings().removeClass('nav-hover'); $(this).addClass('nav-hover'); }, function () { var $self = $(this); hoverTimeout = setTimeout(function () { $self.removeClass('nav-hover'); }, 200); }); $('.nav-sidebar > li .children').hover(function () { clearTimeout(hoverTimeout); $(this).closest('.nav-parent').siblings().removeClass('nav-hover'); $(this).closest('.nav-parent').addClass('nav-hover'); }, function () { var $self = $(this); hoverTimeout = setTimeout(function () { $(this).closest('.nav-parent').removeClass('nav-hover'); }, 200); }); // Check if sidebar is collapsed if ($('body').hasClass('sidebar-collapsed')) $('.nav-sidebar .children').css({ display: '' }); // Handles form inside of dropdown $('.dropdown-menu').find('form').click(function (e) { e.stopPropagation(); }); createSideScroll(); toggleSidebarMenu(); customScroll(); // handleSidebarSortable(); sidebarWidgets(); reposition_topnav(); handleSidebarRemove(); handleSidebarHide(); changeUserStatut(); // handlePanelAction(); scrollTop(); sidebarBehaviour(); detectIE(); mobileSidebar(); setTimeout(function () { handleboxedLayout(); }, 100); if ($('body').hasClass('sidebar-hover')) sidebarHover(); }; /**** Resize Event Functions ****/ $(window).resize(function () { setTimeout(function () { customScroll(); reposition_topnav(); if (!$('body').hasClass('fixed-sidebar') && !$('body').hasClass('builder-admin')) sidebarBehaviour(); handleboxedLayout(); maximizePanel(); }, 100); }); var applicationService = {}; applicationService.init = init; applicationService.toggleRTL = toggleRTL; applicationService.handleSidebarFluid = handleSidebarFluid; applicationService.handleSidebarSortable = handleSidebarSortable; applicationService.handleSidebarHide = handleSidebarHide; applicationService.handleSidebarRemove = handleSidebarRemove; applicationService.customScroll = customScroll; applicationService.handleSidebarFixed = handleSidebarFixed; applicationService.handleTopbarFixed = handleTopbarFixed; applicationService.handleTopbarFluid = handleTopbarFluid; applicationService.createSidebarHover = createSidebarHover; applicationService.removeSidebarHover = removeSidebarHover; applicationService.createSubmenuHover = createSubmenuHover; applicationService.removeSubmenuHover = removeSubmenuHover; applicationService.createBoxedLayout = createBoxedLayout; applicationService.removeBoxedLayout = removeBoxedLayout; applicationService.resetStyle = resetStyle; applicationService.disableRTL = disableRTL; applicationService.enableRTL = enableRTL; applicationService.toggleSidebar = toggleSidebar; applicationService.toggleSubmenuHover = toggleSubmenuHover; applicationService.collapsedSidebar = collapsedSidebar; applicationService.toggleSidebarHover = toggleSidebarHover; applicationService.toggleboxedLayout = toggleboxedLayout; applicationService.toggleTopbar = toggleTopbar; applicationService.handlePanelAction = handlePanelAction; return applicationService; }]); angular.module('newApp') .factory('builderService', ['applicationService', function (applicationService) { var builderService = {}; /* ============================================================ * Builder Script =========================================================== */ $.cookie.defaults.path = '/'; /**** BUILDER FUNCTIONS ****/ function toggleBuilder() { $('.builder-toggle').on('click', function () { if ($('#builder').hasClass('open')) $('#builder').removeClass('open'); else $('#builder').addClass('open'); }); } /* Active Custom Scroll for Builder Sidebar */ function builderScroll() { $('.builder .inner').mCustomScrollbar("destroy"); scroll_height = "100%"; $('.builder .inner').mCustomScrollbar({ scrollButtons: { enable: false }, autoHideScrollbar: true, scrollInertia: 150, theme: "light", set_height: scroll_height, advanced: { updateOnContentResize: true } }); } /* Destroy sidebar custom scroll */ function destroySideScroll() { $('.sidebar-inner').mCustomScrollbar("destroy"); } /* Enable / Disable Layouts */ function handleLayout() { $('.layout-option input').on('click', function () { var layout = $(this).attr('data-layout'); var is_checked = $(this).prop('checked'); if (layout == 'sidebar' && is_checked == true) applicationService.handleSidebarFixed(); if (layout == 'sidebar' && is_checked == false) applicationService.handleSidebarFluid(); if (layout == 'topbar' && is_checked == true) applicationService.handleTopbarFixed(); if (layout == 'topbar' && is_checked == false) applicationService.handleTopbarFluid(); if (layout == 'sidebar-hover' && is_checked == true) applicationService.createSidebarHover(); if (layout == 'sidebar-hover' && is_checked == false) applicationService.removeSidebarHover(); if (layout == 'submenu-hover' && is_checked == true) applicationService.createSubmenuHover(); if (layout == 'submenu-hover' && is_checked == false) applicationService.removeSubmenuHover(); if (layout == 'boxed' && is_checked == true) applicationService.createBoxedLayout(); if (layout == 'boxed' && is_checked == false) applicationService.removeBoxedLayout(); }); } /* Main Color */ function mainColor() { $('.theme-color').on('click', function (e) { e.preventDefault(); var main_color = $(this).data('color'); var main_name = $(this).attr('data-main'); $('body').removeClass(function (index, css) { return (css.match(/(^|\s)color-\S+/g) || []).join(' '); }); $('body').addClass('color-' + main_name); $('.theme-color').removeClass('active'); $(this).addClass('active'); if ($(this).data('main') == 'default') { $('.theme-left').css('background-color', '#202226'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#393E44'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#fff'); $('.sltl .theme-left').css('background-color', '#fff'); } if ($(this).data('main') == 'primary') { $('.theme-left').css('background-color', '#319DB5'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#164954'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#DDE6E9'); } if ($(this).data('main') == 'red') { $('.theme-left').css('background-color', '#C9625F'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#4E3232'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#F8F3F1'); } if ($(this).data('main') == 'green') { $('.theme-left').css('background-color', '#18A689'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#24392E'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#F1F8F3'); } if ($(this).data('main') == 'orange') { $('.theme-left').css('background-color', '#C58627'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#50361F'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#F8F4F1'); } if ($(this).data('main') == 'purple') { $('.theme-left').css('background-color', '#6E62B5'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#393F51'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#F3F2F7'); } if ($(this).data('main') == 'blue') { $('.theme-left').css('background-color', '#4A89DC'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#1E3948'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#F2F4F7'); } $.cookie('main-color', main_color, { path: '/' }); $.cookie('main-name', main_name, { path: '/' }); }); } /* Switch Theme */ function handleTheme() { $('.theme').on('click', function (e) { e.preventDefault(); $('.theme').removeClass('active'); $(this).addClass('active'); var theme_name = $(this).attr('data-theme'); switchTheme(theme_name); }); function switchTheme(name) { if (name == null) { $('.theme-sidebar-defaut').addClass('active'); $.cookie('theme', name, { path: '/' }); } else { $('.theme-sidebar-' + name).addClass('active'); $('body').removeClass(function (index, css) { return (css.match(/(^|\s)theme-\S+/g) || []).join(' '); }); $('body').addClass('theme-' + name); $.cookie('theme', name, { path: '/' }); } } } /* Background Color */ function backgroundColor() { $('.bg-color').on('click', function (e) { e.preventDefault(); var bg_color = $(this).data('color'); var bg_name = $(this).attr('data-bg'); $('body').removeClass(function (index, css) { return (css.match(/(^|\s)bg-\S+/g) || []).join(' '); }); $('body').addClass('bg-' + bg_name); $('.bg-color').removeClass('active'); $(this).addClass('active'); $.cookie('bg-color', bg_color, { path: '/' }); $.cookie('bg-name', bg_name, { path: '/' }); }); } /* Manage Cookie */ function handleCookie() { if ($.cookie('rtl')) applicationService.enableRTL(); if ($.cookie('fluid-topbar')) applicationService.handleTopbarFluid(); if ($.cookie('fixed-sidebar')) applicationService.handleSidebarFixed(); if ($.cookie('fluid-sidebar')) applicationService.handleSidebarFluid(); if ($.cookie('sidebar-hover')) applicationService.createSidebarHover(); if ($.cookie('submenu-hover')) applicationService.createSubmenuHover(); if ($.cookie('boxed-layout')) applicationService.createBoxedLayout(); if ($.cookie('sidebar-collapsed') && $.cookie('first-load')) applicationService.createCollapsedSidebar(); if ($.cookie('main-name')) { var main_name = $.cookie('main-name'); $('body').removeClass(function (index, css) { return (css.match(/(^|\s)color-\S+/g) || []).join(' '); }); $('body').addClass('color-' + main_name); $('.theme-color').each(function () { if ($(this).data('main') == main_name) $(this).addClass('active'); }); if (main_name == 'default') { $('.theme-left').css('background-color', '#202226'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#393E44'); $('.theme-sidebar-light, .theme-right-light').css('background-color', '#fff'); $('.sltl .theme-left').css('background-color', '#fff'); } if (main_name == 'primary') { $('.theme-left').css('background-color', '#319DB5'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#164954'); } if (main_name == 'red') { $('.theme-left').css('background-color', '#C9625F'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#4E3232'); } if (main_name == 'green') { $('.theme-left').css('background-color', '#18A689'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#24392E'); } if (main_name == 'orange') { $('.theme-left').css('background-color', '#C58627'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#50361F'); } if (main_name == 'purple') { $('.theme-left').css('background-color', '#6E62B5'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#393F51'); } if (main_name == 'blue') { $('.theme-left').css('background-color', '#4A89DC'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#1E3948'); } } if (!$.cookie('main-color')) { $('.theme-color').each(function () { if ($(this).data('color') == '#2B2E33') $(this).addClass('active'); }); $('body').addClass('color-default'); } // Background Color if ($.cookie('bg-color')) { var bg_color = $.cookie('bg-color'); $('.bg-color').each(function () { if ($(this).data('color') == bg_color) $(this).addClass('active'); }); } if ($.cookie('bg-name')) { var bg_color = $.cookie('bg-name'); $('body').addClass('bg-' + bg_color); } if (!$.cookie('bg-color')) { $('.bg-color').each(function () { if ($(this).data('color') == '#E9E9E9') $(this).addClass('active'); }); } // Sidebar Color if ($.cookie('theme')) { $('body').removeClass(function (index, css) { return (css.match(/(^|\s)theme-\S+/g) || []).join(' '); }); var theme = $.cookie('theme'); $('.builder .' + theme).addClass('active'); $('body').addClass('theme-' + theme); $('.theme').each(function () { if ($(this).data('theme') == theme) $(this).addClass('active'); }); } if (!$.cookie('theme')) { $('.theme.sdtl').addClass('active'); } if (!$.cookie('main-color')) { $('body').addClass('theme-sdtl'); $('.theme-left').css('background-color', '#202226'); $('.theme-sidebar-dark, .theme-right-dark').css('background-color', '#393E44'); } } builderService.init = function () { "use strict"; // $.removeCookie('main-color'); // $.removeCookie('topbar-color'); // $.removeCookie('topbar-color-custom'); // $.removeCookie('sidebar-color'); // $.removeCookie('sidebar-color-custom'); // $.removeCookie('sidebar-hover'); // $.removeCookie('submenu-hover'); toggleBuilder(); builderScroll(); handleLayout(); handleTheme(); handleCookie(); mainColor(); backgroundColor(); applicationService.resetStyle(); if ($('body').hasClass('sidebar-top')) { destroySideScroll(); } }; return builderService; }]); angular.module('newApp').factory('pluginsService', [function () { /* ==========================================================*/ /* PLUGINS */ /* ========================================================= */ /**** Color Picker ****/ function colorPicker() { if ($('.color-picker').length && $.fn.spectrum) { $('.color-picker').each(function () { var current_palette = ''; if ($(this).data('palette')) { current_palette = $(this).data('palette'); } $(this).spectrum({ color: $(this).data('min') ? $(this).data('min') : "#D15ADE", showInput: $(this).data('show-input') ? $(this).data('show-input') : false, showPalette: $(this).data('show-palette') ? $(this).data('show-palette') : false, showPaletteOnly: $(this).data('show-palette-only') ? $(this).data('show-palette-only') : false, showAlpha: $(this).data('show-alpha') ? $(this).data('show-alpha') : false, palette: $(this).data('palette') ? $(this).data('palette') : [[current_palette]] }); $(this).show(); }); } } /**** Numeric Stepper ****/ function numericStepper() { if ($('.numeric-stepper').length && $.fn.TouchSpin) { $('.numeric-stepper').each(function () { $(this).TouchSpin({ min: $(this).data('min') ? $(this).data('min') : 0, max: $(this).data('max') ? $(this).data('max') : 100, step: $(this).data('step') ? $(this).data('step') : 0.1, decimals: $(this).data('decimals') ? $(this).data('decimals') : 0, boostat: $(this).data('boostat') ? $(this).data('boostat') : 5, maxboostedstep: $(this).data('maxboostedstep') ? $(this).data('maxboostedstep') : 10, verticalbuttons: $(this).data('vertical') ? $(this).data('vertical') : false, buttondown_class: $(this).data('btn-before') ? 'btn btn-' + $(this).data('btn-before') : 'btn btn-default', buttonup_class: $(this).data('btn-after') ? 'btn btn-' + $(this).data('btn-after') : 'btn btn-default', }); }); } } /**** Sortable Portlets ****/ function sortablePortlets() { if ($('.portlets').length && $.fn.sortable) { $(".portlets").sortable({ connectWith: ".portlets", handle: ".panel-header", items: 'div.panel', placeholder: "panel-placeholder", opacity: 0.5, dropOnEmpty: true, forcePlaceholderSize: true, receive: function (event, ui) { $("body").trigger("resize"); } }); } } /**** Nestable List ****/ function nestable() { if ($('.nestable').length && $.fn.nestable) { $(".nestable").nestable(); } } /**** Sortable Table ****/ function sortableTable() { if ($('.sortable_table').length && $.fn.sortable) { $(".sortable_table").sortable({ itemPath: '> tbody', itemSelector: 'tbody tr', placeholder: '' }); } } /**** Show Tooltip ****/ function showTooltip() { if ($('[data-rel="tooltip"]').length && $.fn.tooltip) { $('[data-rel="tooltip"]').tooltip(); } } /**** Show Popover ****/ function popover() { if ($('[rel="popover"]').length && $.fn.popover) { $('[rel="popover"]').popover({ trigger: "hover" }); $('[rel="popover_dark"]').popover({ template: '

    ', trigger: "hover" }); } } /**** Table progress bar ****/ function progressBar() { if ($('.progress-bar').length && $.fn.progressbar) { $('.progress-bar').progressbar(); } } /**** IOS Switch ****/ function iosSwitch() { if ($('.js-switch').length) { setTimeout(function () { $('.js-switch').each(function () { var colorOn = '#18A689'; var colorOff = '#DFDFDF'; if ($(this).data('color-on')) colorOn = $(this).data('color-on'); if ($(this).data('color-on')) colorOff = $(this).data('color-off'); if (colorOn == 'blue') colorOn = '#56A2D5'; if (colorOn == 'red') colorOn = '#C75757'; if (colorOn == 'yellow') colorOn = '#F3B228'; if (colorOn == 'green') colorOn = '#18A689'; if (colorOn == 'purple') colorOn = '#8227f1'; if (colorOn == 'dark') colorOn = '#292C35'; if (colorOff == 'blue') colorOff = '#56A2D5'; if (colorOff == 'red') colorOff = '#C75757'; if (colorOff == 'yellow') colorOff = '#F3B228'; if (colorOff == 'green') colorOff = '#18A689'; if (colorOff == 'purple') colorOff = '#8227f1'; if (colorOff == 'dark') colorOff = '#292C35'; var switchery = new Switchery(this, { color: colorOn, secondaryColor: colorOff }); }); }, 500); } } /* Manage Slider */ function sliderIOS() { if ($('.slide-ios').length && $.fn.slider) { $('.slide-ios').each(function () { $(this).sliderIOS(); }); } } /* Manage Range Slider */ function rangeSlider() { if ($('.range-slider').length && $.fn.ionRangeSlider) { $('.range-slider').each(function () { $(this).ionRangeSlider({ min: $(this).data('min') ? $(this).data('min') : 0, max: $(this).data('max') ? $(this).data('max') : 5000, hideMinMax: $(this).data('hideMinMax') ? $(this).data('hideMinMax') : false, hideFromTo: $(this).data('hideFromTo') ? $(this).data('hideFromTo') : false, to: $(this).data('to') ? $(this).data('to') : '', step: $(this).data('step') ? $(this).data('step') : '', type: $(this).data('type') ? $(this).data('type') : 'double', prefix: $(this).data('prefix') ? $(this).data('prefix') : '', postfix: $(this).data('postfix') ? $(this).data('postfix') : '', maxPostfix: $(this).data('maxPostfix') ? $(this).data('maxPostfix') : '', hasGrid: $(this).data('hasGrid') ? $(this).data('hasGrid') : false, }); }); } } /* Button Loading State */ function buttonLoader() { if ($('.ladda-button').length) { Ladda.bind('.ladda-button', { timeout: 2000 }); // Bind progress buttons and simulate loading progress Ladda.bind('.progress-demo button', { callback: function (instance) { var progress = 0; var interval = setInterval(function () { progress = Math.min(progress + Math.random() * 0.1, 1); instance.setProgress(progress); if (progress === 1) { instance.stop(); clearInterval(interval); } }, 100); } }); } } function inputSelect() { if ($.fn.select2) { setTimeout(function () { $('select').each(function () { function format(state) { var state_id = state.id; if (!state_id) return state.text; // optgroup var res = state_id.split("-"); if (res[0] == 'image') { if (res[2]) return "" + state.text; else return "" + state.text; } else { return state.text; } } $(this).select2({ formatResult: format, formatSelection: format, placeholder: $(this).data('placeholder') ? $(this).data('placeholder') : '', allowClear: $(this).data('allowclear') ? $(this).data('allowclear') : true, minimumInputLength: $(this).data('minimumInputLength') ? $(this).data('minimumInputLength') : -1, minimumResultsForSearch: $(this).data('search') ? 1 : -1, dropdownCssClass: $(this).data('style') ? 'form-white' : '' }); }); }, 200); /* Demo Select Loading Data */ function repoFormatResult(repo) { var markup = '
    ' + '
    ' + '
    ' + '
    ' + '
    ' + repo.full_name + '
    ' + '
    ' + repo.forks_count + '
    ' + '
    ' + repo.stargazers_count + '
    ' + '
    '; if (repo.description) { markup += '
    ' + repo.description + '
    '; } markup += '
    '; return markup; } function repoFormatSelection(repo) { return repo.full_name; } if ($('#demo-loading-data').length) { $("#demo-loading-data").select2({ placeholder: "Search for a repository", minimumInputLength: 1, ajax: { // instead of writing the function to execute the request we use Select2's convenient helper url: "https://api.github.com/search/repositories", dataType: 'json', quietMillis: 250, data: function (term, page) { return { q: term, // search term }; }, results: function (data, page) { // parse the results into the format expected by Select2. // since we are using custom formatting functions we do not need to alter the remote JSON data return { results: data.items }; }, cache: true }, initSelection: function (element, callback) { // the input tag has a value attribute preloaded that points to a preselected repository's id // this function resolves that id attribute to an object that select2 can render // using its formatResult renderer - that way the repository name is shown preselected var id = $(element).val(); if (id !== "") { $.ajax("https://api.github.com/repositories/" + id, { dataType: "json" }).done(function (data) { callback(data); }); } }, formatResult: repoFormatResult, // omitted for brevity, see the source of this page formatSelection: repoFormatSelection, // omitted for brevity, see the source of this page dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results }); } } } function inputTags() { $('.select-tags').each(function () { $(this).tagsinput({ tagClass: 'label label-primary' }); }); } /**** Tables Responsive ****/ function tableResponsive() { setTimeout(function () { $('.table').each(function () { window_width = $(window).width(); table_width = $(this).width(); content_width = $(this).parent().width(); if (table_width > content_width) { $(this).parent().addClass('force-table-responsive'); } else { $(this).parent().removeClass('force-table-responsive'); } }); }, 200); } /**** Tables Dynamic ****/ function tableDynamic() { /* if ($('.table-dynamic').length && $.fn.dataTable) { $('.table-dynamic').each(function () { var opt = {}; // Tools: export to Excel, CSV, PDF & Print if ($(this).hasClass('table-tools')) { opt.sDom = "<'row'<'col-md-6'f><'col-md-6'T>r>t<'row'<'col-md-6'i><'spcol-md-6an6'p>>", opt.oTableTools = { "sSwfPath": "../../../assets/global/plugins/datatables/swf/copy_csv_xls_pdf.swf", "aButtons": ["csv", "xls", "pdf", "print"] }; } if ($(this).hasClass('no-header')) { opt.bFilter = false; opt.bLengthChange = false; } if ($(this).hasClass('no-footer')) { opt.bInfo = false; opt.bPaginate = false; } if ($(this).hasClass('filter-head')) { $('.filter-head thead th').each(function () { var title = $('.filter-head thead th').eq($(this).index()).text(); $(this).append(''); }); var table = $('.filter-head').DataTable(); $(".filter-head thead input").on('keyup change', function () { table.column($(this).parent().index() + ':visible').search(this.value).draw(); }); } if ($(this).hasClass('filter-footer')) { $('.filter-footer tfoot th').each(function () { var title = $('.filter-footer thead th').eq($(this).index()).text(); $(this).html(''); }); var table = $('.filter-footer').DataTable(); $(".filter-footer tfoot input").on('keyup change', function () { table.column($(this).parent().index() + ':visible').search(this.value).draw(); }); } if ($(this).hasClass('filter-select')) { $(this).DataTable({ initComplete: function () { var api = this.api(); api.columns().indexes().flatten().each(function (i) { var column = api.column(i); var select = $('') .appendTo($(column.footer()).empty()) .on('change', function () { var val = $(this).val(); column .search(val ? '^' + val + '$' : '', true, false) .draw(); }); column.data().unique().sort().each(function (d, j) { select.append('') }); }); } }); } if (!$(this).hasClass('filter-head') && !$(this).hasClass('filter-footer') && !$(this).hasClass('filter-select')) { var oTable = $(this).dataTable(opt); oTable.fnDraw(); } }); }*/ } // Handles custom checkboxes & radios using jQuery iCheck plugin function handleiCheck() { if (!$().iCheck) return; $(':checkbox:not(.js-switch, .switch-input, .switch-iphone, .onoffswitch-checkbox, .ios-checkbox), :radio').each(function () { var checkboxClass = $(this).attr('data-checkbox') ? $(this).attr('data-checkbox') : 'icheckbox_minimal-grey'; var radioClass = $(this).attr('data-radio') ? $(this).attr('data-radio') : 'iradio_minimal-grey'; if (checkboxClass.indexOf('_line') > -1 || radioClass.indexOf('_line') > -1) { $(this).iCheck({ checkboxClass: checkboxClass, radioClass: radioClass, insert: '
    ' + $(this).attr("data-label") }); } else { $(this).iCheck({ checkboxClass: checkboxClass, radioClass: radioClass }); } }); } /* Time picker */ function timepicker() { $('.timepicker').each(function () { $(this).timepicker({ isRTL: $('body').hasClass('rtl') ? true : false, timeFormat: $(this).attr('data-format', 'am-pm') ? 'hh:mm tt' : 'HH:mm' }); }); } /* Date picker */ function datepicker() { $('.date-picker').each(function () { $(this).datepicker({ numberOfMonths: 1, isRTL: $('body').hasClass('rtl') ? true : false, prevText: '', nextText: '', showButtonPanel: false }); }); } /* Date picker */ function bDatepicker() { $('.b-datepicker').each(function () { $(this).bootstrapDatepicker({ startView: $(this).data('view') ? $(this).data('view') : 0, // 0: month view , 1: year view, 2: multiple year view language: $(this).data('lang') ? $(this).data('lang') : "en", forceParse: $(this).data('parse') ? $(this).data('parse') : false, daysOfWeekDisabled: $(this).data('day-disabled') ? $(this).data('day-disabled') : "", // Disable 1 or various day. For monday and thursday: 1,3 calendarWeeks: $(this).data('calendar-week') ? $(this).data('calendar-week') : false, // Display week number autoclose: $(this).data('autoclose') ? $(this).data('autoclose') : false, todayHighlight: $(this).data('today-highlight') ? $(this).data('today-highlight') : true, // Highlight today date toggleActive: $(this).data('toggle-active') ? $(this).data('toggle-active') : true, // Close other when open multidate: $(this).data('multidate') ? $(this).data('multidate') : false, // Allow to select various days orientation: $(this).data('orientation') ? $(this).data('orientation') : "auto", // Allow to select various days, rtl: $('html').hasClass('rtl') ? true : false }); }); } function multiDatesPicker() { $('.multidatepicker').each(function () { $(this).multiDatesPicker({ dateFormat: 'yy-mm-dd', minDate: new Date(), maxDate: '+1y', firstDay: 1, showOtherMonths: true }); }); } function rating() { $('.rateit').each(function () { $(this).rateit({ readonly: $(this).data('readonly') ? $(this).data('readonly') : false, // Not editable, for example to show rating that already exist resetable: $(this).data('resetable') ? $(this).data('resetable') : false, value: $(this).data('value') ? $(this).data('value') : 0, // Current value of rating min: $(this).data('min') ? $(this).data('min') : 1, // Maximum of star max: $(this).data('max') ? $(this).data('max') : 5, // Maximum of star step: $(this).data('step') ? $(this).data('step') : 0.1 }); // Tooltip Option if ($(this).data('tooltip')) { var tooltipvalues = ['bad', 'poor', 'ok', 'good', 'super']; // You can change text here $(this).bind('over', function (event, value) { $(this).attr('title', tooltipvalues[value - 1]); }); } // Confirmation before voting option if ($(this).data('confirmation')) { $(this).on('beforerated', function (e, value) { value = value.toFixed(1); if (!confirm('Are you sure you want to rate this item: ' + value + ' stars?')) { e.preventDefault(); } else { // We disable rating after voting. If you want to keep it enable, remove this part $(this).rateit('readonly', true); } }); } // Disable vote after rating if ($(this).data('disable-after')) { $(this).bind('rated', function (event, value) { $(this).rateit('readonly', true); }); } // Display rating value as text below if ($(this).parent().find('.rating-value')) { $(this).bind('rated', function (event, value) { if (value) value = value.toFixed(1); $(this).parent().find('.rating-value').text('Your rating: ' + value); }); } // Display hover value as text below if ($(this).parent().find('.hover-value')) { $(this).bind('over', function (event, value) { if (value) value = value.toFixed(1); $(this).parent().find('.hover-value').text('Hover rating value: ' + value); }); } }); } /* Date & Time picker */ function datetimepicker() { if ($.fn.datetimepicker) { $('.datetimepicker').each(function () { $(this).datetimepicker({ prevText: '', nextText: '' }); }); /* Inline Date & Time picker */ $('.inline_datetimepicker').datetimepicker({ altFieldTimeOnly: false, isRTL: is_RTL }); } } /* Popup Images */ function magnificPopup() { if ($('.magnific').length && $.fn.magnificPopup) { $('.magnific').magnificPopup({ type: 'image', gallery: { enabled: true }, removalDelay: 300, mainClass: 'mfp-fade' }); } } /**** Summernote Editor ****/ function editorSummernote() { if ($('.summernote').length && $.fn.summernote) { $('.summernote').each(function () { $(this).summernote({ height: 300, airMode: $(this).data('airmode') ? $(this).data('airmode') : false, airPopover: [ ["style", ["style"]], ['color', ['color']], ['font', ['bold', 'underline', 'clear']], ['para', ['ul', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture']] ], toolbar: [ ["style", ["style"]], ["style", ["bold", "italic", "underline", "clear"]], ["fontsize", ["fontsize"]], ["color", ["color"]], ["para", ["ul", "ol", "paragraph"]], ["height", ["height"]], ["table", ["table"]], ['view', ['codeview']], ] }); }); } } /**** CKE Editor ****/ function editorCKE() { if ($('.cke-editor').length && $.fn.ckeditor) { $('.cke-editor').each(function () { $(this).ckeditor(); }); // Turn off automatic editor creation first. CKEDITOR.disableAutoInline = true; } } function slider() { if ($('.slick').length && $.fn.slick) { $('.slick').each(function () { $(this).slick({ accessibility: true, // Enables tabbing and arrow key navigation adaptiveHeight: false, arrows: $(this).data('arrows') ? $(this).data('arrows') : false, // Enable Next/Prev arrows asNavFor: null, prevArrow: '', // prev arrow nextArrow: '', // next arrow autoplay: $(this).attr('data-autoplay') ? $(this).attr('data-autoplay') : true, // Enables auto play of slides autoplaySpeed: $(this).data('timing') ? $(this).data('timing') : 4000, // Auto play change interval centerMode: $(this).data('center') ? $(this).data('center') : false, // Enables centered view with partial prev/next slides. centerPadding: '50px', // Side padding when in center mode. (px or %) cssEase: 'ease', // CSS3 easing dots: $(this).attr('data-dots') ? $(this).attr('data-dots') : true, // Current slide indicator dots dotsClass: 'slick-dots', // Class for slide indicator dots container draggable: true, // Enables desktop dragging easing: 'linear', // animate() fallback easing fade: $(this).data('fade') ? $(this).data('fade') : false, // Enables fade focusOnSelect: false, infinite: true, // Infinite looping lazyLoad: 'ondemand', // Accepts 'ondemand' or 'progressive' for lazy load technique onBeforeChange: null, // Before slide change callback onAfterChange: null, // After slide change callback onInit: null, // When Slick initializes for the first time callback onReInit: null, // Every time Slick (re-)initializes callback pauseOnHover: true, // Pauses autoplay on hover pauseOnDotsHover: false, // Pauses autoplay when a dot is hovered responsive: null, // Breakpoint triggered settings rtl: $('body').hasClass('rtl') ? true : false, // Change the slider's direction to become right-to-left slide: '.slide', // Slide element query slidesToShow: $(this).data('num-slides') ? $(this).data('num-slides') : 1, // # of slides to show at a time slidesToScroll: $(this).data('num-scroll') ? $(this).data('num-scroll') : 1, // # of slides to show at a time, speed: 500, // Transition speed swipe: true, // Enables touch swipe swipeToSlide: false, // Swipe to slide irrespective of slidesToScroll touchMove: true, // Enables slide moving with touch touchThreshold: 5, // To advance slides, the user must swipe a length of (1/touchThreshold) * the width of the slider. useCSS: true, // Enable/Disable CSS Transitions variableWidth: $(this).data('variable-width') ? true : false, // Disables automatic slide width calculation vertical: false, // Vertical slide direction waitForAnimate: true // Ignores requests to advance the slide while animating }); }); } } function formWizard() { if ($('.wizard').length && $.fn.stepFormWizard) { $('.wizard').each(function () { $this = $(this); if (!$(this).data('initiated')) { $(this).stepFormWizard({ theme: $(this).data('style') ? $(this).data('style') : "circle", showNav: $(this).data('nav') ? $(this).data('nav') : "top", height: "auto", rtl: $('body').hasClass('rtl') ? true : false, onNext: function (i, wizard) { if ($this.hasClass('wizard-validation')) { return $('form', wizard).parsley().validate('block' + i); } }, onFinish: function (i) { if ($this.hasClass('wizard-validation')) { return $('form', wizard).parsley().validate(); } } }) $(this).data('initiated', true); } }); /* Fix issue only with tabs with Validation on error show */ $('#validation .wizard .sf-btn').on('click', function () { setTimeout(function () { $(window).resize(); $(window).trigger('resize'); }, 50); }); } } function formValidation() { if ($('.form-validation').length && $.fn.validate) { /* We add an addition rule to show you. Example : 4 + 8. You can other rules if you want */ $.validator.methods.operation = function (value, element, param) { return value == param; }; $.validator.methods.customemail = function (value, element) { return /^([-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+\.[a-zA-Z]{2,4})+$/.test(value); }; $('.form-validation').each(function () { var formValidation = $(this).validate({ success: "valid", submitHandler: function () { alert("Form is valid! We submit it") }, errorClass: "form-error", validClass: "form-success", errorElement: "div", ignore: [], rules: { avatar: { extension: "jpg|png|gif|jpeg|doc|docx|pdf|xls|rar|zip" }, password2: { equalTo: '#password' }, calcul: { operation: 12 }, url: { url: true }, email: { required: { depends: function () { $(this).val($.trim($(this).val())); return true; } }, customemail: true }, }, messages: { name: { required: 'Enter your name' }, lastname: { required: 'Enter your last name' }, firstname: { required: 'Enter your first name' }, email: { required: 'Enter email address', customemail: 'Enter a valid email address' }, language: { required: 'Enter your language' }, mobile: { required: 'Enter your phone number' }, avatar: { required: 'You must upload your avatar' }, password: { required: 'Write your password' }, password2: { required: 'Write your password', equalTo: '2 passwords must be the same' }, calcul: { required: 'Enter the result of 4 + 8', operation: 'Result is false. Try again!' }, terms: { required: 'You must agree with terms' } }, highlight: function (element, errorClass, validClass) { $(element).closest('.form-control').addClass(errorClass).removeClass(validClass); }, unhighlight: function (element, errorClass, validClass) { $(element).closest('.form-control').removeClass(errorClass).addClass(validClass); }, errorPlacement: function (error, element) { if (element.hasClass("custom-file") || element.hasClass("checkbox-type") || element.hasClass("language")) { element.closest('.option-group').after(error); } else if (element.is(":radio") || element.is(":checkbox")) { element.closest('.option-group').after(error); } else if (element.parent().hasClass('input-group')) { element.parent().after(error); } else { error.insertAfter(element); } }, invalidHandler: function (event, validator) { var errors = validator.numberOfInvalids(); } }); $(".form-validation .cancel").click(function () { formValidation.resetForm(); }); }); } } /**** Animated Panels ****/ function liveTile() { if ($('.live-tile').length && $.fn.liveTile) { $('.live-tile').each(function () { $(this).liveTile("destroy", true); /* To get new size if resize event */ tile_height = $(this).data("height") ? $(this).data("height") : $(this).find('.panel-body').height() + 52; $(this).height(tile_height); $(this).liveTile({ speed: $(this).data("speed") ? $(this).data("speed") : 500, // Start after load or not mode: $(this).data("animation-easing") ? $(this).data("animation-easing") : 'carousel', // Animation type: carousel, slide, fade, flip, none playOnHover: $(this).data("play-hover") ? $(this).data("play-hover") : false, // Play live tile on hover repeatCount: $(this).data("repeat-count") ? $(this).data("repeat-count") : -1, // Repeat or not (-1 is infinite delay: $(this).data("delay") ? $(this).data("delay") : 0, // Time between two animations startNow: $(this).data("start-now") ? $(this).data("start-now") : true, //Start after load or not }); }); } } /**** Bar Charts: CHARTJS ****/ function barCharts() { if ($('.bar-stats').length) { $('.bar-stats').each(function () { var randomScalingFactor = function () { return Math.round(Math.random() * 100) }; var custom_colors = ['#C9625F', '#18A689', '#90ed7d', '#f7a35c', '#8085e9', '#f15c80', '#8085e8', '#91e8e1']; var custom_color = custom_colors[Math.floor(Math.random() * custom_colors.length)]; var barChartData = { labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], datasets: [{ fillColor: custom_color, strokeColor: custom_color, highlightFill: "#394248", highlightStroke: "#394248", data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()] } ] } var ctx = $(this).get(0).getContext("2d"); window.myBar = new Chart(ctx).Bar(barChartData, { responsive: true, scaleShowLabels: false, showScale: true, scaleLineColor: "rgba(0,0,0,.1)", scaleShowGridLines: false, }); }); } } function animateNumber() { $('.countup').each(function () { from = $(this).data("from") ? $(this).data("from") : 0; to = $(this).data("to") ? $(this).data("to") : 100; duration = $(this).data("duration") ? $(this).data("duration") : 2; delay = $(this).data("delay") ? $(this).data("delay") : 1000; decimals = $(this).data("decimals") ? $(this).data("decimals") : 0; var options = { useEasing: true, useGrouping: true, separator: ',', prefix: $(this).data("prefix") ? $(this).data("  prefix") : '', suffix: $(this).data("suffix") ? $(this).data("suffix") : '' } var numAnim = new countUp($(this).get(0), from, to, decimals, duration, options); setTimeout(function () { numAnim.start(); }, delay); }); } function textareaAutosize() { $('textarea.autosize').each(function () { $(this).autosize(); }); } /**** On Resize Functions ****/ /* $(window).bind('resize', function (e) { window.resizeEvt; $(window).resize(function () { clearTimeout(window.resizeEvt); window.resizeEvt = setTimeout(function () { tableResponsive(); }, 250); }); });*/ return { inputSelect: inputSelect, sortablePortlets: sortablePortlets, init: function () { /**** Variables Initiation ****/ var doc = document; var docEl = document.documentElement; var $sidebar = $('.sidebar'); var $mainContent = $('.main-content'); var $sidebarWidth = $(".sidebar").width(); var is_RTL = false; if ($('body').hasClass('rtl')) is_RTL = true; var oldIndex; /* if ($('.sortable').length && $.fn.sortable) { $(".sortable").sortable({ handle: ".panel-header", start: function (event, ui) { oldIndex = ui.item.index(); ui.placeholder.height(ui.item.height() - 20); }, stop: function (event, ui) { var newIndex = ui.item.index(); var movingForward = newIndex > oldIndex; var nextIndex = newIndex + (movingForward ? -1 : 1); var items = $('.sortable > div'); // Find the element to move var itemToMove = items.get(nextIndex); if (itemToMove) { // Find the element at the index where we want to move the itemToMove var newLocation = $(items.get(oldIndex)); // Decide if it goes before or after if (movingForward) { $(itemToMove).insertBefore(newLocation); } else { $(itemToMove).insertAfter(newLocation); } } } }); } */ //sortablePortlets(); // sortableTable(); // nestable(); // showTooltip(); // popover(); // colorPicker(); // numericStepper(); // iosSwitch(); //sliderIOS(); // rangeSlider(); // buttonLoader(); // inputSelect(); //inputTags(); // tableResponsive(); // tableDynamic(); // handleiCheck(); // timepicker(); // datepicker(); // bDatepicker(); // multiDatesPicker(); // datetimepicker(); // rating(); // magnificPopup(); // editorSummernote(); // editorCKE(); //slider(); // liveTile(); // formWizard(); // formValidation(); // barCharts(); // animateNumber(); // textareaAutosize(); } } }]); //******************************** CHAT MENU SIDEBAR ******************************// angular.module('newApp') .factory('quickViewService', [function () { function quickviewSidebar() { function toggleqQuickview() { $('#quickview-toggle').click(function (e) {// e.preventDefault(); e.stopPropagation();// if ($('#quickview-sidebar').hasClass('open')) $('#builder').removeClass('open'); else $('#quickview-sidebar').addClass('open'); }); } $('.chat-back').on('click', function () { $('.chat-conversation').removeClass('current'); $('.chat-body').addClass('current'); }); $('.chat-list').on('click', 'li', function () { var chat_name = $(this).find('.user-name').html(); var chat_txt = $(this).find('.user-txt').html(); var chat_status = $(this).find('.user-status').html(); var chat_img = $(this).find('img').attr('src'); $('.chat-conversation .user-name').html(chat_name); $('.chat-conversation .user-txt').html(chat_txt); $('.chat-conversation .user-status').html(chat_status); $('.chat-conversation .user-img img').attr("src", chat_img); $('.chat-conversation .conversation-body .conversation-img img').attr("src", chat_img); $('.chat-body').removeClass('current'); $('.chat-conversation').addClass('current'); }); /* Open / Close right sidebar */ $('#quickview-toggle').on('click', function () {// $('#chat-notification').hide(); setTimeout(function () { $('.mm-panel .badge-danger').each(function () { $(this).removeClass('hide').addClass('animated bounceIn'); }); }, 1000); }); /* Remove current message when opening */ $('.have-message').on('click', function () { $(this).removeClass('have-message'); $(this).find('.badge-danger').fadeOut(); }); /* Send messages */ $('.send-message').keypress(function (e) { if (e.keyCode == 13) { var chat_message = '
  • ' + '' + '
    ' + '' + '
    ' + '
    ' + $(this).val() + '
    ' + '
    ' + '
    ' + '
    ' + '
  • '; $(chat_message).hide().appendTo($(this).parent().parent().parent().find('.conversation-body ul')).fadeIn(); $(this).val(""); quickviewHeight(); customScroll(); } }); $('.main-content').click(function (ev) { chatSidebar = document.getElementById('quickview-sidebar'); var target = ev.target; if (target !== chatSidebar) { if ($('#quickview-sidebar').hasClass('open')) { $('#quickview-sidebar').addClass('closing'); $('#quickview-sidebar').removeClass('open'); setTimeout(function () { $('#quickview-sidebar').removeClass('closing'); }, 400); } } }); if ($('.settings-chart .progress-bar').length) { $('.settings-tab').on('click', function () { setTimeout(function () { $('.settings-chart .setting1').progressbar(); window.myRadar = new Chart(document.getElementById("setting-chart").getContext("2d")).Radar(radarChartData, { responsive: true, tooltipCornerRadius: 0, animationSteps: 60, }); }, 200); setTimeout(function () { $('.settings-chart .setting2').progressbar(); }, 400); }); }; /* Radar Chart */ var radarChartData = { labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"], datasets: [ { label: "My Second dataset", fillColor: "rgba(151,187,205,0.2)", strokeColor: "rgba(151,187,205,1)", pointColor: "rgba(151,187,205,1)", pointStrokeColor: "#fff", pointHighlightFill: "#fff", pointHighlightStroke: "rgba(151,187,205,1)", data: [38, 48, 40, 89, 96, 27, 90] } ] }; toggleqQuickview(); } function quickviewHeight() { $('.chat-conversation').height(''); chatConversationHeight = $('.chat-conversation').height(); windowHeight = $(window).height(); if (chatConversationHeight < windowHeight) { $('.chat-conversation').height($(window).height() - 50); } } /**** On Resize Functions ****/ $(window).resize(function () { noteTextarea(); quickviewHeight(); }); return { init: function () { quickviewSidebar(); quickviewHeight(); } } }]); /** * Enhanced Select2 Dropmenus * * @AJAX Mode - When in this mode, your value will be an object (or array of objects) of the data used by Select2 * This change is so that you do not have to do an additional query yourself on top of Select2's own query * @params [options] {object} The configuration options passed to $.fn.select2(). Refer to the documentation */ angular.module('ui.select2', []).value('uiSelect2Config', {}).directive('uiSelect2', ['uiSelect2Config', '$timeout', function (uiSelect2Config, $timeout) { var options = {}; if (uiSelect2Config) { angular.extend(options, uiSelect2Config); } return { require: 'ngModel', priority: 1, compile: function (tElm, tAttrs) { var watch, repeatOption, repeatAttr, isSelect = tElm.is('select'), isMultiple = angular.isDefined(tAttrs.multiple); // Enable watching of the options dataset if in use if (tElm.is('select')) { repeatOption = tElm.find('option[ng-repeat], option[data-ng-repeat]'); if (repeatOption.length) { repeatAttr = repeatOption.attr('ng-repeat') || repeatOption.attr('data-ng-repeat'); watch = jQuery.trim(repeatAttr.split('|')[0]).split(' ').pop(); } } return function (scope, elm, attrs, controller) { // instance-specific options var opts = angular.extend({}, options, scope.$eval(attrs.uiSelect2)); /* Convert from Select2 view-model to Angular view-model. */ var convertToAngularModel = function(select2_data) { var model; if (opts.simple_tags) { model = []; angular.forEach(select2_data, function(value, index) { model.push(value.id); }); } else { model = select2_data; } return model; }; /* Convert from Angular view-model to Select2 view-model. */ var convertToSelect2Model = function(angular_data) { var model = []; if (!angular_data) { return model; } if (opts.simple_tags) { model = []; angular.forEach( angular_data, function(value, index) { model.push({'id': value, 'text': value}); }); } else { model = angular_data; } return model; }; if (isSelect) { // Use into Bootstrap buttons Browse */ (function ($) { $.fn.bootstrapFileInput = function (inputButtonWord) { this.each(function (i, elem) { var $elem = $(elem); // Maybe some fields don't need to be standardized. if (typeof $elem.attr('data-bfi-disabled') != 'undefined') { return; } var buttonWord = inputButtonWord; buttonWord = '{{"' +buttonWord+ '"|i18n}}'; if (typeof $elem.attr('title') != 'undefined') { buttonWord = $elem.attr('title'); } var className = ''; if (!!$elem.attr('class')) { className = ' ' + $elem.attr('class'); } // Now we're going to wrap that input field with a Bootstrap button. // The input will actually still be there, it will just be float above and transparent (done with the CSS). $elem.wrap('').parent().prepend($('').html(buttonWord)).prepend($('')); }) .promise().done(function () { $('.file-input-wrapper').mousemove(function (cursor) { var input, wrapper, wrapperX, wrapperY, inputWidth, inputHeight, cursorX, cursorY; // This wrapper element (the button surround this file input) wrapper = $(this); // The invisible file input element input = wrapper.find("input"); // The left-most position of the wrapper wrapperX = wrapper.offset().left; // The top-most position of the wrapper wrapperY = wrapper.offset().top; // The with of the browsers input field inputWidth = input.width(); // The height of the browsers input field inputHeight = input.height(); //The position of the cursor in the wrapper cursorX = cursor.pageX; cursorY = cursor.pageY; //The positions we are to move the invisible file input // The 20 at the end is an arbitrary number of pixels that we can shift the input such that cursor is not pointing at the end of the Browse button but somewhere nearer the middle moveInputX = cursorX - wrapperX - inputWidth + 20; // Slides the invisible input Browse button to be positioned middle under the cursor moveInputY = cursorY - wrapperY - (inputHeight / 2); // Apply the positioning styles to actually move the invisible file input input.css({ left: moveInputX, top: moveInputY }); }); $('body').on('change', '.file-input-wrapper input[type=file]', function () { var fileName; fileName = $(this).val(); // Remove any previous file names $(this).parent().next('.file-input-name').remove(); if (!!$(this).prop('files') && $(this).prop('files').length > 1) { fileName = $(this)[0].files.length + ' files'; } else { fileName = fileName.substring(fileName.lastIndexOf('\\') + 1, fileName.length); } // Don't try to show the name if there is none if (!fileName) { $(this).siblings('.clear').show(); $(this).siblings('.name').hide(); return; } var selectedFileNamePlacement = $(this).data('filename-placement'); if (selectedFileNamePlacement === 'inside') { $(this).siblings('.clear').hide(); $(this).siblings('.name').show(); $(this).siblings('.name').html(fileName); $(this).attr('title', fileName); } else { // Print the fileName aside (right after the the button) $(this).parent().after('' + fileName + ''); } }); }); }; // Add the styles before the first stylesheet // This ensures they can be easily overridden with developer styles var cssHtml = ''; $('link[rel=stylesheet]').eq(0).before(cssHtml); })(jQuery); /*global angular*/ (function () { 'use strict'; angular .module('angular-click-outside', []) .directive('clickOutside', ['$document', '$parse', '$timeout', clickOutside]); var i=0; function clickOutside($document, $parse, $timeout) { return { restrict: 'A', link: function ($scope, elem, attr) { // postpone linking to next digest to allow for unique id generation var identity=i++; elem.data("id",identity); $timeout(function () { var classList = (attr.outsideIfNot !== undefined) ? attr.outsideIfNot.replace(', ', ',').split(',') : [], fn; // add the elements id so it is not counted in the click listening if (attr.id !== undefined) { classList.push(attr.id); } function eventHandler(e) { // check if our element already hidden and abort if so if (angular.element(elem).hasClass("ng-hide")) { return; } var i = 0, element; // if there is no click target, no point going on if (!e || !e.target) { return; } var code = e.keyCode || e.which; if(code == 13) { return } var lastItem; // loop through the available elements, looking for classes in the class list that might match and so will eat for (element = e.target; element; element = element.parentNode) { var id = element.id, classNames = element.className, l = classList.length; lastItem = element; if (classNames && classNames.baseVal !== undefined) { classNames = classNames.baseVal; } // loop through the elements id's and classnames looking for exceptions for (i = 0; i < l; i++) { // check for exact matches on id's or classes, but only if they exist in the first place if ((id !== undefined && id === classList[i]) || (classNames && classNames === classList[i])) { var data =$(element).data('id'); if(data==identity) { return; } } } } if(lastItem.nodeName!='#document') { return; } // if we have got this far, then we are good to go with processing the command passed in via the click-outside attribute $scope.$apply(function () { fn = $parse(attr['clickOutside']); fn($scope); }); } // if the devices has a touchscreen, listen for this event if (_hasTouch()) { $document.on('touchstart', eventHandler); } // still listen for the click event even if there is touch to cater for touchscreen laptops $document.on('click', eventHandler); // when the scope is destroyed, clean up the documents event handlers as we don't want it hanging around $scope.$on('$destroy', function () { if (_hasTouch()) { $document.off('touchstart', eventHandler); } $document.off('click', eventHandler); }); // private function to attempt to figure out if we are on a touch device function _hasTouch() { // works on most browsers, IE10/11 and Surface return 'ontouchstart' in window || navigator.maxTouchPoints; }; }); } }; } })(); /*! jQuery Timepicker Addon - v1.6.3 - 2016-04-20 * http://trentrichardson.com/examples/timepicker * Copyright (c) 2016 Trent Richardson; Licensed MIT */ (function($){ // source: src/i18n/jquery-ui-timepicker-af.js /* Afrikaans translation for the jQuery Timepicker Addon */ /* Written by Deon Heyns */ $.timepicker.regional['af'] = { timeOnlyTitle: 'Kies Tyd', timeText: 'Tyd ', hourText: 'Ure ', minuteText: 'Minute', secondText: 'Sekondes', millisecText: 'Millisekondes', microsecText: 'Mikrosekondes', timezoneText: 'Tydsone', currentText: 'Huidige Tyd', closeText: 'Klaar', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-am.js /* Armenian translation for the jQuery Timepicker Addon */ /* Written by Artavazd Avetisyan artavazda@hotmail.com */ $.timepicker.regional['am'] = { timeOnlyTitle: 'Ընտրեք ժամանակը', timeText: 'Ժամանակը', hourText: 'Ժամ', minuteText: 'Րոպե', secondText: 'Վարկյան', millisecText: 'Միլիվարկյան', microsecText: 'Միկրովարկյան', timezoneText: 'Ժամային գոտին', currentText: 'Այժմ', closeText: 'Փակել', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-bg.js /* Bulgarian translation for the jQuery Timepicker Addon */ /* Written by Plamen Kovandjiev */ $.timepicker.regional['bg'] = { timeOnlyTitle: 'Изберете време', timeText: 'Време', hourText: 'Час', minuteText: 'Минути', secondText: 'Секунди', millisecText: 'Милисекунди', microsecText: 'Микросекунди', timezoneText: 'Часови пояс', currentText: 'Сега', closeText: 'Затвори', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-ca.js /* Catalan translation for the jQuery Timepicker Addon */ /* Written by Sergi Faber */ $.timepicker.regional['ca'] = { timeOnlyTitle: 'Escollir una hora', timeText: 'Hora', hourText: 'Hores', minuteText: 'Minuts', secondText: 'Segons', millisecText: 'Milisegons', microsecText: 'Microsegons', timezoneText: 'Fus horari', currentText: 'Ara', closeText: 'Tancar', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-cs.js /* Czech translation for the jQuery Timepicker Addon */ /* Written by Ondřej Vodáček */ $.timepicker.regional['cs'] = { timeOnlyTitle: 'Vyberte čas', timeText: 'Čas', hourText: 'Hodiny', minuteText: 'Minuty', secondText: 'Vteřiny', millisecText: 'Milisekundy', microsecText: 'Mikrosekundy', timezoneText: 'Časové pásmo', currentText: 'Nyní', closeText: 'Zavřít', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['dop.', 'AM', 'A'], pmNames: ['odp.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-da.js /* Danish translation for the jQuery Timepicker Addon */ /* Written by Lars H. Jensen (http://www.larshj.dk) */ $.timepicker.regional['da'] = { timeOnlyTitle: 'Vælg tid', timeText: 'Tid', hourText: 'Time', minuteText: 'Minut', secondText: 'Sekund', millisecText: 'Millisekund', microsecText: 'Mikrosekund', timezoneText: 'Tidszone', currentText: 'Nu', closeText: 'Luk', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['am', 'AM', 'A'], pmNames: ['pm', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-de.js /* German translation for the jQuery Timepicker Addon */ /* Written by Marvin */ $.timepicker.regional['de'] = { timeOnlyTitle: 'Zeit wählen', timeText: 'Zeit', hourText: 'Stunde', minuteText: 'Minute', secondText: 'Sekunde', millisecText: 'Millisekunde', microsecText: 'Mikrosekunde', timezoneText: 'Zeitzone', currentText: 'Jetzt', closeText: 'Fertig', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['vorm.', 'AM', 'A'], pmNames: ['nachm.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-el.js /* Hellenic translation for the jQuery Timepicker Addon */ /* Written by Christos Pontikis */ $.timepicker.regional['el'] = { timeOnlyTitle: 'Επιλογή ώρας', timeText: 'Ώρα', hourText: 'Ώρες', minuteText: 'Λεπτά', secondText: 'Δευτερόλεπτα', millisecText: 'Χιλιοστοδευτερόλεπτα', microsecText: 'Μικροδευτερόλεπτα', timezoneText: 'Ζώνη ώρας', currentText: 'Τώρα', closeText: 'Κλείσιμο', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['π.μ.', 'AM', 'A'], pmNames: ['μ.μ.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-es.js /* Spanish translation for the jQuery Timepicker Addon */ /* Written by Ianaré Sévi */ /* Modified by Carlos Martínez */ $.timepicker.regional['es'] = { timeOnlyTitle: 'Elegir una hora', timeText: 'Hora', hourText: 'Horas', minuteText: 'Minutos', secondText: 'Segundos', millisecText: 'Milisegundos', microsecText: 'Microsegundos', timezoneText: 'Uso horario', currentText: 'Hoy', closeText: 'Cerrar', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['a.m.', 'AM', 'A'], pmNames: ['p.m.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-et.js /* Estonian translation for the jQuery Timepicker Addon */ /* Written by Karl Sutt (karl@sutt.ee) */ $.timepicker.regional['et'] = { timeOnlyTitle: 'Vali aeg', timeText: 'Aeg', hourText: 'Tund', minuteText: 'Minut', secondText: 'Sekund', millisecText: 'Millisekundis', microsecText: 'Mikrosekundis', timezoneText: 'Ajavöönd', currentText: 'Praegu', closeText: 'Valmis', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-eu.js /* Basque trannslation for JQuery Timepicker Addon */ /* Translated by Xabi Fer */ /* Fixed by Asier Iturralde Sarasola - iametza interaktiboa */ $.timepicker.regional['eu'] = { timeOnlyTitle: 'Aukeratu ordua', timeText: 'Ordua', hourText: 'Orduak', minuteText: 'Minutuak', secondText: 'Segundoak', millisecText: 'Milisegundoak', microsecText: 'Mikrosegundoak', timezoneText: 'Ordu-eremua', currentText: 'Orain', closeText: 'Itxi', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['a.m.', 'AM', 'A'], pmNames: ['p.m.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-fa.js /* Persian translation for the jQuery Timepicker Addon */ /* Written by Meysam Pour Ganji */ $.timepicker.regional['fa'] = { timeOnlyTitle: 'انتخاب زمان', timeText: 'زمان', hourText: 'ساعت', minuteText: 'دقیقه', secondText: 'ثانیه', millisecText: 'میلی ثانیه', microsecText: 'میکرو ثانیه', timezoneText: 'منطقه زمانی', currentText: 'الان', closeText: 'انتخاب', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['قبل ظهر', 'AM', 'A'], pmNames: ['بعد ظهر', 'PM', 'P'], isRTL: true }; // source: src/i18n/jquery-ui-timepicker-fi.js /* Finnish translation for the jQuery Timepicker Addon */ /* Written by Juga Paazmaya (http://github.com/paazmaya) */ $.timepicker.regional['fi'] = { timeOnlyTitle: 'Valitse aika', timeText: 'Aika', hourText: 'Tunti', minuteText: 'Minuutti', secondText: 'Sekunti', millisecText: 'Millisekunnin', microsecText: 'Mikrosekuntia', timezoneText: 'Aikavyöhyke', currentText: 'Nyt', closeText: 'Sulje', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['ap.', 'AM', 'A'], pmNames: ['ip.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-fr.js /* French translation for the jQuery Timepicker Addon */ /* Written by Thomas Lété */ $.timepicker.regional['fr'] = { timeOnlyTitle: 'Choisir une heure', timeText: 'Heure', hourText: 'Heures', minuteText: 'Minutes', secondText: 'Secondes', millisecText: 'Millisecondes', microsecText: 'Microsecondes', timezoneText: 'Fuseau horaire', currentText: 'Maintenant', closeText: 'Terminé', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-gl.js /* Galician translation for the jQuery Timepicker Addon */ /* Written by David Barral */ $.timepicker.regional['gl'] = { timeOnlyTitle: 'Elixir unha hora', timeText: 'Hora', hourText: 'Horas', minuteText: 'Minutos', secondText: 'Segundos', millisecText: 'Milisegundos', microsecText: 'Microssegundos', timezoneText: 'Fuso horario', currentText: 'Agora', closeText: 'Pechar', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['a.m.', 'AM', 'A'], pmNames: ['p.m.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-he.js /* Hebrew translation for the jQuery Timepicker Addon */ /* Written by Lior Lapid */ $.timepicker.regional["he"] = { timeOnlyTitle: "בחירת זמן", timeText: "שעה", hourText: "שעות", minuteText: "דקות", secondText: "שניות", millisecText: "אלפית השנייה", microsecText: "מיקרו", timezoneText: "אזור זמן", currentText: "עכשיו", closeText:"סגור", timeFormat: "HH:mm", timeSuffix: '', amNames: ['לפנה"צ', 'AM', 'A'], pmNames: ['אחה"צ', 'PM', 'P'], isRTL: true }; // source: src/i18n/jquery-ui-timepicker-hr.js /* Croatian translation for the jQuery Timepicker Addon */ /* Written by Mladen */ $.timepicker.regional['hr'] = { timeOnlyTitle: 'Odaberi vrijeme', timeText: 'Vrijeme', hourText: 'Sati', minuteText: 'Minute', secondText: 'Sekunde', millisecText: 'Milisekunde', microsecText: 'Mikrosekunde', timezoneText: 'Vremenska zona', currentText: 'Sada', closeText: 'Gotovo', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['a.m.', 'AM', 'A'], pmNames: ['p.m.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-hu.js /* Hungarian translation for the jQuery Timepicker Addon */ /* Written by Vas Gábor */ $.timepicker.regional['hu'] = { timeOnlyTitle: 'Válasszon időpontot', timeText: 'Idő', hourText: 'Óra', minuteText: 'Perc', secondText: 'Másodperc', millisecText: 'Milliszekundumos', microsecText: 'Ezredmásodperc', timezoneText: 'Időzóna', currentText: 'Most', closeText: 'Kész', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['de.', 'AM', 'A'], pmNames: ['du.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-id.js /* Indonesian translation for the jQuery Timepicker Addon */ /* Written by Nia */ $.timepicker.regional['id'] = { timeOnlyTitle: 'Pilih Waktu', timeText: 'Waktu', hourText: 'Pukul', minuteText: 'Menit', secondText: 'Detik', millisecText: 'Milidetik', microsecText: 'Mikrodetik', timezoneText: 'Zona Waktu', currentText: 'Sekarang', closeText: 'OK', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-it.js /* Italian translation for the jQuery Timepicker Addon */ /* Written by Marco "logicoder" Del Tongo */ $.timepicker.regional['it'] = { timeOnlyTitle: 'Scegli orario', timeText: 'Orario', hourText: 'Ora', minuteText: 'Minuti', secondText: 'Secondi', millisecText: 'Millisecondi', microsecText: 'Microsecondi', timezoneText: 'Fuso orario', currentText: 'Adesso', closeText: 'Chiudi', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['m.', 'AM', 'A'], pmNames: ['p.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-ja.js /* Japanese translation for the jQuery Timepicker Addon */ /* Written by Jun Omae */ $.timepicker.regional['ja'] = { timeOnlyTitle: '時間を選択', timeText: '時間', hourText: '時', minuteText: '分', secondText: '秒', millisecText: 'ミリ秒', microsecText: 'マイクロ秒', timezoneText: 'タイムゾーン', currentText: '現時刻', closeText: '閉じる', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['午前', 'AM', 'A'], pmNames: ['午後', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-ko.js /* Korean translation for the jQuery Timepicker Addon */ /* Written by Genie */ $.timepicker.regional['ko'] = { timeOnlyTitle: '시간 선택', timeText: '시간', hourText: '시', minuteText: '분', secondText: '초', millisecText: '밀리초', microsecText: '마이크로', timezoneText: '표준 시간대', currentText: '현재 시각', closeText: '닫기', timeFormat: 'tt h:mm', timeSuffix: '', amNames: ['오전', 'AM', 'A'], pmNames: ['오후', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-lt.js /* Lithuanian translation for the jQuery Timepicker Addon */ /* Written by Irmantas Šiupšinskas */ $.timepicker.regional['lt'] = { timeOnlyTitle: 'Pasirinkite laiką', timeText: 'Laikas', hourText: 'Valandos', minuteText: 'Minutės', secondText: 'Sekundės', millisecText: 'Milisekundės', microsecText: 'Mikrosekundės', timezoneText: 'Laiko zona', currentText: 'Dabar', closeText: 'Uždaryti', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['priešpiet', 'AM', 'A'], pmNames: ['popiet', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-lv.js /* Latvian translation for the jQuery Timepicker Addon */ /* Written by Dmitry Bogatykh */ $.timepicker.regional['lv'] = { timeOnlyTitle: 'Ievadiet laiku', timeText: 'Laiks', hourText: 'Stundas', minuteText: 'Minūtes', secondText: 'Sekundes', millisecText: 'Milisekundes', microsecText: 'Mikrosekundes', timezoneText: 'Laika josla', currentText: 'Tagad', closeText: 'Aizvērt', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'AM', 'A'], pmNames: ['PM', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-mk.js /* Macedonian cyrilic translation for the jQuery Timepicker Addon */ /* Written by Vlatko Ristovski */ $.timepicker.regional['mk'] = { timeOnlyTitle: 'Одберете време', timeText: 'Време', hourText: 'Час', minuteText: 'Минути', secondText: 'Секунди', millisecText: 'Милисекунди', microsecText: 'Микросекунди', timezoneText: 'Временска зона', currentText: 'Сега', closeText: 'Затвори', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-nl.js /* Dutch translation for the jQuery Timepicker Addon */ /* Written by Martijn van der Lee */ $.timepicker.regional['nl'] = { timeOnlyTitle: 'Tijdstip', timeText: 'Tijd', hourText: 'Uur', minuteText: 'Minuut', secondText: 'Seconde', millisecText: 'Milliseconde', microsecText: 'Microseconde', timezoneText: 'Tijdzone', currentText: 'Vandaag', closeText: 'Sluiten', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-no.js /* Norwegian translation for the jQuery Timepicker Addon */ /* Written by Morten Hauan (http://hauan.me) */ $.timepicker.regional['no'] = { timeOnlyTitle: 'Velg tid', timeText: 'Tid', hourText: 'Time', minuteText: 'Minutt', secondText: 'Sekund', millisecText: 'Millisekund', microsecText: 'mikrosekund', timezoneText: 'Tidssone', currentText: 'Nå', closeText: 'Lukk', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['am', 'AM', 'A'], pmNames: ['pm', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-pl.js /* Polish translation for the jQuery Timepicker Addon */ /* Written by Michał Pena */ $.timepicker.regional['pl'] = { timeOnlyTitle: 'Wybierz godzinę', timeText: 'Czas', hourText: 'Godzina', minuteText: 'Minuta', secondText: 'Sekunda', millisecText: 'Milisekunda', microsecText: 'Mikrosekunda', timezoneText: 'Strefa czasowa', currentText: 'Teraz', closeText: 'Gotowe', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-pt-BR.js /* Brazilian Portuguese translation for the jQuery Timepicker Addon */ /* Written by Diogo Damiani (diogodamiani@gmail.com) */ $.timepicker.regional['pt-BR'] = { timeOnlyTitle: 'Escolha o horário', timeText: 'Horário', hourText: 'Hora', minuteText: 'Minutos', secondText: 'Segundos', millisecText: 'Milissegundos', microsecText: 'Microssegundos', timezoneText: 'Fuso horário', currentText: 'Agora', closeText: 'Fechar', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['a.m.', 'AM', 'A'], pmNames: ['p.m.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-pt.js /* Portuguese translation for the jQuery Timepicker Addon */ /* Written by Luan Almeida */ $.timepicker.regional['pt'] = { timeOnlyTitle: 'Escolha uma hora', timeText: 'Hora', hourText: 'Horas', minuteText: 'Minutos', secondText: 'Segundos', millisecText: 'Milissegundos', microsecText: 'Microssegundos', timezoneText: 'Fuso horário', currentText: 'Agora', closeText: 'Fechar', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['a.m.', 'AM', 'A'], pmNames: ['p.m.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-ro.js /* Romanian translation for the jQuery Timepicker Addon */ /* Written by Romeo Adrian Cioaba */ $.timepicker.regional['ro'] = { timeOnlyTitle: 'Alegeţi o oră', timeText: 'Timp', hourText: 'Ore', minuteText: 'Minute', secondText: 'Secunde', millisecText: 'Milisecunde', microsecText: 'Microsecunde', timezoneText: 'Fus orar', currentText: 'Acum', closeText: 'Închide', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-ru.js /* Russian translation for the jQuery Timepicker Addon */ /* Written by Trent Richardson */ $.timepicker.regional['ru'] = { timeOnlyTitle: 'Выберите время', timeText: 'Время', hourText: 'Часы', minuteText: 'Минуты', secondText: 'Секунды', millisecText: 'Миллисекунды', microsecText: 'Микросекунды', timezoneText: 'Часовой пояс', currentText: 'Сейчас', closeText: 'Применить', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-sk.js /* Slovak translation for the jQuery Timepicker Addon */ /* Written by David Vallner */ $.timepicker.regional['sk'] = { timeOnlyTitle: 'Zvoľte čas', timeText: 'Čas', hourText: 'Hodiny', minuteText: 'Minúty', secondText: 'Sekundy', millisecText: 'Milisekundy', microsecText: 'Mikrosekundy', timezoneText: 'Časové pásmo', currentText: 'Teraz', closeText: 'Zavrieť', timeFormat: 'H:m', timeSuffix: '', amNames: ['dop.', 'AM', 'A'], pmNames: ['pop.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-sl.js /* Slovenian translation for the jQuery Timepicker Addon */ /* Written by Hadalin (https://github.com/hadalin) */ $.timepicker.regional['sl'] = { timeOnlyTitle: 'Izberite čas', timeText: 'Čas', hourText: 'Ura', minuteText: 'Minute', secondText: 'Sekunde', millisecText: 'Milisekunde', microsecText: 'Mikrosekunde', timezoneText: 'Časovni pas', currentText: 'Sedaj', closeText: 'Zapri', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['dop.', 'AM', 'A'], pmNames: ['pop.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-sq.js /* Albanian translation for the jQuery Timepicker Addon */ /* Written by Olti Buzi */ $.timepicker.regional['sq'] = { timeOnlyTitle: 'Zgjidh orarin', timeText: 'Orari', hourText: 'Ora', minuteText: 'Minuta', secondText: 'Sekonda', millisecText: 'Minisekonda', microsecText: 'Mikrosekonda', timezoneText: 'Zona kohore', currentText: 'Tani', closeText: 'Mbyll', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['m.', 'AM', 'A'], pmNames: ['p.', 'PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-sr-RS.js /* Serbian cyrilic translation for the jQuery Timepicker Addon */ /* Written by Vladimir Jelovac */ $.timepicker.regional['sr-RS'] = { timeOnlyTitle: 'Одаберите време', timeText: 'Време', hourText: 'Сати', minuteText: 'Минути', secondText: 'Секунде', millisecText: 'Милисекунде', microsecText: 'Микросекунде', timezoneText: 'Временска зона', currentText: 'Сада', closeText: 'Затвори', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-sr-YU.js /* Serbian latin translation for the jQuery Timepicker Addon */ /* Written by Vladimir Jelovac */ $.timepicker.regional['sr-YU'] = { timeOnlyTitle: 'Odaberite vreme', timeText: 'Vreme', hourText: 'Sati', minuteText: 'Minuti', secondText: 'Sekunde', millisecText: 'Milisekunde', microsecText: 'Mikrosekunde', timezoneText: 'Vremenska zona', currentText: 'Sada', closeText: 'Zatvori', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-sv.js /* Swedish translation for the jQuery Timepicker Addon */ /* Written by Nevon */ $.timepicker.regional['sv'] = { timeOnlyTitle: 'Välj en tid', timeText: 'Tid', hourText: 'Timme', minuteText: 'Minut', secondText: 'Sekund', millisecText: 'Millisekund', microsecText: 'Mikrosekund', timezoneText: 'Tidszon', currentText: 'Nu', closeText: 'Stäng', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-th.js /* Thai translation for the jQuery Timepicker Addon */ /* Written by Yote Wachirapornpongsa */ $.timepicker.regional['th'] = { timeOnlyTitle: 'เลือกเวลา', timeText: 'เวลา ', hourText: 'ชั่วโมง ', minuteText: 'นาที', secondText: 'วินาที', millisecText: 'มิลลิวินาที', microsecText: 'ไมโคริวินาที', timezoneText: 'เขตเวลา', currentText: 'เวลาปัจจุบัน', closeText: 'ปิด', timeFormat: 'hh:mm tt', timeSuffix: '' }; // source: src/i18n/jquery-ui-timepicker-tr.js /* Turkish translation for the jQuery Timepicker Addon */ /* Written by Fehmi Can Saglam, Edited by Goktug Ozturk */ $.timepicker.regional['tr'] = { timeOnlyTitle: 'Zaman Seçiniz', timeText: 'Zaman', hourText: 'Saat', minuteText: 'Dakika', secondText: 'Saniye', millisecText: 'Milisaniye', microsecText: 'Mikrosaniye', timezoneText: 'Zaman Dilimi', currentText: 'Şu an', closeText: 'Tamam', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['ÖÖ', 'Ö'], pmNames: ['ÖS', 'S'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-uk.js /* Ukrainian translation for the jQuery Timepicker Addon */ /* Written by Sergey Noskov */ $.timepicker.regional['uk'] = { timeOnlyTitle: 'Виберіть час', timeText: 'Час', hourText: 'Години', minuteText: 'Хвилини', secondText: 'Секунди', millisecText: 'Мілісекунди', microsecText: 'Мікросекунди', timezoneText: 'Часовий пояс', currentText: 'Зараз', closeText: 'Закрити', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-vi.js /* Vietnamese translation for the jQuery Timepicker Addon */ /* Written by Nguyen Dinh Trung */ $.timepicker.regional['vi'] = { timeOnlyTitle: 'Chọn giờ', timeText: 'Thời gian', hourText: 'Giờ', minuteText: 'Phút', secondText: 'Giây', millisecText: 'Mili giây', microsecText: 'Micrô giây', timezoneText: 'Múi giờ', currentText: 'Hiện thời', closeText: 'Đóng', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['SA', 'S'], pmNames: ['CH', 'C'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-zh-CN.js /* Simplified Chinese translation for the jQuery Timepicker Addon / / Written by Will Lu */ $.timepicker.regional['zh-CN'] = { timeOnlyTitle: '选择时间', timeText: '时间', hourText: '小时', minuteText: '分钟', secondText: '秒钟', millisecText: '毫秒', microsecText: '微秒', timezoneText: '时区', currentText: '现在时间', closeText: '关闭', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['AM', 'A'], pmNames: ['PM', 'P'], isRTL: false }; // source: src/i18n/jquery-ui-timepicker-zh-TW.js /* Chinese translation for the jQuery Timepicker Addon */ /* Written by Alang.lin */ $.timepicker.regional['zh-TW'] = { timeOnlyTitle: '選擇時分秒', timeText: '時間', hourText: '時', minuteText: '分', secondText: '秒', millisecText: '毫秒', microsecText: '微秒', timezoneText: '時區', currentText: '現在時間', closeText: '確定', timeFormat: 'HH:mm', timeSuffix: '', amNames: ['上午', 'AM', 'A'], pmNames: ['下午', 'PM', 'P'], isRTL: false }; })(jQuery); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJsb2Nrcy9ibG9ja3MubW9kdWxlLmpzIiwiYXV0aC9hdXRoLm1vZHVsZS5qcyIsImNhbXBhaWducy9jYW1wYWlnbi5tb2R1bGUuanMiLCJjb250ZW50L2NvbnRlbnQubW9kdWxlLmpzIiwiZGFzaGJvYXJkL2Rhc2hib2FyZC5tb2R1bGUuanMiLCJsYXlvdXQvbGF5b3V0Lm1vZHVsZS5qcyIsInBsYXllcnMvcGxheWVycy5tb2R1bGUuanMiLCJ1c2VyL3VzZXIubW9kdWxlLmpzIiwidmlydHVhbFNjcmVlbnMvY29udGVudC5tb2R1bGUuanMiLCJjb21wb25lbnRzL3N0YXRpc3RpY3Mvc3RhdGlzdGljcy5tb2R1bGUuanMiLCJjb21wb25lbnRzL3N1YnNjcmliZS9zdWJzY3JpYmUubW9kdWxlLmpzIiwiYXBwLmpzIiwibWFpbkN0cmwuanMiLCJwb2x5ZmlsLmpzIiwiYXV0aC9hdXRoLmNvbnRyb2xsZXIuanMiLCJkYXNoYm9hcmQvZGFzaGJvYXJkLmpzIiwibGF5b3V0L2FwaUN0cmwuanMiLCJibG9ja3MvY29tcG9uZW50cy9jb21wYXJlUGFzc3dvcmQuZGlyZWN0aXZlLmpzIiwiYmxvY2tzL2NvbnN0YW50cy9jb25zdGFudHMuc2VydmljZS5qcyIsImJsb2Nrcy9maWx0ZXJzL2FuZ3VsYXItbGlicGhvbmVudW1iZXIuanMiLCJibG9ja3MvZmlsdGVycy9jb252ZXJ0RmlsdGVycy5qcyIsImJsb2Nrcy9maWx0ZXJzL2RhdGVGaWx0ZXJzLmpzIiwiYmxvY2tzL3NlcnZpY2VzL2FyZWFzU3R5bGVIZWxwZXIuanMiLCJibG9ja3Mvc2VydmljZXMvYmFja1NlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlLmpzIiwiYmxvY2tzL3NlcnZpY2VzL2NhbXBhaWduU2VydmljZS5qcyIsImJsb2Nrcy9zZXJ2aWNlcy9jb250ZW50U2VydmljZS5qcyIsImJsb2Nrcy9zZXJ2aWNlcy9lcnJvckhhbmRsZXJIZWxwZXIuanMiLCJibG9ja3Mvc2VydmljZXMvZmlsZVNlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvZmlsdGVySGVscGVyLmpzIiwiYmxvY2tzL3NlcnZpY2VzL2dlb1RhcmdldGluZ1NlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvcGxheWVyRGV2aWNlLnNlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvcGxheWVycy5zZXJ2aWNlLmpzIiwiYmxvY2tzL3NlcnZpY2VzL3Jlc3RIZWxwZXIuanMiLCJibG9ja3Mvc2VydmljZXMvc2V0dGluZ3NTZXJ2aWNlLnNlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvc3RhdGlzdGljcy5zZXJ2aWNlLmpzIiwiYmxvY2tzL3NlcnZpY2VzL3RhYmxlSGVscGVyLmpzIiwiYmxvY2tzL3NlcnZpY2VzL3RhZ3NTZXJ2aWNlLnNlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvdGltZUhlbHBlci5qcyIsImJsb2Nrcy9zZXJ2aWNlcy90aW1lVGFyZ2V0aW5nLnNlcnZpY2UuanMiLCJibG9ja3Mvc2VydmljZXMvdXNlclNlcnZpY2Uuc2VydmljZS5qcyIsImJsb2Nrcy9zZXJ2aWNlcy92aXJ0dWFsU2NyZWVuLnNlcnZpY2UuanMiLCJhdXRoL2NvbmZpcm1FbWFpbC9jb25maXJtRW1haWwuY29udHJvbGxlci5qcyIsImF1dGgvbG9jay9sb2NrLmNvbnRyb2xsZXIuanMiLCJhdXRoL2xvZ2luL2xvZ2luLmNvbnRyb2xsZXIuanMiLCJhdXRoL2xvZ2luRXh0ZXJuYWwvbG9naW5FeHRlcm5hbC5jb250cm9sbGVyLmpzIiwiYXV0aC9sb2dvdXQvbG9nb3V0Q29udHJvbGxlci5jb250cm9sbGVyLmpzIiwiYXV0aC9yZW1lbWJlclBhc3N3b3JkQ2hhbmdlL3JlbWVtYmVyUGFzc3dvcmRDaGFuZ2UuY29udHJvbGxlci5qcyIsImF1dGgvcmVtZW1iZXJQYXNzd29yZFJlcXVlc3QvcmVtZW1iZXJQYXNzd29yZFJlcXVlc3QuY29udHJvbGxlci5qcyIsImF1dGgvc2VydmljZXMvYXV0aC5zZXJ2aWNlLmpzIiwiYXV0aC9zZXJ2aWNlcy9hdXRoSW50ZXJjZXB0b3Iuc2VydmljZS5qcyIsImF1dGgvc2lnbnVwL3NpZ251cC5jb250cm9sbGVyLmpzIiwibGF5b3V0L3NlcnZpY2VzL21lbnUuc2VydmljZS5qcyIsInBsYXllcnMvcGxheWVycy9wbGF5ZXJzLmNvbnRyb2xsZXIuanMiLCJ1c2VyL2JyYW5kL2JyYW5kLmpzIiwidXNlci9wcmVmZXJlbmNlL3ByZWZlcmVuY2UuY29udHJvbGxlci5qcyIsInVzZXIvcHJvZmlsZS9wcm9maWxlLmpzIiwidXNlci9zZXNzaW9uVGltZW91dC9zZXNzaW9uVGltZW91dEN0cmwuanMiLCJibG9ja3MvY29tcG9uZW50cy9jb250cm9sVGFnL2NvbnRyb2xUYWcuanMiLCJibG9ja3MvY29tcG9uZW50cy9jb250cm9sVGFnL2NvbnRyb2xUYWdTZXJ2aWNlTW9kYWwuc2VydmljZS5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2FuZ3VsYXItYnVzeS9hbmd1bGFyLWJ1c3kuanMiLCJibG9ja3MvY29tcG9uZW50cy9kdXJhdGlvblZpZXcvZHVyYXRpb25WaWV3LmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZmlsZUlucHV0L2ZpbGVJbnB1dC5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2ZvY3VzTWUvZm9jdXNNZS5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2Zvcm1XaXphcmRzL2Zvcm1XaXphcmRzLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZm9ybVdpemFyZHMvZm9ybVdpemFyZHNCdXR0b25zLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZm9ybVdpemFyZHMvZm9ybVdpemFyZHNTdGVwLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvaUNoZWNrL2ljaGVjay5kaXJlY3RpdmUuanMiLCJibG9ja3MvY29tcG9uZW50cy9pb25SYW5nZS9pb25SYW5nZS5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2hlbHBQb3BvdmVyL2hlbHBQb3BvdmVyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbGFzdFBsYXlFdmVudHMvbGFzdFBsYXlFdmVudHMuanMiLCJibG9ja3MvY29tcG9uZW50cy9wb3BvdmVyT3V0c2lkZUNsaWNrSGVscGVyL3BvcG92ZXJPdXRzaWRlQ2xpY2tIZWxwZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9tdWx0aXBsZVNlbGVjdC9tdWx0aXBsZVNlbGVjdC5qcyIsImJsb2Nrcy9jb21wb25lbnRzL3ByZWxvYWRlci9wcmVsb2FkZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9zZWxlY3QyL3NlbGVjdDIuZGlyZWN0aXZlLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvdGFncy90YWdzLmRpcmVjdGl2ZS5qcyIsImJsb2Nrcy9jb21wb25lbnRzL3RhZ3NTZWxlY3QvdGFnc1NlbGVjdC5qcyIsImJsb2Nrcy9jb21wb25lbnRzL3RlbGVkc1RhYmxlL3RlbGVkc1RhYmxlLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvdGVsZWRzVGFibGUvdGVsZWRzVGFibGVTZXJ2aWNlLmpzIiwiYXV0aC9jb21wb25lbnRzL3N3aXRjaC1sYW5ndWFnZS9zd2l0Y2gtbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwiY2FtcGFpZ25zL2NvbXBvbmVudHMvYXR0YWNoQXJlYS9hdHRhY2hBcmVhLmNvbXBvbmVudC5qcyIsImNhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaEFyZWFNb2RhbC9hdHRhY2hBcmVhTW9kYWwuY29udHJvbGxlci5qcyIsImNhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaEFyZWFNb2RhbC9hdHRhY2hBcmVhTW9kYWwuc2VydmljZS5qcyIsImNhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaENvbnRlbnQvYXR0YWNoQ29udGVudC5jb21wb25lbnQuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9hdHRhY2hDb250ZW50RGV0YWlsTW9kYWwvYXR0YWNoQ29udGVudE1vZGFsLmNvbnRyb2xsZXIuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9hdHRhY2hDb250ZW50RGV0YWlsTW9kYWwvYXR0YWNoQ29udGVudE1vZGFsLnNlcnZpY2UuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9hdHRhY2hDb250ZW50TW9kYWwvYXR0YWNoQ29udGVudE1vZGFsLmNvbnRyb2xsZXIuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9hdHRhY2hDb250ZW50TW9kYWwvYXR0YWNoQ29udGVudE1vZGFsLnNlcnZpY2UuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9jYW1wYWlnbnNTZWFyY2gvY2FtcGFpZ25zU2VhcmNoLmNvbXBvbmVudC5qcyIsImNhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaGVkUGxheWVycy9hdHRhY2hlZFBsYXllcnMuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9jb250cm9sQXJlYS9jb250cm9sQXJlYS5qcyIsImNhbXBhaWducy9jb21wb25lbnRzL2NyZWF0ZUN1c3RvbUFyZWFNb2RhbC9jcmVhdGVDdXN0b21BcmVhTW9kYWwuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9kaXNwbGF5QXJlYVZhbHVlL2Rpc3BsYXlBcmVhVmFsdWUuanMiLCJjYW1wYWlnbnMvY29tcG9uZW50cy9kaXNwbGF5Q3VycmVudEFyZWEvZGlzcGxheUN1cnJlbnRBcmVhLmpzIiwiY2FtcGFpZ25zL2NvbXBvbmVudHMvZG93bmxvYWRDb250ZW50TW9kYWwvZG93bmxvYWRDb250ZW50TW9kYWwuY29udHJvbGxlci5qcyIsImNhbXBhaWducy9jb21wb25lbnRzL2Rvd25sb2FkQ29udGVudE1vZGFsL2Rvd25sb2FkQ29udGVudE1vZGFsLnNlcnZpY2UuanMiLCJjb21wb25lbnRzL3N0YXRpc3RpY3MvcGFnZXMvc3VtbWFyeS5qcyIsImNhbXBhaWducy9wYWdlcy9hZGRDYW1wYWlnbi9hZGRDYW1wYWlnbi5qcyIsImNhbXBhaWducy9wYWdlcy9jYW1wYWlnbi9jYW1wYWlnbi5qcyIsImNhbXBhaWducy9wYWdlcy9jYW1wYWlnbnMvY2FtcGFpZ25zLmpzIiwiY29udGVudC9jb21wb25lbnRzL2F1ZGlvUHJldmlld01vZGFsL2F1ZGlvUHJldmlld01vZGFsLmpzIiwiY29udGVudC9jb21wb25lbnRzL2NhbXBhaWduVGFibGUvY2FtcGFpZ25UYWJsZS5qcyIsImNvbnRlbnQvY29tcG9uZW50cy9jaGFuZ2VGaWxlTW9kYWwvY2hhbmdlRmlsZU1vZGFsLmNvbnRyb2xsZXIuanMiLCJjb250ZW50L2NvbXBvbmVudHMvY2hhbmdlRmlsZU1vZGFsL2NoYW5nZUZpbGVNb2RhbC5zZXJ2aWNlLmpzIiwiY29udGVudC9jb21wb25lbnRzL2NvbnRlbnRDYW1wYWlnbi9jb250ZW50Q2FtcGFpZ24uanMiLCJjb250ZW50L2NvbXBvbmVudHMvY29udGVudEZpbGUvY29udGVudEZpbGUuanMiLCJjb250ZW50L2NvbXBvbmVudHMvY29udGVudFByZXZpZXcvY29udGVudFByZXZpZXcuanMiLCJjb250ZW50L2NvbXBvbmVudHMvY29udGVudHNTZWFyY2gvY29udGVudHNTZWFyY2guY29tcG9uZW50LmpzIiwiY29udGVudC9jb21wb25lbnRzL2ZpbGVUYWJsZS9maWxlVGFibGUuanMiLCJjb250ZW50L2NvbXBvbmVudHMvaW1hZ2VGaWxlL2ltYWdlRmlsZS5qcyIsImNvbnRlbnQvY29tcG9uZW50cy9pbWFnZVByZXZpZXcvaW1hZ2VQcmV2aWV3LmpzIiwiY29udGVudC9jb21wb25lbnRzL2xhc3RQbGF5RXZlbnRzQ29udGVudC9sYXN0UGxheUV2ZW50c0NvbnRlbnQuanMiLCJjb250ZW50L2NvbXBvbmVudHMvcmVtb3ZlQ29udGVudE1vZGFsL3JlbW92ZUNvbnRlbnRNb2RhbC5jb250cm9sbGVyLmpzIiwiY29udGVudC9jb21wb25lbnRzL3JlbW92ZUNvbnRlbnRNb2RhbC9yZW1vdmVDb250ZW50TW9kYWxTZXJ2aWNlLnNlcnZpY2UuanMiLCJjb250ZW50L2NvbXBvbmVudHMvdmlkZW9QbGF5ZXIvdmlkZW9QbGF5ZXIuY29udHJvbGxlci5qcyIsImNvbnRlbnQvY29tcG9uZW50cy92aWRlb1BsYXllci92aWRlb1BsYXllclNlcnZpY2UuanMiLCJjb250ZW50L2NvbXBvbmVudHMvdmlkZW9QcmV2aWV3L3ZpZGVvUHJldmlldy5qcyIsImNvbnRlbnQvcGFnZXMvYWRkQ29udGVudC9hZGRDb250ZW50LmNvbnRyb2xsZXIuanMiLCJjb250ZW50L3BhZ2VzL2NvbnRlbnQvY29udGVudC5jb250cm9sbGVyLmpzIiwiZGFzaGJvYXJkL2NvbXBvbmVudHMvZGFzaGJvYXJkQ2hhcnQvZGFzaGJvYXJkQ2hhcnQuanMiLCJjb250ZW50L3BhZ2VzL2NvbnRlbnRzL2NvbnRlbnRzLmNvbnRyb2xsZXIuanMiLCJkYXNoYm9hcmQvY29tcG9uZW50cy9wbGF5ZXJzTWFwL3BsYXllcnNNYXAuanMiLCJkYXNoYm9hcmQvY29tcG9uZW50cy9wbGF5ZXJzTWFwL3BvcG92ZXJQbGF5ZXIuanMiLCJkYXNoYm9hcmQvY29tcG9uZW50cy90b3BQbGF5ZXJzL3RvcFBsYXllcnMuanMiLCJsYXlvdXQvY29tcG9uZW50cy9wYWdlUHJlbG9hZGVyL3BhZ2VQcmVsb2FkZXIuZGlyZWN0aXZlLmpzIiwibGF5b3V0L2NvbXBvbmVudHMvc2lkZUJhci9zaWRlQmFyLmNvbXBvbmVudC5qcyIsImxheW91dC9jb21wb25lbnRzL3RvcEJhci90b3BCYXIuY29tcG9uZW50LmpzIiwibGF5b3V0L2NvbXBvbmVudHMvdXNlclByb2ZpbGUvdXNlclByb2ZpbGUuY29tcG9uZW50LmpzIiwicGxheWVycy9jb21wb25lbnRzL2FkZEltYWdlTW9kYWwvYWRkSW1hZ2VNb2RhbC5jb250cm9sbGVyLmpzIiwicGxheWVycy9jb21wb25lbnRzL2FkZEltYWdlTW9kYWwvYWRkSW1hZ2VNb2RhbC5qcyIsInBsYXllcnMvY29tcG9uZW50cy9hc3NpZ25DYW1wYWlnbi9hc3NpZ25DYW1wYWlnbi5jb250cm9sbGVyLmpzIiwicGxheWVycy9jb21wb25lbnRzL2Fzc2lnbkNhbXBhaWduL2Fzc2lnbkNhbXBhaWduU2VydmljZS5qcyIsInBsYXllcnMvY29tcG9uZW50cy9pbWFnZU1vZGFsL2ltYWdlTW9kYWwuY29udHJvbGxlci5qcyIsInBsYXllcnMvY29tcG9uZW50cy9pbWFnZU1vZGFsL2ltYWdlTW9kYWwuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVySW1hZ2VzL3BsYXllckltYWdlcy5qcyIsInBsYXllcnMvY29tcG9uZW50cy9wbGF5ZXJMYXN0UGxheUV2ZW50c1RhYmxlL3BsYXllckxhc3RQbGF5RXZlbnRzVGFibGUuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyTm90ZXMvcGxheWVyTm90ZXMuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyc0F0dGFjaGVkQ2FtcGFpZ24vcGxheWVyc0F0dGFjaGVkQ2FtcGFpZ25zLmpzIiwicGxheWVycy9jb21wb25lbnRzL3BsYXllcnNTZWFyY2gvcGxheWVyU2VhcmNoLmNvbXBvbmVudC5qcyIsInBsYXllcnMvY29tcG9uZW50cy9wbGF5ZXJTdGF0L3BsYXllclN0YXQuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyU3RhdE1vZGFsL3BsYXllclN0YXRNb2RhbC5jb250cm9sbGVyLmpzIiwicGxheWVycy9jb21wb25lbnRzL3BsYXllclN0YXRNb2RhbC9wbGF5ZXJTdGF0TW9kYWxTZXJ2aWNlLmpzIiwicGxheWVycy9jb21wb25lbnRzL3BsYXllclN0YXRUYWJsZS9wbGF5ZXJTdGF0VGFibGUuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyVmlydHVhbFNjcmVlbkFyZWEvcGxheWVyVmlydHVhbFNjcmVlbkFyZWEuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyU3RhdHVzL3BsYXllclN0YXR1cy5qcyIsInBsYXllcnMvY29tcG9uZW50cy9yZW1vdmVQbGF5ZXJNb2RhbC9yZW1vdmVQbGF5ZXJNb2RhbC5jb250cm9sbGVyLmpzIiwicGxheWVycy9jb21wb25lbnRzL3JlbW92ZVBsYXllck1vZGFsL3JlbW92ZVBsYXllck1vZGFsU2VydmljZS5zZXJ2aWNlLmpzIiwicGxheWVycy9jb21wb25lbnRzL3BsYXllclN0YXRDaGFydC9wbGF5ZXJTdGF0Q2hhcnQuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvc2V0UG9zaXRpb25Nb2RhbC9zZXRQb3NpdGlvbk1vZGFsLmNvbnRyb2xsZXIuanMiLCJwbGF5ZXJzL2NvbXBvbmVudHMvc2V0UG9zaXRpb25Nb2RhbC9zZXRQb3NpdGlvbk1vZGFsU2VydmljZS5zZXJ2aWNlLmpzIiwicGxheWVycy9wYWdlcy9wbGF5ZXIvcGxheWVyLmNvbnRyb2xsZXIuanMiLCJwbGF5ZXJzL3BhZ2VzL2Rldkxhc3RQbGF5RXZlbnRzL2Rldkxhc3RQbGF5RXZlbnRzLmpzIiwicGxheWVycy9wYWdlcy9jcmVhdGVOZXdQbGF5ZXIvY3JlYXRlTmV3UGxheWVyLmNvbnRyb2xsZXIuanMiLCJwbGF5ZXJzL3BhZ2VzL3BsYXllclRyYWNraW5nL3BsYXllclRyYWNraW5nLmpzIiwicGxheWVycy9wYWdlcy9yZXBsYWNlQ29kZS9yZXBsYWNlQ29kZS5qcyIsInVzZXIvY29tcG9uZW50cy9jaGFuZ2VQYXNzd29yZE1vZGFsL2NoYW5nZVBhc3N3b3JkTW9kYWwuY29udHJvbGxlci5qcyIsInVzZXIvY29tcG9uZW50cy9jaGFuZ2VQYXNzd29yZE1vZGFsL2NoYW5nZVBhc3N3b3JkTW9kYWwuc2VydmljZS5qcyIsInZpcnR1YWxTY3JlZW5zL3BhZ2VzL2FkZFZpcnR1YWxTY3JlZW4vYWRkVmlydHVhbFNjcmVlbi5qcyIsInZpcnR1YWxTY3JlZW5zL3BhZ2VzL3ZpcnR1YWxTY3JlZW5zL3ZpcnR1YWxTY3JlZW5zLmpzIiwidmlydHVhbFNjcmVlbnMvcGFnZXMvdmlydHVhbFNjcmVlbi92aXJ0dWFsU2NyZWVuLmpzIiwidmlydHVhbFNjcmVlbnMvY29tcG9uZW50cy9hcmVhcy9hcmVhcy5jb21wb25lbnQuanMiLCJ2aXJ0dWFsU2NyZWVucy9jb21wb25lbnRzL2F0dGFjaFBsYXllci9hdHRhY2hQbGF5ZXIuY29tcG9uZW50LmpzIiwidmlydHVhbFNjcmVlbnMvY29tcG9uZW50cy9hdHRhY2hlZFBsYXllcnMvYXR0YWNoZWRQbGF5ZXJzLmNvbXBvbmVudC5qcyIsInZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvYXR0YWNoUGxheWVyTW9kYWwvYXR0YWNoUGxheWVyTW9kYWwuY29udHJvbGxlci5qcyIsInZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvYXR0YWNoUGxheWVyTW9kYWwvYXR0YWNoUGxheWVyTW9kYWwuc2VydmljZS5qcyIsInZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvYXR0YWNoUGxheWVyUG9wb3Zlci9hdHRhY2hQbGF5ZXIuY29tcG9uZW50LmpzIiwidmlydHVhbFNjcmVlbnMvY29tcG9uZW50cy9hdHRhY2hQbGF5bGlzdE1vZGFsL2F0dGFjaFBsYXlsaXN0TW9kYWwuanMiLCJ2aXJ0dWFsU2NyZWVucy9jb21wb25lbnRzL3ZpcnR1YWxTY3JlZW5zU2VhcmNoL3ZpcnR1YWxTY3JlZW5zLmNvbXBvbmVudC5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2NvbnRyb2xUYWcvY29udHJvbE9uZUl0ZW1Nb2RhbC9jb250cm9sT25lSXRlbU1vZGFsLmNvbnRyb2xsZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9jb250cm9sVGFnL2NvbnRyb2xNYW55SXRlbU1vZGFsL2NvbnRyb2xNYW55SXRlbU1vZGFsLmNvbnRyb2xsZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9kYXRlL2NvbXBsZXhSYW5nZURhdGVwaWNrZXIvY29tcGxleFJhbmdlRGF0ZXBpY2tlci5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2RhdGUvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZGF0ZS9kYXRldGltZXBpY2tlci9kYXRldGltZXBpY2tlci5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2RhdGUvaGVscGVyL2RhdGVIZWxwZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9kYXRlL3JhbmdlRGF0ZXBpY2tlci9yYW5nZURhdGVwaWNrZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9kYXRlL3JhbmdlRGF0ZXBpY2tlck9uZUNhbGVuZGFyL3JhbmdlRGF0ZXBpY2tlck9uZUNhbGVuZGFyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZWRpdC9iYXNlL2VkaXQuc2VydmljZS5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2VkaXQvZWRpdEJyaWdodC9lZGl0QnJpZ2h0LmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZWRpdC9lZGl0Q29uc3RhbnRzU2VsZWN0L2VkaXRDb25zdGFudHNTZWxlY3QuanMiLCJibG9ja3MvY29tcG9uZW50cy9lZGl0L2VkaXREYXRlL2VkaXREYXRlLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZWRpdC9lZGl0VGFncy9lZGl0VGFncy5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2VkaXQvZWRpdE51bWJlci9lZGl0TnVtYmVyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZWRpdC9lZGl0VGV4dC9lZGl0VGV4dC5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2VkaXQvZWRpdFRleHRBcmVhL2VkaXRUZXh0QXJlYS5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2Zvcm0vYnJpZ2h0Q29tcG9uZW50L2JyaWdodENvbXBvbmVudC5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRTZWxlY3QvY29uc3RhbnRTZWxlY3QuanMiLCJibG9ja3MvY29tcG9uZW50cy9mb3JtL2R1cmF0aW9uSW50ZXJ2YWwvZHVyYXRpb25JbnRlcnZhbC5jb21wb25lbnQuanMiLCJibG9ja3MvY29tcG9uZW50cy9mb3JtL25nU2VsZWN0L25nU2VsZWN0LmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZm9ybS9udW1iZXJQaWNrZXIvbnVtYmVyUGlja2VyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZm9ybS9waWNrSW50ZXJ2YWxXaXRoU3RhcnQvcGlja0ludGVydmFsV2l0aEludGVydmFsLmNvbXBvbmVudC5qcyIsImJsb2Nrcy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0QXJlYXMvc2VsZWN0QXJlYXMuanMiLCJibG9ja3MvY29tcG9uZW50cy9mb3JtL3NlbGVjdEVudGl0eS9zZWxlY3RFbnRpdHkuanMiLCJibG9ja3MvY29tcG9uZW50cy9mb3JtL3NlbGVjdEVudGl0eU1vZGFsL3NlbGVjdEVudGl0eU1vZGFsLmNvbnRyb2xsZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9mb3JtL3NlbGVjdEVudGl0eU1vZGFsL3NlbGVjdEVudGl0eU1vZGFsLnNlcnZpY2UuanMiLCJibG9ja3MvY29tcG9uZW50cy9mb3JtL3NlbGVjdEVudGl0eVRhYmxlL3NlbGVjdEVudGl0eVRhYmxlLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvZm9ybS9zcGVjdHJ1bUNvbG9ycGlja2VyL3NwZWN0cnVtQ29sb3JwaWNrZXIuanMiLCJibG9ja3MvY29tcG9uZW50cy9tb2RhbHMvY29udHJvbEdlb1RhcmdldGluZ01vZGFsL2NvbnRyb2xHZW9UYXJnZXRpbmdNb2RhbC5jb250cm9sbGVyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL2NvbnRyb2xHZW9UYXJnZXRpbmdNb2RhbC9jb250cm9sR2VvVGFyZ2V0aW5nU2VydmljZS5zZXJ2aWNlLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL2NvbmZpcm1Nb2RhbC9jb25maXJtTW9kYWwuY29udHJvbGxlci5qcyIsImJsb2Nrcy9jb21wb25lbnRzL21vZGFscy9jb25maXJtTW9kYWwvY29uZmlybU1vZGFsLnNlcnZpY2UuanMiLCJibG9ja3MvY29tcG9uZW50cy9tb2RhbHMvY29udHJvbFRhcmdldGluZ01vZGFsL2NvbnRyb2xUYXJnZXRpbmdNb2RhbC5jb250cm9sbGVyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL2NvbnRyb2xUYXJnZXRpbmdNb2RhbC9jb250cm9sVGFyZ2V0aW5nU2VydmljZS5zZXJ2aWNlLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL3JlbW92ZU1vZGFscy9yZW1vdmVNb2RhbC5jb250cm9sbGVyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL3JlbW92ZU1vZGFscy9yZW1vdmVNb2RhbC5zZXJ2aWNlLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL3JlbW92ZU1vZGFscy9yZW1vdmVQcm90ZWN0ZWRNb2RhbC5jb250cm9sbGVyLmpzIiwiYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL3Nob3dQb3NpdGlvbi9zaG93UG9zaXRpb24uanMiLCJibG9ja3MvY29tcG9uZW50cy90YWdDb21wb25lbnRzL3ZpZXdUYWcvdmlld1RhZy5qcyIsImNvbXBvbmVudHMvc3RhdGlzdGljcy9jb21wb25lbnRzL3N0YXRzVGFibGUvc3RhdHNUYWJsZS5qcyIsImNvbXBvbmVudHMvc3RhdGlzdGljcy9jb21wb25lbnRzL2ZpbHRlclN1bW1hcnlTdGF0aXN0aWMvZmlsdGVyU3VtbWFyeVN0YXRpc3RpYy5qcyIsImNvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvY2hhbmdlU3Vic2NyaXB0aW9uQ29uZmlybU1vZGFsL2NoYW5nZVN1YnNjcmlwdGlvbkNvbmZpcm1Nb2RhbC5qcyIsImNvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvYmlsbGluZ0luZm9Nb2RhbC9iaWxsaW5nSW5mb01vZGFsLmpzIiwiY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9jaGFuZ2VTdWJzY3JpcHRpb25Nb2RhbC9jaGFuZ2VTdWJzY3JpcHRpb25Nb2RhbC5qcyIsImNvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvY3VycmVudFN1YnNjcmlwdGlvbi9jdXJyZW50U3Vic2NyaXB0aW9uLmpzIiwiY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9lbnRlclByb21vQ29kZU1vZGFsL2VudGVyUHJvbW9Db2RlTW9kYWwuanMiLCJjb21wb25lbnRzL3N1YnNjcmliZS9jb21wb25lbnRzL3BhaWRQbGF5ZXIvYnV5UGFpZFBsYXllci5qcyIsImNvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvcGFpZFBsYXllci9wYWlkUGxheWVyLmpzIiwiY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9wYWlkU2lnbi9idXlQYWlkTW9kYWwuanMiLCJjb21wb25lbnRzL3N1YnNjcmliZS9jb21wb25lbnRzL3BhaWRTaWduL3BhaWRTaWduLmpzIiwiY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9wYXlNZXRob2RNb2RhbC9wYXlNZXRob2RNb2RhbC5qcyIsImNvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvcGF5TWV0aG9kcy9wYXlNZXRob2RzLmpzIiwiY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9wbGF5ZXJEaXNjb3VudC9wbGF5ZXJEaXNjb3VudC5qcyIsImNvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvdXNlckJhbGFuY2UvdXNlckJhbGFuY2UuanMiLCJjb21wb25lbnRzL3N1YnNjcmliZS9jb21wb25lbnRzL3VzZXJQYXltZW50cy91c2VyUGF5bWVudHMuanMiLCJjb21wb25lbnRzL3N1YnNjcmliZS9wYWdlcy9zdWJzY3JpYmUvc3Vic2NyaWJlLmpzIiwiYXBwbGljYXRpb24uanMiLCJidWlsZGVyLmpzIiwicGx1Z2lucy5qcyIsInF1aWNrdmlldy5qcyIsImN1c3RvbUxpYnJhcnkvYW5ndWxhci1zZWxlY3QyLXVpLmRpcmVjdGl2ZS5qcyIsImN1c3RvbUxpYnJhcnkvYm9vdHN0cmFwLWZpbGUtaW5wdXQuanMiLCJjdXN0b21MaWJyYXJ5L2NsaWNrb3V0c2lkZS5kaXJlY3RpdmUuanMiLCJjdXN0b21MaWJyYXJ5L2pxdWVyeS11aS10aW1lcGlja2VyLWFkZG9uLWkxOG4uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN4bUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2hQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDcktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDalVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNVJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzFSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDeklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDOUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM1VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN4SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2phQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNob0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaDZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImFsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA3LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxudmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiLCBbXSk7XHJcblxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYXV0aFwiLCBbXCJ2Y1JlY2FwdGNoYVwiLCBcIkxvY2FsU3RvcmFnZU1vZHVsZVwiXSk7XHJcblxyXG4gICAgY29uZmlnLiRpbmplY3QgPSBbJyRzdGF0ZVByb3ZpZGVyJywgJyRodHRwUHJvdmlkZXInLCBcIiR1cmxSb3V0ZXJQcm92aWRlclwiXTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb25maWcoJHN0YXRlUHJvdmlkZXIsICRodHRwUHJvdmlkZXIsICR1cmxSb3V0ZXJQcm92aWRlcikge1xyXG5cclxuICAgICAgICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCdBdXRoSW50ZXJjZXB0b3JTZXJ2aWNlJyk7XHJcblxyXG4gICAgICAgICR1cmxSb3V0ZXJQcm92aWRlci5vdGhlcndpc2UoJy9wZXJzb25hbEFjY291bnQvaG9tZScpO1xyXG4gICAgICAgICR1cmxSb3V0ZXJQcm92aWRlci53aGVuKCcnLCAnL3BlcnNvbmFsQWNjb3VudC9ob21lJyk7XHJcblxyXG5cclxuICAgICAgICAkc3RhdGVQcm92aWRlclxyXG5cclxuICAgICAgICAgICAgLnN0YXRlKCdhdXRoJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiBcIi9hdXRoXCIsXHJcbiAgICAgICAgICAgICAgICBhYnN0cmFjdDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYXV0aC9hdXRoLmxheW91dC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdBdXRoQ29udHJvbGxlcicsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6IFwidm1cIlxyXG5cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN0YXRlKCdhdXRoLmxvZ2luJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnXi9sb2dpbj97ZGlzYWJsZVJlZ2lzdHJhdGlvbn0mJntsYW5nfScsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2F1dGgvbG9naW4vbG9naW4uaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnTG9naW5Db250cm9sbGVyJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcblxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3RhdGUoJ2F1dGguc2lnbnVwJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnXi9zaWdudXA/e2xhbmd9JntjaWR9JyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYXV0aC9zaWdudXAvc2lnbnVwLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1NpZ251cENvbnRyb2xsZXInLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25seTogWydhbGxvd1JlZ2lzdHJhdGlvbiddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiAnYXV0aC5sb2dpbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbSByZWRpcmVjdGlvbiBwYXJhbWV0ZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZWdpc3RyYXRpb246ICd0cnVlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gdWktcm91dGVyIHRyYW5zaXRpb24gcGFyYW1zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2FkOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3RhdGUoJ2F1dGgubG9nb3V0Jywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnXi9sb2dvdXQnLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdhdXRoL2xvZ291dC9sb2dvdXRDb250cm9sbGVyLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ0xvZ291dENvbnRyb2xsZXInLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCJcclxuXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zdGF0ZSgnYXV0aC5jb25maXJtRW1haWwnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICdeL2NvbmZpcm0vP3trZXl9JyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYXV0aC9jb25maXJtRW1haWwvY29uZmlybUVtYWlsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ0NvbmZpcm1FbWFpbENvbnRyb2xsZXInLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCJcclxuXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zdGF0ZSgnYXV0aC5sb2dpbkV4dGVybmFsJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnXi9sb2dpbkV4dGVybmFsLz97dG9rZW59Jnt1c2VySWR9JntyZW1lbWJlcn0nLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdhdXRoL2xvZ2luRXh0ZXJuYWwvbG9naW5FeHRlcm5hbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdMb2dpbkV4dGVybmFsQ29udHJvbGxlcicsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6IFwidm1cIlxyXG5cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN0YXRlKCdhdXRoLnJlbWVtYmVyUGFzc3dvcmQnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICdeL3JlbWVtYmVyUGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdhdXRoL3JlbWVtYmVyUGFzc3dvcmRSZXF1ZXN0L3JlbWVtYmVyUGFzc3dvcmRSZXF1ZXN0Lmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1JlbWVtYmVyUGFzc3dvcmRSZXF1ZXN0Q29udHJvbGxlcicsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6IFwidm1cIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3RhdGUoJ2F1dGgucmVtZW1iZXJQYXNzd29yZENoYW5nZScsIHtcclxuICAgICAgICAgICAgICAgIHVybDogJ14vcGFzc3dvcmQtcmVjb3ZlcnkvP3trZXl9JyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYXV0aC9yZW1lbWJlclBhc3N3b3JkQ2hhbmdlL3JlbWVtYmVyUGFzc3dvcmRDaGFuZ2UuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnUmVtZW1iZXJQYXNzd29yZENoYW5nZUNvbnRyb2xsZXInLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCJcclxuXHJcbiAgICAgICAgICAgIH0pLnN0YXRlKCdhdXRoLmxvY2snLCB7XHJcbiAgICAgICAgICAgIHVybDogJ14vbG9jaycsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYXV0aC9sb2NrL2xvY2suaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdMb2NrQ29udHJvbGxlcicsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIDtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBtb2R1bGUuY29uZmlnKGNvbmZpZyk7XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDUuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jYW1wYWlnbnNcIiwgW10pO1xyXG5cclxuICBcclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNS4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNvbnRlbnRzXCIsIFtdKTtcclxuXHJcbiAgICBjb25maWcuJGluamVjdCA9IFsnJHN0YXRlUHJvdmlkZXInXTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb25maWcoJHN0YXRlUHJvdmlkZXIpIHtcclxuXHJcblxyXG4gICAgICAgICRzdGF0ZVByb3ZpZGVyXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LmNvbnRlbnQnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvY29udGVudCcsXHJcbiAgICAgICAgICAgICAgICBhYnN0cmFjdDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOic8ZGl2IHVpLXZpZXc+PC9kaXY+J1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3RhdGUoJ3BlcnNvbmFsQWNjb3VudC5jb250ZW50Lmxpc3QnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvbGlzdCcsXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IFwibGlzdENvbnRlbnRzXCJcclxuXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LmNvbnRlbnQuYWRkJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FkZCcsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbnRlbnQvcGFnZXMvYWRkQ29udGVudC9hZGRDb250ZW50Lmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ0FkZENvbnRlbnRDb250cm9sbGVyJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcblxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBtb2R1bGUuY29uZmlnKGNvbmZpZyk7XHJcbn0pKCk7IiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5kYXNoYm9hcmRcIiwgW10pO1xyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmxheW91dFwiLCBbXSk7XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiLCBbXSk7XHJcblxyXG4gICAgY29uZmlnLiRpbmplY3QgPSBbJyRzdGF0ZVByb3ZpZGVyJ107XHJcblxyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcblxyXG5cclxuICAgICAgICAkc3RhdGVQcm92aWRlclxyXG4gICAgICAgICAgICAuc3RhdGUoJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXInLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvcGxheWVyJyxcclxuICAgICAgICAgICAgICAgIGFic3RyYWN0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICc8ZGl2IHVpLXZpZXc+PC9kaXY+J1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3RhdGUoJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIudHJhY2tpbmcnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvOmlkL3RyYWNraW5nJyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncGxheWVycy9wYWdlcy9wbGF5ZXJUcmFja2luZy9wbGF5ZXJUcmFja2luZy5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdQbGF5ZXJUcmFja2luZ0NvbnRyb2xsZXInLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCJcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQucGxheWVyLmxpc3QnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvbGlzdCcsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3BsYXllcnMvcGxheWVycy9wbGF5ZXJzLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1BsYXllcnNDb250cm9sbGVyJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcblxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3RhdGUoJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIuY3JlYXRlJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2NyZWF0ZScsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3BsYXllcnMvcGFnZXMvY3JlYXRlTmV3UGxheWVyL2NyZWF0ZU5ld1BsYXllci5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdDcmVhdGVOZXdQbGF5ZXJDb250cm9sbGVyJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcblxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3RhdGUoJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIuZGV2U3RhdHMnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvZGV2U3RhdHMnLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwbGF5ZXJzL3BhZ2VzL2Rldkxhc3RQbGF5RXZlbnRzL2Rldkxhc3RQbGF5RXZlbnRzLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ0Rldkxhc3RQbGF5RXZlbnRzQ29udHJvbGxlcicsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6IFwidm1cIlxyXG5cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIG1vZHVsZS5jb25maWcoY29uZmlnKTtcclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy51c2VyXCIsIFtdKTtcclxuXHJcbiAgICBjb25maWcuJGluamVjdCA9IFsnJHN0YXRlUHJvdmlkZXInXTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb25maWcoJHN0YXRlUHJvdmlkZXIpIHtcclxuXHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQucHJlZmVyZW5jZScsIHtcclxuICAgICAgICAgICAgICAgIHVybDogJy9wcmVmZXJlbmNlJyxcclxuICAgICAgICAgICAgICAgIGFic3RyYWN0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICc8dWktdmlldy8+J1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLyouc3RhdGUoJ3BlcnNvbmFsQWNjb3VudC5wcmVmZXJlbmNlLnByb2ZpbGUnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvcHJvZmlsZScsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3VzZXIvcHJlZmVyZW5jZS9wcmVmZXJlbmNlLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1ByZWZlcmVuY2VDb250cm9sbGVyJ1xyXG5cclxuICAgICAgICAgICAgfSk7Ki9cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIG1vZHVsZS5jb25maWcoY29uZmlnKTtcclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNS4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnZpcnR1YWxTY3JlZW5zXCIsIFtdKTtcclxuXHJcbiAgXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDUuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdGF0aXN0aWNzXCIsIFtdKTtcclxuXHJcbiAgXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDUuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIiwgW10pO1xyXG5cclxuICBcclxufSkoKTsiLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogQG5nZG9jIG92ZXJ2aWV3XHJcbiAqIEBuYW1lIG5ld2FwcEFwcFxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogIyBuZXdhcHBBcHBcclxuICpcclxuICogTWFpbiBtb2R1bGUgb2YgdGhlIGFwcGxpY2F0aW9uLlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25maWcuJGluamVjdCA9IFtcIiRzdGF0ZVByb3ZpZGVyXCIsIFwiJHVybFJvdXRlclByb3ZpZGVyXCIsIFwiUmVzdGFuZ3VsYXJQcm92aWRlclwiLCBcIkJBU0VfSU5GT1wiLCBcInVpR21hcEdvb2dsZU1hcEFwaVByb3ZpZGVyXCIsIFwiJGh0dHBQcm92aWRlclwiXTtcclxuICAgIHJ1bi4kaW5qZWN0ID0gW1wiUGVybVBlcm1pc3Npb25TdG9yZVwiLCBcInNldHRpbmdzXCIsIFwiJHFcIiwgXCJBdXRoU2VydmljZVwiLCBcImJpbGxpbmdTZXJ2aWNlXCIsIFwiYmFja1NlcnZpY2VcIl07XHJcbiAgICB2YXIgTWFrZUFwcCA9IGFuZ3VsYXJcclxuICAgICAgICAubW9kdWxlKCduZXdBcHAnLCBbXHJcbiAgICAgICAgICAgICduZ0FuaW1hdGUnLFxyXG4gICAgICAgICAgICAnbmdDb29raWVzJyxcclxuICAgICAgICAgICAgJ25nUmVzb3VyY2UnLFxyXG4gICAgICAgICAgICAncmVzdGFuZ3VsYXInLFxyXG4gICAgICAgICAgICAndWkucm91dGVyJyxcclxuICAgICAgICAgICAgJ3VpLnNlbGVjdDInLFxyXG4gICAgICAgICAgICAndWkuc2VsZWN0JyxcclxuICAgICAgICAgICAgJ25nU2FuaXRpemUnLFxyXG4gICAgICAgICAgICAnbmdUb3VjaCcsXHJcbiAgICAgICAgICAgICd1aS5ib290c3RyYXAnLFxyXG4gICAgICAgICAgICAndWkuc29ydGFibGUnLFxyXG4gICAgICAgICAgICAnbmdMb2NhbGl6ZScsXHJcbiAgICAgICAgICAgICduZ0xvY2FsaXplLkNvbmZpZycsXHJcbiAgICAgICAgICAgICdhbmd1bGFyLWxhZGRhJyxcclxuICAgICAgICAgICAgJ3VpLnJvdXRlci5zdGF0ZS5ldmVudHMnLFxyXG4gICAgICAgICAgICAnY3QudWkucm91dGVyLmV4dHJhcy5jb3JlJyxcclxuICAgICAgICAgICAgJ3Blcm1pc3Npb24nLFxyXG4gICAgICAgICAgICAncGVybWlzc2lvbi51aScsXHJcbiAgICAgICAgICAgICdkYXRhdGFibGVzJyxcclxuICAgICAgICAgICAgJ3B1RWxhc3RpY0lucHV0JyxcclxuICAgICAgICAgICAgJ2FuZ3VsYXItY2xpY2stb3V0c2lkZScsXHJcbiAgICAgICAgICAgICdhbmd1bGFyTW9tZW50JyxcclxuICAgICAgICAgICAgJ25nTWFzaycsXHJcbiAgICAgICAgICAgICduZ0RyYWdEcm9wJyxcclxuICAgICAgICAgICAgJ3VpLmV2ZW50JyxcclxuICAgICAgICAgICAgJ3VpR21hcGdvb2dsZS1tYXBzJyxcclxuICAgICAgICAgICAgJ2FuZ3VsYXIuZmlsdGVyJyxcclxuICAgICAgICAgICAgJ3ZzLXJlcGVhdCcsXHJcbiAgICAgICAgICAgICdzY3JvbGxhYmxlLXRhYmxlJyxcclxuICAgICAgICAgICAgJ2NnQnVzeScsXHJcbiAgICAgICAgICAgICd0ZW1wbGF0ZXMnLFxyXG4gICAgICAgICAgICBcInRjLmNoYXJ0anNcIixcclxuICAgICAgICAgICAgXCJuZ09ubG9hZFwiLFxyXG4gICAgICAgICAgICAnYW5ndWxhci1jYWNoZScsXHJcbiAgICAgICAgICAgICdqUXVlcnlTY3JvbGxiYXInLFxyXG4gICAgICAgICAgICBcInRlbGVkcy5ibG9ja3NcIixcclxuICAgICAgICAgICAgJ3RlbGVkcy5hdXRoJyxcclxuICAgICAgICAgICAgXCJ0ZWxlZHMuZGFzaGJvYXJkXCIsXHJcbiAgICAgICAgICAgICd0ZWxlZHMubGF5b3V0JyxcclxuICAgICAgICAgICAgJ3RlbGVkcy51c2VyJyxcclxuICAgICAgICAgICAgJ3RlbGVkcy5wbGF5ZXJzJyxcclxuICAgICAgICAgICAgJ3RlbGVkcy5jb250ZW50cycsXHJcbiAgICAgICAgICAgICd0ZWxlZHMudmlydHVhbFNjcmVlbnMnLFxyXG4gICAgICAgICAgICAndGVsZWRzLmNhbXBhaWducycsXHJcbiAgICAgICAgICAgIFwidGVsZWRzLnN0YXRpc3RpY3NcIixcclxuICAgICAgICAgICAgXCJ0ZWxlZHMuc3Vic2NyaWJlXCJcclxuICAgICAgICBdKTtcclxuXHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbmZpZygkc3RhdGVQcm92aWRlciwgJHVybFJvdXRlclByb3ZpZGVyLCBSZXN0YW5ndWxhclByb3ZpZGVyLCBCQVNFX0lORk8sIHVpR21hcEdvb2dsZU1hcEFwaVByb3ZpZGVyLCAkaHR0cFByb3ZpZGVyKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHVpR21hcEdvb2dsZU1hcEFwaVByb3ZpZGVyLmNvbmZpZ3VyZSh7XHJcbiAgICAgICAgICAgIC8vICAgIGtleTogJ3lvdXIgYXBpIGtleScsXHJcbiAgICAgICAgICAgIHY6ICczJywgLy9kZWZhdWx0cyB0byBsYXRlc3QgMy5YIGFueWhvd1xyXG4gICAgICAgICAgICBsaWJyYXJpZXM6ICdnZW9tZXRyeSx2aXN1YWxpemF0aW9uLHBsYWNlcyxkcmF3aW5nJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIENoYXJ0LmRlZmF1bHRzLmdsb2JhbC5tYWludGFpbkFzcGVjdFJhdGlvID0gZmFsc2U7XHJcblxyXG4gICAgICAgICRodHRwUHJvdmlkZXIudXNlQXBwbHlBc3luYyh0cnVlKTtcclxuICAgICAgICBSZXN0YW5ndWxhclByb3ZpZGVyLnNldEJhc2VVcmwoQkFTRV9JTkZPLlVSTCArIFwiL1wiKTtcclxuXHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvcGVyc29uYWxBY2NvdW50JyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnbGF5b3V0L2xheW91dC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdtYWluQ3RybCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25seTogWydpc0F1dGgnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0OiBbJ2lzTG9jayddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogJ2F1dGgubG9jaydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiAnYXV0aC5sb2dpbidcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIE1ha2VBcHAuY29uZmlnKGNvbmZpZyk7XHJcblxyXG4gICAgTWFrZUFwcC5ydW4ocnVuKTtcclxuXHJcbiAgICBmdW5jdGlvbiBydW4oUGVybVBlcm1pc3Npb25TdG9yZSwgc2V0dGluZ3MsICRxLCBBdXRoU2VydmljZSxiaWxsaW5nU2VydmljZSxiYWNrU2VydmljZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIlxyXG4gICAgICAgIFBlcm1QZXJtaXNzaW9uU3RvcmVcclxuICAgICAgICAvLyBBIGRpZmZlcmVudCBleGFtcGxlIGZvciBhZG1pblxyXG4gICAgICAgICAgICAuZGVmaW5lUGVybWlzc2lvbignYWxsb3dSZWdpc3RyYXRpb24nLCBmdW5jdGlvbiAoc3RhdGVQYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5pc0FsbG93KCkudGhlbihmdW5jdGlvbiAoc2lnbnVwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ251cC5hbGxvd2VkID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIFBlcm1QZXJtaXNzaW9uU3RvcmUuZGVmaW5lUGVybWlzc2lvbignaXNBdXRoJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gISFBdXRoU2VydmljZS5hdXRoZW50aWNhdGlvbi5pc0F1dGg7XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgUGVybVBlcm1pc3Npb25TdG9yZS5kZWZpbmVQZXJtaXNzaW9uKCdpc0xvY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhIUF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0aW9uLmlzTG9jaztcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIFBlcm1QZXJtaXNzaW9uU3RvcmUuZGVmaW5lUGVybWlzc2lvbignSXNQYWlkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmlsbGluZ1NlcnZpY2UuZ2V0QmlsbGluZ1N0YXR1cygpLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgaWYoIXN0YXR1cy5wYWlkKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5yZWplY3Qoc3RhdHVzLnBhaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYmFja1NlcnZpY2UuY29uZmlndXJlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIE1ha2VBcHAuZGlyZWN0aXZlKCduZ1NwaW5uZXJMb2FkZXInLCBbJyRyb290U2NvcGUnLFxyXG4gICAgICAgIGZ1bmN0aW9uICgkcm9vdFNjb3BlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYnkgZGVmdWx0IGhpZGUgdGhlIHNwaW5uZXIgYmFyXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnaGlkZScpOyAvLyBoaWRlIHNwaW5uZXIgYmFyIGJ5IGRlZmF1bHRcclxuICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBzcGlubmVyIGJhciB3aGVuZXZlciB0aGUgcm91dGUgY2hhbmdlcyh0aGUgY29udGVudCBwYXJ0IHN0YXJ0ZWQgbG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgICAkcm9vdFNjb3BlLiRvbignJHN0YXRlQ2hhbmdlU3RhcnQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2hpZGUnKTsgLy8gc2hvdyBzcGlubmVyIGJhclxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgdGhlIHNwaW5uZXIgYmFyIG9uIHJvdW50ZSBjaGFuZ2Ugc3VjY2VzcyhhZnRlciB0aGUgY29udGVudCBsb2FkZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgJHJvb3RTY29wZS4kb24oJyRzdGF0ZUNoYW5nZVN1Y2Nlc3MnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnaGlkZScpOyAvLyBoaWRlIHNwaW5uZXIgYmFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXCJodG1sLCBib2R5XCIpLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgXSk7XHJcblxyXG5cclxuICAgIE1ha2VBcHAudmFsdWUoJ2xvY2FsZUNvbmYnLCB7XHJcbiAgICAgICAgYmFzZVBhdGg6ICcuLi9sYW5ndWFnZXMnLFxyXG4gICAgICAgIGRlZmF1bHRMb2NhbGU6ICdydScsXHJcbiAgICAgICAgc2hhcmVkRGljdGlvbmFyeTogJ2NvbW1vbicsXHJcbiAgICAgICAgZmlsZUV4dGVuc2lvbjogJy5sYW5nLmpzb24nLFxyXG4gICAgICAgIHBlcnNpc3RTZWxlY3Rpb246IHRydWUsXHJcbiAgICAgICAgY29va2llTmFtZTogJ0NPT0tJRV9MT0NBTEVfTEFORycsXHJcbiAgICAgICAgb2JzZXJ2YWJsZUF0dHJzOiBuZXcgUmVnRXhwKCdeZGF0YS0oPyFuZy18aTE4biknKSxcclxuICAgICAgICBkZWxpbWl0ZXI6ICc6OidcclxuICAgIH0pLnZhbHVlKCdsb2NhbGVTdXBwb3J0ZWQnLCBbXHJcbiAgICAgICAgJ2VuJyxcclxuICAgICAgICAncnUnXHJcbiAgICBdKS52YWx1ZSgnbG9jYWxlRmFsbGJhY2tzJywge1xyXG4gICAgICAgICdlbic6ICdlbidcclxuICAgIH0pO1xyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHNjb3BlXCIsIFwiQXV0aFNlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZSgnbmV3QXBwJykuY29udHJvbGxlcignbWFpbkN0cmwnLFxyXG4gICAgICAgIFsnJHNjb3BlJywgJ2FwcGxpY2F0aW9uU2VydmljZScsICdwbHVnaW5zU2VydmljZScsICckbG9jYXRpb24nLCAnJHRpbWVvdXQnLFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoJHNjb3BlLCBhcHBsaWNhdGlvblNlcnZpY2UsIHBsdWdpbnNTZXJ2aWNlLCAkbG9jYXRpb24sICR0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuJGVtaXQoJ2lzQXV0aCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2VydmljZS5pbml0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnNTZXJ2aWNlLmluaXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERyb3B6b25lLmF1dG9EaXNjb3ZlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJG9uKCckdmlld0NvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAvKiAkKCcubmF2Lm5hdi1zaWRlYmFyIC5uYXYtYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ25hdi1hY3RpdmUgYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5uYXYubmF2LXNpZGViYXIgLmFjdGl2ZTpub3QoLm5hdi1wYXJlbnQpJykuY2xvc2VzdCgnLm5hdi1wYXJlbnQnKS5hZGRDbGFzcygnbmF2LWFjdGl2ZSBhY3RpdmUnKTtcclxuKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsb2NhdGlvbi4kJHBhdGggPT0gJy8nIHx8ICRsb2NhdGlvbi4kJHBhdGggPT0gJy9sYXlvdXQtYXBpJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm5hdi5uYXYtc2lkZWJhciAubmF2LXBhcmVudCcpLnJlbW92ZUNsYXNzKCduYXYtYWN0aXZlIGFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm5hdi5uYXYtc2lkZWJhciAubmF2LXBhcmVudCAuY2hpbGRyZW4nKS5yZW1vdmVDbGFzcygnbmF2LWFjdGl2ZSBhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykgJiYgISQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci1ob3ZlcicpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdzdWJtZW51LWhvdmVyJykpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5uYXYubmF2LXNpZGViYXIgLm5hdi1wYXJlbnQgLmNoaWxkcmVuJykuc2xpZGVVcCgyMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm5hdi1zaWRlYmFyIC5hcnJvdycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGxvY2F0aW9uLiQkcGF0aCA9PSAnLycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnZGFzaGJvYXJkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ2Rhc2hib2FyZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICh2aWV3TG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdMb2NhdGlvbiA9PT0gJGxvY2F0aW9uLnBhdGgoKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSwgMCwgZmFsc2UpXHJcblxyXG5cclxuICAgICAgICAgICAgfV0pO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwibmV3QXBwXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoXCJCb2R5Q29udHJvbGxlclwiLCBjb250cm9sbGVyKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkc2NvcGUsIEF1dGhTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPXRoaXM7XHJcbiAgICAgICAgJHNjb3BlLiRvbignaXNBdXRoJywgZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XHJcbiAgICAgICAgICAgIHZtLmlzQXV0aCA9IGRhdGE7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIHZtLmxvYWRGcmFtZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgQXV0aFNlcnZpY2UuZnJhbWVMb2FkZWQucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG59KSgpO1xyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMC4wNS4yMDE2LlxyXG4gKi9cclxuaWYgKCFBcnJheS5wcm90b3R5cGUuZmluZCkge1xyXG4gICAgQXJyYXkucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGlzdCA9IE9iamVjdCh0aGlzKTtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGggPj4+IDA7XHJcbiAgICAgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgdmFyIHZhbHVlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gbGlzdFtpXTtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG59XHJcbmlmICghU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcykge1xyXG4gICAgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAndXNlIHN0cmljdCc7XHJcbiAgICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpICE9PSAtMTtcclxuICAgIH07XHJcbn1cclxuaWYgKCFTdHJpbmcucHJvdG90eXBlLmlzVGltZU51bGwpIHtcclxuICAgIFN0cmluZy5wcm90b3R5cGUuaXNUaW1lTnVsbCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAndXNlIHN0cmljdCc7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMgPT09IFwiMDAwMC0wMC0wMCAwMDowMDowMFwiXHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGlzRW1wdHkoc3RyKSB7XHJcbiAgICByZXR1cm4gKCFzdHIgfHwgMCA9PT0gc3RyLmxlbmd0aCk7XHJcbn1cclxuZnVuY3Rpb24gZ2V0TWF4T2ZBcnJheShudW1BcnJheSkge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIG51bUFycmF5KTtcclxufVxyXG5pZiAoIUFycmF5LmZyb20pIHtcclxuICAgIEFycmF5LmZyb20gPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XHJcbiAgICAgICAgdmFyIGlzQ2FsbGFibGUgPSBmdW5jdGlvbiAoZm4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIG51bWJlciA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgICAgIGlmIChpc05hTihudW1iZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwIHx8ICFpc0Zpbml0ZShudW1iZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAobnVtYmVyID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcclxuICAgICAgICB2YXIgdG9MZW5ndGggPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIGxlbiA9IHRvSW50ZWdlcih2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW4sIDApLCBtYXhTYWZlSW50ZWdlcik7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8g0KHQstC+0LnRgdGC0LLQviBsZW5ndGgg0LzQtdGC0L7QtNCwIGZyb20g0YDQsNCy0L3QviAxLlxyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZS8qLCBtYXBGbiwgdGhpc0FyZyAqLykge1xyXG4gICAgICAgICAgICAvLyAxLiDQn9C+0LvQvtC20LjQvCBDINGA0LDQstC90YvQvCDQt9C90LDRh9C10L3QuNGOIHRoaXMuXHJcbiAgICAgICAgICAgIHZhciBDID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIC8vIDIuINCf0L7Qu9C+0LbQuNC8IGl0ZW1zINGA0LDQstC90YvQvCBUb09iamVjdChhcnJheUxpa2UpLlxyXG4gICAgICAgICAgICB2YXIgaXRlbXMgPSBPYmplY3QoYXJyYXlMaWtlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIDMuIFJldHVybklmQWJydXB0KGl0ZW1zKS5cclxuICAgICAgICAgICAgaWYgKGFycmF5TGlrZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5mcm9tIHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0IC0gbm90IG51bGwgb3IgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIDQuINCV0YHQu9C4IG1hcGZuINGA0LDQstC10L0gdW5kZWZpbmVkLCDQv9C+0LvQvtC20LjQvCBtYXBwaW5nINGA0LDQstC90YvQvCBmYWxzZS5cclxuICAgICAgICAgICAgdmFyIG1hcEZuID0gYXJndW1lbnRzWzFdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG1hcEZuICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgbWFwRm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgLy8gNS4g0LjQvdCw0YfQtVxyXG4gICAgICAgICAgICAgICAgLy8gNS4gYS4g0JXRgdC70Lgg0LLRi9C30L7QsiBJc0NhbGxhYmxlKG1hcGZuKSDRgNCw0LLQtdC9IGZhbHNlLCDQstGL0LrQuNC00YvQstCw0LXQvCDQuNGB0LrQu9GO0YfQtdC90LjQtSBUeXBlRXJyb3IuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUobWFwRm4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyA1LiBiLiDQldGB0LvQuCB0aGlzQXJnINC/0YDQuNGB0YPRgtGB0YLQstGD0LXRgiwg0L/QvtC70L7QttC40LwgVCDRgNCw0LLQvdGL0LwgdGhpc0FyZzsg0LjQvdCw0YfQtSDQv9C+0LvQvtC20LjQvCBUINGA0LDQstC90YvQvCB1bmRlZmluZWQuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBUID0gYXJndW1lbnRzWzJdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAxMC4g0J/QvtC70L7QttC40LwgbGVuVmFsdWUg0YDQsNCy0L3Ri9C8IEdldChpdGVtcywgXCJsZW5ndGhcIikuXHJcbiAgICAgICAgICAgIC8vIDExLiDQn9C+0LvQvtC20LjQvCBsZW4g0YDQsNCy0L3Ri9C8IFRvTGVuZ3RoKGxlblZhbHVlKS5cclxuICAgICAgICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoKGl0ZW1zLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICAvLyAxMy4g0JXRgdC70LggSXNDb25zdHJ1Y3RvcihDKSDRgNCw0LLQtdC9IHRydWUsINGC0L5cclxuICAgICAgICAgICAgLy8gMTMuIGEuINCf0L7Qu9C+0LbQuNC8IEEg0YDQsNCy0L3Ri9C8INGA0LXQt9GD0LvRjNGC0LDRgtGDINCy0YvQt9C+0LLQsCDQstC90YPRgtGA0LXQvdC90LXQs9C+INC80LXRgtC+0LTQsCBbW0NvbnN0cnVjdF1dXHJcbiAgICAgICAgICAgIC8vICAgICDQvtCx0YrQtdC60YLQsCBDINGB0L4g0YHQv9C40YHQutC+0Lwg0LDRgNCz0YPQvNC10L3RgtC+0LIsINGB0L7QtNC10YDQttCw0YnQuNC8INC10LTQuNC90YHRgtCy0LXQvdC90YvQuSDRjdC70LXQvNC10L3RgiBsZW4uXHJcbiAgICAgICAgICAgIC8vIDE0LiBhLiDQmNC90LDRh9C1LCDQv9C+0LvQvtC20LjQvCBBINGA0LDQstC90YvQvCBBcnJheUNyZWF0ZShsZW4pLlxyXG4gICAgICAgICAgICB2YXIgQSA9IGlzQ2FsbGFibGUoQykgPyBPYmplY3QobmV3IEMobGVuKSkgOiBuZXcgQXJyYXkobGVuKTtcclxuXHJcbiAgICAgICAgICAgIC8vIDE2LiDQn9C+0LvQvtC20LjQvCBrINGA0LDQstC90YvQvCAwLlxyXG4gICAgICAgICAgICB2YXIgayA9IDA7XHJcbiAgICAgICAgICAgIC8vIDE3LiDQn9C+0LrQsCBrIDwgbGVuLCDQsdGD0LTQtdC8INC/0L7QstGC0L7RgNGP0YLRjC4uLiAo0YjQsNCz0Lgg0YEgYSDQv9C+IGgpXHJcbiAgICAgICAgICAgIHZhciBrVmFsdWU7XHJcbiAgICAgICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XHJcbiAgICAgICAgICAgICAgICBrVmFsdWUgPSBpdGVtc1trXTtcclxuICAgICAgICAgICAgICAgIGlmIChtYXBGbikge1xyXG4gICAgICAgICAgICAgICAgICAgIEFba10gPSB0eXBlb2YgVCA9PT0gJ3VuZGVmaW5lZCcgPyBtYXBGbihrVmFsdWUsIGspIDogbWFwRm4uY2FsbChULCBrVmFsdWUsIGspO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBBW2tdID0ga1ZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgayArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIDE4LiDQn9C+0LvQvtC20LjQvCBwdXRTdGF0dXMg0YDQsNCy0L3Ri9C8IFB1dChBLCBcImxlbmd0aFwiLCBsZW4sIHRydWUpLlxyXG4gICAgICAgICAgICBBLmxlbmd0aCA9IGxlbjtcclxuICAgICAgICAgICAgLy8gMjAuINCS0LXRgNC90ZHQvCBBLlxyXG4gICAgICAgICAgICByZXR1cm4gQTtcclxuICAgICAgICB9O1xyXG4gICAgfSgpKTtcclxufVxyXG5pZiAoIUFycmF5LmZyb21PYmplY3QpIHtcclxuICAgIEFycmF5LmZyb21PYmplY3QgPSBmdW5jdGlvbiAob2JqZWN0KSB7XHJcblxyXG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gb2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gob2JqZWN0W3Byb3BdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgIH07XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBjbG9uZU9iamVjdChzb3VyY2UpIHtcclxuICAgIHZhciBrZXksdmFsdWU7XHJcbiAgICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKHNvdXJjZSk7XHJcblxyXG4gICAgZm9yIChrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gc291cmNlW2tleV07XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsdWUhPT1udWxsICYmIHR5cGVvZiB2YWx1ZT09PVwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIGNsb25lW2tleV0gPSBjbG9uZU9iamVjdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjbG9uZVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbn1cclxuQXJyYXkucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAob2xkX2luZGV4LCBuZXdfaW5kZXgpIHtcclxuICAgIGlmIChuZXdfaW5kZXggPj0gdGhpcy5sZW5ndGgpIHtcclxuICAgICAgICB2YXIgayA9IG5ld19pbmRleCAtIHRoaXMubGVuZ3RoO1xyXG4gICAgICAgIHdoaWxlICgoay0tKSArIDEpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zcGxpY2UobmV3X2luZGV4LCAwLCB0aGlzLnNwbGljZShvbGRfaW5kZXgsIDEpWzBdKTtcclxuICAgIHJldHVybiB0aGlzOyAvLyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xyXG59O1xyXG5pZiAoIUFycmF5LmlzQXJyYXkpIHtcclxuICAgIEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbihhcmcpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XHJcbiAgICB9O1xyXG59XHJcblxyXG4kLmZuLmJvb3RzdHJhcERQLmRhdGVzWydydSddID0ge1xyXG4gICAgZGF5czogW1wi0JLQvtGB0LrRgNC10YHQtdC90YzQtVwiLCBcItCf0L7QvdC10LTQtdC70YzQvdC40LpcIiwgXCLQktGC0L7RgNC90LjQulwiLCBcItCh0YDQtdC00LBcIiwgXCLQp9C10YLQstC10YDQs1wiLCBcItCf0Y/RgtC90LjRhtCwXCIsIFwi0KHRg9Cx0LHQvtGC0LBcIl0sXHJcbiAgICBkYXlzU2hvcnQ6IFtcItCS0YHQulwiLCBcItCf0L3QtFwiLCBcItCS0YLRgFwiLCBcItCh0YDQtFwiLCBcItCn0YLQslwiLCBcItCf0YLQvVwiLCBcItCh0YPQsVwiXSxcclxuICAgIGRheXNNaW46IFtcItCS0YFcIiwgXCLQn9C9XCIsIFwi0JLRglwiLCBcItCh0YBcIiwgXCLQp9GCXCIsIFwi0J/RglwiLCBcItCh0LFcIl0sXHJcbiAgICBtb250aHM6IFtcItCv0L3QstCw0YDRjFwiLCBcItCk0LXQstGA0LDQu9GMXCIsIFwi0JzQsNGA0YJcIiwgXCLQkNC/0YDQtdC70YxcIiwgXCLQnNCw0LlcIiwgXCLQmNGO0L3RjFwiLCBcItCY0Y7Qu9GMXCIsIFwi0JDQstCz0YPRgdGCXCIsIFwi0KHQtdC90YLRj9Cx0YDRjFwiLCBcItCe0LrRgtGP0LHRgNGMXCIsIFwi0J3QvtGP0LHRgNGMXCIsIFwi0JTQtdC60LDQsdGA0YxcIl0sXHJcbiAgICBtb250aHNTaG9ydDogW1wi0K/QvdCyXCIsIFwi0KTQtdCyXCIsIFwi0JzQsNGAXCIsIFwi0JDQv9GAXCIsIFwi0JzQsNC5XCIsIFwi0JjRjtC9XCIsIFwi0JjRjtC7XCIsIFwi0JDQstCzXCIsIFwi0KHQtdC9XCIsIFwi0J7QutGCXCIsIFwi0J3QvtGPXCIsIFwi0JTQtdC6XCJdLFxyXG4gICAgdG9kYXk6IFwi0KHQtdCz0L7QtNC90Y9cIixcclxuICAgIGNsZWFyOiBcItCe0YfQuNGB0YLQuNGC0YxcIixcclxuICAgIGZvcm1hdDogXCJkZC5tbS55eXl5XCIsXHJcbiAgICB3ZWVrU3RhcnQ6IDFcclxufTtcclxuXHJcblxyXG5mdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGVsZW0sIGNhcmV0UG9zKSB7XHJcbiAgICBpZihlbGVtICE9IG51bGwpIHtcclxuICAgICAgICBpZihlbGVtLmNyZWF0ZVRleHRSYW5nZSkge1xyXG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBlbGVtLmNyZWF0ZVRleHRSYW5nZSgpO1xyXG4gICAgICAgICAgICByYW5nZS5tb3ZlKCdjaGFyYWN0ZXInLCBjYXJldFBvcyk7XHJcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldFBvcywgY2FyZXRQb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhdXRoQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHN0YXRlXCIsIFwiJHNjb3BlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYXV0aFwiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKFwiQXV0aENvbnRyb2xsZXJcIiwgYXV0aENvbnRyb2xsZXIpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBhdXRoQ29udHJvbGxlcigkc3RhdGUsICRzY29wZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICRzdGF0ZTtcclxuICAgICAgICAkc2NvcGUuJGVtaXQoJ2lzQXV0aCcsIHRydWUpO1xyXG5cclxuICAgIH07XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE3LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcInN0YXRpc3RpY3NcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5kYXNoYm9hcmRcIikuY29uZmlnKGNvbmZpZyk7XHJcbiAgICBjb25maWcuJGluamVjdCA9IFsnJHN0YXRlUHJvdmlkZXInXTtcclxuICAgIGZ1bmN0aW9uIGNvbmZpZygkc3RhdGVQcm92aWRlcikge1xyXG4gICAgICAgICRzdGF0ZVByb3ZpZGVyXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LmhvbWUnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvaG9tZScsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Rhc2hib2FyZC9kYXNoYm9hcmQuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHN0YXRpc3RpY3MpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCJcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0uaXRlbXMgPSBzdGF0aXN0aWNzLmdldFRvcFBsYXllclZpZXdzKCkudGhlbihmdW5jdGlvbiAocmVzdWx0cykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0ubmFtZSA9IGl0ZW0ucGxheWVyX25hbWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KTtcclxuICAgICAgICB2bS5pdGVtc0luYWN0aXZlID0gc3RhdGlzdGljcy5nZXROb0xhc3RBY3Rpdml0eSgpO1xyXG4gICAgfVxyXG5cclxufSkoKTsiLCIndXNlIHN0cmljdCc7XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgnbmV3QXBwJylcclxuICAuY29udHJvbGxlcignYXBpQ3RybCcsIFtcIiRzY29wZVwiLCBcImxheW91dEFwaVNlcnZpY2VcIiwgXCJhcHBsaWNhdGlvblNlcnZpY2VcIiwgXCJwbHVnaW5zU2VydmljZVwiLCBmdW5jdGlvbiAoJHNjb3BlLCBsYXlvdXRBcGlTZXJ2aWNlLCBhcHBsaWNhdGlvblNlcnZpY2UscGx1Z2luc1NlcnZpY2UpIHtcclxuICAgICAgJHNjb3BlLiRvbignJHZpZXdDb250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgLy9hcHBsaWNhdGlvblNlcnZpY2UuaW5pdCgpO1xyXG5cclxuICAgICAgICAgICQoJ1tkYXRhLXRvZ2dsZV0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgIHZhciB0b2dnbGVMYXlvdXQgPSAkKHRoaXMpLmRhdGEoJ3RvZ2dsZScpO1xyXG4gICAgICAgICAgICAgIGlmICh0b2dnbGVMYXlvdXQgPT0gJ3NpZGViYXItYmVoYXZpb3VyJykgYXBwbGljYXRpb25TZXJ2aWNlLnRvZ2dsZVNpZGViYXIoKTtcclxuICAgICAgICAgICAgICBpZiAodG9nZ2xlTGF5b3V0ID09ICdzdWJtZW51JykgYXBwbGljYXRpb25TZXJ2aWNlLnRvZ2dsZVN1Ym1lbnVIb3ZlcigpO1xyXG4gICAgICAgICAgICAgIGlmICh0b2dnbGVMYXlvdXQgPT0gJ3NpZGViYXItaG92ZXInKSBhcHBsaWNhdGlvblNlcnZpY2UudG9nZ2xlU2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgICAgICAgaWYgKHRvZ2dsZUxheW91dCA9PSAnYm94ZWQnKSBhcHBsaWNhdGlvblNlcnZpY2UudG9nZ2xlYm94ZWRMYXlvdXQoKTtcclxuICAgICAgICAgICAgICBpZiAodG9nZ2xlTGF5b3V0ID09ICd0b3BiYXInKSBhcHBsaWNhdGlvblNlcnZpY2UudG9nZ2xlVG9wYmFyKCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBsYXlvdXRBcGlTZXJ2aWNlLmluaXQoKTtcclxuICAgICAgfSk7XHJcbiAgfV0pOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA3LjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5kaXJlY3RpdmUoXCJjb21wYXJlVG9cIiwgY29uZmlybVBhc3N3b3JkKTtcclxuXHJcbiAgICBjb25maXJtUGFzc3dvcmQuJGluamVjdCA9IFtcIiRkb2N1bWVudFwiXTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb25maXJtUGFzc3dvcmQoJGRvY3VtZW50KSB7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlcXVpcmU6IFwibmdNb2RlbFwiLFxyXG4gICAgICAgICAgICBzY29wZToge1xyXG4gICAgICAgICAgICAgICAgb3RoZXJNb2RlbFZhbHVlOiBcIj1jb21wYXJlVG9cIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cmlidXRlcywgbmdNb2RlbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG5nTW9kZWwuJHZhbGlkYXRvcnMuY29tcGFyZVRvID0gZnVuY3Rpb24obW9kZWxWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFZhbHVlID09IHNjb3BlLm90aGVyTW9kZWxWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoKFwib3RoZXJNb2RlbFZhbHVlXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5nTW9kZWwuJHZhbGlkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuY29uc3RhbnQoJ0JBU0VfSU5GTycsIHtcclxuICAgICAgICAgICAgXCJVUkxcIjogXCJodHRwczovL2Rldi5hcGkudGVsZWRzLmNvbVwiLFxyXG4gICAgICAgICAgICBcIkFQSV9VUkxcIjogXCIvYXBpXCIsXHJcbiAgICAgICAgICAgIFwiREVWXCI6dHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNvbnN0YW50KCdBY2NlcHRGaWxlJyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmlkZW86IFsnM0dQJywgJ0FTRicsICdBVkknLCAnTTJUUycsICdNNFYnLCAnTUtWJywgJ01PVicsICdRVCcsICdNUDQnLCAnbXBlZycsICdNVFMnLCAnVk9CJywgJ1dNVicsICdXZWJNJywgJ2RpdngnLCAneHZpZCddLm1hcChcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3ZpZGVvLycgKyBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICkuY29uY2F0KFsnLmRpdngnXSkuam9pbigpLFxyXG4gICAgICAgICAgICAgICAgYXVkaW86IFsnYWFjJywgJ2FtcicsICdmbGFjJywgJ200YScsICdtNGInLCAnbTRwJywgJ21wMycsICdvZ2cnLCAnd2F2JywgJ3dtYScsICd3ZWJtJywgJ29nYScsICdtb2dnJywgJ21wZWcnXS5tYXAoXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhdWRpby8nICsgaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApLmpvaW4oKSxcclxuICAgICAgICAgICAgICAgIGh0bWw1X3ppcDogW1wiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsIFwiYXBwbGljYXRpb24vemlwXCIsIFwiYXBwbGljYXRpb24veC16aXBcIiwgXCJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkXCJdLFxyXG4gICAgICAgICAgICAgICAgaW1hZ2U6IFsnaW1hZ2UvKiddXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApXHJcblxyXG4gICAgICAgIC5jb25zdGFudCgnUXVhbGl0aWVzJyxcclxuICAgICAgICAgICAgW3tuYW1lOiAnNGsnfSwge25hbWU6ICcxMDgwcCd9LCB7bmFtZTogJzcyMHAnfSwge25hbWU6ICc0ODBwJ31dXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5jb25zdGFudCgnRmlsbE1vZGVzJyxcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicHJlc2VydmVBc3BlY3RDcm9wXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJzdHJldGNoXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIClcclxuICAgICAgICAuY29uc3RhbnQoJ0NvbnRlbnRUeXBlcycsXHJcbiAgICAgICAgICAgIFt7bmFtZTogJ3ZpZGVvJ30sIHtuYW1lOiAnaW1hZ2UnfSwge25hbWU6ICdhdWRpbyd9LCB7bmFtZTogJ2h0bWw1X29ubGluZSd9LCB7bmFtZTogJ2h0bWw1X3ppcCd9XVxyXG4gICAgICAgIClcclxuICAgICAgICAuY29uc3RhbnQoJ0NvbnRlbnRTdGF0dXMnLFxyXG4gICAgICAgICAgICBbe25hbWU6ICdjcmVhdGVkJ30sIHtuYW1lOiAncHJvY2Vzc2luZyd9LCB7bmFtZTogJ3JlYWR5J30sIHtuYW1lOiAnZXJyb3InfV1cclxuICAgICAgICApXHJcblxyXG4gICAgICAgIC5jb25zdGFudCgnVGltZXpvbmVzRm9yU2VsZWN0JyxcclxuICAgICAgICAgICAgbW9tZW50LnR6Lm5hbWVzKCkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge25hbWU6IGl0ZW19O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICAuY29uc3RhbnQoJ0F1ZGlvUHJpb3JpdHknLFxyXG4gICAgICAgICAgICBbe25hbWU6ICdmdWxsc2NyZWVuJywgZGVmYXVsdDogdHJ1ZX0sIHtuYW1lOiAnYXVkaW8nfSwge25hbWU6IFwid2lkZ2V0c1wifV0pXHJcbiAgICAgICAgLmNvbnN0YW50KCdUeXBlU2NyZWVuVmlydHVhbFNjcmVlbicsXHJcbiAgICAgICAgICAgIFt7bmFtZTogJ2Z1bGxzY3JlZW4nLCBkZWZhdWx0OiB0cnVlfSwge25hbWU6ICd2aWRlb193aWRnZXQnfV1cclxuICAgICAgICApXHJcbiAgICAgICAgLmNvbnN0YW50KCdQYXltZW50VHlwZScsXHJcbiAgICAgICAgICAgIFt7bmFtZTogJ2ZpeGVkJywgZGVmYXVsdDogdHJ1ZX0sIHtuYW1lOiAndmlld3MnfV1cclxuICAgICAgICApXHJcbiAgICAgICAgLmNvbnN0YW50KCdDYW1wYWlnblN0YXR1cycsXHJcbiAgICAgICAgICAgIFt7bmFtZTogJ2FjdGl2ZSd9LCB7bmFtZTogJ2FyY2hpdmUnfV1cclxuICAgICAgICApXHJcbiAgICAgICAgLmNvbnN0YW50KCdQbGF5VGltZUNvbnRlbnQnLFxyXG4gICAgICAgICAgICBbe25hbWU6ICdmcmVlJ30sIHtuYW1lOiAnb25seV9lbXB0eSd9LCB7bmFtZTogJ25vcm1hbCd9XVxyXG4gICAgICAgIClcclxuICAgICAgICAuY29uc3RhbnQoJ1JvdGF0aW9uQ29udGVudCcsXHJcbiAgICAgICAgICAgIFt7bmFtZTogJzAnfSwge25hbWU6ICc5MCd9LCB7bmFtZTogJzE4MCd9LCB7bmFtZTogJzI3MCd9XVxyXG4gICAgICAgIClcclxuICAgICAgICAuY29uc3RhbnQoJ1JvdGF0aW9uQ2FtcGFpZ24nLFxyXG4gICAgICAgICAgICBbe25hbWU6ICcwJ30sIHtuYW1lOiAnOTAnfSwge25hbWU6ICcxODAnfSwge25hbWU6ICcyNzAnfV1cclxuICAgICAgICApXHJcbiAgICAgICAgLmNvbnN0YW50KCdQb3NpdGlvblR5cGUnLFxyXG4gICAgICAgICAgICBbe25hbWU6ICdzdGF0aWMnfSwge25hbWU6ICdtb2JpbGUnfV1cclxuICAgICAgICApXHJcbiAgICAgICAgLmNvbnN0YW50KCdDb3VudHJpZXMnLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQWZnaGFuaXN0YW5cIiwgXCJjb2RlXCI6IFwiQUZcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwibGFuZCBJc2xhbmRzXCIsIFwiY29kZVwiOiBcIkFYXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkFsYmFuaWFcIiwgXCJjb2RlXCI6IFwiQUxcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQWxnZXJpYVwiLCBcImNvZGVcIjogXCJEWlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJBbWVyaWNhbiBTYW1vYVwiLCBcImNvZGVcIjogXCJBU1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJBbmRvcnJBXCIsIFwiY29kZVwiOiBcIkFEXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkFuZ29sYVwiLCBcImNvZGVcIjogXCJBT1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJBbmd1aWxsYVwiLCBcImNvZGVcIjogXCJBSVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJBbnRhcmN0aWNhXCIsIFwiY29kZVwiOiBcIkFRXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkFudGlndWEgYW5kIEJhcmJ1ZGFcIiwgXCJjb2RlXCI6IFwiQUdcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQXJnZW50aW5hXCIsIFwiY29kZVwiOiBcIkFSXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkFybWVuaWFcIiwgXCJjb2RlXCI6IFwiQU1cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQXJ1YmFcIiwgXCJjb2RlXCI6IFwiQVdcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQXVzdHJhbGlhXCIsIFwiY29kZVwiOiBcIkFVXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkF1c3RyaWFcIiwgXCJjb2RlXCI6IFwiQVRcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQXplcmJhaWphblwiLCBcImNvZGVcIjogXCJBWlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJCYWhhbWFzXCIsIFwiY29kZVwiOiBcIkJTXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkJhaHJhaW5cIiwgXCJjb2RlXCI6IFwiQkhcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQmFuZ2xhZGVzaFwiLCBcImNvZGVcIjogXCJCRFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJCYXJiYWRvc1wiLCBcImNvZGVcIjogXCJCQlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJCZWxhcnVzXCIsIFwiY29kZVwiOiBcIkJZXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkJlbGdpdW1cIiwgXCJjb2RlXCI6IFwiQkVcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQmVsaXplXCIsIFwiY29kZVwiOiBcIkJaXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkJlbmluXCIsIFwiY29kZVwiOiBcIkJKXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkJlcm11ZGFcIiwgXCJjb2RlXCI6IFwiQk1cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQmh1dGFuXCIsIFwiY29kZVwiOiBcIkJUXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkJvbGl2aWFcIiwgXCJjb2RlXCI6IFwiQk9cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYVwiLCBcImNvZGVcIjogXCJCQVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJCb3Rzd2FuYVwiLCBcImNvZGVcIjogXCJCV1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJCb3V2ZXQgSXNsYW5kXCIsIFwiY29kZVwiOiBcIkJWXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkJyYXppbFwiLCBcImNvZGVcIjogXCJCUlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnlcIiwgXCJjb2RlXCI6IFwiSU9cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQnJ1bmVpIERhcnVzc2FsYW1cIiwgXCJjb2RlXCI6IFwiQk5cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQnVsZ2FyaWFcIiwgXCJjb2RlXCI6IFwiQkdcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQnVya2luYSBGYXNvXCIsIFwiY29kZVwiOiBcIkJGXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkJ1cnVuZGlcIiwgXCJjb2RlXCI6IFwiQklcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2FtYm9kaWFcIiwgXCJjb2RlXCI6IFwiS0hcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2FtZXJvb25cIiwgXCJjb2RlXCI6IFwiQ01cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2FuYWRhXCIsIFwiY29kZVwiOiBcIkNBXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkNhcGUgVmVyZGVcIiwgXCJjb2RlXCI6IFwiQ1ZcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2F5bWFuIElzbGFuZHNcIiwgXCJjb2RlXCI6IFwiS1lcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljXCIsIFwiY29kZVwiOiBcIkNGXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkNoYWRcIiwgXCJjb2RlXCI6IFwiVERcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2hpbGVcIiwgXCJjb2RlXCI6IFwiQ0xcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2hpbmFcIiwgXCJjb2RlXCI6IFwiQ05cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ2hyaXN0bWFzIElzbGFuZFwiLCBcImNvZGVcIjogXCJDWFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJDb2NvcyAoS2VlbGluZykgSXNsYW5kc1wiLCBcImNvZGVcIjogXCJDQ1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJDb2xvbWJpYVwiLCBcImNvZGVcIjogXCJDT1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJDb21vcm9zXCIsIFwiY29kZVwiOiBcIktNXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkNvbmdvXCIsIFwiY29kZVwiOiBcIkNHXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkNvbmdvLCBUaGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGVcIiwgXCJjb2RlXCI6IFwiQ0RcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ29vayBJc2xhbmRzXCIsIFwiY29kZVwiOiBcIkNLXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkNvc3RhIFJpY2FcIiwgXCJjb2RlXCI6IFwiQ1JcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiQ3JvYXRpYVwiLCBcImNvZGVcIjogXCJIUlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJDdWJhXCIsIFwiY29kZVwiOiBcIkNVXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkN5cHJ1c1wiLCBcImNvZGVcIjogXCJDWVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJDemVjaCBSZXB1YmxpY1wiLCBcImNvZGVcIjogXCJDWlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJEZW5tYXJrXCIsIFwiY29kZVwiOiBcIkRLXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkRqaWJvdXRpXCIsIFwiY29kZVwiOiBcIkRKXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkRvbWluaWNhXCIsIFwiY29kZVwiOiBcIkRNXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkRvbWluaWNhbiBSZXB1YmxpY1wiLCBcImNvZGVcIjogXCJET1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJFY3VhZG9yXCIsIFwiY29kZVwiOiBcIkVDXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkVneXB0XCIsIFwiY29kZVwiOiBcIkVHXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkVsIFNhbHZhZG9yXCIsIFwiY29kZVwiOiBcIlNWXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkVxdWF0b3JpYWwgR3VpbmVhXCIsIFwiY29kZVwiOiBcIkdRXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkVyaXRyZWFcIiwgXCJjb2RlXCI6IFwiRVJcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiRXN0b25pYVwiLCBcImNvZGVcIjogXCJFRVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJFdGhpb3BpYVwiLCBcImNvZGVcIjogXCJFVFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcylcIiwgXCJjb2RlXCI6IFwiRktcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiRmFyb2UgSXNsYW5kc1wiLCBcImNvZGVcIjogXCJGT1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJGaWppXCIsIFwiY29kZVwiOiBcIkZKXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkZpbmxhbmRcIiwgXCJjb2RlXCI6IFwiRklcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiRnJhbmNlXCIsIFwiY29kZVwiOiBcIkZSXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkZyZW5jaCBHdWlhbmFcIiwgXCJjb2RlXCI6IFwiR0ZcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiRnJlbmNoIFBvbHluZXNpYVwiLCBcImNvZGVcIjogXCJQRlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXNcIiwgXCJjb2RlXCI6IFwiVEZcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR2Fib25cIiwgXCJjb2RlXCI6IFwiR0FcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR2FtYmlhXCIsIFwiY29kZVwiOiBcIkdNXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkdlb3JnaWFcIiwgXCJjb2RlXCI6IFwiR0VcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR2VybWFueVwiLCBcImNvZGVcIjogXCJERVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJHaGFuYVwiLCBcImNvZGVcIjogXCJHSFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJHaWJyYWx0YXJcIiwgXCJjb2RlXCI6IFwiR0lcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR3JlZWNlXCIsIFwiY29kZVwiOiBcIkdSXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkdyZWVubGFuZFwiLCBcImNvZGVcIjogXCJHTFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJHcmVuYWRhXCIsIFwiY29kZVwiOiBcIkdEXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkd1YWRlbG91cGVcIiwgXCJjb2RlXCI6IFwiR1BcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR3VhbVwiLCBcImNvZGVcIjogXCJHVVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJHdWF0ZW1hbGFcIiwgXCJjb2RlXCI6IFwiR1RcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR3Vlcm5zZXlcIiwgXCJjb2RlXCI6IFwiR0dcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR3VpbmVhXCIsIFwiY29kZVwiOiBcIkdOXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkd1aW5lYS1CaXNzYXVcIiwgXCJjb2RlXCI6IFwiR1dcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiR3V5YW5hXCIsIFwiY29kZVwiOiBcIkdZXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkhhaXRpXCIsIFwiY29kZVwiOiBcIkhUXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkhlYXJkIElzbGFuZCBhbmQgTWNkb25hbGQgSXNsYW5kc1wiLCBcImNvZGVcIjogXCJITVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKVwiLCBcImNvZGVcIjogXCJWQVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJIb25kdXJhc1wiLCBcImNvZGVcIjogXCJITlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJIb25nIEtvbmdcIiwgXCJjb2RlXCI6IFwiSEtcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiSHVuZ2FyeVwiLCBcImNvZGVcIjogXCJIVVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJJY2VsYW5kXCIsIFwiY29kZVwiOiBcIklTXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkluZGlhXCIsIFwiY29kZVwiOiBcIklOXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkluZG9uZXNpYVwiLCBcImNvZGVcIjogXCJJRFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJJcmFuLCBJc2xhbWljIFJlcHVibGljIE9mXCIsIFwiY29kZVwiOiBcIklSXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIklyYXFcIiwgXCJjb2RlXCI6IFwiSVFcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiSXJlbGFuZFwiLCBcImNvZGVcIjogXCJJRVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJJc2xlIG9mIE1hblwiLCBcImNvZGVcIjogXCJJTVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJJc3JhZWxcIiwgXCJjb2RlXCI6IFwiSUxcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiSXRhbHlcIiwgXCJjb2RlXCI6IFwiSVRcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiSmFtYWljYVwiLCBcImNvZGVcIjogXCJKTVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJKYXBhblwiLCBcImNvZGVcIjogXCJKUFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJKZXJzZXlcIiwgXCJjb2RlXCI6IFwiSkVcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiSm9yZGFuXCIsIFwiY29kZVwiOiBcIkpPXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkthemFraHN0YW5cIiwgXCJjb2RlXCI6IFwiS1pcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiS2VueWFcIiwgXCJjb2RlXCI6IFwiS0VcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiS2lyaWJhdGlcIiwgXCJjb2RlXCI6IFwiS0lcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlIFJlcHVibGljIG9mXCIsIFwiY29kZVwiOiBcIktQXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIktvcmVhLCBSZXB1YmxpYyBvZlwiLCBcImNvZGVcIjogXCJLUlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJLdXdhaXRcIiwgXCJjb2RlXCI6IFwiS1dcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiS3lyZ3l6c3RhblwiLCBcImNvZGVcIjogXCJLR1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJMYW8gUGVvcGxlIERlbW9jcmF0aWMgUmVwdWJsaWNcIiwgXCJjb2RlXCI6IFwiTEFcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTGF0dmlhXCIsIFwiY29kZVwiOiBcIkxWXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkxlYmFub25cIiwgXCJjb2RlXCI6IFwiTEJcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTGVzb3Rob1wiLCBcImNvZGVcIjogXCJMU1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJMaWJlcmlhXCIsIFwiY29kZVwiOiBcIkxSXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIkxpYnlhbiBBcmFiIEphbWFoaXJpeWFcIiwgXCJjb2RlXCI6IFwiTFlcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTGllY2h0ZW5zdGVpblwiLCBcImNvZGVcIjogXCJMSVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJMaXRodWFuaWFcIiwgXCJjb2RlXCI6IFwiTFRcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTHV4ZW1ib3VyZ1wiLCBcImNvZGVcIjogXCJMVVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNYWNhb1wiLCBcImNvZGVcIjogXCJNT1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNYWNlZG9uaWEsIFRoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2ZcIiwgXCJjb2RlXCI6IFwiTUtcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTWFkYWdhc2NhclwiLCBcImNvZGVcIjogXCJNR1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNYWxhd2lcIiwgXCJjb2RlXCI6IFwiTVdcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTWFsYXlzaWFcIiwgXCJjb2RlXCI6IFwiTVlcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTWFsZGl2ZXNcIiwgXCJjb2RlXCI6IFwiTVZcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTWFsaVwiLCBcImNvZGVcIjogXCJNTFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNYWx0YVwiLCBcImNvZGVcIjogXCJNVFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNYXJzaGFsbCBJc2xhbmRzXCIsIFwiY29kZVwiOiBcIk1IXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIk1hcnRpbmlxdWVcIiwgXCJjb2RlXCI6IFwiTVFcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTWF1cml0YW5pYVwiLCBcImNvZGVcIjogXCJNUlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNYXVyaXRpdXNcIiwgXCJjb2RlXCI6IFwiTVVcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTWF5b3R0ZVwiLCBcImNvZGVcIjogXCJZVFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNZXhpY29cIiwgXCJjb2RlXCI6IFwiTVhcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTWljcm9uZXNpYSwgRmVkZXJhdGVkIFN0YXRlcyBvZlwiLCBcImNvZGVcIjogXCJGTVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNb2xkb3ZhLCBSZXB1YmxpYyBvZlwiLCBcImNvZGVcIjogXCJNRFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNb25hY29cIiwgXCJjb2RlXCI6IFwiTUNcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTW9uZ29saWFcIiwgXCJjb2RlXCI6IFwiTU5cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTW9udGVuZWdyb1wiLCBcImNvZGVcIjogXCJNRVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNb250c2VycmF0XCIsIFwiY29kZVwiOiBcIk1TXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIk1vcm9jY29cIiwgXCJjb2RlXCI6IFwiTUFcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTW96YW1iaXF1ZVwiLCBcImNvZGVcIjogXCJNWlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJNeWFubWFyXCIsIFwiY29kZVwiOiBcIk1NXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIk5hbWliaWFcIiwgXCJjb2RlXCI6IFwiTkFcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTmF1cnVcIiwgXCJjb2RlXCI6IFwiTlJcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTmVwYWxcIiwgXCJjb2RlXCI6IFwiTlBcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTmV0aGVybGFuZHNcIiwgXCJjb2RlXCI6IFwiTkxcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTmV0aGVybGFuZHMgQW50aWxsZXNcIiwgXCJjb2RlXCI6IFwiQU5cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTmV3IENhbGVkb25pYVwiLCBcImNvZGVcIjogXCJOQ1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJOZXcgWmVhbGFuZFwiLCBcImNvZGVcIjogXCJOWlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJOaWNhcmFndWFcIiwgXCJjb2RlXCI6IFwiTklcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTmlnZXJcIiwgXCJjb2RlXCI6IFwiTkVcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiTmlnZXJpYVwiLCBcImNvZGVcIjogXCJOR1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJOaXVlXCIsIFwiY29kZVwiOiBcIk5VXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIk5vcmZvbGsgSXNsYW5kXCIsIFwiY29kZVwiOiBcIk5GXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIk5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kc1wiLCBcImNvZGVcIjogXCJNUFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJOb3J3YXlcIiwgXCJjb2RlXCI6IFwiTk9cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiT21hblwiLCBcImNvZGVcIjogXCJPTVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJQYWtpc3RhblwiLCBcImNvZGVcIjogXCJQS1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJQYWxhdVwiLCBcImNvZGVcIjogXCJQV1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJQYWxlc3RpbmlhbiBUZXJyaXRvcnksIE9jY3VwaWVkXCIsIFwiY29kZVwiOiBcIlBTXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlBhbmFtYVwiLCBcImNvZGVcIjogXCJQQVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJQYXB1YSBOZXcgR3VpbmVhXCIsIFwiY29kZVwiOiBcIlBHXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlBhcmFndWF5XCIsIFwiY29kZVwiOiBcIlBZXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlBlcnVcIiwgXCJjb2RlXCI6IFwiUEVcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiUGhpbGlwcGluZXNcIiwgXCJjb2RlXCI6IFwiUEhcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiUGl0Y2Fpcm5cIiwgXCJjb2RlXCI6IFwiUE5cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiUG9sYW5kXCIsIFwiY29kZVwiOiBcIlBMXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlBvcnR1Z2FsXCIsIFwiY29kZVwiOiBcIlBUXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlB1ZXJ0byBSaWNvXCIsIFwiY29kZVwiOiBcIlBSXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlFhdGFyXCIsIFwiY29kZVwiOiBcIlFBXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlJldW5pb25cIiwgXCJjb2RlXCI6IFwiUkVcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiUm9tYW5pYVwiLCBcImNvZGVcIjogXCJST1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJSdXNzaWFuIEZlZGVyYXRpb25cIiwgXCJjb2RlXCI6IFwiUlVcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiUldBTkRBXCIsIFwiY29kZVwiOiBcIlJXXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlNhaW50IEhlbGVuYVwiLCBcImNvZGVcIjogXCJTSFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTYWludCBLaXR0cyBhbmQgTmV2aXNcIiwgXCJjb2RlXCI6IFwiS05cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU2FpbnQgTHVjaWFcIiwgXCJjb2RlXCI6IFwiTENcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvblwiLCBcImNvZGVcIjogXCJQTVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lc1wiLCBcImNvZGVcIjogXCJWQ1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTYW1vYVwiLCBcImNvZGVcIjogXCJXU1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTYW4gTWFyaW5vXCIsIFwiY29kZVwiOiBcIlNNXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlNhbyBUb21lIGFuZCBQcmluY2lwZVwiLCBcImNvZGVcIjogXCJTVFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTYXVkaSBBcmFiaWFcIiwgXCJjb2RlXCI6IFwiU0FcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU2VuZWdhbFwiLCBcImNvZGVcIjogXCJTTlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTZXJiaWFcIiwgXCJjb2RlXCI6IFwiUlNcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU2V5Y2hlbGxlc1wiLCBcImNvZGVcIjogXCJTQ1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTaWVycmEgTGVvbmVcIiwgXCJjb2RlXCI6IFwiU0xcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU2luZ2Fwb3JlXCIsIFwiY29kZVwiOiBcIlNHXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlNsb3Zha2lhXCIsIFwiY29kZVwiOiBcIlNLXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlNsb3ZlbmlhXCIsIFwiY29kZVwiOiBcIlNJXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlNvbG9tb24gSXNsYW5kc1wiLCBcImNvZGVcIjogXCJTQlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTb21hbGlhXCIsIFwiY29kZVwiOiBcIlNPXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlNvdXRoIEFmcmljYVwiLCBcImNvZGVcIjogXCJaQVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTb3V0aCBHZW9yZ2lhIGFuZCB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kc1wiLCBcImNvZGVcIjogXCJHU1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTcGFpblwiLCBcImNvZGVcIjogXCJFU1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTcmkgTGFua2FcIiwgXCJjb2RlXCI6IFwiTEtcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU3VkYW5cIiwgXCJjb2RlXCI6IFwiU0RcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU3VyaW5hbWVcIiwgXCJjb2RlXCI6IFwiU1JcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU3ZhbGJhcmQgYW5kIEphbiBNYXllblwiLCBcImNvZGVcIjogXCJTSlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJTd2F6aWxhbmRcIiwgXCJjb2RlXCI6IFwiU1pcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiU3dlZGVuXCIsIFwiY29kZVwiOiBcIlNFXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlN3aXR6ZXJsYW5kXCIsIFwiY29kZVwiOiBcIkNIXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlN5cmlhbiBBcmFiIFJlcHVibGljXCIsIFwiY29kZVwiOiBcIlNZXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlRhaXdhbiwgUHJvdmluY2Ugb2YgQ2hpbmFcIiwgXCJjb2RlXCI6IFwiVFdcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiVGFqaWtpc3RhblwiLCBcImNvZGVcIjogXCJUSlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJUYW56YW5pYSwgVW5pdGVkIFJlcHVibGljIG9mXCIsIFwiY29kZVwiOiBcIlRaXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlRoYWlsYW5kXCIsIFwiY29kZVwiOiBcIlRIXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlRpbW9yLUxlc3RlXCIsIFwiY29kZVwiOiBcIlRMXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlRvZ29cIiwgXCJjb2RlXCI6IFwiVEdcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiVG9rZWxhdVwiLCBcImNvZGVcIjogXCJUS1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJUb25nYVwiLCBcImNvZGVcIjogXCJUT1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJUcmluaWRhZCBhbmQgVG9iYWdvXCIsIFwiY29kZVwiOiBcIlRUXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlR1bmlzaWFcIiwgXCJjb2RlXCI6IFwiVE5cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiVHVya2V5XCIsIFwiY29kZVwiOiBcIlRSXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlR1cmttZW5pc3RhblwiLCBcImNvZGVcIjogXCJUTVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHNcIiwgXCJjb2RlXCI6IFwiVENcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiVHV2YWx1XCIsIFwiY29kZVwiOiBcIlRWXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlVnYW5kYVwiLCBcImNvZGVcIjogXCJVR1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJVa3JhaW5lXCIsIFwiY29kZVwiOiBcIlVBXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlVuaXRlZCBBcmFiIEVtaXJhdGVzXCIsIFwiY29kZVwiOiBcIkFFXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlVuaXRlZCBLaW5nZG9tXCIsIFwiY29kZVwiOiBcIkdCXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlVuaXRlZCBTdGF0ZXNcIiwgXCJjb2RlXCI6IFwiVVNcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzXCIsIFwiY29kZVwiOiBcIlVNXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlVydWd1YXlcIiwgXCJjb2RlXCI6IFwiVVlcIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiVXpiZWtpc3RhblwiLCBcImNvZGVcIjogXCJVWlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJWYW51YXR1XCIsIFwiY29kZVwiOiBcIlZVXCJ9LFxyXG4gICAgICAgICAgICAgICAge1wibmFtZVwiOiBcIlZlbmV6dWVsYVwiLCBcImNvZGVcIjogXCJWRVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJWaWV0IE5hbVwiLCBcImNvZGVcIjogXCJWTlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJWaXJnaW4gSXNsYW5kcywgQnJpdGlzaFwiLCBcImNvZGVcIjogXCJWR1wifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJWaXJnaW4gSXNsYW5kcywgVS5TLlwiLCBcImNvZGVcIjogXCJWSVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJXYWxsaXMgYW5kIEZ1dHVuYVwiLCBcImNvZGVcIjogXCJXRlwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJXZXN0ZXJuIFNhaGFyYVwiLCBcImNvZGVcIjogXCJFSFwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJZZW1lblwiLCBcImNvZGVcIjogXCJZRVwifSxcclxuICAgICAgICAgICAgICAgIHtcIm5hbWVcIjogXCJaYW1iaWFcIiwgXCJjb2RlXCI6IFwiWk1cIn0sXHJcbiAgICAgICAgICAgICAgICB7XCJuYW1lXCI6IFwiWmltYmFid2VcIiwgXCJjb2RlXCI6IFwiWldcIn1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICkuY29uc3RhbnQoJ1RpbWV6b25lcycsIFt7XCJuYW1lXCI6IFwiQWZyaWNhL0FiaWRqYW5cIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0FjY3JhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0FkZGlzX0FiYWJhXCIsIFwib2Zmc2V0XCI6IFwiKzAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFmcmljYS9BbGdpZXJzXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0FzbWFyYVwiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvQXNtZXJhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0JhbWFrb1wiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvQmFuZ3VpXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0Jhbmp1bFwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvQmlzc2F1XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0JsYW50eXJlXCIsIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFmcmljYS9CcmF6emF2aWxsZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFmcmljYS9CdWp1bWJ1cmFcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0NhaXJvXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0Nhc2FibGFuY2FcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0NldXRhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0NvbmFrcnlcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0Rha2FyXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0Rhcl9lc19TYWxhYW1cIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0RqaWJvdXRpXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0RvdWFsYVwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvRWxfQWFpdW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvRnJlZXRvd25cIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0dhYm9yb25lXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0hhcmFyZVwiLCBcIm9mZnNldFwiOiBcIiswMjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvSm9oYW5uZXNidXJnXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL0p1YmFcIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0thbXBhbGFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvS2hhcnRvdW1cIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0tpZ2FsaVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFmcmljYS9LaW5zaGFzYVwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvTGFnb3NcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvTGlicmV2aWxsZVwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvTG9tZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFmcmljYS9MdWFuZGFcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL0x1YnVtYmFzaGlcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvTHVzYWthXCIsIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFmcmljYS9NYWxhYm9cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvTWFwdXRvXCIsIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFmcmljYS9NYXNlcnVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvTWJhYmFuZVwiLCBcIm9mZnNldFwiOiBcIiswMjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvTW9nYWRpc2h1XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL01vbnJvdmlhXCIsIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFmcmljYS9OYWlyb2JpXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQWZyaWNhL05kamFtZW5hXCIsIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFmcmljYS9OaWFtZXlcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvTm91YWtjaG90dFwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvT3VhZ2Fkb3Vnb3VcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvUG9ydG8tTm92b1wiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBZnJpY2EvU2FvX1RvbWVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvVGltYnVrdHVcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL1RyaXBvbGlcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBZnJpY2EvVHVuaXNcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWNhL1dpbmRob2VrXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9BZGFrXCIsIFwib2Zmc2V0XCI6IFwiLTEwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQW5jaG9yYWdlXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA5OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9Bbmd1aWxsYVwiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0FudGlndWFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDQ6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0FyYWd1YWluYVwiLCBcIm9mZnNldFwiOiBcIi0wMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXNcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2FcIiwgXCJvZmZzZXRcIjogXCItMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9BcmdlbnRpbmEvQ29tb2RSaXZhZGF2aWFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0FyZ2VudGluYS9Db3Jkb2JhXCIsIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQXJnZW50aW5hL0p1anV5XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9BcmdlbnRpbmEvTGFfUmlvamFcIiwgXCJvZmZzZXRcIjogXCItMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9BcmdlbnRpbmEvTWVuZG96YVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQXJnZW50aW5hL1Jpb19HYWxsZWdvc1wiLCBcIm9mZnNldFwiOiBcIi0wMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0FyZ2VudGluYS9TYWx0YVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQXJnZW50aW5hL1Nhbl9KdWFuXCIsIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQXJnZW50aW5hL1Nhbl9MdWlzXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9BcmdlbnRpbmEvVHVjdW1hblwiLCBcIm9mZnNldFwiOiBcIi0wMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0FyZ2VudGluYS9Vc2h1YWlhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9BcnViYVwiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0FzdW5jaW9uXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9BdGlrb2thblwiLCBcIm9mZnNldFwiOiBcIi0wNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0F0a2FcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMTA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0JhaGlhXCIsIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQmFoaWFfQmFuZGVyYXNcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDY6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0JhcmJhZG9zXCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQmVsZW1cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0JlbGl6ZVwiLCBcIm9mZnNldFwiOiBcIi0wNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0JsYW5jLVNhYmxvblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQm9hX1Zpc3RhXCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQm9nb3RhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9Cb2lzZVwiLCBcIm9mZnNldFwiOiBcIi0wNzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0J1ZW5vc19BaXJlc1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQ2FtYnJpZGdlX0JheVwiLCBcIm9mZnNldFwiOiBcIi0wNzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0NhbXBvX0dyYW5kZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQ2FuY3VuXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQ2FyYWNhc1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDozMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQ2F0YW1hcmNhXCIsIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQ2F5ZW5uZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQ2F5bWFuXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQ2hpY2Fnb1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQ2hpaHVhaHVhXCIsIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvQ29yYWxfSGFyYm91clwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvQ29yZG9iYVwiLCBcIm9mZnNldFwiOiBcIi0wMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0Nvc3RhX1JpY2FcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDY6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0NyZXN0b25cIiwgXCJvZmZzZXRcIjogXCItMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9DdWlhYmFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0N1cmFjYW9cIiwgXCJvZmZzZXRcIjogXCItMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9EYW5tYXJrc2hhdm5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0Rhd3NvblwiLCBcIm9mZnNldFwiOiBcIi0wODowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0Rhd3Nvbl9DcmVla1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvRGVudmVyXCIsIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvRGV0cm9pdFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvRG9taW5pY2FcIiwgXCJvZmZzZXRcIjogXCItMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9FZG1vbnRvblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvRWlydW5lcGVcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9FbF9TYWx2YWRvclwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvRW5zZW5hZGFcIiwgXCJvZmZzZXRcIjogXCItMDg6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9Gb3J0X05lbHNvblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvRm9ydF9XYXluZVwiLCBcIm9mZnNldFwiOiBcIi0wNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0ZvcnRhbGV6YVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvR2xhY2VfQmF5XCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvR29kdGhhYlwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvR29vc2VfQmF5XCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvR3JhbmRfVHVya1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvR3JlbmFkYVwiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0d1YWRlbG91cGVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDQ6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0d1YXRlbWFsYVwiLCBcIm9mZnNldFwiOiBcIi0wNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0d1YXlhcXVpbFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvR3V5YW5hXCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvSGFsaWZheFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvSGF2YW5hXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvSGVybW9zaWxsb1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXNcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9JbmRpYW5hL0tub3hcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDY6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0luZGlhbmEvTWFyZW5nb1wiLCBcIm9mZnNldFwiOiBcIi0wNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0luZGlhbmEvUGV0ZXJzYnVyZ1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvSW5kaWFuYS9UZWxsX0NpdHlcIiwgXCJvZmZzZXRcIjogXCItMDY6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9JbmRpYW5hL1ZldmF5XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9JbmRpYW5hL1ZpbmNlbm5lc1wiLCBcIm9mZnNldFwiOiBcIi0wNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL0luZGlhbmEvV2luYW1hY1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvSW5kaWFuYXBvbGlzXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvSW51dmlrXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9JcWFsdWl0XCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvSmFtYWljYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvSnVqdXlcIiwgXCJvZmZzZXRcIjogXCItMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9KdW5lYXVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDk6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL0tlbnR1Y2t5L0xvdWlzdmlsbGVcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9LZW50dWNreS9Nb250aWNlbGxvXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9Lbm94X0lOXCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvS3JhbGVuZGlqa1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvTGFfUGF6XCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvTGltYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvTG9zX0FuZ2VsZXNcIiwgXCJvZmZzZXRcIjogXCItMDg6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9Mb3Vpc3ZpbGxlXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9Mb3dlcl9QcmluY2VzXCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvTWFjZWlvXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9NYW5hZ3VhXCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvTWFuYXVzXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9NYXJpZ290XCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvTWFydGluaXF1ZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvTWF0YW1vcm9zXCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvTWF6YXRsYW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDc6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL01lbmRvemFcIiwgXCJvZmZzZXRcIjogXCItMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9NZW5vbWluZWVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDY6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL01lcmlkYVwiLCBcIm9mZnNldFwiOiBcIi0wNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL01ldGxha2F0bGFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDk6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL01leGljb19DaXR5XCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvTWlxdWVsb25cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL01vbmN0b25cIiwgXCJvZmZzZXRcIjogXCItMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9Nb250ZXJyZXlcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDY6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL01vbnRldmlkZW9cIiwgXCJvZmZzZXRcIjogXCItMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9Nb250cmVhbFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvTW9udHNlcnJhdFwiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL05hc3NhdVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvTmV3X1lvcmtcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9OaXBpZ29uXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9Ob21lXCIsIFwib2Zmc2V0XCI6IFwiLTA5OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvTm9yb25oYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvTm9ydGhfRGFrb3RhL0JldWxhaFwiLCBcIm9mZnNldFwiOiBcIi0wNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXJcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDY6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL05vcnRoX0Rha290YS9OZXdfU2FsZW1cIiwgXCJvZmZzZXRcIjogXCItMDY6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9PamluYWdhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9QYW5hbWFcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9QYW5nbmlydHVuZ1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvUGFyYW1hcmlib1wiLCBcIm9mZnNldFwiOiBcIi0wMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1Bob2VuaXhcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDc6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1BvcnQtYXUtUHJpbmNlXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvUG9ydF9vZl9TcGFpblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvUG9ydG9fQWNyZVwiLCBcIm9mZnNldFwiOiBcIi0wNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1BvcnRvX1ZlbGhvXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9QdWVydG9fUmljb1wiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1JhaW55X1JpdmVyXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9SYW5raW5fSW5sZXRcIiwgXCJvZmZzZXRcIjogXCItMDY6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9SZWNpZmVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1JlZ2luYVwiLCBcIm9mZnNldFwiOiBcIi0wNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1Jlc29sdXRlXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9SaW9fQnJhbmNvXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvUm9zYXJpb1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvU2FudGFfSXNhYmVsXCIsIFwib2Zmc2V0XCI6IFwiLTA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvU2FudGFyZW1cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1NhbnRpYWdvXCIsIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvU2FudG9fRG9taW5nb1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvU2FvX1BhdWxvXCIsIFwib2Zmc2V0XCI6IFwiLTAyOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvU2NvcmVzYnlzdW5kXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAxOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9TaGlwcm9ja1wiLCBcIm9mZnNldFwiOiBcIi0wNzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1NpdGthXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA5OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW1lcmljYS9TdF9CYXJ0aGVsZW15XCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvU3RfSm9obnNcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MzBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1N0X0tpdHRzXCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvU3RfTHVjaWFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDQ6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1N0X1Rob21hc1wiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1N0X1ZpbmNlbnRcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDQ6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1N3aWZ0X0N1cnJlbnRcIiwgXCJvZmZzZXRcIjogXCItMDY6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9UZWd1Y2lnYWxwYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvVGh1bGVcIiwgXCJvZmZzZXRcIjogXCItMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9UaHVuZGVyX0JheVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvVGlqdWFuYVwiLCBcIm9mZnNldFwiOiBcIi0wODowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1Rvcm9udG9cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDU6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1RvcnRvbGFcIiwgXCJvZmZzZXRcIjogXCItMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW1lcmljYS9WYW5jb3V2ZXJcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDg6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1ZpcmdpblwiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBbWVyaWNhL1doaXRlaG9yc2VcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDg6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBbWVyaWNhL1dpbm5pcGVnXCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFtZXJpY2EvWWFrdXRhdFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wOTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFtZXJpY2EvWWVsbG93a25pZmVcIiwgXCJvZmZzZXRcIjogXCItMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW50YXJjdGljYS9DYXNleVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswODowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFudGFyY3RpY2EvRGF2aXNcIiwgXCJvZmZzZXRcIjogXCIrMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFudGFyY3RpY2EvTWFjcXVhcmllXCIsIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFudGFyY3RpY2EvTWF3c29uXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW50YXJjdGljYS9NY011cmRvXCIsIFwib2Zmc2V0XCI6IFwiKzEzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFudGFyY3RpY2EvUGFsbWVyXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQW50YXJjdGljYS9Sb3RoZXJhXCIsIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFudGFyY3RpY2EvU291dGhfUG9sZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFudGFyY3RpY2EvU3lvd2FcIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQW50YXJjdGljYS9Ucm9sbFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFudGFyY3RpY2EvVm9zdG9rXCIsIFwib2Zmc2V0XCI6IFwiKzA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFyY3RpYy9Mb25neWVhcmJ5ZW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL0FkZW5cIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL0FsbWF0eVwiLCBcIm9mZnNldFwiOiBcIiswNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0FtbWFuXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9BbmFkeXJcIiwgXCJvZmZzZXRcIjogXCIrMTI6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL0FxdGF1XCIsIFwib2Zmc2V0XCI6IFwiKzA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvQXF0b2JlXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9Bc2hnYWJhdFwiLCBcIm9mZnNldFwiOiBcIiswNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0FzaGtoYWJhZFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvQmFnaGRhZFwiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1wibmFtZVwiOiBcIkFzaWEvQmFocmFpblwiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0Jha3VcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDQ6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL0Jhbmdrb2tcIiwgXCJvZmZzZXRcIjogXCIrMDc6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL0Jhcm5hdWxcIiwgXCJvZmZzZXRcIjogXCIrMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9CZWlydXRcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL0Jpc2hrZWtcIiwgXCJvZmZzZXRcIjogXCIrMDY6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL0JydW5laVwiLCBcIm9mZnNldFwiOiBcIiswODowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0NhbGN1dHRhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA1OjMwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9DaGl0YVwiLCBcIm9mZnNldFwiOiBcIiswOTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0Nob2liYWxzYW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDg6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL0Nob25ncWluZ1wiLCBcIm9mZnNldFwiOiBcIiswODowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0NodW5na2luZ1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswODowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvQ29sb21ib1wiLCBcIm9mZnNldFwiOiBcIiswNTozMFwifSwge1wibmFtZVwiOiBcIkFzaWEvRGFjY2FcIiwgXCJvZmZzZXRcIjogXCIrMDY6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9EYW1hc2N1c1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvRGhha2FcIiwgXCJvZmZzZXRcIjogXCIrMDY6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL0RpbGlcIiwgXCJvZmZzZXRcIjogXCIrMDk6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9EdWJhaVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvRHVzaGFuYmVcIiwgXCJvZmZzZXRcIjogXCIrMDU6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL0dhemFcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9IYXJiaW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDg6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL0hlYnJvblwiLCBcIm9mZnNldFwiOiBcIiswMjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0hvX0NoaV9NaW5oXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA3OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9Ib25nX0tvbmdcIiwgXCJvZmZzZXRcIjogXCIrMDg6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL0hvdmRcIiwgXCJvZmZzZXRcIjogXCIrMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9Jcmt1dHNrXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9Jc3RhbmJ1bFwiLCBcIm9mZnNldFwiOiBcIiswMjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0pha2FydGFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDc6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL0pheWFwdXJhXCIsIFwib2Zmc2V0XCI6IFwiKzA5OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvSmVydXNhbGVtXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9LYWJ1bFwiLCBcIm9mZnNldFwiOiBcIiswNDozMFwifSwge1wibmFtZVwiOiBcIkFzaWEvS2FtY2hhdGthXCIsIFwib2Zmc2V0XCI6IFwiKzEyOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvS2FyYWNoaVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvS2FzaGdhclwiLCBcIm9mZnNldFwiOiBcIiswNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0thdGhtYW5kdVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNTo0NVwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvS2F0bWFuZHVcIiwgXCJvZmZzZXRcIjogXCIrMDU6NDVcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9LaGFuZHlnYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswOTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvS29sa2F0YVwiLCBcIm9mZnNldFwiOiBcIiswNTozMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL0tyYXNub3lhcnNrXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA3OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9LdWFsYV9MdW1wdXJcIiwgXCJvZmZzZXRcIjogXCIrMDg6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9LdWNoaW5nXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9LdXdhaXRcIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL01hY2FvXCIsIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvTWFjYXVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDg6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL01hZ2FkYW5cIiwgXCJvZmZzZXRcIjogXCIrMTA6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL01ha2Fzc2FyXCIsIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvTWFuaWxhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9NdXNjYXRcIiwgXCJvZmZzZXRcIjogXCIrMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9OaWNvc2lhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9Ob3Zva3V6bmV0c2tcIiwgXCJvZmZzZXRcIjogXCIrMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9Ob3Zvc2liaXJza1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvT21za1wiLCBcIm9mZnNldFwiOiBcIiswNjowMFwifSwge1wibmFtZVwiOiBcIkFzaWEvT3JhbFwiLCBcIm9mZnNldFwiOiBcIiswNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1Bobm9tX1BlbmhcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDc6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL1BvbnRpYW5ha1wiLCBcIm9mZnNldFwiOiBcIiswNzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1B5b25neWFuZ1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswODozMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvUWF0YXJcIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL1F5enlsb3JkYVwiLCBcIm9mZnNldFwiOiBcIiswNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1Jhbmdvb25cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDY6MzBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL1JpeWFkaFwiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1wibmFtZVwiOiBcIkFzaWEvU2FpZ29uXCIsIFwib2Zmc2V0XCI6IFwiKzA3OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvU2FraGFsaW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL1NhbWFya2FuZFwiLCBcIm9mZnNldFwiOiBcIiswNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1Nlb3VsXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA5OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9TaGFuZ2hhaVwiLCBcIm9mZnNldFwiOiBcIiswODowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1NpbmdhcG9yZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswODowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvU3JlZG5la29seW1za1wiLCBcIm9mZnNldFwiOiBcIisxMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1RhaXBlaVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswODowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvVGFzaGtlbnRcIiwgXCJvZmZzZXRcIjogXCIrMDU6MDBcIn0sIHtcIm5hbWVcIjogXCJBc2lhL1RiaWxpc2lcIiwgXCJvZmZzZXRcIjogXCIrMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9UZWhyYW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDM6MzBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL1RlbF9Bdml2XCIsIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJ9LCB7XCJuYW1lXCI6IFwiQXNpYS9UaGltYnVcIiwgXCJvZmZzZXRcIjogXCIrMDY6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXNpYS9UaGltcGh1XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA2OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9Ub2t5b1wiLCBcIm9mZnNldFwiOiBcIiswOTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1VqdW5nX1BhbmRhbmdcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDg6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL1VsYWFuYmFhdGFyXCIsIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvVWxhbl9CYXRvclwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswODowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvVXJ1bXFpXCIsIFwib2Zmc2V0XCI6IFwiKzA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvVXN0LU5lcmFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBc2lhL1ZpZW50aWFuZVwiLCBcIm9mZnNldFwiOiBcIiswNzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBc2lhL1ZsYWRpdm9zdG9rXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXNpYS9ZYWt1dHNrXCIsIFwib2Zmc2V0XCI6IFwiKzA5OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkFzaWEvWWVrYXRlcmluYnVyZ1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkFzaWEvWWVyZXZhblwiLCBcIm9mZnNldFwiOiBcIiswNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBdGxhbnRpYy9Bem9yZXNcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBdGxhbnRpYy9CZXJtdWRhXCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkF0bGFudGljL0NhbmFyeVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkF0bGFudGljL0NhcGVfVmVyZGVcIiwgXCJvZmZzZXRcIjogXCItMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXRsYW50aWMvRmFlcm9lXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXRsYW50aWMvRmFyb2VcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXRsYW50aWMvSmFuX01heWVuXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXRsYW50aWMvTWFkZWlyYVwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBdGxhbnRpYy9SZXlramF2aWtcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBdGxhbnRpYy9Tb3V0aF9HZW9yZ2lhXCIsIFwib2Zmc2V0XCI6IFwiLTAyOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkF0bGFudGljL1N0X0hlbGVuYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkF0bGFudGljL1N0YW5sZXlcIiwgXCJvZmZzZXRcIjogXCItMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXVzdHJhbGlhL0FDVFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkF1c3RyYWxpYS9BZGVsYWlkZVwiLCBcIm9mZnNldFwiOiBcIisxMDozMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBdXN0cmFsaWEvQnJpc2JhbmVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBdXN0cmFsaWEvQnJva2VuX0hpbGxcIiwgXCJvZmZzZXRcIjogXCIrMTA6MzBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXVzdHJhbGlhL0NhbmJlcnJhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXVzdHJhbGlhL0N1cnJpZVwiLCBcIm9mZnNldFwiOiBcIisxMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJBdXN0cmFsaWEvRGFyd2luXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA5OjMwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXVzdHJhbGlhL0V1Y2xhXCIsIFwib2Zmc2V0XCI6IFwiKzA4OjQ1XCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkF1c3RyYWxpYS9Ib2JhcnRcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBdXN0cmFsaWEvTEhJXCIsIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkF1c3RyYWxpYS9MaW5kZW1hblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkF1c3RyYWxpYS9Mb3JkX0hvd2VcIiwgXCJvZmZzZXRcIjogXCIrMTE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXVzdHJhbGlhL01lbGJvdXJuZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkF1c3RyYWxpYS9OU1dcIiwgXCJvZmZzZXRcIjogXCIrMTE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXVzdHJhbGlhL05vcnRoXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA5OjMwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXVzdHJhbGlhL1BlcnRoXCIsIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkF1c3RyYWxpYS9RdWVlbnNsYW5kXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXVzdHJhbGlhL1NvdXRoXCIsIFwib2Zmc2V0XCI6IFwiKzEwOjMwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkF1c3RyYWxpYS9TeWRuZXlcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJBdXN0cmFsaWEvVGFzbWFuaWFcIiwgXCJvZmZzZXRcIjogXCIrMTE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXVzdHJhbGlhL1ZpY3RvcmlhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQXVzdHJhbGlhL1dlc3RcIiwgXCJvZmZzZXRcIjogXCIrMDg6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiQXVzdHJhbGlhL1lhbmNvd2lubmFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTA6MzBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJCcmF6aWwvQWNyZVwiLCBcIm9mZnNldFwiOiBcIi0wNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJCcmF6aWwvRGVOb3JvbmhhXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQnJhemlsL0Vhc3RcIiwgXCJvZmZzZXRcIjogXCItMDI6MDBcIn0sIHtcIm5hbWVcIjogXCJCcmF6aWwvV2VzdFwiLCBcIm9mZnNldFwiOiBcIi0wNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJDRVRcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJDU1Q2Q0RUXCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XCJuYW1lXCI6IFwiQ2FuYWRhL0F0bGFudGljXCIsIFwib2Zmc2V0XCI6IFwiLTA0OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhbmFkYS9DZW50cmFsXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQ2FuYWRhL0Vhc3QtU2Fza2F0Y2hld2FuXCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhbmFkYS9FYXN0ZXJuXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQ2FuYWRhL01vdW50YWluXCIsIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhbmFkYS9OZXdmb3VuZGxhbmRcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MzBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJDYW5hZGEvUGFjaWZpY1wiLCBcIm9mZnNldFwiOiBcIi0wODowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJDYW5hZGEvU2Fza2F0Y2hld2FuXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQ2FuYWRhL1l1a29uXCIsIFwib2Zmc2V0XCI6IFwiLTA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNoaWxlL0NvbnRpbmVudGFsXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiQ2hpbGUvRWFzdGVySXNsYW5kXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XCJuYW1lXCI6IFwiQ3ViYVwiLCBcIm9mZnNldFwiOiBcIi0wNTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFRVRcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFU1RcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcIm5hbWVcIjogXCJFU1Q1RURUXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkVneXB0XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRWlyZVwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1wibmFtZVwiOiBcIkV0Yy9HTVRcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXRjL0dNVCswXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVCsxXCIsIFwib2Zmc2V0XCI6IFwiLTAxOjAwXCJ9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVCsxMFwiLCBcIm9mZnNldFwiOiBcIi0xMDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdGMvR01UKzExXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTExOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVCsxMlwiLCBcIm9mZnNldFwiOiBcIi0xMjowMFwifSwge1wibmFtZVwiOiBcIkV0Yy9HTVQrMlwiLCBcIm9mZnNldFwiOiBcIi0wMjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdGMvR01UKzNcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdGMvR01UKzRcIiwgXCJvZmZzZXRcIjogXCItMDQ6MDBcIn0sIHtcIm5hbWVcIjogXCJFdGMvR01UKzVcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXRjL0dNVCs2XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVCs3XCIsIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJ9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVCs4XCIsIFwib2Zmc2V0XCI6IFwiLTA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV0Yy9HTVQrOVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wOTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV0Yy9HTVQtMFwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1wibmFtZVwiOiBcIkV0Yy9HTVQtMVwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdGMvR01ULTEwXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVC0xMVwiLCBcIm9mZnNldFwiOiBcIisxMTowMFwifSwge1wibmFtZVwiOiBcIkV0Yy9HTVQtMTJcIiwgXCJvZmZzZXRcIjogXCIrMTI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXRjL0dNVC0xM1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV0Yy9HTVQtMTRcIiwgXCJvZmZzZXRcIjogXCIrMTQ6MDBcIn0sIHtcIm5hbWVcIjogXCJFdGMvR01ULTJcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXRjL0dNVC0zXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVC00XCIsIFwib2Zmc2V0XCI6IFwiKzA0OjAwXCJ9LCB7XCJuYW1lXCI6IFwiRXRjL0dNVC01XCIsIFwib2Zmc2V0XCI6IFwiKzA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV0Yy9HTVQtNlwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV0Yy9HTVQtN1wiLCBcIm9mZnNldFwiOiBcIiswNzowMFwifSwge1wibmFtZVwiOiBcIkV0Yy9HTVQtOFwiLCBcIm9mZnNldFwiOiBcIiswODowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdGMvR01ULTlcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDk6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdGMvR01UMFwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1wibmFtZVwiOiBcIkV0Yy9HcmVlbndpY2hcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXRjL1VDVFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV0Yy9VVENcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcIm5hbWVcIjogXCJFdGMvVW5pdmVyc2FsXCIsIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV0Yy9adWx1XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXVyb3BlL0Ftc3RlcmRhbVwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdXJvcGUvQW5kb3JyYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9Bc3RyYWtoYW5cIiwgXCJvZmZzZXRcIjogXCIrMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0F0aGVuc1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9CZWxmYXN0XCIsIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9CZWxncmFkZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9CZXJsaW5cIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0JyYXRpc2xhdmFcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvQnJ1c3NlbHNcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0J1Y2hhcmVzdFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9CdWRhcGVzdFwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdXJvcGUvQnVzaW5nZW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvQ2hpc2luYXVcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0NvcGVuaGFnZW5cIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvRHVibGluXCIsIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9HaWJyYWx0YXJcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvR3Vlcm5zZXlcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0hlbHNpbmtpXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXVyb3BlL0lzbGVfb2ZfTWFuXCIsIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9Jc3RhbmJ1bFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9KZXJzZXlcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0thbGluaW5ncmFkXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXVyb3BlL0tpZXZcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0xpc2JvblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9ManVibGphbmFcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL0xvbmRvblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9MdXhlbWJvdXJnXCIsIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9NYWRyaWRcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvTWFsdGFcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL01hcmllaGFtblwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9NaW5za1wiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdXJvcGUvTW9uYWNvXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXVyb3BlL01vc2Nvd1wiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdXJvcGUvTmljb3NpYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9Pc2xvXCIsIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9QYXJpc1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9Qb2Rnb3JpY2FcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL1ByYWd1ZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9SaWdhXCIsIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJ9LCB7XCJuYW1lXCI6IFwiRXVyb3BlL1JvbWVcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL1NhbWFyYVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9TYW5fTWFyaW5vXCIsIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9TYXJhamV2b1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9TaW1mZXJvcG9sXCIsIFwib2Zmc2V0XCI6IFwiKzAzOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9Ta29wamVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvU29maWFcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL1N0b2NraG9sbVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9UYWxsaW5uXCIsIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkV1cm9wZS9UaXJhbmVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvVGlyYXNwb2xcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL1VseWFub3Zza1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9Vemhnb3JvZFwiLCBcIm9mZnNldFwiOiBcIiswMjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdXJvcGUvVmFkdXpcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDE6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJFdXJvcGUvVmF0aWNhblwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJFdXJvcGUvVmllbm5hXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAxOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiRXVyb3BlL1ZpbG5pdXNcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL1ZvbGdvZ3JhZFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9XYXJzYXdcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiRXVyb3BlL1phZ3JlYlwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkV1cm9wZS9aYXBvcm96aHllXCIsIFwib2Zmc2V0XCI6IFwiKzAyOjAwXCJ9LCB7XCJuYW1lXCI6IFwiRXVyb3BlL1p1cmljaFwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJHQlwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkdCLUVpcmVcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcIm5hbWVcIjogXCJHTVRcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiR01UKzBcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJHTVQtMFwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1wibmFtZVwiOiBcIkdNVDBcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiR3JlZW53aWNoXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiSFNUXCIsIFwib2Zmc2V0XCI6IFwiLTEwOjAwXCJ9LCB7XCJuYW1lXCI6IFwiSG9uZ2tvbmdcIiwgXCJvZmZzZXRcIjogXCIrMDg6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiSWNlbGFuZFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkluZGlhbi9BbnRhbmFuYXJpdm9cIiwgXCJvZmZzZXRcIjogXCIrMDM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiSW5kaWFuL0NoYWdvc1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswNjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkluZGlhbi9DaHJpc3RtYXNcIiwgXCJvZmZzZXRcIjogXCIrMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiSW5kaWFuL0NvY29zXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA2OjMwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiSW5kaWFuL0NvbW9yb1wiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJJbmRpYW4vS2VyZ3VlbGVuXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiSW5kaWFuL01haGVcIiwgXCJvZmZzZXRcIjogXCIrMDQ6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiSW5kaWFuL01hbGRpdmVzXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiSW5kaWFuL01hdXJpdGl1c1wiLCBcIm9mZnNldFwiOiBcIiswNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJJbmRpYW4vTWF5b3R0ZVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIkluZGlhbi9SZXVuaW9uXCIsIFwib2Zmc2V0XCI6IFwiKzA0OjAwXCJ9LCB7XCJuYW1lXCI6IFwiSXJhblwiLCBcIm9mZnNldFwiOiBcIiswMzozMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJJc3JhZWxcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJKYW1haWNhXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XCJuYW1lXCI6IFwiSmFwYW5cIiwgXCJvZmZzZXRcIjogXCIrMDk6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiS3dhamFsZWluXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiTGlieWFcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcIm5hbWVcIjogXCJNRVRcIiwgXCJvZmZzZXRcIjogXCIrMDE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiTVNUXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiTVNUN01EVFwiLCBcIm9mZnNldFwiOiBcIi0wNzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJNZXhpY28vQmFqYU5vcnRlXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA4OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiTWV4aWNvL0JhamFTdXJcIiwgXCJvZmZzZXRcIjogXCItMDc6MDBcIn0sIHtcIm5hbWVcIjogXCJNZXhpY28vR2VuZXJhbFwiLCBcIm9mZnNldFwiOiBcIi0wNjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJOWlwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMzowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIk5aLUNIQVRcIiwgXCJvZmZzZXRcIjogXCIrMTM6NDVcIn0sIHtcIm5hbWVcIjogXCJOYXZham9cIiwgXCJvZmZzZXRcIjogXCItMDc6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUFJDXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzA4OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUFNUOFBEVFwiLCBcIm9mZnNldFwiOiBcIi0wODowMFwifSwge1wibmFtZVwiOiBcIlBhY2lmaWMvQXBpYVwiLCBcIm9mZnNldFwiOiBcIisxNDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL0F1Y2tsYW5kXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9Cb3VnYWludmlsbGVcIiwgXCJvZmZzZXRcIjogXCIrMTE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUGFjaWZpYy9DaGF0aGFtXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEzOjQ1XCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9DaHV1a1wiLCBcIm9mZnNldFwiOiBcIisxMDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL0Vhc3RlclwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIlBhY2lmaWMvRWZhdGVcIiwgXCJvZmZzZXRcIjogXCIrMTE6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUGFjaWZpYy9FbmRlcmJ1cnlcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTM6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJQYWNpZmljL0Zha2FvZm9cIiwgXCJvZmZzZXRcIjogXCIrMTM6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUGFjaWZpYy9GaWppXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEzOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9GdW5hZnV0aVwiLCBcIm9mZnNldFwiOiBcIisxMjowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL0dhbGFwYWdvc1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0wNjowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIlBhY2lmaWMvR2FtYmllclwiLCBcIm9mZnNldFwiOiBcIi0wOTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL0d1YWRhbGNhbmFsXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9HdWFtXCIsIFwib2Zmc2V0XCI6IFwiKzEwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBhY2lmaWMvSG9ub2x1bHVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMTA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJQYWNpZmljL0pvaG5zdG9uXCIsIFwib2Zmc2V0XCI6IFwiLTEwOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBhY2lmaWMvS2lyaXRpbWF0aVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxNDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIlBhY2lmaWMvS29zcmFlXCIsIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBhY2lmaWMvS3dhamFsZWluXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9NYWp1cm9cIiwgXCJvZmZzZXRcIjogXCIrMTI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUGFjaWZpYy9NYXJxdWVzYXNcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDk6MzBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJQYWNpZmljL01pZHdheVwiLCBcIm9mZnNldFwiOiBcIi0xMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL05hdXJ1XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzEyOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9OaXVlXCIsIFwib2Zmc2V0XCI6IFwiLTExOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBhY2lmaWMvTm9yZm9sa1wiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIisxMTowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIlBhY2lmaWMvTm91bWVhXCIsIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBhY2lmaWMvUGFnb19QYWdvXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTExOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9QYWxhdVwiLCBcIm9mZnNldFwiOiBcIiswOTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL1BpdGNhaXJuXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA4OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9Qb2hucGVpXCIsIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlBhY2lmaWMvUG9uYXBlXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzExOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9Qb3J0X01vcmVzYnlcIiwgXCJvZmZzZXRcIjogXCIrMTA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUGFjaWZpYy9SYXJvdG9uZ2FcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMTA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJQYWNpZmljL1NhaXBhblwiLCBcIm9mZnNldFwiOiBcIisxMDowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL1NhbW9hXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTExOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiUGFjaWZpYy9UYWhpdGlcIiwgXCJvZmZzZXRcIjogXCItMTA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUGFjaWZpYy9UYXJhd2FcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJQYWNpZmljL1RvbmdhdGFwdVwiLCBcIm9mZnNldFwiOiBcIisxMzowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQYWNpZmljL1RydWtcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTA6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJQYWNpZmljL1dha2VcIiwgXCJvZmZzZXRcIjogXCIrMTI6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiUGFjaWZpYy9XYWxsaXNcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMTI6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJQYWNpZmljL1lhcFwiLCBcIm9mZnNldFwiOiBcIisxMDowMFwifSwge1wibmFtZVwiOiBcIlBvbGFuZFwiLCBcIm9mZnNldFwiOiBcIiswMTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJQb3J0dWdhbFwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIiswMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIlJPQ1wiLCBcIm9mZnNldFwiOiBcIiswODowMFwifSwge1wibmFtZVwiOiBcIlJPS1wiLCBcIm9mZnNldFwiOiBcIiswOTowMFwifSwge1xyXG4gICAgICAgICAgICBcIm5hbWVcIjogXCJTaW5nYXBvcmVcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCIrMDg6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJUdXJrZXlcIiwgXCJvZmZzZXRcIjogXCIrMDI6MDBcIn0sIHtcIm5hbWVcIjogXCJVQ1RcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVVMvQWxhc2thXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA5OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiVVMvQWxldXRpYW5cIiwgXCJvZmZzZXRcIjogXCItMTA6MDBcIn0sIHtcIm5hbWVcIjogXCJVUy9Bcml6b25hXCIsIFwib2Zmc2V0XCI6IFwiLTA3OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlVTL0NlbnRyYWxcIixcclxuICAgICAgICAgICAgXCJvZmZzZXRcIjogXCItMDY6MDBcIlxyXG4gICAgICAgIH0sIHtcIm5hbWVcIjogXCJVUy9FYXN0LUluZGlhbmFcIiwgXCJvZmZzZXRcIjogXCItMDU6MDBcIn0sIHtcIm5hbWVcIjogXCJVUy9FYXN0ZXJuXCIsIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlVTL0hhd2FpaVwiLFxyXG4gICAgICAgICAgICBcIm9mZnNldFwiOiBcIi0xMDowMFwiXHJcbiAgICAgICAgfSwge1wibmFtZVwiOiBcIlVTL0luZGlhbmEtU3RhcmtlXCIsIFwib2Zmc2V0XCI6IFwiLTA2OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlVTL01pY2hpZ2FuXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA1OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiVVMvTW91bnRhaW5cIiwgXCJvZmZzZXRcIjogXCItMDc6MDBcIn0sIHtcIm5hbWVcIjogXCJVUy9QYWNpZmljXCIsIFwib2Zmc2V0XCI6IFwiLTA4OjAwXCJ9LCB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlVTL1BhY2lmaWMtTmV3XCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiLTA4OjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiVVMvU2Ftb2FcIiwgXCJvZmZzZXRcIjogXCItMTE6MDBcIn0sIHtcIm5hbWVcIjogXCJVVENcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn0sIHtcclxuICAgICAgICAgICAgXCJuYW1lXCI6IFwiVW5pdmVyc2FsXCIsXHJcbiAgICAgICAgICAgIFwib2Zmc2V0XCI6IFwiKzAwOjAwXCJcclxuICAgICAgICB9LCB7XCJuYW1lXCI6IFwiVy1TVVwiLCBcIm9mZnNldFwiOiBcIiswMzowMFwifSwge1wibmFtZVwiOiBcIldFVFwiLCBcIm9mZnNldFwiOiBcIiswMDowMFwifSwge1wibmFtZVwiOiBcIlp1bHVcIiwgXCJvZmZzZXRcIjogXCIrMDA6MDBcIn1dXHJcbiAgICApXHJcblxyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMzEuMDUuMjAxNi5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuYW5ndWxhci5tb2R1bGUoJ3RlbGVkcy5ibG9ja3MnKVxyXG4gICAgLnNlcnZpY2UoJ1Bob25lJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBwaG9uZVV0aWxzO1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoJ3Bob25lJywgW1wiUGhvbmVcIiwgZnVuY3Rpb24gKFBob25lKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwaG9uZU51bWJlciwgZmlsdGVyLCByZWdpb25Db2RlKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdnZXRSZWdpb25Db2RlRm9yTnVtYmVyJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGhvbmUuZ2V0UmVnaW9uQ29kZUZvck51bWJlcihwaG9uZU51bWJlciwgcmVnaW9uQ29kZSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdnZXROdW1iZXJUeXBlJzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGhvbmUuZ2V0TnVtYmVyVHlwZShwaG9uZU51bWJlciwgcmVnaW9uQ29kZSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdmb3JtYXRFMTY0JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGhvbmUuZm9ybWF0RTE2NChwaG9uZU51bWJlciwgcmVnaW9uQ29kZSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdmb3JtYXROYXRpb25hbCc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBob25lLmZvcm1hdE5hdGlvbmFsKHBob25lTnVtYmVyLCByZWdpb25Db2RlKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zvcm1hdEludGVybmF0aW9uYWwnOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5mb3JtYXRJbnRlcm5hdGlvbmFsKHBob25lTnVtYmVyLCByZWdpb25Db2RlKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zvcm1hdEluT3JpZ2luYWxGb3JtYXQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5mb3JtYXRJbk9yaWdpbmFsRm9ybWF0KHBob25lTnVtYmVyLCByZWdpb25Db2RlKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zvcm1hdE91dE9mQ291bnRyeUNhbGxpbmdOdW1iZXInOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5mb3JtYXRPdXRPZkNvdW50cnlDYWxsaW5nTnVtYmVyKHBob25lTnVtYmVyLCByZWdpb25Db2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XSk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTEuMDUuMjAxNi5cclxuICovXHJcbmFuZ3VsYXIubW9kdWxlKCd0ZWxlZHMuYmxvY2tzJykuZmlsdGVyKCdjb252ZXJ0VG9CaW5hcnlTaXplJywgZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwpIHtcclxuICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbCA+IDcwMDAwMDAwMClcclxuICAgICAgICAgICAgcmV0dXJuICh2YWwgLyAxMDczNzQxODI0KS50b0ZpeGVkKDApICsgXCIgR2JcIjtcclxuICAgICAgICBpZiAodmFsID4gNzAwMDAwKVxyXG4gICAgICAgICAgICByZXR1cm4gKHZhbCAvIDEwNDg1NzYpLnRvRml4ZWQoMCkgKyBcIiBNYlwiO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbCA+IDcwMClcclxuICAgICAgICAgICAgcmV0dXJuICh2YWwgLyAxMDI0KS50b0ZpeGVkKDApICsgXCIgS2JcIjtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiB2YWwgKyBcIiBiXCI7XHJcbiAgICB9O1xyXG59KS5maWx0ZXIoJ2NvbnZlcnRGcm9tS0JUb0JpbmFyeVNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsID4gNzAwMDAwMDApXHJcbiAgICAgICAgICAgIHJldHVybiAodmFsIC8gMTAwMDAwMCkudG9GaXhlZCgwKSArIFwiIEdiXCI7XHJcbiAgICAgICAgaWYgKHZhbCA+IDcwMDAwKVxyXG4gICAgICAgICAgICByZXR1cm4gKHZhbCAvIDEwMDApLnRvRml4ZWQoMCkgKyBcIiBNYlwiO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuICh2YWwgKS50b0ZpeGVkKDApICsgXCIgS2JcIjtcclxuICAgIH07XHJcbn0pLmZpbHRlcignbWlsbFNlY29uZHNUb1RpbWVTdHJpbmcnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1pbGxzZWNvbmRzKSB7XHJcbiAgICAgICAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKCBtaWxsc2Vjb25kcyAvIDEwMDApO1xyXG5cclxuICAgICAgICB2YXIgc2VjID0gTWF0aC5mbG9vcigobWlsbHNlY29uZHMgJSA2MDAwMCkgLyAxMDAwKTtcclxuICAgICAgICB2YXIgZGF5cyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDM2MDApO1xyXG4gICAgICAgIHZhciBob3VycyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSA4NjQwMCkgLyAzNjAwKTtcclxuICAgICAgICB2YXIgbWludXRlcyA9ICBNYXRoLmZsb29yKCgoc2Vjb25kcyAlIDg2NDAwKSAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgIHZhciB0aW1lU3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKGRheXMgPiAwKSB0aW1lU3RyaW5nICs9IChkYXlzID4gMSkgPyAoZGF5cyArIFwiINC00L3QtdC5IFwiKSA6IChkYXlzICsgXCIg0LTQtdC90YwgXCIpO1xyXG4gICAgICAgIGlmIChob3VycyA+IDApIHRpbWVTdHJpbmcgKz0gKGhvdXJzID4gMSkgPyAoaG91cnMgKyBcIiDRh9Cw0YHQsCBcIikgOiAoaG91cnMgKyBcIiDRh9Cw0YEgXCIpO1xyXG4gICAgICAgIGlmIChtaW51dGVzID4gMCkgdGltZVN0cmluZyArPSAobWludXRlcyAhPSAxKSA/IChtaW51dGVzID09IDIgfHwgbWludXRlcyA9PSAzIHx8IG1pbnV0ZXMgPT0gNCkgPyAobWludXRlcyArIFwiINC80LjQvdGD0YLRiyBcIikgOiAobWludXRlcyArIFwiINC80LjQvdGD0YIgXCIpIDogKG1pbnV0ZXMgKyBcIiDQvNC40L3Rg9GC0LAgXCIpO1xyXG4gICAgICAgIGlmIChzZWMgPj0gMCkgdGltZVN0cmluZyArPSAoc2VjICE9IDEpID8gKHNlYyA9PSAyIHx8IHNlYyA9PSAzIHx8IHNlYyA9PSA0KSA/IChzZWMgKyBcIiDRgdC10LrRg9C90LTRiyBcIikgOiAoc2VjICsgXCIg0YHQtdC60YPQvdC0IFwiKSA6IChzZWMgKyBcIiDRgdC10LrRg9C90LTQsCBcIik7XHJcbiAgICAgICAgcmV0dXJuIHRpbWVTdHJpbmc7XHJcbiAgICB9XHJcbn0pLmZpbHRlcignc2Vjb25kc1RvVGltZVN0cmluZycsIGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoc2Vjb25kcykge1xyXG4gICAgICAgIHZhciBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApO1xyXG4gICAgICAgIHZhciBob3VycyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSA4NjQwMCkgLyAzNjAwKTtcclxuICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IoKChzZWNvbmRzICUgODY0MDApICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgdmFyIHNlYyA9IE1hdGguZmxvb3IoKChzZWNvbmRzICUgODY0MDApICUgMzYwMCkgJSA2MCk7XHJcbiAgICAgICAgdmFyIHRpbWVTdHJpbmcgPSAnJztcclxuICAgICAgICBpZiAoZGF5cyA+IDApIHRpbWVTdHJpbmcgKz0gKGRheXMgPiAxKSA/IChkYXlzICsgXCIg0LTQvdC10LkgXCIpIDogKGRheXMgKyBcIiDQtNC10L3RjCBcIik7XHJcbiAgICAgICAgaWYgKGhvdXJzID4gMCkgdGltZVN0cmluZyArPSAoaG91cnMgPiAxKSA/IChob3VycyArIFwiINGH0LDRgdCwIFwiKSA6IChob3VycyArIFwiINGH0LDRgSBcIik7XHJcbiAgICAgICAgaWYgKG1pbnV0ZXMgPiAwKSB0aW1lU3RyaW5nICs9IChtaW51dGVzICE9IDEpID8gKG1pbnV0ZXMgPT0gMiB8fCBtaW51dGVzID09IDMgfHwgbWludXRlcyA9PSA0KSA/IChtaW51dGVzICsgXCIg0LzQuNC90YPRgtGLIFwiKSA6IChtaW51dGVzICsgXCIg0LzQuNC90YPRgiBcIikgOiAobWludXRlcyArIFwiINC80LjQvdGD0YLQsCBcIik7XHJcbiAgICAgICAgaWYgKHNlYyA+PSAwKSB0aW1lU3RyaW5nICs9IChzZWMgIT0gMSkgPyAoc2VjID09IDIgfHwgc2VjID09IDMgfHwgc2VjID09IDQpID8gKHNlYyArIFwiINGB0LXQutGD0L3QtNGLIFwiKSA6IChzZWMgKyBcIiDRgdC10LrRg9C90LQgXCIpIDogKHNlYyArIFwiINGB0LXQutGD0L3QtNCwIFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRpbWVTdHJpbmc7XHJcbiAgICB9XHJcbn0pLmZpbHRlcignc2Vjb25kc1RvU3RyaW5nJywgZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzZWMpIHtcclxuICAgICAgICByZXR1cm4gKHNlYyAhPSAxKSA/IChzZWMgPT0gMiB8fCBzZWMgPT0gMyB8fCBzZWMgPT0gNCkgPyAoXCJjb21tb24uU2Vjb25kczFcIikgOiAoXCJjb21tb24uU2Vjb25kMlwiKSA6IChcImNvbW1vbi5TZWNvbmQzXCIpO1xyXG5cclxuICAgIH1cclxufSkuZmlsdGVyKCdmb3JtYXRUZXh0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbnB1dCkge1xyXG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBpbnB1dDtcclxuICAgICAgICB2YXIgb3V0cHV0ID0gaW5wdXRcclxuICAgICAgICAvL3JlcGxhY2UgcG9zc2libGUgbGluZSBicmVha3MuXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxyXFxufFxccnxcXG4pL2csICc8YnIvPicpXHJcbiAgICAgICAgICAgIC8vcmVwbGFjZSB0YWJzXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHQvZywgJyZuYnNwOyZuYnNwOyZuYnNwOycpXHJcbiAgICAgICAgICAgIC8vcmVwbGFjZSBzcGFjZXMuXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8gL2csICcmbmJzcDsnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH07XHJcbn0pOyIsIlxyXG5mb3JtYXRUb1Nob3J0RGF0ZS4kaW5qZWN0ID0gW1wiJGZpbHRlclwiXTthbmd1bGFyLm1vZHVsZSgndGVsZWRzLmJsb2NrcycpLmZpbHRlcignc3RhbmRhcmREYXRlJywgZm9ybWF0VG9TdGFuZGFydERhdGUpO1xyXG5mb3JtYXRUb1N0YW5kYXJ0RGF0ZS4kaW5qZWN0ID0gWyckZmlsdGVyJ107XHJcbmZ1bmN0aW9uIGZvcm1hdFRvU3RhbmRhcnREYXRlKCRmaWx0ZXIpIHtcclxuICAgIC8vIENyZWF0ZSB0aGUgcmV0dXJuIGZ1bmN0aW9uIGFuZCBzZXQgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciBuYW1lIHRvICoqaW5wdXQqKlxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRlKSB7XHJcbiAgICAgICAgdmFyIG91dERhdGUgPSAkZmlsdGVyKCdhbURhdGVGb3JtYXQnKSgkZmlsdGVyKCdhbUxvY2FsJykoJGZpbHRlcignYW1VdGMnKShkYXRlKSksICdERC5NTS5ZWVlZIEhIOm1tOnNzJyk7XHJcbiAgICAgICAgcmV0dXJuIG91dERhdGU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5hbmd1bGFyLm1vZHVsZSgndGVsZWRzLmJsb2NrcycpLmZpbHRlcignc2hvcnREYXRlJywgZm9ybWF0VG9TaG9ydERhdGUpO1xyXG5mdW5jdGlvbiBmb3JtYXRUb1Nob3J0RGF0ZSgkZmlsdGVyKSB7XHJcbiAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUpIHtcclxuICAgICAgICB2YXIgb3V0RGF0ZSA9ICRmaWx0ZXIoJ2FtRGF0ZUZvcm1hdCcpKCRmaWx0ZXIoJ2FtTG9jYWwnKSgkZmlsdGVyKCdhbVV0YycpKGRhdGUpKSwgJ0RELk1NLllZWVknKTtcclxuICAgICAgICByZXR1cm4gb3V0RGF0ZTtcclxuICAgIH1cclxufTtcclxuYW5ndWxhci5tb2R1bGUoJ3RlbGVkcy5ibG9ja3MnKS5maWx0ZXIoJ2R1cmF0aW9uTWluJywgZHVyYXRpb25NaW4pO1xyXG5cclxuZnVuY3Rpb24gZHVyYXRpb25NaW4oKSB7XHJcbiAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1zKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKCggKG1zIC8gMTAwMCkgJSA4NjQwMCkgJSAzNjAwKSAvIDYwKTtcclxuICAgIH1cclxufTtcclxuYW5ndWxhci5tb2R1bGUoJ3RlbGVkcy5ibG9ja3MnKS5maWx0ZXIoJ2R1cmF0aW9uU2VjJywgZHVyYXRpb25TZWMpO1xyXG5cclxuZnVuY3Rpb24gZHVyYXRpb25TZWMoKSB7XHJcbiAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1zKSB7XHJcbiAgICAgICAgcmV0dXJuICBNYXRoLmZsb29yKChtcyAlIDYwMDAwKSAvIDEwMDApO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbmFuZ3VsYXIubW9kdWxlKCd0ZWxlZHMuYmxvY2tzJykuZmlsdGVyKCdkdXJhdGlvbk1pbkZyb21TZWMnLCBkdXJhdGlvbk1pbkZyb21TZWMpO1xyXG5cclxuZnVuY3Rpb24gZHVyYXRpb25NaW5Gcm9tU2VjKCkge1xyXG4gICAgXCJuZ0luamVjdFwiO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtcykge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKCgoIChtcykgJSA4NjQwMCkgJSAzNjAwKSAvIDYwKTtcclxuICAgIH1cclxufTtcclxuYW5ndWxhci5tb2R1bGUoJ3RlbGVkcy5ibG9ja3MnKS5maWx0ZXIoJ2R1cmF0aW9uU2VjRnJvbVNlYycsIGR1cmF0aW9uU2VjRnJvbVNlYyk7XHJcblxyXG5mdW5jdGlvbiBkdXJhdGlvblNlY0Zyb21TZWMoKSB7XHJcbiAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1zKSB7XHJcbiAgICAgICAgcmV0dXJuICBNYXRoLmZsb29yKCgobXMqMTAwMCkgJSA2MDAwMCkgLyAxMDAwKTtcclxuICAgIH1cclxufTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdhcmVhc1N0eWxlSGVscGVyJywgc2VydmljZSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBnZXRTdHlsZTogZ2V0U3R5bGUsXHJcbiAgICAgICAgICAgIGdldFN0eWxlRm9yRGlzcGxheUN1cnJlbnQ6IGdldFN0eWxlRm9yRGlzcGxheUN1cnJlbnQsXHJcbiAgICAgICAgICAgIGdldFN0eWxlRm9yQ3VzdG9tOiBnZXRTdHlsZUZvckN1c3RvbVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldFN0eWxlKGFyZWFzKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIHJvd3MgPSB0b1Jvd3MoYXJlYXMpO1xyXG5cclxuICAgICAgICAgICAgY2FsY3VsYXRlU2l6ZShyb3dzKTtcclxuXHJcblxyXG4gICAgICAgICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdywgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggKyAxKSAhPSByb3dzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdy5mb3JFYWNoKGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuc3R5bGVbXCJib3JkZXItYm90dG9tXCJdID0gXCIycHggc29saWQgcmdiKDIxMCwgMjE2LCAyMjcpXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3cuZm9yRWFjaChmdW5jdGlvbiAoYXJlYSwgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxICE9IHJvdy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZVtcImJvcmRlci1yaWdodFwiXSA9IFwiMnB4IHNvbGlkIHJnYigyMTAsIDIxNiwgMjI3KVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcm93cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRTdHlsZUZvckRpc3BsYXlDdXJyZW50KGFyZWFzLCBzZWxlY3RBcmVhLCB3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJlYXMuZmluZChmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmVhLm5hbWUuaW5jbHVkZXMoJ2N1c3RvbScpO1xyXG4gICAgICAgICAgICAgICAgfSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRTdHlsZUZvckN1c3RvbShhcmVhcywgd2lkdGgsIGhlaWdodCxhcmVhcy5maW5kKGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZWEubmFtZS5pbmNsdWRlcygndmVydGljYWwnKTtcclxuICAgICAgICAgICAgICAgIH0pLCBzZWxlY3RBcmVhLDc3LDU1KVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIHJvd3MgPSB0b1Jvd3MoYXJlYXMpO1xyXG4gICAgICAgICAgICBjYWxjdWxhdGVTaXplKHJvd3MpO1xyXG4gICAgICAgICAgICB2YXIgc2VsZWN0Um93SW5kZXggPSAwO1xyXG4gICAgICAgICAgICB2YXIgc2VsZWN0QXJlYUluZGV4ID0gMDtcclxuICAgICAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGluZGV4Um93KSB7XHJcbiAgICAgICAgICAgICAgICByb3cuZm9yRWFjaChmdW5jdGlvbiAoYXJlYSwgaW5kZXhBcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdEFyZWEgPT0gYXJlYS5hcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvd0luZGV4ID0gaW5kZXhSb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEFyZWFJbmRleCA9IGluZGV4QXJlYTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93LCBpbmRleFJvdykge1xyXG4gICAgICAgICAgICAgICAgcm93LmZvckVhY2goZnVuY3Rpb24gKGFyZWEsIGluZGV4QXJlYSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhSb3cgPT0gc2VsZWN0Um93SW5kZXggJiYgaW5kZXhBcmVhID09IHNlbGVjdEFyZWFJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmVhLnN0eWxlW1wiYm9yZGVyXCJdID0gXCIycHggc29saWQgcmdiKDc1LCAxMzMsIDIyMylcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleFJvdyA+IHNlbGVjdFJvd0luZGV4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZVtcImJvcmRlclwiXSA9IFwiMnB4IHNvbGlkIHJnYigyMTAsIDIxNiwgMjI3KVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZVtcImJvcmRlci10b3BcIl0gPSAnbm9uZSc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4QXJlYSAhPSAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuc3R5bGVbXCJib3JkZXItbGVmdFwiXSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4Um93ID09IHNlbGVjdFJvd0luZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhBcmVhID4gc2VsZWN0QXJlYUluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZVtcImJvcmRlclwiXSA9IFwiMnB4IHNvbGlkIHJnYigyMTAsIDIxNiwgMjI3KVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuc3R5bGVbXCJib3JkZXItbGVmdFwiXSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuc3R5bGVbXCJib3JkZXJcIl0gPSBcIjJweCBzb2xpZCByZ2IoMjEwLCAyMTYsIDIyNylcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhLnN0eWxlW1wiYm9yZGVyLXJpZ2h0XCJdID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZVtcImJvcmRlclwiXSA9IFwiMnB4IHNvbGlkIHJnYigyMTAsIDIxNiwgMjI3KVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZVtcImJvcmRlci1ib3R0b21cIl0gPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhBcmVhICE9IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZVtcImJvcmRlci1sZWZ0XCJdID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcm93cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRvUm93cyhhcmVhcykge1xyXG5cclxuICAgICAgICAgICAgdmFyIGFyZWFzID0gYXJlYXMuZmlsdGVyKGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIShhcmVhLnkgPT0gMCAmJiBhcmVhLnggPT0gMCAmJiBhcmVhLndpZHRoID09IDAgJiYgYXJlYS5oZWlnaHQgPT0gMCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgICAgIHZhciB5ID0gbnVsbDtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtbXV07XHJcbiAgICAgICAgICAgIHZhciByb3cgPSByZXN1bHRbMF07XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgYXJlYXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJlYXNbaV0ueSA9PSB5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goe251bWJlcjogaSwgYXJlYTogYXJlYXNbaV0sIHN0eWxlOiB7fX0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyb3cpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgeSA9IGFyZWFzW2ldLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goe251bWJlcjogaSwgYXJlYTogYXJlYXNbaV0sIHN0eWxlOiB7fX0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlU2l6ZShyb3dzKSB7XHJcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSAxMDA7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgPT0gcm93cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dzW2ldLmZvckVhY2goZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcIiVcIjtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodFJvdyA9IE1hdGguZmxvb3IoKHJvd3NbaV1bMF0uYXJlYS5oZWlnaHQgLyAxMDgwKSAqIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93c1tpXS5mb3JFYWNoKGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0Um93ICsgXCIlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gaGVpZ2h0Um93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93LCBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gMTAwO1xyXG4gICAgICAgICAgICAgICAgcm93LmZvckVhY2goZnVuY3Rpb24gKGFyZWEsIGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA9PSByb3cubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuc3R5bGVbXCJmbGV4LWJhc2lzXCJdID0gd2lkdGggKyBcIiVcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aEFyZWEgPSAoYXJlYS5hcmVhLndpZHRoIC8gMTkyMCkgKiAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGggLSB3aWR0aEFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEuc3R5bGVbXCJmbGV4LWJhc2lzXCJdID0gd2lkdGhBcmVhICsgXCIlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldFN0eWxlRm9yQ3VzdG9tKGFyZWFzLCB3aWR0aCwgaGVpZ2h0LGlzVmVydGljYWwsIHNlbGVjdEFyZWEsIGJveFdpZHRoLCBib3hIZWlnaHQpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBvcmdXaWR0aCA9IDE0NjtcclxuICAgICAgICAgICAgdmFyIGJvcmRlcldpZHRoID00O1xyXG4gICAgICAgICAgICB2YXIgZGl2ID00O1xyXG4gICAgICAgICAgICBpZiAoYm94V2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoPTI7XHJcbiAgICAgICAgICAgICAgICBkaXYgPTA7XHJcbiAgICAgICAgICAgICAgICBvcmdXaWR0aCA9IGJveFdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBvcmdIZWlnaHQgPSAxMDM7XHJcbiAgICAgICAgICAgIGlmIChib3hIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIG9yZ0hlaWdodCA9IGJveEhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHZhciBrb2VmV2lkdGggPSBvcmdXaWR0aCAvIHdpZHRoO1xyXG4gICAgICAgICAgICB2YXIga29lZkhlaWdodCA9IG9yZ0hlaWdodCAvIGhlaWdodDtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYoaXNWZXJ0aWNhbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBrb2VmV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBrb2VmV2lkdGg9a29lZkhlaWdodDtcclxuICAgICAgICAgICAgICAgIGtvZWZIZWlnaHQ9dGVtcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhcmVhcy5mb3JFYWNoKGZ1bmN0aW9uIChhcmVhLCBpbmRleFJvdykge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBhcmVhUmVzdWx0ID0ge251bWJlcjogaW5kZXhSb3csIGFyZWE6IGFyZWEsIHN0eWxlOiB7fX07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdEFyZWEgPT0gYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZWFSZXN1bHQuc3R5bGVbXCJib3JkZXJcIl0gPSBib3JkZXJXaWR0aCtcInB4IHNvbGlkIHJnYig3NSwgMTMzLCAyMjMpIFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVJlc3VsdC5zdHlsZVtcImJvcmRlclwiXSA9IGJvcmRlcldpZHRoK1wicHggc29saWQgI2QyZDhlM1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGFyZWFSZXN1bHQuc3R5bGVbXCJwb3NpdGlvblwiXSA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICAgICAgICAgIHZhciByZXNXaWR0aCA9IE1hdGgucm91bmQoa29lZldpZHRoICogYXJlYS53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzSGVpZ2h0ID0gTWF0aC5yb3VuZChrb2VmSGVpZ2h0ICogYXJlYS5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc1RvcCA9IE1hdGgucm91bmQoa29lZkhlaWdodCAqIGFyZWEueSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzTGVmdCA9IE1hdGgucm91bmQoa29lZldpZHRoICogYXJlYS54KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhcmVhUmVzdWx0LnN0eWxlW1wid2lkdGhcIl0gPSAocmVzV2lkdGgpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGFyZWFSZXN1bHQuc3R5bGVbXCJoZWlnaHRcIl0gPSAocmVzSGVpZ2h0KSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBhcmVhUmVzdWx0LnN0eWxlW1widG9wXCJdID0gKHJlc1RvcCAtIGRpdiApICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGFyZWFSZXN1bHQuc3R5bGVbXCJsZWZ0XCJdID0gKHJlc0xlZnQgLSBkaXYpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyZWFSZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYmFja1NlcnZpY2UuJGluamVjdCA9IFtcIiR0cmFuc2l0aW9uc1wiLCBcIiRzdGF0ZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdiYWNrU2VydmljZScsIGJhY2tTZXJ2aWNlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBiYWNrU2VydmljZSgkdHJhbnNpdGlvbnMsICRzdGF0ZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIlxyXG5cclxuICAgICAgICB2YXIgZnJvbSA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmFjazogYmFjayxcclxuICAgICAgICAgICAgY29uZmlndXJlOiBjb25maWd1cmVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjb25maWd1cmUoKSB7XHJcbiAgICAgICAgICAgICR0cmFuc2l0aW9ucy5vbkVudGVyKHt9LCBbXCIkdHJhbnNpdGlvbiRcIiwgZnVuY3Rpb24gKCR0cmFuc2l0aW9uJCkge1xyXG4gICAgICAgICAgICAgICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICAgICAgICAgICAgICBmcm9tID0gJHRyYW5zaXRpb24kLiRmcm9tKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGJhY2soZGVmYXVsdFN0YXRlKSB7XHJcbiAgICAgICAgICAgIGlmIChmcm9tLm5hbWUgIT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5nbygtMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbyhkZWZhdWx0U3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJHN0YXRlLmdvKGRlZmF1bHRTdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KSgpO1xyXG4iLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGZhY3RvcnkuJGluamVjdCA9IFtcIlJlc3Rhbmd1bGFyXCIsIFwiJHFcIiwgXCJDYWNoZUZhY3RvcnlcIiwgXCIkcm9vdFNjb3BlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2JpbGxpbmdTZXJ2aWNlJywgZmFjdG9yeSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZmFjdG9yeShSZXN0YW5ndWxhciwgJHEsIENhY2hlRmFjdG9yeSwkcm9vdFNjb3BlKSB7XHJcblxyXG4gICAgICAgIGlmICghQ2FjaGVGYWN0b3J5LmdldCgnYmlsbGluZ0NhY2hlJykpIHtcclxuICAgICAgICAgICAgQ2FjaGVGYWN0b3J5LmNyZWF0ZUNhY2hlKCdiaWxsaW5nQ2FjaGUnLCB7XHJcbiAgICAgICAgICAgICAgICBtYXhBZ2U6IDYwMDAwMCxcclxuICAgICAgICAgICAgICAgIHN0b3JhZ2VNb2RlOiAnbWVtb3J5JyxcclxuICAgICAgICAgICAgICAgIGRlbGV0ZU9uRXhwaXJlOiAnYWdncmVzc2l2ZScsXHJcbiAgICAgICAgICAgICAgICBjYXBhY2l0eTogNjAwXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYmlsbGluZ0NhY2hlID0gQ2FjaGVGYWN0b3J5LmdldCgnYmlsbGluZ0NhY2hlJyk7XHJcblxyXG5cclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0QnJhaW50cmVlVG9rZW46IGdldEJyYWludHJlZVRva2VuLFxyXG4gICAgICAgICAgICBnZXRCaWxsaW5nQWRkcmVzczogZ2V0QmlsbGluZ0FkZHJlc3MsXHJcbiAgICAgICAgICAgIGNyZWF0ZVVwZGF0ZUJpbGxpbmdBZGRyZXNzOiBjcmVhdGVVcGRhdGVCaWxsaW5nQWRkcmVzcyxcclxuICAgICAgICAgICAgZ2V0UHJpY2U6IGdldFByaWNlLFxyXG4gICAgICAgICAgICBnZXRMaW1pdHM6IGdldExpbWl0cyxcclxuICAgICAgICAgICAgZ2V0QmFsYW5jZTogZ2V0QmFsYW5jZSxcclxuICAgICAgICAgICAgZ2V0U3Vic2NyaXB0aW9uOiBnZXRTdWJzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGdldFBheW1lbnRNZXRob2Q6IGdldFBheW1lbnRNZXRob2QsXHJcbiAgICAgICAgICAgIHNhdmVQYXltZW50TWV0aG9kOiBzYXZlUGF5bWVudE1ldGhvZCxcclxuICAgICAgICAgICAgdXBkYXRlU3Vic2NyaXB0aW9uOiB1cGRhdGVTdWJzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGNhbmNlbFN1YnNjcmlwdGlvbjogY2FuY2VsU3Vic2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBnZXRJbnZvaWNlOiBnZXRJbnZvaWNlLFxyXG4gICAgICAgICAgICBnZXRMaW5rSW52b2ljZTogZ2V0TGlua0ludm9pY2UsXHJcbiAgICAgICAgICAgIGVudGVyQ29kZTogZW50ZXJDb2RlLFxyXG4gICAgICAgICAgICBnZXRCaWxsaW5nU3RhdHVzOiBnZXRCaWxsaW5nU3RhdHVzLFxyXG4gICAgICAgICAgICBjbGVhckNhY2hlOiBjbGVhckNhY2hlLFxyXG4gICAgICAgICAgICBnZXRCaWxsaW5nU3RhdHVzV2l0aENhdGNoOiBnZXRCaWxsaW5nU3RhdHVzV2l0aENhdGNoXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldEJyYWludHJlZVRva2VuKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiYmlsbGluZ1wiKS5vbmUoXCJicmFpbnRyZWUtY2xpZW50LXRva2VuXCIpLmdldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0QmlsbGluZ0FkZHJlc3MoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJiaWxsaW5nXCIpLm9uZShcImJpbGxpbmctYWRkcmVzc1wiKS5nZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZUJpbGxpbmdBZGRyZXNzKG1vZGVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJiaWxsaW5nXCIpLm9uZShcImJpbGxpbmctYWRkcmVzc1wiKS5jdXN0b21QVVQobW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0UGF5bWVudE1ldGhvZCgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImJpbGxpbmdcIikub25lKFwicGF5bWVudC1tZXRob2RcIikuZ2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBzYXZlUGF5bWVudE1ldGhvZChtb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiYmlsbGluZ1wiKS5vbmUoXCJwYXltZW50LW1ldGhvZFwiKS5jdXN0b21QVVQobW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0UHJpY2UocGFyYW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJiaWxsaW5nXCIpLm9uZShcImVzdGltYXRlLWNvc3RcIikuZ2V0KHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRCYWxhbmNlKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiYmlsbGluZ1wiKS5vbmUoXCJiYWxhbmNlXCIpLmdldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0TGltaXRzKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiYmlsbGluZ1wiKS5vbmUoXCJsaW1pdHNcIikuZ2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRTdWJzY3JpcHRpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJiaWxsaW5nXCIpLm9uZShcInN1YnNjcmlwdGlvblwiKS5nZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVN1YnNjcmlwdGlvbihtb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiYmlsbGluZ1wiKS5vbmUoXCJzdWJzY3JpcHRpb25cIikuY3VzdG9tUFVUKG1vZGVsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgICAgICAgICAgZ2V0QmlsbGluZ1N0YXR1cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNhbmNlbFN1YnNjcmlwdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImJpbGxpbmdcIikub25lKFwic3Vic2NyaXB0aW9uXCIpLmN1c3RvbURFTEVURSgpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgICBnZXRCaWxsaW5nU3RhdHVzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0SW52b2ljZSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImJpbGxpbmdcIikub25lKFwiaW52b2ljZVwiKS5nZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBlbnRlckNvZGUoY29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiYmlsbGluZ1wiKS5vbmUoXCJwcm9tb2NvZGVcIiwgY29kZSkuY3VzdG9tUFVUKCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgICAgICAgIGdldEJpbGxpbmdTdGF0dXMoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjbGVhckNhY2hlKCkge1xyXG4gICAgICAgICAgICBiaWxsaW5nQ2FjaGUucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgICAgICRyb290U2NvcGUuJGVtaXQoJ3N1YnNjcmlwdGlvbi5VcGRhdGUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldExpbmtJbnZvaWNlKGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJiaWxsaW5nXCIpLm9uZShcImludm9pY2VcIiwgaWQpLm9uZSgncGRmJykuZ2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRCaWxsaW5nU3RhdHVzKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSAkcS5hbGwoW1xyXG4gICAgICAgICAgICAgICAgUmVzdGFuZ3VsYXIub25lKFwiYmlsbGluZ1wiKS5vbmUoXCJsaW1pdHNcIikud2l0aEh0dHBDb25maWcoe2NhY2hlOiBiaWxsaW5nQ2FjaGV9KS5nZXQoKSxcclxuICAgICAgICAgICAgICAgIFJlc3Rhbmd1bGFyLm9uZShcImJpbGxpbmdcIikub25lKFwic3Vic2NyaXB0aW9uXCIpLndpdGhIdHRwQ29uZmlnKHtjYWNoZTogYmlsbGluZ0NhY2hlfSkuZ2V0KCldKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBwYWlkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0czogcmVzdWx0WzBdLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGU6IHJlc3VsdFsxXS5lbmRfZGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb246IHJlc3VsdFsxXVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHZhciBsaW1pdHMgPSByZXN1bHRbMF07XHJcbiAgICAgICAgICAgICAgICBzdGF0dXMucGFpZCA9IGxpbWl0cy5wYWlkLnRvdGFsID4gMDtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0QmlsbGluZ1N0YXR1c1dpdGhDYXRjaCgpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBnZXRCaWxsaW5nU3RhdHVzKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBsaW1pdHMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJmcmVlXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0b3RhbFwiOiBcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWZ0XCI6IFwiMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVzZWRcIjogXCIwXCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIFwicGFpZFwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidG90YWxcIjogXCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVmdFwiOiBcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1c2VkXCI6IFwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGU6ICcnXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWlkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBsaW1pdHM6IGxpbWl0cyxcclxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTtcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMjMuMDUuMjAxNi5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA1LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgZmFjdG9yeS4kaW5qZWN0ID0gW1wiUmVzdGFuZ3VsYXJcIiwgXCIkcVwiLCBcImNvbnRlbnRzXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2NhbXBhaWducycsIGZhY3RvcnkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBmYWN0b3J5KFJlc3Rhbmd1bGFyLCAkcSwgY29udGVudHMpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0OiBnZXQsXHJcbiAgICAgICAgICAgIGdldExpc3Q6IGdldExpc3QsXHJcbiAgICAgICAgICAgIGFkZDogYWRkLFxyXG4gICAgICAgICAgICB1cGRhdGU6IHVwZGF0ZSxcclxuICAgICAgICAgICAgcmVtb3ZlOiByZW1vdmUsXHJcbiAgICAgICAgICAgIGF0dGFjaENvbnRlbnQ6IGF0dGFjaENvbnRlbnQsXHJcbiAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnQ6IHVwZGF0ZUNvbnRlbnQsXHJcbiAgICAgICAgICAgIGF0dGFjaENvbnRlbnRzOiBhdHRhY2hDb250ZW50cyxcclxuICAgICAgICAgICAgZGV0YWNoQ29udGVudDogZGV0YWNoQ29udGVudCxcclxuICAgICAgICAgICAgZ2V0Q29udGVudDogZ2V0Q29udGVudCxcclxuICAgICAgICAgICAgbW92ZVRvQ29udGVudDogbW92ZVRvQ29udGVudCxcclxuICAgICAgICAgICAgbW92ZVVwQ29udGVudDogbW92ZVVwQ29udGVudCxcclxuICAgICAgICAgICAgbW92ZURvd25Db250ZW50OiBtb3ZlRG93bkNvbnRlbnQsXHJcbiAgICAgICAgICAgIGdldEFyZWFzOiBnZXRBcmVhcyxcclxuICAgICAgICAgICAgZ2V0QXJlYTogZ2V0QXJlYSxcclxuICAgICAgICAgICAgdXBkYXRlQXJlYTogdXBkYXRlQXJlYSxcclxuICAgICAgICAgICAgZ2V0TGlzdEZyb21GaWx0ZXJPcHRpb246IGdldExpc3RGcm9tRmlsdGVyT3B0aW9uLFxyXG4gICAgICAgICAgICBnZXRMaXN0Rm9yQXJlYTogZ2V0TGlzdEZvckFyZWEsXHJcbiAgICAgICAgICAgIGdldFBsYXllcnM6IGdldFBsYXllcnNcclxuXHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldChpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiY2FtcGFpZ25cIiwgaWQpLmdldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0TGlzdChwYXJhbSkge1xyXG4gICAgICAgICAgICB2YXIgbGlzdCA9IFJlc3Rhbmd1bGFyLmFsbChcImNhbXBhaWduXCIpLmdldExpc3QocGFyYW0pO1xyXG4gICAgICAgICAgICB2YXIgY291bnQgPSBSZXN0YW5ndWxhci5vbmUoXCJjYW1wYWlnblwiLCAnY291bnQnKS5nZXQocGFyYW0pO1xyXG4gICAgICAgICAgICByZXR1cm4gJHEuYWxsKFtsaXN0LCBjb3VudF0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IHZhbHVlWzBdO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHNUb3RhbCA9IHZhbHVlWzFdLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHNGaWx0ZXJlZCA9IHJlc3VsdC5yZWNvcmRzVG90YWw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkcS5yZWplY3Qoe2RhdGE6IFtdLCByZWNvcmRzVG90YWw6IDAsIHJlY29yZHNGaWx0ZXJlZDogMH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKG1vZGVsKSB7XHJcbiAgICAgICAgICAgIHZhciBjb3B5TW9kZWwgPSBSZXN0YW5ndWxhci5jb3B5KG1vZGVsKTtcclxuICAgICAgICAgICAgY29weU1vZGVsLnRhZ3MgPSBjb3B5TW9kZWwudGFncy5tYXAoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2LmlkO1xyXG4gICAgICAgICAgICB9KS5qb2luKCk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmICghY29weU1vZGVsLmFyZWFfbGF5b3V0WzBdLmlkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29weU1vZGVsLmhhc19hdWRpb19hcmVhX25ldykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcHlNb2RlbC5hcmVhX2xheW91dC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1ZGlvJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29weU1vZGVsLmhhc19hdWRpb19hcmVhX25ldyAhPSBjb3B5TW9kZWwuaGFzX2F1ZGlvX2FyZWEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29weU1vZGVsLmhhc19hdWRpb19hcmVhX25ldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5TW9kZWwuYXJlYV9sYXlvdXQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXVkaW8nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJlYSA9IGNvcHlNb2RlbC5hcmVhX2xheW91dC5maW5kKGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFyZWEueSA9PSAwICYmIGFyZWEueCA9PSAwICYmIGFyZWEud2lkdGggPT0gMCAmJiBhcmVhLmhlaWdodCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29weU1vZGVsLmFyZWFfbGF5b3V0LnNwbGljZShjb3B5TW9kZWwuYXJlYV9sYXlvdXQuaW5kZXhPZihhcmVhKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmKCFjb3B5TW9kZWwuZW5kX3RpbWVzdGFtcClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICBjb3B5TW9kZWwuZW5kX3RpbWVzdGFtcD1cIjAwMDAtMDAtMDAgMDA6MDA6MDBcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGNvcHlNb2RlbC5hcmVhX2xheW91dCA9IEpTT04uc3RyaW5naWZ5KGNvcHlNb2RlbC5hcmVhX2xheW91dC5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvcHlNb2RlbC5wdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZChwYXJhbSkge1xyXG4gICAgICAgICAgICB2YXIgY29weU1vZGVsID0gUmVzdGFuZ3VsYXIuY29weShwYXJhbSk7XHJcbiAgICAgICAgICAgIGNvcHlNb2RlbC50YWdzID0gY29weU1vZGVsLnRhZ3MubWFwKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdi5pZDtcclxuICAgICAgICAgICAgfSkuam9pbigpO1xyXG4gICAgICAgICAgICBpZiAoY29weU1vZGVsLmhhc19hdWRpb19hcmVhKSB7XHJcbiAgICAgICAgICAgICAgICBjb3B5TW9kZWwuYXJlYV9sYXlvdXQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1ZGlvJyxcclxuICAgICAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgY29weU1vZGVsLmFyZWFfbGF5b3V0ID0gSlNPTi5zdHJpbmdpZnkoY29weU1vZGVsLmFyZWFfbGF5b3V0KTtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLmFsbChcImNhbXBhaWduXCIpLnBvc3QoY29weU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZShpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiY2FtcGFpZ25cIiwgaWQpLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gYXR0YWNoQ29udGVudHMoaWQsIHNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IHNlbGVjdGVkLm1hcChmdW5jdGlvbiAoY29udGVudElkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiY2FtcGFpZ25cIiwgaWQpLnBvc3QoXCJjb250ZW50XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X2lkOiBjb250ZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHBsYXlfdGltZTogJ2ZyZWUnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGF0dGFjaENvbnRlbnQoaWQsIGNvbnRlbnQsIGFyZWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImNhbXBhaWduXCIsIGlkKS5vbmUoXCJhcmVhXCIsIGFyZWEuaWQpLm9uZSgnY29udGVudCcsIGNvbnRlbnQuY29udGVudF9pZCkuY3VzdG9tUFVUKGNvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ29udGVudChjb250ZW50KSB7XHJcbiAgICAgICAgICAgIHZhciBjb3B5TW9kZWwgPSBSZXN0YW5ndWxhci5jb3B5KGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBjb3B5TW9kZWwuaWQgPSBjb3B5TW9kZWwuY29udGVudC5pZDtcclxuICAgICAgICAgICAgcmV0dXJuIGNvcHlNb2RlbC5wdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGRldGFjaENvbnRlbnQoaWQsIGFyZWFJZCwgc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gc2VsZWN0ZWQubWFwKGZ1bmN0aW9uIChjb250ZW50SWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJjYW1wYWlnblwiLCBpZCkub25lKFwiYXJlYVwiLCBhcmVhSWQpLm9uZShcImNvbnRlbnRcIiwgY29udGVudElkKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0Q29udGVudChpZCwgYXJlYUlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJjYW1wYWlnblwiLCBpZCkub25lKCdhcmVhJywgYXJlYUlkKS5nZXRMaXN0KFwiY29udGVudFwiKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnBsYXlfb3JkZXIgLSBiLnBsYXlfb3JkZXI7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG1vdmVUb0NvbnRlbnQoY2FtcGFpZ25JZCxhcmVhSWQsIGNvbnRlbnRJZCwgcG9zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJjYW1wYWlnblwiLCBjYW1wYWlnbklkKS5vbmUoXCJhcmVhXCIsIGFyZWFJZCkub25lKFwiY29udGVudFwiLCBjb250ZW50SWQpLnBvc3QoJ21vdmUtdG8nLCB7cG9zaXRpb246IHBvc30pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbW92ZVVwQ29udGVudChjYW1wYWlnbklkLCBjb250ZW50SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImNhbXBhaWduXCIsIGNhbXBhaWduSWQpLm9uZShcImNvbnRlbnRcIiwgY29udGVudElkKS5wb3N0KCdtb3ZlLXVwJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBtb3ZlRG93bkNvbnRlbnQoY2FtcGFpZ25JZCwgY29udGVudElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJjYW1wYWlnblwiLCBjYW1wYWlnbklkKS5vbmUoXCJjb250ZW50XCIsIGNvbnRlbnRJZCkucG9zdCgnbW92ZS1kb3duJyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0QXJlYXMoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImNhbXBhaWduXCIsIGlkKS5nZXRMaXN0KFwiYXJlYXNcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVBcmVhKGFyZWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImNhbXBhaWduXCIsIGFyZWEuY2FtcGFpZ25faWQpLm9uZShcImFyZWFcIiwgYXJlYS5pZCkuY3VzdG9tUFVUKGFyZWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiAgZ2V0QXJlYShhcmVhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJjYW1wYWlnblwiLCBhcmVhLmNhbXBhaWduX2lkKS5vbmUoXCJhcmVhXCIsIGFyZWEuaWQpLmdldCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiBnZXRQbGF5ZXJzKGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJjYW1wYWlnblwiLCBpZCkuZ2V0TGlzdChcInBsYXllcnNcIik7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0TGlzdEZvckFyZWEocGFyYW0pIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRMaXN0KHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkcS5hbGwocmVzdWx0LmRhdGEubWFwKGZ1bmN0aW9uIChjYW1wYWlnbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5nZXRDb250ZW50KGNhbXBhaWduLmlkKS50aGVuKGZ1bmN0aW9uIChjb250ZW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2NhbXBhaWduOiBjYW1wYWlnbiwgY29udGVudHM6IGNvbnRlbnRzfTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pKS50aGVuKGZ1bmN0aW9uIChsaXN0Q2FtcGFpbmdzQ29udGVudHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FtcGFpZ25zID0gbGlzdENhbXBhaW5nc0NvbnRlbnRzLm1hcChmdW5jdGlvbiAoY2FtcGFpbmdDb250ZW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FtcGFpZ24gPSBjYW1wYWluZ0NvbnRlbnRzLmNhbXBhaWduO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbi5leGlzdEh0bWwgPSAhIWNhbXBhaW5nQ29udGVudHMuY29udGVudHMuZmluZChmdW5jdGlvbiAoY29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQuY29udGVudC50eXBlID09ICdodG1sNV9vbmxpbmUnIHx8IGNvbnRlbnQuY29udGVudC50eXBlID09ICdodG1sNV96aXAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWduO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gY2FtcGFpZ25zO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0TGlzdEZyb21GaWx0ZXJPcHRpb24ob3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbbmFtZV0nXSA9IG9wdGlvbi5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghb3B0aW9uLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bJ2ZpbHRlcltzdGF0dXNdJ10gPSAnYWN0aXZlJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob3B0aW9uLnRhZ3MgJiYgb3B0aW9uLnRhZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bJ2ZpbHRlclt0YWdzXSddID0gb3B0aW9uLnRhZ3MubWFwKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuaWQ7XHJcbiAgICAgICAgICAgICAgICB9KS5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBhcmFtWydwYWdlW29mZnNldF0nXSA9IDA7XHJcbiAgICAgICAgICAgIHBhcmFtWydwYWdlW2xpbWl0XSddID0gNTAwO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGdldExpc3QocGFyYW0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNS4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIlJlc3Rhbmd1bGFyXCIsIFwiJHFcIiwgXCJyZXN0SGVscGVyXCIsIFwibG9jYWxlXCIsIFwiYmlsbGluZ1NlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuc2VydmljZSgnY29udGVudHMnLCBzZXJ2aWNlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKFJlc3Rhbmd1bGFyLCAkcSwgcmVzdEhlbHBlciwgbG9jYWxlLGJpbGxpbmdTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBnZXRDb250ZW50czogZ2V0Q29udGVudHMsXHJcbiAgICAgICAgICAgIGFkZENvbnRlbnQ6IGFkZENvbnRlbnQsXHJcbiAgICAgICAgICAgIGdldENvbnRlbnQ6IGdldENvbnRlbnQsXHJcbiAgICAgICAgICAgIGdldEZpbGVzOiBnZXRGaWxlc0NvbnRlbnRzLFxyXG4gICAgICAgICAgICBnZXRNZWRpYUluZm86IGdldE1lZGlhSW5mbyxcclxuICAgICAgICAgICAgZ2V0Q2FtcGFpZ25zOiBnZXRDYW1wYWlnbnMsXHJcbiAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnQ6IHVwZGF0ZUNvbnRlbnQsXHJcbiAgICAgICAgICAgIHJlbW92ZUNvbnRlbnQ6IHJlbW92ZUNvbnRlbnQsXHJcbiAgICAgICAgICAgIGdldDogZ2V0Q29udGVudCxcclxuICAgICAgICAgICAgZ2V0TGlzdDogZ2V0Q29udGVudHMsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogdXBkYXRlQ29udGVudCxcclxuICAgICAgICAgICAgdXBkYXRlRmlsZTogdXBkYXRlRmlsZSxcclxuICAgICAgICAgICAgZ2V0TGlzdEZyb21GaWx0ZXJPcHRpb246IGdldExpc3RGcm9tRmlsdGVyT3B0aW9uLFxyXG4gICAgICAgICAgICBzaG93U2VsZWN0RmlsZU1vZGFsOiBzaG93U2VsZWN0RmlsZU1vZGFsXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldENvbnRlbnRzKHBhcmFtKSB7XHJcbiAgICAgICAgICAgIHZhciBsaXN0ID0gUmVzdGFuZ3VsYXIuYWxsKFwiY29udGVudFwiKS5nZXRMaXN0KHBhcmFtKTtcclxuICAgICAgICAgICAgdmFyIGNvdW50ID0gUmVzdGFuZ3VsYXIub25lKFwiY29udGVudFwiLCAnY291bnQnKS5nZXQocGFyYW0pO1xyXG4gICAgICAgICAgICByZXR1cm4gJHEuYWxsKFtsaXN0LCBjb3VudF0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IHZhbHVlWzBdO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHNUb3RhbCA9IHZhbHVlWzFdLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHNGaWx0ZXJlZCA9IHJlc3VsdC5yZWNvcmRzVG90YWw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkcS5yZWplY3Qoe2RhdGE6IFtdLCByZWNvcmRzVG90YWw6IDAsIHJlY29yZHNGaWx0ZXJlZDogMH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldENvbnRlbnQoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImNvbnRlbnRcIiwgaWQpLmdldCgpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5fYmFja3VwID0gYW5ndWxhci5jb3B5KHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRDYW1wYWlnbnMoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcImNvbnRlbnRcIiwgaWQpLmdldExpc3QoJ2NhbXBhaWducycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0RmlsZXNDb250ZW50cyhpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiY29udGVudFwiLCBpZCkuZ2V0TGlzdCgnZmlsZXMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldE1lZGlhSW5mbyhpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiY29udGVudFwiKS5vbmUoJ21lZGlhaW5mbycsIGlkKS5nZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZENvbnRlbnQobW9kZWwpIHtcclxuICAgICAgICAgICAgdmFyIGNvcHlDb250ZW50ID0gUmVzdGFuZ3VsYXIuY29weShtb2RlbCk7XHJcbiAgICAgICAgICAgIGNvcHlDb250ZW50LnRhZ3MgPSBjb3B5Q29udGVudC50YWdzLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHYuaWQ7XHJcbiAgICAgICAgICAgIH0pLmpvaW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLmFsbChcImNvbnRlbnRcIikucG9zdChjb3B5Q29udGVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlRmlsZShjb250ZW50T3JpZykge1xyXG4gICAgICAgICAgICByZXR1cm4gU2VuZFhoclJlcXVlc3QoY29udGVudE9yaWcucGxhaW4oKSwgJ1BVVCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypkZXByZWNhdGVkKi9cclxuICAgICAgICBmdW5jdGlvbiBTZW5kWGhyUmVxdWVzdChjb250ZW50T3JpZywgdHlwZSkge1xyXG4gICAgICAgICAgICB2YXIgZGVmZXIgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgICAgICB2YXIgY29udGVudCA9IGFuZ3VsYXIuY29weShjb250ZW50T3JpZyk7XHJcbiAgICAgICAgICAgIGNvbnRlbnQudGFncyA9IGNvbnRlbnQudGFncy5tYXAoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2LmlkO1xyXG4gICAgICAgICAgICB9KS5qb2luKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnUE9TVCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucGxheV9kdXJhdGlvbiAqPSAxMDAwO1xyXG4gICAgICAgICAgICAgICAgY29udGVudC5wbGF5X3N0YXJ0ICo9IDEwMDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnRlbnQuZmlsZSA9IGNvbnRlbnRPcmlnLmZpbGU7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN0SGVscGVyLnNlbmRYaHJSZXF1ZXN0KFwiL2NvbnRlbnRcIiArICgodHlwZSA9PSAnUFVUJykgPyAoXCIvXCIgKyBjb250ZW50LmlkICkgOiBcIlwiKSwgdHlwZSwgY29udGVudCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoY29udGVudCkge1xyXG4gICAgICAgICAgICB2YXIgY29weUNvbnRlbnQgPSBSZXN0YW5ndWxhci5jb3B5KGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBjb3B5Q29udGVudC50YWdzID0gY29weUNvbnRlbnQudGFncy5tYXAoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2LmlkO1xyXG4gICAgICAgICAgICB9KS5qb2luKCk7XHJcbiAgICAgICAgICAgIGNvcHlDb250ZW50ID0gY29weUNvbnRlbnQucGxhaW4oKTtcclxuICAgICAgICAgICAgaWYoY29weUNvbnRlbnQubmFtZT09PWNvcHlDb250ZW50Ll9iYWNrdXAubmFtZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvcHlDb250ZW50Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVsZXRlIGNvcHlDb250ZW50Ll9iYWNrdXA7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gICBSZXN0YW5ndWxhci5vbmUoXCJjb250ZW50XCIsIGNvcHlDb250ZW50LmlkKS5jdXN0b21QVVQoY29weUNvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlQ29udGVudChpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiY29udGVudFwiLCBpZCkucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRMaXN0RnJvbUZpbHRlck9wdGlvbihvcHRpb24pIHtcclxuICAgICAgICAgICAgdmFyIHBhcmFtID0ge307XHJcbiAgICAgICAgICAgIGlmIChvcHRpb24ubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bJ2ZpbHRlcltuYW1lXSddID0gb3B0aW9uLm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9wdGlvbi50eXBlcyAmJiBvcHRpb24udHlwZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bJ2ZpbHRlclt0eXBlXSddID0gb3B0aW9uLnR5cGVzLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9KS5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9wdGlvbi50YWdzICYmIG9wdGlvbi50YWdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbdGFnc10nXSA9IG9wdGlvbi50YWdzLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmlkO1xyXG4gICAgICAgICAgICAgICAgfSkuam9pbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmFtWydwYWdlW29mZnNldF0nXSA9IDA7XHJcbiAgICAgICAgICAgIHBhcmFtWydwYWdlW2xpbWl0XSddID0gNTAwO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGdldENvbnRlbnRzKHBhcmFtKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBzaG93U2VsZWN0RmlsZU1vZGFsKGFjY2VwdCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJHEuYWxsKFsgUmVzdGFuZ3VsYXIub25lKFwiY29udGVudFwiKS5vbmUoJ3NlY3VyaXR5JykuZ2V0KCksYmlsbGluZ1NlcnZpY2UuZ2V0QmlsbGluZ1N0YXR1cygpLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7cGFpZDpmYWxzZX07XHJcbiAgICAgICAgICAgIH0pXSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkZWZlciA9ICRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZmlsZXBpY2tlci5zZXRLZXkoJ0FEYnhPaU1BSVFBdUNtYmVjd0FqY3onKTtcclxuICAgICAgICAgICAgICAgIGZpbGVwaWNrZXIucGlja0FuZFN0b3JlKFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGVzOiBhY2NlcHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogJ21vZGFsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXM6ICcqJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZTogKHJlc3BvbnNlWzFdLnBhaWQ/ICAyNTA6NTApICAgICogMTAyNCAqIDEwMjQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsb2NhbGUuZ2V0TG9jYWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5OiByZXNwb25zZVswXS5wb2xpY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogcmVzcG9uc2VbMF0uc2lnbmF0dXJlXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiAnUzMnXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoQmxvYnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZzaWQgPSBCbG9ic1swXS51cmwuc3BsaXQoJy8nKS5yZXZlcnNlKClbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gQmxvYnNbMF0uZmlsZW5hbWUuc3Vic3RyaW5nKDAsIEJsb2JzWzBdLmZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZXRNZWRpYUluZm8oQmxvYnNbMF0ua2V5KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2ZSh7YmxvYjogQmxvYnNbMF0sIG5hbWU6IG5hbWUsIGZzaWQ6IGZzaWQsIG1lZGlhSW5mbzogcmVzcG9uc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlci5yZWplY3QoZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdlcnJvckhhbmRsZXJIZWxwZXInLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFsnbm90aWZpY2F0aW9uU2VydmljZScsICdsb2NhbGUnXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2Uobm90aWZpY2F0aW9uU2VydmljZSwgbG9jYWxlKSB7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZUVycm9yUmVzcG9uc2UgPSBmdW5jdGlvbiAocmVzcG9uc2UsIGZvcm0sIHZtKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGZvcm1Qcm9wIGluIGZvcm0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JtLmhhc093blByb3BlcnR5KGZvcm1Qcm9wKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtUHJvcFswXSAhPSAnJCcgJiYgZm9ybVtmb3JtUHJvcF0uc2VydmVyTWVzc2FnZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1bZm9ybVByb3BdLnNlcnZlck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSA1MDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiggcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5lcnJvciA9IHJlc3BvbnNlLmRhdGEuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdjb21tb24uSW50ZXJuYWxTZXJ2ZXJFcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvciA9IHJlc3BvbnNlLmRhdGEuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvciA9IFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmhhc093blByb3BlcnR5KHByb3ApICYmIGZvcm1bcHJvcF0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGFbcHJvcF0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1bcHJvcF0uc2VydmVyTWVzc2FnZSA9IHJlc3BvbnNlLmRhdGFbcHJvcF1bMF1bbG9jYWxlLmdldExvY2FsZSgpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1bcHJvcF0uc2VydmVyTWVzc2FnZSA9IHJlc3BvbnNlLmRhdGFbcHJvcF1bbG9jYWxlLmdldExvY2FsZSgpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvclJlc3BvbnNlRm9yRWRpdCA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gNTAwKSB7XHJcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignY29tbW9uLkludGVybmFsU2VydmVyRXJyb3InKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFcnJvcjogcmVzcG9uc2UuZGF0YS5lcnJvcltsb2NhbGUuZ2V0TG9jYWxlKCldXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIGVycm9yID0ge307XHJcbiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gcmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YVtwcm9wXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JbcHJvcF0gPSByZXNwb25zZS5kYXRhW3Byb3BdWzBdW2xvY2FsZS5nZXRMb2NhbGUoKV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcltwcm9wXSA9IHJlc3BvbnNlLmRhdGFbcHJvcF1bbG9jYWxlLmdldExvY2FsZSgpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcImxvY2FsZVwiLCBcIiRxXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2ZpbGVTZXJ2aWNlJywgc2VydmljZSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UobG9jYWxlLCAkcSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0RmlsZTogZ2V0RmlsZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldEZpbGUodXJsLCBuYW1lKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgZGVmZXIgPSAkcS5kZWZlcigpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTtcclxuICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcclxuICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJsb2IgPSB0aGlzLnJlc3BvbnNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZU9mQmxvYiA9IG5ldyBGaWxlKFtibG9iXSwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2ZShmaWxlT2ZCbG9iKVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgeGhyLnNlbmQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcbn0pKCk7IiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCJsb2NhbGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuc2VydmljZSgnZmlsdGVySGVscGVyJywgc2VydmljZSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UobG9jYWxlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBnZXRTZWNvbmRzOiBnZXRGaWxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0RmlsZSh1cmwsIG5hbWUpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBkZWZlciA9ICRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xyXG4gICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xyXG4gICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IHRoaXMucmVzcG9uc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWxlT2ZCbG9iID0gbmV3IEZpbGUoW2Jsb2JdLCBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKGZpbGVPZkJsb2IpXHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB4aHIuc2VuZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGVmZXIucHJvbWlzZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyNC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2dlb1RhcmdldGluZycsIGZhY3RvcnkpXHJcblxyXG4gICAgZmFjdG9yeS4kaW5qZWN0ID0gW1wiUmVzdGFuZ3VsYXJcIiwgXCIkcVwiXTtcclxuICAgIGZ1bmN0aW9uIGZhY3RvcnkoUmVzdGFuZ3VsYXIsICRxKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGdldDogZ2V0LFxyXG4gICAgICAgICAgICBnZXRMaXN0OiBnZXRMaXN0LFxyXG4gICAgICAgICAgICBhZGQ6IGFkZCxcclxuICAgICAgICAgICAgdXBkYXRlOiB1cGRhdGUsXHJcbiAgICAgICAgICAgIHJlbW92ZTogcmVtb3ZlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJnZW8tdGFyZ2V0aW5nXCIsIGlkKS5nZXQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wb2x5Z29ucyA9IGNvbnRlbnRUb1BvbHlnb25zKGFuZ3VsYXIuZnJvbUpzb24ocmVzdWx0LmNvbnRlbnQpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldExpc3QoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJnZW8tdGFyZ2V0aW5nXCIpLmdldExpc3QoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYS5wb2x5Z29ucyA9IGNvbnRlbnRUb1BvbHlnb25zKGFuZ3VsYXIuZnJvbUpzb24oYXJlYS5jb250ZW50KSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY29udGVudFRvUG9seWdvbnMoY29udGVudFNlcnZlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGVudFNlcnZlci5tYXAoZnVuY3Rpb24gKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29udGVudC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGhzOiBjb250ZW50LmNvb3Jkcy5tYXAoZnVuY3Rpb24gKGNvb3Jkcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGU6IGNvb3Jkc1swXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogY29vcmRzWzFdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKG1vZGVsKSB7XHJcbiAgICAgICAgICAgIHZhciBjb3B5TW9kZWwgPSBSZXN0YW5ndWxhci5jb3B5KG1vZGVsKTtcclxuICAgICAgICAgICAgY29weU1vZGVsLmNvbnRlbnQgPSBjb3B5TW9kZWwucG9seWdvbnMubWFwKGZ1bmN0aW9uIChwb2x5Z29uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHBvbHlnb24ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBjb29yZHM6IHBvbHlnb24ucGF0aHMubWFwKGZ1bmN0aW9uIChjb29yZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Nvb3JkLmxhdGl0dWRlLCBjb29yZC5sb25naXR1ZGVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGVsZXRlIGNvcHlNb2RlbC5wb2x5Z29ucztcclxuICAgICAgICAgICAgcmV0dXJuIGNvcHlNb2RlbC5wdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZChwYXJhbSkge1xyXG4gICAgICAgICAgICB2YXIgY29weU1vZGVsID0gUmVzdGFuZ3VsYXIuY29weShwYXJhbSk7XHJcbiAgICAgICAgICAgIGNvcHlNb2RlbC5jb250ZW50ID0gY29weU1vZGVsLnBvbHlnb25zLm1hcChmdW5jdGlvbiAocG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwb2x5Z29uLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzOiBwb2x5Z29uLnBhdGhzLm1hcChmdW5jdGlvbiAoY29vcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjb29yZC5sYXRpdHVkZSwgY29vcmQubG9uZ2l0dWRlXTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvcHlNb2RlbC5kZXNjcmlwdGlvbiA9IFwiZFwiO1xyXG4gICAgICAgICAgICBkZWxldGUgY29weU1vZGVsLnBvbHlnb25zO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLmFsbChcImdlby10YXJnZXRpbmdcIikucG9zdChjb3B5TW9kZWwpLnRoZW4oZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgIGFyZWEucG9seWdvbnMgPSBwYXJhbS5wb2x5Z29ucztcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcmVhO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZShpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwiZ2VvLXRhcmdldGluZ1wiLCBpZCkucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ25vdGlmaWNhdGlvblNlcnZpY2UnLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcImxvY2FsZVwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UobG9jYWxlKXtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdmFyIG1ldGhvZCA9IDMwMDA7XHJcbiAgICAgICAgdmFyIG9wZW5BbmltYXRpb24gPSAnYW5pbWF0ZWQgYm91bmNlSW4nO1xyXG4gICAgICAgIHZhciBjbG9zZUFuaW1hdGlvbiA9ICdhbmltYXRlZCBib3VuY2VPdXQnO1xyXG4gICAgICAgIHNlbGYuX3Nob3dNZXNzYWdlPWZ1bmN0aW9uIChtZXNzYWdlLHR5cGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBub3R5KHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICc8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtJyt0eXBlKycgbWVkaWEgZmFkZSBpblwiPjxwPicrbWVzc2FnZSsnPC9wPjwvZGl2PicsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZGlzbWlzc1F1ZXVlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgbGF5b3V0OiBcInRvcENlbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgY2xvc2VXaXRoOiBbJ2NsaWNrJ10sXHJcbiAgICAgICAgICAgICAgICB0aGVtZTogJ21hZGUnLFxyXG4gICAgICAgICAgICAgICAgbWF4VmlzaWJsZTogMTAsXHJcbiAgICAgICAgICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuOiBvcGVuQW5pbWF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlOiBjbG9zZUFuaW1hdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBlYXNpbmc6ICdzd2luZycsXHJcbiAgICAgICAgICAgICAgICAgICAgc3BlZWQ6IDEwMFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6bWV0aG9kfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzZWxmLnNob3dNZXNzYWdlID0gZnVuY3Rpb24gKGNvZGUpIHtcclxuXHJcbiAgICAgICAgICAgIGxvY2FsZS5yZWFkeShnZXRHcm91cE5hbWUoY29kZSkpLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLl9zaG93TWVzc2FnZShsb2NhbGUuZ2V0U3RyaW5nKGNvZGUpLFwiaW5mb1wiKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNlbGYuc2hvd0Vycm9yID1mdW5jdGlvbiAoY29kZSkge1xyXG4gICAgICAgICAgICBsb2NhbGUucmVhZHkoZ2V0R3JvdXBOYW1lKGNvZGUpKS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5fc2hvd01lc3NhZ2UobG9jYWxlLmdldFN0cmluZyhjb2RlKSxcImRhbmdlclwiKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNlbGYuc2hvd1dhcm5pbmcgPWZ1bmN0aW9uIChjb2RlKSB7XHJcbiAgICAgICAgICAgIGxvY2FsZS5yZWFkeShnZXRHcm91cE5hbWUoY29kZSkpLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLl9zaG93TWVzc2FnZShsb2NhbGUuZ2V0U3RyaW5nKGNvZGUpLFwid2FybmluZ1wiKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0R3JvdXBOYW1lKGNvZGUpe1xyXG4gICAgICAgIHJldHVybiBjb2RlLnNwbGl0KCcuJylbMF07XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMjUuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3BsYXllckRldmljZScsIGZhY3RvcnkpXHJcblxyXG4gICAgZmFjdG9yeS4kaW5qZWN0ID0gW1wiUmVzdGFuZ3VsYXJcIiwgXCIkcVwiLCAnbW9tZW50J107XHJcbiAgICBmdW5jdGlvbiBmYWN0b3J5KFJlc3Rhbmd1bGFyLCAkcSwgbW9tZW50KSB7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGdldFRva2VuOiBnZXRUb2tlblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0VG9rZW4oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJwbGF5ZXJcIikucG9zdChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG1vbWVudCgpLmZvcm1hdChcIllZWVktTU0tREQgSEg6bW06c3NcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXpvbmU6ICdFdXJvcGUvTW9za293JyxcclxuICAgICAgICAgICAgICAgICAgICB1bmlxaWQ6IFwiMGRhYmZkYzUtYzM1My00OTk2LThkMjYtNjM3M2JiOGVjMjk1XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE0LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuc2VydmljZSgncGxheWVycycsIGZhY3RvcnkpO1xyXG5cclxuICAgIGZhY3RvcnkuJGluamVjdCA9IFtcIlJlc3Rhbmd1bGFyXCIsIFwiJHFcIiwgXCJyZXN0SGVscGVyXCJdO1xyXG4gICAgZnVuY3Rpb24gZmFjdG9yeShSZXN0YW5ndWxhciwgJHEsIHJlc3RIZWxwZXIpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0UGxheWVyczogZ2V0UGxheWVycyxcclxuICAgICAgICAgICAgYWN0aXZhdGVQbGF5ZXI6IGFjdGl2YXRlUGxheWVyLFxyXG4gICAgICAgICAgICBjaGVja1BsYXllcjogY2hlY2tQbGF5ZXIsXHJcbiAgICAgICAgICAgIHJlcGxhY2VDb2RlOiByZXBsYWNlQ29kZSxcclxuICAgICAgICAgICAgZ2V0UGxheWVyOiBnZXRQbGF5ZXIsXHJcbiAgICAgICAgICAgIHVwZGF0ZVBsYXllcjogdXBkYXRlUGxheWVyLFxyXG4gICAgICAgICAgICByZW1vdmVQbGF5ZXI6IHJlbW92ZVBsYXllcixcclxuICAgICAgICAgICAgZ2V0OiBnZXRQbGF5ZXIsXHJcbiAgICAgICAgICAgIGdldExpc3Q6IGdldFBsYXllcnMsXHJcbiAgICAgICAgICAgIGdldEFsbDogZ2V0QWxsLFxyXG4gICAgICAgICAgICB1cGRhdGU6IHVwZGF0ZVBsYXllcixcclxuICAgICAgICAgICAgcmVtb3ZlOiByZW1vdmVQbGF5ZXIsXHJcbiAgICAgICAgICAgIGdldEltYWdlczogZ2V0SW1hZ2VzLFxyXG4gICAgICAgICAgICBhZGRJbWFnZTogYWRkSW1hZ2UsXHJcbiAgICAgICAgICAgIHJlbW92ZUltYWdlOiByZW1vdmVJbWFnZSxcclxuICAgICAgICAgICAgZ2V0TGlzdEZyb21GaWx0ZXJPcHRpb246IGdldExpc3RGcm9tRmlsdGVyT3B0aW9uLFxyXG4gICAgICAgICAgICBhdHRhY2hDYW1wYWlnbjogYXR0YWNoQ2FtcGFpZ24sXHJcbiAgICAgICAgICAgIGRldGFjaENhbXBhaWduOiBkZXRhY2hDYW1wYWlnbixcclxuICAgICAgICAgICAgZ2V0Q2FtcGFpZ25zOiBnZXRDYW1wYWlnbnMsXHJcbiAgICAgICAgICAgIG1vdmVUb0NhbXBhaWduOiBtb3ZlVG9DYW1wYWlnblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldFBsYXllcnMocGFyYW0pIHtcclxuICAgICAgICAgICAgdmFyIGxpc3QgPSBSZXN0YW5ndWxhci5hbGwoXCJwbGF5ZXJcIikuZ2V0TGlzdChwYXJhbSk7XHJcbiAgICAgICAgICAgIHZhciBjb3VudCA9IFJlc3Rhbmd1bGFyLm9uZShcInBsYXllclwiLCAnY291bnQnKS5nZXQocGFyYW0pO1xyXG4gICAgICAgICAgICByZXR1cm4gJHEuYWxsKFtsaXN0LCBjb3VudF0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IHZhbHVlWzBdO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHNUb3RhbCA9IHZhbHVlWzFdLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHNGaWx0ZXJlZCA9IHJlc3VsdC5yZWNvcmRzVG90YWw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkcS5yZWplY3Qoe2RhdGE6IFtdLCByZWNvcmRzVG90YWw6IDAsIHJlY29yZHNGaWx0ZXJlZDogMH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRQbGF5ZXIoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInBsYXllclwiLCBpZCkuZ2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRBbGwoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJwbGF5ZXJcIikuZ2V0TGlzdCh7XHJcbiAgICAgICAgICAgICAgICBcInBhZ2VbbGltaXRdXCI6IDUwMCxcclxuICAgICAgICAgICAgICAgIFwicGFnZVtvZmZzZXRdXCI6IFwiMFwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2hlY2tQbGF5ZXIoY29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwicGxheWVyXCIpLm9uZSgnY2hlY2stY29kZScsIGNvZGUpLmdldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gYWN0aXZhdGVQbGF5ZXIobW9kZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInBsYXllcj9jb2RlPVwiICsgbW9kZWwuY29kZSArICcmJnR5cGU9JyArIG1vZGVsLnR5cGUpLmN1c3RvbVBVVCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlUGxheWVyKHBsYXllcikge1xyXG4gICAgICAgICAgICB2YXIgY29weVBsYXllciA9IFJlc3Rhbmd1bGFyLmNvcHkocGxheWVyKTtcclxuICAgICAgICAgICAgY29weVBsYXllci50YWdzID0gY29weVBsYXllci50YWdzLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHYuaWQ7XHJcbiAgICAgICAgICAgIH0pLmpvaW4oKTtcclxuICAgICAgICAgICAgaWYgKGNvcHlQbGF5ZXIuZ3BzX3R5cGUgPT0gXCJ1bmtub3duXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvcHlQbGF5ZXIuZ3BzX3R5cGUgPSAnc3RhdGljJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29weVBsYXllci5wdXQoKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUNvZGUoaWQsIGNvZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInBsYXllclwiLCBpZCkucG9zdChcInJlcGxhY2VcIiwge2NvZGU6IGNvZGV9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZVBsYXllcihpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwicGxheWVyXCIsIGlkKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRJbWFnZXMoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInBsYXllclwiLCBpZCkuZ2V0TGlzdChcInBob3Rvc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZEltYWdlKHBsYXllcklkLCBpbWFnZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdEhlbHBlci5zZW5kWGhyUmVxdWVzdChcInBsYXllci9cIiArIHBsYXllcklkICsgXCIvcGhvdG9zXCIsIFwiUE9TVFwiLCBpbWFnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByZW1vdmVJbWFnZShwbGF5ZXJJZCwgaW1hZ2VJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwicGxheWVyXCIsIHBsYXllcklkKS5vbmUoXCJwaG90b3NcIiwgaW1hZ2VJZCkucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gYXR0YWNoQ2FtcGFpZ24ocGxheWVySWQsIGNhbXBhaWduSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInBsYXllclwiLCBwbGF5ZXJJZCkub25lKFwiY2FtcGFpZ25cIiwgY2FtcGFpZ25JZCkuY3VzdG9tUFVUKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBkZXRhY2hDYW1wYWlnbihwbGF5ZXJJZCwgY2FtcGFpZ25JZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwicGxheWVyXCIsIHBsYXllcklkKS5vbmUoXCJjYW1wYWlnblwiLCBjYW1wYWlnbklkKS5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRDYW1wYWlnbnMoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInBsYXllclwiLCBpZCkuZ2V0TGlzdChcImNhbXBhaWduc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG1vdmVUb0NhbXBhaWduKHBsYXllcklkLCBjYW1wYWlnbklkLCBwb3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInBsYXllclwiLCBwbGF5ZXJJZCkub25lKFwiY2FtcGFpZ25cIiwgY2FtcGFpZ25JZCkucG9zdCgnbW92ZS10bycsIHtwb3NpdGlvbjogcG9zfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0TGlzdEZyb21GaWx0ZXJPcHRpb24ob3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbbmFtZV0nXSA9IG9wdGlvbi5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvcHRpb24ucXVhbGl0eSAmJiBvcHRpb24ucXVhbGl0eS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbVsnZmlsdGVyW3ZpZGVvX3F1YWxpdHldJ10gPSBvcHRpb24ucXVhbGl0eS5tYXAoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfSkuam9pbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvcHRpb24udGFncyAmJiBvcHRpb24udGFncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbVsnZmlsdGVyW3RhZ3NdJ10gPSBvcHRpb24udGFncy5tYXAoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5pZDtcclxuICAgICAgICAgICAgICAgIH0pLmpvaW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJhbVsncGFnZVtvZmZzZXRdJ10gPSAwO1xyXG4gICAgICAgICAgICBwYXJhbVsncGFnZVtsaW1pdF0nXSA9IDUwMDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBnZXRQbGF5ZXJzKHBhcmFtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDYuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3Jlc3RIZWxwZXInLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFsnJHEnLCAnQkFTRV9JTkZPJywgJ0F1dGhTZXJ2aWNlJ107XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCRxLCBCQVNFX0lORk8sIEF1dGhTZXJ2aWNlKSB7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzZW5kWGhyUmVxdWVzdDogc2VuZFhoclJlcXVlc3QsXHJcbiAgICAgICAgICAgIGZvcm1hdERhdGU6IGZvcm1hdERhdGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZ1bmN0aW9uIHNlbmRYaHJSZXF1ZXN0KHBhdGgsIG1ldGhvZCwgbW9kZWwpIHtcclxuICAgICAgICAgICAgdmFyIGRlZmVyID0gJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgdmFyIGZkID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBmZC5hcHBlbmQocHJvcGVydHksIG1vZGVsW3Byb3BlcnR5XSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBldmVudC5sZW5ndGhDb21wdXRhYmxlID8gZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwgOiAwO1xyXG4gICAgICAgICAgICAgICAgZGVmZXIubm90aWZ5KHByb2dyZXNzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgeGhyLm9wZW4obWV0aG9kLCBCQVNFX0lORk8uVVJMICsgJy8nICsgcGF0aCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2ZSh7ZGF0YTogYW5ndWxhci5mcm9tSnNvbih4aHIucmVzcG9uc2UpfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVyLnJlamVjdCh7ZGF0YTogYW5ndWxhci5mcm9tSnNvbih4aHIucmVzcG9uc2UpfSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGRlZmVyLnJlamVjdCh7ZGF0YTogYW5ndWxhci5mcm9tSnNvbih4aHIucmVzcG9uc2UpfSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KHtkYXRhOiBhbmd1bGFyLmZyb21Kc29uKHhoci5yZXNwb25zZSl9KVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKEF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0aW9uLnRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyBBdXRoU2VydmljZS5hdXRoZW50aWNhdGlvbi50b2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgeGhyLnNlbmQoZmQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkudXRjKCkuZm9ybWF0KFwiWVlZWS1NTS1ERCBISDptbTpzc1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDguMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3NldHRpbmdzJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkaHR0cFwiLCdCQVNFX0lORk8nLCckcSddO1xyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkaHR0cCxCQVNFX0lORk8sJHEpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaXNBbGxvdz0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcclxuXHJcblxyXG4gICAgICAgICAgICAkaHR0cC5nZXQoIEJBU0VfSU5GTy5VUkwgK1wiL3NldHRpbmdzXCIpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLmRhdGEuc2lnbnVwKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDYuMDYuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgZmFjdG9yeS4kaW5qZWN0ID0gW1wiUmVzdGFuZ3VsYXJcIiwgXCIkcVwiLCBcIkNhY2hlRmFjdG9yeVwiLCBcInJlc3RIZWxwZXJcIiwgXCIkZmlsdGVyXCIsIFwidGltZUhlbHBlclwiLCBcIkF1dGhTZXJ2aWNlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3N0YXRpc3RpY3MnLCBmYWN0b3J5KTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gZmFjdG9yeShSZXN0YW5ndWxhciwgJHEsIENhY2hlRmFjdG9yeSwgcmVzdEhlbHBlciwgJGZpbHRlciwgdGltZUhlbHBlciwgQXV0aFNlcnZpY2UpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgaWYgKCFDYWNoZUZhY3RvcnkuZ2V0KCdzdGF0Q2FjaGUnKSkge1xyXG4gICAgICAgICAgICBDYWNoZUZhY3RvcnkuY3JlYXRlQ2FjaGUoJ3N0YXRDYWNoZScsIHtcclxuICAgICAgICAgICAgICAgIG1heEFnZTogNjAwMDAwLFxyXG4gICAgICAgICAgICAgICAgc3RvcmFnZU1vZGU6ICdsb2NhbFN0b3JhZ2UnLFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlT25FeHBpcmU6ICdhZ2dyZXNzaXZlJyxcclxuICAgICAgICAgICAgICAgIGNhcGFjaXR5OiA2MDBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgY3VycmVudFBsYXllclN0YXRSZXF1ZXN0ID0gW107XHJcblxyXG4gICAgICAgIHZhciBzdGF0Q2FjaGUgPSBDYWNoZUZhY3RvcnkuZ2V0KCdzdGF0Q2FjaGUnKTtcclxuICAgICAgICByZXR1cm4ge1xyXG5cclxuICAgICAgICAgICAgZ2V0U3RhdHNGb3JQbGF5ZXJzOiBnZXRTdGF0c0ZvclBsYXllcnMsXHJcbiAgICAgICAgICAgIGdldFJlcXVlc3RTdGF0c0ZvclBsYXllcnM6IGdldFJlcXVlc3RTdGF0c0ZvclBsYXllcnMsXHJcbiAgICAgICAgICAgIGdldFBsYXllckNvbm5lY3Q6IGdldFBsYXllckNvbm5lY3QsXHJcbiAgICAgICAgICAgIGdldFBsYXllck1vbml0b3I6IGdldFBsYXllck1vbml0b3IsXHJcbiAgICAgICAgICAgIGdldFBsYXllclZpZXdzOiBnZXRQbGF5ZXJWaWV3cyxcclxuICAgICAgICAgICAgZ2V0Rm9yU3VtbWFyeVBsYXllckNoYXJ0OiBnZXRGb3JTdW1tYXJ5UGxheWVyQ2hhcnQsXHJcbiAgICAgICAgICAgIGdldExhc3RQbGF5RXZlbnQ6IGdldExhc3RQbGF5RXZlbnQsXHJcbiAgICAgICAgICAgIGdldExpc3RHcm91cEJ5OiBnZXRMaXN0R3JvdXBCeSxcclxuICAgICAgICAgICAgZ2V0Tm9MYXN0QWN0aXZpdHk6IGdldE5vTGFzdEFjdGl2aXR5LFxyXG4gICAgICAgICAgICBnZXRUb3BQbGF5ZXJWaWV3czogZ2V0VG9wUGxheWVyVmlld3MsXHJcbiAgICAgICAgICAgIGdldERpc3RpbmN0Q29udGVudDogZ2V0RGlzdGluY3RDb250ZW50LFxyXG4gICAgICAgICAgICBnZXRTdGF0c1BsYXllZENvbnRlbnQ6IGdldFN0YXRzUGxheWVkQ29udGVudCxcclxuICAgICAgICAgICAgZ2V0TGlzdEdyb3VwQnlGb3JIb3VyczogZ2V0TGlzdEdyb3VwQnlGb3JIb3Vyc1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRTdGF0c0ZvclBsYXllcnMocGxheWVycywgc3RhcnQsIGVuZCwgZ3JvdXBCeURheSkge1xyXG4gICAgICAgICAgICB2YXIgcmVxdWVzdElkID0gbW9tZW50KCkuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gJHFcclxuICAgICAgICAgICAgICAgIC5hbGwoXHJcbiAgICAgICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGFydFBsYXllckNvbm5lY3QocGxheWVycywgc3RhcnQsIGVuZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldENoYXJ0UGxheWVyVmlld3MocGxheWVycywgc3RhcnQsIGVuZClcclxuICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXF1ZXN0ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiByZXN1bHRbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFswXS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbm5lY3RTdGF0cyA9IE9iamVjdFRvQXJyYXkocmVzdWx0WzBdW3Byb3BdKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3RpbWU6IGl0ZW0udGltZSwgdmFsdWU6IGl0ZW0udmFsdWUuY29ubmVjdH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdTdGF0c0FsbCA9IE9iamVjdFRvQXJyYXkocmVzdWx0WzFdW3Byb3BdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb25pdG9yU3RhdHMgPSB2aWV3U3RhdHNBbGwubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt0aW1lOiBpdGVtLnRpbWUsIHZhbHVlOiBpdGVtLnZhbHVlLm1vbml0b3J9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3c1N0YXRzID0gdmlld1N0YXRzQWxsLm1hcChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7dGltZTogaXRlbS50aW1lLCB2YWx1ZTogaXRlbS52YWx1ZS52aWV3c31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cEJ5RGF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFN0YXRzID0gXy5ncm91cEJ5KGNvbm5lY3RTdGF0cywgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudC51dGMobW9tZW50LnVuaXgoaXRlbS50aW1lKSkubG9jYWwoKS5mb3JtYXQoJ01NREQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yU3RhdHMgPSBfLmdyb3VwQnkobW9uaXRvclN0YXRzLCBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50LnV0Yyhtb21lbnQudW5peChpdGVtLnRpbWUpKS5sb2NhbCgpLmZvcm1hdCgnTU1ERCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdzU3RhdHMgPSBfLmdyb3VwQnkodmlld3NTdGF0cywgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudC51dGMobW9tZW50LnVuaXgoaXRlbS50aW1lKSkubG9jYWwoKS5mb3JtYXQoJ01NREQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RbcHJvcF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdDogY29ubmVjdFN0YXRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3I6IG1vbml0b3JTdGF0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3OiB2aWV3c1N0YXRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZTogcHJvbWlzZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvL3JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRQbGF5ZXJTdGF0UmVxdWVzdCA9IHJlcXVlc3Q7XHJcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0UmVxdWVzdFN0YXRzRm9yUGxheWVycyhyZXF1ZXN0SWQsIHBsYXllcklkKSB7XHJcbiAgICAgICAgICAgIC8qIHJldHVybiByZXF1ZXN0cy5maW5kKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXF1ZXN0SWQgPT09IHJlcXVlc3RJZDtcclxuICAgICAgICAgICAgIH0pKi9cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGxheWVyU3RhdFJlcXVlc3QucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChzdGF0cykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRzW3BsYXllcklkXTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0Q2hhcnRQbGF5ZXJDb25uZWN0KHBsYXllcnMsIHN0YXJ0LCBlbmQpIHtcclxuICAgICAgICAgICAgdmFyIHBhcmFtID0ge307XHJcbiAgICAgICAgICAgIHBhcmFtLmludGVydmFsID0gNjAwO1xyXG4gICAgICAgICAgICBwYXJhbS5zdGFydF90aW1lc3RhbXAgPSBtb21lbnQoc3RhcnQpLnV0YygpLmZsb29yKDEwLCAnbWludXRlcycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICBwYXJhbS5lbmRfdGltZXN0YW1wID0gbW9tZW50KGVuZCkudXRjKCkuZmxvb3IoMTAsICdtaW51dGVzJykuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgIHBhcmFtLnBsYXllcl9pZCA9IHBsYXllcnMuam9pbigpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIuYWxsKFwic3RhdHNcIikud2l0aEh0dHBDb25maWcoe2NhY2hlOiBzdGF0Q2FjaGV9KS5nZXQoXCJjaGFydC1wbGF5ZXItY29ubmVjdHNcIiwgcGFyYW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0Q2hhcnRQbGF5ZXJWaWV3cyhwbGF5ZXJzLCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHt9O1xyXG4gICAgICAgICAgICBwYXJhbS5pbnRlcnZhbCA9IDE4MDA7XHJcbiAgICAgICAgICAgIHBhcmFtLnN0YXJ0X3RpbWVzdGFtcCA9IG1vbWVudChzdGFydCkudXRjKCkuZmxvb3IoMzAsICdtaW51dGVzJykuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgIHBhcmFtLmVuZF90aW1lc3RhbXAgPSBtb21lbnQoZW5kKS51dGMoKS5mbG9vcigzMCwgJ21pbnV0ZXMnKS5mb3JtYXQoKTtcclxuICAgICAgICAgICAgcGFyYW0ucGxheWVyX2lkID0gcGxheWVycy5qb2luKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJzdGF0c1wiKS53aXRoSHR0cENvbmZpZyh7Y2FjaGU6IHN0YXRDYWNoZX0pLmdldChcImNoYXJ0LXBsYXllci12aWV3c1wiLCBwYXJhbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRMaXN0R3JvdXBCeShncm91cEJ5LCBvcHRpb24pIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIHBhcmFtcy5zdGFydF90aW1lc3RhbXAgPSByZXN0SGVscGVyLmZvcm1hdERhdGUob3B0aW9uLnN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgIHBhcmFtcy5lbmRfdGltZXN0YW1wID0gcmVzdEhlbHBlci5mb3JtYXREYXRlKG9wdGlvbi5lbmREYXRlKTtcclxuICAgICAgICAgICAgc3dpdGNoIChncm91cEJ5KSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImhvdXJcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24ucGxheWVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wbGF5ZXJfaWQgPSBvcHRpb24ucGxheWVycy5qb2luKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uY2FtcGFpZ25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhbXBhaWduX2lkID0gb3B0aW9uLmNhbXBhaWducy5qb2luKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uY29udGVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY29udGVudF9pZCA9IG9wdGlvbi5jb250ZW50cy5qb2luKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImNhbXBhaWduXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnBsYXllcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGxheWVyX2lkID0gb3B0aW9uLnBsYXllcnMuam9pbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmNhbXBhaWducy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYW1wYWlnbl9pZCA9IG9wdGlvbi5jYW1wYWlnbnMuam9pbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmNvbnRlbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNvbnRlbnRfaWQgPSBvcHRpb24uY29udGVudHMuam9pbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29udGVudFwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5wbGF5ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnBsYXllcl9pZCA9IG9wdGlvbi5wbGF5ZXJzLmpvaW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5jYW1wYWlnbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2FtcGFpZ25faWQgPSBvcHRpb24uY2FtcGFpZ25zLmpvaW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5jb250ZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jb250ZW50X2lkID0gb3B0aW9uLmNvbnRlbnRzLmpvaW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicGxheWVyXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnBsYXllcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGxheWVyX2lkID0gb3B0aW9uLnBsYXllcnMuam9pbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmNhbXBhaWducy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYW1wYWlnbl9pZCA9IG9wdGlvbi5jYW1wYWlnbnMuam9pbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmNvbnRlbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNvbnRlbnRfaWQgPSBvcHRpb24uY29udGVudHMuam9pbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZ2V0TGlzdEdyb3VwQnlSZWFsKGdyb3VwQnksIHBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnRvdGFsT3JpZ2luID0gaXRlbS50b3RhbDtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnRvdGFsID0gZm9ybWF0TnVtYmVyKGl0ZW0udG90YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2NyZWVuX29uT3JpZ2luID0gaXRlbS5zY3JlZW5fb247XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zY3JlZW5fb24gPSBmb3JtYXROdW1iZXIoaXRlbS5zY3JlZW5fb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2NyZWVuX29mZk9yaWdpbiA9IGl0ZW0uc2NyZWVuX29mZjtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnNjcmVlbl9vZmYgPSBmb3JtYXROdW1iZXIoaXRlbS5zY3JlZW5fb2ZmKTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBheV8kT3JpZ2luID0gaXRlbS5wYXlfJDtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBheV8kID0gZm9ybWF0TnVtYmVyKGl0ZW0ucGF5XyQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGF5X2ZyZWVPcmlnaW4gPSBpdGVtLnBheV9mcmVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGF5X2ZyZWUgPSBmb3JtYXROdW1iZXIoaXRlbS5wYXlfZnJlZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jb3N0T3JpZ2luID0gaXRlbS5jb3N0O1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY29zdCA9IGZvcm1hdE51bWJlcihpdGVtLmNvc3QpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldExpc3RHcm91cEJ5Rm9ySG91cnMoZW50aXR5LCBvcHRpb24sIHNlbGVjdGVkSG91cnMpIHtcclxuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gc2VsZWN0ZWRIb3Vycy5tYXAoZnVuY3Rpb24gKGhvdXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdGVtcE9wdGlvbiA9IGFuZ3VsYXIuY29weShvcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgdGVtcE9wdGlvbi5zdGFydERhdGUgPSBtb21lbnQob3B0aW9uLnN0YXJ0RGF0ZSkuYWRkKGhvdXIsICdob3VycycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgdGVtcE9wdGlvbi5lbmREYXRlID0gbW9tZW50KG9wdGlvbi5zdGFydERhdGUpLmFkZChwYXJzZUludChob3VyKSArIDEsICdob3VycycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldExpc3RHcm91cEJ5KGVudGl0eSwgdGVtcE9wdGlvbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlzID0gcmVzdWx0LnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdmFyIGdyb3Vwc09iaiA9ICRmaWx0ZXIoJ2dyb3VwQnknKShhcnJheXMsICdpZCcpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBncm91cHMgPSBBcnJheS5mcm9tT2JqZWN0KGdyb3Vwc09iaik7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIG1lcmdlZCA9IGdyb3Vwcy5tYXAoZnVuY3Rpb24gKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYS50b3RhbE9yaWdpbiArPSBiLnRvdGFsT3JpZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnRvdGFsID0gZm9ybWF0TnVtYmVyKGEudG90YWxPcmlnaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnNjcmVlbl9vbk9yaWdpbiArPSBiLnNjcmVlbl9vbk9yaWdpbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5zY3JlZW5fb24gPSBmb3JtYXROdW1iZXIoYS5zY3JlZW5fb25PcmlnaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnNjcmVlbl9vZmZPcmlnaW4gKz0gYi5zY3JlZW5fb2ZmT3JpZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnNjcmVlbl9vZmYgPSBmb3JtYXROdW1iZXIoYS5zY3JlZW5fb2ZmT3JpZ2luKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5wYXlfJE9yaWdpbiArPSBiLnBheV8kT3JpZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnBheV8kID0gZm9ybWF0TnVtYmVyKGEucGF5XyRPcmlnaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnBheV9mcmVlT3JpZ2luICs9IGIucGF5X2ZyZWVPcmlnaW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEucGF5X2ZyZWUgPSBmb3JtYXROdW1iZXIoYS5wYXlfZnJlZU9yaWdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEuY29zdE9yaWdpbiArPSBiLmNvc3RPcmlnaW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEuY29zdCA9IGZvcm1hdE51bWJlcihhLmNvc3RPcmlnaW4pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDtcclxuXHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdE51bWJlcihudW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuICRmaWx0ZXIoJ251bWJlcicpKG51bWJlciwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRMaXN0R3JvdXBCeVJlYWwoZ3JvdXBCeSwgb3B0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwic3RhdHNcIikuZ2V0TGlzdChncm91cEJ5LCBvcHRpb24pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogaXRlbS5ncm91cGluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogaXRlbS5ub19zY3JlZW5fdmlld3MgKyBpdGVtLnZpZXdzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5fb246IGl0ZW0udmlld3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbl9vZmY6IGl0ZW0ubm9fc2NyZWVuX3ZpZXdzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlfJDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5X2ZyZWU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvc3Q6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWQ6IGl0ZW0uZGVsZXRlZFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRGb3JTdW1tYXJ5UGxheWVyQ2hhcnQocGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuICRxLmFsbChcclxuICAgICAgICAgICAgICAgIFtnZXRQbGF5ZXJDb25uZWN0KHBhcmFtKSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRQbGF5ZXJNb25pdG9yKHBhcmFtKSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRQbGF5ZXJWaWV3cyhwYXJhbSldXHJcbiAgICAgICAgICAgICkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Q6IHJlc3VsdFswXSxcclxuICAgICAgICAgICAgICAgICAgICBtb25pdG9yOiByZXN1bHRbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgdmlld3M6IHJlc3VsdFsyXVxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldFBsYXllckNvbm5lY3QocGFyYW0pIHtcclxuXHJcbiAgICAgICAgICAgIHBhcmFtLmludGVydmFsID0gNjAwO1xyXG5cclxuICAgICAgICAgICAgcGFyYW0uc3RhcnRfdGltZXN0YW1wID0gbW9tZW50KHBhcmFtLnN0YXJ0X3RpbWVzdGFtcCkudXRjKCkuZmxvb3IoMTAsICdtaW51dGVzJykuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgIHBhcmFtLmVuZF90aW1lc3RhbXAgPSBtb21lbnQocGFyYW0uZW5kX3RpbWVzdGFtcCkudXRjKCkuZmxvb3IoMTAsICdtaW51dGVzJykuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJzdGF0c1wiKS53aXRoSHR0cENvbmZpZyh7Y2FjaGU6IHN0YXRDYWNoZX0pLmdldChcImNoYXJ0LWNvbm5lY3RcIiwgcGFyYW0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdFRvQXJyYXkocmVzdWx0LnBsYWluKCkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldFBsYXllck1vbml0b3IocGFyYW0pIHtcclxuICAgICAgICAgICAgcGFyYW0uaW50ZXJ2YWwgPSA2MDA7XHJcbiAgICAgICAgICAgIHBhcmFtLnN0YXJ0X3RpbWVzdGFtcCA9IG1vbWVudChwYXJhbS5zdGFydF90aW1lc3RhbXApLnV0YygpLmZsb29yKDEwLCAnbWludXRlcycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICBwYXJhbS5lbmRfdGltZXN0YW1wID0gbW9tZW50KHBhcmFtLmVuZF90aW1lc3RhbXApLnV0YygpLmZsb29yKDEwLCAnbWludXRlcycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIuYWxsKFwic3RhdHNcIikud2l0aEh0dHBDb25maWcoe2NhY2hlOiBzdGF0Q2FjaGV9KS5nZXQoXCJjaGFydC1tb25pdG9yXCIsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3RUb0FycmF5KHJlc3VsdC5wbGFpbigpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRQbGF5ZXJWaWV3cyhwYXJhbSkge1xyXG4gICAgICAgICAgICBwYXJhbS5pbnRlcnZhbCA9IDE4MDA7XHJcbiAgICAgICAgICAgIHBhcmFtLnN0YXJ0X3RpbWVzdGFtcCA9IG1vbWVudChwYXJhbS5zdGFydF90aW1lc3RhbXApLnV0YygpLmZsb29yKDMwLCAnbWludXRlcycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICBwYXJhbS5lbmRfdGltZXN0YW1wID0gbW9tZW50KHBhcmFtLmVuZF90aW1lc3RhbXApLnV0YygpLmZsb29yKDMwLCAnbWludXRlcycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIuYWxsKFwic3RhdHNcIikud2l0aEh0dHBDb25maWcoe2NhY2hlOiBzdGF0Q2FjaGV9KS5nZXQoXCJjaGFydC12aWV3c1wiLCBwYXJhbSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0VG9BcnJheShyZXN1bHQucGxhaW4oKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldExhc3RQbGF5RXZlbnQocGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLmFsbChcInN0YXRzXCIpLmdldChcImxhc3QtcGxheS1ldmVudHNcIiwgcGFyYW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0U3RhdHNQbGF5ZWRDb250ZW50KHBhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJzdGF0c1wiKS5nZXQoXCJwbGF5ZWQtY29udGVudFwiLCBwYXJhbSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0Tm9MYXN0QWN0aXZpdHkoKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHt9O1xyXG4gICAgICAgICAgICBwYXJhbS51c2VySWQgPSBBdXRoU2VydmljZS5hdXRoZW50aWNhdGlvbi51c2VySWQ7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJzdGF0c1wiKS53aXRoSHR0cENvbmZpZyh7Y2FjaGU6IHN0YXRDYWNoZX0pLmdldChcIm5vLWxhc3QtYWN0aXZpdHlcIiwgcGFyYW0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHN0YXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0LnZhbHVlID0gdGltZUhlbHBlci5nZXREdXJhdGlvbkZyb21TZWNvbmRzKHN0YXQuZnJvbUxhdGVzdEFjdGl2aXR5KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRUb3BQbGF5ZXJWaWV3cygpIHtcclxuICAgICAgICAgICAgdmFyIHBhcmFtID0ge307XHJcbiAgICAgICAgICAgIHBhcmFtLnVzZXJJZCA9IEF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0aW9uLnVzZXJJZDtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLmFsbChcInN0YXRzXCIpLndpdGhIdHRwQ29uZmlnKHtjYWNoZTogc3RhdENhY2hlfSkuZ2V0KFwidG9wLXBsYXllcnMtdmlld3NcIiwgcGFyYW0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHN0YXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0LnZhbHVlID0gc3RhdC52aWV3cztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBPYmplY3RUb0FycmF5KG9iamVjdCkge1xyXG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogcHJvcCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9iamVjdFtwcm9wXVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnJheVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldERpc3RpbmN0Q29udGVudChzdGFydERhdGUsIGVuZERhdGUsIGdyb3VwVHlwZSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHBhcmFtID0ge307XHJcbiAgICAgICAgICAgIHBhcmFtLnN0YXJ0X3RpbWVzdGFtcCA9IG1vbWVudChzdGFydERhdGUpLnV0YygpLmZsb29yKDEsICdob3VycycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICBwYXJhbS5lbmRfdGltZXN0YW1wID0gbW9tZW50KGVuZERhdGUpLnV0YygpLmZsb29yKDEsICdob3VycycpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICBwYXJhbS5ncm91cF9ieSA9IGdyb3VwVHlwZTtcclxuICAgICAgICAgICAgcGFyYW0udXNlcklkID0gQXV0aFNlcnZpY2UuYXV0aGVudGljYXRpb24udXNlcklkO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIuYWxsKFwic3RhdHNcIikud2l0aEh0dHBDb25maWcoe2NhY2hlOiBzdGF0Q2FjaGV9KS5nZXQoXCJkaXN0aW5jdC1jb250ZW50XCIsIHBhcmFtKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmFuZChtaW4sIG1heCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3RhYmxlSGVscGVyJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbJ2xvY2FsZScsICdEVENvbHVtbkRlZkJ1aWxkZXInLCAnRFRPcHRpb25zQnVpbGRlciddO1xyXG4gICAgZnVuY3Rpb24gc2VydmljZShsb2NhbGUsIERUQ29sdW1uRGVmQnVpbGRlciwgRFRPcHRpb25zQnVpbGRlcikge1xyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd3JhcExpc3Q6IHdyYXBMaXN0LFxyXG4gICAgICAgICAgICBnZXRFbXB0eUxpc3Q6Z2V0RW1wdHlMaXN0LFxyXG4gICAgICAgICAgICBnZXRPcHRpb25zRm9yQW5ndWxhcldheVRhYmxlOiBnZXRPcHRpb25zRm9yQW5ndWxhcldheVRhYmxlLFxyXG4gICAgICAgICAgICBnZXRGdW5jdGlvbkZvclNlbGVjdGVkVGFibGU6IGdldEZ1bmN0aW9uRm9yU2VsZWN0ZWRUYWJsZVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiB3cmFwTGlzdChsaXN0KSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBsaXN0O1xyXG4gICAgICAgICAgICByZXN1bHQucmVjb3Jkc1RvdGFsID0gbGlzdC5sZW5ndGg7XHJcbiAgICAgICAgICAgIHJlc3VsdC5yZWNvcmRzRmlsdGVyZWQgPSBsaXN0Lmxlbmd0aDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0RW1wdHlMaXN0KCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gW107XHJcbiAgICAgICAgICAgIHJlc3VsdC5yZWNvcmRzVG90YWwgPSAwO1xyXG4gICAgICAgICAgICByZXN1bHQucmVjb3Jkc0ZpbHRlcmVkID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldE9wdGlvbnNGb3JBbmd1bGFyV2F5VGFibGUoY29sdW1ucykge1xyXG4gICAgICAgICAgICB2YXIgZHRPcHRpb25zID1cclxuICAgICAgICAgICAgICAgIERUT3B0aW9uc0J1aWxkZXJcclxuICAgICAgICAgICAgICAgICAgICAubmV3T3B0aW9ucygpXHJcbiAgICAgICAgICAgICAgICAgICAgLndpdGhPcHRpb24oJ3BhZ2luZycsIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIC53aXRoT3B0aW9uKFwic2VhcmNoaW5nXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIC53aXRoT3B0aW9uKFwiaW5mb1wiLCBmYWxzZSk7XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKGxvY2FsZS5nZXRMb2NhbGUoKSA9PSAncnUnKSB7XHJcbiAgICAgICAgICAgICAgICBkdE9wdGlvbnMud2l0aExhbmd1YWdlU291cmNlKCcvL2Nkbi5kYXRhdGFibGVzLm5ldC9wbHVnLWlucy8xLjEwLjkvaTE4bi9SdXNzaWFuLmpzb24nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGR0Q29sdW1uRGVmcyA9IGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4sIGluZGV4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGRlZkNvbHVtbiA9IERUQ29sdW1uRGVmQnVpbGRlci5uZXdDb2x1bW5EZWYoaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZDb2x1bW4gPSBkZWZDb2x1bW4ubm90U29ydGFibGUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZkNvbHVtbjtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtkdE9wdGlvbnM6IGR0T3B0aW9ucywgZHRDb2x1bW5EZWZzOiBkdENvbHVtbkRlZnN9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0RnVuY3Rpb25Gb3JTZWxlY3RlZFRhYmxlKGNhbGxiYWNrLCBzZWxlY3RlZEl0ZW1zKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0b2dnbGVBbGw6IHRvZ2dsZUFsbCxcclxuICAgICAgICAgICAgICAgIHRvZ2dsZU9uZTogdG9nZ2xlT25lLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RBbnk6IGlzU2VsZWN0QW55XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBpc1NlbGVjdEFueSgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RBbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHAgaW4gc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KHApICYmIHNlbGVjdGVkSXRlbXNbcF0gPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHRvZ2dsZUFsbChzZWxlY3RWYWwpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdEFsbCA9IHNlbGVjdFZhbDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc1tpZF0gPSBzZWxlY3RWYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb25TZWxlY3RlZChzZWxlY3RlZEl0ZW1zKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gdG9nZ2xlT25lKCkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkSXRlbXNbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0ZWQoc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgb25TZWxlY3RlZChzZWxlY3RlZEl0ZW1zKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uU2VsZWN0ZWQoc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gW107XHJcbiAgICAgICAgICAgICAgICB2YXIgYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgc2VsZWN0ZWRJdGVtc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQucHVzaChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxlY3RlZCwgc2VsZWN0QWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCd0YWdzU2VydmljZScsIGZhY3RvcnkpXHJcblxyXG4gICAgZmFjdG9yeS4kaW5qZWN0ID0gW1wiUmVzdGFuZ3VsYXJcIiwgXCIkcVwiXTtcclxuICAgIGZ1bmN0aW9uIGZhY3RvcnkoUmVzdGFuZ3VsYXIsICRxKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGdldFBsYXllcnNUYWdzOiBnZXRQbGF5ZXJzVGFncyxcclxuICAgICAgICAgICAgYWRkUGxheWVyVGFnOiBhZGRQbGF5ZXJUYWcsXHJcbiAgICAgICAgICAgIGdldENvbnRlbnRUYWdzOiBnZXRDb250ZW50VGFncyxcclxuICAgICAgICAgICAgYWRkQ29udGVudFRhZzogYWRkQ29udGVudFRhZyxcclxuICAgICAgICAgICAgZ2V0VGFnc0J1eVR5cGU6IGdldFRhZ3NCdXlUeXBlLFxyXG4gICAgICAgICAgICBhZGRUYWdzQnV5VHlwZTogYWRkVGFnc0J1eVR5cGUsXHJcbiAgICAgICAgICAgIHJlbW92ZVRhZzogcmVtb3ZlVGFnXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmdW5jdGlvbiBnZXRQbGF5ZXJzVGFncygpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldFRhZ3NCdXlUeXBlKCdwbGF5ZXInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZFBsYXllclRhZyh2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWRkVGFnc0J1eVR5cGUodmFsdWUsICdwbGF5ZXInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldENvbnRlbnRUYWdzKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0VGFnc0J1eVR5cGUoJ2NvbnRlbnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZENvbnRlbnRUYWcodmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFkZFRhZ3NCdXlUeXBlKHZhbHVlLCAnY29udGVudCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0VGFnc0J1eVR5cGUodHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIuYWxsKFwidGFnXCIpLmdldExpc3Qoe3R5cGU6IHR5cGV9KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBhZGRUYWdzQnV5VHlwZSh2YWx1ZSwgdHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIuYWxsKFwidGFnXCIpLnBvc3Qoe25hbWU6IHZhbHVlLCB0eXBlOiB0eXBlfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByZW1vdmVUYWcodGFnKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGFnLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG59KSgpO1xyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMC4wNy4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCJsb2NhbGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuc2VydmljZSgndGltZUhlbHBlcicsIHNlcnZpY2UpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKGxvY2FsZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0RHVyYXRpb25Gcm9tU2Vjb25kczogZ2V0RHVyYXRpb25Gcm9tU2Vjb25kc1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXREdXJhdGlvbkZyb21TZWNvbmRzKHNlY29uZHMpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBkaW0gPSB7fTtcclxuICAgICAgICAgICAgc3dpdGNoIChsb2NhbGUuZ2V0TG9jYWxlKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3J1Jzoge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpbSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiBcItC80LXRgS5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF5czogXCIg0LTQvS5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnM6IFwi0YcuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZXM6IFwi0LzQuNC9LlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgXCJlblwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGltID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aHM6IFwibVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXlzOiBcImRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnM6IFwiaFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzOiBcIm1cIlxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgZHIgPSBtb21lbnQuZHVyYXRpb24oc2Vjb25kcywgXCJzZWNvbmRzXCIpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgICAgICAgdmFyIHByZXY9XCJcIjtcclxuICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBkaW0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaW0uaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJbcHJvcF0oKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID49MiYmcHJvcCE9J2hvdXJzJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRyW3Byb3BdKCkgKyBkaW1bcHJvcF0gKyBcIixcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCd0aW1lVGFyZ2V0aW5nJywgZmFjdG9yeSlcclxuXHJcbiAgICBmYWN0b3J5LiRpbmplY3QgPSBbXCJSZXN0YW5ndWxhclwiIF07XHJcbiAgICBmdW5jdGlvbiBmYWN0b3J5KFJlc3Rhbmd1bGFyKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZVRpbWVUYXJnZXRpbmc6IGNyZWF0ZVRpbWVUYXJnZXRpbmcsXHJcbiAgICAgICAgICAgIHVwZGF0ZVRpbWVUYXJnZXRpbmc6IHVwZGF0ZVRpbWVUYXJnZXRpbmcsXHJcbiAgICAgICAgICAgIGdldFRpbWVUYXJnZXRpbmc6IGdldFRpbWVUYXJnZXRpbmdcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVRpbWVUYXJnZXRpbmcodGltZVRhcmdldGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIuYWxsKCd0aW1lLXRhcmdldGluZycpLnBvc3QodGltZVRhcmdldGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZ1bmN0aW9uIGdldFRpbWVUYXJnZXRpbmcoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZSgndGltZS10YXJnZXRpbmcnLGlkKS5nZXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlVGltZVRhcmdldGluZyh0aW1lVGFyZ2V0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aW1lVGFyZ2V0aW5nLnB1dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgXHJcblxyXG4gICAgfVxyXG59KSgpO1xyXG4iLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGZhY3RvcnkuJGluamVjdCA9IFtcIlJlc3Rhbmd1bGFyXCIsIFwiQXV0aFNlcnZpY2VcIiwgXCJyZXN0SGVscGVyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3VzZXInLCBmYWN0b3J5KTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gZmFjdG9yeShSZXN0YW5ndWxhciwgQXV0aFNlcnZpY2UsIHJlc3RIZWxwZXIpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciBkYXRhID0ge1xyXG4gICAgICAgICAgICB1c2VyOiB7fVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGdldEN1cnJlbnRVc2VyOiBnZXRDdXJyZW50VXNlcixcclxuICAgICAgICAgICAgdXBkYXRlOiB1cGRhdGUsXHJcbiAgICAgICAgICAgIHVwZGF0ZVhocjogdXBkYXRlWGhyLFxyXG4gICAgICAgICAgICBjaGFuZ2VQYXNzd29yZDogY2hhbmdlUGFzc3dvcmQsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmdW5jdGlvbiBnZXRDdXJyZW50VXNlcigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZSgndXNlcicsIEF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0aW9uLnVzZXJJZCkuZ2V0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLnVzZXIgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSh1c2VyKSB7XHJcbiAgICAgICAgICAgIHVzZXIgPSBSZXN0YW5ndWxhci5jb3B5KHVzZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKCd1c2VyJykucG9zdCgndXBkYXRlJyx1c2VyLnBsYWluKCkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZGF0YS51c2VyID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVYaHIodXNlcikge1xyXG4gICAgICAgICAgICB2YXIgcGxhaW5Vc2VyID0gIChSZXN0YW5ndWxhci5jb3B5KHVzZXIpKS5wbGFpbigpO1xyXG4gICAgICAgICAgICBwbGFpblVzZXIuYnJhbmRfYmFja2dyb3VuZCA9IHVzZXIuYnJhbmRfYmFja2dyb3VuZDtcclxuICAgICAgICAgICAgICAgICAgICAgICBwbGFpblVzZXIuYnJhbmRfbG9nbyA9IHVzZXIuYnJhbmRfbG9nbztcclxuICAgICAgICAgICAgcGxhaW5Vc2VyLmJyYW5kX2JhY2tncm91bmRfc2Vjb25kX3NjcmVlbiA9IHVzZXIuYnJhbmRfYmFja2dyb3VuZF9zZWNvbmRfc2NyZWVuO1xyXG4gICAgICAgICAgICBwbGFpblVzZXIuYnJhbmRfbG9nb19zZWNvbmRfc2NyZWVuID0gdXNlci5icmFuZF9sb2dvX3NlY29uZF9zY3JlZW47XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdEhlbHBlci5zZW5kWGhyUmVxdWVzdChcInVzZXIvdXBkYXRlXCIsIFwiUE9TVFwiLCBwbGFpblVzZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2hhbmdlUGFzc3dvcmQobW9kZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZSgndXNlcicpLnBvc3QoJ3Bhc3N3b3JkJywgbW9kZWwpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIyLjA0LjIwMTYuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNC4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3ZpcnR1YWxTY3JlZW5zJywgZmFjdG9yeSlcclxuXHJcbiAgICBmYWN0b3J5LiRpbmplY3QgPSBbXCJSZXN0YW5ndWxhclwiLCBcIiRxXCJdO1xyXG4gICAgZnVuY3Rpb24gZmFjdG9yeShSZXN0YW5ndWxhciwgJHEpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0VmlydHVhbFNjcmVlbkFsbDogZ2V0VmlydHVhbFNjcmVlbkFsbCxcclxuICAgICAgICAgICAgY3JlYXRlVmlydHVhbFNjcmVlbjogY3JlYXRlVmlydHVhbFNjcmVlbixcclxuICAgICAgICAgICAgYXR0YWNoUGxheWVyOiBhdHRhY2hQbGF5ZXIsXHJcbiAgICAgICAgICAgIGFkZDogY3JlYXRlVmlydHVhbFNjcmVlbixcclxuICAgICAgICAgICAgZ2V0OiBnZXQsXHJcbiAgICAgICAgICAgIGdldExpc3Q6IGdldExpc3QsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogdXBkYXRlLFxyXG4gICAgICAgICAgICByZW1vdmU6IHJlbW92ZSxcclxuICAgICAgICAgICAgZ2V0UGxheWVyczogZ2V0UGxheWVycyxcclxuICAgICAgICAgICAgZ2V0QXJlYXM6IGdldEFyZWFzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0VmlydHVhbFNjcmVlbkFsbCgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICAgUmVzdGFuZ3VsYXIuYWxsKFwidmlydHVhbC1zY3JlZW5cIikuZ2V0TGlzdCh7XHJcbiAgICAgICAgICAgICAgICBcInBhZ2VbbGltaXRdXCI6IDEwMCxcclxuICAgICAgICAgICAgICAgIFwicGFnZVtvZmZzZXRdXCI6IFwiMFwiLFxyXG4gICAgICAgICAgICAgICAgXCJmaWx0ZXJbdHlwZV1cIjogXCJzaGFyZWRcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBhdHRhY2hQbGF5ZXIoaWQsc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc3Rhbmd1bGFyLm9uZShcInZpcnR1YWwtc2NyZWVuXCIsIGlkKS5wb3N0KFwicGxheWVyc1wiLHtwbGF5ZXJfaWRzOnNlbGVjdGVkLmpvaW4oKX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5vbmUoXCJ2aXJ0dWFsLXNjcmVlblwiLGlkKS5nZXQoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRMaXN0KHBhcmFtKSB7XHJcbiAgICAgICAgICAgIHZhciBsaXN0ID0gUmVzdGFuZ3VsYXIuYWxsKFwidmlydHVhbC1zY3JlZW5cIikuZ2V0TGlzdChwYXJhbSk7XHJcbiAgICAgICAgICAgIHZhciBjb3VudCA9IFJlc3Rhbmd1bGFyLm9uZShcInZpcnR1YWwtc2NyZWVuXCIsICdjb3VudCcpLmdldChwYXJhbSk7XHJcbiAgICAgICAgICAgIHJldHVybiAkcS5hbGwoW2xpc3QsIGNvdW50XSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gdmFsdWVbMF07XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVjb3Jkc1RvdGFsID0gdmFsdWVbMV0udG90YWw7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVjb3Jkc0ZpbHRlcmVkID0gcmVzdWx0LnJlY29yZHNUb3RhbDtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICRxLnJlamVjdCh7ZGF0YTogW10sIHJlY29yZHNUb3RhbDogMCwgcmVjb3Jkc0ZpbHRlcmVkOiAwfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVWaXJ0dWFsU2NyZWVuKHBhcmFtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXN0YW5ndWxhci5hbGwoXCJ2aXJ0dWFsLXNjcmVlblwiKS5wb3N0KHBhcmFtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZShpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwidmlydHVhbC1zY3JlZW5cIiwgaWQpLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKG1vZGVsKSB7XHJcbiAgICAgICAgICAgIHZhciBjb3B5TW9kZWwgPVJlc3Rhbmd1bGFyLmNvcHkobW9kZWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gIGNvcHlNb2RlbC5wdXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0UGxheWVycyhpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwidmlydHVhbC1zY3JlZW5cIiwgaWQpLmdldExpc3QoXCJwbGF5ZXJzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiBnZXRBcmVhcyhpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzdGFuZ3VsYXIub25lKFwidmlydHVhbC1zY3JlZW5cIiwgaWQpLmdldExpc3QoXCJhcmVhc1wiKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5hdXRoXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoXCJDb25maXJtRW1haWxDb250cm9sbGVyXCIsIGNvbnRyb2xsZXIpO1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHN0YXRlUGFyYW1zJywgJ0F1dGhTZXJ2aWNlJywgJyRzdGF0ZScsICdub3RpZmljYXRpb25TZXJ2aWNlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkc3RhdGVQYXJhbXMsIEF1dGhTZXJ2aWNlLCAkc3RhdGUsIG5vdGlmaWNhdGlvblNlcnZpY2UpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnN1Y2Nlc0NvbmZpcm0gPSBmYWxzZTtcclxuICAgICAgICB2bS5za2lwRm9ybSA9ICRzdGF0ZVBhcmFtcy5rZXkgIT0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHZtLmNvbmZpcm1Gb3JtID0gZnVuY3Rpb24gKGZvcm0sIGtleSkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZm9ybS4kdmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmNvbmZpcm0oa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY29uZmlybSA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgQXV0aFNlcnZpY2UuY29uZmlybUVtYWlsKHtjb2RlOiBrZXl9KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc0NvbmZpcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93TWVzc2FnZShcImF1dGguU3VjY2Vzc0NvbmZpcm1Db2RlUmVnaXN0cmF0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgJHN0YXRlLmdvKCdwZXJzb25hbEFjY291bnQuaG9tZScpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PTUwMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignY29tbW9uLkludGVybmFsU2VydmVyRXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcihcImF1dGguSW5jb3JyZWN0Q29kZVJlZ2lzdHJhdGlvblwiKTtcclxuICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc0NvbmZpcm0gPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2bS5za2lwRm9ybSkge1xyXG4gICAgICAgICAgICB2bS5jb25maXJtKCRzdGF0ZVBhcmFtcy5rZXkpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfTtcclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTMuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmF1dGhcIilcclxuICAgICAgICAuY29udHJvbGxlcihcIkxvY2tDb250cm9sbGVyXCIsIGNvbnRyb2xsZXIpO1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFsgJ0F1dGhTZXJ2aWNlJywgJyRzdGF0ZScsICdub3RpZmljYXRpb25TZXJ2aWNlJyxcInVzZXJcIl07XHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcihBdXRoU2VydmljZSwgJHN0YXRlLCBub3RpZmljYXRpb25TZXJ2aWNlLHVzZXIpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID10aGlzO1xyXG4gICAgICAgIHVzZXIuZ2V0Q3VycmVudFVzZXIoKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgdm0udXNlciA9IHJlc3BvbnNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS51bmxvY2sgPSBmdW5jdGlvbihmb3JtKXtcclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZvcm0uJHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2dpbkxvYWRpbmcgPXRydWU7XHJcbiAgICAgICAgICAgICAgICBBdXRoU2VydmljZS51bmxvY2soe2VtYWlsOnZtLnVzZXIuZW1haWwscGFzc3dvcmQ6IHZtLnBhc3N3b3JkfSkudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmxvZ2luTG9hZGluZyA9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgJHN0YXRlLmdvKFwicGVyc29uYWxBY2NvdW50LmhvbWVcIilcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmxvZ2luTG9hZGluZyA9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBmb3JtKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFswXSE9JyQnJiYgZm9ybVtwcm9wXS5zZXJ2ZXJNZXNzYWdlICE9XCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVtwcm9wXS5zZXJ2ZXJNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzID09NTAwKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ2NvbW1vbi5JbnRlcm5hbFNlcnZlckVycm9yJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiggcmVzcG9uc2UuZGF0YS5lcnJvcil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmVycm9yID0gcmVzcG9uc2UuZGF0YS5lcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZXJyb3IgPVwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1bcHJvcF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1bcHJvcF0uc2VydmVyTWVzc2FnZSA9IHJlc3BvbnNlLmRhdGFbcHJvcF1bMF1bbG9jYWxlLmdldExvY2FsZSgpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9O1xyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiQXV0aFNlcnZpY2VcIiwgXCIkc3RhdGVcIiwgXCIkc3RhdGVQYXJhbXNcIiwgXCJub3RpZmljYXRpb25TZXJ2aWNlXCIsIFwiZXJyb3JIYW5kbGVySGVscGVyXCIsIFwiJHN0YXRlUGFyYW1zXCIsIFwibG9jYWxlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYXV0aFwiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKFwiTG9naW5Db250cm9sbGVyXCIsIGNvbnRyb2xsZXIpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKEF1dGhTZXJ2aWNlLCAkc3RhdGUsICRzdGF0ZVBhcmFtcywgbm90aWZpY2F0aW9uU2VydmljZSwgZXJyb3JIYW5kbGVySGVscGVyLCAkc3RhdGVQYXJhbXMsIGxvY2FsZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnVzZXIgPSB7fTtcclxuICAgICAgICB2bS51c2VyLnJlbWVtYmVyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCRzdGF0ZVBhcmFtcy5kaXNhYmxlUmVnaXN0cmF0aW9uID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1dhcm5pbmcoJ2F1dGguRGlzYWJsZVJlZ2lzdHJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgkc3RhdGVQYXJhbXMubGFuZykge1xyXG4gICAgICAgICAgICBsb2NhbGUuc2V0TG9jYWxlKCRzdGF0ZVBhcmFtcy5sYW5nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLnNpZ25JbiA9IGZ1bmN0aW9uIChmb3JtKSB7XHJcbiAgICAgICAgICAgIHZtLnN1Ym1pdHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLiR2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9naW5Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIEF1dGhTZXJ2aWNlLnNpZ25Jbih2bS51c2VyKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sb2dpbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIubGlzdCcpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9naW5Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVySGVscGVyLmhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2UsIGZvcm0sIHZtKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA3LjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcIiRzdGF0ZVBhcmFtc1wiLCBcIkF1dGhTZXJ2aWNlXCIsIFwiJHN0YXRlXCIsIFwibm90aWZpY2F0aW9uU2VydmljZVwiLCBcIiR0aW1lb3V0XCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYXV0aFwiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKFwiTG9naW5FeHRlcm5hbENvbnRyb2xsZXJcIiwgY29udHJvbGxlcik7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHN0YXRlUGFyYW1zLCBBdXRoU2VydmljZSwgJHN0YXRlLCBub3RpZmljYXRpb25TZXJ2aWNlLCR0aW1lb3V0KSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbG9naW5FeHRlcm5hbCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBsb2dpbkV4dGVybmFsKCkge1xyXG4gICAgICAgICAgICBBdXRoU2VydmljZS5sb2dpbkV4dGVybmFsKCRzdGF0ZVBhcmFtcy50b2tlbiwgJHN0YXRlUGFyYW1zLnVzZXJJZCwgJHN0YXRlUGFyYW1zLnJlbWVtYmVyKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc0NvbmZpcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93TWVzc2FnZShcImF1dGguU3VjY2Vzc0V4dGVybmFsTG9naW5cIik7XHJcbiAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIubGlzdCcpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gNTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ2NvbW1vbi5JbnRlcm5hbFNlcnZlckVycm9yJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoXCJhdXRoLkluY29ycmVjdENvZGVSZWdpc3RyYXRpb25cIik7XHJcbiAgICAgICAgICAgICAgICB2bS5zdWNjZXNDb25maXJtID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbXCJBdXRoU2VydmljZVwiLCBcIiR3aW5kb3dcIiwgXCIkdGltZW91dFwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmF1dGhcIilcclxuICAgICAgICAuY29udHJvbGxlcihcIkxvZ291dENvbnRyb2xsZXJcIiwgY29udHJvbGxlcik7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoQXV0aFNlcnZpY2UsJHdpbmRvdywkdGltZW91dCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgQXV0aFNlcnZpY2Uuc2lnbk91dEV4dGVybmFsKCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkd2luZG93LmxvY2F0aW9uLmhyZWY9XCJodHRwczovL3RlbGVkcy5jb20vXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgfTtcclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYXV0aFwiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKFwiUmVtZW1iZXJQYXNzd29yZENoYW5nZUNvbnRyb2xsZXJcIiwgY29udHJvbGxlcik7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gWyckc3RhdGVQYXJhbXMnLCAnQXV0aFNlcnZpY2UnLCAnJHN0YXRlJywgJ25vdGlmaWNhdGlvblNlcnZpY2UnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKCRzdGF0ZVBhcmFtcywgQXV0aFNlcnZpY2UsICRzdGF0ZSwgbm90aWZpY2F0aW9uU2VydmljZSkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnN1Y2Nlc0NvbmZpcm0gPSBmYWxzZTtcclxuXHJcbiAgICBcclxuICAgICAgICB2bS5jaGFuZ2VQYXNzd29yZCA9IGZ1bmN0aW9uIChmb3JtKSB7XHJcblxyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPXRydWU7XHJcbiAgICAgICAgICAgIGlmKGZvcm0uJHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID10cnVlO1xyXG4gICAgICAgICAgICAgICAgdm0uZGF0YS5jb2RlID0gJHN0YXRlUGFyYW1zLmtleTtcclxuICAgICAgICAgICAgICAgIEF1dGhTZXJ2aWNlLnJlc2V0UGFzc3dvcmQodm0uZGF0YSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc3VjY2VzQ29uZmlybSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93TWVzc2FnZSgnYXV0aC5TdWNjZXNzQ2hhbmdlUGFzc3dvcmQnKTtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5ob21lJyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID1mYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXMgPT01MDApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignY29tbW9uLkludGVybmFsU2VydmVyRXJyb3InKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKFwiYXV0aC5JbmNvcnJlY3RDb2RlUmVnaXN0cmF0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc0NvbmZpcm0gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9O1xyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5hdXRoXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoXCJSZW1lbWJlclBhc3N3b3JkUmVxdWVzdENvbnRyb2xsZXJcIiwgY29udHJvbGxlcik7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiQXV0aFNlcnZpY2VcIl07XHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcihBdXRoU2VydmljZSkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnN1Y2Nlc1JlcXVlc3QgPSBmYWxzZTtcclxuICAgICAgICB2bS5sYW5nID0gXCJlblwiO1xyXG4gICAgICAgIHZtLnJlbWVtYmVyUGFzc3dvcmRSZXF1ZXN0PSBmdW5jdGlvbiAoZm9ybSkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZihmb3JtLiR2YWxpZCl7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nPXRydWU7XHJcbiAgICAgICAgICAgICAgICBBdXRoU2VydmljZS5yZW1lbWJlclBhc3N3b3JkUmVxdWVzdCh7ZW1haWw6dm0uZW1haWx9KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc1JlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZz1mYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBmb3JtKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFswXSE9JyQnJiYgZm9ybVtwcm9wXS5zZXJ2ZXJNZXNzYWdlICE9XCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVtwcm9wXS5zZXJ2ZXJNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXMgPT01MDApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignY29tbW9uLkludGVybmFsU2VydmVyRXJyb3InKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihwcm9wIGluIHJlc3BvbnNlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtW3Byb3BdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtW3Byb3BdLnNlcnZlck1lc3NhZ2UgPSByZXNwb25zZS5kYXRhW3Byb3BdWzBdW3ZtLmxhbmcgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxudmFyIHByaXZhdGVTZXJ2aWNlRm9yRXh0ZXJuYWw9bnVsbDtcclxudmFyIGZyYW1lTG9hZGVkID0gZmFsc2U7XHJcbnZhciBmcmFtZUxvYWRlZCRxID1udWxsO1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICB2YXIgYXV0aFNlcnZpY2UgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGF1dGhTZXJ2aWNlLiRpbmplY3QgPSBbXCIkaHR0cFwiLCBcIiRxXCIsIFwibG9jYWxTdG9yYWdlU2VydmljZVwiLCBcIkJBU0VfSU5GT1wiLCBcIiRzdGF0ZVwiLCBcIiR0aW1lb3V0XCIsIFwiYmlsbGluZ1NlcnZpY2VcIl07XHJcbiAgICAgICAgZnVuY3Rpb24gYXV0aFNlcnZpY2UoJGh0dHAsICRxLCBsb2NhbFN0b3JhZ2VTZXJ2aWNlLCBCQVNFX0lORk8sICRzdGF0ZSwkdGltZW91dCxiaWxsaW5nU2VydmljZSkge1xyXG4gICAgICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgICAgIHRoaXMuJGh0dHAgPSAkaHR0cDtcclxuICAgICAgICAgICAgdGhpcy4kcSA9ICRxO1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UgPSBsb2NhbFN0b3JhZ2VTZXJ2aWNlO1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdHZXR0aW5nUmVxdWVzdCA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuZmlsbEF1dGhEYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuJHN0YXRlID0gJHN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLiR0aW1lb3V0ID0gJHRpbWVvdXQ7XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZUJhc2UgPSBCQVNFX0lORk8uVVJMICsgXCIvXCI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlID0gYmlsbGluZ1NlcnZpY2U7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVMb2FkZWQ9JHEuZGVmZXIoKTtcclxuXHJcblxyXG4gICAgICAgICAgICBpZighZnJhbWVMb2FkZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZyYW1lTG9hZGVkJHEgPXRoaXMuZnJhbWVMb2FkZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBhdXRoU2VydmljZS5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAodXNlcikge1xyXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuJGh0dHAucG9zdCh0aGlzLnNlcnZpY2VCYXNlICsgXCJ1c2VyXCIsIHVzZXIpLnN1Y2Nlc3MoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGF1dGhTZXJ2aWNlLnByb3RvdHlwZS5sb2NrID0gZnVuY3Rpb24gKHVzZXIpIHtcclxuICAgICAgICAgICAgdmFyIGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpO1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuYXV0aGVudGljYXRpb24uaXNBdXRoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMuYXV0aGVudGljYXRpb24uaXNMb2NrID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZUxvY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgYXV0aFNlcnZpY2UucHJvdG90eXBlLnVubG9jayA9IGZ1bmN0aW9uIChmb3JtKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLmF1dGhlbnRpY2F0aW9uLmlzQXV0aCkge1xyXG4gICAgICAgICAgICAgICAgZm9ybS5yZW1lbWJlck1lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNpZ25JbihcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLCB0cnVlXHJcbiAgICAgICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmF1dGhlbnRpY2F0aW9uLmlzTG9jayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVMb2NrKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgYXV0aFNlcnZpY2UucHJvdG90eXBlLnJlc2V0UGFzc3dvcmQgPSBmdW5jdGlvbiAoZm9ybSkge1xyXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuJGh0dHAucG9zdCh0aGlzLnNlcnZpY2VCYXNlICsgXCIvdXNlci9yZWNvdmVyLWNvbmZpcm1cIiwgZm9ybSkuc3VjY2VzcyhmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9maWlsRGF0YShyZXNwb25zZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgYXV0aFNlcnZpY2UucHJvdG90eXBlLnJlbWVtYmVyUGFzc3dvcmRSZXF1ZXN0ID0gZnVuY3Rpb24gKGVtYWlsKSB7XHJcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KHRoaXMuc2VydmljZUJhc2UgKyBcIi91c2VyL3JlY292ZXItcGFzc3dvcmRcIiwgZW1haWwpLnN1Y2Nlc3MoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3Qob2JqKSB7XHJcbiAgICAgICAgICAgIHZhciBzdHIgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBvYmopXHJcbiAgICAgICAgICAgICAgICBzdHIucHVzaChlbmNvZGVVUklDb21wb25lbnQocCkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChvYmpbcF0pKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN0ci5qb2luKFwiJlwiKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBhdXRoU2VydmljZS5wcm90b3R5cGUuX2ZpaWxEYXRhID0gZnVuY3Rpb24gKHJlc3BvbnNlLCByZW1lYm1lcikge1xyXG4gICAgICAgICAgICB2YXIgYXV0aERhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbjogcmVzcG9uc2UudG9rZW4sXHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHJlc3BvbnNlLnVzZXJfaWQsXHJcbiAgICAgICAgICAgICAgICBpc0F1dGg6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBpc0xvY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcmVtZW1iZXI6IHJlbWVibWVyXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0KFwiYXV0aG9yaXphdGlvbkRhdGFcIiwgYXV0aERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbGxBdXRoRGF0YSgpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICBhdXRoU2VydmljZS5wcm90b3R5cGUubG9naW5FeHRlcm5hbCA9IGZ1bmN0aW9uICh0b2tlbiwgdXNlcklkLCByZW1lbWJlcikge1xyXG5cclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNpZ25PdXQoKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9maWlsRGF0YSh7dG9rZW46IHRva2VuLCB1c2VyX2lkOiB1c2VySWR9LCByZW1lbWJlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5mcmFtZUxvYWRlZC5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZnJhbWVzLnRlbGVkc2NvbS5wb3N0TWVzc2FnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic1wiK3Rva2VuLCBcImh0dHBzOi8vdGVsZWRzLmNvbS9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy4kaHR0cC5nZXQoX3RoaXMuc2VydmljZUJhc2UgKyBcInVzZXIvXCIgKyB1c2VySWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2lnbk91dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy4kcS5yZWplY3QoKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgYXV0aFNlcnZpY2UucHJvdG90eXBlLnNpZ25JbiA9IGZ1bmN0aW9uICh1c2VyLCBub3RTaWduT3V0KSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgIHZhciBzaWduSW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybVJlcXVlc3QodXNlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMuJGh0dHAucG9zdChcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXJ2aWNlQmFzZSArIFwidXNlci9sb2dpblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIn1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuc3VjY2VzcyhmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5iaWxsaW5nU2VydmljZS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2ZpaWxEYXRhKHJlc3BvbnNlLCB1c2VyLnJlbWVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZnJhbWVzLnRlbGVkc2NvbS5wb3N0TWVzc2FnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzXCIrcmVzcG9uc2UudG9rZW4sIFwiaHR0cHM6Ly90ZWxlZHMuY29tL1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VyLnJlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLiR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNpZ25PdXQoKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy4kc3RhdGUuZ28oXCJhdXRoLmxvZ2luXCIsIG51bGwsIHtyZWxvYWQ6IHRydWV9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlc3BvbnNlLmtlZXBfYWxpdmVfdHRsKjEwMDApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChub3RTaWduT3V0KSB7XHJcbiAgICAgICAgICAgICAgICBzaWduSW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2lnbk91dCgpLnRoZW4oc2lnbkluKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgYXV0aFNlcnZpY2UucHJvdG90eXBlLnJlbW92ZUF1dGhvcml6YXRpb25EYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlKFwiYXV0aG9yaXphdGlvbkRhdGFcIik7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24uaXNBdXRoID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24udXNlck5hbWUgPSBcIlwiO1xyXG4gICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uLnVzZXJJZCA9IFwiXCI7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24ucm9sZXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGlvbi5pc0xvY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGlvbi5yZW1lbWJlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uLnRva2VuID0gXCJcIjtcclxuXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGF1dGhTZXJ2aWNlLnByb3RvdHlwZS5zaWduT3V0RXh0ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgdmFyIGF1dGhEYXRhID0gdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldChcImF1dGhvcml6YXRpb25EYXRhXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF1dGhEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5mcmFtZUxvYWRlZC5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5mcmFtZXMudGVsZWRzY29tLnBvc3RNZXNzYWdlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRcIiwgXCJodHRwczovL3RlbGVkcy5jb20vXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBdXRob3JpemF0aW9uRGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGF1dGhTZXJ2aWNlLnByb3RvdHlwZS5zaWduT3V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgIHZhciBhdXRoRGF0YSA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXQoXCJhdXRob3JpemF0aW9uRGF0YVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdXRoRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUF1dGhvcml6YXRpb25EYXRhKCk7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuZnJhbWVzLnRlbGVkc2NvbS5wb3N0TWVzc2FnZShcclxuICAgICAgICAgICAgICAgICAgICBcImRcIiwgXCJodHRwczovL3RlbGVkcy5jb20vXCIpO1xyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGF1dGhTZXJ2aWNlLnByb3RvdHlwZS5jb25maXJtRW1haWwgPSBmdW5jdGlvbiAoY29uZmlybUVtYWlsKSB7XHJcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KHRoaXMuc2VydmljZUJhc2UgKyBcInVzZXIvY29uZmlybVwiLCBjb25maXJtRW1haWwpLnN1Y2Nlc3MoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGF1dGhTZXJ2aWNlLnByb3RvdHlwZS5leHRlbmRUb2tlbkxpZmVUaW1lID0gZnVuY3Rpb24gKGNvbmZpcm1FbWFpbCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdmFyIGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpO1xyXG4gICAgICAgICAgICB2YXIgYXV0aERhdGEgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0KFwiYXV0aG9yaXphdGlvbkRhdGFcIik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmV4dGVuZFRva2VuTGlmZVRpbWVQZW5kaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdHZXR0aW5nUmVxdWVzdC5wdXNoKGRlZmVycmVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5kVG9rZW5MaWZlVGltZVBlbmRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMuc2VydmljZUJhc2UgKyBcInVzZXIvcmVmcmVzaC10b2tlblwiKS5zdWNjZXNzKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9maWlsRGF0YShyZXNwb25zZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmV4dGVuZFRva2VuTGlmZVRpbWVQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gX3RoaXMucGVuZGluZ0dldHRpbmdSZXF1ZXN0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gX2FbX2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWYucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuZXJyb3IoZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmV4dGVuZFRva2VuTGlmZVRpbWVQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBfdGhpcy5wZW5kaW5nR2V0dGluZ1JlcXVlc3Q7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gX2FbX2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLnJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnNpZ25PdXQoKS50aGVuKGVycm9yKS5jYXRjaChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgYXV0aFNlcnZpY2UucHJvdG90eXBlLnVwZGF0ZUxvY2sgPSBmdW5jdGlvbiAoaXNMb2NrKSB7XHJcbiAgICAgICAgICAgIHZhciBhdXRoRGF0ZSA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXQoXCJhdXRob3JpemF0aW9uRGF0YVwiKTtcclxuICAgICAgICAgICAgYXV0aERhdGUuaXNMb2NrID0gaXNMb2NrO1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0KFwiYXV0aG9yaXphdGlvbkRhdGFcIiwgYXV0aERhdGUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgYXV0aFNlcnZpY2UucHJvdG90eXBlLmZpbGxBdXRoRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGF1dGhEYXRhID0gdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldChcImF1dGhvcml6YXRpb25EYXRhXCIpO1xyXG4gICAgICAgICAgICBpZiAoYXV0aERhdGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24uaXNBdXRoID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24udXNlcklkID0gYXV0aERhdGEudXNlcklkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGlvbi5pc0xvY2sgPSBhdXRoRGF0YS5pc0xvY2s7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uLnJlbWVtYmVyID0gYXV0aERhdGEucmVtZW1iZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uLnRva2VuID0gYXV0aERhdGEudG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHByaXZhdGVTZXJ2aWNlRm9yRXh0ZXJuYWwgPWF1dGhTZXJ2aWNlO1xyXG4gICAgICAgIHJldHVybiBhdXRoU2VydmljZTtcclxuICAgIH0oKSk7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmF1dGhcIilcclxuICAgICAgICAuc2VydmljZShcIkF1dGhTZXJ2aWNlXCIsIGF1dGhTZXJ2aWNlKTtcclxuXHJcblxyXG59KSgpO1xyXG5cclxuZnVuY3Rpb24gb25sb2FkRnJhbWUoKSB7XHJcblxyXG4gICAgaWYoZnJhbWVMb2FkZWQkcSlcclxuICAgIHtcclxuICAgICAgICBmcmFtZUxvYWRlZCRxLnJlc29sdmUoKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBmcmFtZUxvYWRlZD10cnVlO1xyXG4gICAgfVxyXG5cclxufTtcclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5hdXRoXCIpXHJcbiAgICAgICAgLmZhY3RvcnkoJ0F1dGhJbnRlcmNlcHRvclNlcnZpY2UnLCBhdXRoSW50ZXJjZXB0b3JTZXJ2aWNlKTtcclxuXHJcbiAgICBhdXRoSW50ZXJjZXB0b3JTZXJ2aWNlLiRpbmplY3QgPSBbJyRxJywgJyRpbmplY3RvcicsICdsb2NhbFN0b3JhZ2VTZXJ2aWNlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gYXV0aEludGVyY2VwdG9yU2VydmljZSgkcSwgJGluamVjdG9yLCBsb2NhbFN0b3JhZ2VTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHZhciAkaHR0cDtcclxuICAgICAgICB2YXIgJHN0YXRlO1xyXG4gICAgICAgIHZhciBhdXRoU2VydmljZTtcclxuXHJcblxyXG4gICAgICAgIHZhciByZXF1ZXN0ID0gZnVuY3Rpb24gKGNvbmZpZykge1xyXG5cclxuICAgICAgICAgICAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcclxuXHJcblxyXG4gICAgICAgICAgICB2YXIgYXV0aERhdGEgPSBsb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldChcImF1dGhvcml6YXRpb25EYXRhXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF1dGhEYXRhICYmIGNvbmZpZy51cmwuaW5kZXhPZignY2RuJykgPT0gLTEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycy5BdXRob3JpemF0aW9uID0gXCJCZWFyZXIgXCIgKyBhdXRoRGF0YS50b2tlbjtcclxuICAgICAgICAgICAgICAgIGF1dGhEYXRhLmxhc3RVcGRhdGUgPSBtb21lbnQoKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlU2VydmljZS5zZXQoXCJhdXRob3JpemF0aW9uRGF0YVwiLGF1dGhEYXRhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgcmV0cnlIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uIChjb25maWcsIGRlZmVycmVkKSB7XHJcblxyXG4gICAgICAgICAgICAkaHR0cCA9ICRodHRwIHx8ICRpbmplY3Rvci5nZXQoXCIkaHR0cFwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkaHR0cChjb25maWcpO1xyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgcmVzcG9uc2VFcnJvciA9IGZ1bmN0aW9uIChyZWplY3Rpb24pIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVqZWN0aW9uLmNvbmZpZy51cmwuaW5jbHVkZXMoXCIvdXNlci9sb2dpblwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChyZWplY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF1dGhTZXJ2aWNlID0gYXV0aFNlcnZpY2UgfHwgJGluamVjdG9yLmdldChcIkF1dGhTZXJ2aWNlXCIpO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0aW9uLmlzQXV0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICRzdGF0ZSA9ICRzdGF0ZSB8fCAkaW5qZWN0b3IuZ2V0KFwiJHN0YXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbyhcImF1dGgubG9naW5cIiwgbnVsbCwge3JlbG9hZDogdHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChyZWplY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaWduT3V0KCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF1dGhTZXJ2aWNlLnNpZ25PdXQoKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZSA9ICRzdGF0ZSB8fCAkaW5qZWN0b3IuZ2V0KFwiJHN0YXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oXCJhdXRoLmxvZ2luXCIsIG51bGwsIHtyZWxvYWQ6IHRydWV9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChyZWplY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0aW9uLnJlbWVtYmVyICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF1dGhTZXJ2aWNlLmV4dGVuZFRva2VuTGlmZVRpbWUoKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlIdHRwUmVxdWVzdChyZWplY3Rpb24uY29uZmlnLCBkZWZlcnJlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbk91dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlamVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzaWduT3V0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlamVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBhdXRoSW50ZXJjZXB0b3JTZXJ2aWNlRmFjdG9yeSA9IHt9O1xyXG5cclxuICAgICAgICBhdXRoSW50ZXJjZXB0b3JTZXJ2aWNlRmFjdG9yeS5yZXF1ZXN0ID0gcmVxdWVzdDtcclxuICAgICAgICBhdXRoSW50ZXJjZXB0b3JTZXJ2aWNlRmFjdG9yeS5yZXNwb25zZUVycm9yID0gcmVzcG9uc2VFcnJvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGF1dGhJbnRlcmNlcHRvclNlcnZpY2VGYWN0b3J5O1xyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzaWdudXBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJBdXRoU2VydmljZVwiLCBcImxvY2FsZVwiLCBcImVycm9ySGFuZGxlckhlbHBlclwiLCBcIiRzdGF0ZVBhcmFtc1wiLCBcImxvY2FsZVwiLCBcIiR0aW1lb3V0XCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYXV0aFwiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKFwiU2lnbnVwQ29udHJvbGxlclwiLCBzaWdudXBDb250cm9sbGVyKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gc2lnbnVwQ29udHJvbGxlcihBdXRoU2VydmljZSwgbG9jYWxlLCBlcnJvckhhbmRsZXJIZWxwZXIsICRzdGF0ZVBhcmFtcyxsb2NhbGUsJHRpbWVvdXQpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS51c2VyID0ge307XHJcbiAgICAgICAgdm0udXNlci5tYXhfcGxheWVycyA9IFwiNVwiO1xyXG4gICAgICAgIHZtLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHZtLnN1Y2Nlc3NSZWdpc3RyYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdm0uc2V0UmVzcG9uc2UgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgdm0udXNlcltcImctcmVjYXB0Y2hhLXJlc3BvbnNlXCJdID0gcmVzcG9uc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zZXRXaWRnZXRJZCA9IGZ1bmN0aW9uICh3aWRnZXRJZCkge1xyXG4gICAgICAgICAgICB2bS53aWRnZXRJZCA9IHdpZGdldElkO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCRzdGF0ZVBhcmFtcy5sYW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbG9jYWxlLnNldExvY2FsZSgkc3RhdGVQYXJhbXMubGFuZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmxhbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUuZ2V0TG9jYWxlKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZm9ybSkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChmb3JtLiR2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9naW5Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHZtLnVzZXIubGFuZyA9IGxvY2FsZS5nZXRMb2NhbGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2bS51c2VyWydnLXJlY2FwdGNoYS1yZXNwb25zZSddID0gXCIxMTExXCI7XHJcbiAgICAgICAgICAgICAgICBBdXRoU2VydmljZS5yZWdpc3Rlcih2bS51c2VyKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoJHN0YXRlUGFyYW1zLmNpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCdib2R5JykuYXBwZW5kKCc8aW1nIGNsYXNzPVwiaGlkZGVuXCIgc3JjPVwiaHR0cHM6Ly84NzY4ejIuYmVtb2J0cmsuY29tL3Bvc3RiYWNrP2NpZD0nICsgJHN0YXRlUGFyYW1zLmNpZCArICcmcGF5b3V0PTAmdHhpZD1GT1JNXCI+Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHlhQ291bnRlcjQwMzY0Mzg1LnJlYWNoR29hbCgnRk9STScpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uc3VjY2Vzc1JlZ2lzdHJhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5sb2dpbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5zdWNjZXNzUmVnaXN0cmF0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubG9naW5Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sb2dpbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZSwgZm9ybSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTMuMDQuMjAxNi5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA4LjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmxheW91dFwiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdtZW51Jywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCJsb2NhbFN0b3JhZ2VTZXJ2aWNlXCIsICckZmlsdGVyJ107XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKGxvY2FsU3RvcmFnZVNlcnZpY2UsICRmaWx0ZXIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRPcmRlciA9IGZ1bmN0aW9uIChtZW51LCByZXNldCkge1xyXG4gICAgICAgICAgICB2YXIgbG9jYWxNZW51ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldChcIm1lbnVcIikpO1xyXG4gICAgICAgICAgICBpZiAobG9jYWxNZW51ICYmICFyZXNldCkge1xyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKG1lbnUsIGZ1bmN0aW9uIChpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAkZmlsdGVyKCdmaWx0ZXInKShsb2NhbE1lbnUsIHtrZXk6IGl0ZW0ua2V5fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uaSA9IHBhcnNlSW50KHJlc3VsdFswXS5pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uaSA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgb3JkZXJlZCA9ICRmaWx0ZXIoJ29yZGVyQnknKShtZW51LCBcImlcIik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3JkZXJlZFtpXS5pID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZFtpXS5pID0gaVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBtZW51ID0gb3JkZXJlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVudS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVbaV0uaSA9IGlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNhdmUobWVudSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtZW51O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlID0gZnVuY3Rpb24gKG1lbnUpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlU2VydmljZS5zZXQoXCJtZW51XCIsIEpTT04uc3RyaW5naWZ5KG1lbnUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEzLjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcInBsYXllcnNcIiwgXCJub3RpZmljYXRpb25TZXJ2aWNlXCIsIFwibW9tZW50XCIsIFwiJHRpbWVvdXRcIiwgXCJyZW1vdmVNb2RhbFNlcnZpY2VcIiwgXCJhc3NpZ25DYW1wYWlnblNlcnZpY2VcIiwgXCIkc3RhdGVcIiwgXCJjb250cm9sVGFnU2VydmljZU1vZGFsXCIsIFwicGxheWVyU3RhdE1vZGFsU2VydmljZVwiLCBcIiRxXCIsIFwic3RhdGlzdGljc1wiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29udHJvbGxlcihcIlBsYXllcnNDb250cm9sbGVyXCIsIGNvbnRyb2xsZXIpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKHBsYXllcnMsIG5vdGlmaWNhdGlvblNlcnZpY2UsIG1vbWVudCwgJHRpbWVvdXQsIHJlbW92ZU1vZGFsU2VydmljZSwgYXNzaWduQ2FtcGFpZ25TZXJ2aWNlLCAkc3RhdGUsIGNvbnRyb2xUYWdTZXJ2aWNlTW9kYWwsIHBsYXllclN0YXRNb2RhbFNlcnZpY2UsICRxLCBzdGF0aXN0aWNzKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciByZXF1ZXN0ID0gbnVsbDtcclxuICAgICAgICB2bS5vcHRpb24gPSB7XHJcbiAgICAgICAgICAgIHRhZ3M6IFtdLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlwiLFxyXG4gICAgICAgICAgICBxdWFsaXR5OiBbXSxcclxuICAgICAgICAgICAgcXVpY2t0eXBlOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uZGF0YSA9IFtdO1xyXG4gICAgICAgIHZtLnByb21pc2VzID0gW107XHJcbiAgICAgICAgdm0uY29sdW1ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnY3JlYXRlZF9hdCcsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGwudGltZXpvbmUgPT0gXCJFdXJvcGUvTW9za293XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbC50aW1lem9uZSA9IFwiRXVyb3BlL01vc2Nvd1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmdWxsLnRpbWV6b25lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxsLnRpbWV6b25lID0gXCJFdXJvcGUvTW9zY293XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbW9tZW50LnV0YyhkYXRhKS5mb3JtYXQoXCJERC5NTS5ZWVlZIEhIOm1tOnNzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz1cIm9uZS1zdHJpbmdcIj4nICsgZGF0ZSArICc8L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcInBsYXllcnMuRGF0ZUNyZWF0ZWRcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICBhbGlnbjogXCJsZWZ0XCIsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uTmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiNTAlXCIsXHJcbiAgICAgICAgICAgICAgICBjZWxsQ2xhc3M6IFwibmFtZS1jZWxsIG9uZS1zdHJpbmcgdGFibGUtbGlua1wiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd0YWdzJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICd0YWdzJyxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlkZW9fcXVhbGl0eScsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cImxhYmVsIGxhYmVsLXByaW1hcnlcIj4nICsgZGF0YSArICc8L3NwYW4+JztcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJwbGF5ZXJzLlF1YWxpdHlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdpZCcsXHJcbiAgICAgICAgICAgICAgICBub3RTb3J0OiB0cnVlLFxyXG5cclxuICAgICAgICAgICAgICAgIHRpdGxlUG9wb3ZlclRlbXBsYXRlVXJsOiAncGxheWVycy9wbGF5ZXJzL2hlbHBDaGFydC5odG1sJyxcclxuICAgICAgICAgICAgICAgIHRpdGxlUG9wb3ZlckNsYXNzOiAnaGVscC1wb3BvdmVyX3BvcG92ZXItLWNoYXJ0JyxcclxuICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKGRhdGEsIGZ1bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9XCJjaGFydC1jZWxsLWJsb2NrXCIgbmctY2xpY2s9XCJ2bS5hY3Rpb24oXFwnY2hhcnRcXCcsXFwnJyArIGZ1bGwuaWQgKyAnXFwnKVwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHBsYXllci1zdGF0LWNoYXJ0IG9uLXNldC1sb2FkaW5nLXByb21pc2U9XCJ2bS5hY3Rpb24oXFwnc2V0UHJvbWlzZVxcJyxwcm9taXNlKVwiIHBsYXllci1pZD1cIicgKyBkYXRhICsgJ1wiIHJlcXVlc3QtaWQ9XCInICsgcmVxdWVzdC5yZXF1ZXN0SWQgKyAnXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L3BsYXllci1zdGF0LWNoYXJ0PiAgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcInBsYXllcnMuU3RhdFwiLFxyXG4gICAgICAgICAgICAgICAgY2VsbENsYXNzOiBcImNoYXJ0LWNlbGxcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdsYXN0X2FjdGl2aXR5JyxcclxuICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKGRhdGEsIGZ1bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9XCJpbmxpbmUtYmxvY2sgdGV4dC1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOiA3MnB4XCI+PGRpdiBjbGFzcz1cImlubGluZS1ibG9jayBcIj48cGxheWVyLXN0YXR1cyAgZGF0ZT1cIlxcJycgKyBkYXRhICsgJ1xcJ1wiPjwvcGxheWVyLXN0YXR1cz48L2Rpdj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcInBsYXllcnMuU3RhdHVzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ251bGwnLFxyXG4gICAgICAgICAgICAgICAgbm90U29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKGRhdGEsIGZ1bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udHJvbF9yb3cgPSAnICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBvbmUtc3RyaW5nXCIgPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gIGJ0bi1ibHVlIGJ0bi1zbVwiICAgIHVpYi10b29sdGlwPVwie3tcXCdwbGF5ZXJzLkNoYXJ0U3RhdHVzVG9vbHRpcFxcJ3xpMThufX1cIiAgdG9vbHRpcC1wb3B1cC1kZWxheT1cIjEwMDBcIiB0b29sdGlwLWFwcGVuZC10by1ib2R5PVwidHJ1ZVwiIG5nLWNsaWNrPVwidm0uYWN0aW9uKFxcJ2NoYXJ0XFwnLFxcJycgKyBmdWxsLmlkICsgJ1xcJylcIj48aSBjbGFzcz1cImZhICBmYS1hcmVhLWNoYXJ0XCI+PC9pPjwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gIGJ0bi1wcmltYXJ5IGJ0bi1zbSBcIiAgdWliLXRvb2x0aXA9XCJ7e1xcJ2NvbW1vbi5JbmZvVG9vbHRpcFxcJ3xpMThufX1cIiAgdG9vbHRpcC1wb3B1cC1kZWxheT1cIjEwMDBcIiB0b29sdGlwLWFwcGVuZC10by1ib2R5PVwidHJ1ZVwiICAgbmctY2xpY2s9XCJ2bS5hY3Rpb24oXFwnaW5mb1xcJyxcXCcnICsgZnVsbC5pZCArICdcXCcpXCI+PGkgY2xhc3M9XCJmYSAgZmEtaW5mb1wiPjwvaT48L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuICBidG4tZGFuZ2VyIGJ0bi1zbVwiICAgIHVpYi10b29sdGlwPVwie3tcXCdjb21tb24uUmVtb3ZlVG9vbHRpcFxcJ3xpMThufX1cIiAgdG9vbHRpcC1wb3B1cC1kZWxheT1cIjEwMDBcIiB0b29sdGlwLWFwcGVuZC10by1ib2R5PVwidHJ1ZVwiIG5nLWNsaWNrPVwidm0uYWN0aW9uKFxcJ3JlbW92ZVxcJyxcXCcnICsgZnVsbC5pZCArICdcXCcpXCI+PGkgY2xhc3M9XCJmYSAgZmEtcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xfcm93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBdO1xyXG4gICAgICAgIHZtLmRlZmF1bHRTb3J0ID0gWzEsICdkZXNjJ107XHJcbiAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdm0uYWN0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAoYWN0aW9uLCB2YWwpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiaW5mb1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZ29Ub1BsYXllcih2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSBcInRyYWNraW5nXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIudHJhY2tpbmcnLCB7aWQ6IHZhbH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlQ2xpY2snOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZ29Ub1BsYXllcih2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpY2tOYW1lJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9QbGF5ZXIodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2NoYXJ0Jzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnNob3dDaGFydCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTW9kYWxTZXJ2aWNlLnNob3dSZW1vdmVNb2RhbChbdmFsXSwgXCJwbGF5ZXJzXCIpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgXCJzZXRQcm9taXNlXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5wcm9taXNlcy5wdXNoKHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZtLnByb21pc2VzLmxlbmd0aCA9PT0gdm0uZGF0YS5kYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkcS5hbGwodm0ucHJvbWlzZXMpLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGVmZXIucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnNob3dDaGFydCA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICBwbGF5ZXJTdGF0TW9kYWxTZXJ2aWNlLnNob3coaWQpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmdvVG9QbGF5ZXIgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgJHN0YXRlLmdvKCdwZXJzb25hbEFjY291bnQucGxheWVyLm9uZScsIHtpZDogaWR9KVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5zZXJ2ZXJEYXRhID0gZnVuY3Rpb24gc2VydmVyRGF0YShzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2ssIG9TZXR0aW5ncykge1xyXG5cclxuICAgICAgICAgICAgdmFyIHBhcmFtID0ge307XHJcbiAgICAgICAgICAgIGlmICh2bS5vcHRpb24ubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bJ2ZpbHRlcltuYW1lXSddID0gdm0ub3B0aW9uLm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZtLm9wdGlvbi5xdWFsaXR5ICYmIHZtLm9wdGlvbi5xdWFsaXR5Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBwYXJhbVsnZmlsdGVyW3ZpZGVvX3F1YWxpdHldJ10gPSB2bS5vcHRpb24ucXVhbGl0eS5tYXAoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfSkuam9pbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2bS5vcHRpb24udGFncyAmJiB2bS5vcHRpb24udGFncy5sZW5ndGggPiAwKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbdGFnc10nXSA9IHZtLm9wdGlvbi50YWdzLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmlkO1xyXG4gICAgICAgICAgICAgICAgfSkuam9pbigpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgb3JkZXIgPSBhb0RhdGFbMl0udmFsdWU7XHJcbiAgICAgICAgICAgIGlmIChvcmRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uSW5kZXggPSBvcmRlclswXS5jb2x1bW47XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlyID0gb3JkZXJbMF0uZGlyO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5hbWVQYXJhbSA9ICdzb3J0WycgKyBhb0RhdGFbMV0udmFsdWVbY29sdW1uSW5kZXhdLmRhdGEgKyAnXSc7XHJcbiAgICAgICAgICAgICAgICBwYXJhbVtuYW1lUGFyYW1dID0gZGlyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmFtWydwYWdlW29mZnNldF0nXSA9IGFvRGF0YVszXS52YWx1ZTtcclxuICAgICAgICAgICAgcGFyYW1bJ3BhZ2VbbGltaXRdJ10gPSBhb0RhdGFbNF0udmFsdWU7XHJcblxyXG4gICAgICAgICAgICB2YXIgZGVmZXIgPSAkcS5kZWZlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMuZ2V0UGxheWVycyhwYXJhbSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kYXRhID0gcmVzdWx0O1xyXG5cclxuICAgICAgICAgICAgICAgIHZtLnByb21pc2VzLmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZtLmRhdGEuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZSA9IG1vbWVudCgpLmFkZCgtMSwgJ2RheXMnKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZW5kRGF0ZSA9IG1vbWVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBzdGF0aXN0aWNzLmdldFN0YXRzRm9yUGxheWVycyh2bS5kYXRhLmRhdGEubWFwKGZ1bmN0aW9uIChwbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllci5pZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBzdGFydERhdGUsIGVuZERhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubm90RXhpc3QgPSB2bS5vcHRpb24ucXVhbGl0eS5sZW5ndGggPT09IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ub3B0aW9uLnRhZ3MubGVuZ3RoID09PSAwICYmIHZtLm9wdGlvbi5uYW1lID09PSAnJyAmJiB2bS5vcHRpb24ucXVpY2t0eXBlID09PSAnJztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayhyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmluc3RhbmNlLmR0SW5zdGFuY2UuRGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dXYXJuaW5nKCdjb21tb24uRmFpbGVkR2V0Jyk7XHJcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmludGFuY2VDYWxsYmFjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB2bS5pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5vblJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5vcHRpb24ucXVpY2t0eXBlID0gJyc7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi50YWdzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5xdWFsaXR5Lmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5uYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEodHJ1ZSk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm9uQXBwbHkgPSBmdW5jdGlvbiAob3B0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICB2bS5vcHRpb24ucXVpY2t0eXBlID0gb3B0aW9uLnF1aWNrdHlwZTtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLnRhZ3MgPSBvcHRpb24udGFncztcclxuICAgICAgICAgICAgdm0ub3B0aW9uLm5hbWUgPSBvcHRpb24ubmFtZTtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLnF1YWxpdHkgPSBvcHRpb24ucXVhbGl0eTtcclxuICAgICAgICAgICAgdm0ubm90RXhpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YSh0cnVlKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25TZWxlY3RlZCA9IGZ1bmN0aW9uIChpZHMsIGFsbCkge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZElkcyA9IGlkcztcclxuICAgICAgICAgICAgdm0uYWxsID0gYWxsO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlbW92ZVBsYXllcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZU1vZGFsU2VydmljZS5zaG93UmVtb3ZlTW9kYWwodm0uc2VsZWN0ZWRJZHMsIFwicGxheWVyc1wiKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEodm0uYWxsLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0udW5zZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uYXNzaWduQ2FtcGFpZ24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGFzc2lnbkNhbXBhaWduU2VydmljZS5zaG93QXNzaWduQ2FtcGFpZ25Nb2RhbCh2bS5zZWxlY3RlZElkcykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS51blRvZ2dsZUFsbCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hZGRUYWdzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250cm9sVGFnU2VydmljZU1vZGFsLnNob3dDb250cm9sVGFnTW9kYWwodm0uc2VsZWN0ZWRJZHMsICdwbGF5ZXInKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEodm0uYWxsLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0udW5zZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5yZWxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE3LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcInByb2ZpbGVcIiwgXCJ1c2VyXCIsIFwiJHN0YXRlXCIsIFwiZmlsZVNlcnZpY2VcIiwgXCIkcVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnVzZXJcIikuY29uZmlnKGNvbmZpZyk7XHJcbiAgICBjb25maWcuJGluamVjdCA9IFsnJHN0YXRlUHJvdmlkZXInXTtcclxuICAgIGZ1bmN0aW9uIGNvbmZpZygkc3RhdGVQcm92aWRlcikge1xyXG4gICAgICAgICRzdGF0ZVByb3ZpZGVyXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LnByZWZlcmVuY2UuYnJhbmQnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYnJhbmQnLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICd1c2VyL2JyYW5kL2JyYW5kLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2ZpbGU6IFtcInVzZXJcIiwgZnVuY3Rpb24gKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXIuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIocHJvZmlsZSwgdXNlciwgJHN0YXRlLCBmaWxlU2VydmljZSwgJHEpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCJcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLm1vZGVsID0gcHJvZmlsZTtcclxuXHJcbiAgICAgICAgdm0uY2hhbmdlU3RhdHVzID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmJyYW5kX2FjdGl2ZSA9IHZtLm1vZGVsLmJyYW5kX2FjdGl2ZSA9PSAxID8gMCA6IDE7XHJcbiAgICAgICAgICAgIGlmICh2bS5tb2RlbC5icmFuZF9hY3RpdmUgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgJHEuYWxsKFtyZXNldExvZ28oKSwgcmVzZXRCYWNrZ3JvdW5kKCksIHJlc2V0TG9nb1NlY29uZFNjcmVlbignaW1hZ2VzL2xvZ29fZXhhbXBsZS5wbmcnKSwgcmVzZXRCYWNrZ3JvdW5kU2Vjb25kU2NyZWVuKCdpbWFnZXMvYmFja2dyb3VuZF9leGFtcGxlX3NlY29uZF9zY3JlZW4ucG5nJyldKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5icmFuZF9jb2xvcl8xID0gJyNmZmZmZmYnO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmJyYW5kX2NvbG9yXzIgPSAnIzAwY2RjMSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfY29sb3JfMV9zZWNvbmRfc2NyZWVuID0gXCIjZmZmZmZmXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfY29sb3JfMl9zZWNvbmRfc2NyZWVuID0gXCIjMDA4NmUzXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfdGVsZWRzX2NvcHlyaWdodCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfdGVsZWRzX2NvcHlyaWdodF9zZWNvbmRfc2NyZWVuID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5vblNhdmUoMCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0ub25TYXZlKDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5hY2NlcHQgPSBcImltYWdlLypcIjtcclxuXHJcbiAgICAgICAgdm0uYnJhbmRCYWNrZ3JvdW5kID0gdm0ubW9kZWwuYnJhbmRfYmFja2dyb3VuZDtcclxuICAgICAgICB2bS5icmFuZExvZ28gPSB2bS5tb2RlbC5icmFuZF9sb2dvO1xyXG4gICAgICAgIHZtLmJyYW5kQmFja2dyb3VuZFNlY29uZFNjcmVlbiA9IHZtLm1vZGVsLmJyYW5kX2JhY2tncm91bmRfc2Vjb25kX3NjcmVlbjtcclxuICAgICAgICB2bS5icmFuZExvZ29TZWNvbmRTY3JlZW4gPSB2bS5tb2RlbC5icmFuZF9sb2dvX3NlY29uZF9zY3JlZW47XHJcbiAgICAgICAgdm0ub25DaGFuZ2VCYWNrZ3JvdW5kID0gZnVuY3Rpb24gKGZpbGUpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfYmFja2dyb3VuZCA9IGZpbGU7XHJcbiAgICAgICAgICAgIHZtLmNoYW5nZUJhY2tncm91bmRQcm9taXNlID0gdm0ub25TYXZlKDEpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25DaGFuZ2VMb2dvID0gZnVuY3Rpb24gKGZpbGUpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfbG9nbyA9IGZpbGU7XHJcbiAgICAgICAgICAgIHZtLmNoYW5nZUxvZ29Qcm9taXNlID0gdm0ub25TYXZlKDEpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25DaGFuZ2VCYWNrZ3JvdW5kU2Vjb25kU2NyZWVuID0gZnVuY3Rpb24gKGZpbGUpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfYmFja2dyb3VuZF9zZWNvbmRfc2NyZWVuID0gZmlsZTtcclxuICAgICAgICAgICAgdm0uY2hhbmdlQmFja2dyb3VuZFNlY29uZFNjcmVlblByb21pc2UgPSB2bS5vblNhdmUoMik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5vbkNoYW5nZUxvZ29TZWNvbmRTY3JlZW4gPSBmdW5jdGlvbiAoZmlsZSkge1xyXG4gICAgICAgICAgICB2bS5tb2RlbC5icmFuZF9sb2dvX3NlY29uZF9zY3JlZW4gPSBmaWxlO1xyXG4gICAgICAgICAgICB2bS5jaGFuZ2VMb2dvUHJvbWlzZVNlY29uZFNjcmVlblByb21pc2UgPSB2bS5vblNhdmUoMik7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLnJlc2V0TG9nbyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmVzZXRMb2dvKCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0ub25TYXZlKDEpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnJlc2V0QmFja2dyb3VuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmVzZXRCYWNrZ3JvdW5kKCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0ub25TYXZlKDEpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlc2V0TG9nb1NlY29uZFNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmVzZXRMb2dvU2Vjb25kU2NyZWVuKCdpbWFnZXMvbG9nb19leGFtcGxlLnBuZycpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm9uU2F2ZSgyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5yZXNldEJhY2tncm91bmRTZWNvbmRTY3JlZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJlc2V0QmFja2dyb3VuZFNlY29uZFNjcmVlbignaW1hZ2VzL2JhY2tncm91bmRfZXhhbXBsZV9zZWNvbmRfc2NyZWVuLnBuZycpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm9uU2F2ZSgyKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiByZXNldEJhY2tncm91bmQoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWxlU2VydmljZS5nZXRGaWxlKCdpbWFnZXMvYmFja2dyb3VuZF9leGFtcGxlLnBuZycsICdkZWZhdWx0LWJhY2tncm91bmQucG5nJykudGhlbihmdW5jdGlvbiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfYmFja2dyb3VuZCA9IGZpbGU7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByZXNldExvZ28oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWxlU2VydmljZS5nZXRGaWxlKCdpbWFnZXMvbG9nb19leGFtcGxlLnBuZycsICdkZWZhdWx0LWxvZ28ucG5nJykudGhlbihmdW5jdGlvbiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfbG9nbyA9IGZpbGU7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByZXNldEJhY2tncm91bmRTZWNvbmRTY3JlZW4odXJsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWxlU2VydmljZS5nZXRGaWxlKHVybCwgJ2RlZmF1bHQtYmFja2dyb3VuZC5wbmcnKS50aGVuKGZ1bmN0aW9uIChmaWxlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5icmFuZF9iYWNrZ3JvdW5kX3NlY29uZF9zY3JlZW4gPSBmaWxlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVzZXRMb2dvU2Vjb25kU2NyZWVuKHVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmlsZVNlcnZpY2UuZ2V0RmlsZSh1cmwsICdkZWZhdWx0LWxvZ28ucG5nJykudGhlbihmdW5jdGlvbiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfbG9nb19zZWNvbmRfc2NyZWVuID0gZmlsZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLmNvbnRyb2wgPSB7XHJcblxyXG4gICAgICAgICAgICBnZXQgYnJhbmRfdGVsZWRzX2NvcHlyaWdodCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5tb2RlbC5icmFuZF90ZWxlZHNfY29weXJpZ2h0ICE9IDE7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBicmFuZF90ZWxlZHNfY29weXJpZ2h0KHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfdGVsZWRzX2NvcHlyaWdodCA9IHZhbCA/IDAgOiAxO1xyXG4gICAgICAgICAgICAgICAgdm0ub25TYXZlKDEpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXQgYnJhbmRfdGVsZWRzX2NvcHlyaWdodF9zZWNvbmRfc2NyZWVuKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm1vZGVsLmJyYW5kX3RlbGVkc19jb3B5cmlnaHRfc2Vjb25kX3NjcmVlbiAhPSAxO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgYnJhbmRfdGVsZWRzX2NvcHlyaWdodF9zZWNvbmRfc2NyZWVuKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfdGVsZWRzX2NvcHlyaWdodF9zZWNvbmRfc2NyZWVuID0gdmFsID8gMCA6IDE7XHJcbiAgICAgICAgICAgICAgICB2bS5vblNhdmUoMik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCByZXBlYXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0ubW9kZWwucmVwZWF0ID09IDE7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCByZXBlYXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5yZXBlYXQgPSB2YWwgPyAxIDogMDtcclxuICAgICAgICAgICAgICAgIHZtLm9uU2F2ZSgxKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IHJlcGVhdFNlY29uZFNjcmVlbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5tb2RlbC5yZXBlYXRfc2Vjb25kX3NjcmVlbiA9PSAxO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgcmVwZWF0U2Vjb25kU2NyZWVuKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwucmVwZWF0X3NlY29uZF9zY3JlZW4gPSB2YWwgPyAxIDogMDtcclxuICAgICAgICAgICAgICAgIHZtLm9uU2F2ZSgyKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IGR1cGxpY2F0ZSh2YWwpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLmR1cGxpY2F0ZSA9IHZhbD8xOjA7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHEuYWxsKFtyZXNldExvZ29TZWNvbmRTY3JlZW4odm0uYnJhbmRMb2dvKSwgcmVzZXRCYWNrZ3JvdW5kU2Vjb25kU2NyZWVuKHZtLmJyYW5kQmFja2dyb3VuZCldKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfY29sb3JfMV9zZWNvbmRfc2NyZWVuID0gdm0ubW9kZWwuYnJhbmRfY29sb3JfMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfY29sb3JfMl9zZWNvbmRfc2NyZWVuID0gdm0ubW9kZWwuYnJhbmRfY29sb3JfMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfdGVsZWRzX2NvcHlyaWdodF9zZWNvbmRfc2NyZWVuID0gdm0ubW9kZWwuYnJhbmRfdGVsZWRzX2NvcHlyaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwucmVwZWF0X3NlY29uZF9zY3JlZW4gPSB2bS5tb2RlbC5yZXBlYXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm9uU2F2ZSgyKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uU2F2ZSgyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IGR1cGxpY2F0ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5tb2RlbC5kdXBsaWNhdGU9PTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uU2F2ZSA9IGZ1bmN0aW9uIChzY3JlZW4pIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gdXNlci51cGRhdGVYaHIodm0ubW9kZWwpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0uYnJhbmRCYWNrZ3JvdW5kID0gcmVzdWx0LmRhdGEuYnJhbmRfYmFja2dyb3VuZDtcclxuICAgICAgICAgICAgICAgIHZtLmJyYW5kTG9nbyA9IHJlc3VsdC5kYXRhLmJyYW5kX2xvZ287XHJcbiAgICAgICAgICAgICAgICB2bS5icmFuZEJhY2tncm91bmRTZWNvbmRTY3JlZW4gPSByZXN1bHQuZGF0YS5icmFuZF9iYWNrZ3JvdW5kX3NlY29uZF9zY3JlZW47XHJcbiAgICAgICAgICAgICAgICB2bS5icmFuZExvZ29TZWNvbmRTY3JlZW4gPSByZXN1bHQuZGF0YS5icmFuZF9sb2dvX3NlY29uZF9zY3JlZW47XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5icmFuZF9iYWNrZ3JvdW5kID0gcmVzdWx0LmRhdGEuYnJhbmRfYmFja2dyb3VuZDtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLmJyYW5kX2xvZ28gPSByZXN1bHQuZGF0YS5icmFuZF9sb2dvO1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfYmFja2dyb3VuZF9zZWNvbmRfc2NyZWVuID0gcmVzdWx0LmRhdGEuYnJhbmRfYmFja2dyb3VuZF9zZWNvbmRfc2NyZWVuO1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYnJhbmRfbG9nb19zZWNvbmRfc2NyZWVuID0gcmVzdWx0LmRhdGEuYnJhbmRfbG9nb19zZWNvbmRfc2NyZWVuO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzY3JlZW4gPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdm0udXBkYXRlRmlyc3QgPSBwcm9taXNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNjcmVlbiA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICB2bS51cGRhdGVTZWNvbmQgPSBwcm9taXNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0udXBkYXRlRmlyc3QgPSBwcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgdm0udXBkYXRlU2Vjb25kID0gcHJvbWlzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5iYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQuaG9tZVwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDQuMjAxNi5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA3LjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnVzZXJcIilcclxuICAgICAgICAuY29udHJvbGxlcihcIlByZWZlcmVuY2VDb250cm9sbGVyXCIsIGNvbnRyb2xsZXIpO1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoKSB7XHJcblxyXG5cclxuXHJcbiAgICB9O1xyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNy4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJwcm9maWxlXCIsIFwidXNlclwiLCBcImxvY2FsZVwiLCBcImNoYW5nZVBhc3N3b3JkTW9kYWxTZXJ2aWNlXCIsIFwiY29uZmlybU1vZGFsU2VydmljZVwiLCBcIiRzdGF0ZVwiLCBcImVkaXRTZXJ2aWNlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMudXNlclwiKS5jb25maWcoY29uZmlnKTtcclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gWyckc3RhdGVQcm92aWRlciddO1xyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQucHJlZmVyZW5jZS5wcm9maWxlJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL3Byb2ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICd1c2VyL3Byb2ZpbGUvcHJvZmlsZS5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6IFwidm1cIixcclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9maWxlOiBbXCJ1c2VyXCIsIGZ1bmN0aW9uICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHByb2ZpbGUsIHVzZXIsIGxvY2FsZSwgY2hhbmdlUGFzc3dvcmRNb2RhbFNlcnZpY2UsIGNvbmZpcm1Nb2RhbFNlcnZpY2UsICRzdGF0ZSwgZWRpdFNlcnZpY2UpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLm1vZGVsID0gcHJvZmlsZTtcclxuICAgICAgICB2bS5lZGl0TW9kZWwgPSBlZGl0U2VydmljZS5nZXRFZGl0TW9kZWxGb3JSZXN0QW5ndWxhck1vZGVsKHZtKTtcclxuICAgICAgICB2bS5vbkNoYW5nZSA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwgPSBvYmoudmFsdWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5vblNhdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyLnVwZGF0ZSh2bS5tb2RlbCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zdWJzID0gZmFsc2U7XHJcbiAgICAgICAgdm0ubG9jYWxlID0gbG9jYWxlLmdldExvY2FsZSgpO1xyXG4gICAgICAgIGlmICh2bS5sb2NhbGUgPT0gXCJlblwiKSB7XHJcbiAgICAgICAgICAgIHZtLmxvY2FsZSA9ICd1cyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmNoYW5nZVBhc3N3b3JkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjaGFuZ2VQYXNzd29yZE1vZGFsU2VydmljZS5zaG93KCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0TW9kZWwuZW5kRWRpdCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnVuU3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coJ3VzZXIuTmV3c2xldHRlcnNVblN1YnNjcmliZU1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5uZXdzbGV0dGVycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXIudXBkYXRlKHZtLm1vZGVsKVxyXG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLm5ld3NsZXR0ZXJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLm5ld3NsZXR0ZXJzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLm5ld3NsZXR0ZXJzID0gdHJ1ZTtcclxuICAgICAgICAgICAgdXNlci51cGRhdGUodm0ubW9kZWwpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwubmV3c2xldHRlcnMgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5uZXdzbGV0dGVycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICRzdGF0ZS5nbyhcInBlcnNvbmFsQWNjb3VudC5ob21lXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCJhbmd1bGFyLm1vZHVsZSgnbmV3QXBwJykuY29udHJvbGxlcignc2Vzc2lvblRpbWVvdXRDdHJsJywgW1wiJHNjb3BlXCIsIFwiJGxvY2F0aW9uXCIsIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbikge1xyXG4gICAgJHNjb3BlLiRvbignJHZpZXdDb250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBzZXNzaW9uVGltZW91dCgpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciAkY291bnRkb3duO1xyXG5cclxuICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgnPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cInNlc3Npb24tdGltZW91dFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBiZy1wcmltYXJ5XCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PGkgY2xhc3M9XCJpY29ucy1vZmZpY2UtNTJcIj48L2k+PC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5Zb3VyIHNlc3Npb24gaXMgYWJvdXQgdG8gPHN0cm9uZz5leHBpcmU8L3N0cm9uZz48L2g0PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwPlRoZSBzY3JlZW4gd2lsbCBiZSBsb2NrZWQgaW4gPHNwYW4gaWQ9XCJpZGxlLXRpbWVvdXQtY291bnRlclwiIGNsYXNzPVwidy03MDBcIj48L3NwYW4+IHNlY29uZHMuPC9wPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwPkRvIHlvdSB3YW50IHRvIHN0YXkgY29ubmVjdGVkPzwvcD4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gaWQ9XCJpZGxlLXRpbWVvdXQtZGlhbG9nLWxvZ291dFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tZW1ib3NzZWRcIj5ObywgTG9nb3V0PC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBpZD1cImlkbGUtdGltZW91dC1kaWFsb2cta2VlcGFsaXZlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1lbWJvc3NlZFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+WWVzLCBLZWVwIFdvcmtpbmc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+Jyk7XHJcblxyXG5cclxuICAgICAgICAgICAgLyogU3RhcnQgdGhlIGlkbGUgdGltZXIgcGx1Z2luICovXHJcbiAgICAgICAgICAgICQuaWRsZVRpbWVvdXQoJyNzZXNzaW9uLXRpbWVvdXQnLCAnLm1vZGFsLWNvbnRlbnQgYnV0dG9uOmxhc3QnLCB7XHJcbiAgICAgICAgICAgICAgICBpZGxlQWZ0ZXI6IDUsIC8vIDUgc2Vjb25kcyBiZWZvcmUgYSBkaWFsb2cgYXBwZWFyICh2ZXJ5IHNob3J0IGZvciBkZW1vIHB1cnBvc2UpXHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiAzMDAwMCwgLy8gMzAgc2Vjb25kcyB0byB0aW1lb3V0XHJcbiAgICAgICAgICAgICAgICBwb2xsaW5nSW50ZXJ2YWw6IDUsIC8vIDUgc2Vjb25kc1xyXG4gICAgICAgICAgICAgICAga2VlcEFsaXZlVVJMOiAnLi4vLi4vLi4vYXNzZXRzL2dsb2JhbC9wbHVnaW5zL2lkbGUtdGltZW91dC9rZWVwYWxpdmUucGhwJyxcclxuICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlRXF1YWxzOiAnT0snLFxyXG4gICAgICAgICAgICAgICAgb25UaW1lb3V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRsb2NhdGlvbi5wYXRoKCkgPT09ICcvdXNlci1zZXNzaW9uVGltZW91dCcpIHsvL3JlbW92ZSB0aGlzIGNvbmRpdGlvbiB0byBhcHBseSB0aW1vdXQgZm9yIGFsbCB0aGUgcGFnZXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IFwiLi4vLi4vdXNlci1sb2Nrc2NyZWVuLmh0bWxcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25JZGxlOiBvbklkbGUsXHJcbiAgICAgICAgICAgICAgICBvbkNvdW50ZG93bjogZnVuY3Rpb24gKGNvdW50ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKiBXZSB1cGRhdGUgdGhlIGNvdW50ZXIgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoJGNvdW50ZG93bilcclxuICAgICAgICAgICAgICAgICAgICAgICAgJGNvdW50ZG93bi5odG1sKGNvdW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIG9uSWRsZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICQoJyNzZXNzaW9uLXRpbWVvdXQnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICAkY291bnRkb3duID0gJCgnI2lkbGUtdGltZW91dC1jb3VudGVyJyk7XHJcblxyXG4gICAgICAgICAgICAkKCcjaWRsZS10aW1lb3V0LWRpYWxvZy1rZWVwYWxpdmUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjc2Vzc2lvbi10aW1lb3V0JykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKCcjaWRsZS10aW1lb3V0LWRpYWxvZy1sb2dvdXQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcjc2Vzc2lvbi10aW1lb3V0JykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgICQuaWRsZVRpbWVvdXQub3B0aW9ucy5vblRpbWVvdXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlc3Npb25UaW1lb3V0KCk7XHJcblxyXG5cclxuICAgICAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwic2Vzc2lvbi10aW1lb3V0XCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGJnLXByaW1hcnlcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48aSBjbGFzcz1cImljb25zLW9mZmljZS01MlwiPjwvaT48L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPllvdXIgc2Vzc2lvbiBpcyBhYm91dCB0byA8c3Ryb25nPmV4cGlyZTwvc3Ryb25nPjwvaDQ+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHA+VGhlIHNjcmVlbiB3aWxsIGJlIGxvY2tlZCBpbiA8c3BhbiBpZD1cImlkbGUtdGltZW91dC1jb3VudGVyXCIgY2xhc3M9XCJ3LTcwMFwiPjwvc3Bhbj4gc2Vjb25kcy48L3A+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHA+RG8geW91IHdhbnQgdG8gc3RheSBjb25uZWN0ZWQ/PC9wPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBpZD1cImlkbGUtdGltZW91dC1kaWFsb2ctbG9nb3V0XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1lbWJvc3NlZFwiPk5vLCBMb2dvdXQ8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGlkPVwiaWRsZS10aW1lb3V0LWRpYWxvZy1rZWVwYWxpdmVcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWVtYm9zc2VkXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5ZZXMsIEtlZXAgV29ya2luZzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nKTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKGRvY3VtZW50KS51bmJpbmQoXCJpZGxlLmlkbGVUaW1lclwiKTtcclxuICAgICAgICBkZWxldGUgb25JZGxlO1xyXG4gICAgfSk7XHJcblxyXG5cclxufV0pO1xyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNS4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5mYWN0b3J5KCdjb250cm9sVGFnJywgZmFjdG9yeSk7XHJcblxyXG4gICAgZmFjdG9yeS4kaW5qZWN0ID0gW1wiY29udGVudHNcIiwgXCJwbGF5ZXJzXCIsIFwiJHFcIiwgXCIkZmlsdGVyXCJdO1xyXG4gICAgZnVuY3Rpb24gZmFjdG9yeShjb250ZW50cywgcGxheWVycywgJHEsICRmaWx0ZXIpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0eXBlKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBudWxsO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJwbGF5ZXJcIjpcclxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHBsYXllcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29udGVudFwiOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gY29udGVudHM7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIHNlcnZpY2UgPSB7XHJcbiAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZTogZ2V0UmVzb3VyY2UsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVSZXNvdXJjZTogdXBkYXRlUmVzb3VyY2UsXHJcbiAgICAgICAgICAgICAgICBhZGQ6IGFkZCxcclxuICAgICAgICAgICAgICAgIHJlbW92ZTogcmVtb3ZlXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2VydmljZTtcclxuXHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRSZXNvdXJjZShpZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldChpZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVSZXNvdXJjZShpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UudXBkYXRlKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBhZGQoc2VsZWN0ZWQsIHRhZ3MpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkZWZlciA9ICRxLmRlZmVyKCk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdGVkLCBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdXBkYXRlUHJvbWlzZSA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh1cGRhdGVQcm9taXNlLnByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldChpZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmVlZEFkZFRhZyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh0YWdzLCBmdW5jdGlvbiAodGFnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAkZmlsdGVyKCdmaWx0ZXInKShpdGVtLnRhZ3MsIHtpZDogdGFnLmlkfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkQWRkVGFnLnB1c2godGFnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZWVkQWRkVGFnLmxlbmd0aD4wKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGFncyA9aXRlbS50YWdzLmNvbmNhdChuZWVkQWRkVGFnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnVwZGF0ZVJlc291cmNlKGl0ZW0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb21pc2UucmVqZWN0KHJlc3VsdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvbWlzZS5yZWplY3QocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KHJlc3VsdFswXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXIucHJvbWlzZTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZShzZWxlY3RlZCwgdGFncykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlZmVyID0gJHEuZGVmZXIoKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XHJcbiAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goc2VsZWN0ZWQsIGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB1cGRhdGVQcm9taXNlID0gJHEuZGVmZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHVwZGF0ZVByb21pc2UucHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0KGlkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoaXRlbSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZWVkUmVtb3ZlVGFnID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRhZ3MsIGZ1bmN0aW9uICh0YWcpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICRmaWx0ZXIoJ2ZpbHRlcicpKGl0ZW0udGFncywge2lkOiB0YWcuaWR9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRSZW1vdmVUYWcucHVzaChyZXN1bHRbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5lZWRSZW1vdmVUYWcubGVuZ3RoPjApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKG5lZWRSZW1vdmVUYWcsIGZ1bmN0aW9uICh0YWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50YWdzLnNwbGljZShpdGVtLnRhZ3MuaW5kZXhPZih0YWcpLDEpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UudXBkYXRlUmVzb3VyY2UoaXRlbSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvbWlzZS5yZWplY3QocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9taXNlLnJlamVjdChyZXN1bHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJHEuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVyLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlci5yZWplY3QocmVzdWx0WzBdKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIDtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdjb250cm9sVGFnU2VydmljZU1vZGFsJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgc2VsZi5zaG93Q29udHJvbFRhZ01vZGFsID0gZnVuY3Rpb24gKHNlbGVjdGVkLCB0eXBlKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3AgOiAnc3RhdGljJywgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9jb250cm9sVGFnL2NvbnRyb2xPbmVJdGVtTW9kYWwvY29udHJvbE9uZUl0ZW1Nb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnY29udHJvbE9uZUl0ZW1Db250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ2NvbnRyb2wtbW9kYWwnLFxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIGJhY2tkcm9wIDogJ3N0YXRpYycsICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvY29udHJvbFRhZy9jb250cm9sTWFueUl0ZW1Nb2RhbC9jb250cm9sTWFueUl0ZW1Nb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnY29udHJvbE1hbnlJdGVtQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdjb250cm9sLW1vZGFsJyxcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDMxLjA1LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikudmFsdWUoJ2NnQnVzeURlZmF1bHRzJywge1xyXG4gICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvYW5ndWxhci1idXN5L2FuZ3VsYXItYnVzeS5odG1sJ1xyXG4gICAgfSk7XHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImR1cmF0aW9uVmlld1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ0R1cmF0aW9uOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG5nU2VjOlwiPFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZHVyYXRpb25WaWV3L2R1cmF0aW9uVmlldy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWyd0YWdzU2VydmljZSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIodGFnc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0ua29lZiA9MTtcclxuICAgICAgICBpZih2bS5uZ1NlYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZtLmtvZWY9MTAwMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoJ2ZpbGVJbnB1dCcsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBmaWxlOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgbmdSZXF1aXJlZDogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBhY2NlcHQ6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50TmFtZTpcIkBcIixcclxuICAgICAgICAgICAgICAgIGJ1dHRvbldvcmQ6XCJAXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9maWxlSW5wdXQvZmlsZUlucHV0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbJyRjb21waWxlJywgJyRlbGVtZW50JywgJyRzY29wZSddO1xyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkY29tcGlsZSwgJGVsZW1lbnQsICRzY29wZSkge1xyXG5cclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2YXIgaW5wdXQgPSAkZWxlbWVudC5maW5kKCdpbnB1dCcpO1xyXG5cclxuICAgICAgICBpZihpc0VtcHR5KHZtLnBsYWNlbWVudE5hbWUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdm0ucGxhY2VtZW50TmFtZT0naW5zaWRlJ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNFbXB0eSh2bS5idXR0b25Xb3JkKSkge1xyXG4gICAgICAgICAgICB2bS5idXR0b25Xb3JkID0gJ2NvbW1vbi5TZWxlY3RGaWxlJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5wdXQuYmluZChcImNoYW5nZVwiLCBmdW5jdGlvbiAoY2hhbmdlRXZlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VFdmVudC50YXJnZXQuZmlsZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGlucHV0WzBdLmZpbGVzWzBdXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciBmaWxlSW5wdXRCb290c3RyYXAgPSBpbnB1dC5ib290c3RyYXBGaWxlSW5wdXQodm0uYnV0dG9uV29yZCk7XHJcblxyXG4gICAgICAgICRjb21waWxlKGFuZ3VsYXIuZWxlbWVudCgkZWxlbWVudC5maW5kKCdpbnB1dCcpKSkoJHNjb3BlKTtcclxuICAgICAgICAkY29tcGlsZShhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnQuZmluZCgnc3BhbicpKSkoJHNjb3BlKTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLmZpbGUgIT0gbnVsbCAmJiBjaGFuZ2VzT2JqLmZpbGUuY3VycmVudFZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0LnZhbChudWxsKTtcclxuICAgICAgICAgICAgICAgIGlucHV0LnRyaWdnZXIoXCJjaGFuZ2VcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOS4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmRpcmVjdGl2ZSgnZm9jdXNNZScsIGRpcmVjdGl2ZSk7XHJcbiAgICBkaXJlY3RpdmUuJGluamVjdCA9IFsnJHRpbWVvdXQnLCAnJHBhcnNlJ107XHJcbiAgICBmdW5jdGlvbiBkaXJlY3RpdmUoJHRpbWVvdXQsICRwYXJzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9ICRwYXJzZShhdHRycy5mb2N1c01lKTtcclxuICAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChtb2RlbCwgZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyAkKCAgZWxlbWVudFswXSkuZm9jdXMoKTsgfSwgMTAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5iaW5kKCdibHVyJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuYXNzaWduKHNjb3BlLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJmb3Jtc1dpemFyZHNcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgbmF2OiBcIkBcIlxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9mb3JtV2l6YXJkcy9mb3JtV2l6YXJkcy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWyckZWxlbWVudCcsICckc2NvcGUnLCAnJHRpbWVvdXQnLCAnJHEnLCAnJGNvbXBpbGUnLCdsb2NhbGVFdmVudHMnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRlbGVtZW50LCAkc2NvcGUsICR0aW1lb3V0LCAkcSwgJGNvbXBpbGUsbG9jYWxlRXZlbnRzKSB7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0ubmV4dCA9IGZhbHNlO1xyXG4gICAgICAgIHZtLnN0ZXBzID0gW107XHJcblxyXG4gICAgICAgICR0aW1lb3V0KFxyXG4gICAgICAgICAgICBjaGVja09ySW5pdCwgMjAwXHJcbiAgICAgICAgKTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrT3JJbml0KCkge1xyXG4gICAgICAgICAgICBpZiAodm0uc3RlcHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICR0aW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrT3JJbml0LCAyMDBcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpbml0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICAgICAgICAgIHZtLnNmID0gJGVsZW1lbnQuZmluZCgnZm9ybScpLnN0ZXBGb3JtV2l6YXJkKHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0U3RlcDowICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICB0aGVtZTogdm0uc3R5bGUgPyB2bS5zdHlsZSA6IFwiY2lyY2xlXCIsXHJcbiAgICAgICAgICAgICAgICBzaG93TmF2OiB2bS5uYXYgPyB2bS5uYXYgOiBcInRvcFwiLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBcImF1dG9cIixcclxuICAgICAgICAgICAgICAgIHNob3dCdXR0b25zOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJ0bDogJCgnYm9keScpLmhhc0NsYXNzKCdydGwnKSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG9uTmV4dDogZnVuY3Rpb24gKGksIHdpemFyZCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodm0uYWxsb3dOZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmFsbG93TmV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkZpbmlzaDogZnVuY3Rpb24gKGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25QcmV2OiBmdW5jdGlvbiAoaSwgd2l6YXJkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAkY29tcGlsZShhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnQuZmluZCgnLnNmLWNvbnRyb2xzJykpLmNvbnRlbnRzKCkpKCRzY29wZSk7XHJcbiAgICAgICAgICAgICRlbGVtZW50LmRhdGEoJ2luaXRpYXRlZCcsIHRydWUpO1xyXG4gICAgICAgICAgICB2bS5pc0luaXQ9dHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2bS5hZGRTdGVwID0gZnVuY3Rpb24gKHN0ZXApIHtcclxuICAgICAgICAgICAgdm0uc3RlcHMucHVzaChzdGVwKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5uZXh0PSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc3RlcEN0cmwgPSB2bS5zdGVwc1t2bS5zZi5zdGVwQWN0aXZlXTtcclxuICAgICAgICAgICAgaWYgKHN0ZXBDdHJsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzdGVwQ3RybC5uZXh0U3RlcCgpO1xyXG4gICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAkcS53aGVuKHZhbHVlKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmFsbG93TmV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNmLm5leHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5wcmV2U3RlcCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIC8q0YDQtdCw0LvQuNC30YPQtdC8INC10YHQu9C4INC/0L7QvdCw0LTQvtCx0LjRgtGB0Y8qKi9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRzY29wZS4kb24obG9jYWxlRXZlbnRzLmxvY2FsZUNoYW5nZXMsIGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xyXG4gICAgICAgICAgICB2bS5zZi5yZWZyZXNoKClcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIxLjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiB3aXphcmRCdXR0b25EaXJlY3RpdmUoYWN0aW9uKSB7XHJcbiAgICAgICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgICAgIC5kaXJlY3RpdmUoYWN0aW9uLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnQScsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZTogJ15mb3Jtc1dpemFyZHMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIGZvcm1zV2l6YXJkcykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnQub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRldmFsKCRhdHRyc1thY3Rpb25dKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1zV2l6YXJkc1thY3Rpb24ucmVwbGFjZShcImZ3XCIsIFwiXCIpLnRvTG93ZXJDYXNlKCldKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB3aXphcmRCdXR0b25EaXJlY3RpdmUoJ2Z3TmV4dCcpO1xyXG4gICAgd2l6YXJkQnV0dG9uRGlyZWN0aXZlKCdmd1ByZXZpb3VzJyk7XHJcbiAgICB3aXphcmRCdXR0b25EaXJlY3RpdmUoJ2Z3RmluaXNoJyk7XHJcbiAgICB3aXphcmRCdXR0b25EaXJlY3RpdmUoJ2Z3Q2FuY2VsJyk7XHJcbiAgICB3aXphcmRCdXR0b25EaXJlY3RpdmUoJ2Z3UmVzZXQnKTtcclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOS4wNC4yMDE2LlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJmb3Jtc1dpemFyZHNTdGVwXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdHJhbnNjbHVkZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmVxdWlyZToge1xyXG4gICAgICAgICAgICAgICAgZm9ybXNXaXphcmRzQ3RybDogJ15mb3Jtc1dpemFyZHMnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZXh0U3RlcDogXCImXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9mb3JtV2l6YXJkcy9mb3JtV2l6YXJkc1N0ZXAuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnJGVsZW1lbnQnLCAnJHNjb3BlJywgJyR0aW1lb3V0J107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkZWxlbWVudCwgJHNjb3BlLCAkdGltZW91dCkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLiRvbkluaXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybXNXaXphcmRzQ3RybC5hZGRTdGVwKHZtKTtcclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5kaXJlY3RpdmUoJ2ljaGVjaycsZGlyZWN0aXZlKTtcclxuXHJcbiAgICBkaXJlY3RpdmUuJGluamVjdD1bJyR0aW1lb3V0JywnJHBhcnNlJ11cclxuICAgIGZ1bmN0aW9uIGRpcmVjdGl2ZSgkdGltZW91dCwgJHBhcnNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVxdWlyZTogJ25nTW9kZWwnLFxyXG5cclxuICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKCRzY29wZSwgZWxlbWVudCwgJGF0dHJzLCBuZ01vZGVsKSB7XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYoJGF0dHJzLnBlcmZvcm1hbmNlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja2JveCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiAkdGltZW91dChjaGVja2JveCk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBjaGVja2JveCAgKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICRhdHRyc1sndmFsdWUnXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrYm94Q2xhc3MgPSAkKGVsZW1lbnQpLmF0dHIoJ2RhdGEtY2hlY2tib3gnKSA/ICQoZWxlbWVudCkuYXR0cignZGF0YS1jaGVja2JveCcpIDogJ2ljaGVja2JveF9taW5pbWFsLWdyZXknO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByYWRpb0NsYXNzID0gJChlbGVtZW50KS5hdHRyKCdkYXRhLXJhZGlvJykgPyAkKGVsZW1lbnQpLmF0dHIoJ2RhdGEtcmFkaW8nKSA6ICdpcmFkaW9fbWluaW1hbC1ncmV5JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGljaGVjayA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrYm94Q2xhc3MuaW5kZXhPZignX2xpbmUnKSA+IC0xIHx8IHJhZGlvQ2xhc3MuaW5kZXhPZignX2xpbmUnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljaGVjayA9ICQoZWxlbWVudCkuaUNoZWNrKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Q2xhc3M6IGNoZWNrYm94Q2xhc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpb0NsYXNzOiByYWRpb0NsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiAnPGRpdiBjbGFzcz1cImljaGVja19saW5lLWljb25cIj48L2Rpdj4nICsgJCh0aGlzKS5hdHRyKFwiZGF0YS1sYWJlbFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY2hlY2s9ICAgJChlbGVtZW50KS5pQ2hlY2soe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hDbGFzczogY2hlY2tib3hDbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvQ2xhc3M6IHJhZGlvQ2xhc3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS4kd2F0Y2goJGF0dHJzWyduZ01vZGVsJ10sIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmlDaGVjaygndXBkYXRlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuaUNoZWNrKCd1cGRhdGUnKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpY2hlY2sub24oJ2lmQ2hhbmdlZCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cigndHlwZScpID09PSAnY2hlY2tib3gnICYmICRhdHRyc1snbmdNb2RlbCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmdNb2RlbC4kc2V0Vmlld1ZhbHVlKGV2ZW50LnRhcmdldC5jaGVja2VkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoJ3R5cGUnKSA9PT0gJ3JhZGlvJyAmJiAkYXR0cnNbJ25nTW9kZWwnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZT09J3RydWUnfHx2YWx1ZT09MSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHZhbHVlPT0nZmFsc2UnfHx2YWx1ZT09MClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5nTW9kZWwuJHNldFZpZXdWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMi4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJpb25SYW5nZVNsaWRlclwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBtaW46IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgbWF4OiBcIjxcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgcHJlZml4OiBcIkBcIixcclxuICAgICAgICAgICAgICAgIG1heFBvc3RmaXg6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgcHJldHRpZnk6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgZ3JpZDogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBncmlkTWFyZ2luOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgc3RlcDogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBoaWRlTWluTWF4OiBcIkBcIixcclxuICAgICAgICAgICAgICAgIGhpZGVGcm9tVG86IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgZnJvbTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICB0bzogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiBcIj1cIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIG9uRmluaXNoOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIG5nRGlzYWJsZWQ6IFwiPFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnJGVsZW1lbnQnLCAnJHNjb3BlJywgJyR0aW1lb3V0J107XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJGVsZW1lbnQsICRzY29wZSwgJHRpbWVvdXQpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0uaW5pdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgc2xpZGVyID0ge307XHJcblxyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJGVsZW1lbnQuaW9uUmFuZ2VTbGlkZXIoe1xyXG4gICAgICAgICAgICAgICAgbWluOiB2bS5taW4sXHJcbiAgICAgICAgICAgICAgICB0eXBlOiB2bS50eXBlLFxyXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdm0ucG9zdGZpeCxcclxuICAgICAgICAgICAgICAgIHN0ZXA6IHZtLnN0ZXAsXHJcbiAgICAgICAgICAgICAgICBoaWRlX21pbl9tYXg6IHZtLmhpZGVNaW5NYXgsXHJcbiAgICAgICAgICAgICAgICBoaWRlX2Zyb21fdG86IHZtLmhpZGVGcm9tVG8sXHJcbiAgICAgICAgICAgICAgICBmcm9tOiB2bS5mcm9tLFxyXG4gICAgICAgICAgICAgICAgdG86IHZtLnRvLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZTp2bS5uZ0Rpc2FibGVkLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uIChhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEudG8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLnRvID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuZnJvbSA+IHZtLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLmZyb20gPSB2bS5tYXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlci51cGRhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJvbTogYS5mcm9tfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IGEuZnJvbSwgdG86IGEudG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uRmluaXNoOiBmdW5jdGlvbiAoYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS50byA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuZnJvbSA+IHZtLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLmZyb20gPSB2bS5tYXg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodm0uZnJvbSA9PSBhLmZyb20pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVyLnVwZGF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcm9tOiB2bS5mcm9tfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseShcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ub25GaW5pc2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBhLmZyb20sIHRvOiBhLnRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2xpZGVyID0gJGVsZW1lbnQuZGF0YShcImlvblJhbmdlU2xpZGVyXCIpO1xyXG4gICAgICAgICAgICB2bS5pbml0ID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy4kb25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXNPYmopIHtcclxuICAgICAgICAgICAgaWYgKHZtLmluaXQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gY2hhbmdlc09iaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbVtwcm9wXSA9IGNoYW5nZXNPYmpbcHJvcF0uY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09ICd0bycgfHwgcHJvcCA9PSAnZnJvbScpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtW3Byb3BdID0gZWxlbVtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVyLnVwZGF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT0gJ21heCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZtLmZyb20gPiBjaGFuZ2VzT2JqWydtYXgnXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmZyb20gPSBjaGFuZ2VzT2JqWydtYXgnXS5jdXJyZW50VmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ub25GaW5pc2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiB2bS5mcm9tLCB0bzogdm0udG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT0gJ25nRGlzYWJsZWQnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXIudXBkYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2Rpc2FibGU6IGNoYW5nZXNPYmpbcHJvcF0uY3VycmVudFZhbHVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJoZWxwUG9wb3ZlclwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6XCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ0NvbnRlbnQ6XCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ1RpdGxlOlwiPFwiLFxyXG4gICAgICAgICAgICAgICAgbmdQb3NpdGlvbjonQCcsXHJcbiAgICAgICAgICAgICAgICBwb3BvdmVyQ2xhc3M6J0AnLFxyXG4gICAgICAgICAgICAgICAgbmdJY29uOlwiQFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvaGVscFBvcG92ZXIvaGVscFBvcG92ZXIuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnQ29udGVudFR5cGVzJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihDb250ZW50VHlwZXMpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0uJG9uSW5pdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYoIXZtLm5nSWNvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm0ubmdJY29uPSdmYS1xdWVzdGlvbi1jaXJjbGUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIXZtLm5nUG9zaXRpb24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZtLm5nUG9zaXRpb249J3RvcCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA3LjA2LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJ0YWJsZUhlbHBlclwiLCBcIiRcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcImxhc3RQbGF5RXZlbnRzVGFibGVcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zOiAnPCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOlwiQFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvbGFzdFBsYXlFdmVudHNUYWJsZS9sYXN0UGxheUV2ZW50c1RhYmxlLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcih0YWJsZUhlbHBlciwgJCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciBvcHRpb25zID0gdGFibGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckFuZ3VsYXJXYXlUYWJsZShbZmFsc2UsIGZhbHNlLCBmYWxzZV0pO1xyXG4gICAgICAgIG9wdGlvbnMuZHRPcHRpb25zID0gb3B0aW9ucy5kdE9wdGlvbnMud2l0aE9wdGlvbihcInNjcm9sbFlcIiwgJzI5MXB4Jyk7XHJcblxyXG4gICAgICAgIHZtLmR0T3B0aW9ucyA9IG9wdGlvbnMuZHRPcHRpb25zO1xyXG4gICAgICAgIHZtLmR0Q29sdW1uRGVmcyA9IG9wdGlvbnMuZHRDb2x1bW5EZWZzO1xyXG5cclxuICAgICAgICAkcS53aGVuKHZtLml0ZW1zKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdm0uZXZlbnRzID0gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOS4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuZGlyZWN0aXZlKCdwb3BvdmVyQ2xvc2UnLCBbXCIkdGltZW91dFwiLCBmdW5jdGlvbiAoJHRpbWVvdXQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzY29wZToge1xyXG4gICAgICAgICAgICAgICAgZXhjbHVkZUNsYXNzOiAnQCdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cmlnZ2VyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2xvc2VUcmlnZ2VyKGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudCh0cmlnZ2VyWzBdKS50cmlnZ2VySGFuZGxlcignY2xpY2snKS5yZW1vdmVDbGFzcygndHJpZ2dlcicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGVsZW1lbnQub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV0YXJnZXQgPSBhbmd1bGFyLmVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGxlbmd0aCA9IHRyaWdnZXIubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXRhcmdldC5oYXNDbGFzcygndHJpZ2dlcicpICYmICFldGFyZ2V0Lmhhc0NsYXNzKHNjb3BlLmV4Y2x1ZGVDbGFzcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0bGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlVHJpZ2dlcihpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfV0pO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmRpcmVjdGl2ZSgncG9wb3ZlckVsZW0nLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygndHJpZ2dlcicpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfSk7XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkZmlsdGVyXCIsIFwiJHFcIiwgXCIkc2NvcGVcIiwgXCJjb25maXJtTW9kYWxTZXJ2aWNlXCIsIFwiJHRpbWVvdXRcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwibXVsdGlwbGVTZWxlY3RcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgaXRlbXM6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBrZXk6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZVBsYWNlaG9sZGVyOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIGFsbG93QWRkOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIGFsbG93UmVtb3ZlOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIG9uSXRlbUFkZDogJyYnLFxyXG4gICAgICAgICAgICAgICAgb25JdGVtUmVtb3ZlOiAnJicsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZVRyYW5zbGF0ZTogJ0AnLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0SWNvbjogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTpcIiZcIixcclxuICAgICAgICAgICAgICAgIGFwcGVuZFRvQm9keTpcIkBcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL211bHRpcGxlU2VsZWN0L21pbHRpcGxlU2VsZWN0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkZmlsdGVyLCAkcSwgJHNjb3BlLCBjb25maXJtTW9kYWxTZXJ2aWNlLCR0aW1lb3V0KSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLmdldENsYXNzRm9ySXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgdHJhbnNsYXRlQ2xhc3MgPSB2bS50cmFuc2xhdGUgPyAnY29uc3RhbnRzLScgKyB2bS50eXBlVHJhbnNsYXRlICsgJy0nICsgaXRlbVt2bS5rZXldIDogXCJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIFt7J2xhYmVsLWRhbmdlcic6IGl0ZW0uaG92ZXJ9LCB0cmFuc2xhdGVDbGFzc107XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGlmKCF2bS5hcHBlbmRUb0JvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2bS5hcHBlbmRUb0JvZHk9J3RydWUnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodm0ua2V5ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdm0ua2V5ID0gXCJpZFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5mb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHZtLmlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2bS5maWx0ZXJNb2RlbCA9IHtcclxuICAgICAgICAgICAgc2VsZWN0OiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmZpbHRlclBvcG92ZXIgPSB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvbXVsdGlwbGVTZWxlY3QvbWlsdGlwbGVTZWxlY3RQb3BldmVyLmh0bWwnXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gVXBkYXRlSXRlbXMoKSB7XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh2bS5pdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIFVwZGF0ZVNlbGVjdCgpIHtcclxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHZtLm5nTW9kZWwsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZ2V0QnlJZChpdGVtW3ZtLmtleV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRCeUlkKGtleSkge1xyXG4gICAgICAgICAgICB2YXIgZmlsdGVyID0ge307XHJcbiAgICAgICAgICAgIGZpbHRlclt2bS5rZXldID0ga2V5O1xyXG4gICAgICAgICAgICBpZiAodm0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAkZmlsdGVyKCdmaWx0ZXInKSh2bS5pdGVtcywgZmlsdGVyKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBVcGRhdGVJdGVtcygpO1xyXG4gICAgICAgIFVwZGF0ZVNlbGVjdCgpO1xyXG5cclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmouaXRlbXMgJiYgY2hhbmdlc09iai5pdGVtcy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgVXBkYXRlSXRlbXMoKTtcclxuICAgICAgICAgICAgICAgIFVwZGF0ZVNlbGVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLm5nTW9kZWwgJiYgY2hhbmdlc09iai5uZ01vZGVsLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBVcGRhdGVTZWxlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5nZXRUZXh0ID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHZtLnRleHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhW3ZtLnRleHRdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uc2VsZWN0ID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbS5zZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB2bS5uZ01vZGVsLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIHZtLm9uQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgIHZtLmZpbHRlck1vZGVsW3ZtLnRleHRdID0gJyc7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jb3VudCA9IDA7XHJcbiAgICAgICAgdm0udW5TZWxlY3QgPSBmdW5jdGlvbiAoc2VsZWN0ZWQpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0QnlJZChzZWxlY3RlZFt2bS5rZXldKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZtLm5nTW9kZWwuc3BsaWNlKHZtLm5nTW9kZWwuaW5kZXhPZihzZWxlY3RlZCksIDEpO1xyXG4gICAgICAgICAgICB2bS5vbkNoYW5nZSgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2godm0ubmdNb2RlbCwgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHZhciBpID0gdm0uaXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXRlbXNbaV0uc2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2bS5uZ01vZGVsLmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5rZXlVcCA9IGZ1bmN0aW9uICgkZXZlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICgkZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9IGdldFN0cm9uZ0l0ZW0oKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPj0gMSAmJiAhaXRlbXNbMF0uc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0KGl0ZW1zWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZtLmFsbG93QWRkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uYWRkSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hZGRJdGVtID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5vbkl0ZW1BZGQoe3ZhbHVlOiB2bS5maWx0ZXJNb2RlbFt2bS50ZXh0XX0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyTW9kZWxbdm0udGV4dF0gPSAnJztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ubm90RXhpc3QgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGdldFN0cm9uZ0l0ZW0oKS5sZW5ndGggPT0gMDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRTdHJvbmdJdGVtKCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gJGZpbHRlcignZmlsdGVyJykodm0uaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0uZmlsdGVyTW9kZWxbdm0udGV4dF0gPT0gaXRlbVt2bS50ZXh0XTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvKnBvcHVwKi9cclxuICAgICAgICB2bS5mb2N1cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc2hvd0lucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdm0uaXNGb2N1cyA9IHRydWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5mb2N1c0lucHV0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zaG93SW5wdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2bS5pc0ZvY3VzID0gdHJ1ZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5ibHVyID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdm0uc2hvd0lucHV0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB2bS5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qcmVtb3ZpbmcqL1xyXG5cclxuICAgICAgICB2bS5yZW1vdmVJdGVtID0ge1xyXG5cclxuICAgICAgICAgICAgc2V0IHJlbW92ZSh2YWwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB2bS5pdGVtcy5pbmRleE9mKHZhbCk7XHJcbiAgICAgICAgICAgICAgICB2bS5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdm0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2YWwuaG92ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdyhcImJsb2Nrcy5Db25maXJtQWN0aW9uTW9kYWxIaW50XCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm0ub25JdGVtUmVtb3ZlKHtpdGVtOiB2YWx9KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pdGVtcy5zcGxpY2UoaW5kZXgsIDAsIHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uZHJvcHBlZE1vZGVsID0ge307XHJcbiAgICAgICAgdm0ub25TdGFydCA9IGZ1bmN0aW9uIChlLCB1aSkge1xyXG5cclxuICAgICAgICAgICAgc2V0RHJhZ0JlZ2luKHRydWUpO1xyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uU3RvcCA9IGZ1bmN0aW9uIChlLCB1aSkge1xyXG5cclxuICAgICAgICAgICAgc2V0RHJhZ0JlZ2luKGZhbHNlKTtcclxuXHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25PdmVyID0gZnVuY3Rpb24gKGUsIHVpKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIGRyb3BwZWRPbiA9IGFuZ3VsYXIuZWxlbWVudCh1aS5kcmFnZ2FibGUpLmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgICAgIHNldEhvdmVyT25JdGVtKGRyb3BwZWRPbiwgdHJ1ZSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uT3V0ID0gZnVuY3Rpb24gKGUsIHVpKSB7XHJcbiAgICAgICAgICAgIHZhciBkcm9wcGVkT24gPSBhbmd1bGFyLmVsZW1lbnQodWkuZHJhZ2dhYmxlKS5hdHRyKCdpZCcpO1xyXG4gICAgICAgICAgICBzZXRIb3Zlck9uSXRlbShkcm9wcGVkT24sIGZhbHNlKVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBzZXREcmFnQmVnaW4odmFsdWUpIHtcclxuICAgICAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kcm9wcGVkTW9kZWwuYmVnaW5pbmcgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDtcclxuICAgICAgICBmdW5jdGlvbiBzZXRIb3Zlck9uSXRlbShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0QnlJZChrZXkpO1xyXG4gICAgICAgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaG92ZXIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcIiRxXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcInByZWxvYWRlclwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBzaG93OiBcIjxcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL3ByZWxvYWRlci9wcmVsb2FkZXIuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRxKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0uJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5zaG93KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2bS5zaG93UHJlbG9hZGVyPXRydWU7XHJcbiAgICAgICAgICAgICAgICAkcS53aGVuKHZtLnNob3cpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnNob3dQcmVsb2FkZXI9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2hvd1ByZWxvYWRlcj1mYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG59KSgpO1xyXG5cclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGRpcmVjdGl2ZS4kaW5qZWN0ID0gW1wiJHRpbWVvdXRcIiwgXCIkcGFyc2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuZGlyZWN0aXZlKFwic2VsZWN0MlwiLCBkaXJlY3RpdmUpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBkaXJlY3RpdmUoJHRpbWVvdXQsICRwYXJzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiAnQUMnLFxyXG4gICAgICAgICAgICByZXF1aXJlOiAnbmdNb2RlbCcsXHJcbiAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cnMsIG1vZGVsKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gW10sXHJcbiAgICAgICAgICAgICAgICAgICAgZWwgPSAkKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRlX2lkID0gc3RhdGUuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGVfaWQpIHJldHVybiBzdGF0ZS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gc3RhdGVfaWQuc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzWzBdID09ICdpbWFnZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNbMl0pIHJldHVybiBcIjxpbWcgY2xhc3M9J2ZsYWcnIHNyYz0nLi4vaW1hZ2VzL2ZsYWdzL1wiICsgcmVzWzFdLnRvTG93ZXJDYXNlKCkgKyBcIi1cIiArIHJlc1syXS50b0xvd2VyQ2FzZSgpICsgXCIucG5nJyBzdHlsZT0nd2lkdGg6MjdweDtwYWRkaW5nLXJpZ2h0OjEwcHg7bWFyZ2luLXRvcDogLTNweDsnLz5cIiArIHN0YXRlLnRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBcIjxpbWcgY2xhc3M9J2ZsYWcnIHNyYz0nLi4vaW1hZ2VzL2ZsYWdzL1wiICsgcmVzWzFdLnRvTG93ZXJDYXNlKCkgKyBcIi5wbmcnIHN0eWxlPSd3aWR0aDoyN3B4O3BhZGRpbmctcmlnaHQ6MTBweDttYXJnaW4tdG9wOiAtM3B4OycvPlwiICsgc3RhdGUudGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRSZXN1bHQ6IGZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0U2VsZWN0aW9uOiBmb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBlbC5kYXRhKCdwbGFjZWhvbGRlcicpID8gZWwuZGF0YSgncGxhY2Vob2xkZXInKSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0NsZWFyOiBlbC5kYXRhKCdhbGxvd2NsZWFyJykgPyBlbC5kYXRhKCdhbGxvd2NsZWFyJykgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtSW5wdXRMZW5ndGg6IGVsLmRhdGEoJ21pbmltdW1JbnB1dExlbmd0aCcpID8gZWwuZGF0YSgnbWluaW11bUlucHV0TGVuZ3RoJykgOiAtMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IGVsLmRhdGEoJ3NlYXJjaCcpID8gMSA6IC0xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBlbC5kYXRhKCdzdHlsZScpID8gJ2Zvcm0td2hpdGUnIDogJydcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWw9ZWwuc2VsZWN0MihvcHRpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBtb2RlbC4kcmVuZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGVsLnNlbGVjdDIoXCJ2YWxcIiwgbW9kZWwuJHZpZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuJHNldFZpZXdWYWx1ZShlbC5zZWxlY3QyKFwidmFsXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICB9LCAwLCBmYWxzZSk7XHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNS4wNC4yMDE2LlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDQuMjAxNi5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwidGFnc0lucHV0XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAnJicsXHJcbiAgICAgICAgICAgICAgICB0YWdzOiAnPCcsXHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICc8J1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL3RhZ3MvdGFncy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWyckZWxlbWVudCcsICckc2NvcGUnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRlbGVtZW50LCAkc2NvcGUpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIGlmICh2bS5zb3VyY2UpIHtcclxuXHJcbiAgICAgICAgICAgIGlmKHZtLnNvdXJjZS50aGVuID09J2Z1bmN0aW9uJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm0uc291cmNlLnRoZW4oZnVuY3Rpb24gKHJlc3VsdClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpbml0VGFncyhyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpbml0VGFncyh2bS5zb3VyY2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAkZWxlbWVudC50YWdzaW5wdXQoe1xyXG4gICAgICAgICAgICAgICAgdGFnQ2xhc3M6ICdsYWJlbCBsYWJlbC1zdWNjZXNzJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2bS50YWdzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8dm0udGFncy5sZW5ndGg7aSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAkZWxlbWVudC50YWdzaW5wdXQoJ2FkZCcsIHZtLnRhZ3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkZWxlbWVudC5vbignaXRlbVJlbW92ZWQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe2RhdGE6ICRlbGVtZW50LnZhbCgpfSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJGVsZW1lbnQub24oJ2l0ZW1BZGRlZCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB2bS5vbkNoYW5nZSh7ZGF0YTogJGVsZW1lbnQudmFsKCl9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICRzY29wZS4kd2F0Y2goXCJ2bS50YWdzXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHZtLnRhZ3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICRlbGVtZW50LnRhZ3NpbnB1dCgncmVtb3ZlQWxsJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGluaXRUYWdzKHNvdXJjZSkge1xyXG4gICAgICAgICAgICB2YXIgdHQgPSBuZXcgQmxvb2Rob3VuZCh7XHJcbiAgICAgICAgICAgICAgICBsaW1pdDogMTAsXHJcbiAgICAgICAgICAgICAgICBkYXR1bVRva2VuaXplcjogQmxvb2Rob3VuZC50b2tlbml6ZXJzLm9iai53aGl0ZXNwYWNlKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICAgICAgcXVlcnlUb2tlbml6ZXI6IEJsb29kaG91bmQudG9rZW5pemVycy53aGl0ZXNwYWNlLFxyXG4gICAgICAgICAgICAgICAgbG9jYWw6ICQubWFwKHNvdXJjZSwgZnVuY3Rpb24gKGl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogaXRlbX07XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJGVsZW1lbnQudGFnc2lucHV0KHtcclxuICAgICAgICAgICAgICAgIGl0ZW1WYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgIGl0ZW1UZXh0OiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgdHlwZWFoZWFkanM6IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUtleTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHR0LnR0QWRhcHRlcigpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7XHJcblxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJ0YWdzU2VsZWN0XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nTW9kZWw6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgYWxsb3dBZGQ6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgdGFnc1R5cGU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6XCImXCIsXHJcbiAgICAgICAgICAgICAgICBhcHBlbmRUb0JvZHk6XCJAXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy90YWdzU2VsZWN0L3RhZ3NTZWxlY3QuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsndGFnc1NlcnZpY2UnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHRhZ3NTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdGFnc1NlcnZpY2UuZ2V0VGFnc0J1eVR5cGUodm0udGFnc1R5cGUpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB2bS50YWdzID0gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5jcmVhdGVUYWcgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0YWdzU2VydmljZS5hZGRUYWdzQnV5VHlwZSh2YWx1ZSwgdm0udGFnc1R5cGUpO1xyXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0udGFncy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB2bS5uZ01vZGVsLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5yZW1vdmVUYWcgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRhZ3NTZXJ2aWNlLnJlbW92ZVRhZyhpdGVtKTtcclxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJEVE9wdGlvbnNCdWlsZGVyXCIsIFwiRFRDb2x1bW5CdWlsZGVyXCIsIFwiJGNvbXBpbGVcIiwgXCIkc2NvcGVcIiwgXCJsb2NhbGVcIiwgXCJ0ZWxlZHNUYWJsZVNlcnZpY2VcIiwgXCIkcVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJ0ZWxlZHNUYWJsZVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBkdENvbHVtbnM6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgc2VydmVyRGF0YTogJzwnLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdFNvcnQ6JzwnLFxyXG4gICAgICAgICAgICAgICAgY29sdW1uczogXCI9XCIsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJz1yb3dUaXRsZScsXHJcblxyXG4gICAgICAgICAgICAgICAgc2hvcnQ6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsWTogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBzY3JvbGxDb2xsYXBzZTogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlRnVuYzogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIHNob3dSZWxvYWQ6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgcm93UmVvcmRlcjogXCJAXCIsXHJcblxyXG4gICAgICAgICAgICAgICAgYWN0aW9uQ2FsbGJhY2s6IFwiJlwiLFxyXG4gICAgICAgICAgICAgICAgb25TZWxlY3RlZDogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBvblJvd1Jlb3JkZXI6IFwiJlwiLFxyXG4gICAgICAgICAgICAgICAgb25DcmVhdGVkUm93OlwiJlwiLFxyXG4gICAgICAgICAgICAgICAgaW50YW5jZUNhbGxiYWNrOiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB7XHJcbiAgICAgICAgICAgICAgICAnYnV0dG9ucyc6ICc/ZnVuY0J1dHRvbnMnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvdGVsZWRzVGFibGUvdGVsZWRzVGFibGUuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoRFRPcHRpb25zQnVpbGRlciwgRFRDb2x1bW5CdWlsZGVyLCAkY29tcGlsZSwgJHNjb3BlLCBsb2NhbGUsIHRlbGVkc1RhYmxlU2VydmljZSwgJHEpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2YXIgZGVmZXJCdWlsZCA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgdm0ucHJvbWlzZSA9IGRlZmVyQnVpbGQucHJvbWlzZTtcclxuICAgICAgICB2YXIgc2VydmVyU2lkZSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHZtLnNlcnZlclNpZGUgJiYgdm0uc2VydmVyU2lkZSA9PSBcImZhbHNlXCIpIHtcclxuICAgICAgICAgICAgc2VydmVyU2lkZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc2hvcnQgPSB2bS5zaG9ydCAmJiB2bS5zaG9ydCAhPSBcIlwiO1xyXG5cclxuICAgICAgICB2bS5kdE9wdGlvbnMgPSBEVE9wdGlvbnNCdWlsZGVyXHJcbiAgICAgICAgICAgIC5uZXdPcHRpb25zKClcclxuICAgICAgICAgICAgLndpdGhGblNlcnZlckRhdGEoc2VydmVyRGF0YSlcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oJ3NlcnZlclNpZGUnLCBzZXJ2ZXJTaWRlKVxyXG4gICAgICAgICAgICAud2l0aERhdGFQcm9wKCdkYXRhJylcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oJ3Byb2Nlc3NpbmcnLCBmYWxzZSlcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oJ2FqYXgnLCB0cnVlKVxyXG4gICAgICAgICAgICAud2l0aE9wdGlvbigncmVzcG9uc2l2ZScsIHRydWUpXHJcbiAgICAgICAgICAgIC53aXRoT3B0aW9uKFwiaW5mb1wiLCBmYWxzZSlcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oXCJzZWFyY2hpbmdcIiwgZmFsc2UpXHJcbiAgICAgICAgICAgIC53aXRoT3B0aW9uKFwicGFnZUxlbmd0aFwiLCAyNSlcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oXCJwYWdpbmdcIiwgIXNob3J0KVxyXG4gICAgICAgICAgICAud2l0aE9wdGlvbihcImluaXRDb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBkZWZlckJ1aWxkLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oXCJsZW5ndGhDaGFuZ2VcIiwgIXNob3J0KS53aXRoRE9NKFxyXG4gICAgICAgICAgICAgICAgXCI8J3Jvdyc8J2NvbC1zbS0xMid0cj4+XCIgK1xyXG4gICAgICAgICAgICAgICAgXCI8J3Jvdyc8J2NvbC1zbS01J2w+PCdjb2wtc20tNydwPj5cIilcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oJ2NyZWF0ZWRSb3cnLCBmdW5jdGlvbiAocm93LCBkYXRhLCBkYXRhSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChyb3cpLmF0dHIoXCJuZy1kYmxjbGlja1wiLCBcInZtLmRvdWJsZUNsaWNrUm93KCdcIiArIGRhdGEuaWQgKyBcIicpXCIpO1xyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KHJvdykuYXR0cihcIm5nLWNsaWNrXCIsIFwidm0uY2xpY2tSb3coJ1wiICsgZGF0YS5pZCArIFwiJylcIik7XHJcbiAgICAgICAgICAgICAgICBpZih2bS5vbkNyZWF0ZWRSb3cpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub25DcmVhdGVkUm93KHtyb3c6e3Jvd0VsZW1lbnQ6JChyb3cpfSxkYXRhOmRhdGF9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICRjb21waWxlKGFuZ3VsYXIuZWxlbWVudChyb3cpKSgkc2NvcGUpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAud2l0aFBhZ2luYXRpb25UeXBlKCdmdWxsX251bWJlcnMnKTtcclxuXHJcbiAgICAgICAgaWYgKCFpc0VtcHR5KHZtLnNjcm9sbFkpKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5zY3JvbGxDb2xsYXBzZSA9PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kdE9wdGlvbnMud2l0aE9wdGlvbihcImJTY3JvbGxDb2xsYXBzZVwiLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kdE9wdGlvbnMud2l0aE9wdGlvbihcImJTY3JvbGxDb2xsYXBzZVwiLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2bS5kdE9wdGlvbnMud2l0aE9wdGlvbihcInNjcm9sbFlcIiwgdm0uc2Nyb2xsWSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2bS5yb3dSZW9yZGVyKSB7XHJcbiAgICAgICAgICAgIHZtLmR0T3B0aW9ucy53aXRoT3B0aW9uKFwicm93UmVvcmRlclwiLCB7c2VsZWN0b3I6ICcucmVvcmRlcid9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxvY2FsZS5nZXRMb2NhbGUoKSA9PSAncnUnKSB7XHJcbiAgICAgICAgICAgIHZtLmR0T3B0aW9ucy53aXRoTGFuZ3VhZ2VTb3VyY2UoJy8vY2RuLmRhdGF0YWJsZXMubmV0L3BsdWctaW5zLzEuMTAuMTIvaTE4bi9SdXNzaWFuLmpzb24nKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZtLmR0T3B0aW9ucy53aXRoTGFuZ3VhZ2VTb3VyY2UoJy8vY2RuLmRhdGF0YWJsZXMubmV0L3BsdWctaW5zLzEuMTAuMTIvaTE4bi9FbmdsaXNoLmpzb24nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHZtLmRlZmF1bHRTb3J0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdm0uZHRPcHRpb25zLndpdGhPcHRpb24oJ29yZGVyJywgdm0uZGVmYXVsdFNvcnQpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmICh2bS5jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5yb3dSZW9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5jb2x1bW5zLnVuc2hpZnQoXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8aSBjbGFzcz1cImZhIGZhLWJhcnNcIj48L2k+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm90U29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbENsYXNzOiBcInJlb3JkZXIgaWNvbi1jZWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7Y2xhc3M6ICdpY29uLXNvcnQnLCBuYW1lOiBcIlwifVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZtLnRpdGxlID0gdGVsZWRzVGFibGVTZXJ2aWNlLmdldFRpdGxlKHZtLmNvbHVtbnMpO1xyXG4gICAgICAgICAgICB2bS5jb2x1bW5zLnVuc2hpZnQoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJjdXN0b21cIixcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNlbGVjdGVkW2Z1bGwuaWRdID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGRpdiAgICBuZy1kYmxjbGljaz1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgIGljaGVjayBuZy1tb2RlbD1cInZtLnNlbGVjdGVkW1xcJycgKyBmdWxsLmlkICsgJ1xcJ11cIiAgIG5nLWNoYW5nZT1cInZtLnRvZ2dsZU9uZSggdm0uc2VsZWN0ZWQpXCIgPjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBub3RTb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxDbGFzczogXCJvbmUtY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2bS5kdENvbHVtbnNzID0gdGVsZWRzVGFibGVTZXJ2aWNlLmdldER0Q29sdW1ucyh2bS5jb2x1bW5zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLmR0Q29sdW1ucy51bnNoaWZ0KERUQ29sdW1uQnVpbGRlci5uZXdDb2x1bW4oJ2NyZWF0ZWRfYXQnKVxyXG4gICAgICAgICAgICAgICAgLnJlbmRlcldpdGgoZnVuY3Rpb24gKGRhdGEsIHR5cGUsIGZ1bGwsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RlZFtmdWxsLmlkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGRpdiAgbmctZGJsY2xpY2s9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiICBpY2hlY2sgbmctbW9kZWw9XCJ2bS5zZWxlY3RlZFtcXCcnICsgZnVsbC5pZCArICdcXCddXCIgICBuZy1jaGFuZ2U9XCJ2bS50b2dnbGVPbmUoIHZtLnNlbGVjdGVkKVwiID48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfSkubm90U29ydGFibGUoKS53aXRoT3B0aW9uKFwic0NsYXNzXCIsIFwib25lLWNoZWNrYm94XCIpKTtcclxuXHJcbiAgICAgICAgICAgIHZtLmR0Q29sdW1uc3MgPSB2bS5kdENvbHVtbnM7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2VydmVyRGF0YShzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2ssIG9TZXR0aW5ncykge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZCA9IHt9O1xyXG4gICAgICAgICAgICB2bS5zZXJ2ZXJEYXRhKHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjaywgb1NldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ucmVsb2FkRGF0YSA9IGZ1bmN0aW9uIChyZXNldFBhZ2luZywgZnVuYykge1xyXG4gICAgICAgICAgICB2bS5kdEluc3RhbmNlLnJlbG9hZERhdGEoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdW5Ub2dnbGVBbGwoKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuYygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSwgcmVzZXRQYWdpbmcpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ucmVsb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5yZWxvYWREYXRhKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmRvdWJsZUNsaWNrUm93ID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgIHZtLmFjdGlvbignZG91YmxlQ2xpY2snLCBpZCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jbGlja1JvdyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICB2bS5hY3Rpb24oJ2NsaWNrJywgaWQpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmR0SW5zdGFuY2UgPSB7fTtcclxuICAgICAgICB2bS5kdEludGFuY2VDYWxsYmFjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB2bS5kdEluc3RhbmNlID0gaW5zdGFuY2U7XHJcblxyXG4gICAgICAgICAgICB2bS5kdEluc3RhbmNlLkRhdGFUYWJsZS5vbigncm93LXJlb3JkZXInLCBmdW5jdGlvbiAoZSwgZGlmZiwgZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnJvd1Jlb3JkZXIgJiYgZGlmZiAmJiBkaWZmLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBlZGl0LnRyaWdnZXJSb3cuaW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2hhbmdlZCA9IGRpZmYuZmluZChmdW5jdGlvbiAoaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0Lm9sZFBvc2l0aW9uID09IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdQb3MgPSBjaGFuZ2VkLm5ld1Bvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvbGRQb3MgPSBjaGFuZ2VkLm9sZFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uUm93UmVvcmRlcih7bmV3UG9zOiBuZXdQb3MsIG9sZFBvczogb2xkUG9zfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZtLmludGFuY2VDYWxsYmFjayh7aW50YW5jZTogdm19KVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uYWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbiwgaWQpIHtcclxuICAgICAgICAgICAgdm0uYWN0aW9uQ2FsbGJhY2soe2FjdGlvbjogYWN0aW9uLCBpZDogaWR9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNlbGVjdGVkID0ge307XHJcbiAgICAgICAgdm0uc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgdm0udG9nZ2xlQWxsID0gdG9nZ2xlQWxsO1xyXG4gICAgICAgIHZtLnRvZ2dsZU9uZSA9IHRvZ2dsZU9uZTtcclxuICAgICAgICB2bS51blRvZ2dsZUFsbCA9IHVuVG9nZ2xlQWxsKCk7XHJcblxyXG4gICAgICAgIHZtLmlzU2VsZWN0QW55ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodm0uc2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHZtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uc2VsZWN0ZWRbcF0gPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5pc1NlbGVjdE11Y2gyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodm0uc2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gdm0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zZWxlY3RlZFtwXSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVuVG9nZ2xlQWxsKCkge1xyXG4gICAgICAgICAgICB2bS51bnNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bS51bnNlbGVjdEhvdmVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bS50b2dnbGVBbGwoZmFsc2UsIHZtLnNlbGVjdGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZUFsbChzZWxlY3RBbGwsIHNlbGVjdGVkSXRlbXMpIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNbaWRdID0gc2VsZWN0QWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0ZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZU9uZShzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRJdGVtc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0ZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2bS5zZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBvblNlbGVjdGVkKCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb25TZWxlY3RlZCgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gW107XHJcbiAgICAgICAgICAgIHZhciBhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiB2bS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnNlbGVjdGVkW2lkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0ub25TZWxlY3RlZCh7aWRzOiBzZWxlY3RlZCwgYWxsOiBhbGx9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIyLjA2LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGZhY3RvcnkuJGluamVjdCA9IFtcIkRUQ29sdW1uQnVpbGRlclwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCd0ZWxlZHNUYWJsZVNlcnZpY2UnLCBmYWN0b3J5KTtcclxuXHJcbiAgICBmdW5jdGlvbiBmYWN0b3J5KERUQ29sdW1uQnVpbGRlcikge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0RHRDb2x1bW5zOiBnZXREdENvbHVtbnMsXHJcbiAgICAgICAgICAgIGdldFRpdGxlOiBnZXRUaXRsZVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXREdENvbHVtbnMoY29sdW1ucykge1xyXG4gICAgICAgICAgICB2YXIgZHRDb2x1bW5zID0gY29sdW1ucy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHZhciBkdENvbHVtbjtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRhdGVcIjoge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1hdFN0cmluZyA9IFwiREQuTU0uWVlZWSBISDptbTpzc1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5mb3JtYXREYXRlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFN0cmluZyA9IGl0ZW0uZm9ybWF0RGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZHRDb2x1bW4gPSBEVENvbHVtbkJ1aWxkZXIubmV3Q29sdW1uKGl0ZW0ubmFtZSkucmVuZGVyV2l0aChmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZnVsbCwgbWV0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSAnMDAwMC0wMC0wMCAwMDowMDowMCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudC51dGMoZGF0YSkubG9jYWwoKS5mb3JtYXQoZm9ybWF0U3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR0Q29sdW1uID0gRFRDb2x1bW5CdWlsZGVyLm5ld0NvbHVtbihpdGVtLm5hbWUpLnJlbmRlcldpdGgoZnVuY3Rpb24gKGRhdGEsIHR5cGUsIGZ1bGwsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4+JyArIGRhdGEgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR0Q29sdW1uID0gRFRDb2x1bW5CdWlsZGVyLm5ld0NvbHVtbihpdGVtLm5hbWUpLnJlbmRlcldpdGgoZnVuY3Rpb24gKGRhdGEsIHR5cGUsIGZ1bGwsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4+JyArIGRhdGEgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRhZ3NcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkdENvbHVtbiA9IERUQ29sdW1uQnVpbGRlci5uZXdDb2x1bW4oaXRlbS5uYW1lKS5yZW5kZXJXaXRoKGZ1bmN0aW9uIChkYXRhLCB0eXBlLCBmdWxsLCBtZXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCI8dmlldy10YWcgdGFncy1zdHJpbmc9J1wiICsgYW5ndWxhci50b0pzb24oZGF0YSkgKyBcIic+PC92aWV3LXRhZz5cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkdENvbHVtbiA9IERUQ29sdW1uQnVpbGRlci5uZXdDb2x1bW4oaXRlbS5uYW1lKS5yZW5kZXJXaXRoKGZ1bmN0aW9uIChkYXRhLCB0eXBlLCBmdWxsLCBtZXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCI8c3BhbiBjbGFzcz0nY29udHJvbCcgbmctY2xpY2s9XFxcInZtLmFjdGlvbignY2xpY2tOYW1lJyxcXCdcIiArIGZ1bGwuaWQgKyBcIlxcJylcXFwiPlwiICsgZGF0YSArIFwiPC9zcGFuPlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlua1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR0Q29sdW1uID0gRFRDb2x1bW5CdWlsZGVyLm5ld0NvbHVtbihpdGVtLm5hbWUpLnJlbmRlcldpdGgoZnVuY3Rpb24gKGRhdGEsIHR5cGUsIGZ1bGwsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIjxhIGNsYXNzPSdjb250cm9sIHRlbGVkcy1saW5rJyB1aS1zcmVmPSdcIiArIGl0ZW0uc3RhdGUgKyBcIih7aWQ6XFxcIlwiICsgZnVsbC5pZCArIFwiXFxcIn0pJz5cIiArIGRhdGEgKyBcIjwvYT5cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImN1c3RvbVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR0Q29sdW1uID0gRFRDb2x1bW5CdWlsZGVyLm5ld0NvbHVtbihpdGVtLm5hbWUpLnJlbmRlcldpdGgoZnVuY3Rpb24gKGRhdGEsIHR5cGUsIGZ1bGwsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnJlbmRlcihkYXRhLCBmdWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBjbGFzZXNzID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmFsaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc2VzcyArPSBcIiB0ZXh0LWFsaWduLVwiICsgaXRlbS5hbGlnbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNlbGxDbGFzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNlc3MgKz0gXCIgXCIgKyBpdGVtLmNlbGxDbGFzcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLm9uZVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNlc3MgKz0gXCIgb25lLXN0cmluZ1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZHRDb2x1bW4gPSBkdENvbHVtbi53aXRoT3B0aW9uKFwic0NsYXNzXCIsIGNsYXNlc3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKGl0ZW0uc1R5cGUpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHRDb2x1bW4gPSBkdENvbHVtbi53aXRoT3B0aW9uKFwic1R5cGVcIiwgaXRlbS5zVHlwZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5ub3RTb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHRDb2x1bW4gPSBkdENvbHVtbi5ub3RTb3J0YWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBkdENvbHVtbiA9IGR0Q29sdW1uLndpdGhPcHRpb24oJ3NXaWR0aCcsIGl0ZW0ud2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBkdENvbHVtbjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGR0Q29sdW1ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldFRpdGxlKGNvbHVtbnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udGl0bGUgPSBcImNvbW1vbi5EYXRlQ3JlYXRlZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRhZ3NcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRpdGxlID0gXCJjb21tb24uVGFnc1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDguMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYXV0aFwiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJzd2l0Y2hMYW5ndWFnZVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2F1dGgvY29tcG9uZW50cy9zd2l0Y2gtbGFuZ3VhZ2Uvc3dpdGNoLWxhbmd1YWdlLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJsb2NhbGVcIl07XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihsb2NhbGUpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnN3aXRjaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gbG9jYWxlLmdldExvY2FsZSgpO1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09IFwicnVcIiA/IFwiZW5cIiA6IFwicnVcIjtcclxuICAgICAgICAgICAgbG9jYWxlLnNldExvY2FsZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jYW1wYWlnbnNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwiYXR0YWNoQXJlYVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgY2FtcGFpZ25JZDogJ0AnLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IFwiJlwiLFxyXG4gICAgICAgICAgICAgICAgb25HbzpcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaEFyZWEvYXR0YWNoQXJlYS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWyckc3RhdGUnLCAndmlydHVhbFNjcmVlbnMnLCAnY2FtcGFpZ25zJywgJ0RUQ29sdW1uQnVpbGRlcicsICd0YWJsZUhlbHBlciddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJHN0YXRlLCB2aXJ0dWFsU2NyZWVucywgY2FtcGFpZ25zLCBEVENvbHVtbkJ1aWxkZXIsIHRhYmxlSGVscGVyKSB7XHJcblxyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnRpdGxlID0gW1xyXG4gICAgICAgICAgICBcImNhbXBhaWducy5WaXJ0dWFsU2NyZWVuXCIsXHJcbiAgICAgICAgICAgIFwiY2FtcGFpZ25zLkFyZWFcIixcclxuICAgICAgICAgICAgXCJjYW1wYWlnbnMuQ291bnRQbGF5ZXJzXCIsXHJcbiAgICAgICAgICAgIFwiY2FtcGFpZ25zLkNvdW50Q2FtcGFpZ25zXCJcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB2bS5vcHRpb24gPSB7XHJcblxyXG4gICAgICAgICAgICBfcGFyYW1zOiB7XHJcbiAgICAgICAgICAgICAgICBcImZpbHRlcltuYW1lXVwiOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgXCJwYWdlW2xpbWl0XVwiOiA1MDAsXHJcbiAgICAgICAgICAgICAgICBcInBhZ2Vbb2Zmc2V0XVwiOiAwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCAgcGFyYW1zKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5uYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyYW1zW1wiZmlsdGVyW25hbWVdXCJdO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgbmFtZSh2YWwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbXNbXCJmaWx0ZXJbbmFtZV1cIl0gPSB2YWw7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YShmYWxzZSk7XHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBsaW1pdHMgPSAwO1xyXG4gICAgICAgIHZtLmR0Q29sdW1ucyA9IFtcclxuICAgICAgICAgICAgRFRDb2x1bW5CdWlsZGVyLm5ld0NvbHVtbigndmlydHVhbFNjcmVlbicpLnJlbmRlcldpdGgoZnVuY3Rpb24gKGRhdGEsIHR5cGUsIGZ1bGwsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIjxzcGFuIGNsYXNzPSdjb250cm9sJyBuZy1jbGljaz1cXFwidm0uYWN0aW9uKCdjbGlja05hbWUnLFxcJ1wiICsgZGF0YS5pZCArIFwiXFwnKVxcXCI+XCIgKyBkYXRhLm5hbWUgKyBcIjwvc3Bhbj5cIjtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBEVENvbHVtbkJ1aWxkZXIubmV3Q29sdW1uKCdhcmVhJykucmVuZGVyV2l0aChmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZnVsbCwgbWV0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnR5cGU7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBEVENvbHVtbkJ1aWxkZXIubmV3Q29sdW1uKCd2aXJ0dWFsU2NyZWVuJykucmVuZGVyV2l0aChmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZnVsbCwgbWV0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnBsYXllcnNfY291bnQ7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBEVENvbHVtbkJ1aWxkZXIubmV3Q29sdW1uKCdhcmVhJykucmVuZGVyV2l0aChmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZnVsbCwgbWV0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmNhbXBhaWduc19jb3VudDtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIERUQ29sdW1uQnVpbGRlci5uZXdDb2x1bW4oJ251bGwnKS5ub3RTb3J0YWJsZSgpXHJcbiAgICAgICAgICAgICAgICAucmVuZGVyV2l0aChmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZnVsbCwgbWV0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250cm9sX3JvdyA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gIGJ0bi1wcmltYXJ5IGJ0bi1zbSBcIiAgICAgIHRvb2x0aXAtYXBwZW5kLXRvLWJvZHk9XCJ0cnVlXCIgIHVpYi10b29sdGlwPVwie3tcXCdjb21tb24uSW5mb1Rvb2x0aXBcXCd8aTE4bn19XCIgIHRvb2x0aXAtcG9wdXAtZGVsYXk9XCIxMDAwXCIgICAgICAgICAgbmctY2xpY2s9XCJ2bS5hY3Rpb24oXFwnaW5mb1xcJyxcXCcnICsgZnVsbC52aXJ0dWFsU2NyZWVuLmlkICsgJ1xcJylcIj48aSBjbGFzcz1cImZhICBmYS1pbmZvXCI+PC9pPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xfcm93O1xyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgXTtcclxuXHJcblxyXG4gICAgICAgIHZtLmFjdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKGFjdGlvbiwgaWQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJpbmZvXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5nb1RvT25lKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZUNsaWNrJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9PbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpY2tOYW1lJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9PbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5nb1RvT25lID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgICRzdGF0ZS5nbygncGVyc29uYWxBY2NvdW50LnZpcnR1YWxTY3JlZW4ub25lJywge2lkOiBpZH0pXHJcbiAgICAgICAgICAgIHZtLm9uR28oKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zZXJ2ZXJEYXRhID0gZnVuY3Rpb24gc2VydmVyRGF0YShzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2ssIG9TZXR0aW5ncykge1xyXG4gICAgICAgICAgICByZXR1cm4gdmlydHVhbFNjcmVlbnMuZ2V0TGlzdCh2bS5vcHRpb24ucGFyYW1zKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcmVzdWx0LmRhdGEubWFwKGZ1bmN0aW9uICh2aXJ0dWFsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXJ0dWFsU2NyZWVuLmFyZWFzLm1hcChmdW5jdGlvbiAoYXJlYSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7YXJlYTogYXJlYSwgdmlydHVhbFNjcmVlbjogdmlydHVhbFNjcmVlbiwgaWQ6IGFyZWEuaWR9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jb25jYXQoYik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayh0YWJsZUhlbHBlci53cmFwTGlzdChkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dXYXJuaW5nKCdjb21tb24uRmFpbGVkR2V0Jyk7XHJcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5pbnRhbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdm0uaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uU2VsZWN0ZWQgPSBmdW5jdGlvbiAoaWRzLCBhbGwpIHtcclxuICAgICAgICAgICAgdm0uc2VsZWN0ZWRJZHMgPSBpZHM7XHJcbiAgICAgICAgICAgIHZtLmFsbCA9IGFsbDtcclxuXHJcblxyXG4gICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IGlkc30pO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdhdHRhY2hBcmVhTW9kYWxDb250cm9sbGVyJywgY29udHJvbGxlcilcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbICckdWliTW9kYWxJbnN0YW5jZScsICdpZCcsICduYW1lJywgJ2NhbXBhaWducycsICdlcnJvckhhbmRsZXJIZWxwZXInXTtcclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIGlkLCBuYW1lLCBjYW1wYWlnbnMsIGVycm9ySGFuZGxlckhlbHBlcikge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS5pZCA9IGlkO1xyXG4gICAgICAgIHZtLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHZtLnNhdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBjYW1wYWlnbnMuYXR0YWNoQXJlYXMoaWQsIHZtLnNlbGVjdGVkKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKCB2bS5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY2FtcGFpZ25zXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2F0dGFjaEFyZWFNb2RhbFNlcnZpY2UnLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2hvdyA9IGZ1bmN0aW9uIChpZCxuYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3AgOiAnc3RhdGljJyx0ZW1wbGF0ZVVybDogJ2NhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaEFyZWFNb2RhbC9hdHRhY2hBcmVhTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnYXR0YWNoQXJlYU1vZGFsQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICBzaXplOiAnbGcnLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJhdHRhY2hDb250ZW50XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBjYW1wYWlnbklkOiAnQCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOlwiQFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IFwiJlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2FtcGFpZ25zL2NvbXBvbmVudHMvYXR0YWNoQ29udGVudC9hdHRhY2hDb250ZW50Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbJ2NvbnRlbnRzJywgJyRxJywgJ2NhbXBhaWducyddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoY29udGVudHMsICRxLCBjYW1wYWlnbnMpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICB2bS51bkNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB2bS5zZWxlY3RlZCA9IHt9O1xyXG4gICAgICAgIHZtLm1vZGVsID1cclxuICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICBwYXJhbToge1xyXG4gICAgICAgICAgICAgICAgXCJmaWx0ZXJbbmFtZV1cIjogXCJcIixcclxuICAgICAgICAgICAgICAgIFwicGFnZVtsaW1pdF1cIjogMTAwLFxyXG4gICAgICAgICAgICAgICAgXCJwYWdlW29mZnNldF1cIjogMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpc0luaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBvcGVuOiBmYWxzZSxcclxuICAgICAgICAgICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbVtcImZpbHRlcltuYW1lXVwiXTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IG5hbWUodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtW1wiZmlsdGVyW25hbWVdXCJdID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdXBkYXRlKCk7XHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCkge1xyXG4gICAgICAgICAgICB2bS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBhbmd1bGFyLmNvcHkodm0ubW9kZWwucGFyYW0pO1xyXG4gICAgICAgICAgICBpZiAodm0ubW9kZWwubmFtZS5sZW5ndGggPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtW1wiZmlsdGVyW25hbWVdXCJdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIGdldENvbnRlbnRzID0gY29udGVudHMuZ2V0TGlzdChwYXJhbSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZ2V0QXR0YWNoZWRDb250ZW50cyA9IGNhbXBhaWducy5nZXRDb250ZW50KHZtLmNhbXBhaWduSWQpO1xyXG5cclxuICAgICAgICAgICAgdm0ucHJvbWlzZSA9ICRxLmFsbChbZ2V0Q29udGVudHMsIGdldEF0dGFjaGVkQ29udGVudHNdKTtcclxuICAgICAgICAgICAgdm0ucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBhbGxDb250ZW50cyA9IHJlc3VsdFswXS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgYXR0YWNoZWRDb250ZW50cyA9IHJlc3VsdFsxXTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwIGluIHZtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZtLnNlbGVjdGVkW3BdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZtLmV4aXN0RnJlZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYWxsQ29udGVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29udGVudCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWRDb250ZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRhY2hlZENvbnRlbnQgPSBhdHRhY2hlZENvbnRlbnRzLmZpbmQoZnVuY3Rpb24gKGF0dGFjaGVkQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaGVkQ29udGVudC5jb250ZW50X2lkID09IGNvbnRlbnQuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWRDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Lm5vdEF0dGFjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZXhpc3RGcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQubm90QXR0YWNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQubm90QXR0YWNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZXhpc3RGcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0ZWRbY29udGVudC5pZF0gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5zdGF0dXMgPT0gJ3JlYWR5JyAmJiBjb250ZW50LnR5cGUgPT0gJ3ZpZGVvJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnNob3dQcmV2aWV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHZtLmNvbnRlbnRzID0gYWxsQ29udGVudHM7XHJcblxyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2bS5pc1NlbGVjdEFueSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHZtLnNlbGVjdEFsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiB2bS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnNlbGVjdGVkW3BdID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnRvZ2dsZUFsbCA9IHRvZ2dsZUFsbDtcclxuICAgICAgICB2bS50b2dnbGVPbmUgPSB0b2dnbGVPbmU7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZUFsbChzZWxlY3RBbGwsIHNlbGVjdGVkSXRlbXMpIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNbaWRdID0gc2VsZWN0QWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0ZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZU9uZShzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRJdGVtc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0ZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2bS5zZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBvblNlbGVjdGVkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb25TZWxlY3RlZCgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gW107XHJcbiAgICAgICAgICAgIHZhciBhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiB2bS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnNlbGVjdGVkW2lkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHNlbGVjdGVkfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcImNvbnRlbnRzXCIsIFwiJHVpYk1vZGFsSW5zdGFuY2VcIiwgXCJpZFwiLCBcIm5hbWVcIiwgXCJjYW1wYWlnbnNcIiwgXCJlbmRfdGltZXN0YW1wXCIsIFwiY29udGVudFwiLCBcImVycm9ySGFuZGxlckhlbHBlclwiLCBcIm1vbWVudFwiLCBcImNvbnRyb2xUYXJnZXRpbmdNb2RhbFNlcnZpY2VcIiwgXCJjb250cm9sR2VvVGFyZ2V0aW5nU2VydmljZVwiLCBcIiRmaWx0ZXJcIiwgXCJsb2NhbGVcIiwgXCJhZGRlZENvbnRlbnRzXCIsIFwiYXR0YWNoUGxheWxpc3RUb0NvbnRlbnRJZFwiLCBcImNhbXBhaWduXCIsIFwiYXJlYVwiLCBcIkNvbnRlbnRUeXBlc1wiLCBcIiR0aW1lb3V0XCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY2FtcGFpZ25zXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoJ2F0dGFjaENvbnRlbnREZXRhaWxNb2RhbENvbnRyb2xsZXInLCBjb250cm9sbGVyKVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKGNvbnRlbnRzLCAkdWliTW9kYWxJbnN0YW5jZSwgaWQsIG5hbWUsIGNhbXBhaWducywgZW5kX3RpbWVzdGFtcCwgY29udGVudCwgZXJyb3JIYW5kbGVySGVscGVyLCBtb21lbnQsIGNvbnRyb2xUYXJnZXRpbmdNb2RhbFNlcnZpY2UsIGNvbnRyb2xHZW9UYXJnZXRpbmdTZXJ2aWNlLCAkZmlsdGVyLCBsb2NhbGUsIGFkZGVkQ29udGVudHMsIGF0dGFjaFBsYXlsaXN0VG9Db250ZW50SWQsIGNhbXBhaWduLCBhcmVhLCBDb250ZW50VHlwZXMsICR0aW1lb3V0KSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLmlkID0gaWQ7XHJcbiAgICAgICAgdm0ubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdm0uZW5kX3RpbWVzdGFtcCA9IGVuZF90aW1lc3RhbXA7XHJcblxyXG4gICAgICAgIHZtLmNvbnRlbnRUeXBlcyA9IGFuZ3VsYXIuY29weShDb250ZW50VHlwZXMpO1xyXG4gICAgICAgIHZtLmNvbnRlbnRUeXBlcy51bnNoaWZ0KHtuYW1lOiBcImFsbFwifSk7XHJcblxyXG4gICAgICAgIHZtLm9wdGlvbiA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJcIixcclxuICAgICAgICAgICAgdGFnczogW10sXHJcbiAgICAgICAgICAgIHR5cGU6IHtuYW1lOiBcImFsbFwifVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHNlY1dvcmQgPSBcIlwiO1xyXG4gICAgICAgIGxvY2FsZS5yZWFkeSgnYmxvY2tzJykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHNlY1dvcmQgPSAnICcgKyBsb2NhbGUuZ2V0U3RyaW5nKCdjb21tb24uU2Vjb25kU2hvcnQnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgc3RhcnRDYW1wYWlnbiA9IG1vbWVudC51dGMoKTtcclxuXHJcbiAgICAgICAgdmFyIGVuZENhbXBhaWduO1xyXG4gICAgICAgIGlmIChpc0VtcHR5KGVuZF90aW1lc3RhbXApIHx8IGVuZF90aW1lc3RhbXAgPT0gXCIwMDAwLTAwLTAwIDAwOjAwOjAwXCIpIHtcclxuICAgICAgICAgICAgZW5kQ2FtcGFpZ24gPSBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBlbmRDYW1wYWlnbiA9IG1vbWVudC51dGMoY2FtcGFpZ24uZW5kX3RpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgIGlmIChlbmRDYW1wYWlnbiA8IHN0YXJ0Q2FtcGFpZ24pIHtcclxuICAgICAgICAgICAgICAgIGVuZENhbXBhaWduID0gbW9tZW50KHN0YXJ0Q2FtcGFpZ24pLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2YXIgY29udHJvbCA9IHtcclxuICAgICAgICAgICAgc2V0IGVuZF9kYXRlKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5lbmRfdGltZXN0YW1wID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmVuZF90aW1lc3RhbXAgPSBlbmRDYW1wYWlnbiA/IGVuZENhbXBhaWduLmZvcm1hdCgpIDogXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IGVuZF9kYXRlKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm1vZGVsLmVuZF90aW1lc3RhbXAgPT0gKGVuZENhbXBhaWduID8gZW5kQ2FtcGFpZ24uZm9ybWF0KCkgOiBcIlwiKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IG1pblN0YXJ0RGF0ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50P251bGw6c3RhcnRDYW1wYWlnbjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IG1heFN0YXJ0RGF0ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmRDYW1wYWlnbjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IG1heEVuZERhdGUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kQ2FtcGFpZ247XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZUludGVydmFsOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF2bS5tb2RlbC5wbGF5X3RpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5wbGF5X3RpbWUgPSAnZnJlZSdcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2ZpbGxFbXB0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLnBsYXlfdGltZSA9ICdvbmx5X2VtcHR5J1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwucGxheV90aW1lID0gJ25vcm1hbCdcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBwbGF5X3RpbWVvdXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucGxheV90aW1lb3V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5wbGF5X3RpbWVvdXQgPSBwYXJzZUludCh2YWwpIHx8IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUludGVydmFsKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBwbGF5X3RpbWVvdXQoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0ubW9kZWwucGxheV90aW1lb3V0ID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0ubW9kZWwucGxheV90aW1lb3V0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBfZmlsbEVtcHR5OiBmYWxzZSxcclxuICAgICAgICAgICAgZ2V0IGZpbGxFbXB0eSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWxsRW1wdHk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBmaWxsRW1wdHkodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9maWxsRW1wdHkgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUludGVydmFsKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBjb250ZW50X2lkKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm1vZGVsLmNvbnRlbnRfaWRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IGNvbnRlbnRfaWQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5jb250ZW50X2lkID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgdm0uY29udHJvbC5mdWxsRHVyYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNvbnRyb2wgPSBjb250cm9sO1xyXG5cclxuICAgICAgICB2bS5lZGl0ID0gISFjb250ZW50O1xyXG4gICAgICAgIHZhciBpbml0Q29udGVudCA9IG51bGw7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgaW5pdENvbnRlbnQgPSBjb250ZW50O1xyXG4gICAgICAgICAgICBpbml0Q29udGVudC5jb3N0ID0gcGFyc2VGbG9hdChpbml0Q29udGVudC5jb3N0KTtcclxuICAgICAgICAgICAgdm0uY29udGVudFR5cGUgPSBjb250ZW50LmNvbnRlbnQudHlwZTtcclxuICAgICAgICAgICAgaWYgKGluaXRDb250ZW50LnBsYXlfdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5fZmlsbEVtcHR5ID0gaW5pdENvbnRlbnQucGxheV90aW1lID09ICdvbmx5X2VtcHR5JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2bS5hZGRPcGVuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHZtLmRpc2FibGVkQW5pbWF0aW9uID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgICAgICAgICAkdGltZW91dChcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5kaXNhYmxlZEFuaW1hdGlvbj1mYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAsIDEwMDApXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaW5pdENvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydF90aW1lc3RhbXA6IHN0YXJ0Q2FtcGFpZ24sXHJcbiAgICAgICAgICAgICAgICBwbGF5X29yZGVyOiA2NTUzNSxcclxuICAgICAgICAgICAgICAgIHBsYXlfdGltZW91dDogMCxcclxuICAgICAgICAgICAgICAgIGNvc3Q6IDAsXHJcbiAgICAgICAgICAgICAgICBmaWxsX21vZGU6ICdkZWZhdWx0J1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdm0uY2FtcGFpZ25JZCA9IGlkO1xyXG4gICAgICAgIHZtLm1vZGVsID0gaW5pdENvbnRlbnQ7XHJcblxyXG5cclxuICAgICAgICB2bS5zZWxlY3RPcHRpb24gPSB7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiZm9ybS13aGl0ZVwiXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdm0uY29udHJvbC5lbmRfZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLnBheW1lbnRfdHlwZSA9ICdmaXhlZCc7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLnBsYXlfdGltZSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2bS5hdHRhY2hQbGF5bGlzdFRvQ29udGVudElkID0gYXR0YWNoUGxheWxpc3RUb0NvbnRlbnRJZDtcclxuXHJcbiAgICAgICAgdm0uY29udHJvbC5wbGF5X3RpbWVvdXQgPSBNYXRoLmZsb29yKHZtLm1vZGVsLnBsYXlfdGltZW91dCk7XHJcblxyXG4gICAgICAgIHZtLm9uU2VsZWN0Q29udGVudCA9IGZ1bmN0aW9uIChpdGVtLCBtb2RlbCkge1xyXG4gICAgICAgICAgICB2bS5jb250ZW50VHlwZSA9IGl0ZW0udHlwZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5yZWZyZXNoQnlOYW1lID0gZnVuY3Rpb24gKHNlYXJjaCkge1xyXG4gICAgICAgICAgICB2bS5vcHRpb24ubmFtZSA9IHNlYXJjaDtcclxuICAgICAgICAgICAgdm0udXBkYXRlKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0udXBkYXRlID0gZnVuY3Rpb24gKGNsZWFyKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgdm0uY29udHJvbC5jb250ZW50X2lkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcGFyYW0gPSB7fTtcclxuICAgICAgICAgICAgaWYgKHZtLm9wdGlvbi5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbVsnZmlsdGVyW25hbWVdJ10gPSB2bS5vcHRpb24ubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodm0ub3B0aW9uLnR5cGUubmFtZSAhPSAnYWxsJykge1xyXG5cclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbdHlwZV0nXSA9IHZtLm9wdGlvbi50eXBlLm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZtLm9wdGlvbi50YWdzICYmIHZtLm9wdGlvbi50YWdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbdGFnc10nXSA9IHZtLm9wdGlvbi50YWdzLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmlkO1xyXG4gICAgICAgICAgICAgICAgfSkuam9pbigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb250ZW50cy5nZXRMaXN0KHBhcmFtKS50aGVuKGZ1bmN0aW9uIChjb250ZW50cykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vdEFkZGVkQ29udGVudCA9IGNvbnRlbnRzLmRhdGEuZmlsdGVyKGZ1bmN0aW9uIChjb250ZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhYWRkZWRDb250ZW50cy5maW5kKGZ1bmN0aW9uIChhZGRlZENvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZGVkQ29udGVudC5jb250ZW50LmlkID09IGNvbnRlbnRJdGVtLmlkICYmICEoY29udGVudCAmJiBhZGRlZENvbnRlbnQuY29udGVudC5pZCA9PSBjb250ZW50LmlkICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdm0uY29udGVudHMgPSAkZmlsdGVyKCdvcmRlckJ5Jykobm90QWRkZWRDb250ZW50LCBcIi10eXBlXCIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25DaGFuZ2VTdGFydERhdGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuc3RhcnRfdGltZXN0YW1wID0gdmFsdWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5vbkNoYW5nZUVuZERhdGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuZW5kX3RpbWVzdGFtcCA9IHZhbHVlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnNob3dDb250cm9sVGFyZ2V0aW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250cm9sVGFyZ2V0aW5nTW9kYWxTZXJ2aWNlLnNob3dDb250cm9sVGFyZ2V0aW5nTW9kYWwodm0ubW9kZWwudGltZV90YXJnZXRpbmdfaWQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC50aW1lX3RhcmdldGluZ19pZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uc2hvd0NvbnRyb2xHZW9UYXJnZXRpbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xHZW9UYXJnZXRpbmdTZXJ2aWNlLnNob3codm0ubW9kZWwuZ2VvX3RhcmdldGluZ19pZCkudGhlbihcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmdlb190YXJnZXRpbmdfaWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5nZXRQbGFjZWhvbGRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF2bS5jb250ZW50cykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5nZXRTdHJpbmcoJ2NhbXBhaWducy5TZWxlY3RDb250ZW50UGxhY2Vob2xkZXInKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2bS5jb250ZW50cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5nZXRTdHJpbmcoJ2NhbXBhaWducy5TZWxlY3RDb250ZW50UGxhY2Vob2xkZXJOb3RFeGlzdCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZtLmNvbnRlbnRzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlLmdldFN0cmluZygnY2FtcGFpZ25zLlNlbGVjdENvbnRlbnRQbGFjZWhvbGRlckNvdW50MScsIHtjb3VudDogdm0uY29udGVudHMubGVuZ3RofSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodm0uY29udGVudHMubGVuZ3RoIDw9IDQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGUuZ2V0U3RyaW5nKCdjYW1wYWlnbnMuU2VsZWN0Q29udGVudFBsYWNlaG9sZGVyQ291bnQyNCcsIHtjb3VudDogdm0uY29udGVudHMubGVuZ3RofSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlLmdldFN0cmluZygnY2FtcGFpZ25zLlNlbGVjdENvbnRlbnRQbGFjZWhvbGRlckNvdW50NScsIHtjb3VudDogdm0uY29udGVudHMubGVuZ3RofSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uc2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICghdm0uZm9ybS4kdmFsaWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHByb21pc2UgPSBjYW1wYWlnbnMudXBkYXRlQ29udGVudCh2bS5tb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvKiAgIGlmIChhZGRlZENvbnRlbnRzLmZpbmQoZnVuY3Rpb24gKGFkZGVkQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgIHJldHVybiBhZGRlZENvbnRlbnQuY29udGVudF9pZCA9PSBjb250ZW50SXRlbS5pZFxyXG4gICAgICAgICAgICAgICAgIH0pKSB7XHJcbiAgICAgICAgICAgICAgICAgdm0ubWVzc2FnZUFscmVhZHlBZGQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICB9Ki9cclxuICAgICAgICAgICAgICAgIHByb21pc2UgPSBjYW1wYWlnbnMuYXR0YWNoQ29udGVudCh2bS5jYW1wYWlnbklkLCB2bS5tb2RlbCwgYXJlYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0uc2F2aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zYXZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCB2bS5mb3JtLCB2bSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jYW1wYWlnbnNcIilcclxuICAgICAgICAuc2VydmljZSgnYXR0YWNoQ29udGVudERldGFpbE1vZGFsU2VydmljZScsIHNlcnZpY2UpXHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCIsIFwiY2FtcGFpZ25zXCJdO1xyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkdWliTW9kYWwsIGNhbXBhaWducykge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAoY2FtcGFpZ24sYXJlYSwgYWRkZWRDb250ZW50cywgY29udGVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2hvdyh7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGlkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWduLmlkO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWduLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZW5kX3RpbWVzdGFtcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbi5lbmRfdGltZXN0YW1wO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGFkZGVkQ29udGVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkZWRDb250ZW50cztcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhdHRhY2hQbGF5bGlzdFRvQ29udGVudElkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgYXR0YWNoZWRQbGF5bGlzdHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhcmVhOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJlYTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjYW1wYWlnbjpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWduO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzZWxmLnNob3dBdHRhY2hUb0NvbnRlbnQgPSBmdW5jdGlvbiAobmFtZSxhdHRhY2hQbGF5bGlzdFRvQ29udGVudElkLCBhdHRhY2hlZFBsYXlsaXN0cykge1xyXG4gICAgICAgICAgICByZXR1cm4gc2hvdyh7XHJcbiAgICAgICAgICAgICAgICBpZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZW5kX3RpbWVzdGFtcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGFkZGVkQ29udGVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhdHRhY2hQbGF5bGlzdFRvQ29udGVudElkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaFBsYXlsaXN0VG9Db250ZW50SWQ7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgYXR0YWNoZWRQbGF5bGlzdHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0YWNoZWRQbGF5bGlzdHM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHNob3cocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2FtcGFpZ25zL2NvbXBvbmVudHMvYXR0YWNoQ29udGVudERldGFpbE1vZGFsL2F0dGFjaENvbnRlbnRNb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdhdHRhY2hDb250ZW50RGV0YWlsTW9kYWxDb250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnYXR0YWNoLWNvbnRlbnQtbW9kYWwnLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY2FtcGFpZ25zXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoJ2F0dGFjaENvbnRlbnRNb2RhbENvbnRyb2xsZXInLCBjb250cm9sbGVyKVxyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHVpYk1vZGFsSW5zdGFuY2UnLCAnaWQnLCAnbmFtZScsICdjYW1wYWlnbnMnLCAnZXJyb3JIYW5kbGVySGVscGVyJ107XHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBpZCwgbmFtZSwgY2FtcGFpZ25zLCBlcnJvckhhbmRsZXJIZWxwZXIpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0uaWQgPSBpZDtcclxuICAgICAgICB2bS5uYW1lID0gbmFtZTtcclxuICAgICAgICB2bS5zYXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2FtcGFpZ25zLmF0dGFjaENvbnRlbnRzKGlkLCB2bS5zZWxlY3RlZCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSh2bS5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY2FtcGFpZ25zXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2F0dGFjaENvbnRlbnRNb2RhbFNlcnZpY2UnLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2hvdyA9IGZ1bmN0aW9uIChpZCxuYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3AgOiAnc3RhdGljJyx0ZW1wbGF0ZVVybDogJ2NhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaENvbnRlbnRNb2RhbC9hdHRhY2hDb250ZW50TW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnYXR0YWNoQ29udGVudE1vZGFsQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ2NvbnRyb2wtbW9kYWwnLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJjYW1wYWlnbnNTZWFyY2hcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG9uQXBwbHk6ICcmJyxcclxuICAgICAgICAgICAgICAgIG9uUmVzZXQ6ICcmJyxcclxuICAgICAgICAgICAgICAgIHRhZ3NDdXJyZW50OiBcIjx0YWdzXCIsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDdXJyZW50OiBcIjxzdGF0dXNcIixcclxuICAgICAgICAgICAgICAgIG5hbWVDdXJyZW50OiBcIjxuYW1lXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjYW1wYWlnbnMvY29tcG9uZW50cy9jYW1wYWlnbnNTZWFyY2gvY2FtcGFpZ25zU2VhcmNoLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbJ0NvbnRlbnRUeXBlcyddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoQ29udGVudFR5cGVzKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5maWx0ZXJQb3BvdmVyID0ge1xyXG5cclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjYW1wYWlnbnMvY29tcG9uZW50cy9jYW1wYWlnbnNTZWFyY2gvY2FtcGFpZ25zLWZpbHRlci5odG1sJ1xyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5jb250ZW50VHlwZXMgPSBDb250ZW50VHlwZXM7XHJcblxyXG4gICAgICAgIHZtLnBsYXllcnNUYWdzID0gW107XHJcbiAgICAgICAgdm0udGFncyA9IGFuZ3VsYXIuY29weSh2bS50YWdzQ3VycmVudCk7XHJcbiAgICAgICAgdm0uc3RhdHVzID0gYW5ndWxhci5jb3B5KHZtLnN0YXR1c0N1cnJlbnQpO1xyXG4gICAgICAgIHZtLm5hbWUgPSBhbmd1bGFyLmNvcHkodm0ubmFtZUN1cnJlbnQpO1xyXG5cclxuXHJcbiAgICAgICAgdm0uY29udHJvbCA9IHtcclxuICAgICAgICAgICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0ubmFtZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IG5hbWUodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHZtLm5hbWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHZtLmFwcGx5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hcHBseSA9IGZ1bmN0aW9uIChub3RDbG9zZSkge1xyXG4gICAgICAgICAgICB2bS5vbkFwcGx5KHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhZ3M6IGFuZ3VsYXIuY29weSh2bS50YWdzKSxcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHZtLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB2bS5uYW1lXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG5vdENsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5yZXNldCA9IGZ1bmN0aW9uIChjbG9zZSkge1xyXG4gICAgICAgICAgICB2bS50YWdzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLnN0YXR1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bS5uYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHZtLm9uUmVzZXQoKTtcclxuICAgICAgICAgICAgaWYgKGNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIFxyXG5cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25TZWxlY3RUYWdzID0gZnVuY3Rpb24gKHRhZ3MpIHtcclxuICAgICAgICAgICAgdm0udGFncyA9IHRhZ3M7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmlzRmlsdGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdm0udGFnc0N1cnJlbnQubGVuZ3RoICE9IDAgfHwgdm0uc3RhdHVzO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmNvdW50RmlsdGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgICAgIGlmICh2bS50YWdzQ3VycmVudC5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2bS5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmlzT25seUZpbHRlck5hbWUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5uYW1lLmxlbmd0aCA+IDAgJiYgIXZtLmlzRmlsdGVyKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5pc0FueUZpbHRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLmlzRmlsdGVyKCkgfHwgdm0ubmFtZS5sZW5ndGggPiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcIiRzdGF0ZVwiLCBcImNvbmZpcm1Nb2RhbFNlcnZpY2VcIiwgXCJjYW1wYWlnbnNcIiwgXCJwbGF5ZXJzXCIsIFwiRFRDb2x1bW5CdWlsZGVyXCIsIFwidGFibGVIZWxwZXJcIiwgXCJzZWxlY3RFbnRpdHlNb2RhbFNlcnZpY2VcIiwgXCJub3RpZmljYXRpb25TZXJ2aWNlXCIsIFwiJHFcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jYW1wYWlnbnNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwiYXR0YWNoZWRQbGF5ZXJzXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBjYW1wYWlnbjogJzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2FtcGFpZ25zL2NvbXBvbmVudHMvYXR0YWNoZWRQbGF5ZXJzL2F0dGFjaGVkUGxheWVycy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkc3RhdGUsIGNvbmZpcm1Nb2RhbFNlcnZpY2UsIGNhbXBhaWducywgcGxheWVycywgRFRDb2x1bW5CdWlsZGVyLCB0YWJsZUhlbHBlciwgc2VsZWN0RW50aXR5TW9kYWxTZXJ2aWNlLCBub3RpZmljYXRpb25TZXJ2aWNlLCAkcSkge1xyXG5cclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZhciBsaW1pdHMgPSAwO1xyXG4gICAgICAgIHZhciBkYXRhVGVtcCA9IFtdO1xyXG5cclxuICAgICAgICB2bS5jb2x1bW5zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICBub3RTb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc3RhdGU6XCJwZXJzb25hbEFjY291bnQucGxheWVyLm9uZVwiLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiY29tbW9uLk5hbWVcIixcclxuICAgICAgICAgICAgICAgIHdpZHRoOlwiMTAwJVwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd0YWdzJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICd0YWdzJyxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnbnVsbCcsXHJcbiAgICAgICAgICAgICAgICBub3RTb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250cm9sX3JvdyA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gIGJ0bi1kYW5nZXIgYnRuLXNtXCIgdG9vbHRpcC1hcHBlbmQtdG8tYm9keT1cInRydWVcIiB1aWItdG9vbHRpcD1cInt7XFwnY2FtcGFpZ25zLkRldGFjaFBsYXllclRvb2x0aXBcXCd8aTE4bn19XCIgIHRvb2x0aXAtcG9wdXAtZGVsYXk9XCI1MDBcIiBuZy1jbGljaz1cInZtLmFjdGlvbihcXCdyZW1vdmVcXCcsXFwnJyArIGZ1bGwuaWQgKyAnXFwnKVwiPjxpIGNsYXNzPVwiZmEgIGZhLWNoYWluLWJyb2tlblwiPjwvaT48L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sX3JvdztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcblxyXG5cclxuICAgICAgICB2bS5hdHRhY2hBcmVhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxlY3RFbnRpdHlNb2RhbFNlcnZpY2Uuc2hvdygncGxheWVycycsIGRhdGFUZW1wLm1hcCgoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkO1xyXG4gICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKHNlbGVjdGVkSURzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJRHMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2bS5hdHRhY2hpbmcgPXRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gc2VsZWN0ZWRJRHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzLmF0dGFjaENhbXBhaWduKGl0ZW0sIHZtLmNhbXBhaWduLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJHEuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5hdHRhY2hpbmcgPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uYWN0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAoYWN0aW9uLCBpZCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybU1vZGFsU2VydmljZS5zaG93KCdjYW1wYWlnbnMuQ29uZmlybURldGFjaFBsYXllcicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMuZGV0YWNoQ2FtcGFpZ24oaWQsdm0uY2FtcGFpZ24uaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGVDbGljayc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjbGlja05hbWUnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZ29Ub09uZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5nb1RvT25lID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgICRzdGF0ZS5nbygncGVyc29uYWxBY2NvdW50LnBsYXllci5vbmUnLCB7aWQ6IGlkfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zZXJ2ZXJEYXRhID0gZnVuY3Rpb24gc2VydmVyRGF0YShzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2ssIG9TZXR0aW5ncykge1xyXG4gICAgICAgICAgICByZXR1cm4gY2FtcGFpZ25zLmdldFBsYXllcnModm0uY2FtcGFpZ24uaWQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZGF0YVRlbXAgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHRhYmxlSGVscGVyLndyYXBMaXN0KHJlc3VsdCkpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGVtcCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93V2FybmluZygnY29tbW9uLkZhaWxlZEdldCcpO1xyXG4gICAgICAgICAgICAgICAgZm5DYWxsYmFjayh0YWJsZUhlbHBlci5nZXRFbXB0eUxpc3QoKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5pbnRhbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdm0uaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uU2VsZWN0ZWQgPSBmdW5jdGlvbiAoaWRzLCBhbGwpIHtcclxuICAgICAgICAgICAgdm0uc2VsZWN0ZWRJZHMgPSBpZHM7XHJcbiAgICAgICAgICAgIHZtLmFsbCA9IGFsbDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5kZXRhY2ggPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodm0uc2VsZWN0ZWRJZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpcm1UZXh0ID0gJ2NhbXBhaWducy5Db25maXJtRGV0YWNoUGxheWVycyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlybVRleHQgPSAnY2FtcGFpZ25zLkNvbmZpcm1EZXRhY2hQbGF5ZXInO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdyhjb25maXJtVGV4dCwgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IHZtLnNlbGVjdGVkSWRzLm1hcChmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycy5kZXRhY2hDYW1wYWlnbihpZCx2bS5jYW1wYWlnbi5pZCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJHEuYWxsKHByb21pc2VzKTtcclxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJhdHRhY2hDb250ZW50RGV0YWlsTW9kYWxTZXJ2aWNlXCIsIFwiY2FtcGFpZ25zXCIsIFwibm90aWZpY2F0aW9uU2VydmljZVwiLCBcIiRzdGF0ZVwiLCBcImNvbmZpcm1Nb2RhbFNlcnZpY2VcIiwgXCJ0YWJsZUhlbHBlclwiLCBcIiR0aW1lb3V0XCIsIFwiZG93bmxvYWRDb250ZW50TW9kYWxTZXJ2aWNlXCIsIFwiY2FtcGFpZ25zXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY2FtcGFpZ25zXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcImNvbnRyb2xBcmVhXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ0FyZWE6ICc8JyxcclxuICAgICAgICAgICAgICAgIG5nQXJlYXM6ICc8JyxcclxuICAgICAgICAgICAgICAgIG5nQ2FtcGFpZ246ICc8JyxcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAnJidcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2FtcGFpZ25zL2NvbXBvbmVudHMvY29udHJvbEFyZWEvY29udHJvbEFyZWEuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoYXR0YWNoQ29udGVudERldGFpbE1vZGFsU2VydmljZSwgY2FtcGFpZ25zLCBub3RpZmljYXRpb25TZXJ2aWNlLCAkc3RhdGUsIGNvbmZpcm1Nb2RhbFNlcnZpY2UsIHRhYmxlSGVscGVyLCAkdGltZW91dCwgZG93bmxvYWRDb250ZW50TW9kYWxTZXJ2aWNlLCBjYW1wYWlnbnMpIHtcclxuXHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciBkYXRhID0gW107XHJcblxyXG5cclxuICAgICAgICB2bS5pbmRleCA9IHZtLm5nQXJlYXMuaW5kZXhPZih2bS5uZ0FyZWEpICsgMTtcclxuICAgICAgICB2bS5pc0F1ZGlvID0gdm0ubmdBcmVhLnggPT0gMCAmJiB2bS5uZ0FyZWEueSA9PSAwICYmIHZtLm5nQXJlYS5oZWlnaHQgPT0gMCAmJiB2bS5uZ0FyZWEud2lkdGggPT0gMDtcclxuICAgICAgICB2bS5hdHRhY2hDb250ZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBhdHRhY2hDb250ZW50RGV0YWlsTW9kYWxTZXJ2aWNlLnNob3codm0ubmdDYW1wYWlnbiwgdm0ubmdBcmVhLCBkYXRhKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUFyZWEoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNoYW5nZVNvdW5kID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5uZ0FyZWEuc291bmRfZW5hYmxlZCA9ICF2bS5uZ0FyZWEuc291bmRfZW5hYmxlZDtcclxuXHJcbiAgICAgICAgICAgIGNhbXBhaWducy51cGRhdGVBcmVhKHZtLm5nQXJlYSk7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5jb2x1bW5zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdjb250ZW50Lm5hbWUnLFxyXG4gICAgICAgICAgICAgICAgYWxpZ246IFwibGVmdFwiLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsLmNvbnRlbnQuc3RhdHVzID09ICdyZWFkeScgJiYgZnVsbC5jb250ZW50LnR5cGUgPT0gJ3ZpZGVvJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnPHZpZGVvLXByZXZpZXcgY29udGVudC1pZD1cIicgKyBmdWxsLmNvbnRlbnQuaWQgKyAnXCI+PC92aWRlby1wcmV2aWV3Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsLmNvbnRlbnQuc3RhdHVzID09ICdyZWFkeScgJiYgZnVsbC5jb250ZW50LnR5cGUgPT0gJ2ltYWdlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnPGltYWdlLXByZXZpZXcgY29udGVudC1pZD1cIicgKyBmdWxsLmlkICsgJ1wiPjwvaW1hZ2UtcHJldmlldz4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gOCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCI8c3BhblwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHVpYi1wb3BvdmVyPSdcIiArIGRhdGEgKyBcIidcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBvcG92ZXItYXBwZW5kLXRvLWJvZHk9J3RydWUgJ1wiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicG9wb3Zlci1wb3B1cC1kZWxheT0nMjAwMCdcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBvcG92ZXItdHJpZ2dlcj0nbW91c2VlbnRlcic+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gZGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICs9IFwiPHNwYW4+XCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCI8c3BhbiBjbGFzcz0nY29udHJvbCcgbmctY2xpY2s9XFxcInZtLmFjdGlvbignY2xpY2tOYW1lJyxcXCdcIiArIGZ1bGwuY29udGVudC5pZCArIFwiXFwnKVxcXCI+XCIgKyBuYW1lICsgXCI8L3NwYW4+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gXCI8ZGl2IGNsYXNzPSdhdHRhY2hlZC1jb250ZW50LWN1dC1uYW1lJz5cIiArIHJlc3VsdCArIFwiPC9kaXY+XCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjYW1wYWlnbnMuQ29udGVudFwiLFxyXG4gICAgICAgICAgICAgICAgY2VsbENsYXNzOiBcIm5hbWUtY2VsbFwiLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiMzAlXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAncGxheV90aW1lb3V0JyxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjYW1wYWlnbnMuQ29udGVudEludGVydmFsXCIsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PSAnPHNwYW4gaTE4bj1cImNhbXBhaWducy5Ob3RTZXRJbnRlcnZhbFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMnB4XCI+PC9zcGFuPidcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9JzxkdXJhdGlvbi12aWV3IG5nLXNlYz1cInRydWVcIiBuZy1kdXJhdGlvbj1cIlxcJycgKyBkYXRhICsgJ1xcJ1wiPjwvZHVyYXRpb24tdmlldz4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZ1bGwucGxheV90aW1lb3V0ICYmZnVsbC5wbGF5X3RpbWU9PT0nb25seV9lbXB0eScgfHwgZGF0YSA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCs9ICAnPHN1cD48aGVscC1wb3BvdmVyIHRlbXBsYXRlLXVybD1cIlxcJ2NhbXBhaWducy9jb21wb25lbnRzL2F0dGFjaENvbnRlbnREZXRhaWxNb2RhbC9oZWxwRmlsbEVtcHR5U3BhY2UuaHRtbFxcJ1wiJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIG5nLWljb249XCJmYS1jbG9jay1vIGNvbnRyb2wtYXJlYS1maWxsLWVtcHR5LWljb25cIj48L2hlbHAtcG9wb3Zlcj48L3N1cD4nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0nPGRpdiBjbGFzcz1cImNvbnRyb2wtYXJlYS1maWxsLWVtcHR5LWJsb2NrXCI+JytyZXN1bHQrJzwvZGl2PidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3N0YXJ0X3RpbWVzdGFtcCcsXHJcbiAgICAgICAgICAgICAgICBub3RTb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiY29tbW9uLlN0YXJ0RGF0ZVwiLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0RGF0ZTonREQuTU0uWVlZWSBISDptbSdcclxuXHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdlbmRfdGltZXN0YW1wJyxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uRW5kRGF0ZVwiLFxyXG4gICAgICAgICAgICAgICAgY2VsbENsYXNzOidjb250cm9sLWFyZWEtZW5kLWRhdGUnLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSAnMDAwMC0wMC0wMCAwMDowMDowMCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBpMThuPVwiYmxvY2tzLkluZmluaXR5XCI+PC9zcGFuPidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudC51dGMoZGF0YSkubG9jYWwoKS5mb3JtYXQoXCJERC5NTS5ZWVlZIEhIOm1tXCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2dlb190YXJnZXRpbmdfaWQnLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lSWNvbiA9IGRhdGEgPyBcInNldF90YXJnZXRpbmdcIiA6IFwibm90c2V0X3RhcmdldGluZ1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz1cIicgKyBuYW1lSWNvbiArICdcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjZWxsQ2xhc3M6IFwiaWNvbi1jZWxsXCIsXHJcbiAgICAgICAgICAgICAgICB0aXRsZToge2NsYXNzOiAnZ2VvdGFyZ2V0aW5nLWljb24nLCBuYW1lOiBcIlwifVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICd0aW1lX3RhcmdldGluZ19pZCcsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVJY29uID0gZGF0YSA/IFwic2V0X3RhcmdldGluZ1wiIDogXCJub3RzZXRfdGFyZ2V0aW5nXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPVwiJyArIG5hbWVJY29uICsgJ1wiPjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbm90U29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNlbGxDbGFzczogXCJpY29uLWNlbGxcIixcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB7Y2xhc3M6ICd0aW1ldGFyZ2V0aW5nLWljb24nLCBuYW1lOiBcIlwifVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdudWxsJyxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xfcm93ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgb25lLXN0cmluZ1wiID4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biAgYnRuLWJsdWUgYnRuLXNtIFwiICAgdG9vbHRpcC1hcHBlbmQtdG8tYm9keT1cInRydWVcIiB1aWItdG9vbHRpcD1cInt7XFwnY2FtcGFpZ25zLkVkaXRBdHRhY2hUb29sdGlwXFwnfGkxOG59fVwiIHRvb2x0aXAtcG9wdXAtZGVsYXk9XCIxMDAwXCIgbmctY2xpY2s9XCJ2bS5hY3Rpb24oXFwnZWRpdFxcJywge2lkOlxcJycgKyBmdWxsLmNvbnRlbnQuaWQgKyAnXFwnLG5hbWU6XFwnJyArIGZ1bGwubmFtZSArICdcXCd9KVwiPjxpIGNsYXNzPVwiZmEgIGZhLXBlbmNpbFwiPjwvaT48L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuICBidG4tZGFuZ2VyIGJ0bi1zbVwiIHRvb2x0aXAtYXBwZW5kLXRvLWJvZHk9XCJ0cnVlXCIgdWliLXRvb2x0aXA9XCJ7e1xcJ2NhbXBhaWducy5EZXRhY2hDb250ZW50VG9vbHRpcFxcJ3xpMThufX1cIiAgdG9vbHRpcC1wb3B1cC1kZWxheT1cIjEwMDBcIiBuZy1jbGljaz1cInZtLmFjdGlvbihcXCdyZW1vdmVcXCcsXFwnJyArIGZ1bGwuY29udGVudC5pZCArICdcXCcpXCI+PGkgY2xhc3M9XCJmYSAgZmEtY2hhaW4tYnJva2VuXCI+PC9pPjwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xfcm93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBdO1xyXG4gICAgICAgIHZhciBsaW1pdHMgPSAwO1xyXG5cclxuICAgICAgICB2bS5hY3Rpb25DYWxsYmFjayA9IGZ1bmN0aW9uIChhY3Rpb24sIGlkKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiaW5mb1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZ29Ub09uZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coJ2NhbXBhaWducy5Db25maXJtRGV0YWNoQ29udGVudCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWducy5kZXRhY2hDb250ZW50KHZtLm5nQ2FtcGFpZ24uaWQsIHZtLm5nQXJlYS5pZCwgW2lkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFyZWEoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZUNsaWNrJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9PbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpY2tOYW1lJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9PbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAndXAnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlUG9zaXRpb24oaWQsIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rvd24nOiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIENoYW5nZVBvc2l0aW9uKGlkLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2VkaXQnOiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gZGF0YS5maW5kKGZ1bmN0aW9uIChjb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LmNvbnRlbnQuaWQgPT0gaWQuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoQ29udGVudERldGFpbE1vZGFsU2VydmljZS5zaG93KHZtLm5nQ2FtcGFpZ24sIHZtLm5nQXJlYSwgZGF0YSwgY29udGVudCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFyZWEoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uZ29Ub09uZSA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5jb250ZW50Lm9uZScsIHtpZDogaWR9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm92ZXJsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdm0uYmxhY2tzY3JlZW4gPSBmYWxzZTtcclxuICAgICAgICB2bS5vdmVybG9hZGluZyA9IHZtLm5nQXJlYS5sb2FkX3BlcmNlbnRhZ2UgPiAxMDA7XHJcbiAgICAgICAgdm0udXBkYXRpbmdBcmVhID0gbnVsbDtcclxuXHJcbiAgICAgICAgdm0uc2VydmVyRGF0YSA9IGZ1bmN0aW9uIHNlcnZlckRhdGEoc1NvdXJjZSwgYW9EYXRhLCBmbkNhbGxiYWNrLCBvU2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgaWYgKCF2bS5kaXNhYmxlU2VydmVyTG9hZGluZykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWducy5nZXRDb250ZW50KHZtLm5nQ2FtcGFpZ24uaWQsIHZtLm5nQXJlYS5pZCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uY29udGFpbldpdGhJbnRlcnZhbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBmcmVlRmlsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuaWQgPSBjb250ZW50LmNvbnRlbnQuaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5wbGF5X3RpbWVvdXQgJiYgY29udGVudC5wbGF5X3RpbWVvdXQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5jb250YWluV2l0aEludGVydmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQucGxheV90aW1lID09ICdvbmx5X2VtcHR5JyB8fCBjb250ZW50LnBsYXlfdGltZSA9PSAnZnJlZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVGaWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2bS51cGRhdGluZ0FyZWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0udXBkYXRpbmdBcmVhLnRoZW4oZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLm92ZXJsb2FkaW5nID0gdm0ubmdBcmVhLmxvYWRfcGVyY2VudGFnZSA+IDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmJsYWNrc2NyZWVuID0gIXZtLm92ZXJsb2FkaW5nICYmICFmcmVlRmlsZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2bS5vdmVybG9hZGluZyAmJiAhZnJlZUZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmJsYWNrc2NyZWVuID0gIXZtLm92ZXJsb2FkaW5nICYmICFmcmVlRmlsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayh0YWJsZUhlbHBlci53cmFwTGlzdChyZXN1bHQpKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dXYXJuaW5nKCdjb21tb24uRmFpbGVkR2V0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayh0YWJsZUhlbHBlci5nZXRFbXB0eUxpc3QoKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZm5DYWxsYmFjayh0YWJsZUhlbHBlci53cmFwTGlzdChkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICB2bS5kaXNhYmxlU2VydmVyTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmRvd25sb2FkQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZG93bmxvYWRDb250ZW50TW9kYWxTZXJ2aWNlLnNob3codm0ubmdDYW1wYWlnbiwgdm0ubmdBcmVhKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVBcmVhKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uUm93UmVvcmRlciA9IGZ1bmN0aW9uIChuZXdQb3MsIG9sZFBvcykge1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBkYXRhW29sZFBvc107XHJcbiAgICAgICAgICAgIGRhdGEuc3BsaWNlKG9sZFBvcywgMSk7XHJcbiAgICAgICAgICAgIGRhdGEuc3BsaWNlKG5ld1BvcywgMCwgY29udGVudCk7XHJcbiAgICAgICAgICAgIGNhbXBhaWducy5tb3ZlVG9Db250ZW50KHZtLm5nQ2FtcGFpZ24uaWQsIHZtLm5nQXJlYS5pZCwgY29udGVudC5jb250ZW50LmlkLCBuZXdQb3MgKyAxKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdm0uZGlzYWJsZVNlcnZlckxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uQ3JlYXRlZFJvdyA9IGZ1bmN0aW9uIChyb3csIGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuY29udGVudF9vdmVyZHVlKSB7XHJcbiAgICAgICAgICAgICAgICByb3cucm93RWxlbWVudC5hZGRDbGFzcygnY29udGVudC1vdmVyZHVlJyk7XHJcbiAgICAgICAgICAgICAgICByb3cucm93RWxlbWVudC5hdHRyKCd0aXRsZScsICd7e1wiY2FtcGFpZ25zLkNvbnRlbnRPdmVyZHVlXCJ8aTE4bn19JylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihtb21lbnQudXRjKGRhdGEuc3RhcnRfdGltZXN0YW1wKT5tb21lbnQudXRjKCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJvdy5yb3dFbGVtZW50LmFkZENsYXNzKCdjb250ZW50LW5vdC1zdGFydCcpO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihkYXRhLmVuZF90aW1lc3RhbXAgJiZtb21lbnQudXRjKGRhdGEuZW5kX3RpbWVzdGFtcCk8bW9tZW50LnV0YygpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByb3cucm93RWxlbWVudC5hZGRDbGFzcygnY29udGVudC1lbmQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uaW50YW5jZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlID0gaW5zdGFuY2U7XHJcblxyXG4gICAgICAgICAgICB2bS5pbnN0YW5jZS5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmluc3RhbmNlLmR0SW5zdGFuY2UuRGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KClcclxuICAgICAgICAgICAgICAgIH0sIDEwMClcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uU2VsZWN0ZWQgPSBmdW5jdGlvbiAoaWRzLCBhbGwpIHtcclxuICAgICAgICAgICAgdm0uc2VsZWN0ZWRJZHMgPSBpZHM7XHJcbiAgICAgICAgICAgIHZtLmFsbCA9IGFsbDtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uZGV0YWNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coJ2NhbXBhaWducy5Db25maXJtRGV0YWNoQ29udGVudCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbnMuZGV0YWNoQ29udGVudCh2bS5uZ0NhbXBhaWduLmlkLCB2bS5uZ0FyZWEuaWQsIHZtLnNlbGVjdGVkSWRzKTtcclxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVBcmVhKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUFyZWEoKSB7XHJcbiAgICAgICAgICAgIHZtLnVwZGF0aW5nQXJlYSA9IGNhbXBhaWducy5nZXRBcmVhKHZtLm5nQXJlYSkudGhlbihmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubmdBcmVhID0gYXJlYTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgdm0ub25DaGFuZ2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiLCBcImNvbmZpcm1Nb2RhbFNlcnZpY2VcIl07XHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxJbnN0YW5jZVwiLCBcImJpbGxpbmdTZXJ2aWNlXCIsIFwiJHRpbWVvdXRcIiwgXCIkc2NvcGVcIiwgXCJ0YWJsZUhlbHBlclwiLCBcImFyZWFzXCIsIFwicmVzb2x1dGlvblwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnN1YnNjcmliZVwiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdjcmVhdGVDdXN0b21BcmVhTW9kYWwnLCBzZXJ2aWNlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCwgY29uZmlybU1vZGFsU2VydmljZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIlxyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAoYXJlYXMsIHJlc29sdXRpb24pIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NhbXBhaWducy9jb21wb25lbnRzL2NyZWF0ZUN1c3RvbUFyZWFNb2RhbC9jcmVhdGVDdXN0b21BcmVhTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ2NyZWF0ZS1jdXN0b20tYXJlYS1tb2RhbCcsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZWFzO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x1dGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIGJpbGxpbmdTZXJ2aWNlLCAkdGltZW91dCwgJHNjb3BlLCB0YWJsZUhlbHBlciwgYXJlYXMsIHJlc29sdXRpb24pIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGNhbnZhcyA9IG51bGw7XHJcbiAgICAgICAgdmFyIG5vdFVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY2FudmFzID0gdGhpcy5fX2NhbnZhcyA9IG5ldyBmYWJyaWMuQ2FudmFzKCdjJywge1xyXG4gICAgICAgICAgICAgICAgcHJlc2VydmVPYmplY3RTdGFja2luZzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKCcuY2FudmFzLWNvbnRhaW5lcicpLndpZHRoID0gNDg0O1xyXG4gICAgICAgICAgICAkKCcuY2FudmFzLWNvbnRhaW5lcicpLmhlaWdodCA9IDI3NDtcclxuXHJcbiAgICAgICAgICAgIGNhbnZhcy5vYnNlcnZlKCdvYmplY3Q6bW9kaWZpZWQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLnRvcCA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnNldFNjYWxlWSgoZS5nZXRIZWlnaHQoKSArIGUudG9wKSAvIGUuaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICBlLnNldFRvcCgwKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLnRvcCA+PSB0aGlzLmhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc2V0VG9wKHRoaXMuaGVpZ2h0IC0gMSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlLmxlZnQgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zZXRTY2FsZVgoKGUuZ2V0V2lkdGgoKSArIGUubGVmdCkgLyBlLndpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBlLnNldExlZnQoMClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5sZWZ0ID49IHRoaXMud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnNldExlZnQodGhpcy53aWR0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZS50b3AgKyBlLmdldEhlaWdodCgpID49IHRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zZXRTY2FsZVkoKHRoaXMuaGVpZ2h0IC0gZS50b3ApIC8gZS5oZWlnaHQpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5sZWZ0ICsgZS5nZXRXaWR0aCgpID49IHRoaXMud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnNldFNjYWxlWCgodGhpcy53aWR0aCAtIGUubGVmdCkgLyBlLndpZHRoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHRleHQgPSBldmVudC50YXJnZXQuaXRlbSgxKTtcclxuICAgICAgICAgICAgICAgIHRleHQuc2V0U2NhbGVYKDI0MCAvIGV2ZW50LnRhcmdldC5nZXRXaWR0aCgpKTtcclxuICAgICAgICAgICAgICAgIHRleHQuc2V0U2NhbGVZKDEzNSAvIGV2ZW50LnRhcmdldC5nZXRIZWlnaHQoKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISRzY29wZS4kJHBoYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgY2FudmFzLm9ic2VydmUoJ29iamVjdDptb3ZpbmcnLCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSB0LnRhcmdldDtcclxuICAgICAgICAgICAgICAgIGUuc2V0VG9wKE1hdGguZmxvb3IoTWF0aC5taW4oTWF0aC5tYXgoMCwgZS50b3ApLCB0aGlzLmhlaWdodCAtIGUuZ2V0SGVpZ2h0KCkpKSk7XHJcbiAgICAgICAgICAgICAgICBlLnNldExlZnQoTWF0aC5mbG9vcihNYXRoLm1pbihNYXRoLm1heCgwLCBlLmxlZnQpLCB0aGlzLndpZHRoIC0gZS5nZXRXaWR0aCgpKSkpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGNhbnZhcy5vbih7XHJcbiAgICAgICAgICAgICAgICAnb2JqZWN0Om1vdmluZyc6IG9uQ2hhbmdlLFxyXG4gICAgICAgICAgICAgICAgJ29iamVjdDpzY2FsaW5nJzogb25DaGFuZ2UsXHJcbiAgICAgICAgICAgICAgICAnb2JqZWN0OnJvdGF0aW5nJzogb25DaGFuZ2VcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZXZlbnQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISRzY29wZS4kJHBoYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gZXZlbnQudGFyZ2V0Lml0ZW0oMSk7XHJcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFNjYWxlWCgyNDAgLyBldmVudC50YXJnZXQuZ2V0V2lkdGgoKSk7XHJcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFNjYWxlWSgxMzUgLyBldmVudC50YXJnZXQuZ2V0SGVpZ2h0KCkpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChhcmVhcyYmYXJlYXMubGVuZ3RoPjApIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgdm0ucmVzb2x1dGlvbiA9IHZtLnJlc29sdXRpb25zLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS53aWR0aCA9PT0gcmVzb2x1dGlvbi53aWR0aDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgbm90VXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGFyZWFzLmZvckVhY2goZnVuY3Rpb24gKGFyZWEsIGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUFyZWFPYmplY3QoMCwgMCwgaW5kZXgsIGFyZWEuel9pbmRleCwgYXJlYS5vcGFjaXR5KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LlggPSBhcmVhLng7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LlkgPSBhcmVhLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LndpZHRoID0gYXJlYS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGVpZ2h0ID0gYXJlYS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZtLmFyZWFzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgbm90VXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVDYW52YXMoKTtcclxuICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBY3RpdmVPYmplY3QoIHZtLmFyZWFzWyB2bS5hcmVhcy5sZW5ndGgtMV0ub2JqZWN0KTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbnZhcygpO1xyXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQodXBkYXRlQ2FudmFzLCAxMDApO1xyXG5cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5jYW52YXNQYXJhbSA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcclxuICAgICAgICAgICAgaGVpZ2h0OiAyNzBcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIF9vcmllbnRhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGdldCBvcmllbnRhdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IG9yaWVudGF0aW9uKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB2bS5yZXNvbHV0aW9uLnNjYWxlWCA9IHZhbCA/IHZtLmNhbnZhc1BhcmFtLmhlaWdodCAvIHZtLnJlc29sdXRpb24uaGVpZ2h0IDogdm0uY2FudmFzUGFyYW0ud2lkdGggLyB2bS5yZXNvbHV0aW9uLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgdm0ucmVzb2x1dGlvbi5zY2FsZVkgPSB2YWwgPyB2bS5jYW52YXNQYXJhbS53aWR0aCAvIHZtLnJlc29sdXRpb24ud2lkdGggOiB2bS5jYW52YXNQYXJhbS5oZWlnaHQgLyB2bS5yZXNvbHV0aW9uLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHZhbCA/IHZtLmNhbnZhc1BhcmFtLmhlaWdodCA6IHZtLmNhbnZhc1BhcmFtLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IHZhbCA/IHZtLmNhbnZhc1BhcmFtLndpZHRoIDogdm0uY2FudmFzUGFyYW0uaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdmFyIG9yaWdXaWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgICAgICAgICAgIHZhciBvcmlnSGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIHZhciBzY2FsZVggPSB3aWR0aCAvIG9yaWdXaWR0aDtcclxuICAgICAgICAgICAgICAgIHZhciBzY2FsZVkgPSBoZWlnaHQgLyBvcmlnSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY2FudmFzLnNldERpbWVuc2lvbnMoe1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGNhbnZhcy5mb3JFYWNoT2JqZWN0KGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICAgICAgICAgICAgICBvYmoubGVmdCA9IG9iai5sZWZ0ICogc2NhbGVYO1xyXG4gICAgICAgICAgICAgICAgICAgIG9iai5zY2FsZVggPSBvYmouc2NhbGVYICogc2NhbGVYO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBvYmoudG9wID0gb2JqLnRvcCAqIHNjYWxlWTtcclxuICAgICAgICAgICAgICAgICAgICBvYmouc2NhbGVZID0gb2JqLnNjYWxlWSAqIHNjYWxlWTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzLmZpcmUoXCJvYmplY3Q6bW9kaWZpZWRcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9iaixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZTogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG9iai5zZXRDb29yZHMoKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgICAgICAgICAgIGNhbnZhcy5jYWxjT2Zmc2V0KClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBrb2VmV2lkZSA9IDEyODAgLyA3MjA7XHJcbiAgICAgICAgdm0ucmVzb2x1dGlvbnMgPSBbe1xyXG4gICAgICAgICAgICBuYW1lOiBcIkhEXCIsXHJcbiAgICAgICAgICAgIHdpZHRoOiAxMjgwLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IDcyMCxcclxuICAgICAgICAgICAgc2NhbGVYOiB2bS5jYW52YXNQYXJhbS53aWR0aCAvIDEyODAsXHJcbiAgICAgICAgICAgIHNjYWxlWTogdm0uY2FudmFzUGFyYW0uaGVpZ2h0IC8gNzIwXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkZ1bGxIRFwiLFxyXG4gICAgICAgICAgICB3aWR0aDogMTkyMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiAxMDgwLFxyXG4gICAgICAgICAgICBzY2FsZVg6IHZtLmNhbnZhc1BhcmFtLndpZHRoIC8gMTkyMCxcclxuICAgICAgICAgICAgc2NhbGVZOiB2bS5jYW52YXNQYXJhbS5oZWlnaHQgLyAxMDgwXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlVsdHJhSERcIixcclxuICAgICAgICAgICAgd2lkdGg6IDM4NDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogMjE2MCxcclxuICAgICAgICAgICAgc2NhbGVYOiB2bS5jYW52YXNQYXJhbS53aWR0aCAvIDM4NDAsXHJcbiAgICAgICAgICAgIHNjYWxlWTogdm0uY2FudmFzUGFyYW0uaGVpZ2h0IC8gMjE2MFxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJDdXN0b21cIixcclxuICAgICAgICAgICAgX3dpZHRoOiAxMjgwLFxyXG4gICAgICAgICAgICBnZXQgd2lkdGgoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICBzZXQgd2lkdGgodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsIDwgNjQwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuX3dpZHRoIC8ga29lZldpZGUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBfaGVpZ2h0OiA3MjAsXHJcbiAgICAgICAgICAgIGdldCBoZWlnaHQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgaGVpZ2h0KHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA8IDM2MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IHZhbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gTWF0aC5yb3VuZChrb2VmV2lkZSAqIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBzY2FsZVgoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0uY2FudmFzUGFyYW0ud2lkdGggLyB0aGlzLl93aWR0aDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IHNjYWxlWSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5jYW52YXNQYXJhbS5oZWlnaHQgLyB0aGlzLl9oZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XTtcclxuXHJcblxyXG4gICAgICAgIHZtLnJlc29sdXRpb24gPSB2bS5yZXNvbHV0aW9uc1swXTtcclxuICAgICAgICB2bS5hcmVhcyA9IFtdO1xyXG5cclxuICAgICAgICB2YXIgY29sb3JzID1cclxuICAgICAgICAgICAgWydyZ2JhKDE4NiwxMDQsMjAwICwwLjkpJywgJ3JnYmEoMCwgMTUwLCAxMzYsIDAuOSknLCAncmdiYSgyNTUsMjAyLDQwICwwLjkpJyxcclxuICAgICAgICAgICAgICAgICdyZ2JhKDI1NSwxMTIsNjcgLDAuOSknLCAncmdiYSgxMjAsMTQ0LDE1NiAsMC45KScsICdyZ2JhKDEwMiwxODcsMTA2ICwwLjkpJyxcclxuICAgICAgICAgICAgICAgICdyZ2JhKDIzNiw2NCwxMjIgLDAuOSknLCAncmdiYSgyMzksODMsODAgLDAuOSknLCAncmdiYSgxNDEsMTEwLDk5ICwwLjkpJywgJ3JnYmEoMjEyLDIyNSw4NyAsMC45KSddO1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0QXJlYSgpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBpID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh2bS5hcmVhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpID0gdm0uYXJlYXNbdm0uYXJlYXMubGVuZ3RoIC0gMV0uaW5kZXggKyAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIGxlZnQgPSB2bS5tb2RlbC5vcmllbnRhdGlvbiA/IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDMwKSA6IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDI0MCk7XHJcbiAgICAgICAgICAgIHZhciB0b3AgPSB2bS5tb2RlbC5vcmllbnRhdGlvbiA/IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDI0MCkgOiBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMzUpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVBcmVhT2JqZWN0KHRvcCwgbGVmdCwgaSwgaSwgMTAwKTtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICBjYW52YXMuc2V0QWN0aXZlT2JqZWN0KHJlc3VsdC5vYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVBcmVhT2JqZWN0KHRvcCwgbGVmdCwgaSwgel9pbmRleCwgb3BhY2l0eSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyNDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEzNSxcclxuICAgICAgICAgICAgICAgIGZpbGw6IGNvbG9yc1tpIDwgMTAgPyBpIDogaSAlIDEwXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIHRleHQgPSBuZXcgZmFicmljLlRleHQoKGkgKyAxKS50b1N0cmluZygpLCB7XHJcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiAnTGF0bycsXHJcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogMzAsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIGdyb3VwID0gbmV3IGZhYnJpYy5Hcm91cChbcmVjdCwgdGV4dF0sIHtcclxuICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IHRvcCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyNDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEzNSxcclxuICAgICAgICAgICAgICAgIGhhc1JvdGF0aW5nUG9pbnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCxcclxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBcIiNkZGRkZGRcIixcclxuICAgICAgICAgICAgICAgIGNvcm5lckNvbG9yOiBcIiNkZGRkZGRcIixcclxuICAgICAgICAgICAgICAgIGNvcm5lclNpemU6IDEwLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRDb3JuZXJzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGxvY2tSb3RhdGlvbjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgLy8gIGxvY2tTY2FsaW5nRmxpcDogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FudmFzLmFkZChncm91cCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID1cclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IGdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICAgICAgICAgIHpfaW5kZXg6IHpfaW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogb3BhY2l0eSxcclxuICAgICAgICAgICAgICAgICAgICBfd2lkdGg6IDY0MCxcclxuICAgICAgICAgICAgICAgICAgICBfaGVpZ2h0OiAzNjAsXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0IHdpZHRoKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuX3dpZHRoICogdm0ucmVzb2x1dGlvbi5zY2FsZVgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggIT0gTWF0aC5yb3VuZChncm91cC5nZXRXaWR0aCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBncm91cC5nZXRXaWR0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2lkdGggPSBNYXRoLnJvdW5kKGdyb3VwLmdldFdpZHRoKCkgLyB2bS5yZXNvbHV0aW9uLnNjYWxlWCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHdpZHRoKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gTWF0aC5yb3VuZCh2YWwgKiB2bS5yZXNvbHV0aW9uLnNjYWxlWCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLnNjYWxlWCA9IGdyb3VwLnNjYWxlWCAqICh2YWwgLyBncm91cC5nZXRXaWR0aCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmZpcmUoXCJvYmplY3Q6bW9kaWZpZWRcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBncm91cCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNhbnZhcygpXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXQgaGVpZ2h0KCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLl9oZWlnaHQgKiB2bS5yZXNvbHV0aW9uLnNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gTWF0aC5yb3VuZChncm91cC5nZXRIZWlnaHQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IE1hdGgucm91bmQoZ3JvdXAuZ2V0SGVpZ2h0KCkgLyB2bS5yZXNvbHV0aW9uLnNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBoZWlnaHQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IHZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gTWF0aC5yb3VuZCh2YWwgKiB2bS5yZXNvbHV0aW9uLnNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLnNjYWxlWSA9IGdyb3VwLnNjYWxlWSAqICh2YWwgLyBncm91cC5nZXRIZWlnaHQoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5maXJlKFwib2JqZWN0Om1vZGlmaWVkXCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZ3JvdXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDYW52YXMoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0IFgoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gTWF0aC5yb3VuZCh0aGlzLl94ICogdm0ucmVzb2x1dGlvbi5zY2FsZVgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPSBNYXRoLnJvdW5kKGdyb3VwLmdldExlZnQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSBNYXRoLnJvdW5kKGdyb3VwLmdldExlZnQoKSAvIHZtLnJlc29sdXRpb24uc2NhbGVYKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5feDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBYKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl94ID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBNYXRoLnJvdW5kKHZhbCAqIHZtLnJlc29sdXRpb24uc2NhbGVYKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3QubGVmdCA9IHZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmZpcmUoXCJvYmplY3Q6bW9kaWZpZWRcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBncm91cCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNhbnZhcygpXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXQgWSgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBNYXRoLnJvdW5kKHRoaXMuX3kgKiB2bS5yZXNvbHV0aW9uLnNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ICE9IE1hdGgucm91bmQoZ3JvdXAuZ2V0VG9wKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gTWF0aC5yb3VuZChncm91cC5nZXRUb3AoKSAvIHZtLnJlc29sdXRpb24uc2NhbGVZKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5feTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBZKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBNYXRoLnJvdW5kKHZhbCAqIHZtLnJlc29sdXRpb24uc2NhbGVZKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3QudG9wID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZmlyZShcIm9iamVjdDptb2RpZmllZFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2FudmFzKClcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVtb3ZlKHRoaXMub2JqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldCBpc0FjdGl2ZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKSA9PSB0aGlzLm9iamVjdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDYW52YXMoKSB7XHJcbiAgICAgICAgICAgIGlmIChub3RVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2bS5jcmVhdGVBcmVhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYXJlYSA9IGdldEFyZWEoKTtcclxuICAgICAgICAgICAgdm0uYXJlYXMucHVzaChhcmVhKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ucmVtb3ZlQXJlYSA9IGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgIGlmICghYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgYXJlYSA9IHZtLmFyZWFzLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pc0FjdGl2ZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgIGFyZWEucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB2bS5hcmVhcy5zcGxpY2Uodm0uYXJlYXMuaW5kZXhPZihhcmVhKSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0udG9Ub3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBhcmVhID0gY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpO1xyXG4gICAgICAgICAgICBpZiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5icmluZ0ZvcndhcmQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnRvQm90dG9tID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYXJlYSA9IGNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKTtcclxuICAgICAgICAgICAgaWYgKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgIGFyZWEuc2VuZEJhY2t3YXJkcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uY2xlYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLmFyZWFzLmZvckVhY2goZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgIGFyZWEucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdm0uYXJlYXMuc3BsaWNlKDAsIHZtLmFyZWFzLmxlbmd0aCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zZWxlY3RBcmVhID0gZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgY2FudmFzLnNldEFjdGl2ZU9iamVjdChhcmVhLm9iamVjdCk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNyZWF0ZUxheW91dCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBsYXlvdXQgPSBbXTtcclxuICAgICAgICAgICAgdm0uYXJlYXMuZm9yRWFjaChmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9IGNhbnZhcy5nZXRPYmplY3RzKCkuaW5kZXhPZihhcmVhLm9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGF5b3V0QXJlYSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgbGF5b3V0QXJlYS5uYW1lID0gXCJjdXN0b21cIiArIGlkeCArICh2bS5tb2RlbC5vcmllbnRhdGlvbiA/IFwiX3ZlcnRpY2FsXCIgOiAnJyk7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXRBcmVhLndpZHRoID0gYXJlYS53aWR0aDtcclxuICAgICAgICAgICAgICAgIGxheW91dEFyZWEuaGVpZ2h0ID0gYXJlYS5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXRBcmVhLm9wYWNpdHkgPSBhcmVhLm9wYWNpdHk7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXRBcmVhLnpfaW5kZXggPSBpZHg7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXRBcmVhLnggPSBhcmVhLlg7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXRBcmVhLnkgPSBhcmVhLlk7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXQucHVzaChsYXlvdXRBcmVhKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsYXlvdXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dDogbGF5b3V0LFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB2bS5yZXNvbHV0aW9uLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdm0ucmVzb2x1dGlvbi5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbDogdm0ubW9kZWwub3JpZW50YXRpb25cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNS4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY2FtcGFpZ25zXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcImRpc3BsYXlBcmVhVmFsdWVcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nQXJlYXM6ICc8JyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjYW1wYWlnbnMvY29tcG9uZW50cy9kaXNwbGF5QXJlYVZhbHVlL2Rpc3BsYXlBcmVhVmFsdWUuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIHRoaXMuJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLm5nQXJlYXMgJiYgdm0ubmdBcmVhcykge1xyXG4gICAgICAgICAgICAgICAgdm0uaGFzQXVkaW8gPSB2bS5uZ0FyZWFzLmZpbmQoZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFyZWEueSA9PSAwICYmIGFyZWEueCA9PSAwICYmIGFyZWEud2lkdGggPT0gMCAmJiBhcmVhLmhlaWdodCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB2bS5jb3VudEFyZWEgPSB2bS5uZ0FyZWFzLmxlbmd0aCAtICh2bS5oYXNBdWRpbyA/IDEgOiAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJhcmVhc1N0eWxlSGVscGVyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY2FtcGFpZ25zXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcImRpc3BsYXlDdXJyZW50QXJlYVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdBcmVhczogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ0FyZWE6ICc8JyxcclxuICAgICAgICAgICAgICAgIG5nQ2FtcGFpZ246XCI8XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjYW1wYWlnbnMvY29tcG9uZW50cy9kaXNwbGF5Q3VycmVudEFyZWEvZGlzcGxheUN1cnJlbnRBcmVhLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKGFyZWFzU3R5bGVIZWxwZXIpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2YXIgc3BsaXQgPSB2bS5uZ0FyZWEubmFtZS5zcGxpdCgnXycpO1xyXG4gICAgICAgIGlmKHNwbGl0Lmxlbmd0aD4xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdm0uaXNWZXJ0aWNhbCA9dHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHZtLm5nQXJlYS54ID09MCYmdm0ubmdBcmVhLnk9PTAmJnZtLm5nQXJlYS5oZWlnaHQ9PTAmJnZtLm5nQXJlYS53aWR0aD09MClcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICB2bS5pc0F1ZGlvID10cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2bS5hcmVhU3R5bGVzID0gYXJlYXNTdHlsZUhlbHBlci5nZXRTdHlsZUZvckRpc3BsYXlDdXJyZW50KHZtLm5nQXJlYXMsdm0ubmdBcmVhLHZtLm5nQ2FtcGFpZ24ud2lkdGgsdm0ubmdDYW1wYWlnbi5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiY29udGVudHNcIiwgXCIkdWliTW9kYWxJbnN0YW5jZVwiLCBcImlkXCIsIFwibmFtZVwiLCBcImNhbXBhaWduc1wiLCBcImVuZF90aW1lc3RhbXBcIiwgXCJlcnJvckhhbmRsZXJIZWxwZXJcIiwgXCJtb21lbnRcIiwgXCJBY2NlcHRGaWxlXCIsIFwiY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZVwiLCBcImNvbnRyb2xHZW9UYXJnZXRpbmdTZXJ2aWNlXCIsIFwiJGZpbHRlclwiLCBcImFyZWFcIiwgXCJDb250ZW50VHlwZXNcIiwgXCJsb2NhbGVcIiwgXCJjYW1wYWlnblwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdkb3dubG9hZENvbnRlbnRNb2RhbENvbnRyb2xsZXInLCBjb250cm9sbGVyKVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKGNvbnRlbnRzLCAkdWliTW9kYWxJbnN0YW5jZSwgaWQsIG5hbWUsIGNhbXBhaWducywgZW5kX3RpbWVzdGFtcCwgZXJyb3JIYW5kbGVySGVscGVyLCBtb21lbnQsIEFjY2VwdEZpbGUsIGNvbnRyb2xUYXJnZXRpbmdNb2RhbFNlcnZpY2UsIGNvbnRyb2xHZW9UYXJnZXRpbmdTZXJ2aWNlLCAkZmlsdGVyLCBhcmVhLCBDb250ZW50VHlwZXMsIGxvY2FsZSwgY2FtcGFpZ24pIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0uaWQgPSBpZDtcclxuICAgICAgICB2bS5uYW1lID0gbmFtZTtcclxuICAgICAgICB2bS5lbmRfdGltZXN0YW1wID0gZW5kX3RpbWVzdGFtcDtcclxuXHJcbiAgICAgICAgdm0uY29udGVudFR5cGVzID0gYW5ndWxhci5jb3B5KENvbnRlbnRUeXBlcyk7XHJcbiAgICAgICAgdm0uY29udGVudFR5cGVzLnVuc2hpZnQoe25hbWU6IFwiYWxsXCJ9KTtcclxuXHJcbiAgICAgICAgdm0ub3B0aW9uID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlwiLFxyXG4gICAgICAgICAgICB0YWdzOiBbXSxcclxuICAgICAgICAgICAgdHlwZToge25hbWU6IFwiYWxsXCJ9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgc2VjV29yZCA9IFwiXCI7XHJcbiAgICAgICAgbG9jYWxlLnJlYWR5KCdibG9ja3MnKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2VjV29yZCA9JyAnKyBsb2NhbGUuZ2V0U3RyaW5nKCdjb21tb24uU2Vjb25kU2hvcnQnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgc3RhcnRDYW1wYWlnbiA9IG1vbWVudC51dGMoKTtcclxuICAgICAgICB2YXIgZW5kQ2FtcGFpZ247XHJcbiAgICAgICAgaWYgKGlzRW1wdHkoZW5kX3RpbWVzdGFtcCkgfHwgZW5kX3RpbWVzdGFtcCA9PSBcIjAwMDAtMDAtMDAgMDA6MDA6MDBcIikge1xyXG4gICAgICAgICAgICBlbmRDYW1wYWlnbiA9IG51bGxcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGVuZENhbXBhaWduID0gbW9tZW50KGNhbXBhaWduLmVuZF90aW1lc3RhbXApO1xyXG4gICAgICAgICAgICBpZihlbmRDYW1wYWlnbjxzdGFydENhbXBhaWduKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbmRDYW1wYWlnbiA9bW9tZW50KHN0YXJ0Q2FtcGFpZ24pLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLmNvbnRyb2wgPSB7XHJcbiAgICAgICAgICAgIF9lbmREYXRlOiB0cnVlLFxyXG4gICAgICAgICAgICBzZXQgZW5kX2RhdGUodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmVuZF90aW1lc3RhbXAgPSB2bS5tb2RlbC5zdGFydF90aW1lc3RhbXA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5lbmRfdGltZXN0YW1wID0gZW5kQ2FtcGFpZ24gPyBlbmRDYW1wYWlnbi5mb3JtYXQoKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBlbmRfZGF0ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5tb2RlbC5lbmRfdGltZXN0YW1wID09IChlbmRDYW1wYWlnbiA/IGVuZENhbXBhaWduLmZvcm1hdCgpIDogXCJcIik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBtaW5TdGFydERhdGUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRDYW1wYWlnbjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IG1heFN0YXJ0RGF0ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmRDYW1wYWlnbjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IG1heEVuZERhdGUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kQ2FtcGFpZ247XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBwbGF5X3RpbWVvdXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucGxheV90aW1lb3V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLnBsYXlfdGltZW91dCA9IHBhcnNlSW50KHZhbCkgfHwgMDtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSW50ZXJ2YWwoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IHBsYXlfdGltZW91dCgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5tb2RlbC5wbGF5X3RpbWVvdXQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5tb2RlbC5wbGF5X3RpbWVvdXQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZUludGVydmFsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZtLm1vZGVsLnBsYXlfdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLnBsYXlfdGltZSA9ICdmcmVlJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fZmlsbEVtcHR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwucGxheV90aW1lID0gJ29ubHlfZW1wdHknXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5wbGF5X3RpbWUgPSAnbm9ybWFsJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgX2ZpbGxFbXB0eTogZmFsc2UsXHJcbiAgICAgICAgICAgIGdldCBmaWxsRW1wdHkoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsbEVtcHR5O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgZmlsbEVtcHR5KHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsbEVtcHR5ID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbnRlcnZhbCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIGluaXRDb250ZW50ID0gbnVsbDtcclxuXHJcbiAgICAgICAgaW5pdENvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgIHN0YXJ0X3RpbWVzdGFtcDogbW9tZW50KCkudXRjKCkuZmxvb3IoMjQsICdob3VycycpLmZvcm1hdCgpLFxyXG4gICAgICAgICAgICBwbGF5X29yZGVyOiAzMDAwLFxyXG4gICAgICAgICAgICBwbGF5X3RpbWVvdXQ6IDAsXHJcbiAgICAgICAgICAgIGNvc3Q6IDAsXHJcbiAgICAgICAgICAgIGZpbGxfbW9kZTpcImRlZmF1bHRcIlxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmNhbXBhaWduSWQgPSBpZDtcclxuICAgICAgICB2bS5tb2RlbCA9IGluaXRDb250ZW50O1xyXG4gICAgICAgIHZtLmNvbnRyb2wuZW5kX2RhdGUgPSB0cnVlO1xyXG4gICAgICAgIHZtLnNlbGVjdE9wdGlvbiA9IHtcclxuICAgICAgICAgICAgZHJvcGRvd25Dc3NDbGFzczogXCJmb3JtLXdoaXRlXCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm1vZGVsLnBheW1lbnRfdHlwZSA9ICdmaXhlZCc7XHJcbiAgICAgICAgdm0uY29udHJvbC5wbGF5X3RpbWVvdXQgPSAwO1xyXG4gICAgICAgIHZtLnJlZnJlc2hCeU5hbWUgPSBmdW5jdGlvbiAoc2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5uYW1lID0gc2VhcmNoO1xyXG4gICAgICAgICAgICB2bS51cGRhdGUoKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25DaGFuZ2VTdGFydERhdGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuc3RhcnRfdGltZXN0YW1wID0gdmFsdWU7XHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25DaGFuZ2VFbmREYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmVuZF90aW1lc3RhbXAgPSB2YWx1ZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zaG93Q29udHJvbFRhcmdldGluZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZS5zaG93Q29udHJvbFRhcmdldGluZ01vZGFsKHZtLm1vZGVsLnRpbWVfdGFyZ2V0aW5nX2lkKS50aGVuKFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwudGltZV90YXJnZXRpbmdfaWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNob3dDb250cm9sR2VvVGFyZ2V0aW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250cm9sR2VvVGFyZ2V0aW5nU2VydmljZS5zaG93KHZtLm1vZGVsLmdlb190YXJnZXRpbmdfaWQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5nZW9fdGFyZ2V0aW5nX2lkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zYXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zYXZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHZtLmFkZENvbnRlbnRGdW5jKCk7XHJcbiAgICAgICAgICAgIGlmICghcHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLmNvbnRlbnRfaWQgPSByZXNwb25zZS5pZDtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGFkZENvbnRlbnRQcm9taXNlID0gY2FtcGFpZ25zLmF0dGFjaENvbnRlbnQodm0uY2FtcGFpZ25JZCwgdm0ubW9kZWwsIGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgYWRkQ29udGVudFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZSwgdm0uZm9ybSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zYXZpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLypBZGQgY29udGVudFxyXG4gICAgICAgICAqICovXHJcblxyXG4gICAgICAgIHZtLm1heER1cmF0aW9uID0gIDUwMDA7XHJcbiAgICAgICAgdm0uYWRkQ29udGVudCA9IHtcclxuICAgICAgICAgICAgdGFnczogW10sXHJcbiAgICAgICAgICAgIHBsYXlfZHVyYXRpb246IDUwMDAsXHJcbiAgICAgICAgICAgIHBsYXlfc3RhcnQ6IDAsXHJcbiAgICAgICAgICAgIHJvdGF0ZTogXCIwXCIsXHJcbiAgICAgICAgICAgIGdldCB0eXBlKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCB0eXBlTW9kZWwoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdHlwZU1vZGVsO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgdHlwZU1vZGVsKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90eXBlTW9kZWwgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB2YWx1ZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgdm0uc3VjY2Vzc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0uYnRuRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAgJ3ZpZGVvJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IEFjY2VwdEZpbGUudmlkZW87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1heER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbj90aGlzLmR1cmF0aW9uOjUwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlICAnYXVkaW8nOiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IEFjY2VwdEZpbGUuYXVkaW87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1heER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbj90aGlzLmR1cmF0aW9uOjUwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlICAnaHRtbDVfemlwJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IEFjY2VwdEZpbGUuaHRtbDVfemlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdodG1sNV9vbmxpbmUnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmJ0bkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1heER1cmF0aW9uID0gTnVtYmVyLk1BWF9WQUxVRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IEFjY2VwdEZpbGUuaW1hZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1heER1cmF0aW9uID0gTnVtYmVyLk1BWF9WQUxVRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBfaW50ZXJ2YWxUeXBlOiBcImZ1bGxcIixcclxuICAgICAgICAgICAgZ2V0IGludGVydmFsVHlwZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnRlcnZhbFR5cGU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBpbnRlcnZhbFR5cGUodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcnZhbFR5cGUgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdWxsXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5X2R1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5X3N0YXJ0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjdXN0b21cIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZHVyYXRpb24gPSA1MDAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfc3RhcnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hZGRDb250ZW50RnVuYyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHZtLmZvcm0uJHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zYXZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRzLmFkZENvbnRlbnQodm0uYWRkQ29udGVudCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZSwgdm0uZm9ybSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKHByb2dyZXNzICogMTAwKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKCkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmFkZENvbnRlbnQudHlwZU1vZGVsID0gQ29udGVudFR5cGVzWzBdO1xyXG5cclxuICAgICAgICB2bS5idG5EaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgdm0ubG9hZEZpbGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnN1Y2Nlc3NMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bS5jaGVja2luZ0ZpbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB2bS5idG5EaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnRlbnRzLnNob3dTZWxlY3RGaWxlTW9kYWwodm0uYWRkQ29udGVudC5hY2NlcHQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgoIHZtLmFkZENvbnRlbnQudHlwZU1vZGVsLm5hbWUgPT0gJ2F1ZGlvJyB8fCB2bS5hZGRDb250ZW50LnR5cGVNb2RlbC5uYW1lPT0gJ3ZpZGVvJykgJiYgcmVzdWx0Lm1lZGlhSW5mby5kdXJhdGlvbiA8IDUwMDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5jaGVja2luZ0ZpbGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zbWFsbEZpbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uYnRuRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2bS5hZGRDb250ZW50LnMza2V5ID0gcmVzdWx0LmJsb2Iua2V5O1xyXG4gICAgICAgICAgICAgICAgdm0uYWRkQ29udGVudC5mc2lkID0gcmVzdWx0LmZzaWQ7XHJcbiAgICAgICAgICAgICAgICB2bS5hZGRDb250ZW50LnZhbGlkX3ppcCA9IHJlc3VsdC5tZWRpYUluZm8udmFsaWRfemlwO1xyXG4gICAgICAgICAgICAgICAgdm0uYWRkQ29udGVudC5maWxlc2l6ZSA9IHJlc3VsdC5tZWRpYUluZm8uZmlsZXNpemU7XHJcbiAgICAgICAgICAgICAgICB2bS5hZGRDb250ZW50LmZpbGVoYXNoID0gcmVzdWx0Lm1lZGlhSW5mby5maWxlaGFzaDtcclxuICAgICAgICAgICAgICAgIHZtLmFkZENvbnRlbnQudmlkZW9fd2lkdGggPSByZXN1bHQubWVkaWFJbmZvLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgdm0uYWRkQ29udGVudC52aWRlb19oZWlnaHQgPSByZXN1bHQubWVkaWFJbmZvLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIHZtLmFkZENvbnRlbnQuYml0cmF0ZSA9IHJlc3VsdC5tZWRpYUluZm8uYml0cmF0ZTtcclxuICAgICAgICAgICAgICAgIHZtLmFkZENvbnRlbnQuZHVyYXRpb24gPSByZXN1bHQubWVkaWFJbmZvLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgdm0ubWF4RHVyYXRpb24gPSAgcmVzdWx0Lm1lZGlhSW5mby5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgIHZtLmFkZENvbnRlbnQucGxheV9kdXJhdGlvbiA9IHJlc3VsdC5tZWRpYUluZm8uZHVyYXRpb247XHJcbiAgICAgICAgICAgICAgICBpZiAoISggdm0uYWRkQ29udGVudC50eXBlTW9kZWwubmFtZSA9PSAnYXVkaW8nIHx8IHZtLmFkZENvbnRlbnQudHlwZU1vZGVsLm5hbWUgPT0gJ3ZpZGVvJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5hZGRDb250ZW50LmR1cmF0aW9uID0gNTAwMDtcclxuICAgICAgICAgICAgICAgICAgICB2bS5hZGRDb250ZW50LnBsYXlfZHVyYXRpb249NTAwMDtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZtLmFkZENvbnRlbnQubmFtZSA9IHJlc3VsdC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgdm0uYnRuRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLmNoZWNraW5nRmlsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0uc3VjY2Vzc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5lcnJvckxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5lcnJvckxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZtLmJ0bkRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHZtLmNoZWNraW5nRmlsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdkb3dubG9hZENvbnRlbnRNb2RhbFNlcnZpY2UnLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiLCBcImNhbXBhaWduc1wiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsLCBjYW1wYWlnbnMpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zaG93ID0gZnVuY3Rpb24gKGNhbXBhaWduLGFyZWEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNob3coe1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBpZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbi5pZDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWduLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZW5kX3RpbWVzdGFtcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbi5lbmRfdGltZXN0YW1wO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGF0dGFjaFBsYXlsaXN0VG9Db250ZW50SWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhdHRhY2hlZFBsYXlsaXN0czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGFyZWE6ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmVhO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNhbXBhaWduOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtcGFpZ247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2hvdyhyZXNvbHZlKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjYW1wYWlnbnMvY29tcG9uZW50cy9kb3dubG9hZENvbnRlbnRNb2RhbC9kb3dubG9hZENvbnRlbnRNb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdkb3dubG9hZENvbnRlbnRNb2RhbENvbnRyb2xsZXIgYXMgdm0nLFxyXG4gICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdhdHRhY2gtY29udGVudC1tb2RhbCcsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiByZXNvbHZlXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE3LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcIiRzdGF0ZVBhcmFtc1wiLCBcIiRyb290U2NvcGVcIiwgXCIkdGltZW91dFwiLCBcIiRzdGF0ZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnN0YXRpc3RpY3NcIikuY29uZmlnKGNvbmZpZyk7XHJcbiAgICBjb25maWcuJGluamVjdCA9IFsnJHN0YXRlUHJvdmlkZXInXTtcclxuICAgIGZ1bmN0aW9uIGNvbmZpZygkc3RhdGVQcm92aWRlcikge1xyXG4gICAgICAgICRzdGF0ZVByb3ZpZGVyXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LnN1bW1hcnlTdGF0aXN0aWMnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvc3VtbWFyeT9zdGFydERhdGUmZW5kRGF0ZSZjb250ZW50cyZwbGF5ZXJzJmNhbXBhaWducycsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbXBvbmVudHMvc3RhdGlzdGljcy9wYWdlcy9zdW1tYXJ5Lmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIHJlbG9hZE9uU2VhcmNoOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LmRheScsIHtcclxuICAgICAgICAgICAgICAgIHVybDogJy9kYXk/ZGF5JnN0YXJ0RGF0ZSZlbmREYXRlJmNvbnRlbnRzJnBsYXllcnMmY2FtcGFpZ25zJyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29tcG9uZW50cy9zdGF0aXN0aWNzL3BhZ2VzL3N1bW1hcnkuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgcmVsb2FkT25TZWFyY2g6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCJcclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkc3RhdGVQYXJhbXMsICRyb290U2NvcGUsICR0aW1lb3V0LCAkc3RhdGUpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIHZtLm9wdGlvbiA9IHtcclxuICAgICAgICAgICAgZW5kRGF0ZTogJHN0YXRlUGFyYW1zLmVuZERhdGUgPyBtb21lbnQoJHN0YXRlUGFyYW1zLmVuZERhdGUpIDogbW9tZW50KCkudG9EYXRlKCksXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogJHN0YXRlUGFyYW1zLnN0YXJ0RGF0ZSA/IG1vbWVudCgkc3RhdGVQYXJhbXMuc3RhcnREYXRlKSA6IG1vbWVudCgpLmFkZCgtMSwgJ21vbnRoJykudG9EYXRlKCksXHJcbiAgICAgICAgICAgIHBsYXllcnM6IGdldFBhcmFtcygkc3RhdGVQYXJhbXMucGxheWVycyksXHJcbiAgICAgICAgICAgIGNhbXBhaWduczogZ2V0UGFyYW1zKCRzdGF0ZVBhcmFtcy5jYW1wYWlnbnMpLFxyXG4gICAgICAgICAgICBjb250ZW50czogZ2V0UGFyYW1zKCRzdGF0ZVBhcmFtcy5jb250ZW50cylcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5kYXkgPSAkc3RhdGVQYXJhbXMuZGF5O1xyXG4gICAgICAgIGlmICh2bS5kYXkpIHtcclxuXHJcbiAgICAgICAgICAgIHZtLnRlbXBTdGFydERhdGUgPSB2bS5vcHRpb24uc3RhcnREYXRlO1xyXG4gICAgICAgICAgICB2bS50ZW1wRW5kRGF0ZSA9IHZtLm9wdGlvbi5lbmREYXRlO1xyXG4gICAgICAgICAgICB2bS5vcHRpb24uc3RhcnREYXRlID0gbW9tZW50KHZtLmRheSkudG9EYXRlKCk7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5lbmREYXRlID0gbW9tZW50KHZtLmRheSkuYWRkKDEsICdkYXknKS50b0RhdGUoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRQYXJhbXMocGFyYW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtICYmIHBhcmFtICE9ICdlbXB0eV92YWwnID8gKEFycmF5LmlzQXJyYXkocGFyYW0pID8gcGFyYW0gOiBbcGFyYW1dKSA6IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0ub25DaGFuZ2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdm0uaW5pdDIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0uaW5pdDMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0ub3B0aW9uID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB2bS5yZW5kZXIxID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLnJlbmRlcjIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0ucmVuZGVyMyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bVsncmVuZGVyJyArIHZtLnNob3dUYWJdID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgICAgICAgICB2YXIgb3B0aW9uID0gYW5ndWxhci5jb3B5KHZtLm9wdGlvbik7XHJcbiAgICAgICAgICAgIG9wdGlvbi5zdGFydERhdGUgPSBtb21lbnQodm0ub3B0aW9uLnN0YXJ0RGF0ZSkuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgIG9wdGlvbi5lbmREYXRlID0gbW9tZW50KHZtLm9wdGlvbi5lbmREYXRlKS5mb3JtYXQoKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbi5wbGF5ZXJzICYmIG9wdGlvbi5wbGF5ZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb24ucGxheWVycyA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9wdGlvbi5jYW1wYWlnbnMgJiYgb3B0aW9uLmNhbXBhaWducy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uLmNhbXBhaWducyA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9wdGlvbi5jb250ZW50cyAmJiBvcHRpb24uY29udGVudHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbi5jb250ZW50cyA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJHN0YXRlLmdvKCcuJywgb3B0aW9uLCB7bm90aWZ5OiBmYWxzZX0pO1xyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNob3dUYWIgPSAxO1xyXG4gICAgICAgIHZtLmJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHRpb24gPSBhbmd1bGFyLmNvcHkodm0ub3B0aW9uKTtcclxuICAgICAgICAgICAgb3B0aW9uLnN0YXJ0RGF0ZSA9IG1vbWVudCh2bS50ZW1wU3RhcnREYXRlKS5mb3JtYXQoKTtcclxuICAgICAgICAgICAgb3B0aW9uLmVuZERhdGUgPSBtb21lbnQodm0udGVtcEVuZERhdGUpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICBvcHRpb24uZGF5ID0gbnVsbDtcclxuICAgICAgICAgICAgJHN0YXRlLmdvKCdwZXJzb25hbEFjY291bnQuc3VtbWFyeVN0YXRpc3RpYycsIG9wdGlvbik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5yZW5kZXIxID0gdHJ1ZTtcclxuICAgICAgICB2bS5yZW5kZXIyID0gZmFsc2U7XHJcbiAgICAgICAgdm0ucmVuZGVyMyA9IGZhbHNlO1xyXG4gICAgICAgIHZtLnNlbGVjdFRhYiA9IGZ1bmN0aW9uICh0YWIpIHtcclxuICAgICAgICAgICAgdm0uc2hvd1RhYiA9IHRhYjtcclxuICAgICAgICAgICAgaWYgKCF2bVsncmVuZGVyJyArIHRhYl0pIHtcclxuICAgICAgICAgICAgICAgIHZtWydyZW5kZXInICsgdGFiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHJvb3RTY29wZS4kZW1pdCgncmVzaXplLnN0YXRzVGFibGUnLCB0YWIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHJvb3RTY29wZS4kZW1pdCgncmVzaXplLnN0YXRzVGFibGUnLCB0YWIpO1xyXG4gICAgICAgICAgICB9LCAzKTtcclxuXHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uVXBkYXRlU2VsZWN0ZWRIb3VycyA9IGZ1bmN0aW9uIChob3Vycykge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZEhvdXJzID0gYW5ndWxhci5jb3B5KGhvdXJzKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25BZGRGaWx0ZXIgPSBmdW5jdGlvbiAodHlwZSwgaWQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGUgIT09ICdkYXRlJykge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghKHZtLm9wdGlvblt0eXBlXS5sZW5ndGggPiAwICYmIHZtLm9wdGlvblt0eXBlXS5maW5kKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBpZDtcclxuICAgICAgICAgICAgICAgICAgICB9KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5vcHRpb25bdHlwZV0ucHVzaChpZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBhbmd1bGFyLmNvcHkodm0ub3B0aW9uKTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICRzdGF0ZS5nbygncGVyc29uYWxBY2NvdW50LmRheScsIHZtLmdldFN0YXRzKGlkKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uZ2V0U3RhdHMgPSBmdW5jdGlvbiAoZGF5KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodm0udXJsUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdXJsUGFyYW1zID0gYW5ndWxhci5jb3B5KHZtLnVybFBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5ndWxhci5leHRlbmQoe2RheTogZGF5fSwgdXJsUGFyYW1zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZGF5OiBkYXl9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNy4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkc3RhdGVcIiwgXCJlcnJvckhhbmRsZXJIZWxwZXJcIiwgXCJjYW1wYWlnbnNcIiwgXCJjb250cm9sVGFyZ2V0aW5nTW9kYWxTZXJ2aWNlXCIsIFwiY29udHJvbEdlb1RhcmdldGluZ1NlcnZpY2VcIiwgXCJiaWxsaW5nU2VydmljZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKS5jb25maWcoY29uZmlnKTtcclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gWyckc3RhdGVQcm92aWRlciddO1xyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQuY2FtcGFpZ24uYWRkJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FkZCcsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NhbXBhaWducy9wYWdlcy9hZGRDYW1wYWlnbi9hZGRDYW1wYWlnbi5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6IFwidm1cIlxyXG5cclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkc3RhdGUsIGVycm9ySGFuZGxlckhlbHBlciwgY2FtcGFpZ25zLCBjb250cm9sVGFyZ2V0aW5nTW9kYWxTZXJ2aWNlLCBjb250cm9sR2VvVGFyZ2V0aW5nU2VydmljZSwgYmlsbGluZ1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0uc2VsZWN0UGF5bWVudFR5cGUgPSB7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiZm9ybS13aGl0ZVwiLFxyXG4gICAgICAgICAgICBtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaDogLTFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5tb2RlbCA9IHtcclxuICAgICAgICAgICAgdGFnczogW10sXHJcbiAgICAgICAgICAgIHN0YXJ0X3RpbWVzdGFtcDogbW9tZW50KCkudXRjKCkuZm9ybWF0KCksXHJcbiAgICAgICAgICAgIGVuZF90aW1lc3RhbXA6IG51bGwsXHJcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImxhbmRzY2FwZVwiLFxyXG4gICAgICAgICAgICBjb250ZW50X3NwYWNpbmc6IDI1MCxcclxuICAgICAgICAgICAgYXJlYV9sYXlvdXQ6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXJlYTEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTkyMCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwODAsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5iaWxsaW5nU3RhdHVzID0gZmFsc2U7XHJcbiAgICAgICAgYmlsbGluZ1NlcnZpY2UuZ2V0QmlsbGluZ1N0YXR1cygpLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgICAgICAgICB2bS5iaWxsaW5nU3RhdHVzID0gc3RhdHVzLnBhaWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZtLm1pbkR1cmF0aW9uU2Vjb25kcyA9IDU7XHJcbiAgICAgICAgdm0uY29udHJvbCA9IHtcclxuICAgICAgICAgICAgZ2V0IGluZmluaXR5KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm1vZGVsLmVuZF90aW1lc3RhbXAgPT0gbnVsbDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IGluZmluaXR5KHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuZW5kX3RpbWVzdGFtcCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5lbmRfdGltZXN0YW1wID0gbW9tZW50KCkudXRjKCkuYWRkKDEsICdkYXknKS5mbG9vcigyNCwgJ2hvdXJzJykuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXQgYXV0b19kdXJhdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5tb2RlbC5hdXRvX2R1cmF0aW9uO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgYXV0b19kdXJhdGlvbih2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHVyYXRpb25NaW4gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHVyYXRpb25TZWMgPSA1O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYXV0b19kdXJhdGlvbiA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgX2R1cmF0aW9uTWluOiAwLFxyXG4gICAgICAgICAgICBnZXQgZHVyYXRpb25NaW4oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZHVyYXRpb25NaW47XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBkdXJhdGlvbk1pbih2YWwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2R1cmF0aW9uTWluID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2R1cmF0aW9uTWluID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEdXJhdGlvbigpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBfZHVyYXRpb25TZWM6IDAsXHJcbiAgICAgICAgICAgIGdldCBkdXJhdGlvblNlYygpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kdXJhdGlvblNlYztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IGR1cmF0aW9uU2VjKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHVyYXRpb25TZWMgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHVyYXRpb25TZWMgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUR1cmF0aW9uKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5kdXJhdGlvbiA9ICh0aGlzLmR1cmF0aW9uTWluICogNjAgKyB0aGlzLmR1cmF0aW9uU2VjKSAqIDEwMDA7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0ubW9kZWwuZHVyYXRpb24gPCA1MDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHVyYXRpb25TZWMgPSB2bS5taW5EdXJhdGlvblNlY29uZHMgPSA1O1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmR1cmF0aW9uID0gNTAwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1pbkR1cmF0aW9uU2Vjb25kcyA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF9zZWFtbGVzc1BsYXliYWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgZ2V0IHNlYW1sZXNzUGxheWJhY2soKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VhbWxlc3NQbGF5YmFjaztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IHNlYW1sZXNzUGxheWJhY2sodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWFtbGVzc1BsYXliYWNrID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmNvbnRlbnRfc3BhY2luZyA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICAgICAgZ2V0IGNvbnRlbnRfc3BhY2luZygpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5tb2RlbC5jb250ZW50X3NwYWNpbmc7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBjb250ZW50X3NwYWNpbmcodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZUludCh2YWwpIHx8IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZtLmJpbGxpbmdTdGF0dXMgJiYgdmFsIDwgMjUwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gMjUwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuY29udGVudF9zcGFjaW5nID0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jb250cm9sLmF1dG9fZHVyYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHZtLm9uQ2hhbmdlU3RhcnREYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLnN0YXJ0X3RpbWVzdGFtcCA9IHZhbHVlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25DaGFuZ2VFbmREYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmVuZF90aW1lc3RhbXAgPSB2YWx1ZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hZGQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnN1Ym1pdHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh2bS5mb3JtLiR2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIG9yaWVudGF0aW9uID0gdm0ubW9kZWwuYXJlYV9sYXlvdXQuZmluZChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUuaW5jbHVkZXMoJ3ZlcnRpY2FsJyk7XHJcbiAgICAgICAgICAgICAgICB9KSA9PSBudWxsID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnO1xyXG5cclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb247XHJcblxyXG4gICAgICAgICAgICAgICAgY2FtcGFpZ25zLmFkZCh2bS5tb2RlbCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHN0YXRlLmdvKFwicGVyc29uYWxBY2NvdW50LmNhbXBhaWduLm9uZVwiLCB7aWQ6IHJlc3VsdC5pZH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCB2bS5mb3JtLCB2bSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zaG93Q29udHJvbFRhcmdldGluZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZS5zaG93Q29udHJvbFRhcmdldGluZ01vZGFsKHZtLm1vZGVsLnRpbWVfdGFyZ2V0aW5nX2lkKS50aGVuKFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwudGltZV90YXJnZXRpbmdfaWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNob3dDb250cm9sR2VvVGFyZ2V0aW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250cm9sR2VvVGFyZ2V0aW5nU2VydmljZS5zaG93KHZtLm1vZGVsLmdlb190YXJnZXRpbmdfaWQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5nZW9fdGFyZ2V0aW5nX2lkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5jYW1wYWlnbi5saXN0JylcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE3LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gW1wiJHN0YXRlUHJvdmlkZXJcIl07XHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkc3RhdGVQYXJhbXNcIiwgXCJjYW1wYWlnbnNcIiwgXCJjYW1wYWlnblwiLCBcInJlbW92ZU1vZGFsU2VydmljZVwiLCBcIm1vbWVudFwiLCBcImNvbnRyb2xUYXJnZXRpbmdNb2RhbFNlcnZpY2VcIiwgXCJjb250cm9sR2VvVGFyZ2V0aW5nU2VydmljZVwiLCBcImVkaXRTZXJ2aWNlXCIsIFwiY29uZmlybU1vZGFsU2VydmljZVwiLCBcImJhY2tTZXJ2aWNlXCIsIFwiYmlsbGluZ1NlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jYW1wYWlnbnNcIikuY29uZmlnKGNvbmZpZyk7XHJcbiAgICBmdW5jdGlvbiBjb25maWcoJHN0YXRlUHJvdmlkZXIpIHtcclxuICAgICAgICAkc3RhdGVQcm92aWRlclxyXG4gICAgICAgICAgICAuc3RhdGUoJ3BlcnNvbmFsQWNjb3VudC5jYW1wYWlnbi5vbmUnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvb25lL3tpZH0nLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjYW1wYWlnbnMvcGFnZXMvY2FtcGFpZ24vY2FtcGFpZ24uaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ246IFtcImNhbXBhaWduc1wiLCBcIiRzdGF0ZVBhcmFtc1wiLCBmdW5jdGlvbiAoY2FtcGFpZ25zLCAkc3RhdGVQYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWducy5nZXQoJHN0YXRlUGFyYW1zLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJHN0YXRlUGFyYW1zLCBjYW1wYWlnbnMsIGNhbXBhaWduLCByZW1vdmVNb2RhbFNlcnZpY2UsIG1vbWVudCwgY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZSwgY29udHJvbEdlb1RhcmdldGluZ1NlcnZpY2UsIGVkaXRTZXJ2aWNlLCBjb25maXJtTW9kYWxTZXJ2aWNlLCBiYWNrU2VydmljZSwgYmlsbGluZ1NlcnZpY2UpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLmNhbXBhaWduSWQgPSAkc3RhdGVQYXJhbXMuaWQ7XHJcbiAgICAgICAgdm0ubW9kZWwgPSBjYW1wYWlnbjtcclxuICAgICAgICB2bS5tb2RlbC5jb3N0ID0gcGFyc2VGbG9hdCh2bS5tb2RlbC5jb3N0KTtcclxuXHJcbiAgICAgICAgaWYoIXZtLm1vZGVsLmF1dG9fZHVyYXRpb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodm0ubW9kZWwuZHVyYXRpb24gPCA1MDAwKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5kdXJhdGlvbiA9IDUwMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2YXIgc2VjID0gcGFyc2VJbnQodm0ubW9kZWwuZHVyYXRpb24gLyAxMDAwKTtcclxuICAgICAgICB2bS5tb2RlbC5fZHVyYXRpb25NaW4gPSBNYXRoLmZsb29yKHNlYyAvIDYwKTtcclxuICAgICAgICB2bS5tb2RlbC5fZHVyYXRpb25TZWMgPSBzZWMgLSB2bS5tb2RlbC5fZHVyYXRpb25NaW4gKiA2MDtcclxuICAgICAgICB2bS5taW5EdXJhdGlvblNlY29uZHMgPSA1O1xyXG4gICAgICAgIHZtLmNvbnRyb2wgPSB7XHJcbiAgICAgICAgICAgIF9zZWFtbGVzc1BsYXliYWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgZ2V0IHNlYW1sZXNzUGxheWJhY2soKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VhbWxlc3NQbGF5YmFjaztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IHNlYW1sZXNzUGxheWJhY2sodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWFtbGVzc1BsYXliYWNrID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5jb250ZW50X3NwYWNpbmcgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXQgY29udGVudF9zcGFjaW5nKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLmVkaXRNb2RlbC52YWx1ZS5jb250ZW50X3NwYWNpbmc7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBjb250ZW50X3NwYWNpbmcodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZUludCh2YWwpIHx8IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZtLmJpbGxpbmdTdGF0dXMgJiYgdmFsIDwgMjUwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gMjUwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnZhbHVlLmNvbnRlbnRfc3BhY2luZyA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ubW9kZWwudXBkYXRlRHVyYXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSAodGhpcy5kdXJhdGlvbk1pbiAqIDYwICsgdGhpcy5kdXJhdGlvblNlYykgKiAxMDAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiA8IDUwMDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2R1cmF0aW9uU2VjID0gdm0ubWluRHVyYXRpb25TZWNvbmRzID0gNTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSA1MDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0ubWluRHVyYXRpb25TZWNvbmRzID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZtLm1vZGVsLCBcImluZmluaXR5XCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmRfdGltZXN0YW1wID09IG51bGwgfHwgdGhpcy5lbmRfdGltZXN0YW1wID09ICcwMDAwLTAwLTAwIDAwOjAwOjAwJztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZF90aW1lc3RhbXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRfdGltZXN0YW1wID0gbW9tZW50KCkudXRjKCkuYWRkKDEsICdkYXknKS5mbG9vcigyNCwgJ2hvdXJzJykuZm9ybWF0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0ubW9kZWwsIFwiYXV0b19kdXJhdGlvbl9wcm9wXCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hdXRvX2R1cmF0aW9uID09IDE7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvX2R1cmF0aW9uID0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZtLm1vZGVsLCBcImR1cmF0aW9uTWluXCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZHVyYXRpb25NaW47XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHVyYXRpb25NaW4gPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHVyYXRpb25NaW4gPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUR1cmF0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0ubW9kZWwsIFwiZHVyYXRpb25TZWNcIiwge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kdXJhdGlvblNlYztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kdXJhdGlvblNlYyA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kdXJhdGlvblNlYyA9IHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRHVyYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bS5tb2RlbCwgXCJtaW5FbmREYXRlXCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdXBkYXRlKHRydWUpO1xyXG5cclxuICAgICAgICB2bS5lZGl0TW9kZWwgPSBlZGl0U2VydmljZS5nZXRFZGl0TW9kZWxGb3JSZXN0QW5ndWxhck1vZGVsKHZtKTtcclxuXHJcbiAgICAgICAgdm0uYmlsbGluZ1N0YXR1cyA9IGZhbHNlO1xyXG4gICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldEJpbGxpbmdTdGF0dXMoKS50aGVuKGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICAgICAgdm0uYmlsbGluZ1N0YXR1cyA9IHN0YXR1cy5wYWlkO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5vbkNoYW5nZSA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwgPSBvYmoudmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5mb3JtLiRpbnZhbGlkO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uU2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHVwZGF0ZUFyZWFzID0gIXZtLm1vZGVsLmFyZWFfbGF5b3V0WzBdLmlkIHx8IHZtLm1vZGVsLmhhc19hdWRpb19hcmVhICE9IHZtLm1vZGVsLmhhc19hdWRpb19hcmVhX25ldztcclxuICAgICAgICAgICAgaWYgKHVwZGF0ZUFyZWFzICYmICh2bS5hcmVhcy5sZW5ndGggPiB2bS5tb2RlbC5hcmVhX2xheW91dC5sZW5ndGggfHwgKHZtLm1vZGVsLmhhc19hdWRpb19hcmVhICYmICF2bS5tb2RlbC5oYXNfYXVkaW9fYXJlYV9uZXcpKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdygnY2FtcGFpZ25zLkNvbmZpcm1VcGRhdGVBcmVhJykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2FtcGFpZ24odXBkYXRlQXJlYXMpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlQ2FtcGFpZ24odXBkYXRlQXJlYXMpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbnMudXBkYXRlKHZtLm1vZGVsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uQ2hhbmdlU3RhcnREYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5zdGFydF90aW1lc3RhbXAgPSB2YWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uQ2hhbmdlRW5kRGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB2bS5lZGl0TW9kZWwudmFsdWUuZW5kX3RpbWVzdGFtcCA9IHZhbHVlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uc2hvd0NvbnRyb2xUYXJnZXRpbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnVwZGF0ZVRpbWVUYXJnZXRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb250cm9sVGFyZ2V0aW5nTW9kYWxTZXJ2aWNlLnNob3dDb250cm9sVGFyZ2V0aW5nTW9kYWwodm0ubW9kZWwudGltZV90YXJnZXRpbmdfaWQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodm0uZWRpdE1vZGVsLnZhbHVlLnRpbWVfdGFyZ2V0aW5nX2lkICE9PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5lZGl0TW9kZWwudmFsdWUudGltZV90YXJnZXRpbmdfaWQgPSBpZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnVwZGF0ZVRpbWVUYXJnZXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLnVwZGF0ZVRpbWVUYXJnZXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNob3dDb250cm9sR2VvVGFyZ2V0aW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS51cGRhdGVHZW9UYXJnZXRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb250cm9sR2VvVGFyZ2V0aW5nU2VydmljZS5zaG93KHZtLm1vZGVsLmdlb190YXJnZXRpbmdfaWQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodm0uZWRpdE1vZGVsLnZhbHVlLmdlb190YXJnZXRpbmdfaWQgIT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5nZW9fdGFyZ2V0aW5nX2lkID0gaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0udXBkYXRlR2VvVGFyZ2V0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLnVwZGF0ZUdlb1RhcmdldGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uQ2hhbmdlQXJlYSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGNhbXBhaWducy5nZXQoJHN0YXRlUGFyYW1zLmlkKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuZHVyYXRpb24gPSByZXNwb25zZS5kdXJhdGlvbj8gcmVzcG9uc2UuZHVyYXRpb246MDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICB2bS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZU1vZGFsU2VydmljZS5zaG93UmVtb3ZlTW9kYWwoW3ZtLm1vZGVsLmlkXSwgXCJjYW1wYWlnbnNcIikudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5iYWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uYmFjayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgYmFja1NlcnZpY2UuYmFjaygncGVyc29uYWxBY2NvdW50LmNhbXBhaWduLmxpc3QnKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGUodXBkYXRlQXJlYXMpIHtcclxuICAgICAgICAgICAgaWYgKHVwZGF0ZUFyZWFzKSB7XHJcbiAgICAgICAgICAgICAgICBjYW1wYWlnbnMuZ2V0QXJlYXModm0uY2FtcGFpZ25JZCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uYXJlYXMgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuYXJlYV9sYXlvdXQgPSByZXN1bHQucGxhaW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5oYXNfYXVkaW9fYXJlYSA9IHZtLm1vZGVsLmhhc19hdWRpb19hcmVhX25ldyA9ICEhdm0uYXJlYXMuZmluZChmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFyZWEueSA9PSAwICYmIGFyZWEueCA9PSAwICYmIGFyZWEud2lkdGggPT0gMCAmJiBhcmVhLmhlaWdodCA9PSAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2bS5jb250cm9sLl9zZWFtbGVzc1BsYXliYWNrID0gdm0ubW9kZWwuY29udGVudF9zcGFjaW5nID09PSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ2FtcGFpZ24odXBkYXRlQXJlYXMpIHtcclxuICAgICAgICAgICAgdmFyIG9yaWVudGF0aW9uID0gdm0ubW9kZWwuYXJlYV9sYXlvdXQuZmluZChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZS5pbmNsdWRlcygndmVydGljYWwnKTtcclxuICAgICAgICAgICAgfSkgPT0gbnVsbCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JztcclxuXHJcbiAgICAgICAgICAgIHZtLm1vZGVsLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb247XHJcbiAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbnMudXBkYXRlKHZtLm1vZGVsKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHVwZGF0ZSh1cGRhdGVBcmVhcyk7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNy4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJEVENvbHVtbkJ1aWxkZXJcIiwgXCJjYW1wYWlnbnNcIiwgXCJub3RpZmljYXRpb25TZXJ2aWNlXCIsIFwibW9tZW50XCIsIFwiJHN0YXRlXCIsIFwiYXR0YWNoQ29udGVudE1vZGFsU2VydmljZVwiLCBcInJlbW92ZU1vZGFsU2VydmljZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNhbXBhaWduc1wiKS5jb25maWcoY29uZmlnKTtcclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gWyckc3RhdGVQcm92aWRlciddO1xyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQuY2FtcGFpZ24nLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvY2FtcGFpZ24nLFxyXG4gICAgICAgICAgICAgICAgYWJzdHJhY3Q6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgdWktdmlldz48L2Rpdj4nXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LmNhbXBhaWduLmxpc3QnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvbGlzdCcsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NhbXBhaWducy9wYWdlcy9jYW1wYWlnbnMvY2FtcGFpZ25zLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcblxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoRFRDb2x1bW5CdWlsZGVyLCBjYW1wYWlnbnMsIG5vdGlmaWNhdGlvblNlcnZpY2UsIG1vbWVudCwgJHN0YXRlLCBhdHRhY2hDb250ZW50TW9kYWxTZXJ2aWNlLCByZW1vdmVNb2RhbFNlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIHZtLm9wdGlvbiA9IHtcclxuICAgICAgICAgICAgdGFnczogW10sXHJcbiAgICAgICAgICAgIG5hbWU6IFwiXCIsXHJcbiAgICAgICAgICAgIHN0YXR1czogZmFsc2VcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdmFyIGxpbWl0cyA9IDA7XHJcblxyXG4gICAgICAgIHZtLmNvbHVtbnMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdjcmVhdGVkX2F0J1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICBhbGlnbjogXCJsZWZ0XCIsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uTmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiNDAlXCIsXHJcbiAgICAgICAgICAgICAgICBjZWxsQ2xhc3M6IFwibmFtZS1jZWxsIHRhYmxlLWxpbmtcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdzdGF0dXMnLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnPGRpdiBjbGFzcz1cImlubGluZS1ibG9ja1wiIHN0eWxlPVwid2lkdGg6IDcwcHg7dGV4dC1hbGlnbjogY2VudGVyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1wcmltYXJ5IGNvbnN0YW50cy1jYW1wYWlnbi1zdGF0dXMtJyArIGRhdGEgKyAnXCI+JyArICd7e1wiY29uc3RhbnRzLkNhbXBhaWduU3RhdHVzXycgKyBkYXRhICsgJ1wifGkxOG59fScgKyAnPC9zcGFuPjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uU3RhdHVzXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwiY29udGVudF9jb3VudFwiLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiY2FtcGFpZ25zLkFtb3VudENvbnRlbnRcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAndGFncycsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndGFncycsXHJcbiAgICAgICAgICAgICAgICBub3RTb3J0OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ251bGwnLFxyXG4gICAgICAgICAgICAgICAgbm90U29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKGRhdGEsIGZ1bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udHJvbF9yb3cgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBvbmUtc3RyaW5nXCIgPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gIGJ0bi1kYW5nZXIgYnRuLXNtXCIgdWliLXRvb2x0aXA9XCJ7e1xcJ2NvbW1vbi5SZW1vdmVUb29sdGlwXFwnfGkxOG59fVwiIHRvb2x0aXAtYXBwZW5kLXRvLWJvZHk9XCJ0cnVlXCIgdG9vbHRpcC1wb3B1cC1kZWxheT1cIjEwMDBcIiBuZy1jbGljaz1cInZtLmFjdGlvbihcXCdyZW1vdmVcXCcsXFwnJyArIGZ1bGwuaWQgKyAnXFwnKVwiPjxpIGNsYXNzPVwiZmEgIGZhLXJlbW92ZVwiPjwvaT48L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sX3JvdztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgXTtcclxuICAgICAgICB2bS5kZWZhdWx0U29ydCA9IFsxLCAnZGVzYyddO1xyXG5cclxuICAgICAgICB2bS5hY3Rpb25DYWxsYmFjayA9IGZ1bmN0aW9uIChhY3Rpb24sIGlkKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiaW5mb1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZ29Ub09uZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVNb2RhbFNlcnZpY2Uuc2hvd1JlbW92ZU1vZGFsKFtpZF0sIFwiY2FtcGFpZ25zXCIpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGVDbGljayc6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5nb1RvT25lKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2NsaWNrTmFtZSc6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5nb1RvT25lKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2F0dGFjaCc6IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoQ29udGVudE1vZGFsU2VydmljZS5zaG93KGlkLmlkLCBpZC5uYW1lKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uc2VydmVyRGF0YSA9IGZ1bmN0aW9uIHNlcnZlckRhdGEoc1NvdXJjZSwgYW9EYXRhLCBmbkNhbGxiYWNrLCBvU2V0dGluZ3MpIHtcclxuXHJcblxyXG4gICAgICAgICAgICB2YXIgcGFyYW0gPSB7fTtcclxuICAgICAgICAgICAgaWYgKHZtLm9wdGlvbi5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbVsnZmlsdGVyW25hbWVdJ10gPSB2bS5vcHRpb24ubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXZtLm9wdGlvbi5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbc3RhdHVzXSddID0gJ2FjdGl2ZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZtLm9wdGlvbi50YWdzICYmIHZtLm9wdGlvbi50YWdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbdGFnc10nXSA9IHZtLm9wdGlvbi50YWdzLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmlkO1xyXG4gICAgICAgICAgICAgICAgfSkuam9pbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBvcmRlciA9IGFvRGF0YVsyXS52YWx1ZTtcclxuICAgICAgICAgICAgaWYgKG9yZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IG9yZGVyWzBdLmNvbHVtbjtcclxuICAgICAgICAgICAgICAgIHZhciBkaXIgPSBvcmRlclswXS5kaXI7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmFtZVBhcmFtID0gJ3NvcnRbJyArIGFvRGF0YVsxXS52YWx1ZVtjb2x1bW5JbmRleF0uZGF0YSArICddJztcclxuICAgICAgICAgICAgICAgIHBhcmFtW25hbWVQYXJhbV0gPSBkaXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyYW1bJ3BhZ2Vbb2Zmc2V0XSddID0gYW9EYXRhWzNdLnZhbHVlO1xyXG4gICAgICAgICAgICBwYXJhbVsncGFnZVtsaW1pdF0nXSA9IGFvRGF0YVs0XS52YWx1ZTtcclxuICAgICAgICAgICAgbGltaXRzID0gcGFyYW1bJ3BhZ2VbbGltaXRdJ107XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FtcGFpZ25zLmdldExpc3QocGFyYW0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubm90RXhpc3QgPSByZXN1bHQuZGF0YS5sZW5ndGggPT09IDAgJiYgIXZtLm9wdGlvbi5zdGF0dXMgJiZcclxuICAgICAgICAgICAgICAgICAgICB2bS5vcHRpb24udGFncy5sZW5ndGggPT09IDAgJiYgdm0ub3B0aW9uLm5hbWUgPT09ICcnO1xyXG4gICAgICAgICAgICAgICAgZm5DYWxsYmFjayhyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgdm0ucmVsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1dhcm5pbmcoJ2NvbW1vbi5GYWlsZWRHZXQnKTtcclxuICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmludGFuY2VDYWxsYmFjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB2bS5pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25TZWxlY3RlZCA9IGZ1bmN0aW9uIChpZHMsIGFsbCkge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZElkcyA9IGlkcztcclxuICAgICAgICAgICAgdm0uYWxsID0gYWxsO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmVtb3ZlTW9kYWxTZXJ2aWNlLnNob3dSZW1vdmVNb2RhbCh2bS5zZWxlY3RlZElkcywgXCJjYW1wYWlnbnNcIikudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKHZtLmFsbCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnVuc2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmdvVG9PbmUgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgJHN0YXRlLmdvKCdwZXJzb25hbEFjY291bnQuY2FtcGFpZ24ub25lJywge2lkOiBpZH0pXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm9uUmVzZXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5uYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLnN0YXR1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bS5vcHRpb24udGFncy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YSh0cnVlKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25BcHBseSA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLm5hbWUgPSBvcHRpb24ubmFtZTtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLnN0YXR1cyA9IG9wdGlvbi5zdGF0dXM7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi50YWdzID0gb3B0aW9uLnRhZ3M7XHJcbiAgICAgICAgICAgIHZtLm5vdEV4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEodHJ1ZSk7XHJcblxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5yZWxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnJlbG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEoZmFsc2UpO1xyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDUuMjAxNi5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIzLjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxJbnN0YW5jZVwiLCBcInVybFwiLCBcIiRzY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jb250ZW50c1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdhdWRpb1ByZXZpZXdNb2RhbFNlcnZpY2UnLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvYXVkaW9QcmV2aWV3TW9kYWwvYXVkaW9QcmV2aWV3TW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6J3ZtJyxcclxuICAgICAgICAgICAgICAgIHNpemU6IFwibGdcIixcclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlciggJHVpYk1vZGFsSW5zdGFuY2UsdXJsLCRzY2UpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG5cclxuICAgICAgICB2bS51cmwgPSRzY2UudHJ1c3RBc1Jlc291cmNlVXJsKHVybCk7XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMS4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiY29udGVudHNcIiwgXCJEVE9wdGlvbnNCdWlsZGVyXCIsIFwiRFRDb2x1bW5EZWZCdWlsZGVyXCIsIFwibG9jYWxlXCIsIFwidGFibGVIZWxwZXJcIiwgXCJjYW1wYWlnbnNcIiwgXCIkcVwiLCBcImNvbmZpcm1Nb2RhbFNlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jb250ZW50c1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJjYW1wYWlnblRhYmxlXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SWQ6ICc8JyxcclxuICAgICAgICAgICAgICAgIGNhbXBhaWduczogJzwnLFxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogXCImXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvY2FtcGFpZ25UYWJsZS9jYW1wYWlnblRhYmxlLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihjb250ZW50cywgRFRPcHRpb25zQnVpbGRlciwgRFRDb2x1bW5EZWZCdWlsZGVyLCBsb2NhbGUsIHRhYmxlSGVscGVyLGNhbXBhaWducywkcSxjb25maXJtTW9kYWxTZXJ2aWNlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2YXIgb3B0aW9ucyA9IHRhYmxlSGVscGVyLmdldE9wdGlvbnNGb3JBbmd1bGFyV2F5VGFibGUoW3RydWUsIGZhbHNlXSk7XHJcblxyXG5cclxuICAgICAgICB2bS5kdE9wdGlvbnMgPSBvcHRpb25zLmR0T3B0aW9ucztcclxuICAgICAgICB2bS5kdENvbHVtbkRlZnMgPSBvcHRpb25zLmR0Q29sdW1uRGVmcztcclxuXHJcblxyXG4gICAgICAgIHZtLnJlbW92ZSA9IGZ1bmN0aW9uIChjYW1wYWlnbikge1xyXG4gICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coJ2NvbnRlbnRzLkNvbmZpcm1EZXRhY2hDYW1wYWlnbicsZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRxLmFsbChjYW1wYWlnbi5hcmVhSWRzLm1hcChmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbnMuZGV0YWNoQ29udGVudChjYW1wYWlnbi5jYW1wYWlnbi5pZCxpZCwgW3ZtLmNvbnRlbnRJZF0pO1xyXG4gICAgICAgICAgICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uVXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IClcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jb250ZW50c1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdjaGFuZ2VGaWxlTW9kYWxDb250cm9sbGVyJywgY29udHJvbGxlcik7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdjb250ZW50JywgJ2NvbnRlbnRzJywgJ2Vycm9ySGFuZGxlckhlbHBlciddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgY29udGVudCwgY29udGVudHMsIGVycm9ySGFuZGxlckhlbHBlcikge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS5tb2RlbCA9IGNvbnRlbnQ7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoY29udGVudC50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgICd2aWRlbyc6IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuYWNjZXB0ID0gXCJ2aWRlby8qXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICAnYXVkaW8nOiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmFjY2VwdCA9IFwiYXVkaW8vKlwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAgJ2h0bWw1X3ppcCc6IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuYWNjZXB0ID0gXCJhcHBsaWNhdGlvbi96aXBcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2bS5zYXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodm0uZm9ybS4kdmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgY29udGVudHMudXBkYXRlRmlsZShjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCB2bS5mb3JtLCB2bSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnByb2dyZXNzID0gTWF0aC5yb3VuZChwcm9ncmVzcyAqIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY29udGVudHNcIilcclxuICAgICAgICAuc2VydmljZSgnY2hhbmdlRmlsZU1vZGFsU2VydmljZScsIHNlcnZpY2UpO1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2hvdyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3AgOiAnc3RhdGljJyx0ZW1wbGF0ZVVybDogJ2NvbnRlbnQvY29tcG9uZW50cy9jaGFuZ2VGaWxlTW9kYWwvY2hhbmdlRmlsZU1vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ2NoYW5nZUZpbGVNb2RhbENvbnRyb2xsZXIgYXMgdm0nLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDExLjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJhdHRhY2hDb250ZW50RGV0YWlsTW9kYWxTZXJ2aWNlXCIsIFwiY29udGVudHNcIiwgXCIkZmlsdGVyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY29udGVudHNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwiY29udGVudENhbXBhaWduXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SWQ6ICc8JyxcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwiPFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29udGVudC9jb21wb25lbnRzL2NvbnRlbnRDYW1wYWlnbi9jb250ZW50Q2FtcGFpZ24uaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKGF0dGFjaENvbnRlbnREZXRhaWxNb2RhbFNlcnZpY2UsIGNvbnRlbnRzLCAkZmlsdGVyKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgIHZtLmF0dGFjaFBsYXlsaXN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBhdHRhY2hDb250ZW50RGV0YWlsTW9kYWxTZXJ2aWNlLnNob3dBdHRhY2hUb0NvbnRlbnQodm0ubmFtZSwgdm0uY29udGVudElkLCB2bS5jYW1wYWlnbnMpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uVXBkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB1cGRhdGUoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7XHJcbiAgICAgICAgICAgIHZtLnByb21pc2UgPSBjb250ZW50cy5nZXRDYW1wYWlnbnModm0uY29udGVudElkKS50aGVuKGZ1bmN0aW9uIChjYW1wYWlnbnMpIHtcclxuICAgICAgICAgICAgICAgIHZtLmNhbXBhaWducyA9ICRmaWx0ZXIoJ2dyb3VwQnknKShjYW1wYWlnbnMsICdjYW1wYWlnbi5pZCcpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGwgPSBBcnJheS5mcm9tT2JqZWN0KHZtLmNhbXBhaWducyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uY2FtcGFpZ25zICA9IGwubWFwKGZ1bmN0aW9uIChncm91cENhbXBhaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ246IGdyb3VwQ2FtcGFpZ25bMF0uY2FtcGFpZ24sIGFyZWFJZHM6IGdyb3VwQ2FtcGFpZ24ubWFwKGZ1bmN0aW9uIChjYW1wYWlnbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbXBhaWduLmFyZWEuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTEuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcImNvbnRlbnRzXCIsIFwiRFRPcHRpb25zQnVpbGRlclwiLCBcIkRUQ29sdW1uRGVmQnVpbGRlclwiLCBcInZpZGVvUGxheWVyU2VydmljZVwiLCBcImxvY2FsZVwiLCBcIm5vdGlmaWNhdGlvblNlcnZpY2VcIiwgXCIkc2NvcGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jb250ZW50c1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJjb250ZW50RmlsZVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgY29udGVudElkOiAnPCcsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50TmFtZTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTpcIjxcIixcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRTdGF0dXM6XCI8XCIsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VXBkYXRlZDpcIjxcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbnRlbnQvY29tcG9uZW50cy9jb250ZW50RmlsZS9jb250ZW50RmlsZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoY29udGVudHMsIERUT3B0aW9uc0J1aWxkZXIsIERUQ29sdW1uRGVmQnVpbGRlciwgdmlkZW9QbGF5ZXJTZXJ2aWNlLCBsb2NhbGUsIG5vdGlmaWNhdGlvblNlcnZpY2UsICRzY29wZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTAuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJjb250ZW50c1wiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJjb250ZW50UHJldmlld1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SWQ6IFwiQFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29udGVudC9jb21wb25lbnRzL2NvbnRlbnRQcmV2aWV3L2NvbnRlbnRQcmV2aWV3Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKGNvbnRlbnRzKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciBmaXJzdCA9IHRydWU7XHJcblxyXG4gICAgICAgIHZtLmhvdmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoZmlyc3QpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRzLmdldCh2bS5jb250ZW50SWQpLnRoZW4oZnVuY3Rpb24gKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5jb250ZW50ID0gY29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZighdm0ubGVhdmUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uaXNPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ubGVhdmUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2bS5sZWF2ZSA9IHRydWU7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jb250ZW50c1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJjb250ZW50c1NlYXJjaFwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgb25BcHBseTogJyYnLFxyXG4gICAgICAgICAgICAgICAgb25SZXNldDogJyYnLFxyXG4gICAgICAgICAgICAgICAgdGFnc0N1cnJlbnQ6IFwiPHRhZ3NcIixcclxuICAgICAgICAgICAgICAgIHR5cGVzQ3VycmVudDogXCI8dHlwZXNcIixcclxuICAgICAgICAgICAgICAgIG5hbWVDdXJyZW50OiBcIjxuYW1lXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvY29udGVudHNTZWFyY2gvY29udGVudHNTZWFyY2guaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnQ29udGVudFR5cGVzJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihDb250ZW50VHlwZXMpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLmZpbHRlclBvcG92ZXIgPSB7XHJcblxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbnRlbnQvY29tcG9uZW50cy9jb250ZW50c1NlYXJjaC9jb250ZW50cy1maWx0ZXIuaHRtbCdcclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uY29udGVudFR5cGVzID0gQ29udGVudFR5cGVzO1xyXG5cclxuICAgICAgICB2bS5wbGF5ZXJzVGFncyA9IFtdO1xyXG4gICAgICAgIHZtLnRhZ3MgPSBhbmd1bGFyLmNvcHkodm0udGFnc0N1cnJlbnQpO1xyXG4gICAgICAgIHZtLnR5cGVzID0gYW5ndWxhci5jb3B5KHZtLnR5cGVzQ3VycmVudCk7XHJcbiAgICAgICAgdm0ubmFtZSA9IGFuZ3VsYXIuY29weSh2bS5uYW1lQ3VycmVudCk7XHJcblxyXG4gICAgICAgIHZtLmNvbnRyb2wgPSB7XHJcbiAgICAgICAgICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm5hbWU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBuYW1lKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5uYW1lID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB2bS5hcHBseSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICBcclxuICAgICAgICB2bS5hcHBseSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ub25BcHBseSh7XHJcbiAgICAgICAgICAgICAgICBvcHRpb246IHtcclxuICAgICAgICAgICAgICAgICAgICB0YWdzOiBhbmd1bGFyLmNvcHkodm0udGFncyksXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZXM6IHZtLnR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHZtLm5hbWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgdm0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5yZXNldCA9IGZ1bmN0aW9uIChjbG9zZSkge1xyXG4gICAgICAgICAgICB2bS50YWdzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLnR5cGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLm5hbWUgPSAnJztcclxuICAgICAgICAgICAgdm0ub25SZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uU2VsZWN0VGFncyA9IGZ1bmN0aW9uICh0YWdzKSB7XHJcbiAgICAgICAgICAgIHZtLnRhZ3MgPSB0YWdzO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5pc0ZpbHRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLnRhZ3NDdXJyZW50Lmxlbmd0aCAhPSAwIHx8dm0udHlwZXNDdXJyZW50Lmxlbmd0aCAhPSAwO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIHZtLmNvdW50RmlsdGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgICAgIGlmICh2bS50YWdzQ3VycmVudC5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2bS50eXBlc0N1cnJlbnQubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmlzT25seUZpbHRlck5hbWUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5uYW1lLmxlbmd0aCA+IDAgJiYgIXZtLmlzRmlsdGVyKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5pc0FueUZpbHRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLmlzRmlsdGVyKCl8fHZtLm5hbWUubGVuZ3RoID4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDExLjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJjb250ZW50c1wiLCBcIkRUT3B0aW9uc0J1aWxkZXJcIiwgXCJEVENvbHVtbkRlZkJ1aWxkZXJcIiwgXCJ2aWRlb1BsYXllclNlcnZpY2VcIiwgXCJsb2NhbGVcIiwgXCJub3RpZmljYXRpb25TZXJ2aWNlXCIsIFwiJHNjb3BlXCIsIFwiaW1hZ2VNb2RhbFNlcnZpY2VcIiwgXCJhdWRpb1ByZXZpZXdNb2RhbFNlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jb250ZW50c1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJmaWxlVGFibGVcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJZDogJzwnLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgY29udGVudE5hbWU6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFN0YXR1czogXCI8XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvZmlsZVRhYmxlL2ZpbGVUYWJsZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoY29udGVudHMsIERUT3B0aW9uc0J1aWxkZXIsIERUQ29sdW1uRGVmQnVpbGRlciwgdmlkZW9QbGF5ZXJTZXJ2aWNlLCBsb2NhbGUsIG5vdGlmaWNhdGlvblNlcnZpY2UsICRzY29wZSwgaW1hZ2VNb2RhbFNlcnZpY2UsIGF1ZGlvUHJldmlld01vZGFsU2VydmljZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS5kdE9wdGlvbnMgPVxyXG4gICAgICAgICAgICBEVE9wdGlvbnNCdWlsZGVyXHJcbiAgICAgICAgICAgICAgICAubmV3T3B0aW9ucygpXHJcbiAgICAgICAgICAgICAgICAud2l0aE9wdGlvbigncGFnaW5nJywgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAud2l0aE9wdGlvbihcInNlYXJjaGluZ1wiLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIC53aXRoT3B0aW9uKFwiaW5mb1wiLCBmYWxzZSk7XHJcbiAgICAgICAgdm0uZHRDb2x1bW5EZWZzID0gW1xyXG4gICAgICAgICAgICBEVENvbHVtbkRlZkJ1aWxkZXIubmV3Q29sdW1uRGVmKDApLFxyXG4gICAgICAgICAgICBEVENvbHVtbkRlZkJ1aWxkZXIubmV3Q29sdW1uRGVmKDEpLFxyXG4gICAgICAgICAgICBEVENvbHVtbkRlZkJ1aWxkZXIubmV3Q29sdW1uRGVmKDIpLFxyXG4gICAgICAgICAgICBEVENvbHVtbkRlZkJ1aWxkZXIubmV3Q29sdW1uRGVmKDMpLm5vdFNvcnRhYmxlKClcclxuICAgICAgICBdO1xyXG4gICAgICAgIGlmIChsb2NhbGUuZ2V0TG9jYWxlKCkgPT0gJ3J1Jykge1xyXG4gICAgICAgICAgICB2bS5kdE9wdGlvbnMud2l0aExhbmd1YWdlU291cmNlKCcvL2Nkbi5kYXRhdGFibGVzLm5ldC9wbHVnLWlucy8xLjEwLjkvaTE4bi9SdXNzaWFuLmpzb24nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLnJlbG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh2bS5jb250ZW50U3RhdHVzID09ICdwcm9jZXNzaW5nJykge1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250ZW50cy5nZXRGaWxlcyh2bS5jb250ZW50SWQpLnRoZW4oZnVuY3Rpb24gKGZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBmaWxlcyA9IGZpbGVzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmFuZ2xlID09PSAwO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZmlsZXMsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtLnF1YWxpdHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxxXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucXVhbGl0eSA9IFwiNDgwcFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5xdWFsaXR5U29ydCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3FcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5xdWFsaXR5ID0gXCI3MjBwXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnF1YWxpdHlTb3J0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJocVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnF1YWxpdHkgPSBcIjEwODBwXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnF1YWxpdHlTb3J0ID0gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1bHRyYVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnF1YWxpdHkgPSBcIjRLXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnF1YWxpdHlTb3J0ID0gMztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgdm0uZmlsZXMgPSBmaWxlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLnNob3dQbGF5ZXIgPSBmdW5jdGlvbiAoZmlsZSkge1xyXG4gICAgICAgICAgICBpZiAodm0uY29udGVudFR5cGUgPT0gJ3ZpZGVvJykge1xyXG4gICAgICAgICAgICAgICAgdmlkZW9QbGF5ZXJTZXJ2aWNlLnNob3dQbGF5ZXJNb2RhbChmaWxlLnVybCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodm0uY29udGVudFR5cGUgPT0gJ2ltYWdlJykge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VNb2RhbFNlcnZpY2Uuc2hvdyhmaWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvUHJldmlld01vZGFsU2VydmljZS5zaG93KGZpbGUudXJsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5kb3dubG9hZCA9IGZ1bmN0aW9uIChmaWxlKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCBmaWxlLnVybCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBcImJsb2JcIjtcclxuICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUFzKHhoci5yZXNwb25zZSwgdm0uY29udGVudE5hbWUgKyBcIl9cIiArIGZpbGUucXVhbGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignY29tbW9uLkludGVybmFsU2VydmVyRXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZmlsZS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS4kb25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXMuY29udGVudFN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgdm0ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDExLjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJjb250ZW50c1wiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNvbnRlbnRzXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcImltYWdlRmlsZVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgY29udGVudElkOiAnPCcsXHJcbiAgICAgICAgICAgICAgICBvbkluc3RhbmNlOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRTdGF0dXM6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFVwZGF0ZWQ6XCI8XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvaW1hZ2VGaWxlL2ltYWdlRmlsZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoY29udGVudHMpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAgICAgICAgICAgY29udGVudHMuZ2V0RmlsZXModm0uY29udGVudElkKS50aGVuKGZ1bmN0aW9uIChmaWxlcykge1xyXG4gICAgICAgICAgICAgICAgdm0udXJsID0gZmlsZXMuZmluZChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmFuZ2xlPT09MDtcclxuICAgICAgICAgICAgICAgIH0pLnVybDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdm0uJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmNvbnRlbnRVcGRhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTAuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwiaW1hZ2VQcmV2aWV3XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nT3BlbjogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50SWQ6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiQFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29udGVudC9jb21wb25lbnRzL2ltYWdlUHJldmlldy9pbWFnZVByZXZpZXcuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnJHRpbWVvdXQnLCAnY29udGVudHMnLCAnJHNjZScsICckZmlsdGVyJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkdGltZW91dCwgY29udGVudHMsICRzY2UsICRmaWx0ZXIpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5wb3BvdmVyID0ge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbnRlbnQvY29tcG9uZW50cy9pbWFnZVByZXZpZXcvaW1hZ2VQcmV2aWV3UG9wb3Zlci5odG1sJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmhlaWdodCA9IDI0MDtcclxuXHJcbiAgICAgICAgaWYgKCF2bS5wb3NpdGlvbikge1xyXG4gICAgICAgICAgICB2bS5wb3NpdGlvbiA9ICdyaWdodCc7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdm0uJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLm5nT3BlbiAmJiB2bS5uZ09wZW4pIHtcclxuICAgICAgICAgICAgICAgIHZtLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5zaG93ID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdm0uaGlkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZtLmhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdm0udXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLmdldEZpbGVzKHZtLmNvbnRlbnRJZCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlID0gcmVzdWx0LmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5hbmdsZSA9PT0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0udXJsID0gJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwoaW1hZ2UudXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMTAwKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLmhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uaGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSgpO1xyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNi4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1widGFibGVIZWxwZXJcIiwgXCJzdGF0aXN0aWNzXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJsYXN0UGxheUV2ZW50c0NvbnRlbnRcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJZDogJzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29udGVudC9jb21wb25lbnRzL2xhc3RQbGF5RXZlbnRzQ29udGVudC9sYXN0UGxheUV2ZW50c0NvbnRlbnQuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHRhYmxlSGVscGVyLCBzdGF0aXN0aWNzKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YWJsZUhlbHBlci5nZXRPcHRpb25zRm9yQW5ndWxhcldheVRhYmxlKFtmYWxzZSwgZmFsc2UsIGZhbHNlXSk7XHJcbiAgICAgICAgb3B0aW9ucy5kdE9wdGlvbnMgPSBvcHRpb25zLmR0T3B0aW9ucy53aXRoT3B0aW9uKFwic2Nyb2xsWVwiLCAnMjkxcHgnKTtcclxuICAgICAgICBvcHRpb25zLmR0T3B0aW9ucyA9IG9wdGlvbnMuZHRPcHRpb25zLndpdGhPcHRpb24oXCJiU2Nyb2xsQ29sbGFwc2VcIiwgJ3RydWUnKTtcclxuICAgICAgICB2bS5kdE9wdGlvbnMgPSBvcHRpb25zLmR0T3B0aW9ucy53aXRoT3B0aW9uKCdvcmRlcicsIFtdKTtcclxuICAgICAgICB2bS5kdENvbHVtbkRlZnMgPSBvcHRpb25zLmR0Q29sdW1uRGVmcztcclxuXHJcbiAgICAgICAgdm0ucHJvbWlzZSA9c3RhdGlzdGljcy5nZXRMYXN0UGxheUV2ZW50KHtjb250ZW50X2lkOiB2bS5jb250ZW50SWQsIGxpbWl0OiAyNX0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgIF8uZWFjaChyZXN1bHQsIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUub3JkZXJQcm9wID0gbW9tZW50KHZhbHVlLnBsYXllcl90aW1lc3RhbXAsICdZWVlZLU1NLUREIEhIOm1tOnNzJyk7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5wbGF5ZXJfdGltZXN0YW1wID0gbW9tZW50KHZhbHVlLnBsYXllcl90aW1lc3RhbXAsICdZWVlZLU1NLUREIEhIOm1tOnNzJykuZm9ybWF0KFwiREQuTU0uWVlZWSBISDptbTpzc1wiKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdm0uZXZlbnRzID0gXy5vcmRlckJ5KHJlc3VsdCwgJ29yZGVyUHJvcCcpO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMy4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY29udGVudHNcIilcclxuICAgICAgICAuY29udHJvbGxlcigncmVtb3ZlQ29udGVudENvbnRyb2xsZXInLCBjb250cm9sbGVyKVxyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHVpYk1vZGFsSW5zdGFuY2UnLCAnc2VsZWN0ZWRDb250ZW50JywgJ2NvbnRlbnRzJywgJyRxJywgJ2Vycm9ySGFuZGxlckhlbHBlciddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgc2VsZWN0ZWRDb250ZW50LCBjb250ZW50cywgJHEsIGVycm9ySGFuZGxlckhlbHBlcikge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0uZ2VuZXJhdGVkQ29kZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMDApICsgMTAwMDtcclxuXHJcbiAgICAgICAgdm0ub25lQ29udGVudCA9IHNlbGVjdGVkQ29udGVudC5sZW5ndGggPT0gMTtcclxuICAgICAgICB2bS5yZW1vdmUgPSBmdW5jdGlvbiAoZm9ybSkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcclxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdGVkQ29udGVudCwgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goY29udGVudHMucmVtb3ZlQ29udGVudChpdGVtKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAkcS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVySGVscGVyLmhhbmRsZUVycm9yUmVzcG9uc2UocmVzdWx0LCBmb3JtLCB2bSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMjMuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNvbnRlbnRzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3JlbW92ZUNvbnRlbnRTZXJ2aWNlJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCl7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHNlbGYuc2hvd1JlbW92ZUNvbnRlbnRNb2RhbCA9IGZ1bmN0aW9uIChjb250ZW50KSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvcmVtb3ZlQ29udGVudE1vZGFsL3JlbW92ZUNvbnRlbnRNb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdyZW1vdmVDb250ZW50Q29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29udGVudDogICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICBcclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMy4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY29udGVudHNcIilcclxuICAgICAgICAuY29udHJvbGxlcigndmlkZW9QbGF5ZXJDb250cm9sbGVyJywgY29udHJvbGxlcilcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbJyR1aWJNb2RhbEluc3RhbmNlJywndXJsJywnJHNjZSddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlciggJHVpYk1vZGFsSW5zdGFuY2UsIHVybCwkc2NlKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICBcclxuICAgICAgICB2bS51cmwgPSRzY2UudHJ1c3RBc1Jlc291cmNlVXJsKHVybCk7XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEyLjA1LjIwMTYuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMy4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY29udGVudHNcIilcclxuICAgICAgICAuc2VydmljZSgndmlkZW9QbGF5ZXJTZXJ2aWNlJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgc2VsZi5zaG93UGxheWVyTW9kYWwgPSBmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvdmlkZW9QbGF5ZXIvdmlkZW9QbGF5ZXIuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAndmlkZW9QbGF5ZXJDb250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOiBcIm1vZGFsLWltYWdlIHZpZGVvLXBsYXllclwiLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogXCJsZ1wiLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTAuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwidmlkZW9QcmV2aWV3XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nT3BlbjpcIjxcIixcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJZDogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJAXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L2NvbXBvbmVudHMvdmlkZW9QcmV2aWV3L3ZpZGVvUHJldmlldy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWyckdGltZW91dCcsICdjb250ZW50cycsICckc2NlJywgJyRmaWx0ZXInXTtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCR0aW1lb3V0LCBjb250ZW50cywgJHNjZSwgJGZpbHRlcikge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnBvcG92ZXIgPSB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29udGVudC9jb21wb25lbnRzL3ZpZGVvUHJldmlldy92aWRlb1ByZXZpZXdQb3BvdmVyLmh0bWwnXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uaGVpZ2h0ID0gMjQwO1xyXG5cclxuICAgICAgICBpZiAoIXZtLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHZtLnBvc2l0aW9uID0gJ3JpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0uJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLm5nT3BlbiAmJiB2bS5uZ09wZW4pIHtcclxuICAgICAgICAgICAgICAgIHZtLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnNob3cgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2bS5oaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdm0uaGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdm0udXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLmdldEZpbGVzKHZtLmNvbnRlbnRJZCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRGaWx0ZXIgPSAkZmlsdGVyKCdmaWx0ZXInKShyZXN1bHQsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ucXVhbGl0eSA9PT0gJ2xxJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdEZpbHRlci5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvID0gcmVzdWx0WzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWRlb1ByZXYgPSByZXN1bHRGaWx0ZXIuZmluZChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5hbmdsZSA9PT0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvUHJldikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyA9IHZpZGVvUHJldjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvID0gcmVzdWx0RmlsdGVyWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ud2lkdGggPSB2aWRlby53aWR0aCAvIDI7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnVybCA9ICRzY2UudHJ1c3RBc1Jlc291cmNlVXJsKHZpZGVvLnVybCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5lcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5oaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwMClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA2LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkc3RhdGVcIiwgXCJDb250ZW50VHlwZXNcIiwgXCJjb250ZW50c1wiLCBcImVycm9ySGFuZGxlckhlbHBlclwiLCBcIkFjY2VwdEZpbGVcIiwgXCJsb2NhbGVcIiwgXCIkZmlsdGVyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY29udGVudHNcIilcclxuICAgICAgICAuY29udHJvbGxlcihcIkFkZENvbnRlbnRDb250cm9sbGVyXCIsIENvbnRyb2xsZXIpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRzdGF0ZSwgQ29udGVudFR5cGVzLCBjb250ZW50cywgZXJyb3JIYW5kbGVySGVscGVyLCBBY2NlcHRGaWxlLCBsb2NhbGUsICRmaWx0ZXIpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IDUwMDA7XHJcbiAgICAgICAgdm0uY29udGVudCA9IHtcclxuICAgICAgICAgICAgdGFnczogW10sXHJcbiAgICAgICAgICAgIHBsYXlfZHVyYXRpb246IDUwMDAsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxyXG4gICAgICAgICAgICBwbGF5X3N0YXJ0OiAwLFxyXG4gICAgICAgICAgICByb3RhdGU6IFwiMFwiLFxyXG4gICAgICAgICAgICBnZXQgdHlwZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXQgdHlwZU1vZGVsKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGVNb2RlbDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IHR5cGVNb2RlbCh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHlwZU1vZGVsID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90eXBlID0gdmFsdWUubmFtZTtcclxuICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc3NMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvckxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLmJ0bkRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgICd2aWRlbyc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBBY2NlcHRGaWxlLnZpZGVvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IHRoaXMuZHVyYXRpb24gPyB0aGlzLmR1cmF0aW9uIDogNTAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgICdhdWRpbyc6IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gQWNjZXB0RmlsZS5hdWRpbztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWF4RHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uID8gdGhpcy5kdXJhdGlvbiA6IDUwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlICAnaHRtbDVfemlwJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IEFjY2VwdEZpbGUuaHRtbDVfemlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdodG1sNV9vbmxpbmUnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmJ0bkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1heER1cmF0aW9uID0gTnVtYmVyLk1BWF9WQUxVRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IEFjY2VwdEZpbGUuaW1hZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1heER1cmF0aW9uID0gTnVtYmVyLk1BWF9WQUxVRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF9pbnRlcnZhbFR5cGU6IFwiZnVsbFwiLFxyXG4gICAgICAgICAgICBnZXQgaW50ZXJ2YWxUeXBlKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVydmFsVHlwZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IGludGVydmFsVHlwZSh2YWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVydmFsVHlwZSA9IHZhbDtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZ1bGxcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfc3RhcnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImN1c3RvbVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheV9kdXJhdGlvbiA9IDUwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheV9zdGFydCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY29udGVudC50eXBlTW9kZWwgPSBDb250ZW50VHlwZXNbMF07XHJcblxyXG4gICAgICAgIHZtLmJ0bkRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB2bS5zZWxlY3RUeXBlT3B0aW9uID0ge1xyXG4gICAgICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBcImZvcm0td2hpdGVcIixcclxuICAgICAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IC0xXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uZ2V0Q2xhc3NBZGRpdGlvbk9wdGlvbkJsb2NrID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCgnYWRkaXRpb24tb3B0aW9uLWJsb2NrLS0nICsgdm0uY29udGVudC50eXBlKTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ2FkZGl0aW9uLW9wdGlvbi1ibG9jay0tJyArIHZtLmNvbnRlbnQuaW50ZXJ2YWxUeXBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hZGRDb250ZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodm0uZm9ybS4kdmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgY29udGVudHMuYWRkQ29udGVudCh2bS5jb250ZW50KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQuY29udGVudC5saXN0XCIpXHJcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZSwgdm0uZm9ybSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKHByb2dyZXNzICogMTAwKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKCkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5sb2FkRmlsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc3VjY2Vzc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0uZXJyb3JMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLmNoZWNraW5nRmlsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHZtLmJ0bkRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdm0uc21hbGxGaWxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnRlbnRzLnNob3dTZWxlY3RGaWxlTW9kYWwodm0uY29udGVudC5hY2NlcHQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCggdm0uY29udGVudC50eXBlTW9kZWwubmFtZSA9PSAnYXVkaW8nIHx8IHZtLmNvbnRlbnQudHlwZU1vZGVsLm5hbWUgPT0gJ3ZpZGVvJykgJiYgcmVzdWx0Lm1lZGlhSW5mby5kdXJhdGlvbiA8IDUwMDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5jaGVja2luZ0ZpbGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zbWFsbEZpbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0uY29udGVudC5zM2tleSA9IHJlc3VsdC5ibG9iLmtleTtcclxuICAgICAgICAgICAgICAgIHZtLmNvbnRlbnQuZnNpZCA9IHJlc3VsdC5mc2lkO1xyXG4gICAgICAgICAgICAgICAgdm0uY29udGVudC52YWxpZF96aXAgPSByZXN1bHQubWVkaWFJbmZvLnZhbGlkX3ppcDtcclxuICAgICAgICAgICAgICAgIHZtLmNvbnRlbnQuZmlsZXNpemUgPSByZXN1bHQubWVkaWFJbmZvLmZpbGVzaXplO1xyXG4gICAgICAgICAgICAgICAgdm0uY29udGVudC5maWxlaGFzaCA9IHJlc3VsdC5tZWRpYUluZm8uZmlsZWhhc2g7XHJcbiAgICAgICAgICAgICAgICB2bS5jb250ZW50LnZpZGVvX3dpZHRoID0gcmVzdWx0Lm1lZGlhSW5mby53aWR0aDtcclxuICAgICAgICAgICAgICAgIHZtLmNvbnRlbnQudmlkZW9faGVpZ2h0ID0gcmVzdWx0Lm1lZGlhSW5mby5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB2bS5jb250ZW50LmJpdHJhdGUgPSByZXN1bHQubWVkaWFJbmZvLmJpdHJhdGU7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uY29udGVudC5kdXJhdGlvbiA9IHJlc3VsdC5tZWRpYUluZm8uZHVyYXRpb247XHJcbiAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IHZtLmNvbnRlbnQuZHVyYXRpb247XHJcbiAgICAgICAgICAgICAgICB2bS5jb250ZW50LnBsYXlfZHVyYXRpb24gPSByZXN1bHQubWVkaWFJbmZvLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoIHZtLmNvbnRlbnQudHlwZU1vZGVsLm5hbWUgPT0gJ2F1ZGlvJyB8fCB2bS5jb250ZW50LnR5cGVNb2RlbC5uYW1lID09ICd2aWRlbycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uY29udGVudC5kdXJhdGlvbiA9IDUwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uY29udGVudC5wbGF5X2R1cmF0aW9uID0gNTAwMDtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uY29udGVudC5uYW1lID0gcmVzdWx0Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB2bS5idG5EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0uY2hlY2tpbmdGaWxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5zdWNjZXNzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB2bS5maWxlTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0uY2hlY2tpbmdGaWxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5jb250ZW50Lmxpc3QnKVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTEuMDUuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gW1wiJHN0YXRlUHJvdmlkZXJcIl07XHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbXCJjb250ZW50c1wiLCBcImNvbnRlbnRcIiwgXCIkc3RhdGVcIiwgXCIkc3RhdGVQYXJhbXNcIiwgXCJyZW1vdmVDb250ZW50U2VydmljZVwiLCBcImNoYW5nZUZpbGVNb2RhbFNlcnZpY2VcIiwgXCJlZGl0U2VydmljZVwiLCBcIkFjY2VwdEZpbGVcIiwgXCIkZmlsdGVyXCIsIFwiJHRpbWVvdXRcIiwgXCJiYWNrU2VydmljZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNvbnRlbnRzXCIpLmNvbmZpZyhjb25maWcpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbmZpZygkc3RhdGVQcm92aWRlcikge1xyXG4gICAgICAgICRzdGF0ZVByb3ZpZGVyXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LmNvbnRlbnQub25lJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL29uZS97aWR9JyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29udGVudC9wYWdlcy9jb250ZW50L2NvbnRlbnQuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnQ29udGVudENvbnRyb2xsZXInLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogW1wiY29udGVudHNcIiwgXCIkc3RhdGVQYXJhbXNcIiwgXCIkc3RhdGVcIiwgZnVuY3Rpb24gKGNvbnRlbnRzLCAkc3RhdGVQYXJhbXMsICRzdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudHMuZ2V0KCRzdGF0ZVBhcmFtcy5pZCkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlLmdvKCdwZXJzb25hbEFjY291bnQuY29udGVudC5saXN0JywgbnVsbCwge3JlbG9hZDogdHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmNvbnRlbnRzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoXCJDb250ZW50Q29udHJvbGxlclwiLCBjb250cm9sbGVyKTtcclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoY29udGVudHMsIGNvbnRlbnQsICRzdGF0ZSwgJHN0YXRlUGFyYW1zLCByZW1vdmVDb250ZW50U2VydmljZSwgY2hhbmdlRmlsZU1vZGFsU2VydmljZSwgZWRpdFNlcnZpY2UsIEFjY2VwdEZpbGUsICRmaWx0ZXIsICR0aW1lb3V0LCBiYWNrU2VydmljZSkge1xyXG5cclxuICAgICAgICBcIm5nSW5qZWN0XCJcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLm1vZGVsID0gY29udGVudDtcclxuXHJcblxyXG4gICAgICAgIHZhciBmdWxsID0gdm0ubW9kZWwucGxheV9kdXJhdGlvbiA9PSB2bS5tb2RlbC5kdXJhdGlvbjtcclxuICAgICAgICB2bS5tb2RlbC5faW50ZXJ2YWxUeXBlID0gZnVsbCA/ICdmdWxsJyA6ICdjdXN0b20nO1xyXG4gICAgICAgIHZtLm1heER1cmF0aW9uID0gdm0ubW9kZWwuZHVyYXRpb247XHJcbiAgICAgICAgc3dpdGNoICh2bS5tb2RlbC50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgICd2aWRlbyc6IHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLmFjY2VwdCA9IEFjY2VwdEZpbGUudmlkZW87XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICAnYXVkaW8nOiB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5hY2NlcHQgPSBBY2NlcHRGaWxlLmF1ZGlvO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UnOiB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5hY2NlcHQgPSBBY2NlcHRGaWxlLmltYWdlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAgJ2h0bWw1X3ppcCc6IHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLmFjY2VwdCA9IEFjY2VwdEZpbGUuaHRtbDVfemlwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZtLm1vZGVsLCBcImludGVydmFsVHlwZVwiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVydmFsVHlwZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcnZhbFR5cGUgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdWxsXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5X2R1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5X3N0YXJ0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjdXN0b21cIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZHVyYXRpb24gPSA1MDAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfc3RhcnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZtLm1vZGVsLCBcInBsYXlEdXJhdGlvblZpZXdcIiwge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMucGxheV9kdXJhdGlvbiAvIDEwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZtLmVkaXRNb2RlbCA9IGVkaXRTZXJ2aWNlLmdldEVkaXRNb2RlbEZvclJlc3RBbmd1bGFyTW9kZWwodm0pO1xyXG5cclxuICAgICAgICB2bS5vbkNoYW5nZSA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwgPSBvYmoudmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5mb3JtLiRpbnZhbGlkO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uU2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRzLnVwZGF0ZSh2bS5tb2RlbCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc3NMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5lcnJvckxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLnVwZGF0ZWRfYXQgPSByZXNwb25zZS51cGRhdGVkX2F0O1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS51c2VGaWxlcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLm1vZGVsICYmICh2bS5tb2RlbC50eXBlID09ICd2aWRlbycgfHwgdm0ubW9kZWwudHlwZSA9PSAnYXVkaW8nKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNvbnRlbnRTZXJ2aWNlLnNob3dSZW1vdmVDb250ZW50TW9kYWwoWyRzdGF0ZVBhcmFtcy5pZF0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uYmFjaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uY2hhbmdlRmlsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnN0YXJ0RWRpdCgpO1xyXG4gICAgICAgICAgICB2bS5sb2FkRmlsZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLmVuZEVkaXQoKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLmNhbmNlbEVkaXQoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ubG9hZEZpbGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLmNoZWNraW5nRmlsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHZtLnN1Y2Nlc3NMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bS5idG5TYXZlRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRzLnNob3dTZWxlY3RGaWxlTW9kYWwodm0ubW9kZWwuYWNjZXB0KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKCB2bS5tb2RlbC50eXBlID09ICdhdWRpbycgfHwgdm0ubW9kZWwudHlwZSA9PSAndmlkZW8nKSAmJiByZXN1bHQubWVkaWFJbmZvLmR1cmF0aW9uIDwgNTAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmNoZWNraW5nRmlsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnNtYWxsRmlsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZXJyb3JMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5idG5TYXZlRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0TW9kZWwudmFsdWUuczNrZXkgPSByZXN1bHQuYmxvYi5rZXk7XHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0TW9kZWwudmFsdWUuZnNpZCA9IHJlc3VsdC5mc2lkO1xyXG4gICAgICAgICAgICAgICAgdm0uY2hlY2tpbmdGaWxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnZhbHVlLnZhbGlkX3ppcCA9IHJlc3VsdC5tZWRpYUluZm8udmFsaWRfemlwO1xyXG4gICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnZhbHVlLmZpbGVzaXplID0gcmVzdWx0Lm1lZGlhSW5mby5maWxlc2l6ZTtcclxuICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5maWxlaGFzaCA9IHJlc3VsdC5tZWRpYUluZm8uZmlsZWhhc2g7XHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0TW9kZWwudmFsdWUudmlkZW9fd2lkdGggPSByZXN1bHQubWVkaWFJbmZvLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnZhbHVlLnZpZGVvX2hlaWdodCA9IHJlc3VsdC5tZWRpYUluZm8uaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnZhbHVlLmJpdHJhdGUgPSByZXN1bHQubWVkaWFJbmZvLmJpdHJhdGU7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm1lZGlhSW5mby5kdXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5kdXJhdGlvbiA9IHJlc3VsdC5tZWRpYUluZm8uZHVyYXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubWF4RHVyYXRpb24gPSByZXN1bHQubWVkaWFJbmZvLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5wbGF5X2R1cmF0aW9uID0gcmVzdWx0Lm1lZGlhSW5mby5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISggdm0ubW9kZWwudHlwZSA9PSAnYXVkaW8nIHx8IHZtLm1vZGVsLnR5cGUgPT0gJ3ZpZGVvJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnZhbHVlLmR1cmF0aW9uID0gNTAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZWRpdE1vZGVsLnZhbHVlLnBsYXlfZHVyYXRpb24gPSA1MDAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvbiA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZtLnN1Y2Nlc3NMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVycm9yTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uYnRuU2F2ZURpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2bS5jaGVja2luZ0ZpbGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGJhY2tTZXJ2aWNlLmJhY2soJ3BlcnNvbmFsQWNjb3VudC5jb250ZW50Lmxpc3QnKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS51cGRhdGVDb250ZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGVudHMudXBkYXRlKHZtLm1vZGVsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHVwZGF0ZVN0YXR1c0xhYmVsKCk7XHJcbiAgICAgICAgdm0udGltZXIgPSBudWxsO1xyXG4gICAgICAgIHZtLiRvbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS50aW1lcikge1xyXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHZtLnRpbWVyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLnRpbWVyID0gJHRpbWVvdXQodXBkYXRlLCA1MDAwKTtcclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5tb2RlbC5zdGF0dXMgPT0gJ3Byb2Nlc3NpbmcnKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRlbnRzLmdldCgkc3RhdGVQYXJhbXMuaWQpLnRoZW4oZnVuY3Rpb24gKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS50aW1lciA9IHZtLm1vZGVsLnN0YXR1cyA9IGNvbnRlbnQuc3RhdHVzO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXNMYWJlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnRpbWVyID0gICAkdGltZW91dCh1cGRhdGUsIDUwMDApO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZtLnRpbWVyID0gJHRpbWVvdXQodXBkYXRlLCAxMDAwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1c0xhYmVsKCkge1xyXG4gICAgICAgICAgICB2YXIgbGFiZWxDbGFzcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodm0ubW9kZWwuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjcmVhdGVkJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3MgPSBcImxhYmVsLXByaW1hcnlcIjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ3Byb2Nlc3NpbmcnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcyA9IFwibGFiZWwtd2FybmluZ1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAncmVhZHknOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcyA9IFwibGFiZWwtc3VjY2Vzc1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcyA9IFwibGFiZWwtZGFuZ2VyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZtLmxhYmVsQ2xhc3MgPSBsYWJlbENsYXNzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMS4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wic3RhdGlzdGljc1wiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmRhc2hib2FyZFwiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJkYXNoYm9hcmRDaGFydFwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge30sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZGFzaGJvYXJkL2NvbXBvbmVudHMvZGFzaGJvYXJkQ2hhcnQvZGFzaGJvYXJkQ2hhcnQuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHN0YXRpc3RpY3MpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCJcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS5zdGFydERhdGUgPSBtb21lbnQoKS5hZGQoLTcsICdkYXlzJyk7XHJcbiAgICAgICAgdm0uZW5kRGF0ZSA9IG1vbWVudCgpO1xyXG4gICAgICAgIHZtLmdyb3VwVHlwZSA9ICdkYXlfaG91cic7XHJcbiAgICAgICAgdm0ucmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgdm0ub25DaGFuZ2VEYXRlID0gZnVuY3Rpb24gKHN0YXJ0RGF0ZSwgZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICB2bS5zdGFydERhdGUgPSBzdGFydERhdGU7XHJcbiAgICAgICAgICAgIHZtLmVuZERhdGUgPSBlbmREYXRlO1xyXG4gICAgICAgICAgICB2YXIgZGlmZiA9IG1vbWVudCh2bS5lbmREYXRlKS5kaWZmKG1vbWVudCh2bS5zdGFydERhdGUpLCAnZGF5cycpO1xyXG4gICAgICAgICAgICBpZiAoZGlmZiA+IDcpIHtcclxuICAgICAgICAgICAgICAgIHZtLmdyb3VwVHlwZSA9ICdkYXknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0uZ3JvdXBUeXBlID0gJ2RheV9ob3VyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB1cGRhdGVDaGFydCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uUmVzZXRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc3RhcnREYXRlID0gbW9tZW50KCkuYWRkKCdkYXlzJywgLTcpO1xyXG4gICAgICAgICAgICB2bS5lbmREYXRlID0gbW9tZW50KCk7XHJcbiAgICAgICAgICAgIHZtLmdyb3VwVHlwZSA9ICdkYXlfaG91cic7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmRhdGEgPSB7XHJcbiAgICAgICAgICAgIGxhYmVsczogW10sXHJcbiAgICAgICAgICAgIGRhdGFzZXRzOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwi0J/RgNC+0YHQvNC+0YLRgNC+0LJcIixcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogMixcclxuICAgICAgICAgICAgICAgICAgICBwb2ludEhvdmVyUmFkaXVzOiAzLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50SGl0UmFkaXVzOjcsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRSYWRpdXM6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmdiYSgxMTUsIDIwNCwgMTkyLDAuNSlcIixcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogXCJyZ2JhKDExNSwgMjA0LCAxOTIsMSlcIixcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBbXVxyXG4gICAgICAgICAgICAgICAgfV1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbGVnZW5kOiB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzY2FsZXM6IHtcclxuICAgICAgICAgICAgICAgIHhBeGVzOiBbe1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0aW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXI6IHZhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0ZXI6ICdNTU0gWVlZWScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyOlwiREQuTU0gSEg6bW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0U3RlcFNpemU6MjRcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHRpY2tzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfV0sXHJcbiAgICAgICAgICAgICAgICB5QXhlczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFwibGVmdFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCJ5LWF4aXMtMVwiLFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGlja3M6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGlja3NMaW1pdDogNSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiJ0xhdG8nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZExpbmVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRvb2x0aXBzOiB7XHJcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHVwZGF0ZUNoYXJ0KCk7XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDaGFydCgpIHtcclxuICAgICAgICAgICAgdm0ubG9hZGluZz10cnVlO1xyXG4gICAgICAgICAgICB2bS5wcm9taXNlID0gc3RhdGlzdGljcy5nZXREaXN0aW5jdENvbnRlbnQodm0uc3RhcnREYXRlLCB2bS5lbmREYXRlLCB2bS5ncm91cFR5cGUpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCFyZXN1bHQgfHxyZXN1bHQmJnJlc3VsdC5sZW5ndGg9PTApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInF1YW50aXR5XCI6IFwiMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInJlcG9ydF9kYXlcIjogXCIyMDE2MDIyN1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInJlcG9ydF9ob3VyXCI6IFwiMTFcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJxdWFudGl0eVwiOiBcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXBvcnRfZGF5XCI6IFwiMjAxNjAyMjdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXBvcnRfaG91clwiOiBcIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub3B0aW9ucy5zY2FsZXMueUF4ZXNbMF0udGlja3MubWF4PTUwO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBwcmVwYXJlZCA9IHJlc3VsdC5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3k6IGl0ZW0ucXVhbnRpdHksIHg6IG1vbWVudCggaXRlbS5yZXBvcnRfZGF5ICsgJyAnICsgaXRlbS5yZXBvcnRfaG91ciAsICdZWVlZTU1ERCBISCcpIC5mb3JtYXQoJ0RELk1NLllZIEhIOm1tJyl9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnREYXRlID1tb21lbnQoKVxyXG5cclxuICAgICAgICAgICAgICAgIHZtLmRhdGEuZGF0YXNldHNbMF0uZGF0YSA9IHByZXBhcmVkO1xyXG4gICAgICAgICAgICAgICAgdm0ucmVzdWx0ID0gcHJlcGFyZWQubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9hZGluZz1mYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiByYW5kKG1pbiwgbWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdmFsKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQodmFsdWUsICdERC5NTS5ZWSBISDptbScpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEzLjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcImNvbnRlbnRzXCIsIFwibm90aWZpY2F0aW9uU2VydmljZVwiLCBcIm1vbWVudFwiLCBcIiRzdGF0ZVwiLCBcIiR0aW1lb3V0XCIsIFwicmVtb3ZlQ29udGVudFNlcnZpY2VcIiwgXCJjb250cm9sVGFnU2VydmljZU1vZGFsXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuY29udGVudHNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwibGlzdENvbnRlbnRzXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50L3BhZ2VzL2NvbnRlbnRzL2NvbnRlbnRzLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcihjb250ZW50cywgbm90aWZpY2F0aW9uU2VydmljZSwgbW9tZW50LCAkc3RhdGUsICR0aW1lb3V0LCByZW1vdmVDb250ZW50U2VydmljZSwgY29udHJvbFRhZ1NlcnZpY2VNb2RhbCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS50aW1lciA9IG51bGw7XHJcblxyXG4gICAgICAgIHZtLm9wdGlvbiA9IHtcclxuICAgICAgICAgICAgdGFnczogW10sXHJcbiAgICAgICAgICAgIG5hbWU6IFwiXCIsXHJcbiAgICAgICAgICAgIHR5cGVzOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBkYXRhID0gW107XHJcbiAgICAgICAgdm0uY29sdW1ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NyZWF0ZWRfYXQnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ25hbWUnLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIjxkaXYgc3R5bGU9J3doaXRlLXNwYWNlOiBub3dyYXAnPlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsLnN0YXR1cyA9PSAncmVhZHknICYmIGZ1bGwudHlwZSA9PSAndmlkZW8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICc8dmlkZW8tcHJldmlldyBjb250ZW50LWlkPVwiJyArIGZ1bGwuaWQgKyAnXCI+PC92aWRlby1wcmV2aWV3Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsLnN0YXR1cyA9PSAncmVhZHknICYmIGZ1bGwudHlwZSA9PSAnaW1hZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICc8aW1hZ2UtcHJldmlldyBjb250ZW50LWlkPVwiJyArIGZ1bGwuaWQgKyAnXCI+PC9pbWFnZS1wcmV2aWV3Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjxzcGFuIGNsYXNzPSd0YWJsZS1saW5rJyBuZy1jbGljaz1cXFwidm0uYWN0aW9uKCdjbGlja05hbWUnLFxcJ1wiICsgZnVsbC5pZCArIFwiXFwnKVxcXCI+XCIgKyBkYXRhICsgXCI8L3NwYW4+PC9kaXY+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhbGlnbjogXCJsZWZ0XCIsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uTmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiNDAlXCIsXHJcbiAgICAgICAgICAgICAgICBjZWxsQ2xhc3M6IFwibmFtZS1jZWxsXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndHlwZScsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICc8ZGl2IGNsYXNzPVwiaW5saW5lLWJsb2NrXCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7dGV4dC1hbGlnbjogY2VudGVyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCBsYWJlbC1wcmltYXJ5IGNvbnN0YW50cy1jb250ZW50LXR5cGVzLScgKyBkYXRhICsgJ1wiPicgKyAne3tcImNvbnN0YW50cy4nICsgZGF0YSArICdcInxpMThufX0nICsgJzwvc3Bhbj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiY29tbW9uLlR5cGVcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAndGFncycsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndGFncycsXHJcbiAgICAgICAgICAgICAgICBub3RTb3J0OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3N0YXR1cycsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsQ2xhc3MgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjcmVhdGVkJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcyA9IFwibGFiZWwtcHJpbWFyeVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJvY2Vzc2luZyc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3MgPSBcImxhYmVsLXdhcm5pbmdcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlYWR5Jzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcyA9IFwibGFiZWwtc3VjY2Vzc1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzID0gXCJsYWJlbC1kYW5nZXJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnPGRpdiBjbGFzcz1cImlubGluZS1ibG9ja1wiIHN0eWxlPVwid2lkdGg6IDczcHg7dGV4dC1hbGlnbjogY2VudGVyXCI+PHNwYW4gY2xhc3M9XCJsYWJlbCAnICsgbGFiZWxDbGFzcyArICdcIj4nICsgJ3t7XCJjb25zdGFudHMuJyArIGRhdGEgKyAnXCJ8aTE4bn19JyArICc8L3NwYW4+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcImNvbW1vbi5TdGF0dXNcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdudWxsJyxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xfcm93ID0gJyAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgb25lLXN0cmluZ1wiID4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuICBidG4tZGFuZ2VyIGJ0bi1zbVwiICAgIHVpYi10b29sdGlwPVwie3tcXCdjb21tb24uUmVtb3ZlVG9vbHRpcFxcJ3xpMThufX1cIiAgdG9vbHRpcC1hcHBlbmQtdG8tYm9keT1cInRydWVcIiB0b29sdGlwLXBvcHVwLWRlbGF5PVwiMTAwMFwiIG5nLWNsaWNrPVwidm0uYWN0aW9uKFxcJ3JlbW92ZVxcJyxcXCcnICsgZnVsbC5pZCArICdcXCcpXCI+PGkgY2xhc3M9XCJmYSAgZmEtcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xfcm93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBdO1xyXG4gICAgICAgIHZtLmRlZmF1bHRTb3J0ID0gWzEsICdkZXNjJ107XHJcblxyXG4gICAgICAgIHZtLmFjdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKGFjdGlvbiwgaWQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJpbmZvXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5nb1RvQ29udGVudChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVDb250ZW50U2VydmljZS5zaG93UmVtb3ZlQ29udGVudE1vZGFsKFtpZF0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZUNsaWNrJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9Db250ZW50KGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2NsaWNrTmFtZSc6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5nb1RvQ29udGVudChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5nb1RvQ29udGVudCA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5jb250ZW50Lm9uZScsIHtpZDogaWR9KVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgICAgIHZtLiRvbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS50aW1lcikge1xyXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHZtLnRpbWVyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLnNlcnZlckRhdGEgPSBmdW5jdGlvbiBzZXJ2ZXJEYXRhKHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjaywgb1NldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHt9O1xyXG4gICAgICAgICAgICBpZiAodm0ub3B0aW9uLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbbmFtZV0nXSA9IHZtLm9wdGlvbi5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2bS5vcHRpb24udHlwZXMgJiYgdm0ub3B0aW9uLnR5cGVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBwYXJhbVsnZmlsdGVyW3R5cGVdJ10gPSB2bS5vcHRpb24udHlwZXMubWFwKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYubmFtZTtcclxuICAgICAgICAgICAgICAgIH0pLmpvaW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodm0ub3B0aW9uLnRhZ3MgJiYgdm0ub3B0aW9uLnRhZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bJ2ZpbHRlclt0YWdzXSddID0gdm0ub3B0aW9uLnRhZ3MubWFwKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuaWQ7XHJcbiAgICAgICAgICAgICAgICB9KS5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIG9yZGVyID0gYW9EYXRhWzJdLnZhbHVlO1xyXG4gICAgICAgICAgICBpZiAob3JkZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbkluZGV4ID0gb3JkZXJbMF0uY29sdW1uO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpciA9IG9yZGVyWzBdLmRpcjtcclxuICAgICAgICAgICAgICAgIHZhciBuYW1lUGFyYW0gPSAnc29ydFsnICsgYW9EYXRhWzFdLnZhbHVlW2NvbHVtbkluZGV4XS5kYXRhICsgJ10nO1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bbmFtZVBhcmFtXSA9IGRpcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJhbVsncGFnZVtvZmZzZXRdJ10gPSBhb0RhdGFbM10udmFsdWU7XHJcbiAgICAgICAgICAgIHBhcmFtWydwYWdlW2xpbWl0XSddID0gYW9EYXRhWzRdLnZhbHVlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50cy5nZXRDb250ZW50cyhwYXJhbSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB2bS5ub3RFeGlzdCA9IHJlc3VsdC5kYXRhLmxlbmd0aCA9PT0gMCAmJiB2bS5vcHRpb24udHlwZXMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub3B0aW9uLnRhZ3MubGVuZ3RoID09PSAwICYmIHZtLm9wdGlvbi5uYW1lID09PSAnJztcclxuICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZtLnJlbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dXYXJuaW5nKCdjb21tb24uRmFpbGVkR2V0Jyk7XHJcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5pbnRhbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdm0uaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5vblJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5vcHRpb24udHlwZXMgPSBbXTtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLnRhZ3MubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLm5hbWUgPSAnJztcclxuICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YSh0cnVlKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25BcHBseSA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLnR5cGVzID0gb3B0aW9uLnR5cGVzO1xyXG4gICAgICAgICAgICB2bS5vcHRpb24udGFncyA9IG9wdGlvbi50YWdzO1xyXG4gICAgICAgICAgICB2bS5vcHRpb24ubmFtZSA9IG9wdGlvbi5uYW1lO1xyXG4gICAgICAgICAgICB2bS5ub3RFeGlzdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YSh0cnVlKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ub25TZWxlY3RlZCA9IGZ1bmN0aW9uIChpZHMsIGFsbCkge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZElkcyA9IGlkcztcclxuICAgICAgICAgICAgdm0uYWxsID0gYWxsO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlbW92ZVBsYXllcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUNvbnRlbnRTZXJ2aWNlLnNob3dSZW1vdmVDb250ZW50TW9kYWwodm0uc2VsZWN0ZWRJZHMpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YSh2bS5hbGwsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS51bnNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmFkZFRhZ3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xUYWdTZXJ2aWNlTW9kYWwuc2hvd0NvbnRyb2xUYWdNb2RhbCh2bS5zZWxlY3RlZElkcywgJ2NvbnRlbnQnKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEodm0uYWxsLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0udW5zZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5yZWxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnJlbG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEoZmFsc2UpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS50aW1lciA9ICR0aW1lb3V0KHVwZGF0ZSwgMTAwMDApO1xyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuZmluZChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnN0YXR1cyA9PT0gJ3Byb2Nlc3NpbmcnXHJcbiAgICAgICAgICAgICAgICB9KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZtLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgdm0udGltZXIgPSAkdGltZW91dCh1cGRhdGUsIDEwMDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZtLnRpbWVyID0gJHRpbWVvdXQodXBkYXRlLCAxMDAwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTEuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcInBsYXllcnNcIiwgXCJ1aUdtYXBJc1JlYWR5XCIsIFwiJHRpbWVvdXRcIiwgXCIkc2NvcGVcIiwgXCIkc3RhdGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5kYXNoYm9hcmRcIilcclxuICAgICAgICAuY29tcG9uZW50KFwicGxheWVyc01hcFwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge30sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZGFzaGJvYXJkL2NvbXBvbmVudHMvcGxheWVyc01hcC9wbGF5ZXJzTWFwLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHBsYXllcnMsIHVpR21hcElzUmVhZHksICR0aW1lb3V0LCAkc2NvcGUsJHN0YXRlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLm1hcmtlcnMgPSBbXTtcclxuICAgICAgICB2bS5hY3RpdmUgPSAwO1xyXG4gICAgICAgIHZtLmluYWN0aXZlID0gMDtcclxuICAgICAgICB2bS5pbmFjdGl2ZU1vcmVEYXkgPSAwO1xyXG5cclxuICAgICAgICB2bS5tYXAgPSB7XHJcbiAgICAgICAgICAgIGNlbnRlcjoge1xyXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiAzMC43NDcsXHJcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogNTAuNjI2XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHpvb206IDQsXHJcbiAgICAgICAgICAgIHBvbHlnb25zOiBbXSxcclxuICAgICAgICAgICAgY29udHJvbDoge31cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS53aW5kb3cgPSB7XHJcbiAgICAgICAgICAgIHNob3c6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250cm9sOiB7fSxcclxuICAgICAgICAgICAgY29vcmRzOiB7XHJcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogXCJcIixcclxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogXCJcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZUF1dG9QYW46IHRydWUsXHJcbiAgICAgICAgICAgICAgICBwaXhlbE9mZnNldDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogLTM1LFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgayA9IDA7XHJcblxyXG4gICAgICAgIHZtLm1hcmtlck9wdGlvbiA9IHtcclxuICAgICAgICAgICAgZXZlbnQ6IHtcclxuICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24gKG1hcCwgZXZlbnROYW1lLCBvcmlnaW5hbEV2ZW50QXJncykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBvcmlnaW5hbEV2ZW50QXJncztcclxuICAgICAgICAgICAgICAgICAgICB2bS5jdXJyZW50UGxheWVyID0gbWFya2VyLnBsYXllcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdm0ud2luZG93LmNvb3Jkcy5sYXRpdHVkZSA9IG1hcmtlci5sYXRpdHVkZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS53aW5kb3cuY29vcmRzLmxvbmdpdHVkZSA9IG1hcmtlci5sb25naXR1ZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ud2luZG93LnNob3cgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uIChtYXAsIGV2ZW50TmFtZSwgb3JpZ2luYWxFdmVudEFyZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS53aW5kb3cuc2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGRibGNsaWNrOiBmdW5jdGlvbiAobWFwLCBldmVudE5hbWUsIG9yaWdpbmFsRXZlbnRBcmdzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlciA9IG9yaWdpbmFsRXZlbnRBcmdzO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UGxheWVyID0gbWFya2VyLnBsYXllcjtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIub25lJyx7aWQ6Y3VycmVudFBsYXllci5pZH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdWlHbWFwSXNSZWFkeS5wcm9taXNlKDEpLnRoZW4oZnVuY3Rpb24gKGluc3RhbmNlcykge1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBVcGRhdGVNYXJrZXJzKCk7XHJcblxyXG4gICAgICAgIHZtLnVwZGF0ZU1hcmtlcnMgPSBVcGRhdGVNYXJrZXJzO1xyXG5cclxuICAgICAgICAkdGltZW91dChVcGRhdGVNYXJrZXJzLCAzMDAwMDApO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBVcGRhdGVNYXJrZXJzKG5vdEZpdCkge1xyXG4gICAgICAgICAgICB2bS5sb2FkaW5nID10cnVlO1xyXG4gICAgICAgICAgICBwbGF5ZXJzLmdldEFsbCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1hcmtlcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHZhciBhY3RpdmVDb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5hY3RpdmVDb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5hY3RpdmVNb3JlRGF5Q291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBub3cgPSBtb21lbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5sYXN0X2FjdGl2aXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0QWN0aXZpdHkgPSBtb21lbnQudXRjKGl0ZW0ubGFzdF9hY3Rpdml0eSkubG9jYWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGl2ZSA9IG5vdy5kaWZmKGxhc3RBY3Rpdml0eSwgJ21pbnV0ZXMnKSA8IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmFjdGl2ZU1vcmVEYXkgPSBub3cuZGlmZihsYXN0QWN0aXZpdHksICdkYXlzJykgPiAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5hY3RpdmVNb3JlRGF5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmdwc19sYXQgJiYgaXRlbS5ncHNfbG9uZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFjdGl2ZSA9IGFjdGl2ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogaXRlbS5ncHNfbGF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogaXRlbS5ncHNfbG9uZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBhY3RpdmUgPyBcImltYWdlcy9lbmFibGVkLXBsYXllci1pY29uLnBuZ1wiIDogXCJpbWFnZXMvZGlzYWJsZWQtcGxheWVyLWljb24ucG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmFjdGl2ZU1vcmVEYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5hY3RpdmVNb3JlRGF5Q291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluYWN0aXZlQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0ubWFya2VycyA9IG1hcmtlcnM7XHJcbiAgICAgICAgICAgICAgICB2bS5hY3RpdmUgPSBhY3RpdmVDb3VudDtcclxuICAgICAgICAgICAgICAgIHZtLmluYWN0aXZlID0gaW5hY3RpdmVDb3VudDtcclxuICAgICAgICAgICAgICAgIHZtLmluYWN0aXZlTW9yZURheSA9IGluYWN0aXZlTW9yZURheUNvdW50O1xyXG4gICAgICAgICAgICAgICAgaWYoIW5vdEZpdClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWFya2Vycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLmZvckVhY2goZnVuY3Rpb24gKG1hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5leHRlbmQobmV3IGdvb2dsZS5tYXBzLkxhdExuZyhtYXJrZXIubGF0aXR1ZGUsIG1hcmtlci5sb25naXR1ZGUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IHZtLm1hcC5jb250cm9sLmdldEdNYXAoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5maXRCb3VuZHMoYm91bmRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmF2aWdhdG9yLmdlb2xvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24gKHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5tYXAuY2VudGVyLmxhdGl0dWRlID0gcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWFwLmNlbnRlci5sb25naXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWFwLnpvb209MTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID1mYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuZGFzaGJvYXJkXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcInBvcG92ZXJQbGF5ZXJcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQbGF5ZXI6JzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZGFzaGJvYXJkL2NvbXBvbmVudHMvcGxheWVyc01hcC9wb3BvdmVyUGxheWVyLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdXBkYXRlV2luZG93ICgpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVdpbmRvdyAoKSB7XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgIHZhciBpd091dGVyID0gJCgnLmdtLXN0eWxlLWl3Jyk7XHJcbiAgICAgICAgICAgIHZhciBpd0Nsb3NlQnRuID0gaXdPdXRlci5uZXh0KCk7XHJcbiAgICAgICAgICAgIGl3Q2xvc2VCdG4ucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgaXdCYWNrZ3JvdW5kID0gaXdPdXRlci5wcmV2KCk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQgc2hhZG93IERJVlxyXG4gICAgICAgICAgICBpd0JhY2tncm91bmQuY2hpbGRyZW4oJzpudGgtY2hpbGQoMiknKS5jc3MoeydvcGFjaXR5JzogJzAnfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHdoaXRlIGJhY2tncm91bmQgRElWXHJcbiAgICAgICAgICAgIGl3QmFja2dyb3VuZC5jaGlsZHJlbignOm50aC1jaGlsZCg0KScpLmNzcyh7J29wYWNpdHknOiAnMCd9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAvLyBDaGFuZ2VzIHRoZSBkZXNpcmVkIHRhaWwgc2hhZG93IGNvbG9yLlxyXG4gICAgICAgICAgICBpd0JhY2tncm91bmQuY2hpbGRyZW4oJzpudGgtY2hpbGQoMyknKS5maW5kKCdkaXYnKS5jaGlsZHJlbigpLmNzcyh7J3otaW5kZXgnOiAnMSd9KTtcclxuXHJcbiAgICAgICAgICAgIC8vaXdPdXRlci5jaGlsZHJlbigpLmZpcnN0KCkuY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KTtcclxuXHJcblxyXG4gICAgICAgICAgICBpd091dGVyLmNzcyh7J29wYWNpdHknOiAnMSd9KTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMS4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHFcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5kYXNoYm9hcmRcIilcclxuICAgICAgICAuY29tcG9uZW50KFwidG9wUGxheWVyc1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG5cclxuICAgICAgICAgICAgICAgIGl0ZW1zOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIGNvbG9yQ2xhc3M6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZUtleTogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlVGl0bGVLZXk6IFwiQFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnZGFzaGJvYXJkL2NvbXBvbmVudHMvdG9wUGxheWVycy90b3BQbGF5ZXJzLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkcSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgICRxLndoZW4odm0uaXRlbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB2bS5wbGF5ZXJzID0gcmVzdWx0O1xyXG4gICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMi4wNC4yMDE2LlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgZGlyZWN0aXZlLiRpbmplY3QgPSBbXCIkdGltZW91dFwiLCBcImxvY2FsZVwiLCBcIiRxXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMubGF5b3V0XCIpXHJcbiAgICAgICAgLmRpcmVjdGl2ZShcInBhZ2VQcmVsb2FkZXJcIiwgZGlyZWN0aXZlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBkaXJlY3RpdmUoJHRpbWVvdXQsIGxvY2FsZSwkcSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICRxLmFsbChbbG9jYWxlLnJlYWR5KCdjb21tb24nKSxsb2NhbGUucmVhZHkoJ2xheW91dCcpXSlcclxuICAgICAgICAgICAgICAgICAgICAuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKFwibG9hZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCdib2R5ID4gc2VjdGlvbicpLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCA0MDApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDkwMCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEyLjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmxheW91dFwiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJzaWRlQmFyXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnbGF5b3V0L2NvbXBvbmVudHMvc2lkZUJhci9zaWRlQmFyLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJBdXRoU2VydmljZVwiLCBcIiRzdGF0ZVwiLCBcIm1lbnVcIl07XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihBdXRoU2VydmljZSwgJHN0YXRlLCBtZW51KSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0uJHN0YXRlID0gJHN0YXRlO1xyXG4gICAgICAgIHZtLmxvZ291dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgQXV0aFNlcnZpY2Uuc2lnbk91dCgpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHN0YXRlLmdvKFwiYXV0aC5sb2dpblwiKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ubG9jayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgQXV0aFNlcnZpY2UubG9jaygpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHN0YXRlLmdvKFwiYXV0aC5sb2NrXCIpXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICRzdGF0ZS5nbyhcImF1dGgubG9naW5cIilcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5pc0FjdGl2ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIGsgPXZtLiRzdGF0ZS5pbmNsdWRlcyhzdGF0ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiAgdm0uJHN0YXRlLmluY2x1ZGVzKHN0YXRlKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdmFyIG1lbnVJdGVtID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwibGF5b3V0LkRhc2hib2FyZFwiLFxyXG4gICAgICAgICAgICAgICAgc3JlZjogXCJwZXJzb25hbEFjY291bnQuaG9tZVwiLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiBcInBlcnNvbmFsQWNjb3VudC5ob21lXCIsXHJcbiAgICAgICAgICAgICAgICBpY29uOiBcImljb24taG9tZVwiXHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwibGF5b3V0LlN0YXRpc3RpY3NcIixcclxuICAgICAgICAgICAgICAgIHNyZWY6IFwicGVyc29uYWxBY2NvdW50LnN1bW1hcnlTdGF0aXN0aWNcIixcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogXCJwZXJzb25hbEFjY291bnQuc3VtbWFyeVN0YXRpc3RpY1wiLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJpY29uLWJhci1jaGFydFwiXHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwibGF5b3V0LkNvbnRlbnRzXCIsXHJcbiAgICAgICAgICAgICAgICBzcmVmOiBcInBlcnNvbmFsQWNjb3VudC5jb250ZW50Lmxpc3RcIixcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogXCJwZXJzb25hbEFjY291bnQuY29udGVudFwiLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJpY29uLWZpbG1cIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwibGF5b3V0LkNhbXBhaWduc1wiLFxyXG4gICAgICAgICAgICAgICAgc3JlZjogXCJwZXJzb25hbEFjY291bnQuY2FtcGFpZ24ubGlzdFwiLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiBcInBlcnNvbmFsQWNjb3VudC5jYW1wYWlnblwiLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJpY29uLXRhZ1wiXHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwibGF5b3V0LlBsYXllcnNcIixcclxuICAgICAgICAgICAgICAgIHNyZWY6IFwicGVyc29uYWxBY2NvdW50LnBsYXllci5saXN0XCIsXHJcbiAgICAgICAgICAgICAgICBhY3RpdmU6IFwicGVyc29uYWxBY2NvdW50LnBsYXllclwiLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJpY29uLWNvbnRyb2wtcGxheVwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJsYXlvdXQuU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIHNyZWY6IFwicGVyc29uYWxBY2NvdW50LnByZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogXCJwZXJzb25hbEFjY291bnQucHJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJmYSBmYS1nZWFyXCIsXHJcbiAgICAgICAgICAgICAgICBpc1BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwibGF5b3V0Lk15UHJvZmlsZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmVmOiBcInBlcnNvbmFsQWNjb3VudC5wcmVmZXJlbmNlLnByb2ZpbGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJmYSBmYS1nZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJsYXlvdXQuU3Vic2NyaXB0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBzcmVmOiBcInBlcnNvbmFsQWNjb3VudC5zdWJzY3JpYmVcIixcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogXCJwZXJzb25hbEFjY291bnQuc3Vic2NyaWJlXCIsXHJcbiAgICAgICAgICAgICAgICBpY29uOiBcImZhIGZhLWRvbGxhciBmYS1kb2xsYXItLWxheW91dFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgdmFyIG9yaWcgPSBhbmd1bGFyLmNvcHkobWVudUl0ZW0pO1xyXG5cclxuICAgICAgICB2bS5tZW51ID0gbWVudS5nZXRPcmRlcihtZW51SXRlbSk7XHJcbiAgICAgICAgdm0ucmVzZXRPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ubWVudSA9IG1lbnUuZ2V0T3JkZXIoYW5ndWxhci5jb3B5KG9yaWcpLCB0cnVlKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zYXZlT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIG1lbnUuc2F2ZSh2bS5tZW51KTtcclxuICAgICAgICAgICAgdm0uc29ydGFibGVPcHRpb25zLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uc29ydGFibGVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiAoZSwgdWkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGluZGV4IGluIHZtLm1lbnUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tZW51W2luZGV4XS5pID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIm5hdi1zaWRlYmFyLXBsYWNlaG9sZGVyXCIsXHJcbiAgICAgICAgICAgIGNvbm5lY3RXaXRoOiBcIi5uYXYtc2lkZWJhciA+IGxpXCIsXHJcbiAgICAgICAgICAgIGhhbmRsZTogXCJhXCIsXHJcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuNSxcclxuICAgICAgICAgICAgYXhpczogXCJ5XCIsXHJcbiAgICAgICAgICAgIGRyb3BPbkVtcHR5OiB0cnVlLFxyXG4gICAgICAgICAgICBmb3JjZVBsYWNlaG9sZGVyU2l6ZTogdHJ1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMi4wNC4yMDE2LlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDguMDQuMjAxNi5cclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMubGF5b3V0XCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcInRvcEJhclwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2xheW91dC9jb21wb25lbnRzL3RvcEJhci90b3BCYXIuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtdO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoKSB7XHJcbiAgIFxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMi4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5sYXlvdXRcIilcclxuICAgICAgICAuY29tcG9uZW50KFwidXNlclByb2ZpbGVcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdsYXlvdXQvY29tcG9uZW50cy91c2VyUHJvZmlsZS91c2VyUHJvZmlsZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wibG9jYWxlXCIsJ0F1dGhTZXJ2aWNlJywnJHN0YXRlJyxcInVzZXJcIl07XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihsb2NhbGUsQXV0aFNlcnZpY2UsJHN0YXRlLHVzZXIpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIFxyXG4gICAgICAgdXNlci5nZXRDdXJyZW50VXNlcigpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgIHZtLnVzZXJTZXJ2aWNlRGF0YSA9IHVzZXIuZGF0YTtcclxuICAgICAgIH0pO1xyXG4gICAgICAgIHZtLmNoYW5nZSA9IGZ1bmN0aW9uIChsYW4pIHtcclxuICAgICAgICAgICAgbG9jYWxlLnNldExvY2FsZShsYW4pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ubG9nb3V0ID1mdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIEF1dGhTZXJ2aWNlLnNpZ25PdXQoKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICRzdGF0ZS5nbyhcImF1dGgubG9naW5cIilcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEyLjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoJ2FkZEltYWdlTW9kYWxDb250cm9sbGVyJywgY29udHJvbGxlcik7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdwbGF5ZXJJZCcsICdwbGF5ZXJzJywgJ2Vycm9ySGFuZGxlckhlbHBlciddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgcGxheWVySWQsIHBsYXllcnMsIGVycm9ySGFuZGxlckhlbHBlcikge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0ucGxheWVySWQgPSBwbGF5ZXJJZDtcclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdDogXCJpbWFnZS8qXCJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hcHBseSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHZtLmZvcm0uJHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHBsYXllcnMuYWRkSW1hZ2Uodm0ucGxheWVySWQsIHZtLm1vZGVsKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZShyZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVySGVscGVyLmhhbmRsZUVycm9yUmVzcG9uc2UocmVzdWx0LCB2bS5mb3JtLCB2bSlcclxuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEyLjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2FkZEltYWdlTW9kYWxTZXJ2aWNlJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCl7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAocGxheWVySWQpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL2FkZEltYWdlTW9kYWwvYWRkSW1hZ2VNb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdhZGRJbWFnZU1vZGFsQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxheWVySWQ6ICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVySWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsSW5zdGFuY2VcIiwgXCJzZWxlY3RlZFBsYXllcnNcIiwgXCJwbGF5ZXJzXCIsIFwiZXJyb3JIYW5kbGVySGVscGVyXCIsIFwiY2FtcGFpZ25zXCIsIFwiJHFcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoJ2Fzc2lnbkNhbXBhaWduQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIHNlbGVjdGVkUGxheWVycywgcGxheWVycywgZXJyb3JIYW5kbGVySGVscGVyLCBjYW1wYWlnbnMsICRxKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLm9uZVBsYXllciA9IHNlbGVjdGVkUGxheWVycy5sZW5ndGggPT0gMTtcclxuICAgICAgICB2bS5yZW1vdmUgPSBmdW5jdGlvbiAoZm9ybSkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZm9ybS4kdmFsaWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICRxLmFsbChzZWxlY3RlZFBsYXllcnMubWFwKGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzLmF0dGFjaENhbXBhaWduKGlkLCB2bS5jYW1wYWlnbklkKTtcclxuICAgICAgICAgICAgICAgIH0pKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5lcnJvci5lbiA9PSBcIkFscmVhZHkgbGlua2VkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3VsdCwgZm9ybSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBwYXJhbXMgPSB7bGltaXQ6IDUwMH07XHJcbiAgICAgICAgcGFyYW1zW1wic29ydFtjcmVhdGVkX2F0XVwiXSA9ICdkZXNjJztcclxuICAgICAgICBwYXJhbXNbJ2ZpbHRlcltzdGF0dXNdJ10gPSAnYWN0aXZlJztcclxuXHJcbiAgICAgICAgY2FtcGFpZ25zLmdldExpc3QocGFyYW1zKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdm0uY2FtcGFpZ25zID0gcmVzdWx0LmRhdGE7XHJcbiAgICAgICAgICAgIGlmICh2bS5jYW1wYWlnbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uY2FtcGFpZ25JZCA9IHZtLmNhbXBhaWduc1swXS5pZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHZtLnNlbGVjdFZpcnR1YWxTY3JlZW5PcHRpb24gPSB7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiZm9ybS13aGl0ZVwiXHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEyLjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2Fzc2lnbkNhbXBhaWduU2VydmljZScsIHNlcnZpY2UpXHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKXtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBzZWxmLnNob3dBc3NpZ25DYW1wYWlnbk1vZGFsID0gZnVuY3Rpb24gKHBsYXllcnMpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL2Fzc2lnbkNhbXBhaWduL2Fzc2lnbkNhbXBhaWduTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnYXNzaWduQ2FtcGFpZ25Db250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOidhc3NpZ24tdmlydHVhbC1zY3JlZW4tbW9kYWwnLFxyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBsYXllcnM6ICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEyLjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoJ2ltYWdlTW9kYWxDb250cm9sbGVyJywgY29udHJvbGxlcik7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdpbWFnZSddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgaW1hZ2UpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSBpbWFnZTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdpbWFnZU1vZGFsU2VydmljZScsIHNlcnZpY2UpO1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAoaW1hZ2UpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcblxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwbGF5ZXJzL2NvbXBvbmVudHMvaW1hZ2VNb2RhbC9pbWFnZU1vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ2ltYWdlTW9kYWxDb250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOiBcIm1vZGFsLWltYWdlXCIsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDYuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcImFkZEltYWdlTW9kYWxTZXJ2aWNlXCIsIFwicGxheWVyc1wiLCBcImltYWdlTW9kYWxTZXJ2aWNlXCIsIFwiY29uZmlybU1vZGFsU2VydmljZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwicGxheWVySW1hZ2VzXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBwbGF5ZXJJZDogJzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL3BsYXllckltYWdlcy9wbGF5ZXJJbWFnZXMuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKGFkZEltYWdlTW9kYWxTZXJ2aWNlLCBwbGF5ZXJzLCBpbWFnZU1vZGFsU2VydmljZSwgY29uZmlybU1vZGFsU2VydmljZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB1cGRhdGUoKTtcclxuXHJcbiAgICAgICAgdm0uYWRkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBhZGRJbWFnZU1vZGFsU2VydmljZS5zaG93KHZtLnBsYXllcklkKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zaG93ID0gZnVuY3Rpb24gKGltYWdlKSB7XHJcbiAgICAgICAgICAgIGltYWdlTW9kYWxTZXJ2aWNlLnNob3coaW1hZ2UpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlbW92ZSA9IGZ1bmN0aW9uIChpbWFnZSkge1xyXG4gICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coJ2Jsb2Nrcy5Db25maXJtQWN0aW9uTW9kYWxIaW50JyxmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZS5yZW1vdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycy5yZW1vdmVJbWFnZSh2bS5wbGF5ZXJJZCwgaW1hZ2UuaWQpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmltYWdlcy5zcGxpY2Uodm0uaW1hZ2VzLmluZGV4T2YoaW1hZ2UpLCAxKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZS5yZW1vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuXHJcblxyXG5cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBsYXllcnMuZ2V0SW1hZ2VzKHZtLnBsYXllcklkKS50aGVuKGZ1bmN0aW9uIChpbWFnZXMpIHtcclxuICAgICAgICAgICAgICAgIHZtLmltYWdlcyA9IGltYWdlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNi4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1widGFibGVIZWxwZXJcIiwgXCJzdGF0aXN0aWNzXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJwbGF5ZXJMYXN0UGxheUV2ZW50c1RhYmxlXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBwbGF5ZXJJZDogJzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL3BsYXllckxhc3RQbGF5RXZlbnRzVGFibGUvcGxheWVyTGFzdFBsYXlFdmVudHNUYWJsZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcih0YWJsZUhlbHBlciwgc3RhdGlzdGljcykge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciBvcHRpb25zID0gdGFibGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckFuZ3VsYXJXYXlUYWJsZShbZmFsc2UsZmFsc2VdKTtcclxuICAgICAgICBvcHRpb25zLmR0T3B0aW9ucyA9IG9wdGlvbnMuZHRPcHRpb25zLndpdGhPcHRpb24oXCJzY3JvbGxZXCIsICcyOTFweCcpLndpdGhPcHRpb24oJ29yZGVyJywgW10pO1xyXG5cclxuICAgICAgICB2bS5kdE9wdGlvbnMgPSBvcHRpb25zLmR0T3B0aW9ucztcclxuICAgICAgICB2bS5kdENvbHVtbkRlZnMgPSBvcHRpb25zLmR0Q29sdW1uRGVmcztcclxuXHJcbiAgICAgICAgdm0ucHJvbWlzZSA9IHN0YXRpc3RpY3MuZ2V0TGFzdFBsYXlFdmVudCh7cGxheWVyX2lkOiB2bS5wbGF5ZXJJZCwgbGltaXQ6IDI1fSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIF8uZWFjaChyZXN1bHQsIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUucGxheWVyX3RpbWVzdGFtcCA9IG1vbWVudCh2YWx1ZS5wbGF5ZXJfdGltZXN0YW1wLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLmZvcm1hdChcIkRELk1NLllZWVkgSEg6bW06c3NcIilcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZtLmV2ZW50cyA9IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNi4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wicGxheWVyU3RhdE1vZGFsU2VydmljZVwiLCBcInBsYXllcnNcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcInBsYXllck5vdGVzXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBtb2RlbDogJzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL3BsYXllck5vdGVzL3BsYXllck5vdGVzLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihwbGF5ZXJTdGF0TW9kYWxTZXJ2aWNlLCBwbGF5ZXJzKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLnN0YXJ0RWRpdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uZWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgIHZtLnRlbXBEZXNjcmlwdGlvbiA9IGFuZ3VsYXIuY29weSh2bS5tb2RlbC5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uY2FuY2VsRWRpdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2bS5tb2RlbC5kZXNjcmlwdGlvbiA9ICB2bS50ZW1wRGVzY3JpcHRpb247XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5lbmRFZGl0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBwbGF5ZXJzLnVwZGF0ZSh2bS5tb2RlbCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDYuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcInRhYmxlSGVscGVyXCIsIFwicGxheWVyc1wiLCBcImNvbmZpcm1Nb2RhbFNlcnZpY2VcIiwgXCJzZWxlY3RFbnRpdHlNb2RhbFNlcnZpY2VcIiwgXCIkcVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwicGxheWVyQXR0YWNoZWRDYW1wYWlnbnNcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIHBsYXllcjogJzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL3BsYXllcnNBdHRhY2hlZENhbXBhaWduL3BsYXllcnNBdHRhY2hlZENhbXBhaWducy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIodGFibGVIZWxwZXIsIHBsYXllcnMsIGNvbmZpcm1Nb2RhbFNlcnZpY2UsIHNlbGVjdEVudGl0eU1vZGFsU2VydmljZSwgJHEpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdmFyIGRhdGFUZW1wID0gW107XHJcbiAgICAgICAgdm0uJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHZtLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgLy8gICB2bS5pbnN0YW5jZS5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uY29sdW1ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ25hbWUnLFxyXG4gICAgICAgICAgICAgICAgbm90U29ydDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHN0YXRlOiBcInBlcnNvbmFsQWNjb3VudC5jYW1wYWlnbi5vbmVcIixcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcImNvbW1vbi5OYW1lXCIsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogXCIxMDAlXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RhZ3MnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RhZ3MnLFxyXG4gICAgICAgICAgICAgICAgbm90U29ydDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdudWxsJyxcclxuICAgICAgICAgICAgICAgIG5vdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xfcm93ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiA+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biAgYnRuLWRhbmdlciBidG4tc21cIiB0b29sdGlwLWFwcGVuZC10by1ib2R5PVwidHJ1ZVwiIHVpYi10b29sdGlwPVwie3tcXCdwbGF5ZXJzLkF0dGFjaGVkQ2FtcGFpZ25fRGV0YWNoQ2FtcGFpZ25Ub29sdGlwXFwnfGkxOG59fVwiICB0b29sdGlwLXBvcHVwLWRlbGF5PVwiNTAwXCIgbmctY2xpY2s9XCJ2bS5hY3Rpb24oXFwncmVtb3ZlXFwnLFxcJycgKyBmdWxsLmlkICsgJ1xcJylcIj48aSBjbGFzcz1cImZhICBmYS1jaGFpbi1icm9rZW5cIj48L2k+PC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbF9yb3c7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG5cclxuXHJcbiAgICAgICAgdm0uYXR0YWNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxlY3RFbnRpdHlNb2RhbFNlcnZpY2Uuc2hvdygnY2FtcGFpZ25zJywgZGF0YVRlbXAubWFwKChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XHJcbiAgICAgICAgICAgIH0pKSkudGhlbihmdW5jdGlvbiAoc2VsZWN0ZWRJRHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZElEcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZtLmF0dGFjaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gc2VsZWN0ZWRJRHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzLmF0dGFjaENhbXBhaWduKHZtLnBsYXllci5pZCwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uYXR0YWNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hY3Rpb25DYWxsYmFjayA9IGZ1bmN0aW9uIChhY3Rpb24sIGlkKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coJ3BsYXllcnMuQXR0YWNoZWRDYW1wYWlnbl9Db25maXJtRGV0YWNoQ2FtcGFpZ24nLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzLmRldGFjaENhbXBhaWduKHZtLnBsYXllci5pZCwgaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGVDbGljayc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjbGlja05hbWUnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZ29Ub09uZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5nb1RvT25lID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgICRzdGF0ZS5nbygncGVyc29uYWxBY2NvdW50LmNhbXBhaWduLm9uZScsIHtpZDogaWR9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnNlcnZlckRhdGEgPSBmdW5jdGlvbiBzZXJ2ZXJEYXRhKHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjaywgb1NldHRpbmdzKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKCF2bS5kaXNhYmxlU2VydmVyTG9hZGluZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2bS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhVGVtcCA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHEud2hlbihmbkNhbGxiYWNrKHRhYmxlSGVscGVyLmdldEVtcHR5TGlzdCgpKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMuZ2V0Q2FtcGFpZ25zKHZtLnBsYXllci5pZCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YVRlbXAgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayh0YWJsZUhlbHBlci53cmFwTGlzdChyZXN1bHQpKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhVGVtcCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1dhcm5pbmcoJ2NvbW1vbi5GYWlsZWRHZXQnKTtcclxuICAgICAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHRhYmxlSGVscGVyLmdldEVtcHR5TGlzdCgpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0uZGlzYWJsZVNlcnZlckxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmludGFuY2VDYWxsYmFjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB2bS5pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25TZWxlY3RlZCA9IGZ1bmN0aW9uIChpZHMsIGFsbCkge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZElkcyA9IGlkcztcclxuICAgICAgICAgICAgdm0uYWxsID0gYWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ub25Sb3dSZW9yZGVyID0gZnVuY3Rpb24gKG5ld1Bvcywgb2xkUG9zKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgY2FtcGFpZ24gPSBkYXRhVGVtcFtvbGRQb3NdO1xyXG4gICAgICAgICAgICBkYXRhVGVtcC5zcGxpY2Uob2xkUG9zLCAxKTtcclxuICAgICAgICAgICAgZGF0YVRlbXAuc3BsaWNlKG5ld1BvcywgMCwgY2FtcGFpZ24pO1xyXG4gICAgICAgICAgICBwbGF5ZXJzLm1vdmVUb0NhbXBhaWduKHZtLnBsYXllci5pZCwgY2FtcGFpZ24uaWQsIG5ld1BvcyArIDEpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2bS5kaXNhYmxlU2VydmVyTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uZGV0YWNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgY29uZmlybVRleHQgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAodm0uc2VsZWN0ZWRJZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQgPSAncGxheWVycy5BdHRhY2hlZENhbXBhaWduX0NvbmZpcm1EZXRhY2hDYW1wYWlnbnMnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQgPSAncGxheWVycy5BdHRhY2hlZENhbXBhaWduX0NvbmZpcm1EZXRhY2hDYW1wYWlnbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uZmlybU1vZGFsU2VydmljZS5zaG93KGNvbmZpcm1UZXh0LCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gdm0uc2VsZWN0ZWRJZHMubWFwKGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzLmRldGFjaENhbXBhaWduKHZtLnBsYXllci5pZCwgaWQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRxLmFsbChwcm9taXNlcyk7XHJcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uaW5zdGFuY2UucmVsb2FkRGF0YShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufSlcclxuKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwicGxheWVyU2VhcmNoXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBvbkFwcGx5OiAnJicsXHJcbiAgICAgICAgICAgICAgICBvblJlc2V0OiAnJicsXHJcbiAgICAgICAgICAgICAgICB0YWdzQ3VycmVudDogXCI8dGFnc1wiLFxyXG4gICAgICAgICAgICAgICAgcXVhbGl0eUN1cnJlbnQ6IFwiPHF1YWxpdHlcIixcclxuICAgICAgICAgICAgICAgIHF1aWNrdHlwZUN1cnJlbnQ6IFwiPHF1aWNrdHlwZVwiLFxyXG4gICAgICAgICAgICAgICAgbmFtZUN1cnJlbnQ6IFwiPG5hbWVcIixcclxuICAgICAgICAgICAgICAgIHNob3J0VmlldzonQCdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyc1NlYXJjaC9wbGF5ZXJTZWFyY2guaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnUXVhbGl0aWVzJywgJ3RhZ3NTZXJ2aWNlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihRdWFsaXRpZXMsIHRhZ3NTZXJ2aWNlKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5maWx0ZXJQb3BvdmVyID0ge1xyXG5cclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyc1NlYXJjaC9wbGF5ZXJzLWZpbHRlci5odG1sJ1xyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5xdWFsaXRpZXMgPSBRdWFsaXRpZXM7XHJcblxyXG4gICAgICAgIHZtLnBsYXllcnNUYWdzID0gW107XHJcbiAgICAgICAgdm0udGFncyA9IGFuZ3VsYXIuY29weSh2bS50YWdzQ3VycmVudCk7XHJcbiAgICAgICAgdm0ucXVhbGl0eSA9IGFuZ3VsYXIuY29weSh2bS5xdWFsaXR5Q3VycmVudCk7XHJcbiAgICAgICAgdm0ucXVpY2t0eXBlID0gYW5ndWxhci5jb3B5KHZtLnF1aWNrdHlwZUN1cnJlbnQpO1xyXG4gICAgICAgIHZtLm5hbWUgPSBhbmd1bGFyLmNvcHkodm0ubmFtZUN1cnJlbnQpO1xyXG5cclxuICAgICAgICB2bS5jb250cm9sID0ge1xyXG4gICAgICAgICAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5uYW1lO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgbmFtZSh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubmFtZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdm0uYXBwbHkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRhZ3NTZXJ2aWNlLmdldFBsYXllcnNUYWdzKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHZtLnBsYXllcnNUYWdzID0gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5zZWxlY3RRdWlja3R5cGUgPSBmdW5jdGlvbiAocXVpY2t0eXBlKSB7XHJcbiAgICAgICAgICAgIHZtLnF1aWNrdHlwZSA9IHF1aWNrdHlwZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmFwcGx5ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5vbkFwcGx5KHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhZ3M6IGFuZ3VsYXIuY29weSh2bS50YWdzKSxcclxuICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiBhbmd1bGFyLmNvcHkodm0ucXVhbGl0eSksXHJcbiAgICAgICAgICAgICAgICAgICAgcXVpY2t0eXBlOiB2bS5xdWlja3R5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdm0ubmFtZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICB2bS5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnJlc2V0ID0gZnVuY3Rpb24gKGNsb3NlKSB7XHJcbiAgICAgICAgICAgIHZtLnRhZ3MubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgdm0uc2VhcmNoVGFncyA9ICcnO1xyXG4gICAgICAgICAgICB2bS5xdWFsaXR5Lmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLnNlYXJjaFF1YWxpdHkgPSAnJztcclxuICAgICAgICAgICAgdm0ucXVpY2t0eXBlID0gJyc7XHJcbiAgICAgICAgICAgIHZtLm5hbWUgPSAnJztcclxuXHJcbiAgICAgICAgICAgIHZtLm9uUmVzZXQoKTtcclxuICAgICAgICAgICAgaWYgKGNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5vblNlbGVjdFRhZ3MgPSBmdW5jdGlvbiAodGFncykge1xyXG4gICAgICAgICAgICB2bS50YWdzID0gdGFncztcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uU2VsZWN0UXVhbGl0eSA9IGZ1bmN0aW9uIChxdWFsaXRpZXMpIHtcclxuICAgICAgICAgICAgdm0ucXVhbGl0aWVzID0gcXVhbGl0aWVzO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uaXNPbmVRdWlja3R5cGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhdm0uaXNGaWx0ZXIoKSAmJiB2bS5xdWlja3R5cGVDdXJyZW50ICE9ICcnO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uaXNGaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS50YWdzQ3VycmVudC5sZW5ndGggIT0gMCB8fCB2bS5xdWFsaXR5Q3VycmVudCAhPSB1bmRlZmluZWQgJiYgdm0ucXVhbGl0eUN1cnJlbnQubGVuZ3RoICE9IDA7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uY291bnRGaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBpID0gMDtcclxuICAgICAgICAgICAgaWYgKHZtLnRhZ3NDdXJyZW50Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZtLnF1YWxpdHlDdXJyZW50ICE9IHVuZGVmaW5lZCAmJiB2bS5xdWFsaXR5Q3VycmVudC5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2bS5xdWlja3R5cGVDdXJyZW50ICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5pc09ubHlGaWx0ZXJOYW1lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdm0ubmFtZS5sZW5ndGggPiAwICYmICF2bS5pc0ZpbHRlcigpJiYhdm0uaXNPbmVRdWlja3R5cGUoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmlzQW55RmlsdGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdm0uaXNPbmVRdWlja3R5cGUoKSB8fCB2bS5pc0ZpbHRlcigpfHx2bS5uYW1lLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwNy4wNi4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wicGxheWVyU3RhdE1vZGFsU2VydmljZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29tcG9uZW50KFwicGxheWVyU3RhdFwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgcGxheWVySWQ6ICc8J1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3BsYXllcnMvY29tcG9uZW50cy9wbGF5ZXJTdGF0L3BsYXllclN0YXQuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHBsYXllclN0YXRNb2RhbFNlcnZpY2UpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0uc3RhcnRUYWJsZVN0YXQgPSBtb21lbnQoKS5jZWlsKDI0LCAnaG91cnMnKS5hZGQoJy03JywgJ2QnKTtcclxuXHJcbiAgICAgICAgdm0uZW5kVGFibGVTdGF0ID0gbW9tZW50KCkuY2VpbCgyNCwgJ2hvdXJzJyk7XHJcbiAgICAgICAgdm0uc2hvd1N0YXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHBsYXllclN0YXRNb2RhbFNlcnZpY2Uuc2hvdyh2bS5wbGF5ZXJJZCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTIuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29udHJvbGxlcigncGxheWVyU3RhdE1vZGFsQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpO1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHVpYk1vZGFsSW5zdGFuY2UnLCAncGxheWVySWQnXTtcclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIHBsYXllcklkKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5wbGF5ZXJJZCA9IHBsYXllcklkO1xyXG4gICAgICAgIHZtLm1vZGVsID0ge1xyXG4gICAgICAgICAgICBfdHlwZVJhbmdlOiBcImxhc3QzMFwiLFxyXG4gICAgICAgICAgICBfY3VzdG9tRW5kRGF0ZTogIG1vbWVudChtb21lbnQoKS5mb3JtYXQoXCJ5eXl5IE1NXCIpLCBcInl5eXkgTU1cIikuZm9ybWF0KCksXHJcbiAgICAgICAgICAgIGdldCBjdXN0b21FbmREYXRlKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUVuZERhdGU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBjdXN0b21FbmREYXRlKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VzdG9tRW5kRGF0ZSA9IHZhbDtcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IG1vbWVudCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wRW5kRGF0ZSA9IG1vbWVudCh2YWwpLmFkZCgxLCAnTScpO1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuc3RhcnREYXRlID0gdm0ubW9kZWwudGVtcFN0YXJ0RGF0ZTtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLmVuZERhdGUgPSB2bS5tb2RlbC50ZW1wRW5kRGF0ZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgX3N0YXJ0RGF0ZTogbW9tZW50KCkuYWRkKC0xNSwgJ2RheXMnKSxcclxuICAgICAgICAgICAgX2VuZERhdGU6IG1vbWVudCgpLmFkZCgxLCdkYXlzJyksXHJcbiAgICAgICAgICAgIGdldCBzdGFydERhdGUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnREYXRlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXQgZW5kRGF0ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmREYXRlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgZW5kRGF0ZSh2YWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VuZERhdGUgPSB2YWw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBzdGFydERhdGUodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydERhdGUgPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIG1pblZpZXdNb2RlOiBcIm1vbnRoc1wiLFxyXG4gICAgICAgICAgICBmb3JtYXQ6IFwieXl5eSBNTVwiXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zZWxlY3RWaXJ0dWFsU2NyZWVuT3B0aW9uID0ge1xyXG4gICAgICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBcImZvcm0td2hpdGVcIlxyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdwbGF5ZXJTdGF0TW9kYWxTZXJ2aWNlJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCl7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAocGxheWVySWQpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL3BsYXllclN0YXRNb2RhbC9wbGF5ZXJTdGF0TW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAncGxheWVyU3RhdE1vZGFsQ29udHJvbGxlciBhcyB2bScsXHJcblxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYXllcklkOiAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcklkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDYuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcIkRUT3B0aW9uc0J1aWxkZXJcIiwgXCJEVENvbHVtbkRlZkJ1aWxkZXJcIiwgXCJsb2NhbGVcIiwgXCIkcVwiLCBcIiRzY29wZVwiLCBcIiRjb21waWxlXCIsIFwidGFibGVIZWxwZXJcIiwgXCJEVENvbHVtbkJ1aWxkZXJcIiwgXCIkdGltZW91dFwiLCBcInN0YXRpc3RpY3NcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcInBsYXllclN0YXRUYWJsZVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgcGxheWVySWQ6ICc8JyxcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIHNjcm9sbFk6ICdAJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3BsYXllcnMvY29tcG9uZW50cy9wbGF5ZXJTdGF0VGFibGUvcGxheWVyU3RhdFRhYmxlLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihEVE9wdGlvbnNCdWlsZGVyLCBEVENvbHVtbkRlZkJ1aWxkZXIsIGxvY2FsZSwgJHEsICRzY29wZSwgJGNvbXBpbGUsIHRhYmxlSGVscGVyLCBEVENvbHVtbkJ1aWxkZXIsICR0aW1lb3V0LHN0YXRpc3RpY3MpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5kdE9wdGlvbnMgPVxyXG4gICAgICAgICAgICBEVE9wdGlvbnNCdWlsZGVyXHJcbiAgICAgICAgICAgICAgICAubmV3T3B0aW9ucygpXHJcbiAgICAgICAgICAgICAgICAud2l0aEZuU2VydmVyRGF0YShzZXJ2ZXJEYXRhKVxyXG4gICAgICAgICAgICAgICAgLndpdGhEYXRhUHJvcCgnZGF0YScpXHJcbiAgICAgICAgICAgICAgICAud2l0aE9wdGlvbigncGFnaW5nJywgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAud2l0aE9wdGlvbignYWpheCcsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAud2l0aE9wdGlvbihcInNlYXJjaGluZ1wiLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIC53aXRoT3B0aW9uKCdwcm9jZXNzaW5nJywgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAud2l0aE9wdGlvbignbG9hZGluZ1RlbXBsYXRlJywgXCJcIilcclxuICAgICAgICAgICAgICAgIC53aXRoT3B0aW9uKCdvcmRlcicsIFswLCAnZGVzYyddKVxyXG4gICAgICAgICAgICAgICAgLndpdGhPcHRpb24oXCJpbmZvXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgLndpdGhPcHRpb24oJ2NyZWF0ZWRSb3cnLCBmdW5jdGlvbiAocm93LCBkYXRhLCBkYXRhSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkY29tcGlsZShhbmd1bGFyLmVsZW1lbnQocm93KSkoJHNjb3BlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodm0uc2Nyb2xsWSkge1xyXG4gICAgICAgICAgICB2bS5kdE9wdGlvbnMgPSB2bS5kdE9wdGlvbnMud2l0aE9wdGlvbihcInNjcm9sbFlcIiwgNDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ucHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgdmFyIHJlcXVlc3QgPW51bGw7XHJcbiAgICAgICAgaWYgKGxvY2FsZS5nZXRMb2NhbGUoKSA9PSAncnUnKSB7XHJcbiAgICAgICAgICAgIHZtLmR0T3B0aW9ucy53aXRoTGFuZ3VhZ2VTb3VyY2UoJy8vY2RuLmRhdGF0YWJsZXMubmV0L3BsdWctaW5zLzEuMTAuOS9pMThuL1J1c3NpYW4uanNvbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0uc2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc2hvdyA9IHRydWU7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICBqUXVlcnkuZm4uZGF0YVRhYmxlRXh0Lm9Tb3J0W1wicGxheWVyU3RhdERhdGVzLWRlc2NcIl0gPSBmdW5jdGlvbiAoeCwgeSkge1xyXG4gICAgICAgICAgICB2YXIgZGlmZiA9IG1vbWVudCh5LCAnREQuTU0uWVlZWScpLmRpZmYobW9tZW50KHgsICdERC5NTS5ZWVlZJykpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBqUXVlcnkuZm4uZGF0YVRhYmxlRXh0Lm9Tb3J0W1wicGxheWVyU3RhdERhdGVzLWFzY1wiXSA9IGZ1bmN0aW9uICh4LCB5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBqUXVlcnkuZm4uZGF0YVRhYmxlRXh0Lm9Tb3J0W1wicGxheWVyU3RhdERhdGVzLWRlc2NcIl0oeSwgeCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5kdENvbHVtbnMgPSB2bS5kdENvbHVtbnMgPSBbXHJcbiAgICAgICAgICAgIERUQ29sdW1uQnVpbGRlci5uZXdDb2x1bW4oJ3ZpZXcnKS5yZW5kZXJXaXRoKGZ1bmN0aW9uIChkYXRhLCB0eXBlLCBmdWxsLCBtZXRhKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgfSkud2l0aE9wdGlvbihcInNUeXBlXCIsICdwbGF5ZXJTdGF0RGF0ZXMnKSxcclxuICAgICAgICAgICAgRFRDb2x1bW5CdWlsZGVyLm5ld0NvbHVtbignbnVsbCcpLm5vdFNvcnRhYmxlKCkucmVuZGVyV2l0aChmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZnVsbCwgbWV0YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiPHBsYXllci1zdGF0LWNoYXJ0IHJlcXVlc3QtaWQ9J1wiK3JlcXVlc3QucmVxdWVzdElkK1wiJyBwbGF5ZXItaWQ9J1wiICsgdm0ucGxheWVySWQgKyBcIicgc3RhcnQtZGF0ZT0nXCIgKyBmdWxsLnN0YXJ0ICsgXCInIGVuZC1kYXRlPVwiICsgZnVsbC5lbmQgKyBcIicgY2hhcnQtaGVpZ2h0PScyNScgXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgb24tc2V0LWxvYWRpbmctcHJvbWlzZT0ndm0ub25TZXRMb2FkaW5nUHJvbWlzZShwcm9taXNlKSc+IDwvcGxheWVyLXN0YXQtY2hhcnQ+XCI7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXTtcclxuICAgICAgICB2bS5kdEluc3RhbmNlID0ge307XHJcbiAgICAgICAgdm0uZHRJbnRhbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdm0uZHRJbnN0YW5jZSA9IGluc3RhbmNlO1xyXG5cclxuICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uZHRJbnN0YW5jZS5EYXRhVGFibGUuY29sdW1ucy5hZGp1c3QoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2VydmVyRGF0YShzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2ssIG9TZXR0aW5ncykge1xyXG4gICAgICAgICAgICByZXR1cm4gJHEud2hlbih2bS5kYXRlcykudGhlbihmdW5jdGlvbiAoZGF0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2sodGFibGVIZWxwZXIud3JhcExpc3QoZGF0ZXMpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLm9uU2V0TG9hZGluZ1Byb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xyXG4gICAgICAgICAgICB2bS5wcm9taXNlcy5wdXNoKHByb21pc2UpO1xyXG4gICAgICAgICAgICBpZiAodm0ucHJvbWlzZXMubGVuZ3RoID09IHZtLmRhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgJHEuYWxsKHZtLnByb21pc2VzKS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5kZWZlci5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmouc3RhcnREYXRlIHx8IGNoYW5nZXNPYmouZW5kRGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBzdGF0aXN0aWNzLmdldFN0YXRzRm9yUGxheWVycyhbdm0ucGxheWVySWRdLHZtLnN0YXJ0RGF0ZSx2bS5lbmREYXRlLHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBjb3VudERheXMgPSBtb21lbnQodm0uZW5kRGF0ZSkuZGlmZihtb21lbnQodm0uc3RhcnREYXRlKSwgJ2RheXMnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnREYXlzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldzogbW9tZW50KHZtLnN0YXJ0RGF0ZSkuYWRkKGksICdkYXlzJykuZm9ybWF0KFwiREQuTU0uWVlZWVwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCh2bS5zdGFydERhdGUpLmFkZChpLCAnZGF5cycpLnV0YygpLmZvcm1hdCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCh2bS5zdGFydERhdGUpLmFkZChpICsgMSwgJ2RheXMnKS51dGMoKS5mb3JtYXQoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0ucHJvbWlzZXMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICAgIHZtLmRhdGVzID0gZGF0ZXM7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGVmZXIgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgICAgICAgICAgdm0uZGVmZXIgPSBkZWZlcjtcclxuICAgICAgICAgICAgICAgIHZtLnByb21pc2UgPSB2bS5kZWZlci5wcm9taXNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5kdEluc3RhbmNlLnJlbG9hZERhdGEoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDYuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcInRhYmxlSGVscGVyXCIsIFwidmlydHVhbFNjcmVlbnNcIiwgXCJhc3NpZ25WaXJ0dWFsU2NyZWVuU2VydmljZVwiLCBcInBsYXllcnNcIiwgXCJjb25maXJtTW9kYWxTZXJ2aWNlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJwbGF5ZXJWdXJ0dWFsU2NyZWVuQXJlYVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnPCdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwbGF5ZXJzL2NvbXBvbmVudHMvcGxheWVyVmlydHVhbFNjcmVlbkFyZWEvcGxheWVyVmlydHVhbFNjcmVlbkFyZWEuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHRhYmxlSGVscGVyLCB2aXJ0dWFsU2NyZWVucywgYXNzaWduVmlydHVhbFNjcmVlblNlcnZpY2UsIHBsYXllcnMsY29uZmlybU1vZGFsU2VydmljZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciBvcHRpb25zID0gdGFibGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckFuZ3VsYXJXYXlUYWJsZShbdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xyXG4gICAgICAgIG9wdGlvbnMuZHRPcHRpb25zLndpdGhPcHRpb24oXCJzY3JvbGxZXCIsICcyOTFweCcpO1xyXG4gICAgICAgIG9wdGlvbnMuZHRPcHRpb25zLndpdGhPcHRpb24oXCJiU2Nyb2xsQ29sbGFwc2VcIiwgdHJ1ZSk7XHJcbiAgICAgICAgdm0uZHRPcHRpb25zID0gb3B0aW9ucy5kdE9wdGlvbnM7XHJcbiAgICAgICAgdm0uZHRDb2x1bW5EZWZzID0gb3B0aW9ucy5kdENvbHVtbkRlZnM7XHJcblxyXG4gICAgICAgIHVwZGF0ZSgpO1xyXG5cclxuICAgICAgICB2bS5hdHRhY2hWaXJ0dWFsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBhc3NpZ25WaXJ0dWFsU2NyZWVuU2VydmljZS5zaG93QXNzaWduVmlydHVhbFNjcmVlbk1vZGFsKFt2bS5wbGF5ZXIuaWRdKS50aGVuKGZ1bmN0aW9uICh2aXJ0dWFsU2NyZWVuSWQpIHtcclxuICAgICAgICAgICAgICAgIHZtLnBsYXllci52aXJ0dWFsX3NjcmVlbl9pZCA9IHZpcnR1YWxTY3JlZW5JZDtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5kZXRhY2hWaXJ0dWFsU2NyZWVuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coXCJibG9ja3MuQ29uZmlybUFjdGlvbk1vZGFsSGludFwiLGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzLnVwZGF0ZSh2bS5wbGF5ZXIpLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnBsYXllci52aXJ0dWFsX3NjcmVlbl9pZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAgICAgICAgICAgaWYgKHZtLnBsYXllci52aXJ0dWFsX3NjcmVlbl9pZCkge1xyXG4gICAgICAgICAgICAgICAgdmlydHVhbFNjcmVlbnMuZ2V0KHZtLnBsYXllci52aXJ0dWFsX3NjcmVlbl9pZCkudGhlbihmdW5jdGlvbiAodmlydHVhbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnZpcnR1YWxTY3JlZW4gPSB2aXJ0dWFsU2NyZWVuO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmlydHVhbFNjcmVlbnMuZ2V0QXJlYXModm0ucGxheWVyLnZpcnR1YWxfc2NyZWVuX2lkKS50aGVuKGZ1bmN0aW9uIChhcmVhcykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FtcGFpZ25zID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYXMuZm9yRWFjaChmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmVhLmNhbXBhaWducy5mb3JFYWNoKGZ1bmN0aW9uIChjYW1wYWlnbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW1wYWlnbnNbY2FtcGFpZ24uaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ25zW2NhbXBhaWduLmlkXSA9IGNhbXBhaWduO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduLmFyZWEgPSBhcmVhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmNhbXBhaWducyA9IEFycmF5LmZyb21PYmplY3QoY2FtcGFpZ25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZtLnZpcnR1YWxTY3JlZW4gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdm0uY2FtcGFpZ25zID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KVxyXG4oKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNy4wNS4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcInBsYXllclN0YXR1c1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBkYXRlOiBcIjxcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtLWNvbnN0YW50IGxhYmVsLWRhcmsgXCIgbmctaGlkZT1cIjo6dm0uYWN0aXZlXCI+e3tcInBsYXllcnMuSW5hY3RpdmVcInxpMThufX08L3NwYW4+JyArXHJcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImxhYmVsIGxhYmVsLS1jb25zdGFudCBsYWJlbC1zdWNjZXNzXCIgbmctc2hvdz1cIjo6dm0uYWN0aXZlXCI+e3tcInBsYXllcnMuQWN0aXZlXCJ8aTE4bn19PC9zcGFuPicsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJwbGF5ZXJTdGF0dXNUZXh0XCIsIGNvbXBvbmVudFRleHQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50VGV4dCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgZGF0ZTogXCI8XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8c3BhbiAgbmctaGlkZT1cIjo6dm0uYWN0aXZlXCI+e3tcInBsYXllcnMuSW5hY3RpdmVcInxpMThufX08L3NwYW4+JyArXHJcbiAgICAgICAgICAgICc8c3BhbiBuZy1zaG93PVwiOjp2bS5hY3RpdmVcIj57e1wicGxheWVycy5BY3RpdmVcInxpMThufX08L3NwYW4+JyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh2bS5kYXRlICYmIHZtLmRhdGUgIT09IFwibnVsbFwiKSB7XHJcbiAgICAgICAgICAgIHZhciBub3cgPSBtb21lbnQoKTtcclxuICAgICAgICAgICAgdmFyIGxhc3RBY3Rpdml0eSA9IG1vbWVudC51dGModm0uZGF0ZSkubG9jYWwoKTtcclxuXHJcbiAgICAgICAgICAgIHZtLmFjdGl2ZSA9IG5vdy5kaWZmKGxhc3RBY3Rpdml0eSwgJ21pbnV0ZScpIDwgNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMy4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdyZW1vdmVQbGF5ZXJDb250cm9sbGVyJywgY29udHJvbGxlcilcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbJyR1aWJNb2RhbEluc3RhbmNlJywgJ3NlbGVjdGVkUGxheWVycycsJ3BsYXllcnMnLCckcScsJ2Vycm9ySGFuZGxlckhlbHBlciddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgc2VsZWN0ZWRQbGF5ZXJzLHBsYXllcnMsJHEsZXJyb3JIYW5kbGVySGVscGVyKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5nZW5lcmF0ZWRDb2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMCkgKyAxMDAwO1xyXG5cclxuICAgICAgICB2bS5vbmVQbGF5ZXIgPXNlbGVjdGVkUGxheWVycy5sZW5ndGg9PTE7XHJcbiAgICAgICAgdm0ucmVtb3ZlID0gZnVuY3Rpb24gKGZvcm0pIHtcclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZvcm0uJHZhbGlkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID1bXTtcclxuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzZWxlY3RlZFBsYXllcnMsZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHBsYXllcnMucmVtb3ZlUGxheWVyKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgJHEuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3VsdCxmb3JtLCB2bSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIzLjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ3JlbW92ZVBsYXllclNlcnZpY2UnLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKXtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc2VsZi5zaG93UmVtb3ZlUGxheWVyTW9kYWwgPSBmdW5jdGlvbiAocGxheWVycykge1xyXG4gICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL3JlbW92ZVBsYXllck1vZGFsL3JlbW92ZVBsYXllck1vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ3JlbW92ZVBsYXllckNvbnRyb2xsZXIgYXMgdm0nLFxyXG4gICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6J3JlbW92ZS1wbGF5ZXItbW9kYWwnLFxyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBsYXllcnM6ICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTEuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJzdGF0aXN0aWNzXCIsIFwiJHFcIiwgXCIkdGltZW91dFwiLCBcIiRlbGVtZW50XCIsIFwibG9jYWxlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJwbGF5ZXJTdGF0Q2hhcnRcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIHBsYXllcklkOiAnQCcsXHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgY2hhcnRIZWlnaHQ6ICdAJyxcclxuICAgICAgICAgICAgICAgIG9uU2V0TG9hZGluZ1Byb21pc2U6ICcmJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3BsYXllcnMvY29tcG9uZW50cy9wbGF5ZXJTdGF0Q2hhcnQvcGxheWVyU3RhdENoYXJ0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB2YXIgY2FjaGVEYXRlcyA9IHt9O1xyXG4gICAgdmFyIGNvdW50RGF0ZXNJbkNhY2hlID0gMDtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKHN0YXRpc3RpY3MsICRxLCAkdGltZW91dCwgJGVsZW1lbnQsbG9jYWxlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHZpZXdzV29yZCA9J1ZpZXdzJztcclxuXHJcbiAgICAgICAgbG9jYWxlLnJlYWR5KCdwbGF5ZXJzJykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZpZXdzV29yZCA9IGxvY2FsZS5nZXRTdHJpbmcoJ3BsYXllcnMuQ2hhcnRWaWV3c1Rvb2x0aXAnKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHZtLmRhdGEgPSB7XHJcbiAgICAgICAgICAgIGxhYmVsczogW10sXHJcbiAgICAgICAgICAgIGRhdGFzZXRzOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgeUF4aXNJRDogXCJ5LWF4aXMtMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50SG92ZXJSYWRpdXM6IDQsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRSYWRpdXM6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IFwicmdiKDQ2LCAxODQsIDQ2KVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3I6IFwicmdiKDQ2LCAxODQsIDQ2KVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFtdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHlBeGlzSUQ6IFwieS1heGlzLTJcIixcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDE1MywgMTUzLCAxNTMsMC4zKScsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDE1MywgMTUzLCAxNTMsMC43KScsXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZVRlbnNpb246IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRSYWRpdXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRIb3ZlclJhZGl1czogMCxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBbXVxyXG5cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICB5QXhpc0lEOiBcInktYXhpcy0yXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZVRlbnNpb246IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNiwgMTE3LCAyNTUsMC4zKScsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDI2LCAxMTcsIDI1NSwwLjcpJyxcclxuICAgICAgICAgICAgICAgICAgICBwb2ludFJhZGl1czogMCxcclxuICAgICAgICAgICAgICAgICAgICBwb2ludEhvdmVyUmFkaXVzOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFtdXHJcblxyXG5cclxuICAgICAgICAgICAgICAgIH1dXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIG1haW50YWluQXNwZWN0UmF0aW86IGZhbHNlLFxyXG4gICAgICAgICAgICBhbmltYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBib3JkZXJKb2luU3R5bGU6ICdtaXRlcicsXHJcbiAgICAgICAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2NhbGVzOiB7XHJcbiAgICAgICAgICAgICAgICB4QXhlczogW3tcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRpbWVcIixcclxuICAgICAgICAgICAgICAgICAgICB0aW1lOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcjogdmFsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgICAgICAgeUF4ZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJsZWZ0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcInktYXhpcy0xXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW46IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcInJpZ2h0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcInktYXhpcy0yXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRMaW5lczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd09uQ2hhcnRBcmVhOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAxLjE1LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b29sdGlwczoge1xyXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtb2RlOiAnaW5kZXgnLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICduZWFyZXN0JyxcclxuICAgICAgICAgICAgICAgIGN1c3RvbTogZnVuY3Rpb24gKHRvb2x0aXApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUb29sdGlwIEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdG9vbHRpcEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0anMtdG9vbHRpcCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdG9vbHRpcEVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwRWwuaWQgPSAnY2hhcnRqcy10b29sdGlwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcEVsLmlubmVySFRNTCA9IFwiPHRhYmxlIHN0eWxlPSdmb250LWZhbWlseTogXFxcIkxhdG9cXFwiJz48L3RhYmxlPlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvb2x0aXBFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEhpZGUgaWYgbm8gdG9vbHRpcFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29sdGlwLm9wYWNpdHkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcEVsLnN0eWxlLm9wYWNpdHkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBjYXJldCBQb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBFbC5jbGFzc0xpc3QucmVtb3ZlKCdhYm92ZScsICdiZWxvdycsICduby10cmFuc2Zvcm0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9vbHRpcC55QWxpZ24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcEVsLmNsYXNzTGlzdC5hZGQodG9vbHRpcC55QWxpZ24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBFbC5jbGFzc0xpc3QuYWRkKCduby10cmFuc2Zvcm0nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Qm9keShib2R5SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keUl0ZW0ubGluZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgVGV4dFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29sdGlwLmJvZHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlTGluZXMgPSB0b29sdGlwLnRpdGxlIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9keUxpbmVzID0gdG9vbHRpcC5ib2R5Lm1hcChnZXRCb2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlubmVySHRtbCA9ICc8dGhlYWQ+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVMaW5lcy5mb3JFYWNoKGZ1bmN0aW9uICh0aXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIdG1sICs9ICc8dHI+PHRoPicgKyB2YWwodGl0bGUpLmZvcm1hdCgnREQuTU0uWVlZWSBISDptbScpICsgJzwvdGg+PC90cj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIdG1sICs9ICc8L3RoZWFkPjx0Ym9keT4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIC8qIGJvZHlMaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChib2R5LCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BhbiA9ICc8c3BhbiBjbGFzcz1cImNoYXJ0anMtdG9vbHRpcC1rZXlcIiBzdHlsZT1cIicgKyBzdHlsZSArICdcIj48L3NwYW4+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySHRtbCArPSAnPHRyPjx0ZD4nICsgc3BhbiArIGJvZHkgKyAnPC90ZD48L3RyPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyovXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckh0bWwgKz0gJzx0cj48dGQ+JyArIHZpZXdzV29yZCArICc8c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OiBcXCdMYXRvU2VtaWJvbGRcXCdcIj4nK2JvZHlMaW5lc1swXVswXSsnPC9zcGFuPicrJzwvdGQ+PC90cj4nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIdG1sICs9ICc8L3Rib2R5Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZVJvb3QgPSB0b29sdGlwRWwucXVlcnlTZWxlY3RvcigndGFibGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVSb290LmlubmVySFRNTCA9IGlubmVySHRtbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5fY2hhcnQuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXksIHBvc2l0aW9uLCBhbmQgc2V0IHN0eWxlcyBmb3IgZm9udFxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBFbC5zdHlsZS5vcGFjaXR5ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwRWwuc3R5bGUubGVmdCA9IHBvc2l0aW9uLmxlZnQgKyB0b29sdGlwLmNhcmV0WCArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcEVsLnN0eWxlLnRvcCA9IHBvc2l0aW9uLnRvcCArIHRvb2x0aXAuY2FyZXRZIC0nNTgnKyAncHgnIDtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwRWwuc3R5bGUuZm9udEZhbWlseSA9IHRvb2x0aXAuX2ZvbnRGYW1pbHk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcEVsLnN0eWxlLmZvbnRTaXplID0gdG9vbHRpcC5mb250U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwRWwuc3R5bGUuZm9udFN0eWxlID0gdG9vbHRpcC5fZm9udFN0eWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBFbC5zdHlsZS5wYWRkaW5nID0gdG9vbHRpcC55UGFkZGluZyArICdweCAnICsgdG9vbHRpcC54UGFkZGluZyArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGlzRW1wdHkodm0uY2hhcnRIZWlnaHQpKSB7XHJcbiAgICAgICAgICAgIHZtLmNoYXJ0SGVpZ2h0ID0gJzMwJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0uY2hhcnRIZWlnaHQgKz0gJ3B4JztcclxuICAgICAgICB2YXIgcHJvbWlzZSA9IHN0YXRpc3RpY3MuZ2V0UmVxdWVzdFN0YXRzRm9yUGxheWVycyh2bS5yZXF1ZXN0SWQsIHZtLnBsYXllcklkKS50aGVuKGZ1bmN0aW9uIChzdGF0KSB7XHJcbiAgICAgICAgICAgIHZhciBjdHggPSAkZWxlbWVudC5maW5kKFwiLnBsYXllci1zdGF0X2NhbnZhc1wiKTtcclxuICAgICAgICAgICAgdmFyIHZpZXdzO1xyXG4gICAgICAgICAgICB2YXIgbW9uaXRvcjtcclxuICAgICAgICAgICAgdmFyIGNvbm5lY3Q7XHJcbiAgICAgICAgICAgIGlmICh2bS5zdGFydERhdGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkYXkgPSBtb21lbnQudXRjKHZtLnN0YXJ0RGF0ZSkubG9jYWwoKS5mb3JtYXQoJ01NREQnKTtcclxuICAgICAgICAgICAgICAgIHZpZXdzID0gcHJlcGFyZUFycmF5KHN0YXQudmlld1tkYXldKTtcclxuICAgICAgICAgICAgICAgIG1vbml0b3IgPSBwcmVwYXJlQXJyYXlGb3JTdGVwQ2hhcnQocHJlcGFyZUFycmF5KHN0YXQubW9uaXRvcltkYXldKSk7XHJcbiAgICAgICAgICAgICAgICBjb25uZWN0ID0gcHJlcGFyZUFycmF5Rm9yU3RlcENoYXJ0KHByZXBhcmVBcnJheShzdGF0LmNvbm5lY3RbZGF5XSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmlld3MgPSBwcmVwYXJlQXJyYXkoc3RhdC52aWV3KTtcclxuICAgICAgICAgICAgICAgIG1vbml0b3IgPSBwcmVwYXJlQXJyYXlGb3JTdGVwQ2hhcnQocHJlcGFyZUFycmF5KHN0YXQubW9uaXRvcikpO1xyXG4gICAgICAgICAgICAgICAgY29ubmVjdCA9IHByZXBhcmVBcnJheUZvclN0ZXBDaGFydChwcmVwYXJlQXJyYXkoc3RhdC5jb25uZWN0KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZtLmRhdGEuZGF0YXNldHNbMF0uZGF0YSA9IHZpZXdzO1xyXG4gICAgICAgICAgICB2bS5kYXRhLmRhdGFzZXRzWzFdLmRhdGEgPSBtb25pdG9yO1xyXG4gICAgICAgICAgICB2bS5kYXRhLmRhdGFzZXRzWzJdLmRhdGEgPSBjb25uZWN0O1xyXG4gICAgICAgICAgICB2YXIgbXlDaGFydCA9IG5ldyBDaGFydChjdHgsIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluZScsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdm0uZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB2bS5vcHRpb25zXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcblxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHZtLm9uU2V0TG9hZGluZ1Byb21pc2UpIHtcclxuICAgICAgICAgICAgdm0ub25TZXRMb2FkaW5nUHJvbWlzZSh7cHJvbWlzZTogcHJvbWlzZX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcHJlcGFyZUFycmF5Rm9yU3RlcENoYXJ0KGFycmF5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsYXN0UG9pbnQgPSBwcmV2aW91c1ZhbHVlW3ByZXZpb3VzVmFsdWUubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQb2ludC55ICE9IGN1cnJlbnRWYWx1ZS55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlLmNvbmNhdChbe3g6IGxhc3RQb2ludC54LCB5OiBjdXJyZW50VmFsdWUueX0sIGN1cnJlbnRWYWx1ZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlLmNvbmNhdChbY3VycmVudFZhbHVlXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWUuY29uY2F0KFtjdXJyZW50VmFsdWVdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0sIFtdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHByZXBhcmVBcnJheShhcnJheSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge3k6IGl0ZW0udmFsdWUsIHg6IHBhcnNlSW50KGl0ZW0udGltZSl9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdm0ub25DbGljayA9IGZ1bmN0aW9uIChwb2ludHMsIGV2dCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhwb2ludHMsIGV2dCk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHZhbCh2YWx1ZSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIGRhdGEgPSBjYWNoZURhdGVzW3ZhbHVlXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IG1vbWVudC51bml4KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGNhY2hlRGF0ZXNbdmFsdWVdID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIGNvdW50RGF0ZXNJbkNhY2hlKys7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50RGF0ZXNJbkNhY2hlID4gMjAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlRGF0ZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMjMuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29udHJvbGxlcignc2V0UG9zaXRpb25Nb2RhbENvbnRyb2xsZXInLCBjb250cm9sbGVyKVxyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcIiRzY29wZVwiLCAnJHVpYk1vZGFsSW5zdGFuY2UnLCAncG9zaXRpb24nXTtcclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHNjb3BlLCAkdWliTW9kYWxJbnN0YW5jZSwgcG9zaXRpb24pIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS5zaG93ID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgICAgIHZtLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBpZDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgY29vcmRzOiB7XHJcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogNTUuNzQ3LFxyXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiAzNy42MjZcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5tYXAgPSB7XHJcbiAgICAgICAgICAgIGNlbnRlcjoge1xyXG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IDU1Ljc0NyxcclxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogMzcuNjI2XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1hcmtlcnM6IFtdLFxyXG4gICAgICAgICAgICBldmVudHM6IHtcclxuICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAobWFwLCBldmVudE5hbWUsIG9yaWdpbmFsRXZlbnRBcmdzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG9yaWdpbmFsRXZlbnRBcmdzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGF0ID0gZS5sYXRMbmcubGF0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb24gPSBlLmxhdExuZy5sbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG9zaXRpb24oe2xhdGl0dWRlOiBsYXQsIGxvbmdpdHVkZTogbG9ufSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHpvb206IDExXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxhdGl0dWRlKSB7XHJcbiAgICAgICAgICAgIHNldFBvc2l0aW9uKHBvc2l0aW9uLCB0cnVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0uc2F2ZSA9IGZ1bmN0aW9uIChmb3JtKSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLiR2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2Uodm0ucG9zaXRpb24uY29vcmRzKTtcclxuICAgICAgICAgICAgICAgIHZtLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHNldFBvc2l0aW9uKHBvc2l0aW9uLCBjZW50ZXIpIHtcclxuXHJcbiAgICAgICAgICAgIHZtLnBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSA9IHBvc2l0aW9uLmxhdGl0dWRlO1xyXG4gICAgICAgICAgICB2bS5wb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlID0gcG9zaXRpb24ubG9uZ2l0dWRlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbnRlcikge1xyXG4gICAgICAgICAgICAgICAgdm0ubWFwLmNlbnRlci5sYXRpdHVkZSA9IHBvc2l0aW9uLmxhdGl0dWRlO1xyXG4gICAgICAgICAgICAgICAgdm0ubWFwLmNlbnRlci5sb25naXR1ZGUgPSBwb3NpdGlvbi5sb25naXR1ZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLmdlb2xvY2F0aW9uQXZhaWxhYmxlID0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHZtLmZpbmRNZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh2bS5nZW9sb2NhdGlvbkF2YWlsYWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24gKHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0UG9zaXRpb24ocG9zaXRpb24uY29vcmRzLCB0cnVlKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgZXZlbnRzID0ge1xyXG4gICAgICAgICAgICBwbGFjZXNfY2hhbmdlZDogZnVuY3Rpb24gKHNlYXJjaEJveCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBsYWNlID0gc2VhcmNoQm94LmdldFBsYWNlcygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwbGFjZSB8fCBwbGFjZSA9PSAndW5kZWZpbmVkJyB8fCBwbGFjZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBwbGFjZSBkYXRhIDooJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0UG9zaXRpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBwbGFjZVswXS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHBsYWNlWzBdLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpXHJcbiAgICAgICAgICAgICAgICB9LCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNlYXJjaGJveCA9IHt0ZW1wbGF0ZTogJ3NlYXJjaGJveC50cGwuaHRtbCcsIGV2ZW50czogZXZlbnRzfTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyMy4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdzZXRQb3NpdGlvbk1vZGFsU2VydmljZScsIHNlcnZpY2UpXHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCJdO1xyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkdWliTW9kYWwpe1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBcclxuICAgICAgICBzZWxmLnNob3dTZXRQb3NpdGlvbk1vZGFsID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwbGF5ZXJzL2NvbXBvbmVudHMvc2V0UG9zaXRpb25Nb2RhbC9zZXRQb3NpdGlvbk1vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ3NldFBvc2l0aW9uTW9kYWxDb250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOlwic2Nyb2xsLW1vZGFsXCIsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIFxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDExLjA1LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBjb25maWcuJGluamVjdCA9IFtcIiRzdGF0ZVByb3ZpZGVyXCJdO1xyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wicGxheWVyc1wiLCBcIiRzdGF0ZVwiLCBcIiRzdGF0ZVBhcmFtc1wiLCBcInJlbW92ZU1vZGFsU2VydmljZVwiLCBcInBsYXllclwiLCBcInNldFBvc2l0aW9uTW9kYWxTZXJ2aWNlXCIsIFwic2hvd1Bvc2l0aW9uU2VydmljZVwiLCBcImVkaXRTZXJ2aWNlXCIsIFwiY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZVwiLCBcInRpbWVUYXJnZXRpbmdcIiwgXCJiYWNrU2VydmljZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIikuY29uZmlnKGNvbmZpZyk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQucGxheWVyLm9uZScsIHtcclxuICAgICAgICAgICAgICAgIHVybDogJy9vbmUve2lkfScsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3BsYXllcnMvcGFnZXMvcGxheWVyL3BsYXllci5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdQbGF5ZXJDb250cm9sbGVyJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYXllcjogW1wicGxheWVyc1wiLCBcIiRzdGF0ZVBhcmFtc1wiLCBmdW5jdGlvbiAocGxheWVycywgJHN0YXRlUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzLmdldCgkc3RhdGVQYXJhbXMuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuY29udHJvbGxlcihcIlBsYXllckNvbnRyb2xsZXJcIiwgY29udHJvbGxlcik7XHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcihwbGF5ZXJzLCAkc3RhdGUsICRzdGF0ZVBhcmFtcywgcmVtb3ZlTW9kYWxTZXJ2aWNlLCBwbGF5ZXIsIHNldFBvc2l0aW9uTW9kYWxTZXJ2aWNlLCBzaG93UG9zaXRpb25TZXJ2aWNlLCBlZGl0U2VydmljZSwgY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZSwgdGltZVRhcmdldGluZyxiYWNrU2VydmljZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIGlmICghcGxheWVyLnRhZ3MpIHtcclxuICAgICAgICAgICAgcGxheWVyLnRhZ3MgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ubW9kZWwgPSBwbGF5ZXI7XHJcbiAgICAgICAgdm0ubW9kZWwuc2NyZWVuX2ZsaXAgPSB2bS5tb2RlbC5zY3JlZW5fZmxpcCA9PSAxO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bS5tb2RlbCwgXCJicmlnaHRcIiwge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGVtcEJyaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RlbXBCcmlnaHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9icmlnaHQ6IHRoaXMuYXV0b2JyaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0RGF5OiB0aGlzLmJyaWdodF9kYXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodE5pZ2h0OiB0aGlzLmJyaWdodF9uaWdodFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGVtcEJyaWdodDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9icmlnaHQgPSB2YWwuYXV0b2JyaWdodDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnJpZ2h0X2RheSA9IHZhbC5icmlnaHREYXk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyaWdodF9uaWdodCA9IHZhbC5icmlnaHROaWdodDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RlbXBCcmlnaHQgPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0ubW9kZWwsIFwiZW5hYmxlUG93ZXJMb3NzXCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYXV0b29mZl9ieV9kaXNjaGFyZ2luZ190aW1lX2FjdGl2ZSA9PSAxO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZl9wb3dlcl9sb3NzID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvb2ZmX2J5X2Rpc2NoYXJnaW5nX3RpbWVfYWN0aXZlID0gdmFsID8gMSA6IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXV0b29mZl9ieV9kaXNjaGFyZ2luZ190aW1lX2FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmX3Bvd2VyX2xvc3MgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZfcG93ZXJfbG9zcyA9IDU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0ubW9kZWwsIFwiZW5hYmxlTWluQ2hhcmdlXCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5hdXRvb2ZmX2J5X2JhdHRlcnlfbGV2ZWxfYWN0aXZlID09IDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmX2NoYXJnZV9wZXJjZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XHJcblxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9vZmZfYnlfYmF0dGVyeV9sZXZlbF9hY3RpdmUgPSB2YWwgPyAxIDogMDtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hdXRvb2ZmX2J5X2JhdHRlcnlfbGV2ZWxfYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZfY2hhcmdlX3BlcmNlbnQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZfY2hhcmdlX3BlcmNlbnQgPSA1O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5lZGl0TW9kZWwgPSBlZGl0U2VydmljZS5nZXRFZGl0TW9kZWxGb3JSZXN0QW5ndWxhck1vZGVsKHZtKTtcclxuXHJcbiAgICAgICAgdm0ub25DaGFuZ2UgPSBmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsID0gb2JqLnZhbHVlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uU2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMudXBkYXRlKHZtLm1vZGVsKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZVJlbGF5KDEpO1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlUmVsYXkoMik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMudXBkYXRlKHZtLm1vZGVsKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5jaGFuZ2VQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uYmFja3VwX2dwc19sYXQgPSBhbmd1bGFyLmNvcHkodm0uZWRpdE1vZGVsLnZhbHVlLmdwc19sYXQpO1xyXG4gICAgICAgICAgICB2bS5iYWNrdXBfZ3BzX2xvbmcgPSBhbmd1bGFyLmNvcHkodm0uZWRpdE1vZGVsLnZhbHVlLmdwc19sb25nKTtcclxuICAgICAgICAgICAgc2V0UG9zaXRpb25Nb2RhbFNlcnZpY2Uuc2hvd1NldFBvc2l0aW9uTW9kYWwoe1xyXG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IHZtLmVkaXRNb2RlbC52YWx1ZS5ncHNfbGF0LFxyXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiB2bS5lZGl0TW9kZWwudmFsdWUuZ3BzX2xvbmdcclxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5ncHNfbGF0ID0gcG9zaXRpb24ubGF0aXR1ZGU7XHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0TW9kZWwudmFsdWUuZ3BzX2xvbmcgPSBwb3NpdGlvbi5sb25naXR1ZGU7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZS5ncHNfbGF0ID0gdm0uYmFja3VwX2dwc19sYXQ7XHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0TW9kZWwudmFsdWUuZ3BzX2xvbmcgPSB2bS5iYWNrdXBfZ3BzX2xvbmc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnNob3dDb250cm9sUmVsYXkgPSBmdW5jdGlvbiAoaSkge1xyXG4gICAgICAgICAgICBjb250cm9sVGFyZ2V0aW5nTW9kYWxTZXJ2aWNlLnNob3dDb250cm9sVGFyZ2V0aW5nTW9kYWwodm0uZWRpdE1vZGVsLnZhbHVlWyd0aW1lX3RhcmdldGluZ19yZWxheV8nICsgaSArICdfaWQnXSkudGhlbihcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVkaXRNb2RlbC52YWx1ZVsndGltZV90YXJnZXRpbmdfcmVsYXlfJyArIGkgKyAnX2lkJ10gPSBpZDtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZWxheShpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uc2hvd1Bvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzaG93UG9zaXRpb25TZXJ2aWNlLnNob3coe1xyXG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IHZtLm1vZGVsLmdwc19sYXQsXHJcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHZtLm1vZGVsLmdwc19sb25nXHJcbiAgICAgICAgICAgIH0sIHZtLm1vZGVsLm5hbWUpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZW1vdmVNb2RhbFNlcnZpY2Uuc2hvd1JlbW92ZU1vZGFsKFskc3RhdGVQYXJhbXMuaWRdLCBcInBsYXllcnNcIikudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5iYWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGJhY2tTZXJ2aWNlLmJhY2soJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIubGlzdCcpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHVwZGF0ZVJlbGF5KDEpO1xyXG4gICAgICAgIHVwZGF0ZVJlbGF5KDIpO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVSZWxheShudW1iZXIsIHVzZUVkaXQpIHtcclxuICAgICAgICAgICAgdmFyIGlkID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHVzZUVkaXQpIHtcclxuICAgICAgICAgICAgICAgIGlkID0gdm0uZWRpdE1vZGVsLnZhbHVlWyd0aW1lX3RhcmdldGluZ19yZWxheV8nICsgbnVtYmVyICsgJ19pZCddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWQgPSB2bS5tb2RlbFsndGltZV90YXJnZXRpbmdfcmVsYXlfJyArIG51bWJlciArICdfaWQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChpZCYmaWQhPScnKSB7XHJcbiAgICAgICAgICAgICAgICB0aW1lVGFyZ2V0aW5nLmdldFRpbWVUYXJnZXRpbmcoaWQpLnRoZW4oZnVuY3Rpb24gKHRhcmdldGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gYW5ndWxhci5mcm9tSnNvbih0YXJnZXRpbmcuY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm1bJ3JlbGF5JyArIG51bWJlciArICdfZW5hYmxlZCddID0gY29udGVudC5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxlbmd0aCAhPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZtWydyZWxheScgKyBudW1iZXIgKyAnX2VuYWJsZWQnXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEzLjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcInRhYmxlSGVscGVyXCIsIFwic3RhdGlzdGljc1wiLCBcInBsYXllcnNcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoXCJEZXZMYXN0UGxheUV2ZW50c0NvbnRyb2xsZXJcIiwgY29udHJvbGxlcik7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIodGFibGVIZWxwZXIsIHN0YXRpc3RpY3MscGxheWVycykge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YWJsZUhlbHBlci5nZXRPcHRpb25zRm9yQW5ndWxhcldheVRhYmxlKFtmYWxzZSxmYWxzZV0pO1xyXG5cclxuXHJcbiAgICAgICAgdm0uZHRPcHRpb25zID0gb3B0aW9ucy5kdE9wdGlvbnM7XHJcbiAgICAgICAgdm0uZHRDb2x1bW5EZWZzID0gb3B0aW9ucy5kdENvbHVtbkRlZnM7XHJcbiAgICAgICAgdmFyIHBhcmFtPXt9O1xyXG4gICAgICAgIHBhcmFtWydwYWdlW29mZnNldF0nXSA9IDA7XHJcbiAgICAgICAgcGFyYW1bJ3BhZ2VbbGltaXRdJ10gPSA1MDA7XHJcbiAgICAgICAgcGxheWVycy5nZXRQbGF5ZXJzKHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgIHZtLnBsYXllcnMgPXJlc3VsdC5kYXRhO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZtLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLmFkZCgnZGF5cycsLTIpO1xyXG4gICAgICAgIHZtLmVuZERhdGUgPSBtb21lbnQoKTtcclxuICAgICAgICB2bS5hcHBseSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgICAgICAgIHZtLnBhcmFtID17cGxheWVyX2lkOiB2bS5wbGF5ZXJJZH07XHJcblxyXG4gICAgICAgICAgICBpZih2bS5zdGFydERhdGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZtLnBhcmFtLnN0YXJ0X3RpbWVzdGFtcCA9bW9tZW50LnV0Yyh2bS5zdGFydERhdGUpLmZvcm1hdChcIllZWVktTU0tREQgSEg6bW06c3NcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodm0uZW5kRGF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm0ucGFyYW0uZW5kX3RpbWVzdGFtcCA9bW9tZW50LnV0Yyh2bS5lbmREYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tOnNzXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN0YXRpc3RpY3MuZ2V0U3RhdHNQbGF5ZWRDb250ZW50KHZtLnBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmV2ZW50cyA9IHJlc3VsdDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbXCIkcVwiLCBcInBsYXllcnNcIiwgXCJlcnJvckhhbmRsZXJIZWxwZXJcIiwgXCJ0YWdzU2VydmljZVwiLCBcIlF1YWxpdGllc1wiLCBcImNhbXBhaWduc1wiLCBcInNldFBvc2l0aW9uTW9kYWxTZXJ2aWNlXCIsIFwiJHN0YXRlXCIsIFwibW9tZW50XCIsIFwiY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZVwiLCBcImNvbmZpcm1Nb2RhbFNlcnZpY2VcIiwgXCJiaWxsaW5nU2VydmljZVwiLCBcImNoYW5nZVN1YnNjcmlwdGlvbk1vZGFsXCIsIFwibG9jYWxlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMucGxheWVyc1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKFwiQ3JlYXRlTmV3UGxheWVyQ29udHJvbGxlclwiLCBjb250cm9sbGVyKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkcSwgcGxheWVycywgZXJyb3JIYW5kbGVySGVscGVyLCB0YWdzU2VydmljZSwgUXVhbGl0aWVzLCBjYW1wYWlnbnMsIHNldFBvc2l0aW9uTW9kYWxTZXJ2aWNlLCAkc3RhdGUsIG1vbWVudCwgY29udHJvbFRhcmdldGluZ01vZGFsU2VydmljZSwgY29uZmlybU1vZGFsU2VydmljZSwgYmlsbGluZ1NlcnZpY2UsIGNoYW5nZVN1YnNjcmlwdGlvbk1vZGFsLCBsb2NhbGUpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5zdWJtaXR0ZWQgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodm0ucGxheWVyQ3JlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlybU1vZGFsU2VydmljZS5zaG93KFwicGxheWVycy5Db25maXJtQmFja0Zyb21XaXphcmRzXCIsIG51bGwsICdpbmZvJywgbnVsbCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbyhcInBlcnNvbmFsQWNjb3VudC5wbGF5ZXIubGlzdFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQucGxheWVyLmxpc3RcIilcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5sb2NhbGUgPSBsb2NhbGUuZ2V0TG9jYWxlKCkgPT0gJ3J1JyA/IFwicnUvXCIgOiAnJztcclxuXHJcbiAgICAgICAgdmFyIHNlbGVjdFdoaXRlT3B0aW9uID0ge1xyXG4gICAgICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBcImZvcm0td2hpdGVcIlxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmNoZWNrUGxheWVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodm0uZm9ybUNvZGUuJHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycy5jaGVja1BsYXllcih2bS5jb2RlLnJlcGxhY2UoJy0nLCAnJykpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZW50ZXJDb2RlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9IDQwNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5mb3JtQ29kZS5jb2RlLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVySGVscGVyLmhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2UsIHZtLmZvcm1Db2RlLCB2bSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgdXBkYXRlQmlsbGluZ0RhdGEoKTtcclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVCaWxsaW5nRGF0YSgpIHtcclxuICAgICAgICAgICAgYmlsbGluZ1NlcnZpY2UuZ2V0TGltaXRzKCkudGhlbihmdW5jdGlvbiAobGltaXRzKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5saW1pdHMgPSBsaW1pdHM7XHJcbiAgICAgICAgICAgICAgICB2bS5hbGxvd0ZyZWUgPSB2bS5saW1pdHMuZnJlZS50b3RhbCA+IHZtLmxpbWl0cy5mcmVlLnVzZWQ7XHJcbiAgICAgICAgICAgICAgICB2bS5hbGxvd1BhaWQgPSB2bS5saW1pdHMucGFpZC50b3RhbCA+IHZtLmxpbWl0cy5wYWlkLnVzZWQ7XHJcbiAgICAgICAgICAgICAgICB2bS5jb3VudEZyZWUgPSB2bS5saW1pdHMuZnJlZS50b3RhbCAtIHZtLmxpbWl0cy5mcmVlLnVzZWQ7XHJcbiAgICAgICAgICAgICAgICB2bS5jb3VudEZyZWUgPSB2bS5jb3VudEZyZWUgPCAwID8gMCA6IHZtLmNvdW50RnJlZTtcclxuICAgICAgICAgICAgICAgIHZtLmNvdW50UGFpZCA9IHZtLmxpbWl0cy5wYWlkLnRvdGFsIC0gdm0ubGltaXRzLnBhaWQudXNlZDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBiaWxsaW5nU2VydmljZS5nZXRTdWJzY3JpcHRpb24oKS50aGVuKGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHZtLnN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uc3Vic2NyaXB0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZF9kYXRlOiAnJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2bS5jb250cm9sU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjaGFuZ2VTdWJzY3JpcHRpb25Nb2RhbC5zaG93KHZtLmxpbWl0cy5wYWlkLnRvdGFsLCB2bS5saW1pdHMucGFpZC51c2VkLCB2bS5zdWJzY3JpcHRpb24uZW5kX2RhdGUpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlQmlsbGluZ0RhdGEoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmFjdGl2YXRlUGxheWVyID0gZnVuY3Rpb24gKHR5cGUpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2ZyZWUnICYmICF2bS5hbGxvd0ZyZWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdwYWlkJyAmJiAhdm0uYWxsb3dQYWlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHZtLmZvcm1Db2RlLiR2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMuYWN0aXZhdGVQbGF5ZXIoe2NvZGU6IHZtLmNvZGUucmVwbGFjZSgnLScsICcnKSwgdHlwZTogdHlwZX0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcmVzcG9uc2UuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMuZ2V0UGxheWVyKGlkKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5wbGF5ZXIgPSByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ucGxheWVyLmdwc190eXBlID0gdm0ucGxheWVyLmdwc190eXBlID09ICd1bmtub3duJyA/ICdzdGF0aWMnIDogdm0ucGxheWVyLmdwc190eXBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm0ucGxheWVyLnRpbWV6b25lID09IFwiRXVyb3BlL01vc2tvd1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5wbGF5ZXIudGltZXpvbmUgPSBcIkV1cm9wZS9Nb3Njb3dcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5wbGF5ZXIucG9zaXRpb24gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ucGxheWVyLnBvc2l0aW9uLmxhdGl0dWRlID0gXHQ0MC43ODUwOTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnBsYXllci5wb3NpdGlvbi5sb25naXR1ZGUgPSBcdC03My45NjgyODU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnBsYXllci5ncHNfbGF0ID0gdm0ucGxheWVyLnBvc2l0aW9uLmxhdGl0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5wbGF5ZXIuZ3BzX2xvbmcgPSB2bS5wbGF5ZXIucG9zaXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5wbGF5ZXJDcmVhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCB2bS5mb3JtQ29kZSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICAvKnBsYXllciBzZXR0aW5ncyovXHJcbiAgICAgICAgdm0uc2VsZWN0UXVhbGl0eU9wdGlvbiA9IHtcclxuICAgICAgICAgICAgZHJvcGRvd25Dc3NDbGFzczogXCJmb3JtLXdoaXRlXCIsXHJcbiAgICAgICAgICAgIG1pbmltdW1SZXN1bHRzRm9yU2VhcmNoOiAtMVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5wbGF5ZXIgPSB7XHJcbiAgICAgICAgICAgIHRhZ3M6IFtdLFxyXG4gICAgICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICAgICAgZ3BzX3R5cGU6ICcnLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogJycsXHJcbiAgICAgICAgICAgIHZpZGVvX3F1YWxpdHk6ICcnLFxyXG4gICAgICAgICAgICBtYXhfYnJpZ2h0OiAxMDAsXHJcbiAgICAgICAgICAgIG1pbl9icmlnaHQ6IDBcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5wbGF5ZXIub2ZmX2NoYXJnZV9wZXJjZW50ID0gMDtcclxuICAgICAgICB2bS5wbGF5ZXIub2ZmX3Bvd2VyX2xvc3MgPSAwO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bS5wbGF5ZXIsIFwiZW5hYmxlUG93ZXJMb3NzXCIsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYXV0b29mZl9ieV9kaXNjaGFyZ2luZ190aW1lX2FjdGl2ZSA9PSAxO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZl9wb3dlcl9sb3NzID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvb2ZmX2J5X2Rpc2NoYXJnaW5nX3RpbWVfYWN0aXZlID0gdmFsID8gMSA6IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXV0b29mZl9ieV9kaXNjaGFyZ2luZ190aW1lX2FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmX3Bvd2VyX2xvc3MgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZfcG93ZXJfbG9zcyA9IDU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0ucGxheWVyLCBcImVuYWJsZU1pbkNoYXJnZVwiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuYXV0b29mZl9ieV9iYXR0ZXJ5X2xldmVsX2FjdGl2ZSA9PSAxO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZl9jaGFyZ2VfcGVyY2VudCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvb2ZmX2J5X2JhdHRlcnlfbGV2ZWxfYWN0aXZlID0gdmFsID8gMSA6IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXV0b29mZl9ieV9iYXR0ZXJ5X2xldmVsX2FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmX2NoYXJnZV9wZXJjZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmX2NoYXJnZV9wZXJjZW50ID0gNTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0ucGxheWVyLCBcImJyaWdodFwiLCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90ZW1wQnJpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVtcEJyaWdodCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2JyaWdodDogdGhpcy5hdXRvYnJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmlnaHREYXk6IHRoaXMuYnJpZ2h0X2RheSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0TmlnaHQ6IHRoaXMuYnJpZ2h0X25pZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZW1wQnJpZ2h0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0b2JyaWdodCA9IHZhbC5hdXRvYnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmlnaHRfZGF5ID0gdmFsLmJyaWdodERheTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnJpZ2h0X25pZ2h0ID0gdmFsLmJyaWdodE5pZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGVtcEJyaWdodCA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgdGFnc1NlcnZpY2UuZ2V0UGxheWVyc1RhZ3MoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdm0ucGxheWVyc1RhZ3MgPSByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZtLnF1YWxpdGllcyA9IFF1YWxpdGllcztcclxuXHJcbiAgICAgICAgdm0udXBkYXRlUGxheWVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gcGxheWVycy51cGRhdGVQbGF5ZXIodm0ucGxheWVyKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmNyZWF0ZVRhZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRhZ3NTZXJ2aWNlLmFkZFBsYXllclRhZyh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB2bS5wbGF5ZXJzVGFncy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB2bS5wbGF5ZXIudGFncy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zaG93U2V0UG9zaXRpb25Nb2RhbCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2V0UG9zaXRpb25Nb2RhbFNlcnZpY2Uuc2hvd1NldFBvc2l0aW9uTW9kYWwodm0ucGxheWVyLnBvc2l0aW9uKS50aGVuKGZ1bmN0aW9uIChwb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdm0ucGxheWVyLnBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICB2bS5wbGF5ZXIuZ3BzX2xhdCA9IHZtLnBsYXllci5wb3NpdGlvbi5sYXRpdHVkZTtcclxuICAgICAgICAgICAgICAgIHZtLnBsYXllci5ncHNfbG9uZyA9IHZtLnBsYXllci5wb3NpdGlvbi5sb25naXR1ZGU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnNob3dDb250cm9sUmVsYXkgPSBmdW5jdGlvbiAoaSkge1xyXG4gICAgICAgICAgICB2YXIgaWQgPSB2bS5wbGF5ZXJbJ3RpbWVfdGFyZ2V0aW5nX3JlbGF5XycgKyBpICsgJ19pZCddO1xyXG4gICAgICAgICAgICBjb250cm9sVGFyZ2V0aW5nTW9kYWxTZXJ2aWNlLnNob3dDb250cm9sVGFyZ2V0aW5nTW9kYWwoaWQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5wbGF5ZXJbJ3RpbWVfdGFyZ2V0aW5nX3JlbGF5XycgKyBpICsgJ19pZCddID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uRmluaXNoU2xpZGVyID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XHJcbiAgICAgICAgICAgIHZtLnBsYXllci5tYXhfYnJpZ2h0ID0gdG87XHJcbiAgICAgICAgICAgIHZtLnBsYXllci5taW5fYnJpZ2h0ID0gZnJvbTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm9uRmluaXNoTmlnaHRTbGlkZXIgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcclxuICAgICAgICAgICAgaWYgKHRvID4gdm0ucGxheWVyLm1heF9icmlnaHQpIHtcclxuICAgICAgICAgICAgICAgIHRvID0gdm0ucGxheWVyLm1heF9icmlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0ucGxheWVyLm1heF9icmlnaHRfbmlnaHQgPSB0bztcclxuICAgICAgICAgICAgdm0ucGxheWVyLm1pbl9icmlnaHRfbmlnaHQgPSBmcm9tO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICAvKnNlbGVjdCBjYW1wYWlnbiovXHJcblxyXG4gICAgICAgIHZtLnNlbGVjdENhbXBhaWduT3B0aW9uID0gc2VsZWN0V2hpdGVPcHRpb247XHJcblxyXG4gICAgICAgIHZtLmVuZEFjdGlvbiA9ICdjcmVhdGUnO1xyXG5cclxuXHJcbiAgICAgICAgdmFyIHBhcmFtcyA9IHtsaW1pdDogNTAwfTtcclxuICAgICAgICBwYXJhbXNbXCJzb3J0W2NyZWF0ZWRfYXRdXCJdID0gJ2Rlc2MnO1xyXG5cclxuICAgICAgICBwYXJhbXNbJ2ZpbHRlcltzdGF0dXNdJ10gPSAnYWN0aXZlJztcclxuICAgICAgICBjYW1wYWlnbnMuZ2V0TGlzdChwYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB2bS5jYW1wYWlnbnMgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICAgICAgaWYgKHZtLmNhbXBhaWducy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5jYW1wYWlnbklkID0gdm0uY2FtcGFpZ25zWzBdLmlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZtLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodm0uZW5kQWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjcmVhdGUnOiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYW1wYWlnbiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDYW1wYWlnbiBcIiArIG1vbWVudCgpLmZvcm1hdCgnREQuTU0uWVlZWSBISDptbTpzcycpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdzOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19kdXJhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImxhbmRzY2FwZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF90aW1lc3RhbXA6IG1vbWVudCgpLnV0YygpLmZsb29yKDI0LCAnaG91cnMnKS5mb3JtYXQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RpbWVzdGFtcDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE5MjAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTA4MCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9sYXlvdXQ6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXJlYTEnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTkyMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwODAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhbXBhaWducy5hZGQoY2FtcGFpZ24pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycy5hdHRhY2hDYW1wYWlnbih2bS5wbGF5ZXIuaWQsIHJlc3VsdC5pZCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQuY2FtcGFpZ24ub25lXCIsIHtpZDogcmVzdWx0LmlkfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6IHtcclxuICAgICAgICAgICAgICAgICAgICBwbGF5ZXJzLmF0dGFjaENhbXBhaWduKHZtLnBsYXllci5pZCwgdm0uY2FtcGFpZ25JZCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bS5nb1RvQ2FtcGFpZ24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbyhcInBlcnNvbmFsQWNjb3VudC5jYW1wYWlnbi5vbmVcIiwge2lkOiB2bS5jYW1wYWlnbklkfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQucGxheWVyLmxpc3RcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ25vbmUnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHN0YXRlLmdvKFwicGVyc29uYWxBY2NvdW50LnBsYXllci5saXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxMy4wNC4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5wbGF5ZXJzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoXCJQbGF5ZXJUcmFja2luZ0NvbnRyb2xsZXJcIiwgY29udHJvbGxlcik7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG5cclxuXHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDEzLjA0LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBjb25maWcuJGluamVjdCA9IFtcIiRzdGF0ZVByb3ZpZGVyXCJdO1xyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHN0YXRlXCIsIFwiJHN0YXRlUGFyYW1zXCIsIFwicGxheWVyc1wiLCBcImVycm9ySGFuZGxlckhlbHBlclwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIikuY29uZmlnKGNvbmZpZyk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQucGxheWVyLnJlcGxhY2VDb2RlUGxheWVyJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL3JlcGxhY2VDb2RlUGxheWVyL3twbGF5ZXJJZH0nLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdwbGF5ZXJzL3BhZ2VzL3JlcGxhY2VDb2RlL3JlcGxhY2VDb2RlLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkc3RhdGUsJHN0YXRlUGFyYW1zLHBsYXllcnMsZXJyb3JIYW5kbGVySGVscGVyKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5zdWJtaXR0ZWQgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQucGxheWVyLm9uZVwiLHtpZDokc3RhdGVQYXJhbXMucGxheWVySWR9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlcGxhY2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnN1Ym1pdHRlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAodm0uZm9ybUNvZGUuJHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID10cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMucmVwbGFjZUNvZGUoJHN0YXRlUGFyYW1zLnBsYXllcklkLHZtLmNvZGUucmVwbGFjZSgnLScsICcnKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQucGxheWVyLm9uZVwiLHtpZDokc3RhdGVQYXJhbXMucGxheWVySWR9KVxyXG5cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCB2bS5mb3JtQ29kZSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMudXNlclwiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdDaGFuZ2VQYXNzd29yZE1vZGFsQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpXHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsJ3VzZXInLCAnZXJyb3JIYW5kbGVySGVscGVyJ107XHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLHVzZXIsIGVycm9ySGFuZGxlckhlbHBlcikge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS5zYXZlID0gZnVuY3Rpb24gKGZvcm0pIHtcclxuXHJcbiAgICAgICAgICAgIHZtLnN1Ym1pdHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLiR2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB1c2VyLmNoYW5nZVBhc3N3b3JkKHZtLm1vZGVsKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2Uodm0uc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZSwgZm9ybSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMudXNlclwiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdjaGFuZ2VQYXNzd29yZE1vZGFsU2VydmljZScsIHNlcnZpY2UpXHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCJdO1xyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkdWliTW9kYWwpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zaG93ID0gZnVuY3Rpb24gKGlkLG5hbWUpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAndXNlci9jb21wb25lbnRzL2NoYW5nZVBhc3N3b3JkTW9kYWwvY2hhbmdlUGFzc3dvcmRNb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdDaGFuZ2VQYXNzd29yZE1vZGFsQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNy4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy52aXJ0dWFsU2NyZWVuc1wiKS5jb25maWcoY29uZmlnKTtcclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gWyckc3RhdGVQcm92aWRlciddO1xyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQudmlydHVhbFNjcmVlbi5hZGQnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYWRkJyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndmlydHVhbFNjcmVlbnMvcGFnZXMvYWRkVmlydHVhbFNjcmVlbi9hZGRWaXJ0dWFsU2NyZWVuLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiXHJcblxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcIiRzdGF0ZVwiLCBcImVycm9ySGFuZGxlckhlbHBlclwiLCBcIlR5cGVTY3JlZW5WaXJ0dWFsU2NyZWVuXCIsIFwiQXVkaW9Qcmlvcml0eVwiLCBcInZpcnR1YWxTY3JlZW5zXCJdO1xyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkc3RhdGUsIGVycm9ySGFuZGxlckhlbHBlciwgVHlwZVNjcmVlblZpcnR1YWxTY3JlZW4sIEF1ZGlvUHJpb3JpdHksIHZpcnR1YWxTY3JlZW5zKSB7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLnR5cGVTY3JlZW5WaXJ0dWFsU2NyZWVuID0gVHlwZVNjcmVlblZpcnR1YWxTY3JlZW47XHJcbiAgICAgICAgdm0uYXVkaW9Qcmlvcml0eSA9IEF1ZGlvUHJpb3JpdHkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgIT0gXCJ3aWRnZXRzXCI7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB2bS5tb2RlbCA9IHtcclxuICAgICAgICAgICAgYXVkaW9fcHJpb3JpdHk6IEF1ZGlvUHJpb3JpdHlbMF0ubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogXCJzaGFyZWRcIixcclxuICAgICAgICAgICAgdHlwZV9hcmVhczogVHlwZVNjcmVlblZpcnR1YWxTY3JlZW5bMF0ubmFtZSxcclxuICAgICAgICAgICAgc2V0IHR5cGVTY3JlZW4odmFsKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ2aWRlb193aWRnZXRcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5hdWRpb1ByaW9yaXR5ID0gQXVkaW9Qcmlvcml0eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uYXVkaW9Qcmlvcml0eSA9IEF1ZGlvUHJpb3JpdHkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lICE9IFwid2lkZ2V0c1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudHlwZV9hcmVhcyA9IHZhbDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IHR5cGVTY3JlZW4oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlX2FyZWFzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uYWRkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodm0uZm9ybS4kdmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdmlydHVhbFNjcmVlbnMuYWRkKHZtLm1vZGVsKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oXCJwZXJzb25hbEFjY291bnQudmlydHVhbFNjcmVlbi5vbmVcIiwge2lkOiByZXN1bHQuaWR9KTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCB2bS5mb3JtLCB2bSk7XHJcbiAgICAgICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uQ2hhbmdlID0gZnVuY3Rpb24gKGZpbGUpIHtcclxuICAgICAgICAgICAgdm0uY29udGVudC5maWxlID0gZmlsZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHN0YXRlLmdvKCdwZXJzb25hbEFjY291bnQudmlydHVhbFNjcmVlbi5saXN0JylcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zZWxlY3RBdWRpb1ByaW9yaXR5ID0ge1xyXG4gICAgICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBcImZvcm0td2hpdGVcIixcclxuICAgICAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IC0xXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNy4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy52aXJ0dWFsU2NyZWVuc1wiKS5jb25maWcoY29uZmlnKTtcclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gWyckc3RhdGVQcm92aWRlciddO1xyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQudmlydHVhbFNjcmVlbicsIHtcclxuICAgICAgICAgICAgICAgIHVybDogJy92aXJ0dWFsU2NyZWVuJyxcclxuICAgICAgICAgICAgICAgIGFic3RyYWN0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6JzxkaXYgdWktdmlldz48L2Rpdj4nXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LnZpcnR1YWxTY3JlZW4ubGlzdCcsIHtcclxuICAgICAgICAgICAgICAgIHVybDogJy9saXN0JyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndmlydHVhbFNjcmVlbnMvcGFnZXMvdmlydHVhbFNjcmVlbnMvdmlydHVhbFNjcmVlbnMuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCJcclxuXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWydEVENvbHVtbkJ1aWxkZXInLCAndmlydHVhbFNjcmVlbnMnLCAnbm90aWZpY2F0aW9uU2VydmljZScsICdtb21lbnQnLCAnJHN0YXRlJywgJ2F0dGFjaFBsYXllck1vZGFsU2VydmljZScsICdyZW1vdmVNb2RhbFNlcnZpY2UnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKERUQ29sdW1uQnVpbGRlciwgdmlydHVhbFNjcmVlbnMsIG5vdGlmaWNhdGlvblNlcnZpY2UsIG1vbWVudCwgJHN0YXRlLCBhdHRhY2hQbGF5ZXJNb2RhbFNlcnZpY2UsIHJlbW92ZU1vZGFsU2VydmljZSkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0ub3B0aW9uID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlwiLFxyXG4gICAgICAgICAgICBkYXRlU3RhcnQ6IFwiXCIsXHJcbiAgICAgICAgICAgIGRhdGVFbmQ6IFwiXCJcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uY29sdW1ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NyZWF0ZWRfYXQnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICduYW1lJyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICduYW1lJyxcclxuICAgICAgICAgICAgICAgIGFsaWduOlwibGVmdFwiLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6XCJjb21tb24uTmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6XCI0MCVcIixcclxuICAgICAgICAgICAgICAgIGNlbGxDbGFzczpcIm5hbWUtY2VsbFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6XCJudW1iZXJcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6XCJwbGF5ZXJzX2NvdW50XCIsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uUGxheWVyc0NvdW50XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnbnVsbCcsXHJcbiAgICAgICAgICAgICAgICBub3RTb3J0OnRydWUsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xfcm93ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgb25lLXN0cmluZ1wiID4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biAgYnRuLWJsdWUgYnRuLXNtIFwiICAgdWliLXRvb2x0aXA9XCJ7e1xcJ3ZpcnR1YWxTY3JlZW5zLkF0dGFjaFBsYXllclRvb2x0aXBcXCd8aTE4bn19XCIgdG9vbHRpcC1wb3B1cC1kZWxheT1cIjEwMDBcIiBuZy1jbGljaz1cInZtLmFjdGlvbihcXCdhdHRhY2hQbGF5ZXJcXCcsIHtpZDpcXCcnICsgZnVsbC5pZCArICdcXCcsbmFtZTpcXCcnICsgZnVsbC5uYW1lICsgJ1xcJ30pXCI+PGkgY2xhc3M9XCJmYSAgZmEtY2hhaW5cIj48L2k+PC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biAgYnRuLXByaW1hcnkgYnRuLXNtIFwiICAgICAgICB1aWItdG9vbHRpcD1cInt7XFwnY29tbW9uLkluZm9Ub29sdGlwXFwnfGkxOG59fVwiICB0b29sdGlwLXBvcHVwLWRlbGF5PVwiMTAwMFwiICAgICAgICAgIG5nLWNsaWNrPVwidm0uYWN0aW9uKFxcJ2luZm9cXCcsXFwnJyArIGZ1bGwuaWQgKyAnXFwnKVwiPjxpIGNsYXNzPVwiZmEgIGZhLWluZm9cIj48L2k+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biAgYnRuLWRhbmdlciBidG4tc21cIiB1aWItdG9vbHRpcD1cInt7XFwnY29tbW9uLlJlbW92ZVRvb2x0aXBcXCd8aTE4bn19XCIgIHRvb2x0aXAtcG9wdXAtZGVsYXk9XCIxMDAwXCIgbmctY2xpY2s9XCJ2bS5hY3Rpb24oXFwncmVtb3ZlXFwnLFxcJycgKyBmdWxsLmlkICsgJ1xcJylcIj48aSBjbGFzcz1cImZhICBmYS1yZW1vdmVcIj48L2k+PC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbF9yb3c7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHZhciBsaW1pdHMgPSAwO1xyXG5cclxuXHJcbiAgICAgICAgdm0uYWN0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAoYWN0aW9uLCBpZCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImluZm9cIjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9PbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTW9kYWxTZXJ2aWNlLnNob3dSZW1vdmVNb2RhbChbaWRdLCBcInZpcnR1YWxTY3JlZW5zXCIpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGVDbGljayc6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5nb1RvT25lKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2NsaWNrTmFtZSc6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5nb1RvT25lKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2F0dGFjaFBsYXllcic6IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoUGxheWVyTW9kYWxTZXJ2aWNlLnNob3coaWQuaWQsIGlkLm5hbWUpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5nb1RvT25lID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgICRzdGF0ZS5nbygncGVyc29uYWxBY2NvdW50LnZpcnR1YWxTY3JlZW4ub25lJywge2lkOiBpZH0pXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgZmlyc3QgPSB0cnVlO1xyXG4gICAgICAgIHZtLnNlcnZlckRhdGEgPSBmdW5jdGlvbiBzZXJ2ZXJEYXRhKHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjaywgb1NldHRpbmdzKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgdmFyIHBhcmFtID0ge307XHJcbiAgICAgICAgICAgIHBhcmFtWydmaWx0ZXJbdHlwZV0nXSA9IFwic2hhcmVkXCI7XHJcbiAgICAgICAgICAgIGlmICh2bS5vcHRpb24ubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bJ2ZpbHRlcltuYW1lXSddID0gdm0ub3B0aW9uLm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIG9yZGVyID0gYW9EYXRhWzJdLnZhbHVlO1xyXG4gICAgICAgICAgICBpZiAob3JkZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbkluZGV4ID0gb3JkZXJbMF0uY29sdW1uO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpciA9IG9yZGVyWzBdLmRpcjtcclxuICAgICAgICAgICAgICAgIHZhciBuYW1lUGFyYW0gPSAnc29ydFsnICsgYW9EYXRhWzFdLnZhbHVlW2NvbHVtbkluZGV4XS5kYXRhICsgJ10nO1xyXG4gICAgICAgICAgICAgICAgcGFyYW1bbmFtZVBhcmFtXSA9IGRpcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJhbVsncGFnZVtvZmZzZXRdJ10gPSBhb0RhdGFbM10udmFsdWU7XHJcbiAgICAgICAgICAgIHBhcmFtWydwYWdlW2xpbWl0XSddID0gYW9EYXRhWzRdLnZhbHVlO1xyXG4gICAgICAgICAgICBsaW1pdHMgPSBwYXJhbVsncGFnZVtsaW1pdF0nXTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB2aXJ0dWFsU2NyZWVucy5nZXRMaXN0KHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2socmVzdWx0KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5zaG93V2FybmluZygnY29tbW9uLkZhaWxlZEdldCcpO1xyXG4gICAgICAgICAgICAgICAgZm5DYWxsYmFjayhyZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uaW50YW5jZUNhbGxiYWNrID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm9uUmVzZXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5uYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLmRhdGVTdGFydCA9IFwiXCI7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5kYXRlRW5kID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgIHZtLmluc3RhbmNlLnJlbG9hZERhdGEodHJ1ZSk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm9uQXBwbHkgPSBmdW5jdGlvbiAob3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5uYW1lID0gb3B0aW9uLm5hbWU7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5kYXRlU3RhcnQgPSBvcHRpb24uZGF0ZVN0YXJ0O1xyXG4gICAgICAgICAgICB2bS5vcHRpb24uZGF0ZUVuZCA9IG9wdGlvbi5kYXRlRW5kO1xyXG4gICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKHRydWUpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5vblNlbGVjdGVkID0gZnVuY3Rpb24gKGlkcywgYWxsKSB7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGVkSWRzID0gaWRzO1xyXG4gICAgICAgICAgICB2bS5hbGwgPSBhbGw7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ucmVtb3ZlUGxheWVycyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIHJlbW92ZU1vZGFsU2VydmljZS5zaG93UmVtb3ZlTW9kYWwodm0uc2VsZWN0ZWRJZHMsIFwidmlydHVhbFNjcmVlbnNcIikudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKHZtLmFsbCxmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0udW5zZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLnJlbG9hZCA9ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5pbnN0YW5jZS5yZWxvYWREYXRhKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNy4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25maWcuJGluamVjdCA9IFtcIiRzdGF0ZVByb3ZpZGVyXCJdO1xyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHN0YXRlXCIsIFwiZXJyb3JIYW5kbGVySGVscGVyXCIsIFwiVHlwZVNjcmVlblZpcnR1YWxTY3JlZW5cIiwgXCJBdWRpb1ByaW9yaXR5XCIsIFwidmlydHVhbFNjcmVlbnNcIiwgXCJ2aXJ0dWFsU2NyZWVuXCIsIFwicmVtb3ZlTW9kYWxTZXJ2aWNlXCIsIFwiZWRpdFNlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy52aXJ0dWFsU2NyZWVuc1wiKS5jb25maWcoY29uZmlnKTtcclxuICAgIGZ1bmN0aW9uIGNvbmZpZygkc3RhdGVQcm92aWRlcikge1xyXG4gICAgICAgICRzdGF0ZVByb3ZpZGVyXHJcbiAgICAgICAgICAgIC5zdGF0ZSgncGVyc29uYWxBY2NvdW50LnZpcnR1YWxTY3JlZW4ub25lJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL29uZS97aWR9JyxcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndmlydHVhbFNjcmVlbnMvcGFnZXMvdmlydHVhbFNjcmVlbi92aXJ0dWFsU2NyZWVuLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWxTY3JlZW46IFtcInZpcnR1YWxTY3JlZW5zXCIsIFwiJHN0YXRlUGFyYW1zXCIsIGZ1bmN0aW9uICh2aXJ0dWFsU2NyZWVucywgJHN0YXRlUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXJ0dWFsU2NyZWVucy5nZXQoJHN0YXRlUGFyYW1zLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJHN0YXRlLCBlcnJvckhhbmRsZXJIZWxwZXIsIFR5cGVTY3JlZW5WaXJ0dWFsU2NyZWVuLCBBdWRpb1ByaW9yaXR5LCB2aXJ0dWFsU2NyZWVucywgdmlydHVhbFNjcmVlbiwgcmVtb3ZlTW9kYWxTZXJ2aWNlLCBlZGl0U2VydmljZSkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS50eXBlU2NyZWVuVmlydHVhbFNjcmVlbiA9IFR5cGVTY3JlZW5WaXJ0dWFsU2NyZWVuO1xyXG5cclxuICAgICAgICB2bS5tb2RlbCA9IHZpcnR1YWxTY3JlZW47XHJcbiAgICAgICAgdm0uZWRpdE1vZGVsID0gZWRpdFNlcnZpY2UuZ2V0RWRpdE1vZGVsRm9yUmVzdEFuZ3VsYXJNb2RlbCh2bSk7XHJcblxyXG4gICAgICAgIHZtLm9uQ2hhbmdlID0gZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgICAgICB2bS5tb2RlbCA9IG9iai52YWx1ZTtcclxuXHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm9uU2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZpcnR1YWxTY3JlZW5zLnVwZGF0ZSh2bS5tb2RlbCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZtLm1vZGVsLCBcImF1ZGlvUHJpb3JpdHlcIiwge1xyXG4gICAgICAgICAgICBnZXQgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzb3J0ID0gdGhpcy5hcmVhcy5zb3J0KGNvbXBhcmVBcmVhc0F1ZGlvUHJpb3JpdHkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNvcnRbMF0udHlwZSA9PSAnYXVkaW8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhdWRpbyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bGxzY3JlZW4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgOmZ1bmN0aW9uKHZhbCl7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGlvJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFyZWFzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXVkaW9fcHJpb3JpdHkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRCeVR5cGUodGhpcy5hcmVhcywnYXVkaW8nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hdWRpb19wcmlvcml0eSA9IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdmdWxsc2NyZWVuJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFyZWFzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXVkaW9fcHJpb3JpdHkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRCeVR5cGUodGhpcy5hcmVhcywnZnVsbHNjcmVlbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF1ZGlvX3ByaW9yaXR5ID0gNTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2F1ZGlvUHJpb3JpdHk9dmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVBcmVhc0F1ZGlvUHJpb3JpdHkoYSwgYikge1xyXG4gICAgICAgICAgICByZXR1cm4gIGIuYXVkaW9fcHJpb3JpdHktIGEuYXVkaW9fcHJpb3JpdHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRCeVR5cGUoaXRlbXMsdHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXMuZmluZChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gaXRlbS50eXBlIHx8ICh0eXBlID09IFwidmlkZW9cIiAmJiBpdGVtLnR5cGUgPT0gJ2Z1bGxzY3JlZW4nKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2bS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2aXJ0dWFsU2NyZWVucy51cGRhdGUodm0ubW9kZWwpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZU1vZGFsU2VydmljZS5zaG93UmVtb3ZlTW9kYWwoW3ZtLm1vZGVsLmlkXSwgXCJ2aXJ0dWFsU2NyZWVuc1wiKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICRzdGF0ZS5nbyhcInBlcnNvbmFsQWNjb3VudC52aXJ0dWFsU2NyZWVuLmxpc3RcIilcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5iYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC52aXJ0dWFsU2NyZWVuLmxpc3QnKVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcInZpcnR1YWxTY3JlZW5zXCIsIFwiYXR0YWNoUGxheWxpc3RNb2RhbFwiLCBcImNhbXBhaWduc1wiLCBcIiRxXCIsIFwiY29uZmlybU1vZGFsU2VydmljZVwiLCBcIiRmaWx0ZXJcIiwgXCJsb2NhbGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy52aXJ0dWFsU2NyZWVuc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJhcmVhc1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXN0cmljdDogXCJFQVwiLFxyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgdmlydHVhbFNjcmVlbjogJzwnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndmlydHVhbFNjcmVlbnMvY29tcG9uZW50cy9hcmVhcy9hcmVhcy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIodmlydHVhbFNjcmVlbnMsIGF0dGFjaFBsYXlsaXN0TW9kYWwsIGNhbXBhaWducywgJHEsIGNvbmZpcm1Nb2RhbFNlcnZpY2UsICRmaWx0ZXIsIGxvY2FsZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgVXBkYXRlKCk7XHJcbiAgICAgICAgdm0uZGV0YWNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsb2NhbGUucmVhZHkoJ3ZpcnR1YWxTY3JlZW5zJykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJ3ZpcnR1YWxTY3JlZW5zLkRldGFjaFBsYXlsaXN0JyArICh2bS5zZWxlY3RlZElkcy5sZW5ndGggPiAxID8gXCJzXCIgOiBcIlwiKTtcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdyhrZXksIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5yZW1vdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0ZWRJZHMuZm9yRWFjaChmdW5jdGlvbiAoY2FtcGFpZ25JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FtcGFpZ24gPSB2bS5hbGxDYW1wYWlnbnMuZmluZChmdW5jdGlvbiAoY2FtcGFpZ24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1wYWlnbi5pZCA9PSBjYW1wYWlnbklkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbXBhaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhbXBhaWducy5kZXRhY2hBcmVhcyhjYW1wYWlnbi5pZE9yaWdpbiwgW2NhbXBhaWduLmFyZWEuaWRdKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ucmVtb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgbnVsbCx7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbFNjcmVlbjogdm0udmlydHVhbFNjcmVlbi5uYW1lXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uYXR0YWNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKGFyZWFzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXR0YWNoUGxheWxpc3RNb2RhbC5zaG93KHZtLnZpcnR1YWxTY3JlZW4uaWQsIHZtLnZpcnR1YWxTY3JlZW4ubmFtZSwgYXJlYXMpO1xyXG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIFVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zZWxlY3RlZCA9IHt9O1xyXG4gICAgICAgIHZtLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgICAgIHZtLnNlbGVjdGVkSWRzID0gW107XHJcblxyXG4gICAgICAgIHZtLmlzU2VsZWN0QW55ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodm0uc2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHZtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uc2VsZWN0ZWRbcF0gPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gVXBkYXRlKCkge1xyXG4gICAgICAgICAgICB2bS5wcm9taXNlID0gdmlydHVhbFNjcmVlbnMuZ2V0QXJlYXModm0udmlydHVhbFNjcmVlbi5pZCk7XHJcblxyXG4gICAgICAgICAgICB2bS5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKGFyZWFzKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBjb3VudGVyID0gMDtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICAgICAgICAgIHZtLmFsbENhbXBhaWducyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgYXJlYXMuZm9yRWFjaChmdW5jdGlvbiAoYXJlYSwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYW1wYWlnbnMgPSBhcmVhLmNhbXBhaWducy5tYXAoZnVuY3Rpb24gKGNhbXBhaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduID0gYW5ndWxhci5jb3B5KGNhbXBhaWduKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ24uaWRPcmlnaW4gPSBjYW1wYWlnbi5pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ24uaWQgPSBjYW1wYWlnbi5pZCArIGFyZWEuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduLmNoaWxkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ24uc2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduLmFyZWEgPSBhcmVhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtcGFpZ247XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYS5pc09wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZWEuc2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uYWxsQ2FtcGFpZ25zID0gdm0uYWxsQ2FtcGFpZ25zLmNvbmNhdChjYW1wYWlnbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoY2FtcGFpZ25zKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RlZFtpdGVtLmlkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB2bS5hcmVhcyA9IHJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJlYXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHZtLnRvZ2dsZUFsbCA9IHRvZ2dsZUFsbDtcclxuICAgICAgICB2bS50b2dnbGVPbmUgPSB0b2dnbGVPbmU7XHJcblxyXG4gICAgICAgIHZtLnRvZ2dsZUFyZWEgPSB0b2dnbGVBcmVhO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB0b2dnbGVBcmVhKGFyZWEpIHtcclxuICAgICAgICAgICAgYXJlYS5jYW1wYWlnbnMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zaG93ID0gIWl0ZW0uc2hvdztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZUFsbChzZWxlY3RBbGwsIHNlbGVjdGVkSXRlbXMpIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNbaWRdID0gc2VsZWN0QWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0ZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZU9uZShzZWxlY3RlZEl0ZW1zLCBhcmVhKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWFyZWEuY2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGFyZWEuY2FtcGFpZ25zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zW2l0ZW0uaWRdID0gc2VsZWN0ZWRJdGVtc1thcmVhLmlkXVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGlkIGluIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRJdGVtc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0ZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2bS5zZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBvblNlbGVjdGVkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb25TZWxlY3RlZCgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gW107XHJcbiAgICAgICAgICAgIHZhciBhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiB2bS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnNlbGVjdGVkW2lkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGVkSWRzID0gc2VsZWN0ZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy52aXJ0dWFsU2NyZWVuc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJhdHRhY2hQbGF5ZXJcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIHZpcnR1YWxTY3JlZW5JZDogJ0AnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJAbmFtZVZpcnR1YWxTY3JlZW5cIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvYXR0YWNoUGxheWVyL2F0dGFjaFBsYXllci5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWydwbGF5ZXJzJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihwbGF5ZXJzKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0uY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgdm0udW5DaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgdm0uc2VsZWN0ZWQgPSB7fTtcclxuICAgICAgICB2bS5tb2RlbCA9XHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgcGFyYW06IHtcclxuICAgICAgICAgICAgICAgIFwiZmlsdGVyW25hbWVdXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBcInBhZ2VbbGltaXRdXCI6IDEwMCxcclxuICAgICAgICAgICAgICAgIFwicGFnZVtvZmZzZXRdXCI6IDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaXNJbml0OiBmYWxzZSxcclxuICAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1bXCJmaWx0ZXJbbmFtZV1cIl07XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBuYW1lKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbVtcImZpbHRlcltuYW1lXVwiXSA9IHZhbDtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAgICAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdmFyIHBhcmFtID0gYW5ndWxhci5jb3B5KHZtLm1vZGVsLnBhcmFtKTtcclxuICAgICAgICAgICAgaWYgKHZtLm1vZGVsLm5hbWUubGVuZ3RoID09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbVtcImZpbHRlcltuYW1lXVwiXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHZtLnByb21pc2U9cGxheWVycy5nZXRMaXN0KHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHAgaW4gdm0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdm0uc2VsZWN0ZWRbcF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uZXhpc3RGcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoaXRlbS52aXJ0dWFsX3NjcmVlbl9pZCAmJiBpdGVtLnZpcnR1YWxfc2NyZWVuX2lkICE9ICcnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5leGlzdEZyZWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm5vdEF0dGFjaCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNlbGVjdGVkW2l0ZW0uaWRdID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnZpcnR1YWxfc2NyZWVuX2lkICE9IHZtLnZpcnR1YWxTY3JlZW5JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF0dGFjaFRvT3RoZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hdHRhY2hUb0N1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZtLnBsYXllcnMgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdm0uaXNTZWxlY3RBbnkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5zZWxlY3RBbGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gdm0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zZWxlY3RlZFtwXSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS50b2dnbGVBbGwgPSB0b2dnbGVBbGw7XHJcbiAgICAgICAgdm0udG9nZ2xlT25lID0gdG9nZ2xlT25lO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB0b2dnbGVBbGwoc2VsZWN0QWxsLCBzZWxlY3RlZEl0ZW1zKSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiBzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zW2lkXSA9IHNlbGVjdEFsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvblNlbGVjdGVkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB0b2dnbGVPbmUoc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiBzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkSXRlbXNbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgb25TZWxlY3RlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG9uU2VsZWN0ZWQoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gdm0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zZWxlY3RlZFtpZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5wdXNoKGlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiBzZWxlY3RlZH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy52aXJ0dWFsU2NyZWVuc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJhdHRhY2hlZFBsYXllcnNPbGRcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6IFwiRUFcIixcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIHZpcnR1YWxTY3JlZW46ICc8J1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvYXR0YWNoZWRQbGF5ZXJzL2F0dGFjaGVkUGxheWVycy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWyd2aXJ0dWFsU2NyZWVucycsICdjb25maXJtTW9kYWxTZXJ2aWNlJywgJ3BsYXllcnMnLCAnJHEnLCAnYXR0YWNoUGxheWVyTW9kYWxTZXJ2aWNlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcih2aXJ0dWFsU2NyZWVucywgY29uZmlybU1vZGFsU2VydmljZSwgcGxheWVycywgJHEsIGF0dGFjaFBsYXllck1vZGFsU2VydmljZSkge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLnByb21pc2U9dmlydHVhbFNjcmVlbnMuZ2V0UGxheWVycyh2bS52aXJ0dWFsU2NyZWVuLmlkKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zZWxlY3RlZFtpdGVtLmlkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdm0ucGxheWVycyA9IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHZtLmRldGFjaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ucmVtb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgY29weUlkcyA9IGFuZ3VsYXIuY29weSh2bS5zZWxlY3RlZElkcyk7XHJcbiAgICAgICAgICAgIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdyhcImJsb2Nrcy5Db25maXJtQWN0aW9uTW9kYWxIaW50XCIpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goY29weUlkcywgZnVuY3Rpb24gKGl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gcGxheWVycy5nZXQoaXRlbSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudmlydHVhbF9zY3JlZW5faWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcnMudXBkYXRlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHZtLnByb21pc2UgPSRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnJlbW92aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goY29weUlkcywgZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxheWVyID0gdm0ucGxheWVycy5maW5kKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT09IGlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZtLnNlbGVjdGVkW2lkXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5wbGF5ZXJzLnNwbGljZSh2bS5wbGF5ZXJzLmluZGV4T2YocGxheWVyKSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNlbGVjdGVkSWRzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ucmVtb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5yZW1vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uYXR0YWNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5hdHRhY2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBhdHRhY2hQbGF5ZXJNb2RhbFNlcnZpY2Uuc2hvdyh2bS52aXJ0dWFsU2NyZWVuLmlkLCB2bS52aXJ0dWFsU2NyZWVuLm5hbWUpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHBsYXllcnMuZ2V0KGlkKSlcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdm0ucHJvbWlzZSA9ICRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ucGxheWVycy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RlZFtpdGVtLmlkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmF0dGFjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5hdHRhY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5zZWxlY3RlZCA9IHt9O1xyXG4gICAgICAgIHZtLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgICAgIHZtLnNlbGVjdGVkSWRzID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgdm0uaXNTZWxlY3RBbnkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5zZWxlY3RBbGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gdm0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zZWxlY3RlZFtwXSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS50b2dnbGVBbGwgPSB0b2dnbGVBbGw7XHJcbiAgICAgICAgdm0udG9nZ2xlT25lID0gdG9nZ2xlT25lO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB0b2dnbGVBbGwoc2VsZWN0QWxsLCBzZWxlY3RlZEl0ZW1zKSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiBzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zW2lkXSA9IHNlbGVjdEFsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvblNlbGVjdGVkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB0b2dnbGVPbmUoc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpZCBpbiBzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkSXRlbXNbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0uc2VsZWN0QWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgb25TZWxlY3RlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG9uU2VsZWN0ZWQoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gdm0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zZWxlY3RlZFtpZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5wdXNoKGlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZElkcyA9IHNlbGVjdGVkO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoJ2F0dGFjaFBsYXllck1vZGFsQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpXHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gWyckdWliTW9kYWxJbnN0YW5jZScsICdpZCcsICduYW1lJywgJ3ZpcnR1YWxTY3JlZW5zJywgJ2Vycm9ySGFuZGxlckhlbHBlciddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlciggJHVpYk1vZGFsSW5zdGFuY2UsIGlkLCBuYW1lLCB2aXJ0dWFsU2NyZWVucywgZXJyb3JIYW5kbGVySGVscGVyKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIHZtLmlkID0gaWQ7XHJcbiAgICAgICAgdm0ubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdm0uc2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmlydHVhbFNjcmVlbnMuYXR0YWNoUGxheWVyKGlkLCB2bS5zZWxlY3RlZCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSggdm0uc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNS4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2F0dGFjaFBsYXllck1vZGFsU2VydmljZScsIHNlcnZpY2UpXHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCJdO1xyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkdWliTW9kYWwpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zaG93ID0gZnVuY3Rpb24gKGlkLG5hbWUpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAndmlydHVhbFNjcmVlbnMvY29tcG9uZW50cy9hdHRhY2hQbGF5ZXJNb2RhbC9hdHRhY2hQbGF5ZXJNb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdhdHRhY2hQbGF5ZXJNb2RhbENvbnRyb2xsZXIgYXMgdm0nLFxyXG4gICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdjb250cm9sLW1vZGFsJyxcclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBpZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy52aXJ0dWFsU2NyZWVuc1wiKVxyXG4gICAgICAgIC5jb21wb25lbnQoXCJhdHRhY2hQbGF5ZXJQb3BvdmVyXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICB2aXJ0dWFsU2NyZWVuSWQ6ICdAJyxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcIkBcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvYXR0YWNoUGxheWVyL2F0dGFjaFBsYXllci5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gWydwbGF5ZXJzJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihwbGF5ZXJzKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0ucG9zaXRpb25Qb3BvdmVyID0gdm0ucG9zaXRpb24gPT0gXCJcIiA/IFwiYm90dG9tLXJpZ2h0XCIgOiB2bS5wb3NpdGlvbjtcclxuICAgICAgICB2bS5wb3BvdmVyID0ge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvYXR0YWNoUGxheWVyL2F0dGFjaFBsYXllclBvcG92ZXIuaHRtbCdcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5tb2RlbCA9XHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgcGFyYW06IHtcclxuICAgICAgICAgICAgICAgIFwiZmlsdGVyW25hbWVdXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBcInBhZ2VbbGltaXRdXCI6IDEwLFxyXG4gICAgICAgICAgICAgICAgXCJwYWdlW29mZnNldF1cIjogMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpc0luaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBvcGVuOiBmYWxzZSxcclxuICAgICAgICAgICAgZ2V0IGlzT3BlbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW47XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBpc09wZW4odmFsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB0cnVlICYmICF0aGlzLmlzSW5pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGluaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSW5pdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSB2YWw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1bXCJmaWx0ZXJbbmFtZV1cIl07XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCBuYW1lKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbVtcImZpbHRlcltuYW1lXVwiXSA9IHZhbDtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICAgICAgdXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7XHJcbiAgICAgICAgICAgIHZtLmxvYWRpbmcgPXRydWU7XHJcbiAgICAgICAgICAgcGxheWVycy5nZXRMaXN0KHZtLm1vZGVsLnBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHZtLnBsYXllcnMgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPWZhbHNlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE5LjA3LjIwMTYuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5jb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxJbnN0YW5jZVwiLCBcImlkXCIsIFwibmFtZVwiLCBcImFyZWFzXCIsIFwiY2FtcGFpZ25zXCJdO1xyXG5hbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgIC5zZXJ2aWNlKCdhdHRhY2hQbGF5bGlzdE1vZGFsJywgc2VydmljZSk7XHJcblxyXG5zZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbmZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAoaWQsIG5hbWUsIGFyZWFzKSB7XHJcbiAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndmlydHVhbFNjcmVlbnMvY29tcG9uZW50cy9hdHRhY2hQbGF5bGlzdE1vZGFsL2F0dGFjaFBsYXlsaXN0TW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiLFxyXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ2NvbnRyb2wtbW9kYWwnLFxyXG4gICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICBpZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgYXJlYXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJlYXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIGlkLCBuYW1lLCBhcmVhcywgY2FtcGFpZ25zKSB7XHJcbiAgICBcIm5nSW5qZWN0XCJcclxuICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgdm0ubW9kZWwgPSB7XHJcblxyXG4gICAgICAgIF9hcmVhOiBcIlwiLFxyXG4gICAgICAgIHNldCBhcmVhKHZhbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hcmVhID0gdmFsO1xyXG4gICAgICAgICAgICB2YXIgYXJlYSA9IGFyZWFzLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gdmFsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHZtLmFsbENhbXBhaWducylcclxuICAgICAgICAgICAgICAgIHZtLmNhbXBhaWducyA9IHZtLmFsbENhbXBhaWducy5maWx0ZXIoZnVuY3Rpb24gKGNhbXBhaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZWEuY2FtcGFpZ25zLmZpbmQoZnVuY3Rpb24gKGFyZWFDYW1wYWlnbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZWFDYW1wYWlnbi5pZCA9PSBjYW1wYWlnbi5pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYodmFsPT0nd2lkZ2V0JylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm0uY2FtcGFpZ25zID0gdm0uY2FtcGFpZ25zLmZpbHRlcihmdW5jdGlvbiAoY2FtcGFpZ24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtcGFpZ24uZXhpc3RIdG1sO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZih2bS5jYW1wYWlnbnMubGVuZ3RoPjApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLmNhbXBhaWduSWQgPXZtLmNhbXBhaWduc1swXS5pZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICBnZXQgYXJlYSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FyZWE7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgdm0uc2VsZWN0T3B0aW9uID0ge1xyXG4gICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiZm9ybS13aGl0ZVwiLFxyXG4gICAgICAgIG1pbmltdW1SZXN1bHRzRm9yU2VhcmNoOiAtMVxyXG4gICAgfTtcclxuXHJcbiAgICB2bS5pZCA9IGlkO1xyXG4gICAgdm0ubmFtZSA9IG5hbWU7XHJcbiAgICB2bS5hcmVhcyA9IGFyZWFzO1xyXG5cclxuXHJcbiAgICB2YXIgcGFyYW0gPSB7fTtcclxuICAgIHBhcmFtW1wicGFnZVtsaW1pdF1cIl0gPSA1MDA7XHJcbiAgICBwYXJhbVtcInBhZ2Vbb2Zmc2V0XVwiXSA9IDA7XHJcblxyXG4gICAgY2FtcGFpZ25zLmdldExpc3RGb3JBcmVhKHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICB2bS5hbGxDYW1wYWlnbnMgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICB2bS5tb2RlbC5hcmVhID0gYXJlYXNbMF0udHlwZTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICB2bS5zYXZlID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB2bS5sb2FkaW5nPXRydWU7XHJcbiAgICAgICAgdmFyIGFyZWEgPSBhcmVhcy5maW5kKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gdm0ubW9kZWwuYXJlYTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjYW1wYWlnbnMuYXR0YWNoQXJlYXModm0ubW9kZWwuY2FtcGFpZ25JZCxbYXJlYS5pZF0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5sb2FkaW5nPWZhbHNlO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgfTtcclxuICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgIH1cclxufX0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnZpcnR1YWxTY3JlZW5zXCIpXHJcbiAgICAgICAgLmNvbXBvbmVudChcInZpcnR1YWxTY3JlZW5zU2VhcmNoXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVBXCIsXHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBvbkFwcGx5OiAnJicsXHJcbiAgICAgICAgICAgICAgICBvblJlc2V0OiAnJicsXHJcbiAgICAgICAgICAgICAgICBkYXRlU3RhcnQ6IFwiPGRhdGVTdGFydFwiLFxyXG4gICAgICAgICAgICAgICAgZGF0ZUVuZDogXCI8ZGF0ZUVuZFwiLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogXCI8bmFtZVwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAndmlydHVhbFNjcmVlbnMvY29tcG9uZW50cy92aXJ0dWFsU2NyZWVuc1NlYXJjaC92aXJ0dWFsU2NyZWVucy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLmZpbHRlclBvcG92ZXIgPSB7XHJcblxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3ZpcnR1YWxTY3JlZW5zL2NvbXBvbmVudHMvdmlydHVhbFNjcmVlbnNTZWFyY2gvdmlydHVhbFNjcmVlbnNGaWx0ZXIuaHRtbCdcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKiAgdm0udGFncyA9IGFuZ3VsYXIuY29weSh2bS50YWdzQ3VycmVudCk7XHJcbiAgICAgICAgIHZtLm5hbWUgPSBhbmd1bGFyLmNvcHkodm0ubmFtZUN1cnJlbnQpOyovXHJcblxyXG5cclxuICAgICAgICB2bS5hcHBseSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIHZtLm9uQXBwbHkoe1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZVN0YXJ0OiB2bS5kYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUVuZDogdm0uZGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB2bS5uYW1lXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdm0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ubmFtZSA9ICcnO1xyXG4gICAgICAgICAgICB2bS5kYXRlU3RhcnQgPSAnJztcclxuICAgICAgICAgICAgdm0uZGF0ZUVuZCA9ICcnO1xyXG4gICAgICAgICAgICB2bS5vblJlc2V0KCk7XHJcblxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5jb250cm9sID0ge1xyXG4gICAgICAgICAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5uYW1lO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgbmFtZSh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ubmFtZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdm0uYXBwbHkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5rZXlVcCA9IGZ1bmN0aW9uICgkZXZlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICgkZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG5cclxuICAgICAgICAgICAgICAgIHZtLmFwcGx5KCk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uaXNGaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5kYXRlU3RhcnQgIT0gJycgfHwgdm0uZGF0ZUVuZCAhPSAnJztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5jb3VudEZpbHRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICBpZiAodm0uZGF0ZVN0YXJ0ICE9ICcnIHx8IHZtLmRhdGVFbmQgIT0gJycpIHtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmlzT25seUZpbHRlck5hbWUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5uYW1lLmxlbmd0aCA+IDAgJiYgIXZtLmlzRmlsdGVyKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5pc0FueUZpbHRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLmlzRmlsdGVyKCkgfHwgdm0ubmFtZS5sZW5ndGggPiAwO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIzLjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuY29udHJvbGxlcignY29udHJvbE9uZUl0ZW1Db250cm9sbGVyJywgY29udHJvbGxlcilcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIiwgXCIkc2NvcGVcIiwgJyR1aWJNb2RhbEluc3RhbmNlJywgJ2lkJywgJ3R5cGUnLCAnJHEnLCAnZXJyb3JIYW5kbGVySGVscGVyJywgJ2NvbnRyb2xUYWcnXTtcclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsLCAkc2NvcGUsICR1aWJNb2RhbEluc3RhbmNlLCBpZCwgdHlwZSwgJHEsIGVycm9ySGFuZGxlckhlbHBlciwgY29udHJvbFRhZykge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS50eXBlID0gdHlwZTtcclxuICAgICAgICB2YXIgY3VycmVudENvbnRyb2xUYWcgPSBuZXcgY29udHJvbFRhZyh0eXBlKTtcclxuXHJcbiAgICAgICAgY3VycmVudENvbnRyb2xUYWcuZ2V0UmVzb3VyY2UoaWQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB2bS5yZXNvdXJjZSA9IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdm0uc2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ubG9hZGluZz10cnVlO1xyXG4gICAgICAgICAgICBjdXJyZW50Q29udHJvbFRhZy51cGRhdGVSZXNvdXJjZSh2bS5yZXNvdXJjZSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMjMuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdjb250cm9sTWFueUl0ZW1Db250cm9sbGVyJywgY29udHJvbGxlcilcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIiwgXCIkc2NvcGVcIiwgJyR1aWJNb2RhbEluc3RhbmNlJywgJ3NlbGVjdGVkJywgJ3R5cGUnLCAnY29udHJvbFRhZycsICckcScsICdlcnJvckhhbmRsZXJIZWxwZXInLCdjb25maXJtTW9kYWxTZXJ2aWNlJ107XHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKCR1aWJNb2RhbCwgJHNjb3BlLCAkdWliTW9kYWxJbnN0YW5jZSwgc2VsZWN0ZWQsIHR5cGUsIGNvbnRyb2xUYWcsICRxLCBlcnJvckhhbmRsZXJIZWxwZXIsY29uZmlybU1vZGFsU2VydmljZSkge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0udGFncz1bXTtcclxuICAgICAgICB2bS5hY3Rpb249XCJhZGRcIjtcclxuICAgICAgICB2bS50eXBlID0gdHlwZTtcclxuICAgICAgICB2YXIgY3VycmVudENvbnRyb2xUYWcgPSBuZXcgY29udHJvbFRhZyh0eXBlKTtcclxuICAgICAgICBcclxuICAgICAgICB2bS5zYXZlPWZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ubG9hZGluZyA9dHJ1ZTtcclxuICAgICAgICAgICAgc3dpdGNoICh2bS5hY3Rpb24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJhZGRcIjpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udHJvbFRhZy5hZGQoc2VsZWN0ZWQsdm0udGFncykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybU1vZGFsU2VydmljZS5zaG93KFwiYmxvY2tzLkNvbmZpcm1BY3Rpb25Nb2RhbEhpbnRcIikudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250cm9sVGFnLnJlbW92ZShzZWxlY3RlZCx2bS50YWdzKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn0pKCk7IiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJkYXRlSGVscGVyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImNvbXBsZXhSYW5nZURhdGVwaWNrZXJcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgbWF4UmFuZ2U6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IFwiJlwiLFxyXG4gICAgICAgICAgICAgICAgbm90U2VsZWN0ZWQ6XCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvblJlc2V0OiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2RhdGUvY29tcGxleFJhbmdlRGF0ZXBpY2tlci9jb21wbGV4UmFuZ2VEYXRlcGlja2VyLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihkYXRlSGVscGVyKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLmZpbHRlclBvcG92ZXIgPSB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZGF0ZS9jb21wbGV4UmFuZ2VEYXRlcGlja2VyL2NvbXBsZXhSYW5nZURhdGVwaWNrZXJQb3BvdmVyLmh0bWwnXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm1vZGVsID0ge1xyXG4gICAgICAgICAgICBfcGVyaW9kOiBcIlwiLFxyXG4gICAgICAgICAgICBjdXN0b21TdGFydERhdGU6IG51bGwsXHJcbiAgICAgICAgICAgIGN1c3RvbUVuZERhdGU6IG51bGwsXHJcbiAgICAgICAgICAgIHNldCBwZXJpb2QodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wZXJpb2QgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0b2RheVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmVuZERhdGUgPSBtb21lbnQoKS50b0RhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc3RhcnREYXRlID0gbW9tZW50KCkuYWRkKC0xLCAnZGF5cycpLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxhc3QzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc3RhcnREYXRlID0gbW9tZW50KCkuYWRkKC0zLCAnZGF5cycpLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5lbmREYXRlID0gbW9tZW50KCkudG9EYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwid2Vla1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLmFkZCgtNywgJ2RheXMnKS50b0RhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZW5kRGF0ZSA9IG1vbWVudCgpLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc3RhcnREYXRlID0gbW9tZW50KCkuYWRkKC0xLCAnbW9udGgnKS50b0RhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZW5kRGF0ZSA9IG1vbWVudCgpLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImN1c3RvbVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bS5tYXhSYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heERhdGUgPSBtb21lbnQodm0uc3RhcnREYXRlKS5hZGQodm0ubWF4UmFuZ2UudmFsLCB2bS5tYXhSYW5nZS50eXBlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb21lbnQodm0uZW5kRGF0ZSkgPiBtYXhEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZW5kRGF0ZSA9IG1heERhdGUudG9EYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXN0b21FbmREYXRlID0gbWF4RGF0ZS50b0RhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsICE9ICdjdXN0b20nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXN0b21TdGFydERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tRW5kRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVSYW5nZURpc3BsYXkoKTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHtzdGFydERhdGU6IHZtLnN0YXJ0RGF0ZSwgZW5kRGF0ZTogdm0uZW5kRGF0ZX0pO1xyXG4gICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgZ2V0IHBlcmlvZCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wZXJpb2Q7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVSYW5nZURpc3BsYXkoKSB7XHJcbiAgICAgICAgICAgIHZtLnJhbmdlID0gZGF0ZUhlbHBlci5nZXRSYW5nZVRleHQodm0uc3RhcnREYXRlLCB2bS5lbmREYXRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLm9uQ2hhbmdlRGF0ZXBpY2tlciA9IGZ1bmN0aW9uIChzdGFydERhdGUsIGVuZERhdGUpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuY3VzdG9tU3RhcnREYXRlID0gc3RhcnREYXRlO1xyXG4gICAgICAgICAgICB2bS5tb2RlbC5jdXN0b21FbmREYXRlID0gZW5kRGF0ZTtcclxuICAgICAgICAgICAgdm0uc3RhcnREYXRlID0gc3RhcnREYXRlO1xyXG4gICAgICAgICAgICB2bS5lbmREYXRlID0gZW5kRGF0ZTtcclxuICAgICAgICAgICAgdm0ubW9kZWwucGVyaW9kID0gJ2N1c3RvbSc7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ucmVzZXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnN0YXJ0RGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHZtLmVuZERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICB2bS5tb2RlbC5jdXN0b21TdGFydERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICB2bS5tb2RlbC5jdXN0b21FbmREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgdm0ubW9kZWwucGVyaW9kID0gJyc7XHJcbiAgICAgICAgICAgIHZtLm9uUmVzZXQoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5zdGFydERhdGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdm0uc3RhcnREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuY3VzdG9tU3RhcnREYXRlID0gdm0uc3RhcnREYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdm0uZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmN1c3RvbUVuZERhdGUgPSB2bS5lbmREYXRlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdXBkYXRlUmFuZ2VEaXNwbGF5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG59KSgpO1xyXG5cclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTUuMDQuMjAxNi5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDA3LjA0LjIwMTYuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNS4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImRhdGVwaWNrZXJcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgZGF0ZTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogXCImXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9kYXRlL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImRhdGVwaWNrZXJMaWdodFwiLCBjb21wb25lbnRMaWdodCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnRMaWdodCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgZGF0ZTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBcIjxcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2RhdGUvZGF0ZXBpY2tlci9kYXRlcGlja2VyTGlnaHQuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnJGVsZW1lbnQnLCckc2NvcGUnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRlbGVtZW50LCRzY29wZSkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciBkYXRlUGlja2VyRWxlbSA9ICRlbGVtZW50LmZpbmQoJy5pbnB1dC1kYXRlcmFuZ2UnKTtcclxuICAgICAgICB2YXIgZGF0ZUZpZWxkID0gZGF0ZVBpY2tlckVsZW0uZmluZCgnLmRhdGUnKTtcclxuXHJcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImJvdHRvbSBhdXRvXCIsXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcjogXCIucGFnZS1jb250ZW50XCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh2bS5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKG9wdGlvbnMsIHZtLm9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZGF0ZXBpY2tlciA9IGRhdGVQaWNrZXJFbGVtLmJvb3RzdHJhcERQKG9wdGlvbnMpO1xyXG4gICAgICAgIHZhciBkaXNhYmxlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICBkYXRlcGlja2VyLm9uKCdjaGFuZ2VEYXRlJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKCFkaXNhYmxlRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlID0gZGF0ZUZpZWxkLmJvb3RzdHJhcERQKCdnZXREYXRlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZGF0ZSA9IGRhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiBkYXRlfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRhdGVwaWNrZXIub24oJ2NsZWFyRGF0ZScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZGlzYWJsZUV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGRhdGVGaWVsZC5ib290c3RyYXBEUCgnZ2V0RGF0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmRhdGUgPSBkYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogZGF0ZX0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLmRhdGUpIHtcclxuICAgICAgICAgICAgICAgIGRpc2FibGVFdmVudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uZGF0ZSAmJiB2bS5kYXRlICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlRmllbGQuYm9vdHN0cmFwRFAoJ3NldERhdGUnLCBtb21lbnQudXRjKHZtLmRhdGUpLnRvRGF0ZSgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVGaWVsZC5ib290c3RyYXBEUCgnY2xlYXJEYXRlcycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZUV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSkoKTtcclxuXHJcbiIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJGVsZW1lbnRcIiwgXCJsb2NhbGVcIiwgXCIkc2NvcGVcIiwgXCIkdGltZW91dFwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJkYXRldGltZXBpY2tlclwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBkYXRlOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIGVtcHR5VmFsdWU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgbWluRGF0ZTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBtYXhEYXRlOiBcIjxcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2RhdGUvZGF0ZXRpbWVwaWNrZXIvZGF0ZXRpbWVwaWNrZXIuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRlbGVtZW50LCBsb2NhbGUsICRzY29wZSwgJHRpbWVvdXQpIHtcclxuXHJcbiAgICAgICAgXCJuZ0luamVjdFwiXHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZhciBkYXRlRmllbGQgPSAkZWxlbWVudC5maW5kKCcuZGF0ZScpO1xyXG4gICAgICAgIHZhciBsb2NhbGUgPSBsb2NhbGUuZ2V0TG9jYWxlKCk7XHJcbiAgICAgICAgdmFyIG9wdGlvbiA9ICQudGltZXBpY2tlci5yZWdpb25hbFtsb2NhbGVdO1xyXG5cclxuICAgICAgICAkLmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoJC5kYXRlcGlja2VyLnJlZ2lvbmFsW2xvY2FsZV0pO1xyXG5cclxuICAgICAgICBvcHRpb24gPSBhbmd1bGFyLmV4dGVuZCh7XHJcbiAgICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoZGF0ZXRpbWVUZXh0LCBkYXRlcGlja2VySW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZUV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlID09ICdydScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGUgPSBtb21lbnQoZGF0ZXRpbWVUZXh0LCBcIkRELk1NLllZWVkgaGg6bW1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRlID0gbW9tZW50KGRhdGV0aW1lVGV4dCwgXCJNTS9ERC9ZWVlZIGhoOm1tXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm0ubWluRGF0ZSAmJiB2bS5kYXRlIDwgbW9tZW50KHZtLm1pbkRhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRlID0gbW9tZW50KHZtLm1pbkRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bS5tYXhEYXRlICYmIHZtLmRhdGUgPiBtb21lbnQodm0ubWF4RGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGUgPSBtb21lbnQodm0ubWF4RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiB2bS5kYXRlLnV0YygpLmZvcm1hdCgpfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sIG9wdGlvbik7XHJcbiAgICAgICAgdmFyIGRhdGVwaWNrZXIgPSBkYXRlRmllbGQuZGF0ZXRpbWVwaWNrZXIob3B0aW9uKTtcclxuXHJcblxyXG4gICAgICAgIHZhciBkaXNhYmxlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICBkYXRlRmllbGQuY2hhbmdlKGZ1bmN0aW9uIChldikge1xyXG4gICAgICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2Lm9yaWdpbmFsRXZlbnQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlID09ICdydScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGF0ZSA9IG1vbWVudCh2YWwsIFwiREQuTU0uWVlZWSBoaDptbVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGUgPSBtb21lbnQodmFsLCBcIk1NL0REL1lZWVkgaGg6bW1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodm0ubWluRGF0ZSAmJiB2bS5kYXRlIDwgbW9tZW50KHZtLm1pbkRhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLmRhdGUgPSBtb21lbnQodm0ubWluRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZtLm1heERhdGUgJiYgdm0uZGF0ZSA+IG1vbWVudCh2bS5tYXhEYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRlID0gbW9tZW50KHZtLm1heERhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdm0uZGF0ZS51dGMoKS5mb3JtYXQoKX0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHNldERhdGUoKSB7XHJcbiAgICAgICAgICAgIGRpc2FibGVFdmVudCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh2bS5kYXRlICYmIHZtLmRhdGUgIT0gXCJcIiAmJiB2bS5kYXRlICE9IFwiMDAwMC0wMC0wMCAwMDowMDowMFwiKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlRmllbGQuZGF0ZXBpY2tlcignc2V0RGF0ZScsIG1vbWVudC51dGModm0uZGF0ZSkudG9EYXRlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGVGaWVsZC5kYXRlcGlja2VyKCdzZXREYXRlJywgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uZW1wdHlWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVGaWVsZC52YWwodm0uZW1wdHlWYWx1ZSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGlzYWJsZUV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5kYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBzZXREYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmoubWluRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLm1pbkRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1vbWVudC5pc01vbWVudCh2bS5taW5EYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5taW5EYXRlID0gbW9tZW50LnV0Yyh2bS5taW5EYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vbWVudCh2bS5kYXRlKSA8IG1vbWVudCh2bS5taW5EYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5kYXRlID0gbW9tZW50KHZtLm1pbkRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdm0uZGF0ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLm1heERhdGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5tYXhEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb21lbnQuaXNNb21lbnQodm0ubWF4RGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWF4RGF0ZSA9IG1vbWVudC51dGModm0ubWF4RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb21lbnQodm0uZGF0ZSkgPiBtb21lbnQodm0ubWF4RGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uZGF0ZSA9IG1vbWVudCh2bS5tYXhEYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHZtLmRhdGV9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn0pKCk7XHJcblxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyNC4wNi4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCJsb2NhbGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuc2VydmljZSgnZGF0ZUhlbHBlcicsIHNlcnZpY2UpO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKGxvY2FsZSkge1xyXG5cclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIG5vdyA9IFwiXCI7XHJcblxyXG4gICAgICAgIGxvY2FsZS5yZWFkeShcImJsb2Nrc1wiKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbm93ID0gbG9jYWxlLmdldFN0cmluZyhcImJsb2Nrcy5Ob3dcIik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGdldFJhbmdlVGV4dDpnZXRSYW5nZVRleHRcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZ1bmN0aW9uIGdldFJhbmdlVGV4dChzdGFydERhdGUsZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICB2YXIgcmFuZ2U9XCJcIjtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlbmREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZS5nZXRUaW1lKCkgPCBtb21lbnQoKS50b0RhdGUoKS5nZXRUaW1lKCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gZ2V0TW9tZW50RGF0ZUZvcm1hdChzdGFydERhdGUpICsgXCIgLSBcIiArIG5vdztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBub3cgKyBcIiAtIFwiICsgZ2V0TW9tZW50RGF0ZUZvcm1hdChzdGFydERhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gZ2V0TW9tZW50RGF0ZUZvcm1hdChzdGFydERhdGUpICsgXCIgLSBcIiArIGdldE1vbWVudERhdGVGb3JtYXQoZW5kRGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZ1bmN0aW9uIGdldE1vbWVudERhdGVGb3JtYXQoZGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdChcIkRELk1NLllZWVlcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNS4wNC4yMDE2LlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMDcuMDQuMjAxNi5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwicmFuZ2VEYXRlcGlja2VyXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIGRhdGVTdGFydDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBkYXRlRW5kOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2RhdGUvcmFuZ2VEYXRlcGlja2VyL3JhbmdlRGF0ZXBpY2tlci5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwicmFuZ2VEYXRlcGlja2VyTGlnaHRcIiwgY29tcG9uZW50TGlnaHQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50TGlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIGRhdGVTdGFydDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBkYXRlRW5kOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2RhdGUvcmFuZ2VEYXRlcGlja2VyL3JhbmdlRGF0ZXBpY2tlckxpZ2h0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbJyRlbGVtZW50JywgJyRzY29wZSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJGVsZW1lbnQsICRzY29wZSkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZhciBkYXRlUGlja2VyRWxlbSA9ICRlbGVtZW50LmZpbmQoJy5pbnB1dC1kYXRlcmFuZ2UnKTtcclxuICAgICAgICB2YXIgZnJvbURhdGUgPSBkYXRlUGlja2VyRWxlbS5maW5kKCcuZnJvbS1kYXRlJyk7XHJcbiAgICAgICAgdmFyIHRvRGF0ZSA9IGRhdGVQaWNrZXJFbGVtLmZpbmQoJy50by1kYXRlJyk7XHJcbiAgICAgICAgdmFyIGRhdGVwaWNrZXIgPSBkYXRlUGlja2VyRWxlbS5ib290c3RyYXBEUCh7XHJcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImJvdHRvbSBhdXRvXCIsXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcjogXCIucGFnZS1jb250ZW50XCJcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgZGlzYWJsZUV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgZGF0ZXBpY2tlci5vbignY2hhbmdlRGF0ZScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZGlzYWJsZUV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IGZyb21EYXRlLmJvb3RzdHJhcERQKCdnZXREYXRlJyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgdG8gPSB0b0RhdGUuYm9vdHN0cmFwRFAoJ2dldERhdGUnKTtcclxuICAgICAgICAgICAgICAgIHZtLmRhdGVTdGFydCA9IGZyb207XHJcbiAgICAgICAgICAgICAgICB2bS5kYXRlRW5kID0gdG87XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHtmcm9tOiBmcm9tLCB0bzogdG99fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy4kb25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXNPYmopIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmouZGF0ZVN0YXJ0IHx8IGNoYW5nZXNPYmouZGF0ZUVuZCkge1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZUV2ZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5kYXRlU3RhcnQmJnZtLmRhdGVTdGFydCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbURhdGUuYm9vdHN0cmFwRFAoJ3NldERhdGUnLCBtb21lbnQodm0uZGF0ZVN0YXJ0KS50b0RhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmcm9tRGF0ZS5ib290c3RyYXBEUCgnY2xlYXJEYXRlcycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHZtLmRhdGVFbmQmJnZtLmRhdGVFbmQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvRGF0ZS5ib290c3RyYXBEUCgnc2V0RGF0ZScsIG1vbWVudCh2bS5kYXRlRW5kKS50b0RhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdG9EYXRlLmJvb3RzdHJhcERQKCdjbGVhckRhdGVzJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59KSgpO1xyXG5cclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkZWxlbWVudFwiLCBcImxvY2FsZVwiLCBcIiRzY29wZVwiLCBcImRhdGVIZWxwZXJcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwicmFuZ2VEYXRlcGlja2VyT25lQ2FsZW5kYXJcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IFwiJlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZGF0ZS9yYW5nZURhdGVwaWNrZXJPbmVDYWxlbmRhci9yYW5nZURhdGVwaWNrZXJPbmVDYWxlbmRhci5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJGVsZW1lbnQsIGxvY2FsZSwgJHNjb3BlLCBkYXRlSGVscGVyKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGRhdGVQaWNrZXJFbGVtID0gJGVsZW1lbnQuZmluZCgnLmlucHV0LWRhdGVyYW5nZScpO1xyXG4gICAgICAgIHZhciBzdGFydERhdGVGaWVsZCA9IGRhdGVQaWNrZXJFbGVtLmZpbmQoJy5zdGFydC1kYXRlJyk7XHJcbiAgICAgICAgdmFyIGVuZERhdGVGaWVsZCA9IGRhdGVQaWNrZXJFbGVtLmZpbmQoJy5lbmQtZGF0ZScpO1xyXG5cclxuICAgICAgICB2YXIgbG9jYWxlTmFtZSA9IGxvY2FsZS5nZXRMb2NhbGUoKTtcclxuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgb3JpZW50YXRpb246IFwiYm90dG9tIGF1dG9cIixcclxuICAgICAgICAgICAgY29udGFpbmVyOiBcIi5wYWdlLWNvbnRlbnRcIixcclxuICAgICAgICAgICAgbGFuZ3VhZ2U6IGxvY2FsZU5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh2bS5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKG9wdGlvbnMsIHZtLm9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZGF0ZXBpY2tlciA9IGRhdGVQaWNrZXJFbGVtLmJvb3RzdHJhcERQKG9wdGlvbnMpO1xyXG4gICAgICAgIHZhciBkaXNhYmxlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICB2bS5zdGFydERhdGUgPSBudWxsO1xyXG4gICAgICAgIHZtLmVuZERhdGUgPSBudWxsO1xyXG5cclxuICAgICAgICB2bS5ub3cgPSBcIlwiO1xyXG5cclxuICAgICAgICBsb2NhbGUucmVhZHkoXCJibG9ja3NcIikudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm5vdyA9IGxvY2FsZS5nZXRTdHJpbmcoXCJibG9ja3MuTm93XCIpO1xyXG4gICAgICAgICAgICB1cGRhdGVSYW5nZURpc3BsYXkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZGF0ZXBpY2tlci5vbignY2hhbmdlRGF0ZScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZGlzYWJsZUV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gc3RhcnREYXRlRmllbGQuYm9vdHN0cmFwRFAoJ2dldERhdGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQubmFtZSA9PSBcImVuZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bS5lbmREYXRlICYmIHZtLmVuZERhdGUuZ2V0VGltZSgpID09PSBzdGFydERhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0Lm5hbWUgPT0gXCJzdGFydFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bS5zdGFydERhdGUgJiYgdm0uc3RhcnREYXRlLmdldFRpbWUoKSA9PT0gc3RhcnREYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2bS5zdGFydERhdGUgJiYgIXZtLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZSA8IHZtLnN0YXJ0RGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZW5kRGF0ZSA9IHZtLnN0YXJ0RGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmVuZERhdGUgPSBzdGFydERhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bS5lbmREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5lbmREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5zdGFydERhdGUgPSBzdGFydERhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVFdmVudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVFdmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJhbmdlRGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHtzdGFydERhdGU6IHZtLnN0YXJ0RGF0ZSwgZW5kRGF0ZTogdm0uZW5kRGF0ZX0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVEYXRlKCkge1xyXG4gICAgICAgICAgICBpZiAodm0uc3RhcnREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGVGaWVsZC5ib290c3RyYXBEUCgnc2V0RGF0ZScsIG1vbWVudC51dGModm0uc3RhcnREYXRlKS50b0RhdGUoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGVGaWVsZC5ib290c3RyYXBEUCgnY2xlYXJEYXRlcycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2bS5lbmREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlRmllbGQuYm9vdHN0cmFwRFAoJ3NldERhdGUnLCBtb21lbnQudXRjKHZtLmVuZERhdGUpLnRvRGF0ZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlRmllbGQuYm9vdHN0cmFwRFAoJ2NsZWFyRGF0ZXMnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVSYW5nZURpc3BsYXkoKSB7XHJcbiAgICAgICAgICAgIHZtLnJhbmdlID0gZGF0ZUhlbHBlci5nZXRSYW5nZVRleHQodm0uc3RhcnREYXRlLCB2bS5lbmREYXRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGVwaWNrZXIub24oJ2NsZWFyRGF0ZScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZGlzYWJsZUV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7c3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwifSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB2bS5zaG93ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzdGFydERhdGVGaWVsZC5ib290c3RyYXBEUCgnc2hvdycpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG4gICAgICAgICAgICBkaXNhYmxlRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5zdGFydERhdGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zdGFydERhdGUgJiYgdm0uc3RhcnREYXRlICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVGaWVsZC5ib290c3RyYXBEUCgnc2V0RGF0ZScsIG1vbWVudC51dGModm0uc3RhcnREYXRlKS50b0RhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVGaWVsZC5ib290c3RyYXBEUCgnY2xlYXJEYXRlcycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdXBkYXRlRGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5lbmREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uZW5kRGF0ZSAmJiB2bS5lbmREYXRlICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmREYXRlRmllbGQuYm9vdHN0cmFwRFAoJ3NldERhdGUnLCBtb21lbnQudXRjKHZtLmVuZERhdGUpLnRvRGF0ZSgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGVGaWVsZC5ib290c3RyYXBEUCgnY2xlYXJEYXRlcycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdXBkYXRlRGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHVwZGF0ZVJhbmdlRGlzcGxheSgpO1xyXG4gICAgICAgICAgICBkaXNhYmxlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7XHJcblxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAwOS4wNi4yMDE2LlxyXG4gKi9cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCJlcnJvckhhbmRsZXJIZWxwZXJcIiwgXCJSZXN0YW5ndWxhclwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdlZGl0U2VydmljZScsIHNlcnZpY2UpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoZXJyb3JIYW5kbGVySGVscGVyLCBSZXN0YW5ndWxhcikge1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBnZXRFZGl0TW9kZWw6IGdldEVkaXRNb2RlbCxcclxuICAgICAgICAgICAgZ2V0RWRpdE1vZGVsRm9yUmVzdEFuZ3VsYXJNb2RlbDogZ2V0RWRpdE1vZGVsRm9yUmVzdEFuZ3VsYXJNb2RlbFxyXG5cclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmdW5jdGlvbiBnZXRFZGl0TW9kZWwodm0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYmFja3VwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gYW5ndWxhci5jb3B5KHZtLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja3VwID0gYW5ndWxhci5jb3B5KHZtLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVuZEVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHRoaXMudmFsdWV9KTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zYXZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmVycm9yID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB2bS5vblNhdmUoe3ZhbHVlOiB0aGlzLnZhbHVlfSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLnNhdmVFZGl0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS5lcnJvciA9IGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlRm9yRWRpdChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZtLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuY2FuY2VsRWRpdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2F2ZUVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZtLnNhdmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdGhpcy5iYWNrdXB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGdldEVkaXRNb2RlbEZvclJlc3RBbmd1bGFyTW9kZWwodm0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYmFja3VwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNsb25lT2JqZWN0KHZtLm1vZGVsKSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0RWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNsb25lT2JqZWN0KHZtLm1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2t1cCA9IGNsb25lT2JqZWN0KHZtLm1vZGVsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnZhbGlkID0gdm0ub25DaGFuZ2Uoe3ZhbHVlOiB0aGlzLnZhbHVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludmFsaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZtLnNhdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9uU2F2ZSh7dmFsdWU6IHRoaXMudmFsdWV9KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zYXZlRWRpdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNhdmluZyA9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYW5jZWxFZGl0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0uZXJyb3IgPSBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZUZvckVkaXQocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2bS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNhdmluZyA9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYW5jZWxFZGl0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5zYXZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzYXZlRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNhbmNlbEVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodm0uc2F2aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiB0aGlzLmJhY2t1cH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE2LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJlZGl0QnJpZ2h0XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nTW9kZWw6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIG9uU2F2ZTogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHtcclxuICAgICAgICAgICAgICAgICdkaXNwbGF5JzogJz9kaXNwbGF5J1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2VkaXQvZWRpdEJyaWdodC9lZGl0QnJpZ2h0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbJ2Vycm9ySGFuZGxlckhlbHBlcicsICckdHJhbnNjbHVkZScsICdlZGl0U2VydmljZSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoZXJyb3JIYW5kbGVySGVscGVyLCAkdHJhbnNjbHVkZSwgZWRpdFNlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIHZtLmZpbmlzaCA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xyXG4gICAgICAgICAgICB2bS5tb2RlbC52YWx1ZS5taW4gPSBmcm9tO1xyXG4gICAgICAgICAgICB2bS5tb2RlbC52YWx1ZS5tYXggPSB0bztcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmRlZmluZVRyYW5zY2x1ZGUgPSAkdHJhbnNjbHVkZS5pc1Nsb3RGaWxsZWQoJ2Rpc3BsYXknKTtcclxuICAgICAgICB2bS5tb2RlbCA9IGVkaXRTZXJ2aWNlLmdldEVkaXRNb2RlbCh2bSk7XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE2LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJlZGl0Q29uc3RhbnRzU2VsZWN0XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nTW9kZWw6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgb25TYXZlOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAnJicsXHJcbiAgICAgICAgICAgICAgICBjb25zdGFudE5hbWU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVRyYW5zbGF0ZTogJ0AnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHtcclxuICAgICAgICAgICAgICAgICdkaXNwbGF5JzogJz9kaXNwbGF5J1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2VkaXQvZWRpdENvbnN0YW50c1NlbGVjdC9lZGl0Q29uc3RhbnRzU2VsZWN0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbJyRpbmplY3RvcicsICckdHJhbnNjbHVkZSddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJGluamVjdG9yLCAkdHJhbnNjbHVkZSkge1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS5pdGVtcyA9ICRpbmplY3Rvci5nZXQodm0uY29uc3RhbnROYW1lKTtcclxuXHJcbiAgICAgICAgdm0uc2VsZWN0T3B0aW9uID0ge1xyXG4gICAgICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBcImZvcm0td2hpdGVcIixcclxuICAgICAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IC0xXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5kZWZpbmVUcmFuc2NsdWRlID0gJHRyYW5zY2x1ZGUuaXNTbG90RmlsbGVkKCdkaXNwbGF5Jyk7XHJcblxyXG4gICAgICAgIGlmICh2bS5kaXNhYmxlVHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgIHZtLmlzVHJhbnNsYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZtLmlzVHJhbnNsYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBiYWNrdXA6IG51bGwsXHJcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgICAgICAgc3RhcnRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGFuZ3VsYXIuY29weSh2bS5uZ01vZGVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja3VwID0gYW5ndWxhci5jb3B5KHZtLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbmRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHRoaXMudmFsdWV9KTtcclxuICAgICAgICAgICAgICAgIHZtLnNhdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB2bS5vblNhdmUoe3ZhbHVlOiB0aGlzLnZhbHVlfSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuc2F2ZUVkaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zYXZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0uc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmNhbmNlbEVkaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzYXZlRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhbmNlbEVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5zYXZpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdGhpcy5iYWNrdXB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwiZWRpdERhdGVcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvblNhdmU6IFwiJlwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6JyYnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZWRpdC9lZGl0RGF0ZS9lZGl0RGF0ZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImVkaXREYXRldGltZVwiLCBkYXRldGltZXBpY2tlcigpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBkYXRldGltZXBpY2tlcigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvblNhdmU6IFwiJlwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6JyYnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZWRpdC9lZGl0RGF0ZS9lZGl0RGF0ZXRpbWUuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBiYWNrdXA6IG51bGwsXHJcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgICAgICAgc3RhcnRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGFuZ3VsYXIuY29weSh2bS5uZ01vZGVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja3VwID0gYW5ndWxhci5jb3B5KHZtLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbmRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHRoaXMudmFsdWV9KTtcclxuICAgICAgICAgICAgICAgIHZtLnNhdmluZz10cnVlO1xyXG4gICAgICAgICAgICAgICAgdm0ub25TYXZlKHt2YWx1ZTogdGhpcy52YWx1ZX0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLnNhdmVFZGl0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2F2aW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5zYXZpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmNhbmNlbEVkaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzYXZlRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhbmNlbEVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmKHZtLnNhdmluZylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdGhpcy5iYWNrdXB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmtleVVwRWRpdElucHV0ID0gZnVuY3Rpb24gKCRldmVudCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCRldmVudC5rZXlDb2RlID09IDEzKSB7XHJcbiAgICAgICAgICAgICAgIHZtLm1vZGVsLmVuZEVkaXQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE2LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJlZGl0VGFnc1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ01vZGVsOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uU2F2ZTogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnLFxyXG4gICAgICAgICAgICAgICAgdGFnc1R5cGU6IFwiQFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZWRpdC9lZGl0VGFncy9lZGl0VGFncy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICB2YWx1ZTogW10sXHJcbiAgICAgICAgICAgIGJhY2t1cDogbnVsbCxcclxuICAgICAgICAgICAgc3RhcnRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGFuZ3VsYXIuY29weSh2bS5uZ01vZGVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja3VwID0gYW5ndWxhci5jb3B5KHZtLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbmRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHRoaXMudmFsdWV9KTtcclxuICAgICAgICAgICAgICAgIHZtLm9uU2F2ZSh7dmFsdWU6IHRoaXMudmFsdWV9KS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5zYXZlRWRpdCgpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC5jYW5jZWxFZGl0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2F2ZUVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjYW5jZWxFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdGhpcy5iYWNrdXB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwiZWRpdE51bWJlclwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ01vZGVsOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uU2F2ZTogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTonJidcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdHJhbnNjbHVkZTogdHJ1ZSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9lZGl0L2VkaXROdW1iZXIvZWRpdE51bWJlci5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBiYWNrdXA6IG51bGwsXHJcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgICAgICAgc3RhcnRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGFuZ3VsYXIuY29weShwYXJzZUludCh2bS5uZ01vZGVsKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2t1cCA9IGFuZ3VsYXIuY29weShwYXJzZUludCh2bS5uZ01vZGVsKSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVuZEVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdGhpcy52YWx1ZX0pO1xyXG4gICAgICAgICAgICAgICAgdm0uc2F2aW5nPXRydWU7XHJcbiAgICAgICAgICAgICAgICB2bS5vblNhdmUoe3ZhbHVlOiB0aGlzLnZhbHVlfSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuc2F2ZUVkaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zYXZpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNhdmluZz1mYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuY2FuY2VsRWRpdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNhdmVFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY2FuY2VsRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYodm0uc2F2aW5nKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiB0aGlzLmJhY2t1cH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ua2V5VXBFZGl0SW5wdXQgPSBmdW5jdGlvbiAoJGV2ZW50KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoJGV2ZW50LmtleUNvZGUgPT0gMTMpIHtcclxuICAgICAgICAgICAgICAgdm0ubW9kZWwuZW5kRWRpdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTYuMDUuMjAxNi5cclxuICovXHJcblxyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImVkaXRUZXh0XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nTW9kZWw6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIG9uU2F2ZTogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHtcclxuICAgICAgICAgICAgICAgICdkaXNwbGF5JzogJz9kaXNwbGF5J1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2VkaXQvZWRpdFRleHQvZWRpdFRleHQuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnZXJyb3JIYW5kbGVySGVscGVyJywgJyR0cmFuc2NsdWRlJ107XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihlcnJvckhhbmRsZXJIZWxwZXIsICR0cmFuc2NsdWRlKSB7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS5kZWZpbmVUcmFuc2NsdWRlID0gJHRyYW5zY2x1ZGUuaXNTbG90RmlsbGVkKCdkaXNwbGF5Jyk7XHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBiYWNrdXA6IG51bGwsXHJcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgICAgICAgc3RhcnRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGFuZ3VsYXIuY29weSh2bS5uZ01vZGVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja3VwID0gYW5ndWxhci5jb3B5KHZtLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbmRFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHRoaXMudmFsdWV9KTtcclxuICAgICAgICAgICAgICAgIHZtLnNhdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB2bS5vblNhdmUoe3ZhbHVlOiB0aGlzLnZhbHVlfSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubW9kZWwuc2F2ZUVkaXQoKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5lcnJvciA9IGVycm9ySGFuZGxlckhlbHBlci5oYW5kbGVFcnJvclJlc3BvbnNlRm9yRWRpdChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdm0uZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLm1vZGVsLmNhbmNlbEVkaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2F2ZUVkaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjYW5jZWxFZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uc2F2aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHRoaXMuYmFja3VwfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5rZXlVcEVkaXRJbnB1dCA9IGZ1bmN0aW9uICgkZXZlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICgkZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuZW5kRWRpdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTYuMDUuMjAxNi5cclxuICovXHJcblxyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImVkaXRUZXh0YXJlYVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ01vZGVsOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBvblNhdmU6IFwiJlwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICcmJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB7XHJcbiAgICAgICAgICAgICAgICAnZGlzcGxheSc6ICc/ZGlzcGxheSdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9lZGl0L2VkaXRUZXh0QXJlYS9lZGl0VGV4dEFyZWEuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFsnJHRyYW5zY2x1ZGUnLCAnZWRpdFNlcnZpY2UnXTtcclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCR0cmFuc2NsdWRlLCBlZGl0U2VydmljZSkge1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0uZGVmaW5lVHJhbnNjbHVkZSA9ICR0cmFuc2NsdWRlLmlzU2xvdEZpbGxlZCgnZGlzcGxheScpO1xyXG4gICAgICAgIHZtLm1vZGVsID0gZWRpdFNlcnZpY2UuZ2V0RWRpdE1vZGVsKHZtKTtcclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwiYnJpZ2h0Q29tcG9uZW50XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nTW9kZWw6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICcmJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vYnJpZ2h0Q29tcG9uZW50L2JyaWdodENvbXBvbmVudC5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigpIHtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIHZtLmZpbmlzaCA9IGZ1bmN0aW9uIChmcm9tKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmJyaWdodERheSA9IGZyb207XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5maW5pc2hOaWdodCA9IGZ1bmN0aW9uIChmcm9tKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmJyaWdodE5pZ2h0ID0gZnJvbTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5uZ01vZGVsICYmIHZtLm5nTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLl9icmlnaHREYXkgPSB2bS5uZ01vZGVsLmJyaWdodERheTtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLm1heFZhbHVlTmlnaHQgPSB2bS5uZ01vZGVsLmJyaWdodERheTtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLl9icmlnaHROaWdodCA9IHZtLm5nTW9kZWwuYnJpZ2h0TmlnaHQ7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5fYXV0b2JyaWdodCA9IHZtLm5nTW9kZWwuYXV0b2JyaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm1vZGVsID0ge1xyXG4gICAgICAgICAgICBtYXhWYWx1ZU5pZ2h0OiAxMDAsXHJcbiAgICAgICAgICAgIHNldCBicmlnaHREYXkodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlTmlnaHQgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9icmlnaHREYXkgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBicmlnaHREYXkoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYnJpZ2h0RGF5O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgYnJpZ2h0TmlnaHQodmFsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYnJpZ2h0TmlnaHQgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCBicmlnaHROaWdodCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9icmlnaHROaWdodDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IGF1dG9icmlnaHQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZih2YWwpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXV0b2JyaWdodD0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9icmlnaHQ9MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNoYW5nZWQoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IGF1dG9icmlnaHQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b2JyaWdodD09MTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY2hhbmdlZCgpIHtcclxuXHJcbiAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2JyaWdodDogdm0ubW9kZWwuYXV0b2JyaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBicmlnaHREYXk6IHZtLm1vZGVsLmJyaWdodERheSxcclxuICAgICAgICAgICAgICAgICAgICBicmlnaHROaWdodDogdm0ubW9kZWwuYnJpZ2h0TmlnaHRcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyNi4wNS4yMDE2LlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTYuMDUuMjAxNi5cclxuICovXHJcblxyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImNvbnN0YW50c1NlbGVjdFwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ01vZGVsOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAnJicsXHJcbiAgICAgICAgICAgICAgICBjb25zdGFudE5hbWU6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVRyYW5zbGF0ZTogJ0AnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBrZXk6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgc2VhcmNoOiBcIkBcIlxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50U2VsZWN0L2NvbnN0YW50U2VsZWN0Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwiY29uc3RhbnRzU2VsZWN0UmFkaW9cIiwgY29tcG9uZW50UmFkaW8oKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50UmFkaW8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nTW9kZWw6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6ICcmJyxcclxuICAgICAgICAgICAgICAgIGNvbnN0YW50TmFtZTogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHJhbnNsYXRlOiAnQCdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50U2VsZWN0L2NvbnRzdGFudFNlbGVjdFJhZGlvLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwiY29uc3RhbnRzU2VsZWN0VWlcIiwgY29tcG9uZW50VWkoKSk7XHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnRVaSgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnLFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnROYW1lOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIGRpc2FibGVUcmFuc2xhdGU6ICdAJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRTZWxlY3QvY29uc3RhbnRVaVNlbGVjdC5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImNvbnN0YW50c1NlbGVjdFRhYlwiLCBjb21wb25lbnRUYWIoKSk7XHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnRUYWIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nTW9kZWw6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgbmdEaXNhYmxlZFNlbGVjdDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnLFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnROYW1lOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIGRpc2FibGVUcmFuc2xhdGU6ICdAJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRTZWxlY3QvY29uc3RhbnRzU2VsZWN0VGFiLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwiY29uc3RhbnRzU2VsZWN0UGlsbHNcIiwgY29tcG9uZW50UGlsbHMoKSk7XHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnRQaWxscygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnLFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnROYW1lOiBcIkBcIixcclxuICAgICAgICAgICAgICAgIG5nSXRlbXM6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVRyYW5zbGF0ZTogJ0AnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZm9ybS9jb25zdGFudFNlbGVjdC9jb25zdGFudFNlbGVjdFBpbGxzLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbJyRpbmplY3RvciddO1xyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJGluamVjdG9yKSB7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmICh2bS5uZ0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZtLml0ZW1zID0gdm0ubmdJdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLml0ZW1zID0gJGluamVjdG9yLmdldCh2bS5jb25zdGFudE5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0uaXNUcmFuc2xhdGUgPSAhdm0uZGlzYWJsZVRyYW5zbGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKCF2bS5rZXkpIHtcclxuICAgICAgICAgICAgdm0ua2V5ID0gJ25hbWUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0uc2VsZWN0T3B0aW9uID0ge1xyXG4gICAgICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBcImZvcm0td2hpdGVcIixcclxuICAgICAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IC0xXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKCEhdm0uc2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdE9wdGlvbi5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCA9IDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2bS5uZ0Rpc2FibGVkU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiB2YWx1ZX0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXQgdmFsdWUoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdm0ubmdNb2RlbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkZmlsdGVyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcImR1cmF0aW9uSW50ZXJ2YWxcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ01pbjogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ01heDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZm9ybS9kdXJhdGlvbkludGVydmFsL2R1cmF0aW9uSW50ZXJ2YWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRmaWx0ZXIpIHtcclxuXHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS4kb25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXNPYmopIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmoubmdNb2RlbCAmJiB2bS5uZ01vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC5fcGxheUR1cmF0aW9uTWluID0gJGZpbHRlcignZHVyYXRpb25NaW4nKSh0aGlzLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuX3BsYXlEdXJhdGlvblNlYyA9ICRmaWx0ZXIoJ2R1cmF0aW9uU2VjJykodGhpcy5uZ01vZGVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlRHVyYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5uZ01heCB8fCBjaGFuZ2VzT2JqLm5nTWluKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUR1cmF0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIHBsYXlfZHVyYXRpb246IDAsXHJcbiAgICAgICAgICAgIF9wbGF5RHVyYXRpb25NaW46IDAsXHJcbiAgICAgICAgICAgIGdldCBwbGF5RHVyYXRpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGxheUR1cmF0aW9uTWluO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgcGxheUR1cmF0aW9uKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGxheUR1cmF0aW9uTWluID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsYXlEdXJhdGlvbk1pbiA9IHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRHVyYXRpb24oKTtcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIF9wbGF5RHVyYXRpb25TZWM6IDAsXHJcbiAgICAgICAgICAgIGdldCBwbGF5RHVyYXRpb25TZWMoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGxheUR1cmF0aW9uU2VjO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQgcGxheUR1cmF0aW9uU2VjKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGxheUR1cmF0aW9uU2VjID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsYXlEdXJhdGlvblNlYyA9IHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRHVyYXRpb24oKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdXBkYXRlRHVyYXRpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGxheV9kdXJhdGlvbiA9ICh0aGlzLl9wbGF5RHVyYXRpb25NaW4gKiA2MCArIHRoaXMuX3BsYXlEdXJhdGlvblNlYykgKiAxMDAwO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodm0ubmdNaW4gIT0gbnVsbCAmJiB0aGlzLnBsYXlfZHVyYXRpb24gPCB2bS5uZ01pbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheV9kdXJhdGlvbiA9IHZtLm5nTWluO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHZtLm5nTWF4ICE9IG51bGwgJiYgdGhpcy5wbGF5X2R1cmF0aW9uID4gdm0ubmdNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZHVyYXRpb24gPSB2bS5uZ01heDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZtLm5nTWluICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWluU2VjID0gJGZpbHRlcignZHVyYXRpb25TZWMnKSh2bS5uZ01pbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbk1pbiA9ICRmaWx0ZXIoJ2R1cmF0aW9uTWluJykodm0ubmdNaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1pbkR1cmF0aW9uTWludXRlcyA9IG1pbk1pbjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbk1pbiA9PSB0aGlzLnBsYXlEdXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5taW5EdXJhdGlvblNlY29uZHMgPSBtaW5TZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5taW5EdXJhdGlvblNlY29uZHMgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm1pbkR1cmF0aW9uU2Vjb25kcyA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodm0ubmdNYXggIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXhTZWMgPSAkZmlsdGVyKCdkdXJhdGlvblNlYycpKHZtLm5nTWF4KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4TWluID0gJGZpbHRlcignZHVyYXRpb25NaW4nKSh2bS5uZ01heCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubWF4RHVyYXRpb25NaW51dGVzID0gbWF4TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXhNaW4gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5tYXhEdXJhdGlvblNlY29uZHMgPSBtYXhTZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhNaW4gPT0gdGhpcy5wbGF5RHVyYXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWF4RHVyYXRpb25TZWNvbmRzID0gbWF4U2VjO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubWF4RHVyYXRpb25TZWNvbmRzID0gNjA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubWF4RHVyYXRpb25TZWNvbmRzID0gNjA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogdGhpcy5wbGF5X2R1cmF0aW9ufSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyNi4wNS4yMDE2LlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTYuMDUuMjAxNi5cclxuICovXHJcblxyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHFcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwibmdTZWxlY3RcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVRyYW5zbGF0ZTogJ0AnLFxyXG4gICAgICAgICAgICAgICAgaXRlbXM6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlS2V5OlwiQFwiXHJcblxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vbmdTZWxlY3QvbmdTZWxlY3QuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJuZ1NlbGVjdFJhZGlvXCIsIGNvbXBvbmVudFJhZGlvKCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudFJhZGlvKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ01vZGVsOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAnJicsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHJhbnNsYXRlOiAnQCcsXHJcbiAgICAgICAgICAgICAgICBpdGVtczogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVLZXk6XCJAXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9mb3JtL25nU2VsZWN0L25nU2VsZWN0UmFkaW8uaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRxKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAodm0uZGlzYWJsZVRyYW5zbGF0ZSkge1xyXG4gICAgICAgICAgICB2bS5pc1RyYW5zbGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdm0uaXNUcmFuc2xhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS5zZWxlY3RPcHRpb24gPSB7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiZm9ybS13aGl0ZVwiLFxyXG4gICAgICAgICAgICBtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaDogLTFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5tb2RlbCA9IHtcclxuICAgICAgICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHZhbHVlfSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCB2YWx1ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5uZ01vZGVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAkcS53aGVuKHZtLml0ZW1zKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pdGVtc0Zyb21Qcm9taXNlID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDI2LjA1LjIwMTYuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkZWxlbWVudFwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJudW1iZXJQaWNrZXJcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBuZ0Rpc2FibGVkOlwiPFwiLFxyXG4gICAgICAgICAgICAgICAgbWluOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG1heDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBlcnJvcjpcIjxcIixcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOlwiPFwiLFxyXG4gICAgICAgICAgICAgICAgbmFtZTpcIkBcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vbnVtYmVyUGlja2VyL251bWJlclBpY2tlci5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJGVsZW1lbnQpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0udXAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLnZhbHVlKys7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5kb3duID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5tb2RlbC52YWx1ZSAtPSAxO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLm1vZGVsID0ge1xyXG4gICAgICAgICAgICBzZXQgdmFsdWUodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGlmKHZtLm5nRGlzYWJsZWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZighdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9MDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKHZtLm1heHx8dm0ubWF4PT09MCkgJiYgdm0ubWF4IDwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9dm0ubWF4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCh2bS5taW4gfHx2bS5taW49PT0wKSYmIHZtLm1pbiA+IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPXZtLm1pbjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2bS5uZ01vZGVsID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHZhbHVlfSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldCB2YWx1ZSgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bS5uZ01vZGVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5uZ01vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC52YWx1ZSA9IHZtLm5nTW9kZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoY2hhbmdlc09iai5taW4pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICgodm0ubWluIHx8dm0ubWluPT09MCkmJiB2bS5taW4gPiB2bS5uZ01vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubmdNb2RlbCA9dm0ubWluO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihjaGFuZ2VzT2JqLm1heClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKCh2bS5tYXggfHx2bS5tYXg9PT0wKSYmIHZtLm1heCA8IHZtLm5nTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5uZ01vZGVsID12bS5tYXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkZmlsdGVyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmNvbXBvbmVudChcInBpY2tJbnRlcnZhbFdpdGhJbnRlcnZhbFwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBuZ091dGVyU3RhcnQ6IFwiPG5nU3RhcnRcIixcclxuICAgICAgICAgICAgICAgIG5nRHVyYXRpb246IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgbmdJbnRlcnZhbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ01pbjogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ01heDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJyYnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZm9ybS9waWNrSW50ZXJ2YWxXaXRoU3RhcnQvcGlja0ludGVydmFsV2l0aEludGVydmFsLmNvbXBvbmVudC5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkZmlsdGVyKSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0uJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5uZ091dGVyU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIHZtLm5nU3RhcnQgPSB2bS5uZ091dGVyU3RhcnQgLyAxMDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGNoYW5nZXNPYmoubmdEdXJhdGlvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm0ubmdTdGFydE1heCA9IHZtLm5nRHVyYXRpb24gLyAxMDAwIC01O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0udHJpZ2dlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe25nU3RhcnQ6IHZtLm5nU3RhcnQgKiAxMDAwLCBuZ0ludGVydmFsOiB2bS5uZ0ludGVydmFsfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkZWxlbWVudFwiLCBcImFyZWFzU3R5bGVIZWxwZXJcIiwgXCJjcmVhdGVDdXN0b21BcmVhTW9kYWxcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwic2VsZWN0QXJlYXNcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgbmdNb2RlbDogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ1dpZHRoOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG5nSGVpZ2h0OiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG5nT3JpZW50YXRpb246XCI8XCIsXHJcbiAgICAgICAgICAgICAgICBiZXRhTW9kZTpcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOnRydWUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvZm9ybS9zZWxlY3RBcmVhcy9zZWxlY3RBcmVhcy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJGVsZW1lbnQsIGFyZWFzU3R5bGVIZWxwZXIsIGNyZWF0ZUN1c3RvbUFyZWFNb2RhbCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0uc2hvd0NyZWF0ZUN1c3RvbU1vZGFsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjcmVhdGVDdXN0b21BcmVhTW9kYWwuc2hvdygpLnRoZW4oZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IGFyZWFzU3R5bGVIZWxwZXIuZ2V0U3R5bGVGb3JDdXN0b20oYXJlYS5sYXlvdXQsYXJlYS53aWR0aCxhcmVhLmhlaWdodCxhcmVhLmlzVmVydGljYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBhcmVhTGF5b3V0ID17XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpcImN1c3RvbVwiKyh2bS5hcmVhcy5sZW5ndGgrMSkrKGFyZWEuaXNWZXJ0aWNhbD8nX3ZlcnRpY2FsJzonJyksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6YXJlYS5sYXlvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6YXJlYS53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6YXJlYS5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVN0eWxlczpzdHlsZSxcclxuICAgICAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsOmFyZWEuaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b206dHJ1ZVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHZtLmZpbHRlcmVkQXJlYXMudW5zaGlmdChhcmVhTGF5b3V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC52YWx1ZT1hcmVhTGF5b3V0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5hcmVhcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2FyZWExJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOjE5MjAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6MTA4MCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2FyZWExJyxcclxuICAgICAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE5MjAsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDgwLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2FyZWEyX3ZlcnRpY2FsJyxcclxuICAgICAgICAgICAgICAgIGlzVmVydGljYWw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDoxOTIwLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OjEwODAsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhcmVhMV92ZXJ0aWNhbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxOTIwLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTA4MCxcclxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgel9pbmRleDogMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgXTtcclxuICAgICAgICB2bS5iZXRhQXJlYXMgPSAgW1xyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWEzJyxcclxuICAgICAgICAgICAgIHdpZHRoOjE5MjAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6MTA4MCxcclxuXHJcbiAgICAgICAgICAgICB2YWx1ZTogW1xyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWExJyxcclxuICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDE5MjAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDcyMCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTInLFxyXG4gICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgIHk6IDcyMCxcclxuICAgICAgICAgICAgIHdpZHRoOiAxOTIwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXHJcbiAgICAgICAgICAgICBvcGFjaXR5OiAxMDAsXHJcbiAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTRfdmVydGljYWwnLFxyXG4gICAgICAgICAgICAgd2lkdGg6MTkyMCxcclxuICAgICAgICAgICAgIGhlaWdodDoxMDgwLFxyXG4gICAgICAgICAgICAgaXNWZXJ0aWNhbDogdHJ1ZSwgdmFsdWU6IFtcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhMV92ZXJ0aWNhbCcsXHJcbiAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgIHdpZHRoOiAxOTIwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OiA3MjAsXHJcbiAgICAgICAgICAgICBvcGFjaXR5OiAxMDAsXHJcbiAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWEyX3ZlcnRpY2FsJyxcclxuICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICB5OiA3MjAsXHJcbiAgICAgICAgICAgICB3aWR0aDogMTkyMCxcclxuICAgICAgICAgICAgIGhlaWdodDogMzYwLFxyXG4gICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgel9pbmRleDogMVxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhNScsXHJcbiAgICAgICAgICAgICB3aWR0aDoxOTIwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OjEwODAsXHJcbiAgICAgICAgICAgICB2YWx1ZTogW1xyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWExJyxcclxuICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDEyODAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDEwODAsXHJcbiAgICAgICAgICAgICBvcGFjaXR5OiAxMDAsXHJcbiAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWEyJyxcclxuICAgICAgICAgICAgIHg6IDEyODAsXHJcbiAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDY0MCxcclxuICAgICAgICAgICAgIGhlaWdodDogMTA4MCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWE2X3ZlcnRpY2FsJyxcclxuICAgICAgICAgICAgIHdpZHRoOjE5MjAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6MTA4MCxcclxuICAgICAgICAgICAgIGlzVmVydGljYWw6IHRydWUsIHZhbHVlOiBbXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTFfdmVydGljYWwnLFxyXG4gICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICB3aWR0aDogMTI4MCxcclxuICAgICAgICAgICAgIGhlaWdodDogMTA4MCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTJfdmVydGljYWwnLFxyXG4gICAgICAgICAgICAgeDogMTI4MCxcclxuICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICB3aWR0aDogNjQwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OiAxMDgwLFxyXG4gICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgel9pbmRleDogMVxyXG4gICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTcnLFxyXG4gICAgICAgICAgICAgd2lkdGg6MTkyMCxcclxuICAgICAgICAgICAgIGhlaWdodDoxMDgwLFxyXG4gICAgICAgICAgICAgdmFsdWU6IFtcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhMScsXHJcbiAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgIHdpZHRoOiA5NjAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDcyMCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTInLFxyXG4gICAgICAgICAgICAgeDogOTYwLFxyXG4gICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgIHdpZHRoOiA5NjAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDcyMCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTMnLFxyXG4gICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgIHk6IDcyMCxcclxuICAgICAgICAgICAgIHdpZHRoOiAxOTIwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXHJcbiAgICAgICAgICAgICBvcGFjaXR5OiAxMDAsXHJcbiAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhOF92ZXJ0aWNhbCcsXHJcbiAgICAgICAgICAgICB3aWR0aDoxOTIwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OjEwODAsXHJcbiAgICAgICAgICAgICBpc1ZlcnRpY2FsOiB0cnVlLCB2YWx1ZTogW1xyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWExX3ZlcnRpY2FsJyxcclxuICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDk2MCxcclxuICAgICAgICAgICAgIGhlaWdodDogNzIwLFxyXG4gICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgel9pbmRleDogMVxyXG4gICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhMl92ZXJ0aWNhbCcsXHJcbiAgICAgICAgICAgICB4OiA5NjAsXHJcbiAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDk2MCxcclxuICAgICAgICAgICAgIGhlaWdodDogNzIwLFxyXG4gICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgel9pbmRleDogMVxyXG4gICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhM192ZXJ0aWNhbCcsXHJcbiAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgeTogNzIwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDE5MjAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDM2MCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWE5JyxcclxuICAgICAgICAgICAgIHdpZHRoOjE5MjAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6MTA4MCxcclxuICAgICAgICAgICAgIHZhbHVlOiBbXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTEnLFxyXG4gICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICB3aWR0aDogNjQwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OiAxMDgwLFxyXG4gICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgel9pbmRleDogMVxyXG4gICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhMicsXHJcbiAgICAgICAgICAgICB4OiA2NDAsXHJcbiAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDY0MCxcclxuICAgICAgICAgICAgIGhlaWdodDogMTA4MCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgIG5hbWU6ICdhcmVhMycsXHJcbiAgICAgICAgICAgICB4OiAxMjgwLFxyXG4gICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgIHdpZHRoOiA2NDAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDEwODAsXHJcbiAgICAgICAgICAgICBvcGFjaXR5OiAxMDAsXHJcbiAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWExMF92ZXJ0aWNhbCcsXHJcbiAgICAgICAgICAgICB3aWR0aDoxOTIwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OjEwODAsXHJcbiAgICAgICAgICAgICBpc1ZlcnRpY2FsOiB0cnVlLCB2YWx1ZTogW1xyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgbmFtZTogJ2FyZWExX3ZlcnRpY2FsJyxcclxuICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgd2lkdGg6IDY0MCxcclxuICAgICAgICAgICAgIGhlaWdodDogMTA4MCxcclxuICAgICAgICAgICAgIG9wYWNpdHk6IDEwMCxcclxuICAgICAgICAgICAgIHpfaW5kZXg6IDFcclxuICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTJfdmVydGljYWwnLFxyXG4gICAgICAgICAgICAgeDogNjQwLFxyXG4gICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgIHdpZHRoOiA2NDAsXHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDEwODAsXHJcbiAgICAgICAgICAgICBvcGFjaXR5OiAxMDAsXHJcbiAgICAgICAgICAgICB6X2luZGV4OiAxXHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBuYW1lOiAnYXJlYTNfdmVydGljYWwnLFxyXG4gICAgICAgICAgICAgeDogMTI4MCxcclxuICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICB3aWR0aDogNjQwLFxyXG4gICAgICAgICAgICAgaGVpZ2h0OiAxMDgwLFxyXG4gICAgICAgICAgICAgb3BhY2l0eTogMTAwLFxyXG4gICAgICAgICAgICAgel9pbmRleDogMVxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICBdO1xyXG4gICAgICAgIHZtLmZpbHRlcmVkQXJlYXMgPXZtLmFyZWFzO1xyXG5cclxuICAgICAgICB2bS5lZGl0Q3VzdG9tID0gZnVuY3Rpb24gKGFyZWEpIHtcclxuICAgICAgICAgICAgY3JlYXRlQ3VzdG9tQXJlYU1vZGFsLnNob3coYXJlYS52YWx1ZSwge3dpZHRoOmFyZWEud2lkdGgsaGVpZ2h0OmFyZWEuaGVpZ2h0fSkudGhlbihmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gYXJlYXNTdHlsZUhlbHBlci5nZXRTdHlsZUZvckN1c3RvbShhcmVhLmxheW91dCxhcmVhLndpZHRoLGFyZWEuaGVpZ2h0LGFyZWEuaXNWZXJ0aWNhbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGFyZWFMYXlvdXQgPXtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOlwiY3VzdG9tXCIrKHZtLmFyZWFzLmxlbmd0aCsxKSsoYXJlYS5pc1ZlcnRpY2FsPydfdmVydGljYWwnOicnKSxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTphcmVhLmxheW91dCxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDphcmVhLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDphcmVhLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBhcmVhU3R5bGVzOnN0eWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWw6YXJlYS5pc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbTp0cnVlXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyZWRBcmVhcy5zcGxpY2Uodm0uZmlsdGVyZWRBcmVhcy5pbmRleE9mKGFyZWEpLCAxKTtcclxuICAgICAgICAgICAgICAgIHZtLmZpbHRlcmVkQXJlYXMudW5zaGlmdChhcmVhTGF5b3V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC52YWx1ZT1hcmVhTGF5b3V0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uYXJlYXMuY29uY2F0KHZtLmJldGFBcmVhcykuZm9yRWFjaChmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICBhcmVhLmFyZWFTdHlsZXMgPSBhcmVhc1N0eWxlSGVscGVyLmdldFN0eWxlKGFyZWEudmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5tb2RlbCA9IHtcclxuICAgICAgICAgICAgYXJlYTogdm0uYXJlYXNbMF0sXHJcbiAgICAgICAgICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB2bS5uZ01vZGVsID0gdmFsdWUudmFsdWU7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6IHZhbHVlLnZhbHVlLHdpZHRoOnZhbHVlLndpZHRoLGhlaWdodDp2YWx1ZS5oZWlnaHR9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLmFyZWE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLm5nTW9kZWwgJiYgdm0ubmdNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwuYXJlYSA9IGdldEFyZWEodm0ubmdNb2RlbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIXZtLm1vZGVsLmFyZWEpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVmVydGljYWwgPSAhIXZtLm5nTW9kZWwuZmluZChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lLmluY2x1ZGVzKCd2ZXJ0aWNhbCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IGFyZWFzU3R5bGVIZWxwZXIuZ2V0U3R5bGVGb3JDdXN0b20odm0ubmdNb2RlbCx2bS5uZ1dpZHRoLHZtLm5nSGVpZ2h0LGlzVmVydGljYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJlYUxheW91dCA9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOlwiY3VzdG9tXCIrKHZtLmFyZWFzLmxlbmd0aCsxKSsoaXNWZXJ0aWNhbD8nX3ZlcnRpY2FsJzonJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOnZtLm5nTW9kZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOnZtLm5nV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDp2bS5uZ0hlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJlYVN0eWxlczpzdHlsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbDppc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b206dHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uZmlsdGVyZWRBcmVhcy51bnNoaWZ0KGFyZWFMYXlvdXQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbC52YWx1ZT1hcmVhTGF5b3V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5uZ09yaWVudGF0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uZmlsdGVyZWRBcmVhcyA9ICB2bS5hcmVhcyA7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbC52YWx1ZSA9IHZtLmZpbHRlcmVkQXJlYXNbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmouYmV0YU1vZGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZih2bS5iZXRhTW9kZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5maWx0ZXJlZEFyZWFzID0gIHZtLmFyZWFzIC5jb25jYXQodm0uYmV0YUFyZWFzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5maWx0ZXJlZEFyZWFzID0gdm0uYXJlYXMgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA7XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRBcmVhKHZhbHVlKSB7XHJcblxyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmZpbHRlcihmdW5jdGlvbiAoYXJlYSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICEoYXJlYS55ID09IDAgJiYgYXJlYS54ID09IDAgJiYgYXJlYS53aWR0aCA9PSAwICYmIGFyZWEuaGVpZ2h0ID09IDApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIGFyZWEgPSB2bS5maWx0ZXJlZEFyZWFzLmZpbmQoZnVuY3Rpb24gKG1haW5BcmVhKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc29tZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgc29tZSA9IG1haW5BcmVhLnZhbHVlLmxlbmd0aCA9PSB2YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBpZiAoc29tZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1haW5BcmVhLnZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFyZWEsIGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lID0gYXJlYS54ID09IHZhbHVlW2luZGV4XS54ICYmIGFyZWEueSA9PSB2YWx1ZVtpbmRleF0ueSAmJiBhcmVhLndpZHRoID09IHZhbHVlW2luZGV4XS53aWR0aCAmJiBhcmVhLmhlaWdodCA9PSB2YWx1ZVtpbmRleF0uaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtpbmRleF0ubmFtZS5zcGxpdCgnXycpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lID0gc29tZSAmJiBhcmVhLm5hbWUuc3BsaXQoJ18nKS5sZW5ndGggPiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBzb21lXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdm0uY29uZmlnID0ge1xyXG4gICAgICAgICAgICBhdXRvSGlkZVNjcm9sbGJhcjogZmFsc2UsXHJcbiAgICAgICAgICAgIHRoZW1lOiAnbGlnaHQnLFxyXG4gICAgICAgICAgICBhZHZhbmNlZDoge1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlT25Db250ZW50UmVzaXplOiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldFdpZHRoOiA1MjAsXHJcbiAgICAgICAgICAgIGF4aXM6ICd4JyxcclxuICAgICAgICAgICAgc2Nyb2xsSW5lcnRpYTogMFxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDI2LjA1LjIwMTYuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJsb2NhbGVcIiwgXCJzZWxlY3RFbnRpdHlNb2RhbFNlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwic2VsZWN0RW50aXR5XCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWRzOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIGVudGl0eTogXCJAXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogXCImXCIsXHJcbiAgICAgICAgICAgICAgICBpY29uOiBcIkBcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0RW50aXR5L3NlbGVjdEVudGl0eS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIobG9jYWxlLCBzZWxlY3RFbnRpdHlNb2RhbFNlcnZpY2UpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5zaG93ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxlY3RFbnRpdHlNb2RhbFNlcnZpY2Uuc2hvdyh2bS5lbnRpdHkpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoc2VsZWN0ZWRJZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zZWxlY3RlZElkcyA9IHNlbGVjdGVkSWRzO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiBzZWxlY3RlZElkc30pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZElkcy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB2bS5vbkNoYW5nZSh7dmFsdWU6ICAgdm0uc2VsZWN0ZWRJZHN9KTtcclxuICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWQoKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdXBkYXRlU2VsZWN0ZWQoKTtcclxuICAgICAgICBsb2NhbGUucmVhZHkoXCJibG9ja3NcIikudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm5vdFNlbGVjdGVkTWVzc2FnZSA9IGxvY2FsZS5nZXRTdHJpbmcoXCJibG9ja3MuTm90U2VsZWN0ZWRFbnRpdHlcIik7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdGVkTWVzc2FnZVN0YXJ0ID0gbG9jYWxlLmdldFN0cmluZyhcImJsb2Nrcy5TZWxlY3RlZEVudGl0eVN0YXJ0XCIpO1xyXG4gICAgICAgICAgICB2bS5zZWxlY3RlZE1lc3NhZ2VFbmQgPSBsb2NhbGUuZ2V0U3RyaW5nKFwiYmxvY2tzLlNlbGVjdGVkRW50aXR5RW5kX1wiICsgdm0uZW50aXR5KTtcclxuICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlU2VsZWN0ZWQoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5zZWxlY3RlZElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zZWxlY3RlZCA9IHZtLnNlbGVjdGVkTWVzc2FnZVN0YXJ0ICsgXCIgXCIgKyB2bS5zZWxlY3RlZElkcy5sZW5ndGggKyBcIiBcIiArIHZtLnNlbGVjdGVkTWVzc2FnZUVuZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZtLnNlbGVjdGVkID0gdm0ubm90U2VsZWN0ZWRNZXNzYWdlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLiRvbkluaXQgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZighdm0uc2VsZWN0ZWRJZHMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZtLnNlbGVjdGVkSWRzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlc09iai5zZWxlY3RlZElkcykge1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWQoKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBjb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxJbnN0YW5jZVwiLCBcImVudGl0eVwiLCBcImZpbHRlcklkc1wiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdzZWxlY3RFbnRpdHlNb2RhbENvbnRyb2xsZXInLCBjb250cm9sbGVyKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgZW50aXR5LCBmaWx0ZXJJZHMpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0uc2VsZWN0ZWRJZHMgPSBbXTtcclxuICAgICAgICB2bS5lbnRpdHkgPSBlbnRpdHk7XHJcblxyXG4gICAgICAgIHZtLmZpbHRlcklkcyA9IGZpbHRlcklkcztcclxuICAgICAgICB2bS5zYXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSh2bS5zZWxlY3RlZElkcyk7XHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA1LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5jYW1wYWlnbnNcIilcclxuICAgICAgICAuc2VydmljZSgnc2VsZWN0RW50aXR5TW9kYWxTZXJ2aWNlJywgc2VydmljZSk7XHJcblxyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkdWliTW9kYWwpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2hvdyA9IGZ1bmN0aW9uIChlbnRpdHksZmlsdGVySWRzKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLCB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0RW50aXR5TW9kYWwvc2VsZWN0RW50aXR5TW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnc2VsZWN0RW50aXR5TW9kYWxDb250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHk6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcklkczpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJJZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDI2LjA1LjIwMTYuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkaW5qZWN0b3JcIiwgXCJ0YWJsZUhlbHBlclwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJzZWxlY3RFbnRpdHlUYWJsZVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZElkczogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJJZHM6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5OiBcIkBcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vc2VsZWN0RW50aXR5VGFibGUvc2VsZWN0RW50aXR5VGFibGUuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCRpbmplY3RvciwgdGFibGVIZWxwZXIpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2YXIgc2VydmljZSA9ICRpbmplY3Rvci5nZXQodm0uZW50aXR5KTtcclxuXHJcbiAgICAgICAgdm0ub3B0aW9uID0ge1xyXG4gICAgICAgICAgICB0YWdzOiBbXSxcclxuICAgICAgICAgICAgbmFtZTogXCJcIixcclxuICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcclxuICAgICAgICAgICAgdHlwZXM6IFtdLFxyXG4gICAgICAgICAgICBxdWFsaXR5OiBbXSxcclxuICAgICAgICAgICAgcXVpY2t0eXBlOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdXBkYXRlKCk7XHJcbiAgICAgICAgdm0ub25SZXNldCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ub3B0aW9uLnR5cGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi50YWdzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5uYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5xdWFsaXR5Lmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5xdWlja3R5cGUgPSAnJztcclxuICAgICAgICAgICAgdXBkYXRlKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ub25BcHBseSA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuXHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi50YWdzID0gb3B0aW9uLnRhZ3M7XHJcbiAgICAgICAgICAgIHZtLm9wdGlvbi5uYW1lID0gb3B0aW9uLm5hbWU7XHJcblxyXG5cclxuICAgICAgICAgICAgc3dpdGNoICh2bS5lbnRpdHkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJjYW1wYWlnbnNcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLm9wdGlvbi5zdGF0dXMgPSBvcHRpb24uc3RhdHVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5vcHRpb24udHlwZXMgPSBvcHRpb24udHlwZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwicGxheWVyc1wiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub3B0aW9uLnF1aWNrdHlwZSA9IG9wdGlvbi5xdWlja3R5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub3B0aW9uLnF1YWxpdHkgPSBvcHRpb24ucXVhbGl0eTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB1cGRhdGUoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7XHJcbiAgICAgICAgICAgIHZtLnByb21pc2UgPXNlcnZpY2UuZ2V0TGlzdEZyb21GaWx0ZXJPcHRpb24odm0ub3B0aW9uKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwIGluIHZtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2bS5zZWxlY3RlZFtwXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZtLmZpbHRlcklkcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5pdGVtcyA9IHJlc3VsdC5kYXRhLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF2bS5maWx0ZXJJZHMuZmluZChmdW5jdGlvbiAoZmlsdGVySXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJJdGVtID09IGl0ZW0uaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLml0ZW1zID0gcmVzdWx0LmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2bS5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZtLnNlbGVjdGVkW2l0ZW0uaWRdID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2bS5zZWxlY3RlZCA9IHt9O1xyXG4gICAgICAgIHZhciBmdW5jdGlvbnMgPSB0YWJsZUhlbHBlci5nZXRGdW5jdGlvbkZvclNlbGVjdGVkVGFibGUob25TZWxlY3RlZCwgdm0uc2VsZWN0ZWQpO1xyXG4gICAgICAgIHZtLnRvZ2dsZUFsbCA9IGZ1bmN0aW9ucy50b2dnbGVBbGw7XHJcbiAgICAgICAgdm0udG9nZ2xlT25lID0gZnVuY3Rpb25zLnRvZ2dsZU9uZTtcclxuICAgICAgICB2bS5pc1NlbGVjdEFueSA9IGZ1bmN0aW9ucy5pc1NlbGVjdEFueTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb25TZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdEFsbCA9IHNlbGVjdEFsbDtcclxuICAgICAgICAgICAgdm0ub25DaGFuZ2Uoe3ZhbHVlOiBzZWxlY3RlZH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDI2LjA1LjIwMTYuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxNi4wNS4yMDE2LlxyXG4gKi9cclxuXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkZWxlbWVudFwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5jb21wb25lbnQoXCJzcGVjdHJ1bUNvbG9ycGlja2VyXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbjogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBuZ01vZGVsOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkBcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL2Zvcm0vc3BlY3RydW1Db2xvcnBpY2tlci9zcGVjdHJ1bUNvbG9ycGlja2VyLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkZWxlbWVudCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2YXIgbG9jYWxPcHQgPSB7XHJcbiAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24gKGNvbG9yKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5uZ01vZGVsID0gY29sb3IudG9IZXhTdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHt2YWx1ZTogIGNvbG9yLnRvSGV4U3RyaW5nKCl9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBhbmd1bGFyLmV4dGVuZChsb2NhbE9wdCwgdm0ub3B0aW9uKTtcclxuXHJcbiAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgIHNldCB2YWx1ZSh2YWwpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgdm0ubmdNb2RlbCA9IHZhbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZih2YWwubGVuZ3RoPjYpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnQuZmluZCgnaW5wdXQnKS5zcGVjdHJ1bShcInNldFwiLCB2YWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZtLm5nTW9kZWw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICRlbGVtZW50LmZpbmQoJ2lucHV0Jykuc3BlY3RydW0obG9jYWxPcHQpO1xyXG4gICAgICAgICRlbGVtZW50LmZpbmQoJ2lucHV0Jykuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzT2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzT2JqLm5nTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLnZhbHVlPXZtLm5nTW9kZWw7XHJcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5maW5kKCdpbnB1dCcpLnNwZWN0cnVtKFwic2V0XCIsIHZtLm5nTW9kZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyNS4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCIsIFwiJHNjb3BlXCIsIFwiJHVpYk1vZGFsSW5zdGFuY2VcIiwgXCJnZW9UYXJnZXRpbmdJZFwiLCBcIm1vbWVudFwiLCBcInRpbWVUYXJnZXRpbmdcIiwgXCJsb2NhbGVcIiwgXCJ1aUdtYXBHb29nbGVNYXBBcGlcIiwgXCJ1aUdtYXBJc1JlYWR5XCIsIFwiZ2VvVGFyZ2V0aW5nXCIsIFwiY29uZmlybU1vZGFsU2VydmljZVwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKVxyXG4gICAgICAgIC5jb250cm9sbGVyKCdjb250cm9sR2VvVGFyZ2V0aW5nTW9kYWxDb250cm9sbGVyJywgY29udHJvbGxlcik7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsLCAkc2NvcGUsICR1aWJNb2RhbEluc3RhbmNlLCBnZW9UYXJnZXRpbmdJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9tZW50LCB0aW1lVGFyZ2V0aW5nLCBsb2NhbGUsIHVpR21hcEdvb2dsZU1hcEFwaSwgdWlHbWFwSXNSZWFkeSwgZ2VvVGFyZ2V0aW5nLCBjb25maXJtTW9kYWxTZXJ2aWNlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS5pbmRleCA9IDA7XHJcblxyXG4gICAgICAgIHZtLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBpZDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgY29vcmRzOiB7XHJcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogJycsXHJcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm1vZGVsID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBtb21lbnQoKS5mb3JtYXQoKSxcclxuICAgICAgICAgICAgcG9seWdvbnM6IFtdXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoZ2VvVGFyZ2V0aW5nSWQgJiYgZ2VvVGFyZ2V0aW5nSWQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICBnZW9UYXJnZXRpbmcuZ2V0KGdlb1RhcmdldGluZ0lkKS50aGVuKGZ1bmN0aW9uIChhcmVhKSB7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnBvbHlnb25zLmZvckVhY2goZnVuY3Rpb24gKHBvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLmlzRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHBvbHlnb24sIGdldERlZmF1bHRQb2x5Z29uKCkpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB2bS5tb2RlbCA9IGFyZWE7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVQb2x5Z29ucygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgICAgICB1cGRhdGVQb2x5Z29ucygpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHZtLnNob3cgPSB0cnVlO1xyXG5cclxuICAgICAgICB2bS5tYXAgPSB7XHJcbiAgICAgICAgICAgIGNlbnRlcjoge1xyXG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IDU1Ljc0NyxcclxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogMzcuNjI2XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHpvb206IDExLFxyXG4gICAgICAgICAgICBwb2x5Z29uczogW10sXHJcbiAgICAgICAgICAgIGNvbnRyb2w6IHt9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgXHJcbiAgICAgICAgdm0uY3VycmVudFBvbHlnb24gPSBudWxsO1xyXG4gICAgICAgIHZtLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICB2bS5jcmVhdGUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgYmFja3VwUG9seWdvbiA9IHt9O1xyXG4gICAgICAgIHZtLnBvbHlnb25zID0gW107XHJcblxyXG5cclxuICAgICAgICB2bS5ldmVudHMgPSB7XHJcbiAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAobWFwLCBldmVudE5hbWUsIG9yaWdpbmFsRXZlbnRBcmdzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0uZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZtLnNlbGVjdFBvbHlnb24ob3JpZ2luYWxFdmVudEFyZ3MuJHBhcmVudC5wb2x5Z29uKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmFkZFBvbHlnb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5jcmVhdGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IHtuYW1lOiAnZGVmYXVsdCcsIHBvbHlnb25zOiBbXSwgaXNFZGl0OiB0cnVlfTtcclxuXHJcbiAgICAgICAgICAgIHZtLmN1cnJlbnRQb2x5Z29uID0gcG9seWdvbjtcclxuICAgICAgICAgICAgdm0ubW9kZWwucG9seWdvbnMudW5zaGlmdCh2bS5jdXJyZW50UG9seWdvbik7XHJcbiAgICAgICAgICAgIHZtLmVkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2bS5jcmVhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB2bS5kcmF3aW5nTWFuYWdlck9wdGlvbnMuZHJhd2luZ01vZGUgPSBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlUeXBlLlBPTFlHT047XHJcbiAgICAgICAgICAgIHZtLmRyYXdpbmdNYW5hZ2VyT3B0aW9ucy5kcmF3aW5nQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHVwZGF0ZVBvbHlnb25zKCk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLnNlbGVjdFBvbHlnb24gPSBmdW5jdGlvbiAocG9seWdvbikge1xyXG4gICAgICAgICAgICBpZiAodm0uY3VycmVudFBvbHlnb24gIT0gcG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgdm0uaW5kZXggPSB2bS5tb2RlbC5wb2x5Z29ucy5pbmRleE9mKHBvbHlnb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLmN1cnJlbnRQb2x5Z29uICYmIHZtLmN1cnJlbnRQb2x5Z29uLmlzRWRpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmNhbmNlbEVkaXRQb2x5Z29uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2bS5jdXJyZW50UG9seWdvbiA9IHBvbHlnb247XHJcbiAgICAgICAgICAgICAgICB2bS5kcmF3aW5nTWFuYWdlck9wdGlvbnMuZHJhd2luZ01vZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdm0uZHJhd2luZ01hbmFnZXJPcHRpb25zLmRyYXdpbmdDb250cm9sID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IGdldEJvdW5kcyh2bS5jdXJyZW50UG9seWdvbik7XHJcbiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdm0ubWFwLmNvbnRyb2wuZ2V0R01hcCgpO1xyXG4gICAgICAgICAgICAgICAgbWFwLmZpdEJvdW5kcyhib3VuZHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHVwZGF0ZVBvbHlnb25zKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uc3RhcnRFZGl0UG9seWdvbiA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5jdXJyZW50UG9seWdvbiAhPSBwb2x5Z29uKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zZWxlY3RQb2x5Z29uKHBvbHlnb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJhY2t1cFBvbHlnb24gPSBhbmd1bGFyLmNvcHkodm0uY3VycmVudFBvbHlnb24pO1xyXG4gICAgICAgICAgICB2bS5jdXJyZW50UG9seWdvbi5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2bS5lZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdm0uY3JlYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB1cGRhdGVQb2x5Z29ucygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY2FuY2VsRWRpdFBvbHlnb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5jcmVhdGUpIHtcclxuICAgICAgICAgICAgICAgIHZtLm1vZGVsLnBvbHlnb25zLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0uY3VycmVudFBvbHlnb24uaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0uY3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZtLmN1cnJlbnRQb2x5Z29uID0gYmFja3VwUG9seWdvbjtcclxuICAgICAgICAgICAgdXBkYXRlUG9seWdvbnMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNhdmVQb2x5Z29uID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcclxuICAgICAgICAgICAgcG9seWdvbi5zYXZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodm0uY3JlYXRlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdm0uY3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2bS5jdXJyZW50UG9seWdvbi5pc0VkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHBvbHlnb24uc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVQb2x5Z29ucygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodm0uZWRpdCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB2bS5lZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBwb2x5Z29uLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdm0uY3VycmVudFBvbHlnb24uaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVQb2x5Z29ucygpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ucmVtb3ZlID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcclxuICAgICAgICAgICAgcG9seWdvbi5yZW1vdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdyhcImJsb2Nrcy5Db25maXJtQWN0aW9uTW9kYWxIaW50XCIpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubW9kZWwucG9seWdvbnMuc3BsaWNlKHZtLm1vZGVsLnBvbHlnb25zLmluZGV4T2YocG9seWdvbiksIDEpO1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlUG9seWdvbnMoKTtcclxuICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBwb2x5Z29uLnJlbW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB1cGRhdGVQb2x5Z29ucygpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBvbHlnb25zKCkge1xyXG4gICAgICAgICAgICB2bS5wb2x5Z29ucyA9IGdldFBvbHlnb25zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0Qm91bmRzKHBvbHlnb24pIHtcclxuICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKTtcclxuICAgICAgICAgICAgcG9seWdvbi5wYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XHJcbiAgICAgICAgICAgICAgICBib3VuZHMuZXh0ZW5kKG5ldyBnb29nbGUubWFwcy5MYXRMbmcocGF0aC5sYXRpdHVkZSwgcGF0aC5sb25naXR1ZGUpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBib3VuZHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRQb2x5Z29ucygpIHtcclxuICAgICAgICAgICAgdmFyIGNsZWFuUG9seWdvbnNBcnJheXMgPSB2bS5tb2RlbC5wb2x5Z29ucy5tYXAoZnVuY3Rpb24gKHBvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICghcG9seWdvbi5wYXRocykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uLmlzRWRpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb24uZWRpdGFibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb24uZHJhZ2dhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLmZpbGwuY29sb3IgPSAnIzYxOURERCc7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbi5zdHJva2UuY29sb3IgPSAnIzVCOThEMic7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbi5maWxsLm9wYWNpdHkgPSAwLjc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2bS5jdXJyZW50UG9seWdvbiA9PSBwb2x5Z29uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb24uZmlsbC5jb2xvciA9ICcjNjE5REREJztcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLnN0cm9rZS5jb2xvciA9ICcjNUI5OEQyJztcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLmZpbGwub3BhY2l0eSA9IDAuNztcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLmVkaXRhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbi5kcmFnZ2FibGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbi5maWxsLmNvbG9yID0gJyM1QzlCRDEnO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb24uc3Ryb2tlLmNvbG9yID0gJyM4NEMwRUQnO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb24uZWRpdGFibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLmRyYWdnYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb24uZmlsbC5vcGFjaXR5ID0gMC4yO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9seWdvbjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChjbGVhblBvbHlnb25zQXJyYXlzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNsZWFuUG9seWdvbnNBcnJheXMgPWNsZWFuUG9seWdvbnNBcnJheXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGVhblBvbHlnb25zQXJyYXlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0RGVmYXVsdFBvbHlnb24oKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgZGVmYXVsdEZpbGxDb2xvciA9ICcjNUM5QkQxJztcclxuICAgICAgICAgICAgdmFyIGRlZmF1bHRTdHJva2VDb2xvciA9ICcjNUI5OEQyJztcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGZpbGw6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogZGVmYXVsdEZpbGxDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjdcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmaWxsQ29sb3I6IGRlZmF1bHRGaWxsQ29sb3IsXHJcbiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMC43LFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IGRlZmF1bHRTdHJva2VDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogZGVmYXVsdFN0cm9rZUNvbG9yLFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2VpZ2h0OiAyLFxyXG4gICAgICAgICAgICAgICAgY2xpY2thYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHpJbmRleDogMVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdm0uZHJhd2luZ01hbmFnZXJDb250cm9sID0ge307XHJcblxyXG4gICAgICAgIHVpR21hcElzUmVhZHkucHJvbWlzZSgxKS50aGVuKGZ1bmN0aW9uIChpbnN0YW5jZXMpIHtcclxuXHJcblxyXG4gICAgICAgICAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcih2bS5kcmF3aW5nTWFuYWdlckNvbnRyb2wuZ2V0RHJhd2luZ01hbmFnZXIoKSwgJ3BvbHlnb25jb21wbGV0ZScsIGZ1bmN0aW9uIChwb2x5Z29uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBwb2x5Z29uLmdldFBhdGgoKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9seWdvbkl0ZW0gPSBnZXREZWZhdWx0UG9seWdvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb25JdGVtLnBhdGhzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmdldExlbmd0aCgpOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHh5ID0gcGF0aC5nZXRBdChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9seWdvbkl0ZW0ucGF0aHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogeHkubGF0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHh5LmxuZygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHZtLmN1cnJlbnRQb2x5Z29uLCBwb2x5Z29uSXRlbSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICBwb2x5Z29uLnNldE1hcChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5kcmF3aW5nTWFuYWdlck9wdGlvbnMuZHJhd2luZ01vZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmRyYXdpbmdNYW5hZ2VyT3B0aW9ucy5kcmF3aW5nQ29udHJvbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQb2x5Z29ucygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHVpR21hcEdvb2dsZU1hcEFwaS50aGVuKGZ1bmN0aW9uIChtYXBzKSB7XHJcbiAgICAgICAgICAgIHZtLmRyYXdpbmdNYW5hZ2VyT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIGRyYXdpbmdNb2RlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgZHJhd2luZ0NvbnRyb2w6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZHJhd2luZ0NvbnRyb2xPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvbi5UT1BfUklHSFQsXHJcbiAgICAgICAgICAgICAgICAgICAgZHJhd2luZ01vZGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuUE9MWUdPTlxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBwb2x5Z29uT3B0aW9uczogZ2V0RGVmYXVsdFBvbHlnb24oKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB2bS5zYXZlID0gZnVuY3Rpb24gKGZvcm0pIHtcclxuXHJcbiAgICAgICAgICAgIHZtLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZTtcclxuICAgICAgICAgICAgaWYodm0ubW9kZWwucG9seWdvbnMubGVuZ3RoPT0wKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZShudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZ2VvVGFyZ2V0aW5nSWQgJiYgZ2VvVGFyZ2V0aW5nSWQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgcHJvbWlzZSA9IGdlb1RhcmdldGluZy51cGRhdGUodm0ubW9kZWwpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKHZtLm1vZGVsLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zaG93ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9taXNlID0gZ2VvVGFyZ2V0aW5nLmFkZCh2bS5tb2RlbCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UocmVzdWx0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB2bS5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJvbWlzZS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uZ2VvbG9jYXRpb25BdmFpbGFibGUgPSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24gPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgdm0uZmluZE1lID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHZtLmdlb2xvY2F0aW9uQXZhaWxhYmxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihmdW5jdGlvbiAocG9zaXRpb24pIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucG9zaXRpb24uY29vcmRzLmxhdGl0dWRlID0gcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLnBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFBvc2l0aW9uKHBvc2l0aW9uLmNvb3Jkcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoKTtcclxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5zZWFyY2hib3ggPSB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnc2VhcmNoYm94LnRwbC5odG1sJywgZXZlbnRzOiB7XHJcbiAgICAgICAgICAgICAgICBwbGFjZXNfY2hhbmdlZDogZnVuY3Rpb24gKHNlYXJjaEJveCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwbGFjZSA9IHNlYXJjaEJveC5nZXRQbGFjZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYWNlIHx8IHBsYWNlID09ICd1bmRlZmluZWQnIHx8IHBsYWNlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBwbGFjZSBkYXRhIDooJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0UG9zaXRpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogcGxhY2VbMF0uZ2VvbWV0cnkubG9jYXRpb24ubGF0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogcGxhY2VbMF0uZ2VvbWV0cnkubG9jYXRpb24ubG5nKClcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBzZXRQb3NpdGlvbihwb3NpdGlvbikge1xyXG4gICAgICAgICAgICB2bS5tYXAuY2VudGVyLmxhdGl0dWRlID0gcG9zaXRpb24ubGF0aXR1ZGU7XHJcbiAgICAgICAgICAgIHZtLm1hcC5jZW50ZXIubG9uZ2l0dWRlID0gcG9zaXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDI1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2NvbnRyb2xHZW9UYXJnZXRpbmdTZXJ2aWNlJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCl7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAoZ2VvVGFyZ2V0aW5nSWQpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL2NvbnRyb2xHZW9UYXJnZXRpbmdNb2RhbC9jb250cm9sR2VvVGFyZ2V0aW5nTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnY29udHJvbEdlb1RhcmdldGluZ01vZGFsQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICBzaXplOlwibGdcIixcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnY29udHJvbC1nZW8tbW9kYWwnLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGdlb1RhcmdldGluZ0lkOiAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlb1RhcmdldGluZ0lkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMjMuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcIiR1aWJNb2RhbEluc3RhbmNlXCIsIFwibWVzc2FnZVwiLCBcImZ1bmNcIiwgXCJ0eXBlXCIsIFwibWVzc2FnZURhdGFcIiwgXCJpc01lc3NhZ2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuY29udHJvbGxlcignY29uZmlybUNvbnRyb2xsZXInLCBjb250cm9sbGVyKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgbWVzc2FnZSwgZnVuYywgdHlwZSwgbWVzc2FnZURhdGEsaXNNZXNzYWdlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHZtLm1lc3NhZ2VEYXRhID0gbWVzc2FnZURhdGE7XHJcbiAgICAgICAgdm0uaXNNZXNzYWdlID1pc01lc3NhZ2U7XHJcbiAgICAgICAgdm0udHlwZT10eXBlO1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnZGFuZ2VyJzoge1xyXG4gICAgICAgICAgICAgICAgdm0uY2xhc3NIZWFkZXIgPSAnYmctZGFuZ2VyJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ2luZm8nOiB7XHJcbiAgICAgICAgICAgICAgICB2bS5jbGFzc0hlYWRlciA9ICdiZy1ibHVlJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ3N1Y2Nlc3MnOiB7XHJcbiAgICAgICAgICAgICAgICB2bS5jbGFzc0hlYWRlciA9ICdiZy1ncmVlbic7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICB2bS5jbGFzc0hlYWRlciA9ICdiZy1kYW5nZXInO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmFwcGx5ID0gZnVuY3Rpb24gKGZvcm0pIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChmdW5jKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZ1bmMoKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIzLjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuc2VydmljZSgnY29uZmlybU1vZGFsU2VydmljZScsIHNlcnZpY2UpO1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAobWVzc2FnZSwgZnVuYywgdHlwZSxtZXNzYWdlRGF0YSxpc01lc3NhZ2UpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy9tb2RhbHMvY29uZmlybU1vZGFsL2NvbmZpcm1Nb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdjb25maXJtQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ3JlbW92ZS1tb2RhbCAnLFxyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmM7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZURhdGE6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VEYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgaXNNZXNzYWdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc01lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAyNS4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLmNvbnRyb2xsZXIoJ2NvbnRyb2xUYXJnZXRpbmdNb2RhbENvbnRyb2xsZXInLCBjb250cm9sbGVyKVxyXG5cclxuICAgIGNvbnRyb2xsZXIuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiLCBcIiRzY29wZVwiLCAnJHVpYk1vZGFsSW5zdGFuY2UnLCAndGltZVRhcmdldGluZ0lkJywgJ21vbWVudCcsICd0aW1lVGFyZ2V0aW5nJywgJ2xvY2FsZSddO1xyXG4gICAgZnVuY3Rpb24gY29udHJvbGxlcigkdWliTW9kYWwsICRzY29wZSwgJHVpYk1vZGFsSW5zdGFuY2UsIHRpbWVUYXJnZXRpbmdJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9tZW50LCB0aW1lVGFyZ2V0aW5nLCBsb2NhbGUpIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLmxvY2FsZSA9IGxvY2FsZS5nZXRMb2NhbGUoKTtcclxuICAgICAgICB2bS5tb2RlbCA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZToge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBydTogXCLQn9C9XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW46IFwiTW9uXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3VyczogW11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZToge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBydTogXCLQktGCXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW46IFwiVHVlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3VyczogW11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZToge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBydTogXCLQodGAXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW46IFwiV2VkXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3VyczogW11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZToge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBydTogXCLQp9GCXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW46IFwiVGh1XCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3VyczogW11cclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgbmFtZToge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBydTogXCLQn9GCXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW46IFwiRnJpXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3VyczogW11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZToge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBydTogXCLQodCxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW46IFwiU2F0XCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3VyczogW11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZToge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBydTogXCLQktGBXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZW46IFwiU3VuXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3VyczogW11cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICBdO1xyXG4gICAgICAgIHZtLnJhbmdlcyA9IHtcclxuICAgICAgICAgICAgc3RhcnREYXk6IDAsXHJcbiAgICAgICAgICAgIGVuZERheTogNixcclxuICAgICAgICAgICAgZW5kSG91cjogMCxcclxuICAgICAgICAgICAgc3RhcnRIb3VyOiAyMyxcclxuICAgICAgICAgICAgZW5kSG91clNlY29uZDogMCxcclxuICAgICAgICAgICAgc3RhcnRIb3VyVGhpcmQ6IDIzXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGltZVRhcmdldGluZ0lkKSB7XHJcbiAgICAgICAgICAgIHRpbWVUYXJnZXRpbmcuZ2V0VGltZVRhcmdldGluZyh0aW1lVGFyZ2V0aW5nSWQpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS50aW1lVGFyZ2V0aW5nID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVNb2RlbCh2bS50aW1lVGFyZ2V0aW5nKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLnNhdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLmxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRpbWVUYXJnZXRpbmdJZCkge1xyXG4gICAgICAgICAgICAgICAgdm0udGltZVRhcmdldGluZy5jb250ZW50ID0gZ2V0Q29udGVudEZyb21UaW1lVGFibGUodm0ubW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgdGltZVRhcmdldGluZy51cGRhdGVUaW1lVGFyZ2V0aW5nKHZtLnRpbWVUYXJnZXRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UodGltZVRhcmdldGluZ0lkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdGltZVRhcmdldGluZ01vZGVsID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vbWVudCgpLmZvcm1hdChcIkRELk1NLllZWVkvSEg6bW06c3NcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG1vbWVudCgpLmZvcm1hdChcIkRELk1NLllZWVkvSEg6bW06c3NcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogZ2V0Q29udGVudEZyb21UaW1lVGFibGUodm0ubW9kZWwpXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGltZVRhcmdldGluZy5jcmVhdGVUaW1lVGFyZ2V0aW5nKHRpbWVUYXJnZXRpbmdNb2RlbClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKHJlc3BvbnNlLmlkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5vbkhvdXJTdGFydFNlbGVjdCA9IG51bGw7XHJcbiAgICAgICAgdm0uc3RhcnRTZWxlY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLnNlbGVjdCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAodm0ub25Ib3VyU3RhcnRTZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHZtLm9uSG91clN0YXJ0U2VsZWN0LnNlbGVjdGVkID0gIXZtLm9uSG91clN0YXJ0U2VsZWN0LnNlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgdm0udmFsdWUgPSB2bS5vbkhvdXJTdGFydFNlbGVjdC5zZWxlY3RlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uZW5kU2VsZWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5zZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgdm0ub25Ib3VyU3RhcnRTZWxlY3QgPSBudWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uc2VsZWN0SG91ciA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB2bS52YWx1ZSA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zdGFydFNlbGVjdE9uSG91ciA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHZtLm9uSG91clN0YXJ0U2VsZWN0ID0gaXRlbTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh2bS5tb2RlbCwgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmhvdXJzLnB1c2goe3NlbGVjdGVkOiB0cnVlfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5zZWxlY3REYXlzID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcclxuICAgICAgICAgICAgdW5TZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kICsgMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5zZWxlY3RIb3Vyc0luRGF5KHZtLm1vZGVsW2ldLCAwLCAyMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm0ucmFuZ2VzLnN0YXJ0RGF5ID0gc3RhcnQ7XHJcbiAgICAgICAgICAgIHZtLnJhbmdlcy5lbmREYXkgPSBlbmQ7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uc2VsZWN0SG91cnMgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgbm90UmVzZXQpIHtcclxuICAgICAgICAgICAgaWYgKCFub3RSZXNldCkge1xyXG4gICAgICAgICAgICAgICAgdW5TZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2godm0ubW9kZWwsIGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZtLnJhbmdlcy5zdGFydERheSA8PSBpbmRleCAmJiBpbmRleCA8PSB2bS5yYW5nZXMuZW5kRGF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uc2VsZWN0SG91cnNJbkRheShpdGVtLCBzdGFydCwgZW5kKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLnNlbGVjdEhvdXJzSW5EYXkgPSBmdW5jdGlvbiAoZGF5LCBzdGFydCwgZW5kKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZCArIDE7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZGF5LmhvdXJzW2ldLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVuU2VsZWN0QWxsKCkge1xyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2godm0ubW9kZWwsIGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmhvdXJzW2ldLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRDb250ZW50RnJvbVRpbWVUYWJsZShtb2RlbCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChtb2RlbCwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF5c0hvdXJzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5ob3Vyc1tpXS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXlzSG91cnMucHVzaChpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gZGF5c0hvdXJzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZU1vZGVsKHRpbWVUYXJnZXRpbmcpIHtcclxuICAgICAgICAgICAgdW5TZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBhbmd1bGFyLmZyb21Kc29uKHRpbWVUYXJnZXRpbmcuY29udGVudCk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRlbnRbaV0ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5tb2RlbFtpXS5ob3Vyc1tjb250ZW50W2ldW2pdXS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDI1LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2NvbnRyb2xUYXJnZXRpbmdNb2RhbFNlcnZpY2UnLCBzZXJ2aWNlKVxyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKXtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIHNlbGYuc2hvd0NvbnRyb2xUYXJnZXRpbmdNb2RhbCA9IGZ1bmN0aW9uICh0aW1lVGFyZ2V0aW5nSWQpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL2NvbnRyb2xUYXJnZXRpbmdNb2RhbC9jb250cm9sVGFyZ2V0aW5nTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnY29udHJvbFRhcmdldGluZ01vZGFsQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICBzaXplOidsZycsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGltZVRhcmdldGluZ0lkOiAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVUYXJnZXRpbmdJZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIzLjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuY29udHJvbGxlcigncmVtb3ZlQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpXHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCIsIFwiJHNjb3BlXCIsICckdWliTW9kYWxJbnN0YW5jZScsICdzZWxlY3RlZCcsICdzZXJ2aWNlJywgJ3R5cGUnLCAnYWRkaXRpb25hbFR5cGUnLCAnJHEnLCAnZXJyb3JIYW5kbGVySGVscGVyJ107XHJcbiAgICBmdW5jdGlvbiBjb250cm9sbGVyKCR1aWJNb2RhbCwgJHNjb3BlLCAkdWliTW9kYWxJbnN0YW5jZSwgc2VsZWN0ZWQsIHNlcnZpY2UsIHR5cGUsIGFkZGl0aW9uYWxUeXBlLCAkcSwgZXJyb3JIYW5kbGVySGVscGVyKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcbiAgICAgICAgdm0udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgdm0ub25lUGxheWVyID0gc2VsZWN0ZWQubGVuZ3RoID09IDE7XHJcbiAgICAgICAgdm0ucmVtb3ZlID0gZnVuY3Rpb24gKGZvcm0pIHtcclxuICAgICAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGFkZGl0aW9uYWxUeXBlKSkge1xyXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFR5cGUgPSBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IHNlbGVjdGVkLm1hcChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VbXCJyZW1vdmVcIiArIGFkZGl0aW9uYWxUeXBlXShpdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZShyZXN1bHQsIGZvcm0sIHZtKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMjMuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnBsYXllcnNcIilcclxuICAgICAgICAuc2VydmljZSgncmVtb3ZlTW9kYWxTZXJ2aWNlJywgc2VydmljZSlcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIiwgXCJwbGF5ZXJzXCIsIFwidmlydHVhbFNjcmVlbnNcIixcImNhbXBhaWduc1wiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsLCBwbGF5ZXJzLCB2aXJ0dWFsU2NyZWVucyxjYW1wYWlnbnMpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIHNlbGYuc2hvd1JlbW92ZU1vZGFsID0gZnVuY3Rpb24gKHNlbGVjdGVkLCB0eXBlKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdwbGF5ZXJzJzpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2hvd1Byb3RlY3RlZE1vZGFsKHNlbGVjdGVkLCBwbGF5ZXJzLHR5cGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjYW1wYWlnbnMnOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTaG93UHJvdGVjdGVkTW9kYWwoc2VsZWN0ZWQsIGNhbXBhaWducyx0eXBlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAndmlydHVhbFNjcmVlbnMnOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTaG93UHJvdGVjdGVkTW9kYWwoc2VsZWN0ZWQsIHZpcnR1YWxTY3JlZW5zLHR5cGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIFNob3dQcm90ZWN0ZWRNb2RhbChzZWxlY3RlZCwgc2VydmljZSx0eXBlKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3AgOiAnc3RhdGljJyx0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL21vZGFscy9yZW1vdmVNb2RhbHMvcmVtb3ZlUHJvdGVjdGVkTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAncmVtb3ZlUHJvdGVjdGVkQ29udHJvbGxlciBhcyB2bScsXHJcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ3JlbW92ZS1tb2RhbCcsXHJcblxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBTaG93TW9kYWwoc2VsZWN0ZWQsIHNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLHRlbXBsYXRlVXJsOiAncGxheWVycy9jb21wb25lbnRzL21vZGFscy9yZW1vdmVQbGF5ZXJNb2RhbC9yZW1vdmVQbGF5ZXJNb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdyZW1vdmVQbGF5ZXJDb250cm9sbGVyIGFzIHZtJyxcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAncmVtb3ZlLXBsYXllci1tb2RhbCcsXHJcblxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGxheWVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDIzLjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuY29udHJvbGxlcigncmVtb3ZlUHJvdGVjdGVkQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpXHJcblxyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCIsIFwiJHNjb3BlXCIsICckdWliTW9kYWxJbnN0YW5jZScsICdzZWxlY3RlZCcsJ3NlcnZpY2UnLCd0eXBlJywnJHEnLCdlcnJvckhhbmRsZXJIZWxwZXInXTtcclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsLCAkc2NvcGUsICR1aWJNb2RhbEluc3RhbmNlLCBzZWxlY3RlZCxzZXJ2aWNlLHR5cGUsJHEsZXJyb3JIYW5kbGVySGVscGVyKSB7XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5nZW5lcmF0ZWRDb2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMCkgKyAxMDAwO1xyXG5cclxuICAgICAgICB2bS50eXBlPXR5cGU7XHJcbiAgICAgICAgdm0ub25lUGxheWVyID1zZWxlY3RlZC5sZW5ndGg9PTE7XHJcbiAgICAgICAgdm0ucmVtb3ZlID0gZnVuY3Rpb24gKGZvcm0pIHtcclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZvcm0uJHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5sb2FkaW5nPXRydWU7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZXMgPVtdO1xyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdGVkLGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzZXJ2aWNlLnJlbW92ZShpdGVtKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICRxLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZz1mYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmxvYWRpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVySGVscGVyLmhhbmRsZUVycm9yUmVzcG9uc2UocmVzdWx0LGZvcm0sIHZtKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIlxyXG4oZnVuY3Rpb24gKCkge1xyXG4gICAgY29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsSW5zdGFuY2VcIiwgXCJwb3NpdGlvblwiLCBcIm5hbWVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIilcclxuICAgICAgICAuc2VydmljZSgnc2hvd1Bvc2l0aW9uU2VydmljZScsIHNlcnZpY2UpO1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2hvdyA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgbmFtZSkge1xyXG4gICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnYmxvY2tzL2NvbXBvbmVudHMvbW9kYWxzL3Nob3dQb3NpdGlvbi9zaG93UG9zaXRpb24uaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcImxnXCIsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UsIHBvc2l0aW9uLCBuYW1lKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuXHJcblxyXG4gICAgICAgIHZtLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHZtLnNob3cgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAgICAgdm0ucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGlkOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICBjb29yZHM6IHtcclxuICAgICAgICAgICAgICAgIGxhdGl0dWRlOiA1NS43NDcsXHJcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IDM3LjYyNlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm1hcCA9IHtcclxuICAgICAgICAgICAgY2VudGVyOiB7XHJcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogNTUuNzQ3LFxyXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiAzNy42MjZcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbWFya2VyczogW10sXHJcbiAgICAgICAgICAgIHpvb206IDExXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxhdGl0dWRlKSB7XHJcbiAgICAgICAgICAgIHNldFBvc2l0aW9uKHBvc2l0aW9uLCB0cnVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2V0UG9zaXRpb24ocG9zaXRpb24sIGNlbnRlcikge1xyXG5cclxuICAgICAgICAgICAgdm0ucG9zaXRpb24uY29vcmRzLmxhdGl0dWRlID0gcG9zaXRpb24ubGF0aXR1ZGU7XHJcbiAgICAgICAgICAgIHZtLnBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUgPSBwb3NpdGlvbi5sb25naXR1ZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VudGVyKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5tYXAuY2VudGVyLmxhdGl0dWRlID0gcG9zaXRpb24ubGF0aXR1ZGU7XHJcbiAgICAgICAgICAgICAgICB2bS5tYXAuY2VudGVyLmxvbmdpdHVkZSA9IHBvc2l0aW9uLmxvbmdpdHVkZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHRpbWVvdXRcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwidmlld1RhZ1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICB0YWdzU3RyaW5nOiBcIkBcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jsb2Nrcy9jb21wb25lbnRzL3RhZ0NvbXBvbmVudHMvdmlld1RhZy92aWV3VGFnLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCR0aW1lb3V0KSB7XHJcblxyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAodm0udGFnc1N0cmluZykge1xyXG4gICAgICAgICAgICB2bS50YWdzID0gYW5ndWxhci5mcm9tSnNvbih2bS50YWdzU3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ubGVuZ3RoID0gdm0udGFncy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh2bS5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICB2bS50YWcgPSB2bS50YWdzWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh2bS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICB2bS5ub25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodm0ubGVuZ3RoID4gMSAmJiB2bS5sZW5ndGggPCA1KSB7XHJcbiAgICAgICAgICAgIHZtLmxlc3M1ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLm1hbnkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdm0ucG9wb3ZlciA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdibG9ja3MvY29tcG9uZW50cy90YWdDb21wb25lbnRzL3ZpZXdUYWcvcG9wdXBUYWcuaHRtbCdcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2bS5zaG93ID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdm0uaGlkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZtLmhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5pc09wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2bS5oaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwMClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJEVE9wdGlvbnNCdWlsZGVyXCIsIFwiJGNvbXBpbGVcIiwgXCIkc2NvcGVcIiwgXCJsb2NhbGVcIiwgXCIkdGltZW91dFwiLCBcInRlbGVkc1RhYmxlU2VydmljZVwiLCBcInN0YXRpc3RpY3NcIiwgXCJ0YWJsZUhlbHBlclwiLCBcIm5vdGlmaWNhdGlvblNlcnZpY2VcIiwgXCIkcm9vdFNjb3BlXCIsIFwiJGZpbHRlclwiLCBcIiRzdGF0ZVwiLCBcIiRlbGVtZW50XCIsIFwiJHFcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5ibG9ja3NcIikuY29tcG9uZW50KFwic3RhdHNUYWJsZVwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHk6IFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIGluZGV4OiBcIkBcIixcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSG91cnM6IFwiPFwiLFxyXG4gICAgICAgICAgICAgICAgb25VcGRhdGVTZWxlY3RlZEhvdXJzOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIG9uQWRkRmlsdGVyOiBcIiZcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB7XHJcbiAgICAgICAgICAgICAgICAnYnV0dG9ucyc6ICc/ZnVuY0J1dHRvbnMnXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29tcG9uZW50cy9zdGF0aXN0aWNzL2NvbXBvbmVudHMvc3RhdHNUYWJsZS9zdGF0c1RhYmxlLmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKERUT3B0aW9uc0J1aWxkZXIsICRjb21waWxlLCAkc2NvcGUsIGxvY2FsZSwgJHRpbWVvdXQsIHRlbGVkc1RhYmxlU2VydmljZSwgc3RhdGlzdGljcywgdGFibGVIZWxwZXIsIG5vdGlmaWNhdGlvblNlcnZpY2UsICRyb290U2NvcGUsICRmaWx0ZXIsICRzdGF0ZSwgJGVsZW1lbnQsICRxKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0uZHRPcHRpb25zID0gRFRPcHRpb25zQnVpbGRlclxyXG4gICAgICAgICAgICAubmV3T3B0aW9ucygpXHJcbiAgICAgICAgICAgIC53aXRoRm5TZXJ2ZXJEYXRhKHNlcnZlckRhdGEpXHJcbiAgICAgICAgICAgIC53aXRoRGF0YVByb3AoJ2RhdGEnKVxyXG4gICAgICAgICAgICAud2l0aE9wdGlvbigncHJvY2Vzc2luZycsIGZhbHNlKVxyXG4gICAgICAgICAgICAud2l0aE9wdGlvbignYWpheCcsIHRydWUpXHJcbiAgICAgICAgICAgIC53aXRoT3B0aW9uKCdyZXNwb25zaXZlJywgdHJ1ZSlcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oXCJpbmZvXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAud2l0aE9wdGlvbihcInNlYXJjaGluZ1wiLCBmYWxzZSlcclxuICAgICAgICAgICAgLndpdGhPcHRpb24oXCJwYWdpbmdcIiwgZmFsc2UpXHJcbiAgICAgICAgICAgIC53aXRoT3B0aW9uKFwibGVuZ3RoQ2hhbmdlXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAud2l0aE9wdGlvbihcInNjcm9sbFlcIiwgXCJjYWxjKDEwMHZoIC0gNDg1cHgpXCIpXHJcbiAgICAgICAgICAgIC53aXRoT3B0aW9uKCdjcmVhdGVkUm93JywgZnVuY3Rpb24gKHJvdywgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KHJvdykuYXR0cihcIm5nLWNsaWNrXCIsIFwidm0uYWN0aW9uKCdjbGljaycsJ1wiICsgZGF0YS5pZCArIFwiJylcIik7XHJcbiAgICAgICAgICAgICAgICAkY29tcGlsZShhbmd1bGFyLmVsZW1lbnQocm93KSkoJHNjb3BlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGpRdWVyeS5mbi5kYXRhVGFibGVFeHQub1NvcnRbXCJob3VyLWRlc2NcIl0gPSBmdW5jdGlvbiAoeCwgeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoeSkgLSBwYXJzZUludCh4KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBqUXVlcnkuZm4uZGF0YVRhYmxlRXh0Lm9Tb3J0W1wiaG91ci1hc2NcIl0gPSBmdW5jdGlvbiAoeCwgeSkge1xyXG4gICAgICAgICAgICByZXR1cm4galF1ZXJ5LmZuLmRhdGFUYWJsZUV4dC5vU29ydFtcImhvdXItZGVzY1wiXSh5LCB4KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgalF1ZXJ5LmZuLmRhdGFUYWJsZUV4dC5vU29ydFtcInN0YXREYXRlcy1kZXNjXCJdID0gZnVuY3Rpb24gKHgsIHkpIHtcclxuICAgICAgICAgICAgdmFyIGRpZmYgPSBtb21lbnQoeSwgJ1lZWVktTU0tREQnKS5kaWZmKG1vbWVudCh4LCAnWVlZWS1NTS1ERCcpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgalF1ZXJ5LmZuLmRhdGFUYWJsZUV4dC5vU29ydFtcInN0YXREYXRlcy1hc2NcIl0gPSBmdW5jdGlvbiAoeCwgeSkge1xyXG4gICAgICAgICAgICByZXR1cm4galF1ZXJ5LmZuLmRhdGFUYWJsZUV4dC5vU29ydFtcInN0YXREYXRlcy1kZXNjXCJdKHksIHgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnNlcnZlckRhdGEgPSBmdW5jdGlvbiBzZXJ2ZXJEYXRhKHNTb3VyY2UsIGFvRGF0YSwgZm5DYWxsYmFjaywgb1NldHRpbmdzKSB7XHJcbiAgICAgICAgICAgIHZhciBxdWVyeSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh2bS5zZWxlY3RlZEhvdXJzICYmIHZtLnNlbGVjdGVkSG91cnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSBzdGF0aXN0aWNzLmdldExpc3RHcm91cEJ5Rm9ySG91cnModm0uZW50aXR5LCB2bS5vcHRpb24sIHZtLnNlbGVjdGVkSG91cnMpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gc3RhdGlzdGljcy5nZXRMaXN0R3JvdXBCeSh2bS5lbnRpdHksIHZtLm9wdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcXVlcnkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKHRhYmxlSGVscGVyLndyYXBMaXN0KHJlc3VsdCkpO1xyXG4gICAgICAgICAgICAgICAgVXBkYXRlVG90YWwocmVzdWx0KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZm5DYWxsYmFjayh0YWJsZUhlbHBlci5nZXRFbXB0eUxpc3QoKSk7XHJcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dXYXJuaW5nKCdjb21tb24uRmFpbGVkR2V0Jyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBzZWxlY3RlZEhvdXJzID0gW107XHJcblxyXG4gICAgICAgIHZhciB0aW1lcjtcclxuICAgICAgICAkZWxlbWVudC5maW5kKCcuc3RhdHMtdGFibGUnKS5vbignY2xpY2snLCAndHI6bm90KC5zdGF0cy10YWJsZV9oZWFkZXIgLCAuc3RhdHMtdGFibGVfb3Zlci1oZWFkZXIpJywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIGVsZW0gPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAodm0uZW50aXR5ID09ICdob3VyJykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGhvdXIgPSBlbGVtLmNoaWxkcmVuKCkuZmlyc3QoKS50ZXh0KCkuc3BsaXQoJzonKVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNDbGFzcygnc2VsZWN0ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gc2VsZWN0ZWRIb3Vycy5maW5kKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtID09IGhvdXI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSG91cnMuc3BsaWNlKHNlbGVjdGVkSG91cnMuaW5kZXhPZihpdGVtKSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEhvdXJzLnB1c2goaG91cik7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aW1lcikge1xyXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHRpbWVyKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICB0aW1lciA9ICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub25VcGRhdGVTZWxlY3RlZEhvdXJzKHtob3Vyczogc2VsZWN0ZWRIb3Vyc30pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLCAxMDAwKTtcclxuXHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAobG9jYWxlLmdldExvY2FsZSgpID09ICdydScpIHtcclxuICAgICAgICAgICAgdm0uZHRPcHRpb25zLndpdGhMYW5ndWFnZVNvdXJjZSgnLy9jZG4uZGF0YXRhYmxlcy5uZXQvcGx1Zy1pbnMvMS4xMC45L2kxOG4vUnVzc2lhbi5qc29uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2bS5kdEludGFuY2VDYWxsYmFjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB2bS5kdEluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcmVzaXplRXYgPSAkcm9vdFNjb3BlLiRvbigncmVzaXplLnN0YXRzVGFibGUnLCBmdW5jdGlvbiAoZXYsIGluZGV4KSB7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdm0uaW5kZXggJiYgdm0uZHRJbnN0YW5jZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZtLmR0SW5zdGFuY2UuRGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgcmVzaXplQWxsRXYgPSAkcm9vdFNjb3BlLiRvbigncmVzaXplLmFsbFRhYmxlcycsIGZ1bmN0aW9uIChldiwgaW5kZXgpIHtcclxuICAgICAgICAgICAgaWYgKHZtLmR0SW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgIHZtLmR0SW5zdGFuY2UuRGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZtLnJlbG9hZERhdGEgPSBmdW5jdGlvbiAocmVzZXRQYWdpbmcsIGZ1bmMpIHtcclxuICAgICAgICAgICAgaWYgKHZtLmR0SW5zdGFuY2UgJiYgdm0uZHRJbnN0YW5jZS5yZWxvYWREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5kdEluc3RhbmNlLnJlbG9hZERhdGEoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmdW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCByZXNldFBhZ2luZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0ucmVsb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5yZWxvYWREYXRhKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICB2bS5zZWxlY3REYXkgPSBmdW5jdGlvbiAoZGF5KSB7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmNvbHVtbnMgPSBbXTtcclxuXHJcbiAgICAgICAgdm0uYWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbiwgaWQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZUNsaWNrJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9PbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpY2snOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ub25BZGRGaWx0ZXIoe2lkOiBpZH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpY2tOYW1lJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZtLmdvVG9PbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uZ29Ub09uZSA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHZtLmVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnY29udGVudCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5jb250ZW50Lm9uZScsIHtpZDogaWR9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2NhbXBhaWduJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbygncGVyc29uYWxBY2NvdW50LmNhbXBhaWduLm9uZScsIHtpZDogaWR9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXllcic6IHtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5wbGF5ZXIub25lJywge2lkOiBpZH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6IHtcclxuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ3BlcnNvbmFsQWNjb3VudC5kYXknLCB2bS5nZXRTdGF0cyhpZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuJG9uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmVzaXplRXYoKTtcclxuICAgICAgICAgICAgcmVzaXplQWxsRXYoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLiRvbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlc09iaikge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmoub3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gYW5ndWxhci5jb3B5KHZtLm9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICBvcHRpb24uc3RhcnREYXRlID0gbW9tZW50KHZtLm9wdGlvbi5zdGFydERhdGUpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uLmVuZERhdGUgPSBtb21lbnQodm0ub3B0aW9uLmVuZERhdGUpLmZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5wbGF5ZXJzICYmIG9wdGlvbi5wbGF5ZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnBsYXllcnMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5jYW1wYWlnbnMgJiYgb3B0aW9uLmNhbXBhaWducy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5jYW1wYWlnbnMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5jb250ZW50cyAmJiBvcHRpb24uY29udGVudHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb24uY29udGVudHMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdm0udXJsUGFyYW1zID0gb3B0aW9uO1xyXG4gICAgICAgICAgICAgICAgdm0ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNPYmouc2VsZWN0ZWRIb3VycyAmJiAhY2hhbmdlc09iai5zZWxlY3RlZEhvdXJzLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICAgICAgICAgICAgdm0ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uZ2V0U3RhdHMgPSBmdW5jdGlvbiAoZGF5KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodm0udXJsUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdXJsUGFyYW1zID0gYW5ndWxhci5jb3B5KHZtLnVybFBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5ndWxhci5leHRlbmQoe2RheTogZGF5fSwgdXJsUGFyYW1zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZGF5OiBkYXl9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICBzd2l0Y2ggKHZtLmVudGl0eSkge1xyXG4gICAgICAgICAgICBjYXNlICdkYXRlJzoge1xyXG4gICAgICAgICAgICAgICAgdm0uY29sdW1ucy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNUeXBlOiAnc3RhdERhdGVzJyxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uTmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKGRhdGEsIGZ1bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiPGEgaHJlZj0nJyBuZy1jbGljaz1cXFwidm0uYWN0aW9uKCdjbGlja05hbWUnLFxcJ1wiICsgZGF0YSArIFwiXFwnKTskZXZlbnQucHJldmVudERlZmF1bHQoKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XFxcIiA+XCIgKyBtb21lbnQoZGF0YSwgXCJZWVlZLU1NLUREXCIpLmZvcm1hdCgnREQuTU0uWVlZWScpICsgXCI8L2E+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdob3VyJzoge1xyXG4gICAgICAgICAgICAgICAgdm0uY29sdW1ucy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNUeXBlOiAnaG91cicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiY29tbW9uLk5hbWVcIixcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50LnV0YyhkYXRhKS5sb2NhbCgpLmZvcm1hdCgnSEg6MDAnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnY29udGVudCc6IHtcclxuICAgICAgICAgICAgICAgIHZtLmNvbHVtbnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ25hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcImNvbW1vbi5OYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbENsYXNzOiBcInN0YXRzLWJvZHlfY2VsbC0tY29sb3ItYmxhY2sgc3RhdHMtYm9keV9jZWxsLS1uYW1lIHRhYmxlLWxpbmtcIixcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChkYXRhLCBmdWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIjxkaXYgc3R5bGU9J3doaXRlLXNwYWNlOiBub3dyYXAnPlwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiPGNvbnRlbnQtcHJldmlldyBjb250ZW50LWlkPSdcIiArIGZ1bGwuaWQgKyBcIic+PC9jb250ZW50LXByZXZpZXc+XCI7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvcG92ZXIgPSBkYXRhLmxlbmd0aCA+IDYgPyBcIiB1aWItcG9wb3Zlcj0nXCIgKyBkYXRhICsgXCInXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwb3BvdmVyLWFwcGVuZC10by1ib2R5PSd0cnVlICdcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBvcG92ZXItcG9wdXAtZGVsYXk9JzUwMCdcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBvcG92ZXItdHJpZ2dlcj0nbW91c2VlbnRlcidcIiA6IFwiXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCI8c3BhbiBjbGFzcz0nY29udHJvbCcgXCIgKyAoIWZ1bGwuZGVsZXRlZCA/IFwiIG5nLWNsaWNrPVxcXCJ2bS5hY3Rpb24oJ2NsaWNrTmFtZScsXFwnXCIgKyBmdWxsLmlkICsgXCJcXCcpOyRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcXFwiXCIgOiBcIlwiKSArIHBvcG92ZXIgKyBcIj5cIiArIGRhdGEgKyBcIjwvc3Bhbj48L2Rpdj5cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gXCI8ZGl2IGNsYXNzPSdzdGF0cy1ib2R5X2Jsb2NrLW5hbWUgXCIgKyAoZnVsbC5kZWxldGVkID8gXCJzdGF0cy1pdGVtLWRpc2FibGVkXCIgOiBcIlwiKSArIFwiJz5cIiArIHJlc3VsdCArIFwiPC9kaXY+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICB2bS5jb2x1bW5zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICduYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJjb21tb24uTmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjMwJVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxDbGFzczogXCJzdGF0cy1ib2R5X2NlbGwtLWNvbG9yLWJsYWNrIHN0YXRzLWJvZHlfY2VsbC0tbmFtZSB0YWJsZS1saW5rXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoZGF0YSwgZnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gOCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gXCI8c3BhblwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWZ1bGwuZGVsZXRlZCA/IFwiIG5nLWNsaWNrPVxcXCJ2bS5hY3Rpb24oJ2NsaWNrTmFtZScsXFwnXCIgKyBmdWxsLmlkICsgXCJcXCcpOyRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XFxcIlwiIDogXCJcIikgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHVpYi1wb3BvdmVyPSdcIiArIGRhdGEgKyBcIidcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwb3BvdmVyLWFwcGVuZC10by1ib2R5PSd0cnVlICdcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwb3BvdmVyLXBvcHVwLWRlbGF5PSc1MDAnXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicG9wb3Zlci10cmlnZ2VyPSdtb3VzZWVudGVyJ1wiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzPSdjb250cm9sJ1wiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCI8c3Bhbj5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFwiPGRpdiBjbGFzcz0nc3RhdHMtYm9keV9ibG9jay1uYW1lICBcIiArIChmdWxsLmRlbGV0ZWQgPyBcInN0YXRzLWl0ZW0tZGlzYWJsZWRcIiA6IFwiXCIpICsgXCInXCIgKyBcIiA+XCIgKyByZXN1bHQgKyBcIjwvZGl2PlwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZtLmNvbHVtbnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJ0b3RhbFwiLFxyXG4gICAgICAgICAgICAgICAgY2VsbENsYXNzOiBcInN0YXRzLWJvZHlfY2VsbC0tY29sb3ItYmxhY2tcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJzY3JlZW5fb25cIixcclxuICAgICAgICAgICAgICAgIGNlbGxDbGFzczogXCJzdGF0cy1ib2R5X2NlbGwtLWNvbG9yLWdyZWVuXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwic2NyZWVuX29mZlwiLFxyXG4gICAgICAgICAgICAgICAgY2VsbENsYXNzOiBcInN0YXRzLWJvZHlfY2VsbC0tY29sb3ItcmVkXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwicGF5XyRcIixcclxuICAgICAgICAgICAgICAgIGNlbGxDbGFzczogXCJzdGF0cy1ib2R5X2NlbGwtLWNvbG9yLWdyZWVuXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwicGF5X2ZyZWVcIixcclxuICAgICAgICAgICAgICAgIGNlbGxDbGFzczogXCJzdGF0cy1ib2R5X2NlbGwtLWNvbG9yLXJlZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2Nvc3QnLFxyXG4gICAgICAgICAgICAgICAgY2VsbENsYXNzOiBcInN0YXRzLWJvZHlfY2VsbC0tY29sb3ItYmxhY2tcIixcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB2bS5kdENvbHVtbnMgPSB0ZWxlZHNUYWJsZVNlcnZpY2UuZ2V0RHRDb2x1bW5zKHZtLmNvbHVtbnMpO1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2VydmVyRGF0YShzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2ssIG9TZXR0aW5ncykge1xyXG4gICAgICAgICAgICB2bS5wcm9taXNlID0gdm0uc2VydmVyRGF0YShzU291cmNlLCBhb0RhdGEsIGZuQ2FsbGJhY2ssIG9TZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gVXBkYXRlVG90YWwoc3RhdCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gc3RhdC5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHByZXYudG90YWwgKyBjdXJyLnRvdGFsT3JpZ2luLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcmVlbl9vbjogcHJldi5zY3JlZW5fb24gKyBjdXJyLnNjcmVlbl9vbk9yaWdpbixcclxuICAgICAgICAgICAgICAgICAgICBzY3JlZW5fb2ZmOiBwcmV2LnNjcmVlbl9vZmYgKyBjdXJyLnNjcmVlbl9vZmZPcmlnaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgcGF5XyQ6IHByZXYucGF5XyQgKyBjdXJyLnBheV8kT3JpZ2luLFxyXG4gICAgICAgICAgICAgICAgICAgIHBheV9mcmVlOiBwcmV2LnBheV9mcmVlICsgY3Vyci5wYXlfZnJlZU9yaWdpbixcclxuICAgICAgICAgICAgICAgICAgICBjb3N0OiBwcmV2LmNvc3QgKyBjdXJyLmNvc3RPcmlnaW5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdG90YWw6IDAsXHJcbiAgICAgICAgICAgICAgICBzY3JlZW5fb246IDAsXHJcbiAgICAgICAgICAgICAgICBzY3JlZW5fb2ZmOiAwLFxyXG4gICAgICAgICAgICAgICAgcGF5XyQ6IDAsXHJcbiAgICAgICAgICAgICAgICBwYXlfZnJlZTogMCxcclxuICAgICAgICAgICAgICAgIGNvc3Q6IDBcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0b3RhbC50b3RhbCA9ICRmaWx0ZXIoJ251bWJlcicpKHRvdGFsLnRvdGFsLCAwKTtcclxuICAgICAgICAgICAgdG90YWwuc2NyZWVuX29uID0gJGZpbHRlcignbnVtYmVyJykodG90YWwuc2NyZWVuX29uLCAwKTtcclxuICAgICAgICAgICAgdG90YWwuc2NyZWVuX29mZiA9ICRmaWx0ZXIoJ251bWJlcicpKHRvdGFsLnNjcmVlbl9vZmYsIDApO1xyXG4gICAgICAgICAgICB0b3RhbC5wYXlfJCA9ICRmaWx0ZXIoJ251bWJlcicpKHRvdGFsLnBheV8kLCAwKTtcclxuICAgICAgICAgICAgdG90YWwucGF5X2ZyZWUgPSAkZmlsdGVyKCdudW1iZXInKSh0b3RhbC5wYXlfZnJlZSwgMCk7XHJcbiAgICAgICAgICAgIHRvdGFsLmNvc3QgPSAkZmlsdGVyKCdudW1iZXInKSh0b3RhbC5jb3N0LCAwKTtcclxuXHJcbiAgICAgICAgICAgIHZtLnRvdGFsID0gdG90YWw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wibG9jYWxlXCIsIFwiJHN0YXRlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuc3RhdGlzdGljc1wiKS5jb21wb25lbnQoXCJmaWx0ZXJTdW1tYXJ5U3RhdGlzdGljXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcIiZcIixcclxuICAgICAgICAgICAgICAgIG5nT3B0aW9uOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIGRheTogXCI8XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb21wb25lbnRzL3N0YXRpc3RpY3MvY29tcG9uZW50cy9maWx0ZXJTdW1tYXJ5U3RhdGlzdGljL2ZpbHRlclN1bW1hcnlTdGF0aXN0aWMuaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIobG9jYWxlLCAkc3RhdGUpIHtcclxuXHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG5cclxuICAgICAgICB2bS5wbGF5ZXJzID0gW107XHJcbiAgICAgICAgdm0uY2FtcGFpZ25zID0gW107XHJcbiAgICAgICAgdm0uY29udGVudHMgPSBbXTtcclxuICAgICAgICB2bS5tYXhSYW5nZSA9IHt2YWw6IDEsIHR5cGU6IFwibW9udGhcIn07XHJcblxyXG5cclxuICAgICAgICB2bS4kb25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh2bS5uZ09wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdm0ucGxheWVycyA9IHZtLm5nT3B0aW9uLnBsYXllcnMgPyB2bS5uZ09wdGlvbi5wbGF5ZXJzIDogW107XHJcbiAgICAgICAgICAgICAgICB2bS5jYW1wYWlnbnMgPSB2bS5uZ09wdGlvbi5jYW1wYWlnbnMgPyB2bS5uZ09wdGlvbi5jYW1wYWlnbnMgOiBbXTtcclxuICAgICAgICAgICAgICAgIHZtLmNvbnRlbnRzID0gdm0ubmdPcHRpb24uY29udGVudHMgPyB2bS5uZ09wdGlvbi5jb250ZW50cyA6IFtdO1xyXG4gICAgICAgICAgICAgICAgdm0uc3RhcnREYXRlID0gbW9tZW50KHZtLm5nT3B0aW9uLnN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB2bS5lbmREYXRlID0gbW9tZW50KHZtLm5nT3B0aW9uLmVuZERhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uYXBwbHkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm9uQ2hhbmdlKHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyczogdm0ucGxheWVycyxcclxuICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbnM6IHZtLmNhbXBhaWducyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogdm0uY29udGVudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiB2bS5zdGFydERhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogdm0uZW5kRGF0ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2bS5wbGF5ZXJzID0gW107XHJcbiAgICAgICAgICAgIHZtLmNhbXBhaWducyA9IFtdO1xyXG4gICAgICAgICAgICB2bS5jb250ZW50cyA9IFtdO1xyXG4gICAgICAgICAgICBzZXREYXRlKCk7XHJcbiAgICAgICAgICAgIHZtLmFwcGx5KCk7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZtLm9uUmVzZXRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2V0RGF0ZSgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHNldERhdGUoKSB7XHJcbiAgICAgICAgICAgIGlmICh2bS5kYXkpIHtcclxuICAgICAgICAgICAgICAgIHZtLnN0YXJ0RGF0ZSA9IG1vbWVudCh2bS5kYXkpLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdm0uZW5kRGF0ZSA9IG1vbWVudCh2bS5kYXkpLmFkZCgxLCAnZGF5JykudG9EYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2bS5lbmREYXRlID0gbW9tZW50KCkudG9EYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB2bS5zdGFydERhdGUgPSBtb21lbnQoKS5hZGQoLTEsICdtb250aCcpLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KSgpO1xyXG5cclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxJbnN0YW5jZVwiLCBcImNvdW50UGxheWVyXCIsIFwidG90YWxQbGF5ZXJcIiwgXCJlbmREYXRlXCIsIFwicHJpY2VcIiwgXCJiaWxsaW5nU2VydmljZVwiLCBcImJpbGxpbmdJbmZvTW9kYWxcIiwgXCJwYXlNZXRob2RNb2RhbFwiLCBcIiRxXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuc3Vic2NyaWJlXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2NoYW5nZVN1YnNjcmlwdGlvbkNvbmZpcm1Nb2RhbCcsIHNlcnZpY2UpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiXHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2hvdyA9IGZ1bmN0aW9uIChjb3VudFBsYXllciwgdG90YWxQbGF5ZXIsIGVuZERhdGUsIHByaWNlKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb21wb25lbnRzL3N1YnNjcmliZS9jb21wb25lbnRzL2NoYW5nZVN1YnNjcmlwdGlvbkNvbmZpcm1Nb2RhbC9jaGFuZ2VTdWJzY3JpcHRpb25Db25maXJtTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ3N1YnNjcmliZS1pbmZvLW1vZGFsIGNoYW5nZS1zdWJzY3JpcHRpb24tbW9kYWwnLFxyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvdW50UGxheWVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudFBsYXllcjtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUGxheWVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbFBsYXllcjtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZERhdGVcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHByaWNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmljZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1vZGFsSW5zdGFuY2UucmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBjb3VudFBsYXllciwgdG90YWxQbGF5ZXIsIGVuZERhdGUsIHByaWNlLCBiaWxsaW5nU2VydmljZSwgYmlsbGluZ0luZm9Nb2RhbCwgcGF5TWV0aG9kTW9kYWwsICRxKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS5jb3VudFBsYXllciA9IGNvdW50UGxheWVyO1xyXG4gICAgICAgIHZtLnRvdGFsUGxheWVyID0gdG90YWxQbGF5ZXI7XHJcblxyXG4gICAgICAgIHZtLmFkZGVkUGxheWVyID0gdm0uY291bnRQbGF5ZXIgLSB2bS50b3RhbFBsYXllcjtcclxuICAgICAgICB2bS5yZW1vdmVkUGxheWVyID0gdm0udG90YWxQbGF5ZXIgLSB2bS5jb3VudFBsYXllcjtcclxuXHJcbiAgICAgICAgdm0uYWRkZWQgPSB2bS5hZGRlZFBsYXllciA+IDA7XHJcbiAgICAgICAgdm0ucmVtb3ZlZCA9IHZtLnJlbW92ZWRQbGF5ZXIgPiAwO1xyXG4gICAgICAgIHZtLmVuZERhdGUgPSBlbmREYXRlO1xyXG4gICAgICAgIGlmICghdm0uZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICB2bS5lbmREYXRlID0gbW9tZW50KCkuYWRkKCcxJywgJ21vbnRocycpLnVuaXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdm0ucHJpY2UgPSBwcmljZTtcclxuICAgICAgICBpZiAodm0ucHJpY2Uuc3VyY2hhcmdlID09IDAgJiYgdm0ucHJpY2UucmVmdW5kID09IDApIHtcclxuICAgICAgICAgICAgaWYgKHZtLmNvdW50UGxheWVyID09IDApIHtcclxuICAgICAgICAgICAgICAgIHZtLnByaWNlLnJlZnVuZCA9IHZtLnByaWNlLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgdm0ucHJpY2UudG90YWwgPSAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdm0ucHJpY2Uuc3VyY2hhcmdlID0gdm0ucHJpY2UudG90YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2bS5pc0FjdGl2ZSA9IHZtLnRvdGFsUGxheWVyID09IDA7XHJcbiAgICAgICAgdm0uaXNDYW5jZWwgPSB2bS5jb3VudFBsYXllciA9PSAwO1xyXG4gICAgICAgIHZtLm5vdENoYW5nZWQgPSAhdm0uaXNBY3RpdmUgJiYgIXZtLmlzQ2FuY2VsO1xyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0ubmV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGJpbGxpbmdTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZ2V0QmlsbGluZ0FkZHJlc3MoKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmlsbGluZ0luZm9Nb2RhbC5zaG93KCkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHEucmVqZWN0KHtkaXNtaXNzOnRydWV9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmlsbGluZ1NlcnZpY2UuZ2V0UGF5bWVudE1ldGhvZCgpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGVycm9yJiZlcnJvci5kaXNtaXNzKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRxLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlNZXRob2RNb2RhbC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudFBsYXllciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbGxpbmdTZXJ2aWNlLnVwZGF0ZVN1YnNjcmlwdGlvbih7cXVhbnRpdHk6IGNvdW50UGxheWVyfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaWxsaW5nU2VydmljZS5jYW5jZWxTdWJzY3JpcHRpb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIHJldHVybiAkYS5hbGwoW2JpbGxpbmdTZXJ2aWNlLmdldExpbWl0cygpLGJpbGxpbmdTZXJ2aWNlLmdldFN1YnNjcmlwdGlvbigpXSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZXJyb3ImJmVycm9yLmRpc21pc3MpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICA7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdm0uc2VsZWN0VGFiID0gZnVuY3Rpb24gKHRhYikge1xyXG4gICAgICAgICAgICB2bS5zaG93VGFiID0gdGFiO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uc2hvd1RhYiA9IDE7XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCJdO1xyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsSW5zdGFuY2VcIiwgXCJ1c2VyXCIsIFwiYmlsbGluZ1NlcnZpY2VcIiwgXCJlcnJvckhhbmRsZXJIZWxwZXJcIiwgXCJiaWxsaW5nSW5mb1wiLCBcIlJlc3Rhbmd1bGFyXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuc3Vic2NyaWJlXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2JpbGxpbmdJbmZvTW9kYWwnLCBzZXJ2aWNlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIlxyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAoYmlsbGluZ0luZm8pIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvYmlsbGluZ0luZm9Nb2RhbC9iaWxsaW5nSW5mb01vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdzdWJzY3JpYmUtaW5mby1tb2RhbCBzdWJzY3JpYmUtYmlsbGluZy1pbmZvLW1vZGFsJyxcclxuICAgICAgICAgICAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgICAgICAgICBiaWxsaW5nSW5mbzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmlsbGluZ0luZm87XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgdXNlciwgYmlsbGluZ1NlcnZpY2UsIGVycm9ySGFuZGxlckhlbHBlciwgYmlsbGluZ0luZm8sIFJlc3Rhbmd1bGFyKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICB2bS5pc0VkaXQgPSAhIWJpbGxpbmdJbmZvO1xyXG4gICAgICAgIGlmICghYmlsbGluZ0luZm8pIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwgPSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudHJ5OiAnJyxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB1c2VyLmRhdGEudXNlci5lbWFpbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsID0gUmVzdGFuZ3VsYXIuY29weShiaWxsaW5nSW5mbyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdm0ubmV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHZtLmZvcm0uJHZhbGlkICYmIHZtLm1vZGVsLmNvdW50cnkgIT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYmlsbGluZ1NlcnZpY2UuY3JlYXRlVXBkYXRlQmlsbGluZ0FkZHJlc3Modm0ubW9kZWwpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJIZWxwZXIuaGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZSwgdm0uZm9ybSwgdm0pO1xyXG4gICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCIsIFwiY2hhbmdlU3Vic2NyaXB0aW9uQ29uZmlybU1vZGFsXCJdO1xyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsSW5zdGFuY2VcIiwgXCJ0b3RhbENvdW50UGxheWVyXCIsIFwidXNlZENvdW50UGxheWVyXCIsIFwiYmlsbGluZ1NlcnZpY2VcIiwgXCJlbmREYXRlXCIsIFwiJHRpbWVvdXRcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIilcclxuICAgICAgICAuc2VydmljZSgnY2hhbmdlU3Vic2NyaXB0aW9uTW9kYWwnLCBzZXJ2aWNlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCxjaGFuZ2VTdWJzY3JpcHRpb25Db25maXJtTW9kYWwpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCJcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zaG93ID0gZnVuY3Rpb24gKHRvdGFsQ291bnRQbGF5ZXIsIHVzZWRDb3VudFBsYXllciwgZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9jaGFuZ2VTdWJzY3JpcHRpb25Nb2RhbC9jaGFuZ2VTdWJzY3JpcHRpb25Nb2RhbC5odG1sJyxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6IFwidm1cIixcclxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnc3Vic2NyaWJlLWluZm8tbW9kYWwgY2hhbmdlLXN1YnNjcmlwdGlvbi1tb2RhbCcsXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxDb3VudFBsYXllcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG90YWxDb3VudFBsYXllcjtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZWRDb3VudFBsYXllcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlZENvdW50UGxheWVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQudGhlbihmdW5jdGlvbiAocmVzdWx0U2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlU3Vic2NyaXB0aW9uQ29uZmlybU1vZGFsLnNob3cocmVzdWx0U2VsZWN0LmNvdW50UGxheWVyLHRvdGFsQ291bnRQbGF5ZXIsIGVuZERhdGUscmVzdWx0U2VsZWN0LnByaWNlKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwgdG90YWxDb3VudFBsYXllciwgdXNlZENvdW50UGxheWVyLCBiaWxsaW5nU2VydmljZSwgZW5kRGF0ZSwkdGltZW91dCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS50b3RhbENvdW50UGxheWVyID0gdG90YWxDb3VudFBsYXllcjtcclxuICAgICAgICB2bS51c2VkQ291bnRQbGF5ZXIgPSB1c2VkQ291bnRQbGF5ZXI7XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKHtwcmljZTogdm0uYWxsUHJpY2UsY291bnRQbGF5ZXI6dm0ubW9kZWwuY291bnRQbGF5ZXJ9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmVuZERhdGUgPSBlbmREYXRlO1xyXG5cclxuICAgICAgICBpZiAodm0udG90YWxDb3VudFBsYXllcj09MCkge1xyXG4gICAgICAgICAgICB2bS5pbmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZtLmNvdW50ID0gMDtcclxuICAgICAgICB2bS51cCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0ubW9kZWwuY291bnRQbGF5ZXIrKztcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmRvd24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZtLm1vZGVsLmNvdW50UGxheWVyIC09IDE7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIHByZXZUaW1lcj1udWxsO1xyXG4gICAgICAgIHZtLm1vZGVsID0ge1xyXG4gICAgICAgICAgICBfY291bnRQbGF5ZXI6IDAsXHJcbiAgICAgICAgICAgIGdldCBjb3VudFBsYXllcigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBsYXllcjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0IGNvdW50UGxheWVyKHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYodmFsPDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsPTA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb3VudFBsYXllciA9IHZhbDtcclxuICAgICAgICAgICAgICAgIGlmKHZhbD09MClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5wcmljZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ucHJpY2VGcmFjdGlvbj0wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZUaW1lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkdGltZW91dC5jYW5jZWwocHJldlRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldlRpbWVyID0gJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcmljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDcwMCk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0ubW9kZWwuY291bnRQbGF5ZXI9dm0udG90YWxDb3VudFBsYXllcjtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlUHJpY2UoKSB7XHJcbiAgICAgICAgICAgIHZtLmxvYWRpbmc9dHJ1ZTtcclxuICAgICAgICAgICAgdm0ucHJpY2U9XCItLVwiO1xyXG4gICAgICAgICAgICB2bS5wcmljZUZyYWN0aW9uPSctLSc7XHJcbiAgICAgICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldFByaWNlKHtxdWFudGl0eTogdm0ubW9kZWwuY291bnRQbGF5ZXJ9KS50aGVuKGZ1bmN0aW9uIChwcmljZSkge1xyXG4gICAgICAgICAgICAgICAgdm0ucHJpY2UgPSBwYXJzZUludChwcmljZS50b3RhbCk7XHJcbiAgICAgICAgICAgICAgICB2bS5wcmljZUZyYWN0aW9uID0gcGFyc2VJbnQoKHByaWNlLnRvdGFsIC0gdm0ucHJpY2UpICogMTAwKTtcclxuICAgICAgICAgICAgICAgIHZtLmFsbFByaWNlPXByaWNlO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5wcmljZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB2bS5wcmljZUZyYWN0aW9uPTA7XHJcbiAgICAgICAgICAgICAgICB2bS5hbGxQcmljZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBcInRvdGFsXCI6IFwiMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwic3VyY2hhcmdlXCI6IFwiMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwicmVmdW5kXCI6IFwiMFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0ubG9hZGluZz1mYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcImNoYW5nZVN1YnNjcmlwdGlvbk1vZGFsXCIsIFwiYmlsbGluZ1NlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIikuY29tcG9uZW50KFwiY3VycmVudFN1YnNjcmlwdGlvblwiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZWQ6IFwiJlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9jdXJyZW50U3Vic2NyaXB0aW9uL2N1cnJlbnRTdWJzY3JpcHRpb24uaHRtbCcsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ3ZtJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoY2hhbmdlU3Vic2NyaXB0aW9uTW9kYWwsIGJpbGxpbmdTZXJ2aWNlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLmluYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdm0uaGlkZVN1YnNjcmliZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHVwZGF0ZSgpO1xyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCkge1xyXG4gICAgICAgICAgICBiaWxsaW5nU2VydmljZS5nZXRMaW1pdHMoKS50aGVuKGZ1bmN0aW9uIChsaW1pdHMpIHtcclxuICAgICAgICAgICAgICAgIHZtLmxpbWl0cyA9IGxpbWl0cztcclxuXHJcbiAgICAgICAgICAgICAgICB2bS5sZWZ0ID0gKCh2bS5saW1pdHMuc3RvcmFnZS50b3RhbCAtIHZtLmxpbWl0cy5zdG9yYWdlLnVzZWQpIC8gdm0ubGltaXRzLnN0b3JhZ2UudG90YWwpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgdm0ubGVmdCA9IE1hdGgucm91bmQodm0ubGVmdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0ubGVmdCA9PSAxMDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5sZWZ0ID0gOTk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5saW1pdHMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJmcmVlXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0b3RhbFwiOiBcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWZ0XCI6IFwiMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVzZWRcIjogXCIwXCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIFwicGFpZFwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidG90YWxcIjogXCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVmdFwiOiBcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1c2VkXCI6IFwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLmhpZGVTdWJzY3JpYmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldFN1YnNjcmlwdGlvbigpLnRoZW4oZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdm0uc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xyXG4gICAgICAgICAgICAgICAgdm0uaW5hY3RpdmUgPSB2bS5zdWJzY3JpcHRpb24uc3RhdHVzICE9ICdhY3RpdmUnO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5pbmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB2bS5zdWJzY3JpcHRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGU6ICcnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHZtLmNoYW5nZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY2hhbmdlU3Vic2NyaXB0aW9uTW9kYWwuc2hvdyh2bS5saW1pdHMucGFpZC50b3RhbCwgdm0ubGltaXRzLnBhaWQudXNlZCwgdm0uc3Vic2NyaXB0aW9uLmVuZF9kYXRlXHJcbiAgICAgICAgICAgICkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCIsIFwiY29uZmlybU1vZGFsU2VydmljZVwiXTtcclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcIiR1aWJNb2RhbEluc3RhbmNlXCIsIFwiYmlsbGluZ1NlcnZpY2VcIiwgXCIkdGltZW91dFwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnN1YnNjcmliZVwiKVxyXG4gICAgICAgIC5zZXJ2aWNlKCdlbnRlclByb21vQ29kZU1vZGFsJywgc2VydmljZSk7XHJcblxyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkdWliTW9kYWwsIGNvbmZpcm1Nb2RhbFNlcnZpY2UpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCJcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zaG93ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9lbnRlclByb21vQ29kZU1vZGFsL2VudGVyUHJvbW9Db2RlTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ3N1YnNjcmliZS1pbmZvLW1vZGFsIGVudGVyLWNvZGUtbW9kYWwnLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdC50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdygnc3Vic2NyaWJlLlN1Y2Nlc3NFbnRlclByb21vQ29kZScsbnVsbCwnc3VjY2VzcycsbnVsbCx0cnVlKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHNob3cpIHtcclxuICAgICAgICAgICAgICAgIGlmKHNob3c9PSdzaG93JylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maXJtTW9kYWxTZXJ2aWNlLnNob3coJ3N1YnNjcmliZS5FcnJvckVudGVyUHJvbW9Db2RlJyxudWxsLG51bGwsbnVsbCx0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCR1aWJNb2RhbEluc3RhbmNlLCBiaWxsaW5nU2VydmljZSwgJHRpbWVvdXQpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZtLmNsb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2bS5lbnRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdm0uc3VibWl0dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKCF2bS5mb3JtLiR2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBiaWxsaW5nU2VydmljZS5lbnRlckNvZGUodm0uY29kZSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5kaXNtaXNzKCdzaG93Jyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSkoKTsiLCIoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIHNlcnZpY2UuJGluamVjdCA9IFtcIiR1aWJNb2RhbFwiXTtcclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcIiR1aWJNb2RhbEluc3RhbmNlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuc3Vic2NyaWJlXCIpXHJcbiAgICAgICAgLnNlcnZpY2UoJ2J1eVBhaWRNb2RhbCcsIHNlcnZpY2UpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNlcnZpY2UoJHVpYk1vZGFsKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiXHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2hvdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1vZGFsSW5zdGFuY2UgPSAkdWliTW9kYWwub3Blbih7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvcGFpZFNpZ24vYnV5UGFpZE1vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdyZW1vdmUtbW9kYWwgYnV5LXBhaWQtbW9kYWwnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWxJbnN0YW5jZS5yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoJHVpYk1vZGFsSW5zdGFuY2UpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmdvVG9CdXkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmNsb3NlKCk7XHJcblxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE5LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLmJsb2Nrc1wiKS5kaXJlY3RpdmUoJ3BhaWRQbGF5ZXInLCBbXCIkcVwiLCBcImNvbmZpcm1Nb2RhbFNlcnZpY2VcIiwgXCIkcm9vdFNjb3BlXCIsIGZ1bmN0aW9uICgkcSwgY29uZmlybU1vZGFsU2VydmljZSwgJHJvb3RTY29wZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJzxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT4nLFxyXG4gICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBhZGRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHJzLnBhaWRQbGF5ZXIsIGZ1bmN0aW9uIChuZXdWYWwsIE9sZFZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgJiYgYWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDbGFzcyhcInBhaWQtcmVxdWlyZWQtd3JhcFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCdwYWlkLXJlcXVpcmVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub2ZmKCdjbGljaycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghbmV3VmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygncGFpZC1yZXF1aXJlZC13cmFwJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4oKS5hZGRDbGFzcygncGFpZC1yZXF1aXJlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1Nb2RhbFNlcnZpY2Uuc2hvdyhcInN1YnNjcmliZS5QYWlkUGxheWVyX01vZGFsTWVzc2FnZVwiLCBudWxsLCAnaW5mbycsIG51bGwsdHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgJHJvb3RTY29wZS4kb24oJ3N1YnNjcmlwdGlvbi5VcGRhdGUnLCBmdW5jdGlvbiAoZXYsIGluZGV4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XSk7XHJcblxyXG59KSgpOyIsIihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgc2VydmljZS4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsXCJdO1xyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHVpYk1vZGFsSW5zdGFuY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIilcclxuICAgICAgICAuc2VydmljZSgnYnV5UGFpZE1vZGFsJywgc2VydmljZSk7XHJcblxyXG4gICAgZnVuY3Rpb24gc2VydmljZSgkdWliTW9kYWwpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCJcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zaG93ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbW9kYWxJbnN0YW5jZSA9ICR1aWJNb2RhbC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy9wYWlkU2lnbi9idXlQYWlkTW9kYWwuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCIsXHJcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ3JlbW92ZS1tb2RhbCBidXktcGFpZC1tb2RhbCdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuZGlzbWlzcygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdm0uZ29Ub0J1eSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJHVpYk1vZGFsSW5zdGFuY2UuY2xvc2UoKTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTkuMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuYmxvY2tzXCIpLmRpcmVjdGl2ZSgncGFpZFNpZ24nLCBbXCIkcVwiLCBcImJpbGxpbmdTZXJ2aWNlXCIsIFwiY29uZmlybU1vZGFsU2VydmljZVwiLCBcImJ1eVBhaWRNb2RhbFwiLCBcImNoYW5nZVN1YnNjcmlwdGlvbk1vZGFsXCIsIFwiJHJvb3RTY29wZVwiLCBmdW5jdGlvbiAoJHEsIGJpbGxpbmdTZXJ2aWNlLCBjb25maXJtTW9kYWxTZXJ2aWNlLCBidXlQYWlkTW9kYWwsIGNoYW5nZVN1YnNjcmlwdGlvbk1vZGFsLCAkcm9vdFNjb3BlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdHJhbnNjbHVkZTogdHJ1ZSxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICc8bmctdHJhbnNjbHVkZT48L25nLXRyYW5zY2x1ZGU+JyxcclxuICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICRyb290U2NvcGUuJG9uKCdzdWJzY3JpcHRpb24uVXBkYXRlJywgZnVuY3Rpb24gKGV2LCBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ1NlcnZpY2UuZ2V0QmlsbGluZ1N0YXR1c1dpdGhDYXRjaCgpLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXR1cy5wYWlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCdwYWlkLXJlcXVpcmVkLXdyYXAnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4oKS5hZGRDbGFzcygncGFpZC1yZXF1aXJlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV5UGFpZE1vZGFsLnNob3coKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlU3Vic2NyaXB0aW9uTW9kYWwuc2hvdyhzdGF0dXMubGltaXRzLnBhaWQudG90YWwsIHN0YXR1cy5saW1pdHMucGFpZC51c2VkLCBzdGF0dXMuc3Vic2NyaXB0aW9uLmVuZF9kYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5maW5kKCdpbnB1dCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDbGFzcyhcInBhaWQtcmVxdWlyZWQtd3JhcFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygncGFpZC1yZXF1aXJlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoJ2lucHV0JykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfV0pO1xyXG5cclxufSkoKTsiLCJcclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBzZXJ2aWNlLiRpbmplY3QgPSBbXCIkdWliTW9kYWxcIl07XHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCIkdWliTW9kYWxJbnN0YW5jZVwiLCBcIiR0aW1lb3V0XCIsIFwiYmlsbGluZ1NlcnZpY2VcIiwgXCIkc2NvcGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIilcclxuICAgICAgICAuc2VydmljZSgncGF5TWV0aG9kTW9kYWwnLCBzZXJ2aWNlKTtcclxuXHJcbiAgICBmdW5jdGlvbiBzZXJ2aWNlKCR1aWJNb2RhbCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIlxyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNob3cgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBtb2RhbEluc3RhbmNlID0gJHVpYk1vZGFsLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb21wb25lbnRzL3N1YnNjcmliZS9jb21wb25lbnRzL3BheU1ldGhvZE1vZGFsL3BheU1ldGhvZE1vZGFsLmh0bWwnLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogXCJ2bVwiLFxyXG4gICAgICAgICAgICAgICAgd2luZG93Q2xhc3M6ICdzdWJzY3JpYmUtaW5mby1tb2RhbCBzdWJzY3JpYmUtcGF5LW1ldGhvZC1tb2RhbCcsXHJcbiAgICAgICAgICAgICAgICBiYWNrZHJvcCA6ICdzdGF0aWMnLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZToge1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RhbEluc3RhbmNlLnJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkdWliTW9kYWxJbnN0YW5jZSwkdGltZW91dCxiaWxsaW5nU2VydmljZSwkc2NvcGUpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcbiAgICAgICAgdm0uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICR1aWJNb2RhbEluc3RhbmNlLmRpc21pc3MoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZtLmRpc2FibGVkID10cnVlO1xyXG4gICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldEJyYWludHJlZVRva2VuKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICBicmFpbnRyZWUuc2V0dXAocmVzdWx0LnRva2VuLCBcImRyb3BpblwiLCB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IFwiYnJhaW50cmVlLXBheW1lbnQtZm9ybVwiLFxyXG4gICAgICAgICAgICAgICAgb25SZWFkeTpmdW5jdGlvbigpXHJcbiAgICAgICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2bS5kaXNhYmxlZCA9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvblBheW1lbnRNZXRob2RSZWNlaXZlZDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9dHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHJlc3BvbnNlLnR5cGUgPT0gJ1BheVBhbEFjY291bnQnID8gJ3BheXBhbF9leHByZXNzX2NoZWNrb3V0JyA6ICdjYXJkJztcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdG1wX3Rva2VuID0gcmVzcG9uc2Uubm9uY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ1NlcnZpY2Uuc2F2ZVBheW1lbnRNZXRob2Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b2tlbic6IHRtcF90b2tlblxyXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkdWliTW9kYWxJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm0ubG9hZGluZyA9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiYmlsbGluZ1NlcnZpY2VcIiwgXCJiaWxsaW5nSW5mb01vZGFsXCIsIFwicGF5TWV0aG9kTW9kYWxcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIikuY29tcG9uZW50KFwicGF5TWV0aG9kc1wiLCBjb21wb25lbnQoKSk7XHJcblxyXG4gICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7XHJcbiAgICAgICAgICAgICAgICBwYXltZW50TWV0aG9kOic8JyxcclxuICAgICAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzOiBcIjxcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlZDogXCImXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb21wb25lbnRzL3N1YnNjcmliZS9jb21wb25lbnRzL3BheU1ldGhvZHMvcGF5TWV0aG9kcy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihiaWxsaW5nU2VydmljZSxiaWxsaW5nSW5mb01vZGFsLHBheU1ldGhvZE1vZGFsKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG4gICAgICAgIHZtLnNob3dCaWxsaW5nSW5mbyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGJpbGxpbmdJbmZvTW9kYWwuc2hvdyh2bS5iaWxsaW5nQWRkcmVzcykudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5vbkNoYW5nZWQoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBcclxuICAgICAgICB2bS5maWxsUGF5bWVudEluZm8gPWZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgYmlsbGluZ0luZm9Nb2RhbC5zaG93KHZtLmJpbGxpbmdBZGRyZXNzKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgcGF5TWV0aG9kTW9kYWwuc2hvdygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHZtLmNoYW5nZVBheU1ldGhvZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcGF5TWV0aG9kTW9kYWwuc2hvdygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTguMDQuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG5cclxuXHJcbiAgICBDb250cm9sbGVyLiRpbmplY3QgPSBbXCJsb2NhbGVcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIikuY29tcG9uZW50KFwicGxheWVyRGlzY291bnRcIiwgY29tcG9uZW50KCkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiaW5kaW5nczoge1xyXG4gICAgICAgICAgICAgICAgY291bnRQbGF5ZXI6XCI8XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb21wb25lbnRzL3N1YnNjcmliZS9jb21wb25lbnRzL3BsYXllckRpc2NvdW50L3BsYXllckRpc2NvdW50Lmh0bWwnLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyQXM6ICd2bSdcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKGxvY2FsZSkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuXHJcbiAgICAgICAgdmFyIHZtID0gdGhpcztcclxuICAgICAgICB2bS5sb2NhbGUgPSBsb2NhbGUuZ2V0TG9jYWxlKCk7XHJcblxyXG5cclxuICAgIH1cclxufSkoKTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBkZW5hayBvbiAxOC4wNC4yMDE2LlxyXG4gKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG5cclxuICAgIENvbnRyb2xsZXIuJGluamVjdCA9IFtcImVudGVyUHJvbW9Db2RlTW9kYWxcIiwgXCJjb25maXJtTW9kYWxTZXJ2aWNlXCJdO1xyXG4gICAgYW5ndWxhci5tb2R1bGUoXCJ0ZWxlZHMuc3Vic2NyaWJlXCIpLmNvbXBvbmVudChcInVzZXJCYWxhbmNlXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHtcclxuICAgICAgICAgICAgICAgIG5nQmFsYW5jZTogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzczogXCI8XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZWQ6IFwiJlwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY29tcG9uZW50cy9zdWJzY3JpYmUvY29tcG9uZW50cy91c2VyQmFsYW5jZS91c2VyQmFsYW5jZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcihlbnRlclByb21vQ29kZU1vZGFsLCBjb25maXJtTW9kYWxTZXJ2aWNlKSB7XHJcbiAgICAgICAgXCJuZ0luamVjdFwiO1xyXG5cclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuXHJcbiAgICAgICAgdm0uZW50ZXJDb2RlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBlbnRlclByb21vQ29kZU1vZGFsLnNob3coKS50aGVuKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZtLm9uQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgdm0uJG9uQ2hhbmdlcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHZtLm5nQmFsYW5jZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN1bSA9IHZtLm5nQmFsYW5jZS5wcm9tb3Rpb25hbCArIHZtLm5nQmFsYW5jZS5yZWZ1bmRhYmxlICsgdm0ubmdCYWxhbmNlLmV4Y2VzcztcclxuICAgICAgICAgICAgICAgIHZtLnByaWNlID0gcGFyc2VJbnQoc3VtKTtcclxuICAgICAgICAgICAgICAgIHZtLnByaWNlRnJhY3Rpb24gPSBwYXJzZUludCgoIHN1bSAtIHZtLnByaWNlKSAqIDEwMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodm0ucHJpY2VGcmFjdGlvbiA8IDkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2bS5wcmljZUZyYWN0aW9uICs9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgfVxyXG59KSgpOyIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRlbmFrIG9uIDE4LjA0LjIwMTYuXHJcbiAqL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1widGFibGVIZWxwZXJcIiwgXCJub3RpZmljYXRpb25TZXJ2aWNlXCIsIFwiYmlsbGluZ1NlcnZpY2VcIl07XHJcbiAgICBhbmd1bGFyLm1vZHVsZShcInRlbGVkcy5zdWJzY3JpYmVcIikuY29tcG9uZW50KFwidXNlclBheW1lbnRzXCIsIGNvbXBvbmVudCgpKTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmluZGluZ3M6IHt9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbXBvbmVudHMvc3Vic2NyaWJlL2NvbXBvbmVudHMvdXNlclBheW1lbnRzL3VzZXJQYXltZW50cy5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogQ29udHJvbGxlcixcclxuICAgICAgICAgICAgY29udHJvbGxlckFzOiAndm0nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcih0YWJsZUhlbHBlciwgbm90aWZpY2F0aW9uU2VydmljZSwgYmlsbGluZ1NlcnZpY2UpIHtcclxuICAgICAgICBcIm5nSW5qZWN0XCI7XHJcblxyXG4gICAgICAgIHZhciB2bSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHZhciBvcHRpb25zID0gdGFibGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckFuZ3VsYXJXYXlUYWJsZShbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXSk7XHJcbiAgICAgICAgLy9vcHRpb25zLmR0T3B0aW9ucyA9IG9wdGlvbnMuZHRPcHRpb25zLndpdGhPcHRpb24oXCJzY3JvbGxZXCIsICc2MDBweCcpO1xyXG5cclxuICAgICAgICB2bS5kdE9wdGlvbnMgPSBvcHRpb25zLmR0T3B0aW9ucztcclxuICAgICAgICB2bS5kdENvbHVtbkRlZnMgPSBvcHRpb25zLmR0Q29sdW1uRGVmcztcclxuICAgICAgICBiaWxsaW5nU2VydmljZS5nZXRJbnZvaWNlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHZtLnBheW1lbnRzID0gcmVzdWx0Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5kYXRlID0gbW9tZW50LnVuaXgoaXRlbS5kYXRlKS5mb3JtYXQoJ0RELk1NLllZWVkgSEg6bW06c3MnKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0udXJsPVwiXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZtLnBheW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldExpbmtJbnZvaWNlKGl0ZW0uaW52b2ljZV9pZCkudGhlbihmdW5jdGlvbiAobGluaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0udXJsID1saW5rLnVybDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLnBheW1lbnRzO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2bS5kb3dubG9hZCA9IGZ1bmN0aW9uIChwYXltZW50KSB7XHJcbiAgICAgICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldExpbmtJbnZvaWNlKHBheW1lbnQuaW52b2ljZV9pZCkudGhlbihmdW5jdGlvbiAobGluaykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIGxpbmsudXJsLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBcImJsb2JcIjtcclxuICAgICAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09IDQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXltZW50LmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVBcyh4aHIucmVzcG9uc2UsIFwiaW52b2ljZV9cIiArIHBheW1lbnQuZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignY29tbW9uLkludGVybmFsU2VydmVyRXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHBheW1lbnQubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pKCk7IiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGVuYWsgb24gMTcuMDUuMjAxNi5cclxuICovXHJcblxyXG4oZnVuY3Rpb24gKCkge1xyXG4gICAgQ29udHJvbGxlci4kaW5qZWN0ID0gW1wiJHN0YXRlXCIsIFwiYmlsbGluZ1NlcnZpY2VcIiwgXCIkdGltZW91dFwiXTtcclxuICAgIGFuZ3VsYXIubW9kdWxlKFwidGVsZWRzLnN1YnNjcmliZVwiKS5jb25maWcoY29uZmlnKTtcclxuICAgIGNvbmZpZy4kaW5qZWN0ID0gWyckc3RhdGVQcm92aWRlciddO1xyXG4gICAgZnVuY3Rpb24gY29uZmlnKCRzdGF0ZVByb3ZpZGVyKSB7XHJcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcclxuICAgICAgICAgICAgLnN0YXRlKCdwZXJzb25hbEFjY291bnQuc3Vic2NyaWJlJywge1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL3N1YnNjcmliZScsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbXBvbmVudHMvc3Vic2NyaWJlL3BhZ2VzL3N1YnNjcmliZS9zdWJzY3JpYmUuaHRtbCcsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiBcInZtXCJcclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gQ29udHJvbGxlcigkc3RhdGUsIGJpbGxpbmdTZXJ2aWNlLCAkdGltZW91dCkge1xyXG4gICAgICAgIFwibmdJbmplY3RcIjtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7XHJcbiAgICAgICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldFBheW1lbnRNZXRob2QoKS50aGVuKGZ1bmN0aW9uIChwYXltZW50TWV0aG9kKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5wYXltZW50TWV0aG9kID0gcGF5bWVudE1ldGhvZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHVwZGF0ZUJhbGFuY2UoKTtcclxuICAgICAgICAgICAgYmlsbGluZ1NlcnZpY2UuZ2V0QmlsbGluZ0FkZHJlc3MoKS50aGVuKGZ1bmN0aW9uIChhZGRyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5iaWxsaW5nQWRkcmVzcyA9IGFkZHJlc3M7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVwZGF0ZSgpO1xyXG5cclxuICAgICAgICB2bS5vbkNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAkdGltZW91dCh1cGRhdGVCYWxhbmNlLCA1MDAwKTtcclxuICAgICAgICAgICAgJHRpbWVvdXQodXBkYXRlQmFsYW5jZSwgMTAwMDApO1xyXG4gICAgICAgICAgICAkdGltZW91dCh1cGRhdGVCYWxhbmNlLCAxNTAwMCk7XHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUJhbGFuY2UoKSB7XHJcbiAgICAgICAgICAgIGJpbGxpbmdTZXJ2aWNlLmdldEJhbGFuY2UoKS50aGVuKGZ1bmN0aW9uIChiYWxhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICB2bS5iYWxhbmNlID0gYmFsYW5jZTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdm0uYmFsYW5jZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25hbDogMCxcclxuICAgICAgICAgICAgICAgICAgICByZWZ1bmRhYmxlOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4Y2VzczogMFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG59KSgpOyIsIi8qKioqICBWYXJpYWJsZXMgSW5pdGlhdGlvbiAgKioqKi9cclxudmFyIGRvYyA9IGRvY3VtZW50O1xyXG52YXIgZG9jRWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbnZhciAkYm9keSA9ICQoJ2JvZHknKTtcclxudmFyICRzaWRlYmFyID0gJCgnLnNpZGViYXInKTtcclxudmFyICRzaWRlYmFyRm9vdGVyID0gJCgnLnNpZGViYXIgLnNpZGViYXItZm9vdGVyJyk7XHJcbnZhciAkbWFpbkNvbnRlbnQgPSAkKCcubWFpbi1jb250ZW50Jyk7XHJcbnZhciAkcGFnZUNvbnRlbnQgPSAkKCcucGFnZS1jb250ZW50Jyk7XHJcbnZhciAkdG9wYmFyID0gJCgnLnRvcGJhcicpO1xyXG52YXIgJGxvZ29wYW5lbCA9ICQoJy5sb2dvcGFuZWwnKTtcclxudmFyICRzaWRlYmFyV2lkdGggPSAkKFwiLnNpZGViYXJcIikud2lkdGgoKTtcclxudmFyIGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFnZS1jb250ZW50Jyk7XHJcbnZhciBpc19SVEwgPSBmYWxzZTtcclxudmFyICRsb2FkZXIgPSAkKCcjcHJlbG9hZGVyJyk7XHJcbnZhciBkb2NIZWlnaHQgPSAkKGRvY3VtZW50KS5oZWlnaHQoKTtcclxudmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxudmFyIHRvcGJhcldpZHRoID0gJCgnLnRvcGJhcicpLndpZHRoKCk7XHJcbnZhciBoZWFkZXJMZWZ0V2lkdGggPSAkKCcuaGVhZGVyLWxlZnQnKS53aWR0aCgpO1xyXG52YXIgaGVhZGVyUmlnaHRXaWR0aCA9ICQoJy5oZWFkZXItcmlnaHQnKS53aWR0aCgpO1xyXG52YXIgc3RhcnQgPSBkZWx0YSA9IGVuZCA9IDA7XHJcblxyXG4kLmNvb2tpZS5kZWZhdWx0cy5wYXRoID0gJy8nO1xyXG5cclxuYW5ndWxhci5tb2R1bGUoJ25ld0FwcCcpLmZhY3RvcnkoJ2FwcGxpY2F0aW9uU2VydmljZScsIFsncGx1Z2luc1NlcnZpY2UnLCckcm9vdFNjb3BlJywgZnVuY3Rpb24gKHBsdWdpbnNTZXJ2aWNlLCRyb290U2NvcGUpIHtcclxuXHJcbiAgICAvKiAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe1xyXG4gICAgIFwidXNlIHN0cmljdFwiO1xyXG4gICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICQoJy5sb2FkZXItb3ZlcmxheScpLmFkZENsYXNzKCdsb2FkZWQnKTtcclxuICAgICAkKCdib2R5ID4gc2VjdGlvbicpLmFuaW1hdGUoe1xyXG4gICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgfSwgNDAwKTtcclxuICAgICB9LCA1MDApO1xyXG4gICAgIH0pOyovXHJcblxyXG5cclxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgLyogTEFZT1VUUyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcbiAgICAvKiBDcmVhdGUgUlRMOiBTaWRlYmFyIG9uIFJpZ2h0IFNpZGUgKi9cclxuICAgIGZ1bmN0aW9uIGVuYWJsZVJUTCgpIHtcclxuICAgICAgICAkKCcjc3dpdGNoLXJ0bCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3J0bCcpLmFkZENsYXNzKCdydGwnKTtcclxuICAgICAgICAkKCdodG1sJykucmVtb3ZlQ2xhc3MoJ3J0bCcpLmFkZENsYXNzKCdydGwnKTtcclxuICAgICAgICAkKCcuc2lkZWJhcicpLmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgICAgJCgnLnNpZGViYXIgLnNlYXJjaGZvcm0gaW5wdXQnKS5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgICQoJy5zaWRlYmFyIC5zaWRlYmFyLWZvb3RlcicpLmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgICAgJCgnLmxvZ29wYW5lbCcpLmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgICAgJCgnLnNlYXJjaGZvcm0gaW5wdXQnKS5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgICQoJy5zaWRlYmFyIC5zaWRlYmFyLWZvb3RlciAucHVsbC1sZWZ0JykuY3NzKCcnKTtcclxuICAgICAgICAkKCcubWFpbi1jb250ZW50JykuY3NzKCdtYXJnaW4tbGVmdCcsICcnKTtcclxuICAgICAgICAkKCcudG9wYmFyJykuY3NzKCdsZWZ0JywgJycpO1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItaG92ZXInKSkgc2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgJCgnI3N3aXRjaC1ydGwnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgICAgaGFuZGxlYm94ZWRMYXlvdXQoKTtcclxuICAgICAgICAkLmNvb2tpZSgncnRsJywgMSwge3BhdGg6ICcvJ30pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFJlbW92ZSBSVEw6IFNpZGViYXIgb24gTGVmdCBTaWRlICovXHJcbiAgICBmdW5jdGlvbiBkaXNhYmxlUlRMKCkge1xyXG4gICAgICAgICQoJyNzd2l0Y2gtcnRsJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAkKCdodG1sJykucmVtb3ZlQ2xhc3MoJ3J0bCcpO1xyXG4gICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygncnRsJyk7XHJcbiAgICAgICAgJCgnLnNpZGViYXInKS5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgICQoJy5zaWRlYmFyJykuY3NzKCdsZWZ0JywgJycpO1xyXG4gICAgICAgICQoJy5zaWRlYmFyIC5zZWFyY2hmb3JtIGlucHV0JykuY3NzKCd3aWR0aCcsICcnKTtcclxuICAgICAgICAkKCcuc2lkZWJhciAuc2lkZWJhci1mb290ZXInKS5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgICQoJy5sb2dvcGFuZWwnKS5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgICQoJy5zZWFyY2hmb3JtIGlucHV0JykuY3NzKCd3aWR0aCcsICcnKTtcclxuICAgICAgICAkKCcuc2lkZWJhciAuc2lkZWJhci1mb290ZXIgLnB1bGwtbGVmdCcpLmNzcygnJyk7XHJcbiAgICAgICAgJCgnLm1haW4tY29udGVudCcpLmNzcygnbWFyZ2luLXJpZ2h0JywgJycpO1xyXG4gICAgICAgICQoJy50b3BiYXInKS5jc3MoJ3JpZ2h0JywgJycpO1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItaG92ZXInKSkgc2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgaGFuZGxlYm94ZWRMYXlvdXQoKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgncnRsJywge3BhdGg6ICcvJ30pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFRvZ2dsZSBSVEwgKi9cclxuICAgIGZ1bmN0aW9uIHRvZ2dsZVJUTCgpIHtcclxuICAgICAgICBpZiAoJCgnaHRtbCcpLmhhc0NsYXNzKCdydGwnKSkgZGlzYWJsZVJUTCgpO1xyXG4gICAgICAgIGVsc2UgZW5hYmxlUlRMKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQ3JlYXRlIFNpZGViYXIgRml4ZWQgKi9cclxuICAgIGZ1bmN0aW9uIGhhbmRsZVNpZGViYXJGaXhlZCgpIHtcclxuICAgICAgICAvLyByZW1vdmVTaWRlYmFySG92ZXIoKTtcclxuICAgICAgICAkKCcjc3dpdGNoLXNpZGViYXInKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgICAgJCgnI3N3aXRjaC1zdWJtZW51JykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnc3VibWVudS1ob3ZlcicpO1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItdG9wJykpIHtcclxuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdmaXhlZC10b3BiYXInKS5hZGRDbGFzcygnZml4ZWQtdG9wYmFyJyk7XHJcbiAgICAgICAgICAgICQucmVtb3ZlQ29va2llKCdmbHVpZC10b3BiYXInKTtcclxuICAgICAgICAgICAgJCgnI3N3aXRjaC10b3BiYXInKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnZml4ZWQtc2lkZWJhcicpLmFkZENsYXNzKCdmaXhlZC1zaWRlYmFyJyk7XHJcbiAgICAgICAgJCgnLnNpZGViYXInKS5oZWlnaHQoJycpO1xyXG4gICAgICAgIGhhbmRsZWJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgaWYgKCEkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykpIHJlbW92ZVN1Ym1lbnVIb3ZlcigpO1xyXG4gICAgICAgIGNyZWF0ZVNpZGVTY3JvbGwoKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnZmx1aWQtc2lkZWJhcicsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAkLmNvb2tpZSgnZml4ZWQtc2lkZWJhcicsIDEsIHtwYXRoOiAnLyd9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBDcmVhdGUgU2lkZWJhciBGbHVpZCAvIFJlbW92ZSBTaWRlYmFyIEZpeGVkICovXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVTaWRlYmFyRmx1aWQoKSB7XHJcbiAgICAgICAgJCgnI3N3aXRjaC1zaWRlYmFyJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLWhvdmVyJykpIHtcclxuICAgICAgICAgICAgcmVtb3ZlU2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgICAgICQoJyNzd2l0Y2gtc2lkZWJhci1ob3ZlcicpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnZml4ZWQtc2lkZWJhcicpO1xyXG4gICAgICAgIGhhbmRsZWJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgZGVzdHJveVNpZGVTY3JvbGwoKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnZml4ZWQtc2lkZWJhcicsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAkLmNvb2tpZSgnZmx1aWQtc2lkZWJhcicsIDEsIHtwYXRoOiAnLyd9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBUb2dnbGUgU2lkZWJhciBGaXhlZCAvIEZsdWlkICovXHJcbiAgICBmdW5jdGlvbiB0b2dnbGVTaWRlYmFyKCkge1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ2ZpeGVkLXNpZGViYXInKSkgaGFuZGxlU2lkZWJhckZsdWlkKCk7XHJcbiAgICAgICAgZWxzZSBoYW5kbGVTaWRlYmFyRml4ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBDcmVhdGUgU2lkZWJhciBvbmx5IHZpc2libGUgb24gSG92ZXIgKi9cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZVNpZGViYXJIb3ZlcigpIHtcclxuICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3NpZGViYXItaG92ZXInKTtcclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ2ZpeGVkLXNpZGViYXInKS5hZGRDbGFzcygnZml4ZWQtc2lkZWJhcicpO1xyXG4gICAgICAgICQoJy5tYWluLWNvbnRlbnQnKS5jc3MoJ21hcmdpbi1sZWZ0JywgJycpLmNzcygnbWFyZ2luLXJpZ2h0JywgJycpO1xyXG4gICAgICAgICQoJy50b3BiYXInKS5jc3MoJ2xlZnQnLCAnJykuY3NzKCdyaWdodCcsICcnKTtcclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3NpZGViYXItdG9wJyk7XHJcbiAgICAgICAgcmVtb3ZlU3VibWVudUhvdmVyKCk7XHJcbiAgICAgICAgcmVtb3ZlQm94ZWRMYXlvdXQoKTtcclxuICAgICAgICByZW1vdmVDb2xsYXBzZWRTaWRlYmFyKCk7XHJcbiAgICAgICAgc2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgaGFuZGxlU2lkZWJhckZpeGVkKCk7XHJcbiAgICAgICAgJCgnI3N3aXRjaC1zaWRlYmFyLWhvdmVyJykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xyXG4gICAgICAgICQoJyNzd2l0Y2gtc2lkZWJhcicpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAkKCcjc3dpdGNoLXNpZGViYXItdG9wJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAkKCcjc3dpdGNoLWJveGVkJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnZmx1aWQtdG9wYmFyJyk7XHJcbiAgICAgICAgJC5yZW1vdmVDb29raWUoJ2ZsdWlkLXRvcGJhcicsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnc2lkZWJhci10b3AnLCB7cGF0aDogJy8nfSk7XHJcbiAgICAgICAgJC5jb29raWUoJ3NpZGViYXItaG92ZXInLCAxLCB7cGF0aDogJy8nfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogUmVtb3ZlIFNpZGViYXIgb24gSG92ZXIgKi9cclxuICAgIGZ1bmN0aW9uIHJlbW92ZVNpZGViYXJIb3ZlcigpIHtcclxuICAgICAgICAkKCcjc3dpdGNoLXNpZGViYXItaG92ZXInKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xyXG4gICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnc2lkZWJhci1ob3ZlcicpO1xyXG4gICAgICAgIGlmICghJCgnYm9keScpLmhhc0NsYXNzKCdib3hlZCcpKSAkKCcuc2lkZWJhciwgLnNpZGViYXItZm9vdGVyJykuYXR0cignc3R5bGUnLCAnJyk7XHJcbiAgICAgICAgJCgnLmxvZ29wYW5lbDInKS5yZW1vdmUoKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnc2lkZWJhci1ob3ZlcicsIHtwYXRoOiAnLyd9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBUb2dnbGUgU2lkZWJhciBvbiBUb3AgKi9cclxuICAgIGZ1bmN0aW9uIHRvZ2dsZVNpZGViYXJIb3ZlcigpIHtcclxuICAgICAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLWhvdmVyJykpIHJlbW92ZVNpZGViYXJIb3ZlcigpO1xyXG4gICAgICAgIGVsc2UgY3JlYXRlU2lkZWJhckhvdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQ3JlYXRlIFNpZGViYXIgU3VibWVudSB2aXNpYmxlIG9uIEhvdmVyICovXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVTdWJtZW51SG92ZXIoKSB7XHJcbiAgICAgICAgcmVtb3ZlU2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgaGFuZGxlU2lkZWJhckZsdWlkKCk7XHJcbiAgICAgICAgJCgnI3N3aXRjaC1zdWJtZW51LWhvdmVyJykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xyXG4gICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnc3VibWVudS1ob3ZlcicpO1xyXG4gICAgICAgICQoJy5uYXYtc2lkZWJhciAuY2hpbGRyZW4nKS5jc3MoJ2Rpc3BsYXknLCAnJyk7XHJcbiAgICAgICAgJC5jb29raWUoJ3N1Ym1lbnUtaG92ZXInLCAxLCB7cGF0aDogJy8nfSk7XHJcbiAgICAgICAgJCgnI3N3aXRjaC1zaWRlYmFyJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBSZW1vdmUgU3VibWVudSBvbiBIb3ZlciAqL1xyXG4gICAgZnVuY3Rpb24gcmVtb3ZlU3VibWVudUhvdmVyKCkge1xyXG4gICAgICAgICQoJyNzd2l0Y2gtc3VibWVudS1ob3ZlcicpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzdWJtZW51LWhvdmVyJyk7XHJcbiAgICAgICAgJCgnLm5hdi1zaWRlYmFyIC5uYXYtcGFyZW50LmFjdGl2ZSAuY2hpbGRyZW4nKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnc3VibWVudS1ob3ZlcicsIHtwYXRoOiAnLyd9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBUb2dnbGUgU3VibWVudSBvbiBIb3ZlciAqL1xyXG4gICAgZnVuY3Rpb24gdG9nZ2xlU3VibWVudUhvdmVyKCkge1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3N1Ym1lbnUtaG92ZXInKSkgcmVtb3ZlU3VibWVudUhvdmVyKCk7XHJcbiAgICAgICAgZWxzZSBjcmVhdGVTdWJtZW51SG92ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBDcmVhdGUgVG9wYmFyIEZpeGVkICovXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVUb3BiYXJGaXhlZCgpIHtcclxuICAgICAgICAkKCcjc3dpdGNoLXRvcGJhcicpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ2ZpeGVkLXRvcGJhcicpLmFkZENsYXNzKCdmaXhlZC10b3BiYXInKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnZmx1aWQtdG9wYmFyJyk7XHJcbiAgICAgICAgJC5yZW1vdmVDb29raWUoJ2ZsdWlkLXRvcGJhcicsIHtwYXRoOiAnLyd9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBDcmVhdGUgVG9wYmFyIEZsdWlkIC8gUmVtb3ZlIFRvcGJhciBGaXhlZCAqL1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlVG9wYmFyRmx1aWQoKSB7XHJcbiAgICAgICAgJCgnI3N3aXRjaC10b3BiYXInKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xyXG4gICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnZml4ZWQtdG9wYmFyJyk7XHJcbiAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci10b3AnKSAmJiAkKCdib2R5JykuaGFzQ2xhc3MoJ2ZpeGVkLXNpZGViYXInKSkge1xyXG4gICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ2ZpeGVkLXNpZGViYXInKTtcclxuICAgICAgICAgICAgJCgnI3N3aXRjaC1zaWRlYmFyJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJC5jb29raWUoJ2ZsdWlkLXRvcGJhcicsIDEsIHtwYXRoOiAnLyd9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBUb2dnbGUgVG9wYmFyIEZpeGVkIC8gRmx1aWQgKi9cclxuICAgIGZ1bmN0aW9uIHRvZ2dsZVRvcGJhcigpIHtcclxuICAgICAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdmaXhlZC10b3BiYXInKSkgaGFuZGxlVG9wYmFyRmx1aWQoKTtcclxuICAgICAgICBlbHNlIGhhbmRsZVRvcGJhckZpeGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQWRqdXN0IG1hcmdpbiBvZiBjb250ZW50IGZvciBib3hlZCBsYXlvdXQgKi9cclxuICAgIGZ1bmN0aW9uIGhhbmRsZWJveGVkTGF5b3V0KCkge1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ2J1aWxkZXItYWRtaW4nKSkgcmV0dXJuO1xyXG4gICAgICAgICRsb2dvcGFuZWwuY3NzKCdsZWZ0JywgJycpLmNzcygncmlnaHQnLCAnJyk7XHJcbiAgICAgICAgJHRvcGJhci5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgICRzaWRlYmFyLmNzcygnbWFyZ2luLWxlZnQnLCAnJykuY3NzKCdtYXJnaW4tcmlnaHQnLCAnJyk7XHJcbiAgICAgICAgJHNpZGViYXJGb290ZXIuY3NzKCdsZWZ0JywgJycpLmNzcygncmlnaHQnLCAnJyk7XHJcbiAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnYm94ZWQnKSkge1xyXG4gICAgICAgICAgICB3aW5kb3dXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xyXG4gICAgICAgICAgICB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIHBhZ2VDb250ZW50SGVpZ2h0ID0gJCgnLnBhZ2UtY29udGVudCcpLmhlaWdodCgpO1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gMTIwMDtcclxuICAgICAgICAgICAgdG9wYmFyV2lkdGggPSAoY29udGFpbmVyIC0gJHNpZGViYXJXaWR0aCk7XHJcbiAgICAgICAgICAgIHZhciBtYXJnaW4gPSAod2luZG93V2lkdGggLSAxMjAwKSAvIDI7XHJcbiAgICAgICAgICAgIGlmICghJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLXRvcCcpICYmIHdpbmRvd1dpZHRoID4gMTIyMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygncnRsJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAkbG9nb3BhbmVsLmNzcygncmlnaHQnLCBtYXJnaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHRvcGJhci5jc3MoJ3dpZHRoJywgMTIwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnZml4ZWQtc2lkZWJhcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2lkZWJhci5jc3MoJ21hcmdpbi1yaWdodCcsIG1hcmdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BiYXJXaWR0aCA9ICgxMjAwIC0gJHNpZGViYXJXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcudG9wYmFyJykuY3NzKCd3aWR0aCcsIHRvcGJhcldpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2lkZWJhckZvb3Rlci5jc3MoJ3JpZ2h0JywgbWFyZ2luKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHRvcGJhci5jc3MoJ3dpZHRoJywgdG9wYmFyV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGxvZ29wYW5lbC5jc3MoJ2xlZnQnLCBtYXJnaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHRvcGJhci5jc3MoJ3dpZHRoJywgMTIwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnZml4ZWQtc2lkZWJhcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2lkZWJhci5jc3MoJ21hcmdpbi1sZWZ0JywgbWFyZ2luKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGJhcldpZHRoID0gKDEyMDAgLSAkc2lkZWJhcldpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy50b3BiYXInKS5jc3MoJ3dpZHRoJywgdG9wYmFyV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzaWRlYmFyRm9vdGVyLmNzcygnbGVmdCcsIG1hcmdpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR0b3BiYXIuY3NzKCd3aWR0aCcsIHRvcGJhcldpZHRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQuYmFja3N0cmV0Y2goW1wiLi4vLi4vLi4vYXNzZXRzL2dsb2JhbC9pbWFnZXMvZ2FsbGVyeS9iZzEuanBnXCIsIFwiLi4vLi4vLi4vYXNzZXRzL2dsb2JhbC9pbWFnZXMvZ2FsbGVyeS9iZzIuanBnXCIsIFwiLi4vLi4vLi4vYXNzZXRzL2dsb2JhbC9pbWFnZXMvZ2FsbGVyeS9iZzMuanBnXCIsIFwiLi4vLi4vLi4vYXNzZXRzL2dsb2JhbC9pbWFnZXMvZ2FsbGVyeS9iZzQuanBnXCJdLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFkZTogMzAwMCxcclxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogNDAwMFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKCcuYmFja3N0cmV0Y2gnKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyogQ3JlYXRlIEJveGVkIExheW91dCAqL1xyXG4gICAgZnVuY3Rpb24gY3JlYXRlQm94ZWRMYXlvdXQoKSB7XHJcbiAgICAgICAgcmVtb3ZlU2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdib3hlZCcpO1xyXG4gICAgICAgIGhhbmRsZWJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgJCgnI3N3aXRjaC1ib3hlZCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAkLmNvb2tpZSgnYm94ZWQtbGF5b3V0JywgMSwge3BhdGg6ICcvJ30pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFJlbW92ZSBib3hlZCBsYXlvdXQgKi9cclxuICAgIGZ1bmN0aW9uIHJlbW92ZUJveGVkTGF5b3V0KCkge1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ2JveGVkJykpIHtcclxuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdib3hlZCcpO1xyXG4gICAgICAgICAgICAkbG9nb3BhbmVsLmNzcygnbGVmdCcsICcnKS5jc3MoJ3JpZ2h0JywgJycpO1xyXG4gICAgICAgICAgICAkdG9wYmFyLmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgICAgICAgICRzaWRlYmFyLmNzcygnbWFyZ2luLWxlZnQnLCAnJykuY3NzKCdtYXJnaW4tcmlnaHQnLCAnJyk7XHJcbiAgICAgICAgICAgICRzaWRlYmFyRm9vdGVyLmNzcygnbGVmdCcsICcnKS5jc3MoJ3JpZ2h0JywgJycpO1xyXG4gICAgICAgICAgICAkLnJlbW92ZUNvb2tpZSgnYm94ZWQtbGF5b3V0Jywge3BhdGg6ICcvJ30pO1xyXG4gICAgICAgICAgICAkKCcjc3dpdGNoLWJveGVkJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgJC5iYWNrc3RyZXRjaChcImRlc3Ryb3lcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRvZ2dsZWJveGVkTGF5b3V0KCkge1xyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ2JveGVkJykpIHJlbW92ZUJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgZWxzZSBjcmVhdGVCb3hlZExheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFRvZ2dsZSBTaWRlYmFyIENvbGxhcHNlZCAqL1xyXG4gICAgZnVuY3Rpb24gY29sbGFwc2VkU2lkZWJhcigpIHtcclxuXHJcbiAgICAgICAgaWYgKCRib2R5LndpZHRoKCkgPj0gMTEwMCkge1xyXG4gICAgICAgICAgICBpZiAoISRib2R5Lmhhc0NsYXNzKCdzaWRlYmFyLWNvbGxhcHNlZCcpKSBjcmVhdGVDb2xsYXBzZWRTaWRlYmFyKCk7XHJcbiAgICAgICAgICAgIGVsc2UgcmVtb3ZlQ29sbGFwc2VkU2lkZWJhcigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgkYm9keS5oYXNDbGFzcygnc2lkZWJhci1zaG93JykpICRib2R5LnJlbW92ZUNsYXNzKCdzaWRlYmFyLXNob3cnKTtcclxuICAgICAgICAgICAgZWxzZSAkYm9keS5hZGRDbGFzcygnc2lkZWJhci1zaG93Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhhbmRsZWJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgJHJvb3RTY29wZS4kZW1pdCgncmVzaXplLmFsbFRhYmxlcycpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbGxhcHNlZFNpZGViYXIoKSB7XHJcbiAgICAgICAgJGJvZHkuYWRkQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJyk7XHJcbiAgICAgICAgJCgnLnNpZGViYXInKS5jc3MoJ3dpZHRoJywgJycpLnJlc2l6YWJsZSgpLnJlc2l6YWJsZSgnZGVzdHJveScpO1xyXG4gICAgICAgICQoJy5uYXYtc2lkZWJhciB1bCcpLmF0dHIoJ3N0eWxlJywgJycpO1xyXG4gICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ21lbnUtY29sbGFwc2VkJyk7XHJcbiAgICAgICAgZGVzdHJveVNpZGVTY3JvbGwoKTtcclxuICAgICAgICAkKCcjc3dpdGNoLXNpZGViYXInKS5wcm9wKCdjaGVja2VkJyk7XHJcbiAgICAgICAgJC5jb29raWUoJ3NpZGViYXItY29sbGFwc2VkJywgMSwge3BhdGg6ICcvJ30pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlbW92ZUNvbGxhcHNlZFNpZGViYXIoKSB7XHJcbiAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJyk7XHJcbiAgICAgICAgaWYgKCEkYm9keS5oYXNDbGFzcygnc3VibWVudS1ob3ZlcicpKVxyXG4gICAgICAgICAgICAkKCcubmF2LXNpZGViYXIgbGkuYWN0aXZlIHVsJykuY3NzKHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnbWVudS1jb2xsYXBzZWQnKTtcclxuICAgICAgICBpZiAoJGJvZHkuaGFzQ2xhc3MoJ3NpZGViYXItbGlnaHQnKSAmJiAhJGJvZHkuaGFzQ2xhc3MoJ3NpZGViYXItZml4ZWQnKSkge1xyXG4gICAgICAgICAgICAkKCcuc2lkZWJhcicpLmhlaWdodCgnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNyZWF0ZVNpZGVTY3JvbGwoKTtcclxuICAgICAgICAkLnJlbW92ZUNvb2tpZSgnc2lkZWJhci1jb2xsYXBzZWQnLCB7cGF0aDogJy8nfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qIFJlc2V0IHRvIERlZmF1bHQgU3R5bGUsIHJlbW92ZSBhbGwgY29va2llIGFuZCBjdXN0b20gbGF5b3V0cyAqL1xyXG4gICAgZnVuY3Rpb24gcmVzZXRTdHlsZSgpIHtcclxuICAgICAgICAkKCcjcmVzZXQtc3R5bGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgcmVtb3ZlQm94ZWRMYXlvdXQoKTtcclxuICAgICAgICAgICAgcmVtb3ZlU2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgICAgIHJlbW92ZVN1Ym1lbnVIb3ZlcigpO1xyXG4gICAgICAgICAgICByZW1vdmVDb2xsYXBzZWRTaWRlYmFyKCk7XHJcbiAgICAgICAgICAgIGRpc2FibGVSVEwoKTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ3J0bCcpO1xyXG4gICAgICAgICAgICAkLnJlbW92ZUNvb2tpZSgnbWFpbi1jb2xvcicpO1xyXG4gICAgICAgICAgICAkLnJlbW92ZUNvb2tpZSgnbWFpbi1uYW1lJyk7XHJcbiAgICAgICAgICAgICQucmVtb3ZlQ29va2llKCd0aGVtZScpO1xyXG4gICAgICAgICAgICAkLnJlbW92ZUNvb2tpZSgnYmctbmFtZScpO1xyXG4gICAgICAgICAgICAkLnJlbW92ZUNvb2tpZSgnYmctY29sb3InKTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ3N1Ym1lbnUtaG92ZXInKTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ3NpZGViYXItY29sbGFwc2VkJyk7XHJcbiAgICAgICAgICAgICQucmVtb3ZlQ29va2llKCdib3hlZC1sYXlvdXQnKTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ2JveGVkLWxheW91dCcsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ3J0bCcsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ21haW4tY29sb3InLCB7cGF0aDogJy8nfSk7XHJcbiAgICAgICAgICAgICQucmVtb3ZlQ29va2llKCdtYWluLW5hbWUnLCB7cGF0aDogJy8nfSk7XHJcbiAgICAgICAgICAgICQucmVtb3ZlQ29va2llKCd0aGVtZScsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ2JnLW5hbWUnLCB7cGF0aDogJy8nfSk7XHJcbiAgICAgICAgICAgICQucmVtb3ZlQ29va2llKCdiZy1jb2xvcicsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAgICAgJC5yZW1vdmVDb29raWUoJ3N1Ym1lbnUtaG92ZXInLCB7cGF0aDogJy8nfSk7XHJcbiAgICAgICAgICAgICQucmVtb3ZlQ29va2llKCdzaWRlYmFyLWNvbGxhcHNlZCcsIHtwYXRoOiAnLyd9KTtcclxuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKGZ1bmN0aW9uIChpbmRleCwgY3NzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNzcy5tYXRjaCgvKF58XFxzKWJnLVxcUysvZykgfHwgW10pLmpvaW4oJyAnKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcyhmdW5jdGlvbiAoaW5kZXgsIGNzcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjc3MubWF0Y2goLyhefFxccyljb2xvci1cXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoZnVuY3Rpb24gKGluZGV4LCBjc3MpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoY3NzLm1hdGNoKC8oXnxcXHMpdGhlbWUtXFxTKy9nKSB8fCBbXSkuam9pbignICcpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCd0aGVtZS1zZHRsJykuYWRkQ2xhc3MoJ2NvbG9yLWRlZmF1bHQnKTtcclxuICAgICAgICAgICAgJCgnLmJ1aWxkZXIgLnRoZW1lLWNvbG9yJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAkKCcudGhlbWUtY29sb3InKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NvbG9yJykgPT0gJyMzMTlEQjUnKSAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICQoJy5idWlsZGVyIC50aGVtZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgJCgnLmJ1aWxkZXIgLnRoZW1lLWRlZmF1bHQnKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICQoJy5idWlsZGVyIC5zcC1yZXBsYWNlcicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqIEVORCBMQVlPVVQgQVBJICAqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuICAgIC8qKioqICBGdWxsIFNjcmVlbiBUb2dnbGUgICoqKiovXHJcbiAgICBmdW5jdGlvbiB0b2dnbGVGdWxsU2NyZWVuKCkge1xyXG4gICAgICAgIGlmICghZG9jLmZ1bGxzY3JlZW5FbGVtZW50ICYmICFkb2MubXNGdWxsc2NyZWVuRWxlbWVudCAmJiAhZG9jLndlYmtpdElzRnVsbFNjcmVlbiAmJiAhZG9jLm1vekZ1bGxTY3JlZW5FbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChkb2NFbC5yZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgZG9jRWwucmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkb2NFbC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgZG9jRWwud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkb2NFbC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgZG9jRWwud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4oKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkb2NFbC5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBkb2NFbC5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jRWwubW96UmVxdWVzdEZ1bGxTY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgIGRvY0VsLm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZG9jLmV4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBkb2MuZXhpdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkb2Mud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgIGRvYy53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRvYy53ZWJraXRDYW5jZWxGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBkb2Mud2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRvYy5tc0V4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBkb2MubXNFeGl0RnVsbHNjcmVlbigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRvYy5tb3pDYW5jZWxGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBkb2MubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiBTaW11bGF0ZSBBamF4IGNhbGwgb24gUGFuZWwgd2l0aCByZWxvYWQgZWZmZWN0ICovXHJcbiAgICBmdW5jdGlvbiBibG9ja1VJKGl0ZW0pIHtcclxuICAgICAgICAkKGl0ZW0pLmJsb2NrKHtcclxuICAgICAgICAgICAgbWVzc2FnZTogJzxzdmcgY2xhc3M9XCJjaXJjdWxhclwiPjxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCI0MFwiIGN5PVwiNDBcIiByPVwiMTBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCIvPjwvc3ZnPicsXHJcbiAgICAgICAgICAgIGNzczoge1xyXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogJzE0cHgnLFxyXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnbm9uZSdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb3ZlcmxheUNTUzoge1xyXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZicsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjYsXHJcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICd3YWl0J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdW5ibG9ja1VJKGl0ZW0pIHtcclxuICAgICAgICAkKGl0ZW0pLnVuYmxvY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKiBQQU5FTCBBQ1RJT05TICoqKiovXHJcbiAgICAvKiBDcmVhdGUgUG9ydGxldHMgQ29udHJvbHMgYXV0b21hdGljYWxseTogcmVsb2FkLCBmdWxsc2NyZWVuLCB0b2dnbGUsIHJlbW92ZSwgcG9wb3V0ICovXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVQYW5lbENvbnRyb2xzKCkge1xyXG4gICAgICAgICQoJy5wYW5lbC1jb250cm9scycpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgY29udHJvbHNfaHRtbCA9ICc8ZGl2IGNsYXNzPVwiY29udHJvbC1idG5cIj4nICsgJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJwYW5lbC1yZWxvYWQgaGlkZGVuXCI+PGkgY2xhc3M9XCJpY29uLXJlbG9hZFwiPjwvaT48L2E+JyArICc8YSBjbGFzcz1cImhpZGRlblwiIGlkPVwiZHJvcGRvd25NZW51MVwiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIj4nICsgJzxpIGNsYXNzPVwiaWNvbi1zZXR0aW5nc1wiPjwvaT4nICsgJzwvYT4nICsgJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgcHVsbC1yaWdodFwiIHJvbGU9XCJtZW51XCIgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25NZW51MVwiPicgKyAnPGxpPjxhIGhyZWY9XCIjXCI+QWN0aW9uPC9hPicgKyAnPC9saT4nICsgJzxsaT48YSBocmVmPVwiI1wiPkFub3RoZXIgYWN0aW9uPC9hPicgKyAnPC9saT4nICsgJzxsaT48YSBocmVmPVwiI1wiPlNvbWV0aGluZyBlbHNlIGhlcmU8L2E+JyArICc8L2xpPicgKyAnPC91bD4nICsgJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJwYW5lbC1wb3BvdXQgaGlkZGVuIHR0XCIgdGl0bGU9XCJQb3AgT3V0L0luXCI+PGkgY2xhc3M9XCJpY29ucy1vZmZpY2UtNThcIj48L2k+PC9hPicgKyAnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInBhbmVsLW1heGltaXplIGhpZGRlblwiPjxpIGNsYXNzPVwiaWNvbi1zaXplLWZ1bGxzY3JlZW5cIj48L2k+PC9hPicgKyAnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInBhbmVsLXRvZ2dsZVwiPjxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG93blwiPjwvaT48L2E+JyArICc8YSBocmVmPVwiI1wiIGNsYXNzPVwicGFuZWwtY2xvc2VcIj48aSBjbGFzcz1cImljb24tdHJhc2hcIj48L2k+PC9hPicgKyAnPC9kaXY+JztcclxuICAgICAgICAgICAgJCh0aGlzKS5hcHBlbmQoY29udHJvbHNfaHRtbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGFuZGxlUGFuZWxBY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGhhbmRsZVBhbmVsQ29udHJvbHMoKTtcclxuICAgICAgICAvLyBSZW1vdmUgUGFuZWwgXHJcbiAgICAgICAgJChcIi5wYW5lbC1oZWFkZXIgLnBhbmVsLWNsb3NlXCIpLmNsaWNrKGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAkaXRlbSA9ICQodGhpcykucGFyZW50cyhcIi5wYW5lbDpmaXJzdFwiKTtcclxuICAgICAgICAgICAgYm9vdGJveC5jb25maXJtKFwiQXJlIHlvdSBzdXJlIHRvIHJlbW92ZSB0aGlzIHBhbmVsP1wiLCBmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGl0ZW0uYWRkQ2xhc3MoXCJhbmltYXRlZCBib3VuY2VPdXRSaWdodFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFRvZ2dsZSBQYW5lbCBDb250ZW50XHJcbiAgICAgICAgJChcIi5wYW5lbC1oZWFkZXIgLnBhbmVsLXRvZ2dsZVwiKS5jbGljayhmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcyhcImNsb3NlZFwiKS5wYXJlbnRzKFwiLnBhbmVsOmZpcnN0XCIpLmZpbmQoXCIucGFuZWwtY29udGVudFwiKS5zbGlkZVRvZ2dsZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFBvcG91dCAvIFBvcGluIFBhbmVsXHJcbiAgICAgICAgJChcIi5wYW5lbC1oZWFkZXIgLnBhbmVsLXBvcG91dFwiKS5jbGljayhmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdmFyIHBhbmVsID0gJCh0aGlzKS5wYXJlbnRzKFwiLnBhbmVsOmZpcnN0XCIpO1xyXG4gICAgICAgICAgICBpZiAocGFuZWwuaGFzQ2xhc3MoXCJtb2RhbC1wYW5lbFwiKSkge1xyXG4gICAgICAgICAgICAgICAgJChcImlcIiwgdGhpcykucmVtb3ZlQ2xhc3MoXCJpY29ucy1vZmZpY2UtNTVcIikuYWRkQ2xhc3MoXCJpY29ucy1vZmZpY2UtNThcIik7XHJcbiAgICAgICAgICAgICAgICBwYW5lbC5yZW1vdmVBdHRyKFwic3R5bGVcIikucmVtb3ZlQ2xhc3MoXCJtb2RhbC1wYW5lbFwiKTtcclxuICAgICAgICAgICAgICAgIHBhbmVsLmZpbmQoXCIucGFuZWwtbWF4aW1pemUsLnBhbmVsLXRvZ2dsZVwiKS5yZW1vdmVDbGFzcyhcIm5ldmVyc2hvd1wiKTtcclxuICAgICAgICAgICAgICAgIHBhbmVsLmRyYWdnYWJsZShcImRlc3Ryb3lcIikucmVzaXphYmxlKFwiZGVzdHJveVwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhbmVsLnJlbW92ZUNsYXNzKFwibWF4aW1pemVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcGFuZWwuZmluZChcIi5wYW5lbC1tYXhpbWl6ZSwucGFuZWwtdG9nZ2xlXCIpLmFkZENsYXNzKFwibmV2ZXJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgJChcImlcIiwgdGhpcykucmVtb3ZlQ2xhc3MoXCJpY29ucy1vZmZpY2UtNThcIikuYWRkQ2xhc3MoXCJpY29ucy1vZmZpY2UtNTVcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgdyA9IHBhbmVsLndpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaCA9IHBhbmVsLmhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFuZWwuYWRkQ2xhc3MoXCJtb2RhbC1wYW5lbFwiKS5yZW1vdmVBdHRyKFwic3R5bGVcIikud2lkdGgodykuaGVpZ2h0KGgpO1xyXG4gICAgICAgICAgICAgICAgJChwYW5lbCkuZHJhZ2dhYmxlKHtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IFwiLnBhbmVsLWhlYWRlclwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5tZW50OiBcIi5wYWdlLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgfSkuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICBcImxlZnRcIjogcGFuZWwucG9zaXRpb24oKS5sZWZ0IC0gMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJ0b3BcIjogcGFuZWwucG9zaXRpb24oKS50b3AgKyAyXHJcbiAgICAgICAgICAgICAgICB9KS5yZXNpemFibGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogMTUwLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDBcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQoXCJib2R5XCIpLnRyaWdnZXIoXCJyZXNpemVcIik7XHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gUmVsb2FkIFBhbmVsIENvbnRlbnRcclxuICAgICAgICAkKCcucGFuZWwtaGVhZGVyIC5wYW5lbC1yZWxvYWQnKS5jbGljayhmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHZhciBlbCA9ICQodGhpcykucGFyZW50cyhcIi5wYW5lbDpmaXJzdFwiKTtcclxuICAgICAgICAgICAgYmxvY2tVSShlbCk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHVuYmxvY2tVSShlbCk7XHJcbiAgICAgICAgICAgIH0sIDE4MDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIE1heGltaXplIFBhbmVsIERpbWVuc2lvbiBcclxuICAgICAgICAkKFwiLnBhbmVsLWhlYWRlciAucGFuZWwtbWF4aW1pemVcIikuY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHZhciBwYW5lbCA9ICQodGhpcykucGFyZW50cyhcIi5wYW5lbDpmaXJzdFwiKTtcclxuICAgICAgICAgICAgJGJvZHkudG9nZ2xlQ2xhc3MoXCJtYXhpbWl6ZWQtcGFuZWxcIik7XHJcbiAgICAgICAgICAgIHBhbmVsLnJlbW92ZUF0dHIoXCJzdHlsZVwiKS50b2dnbGVDbGFzcyhcIm1heGltaXplZFwiKTtcclxuICAgICAgICAgICAgbWF4aW1pemVQYW5lbCgpO1xyXG4gICAgICAgICAgICBpZiAocGFuZWwuaGFzQ2xhc3MoXCJtYXhpbWl6ZWRcIikpIHtcclxuICAgICAgICAgICAgICAgIHBhbmVsLnBhcmVudHMoXCIucG9ydGxldHM6Zmlyc3RcIikuc29ydGFibGUoXCJkZXN0cm95XCIpO1xyXG4gICAgICAgICAgICAgICAgJCh3aW5kb3cpLnRyaWdnZXIoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJCh3aW5kb3cpLnRyaWdnZXIoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICAgICAgcGFuZWwucGFyZW50KCkuaGVpZ2h0KCcnKTtcclxuICAgICAgICAgICAgICAgIHBsdWdpbnNTZXJ2aWNlLnNvcnRhYmxlUG9ydGxldHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAkKFwiaVwiLCB0aGlzKS50b2dnbGVDbGFzcyhcImljb24tc2l6ZS1mdWxsc2NyZWVuXCIpLnRvZ2dsZUNsYXNzKFwiaWNvbi1zaXplLWFjdHVhbFwiKTtcclxuICAgICAgICAgICAgcGFuZWwuZmluZChcIi5wYW5lbC10b2dnbGVcIikudG9nZ2xlQ2xhc3MoXCJuZXZlcnNob3dcIik7XHJcbiAgICAgICAgICAgICQoXCJib2R5XCIpLnRyaWdnZXIoXCJyZXNpemVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtYXhpbWl6ZVBhbmVsKCkge1xyXG4gICAgICAgIGlmICgkKCcubWF4aW1pemVkJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhciBwYW5lbCA9ICQoJy5tYXhpbWl6ZWQnKTtcclxuICAgICAgICAgICAgdmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKSAtIDI7XHJcbiAgICAgICAgICAgIHBhbmVsSGVpZ2h0ID0gcGFuZWwuZmluZCgnLnBhbmVsLWhlYWRlcicpLmhlaWdodCgpICsgcGFuZWwuZmluZCgnLnBhbmVsLWNvbnRlbnQnKS5oZWlnaHQoKSArIDEwMDtcclxuICAgICAgICAgICAgaWYgKHBhbmVsLmhhc0NsYXNzKCdtYXhpbWl6ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvd0hlaWdodCA+IHBhbmVsSGVpZ2h0KSBwYW5lbC5wYXJlbnQoKS5oZWlnaHQod2luZG93SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKCcubWFpbi1jb250ZW50JykuaGVpZ2h0KCkgPiBwYW5lbEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5wYXJlbnQoKS5oZWlnaHQoJCgnLm1haW4tY29udGVudCcpLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5wYXJlbnQoKS5oZWlnaHQocGFuZWxIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhbmVsLnBhcmVudCgpLmhlaWdodCgnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKioqICBDdXN0b20gU2Nyb2xsYmFyICAqKioqL1xyXG4gICAgLyogQ3JlYXRlIEN1c3RvbSBTY3JvbGwgZm9yIGVsZW1lbnRzIGxpa2UgUG9ydGxldHMgb3IgRHJvcGRvd24gbWVudSAqL1xyXG4gICAgZnVuY3Rpb24gY3VzdG9tU2Nyb2xsKCkge1xyXG4gICAgICAgIGlmICgkLmZuLm1DdXN0b21TY3JvbGxiYXIpIHtcclxuICAgICAgICAgICAgJCgnLndpdGhTY3JvbGwnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykubUN1c3RvbVNjcm9sbGJhcihcImRlc3Ryb3lcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsX2hlaWdodCA9ICQodGhpcykuZGF0YSgnaGVpZ2h0JykgPyAkKHRoaXMpLmRhdGEoJ2hlaWdodCcpIDogJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGFfcGFkZGluZyA9ICQodGhpcykuZGF0YSgncGFkZGluZycpID8gJCh0aGlzKS5kYXRhKCdwYWRkaW5nJykgOiAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnaGVpZ2h0JykgPT0gJ3dpbmRvdycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzSGVpZ2h0ID0gJCh0aGlzKS5oZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSBkYXRhX3BhZGRpbmcgLSA1MDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc0hlaWdodCA8IHdpbmRvd0hlaWdodCkgc2Nyb2xsX2hlaWdodCA9IHRoaXNIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBzY3JvbGxfaGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5tQ3VzdG9tU2Nyb2xsYmFyKHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxCdXR0b25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9IaWRlU2Nyb2xsYmFyOiAkKHRoaXMpLmhhc0NsYXNzKCdzaG93LXNjcm9sbCcpID8gZmFsc2UgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEluZXJ0aWE6IDE1MCxcclxuICAgICAgICAgICAgICAgICAgICB0aGVtZTogXCJsaWdodFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHNldF9oZWlnaHQ6IHNjcm9sbF9oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT25Db250ZW50UmVzaXplOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIC8qIEJFR0lOIFNJREVCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgLyogU2lkZWJhciBTb3J0YWJsZSBtZW51ICYgc3VibWVudSAqL1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlU2lkZWJhclNvcnRhYmxlKCkge1xyXG4gICAgICAgICQoJy5tZW51LXNldHRpbmdzJykub24oJ2NsaWNrJywgJyNyZW9yZGVyLW1lbnUnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICQoJy5uYXYtc2lkZWJhcicpLnJlbW92ZUNsYXNzKCdyZW1vdmUtbWVudScpO1xyXG4gICAgICAgICAgICAkKFwiLm5hdi1zaWRlYmFyXCIpLnNvcnRhYmxlKHtcclxuICAgICAgICAgICAgICAgIGNvbm5lY3RXaXRoOiBcIi5uYXYtc2lkZWJhciA+IGxpXCIsXHJcbiAgICAgICAgICAgICAgICBoYW5kbGU6IFwiYVwiLFxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwibmF2LXNpZGViYXItcGxhY2Vob2xkZXJcIixcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNSxcclxuICAgICAgICAgICAgICAgIGF4aXM6IFwieVwiLFxyXG4gICAgICAgICAgICAgICAgZHJvcE9uRW1wdHk6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBmb3JjZVBsYWNlaG9sZGVyU2l6ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlY2VpdmU6IGZ1bmN0aW9uIChldmVudCwgdWkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS50cmlnZ2VyKFwicmVzaXplXCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvKiBTb3J0YWJsZSBjaGlsZHJlbiAqL1xyXG4gICAgICAgICAgICAkKFwiLm5hdi1zaWRlYmFyIC5jaGlsZHJlblwiKS5zb3J0YWJsZSh7XHJcbiAgICAgICAgICAgICAgICBjb25uZWN0V2l0aDogXCJsaVwiLFxyXG4gICAgICAgICAgICAgICAgaGFuZGxlOiBcImFcIixcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNSxcclxuICAgICAgICAgICAgICAgIGRyb3BPbkVtcHR5OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZm9yY2VQbGFjZWhvbGRlclNpemU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZWNlaXZlOiBmdW5jdGlvbiAoZXZlbnQsIHVpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChcImJvZHlcIikudHJpZ2dlcihcInJlc2l6ZVwiKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJCh0aGlzKS5hdHRyKFwiaWRcIiwgXCJlbmQtcmVvcmRlci1tZW51XCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLmh0bWwoJ0VuZCByZW9yZGVyIG1lbnUnKTtcclxuICAgICAgICAgICAgJCgnLnJlbW92ZS1tZW51JykuYXR0cihcImlkXCIsIFwicmVtb3ZlLW1lbnVcIikuaHRtbCgnUmVtb3ZlIG1lbnUnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvKiBFbmQgU29ydGFibGUgTWVudSBFbGVtZW50cyovXHJcbiAgICAgICAgJCgnLm1lbnUtc2V0dGluZ3MnKS5vbignY2xpY2snLCAnI2VuZC1yZW9yZGVyLW1lbnUnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICQoXCIubmF2LXNpZGViYXJcIikuc29ydGFibGUoKTtcclxuICAgICAgICAgICAgJChcIi5uYXYtc2lkZWJhclwiKS5zb3J0YWJsZShcImRlc3Ryb3lcIik7XHJcbiAgICAgICAgICAgICQoXCIubmF2LXNpZGViYXIgLmNoaWxkcmVuXCIpLnNvcnRhYmxlKCkuc29ydGFibGUoXCJkZXN0cm95XCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLmF0dHIoXCJpZFwiLCBcInJlbW92ZS1tZW51XCIpLmh0bWwoJ1Jlb3JkZXIgbWVudScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFNpZGViYXIgUmVtb3ZlIE1lbnUgRWxlbWVudHMqL1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlU2lkZWJhclJlbW92ZSgpIHtcclxuICAgICAgICAvKiBSZW1vdmUgTWVudSBFbGVtZW50cyovXHJcbiAgICAgICAgJCgnLm1lbnUtc2V0dGluZ3MnKS5vbignY2xpY2snLCAnI3JlbW92ZS1tZW51JywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAkKFwiLm5hdi1zaWRlYmFyXCIpLnNvcnRhYmxlKCk7XHJcbiAgICAgICAgICAgICQoXCIubmF2LXNpZGViYXJcIikuc29ydGFibGUoXCJkZXN0cm95XCIpO1xyXG4gICAgICAgICAgICAkKFwiLm5hdi1zaWRlYmFyIC5jaGlsZHJlblwiKS5zb3J0YWJsZSgpLnNvcnRhYmxlKFwiZGVzdHJveVwiKTtcclxuICAgICAgICAgICAgJCgnLm5hdi1zaWRlYmFyJykucmVtb3ZlQ2xhc3MoJ3JlbW92ZS1tZW51JykuYWRkQ2xhc3MoJ3JlbW92ZS1tZW51Jyk7XHJcbiAgICAgICAgICAgICQodGhpcykuYXR0cihcImlkXCIsIFwiZW5kLXJlbW92ZS1tZW51XCIpLmh0bWwoJ0VuZCByZW1vdmUgbWVudScpO1xyXG4gICAgICAgICAgICAkKCcucmVvcmRlci1tZW51JykuYXR0cihcImlkXCIsIFwicmVvcmRlci1tZW51XCIpLmh0bWwoJ1Jlb3JkZXIgbWVudScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8qIEVuZCBSZW1vdmUgTWVudSBFbGVtZW50cyovXHJcbiAgICAgICAgJCgnLm1lbnUtc2V0dGluZ3MnKS5vbignY2xpY2snLCAnI2VuZC1yZW1vdmUtbWVudScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgJCgnLm5hdi1zaWRlYmFyJykucmVtb3ZlQ2xhc3MoJ3JlbW92ZS1tZW51Jyk7XHJcbiAgICAgICAgICAgICQodGhpcykuYXR0cihcImlkXCIsIFwicmVtb3ZlLW1lbnVcIikuaHRtbCgnUmVtb3ZlIG1lbnUnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcuc2lkZWJhcicpLm9uKCdjbGljaycsICcucmVtb3ZlLW1lbnUgPiBsaScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJG1lbnUgPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbmF2LXBhcmVudCcpKSAkcmVtb3ZlX3R4dCA9IFwiQXJlIHlvdSBzdXJlIHRvIHJlbW92ZSB0aGlzIG1lbnUgKGFsbCBzdWJtZW51cyB3aWxsIGJlIGRlbGV0ZWQgdG9vKT9cIjtcclxuICAgICAgICAgICAgZWxzZSAkcmVtb3ZlX3R4dCA9IFwiQXJlIHlvdSBzdXJlIHRvIHJlbW92ZSB0aGlzIG1lbnU/XCI7XHJcbiAgICAgICAgICAgIGJvb3Rib3guY29uZmlybSgkcmVtb3ZlX3R4dCwgZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICRtZW51LmFkZENsYXNzKFwiYW5pbWF0ZWQgYm91bmNlT3V0TGVmdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRtZW51LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEhpZGUgVXNlciAmIFNlYXJjaCBTaWRlYmFyICovXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVTaWRlYmFySGlkZSgpIHtcclxuICAgICAgICBoaWRkZW5FbGVtZW50cyA9ICQoJzpoaWRkZW4nKTtcclxuICAgICAgICB2aXNpYmxlRWxlbWVudHMgPSAkKCc6dmlzaWJsZScpO1xyXG4gICAgICAgICQoJy5tZW51LXNldHRpbmdzJykub24oJ2NsaWNrJywgJyNoaWRlLXRvcC1zaWRlYmFyJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB2YXIgdGhpc190ZXh0ID0gJCh0aGlzKS50ZXh0KCk7XHJcbiAgICAgICAgICAgICQoJy5zaWRlYmFyIC5zaWRlYmFyLXRvcCcpLnNsaWRlVG9nZ2xlKDMwMCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzX3RleHQgPT0gJ0hpZGUgdXNlciAmIHNlYXJjaCcpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykudGV4dCgnU2hvdyB1c2VyICYgc2VhcmNoJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcudG9wYmFyJykub24oJ2NsaWNrJywgJy50b2dnbGUtc2lkZWJhci10b3AnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICQoJy5zaWRlYmFyIC5zaWRlYmFyLXRvcCcpLnNsaWRlVG9nZ2xlKDMwMCk7XHJcbiAgICAgICAgICAgIGlmICgkKCcudG9nZ2xlLXNpZGViYXItdG9wIHNwYW4nKS5oYXNDbGFzcygnaWNvbi11c2VyLWZvbGxvd2luZycpKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcudG9nZ2xlLXNpZGViYXItdG9wIHNwYW4nKS5yZW1vdmVDbGFzcygnaWNvbi11c2VyLWZvbGxvd2luZycpLmFkZENsYXNzKCdpY29uLXVzZXItdW5mb2xsb3cnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoJy50b2dnbGUtc2lkZWJhci10b3Agc3BhbicpLnJlbW92ZUNsYXNzKCdpY29uLXVzZXItdW5mb2xsb3cnKS5hZGRDbGFzcygnaWNvbi11c2VyLWZvbGxvd2luZycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQ2hhbmdlIHN0YXR1dCBvZiB1c2VyIGluIHNpZGViYXI6IGF2YWlsYWJsZSwgYnVzeSwgYXdheSwgaW52aXNpYmxlICovXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VVc2VyU3RhdHV0KCkge1xyXG4gICAgICAgICQoJy5zaWRlYmFyJykub24oJ2NsaWNrJywgJy51c2VyLWxvZ2luIGxpIGEnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHZhciBzdGF0dXQgPSAkKHRoaXMpLmZpbmQoJ3NwYW4nKS50ZXh0KCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTdGF0dXQgPSAkKCcudXNlci1sb2dpbiBidXR0b24gc3BhbicpLnRleHQoKTtcclxuICAgICAgICAgICAgJCgnLnVzZXItbG9naW4gYnV0dG9uIHNwYW4nKS50ZXh0KHN0YXR1dCk7XHJcbiAgICAgICAgICAgIGlmIChzdGF0dXQgPT0gJ0J1c3knKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcudXNlci1sb2dpbiBidXR0b24gaTpub3QoLmZhKScpLnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3MoJ2J1c3knKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3RhdHV0ID09ICdJbnZpc2libGUnKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcudXNlci1sb2dpbiBidXR0b24gaTpub3QoLmZhKScpLnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3MoJ3R1cnF1b2lzZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdGF0dXQgPT0gJ0F3YXknKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcudXNlci1sb2dpbiBidXR0b24gaTpub3QoLmZhKScpLnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3MoJ2F3YXknKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIENyZWF0ZSBjdXN0b20gc2Nyb2xsIGZvciBzaWRlYmFyIHVzZWQgZm9yIGZpeGVkIHNpZGViYXIgKi9cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZVNpZGVTY3JvbGwoKSB7XHJcbiAgICAgICAgaWYgKCQuZm4ubUN1c3RvbVNjcm9sbGJhcikge1xyXG4gICAgICAgICAgICBkZXN0cm95U2lkZVNjcm9sbCgpO1xyXG4gICAgICAgICAgICBpZiAoISQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci1jb2xsYXBzZWQnKSAmJiAhJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLWNvbGxhcHNlZCcpICYmICEkKCdib2R5JykuaGFzQ2xhc3MoJ3N1Ym1lbnUtaG92ZXInKSAmJiAkKCdib2R5JykuaGFzQ2xhc3MoJ2ZpeGVkLXNpZGViYXInKSkge1xyXG4gICAgICAgICAgICAgICAgJCgnLnNpZGViYXItaW5uZXInKS5tQ3VzdG9tU2Nyb2xsYmFyKHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxCdXR0b25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9IaWRlU2Nyb2xsYmFyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEluZXJ0aWE6IDE1MCxcclxuICAgICAgICAgICAgICAgICAgICB0aGVtZTogXCJsaWdodC10aGluXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT25Db250ZW50UmVzaXplOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci10b3AnKSkge1xyXG4gICAgICAgICAgICAgICAgZGVzdHJveVNpZGVTY3JvbGwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiBEZXN0cm95IHNpZGViYXIgY3VzdG9tIHNjcm9sbCAqL1xyXG4gICAgZnVuY3Rpb24gZGVzdHJveVNpZGVTY3JvbGwoKSB7XHJcbiAgICAgICAgJCgnLnNpZGViYXItaW5uZXInKS5tQ3VzdG9tU2Nyb2xsYmFyKFwiZGVzdHJveVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBUb2dnbGUgc3VibWVudSBvcGVuICovXHJcbiAgICBmdW5jdGlvbiB0b2dnbGVTaWRlYmFyTWVudSgpIHtcclxuICAgICAgICAvLyBDaGVjayBpZiBzaWRlYmFyIGlzIGNvbGxhcHNlZFxyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykgfHwgJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLXRvcCcpIHx8ICQoJ2JvZHknKS5oYXNDbGFzcygnc3VibWVudS1ob3ZlcicpKVxyXG4gICAgICAgICAgICAkKCcubmF2LXNpZGViYXIgLmNoaWxkcmVuJykuY3NzKHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICcnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIGVsc2UgJCgnLm5hdi1hY3RpdmUuYWN0aXZlIC5jaGlsZHJlbicpLmNzcygnZGlzcGxheScsICdibG9jaycpO1xyXG5cclxuICAgICAgICAkKCcuc2lkZWJhcicpLm9uKCdjbGljaycsICcubmF2LXNpZGViYXIgbGk6bm90KC5uYXYtcGFyZW50KSA+IGEnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykgJiYgISQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci1ob3ZlcicpKSByZXR1cm47XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnc3VibWVudS1ob3ZlcicpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4oJ2xpLmFjdGl2ZScpLmNoaWxkcmVuKCcuY2hpbGRyZW4nKS5zbGlkZVVwKDIwMCk7XHJcblxyXG4gICAgICAgICAgICAkKCcubmF2LXNpZGViYXIgLmFycm93JykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAvLyAgIHBhcmVudC5jaGlsZHJlbignbGkuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cclxuICAgICAgICAgICAgaWYoISQodGhpcykuaGFzQ2xhc3MoJ25hdi1wYXJlbnQnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuKCdsaS5hY3RpdmUubmF2LXBhcmVudCcpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCcuc2lkZWJhcicpLm9uKCdjbGljaycsICcubmF2LXNpZGViYXIgbGkubmF2LXBhcmVudCA+IGEnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykgJiYgISQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci1ob3ZlcicpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3N1Ym1lbnUtaG92ZXInKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuKCdsaS5hY3RpdmUnKS5jaGlsZHJlbignLmNoaWxkcmVuJykuc2xpZGVVcCgyMDApO1xyXG4gICAgICAgICAgICAkKCcubmF2LXNpZGViYXIgLmFycm93JykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAvL3BhcmVudC5jaGlsZHJlbignbGkuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICB2YXIgc3ViID0gJCh0aGlzKS5uZXh0KCk7XHJcbiAgICAgICAgICAgIGlmIChzdWIuaXMoXCI6dmlzaWJsZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgc3ViLmNoaWxkcmVuKCkuYWRkQ2xhc3MoJ2hpZGRlbi1pdGVtJylcclxuICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50KCkucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICBzdWIuc2xpZGVVcCgyMDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWIuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygnaGlkZGVuLWl0ZW0nKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyQodGhpcykuZmluZCgnLmFycm93JykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgc3ViLmNoaWxkcmVuKCkuYWRkQ2xhc3MoJ2lzLWhpZGRlbicpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ViLmNoaWxkcmVuKCkuYWRkQ2xhc3MoJ2lzLXNob3duJyk7XHJcbiAgICAgICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgICAgICAgIHN1Yi5zbGlkZURvd24oMjAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vICAkKHRoaXMpLnBhcmVudCgpLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWIuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygnaXMtaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2lzLXNob3duJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKiogSGFuZGxlIFNpZGViYXIgV2lkZ2V0cyAqKioqL1xyXG4gICAgZnVuY3Rpb24gc2lkZWJhcldpZGdldHMoKSB7XHJcbiAgICAgICAgLyogRm9sZGVycyBXaWRnZXQgKi9cclxuICAgICAgICBpZiAoJCgnLnNpZGViYXItd2lkZ2V0cyAuZm9sZGVycycpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkKCcubmV3LWZvbGRlcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQoJy5zaWRlYmFyLXdpZGdldHMgLmFkZC1mb2xkZXInKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAkKFwiLmFkZC1mb2xkZXIgaW5wdXRcIikua2V5cHJlc3MoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09IDEzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNpZGViYXItd2lkZ2V0cyAuYWRkLWZvbGRlcicpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCc8bGk+PGEgaHJlZj1cIiNcIj48aSBjbGFzcz1cImljb24tZG9jcyBjLWJsdWVcIj48L2k+JyArICQodGhpcykudmFsKCkgKyAnPC9hPiA8L2xpPicpLmluc2VydEJlZm9yZShcIi5hZGQtZm9sZGVyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykudmFsKCcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICQoJy5tYWluLWNvbnRlbnQnKS5jbGljayhmdW5jdGlvbiAoZXYpIHtcclxuICAgICAgICAgICAgICAgIGFkZEZvbGRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtZm9sZGVyJyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXYudGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gYWRkRm9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNpZGViYXItd2lkZ2V0cyAuYWRkLWZvbGRlcicpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIExhYmVscyBXaWRnZXQgKi9cclxuICAgICAgICBpZiAoJCgnLnNpZGViYXItd2lkZ2V0cyAuZm9sZGVycycpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkKCcubmV3LWxhYmVsJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCgnLnNpZGViYXItd2lkZ2V0cyAuYWRkLWxhYmVsJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJChcIi5hZGQtbGFiZWwgaW5wdXRcIikua2V5cHJlc3MoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09IDEzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNpZGViYXItd2lkZ2V0cyAuYWRkLWxhYmVsJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJzxsaT48YSBocmVmPVwiI1wiPjxpIGNsYXNzPVwiZmEgZmEtY2lyY2xlLW8gYy1ibHVlXCI+PC9pPicgKyAkKHRoaXMpLnZhbCgpICsgJzwvYT4gPC9saT4nKS5pbnNlcnRCZWZvcmUoXCIuYWRkLWxhYmVsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykudmFsKCcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICQoJy5tYWluLWNvbnRlbnQnKS5jbGljayhmdW5jdGlvbiAoZXYpIHsvL1xyXG4gICAgICAgICAgICAgICAgYWRkRm9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1sYWJlbCcpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2LnRhcmdldDtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IGFkZEZvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5zaWRlYmFyLXdpZGdldHMgLmFkZC1sYWJlbCcpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIFNwYXJrbGluZSAgV2lkZ2V0ICovXHJcbiAgICAgICAgaWYgKCQuZm4uc3BhcmtsaW5lICYmICQoJy5keW5hbWljYmFyMScpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YXIgbXl2YWx1ZXMxID0gWzEzLCAxNCwgMTYsIDE1LCAxMSwgMTQsIDIwLCAxNCwgMTIsIDE2LCAxMSwgMTcsIDE5LCAxNl07XHJcbiAgICAgICAgICAgIHZhciBteXZhbHVlczIgPSBbMTQsIDE3LCAxNiwgMTIsIDE4LCAxNiwgMjIsIDE1LCAxNCwgMTcsIDExLCAxOCwgMTEsIDEyXTtcclxuICAgICAgICAgICAgdmFyIG15dmFsdWVzMyA9IFsxOCwgMTQsIDE1LCAxNCwgMTUsIDEyLCAyMSwgMTYsIDE4LCAxNCwgMTIsIDE1LCAxNywgMTldO1xyXG4gICAgICAgICAgICB2YXIgc3BhcmtsaW5lMSA9ICQoJy5keW5hbWljYmFyMScpLnNwYXJrbGluZShteXZhbHVlczEsIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxyXG4gICAgICAgICAgICAgICAgYmFyQ29sb3I6ICcjMzE5REI1JyxcclxuICAgICAgICAgICAgICAgIGJhcldpZHRoOiA0LFxyXG4gICAgICAgICAgICAgICAgYmFyU3BhY2luZzogMSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogJzI4cHgnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgc3BhcmtsaW5lMiA9ICQoJy5keW5hbWljYmFyMicpLnNwYXJrbGluZShteXZhbHVlczIsIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxyXG4gICAgICAgICAgICAgICAgYmFyQ29sb3I6ICcjQzc1NzU3JyxcclxuICAgICAgICAgICAgICAgIGJhcldpZHRoOiA0LFxyXG4gICAgICAgICAgICAgICAgYmFyU3BhY2luZzogMSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogJzI4cHgnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgc3BhcmtsaW5lMyA9ICQoJy5keW5hbWljYmFyMycpLnNwYXJrbGluZShteXZhbHVlczMsIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxyXG4gICAgICAgICAgICAgICAgYmFyQ29sb3I6ICcjMThBNjg5JyxcclxuICAgICAgICAgICAgICAgIGJhcldpZHRoOiA0LFxyXG4gICAgICAgICAgICAgICAgYmFyU3BhY2luZzogMSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogJzI4cHgnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICA7XHJcbiAgICAgICAgLyogUHJvZ3Jlc3MgQmFyICBXaWRnZXQgKi9cclxuICAgICAgICBpZiAoJCgnLnNpZGViYXItd2lkZ2V0cyAucHJvZ3Jlc3MtY2hhcnQnKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgJCh3aW5kb3cpLmxvYWQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNpZGViYXItd2lkZ2V0cyAucHJvZ3Jlc3MtY2hhcnQgLnN0YXQxJykucHJvZ3Jlc3NiYXIoKTtcclxuICAgICAgICAgICAgICAgIH0sIDkwMCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2lkZWJhci13aWRnZXRzIC5wcm9ncmVzcy1jaGFydCAuc3RhdDInKS5wcm9ncmVzc2JhcigpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTIwMCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2lkZWJhci13aWRnZXRzIC5wcm9ncmVzcy1jaGFydCAuc3RhdDMnKS5wcm9ncmVzc2JhcigpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTUwMCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICA7XHJcbiAgICAgICAgJCgnLnNpZGViYXInKS5vbignY2xpY2snLCAnLmhpZGUtd2lkZ2V0JywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ3dpZGdldC1oaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgIHZhciB0aGlzX3dpZGdldCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpc193aWRnZXQuc2xpZGVUb2dnbGUoMjAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2lkZVNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgIGRlbHRhID0gZW5kIC0gc3RhcnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgIGRlbHRhID0gZW5kIC0gc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ3dpZGdldC1oaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGhpc193aWRnZXQgPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLm5leHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzX3dpZGdldC5zbGlkZVRvZ2dsZSgyMDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2lkZVNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gZW5kIC0gc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyogRU5EIFNJREVCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuICAgIC8qIFN3aXRjaCBUb3AgbmF2aWdhdGlvbiB0byBTaWRlYmFyICovXHJcbiAgICBmdW5jdGlvbiByZXBvc2l0aW9uX3RvcG5hdigpIHtcclxuICAgICAgICBpZiAoJCgnLm5hdi1ob3Jpem9udGFsJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0b3BiYXJXaWR0aCA9ICQoJy50b3BiYXInKS53aWR0aCgpO1xyXG4gICAgICAgICAgICBoZWFkZXJSaWdodFdpZHRoID0gJCgnLmhlYWRlci1yaWdodCcpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIGlmICgkKCcuaGVhZGVyLWxlZnQgLm5hdi1ob3Jpem9udGFsJykubGVuZ3RoKSBoZWFkZXJMZWZ0V2lkdGggPSAkKCcuaGVhZGVyLWxlZnQnKS53aWR0aCgpICsgNDA7XHJcbiAgICAgICAgICAgIGVsc2UgaGVhZGVyTGVmdFdpZHRoID0gJCgnLm5hdi1zaWRlYmFyLm5hdi1ob3Jpem9udGFsID4gbGknKS5sZW5ndGggKiAxNDA7XHJcbiAgICAgICAgICAgIHZhciB0b3BiYXJTcGFjZSA9IHRvcGJhcldpZHRoIC0gaGVhZGVyTGVmdFdpZHRoIC0gaGVhZGVyUmlnaHRXaWR0aDtcclxuICAgICAgICAgICAgLy8gdG9wIG5hdmlnYXRpb24gbW92ZSB0byBsZWZ0IG5hdiBpZiBub3QgZW5vdWdoIHNwYWNlIGluIHRvcGJhclxyXG4gICAgICAgICAgICBpZiAoJCgnLm5hdi1ob3Jpem9udGFsJykuY3NzKCdwb3NpdGlvbicpID09ICdpbml0aWFsJyB8fCB0b3BiYXJTcGFjZSA8IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICgkKCcuc2lkZWJhciAubmF2LXNpZGViYXInKS5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5uYXYtaG9yaXpvbnRhbCcpLmluc2VydEFmdGVyKCcubmF2LXNpZGViYXI6ZXEoMSknKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBhZGQgdG8gYm90dG9tIGlmIC5uYXYtaG9yaXpvbnRhbCBpcyBub3QgeWV0IGluIHRoZSBsZWZ0IHBhbmVsXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJy5zaWRlYmFyIC5uYXYtaG9yaXpvbnRhbCcpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5uYXYtaG9yaXpvbnRhbCcpLmFwcGVuZFRvKCcuc2lkZWJhci1pbm5lcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcuc2lkZWJhci13aWRnZXRzJykuY3NzKCdtYXJnaW4tYm90dG9tJywgMjApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICQoJy5uYXYtaG9yaXpvbnRhbCcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xyXG4gICAgICAgICAgICAgICAgfSkuYWRkQ2xhc3MoJ25hdi1zaWRlYmFyJykuY3NzKCdtYXJnaW4tYm90dG9tJywgMTAwKTtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZVNpZGVTY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICQoJy5uYXYtaG9yaXpvbnRhbCAuY2hpbGRyZW4nKS5yZW1vdmVDbGFzcygnZHJvcGRvd24tbWVudScpO1xyXG4gICAgICAgICAgICAgICAgJCgnLm5hdi1ob3Jpem9udGFsID4gbGknKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCdhJykucmVtb3ZlQXR0cignY2xhc3MnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2EnKS5yZW1vdmVBdHRyKCdkYXRhLXRvZ2dsZScpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvKiBXZSBoaWRlIG1lZ2EgbWVudSBpbiBzaWRlYmFyIHNpbmNlIHZpZGVvIC8gaW1hZ2VzIGFyZSB0b28gYmlnIGFuZCBub3QgYWRhcHRlZCB0byBzaWRlYmFyICovXHJcbiAgICAgICAgICAgICAgICBpZiAoJCgnLm5hdi1ob3Jpem9udGFsJykuaGFzQ2xhc3MoJ21tZW51JykpICQoJy5uYXYtaG9yaXpvbnRhbC5tbWVudScpLmNzcygnaGVpZ2h0JywgMCkuY3NzKCdvdmVyZmxvdycsICdoaWRkZW4nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICgkKCcuc2lkZWJhciAubmF2LWhvcml6b250YWwnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNpZGViYXItd2lkZ2V0cycpLmNzcygnbWFyZ2luLWJvdHRvbScsIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLm5hdi1ob3Jpem9udGFsJykucmVtb3ZlQ2xhc3MoJ25hdi1zaWRlYmFyJykuYXBwZW5kVG8oJy50b3BuYXYnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcubmF2LWhvcml6b250YWwgLmNoaWxkcmVuJykuYWRkQ2xhc3MoJ2Ryb3Bkb3duLW1lbnUnKS5yZW1vdmVBdHRyKCdzdHlsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5uYXYtaG9yaXpvbnRhbCBsaTpsYXN0LWNoaWxkJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5uYXYtaG9yaXpvbnRhbCA+IGxpID4gYScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykucGFyZW50KCkuZmluZCgnLmRyb3Bkb3duLW1lbnUnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2NsYXNzJywgJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvKiBJZiBtZWdhIG1lbnUsIHdlIG1ha2UgaXQgdmlzaWJsZSAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoJy5uYXYtaG9yaXpvbnRhbCcpLmhhc0NsYXNzKCdtbWVudScpKSAkKCcubmF2LWhvcml6b250YWwubW1lbnUnKS5jc3MoJ2hlaWdodCcsICcnKS5jc3MoJ292ZXJmbG93JywgJycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKioqKiogU2Nyb2xsIHRvIHRvcCBidXR0b24gKioqKiovXHJcbiAgICBmdW5jdGlvbiBzY3JvbGxUb3AoKSB7XHJcbiAgICAgICAgJCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMpLnNjcm9sbFRvcCgpID4gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcuc2Nyb2xsdXAnKS5mYWRlSW4oKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoJy5zY3JvbGx1cCcpLmZhZGVPdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5zY3JvbGx1cCcpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJChcImh0bWwsIGJvZHlcIikuYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IDBcclxuICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzaWRlYmFyQmVoYXZpb3VyKCkge1xyXG4gICAgICAgIHdpbmRvd1dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7XHJcbiAgICAgICAgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpIC0gJCgnLnRvcGJhcicpLmhlaWdodCgpO1xyXG4gICAgICAgIHNpZGViYXJNZW51SGVpZ2h0ID0gJCgnLm5hdi1zaWRlYmFyJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgaWYgKHdpbmRvd1dpZHRoIDwgMTAyNCkge1xyXG4gICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykgJiYgc2lkZWJhck1lbnVIZWlnaHQgPiB3aW5kb3dIZWlnaHQpIHtcclxuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdmaXhlZC1zaWRlYmFyJyk7XHJcbiAgICAgICAgICAgIGRlc3Ryb3lTaWRlU2Nyb2xsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIEZ1bmN0aW9uIGZvciBkYXRhYmxlcyBmaWx0ZXIgaW4gaGVhZCAqL1xyXG4gICAgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2dCkge1xyXG4gICAgICAgIGlmIChldnQuc3RvcFByb3BhZ2F0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV2dC5jYW5jZWxCdWJibGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZXRlY3RJRSgpIHtcclxuICAgICAgICB2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuICAgICAgICB2YXIgbXNpZSA9IHVhLmluZGV4T2YoJ01TSUUgJyk7XHJcbiAgICAgICAgdmFyIHRyaWRlbnQgPSB1YS5pbmRleE9mKCdUcmlkZW50LycpO1xyXG4gICAgICAgIHZhciBlZGdlID0gdWEuaW5kZXhPZignRWRnZS8nKTtcclxuICAgICAgICBpZiAobXNpZSA+IDAgfHwgdHJpZGVudCA+IDAgfHwgZWRnZSA+IDApIHtcclxuICAgICAgICAgICAgJCgnaHRtbCcpLmFkZENsYXNzKCdpZS1icm93c2VyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1vYmlsZVNpZGViYXIoKSB7XHJcbiAgICAgICAgJCgnaHRtbCcpLm9uKCdjbGljaycsICcuc2lkZWJhci1zaG93IC5uYXYtc2lkZWJhciBsaTpub3QoLm5hdi1wYXJlbnQpID4gYScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzaWRlYmFyLXNob3cnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKiAgSW5pdGlhdGlvbiBvZiBNYWluIEZ1bmN0aW9ucyAgKioqKi9cclxuICAgIGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICAgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICAgICAgLyogQVBQTElDQVRJT04gU0NSSVBUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcbiAgICAgICAgZG9jID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgZG9jRWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbiAgICAgICAgJGJvZHkgPSAkKCdib2R5Jyk7XHJcbiAgICAgICAgJHNpZGViYXIgPSAkKCcuc2lkZWJhcicpO1xyXG4gICAgICAgICRzaWRlYmFyRm9vdGVyID0gJCgnLnNpZGViYXIgLnNpZGViYXItZm9vdGVyJyk7XHJcbiAgICAgICAgJG1haW5Db250ZW50ID0gJCgnLm1haW4tY29udGVudCcpO1xyXG4gICAgICAgICRwYWdlQ29udGVudCA9ICQoJ1tuZy12aWV3XScpO1xyXG4gICAgICAgICR0b3BiYXIgPSAkKCcudG9wYmFyJyk7XHJcbiAgICAgICAgJGxvZ29wYW5lbCA9ICQoJy5sb2dvcGFuZWwnKTtcclxuICAgICAgICAkc2lkZWJhcldpZHRoID0gJChcIi5zaWRlYmFyXCIpLndpZHRoKCk7XHJcbiAgICAgICAgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuZy12aWV3XScpO1xyXG4gICAgICAgIGlzX1JUTCA9IGZhbHNlO1xyXG4gICAgICAgICRsb2FkZXIgPSAkKCcjcHJlbG9hZGVyJyk7XHJcbiAgICAgICAgZG9jSGVpZ2h0ID0gJChkb2N1bWVudCkuaGVpZ2h0KCk7XHJcbiAgICAgICAgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gICAgICAgIHRvcGJhcldpZHRoID0gJCgnLnRvcGJhcicpLndpZHRoKCk7XHJcbiAgICAgICAgaGVhZGVyTGVmdFdpZHRoID0gJCgnLmhlYWRlci1sZWZ0Jykud2lkdGgoKTtcclxuICAgICAgICBoZWFkZXJSaWdodFdpZHRoID0gJCgnLmhlYWRlci1yaWdodCcpLndpZHRoKCk7XHJcbiAgICAgICAgc3RhcnQgPSBkZWx0YSA9IGVuZCA9IDA7XHJcblxyXG4gICAgICAgICQoJ1tkYXRhLXRvZ2dsZV0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdmFyIHRvZ2dsZUxheW91dCA9ICQodGhpcykuZGF0YSgndG9nZ2xlJyk7XHJcbiAgICAgICAgICAgIGlmICh0b2dnbGVMYXlvdXQgPT0gJ3J0bCcpIHRvZ2dsZVJUTCgpO1xyXG4gICAgICAgICAgICBpZiAodG9nZ2xlTGF5b3V0ID09ICdzaWRlYmFyLWJlaGF2aW91cicpIHRvZ2dsZVNpZGViYXIoKTtcclxuICAgICAgICAgICAgaWYgKHRvZ2dsZUxheW91dCA9PSAnc3VibWVudScpIHRvZ2dsZVN1Ym1lbnVIb3ZlcigpO1xyXG4gICAgICAgICAgICBpZiAodG9nZ2xlTGF5b3V0ID09ICdzaWRlYmFyLWNvbGxhcHNlZCcpIGNvbGxhcHNlZFNpZGViYXIoKTtcclxuICAgICAgICAgICAgaWYgKHRvZ2dsZUxheW91dCA9PSAnc2lkZWJhci1ob3ZlcicpIHRvZ2dsZVNpZGViYXJIb3ZlcigpO1xyXG4gICAgICAgICAgICBpZiAodG9nZ2xlTGF5b3V0ID09ICdib3hlZCcpIHRvZ2dsZWJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgICAgIGlmICh0b2dnbGVMYXlvdXQgPT0gJ3RvcGJhcicpIHRvZ2dsZVRvcGJhcigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygncnRsJykpIHtcclxuICAgICAgICAgICAgaXNfUlRMID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICQoJy50b2dnbGVfZnVsbHNjcmVlbicpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdG9nZ2xlRnVsbFNjcmVlbigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBBZGQgY2xhc3MgZXZlcnl0aW1lIGEgbW91c2UgcG9pbnRlciBob3ZlciBvdmVyIGl0XHJcbiAgICAgICAgdmFyIGhvdmVyVGltZW91dDtcclxuICAgICAgICAkKCcubmF2LXNpZGViYXIgPiBsaScpLmhvdmVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVyVGltZW91dCk7XHJcbiAgICAgICAgICAgICQodGhpcykuc2libGluZ3MoKS5yZW1vdmVDbGFzcygnbmF2LWhvdmVyJyk7XHJcbiAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ25hdi1ob3ZlcicpO1xyXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyICRzZWxmID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgaG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkc2VsZi5yZW1vdmVDbGFzcygnbmF2LWhvdmVyJyk7XHJcbiAgICAgICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoJy5uYXYtc2lkZWJhciA+IGxpIC5jaGlsZHJlbicpLmhvdmVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVyVGltZW91dCk7XHJcbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLm5hdi1wYXJlbnQnKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCduYXYtaG92ZXInKTtcclxuICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcubmF2LXBhcmVudCcpLmFkZENsYXNzKCduYXYtaG92ZXInKTtcclxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciAkc2VsZiA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgIGhvdmVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcubmF2LXBhcmVudCcpLnJlbW92ZUNsYXNzKCduYXYtaG92ZXInKTtcclxuICAgICAgICAgICAgfSwgMjAwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgc2lkZWJhciBpcyBjb2xsYXBzZWRcclxuICAgICAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLWNvbGxhcHNlZCcpKVxyXG4gICAgICAgICAgICAkKCcubmF2LXNpZGViYXIgLmNoaWxkcmVuJykuY3NzKHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICcnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEhhbmRsZXMgZm9ybSBpbnNpZGUgb2YgZHJvcGRvd24gXHJcbiAgICAgICAgJCgnLmRyb3Bkb3duLW1lbnUnKS5maW5kKCdmb3JtJykuY2xpY2soZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3JlYXRlU2lkZVNjcm9sbCgpO1xyXG4gICAgICAgIHRvZ2dsZVNpZGViYXJNZW51KCk7XHJcbiAgICAgICAgY3VzdG9tU2Nyb2xsKCk7XHJcbiAgICAgICAgLy8gICBoYW5kbGVTaWRlYmFyU29ydGFibGUoKTtcclxuICAgICAgICBzaWRlYmFyV2lkZ2V0cygpO1xyXG4gICAgICAgIHJlcG9zaXRpb25fdG9wbmF2KCk7XHJcbiAgICAgICAgaGFuZGxlU2lkZWJhclJlbW92ZSgpO1xyXG4gICAgICAgIGhhbmRsZVNpZGViYXJIaWRlKCk7XHJcbiAgICAgICAgY2hhbmdlVXNlclN0YXR1dCgpO1xyXG4gICAgICAgIC8vICBoYW5kbGVQYW5lbEFjdGlvbigpO1xyXG4gICAgICAgIHNjcm9sbFRvcCgpO1xyXG4gICAgICAgIHNpZGViYXJCZWhhdmlvdXIoKTtcclxuICAgICAgICBkZXRlY3RJRSgpO1xyXG4gICAgICAgIG1vYmlsZVNpZGViYXIoKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZWJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuXHJcbiAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci1ob3ZlcicpKSBzaWRlYmFySG92ZXIoKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqKiogIFJlc2l6ZSBFdmVudCBGdW5jdGlvbnMgICoqKiovXHJcblxyXG4gICAgJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGN1c3RvbVNjcm9sbCgpO1xyXG4gICAgICAgICAgICByZXBvc2l0aW9uX3RvcG5hdigpO1xyXG4gICAgICAgICAgICBpZiAoISQoJ2JvZHknKS5oYXNDbGFzcygnZml4ZWQtc2lkZWJhcicpICYmICEkKCdib2R5JykuaGFzQ2xhc3MoJ2J1aWxkZXItYWRtaW4nKSkgc2lkZWJhckJlaGF2aW91cigpO1xyXG4gICAgICAgICAgICBoYW5kbGVib3hlZExheW91dCgpO1xyXG4gICAgICAgICAgICBtYXhpbWl6ZVBhbmVsKCk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHZhciBhcHBsaWNhdGlvblNlcnZpY2UgPSB7fTtcclxuXHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UuaW5pdCA9IGluaXQ7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UudG9nZ2xlUlRMID0gdG9nZ2xlUlRMO1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLmhhbmRsZVNpZGViYXJGbHVpZCA9IGhhbmRsZVNpZGViYXJGbHVpZDtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS5oYW5kbGVTaWRlYmFyU29ydGFibGUgPSBoYW5kbGVTaWRlYmFyU29ydGFibGU7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UuaGFuZGxlU2lkZWJhckhpZGUgPSBoYW5kbGVTaWRlYmFySGlkZTtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS5oYW5kbGVTaWRlYmFyUmVtb3ZlID0gaGFuZGxlU2lkZWJhclJlbW92ZTtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS5jdXN0b21TY3JvbGwgPSBjdXN0b21TY3JvbGw7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UuaGFuZGxlU2lkZWJhckZpeGVkID0gaGFuZGxlU2lkZWJhckZpeGVkO1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLmhhbmRsZVRvcGJhckZpeGVkID0gaGFuZGxlVG9wYmFyRml4ZWQ7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UuaGFuZGxlVG9wYmFyRmx1aWQgPSBoYW5kbGVUb3BiYXJGbHVpZDtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS5jcmVhdGVTaWRlYmFySG92ZXIgPSBjcmVhdGVTaWRlYmFySG92ZXI7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UucmVtb3ZlU2lkZWJhckhvdmVyID0gcmVtb3ZlU2lkZWJhckhvdmVyO1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLmNyZWF0ZVN1Ym1lbnVIb3ZlciA9IGNyZWF0ZVN1Ym1lbnVIb3ZlcjtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS5yZW1vdmVTdWJtZW51SG92ZXIgPSByZW1vdmVTdWJtZW51SG92ZXI7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UuY3JlYXRlQm94ZWRMYXlvdXQgPSBjcmVhdGVCb3hlZExheW91dDtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS5yZW1vdmVCb3hlZExheW91dCA9IHJlbW92ZUJveGVkTGF5b3V0O1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLnJlc2V0U3R5bGUgPSByZXNldFN0eWxlO1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLmRpc2FibGVSVEwgPSBkaXNhYmxlUlRMO1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLmVuYWJsZVJUTCA9IGVuYWJsZVJUTDtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS50b2dnbGVTaWRlYmFyID0gdG9nZ2xlU2lkZWJhcjtcclxuICAgIGFwcGxpY2F0aW9uU2VydmljZS50b2dnbGVTdWJtZW51SG92ZXIgPSB0b2dnbGVTdWJtZW51SG92ZXI7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UuY29sbGFwc2VkU2lkZWJhciA9IGNvbGxhcHNlZFNpZGViYXI7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UudG9nZ2xlU2lkZWJhckhvdmVyID0gdG9nZ2xlU2lkZWJhckhvdmVyO1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLnRvZ2dsZWJveGVkTGF5b3V0ID0gdG9nZ2xlYm94ZWRMYXlvdXQ7XHJcbiAgICBhcHBsaWNhdGlvblNlcnZpY2UudG9nZ2xlVG9wYmFyID0gdG9nZ2xlVG9wYmFyO1xyXG4gICAgYXBwbGljYXRpb25TZXJ2aWNlLmhhbmRsZVBhbmVsQWN0aW9uID0gaGFuZGxlUGFuZWxBY3Rpb247XHJcblxyXG4gICAgcmV0dXJuIGFwcGxpY2F0aW9uU2VydmljZTtcclxuXHJcbn1dKTsiLCJcclxuYW5ndWxhci5tb2R1bGUoJ25ld0FwcCcpXHJcbiAgLmZhY3RvcnkoJ2J1aWxkZXJTZXJ2aWNlJywgWydhcHBsaWNhdGlvblNlcnZpY2UnLCBmdW5jdGlvbiAoYXBwbGljYXRpb25TZXJ2aWNlKSB7XHJcblxyXG5cclxuICAgICAgdmFyIGJ1aWxkZXJTZXJ2aWNlID0ge307XHJcblxyXG4gICAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICogQnVpbGRlciBTY3JpcHRcclxuICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcbiAgICAgICAkLmNvb2tpZS5kZWZhdWx0cy5wYXRoID0gJy8nO1xyXG5cclxuICAgICAgLyoqKiogQlVJTERFUiBGVU5DVElPTlMgKioqKi9cclxuICAgICAgZnVuY3Rpb24gdG9nZ2xlQnVpbGRlcigpIHtcclxuICAgICAgICAgICQoJy5idWlsZGVyLXRvZ2dsZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICBpZiAoJCgnI2J1aWxkZXInKS5oYXNDbGFzcygnb3BlbicpKSAkKCcjYnVpbGRlcicpLnJlbW92ZUNsYXNzKCdvcGVuJyk7XHJcbiAgICAgICAgICAgICAgZWxzZSAkKCcjYnVpbGRlcicpLmFkZENsYXNzKCdvcGVuJyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogQWN0aXZlIEN1c3RvbSBTY3JvbGwgZm9yIEJ1aWxkZXIgU2lkZWJhciAqL1xyXG4gICAgICBmdW5jdGlvbiBidWlsZGVyU2Nyb2xsKCkge1xyXG4gICAgICAgICAgJCgnLmJ1aWxkZXIgLmlubmVyJykubUN1c3RvbVNjcm9sbGJhcihcImRlc3Ryb3lcIik7XHJcbiAgICAgICAgICBzY3JvbGxfaGVpZ2h0ID0gXCIxMDAlXCI7XHJcbiAgICAgICAgICAkKCcuYnVpbGRlciAuaW5uZXInKS5tQ3VzdG9tU2Nyb2xsYmFyKHtcclxuICAgICAgICAgICAgICBzY3JvbGxCdXR0b25zOiB7XHJcbiAgICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2VcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGF1dG9IaWRlU2Nyb2xsYmFyOiB0cnVlLFxyXG4gICAgICAgICAgICAgIHNjcm9sbEluZXJ0aWE6IDE1MCxcclxuICAgICAgICAgICAgICB0aGVtZTogXCJsaWdodFwiLFxyXG4gICAgICAgICAgICAgIHNldF9oZWlnaHQ6IHNjcm9sbF9oZWlnaHQsXHJcbiAgICAgICAgICAgICAgYWR2YW5jZWQ6IHtcclxuICAgICAgICAgICAgICAgICAgdXBkYXRlT25Db250ZW50UmVzaXplOiB0cnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIERlc3Ryb3kgc2lkZWJhciBjdXN0b20gc2Nyb2xsICovXHJcbiAgICAgIGZ1bmN0aW9uIGRlc3Ryb3lTaWRlU2Nyb2xsKCkge1xyXG4gICAgICAgICAgJCgnLnNpZGViYXItaW5uZXInKS5tQ3VzdG9tU2Nyb2xsYmFyKFwiZGVzdHJveVwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogRW5hYmxlIC8gRGlzYWJsZSBMYXlvdXRzICovXHJcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUxheW91dCgpIHtcclxuICAgICAgICAgICQoJy5sYXlvdXQtb3B0aW9uIGlucHV0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHZhciBsYXlvdXQgPSAkKHRoaXMpLmF0dHIoJ2RhdGEtbGF5b3V0Jyk7XHJcbiAgICAgICAgICAgICAgdmFyIGlzX2NoZWNrZWQgPSAkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKTtcclxuICAgICAgICAgICAgICBpZiAobGF5b3V0ID09ICdzaWRlYmFyJyAmJiBpc19jaGVja2VkID09IHRydWUpIGFwcGxpY2F0aW9uU2VydmljZS5oYW5kbGVTaWRlYmFyRml4ZWQoKTtcclxuICAgICAgICAgICAgICBpZiAobGF5b3V0ID09ICdzaWRlYmFyJyAmJiBpc19jaGVja2VkID09IGZhbHNlKSBhcHBsaWNhdGlvblNlcnZpY2UuaGFuZGxlU2lkZWJhckZsdWlkKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGxheW91dCA9PSAndG9wYmFyJyAmJiBpc19jaGVja2VkID09IHRydWUpIGFwcGxpY2F0aW9uU2VydmljZS5oYW5kbGVUb3BiYXJGaXhlZCgpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gJ3RvcGJhcicgJiYgaXNfY2hlY2tlZCA9PSBmYWxzZSkgYXBwbGljYXRpb25TZXJ2aWNlLmhhbmRsZVRvcGJhckZsdWlkKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGxheW91dCA9PSAnc2lkZWJhci1ob3ZlcicgJiYgaXNfY2hlY2tlZCA9PSB0cnVlKSBhcHBsaWNhdGlvblNlcnZpY2UuY3JlYXRlU2lkZWJhckhvdmVyKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGxheW91dCA9PSAnc2lkZWJhci1ob3ZlcicgJiYgaXNfY2hlY2tlZCA9PSBmYWxzZSkgYXBwbGljYXRpb25TZXJ2aWNlLnJlbW92ZVNpZGViYXJIb3ZlcigpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gJ3N1Ym1lbnUtaG92ZXInICYmIGlzX2NoZWNrZWQgPT0gdHJ1ZSkgYXBwbGljYXRpb25TZXJ2aWNlLmNyZWF0ZVN1Ym1lbnVIb3ZlcigpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gJ3N1Ym1lbnUtaG92ZXInICYmIGlzX2NoZWNrZWQgPT0gZmFsc2UpIGFwcGxpY2F0aW9uU2VydmljZS5yZW1vdmVTdWJtZW51SG92ZXIoKTtcclxuICAgICAgICAgICAgICBpZiAobGF5b3V0ID09ICdib3hlZCcgJiYgaXNfY2hlY2tlZCA9PSB0cnVlKSBhcHBsaWNhdGlvblNlcnZpY2UuY3JlYXRlQm94ZWRMYXlvdXQoKTtcclxuICAgICAgICAgICAgICBpZiAobGF5b3V0ID09ICdib3hlZCcgJiYgaXNfY2hlY2tlZCA9PSBmYWxzZSkgYXBwbGljYXRpb25TZXJ2aWNlLnJlbW92ZUJveGVkTGF5b3V0KCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogTWFpbiBDb2xvciAqL1xyXG4gICAgICBmdW5jdGlvbiBtYWluQ29sb3IoKSB7XHJcbiAgICAgICAgICAkKCcudGhlbWUtY29sb3InKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICB2YXIgbWFpbl9jb2xvciA9ICQodGhpcykuZGF0YSgnY29sb3InKTtcclxuICAgICAgICAgICAgICB2YXIgbWFpbl9uYW1lID0gJCh0aGlzKS5hdHRyKCdkYXRhLW1haW4nKTtcclxuICAgICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoZnVuY3Rpb24gKGluZGV4LCBjc3MpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChjc3MubWF0Y2goLyhefFxccyljb2xvci1cXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdjb2xvci0nICsgbWFpbl9uYW1lKTtcclxuICAgICAgICAgICAgICAkKCcudGhlbWUtY29sb3InKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnbWFpbicpID09ICdkZWZhdWx0Jykge1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtbGVmdCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjMjAyMjI2Jyk7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1zaWRlYmFyLWRhcmssIC50aGVtZS1yaWdodC1kYXJrJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyMzOTNFNDQnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItbGlnaHQsIC50aGVtZS1yaWdodC1saWdodCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjZmZmJyk7XHJcbiAgICAgICAgICAgICAgICAgICQoJy5zbHRsIC50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmYnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnbWFpbicpID09ICdwcmltYXJ5Jykge1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtbGVmdCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjMzE5REI1Jyk7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1zaWRlYmFyLWRhcmssIC50aGVtZS1yaWdodC1kYXJrJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyMxNjQ5NTQnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItbGlnaHQsIC50aGVtZS1yaWdodC1saWdodCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjRERFNkU5Jyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ21haW4nKSA9PSAncmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtbGVmdCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjQzk2MjVGJyk7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1zaWRlYmFyLWRhcmssIC50aGVtZS1yaWdodC1kYXJrJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyM0RTMyMzInKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItbGlnaHQsIC50aGVtZS1yaWdodC1saWdodCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjRjhGM0YxJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ21haW4nKSA9PSAnZ3JlZW4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyMxOEE2ODknKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItZGFyaywgLnRoZW1lLXJpZ2h0LWRhcmsnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzI0MzkyRScpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1saWdodCwgLnRoZW1lLXJpZ2h0LWxpZ2h0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGMUY4RjMnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnbWFpbicpID09ICdvcmFuZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNDNTg2MjcnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItZGFyaywgLnRoZW1lLXJpZ2h0LWRhcmsnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzUwMzYxRicpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1saWdodCwgLnRoZW1lLXJpZ2h0LWxpZ2h0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGOEY0RjEnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnbWFpbicpID09ICdwdXJwbGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyM2RTYyQjUnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItZGFyaywgLnRoZW1lLXJpZ2h0LWRhcmsnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzM5M0Y1MScpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1saWdodCwgLnRoZW1lLXJpZ2h0LWxpZ2h0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGM0YyRjcnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnbWFpbicpID09ICdibHVlJykge1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtbGVmdCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjNEE4OURDJyk7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1zaWRlYmFyLWRhcmssIC50aGVtZS1yaWdodC1kYXJrJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyMxRTM5NDgnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItbGlnaHQsIC50aGVtZS1yaWdodC1saWdodCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjRjJGNEY3Jyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICQuY29va2llKCdtYWluLWNvbG9yJywgbWFpbl9jb2xvciwgeyBwYXRoOiAnLycgfSk7XHJcbiAgICAgICAgICAgICAgJC5jb29raWUoJ21haW4tbmFtZScsIG1haW5fbmFtZSwgeyBwYXRoOiAnLycgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogU3dpdGNoIFRoZW1lICovXHJcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVRoZW1lKCkge1xyXG4gICAgICAgICAgJCgnLnRoZW1lJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgJCgnLnRoZW1lJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgIHZhciB0aGVtZV9uYW1lID0gJCh0aGlzKS5hdHRyKCdkYXRhLXRoZW1lJyk7XHJcbiAgICAgICAgICAgICAgc3dpdGNoVGhlbWUodGhlbWVfbmFtZSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBmdW5jdGlvbiBzd2l0Y2hUaGVtZShuYW1lKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1kZWZhdXQnKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICAgICQuY29va2llKCd0aGVtZScsIG5hbWUsIHsgcGF0aDogJy8nIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItJyArIG5hbWUpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKGZ1bmN0aW9uIChpbmRleCwgY3NzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNzcy5tYXRjaCgvKF58XFxzKXRoZW1lLVxcUysvZykgfHwgW10pLmpvaW4oJyAnKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygndGhlbWUtJyArIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAkLmNvb2tpZSgndGhlbWUnLCBuYW1lLCB7IHBhdGg6ICcvJyB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIEJhY2tncm91bmQgQ29sb3IgKi9cclxuICAgICAgZnVuY3Rpb24gYmFja2dyb3VuZENvbG9yKCkge1xyXG4gICAgICAgICAgJCgnLmJnLWNvbG9yJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgdmFyIGJnX2NvbG9yID0gJCh0aGlzKS5kYXRhKCdjb2xvcicpO1xyXG4gICAgICAgICAgICAgIHZhciBiZ19uYW1lID0gJCh0aGlzKS5hdHRyKCdkYXRhLWJnJyk7XHJcbiAgICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKGZ1bmN0aW9uIChpbmRleCwgY3NzKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoY3NzLm1hdGNoKC8oXnxcXHMpYmctXFxTKy9nKSB8fCBbXSkuam9pbignICcpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnYmctJyArIGJnX25hbWUpO1xyXG4gICAgICAgICAgICAgICQoJy5iZy1jb2xvcicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAkLmNvb2tpZSgnYmctY29sb3InLCBiZ19jb2xvciwgeyBwYXRoOiAnLycgfSk7XHJcbiAgICAgICAgICAgICAgJC5jb29raWUoJ2JnLW5hbWUnLCBiZ19uYW1lLCB7IHBhdGg6ICcvJyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiBNYW5hZ2UgQ29va2llICovXHJcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUNvb2tpZSgpIHtcclxuICAgICAgICAgIGlmICgkLmNvb2tpZSgncnRsJykpIGFwcGxpY2F0aW9uU2VydmljZS5lbmFibGVSVEwoKTtcclxuICAgICAgICAgIGlmICgkLmNvb2tpZSgnZmx1aWQtdG9wYmFyJykpIGFwcGxpY2F0aW9uU2VydmljZS5oYW5kbGVUb3BiYXJGbHVpZCgpO1xyXG4gICAgICAgICAgaWYgKCQuY29va2llKCdmaXhlZC1zaWRlYmFyJykpIGFwcGxpY2F0aW9uU2VydmljZS5oYW5kbGVTaWRlYmFyRml4ZWQoKTtcclxuICAgICAgICAgIGlmICgkLmNvb2tpZSgnZmx1aWQtc2lkZWJhcicpKSBhcHBsaWNhdGlvblNlcnZpY2UuaGFuZGxlU2lkZWJhckZsdWlkKCk7XHJcbiAgICAgICAgICBpZiAoJC5jb29raWUoJ3NpZGViYXItaG92ZXInKSkgYXBwbGljYXRpb25TZXJ2aWNlLmNyZWF0ZVNpZGViYXJIb3ZlcigpO1xyXG4gICAgICAgICAgaWYgKCQuY29va2llKCdzdWJtZW51LWhvdmVyJykpIGFwcGxpY2F0aW9uU2VydmljZS5jcmVhdGVTdWJtZW51SG92ZXIoKTtcclxuICAgICAgICAgIGlmICgkLmNvb2tpZSgnYm94ZWQtbGF5b3V0JykpIGFwcGxpY2F0aW9uU2VydmljZS5jcmVhdGVCb3hlZExheW91dCgpO1xyXG4gICAgICAgICAgaWYgKCQuY29va2llKCdzaWRlYmFyLWNvbGxhcHNlZCcpICYmICQuY29va2llKCdmaXJzdC1sb2FkJykpIGFwcGxpY2F0aW9uU2VydmljZS5jcmVhdGVDb2xsYXBzZWRTaWRlYmFyKCk7XHJcbiAgICAgICAgICBpZiAoJC5jb29raWUoJ21haW4tbmFtZScpKSB7XHJcbiAgICAgICAgICAgICAgdmFyIG1haW5fbmFtZSA9ICQuY29va2llKCdtYWluLW5hbWUnKTtcclxuICAgICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoZnVuY3Rpb24gKGluZGV4LCBjc3MpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChjc3MubWF0Y2goLyhefFxccyljb2xvci1cXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdjb2xvci0nICsgbWFpbl9uYW1lKTtcclxuICAgICAgICAgICAgICAkKCcudGhlbWUtY29sb3InKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnbWFpbicpID09IG1haW5fbmFtZSkgJCh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgaWYgKG1haW5fbmFtZSA9PSAnZGVmYXVsdCcpIHtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLWxlZnQnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzIwMjIyNicpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1kYXJrLCAudGhlbWUtcmlnaHQtZGFyaycpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjMzkzRTQ0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1zaWRlYmFyLWxpZ2h0LCAudGhlbWUtcmlnaHQtbGlnaHQnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI2ZmZicpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcuc2x0bCAudGhlbWUtbGVmdCcpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjZmZmJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChtYWluX25hbWUgPT0gJ3ByaW1hcnknKSB7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyMzMTlEQjUnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItZGFyaywgLnRoZW1lLXJpZ2h0LWRhcmsnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzE2NDk1NCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobWFpbl9uYW1lID09ICdyZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNDOTYyNUYnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItZGFyaywgLnRoZW1lLXJpZ2h0LWRhcmsnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzRFMzIzMicpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobWFpbl9uYW1lID09ICdncmVlbicpIHtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLWxlZnQnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzE4QTY4OScpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1kYXJrLCAudGhlbWUtcmlnaHQtZGFyaycpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjMjQzOTJFJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChtYWluX25hbWUgPT0gJ29yYW5nZScpIHtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLWxlZnQnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI0M1ODYyNycpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1kYXJrLCAudGhlbWUtcmlnaHQtZGFyaycpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjNTAzNjFGJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChtYWluX25hbWUgPT0gJ3B1cnBsZScpIHtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLWxlZnQnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzZFNjJCNScpO1xyXG4gICAgICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1kYXJrLCAudGhlbWUtcmlnaHQtZGFyaycpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjMzkzRjUxJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChtYWluX25hbWUgPT0gJ2JsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICQoJy50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyM0QTg5REMnKTtcclxuICAgICAgICAgICAgICAgICAgJCgnLnRoZW1lLXNpZGViYXItZGFyaywgLnRoZW1lLXJpZ2h0LWRhcmsnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnIzFFMzk0OCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoISQuY29va2llKCdtYWluLWNvbG9yJykpIHtcclxuICAgICAgICAgICAgICAkKCcudGhlbWUtY29sb3InKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnY29sb3InKSA9PSAnIzJCMkUzMycpICQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnY29sb3ItZGVmYXVsdCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gQmFja2dyb3VuZCBDb2xvclxyXG4gICAgICAgICAgaWYgKCQuY29va2llKCdiZy1jb2xvcicpKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGJnX2NvbG9yID0gJC5jb29raWUoJ2JnLWNvbG9yJyk7XHJcbiAgICAgICAgICAgICAgJCgnLmJnLWNvbG9yJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NvbG9yJykgPT0gYmdfY29sb3IpICQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCQuY29va2llKCdiZy1uYW1lJykpIHtcclxuICAgICAgICAgICAgICB2YXIgYmdfY29sb3IgPSAkLmNvb2tpZSgnYmctbmFtZScpO1xyXG4gICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnYmctJyArIGJnX2NvbG9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghJC5jb29raWUoJ2JnLWNvbG9yJykpIHtcclxuICAgICAgICAgICAgICAkKCcuYmctY29sb3InKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnY29sb3InKSA9PSAnI0U5RTlFOScpICQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gU2lkZWJhciBDb2xvclxyXG4gICAgICAgICAgaWYgKCQuY29va2llKCd0aGVtZScpKSB7XHJcbiAgICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKGZ1bmN0aW9uIChpbmRleCwgY3NzKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoY3NzLm1hdGNoKC8oXnxcXHMpdGhlbWUtXFxTKy9nKSB8fCBbXSkuam9pbignICcpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHZhciB0aGVtZSA9ICQuY29va2llKCd0aGVtZScpO1xyXG4gICAgICAgICAgICAgICQoJy5idWlsZGVyIC4nICsgdGhlbWUpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3RoZW1lLScgKyB0aGVtZSk7XHJcblxyXG4gICAgICAgICAgICAgICQoJy50aGVtZScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5kYXRhKCd0aGVtZScpID09IHRoZW1lKSAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghJC5jb29raWUoJ3RoZW1lJykpIHtcclxuICAgICAgICAgICAgICAkKCcudGhlbWUuc2R0bCcpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghJC5jb29raWUoJ21haW4tY29sb3InKSkge1xyXG4gICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygndGhlbWUtc2R0bCcpO1xyXG4gICAgICAgICAgICAgICQoJy50aGVtZS1sZWZ0JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyMyMDIyMjYnKTtcclxuICAgICAgICAgICAgICAkKCcudGhlbWUtc2lkZWJhci1kYXJrLCAudGhlbWUtcmlnaHQtZGFyaycpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjMzkzRTQ0Jyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGJ1aWxkZXJTZXJ2aWNlLmluaXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICAgICAgICAvLyAkLnJlbW92ZUNvb2tpZSgnbWFpbi1jb2xvcicpO1xyXG4gICAgICAgICAgLy8gJC5yZW1vdmVDb29raWUoJ3RvcGJhci1jb2xvcicpO1xyXG4gICAgICAgICAgLy8gJC5yZW1vdmVDb29raWUoJ3RvcGJhci1jb2xvci1jdXN0b20nKTtcclxuICAgICAgICAgIC8vICQucmVtb3ZlQ29va2llKCdzaWRlYmFyLWNvbG9yJyk7XHJcbiAgICAgICAgICAvLyAkLnJlbW92ZUNvb2tpZSgnc2lkZWJhci1jb2xvci1jdXN0b20nKTtcclxuICAgICAgICAgIC8vICQucmVtb3ZlQ29va2llKCdzaWRlYmFyLWhvdmVyJyk7XHJcbiAgICAgICAgICAvLyAkLnJlbW92ZUNvb2tpZSgnc3VibWVudS1ob3ZlcicpO1xyXG5cclxuICAgICAgICAgIHRvZ2dsZUJ1aWxkZXIoKTtcclxuICAgICAgICAgIGJ1aWxkZXJTY3JvbGwoKTtcclxuICAgICAgICAgIGhhbmRsZUxheW91dCgpO1xyXG4gICAgICAgICAgaGFuZGxlVGhlbWUoKTtcclxuICAgICAgICAgIGhhbmRsZUNvb2tpZSgpO1xyXG4gICAgICAgICAgbWFpbkNvbG9yKCk7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IoKTtcclxuICAgICAgICAgIGFwcGxpY2F0aW9uU2VydmljZS5yZXNldFN0eWxlKCk7XHJcblxyXG4gICAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci10b3AnKSkge1xyXG4gICAgICAgICAgICAgIGRlc3Ryb3lTaWRlU2Nyb2xsKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIGJ1aWxkZXJTZXJ2aWNlO1xyXG5cclxuICB9XSk7IiwiYW5ndWxhci5tb2R1bGUoJ25ld0FwcCcpLmZhY3RvcnkoJ3BsdWdpbnNTZXJ2aWNlJywgW2Z1bmN0aW9uICgpIHtcclxuXHJcblxyXG5cclxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgLyogUExVR0lOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgICAvKioqKiBDb2xvciBQaWNrZXIgKioqKi9cclxuICAgIGZ1bmN0aW9uIGNvbG9yUGlja2VyKCkge1xyXG4gICAgICAgIGlmICgkKCcuY29sb3ItcGlja2VyJykubGVuZ3RoICYmICQuZm4uc3BlY3RydW0pIHtcclxuICAgICAgICAgICAgJCgnLmNvbG9yLXBpY2tlcicpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfcGFsZXR0ZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgncGFsZXR0ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9wYWxldHRlID0gJCh0aGlzKS5kYXRhKCdwYWxldHRlJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnNwZWN0cnVtKHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJCh0aGlzKS5kYXRhKCdtaW4nKSA/ICQodGhpcykuZGF0YSgnbWluJykgOiBcIiNEMTVBREVcIixcclxuICAgICAgICAgICAgICAgICAgICBzaG93SW5wdXQ6ICQodGhpcykuZGF0YSgnc2hvdy1pbnB1dCcpID8gJCh0aGlzKS5kYXRhKCdzaG93LWlucHV0JykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzaG93UGFsZXR0ZTogJCh0aGlzKS5kYXRhKCdzaG93LXBhbGV0dGUnKSA/ICQodGhpcykuZGF0YSgnc2hvdy1wYWxldHRlJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzaG93UGFsZXR0ZU9ubHk6ICQodGhpcykuZGF0YSgnc2hvdy1wYWxldHRlLW9ubHknKSA/ICQodGhpcykuZGF0YSgnc2hvdy1wYWxldHRlLW9ubHknKSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dBbHBoYTogJCh0aGlzKS5kYXRhKCdzaG93LWFscGhhJykgPyAkKHRoaXMpLmRhdGEoJ3Nob3ctYWxwaGEnKSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhbGV0dGU6ICQodGhpcykuZGF0YSgncGFsZXR0ZScpID8gJCh0aGlzKS5kYXRhKCdwYWxldHRlJykgOiBbW2N1cnJlbnRfcGFsZXR0ZV1dXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICQodGhpcykuc2hvdygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKiogTnVtZXJpYyBTdGVwcGVyICoqKiovXHJcbiAgICBmdW5jdGlvbiBudW1lcmljU3RlcHBlcigpIHtcclxuICAgICAgICBpZiAoJCgnLm51bWVyaWMtc3RlcHBlcicpLmxlbmd0aCAmJiAkLmZuLlRvdWNoU3Bpbikge1xyXG4gICAgICAgICAgICAkKCcubnVtZXJpYy1zdGVwcGVyJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLlRvdWNoU3Bpbih7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluOiAkKHRoaXMpLmRhdGEoJ21pbicpID8gJCh0aGlzKS5kYXRhKCdtaW4nKSA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4OiAkKHRoaXMpLmRhdGEoJ21heCcpID8gJCh0aGlzKS5kYXRhKCdtYXgnKSA6IDEwMCxcclxuICAgICAgICAgICAgICAgICAgICBzdGVwOiAkKHRoaXMpLmRhdGEoJ3N0ZXAnKSA/ICQodGhpcykuZGF0YSgnc3RlcCcpIDogMC4xLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWxzOiAkKHRoaXMpLmRhdGEoJ2RlY2ltYWxzJykgPyAkKHRoaXMpLmRhdGEoJ2RlY2ltYWxzJykgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvb3N0YXQ6ICQodGhpcykuZGF0YSgnYm9vc3RhdCcpID8gJCh0aGlzKS5kYXRhKCdib29zdGF0JykgOiA1LFxyXG4gICAgICAgICAgICAgICAgICAgIG1heGJvb3N0ZWRzdGVwOiAkKHRoaXMpLmRhdGEoJ21heGJvb3N0ZWRzdGVwJykgPyAkKHRoaXMpLmRhdGEoJ21heGJvb3N0ZWRzdGVwJykgOiAxMCxcclxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbGJ1dHRvbnM6ICQodGhpcykuZGF0YSgndmVydGljYWwnKSA/ICQodGhpcykuZGF0YSgndmVydGljYWwnKSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICQodGhpcykuZGF0YSgnYnRuLWJlZm9yZScpID8gJ2J0biBidG4tJyArICQodGhpcykuZGF0YSgnYnRuLWJlZm9yZScpIDogJ2J0biBidG4tZGVmYXVsdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9udXBfY2xhc3M6ICQodGhpcykuZGF0YSgnYnRuLWFmdGVyJykgPyAnYnRuIGJ0bi0nICsgJCh0aGlzKS5kYXRhKCdidG4tYWZ0ZXInKSA6ICdidG4gYnRuLWRlZmF1bHQnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKiBTb3J0YWJsZSBQb3J0bGV0cyAqKioqL1xyXG4gICAgZnVuY3Rpb24gc29ydGFibGVQb3J0bGV0cygpIHtcclxuICAgICAgICBpZiAoJCgnLnBvcnRsZXRzJykubGVuZ3RoICYmICQuZm4uc29ydGFibGUpIHtcclxuICAgICAgICAgICAgJChcIi5wb3J0bGV0c1wiKS5zb3J0YWJsZSh7XHJcbiAgICAgICAgICAgICAgICBjb25uZWN0V2l0aDogXCIucG9ydGxldHNcIixcclxuICAgICAgICAgICAgICAgIGhhbmRsZTogXCIucGFuZWwtaGVhZGVyXCIsXHJcbiAgICAgICAgICAgICAgICBpdGVtczogJ2Rpdi5wYW5lbCcsXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJwYW5lbC1wbGFjZWhvbGRlclwiLFxyXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC41LFxyXG4gICAgICAgICAgICAgICAgZHJvcE9uRW1wdHk6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBmb3JjZVBsYWNlaG9sZGVyU2l6ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlY2VpdmU6IGZ1bmN0aW9uIChldmVudCwgdWkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS50cmlnZ2VyKFwicmVzaXplXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKioqKiBOZXN0YWJsZSBMaXN0ICoqKiovXHJcbiAgICBmdW5jdGlvbiBuZXN0YWJsZSgpIHtcclxuICAgICAgICBpZiAoJCgnLm5lc3RhYmxlJykubGVuZ3RoICYmICQuZm4ubmVzdGFibGUpIHtcclxuICAgICAgICAgICAgJChcIi5uZXN0YWJsZVwiKS5uZXN0YWJsZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKiBTb3J0YWJsZSBUYWJsZSAqKioqL1xyXG4gICAgZnVuY3Rpb24gc29ydGFibGVUYWJsZSgpIHtcclxuICAgICAgICBpZiAoJCgnLnNvcnRhYmxlX3RhYmxlJykubGVuZ3RoICYmICQuZm4uc29ydGFibGUpIHtcclxuICAgICAgICAgICAgJChcIi5zb3J0YWJsZV90YWJsZVwiKS5zb3J0YWJsZSh7XHJcbiAgICAgICAgICAgICAgICBpdGVtUGF0aDogJz4gdGJvZHknLFxyXG4gICAgICAgICAgICAgICAgaXRlbVNlbGVjdG9yOiAndGJvZHkgdHInLFxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICc8dHIgY2xhc3M9XCJwbGFjZWhvbGRlclwiLz4nXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKiAgU2hvdyBUb29sdGlwICAqKioqL1xyXG4gICAgZnVuY3Rpb24gc2hvd1Rvb2x0aXAoKSB7XHJcbiAgICAgICAgaWYgKCQoJ1tkYXRhLXJlbD1cInRvb2x0aXBcIl0nKS5sZW5ndGggJiYgJC5mbi50b29sdGlwKSB7XHJcbiAgICAgICAgICAgICQoJ1tkYXRhLXJlbD1cInRvb2x0aXBcIl0nKS50b29sdGlwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqICBTaG93IFBvcG92ZXIgICoqKiovXHJcbiAgICBmdW5jdGlvbiBwb3BvdmVyKCkge1xyXG4gICAgICAgIGlmICgkKCdbcmVsPVwicG9wb3ZlclwiXScpLmxlbmd0aCAmJiAkLmZuLnBvcG92ZXIpIHtcclxuICAgICAgICAgICAgJCgnW3JlbD1cInBvcG92ZXJcIl0nKS5wb3BvdmVyKHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXI6IFwiaG92ZXJcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJCgnW3JlbD1cInBvcG92ZXJfZGFya1wiXScpLnBvcG92ZXIoe1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlciBwb3BvdmVyLWRhcmtcIj48ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj48aDMgY2xhc3M9XCJwb3BvdmVyLXRpdGxlIHBvcG92ZXItdGl0bGVcIj48L2gzPjxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnQgcG9wb3Zlci1jb250ZW50XCI+PC9kaXY+PC9kaXY+JyxcclxuICAgICAgICAgICAgICAgIHRyaWdnZXI6IFwiaG92ZXJcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKiogIFRhYmxlIHByb2dyZXNzIGJhciAgKioqKi9cclxuICAgIGZ1bmN0aW9uIHByb2dyZXNzQmFyKCkge1xyXG4gICAgICAgIGlmICgkKCcucHJvZ3Jlc3MtYmFyJykubGVuZ3RoICYmICQuZm4ucHJvZ3Jlc3NiYXIpIHtcclxuICAgICAgICAgICAgJCgnLnByb2dyZXNzLWJhcicpLnByb2dyZXNzYmFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqIElPUyBTd2l0Y2ggICoqKiovXHJcbiAgICBmdW5jdGlvbiBpb3NTd2l0Y2goKSB7XHJcbiAgICAgICAgaWYgKCQoJy5qcy1zd2l0Y2gnKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcuanMtc3dpdGNoJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yT24gPSAnIzE4QTY4OSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yT2ZmID0gJyNERkRGREYnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NvbG9yLW9uJykpIGNvbG9yT24gPSAkKHRoaXMpLmRhdGEoJ2NvbG9yLW9uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnY29sb3Itb24nKSkgY29sb3JPZmYgPSAkKHRoaXMpLmRhdGEoJ2NvbG9yLW9mZicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvck9uID09ICdibHVlJykgY29sb3JPbiA9ICcjNTZBMkQ1JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JPbiA9PSAncmVkJykgY29sb3JPbiA9ICcjQzc1NzU3JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JPbiA9PSAneWVsbG93JykgY29sb3JPbiA9ICcjRjNCMjI4JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JPbiA9PSAnZ3JlZW4nKSBjb2xvck9uID0gJyMxOEE2ODknO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvck9uID09ICdwdXJwbGUnKSBjb2xvck9uID0gJyM4MjI3ZjEnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvck9uID09ICdkYXJrJykgY29sb3JPbiA9ICcjMjkyQzM1JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JPZmYgPT0gJ2JsdWUnKSBjb2xvck9mZiA9ICcjNTZBMkQ1JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JPZmYgPT0gJ3JlZCcpIGNvbG9yT2ZmID0gJyNDNzU3NTcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvck9mZiA9PSAneWVsbG93JykgY29sb3JPZmYgPSAnI0YzQjIyOCc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yT2ZmID09ICdncmVlbicpIGNvbG9yT2ZmID0gJyMxOEE2ODknO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvck9mZiA9PSAncHVycGxlJykgY29sb3JPZmYgPSAnIzgyMjdmMSc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yT2ZmID09ICdkYXJrJykgY29sb3JPZmYgPSAnIzI5MkMzNSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN3aXRjaGVyeSA9IG5ldyBTd2l0Y2hlcnkodGhpcywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogY29sb3JPbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5Q29sb3I6IGNvbG9yT2ZmXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyogTWFuYWdlIFNsaWRlciAqL1xyXG4gICAgZnVuY3Rpb24gc2xpZGVySU9TKCkge1xyXG4gICAgICAgIGlmICgkKCcuc2xpZGUtaW9zJykubGVuZ3RoICYmICQuZm4uc2xpZGVyKSB7XHJcbiAgICAgICAgICAgICQoJy5zbGlkZS1pb3MnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykuc2xpZGVySU9TKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiBNYW5hZ2UgUmFuZ2UgU2xpZGVyICovXHJcbiAgICBmdW5jdGlvbiByYW5nZVNsaWRlcigpIHtcclxuICAgICAgICBpZiAoJCgnLnJhbmdlLXNsaWRlcicpLmxlbmd0aCAmJiAkLmZuLmlvblJhbmdlU2xpZGVyKSB7XHJcbiAgICAgICAgICAgICQoJy5yYW5nZS1zbGlkZXInKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykuaW9uUmFuZ2VTbGlkZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbjogJCh0aGlzKS5kYXRhKCdtaW4nKSA/ICQodGhpcykuZGF0YSgnbWluJykgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heDogJCh0aGlzKS5kYXRhKCdtYXgnKSA/ICQodGhpcykuZGF0YSgnbWF4JykgOiA1MDAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGVNaW5NYXg6ICQodGhpcykuZGF0YSgnaGlkZU1pbk1heCcpID8gJCh0aGlzKS5kYXRhKCdoaWRlTWluTWF4JykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBoaWRlRnJvbVRvOiAkKHRoaXMpLmRhdGEoJ2hpZGVGcm9tVG8nKSA/ICQodGhpcykuZGF0YSgnaGlkZUZyb21UbycpIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdG86ICQodGhpcykuZGF0YSgndG8nKSA/ICQodGhpcykuZGF0YSgndG8nKSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6ICQodGhpcykuZGF0YSgnc3RlcCcpID8gJCh0aGlzKS5kYXRhKCdzdGVwJykgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAkKHRoaXMpLmRhdGEoJ3R5cGUnKSA/ICQodGhpcykuZGF0YSgndHlwZScpIDogJ2RvdWJsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAkKHRoaXMpLmRhdGEoJ3ByZWZpeCcpID8gJCh0aGlzKS5kYXRhKCdwcmVmaXgnKSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc3RmaXg6ICQodGhpcykuZGF0YSgncG9zdGZpeCcpID8gJCh0aGlzKS5kYXRhKCdwb3N0Zml4JykgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3N0Zml4OiAkKHRoaXMpLmRhdGEoJ21heFBvc3RmaXgnKSA/ICQodGhpcykuZGF0YSgnbWF4UG9zdGZpeCcpIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzR3JpZDogJCh0aGlzKS5kYXRhKCdoYXNHcmlkJykgPyAkKHRoaXMpLmRhdGEoJ2hhc0dyaWQnKSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiBCdXR0b24gTG9hZGluZyBTdGF0ZSAqL1xyXG4gICAgZnVuY3Rpb24gYnV0dG9uTG9hZGVyKCkge1xyXG4gICAgICAgIGlmICgkKCcubGFkZGEtYnV0dG9uJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIExhZGRhLmJpbmQoJy5sYWRkYS1idXR0b24nLCB7XHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiAyMDAwXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBCaW5kIHByb2dyZXNzIGJ1dHRvbnMgYW5kIHNpbXVsYXRlIGxvYWRpbmcgcHJvZ3Jlc3NcclxuICAgICAgICAgICAgTGFkZGEuYmluZCgnLnByb2dyZXNzLWRlbW8gYnV0dG9uJywge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IE1hdGgubWluKHByb2dyZXNzICsgTWF0aC5yYW5kb20oKSAqIDAuMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnNldFByb2dyZXNzKHByb2dyZXNzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5wdXRTZWxlY3QoKSB7XHJcblxyXG4gICAgICAgIGlmICgkLmZuLnNlbGVjdDIpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKCdzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXQoc3RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRlX2lkID0gc3RhdGUuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGVfaWQpIHJldHVybiBzdGF0ZS50ZXh0OyAvLyBvcHRncm91cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gc3RhdGVfaWQuc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzWzBdID09ICdpbWFnZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNbMl0pIHJldHVybiBcIjxpbWcgY2xhc3M9J2ZsYWcnIHNyYz0nLi4vaW1hZ2VzL2ZsYWdzL1wiICsgcmVzWzFdLnRvTG93ZXJDYXNlKCkgKyBcIi1cIiArIHJlc1syXS50b0xvd2VyQ2FzZSgpICsgXCIucG5nJyBzdHlsZT0nd2lkdGg6MjdweDtwYWRkaW5nLXJpZ2h0OjEwcHg7bWFyZ2luLXRvcDogLTNweDsnLz5cIiArIHN0YXRlLnRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBcIjxpbWcgY2xhc3M9J2ZsYWcnIHNyYz0nLi4vaW1hZ2VzL2ZsYWdzL1wiICsgcmVzWzFdLnRvTG93ZXJDYXNlKCkgKyBcIi5wbmcnIHN0eWxlPSd3aWR0aDoyN3B4O3BhZGRpbmctcmlnaHQ6MTBweDttYXJnaW4tdG9wOiAtM3B4OycvPlwiICsgc3RhdGUudGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuc2VsZWN0Mih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFJlc3VsdDogZm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRTZWxlY3Rpb246IGZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICQodGhpcykuZGF0YSgncGxhY2Vob2xkZXInKSA/ICQodGhpcykuZGF0YSgncGxhY2Vob2xkZXInKSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0NsZWFyOiAkKHRoaXMpLmRhdGEoJ2FsbG93Y2xlYXInKSA/ICQodGhpcykuZGF0YSgnYWxsb3djbGVhcicpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bUlucHV0TGVuZ3RoOiAkKHRoaXMpLmRhdGEoJ21pbmltdW1JbnB1dExlbmd0aCcpID8gJCh0aGlzKS5kYXRhKCdtaW5pbXVtSW5wdXRMZW5ndGgnKSA6IC0xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUmVzdWx0c0ZvclNlYXJjaDogJCh0aGlzKS5kYXRhKCdzZWFyY2gnKSA/IDEgOiAtMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25Dc3NDbGFzczogJCh0aGlzKS5kYXRhKCdzdHlsZScpID8gJ2Zvcm0td2hpdGUnIDogJydcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSwgMjAwKTtcclxuXHJcbiAgICAgICAgICAgIC8qIERlbW8gU2VsZWN0IExvYWRpbmcgRGF0YSAqL1xyXG4gICAgICAgICAgICBmdW5jdGlvbiByZXBvRm9ybWF0UmVzdWx0KHJlcG8pIHtcclxuICAgICAgICAgICAgICAgIHZhciBtYXJrdXAgPSAnPGRpdiBjbGFzcz1cInJvd1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjxpbWcgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZVwiIHNyYz1cIicgKyByZXBvLm93bmVyLmF2YXRhcl91cmwgKyAnXCIgLz48L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY29sLW1kLTEwXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInJvd1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPicgKyByZXBvLmZ1bGxfbmFtZSArICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj48aSBjbGFzcz1cImZhIGZhLWNvZGUtZm9ya1wiPjwvaT4gJyArIHJlcG8uZm9ya3NfY291bnQgKyAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+PGkgY2xhc3M9XCJmYSBmYS1zdGFyXCI+PC9pPiAnICsgcmVwby5zdGFyZ2F6ZXJzX2NvdW50ICsgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVwby5kZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmt1cCArPSAnPGRpdj4nICsgcmVwby5kZXNjcmlwdGlvbiArICc8L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbWFya3VwICs9ICc8L2Rpdj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcmt1cDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZXBvRm9ybWF0U2VsZWN0aW9uKHJlcG8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXBvLmZ1bGxfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCQoJyNkZW1vLWxvYWRpbmctZGF0YScpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNkZW1vLWxvYWRpbmctZGF0YVwiKS5zZWxlY3QyKHtcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJTZWFyY2ggZm9yIGEgcmVwb3NpdG9yeVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW1JbnB1dExlbmd0aDogMSxcclxuICAgICAgICAgICAgICAgICAgICBhamF4OiB7IC8vIGluc3RlYWQgb2Ygd3JpdGluZyB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCB3ZSB1c2UgU2VsZWN0MidzIGNvbnZlbmllbnQgaGVscGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogXCJodHRwczovL2FwaS5naXRodWIuY29tL3NlYXJjaC9yZXBvc2l0b3JpZXNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXRNaWxsaXM6IDI1MCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24gKHRlcm0sIHBhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTogdGVybSwgLy8gc2VhcmNoIHRlcm1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IGZ1bmN0aW9uIChkYXRhLCBwYWdlKSB7IC8vIHBhcnNlIHRoZSByZXN1bHRzIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBTZWxlY3QyLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgYXJlIHVzaW5nIGN1c3RvbSBmb3JtYXR0aW5nIGZ1bmN0aW9ucyB3ZSBkbyBub3QgbmVlZCB0byBhbHRlciB0aGUgcmVtb3RlIEpTT04gZGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0czogZGF0YS5pdGVtcyB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgaW5pdFNlbGVjdGlvbjogZnVuY3Rpb24gKGVsZW1lbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCB0YWcgaGFzIGEgdmFsdWUgYXR0cmlidXRlIHByZWxvYWRlZCB0aGF0IHBvaW50cyB0byBhIHByZXNlbGVjdGVkIHJlcG9zaXRvcnkncyBpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoYXQgaWQgYXR0cmlidXRlIHRvIGFuIG9iamVjdCB0aGF0IHNlbGVjdDIgY2FuIHJlbmRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2luZyBpdHMgZm9ybWF0UmVzdWx0IHJlbmRlcmVyIC0gdGhhdCB3YXkgdGhlIHJlcG9zaXRvcnkgbmFtZSBpcyBzaG93biBwcmVzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSAkKGVsZW1lbnQpLnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuYWpheChcImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3NpdG9yaWVzL1wiICsgaWQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogXCJqc29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKGRhdGEpIHsgY2FsbGJhY2soZGF0YSk7IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRSZXN1bHQ6IHJlcG9Gb3JtYXRSZXN1bHQsIC8vIG9taXR0ZWQgZm9yIGJyZXZpdHksIHNlZSB0aGUgc291cmNlIG9mIHRoaXMgcGFnZVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdFNlbGVjdGlvbjogcmVwb0Zvcm1hdFNlbGVjdGlvbiwgIC8vIG9taXR0ZWQgZm9yIGJyZXZpdHksIHNlZSB0aGUgc291cmNlIG9mIHRoaXMgcGFnZVxyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiYmlnZHJvcFwiLCAvLyBhcHBseSBjc3MgdGhhdCBtYWtlcyB0aGUgZHJvcGRvd24gdGFsbGVyXHJcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlTWFya3VwOiBmdW5jdGlvbiAobSkgeyByZXR1cm4gbTsgfSAvLyB3ZSBkbyBub3Qgd2FudCB0byBlc2NhcGUgbWFya3VwIHNpbmNlIHdlIGFyZSBkaXNwbGF5aW5nIGh0bWwgaW4gcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5wdXRUYWdzKCkge1xyXG4gICAgICAgICQoJy5zZWxlY3QtdGFncycpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkKHRoaXMpLnRhZ3NpbnB1dCh7XHJcbiAgICAgICAgICAgICAgICB0YWdDbGFzczogJ2xhYmVsIGxhYmVsLXByaW1hcnknXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqKiogIFRhYmxlcyBSZXNwb25zaXZlICAqKioqL1xyXG4gICAgZnVuY3Rpb24gdGFibGVSZXNwb25zaXZlKCkge1xyXG4gICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQoJy50YWJsZScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93X3dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZV93aWR0aCA9ICQodGhpcykud2lkdGgoKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRfd2lkdGggPSAkKHRoaXMpLnBhcmVudCgpLndpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFibGVfd2lkdGggPiBjb250ZW50X3dpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5hZGRDbGFzcygnZm9yY2UtdGFibGUtcmVzcG9uc2l2ZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZm9yY2UtdGFibGUtcmVzcG9uc2l2ZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqICBUYWJsZXMgRHluYW1pYyAgKioqKi9cclxuICAgIGZ1bmN0aW9uIHRhYmxlRHluYW1pYygpIHtcclxuICAgICAgLyogIGlmICgkKCcudGFibGUtZHluYW1pYycpLmxlbmd0aCAmJiAkLmZuLmRhdGFUYWJsZSkge1xyXG4gICAgICAgICAgICAkKCcudGFibGUtZHluYW1pYycpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9wdCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgLy8gVG9vbHM6IGV4cG9ydCB0byBFeGNlbCwgQ1NWLCBQREYgJiBQcmludFxyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ3RhYmxlLXRvb2xzJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHQuc0RvbSA9IFwiPCdyb3cnPCdjb2wtbWQtNidmPjwnY29sLW1kLTYnVD5yPnQ8J3Jvdyc8J2NvbC1tZC02J2k+PCdzcGNvbC1tZC02YW42J3A+PlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wdC5vVGFibGVUb29scyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzU3dmUGF0aFwiOiBcIi4uLy4uLy4uL2Fzc2V0cy9nbG9iYWwvcGx1Z2lucy9kYXRhdGFibGVzL3N3Zi9jb3B5X2Nzdl94bHNfcGRmLnN3ZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFCdXR0b25zXCI6IFtcImNzdlwiLCBcInhsc1wiLCBcInBkZlwiLCBcInByaW50XCJdXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCduby1oZWFkZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdC5iRmlsdGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0LmJMZW5ndGhDaGFuZ2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCduby1mb290ZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdC5iSW5mbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdC5iUGFnaW5hdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdmaWx0ZXItaGVhZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLmZpbHRlci1oZWFkIHRoZWFkIHRoJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9ICQoJy5maWx0ZXItaGVhZCB0aGVhZCB0aCcpLmVxKCQodGhpcykuaW5kZXgoKSkudGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFwcGVuZCgnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgb25jbGljaz1cInN0b3BQcm9wYWdhdGlvbihldmVudCk7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIkZpbHRlciAnICsgdGl0bGUgKyAnXCIgLz4nKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSAkKCcuZmlsdGVyLWhlYWQnKS5EYXRhVGFibGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAkKFwiLmZpbHRlci1oZWFkIHRoZWFkIGlucHV0XCIpLm9uKCdrZXl1cCBjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmNvbHVtbigkKHRoaXMpLnBhcmVudCgpLmluZGV4KCkgKyAnOnZpc2libGUnKS5zZWFyY2godGhpcy52YWx1ZSkuZHJhdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2ZpbHRlci1mb290ZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5maWx0ZXItZm9vdGVyIHRmb290IHRoJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9ICQoJy5maWx0ZXItZm9vdGVyIHRoZWFkIHRoJykuZXEoJCh0aGlzKS5pbmRleCgpKS50ZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaHRtbCgnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIkZpbHRlciAnICsgdGl0bGUgKyAnXCIgLz4nKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSAkKCcuZmlsdGVyLWZvb3RlcicpLkRhdGFUYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoXCIuZmlsdGVyLWZvb3RlciB0Zm9vdCBpbnB1dFwiKS5vbigna2V5dXAgY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5jb2x1bW4oJCh0aGlzKS5wYXJlbnQoKS5pbmRleCgpICsgJzp2aXNpYmxlJykuc2VhcmNoKHRoaXMudmFsdWUpLmRyYXcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdmaWx0ZXItc2VsZWN0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLkRhdGFUYWJsZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFwaSA9IHRoaXMuYXBpKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpLmNvbHVtbnMoKS5pbmRleGVzKCkuZmxhdHRlbigpLmVhY2goZnVuY3Rpb24gKGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gYXBpLmNvbHVtbihpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ID0gJCgnPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtcGxhY2Vob2xkZXI9XCJTZWxlY3QgdG8gZmlsdGVyXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPjwvb3B0aW9uPjwvc2VsZWN0PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkKGNvbHVtbi5mb290ZXIoKSkuZW1wdHkoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gJCh0aGlzKS52YWwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VhcmNoKHZhbCA/ICdeJyArIHZhbCArICckJyA6ICcnLCB0cnVlLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZHJhdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRhdGEoKS51bmlxdWUoKS5zb3J0KCkuZWFjaChmdW5jdGlvbiAoZCwgaikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPVwiJyArIGQgKyAnXCI+JyArIGQgKyAnPC9vcHRpb24+JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ2ZpbHRlci1oZWFkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2ZpbHRlci1mb290ZXInKSAmJiAhJCh0aGlzKS5oYXNDbGFzcygnZmlsdGVyLXNlbGVjdCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9UYWJsZSA9ICQodGhpcykuZGF0YVRhYmxlKG9wdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb1RhYmxlLmZuRHJhdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSovXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIEhhbmRsZXMgY3VzdG9tIGNoZWNrYm94ZXMgJiByYWRpb3MgdXNpbmcgalF1ZXJ5IGlDaGVjayBwbHVnaW5cclxuICAgIGZ1bmN0aW9uIGhhbmRsZWlDaGVjaygpIHtcclxuXHJcbiAgICAgICAgaWYgKCEkKCkuaUNoZWNrKSByZXR1cm47XHJcbiAgICAgICAgJCgnOmNoZWNrYm94Om5vdCguanMtc3dpdGNoLCAuc3dpdGNoLWlucHV0LCAuc3dpdGNoLWlwaG9uZSwgLm9ub2Zmc3dpdGNoLWNoZWNrYm94LCAuaW9zLWNoZWNrYm94KSwgOnJhZGlvJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgY2hlY2tib3hDbGFzcyA9ICQodGhpcykuYXR0cignZGF0YS1jaGVja2JveCcpID8gJCh0aGlzKS5hdHRyKCdkYXRhLWNoZWNrYm94JykgOiAnaWNoZWNrYm94X21pbmltYWwtZ3JleSc7XHJcbiAgICAgICAgICAgIHZhciByYWRpb0NsYXNzID0gJCh0aGlzKS5hdHRyKCdkYXRhLXJhZGlvJykgPyAkKHRoaXMpLmF0dHIoJ2RhdGEtcmFkaW8nKSA6ICdpcmFkaW9fbWluaW1hbC1ncmV5JztcclxuXHJcbiAgICAgICAgICAgIGlmIChjaGVja2JveENsYXNzLmluZGV4T2YoJ19saW5lJykgPiAtMSB8fCByYWRpb0NsYXNzLmluZGV4T2YoJ19saW5lJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5pQ2hlY2soe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Q2xhc3M6IGNoZWNrYm94Q2xhc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgcmFkaW9DbGFzczogcmFkaW9DbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICBpbnNlcnQ6ICc8ZGl2IGNsYXNzPVwiaWNoZWNrX2xpbmUtaWNvblwiPjwvZGl2PicgKyAkKHRoaXMpLmF0dHIoXCJkYXRhLWxhYmVsXCIpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykuaUNoZWNrKHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja2JveENsYXNzOiBjaGVja2JveENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgIHJhZGlvQ2xhc3M6IHJhZGlvQ2xhc3NcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qIFRpbWUgcGlja2VyICovXHJcbiAgICBmdW5jdGlvbiB0aW1lcGlja2VyKCkge1xyXG4gICAgICAgICQoJy50aW1lcGlja2VyJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQodGhpcykudGltZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICBpc1JUTDogJCgnYm9keScpLmhhc0NsYXNzKCdydGwnKSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQ6ICQodGhpcykuYXR0cignZGF0YS1mb3JtYXQnLCAnYW0tcG0nKSA/ICdoaDptbSB0dCcgOiAnSEg6bW0nXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIERhdGUgcGlja2VyICovXHJcbiAgICBmdW5jdGlvbiBkYXRlcGlja2VyKCkge1xyXG4gICAgICAgICQoJy5kYXRlLXBpY2tlcicpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkKHRoaXMpLmRhdGVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZNb250aHM6IDEsXHJcbiAgICAgICAgICAgICAgICBpc1JUTDogJCgnYm9keScpLmhhc0NsYXNzKCdydGwnKSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHByZXZUZXh0OiAnPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0XCI+PC9pPicsXHJcbiAgICAgICAgICAgICAgICBuZXh0VGV4dDogJzxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+JyxcclxuICAgICAgICAgICAgICAgIHNob3dCdXR0b25QYW5lbDogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogRGF0ZSBwaWNrZXIgKi9cclxuICAgIGZ1bmN0aW9uIGJEYXRlcGlja2VyKCkge1xyXG4gICAgICAgICQoJy5iLWRhdGVwaWNrZXInKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5ib290c3RyYXBEYXRlcGlja2VyKHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0VmlldzogJCh0aGlzKS5kYXRhKCd2aWV3JykgPyAkKHRoaXMpLmRhdGEoJ3ZpZXcnKSA6IDAsIC8vIDA6IG1vbnRoIHZpZXcgLCAxOiB5ZWFyIHZpZXcsIDI6IG11bHRpcGxlIHllYXIgdmlld1xyXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICQodGhpcykuZGF0YSgnbGFuZycpID8gJCh0aGlzKS5kYXRhKCdsYW5nJykgOiBcImVuXCIsXHJcbiAgICAgICAgICAgICAgICBmb3JjZVBhcnNlOiAkKHRoaXMpLmRhdGEoJ3BhcnNlJykgPyAkKHRoaXMpLmRhdGEoJ3BhcnNlJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRheXNPZldlZWtEaXNhYmxlZDogJCh0aGlzKS5kYXRhKCdkYXktZGlzYWJsZWQnKSA/ICQodGhpcykuZGF0YSgnZGF5LWRpc2FibGVkJykgOiBcIlwiLCAvLyBEaXNhYmxlIDEgb3IgdmFyaW91cyBkYXkuIEZvciBtb25kYXkgYW5kIHRodXJzZGF5OiAxLDNcclxuICAgICAgICAgICAgICAgIGNhbGVuZGFyV2Vla3M6ICQodGhpcykuZGF0YSgnY2FsZW5kYXItd2VlaycpID8gJCh0aGlzKS5kYXRhKCdjYWxlbmRhci13ZWVrJykgOiBmYWxzZSwgLy8gRGlzcGxheSB3ZWVrIG51bWJlciBcclxuICAgICAgICAgICAgICAgIGF1dG9jbG9zZTogJCh0aGlzKS5kYXRhKCdhdXRvY2xvc2UnKSA/ICQodGhpcykuZGF0YSgnYXV0b2Nsb3NlJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRvZGF5SGlnaGxpZ2h0OiAkKHRoaXMpLmRhdGEoJ3RvZGF5LWhpZ2hsaWdodCcpID8gJCh0aGlzKS5kYXRhKCd0b2RheS1oaWdobGlnaHQnKSA6IHRydWUsIC8vIEhpZ2hsaWdodCB0b2RheSBkYXRlXHJcbiAgICAgICAgICAgICAgICB0b2dnbGVBY3RpdmU6ICQodGhpcykuZGF0YSgndG9nZ2xlLWFjdGl2ZScpID8gJCh0aGlzKS5kYXRhKCd0b2dnbGUtYWN0aXZlJykgOiB0cnVlLCAvLyBDbG9zZSBvdGhlciB3aGVuIG9wZW5cclxuICAgICAgICAgICAgICAgIG11bHRpZGF0ZTogJCh0aGlzKS5kYXRhKCdtdWx0aWRhdGUnKSA/ICQodGhpcykuZGF0YSgnbXVsdGlkYXRlJykgOiBmYWxzZSwgLy8gQWxsb3cgdG8gc2VsZWN0IHZhcmlvdXMgZGF5c1xyXG4gICAgICAgICAgICAgICAgb3JpZW50YXRpb246ICQodGhpcykuZGF0YSgnb3JpZW50YXRpb24nKSA/ICQodGhpcykuZGF0YSgnb3JpZW50YXRpb24nKSA6IFwiYXV0b1wiLCAvLyBBbGxvdyB0byBzZWxlY3QgdmFyaW91cyBkYXlzLFxyXG4gICAgICAgICAgICAgICAgcnRsOiAkKCdodG1sJykuaGFzQ2xhc3MoJ3J0bCcpID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbXVsdGlEYXRlc1BpY2tlcigpIHtcclxuICAgICAgICAkKCcubXVsdGlkYXRlcGlja2VyJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQodGhpcykubXVsdGlEYXRlc1BpY2tlcih7XHJcbiAgICAgICAgICAgICAgICBkYXRlRm9ybWF0OiAneXktbW0tZGQnLFxyXG4gICAgICAgICAgICAgICAgbWluRGF0ZTogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgICAgIG1heERhdGU6ICcrMXknLFxyXG4gICAgICAgICAgICAgICAgZmlyc3REYXk6IDEsXHJcbiAgICAgICAgICAgICAgICBzaG93T3RoZXJNb250aHM6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmF0aW5nKCkge1xyXG4gICAgICAgICQoJy5yYXRlaXQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5yYXRlaXQoe1xyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHk6ICQodGhpcykuZGF0YSgncmVhZG9ubHknKSA/ICQodGhpcykuZGF0YSgncmVhZG9ubHknKSA6IGZhbHNlLCAvLyBOb3QgZWRpdGFibGUsIGZvciBleGFtcGxlIHRvIHNob3cgcmF0aW5nIHRoYXQgYWxyZWFkeSBleGlzdCBcclxuICAgICAgICAgICAgICAgIHJlc2V0YWJsZTogJCh0aGlzKS5kYXRhKCdyZXNldGFibGUnKSA/ICQodGhpcykuZGF0YSgncmVzZXRhYmxlJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiAkKHRoaXMpLmRhdGEoJ3ZhbHVlJykgPyAkKHRoaXMpLmRhdGEoJ3ZhbHVlJykgOiAwLCAvLyBDdXJyZW50IHZhbHVlIG9mIHJhdGluZ1xyXG4gICAgICAgICAgICAgICAgbWluOiAkKHRoaXMpLmRhdGEoJ21pbicpID8gJCh0aGlzKS5kYXRhKCdtaW4nKSA6IDEsIC8vIE1heGltdW0gb2Ygc3RhclxyXG4gICAgICAgICAgICAgICAgbWF4OiAkKHRoaXMpLmRhdGEoJ21heCcpID8gJCh0aGlzKS5kYXRhKCdtYXgnKSA6IDUsIC8vIE1heGltdW0gb2Ygc3RhclxyXG4gICAgICAgICAgICAgICAgc3RlcDogJCh0aGlzKS5kYXRhKCdzdGVwJykgPyAkKHRoaXMpLmRhdGEoJ3N0ZXAnKSA6IDAuMVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gVG9vbHRpcCBPcHRpb24gICAgICBcclxuICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgndG9vbHRpcCcpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdG9vbHRpcHZhbHVlcyA9IFsnYmFkJywgJ3Bvb3InLCAnb2snLCAnZ29vZCcsICdzdXBlciddOyAvLyBZb3UgY2FuIGNoYW5nZSB0ZXh0IGhlcmUgXHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmJpbmQoJ292ZXInLCBmdW5jdGlvbiAoZXZlbnQsIHZhbHVlKSB7ICQodGhpcykuYXR0cigndGl0bGUnLCB0b29sdGlwdmFsdWVzW3ZhbHVlIC0gMV0pOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBDb25maXJtYXRpb24gYmVmb3JlIHZvdGluZyBvcHRpb24gICAgICBcclxuICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnY29uZmlybWF0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykub24oJ2JlZm9yZXJhdGVkJywgZnVuY3Rpb24gKGUsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0ZpeGVkKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJhdGUgdGhpcyBpdGVtOiAnICsgdmFsdWUgKyAnIHN0YXJzPycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpc2FibGUgcmF0aW5nIGFmdGVyIHZvdGluZy4gSWYgeW91IHdhbnQgdG8ga2VlcCBpdCBlbmFibGUsIHJlbW92ZSB0aGlzIHBhcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yYXRlaXQoJ3JlYWRvbmx5JywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gRGlzYWJsZSB2b3RlIGFmdGVyIHJhdGluZ1xyXG4gICAgICAgICAgICBpZiAoJCh0aGlzKS5kYXRhKCdkaXNhYmxlLWFmdGVyJykpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykuYmluZCgncmF0ZWQnLCBmdW5jdGlvbiAoZXZlbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yYXRlaXQoJ3JlYWRvbmx5JywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBEaXNwbGF5IHJhdGluZyB2YWx1ZSBhcyB0ZXh0IGJlbG93XHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMpLnBhcmVudCgpLmZpbmQoJy5yYXRpbmctdmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5iaW5kKCdyYXRlZCcsIGZ1bmN0aW9uIChldmVudCwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHZhbHVlID0gdmFsdWUudG9GaXhlZCgxKTtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLmZpbmQoJy5yYXRpbmctdmFsdWUnKS50ZXh0KCdZb3VyIHJhdGluZzogJyArIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERpc3BsYXkgaG92ZXIgdmFsdWUgYXMgdGV4dCBiZWxvdyAgICAgXHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMpLnBhcmVudCgpLmZpbmQoJy5ob3Zlci12YWx1ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmJpbmQoJ292ZXInLCBmdW5jdGlvbiAoZXZlbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB2YWx1ZSA9IHZhbHVlLnRvRml4ZWQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5maW5kKCcuaG92ZXItdmFsdWUnKS50ZXh0KCdIb3ZlciByYXRpbmcgdmFsdWU6ICcgKyB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBEYXRlICYgVGltZSBwaWNrZXIgKi9cclxuICAgIGZ1bmN0aW9uIGRhdGV0aW1lcGlja2VyKCkge1xyXG4gICAgICAgIGlmICgkLmZuLmRhdGV0aW1lcGlja2VyKSB7XHJcbiAgICAgICAgICAgICQoJy5kYXRldGltZXBpY2tlcicpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRldGltZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldlRleHQ6ICc8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLWxlZnRcIj48L2k+JyxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0VGV4dDogJzxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLyogSW5saW5lIERhdGUgJiBUaW1lIHBpY2tlciAqL1xyXG4gICAgICAgICAgICAkKCcuaW5saW5lX2RhdGV0aW1lcGlja2VyJykuZGF0ZXRpbWVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgYWx0RmllbGRUaW1lT25seTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpc1JUTDogaXNfUlRMXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyogUG9wdXAgSW1hZ2VzICovXHJcbiAgICBmdW5jdGlvbiBtYWduaWZpY1BvcHVwKCkge1xyXG4gICAgICAgIGlmICgkKCcubWFnbmlmaWMnKS5sZW5ndGggJiYgJC5mbi5tYWduaWZpY1BvcHVwKSB7XHJcbiAgICAgICAgICAgICQoJy5tYWduaWZpYycpLm1hZ25pZmljUG9wdXAoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlJyxcclxuICAgICAgICAgICAgICAgIGdhbGxlcnk6IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcmVtb3ZhbERlbGF5OiAzMDAsXHJcbiAgICAgICAgICAgICAgICBtYWluQ2xhc3M6ICdtZnAtZmFkZSdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqICBTdW1tZXJub3RlIEVkaXRvciAgKioqKi9cclxuICAgIGZ1bmN0aW9uIGVkaXRvclN1bW1lcm5vdGUoKSB7XHJcbiAgICAgICAgaWYgKCQoJy5zdW1tZXJub3RlJykubGVuZ3RoICYmICQuZm4uc3VtbWVybm90ZSkge1xyXG4gICAgICAgICAgICAkKCcuc3VtbWVybm90ZScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5zdW1tZXJub3RlKHtcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwMCxcclxuICAgICAgICAgICAgICAgICAgICBhaXJNb2RlOiAkKHRoaXMpLmRhdGEoJ2Fpcm1vZGUnKSA/ICQodGhpcykuZGF0YSgnYWlybW9kZScpIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgYWlyUG9wb3ZlcjogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBbXCJzdHlsZVwiLCBbXCJzdHlsZVwiXV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnY29sb3InLCBbJ2NvbG9yJ11dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ2ZvbnQnLCBbJ2JvbGQnLCAndW5kZXJsaW5lJywgJ2NsZWFyJ11dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ3BhcmEnLCBbJ3VsJywgJ3BhcmFncmFwaCddXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyd0YWJsZScsIFsndGFibGUnXV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnaW5zZXJ0JywgWydsaW5rJywgJ3BpY3R1cmUnXV1cclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2xiYXI6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgW1wic3R5bGVcIiwgW1wic3R5bGVcIl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbXCJzdHlsZVwiLCBbXCJib2xkXCIsIFwiaXRhbGljXCIsIFwidW5kZXJsaW5lXCIsIFwiY2xlYXJcIl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbXCJmb250c2l6ZVwiLCBbXCJmb250c2l6ZVwiXV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcImNvbG9yXCIsIFtcImNvbG9yXCJdXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW1wicGFyYVwiLCBbXCJ1bFwiLCBcIm9sXCIsIFwicGFyYWdyYXBoXCJdXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW1wiaGVpZ2h0XCIsIFtcImhlaWdodFwiXV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcInRhYmxlXCIsIFtcInRhYmxlXCJdXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyd2aWV3JywgWydjb2RldmlldyddXSxcclxuICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqICBDS0UgRWRpdG9yICAqKioqL1xyXG4gICAgZnVuY3Rpb24gZWRpdG9yQ0tFKCkge1xyXG4gICAgICAgIGlmICgkKCcuY2tlLWVkaXRvcicpLmxlbmd0aCAmJiAkLmZuLmNrZWRpdG9yKSB7XHJcbiAgICAgICAgICAgICQoJy5ja2UtZWRpdG9yJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmNrZWRpdG9yKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBUdXJuIG9mZiBhdXRvbWF0aWMgZWRpdG9yIGNyZWF0aW9uIGZpcnN0LlxyXG4gICAgICAgICAgICBDS0VESVRPUi5kaXNhYmxlQXV0b0lubGluZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBzbGlkZXIoKSB7XHJcbiAgICAgICAgaWYgKCQoJy5zbGljaycpLmxlbmd0aCAmJiAkLmZuLnNsaWNrKSB7XHJcbiAgICAgICAgICAgICQoJy5zbGljaycpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5zbGljayh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eTogdHJ1ZSwgLy8gRW5hYmxlcyB0YWJiaW5nIGFuZCBhcnJvdyBrZXkgbmF2aWdhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBhcnJvd3M6ICQodGhpcykuZGF0YSgnYXJyb3dzJykgPyAkKHRoaXMpLmRhdGEoJ2Fycm93cycpIDogZmFsc2UsIC8vIEVuYWJsZSBOZXh0L1ByZXYgYXJyb3dzXHJcbiAgICAgICAgICAgICAgICAgICAgYXNOYXZGb3I6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldkFycm93OiAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1yb2xlPVwibm9uZVwiIGNsYXNzPVwic2xpY2stcHJldlwiPlByZXZpb3VzPC9idXR0b24+JywgLy8gcHJldiBhcnJvd1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRBcnJvdzogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcm9sZT1cIm5vbmVcIiBjbGFzcz1cInNsaWNrLW5leHRcIj5OZXh0PC9idXR0b24+JywgLy8gbmV4dCBhcnJvd1xyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5OiAkKHRoaXMpLmF0dHIoJ2RhdGEtYXV0b3BsYXknKSA/ICQodGhpcykuYXR0cignZGF0YS1hdXRvcGxheScpIDogdHJ1ZSwgLy8gRW5hYmxlcyBhdXRvIHBsYXkgb2Ygc2xpZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b3BsYXlTcGVlZDogJCh0aGlzKS5kYXRhKCd0aW1pbmcnKSA/ICQodGhpcykuZGF0YSgndGltaW5nJykgOiA0MDAwLCAvLyBBdXRvIHBsYXkgY2hhbmdlIGludGVydmFsXHJcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyTW9kZTogJCh0aGlzKS5kYXRhKCdjZW50ZXInKSA/ICQodGhpcykuZGF0YSgnY2VudGVyJykgOiBmYWxzZSwgLy8gRW5hYmxlcyBjZW50ZXJlZCB2aWV3IHdpdGggcGFydGlhbCBwcmV2L25leHQgc2xpZGVzLiBcclxuICAgICAgICAgICAgICAgICAgICBjZW50ZXJQYWRkaW5nOiAnNTBweCcsIC8vIFNpZGUgcGFkZGluZyB3aGVuIGluIGNlbnRlciBtb2RlLiAocHggb3IgJSlcclxuICAgICAgICAgICAgICAgICAgICBjc3NFYXNlOiAnZWFzZScsIC8vIENTUzMgZWFzaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgZG90czogJCh0aGlzKS5hdHRyKCdkYXRhLWRvdHMnKSA/ICQodGhpcykuYXR0cignZGF0YS1kb3RzJykgOiB0cnVlLCAvLyBDdXJyZW50IHNsaWRlIGluZGljYXRvciBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgZG90c0NsYXNzOiAnc2xpY2stZG90cycsIC8vIENsYXNzIGZvciBzbGlkZSBpbmRpY2F0b3IgZG90cyBjb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsIC8vIEVuYWJsZXMgZGVza3RvcCBkcmFnZ2luZ1xyXG4gICAgICAgICAgICAgICAgICAgIGVhc2luZzogJ2xpbmVhcicsIC8vIGFuaW1hdGUoKSBmYWxsYmFjayBlYXNpbmdcclxuICAgICAgICAgICAgICAgICAgICBmYWRlOiAkKHRoaXMpLmRhdGEoJ2ZhZGUnKSA/ICQodGhpcykuZGF0YSgnZmFkZScpIDogZmFsc2UsIC8vIEVuYWJsZXMgZmFkZVxyXG4gICAgICAgICAgICAgICAgICAgIGZvY3VzT25TZWxlY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGluZmluaXRlOiB0cnVlLCAvLyBJbmZpbml0ZSBsb29waW5nXHJcbiAgICAgICAgICAgICAgICAgICAgbGF6eUxvYWQ6ICdvbmRlbWFuZCcsIC8vIEFjY2VwdHMgJ29uZGVtYW5kJyBvciAncHJvZ3Jlc3NpdmUnIGZvciBsYXp5IGxvYWQgdGVjaG5pcXVlXHJcbiAgICAgICAgICAgICAgICAgICAgb25CZWZvcmVDaGFuZ2U6IG51bGwsIC8vIEJlZm9yZSBzbGlkZSBjaGFuZ2UgY2FsbGJhY2tcclxuICAgICAgICAgICAgICAgICAgICBvbkFmdGVyQ2hhbmdlOiBudWxsLCAvLyBBZnRlciBzbGlkZSBjaGFuZ2UgY2FsbGJhY2tcclxuICAgICAgICAgICAgICAgICAgICBvbkluaXQ6IG51bGwsIC8vIFdoZW4gU2xpY2sgaW5pdGlhbGl6ZXMgZm9yIHRoZSBmaXJzdCB0aW1lIGNhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICAgICAgb25SZUluaXQ6IG51bGwsIC8vIEV2ZXJ5IHRpbWUgU2xpY2sgKHJlLSlpbml0aWFsaXplcyBjYWxsYmFja1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdXNlT25Ib3ZlcjogdHJ1ZSwgLy8gUGF1c2VzIGF1dG9wbGF5IG9uIGhvdmVyXHJcbiAgICAgICAgICAgICAgICAgICAgcGF1c2VPbkRvdHNIb3ZlcjogZmFsc2UsIC8vIFBhdXNlcyBhdXRvcGxheSB3aGVuIGEgZG90IGlzIGhvdmVyZWRcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlOiBudWxsLCAvLyBCcmVha3BvaW50IHRyaWdnZXJlZCBzZXR0aW5nc1xyXG4gICAgICAgICAgICAgICAgICAgIHJ0bDogJCgnYm9keScpLmhhc0NsYXNzKCdydGwnKSA/IHRydWUgOiBmYWxzZSwgLy8gQ2hhbmdlIHRoZSBzbGlkZXIncyBkaXJlY3Rpb24gdG8gYmVjb21lIHJpZ2h0LXRvLWxlZnRcclxuICAgICAgICAgICAgICAgICAgICBzbGlkZTogJy5zbGlkZScsIC8vIFNsaWRlIGVsZW1lbnQgcXVlcnlcclxuICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Nob3c6ICQodGhpcykuZGF0YSgnbnVtLXNsaWRlcycpID8gJCh0aGlzKS5kYXRhKCdudW0tc2xpZGVzJykgOiAxLCAvLyAjIG9mIHNsaWRlcyB0byBzaG93IGF0IGEgdGltZVxyXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlc1RvU2Nyb2xsOiAkKHRoaXMpLmRhdGEoJ251bS1zY3JvbGwnKSA/ICQodGhpcykuZGF0YSgnbnVtLXNjcm9sbCcpIDogMSwgLy8gIyBvZiBzbGlkZXMgdG8gc2hvdyBhdCBhIHRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3BlZWQ6IDUwMCwgLy8gVHJhbnNpdGlvbiBzcGVlZFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXBlOiB0cnVlLCAvLyBFbmFibGVzIHRvdWNoIHN3aXBlXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpcGVUb1NsaWRlOiBmYWxzZSwgLy8gU3dpcGUgdG8gc2xpZGUgaXJyZXNwZWN0aXZlIG9mIHNsaWRlc1RvU2Nyb2xsXHJcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hNb3ZlOiB0cnVlLCAvLyBFbmFibGVzIHNsaWRlIG1vdmluZyB3aXRoIHRvdWNoXHJcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hUaHJlc2hvbGQ6IDUsIC8vIFRvIGFkdmFuY2Ugc2xpZGVzLCB0aGUgdXNlciBtdXN0IHN3aXBlIGEgbGVuZ3RoIG9mICgxL3RvdWNoVGhyZXNob2xkKSAqIHRoZSB3aWR0aCBvZiB0aGUgc2xpZGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIHVzZUNTUzogdHJ1ZSwgLy8gRW5hYmxlL0Rpc2FibGUgQ1NTIFRyYW5zaXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aDogJCh0aGlzKS5kYXRhKCd2YXJpYWJsZS13aWR0aCcpID8gdHJ1ZSA6IGZhbHNlLCAvLyBEaXNhYmxlcyBhdXRvbWF0aWMgc2xpZGUgd2lkdGggY2FsY3VsYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbDogZmFsc2UsIC8vIFZlcnRpY2FsIHNsaWRlIGRpcmVjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHdhaXRGb3JBbmltYXRlOiB0cnVlIC8vIElnbm9yZXMgcmVxdWVzdHMgdG8gYWR2YW5jZSB0aGUgc2xpZGUgd2hpbGUgYW5pbWF0aW5nXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvcm1XaXphcmQoKSB7XHJcblxyXG4gICAgICAgIGlmICgkKCcud2l6YXJkJykubGVuZ3RoICYmICQuZm4uc3RlcEZvcm1XaXphcmQpIHtcclxuICAgICAgICAgICAgJCgnLndpemFyZCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEkKHRoaXMpLmRhdGEoJ2luaXRpYXRlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5zdGVwRm9ybVdpemFyZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lOiAkKHRoaXMpLmRhdGEoJ3N0eWxlJykgPyAkKHRoaXMpLmRhdGEoJ3N0eWxlJykgOiBcImNpcmNsZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93TmF2OiAkKHRoaXMpLmRhdGEoJ25hdicpID8gJCh0aGlzKS5kYXRhKCduYXYnKSA6IFwidG9wXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogXCJhdXRvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ0bDogJCgnYm9keScpLmhhc0NsYXNzKCdydGwnKSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25OZXh0OiBmdW5jdGlvbiAoaSwgd2l6YXJkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoJ3dpemFyZC12YWxpZGF0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCgnZm9ybScsIHdpemFyZCkucGFyc2xleSgpLnZhbGlkYXRlKCdibG9jaycgKyBpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5pc2g6IGZ1bmN0aW9uIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoJ3dpemFyZC12YWxpZGF0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCgnZm9ybScsIHdpemFyZCkucGFyc2xleSgpLnZhbGlkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YSgnaW5pdGlhdGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLyogRml4IGlzc3VlIG9ubHkgd2l0aCB0YWJzIHdpdGggVmFsaWRhdGlvbiBvbiBlcnJvciBzaG93ICovXHJcbiAgICAgICAgICAgICQoJyN2YWxpZGF0aW9uIC53aXphcmQgLnNmLWJ0bicpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQod2luZG93KS5yZXNpemUoKTtcclxuICAgICAgICAgICAgICAgICAgICAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XHJcbiAgICAgICAgICAgICAgICB9LCA1MCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gZm9ybVZhbGlkYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKCQoJy5mb3JtLXZhbGlkYXRpb24nKS5sZW5ndGggJiYgJC5mbi52YWxpZGF0ZSkge1xyXG4gICAgICAgICAgICAvKiBXZSBhZGQgYW4gYWRkaXRpb24gcnVsZSB0byBzaG93IHlvdS4gRXhhbXBsZSA6IDQgKyA4LiBZb3UgY2FuIG90aGVyIHJ1bGVzIGlmIHlvdSB3YW50ICovXHJcbiAgICAgICAgICAgICQudmFsaWRhdG9yLm1ldGhvZHMub3BlcmF0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBlbGVtZW50LCBwYXJhbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IHBhcmFtO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAkLnZhbGlkYXRvci5tZXRob2RzLmN1c3RvbWVtYWlsID0gZnVuY3Rpb24gKHZhbHVlLCBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gL14oWy0wLTlhLXpBLVouK19dK0BbLTAtOWEtekEtWi4rX10rXFwuW2EtekEtWl17Miw0fSkrJC8udGVzdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICQoJy5mb3JtLXZhbGlkYXRpb24nKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JtVmFsaWRhdGlvbiA9ICQodGhpcykudmFsaWRhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IFwidmFsaWRcIixcclxuICAgICAgICAgICAgICAgICAgICBzdWJtaXRIYW5kbGVyOiBmdW5jdGlvbiAoKSB7IGFsZXJ0KFwiRm9ybSBpcyB2YWxpZCEgV2Ugc3VibWl0IGl0XCIpIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDbGFzczogXCJmb3JtLWVycm9yXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRDbGFzczogXCJmb3JtLXN1Y2Nlc3NcIixcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckVsZW1lbnQ6IFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBydWxlczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXI6IHsgZXh0ZW5zaW9uOiBcImpwZ3xwbmd8Z2lmfGpwZWd8ZG9jfGRvY3h8cGRmfHhsc3xyYXJ8emlwXCIgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQyOiB7IGVxdWFsVG86ICcjcGFzc3dvcmQnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bDogeyBvcGVyYXRpb246IDEyIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogeyB1cmw6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbCgkLnRyaW0oJCh0aGlzKS52YWwoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZW1haWw6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHsgcmVxdWlyZWQ6ICdFbnRlciB5b3VyIG5hbWUnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RuYW1lOiB7IHJlcXVpcmVkOiAnRW50ZXIgeW91ciBsYXN0IG5hbWUnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0bmFtZTogeyByZXF1aXJlZDogJ0VudGVyIHlvdXIgZmlyc3QgbmFtZScgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IHsgcmVxdWlyZWQ6ICdFbnRlciBlbWFpbCBhZGRyZXNzJywgY3VzdG9tZW1haWw6ICdFbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiB7IHJlcXVpcmVkOiAnRW50ZXIgeW91ciBsYW5ndWFnZScgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlOiB7IHJlcXVpcmVkOiAnRW50ZXIgeW91ciBwaG9uZSBudW1iZXInIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcjogeyByZXF1aXJlZDogJ1lvdSBtdXN0IHVwbG9hZCB5b3VyIGF2YXRhcicgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHsgcmVxdWlyZWQ6ICdXcml0ZSB5b3VyIHBhc3N3b3JkJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDI6IHsgcmVxdWlyZWQ6ICdXcml0ZSB5b3VyIHBhc3N3b3JkJywgZXF1YWxUbzogJzIgcGFzc3dvcmRzIG11c3QgYmUgdGhlIHNhbWUnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bDogeyByZXF1aXJlZDogJ0VudGVyIHRoZSByZXN1bHQgb2YgNCArIDgnLCBvcGVyYXRpb246ICdSZXN1bHQgaXMgZmFsc2UuIFRyeSBhZ2FpbiEnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zOiB7IHJlcXVpcmVkOiAnWW91IG11c3QgYWdyZWUgd2l0aCB0ZXJtcycgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoZWxlbWVudCwgZXJyb3JDbGFzcywgdmFsaWRDbGFzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNsb3Nlc3QoJy5mb3JtLWNvbnRyb2wnKS5hZGRDbGFzcyhlcnJvckNsYXNzKS5yZW1vdmVDbGFzcyh2YWxpZENsYXNzKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHVuaGlnaGxpZ2h0OiBmdW5jdGlvbiAoZWxlbWVudCwgZXJyb3JDbGFzcywgdmFsaWRDbGFzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNsb3Nlc3QoJy5mb3JtLWNvbnRyb2wnKS5yZW1vdmVDbGFzcyhlcnJvckNsYXNzKS5hZGRDbGFzcyh2YWxpZENsYXNzKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yUGxhY2VtZW50OiBmdW5jdGlvbiAoZXJyb3IsIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoXCJjdXN0b20tZmlsZVwiKSB8fCBlbGVtZW50Lmhhc0NsYXNzKFwiY2hlY2tib3gtdHlwZVwiKSB8fCBlbGVtZW50Lmhhc0NsYXNzKFwibGFuZ3VhZ2VcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xvc2VzdCgnLm9wdGlvbi1ncm91cCcpLmFmdGVyKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LmlzKFwiOnJhZGlvXCIpIHx8IGVsZW1lbnQuaXMoXCI6Y2hlY2tib3hcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xvc2VzdCgnLm9wdGlvbi1ncm91cCcpLmFmdGVyKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LnBhcmVudCgpLmhhc0NsYXNzKCdpbnB1dC1ncm91cCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudCgpLmFmdGVyKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmluc2VydEFmdGVyKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkSGFuZGxlcjogZnVuY3Rpb24gKGV2ZW50LCB2YWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRvci5udW1iZXJPZkludmFsaWRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAkKFwiLmZvcm0tdmFsaWRhdGlvbiAuY2FuY2VsXCIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsaWRhdGlvbi5yZXNldEZvcm0oKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKiogIEFuaW1hdGVkIFBhbmVscyAgKioqKi9cclxuICAgIGZ1bmN0aW9uIGxpdmVUaWxlKCkge1xyXG5cclxuICAgICAgICBpZiAoJCgnLmxpdmUtdGlsZScpLmxlbmd0aCAmJiAkLmZuLmxpdmVUaWxlKSB7XHJcbiAgICAgICAgICAgICQoJy5saXZlLXRpbGUnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykubGl2ZVRpbGUoXCJkZXN0cm95XCIsIHRydWUpOyAvKiBUbyBnZXQgbmV3IHNpemUgaWYgcmVzaXplIGV2ZW50ICovXHJcbiAgICAgICAgICAgICAgICB0aWxlX2hlaWdodCA9ICQodGhpcykuZGF0YShcImhlaWdodFwiKSA/ICQodGhpcykuZGF0YShcImhlaWdodFwiKSA6ICQodGhpcykuZmluZCgnLnBhbmVsLWJvZHknKS5oZWlnaHQoKSArIDUyO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5oZWlnaHQodGlsZV9oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5saXZlVGlsZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BlZWQ6ICQodGhpcykuZGF0YShcInNwZWVkXCIpID8gJCh0aGlzKS5kYXRhKFwic3BlZWRcIikgOiA1MDAsIC8vIFN0YXJ0IGFmdGVyIGxvYWQgb3Igbm90XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJCh0aGlzKS5kYXRhKFwiYW5pbWF0aW9uLWVhc2luZ1wiKSA/ICQodGhpcykuZGF0YShcImFuaW1hdGlvbi1lYXNpbmdcIikgOiAnY2Fyb3VzZWwnLCAvLyBBbmltYXRpb24gdHlwZTogY2Fyb3VzZWwsIHNsaWRlLCBmYWRlLCBmbGlwLCBub25lXHJcbiAgICAgICAgICAgICAgICAgICAgcGxheU9uSG92ZXI6ICQodGhpcykuZGF0YShcInBsYXktaG92ZXJcIikgPyAkKHRoaXMpLmRhdGEoXCJwbGF5LWhvdmVyXCIpIDogZmFsc2UsIC8vIFBsYXkgbGl2ZSB0aWxlIG9uIGhvdmVyXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQ6ICQodGhpcykuZGF0YShcInJlcGVhdC1jb3VudFwiKSA/ICQodGhpcykuZGF0YShcInJlcGVhdC1jb3VudFwiKSA6IC0xLCAvLyBSZXBlYXQgb3Igbm90ICgtMSBpcyBpbmZpbml0ZVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5OiAkKHRoaXMpLmRhdGEoXCJkZWxheVwiKSA/ICQodGhpcykuZGF0YShcImRlbGF5XCIpIDogMCwgLy8gVGltZSBiZXR3ZWVuIHR3byBhbmltYXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnROb3c6ICQodGhpcykuZGF0YShcInN0YXJ0LW5vd1wiKSA/ICQodGhpcykuZGF0YShcInN0YXJ0LW5vd1wiKSA6IHRydWUsIC8vU3RhcnQgYWZ0ZXIgbG9hZCBvciBub3RcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKiogQmFyIENoYXJ0czogQ0hBUlRKUyAqKioqL1xyXG4gICAgZnVuY3Rpb24gYmFyQ2hhcnRzKCkge1xyXG4gICAgICAgIGlmICgkKCcuYmFyLXN0YXRzJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICQoJy5iYXItc3RhdHMnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciByYW5kb21TY2FsaW5nRmFjdG9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwKSB9O1xyXG4gICAgICAgICAgICAgICAgdmFyIGN1c3RvbV9jb2xvcnMgPSBbJyNDOTYyNUYnLCAnIzE4QTY4OScsICcjOTBlZDdkJywgJyNmN2EzNWMnLCAnIzgwODVlOScsICcjZjE1YzgwJywgJyM4MDg1ZTgnLCAnIzkxZThlMSddO1xyXG4gICAgICAgICAgICAgICAgdmFyIGN1c3RvbV9jb2xvciA9IGN1c3RvbV9jb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY3VzdG9tX2NvbG9ycy5sZW5ndGgpXTtcclxuICAgICAgICAgICAgICAgIHZhciBiYXJDaGFydERhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIiwgXCIxMFwiLCBcIjExXCIsIFwiMTJcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldHM6IFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogY3VzdG9tX2NvbG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogY3VzdG9tX2NvbG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRGaWxsOiBcIiMzOTQyNDhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0U3Ryb2tlOiBcIiMzOTQyNDhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogW3JhbmRvbVNjYWxpbmdGYWN0b3IoKSwgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLCByYW5kb21TY2FsaW5nRmFjdG9yKCksIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSwgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLCByYW5kb21TY2FsaW5nRmFjdG9yKCksIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSwgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLCByYW5kb21TY2FsaW5nRmFjdG9yKCksIHJhbmRvbVNjYWxpbmdGYWN0b3IoKSwgcmFuZG9tU2NhbGluZ0ZhY3RvcigpLCByYW5kb21TY2FsaW5nRmFjdG9yKCldXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBjdHggPSAkKHRoaXMpLmdldCgwKS5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlCYXIgPSBuZXcgQ2hhcnQoY3R4KS5CYXIoYmFyQ2hhcnREYXRhLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzY2FsZVNob3dMYWJlbHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dTY2FsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzY2FsZUxpbmVDb2xvcjogXCJyZ2JhKDAsMCwwLC4xKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjYWxlU2hvd0dyaWRMaW5lczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGFuaW1hdGVOdW1iZXIoKSB7XHJcbiAgICAgICAgJCgnLmNvdW50dXAnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZnJvbSA9ICQodGhpcykuZGF0YShcImZyb21cIikgPyAkKHRoaXMpLmRhdGEoXCJmcm9tXCIpIDogMDtcclxuICAgICAgICAgICAgdG8gPSAkKHRoaXMpLmRhdGEoXCJ0b1wiKSA/ICQodGhpcykuZGF0YShcInRvXCIpIDogMTAwO1xyXG4gICAgICAgICAgICBkdXJhdGlvbiA9ICQodGhpcykuZGF0YShcImR1cmF0aW9uXCIpID8gJCh0aGlzKS5kYXRhKFwiZHVyYXRpb25cIikgOiAyO1xyXG4gICAgICAgICAgICBkZWxheSA9ICQodGhpcykuZGF0YShcImRlbGF5XCIpID8gJCh0aGlzKS5kYXRhKFwiZGVsYXlcIikgOiAxMDAwO1xyXG4gICAgICAgICAgICBkZWNpbWFscyA9ICQodGhpcykuZGF0YShcImRlY2ltYWxzXCIpID8gJCh0aGlzKS5kYXRhKFwiZGVjaW1hbHNcIikgOiAwO1xyXG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHVzZUVhc2luZzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHVzZUdyb3VwaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VwYXJhdG9yOiAnLCcsXHJcbiAgICAgICAgICAgICAgICBwcmVmaXg6ICQodGhpcykuZGF0YShcInByZWZpeFwiKSA/ICQodGhpcykuZGF0YShcIuKAg+KAg3ByZWZpeFwiKSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgc3VmZml4OiAkKHRoaXMpLmRhdGEoXCJzdWZmaXhcIikgPyAkKHRoaXMpLmRhdGEoXCJzdWZmaXhcIikgOiAnJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBudW1BbmltID0gbmV3IGNvdW50VXAoJCh0aGlzKS5nZXQoMCksIGZyb20sIHRvLCBkZWNpbWFscywgZHVyYXRpb24sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIG51bUFuaW0uc3RhcnQoKTtcclxuICAgICAgICAgICAgfSwgZGVsYXkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRleHRhcmVhQXV0b3NpemUoKSB7XHJcbiAgICAgICAgJCgndGV4dGFyZWEuYXV0b3NpemUnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5hdXRvc2l6ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqICBPbiBSZXNpemUgRnVuY3Rpb25zICAqKioqL1xyXG4gICAvKiAkKHdpbmRvdykuYmluZCgncmVzaXplJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICB3aW5kb3cucmVzaXplRXZ0O1xyXG4gICAgICAgICQod2luZG93KS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQod2luZG93LnJlc2l6ZUV2dCk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZXNpemVFdnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9LCAyNTApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7Ki9cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGlucHV0U2VsZWN0OiBpbnB1dFNlbGVjdCxcclxuICAgICAgICBzb3J0YWJsZVBvcnRsZXRzOiBzb3J0YWJsZVBvcnRsZXRzLFxyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLyoqKiogIFZhcmlhYmxlcyBJbml0aWF0aW9uICAqKioqL1xyXG4gICAgICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgICAgIHZhciBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgICAgICAgICAgdmFyICRzaWRlYmFyID0gJCgnLnNpZGViYXInKTtcclxuICAgICAgICAgICAgdmFyICRtYWluQ29udGVudCA9ICQoJy5tYWluLWNvbnRlbnQnKTtcclxuICAgICAgICAgICAgdmFyICRzaWRlYmFyV2lkdGggPSAkKFwiLnNpZGViYXJcIikud2lkdGgoKTtcclxuICAgICAgICAgICAgdmFyIGlzX1JUTCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygncnRsJykpIGlzX1JUTCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICB2YXIgb2xkSW5kZXg7XHJcbiAgICAgICAgICAgLyogaWYgKCQoJy5zb3J0YWJsZScpLmxlbmd0aCAmJiAkLmZuLnNvcnRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiLnNvcnRhYmxlXCIpLnNvcnRhYmxlKHtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IFwiLnBhbmVsLWhlYWRlclwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQsIHVpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZEluZGV4ID0gdWkuaXRlbS5pbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5wbGFjZWhvbGRlci5oZWlnaHQodWkuaXRlbS5oZWlnaHQoKSAtIDIwKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uIChldmVudCwgdWkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0luZGV4ID0gdWkuaXRlbS5pbmRleCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vdmluZ0ZvcndhcmQgPSBuZXdJbmRleCA+IG9sZEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gbmV3SW5kZXggKyAobW92aW5nRm9yd2FyZCA/IC0xIDogMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSAkKCcuc29ydGFibGUgPiBkaXYnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgdG8gbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVRvTW92ZSA9IGl0ZW1zLmdldChuZXh0SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVRvTW92ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgYXQgdGhlIGluZGV4IHdoZXJlIHdlIHdhbnQgdG8gbW92ZSB0aGUgaXRlbVRvTW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0xvY2F0aW9uID0gJChpdGVtcy5nZXQob2xkSW5kZXgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWNpZGUgaWYgaXQgZ29lcyBiZWZvcmUgb3IgYWZ0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdGb3J3YXJkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpdGVtVG9Nb3ZlKS5pbnNlcnRCZWZvcmUobmV3TG9jYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGl0ZW1Ub01vdmUpLmluc2VydEFmdGVyKG5ld0xvY2F0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiovXHJcbiAgICAgICAgICAgIC8vc29ydGFibGVQb3J0bGV0cygpO1xyXG4gICAgICAgICAgIC8vIHNvcnRhYmxlVGFibGUoKTtcclxuICAgICAgICAgLy8gICBuZXN0YWJsZSgpO1xyXG4gICAgICAgICAgIC8vIHNob3dUb29sdGlwKCk7XHJcbiAgICAgICAgICAgLy8gcG9wb3ZlcigpO1xyXG4gICAgICAgICAvLyAgIGNvbG9yUGlja2VyKCk7XHJcbiAgICAgICAgIC8vICAgbnVtZXJpY1N0ZXBwZXIoKTtcclxuICAgICAgICAgLy8gICBpb3NTd2l0Y2goKTtcclxuICAgICAgICAgICAgLy9zbGlkZXJJT1MoKTtcclxuICAgICAgICAgICAvLyByYW5nZVNsaWRlcigpO1xyXG4gICAgICAgIC8vICAgIGJ1dHRvbkxvYWRlcigpO1xyXG4gICAgICAgICAgIC8vIGlucHV0U2VsZWN0KCk7XHJcbiAgICAgICAgICAgIC8vaW5wdXRUYWdzKCk7XHJcbiAgICAgICAgLy8gICAgdGFibGVSZXNwb25zaXZlKCk7XHJcbiAgICAgICAgLy8gICAgdGFibGVEeW5hbWljKCk7XHJcbiAgICAgICAgICAgLy8gaGFuZGxlaUNoZWNrKCk7XHJcbiAgICAgICAgIC8vICAgdGltZXBpY2tlcigpO1xyXG4gICAgICAgICAvLyAgIGRhdGVwaWNrZXIoKTtcclxuICAgICAgICAvLyAgICBiRGF0ZXBpY2tlcigpO1xyXG4gICAgICAgICAvLyAgIG11bHRpRGF0ZXNQaWNrZXIoKTtcclxuICAgICAgICAgLy8gICBkYXRldGltZXBpY2tlcigpO1xyXG4gICAgICAgICAvLyAgIHJhdGluZygpO1xyXG4gICAgICAgICAgLy8gIG1hZ25pZmljUG9wdXAoKTtcclxuICAgICAgICAgIC8vICBlZGl0b3JTdW1tZXJub3RlKCk7XHJcbiAgICAgICAgICAvLyAgZWRpdG9yQ0tFKCk7XHJcbiAgICAgICAgICAgIC8vc2xpZGVyKCk7XHJcbiAgICAgICAgICAvLyAgbGl2ZVRpbGUoKTtcclxuICAgICAgICAgICAvLyBmb3JtV2l6YXJkKCk7XHJcbiAgICAgICAgIC8vICAgZm9ybVZhbGlkYXRpb24oKTtcclxuICAgICAgICAgLy8gICBiYXJDaGFydHMoKTtcclxuICAgICAgICAgLy8gICBhbmltYXRlTnVtYmVyKCk7XHJcbiAgICAgICAgLy8gICAgdGV4dGFyZWFBdXRvc2l6ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1dKTsiLCIvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQVQgTUVOVSBTSURFQkFSICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vXHJcbmFuZ3VsYXIubW9kdWxlKCduZXdBcHAnKVxyXG4gIC5mYWN0b3J5KCdxdWlja1ZpZXdTZXJ2aWNlJywgW2Z1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIHF1aWNrdmlld1NpZGViYXIoKSB7XHJcblxyXG4gICAgICAgICAgZnVuY3Rpb24gdG9nZ2xlcVF1aWNrdmlldygpIHtcclxuICAgICAgICAgICAgICAkKCcjcXVpY2t2aWV3LXRvZ2dsZScpLmNsaWNrKGZ1bmN0aW9uIChlKSB7Ly9cclxuICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOy8vXHJcbiAgICAgICAgICAgICAgICAgIGlmICgkKCcjcXVpY2t2aWV3LXNpZGViYXInKS5oYXNDbGFzcygnb3BlbicpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgJCgnI2J1aWxkZXInKS5yZW1vdmVDbGFzcygnb3BlbicpO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCcjcXVpY2t2aWV3LXNpZGViYXInKS5hZGRDbGFzcygnb3BlbicpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICQoJy5jaGF0LWJhY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgJCgnLmNoYXQtY29udmVyc2F0aW9uJykucmVtb3ZlQ2xhc3MoJ2N1cnJlbnQnKTtcclxuICAgICAgICAgICAgICAkKCcuY2hhdC1ib2R5JykuYWRkQ2xhc3MoJ2N1cnJlbnQnKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICQoJy5jaGF0LWxpc3QnKS5vbignY2xpY2snLCAnbGknLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGNoYXRfbmFtZSA9ICQodGhpcykuZmluZCgnLnVzZXItbmFtZScpLmh0bWwoKTtcclxuICAgICAgICAgICAgICB2YXIgY2hhdF90eHQgPSAkKHRoaXMpLmZpbmQoJy51c2VyLXR4dCcpLmh0bWwoKTtcclxuICAgICAgICAgICAgICB2YXIgY2hhdF9zdGF0dXMgPSAkKHRoaXMpLmZpbmQoJy51c2VyLXN0YXR1cycpLmh0bWwoKTtcclxuICAgICAgICAgICAgICB2YXIgY2hhdF9pbWcgPSAkKHRoaXMpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycpO1xyXG4gICAgICAgICAgICAgICQoJy5jaGF0LWNvbnZlcnNhdGlvbiAudXNlci1uYW1lJykuaHRtbChjaGF0X25hbWUpO1xyXG4gICAgICAgICAgICAgICQoJy5jaGF0LWNvbnZlcnNhdGlvbiAudXNlci10eHQnKS5odG1sKGNoYXRfdHh0KTtcclxuICAgICAgICAgICAgICAkKCcuY2hhdC1jb252ZXJzYXRpb24gLnVzZXItc3RhdHVzJykuaHRtbChjaGF0X3N0YXR1cyk7XHJcbiAgICAgICAgICAgICAgJCgnLmNoYXQtY29udmVyc2F0aW9uIC51c2VyLWltZyBpbWcnKS5hdHRyKFwic3JjXCIsIGNoYXRfaW1nKTtcclxuICAgICAgICAgICAgICAkKCcuY2hhdC1jb252ZXJzYXRpb24gLmNvbnZlcnNhdGlvbi1ib2R5IC5jb252ZXJzYXRpb24taW1nIGltZycpLmF0dHIoXCJzcmNcIiwgY2hhdF9pbWcpO1xyXG5cclxuICAgICAgICAgICAgICAkKCcuY2hhdC1ib2R5JykucmVtb3ZlQ2xhc3MoJ2N1cnJlbnQnKTtcclxuICAgICAgICAgICAgICAkKCcuY2hhdC1jb252ZXJzYXRpb24nKS5hZGRDbGFzcygnY3VycmVudCcpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLyogT3BlbiAvIENsb3NlIHJpZ2h0IHNpZGViYXIgKi9cclxuICAgICAgICAgICQoJyNxdWlja3ZpZXctdG9nZ2xlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgey8vXHJcbiAgICAgICAgICAgICAgJCgnI2NoYXQtbm90aWZpY2F0aW9uJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAkKCcubW0tcGFuZWwgLmJhZGdlLWRhbmdlcicpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnaGlkZScpLmFkZENsYXNzKCdhbmltYXRlZCBib3VuY2VJbicpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8qIFJlbW92ZSBjdXJyZW50IG1lc3NhZ2Ugd2hlbiBvcGVuaW5nICovXHJcbiAgICAgICAgICAkKCcuaGF2ZS1tZXNzYWdlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2hhdmUtbWVzc2FnZScpO1xyXG4gICAgICAgICAgICAgICQodGhpcykuZmluZCgnLmJhZGdlLWRhbmdlcicpLmZhZGVPdXQoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8qIFNlbmQgbWVzc2FnZXMgKi9cclxuICAgICAgICAgICQoJy5zZW5kLW1lc3NhZ2UnKS5rZXlwcmVzcyhmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHtcclxuICAgICAgICAgICAgICAgICAgdmFyIGNoYXRfbWVzc2FnZSA9ICc8bGkgY2xhc3M9XCJpbWdcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICc8c3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2hhdC1kZXRhaWwgY2hhdC1yaWdodFwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgJzxpbWcgc3JjPVwiLi4vaW1hZ2VzL2F2YXRhcnMvYXZhdGFyMS5wbmdcIiBkYXRhLXJldGluYS1zcmM9XCIuLi9pbWFnZXMvYXZhdGFycy9hdmF0YXIxXzJ4LnBuZ1wiLz4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2hhdC1kZXRhaWxcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2hhdC1idWJibGVcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICQodGhpcykudmFsKCkgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICc8L2xpPic7XHJcbiAgICAgICAgICAgICAgICAgICQoY2hhdF9tZXNzYWdlKS5oaWRlKCkuYXBwZW5kVG8oJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcuY29udmVyc2F0aW9uLWJvZHkgdWwnKSkuZmFkZUluKCk7XHJcbiAgICAgICAgICAgICAgICAgICQodGhpcykudmFsKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICBxdWlja3ZpZXdIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgICAgY3VzdG9tU2Nyb2xsKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICQoJy5tYWluLWNvbnRlbnQnKS5jbGljayhmdW5jdGlvbiAoZXYpIHtcclxuICAgICAgICAgICAgICBjaGF0U2lkZWJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWlja3ZpZXctc2lkZWJhcicpO1xyXG4gICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBldi50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gY2hhdFNpZGViYXIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCQoJyNxdWlja3ZpZXctc2lkZWJhcicpLmhhc0NsYXNzKCdvcGVuJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJyNxdWlja3ZpZXctc2lkZWJhcicpLmFkZENsYXNzKCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCcjcXVpY2t2aWV3LXNpZGViYXInKS5yZW1vdmVDbGFzcygnb3BlbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3F1aWNrdmlldy1zaWRlYmFyJykucmVtb3ZlQ2xhc3MoJ2Nsb3NpbmcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0sIDQwMCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAoJCgnLnNldHRpbmdzLWNoYXJ0IC5wcm9ncmVzcy1iYXInKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAkKCcuc2V0dGluZ3MtdGFiJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1jaGFydCAuc2V0dGluZzEnKS5wcm9ncmVzc2JhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15UmFkYXIgPSBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZXR0aW5nLWNoYXJ0XCIpLmdldENvbnRleHQoXCIyZFwiKSkuUmFkYXIocmFkYXJDaGFydERhdGEsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBDb3JuZXJSYWRpdXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uU3RlcHM6IDYwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLWNoYXJ0IC5zZXR0aW5nMicpLnByb2dyZXNzYmFyKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0sIDQwMCk7XHJcblxyXG5cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgLyogUmFkYXIgQ2hhcnQgKi9cclxuICAgICAgICAgIHZhciByYWRhckNoYXJ0RGF0YSA9IHtcclxuICAgICAgICAgICAgICBsYWJlbHM6IFtcIkVhdGluZ1wiLCBcIkRyaW5raW5nXCIsIFwiU2xlZXBpbmdcIiwgXCJEZXNpZ25pbmdcIiwgXCJDb2RpbmdcIiwgXCJDeWNsaW5nXCIsIFwiUnVubmluZ1wiXSxcclxuICAgICAgICAgICAgICBkYXRhc2V0czogW1xyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJNeSBTZWNvbmQgZGF0YXNldFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiBcInJnYmEoMTUxLDE4NywyMDUsMC4yKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IFwicmdiYSgxNTEsMTg3LDIwNSwxKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcG9pbnRDb2xvcjogXCJyZ2JhKDE1MSwxODcsMjA1LDEpXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwb2ludFN0cm9rZUNvbG9yOiBcIiNmZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgIHBvaW50SGlnaGxpZ2h0RmlsbDogXCIjZmZmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwb2ludEhpZ2hsaWdodFN0cm9rZTogXCJyZ2JhKDE1MSwxODcsMjA1LDEpXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBbMzgsIDQ4LCA0MCwgODksIDk2LCAyNywgOTBdXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRvZ2dsZXFRdWlja3ZpZXcoKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIGZ1bmN0aW9uIHF1aWNrdmlld0hlaWdodCgpIHtcclxuICAgICAgICAgICQoJy5jaGF0LWNvbnZlcnNhdGlvbicpLmhlaWdodCgnJyk7XHJcbiAgICAgICAgICBjaGF0Q29udmVyc2F0aW9uSGVpZ2h0ID0gJCgnLmNoYXQtY29udmVyc2F0aW9uJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgICB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7XHJcbiAgICAgICAgICBpZiAoY2hhdENvbnZlcnNhdGlvbkhlaWdodCA8IHdpbmRvd0hlaWdodCkge1xyXG4gICAgICAgICAgICAgICQoJy5jaGF0LWNvbnZlcnNhdGlvbicpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkgLSA1MCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qKioqICBPbiBSZXNpemUgRnVuY3Rpb25zICAqKioqL1xyXG4gICAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIG5vdGVUZXh0YXJlYSgpO1xyXG4gICAgICAgICAgcXVpY2t2aWV3SGVpZ2h0KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICBxdWlja3ZpZXdTaWRlYmFyKCk7XHJcbiAgICAgICAgICAgICAgcXVpY2t2aWV3SGVpZ2h0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgfV0pOyIsIi8qKlxyXG4gKiBFbmhhbmNlZCBTZWxlY3QyIERyb3BtZW51c1xyXG4gKlxyXG4gKiBAQUpBWCBNb2RlIC0gV2hlbiBpbiB0aGlzIG1vZGUsIHlvdXIgdmFsdWUgd2lsbCBiZSBhbiBvYmplY3QgKG9yIGFycmF5IG9mIG9iamVjdHMpIG9mIHRoZSBkYXRhIHVzZWQgYnkgU2VsZWN0MlxyXG4gKiAgICAgVGhpcyBjaGFuZ2UgaXMgc28gdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gZG8gYW4gYWRkaXRpb25hbCBxdWVyeSB5b3Vyc2VsZiBvbiB0b3Agb2YgU2VsZWN0MidzIG93biBxdWVyeVxyXG4gKiBAcGFyYW1zIFtvcHRpb25zXSB7b2JqZWN0fSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHBhc3NlZCB0byAkLmZuLnNlbGVjdDIoKS4gUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb25cclxuICovXHJcbmFuZ3VsYXIubW9kdWxlKCd1aS5zZWxlY3QyJywgW10pLnZhbHVlKCd1aVNlbGVjdDJDb25maWcnLCB7fSkuZGlyZWN0aXZlKCd1aVNlbGVjdDInLCBbJ3VpU2VsZWN0MkNvbmZpZycsICckdGltZW91dCcsIGZ1bmN0aW9uICh1aVNlbGVjdDJDb25maWcsICR0aW1lb3V0KSB7XHJcbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xyXG4gICAgaWYgKHVpU2VsZWN0MkNvbmZpZykge1xyXG4gICAgICAgIGFuZ3VsYXIuZXh0ZW5kKG9wdGlvbnMsIHVpU2VsZWN0MkNvbmZpZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJlcXVpcmU6ICduZ01vZGVsJyxcclxuICAgICAgICBwcmlvcml0eTogMSxcclxuICAgICAgICBjb21waWxlOiBmdW5jdGlvbiAodEVsbSwgdEF0dHJzKSB7XHJcbiAgICAgICAgICAgIHZhciB3YXRjaCxcclxuICAgICAgICAgICAgICAgIHJlcGVhdE9wdGlvbixcclxuICAgICAgICAgICAgICAgIHJlcGVhdEF0dHIsXHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdCA9IHRFbG0uaXMoJ3NlbGVjdCcpLFxyXG4gICAgICAgICAgICAgICAgaXNNdWx0aXBsZSA9IGFuZ3VsYXIuaXNEZWZpbmVkKHRBdHRycy5tdWx0aXBsZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBFbmFibGUgd2F0Y2hpbmcgb2YgdGhlIG9wdGlvbnMgZGF0YXNldCBpZiBpbiB1c2VcclxuICAgICAgICAgICAgaWYgKHRFbG0uaXMoJ3NlbGVjdCcpKSB7XHJcbiAgICAgICAgICAgICAgICByZXBlYXRPcHRpb24gPSB0RWxtLmZpbmQoJ29wdGlvbltuZy1yZXBlYXRdLCBvcHRpb25bZGF0YS1uZy1yZXBlYXRdJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdE9wdGlvbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXBlYXRBdHRyID0gcmVwZWF0T3B0aW9uLmF0dHIoJ25nLXJlcGVhdCcpIHx8IHJlcGVhdE9wdGlvbi5hdHRyKCdkYXRhLW5nLXJlcGVhdCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoID0galF1ZXJ5LnRyaW0ocmVwZWF0QXR0ci5zcGxpdCgnfCcpWzBdKS5zcGxpdCgnICcpLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCBlbG0sIGF0dHJzLCBjb250cm9sbGVyKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZS1zcGVjaWZpYyBvcHRpb25zXHJcbiAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvcHRpb25zLCBzY29wZS4kZXZhbChhdHRycy51aVNlbGVjdDIpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgIENvbnZlcnQgZnJvbSBTZWxlY3QyIHZpZXctbW9kZWwgdG8gQW5ndWxhciB2aWV3LW1vZGVsLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB2YXIgY29udmVydFRvQW5ndWxhck1vZGVsID0gZnVuY3Rpb24oc2VsZWN0Ml9kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLnNpbXBsZV90YWdzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzZWxlY3QyX2RhdGEsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwucHVzaCh2YWx1ZS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gc2VsZWN0Ml9kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgQ29udmVydCBmcm9tIEFuZ3VsYXIgdmlldy1tb2RlbCB0byBTZWxlY3QyIHZpZXctbW9kZWwuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHZhciBjb252ZXJ0VG9TZWxlY3QyTW9kZWwgPSBmdW5jdGlvbihhbmd1bGFyX2RhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuZ3VsYXJfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5zaW1wbGVfdGFncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyX2RhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5wdXNoKHsnaWQnOiB2YWx1ZSwgJ3RleHQnOiB2YWx1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBhbmd1bGFyX2RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbDtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIDxzZWxlY3QgbXVsdGlwbGU+IGluc3RlYWRcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0cy5tdWx0aXBsZTtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0cy5pbml0U2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc011bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5tdWx0aXBsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBXYXRjaCB0aGUgbW9kZWwgZm9yIHByb2dyYW1tYXRpYyBjaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoKHRBdHRycy5uZ01vZGVsLCBmdW5jdGlvbihjdXJyZW50LCBvbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG9sZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLnNlbGVjdDIoJ3ZhbCcsIGNvbnRyb2xsZXIuJHZpZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3VmFsdWUgPSBjb250cm9sbGVyLiR2aWV3VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNTdHJpbmcodmlld1ZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3VmFsdWUgPSB2aWV3VmFsdWUuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLnNlbGVjdDIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJywgY29udmVydFRvU2VsZWN0Mk1vZGVsKHZpZXdWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc09iamVjdChjb250cm9sbGVyLiR2aWV3VmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbS5zZWxlY3QyKCdkYXRhJywgY29udHJvbGxlci4kdmlld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjb250cm9sbGVyLiR2aWV3VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLnNlbGVjdDIoJ2RhdGEnLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbG0uc2VsZWN0MigndmFsJywgY29udHJvbGxlci4kdmlld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRyZW5kZXIgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhdGNoIHRoZSBvcHRpb25zIGRhdGFzZXQgZm9yIGNoYW5nZXNcclxuICAgICAgICAgICAgICAgICAgICBpZiAod2F0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoKHdhdGNoLCBmdW5jdGlvbiAobmV3VmFsLCBvbGRWYWwsIHNjb3BlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5lcXVhbHMobmV3VmFsLCBvbGRWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXllZCBzbyB0aGF0IHRoZSBvcHRpb25zIGhhdmUgdGltZSB0byBiZSByZW5kZXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbS5zZWxlY3QyKCd2YWwnLCBjb250cm9sbGVyLiR2aWV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggYW5ndWxhciB0byByZW1vdmUgdGhlIHN1cGVyZmx1b3VzIG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdWYWwgJiYgIW9sZFZhbCAmJiBjb250cm9sbGVyLiRzZXRQcmlzdGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRzZXRQcmlzdGluZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdmFsaWQgYW5kIGRpcnR5IHN0YXR1c2VzXHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZWxtLnByZXYoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3MoJ25nLWludmFsaWQnLCAhY29udHJvbGxlci4kdmFsaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3MoJ25nLXZhbGlkJywgY29udHJvbGxlci4kdmFsaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3MoJ25nLWludmFsaWQtcmVxdWlyZWQnLCAhY29udHJvbGxlci4kdmFsaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3MoJ25nLXZhbGlkLXJlcXVpcmVkJywgY29udHJvbGxlci4kdmFsaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3MoJ25nLWRpcnR5JywgY29udHJvbGxlci4kZGlydHkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9nZ2xlQ2xhc3MoJ25nLXByaXN0aW5lJywgY29udHJvbGxlci4kcHJpc3RpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNTZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB2aWV3IGFuZCBtb2RlbCB2YWx1ZSBhbmQgdXBkYXRlIHRoZSBhbmd1bGFyIHRlbXBsYXRlIG1hbnVhbGx5IGZvciB0aGUgYWpheC9tdWx0aXBsZSBzZWxlY3QyLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbG0uYmluZChcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuJCRwaGFzZSB8fCBzY29wZS4kcm9vdC4kJHBoYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRzZXRWaWV3VmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb0FuZ3VsYXJNb2RlbChlbG0uc2VsZWN0MignZGF0YScpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5pbml0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdFNlbGVjdGlvbiA9IG9wdHMuaW5pdFNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWxlY3Rpb24oZWxlbWVudCwgZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuJHNldFZpZXdWYWx1ZShjb252ZXJ0VG9Bbmd1bGFyTW9kZWwodmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBlbG0uYmluZChcIiRkZXN0cm95XCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsbS5zZWxlY3QyKFwiZGVzdHJveVwiKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGF0dHJzLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsbS5zZWxlY3QyKCdlbmFibGUnLCAhdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYXR0cnMuJG9ic2VydmUoJ3JlYWRvbmx5JywgZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxtLnNlbGVjdDIoJ3JlYWRvbmx5JywgISF2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXR0cnMubmdNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5uZ011bHRpcGxlLCBmdW5jdGlvbihuZXdWYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuJHNldCgnbXVsdGlwbGUnLCAhIW5ld1ZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsbS5zZWxlY3QyKG9wdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiBsYXRlIHNvIHRoYXQgdGhlIGluamVjdGVkIERPTSBkb2VzIG5vdCBkaXNydXB0IHRoZSB0ZW1wbGF0ZSBjb21waWxlclxyXG4gICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsbS5zZWxlY3QyKG9wdHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZSAtIEknbSBub3Qgc3VyZSBhYm91dCB0aGlzIGJ1dCBpdCBzZWVtcyB0byBuZWVkIHRvIGJlIHRoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgZWxtLnZhbChjb250cm9sbGVyLiR2aWV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydGFudCFcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRyZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgaWYgSSBzaG91bGQganVzdCBjaGVjayBmb3IgIWlzU2VsZWN0IE9SIGlmIEkgc2hvdWxkIGNoZWNrIGZvciAndGFncycga2V5XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRzLmluaXRTZWxlY3Rpb24gJiYgIWlzU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuJHNldFZpZXdWYWx1ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb0FuZ3VsYXJNb2RlbChlbG0uc2VsZWN0MignZGF0YScpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1dKTtcclxuIiwiLypcclxuIEJvb3RzdHJhcCAtIEZpbGUgSW5wdXRcclxuID09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiBUaGlzIGlzIG1lYW50IHRvIGNvbnZlcnQgYWxsIGZpbGUgaW5wdXQgdGFncyBpbnRvIGEgc2V0IG9mIGVsZW1lbnRzIHRoYXQgZGlzcGxheXMgY29uc2lzdGVudGx5IGluIGFsbCBicm93c2Vycy5cclxuXHJcbiBDb252ZXJ0cyBhbGxcclxuIDxpbnB1dCB0eXBlPVwiZmlsZVwiPlxyXG4gaW50byBCb290c3RyYXAgYnV0dG9uc1xyXG4gPGEgY2xhc3M9XCJidG5cIj5Ccm93c2U8L2E+XHJcblxyXG4gKi9cclxuKGZ1bmN0aW9uICgkKSB7XHJcblxyXG4gICAgJC5mbi5ib290c3RyYXBGaWxlSW5wdXQgPSBmdW5jdGlvbiAoaW5wdXRCdXR0b25Xb3JkKSB7XHJcblxyXG4gICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoaSwgZWxlbSkge1xyXG5cclxuICAgICAgICAgICAgdmFyICRlbGVtID0gJChlbGVtKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE1heWJlIHNvbWUgZmllbGRzIGRvbid0IG5lZWQgdG8gYmUgc3RhbmRhcmRpemVkLlxyXG4gICAgICAgICAgICBpZiAodHlwZW9mICRlbGVtLmF0dHIoJ2RhdGEtYmZpLWRpc2FibGVkJykgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYnV0dG9uV29yZCA9IGlucHV0QnV0dG9uV29yZDtcclxuICAgICAgICAgICAgYnV0dG9uV29yZCA9ICd7e1wiJyArYnV0dG9uV29yZCsgJ1wifGkxOG59fSc7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mICRlbGVtLmF0dHIoJ3RpdGxlJykgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbldvcmQgPSAkZWxlbS5hdHRyKCd0aXRsZScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gJyc7XHJcblxyXG4gICAgICAgICAgICBpZiAoISEkZWxlbS5hdHRyKCdjbGFzcycpKSB7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnICcgKyAkZWxlbS5hdHRyKCdjbGFzcycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBOb3cgd2UncmUgZ29pbmcgdG8gd3JhcCB0aGF0IGlucHV0IGZpZWxkIHdpdGggYSBCb290c3RyYXAgYnV0dG9uLlxyXG4gICAgICAgICAgICAvLyBUaGUgaW5wdXQgd2lsbCBhY3R1YWxseSBzdGlsbCBiZSB0aGVyZSwgaXQgd2lsbCBqdXN0IGJlIGZsb2F0IGFib3ZlIGFuZCB0cmFuc3BhcmVudCAoZG9uZSB3aXRoIHRoZSBDU1MpLlxyXG4gICAgICAgICAgICAkZWxlbS53cmFwKCc8YSBjbGFzcz1cImZpbGUtaW5wdXQtd3JhcHBlciBidG4gYnRuLWRlZmF1bHQgJyArIGNsYXNzTmFtZSArICdcIj48L2E+JykucGFyZW50KCkucHJlcGVuZCgkKCc8c3BhbiBjbGFzcz1cImNsZWFyXCI+PC9zcGFuPicpLmh0bWwoYnV0dG9uV29yZCkpLnByZXBlbmQoJCgnPHNwYW4gY2xhc3M9XCJuYW1lXCI+PC9zcGFuPicpKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgLnByb21pc2UoKS5kb25lKGZ1bmN0aW9uICgpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAkKCcuZmlsZS1pbnB1dC13cmFwcGVyJykubW91c2Vtb3ZlKGZ1bmN0aW9uIChjdXJzb3IpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXQsIHdyYXBwZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlclgsIHdyYXBwZXJZLFxyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvclgsIGN1cnNvclk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyB3cmFwcGVyIGVsZW1lbnQgKHRoZSBidXR0b24gc3Vycm91bmQgdGhpcyBmaWxlIGlucHV0KVxyXG4gICAgICAgICAgICAgICAgd3JhcHBlciA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgaW52aXNpYmxlIGZpbGUgaW5wdXQgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKTtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBsZWZ0LW1vc3QgcG9zaXRpb24gb2YgdGhlIHdyYXBwZXJcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJYID0gd3JhcHBlci5vZmZzZXQoKS5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIHRvcC1tb3N0IHBvc2l0aW9uIG9mIHRoZSB3cmFwcGVyXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyWSA9IHdyYXBwZXIub2Zmc2V0KCkudG9wO1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIHdpdGggb2YgdGhlIGJyb3dzZXJzIGlucHV0IGZpZWxkXHJcbiAgICAgICAgICAgICAgICBpbnB1dFdpZHRoID0gaW5wdXQud2lkdGgoKTtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIGJyb3dzZXJzIGlucHV0IGZpZWxkXHJcbiAgICAgICAgICAgICAgICBpbnB1dEhlaWdodCA9IGlucHV0LmhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgLy9UaGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpbiB0aGUgd3JhcHBlclxyXG4gICAgICAgICAgICAgICAgY3Vyc29yWCA9IGN1cnNvci5wYWdlWDtcclxuICAgICAgICAgICAgICAgIGN1cnNvclkgPSBjdXJzb3IucGFnZVk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9UaGUgcG9zaXRpb25zIHdlIGFyZSB0byBtb3ZlIHRoZSBpbnZpc2libGUgZmlsZSBpbnB1dFxyXG4gICAgICAgICAgICAgICAgLy8gVGhlIDIwIGF0IHRoZSBlbmQgaXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBwaXhlbHMgdGhhdCB3ZSBjYW4gc2hpZnQgdGhlIGlucHV0IHN1Y2ggdGhhdCBjdXJzb3IgaXMgbm90IHBvaW50aW5nIGF0IHRoZSBlbmQgb2YgdGhlIEJyb3dzZSBidXR0b24gYnV0IHNvbWV3aGVyZSBuZWFyZXIgdGhlIG1pZGRsZVxyXG4gICAgICAgICAgICAgICAgbW92ZUlucHV0WCA9IGN1cnNvclggLSB3cmFwcGVyWCAtIGlucHV0V2lkdGggKyAyMDtcclxuICAgICAgICAgICAgICAgIC8vIFNsaWRlcyB0aGUgaW52aXNpYmxlIGlucHV0IEJyb3dzZSBidXR0b24gdG8gYmUgcG9zaXRpb25lZCBtaWRkbGUgdW5kZXIgdGhlIGN1cnNvclxyXG4gICAgICAgICAgICAgICAgbW92ZUlucHV0WSA9IGN1cnNvclkgLSB3cmFwcGVyWSAtIChpbnB1dEhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBwb3NpdGlvbmluZyBzdHlsZXMgdG8gYWN0dWFsbHkgbW92ZSB0aGUgaW52aXNpYmxlIGZpbGUgaW5wdXRcclxuICAgICAgICAgICAgICAgIGlucHV0LmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogbW92ZUlucHV0WCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IG1vdmVJbnB1dFlcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoJ2JvZHknKS5vbignY2hhbmdlJywgJy5maWxlLWlucHV0LXdyYXBwZXIgaW5wdXRbdHlwZT1maWxlXScsIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSA9ICQodGhpcykudmFsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBwcmV2aW91cyBmaWxlIG5hbWVzXHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLm5leHQoJy5maWxlLWlucHV0LW5hbWUnKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGlmICghISQodGhpcykucHJvcCgnZmlsZXMnKSAmJiAkKHRoaXMpLnByb3AoJ2ZpbGVzJykubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gJCh0aGlzKVswXS5maWxlcy5sZW5ndGggKyAnIGZpbGVzJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCdcXFxcJykgKyAxLCBmaWxlTmFtZS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byBzaG93IHRoZSBuYW1lIGlmIHRoZXJlIGlzIG5vbmVcclxuICAgICAgICAgICAgICAgIGlmICghZmlsZU5hbWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5zaWJsaW5ncygnLmNsZWFyJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuc2libGluZ3MoJy5uYW1lJykuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkRmlsZU5hbWVQbGFjZW1lbnQgPSAkKHRoaXMpLmRhdGEoJ2ZpbGVuYW1lLXBsYWNlbWVudCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRmlsZU5hbWVQbGFjZW1lbnQgPT09ICdpbnNpZGUnKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnNpYmxpbmdzKCcuY2xlYXInKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5zaWJsaW5ncygnLm5hbWUnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5zaWJsaW5ncygnLm5hbWUnKS5odG1sKGZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ3RpdGxlJywgZmlsZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcmludCB0aGUgZmlsZU5hbWUgYXNpZGUgKHJpZ2h0IGFmdGVyIHRoZSB0aGUgYnV0dG9uKVxyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50KCkuYWZ0ZXIoJzxzcGFuIGNsYXNzPVwiZmlsZS1pbnB1dC1uYW1lXCI+JyArIGZpbGVOYW1lICsgJzwvc3Bhbj4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICB9O1xyXG5cclxuLy8gQWRkIHRoZSBzdHlsZXMgYmVmb3JlIHRoZSBmaXJzdCBzdHlsZXNoZWV0XHJcbi8vIFRoaXMgZW5zdXJlcyB0aGV5IGNhbiBiZSBlYXNpbHkgb3ZlcnJpZGRlbiB3aXRoIGRldmVsb3BlciBzdHlsZXNcclxuICAgIHZhciBjc3NIdG1sID0gJzxzdHlsZT4nICtcclxuICAgICAgICAnLmZpbGUtaW5wdXQtd3JhcHBlciB7IG92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsgY3Vyc29yOiBwb2ludGVyOyB6LWluZGV4OiAxOyB9JyArXHJcbiAgICAgICAgJy5maWxlLWlucHV0LXdyYXBwZXIgaW5wdXRbdHlwZT1maWxlXSwgLmZpbGUtaW5wdXQtd3JhcHBlciBpbnB1dFt0eXBlPWZpbGVdOmZvY3VzLCAuZmlsZS1pbnB1dC13cmFwcGVyIGlucHV0W3R5cGU9ZmlsZV06aG92ZXIgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgY3Vyc29yOiBwb2ludGVyOyBvcGFjaXR5OiAwOyBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7IHotaW5kZXg6IDk5OyBvdXRsaW5lOiAwOyB9JyArXHJcbiAgICAgICAgJy5maWxlLWlucHV0LW5hbWUgeyBtYXJnaW4tbGVmdDogOHB4OyB9JyArXHJcbiAgICAgICAgJzwvc3R5bGU+JztcclxuICAgICQoJ2xpbmtbcmVsPXN0eWxlc2hlZXRdJykuZXEoMCkuYmVmb3JlKGNzc0h0bWwpO1xyXG5cclxufSkoalF1ZXJ5KTsiLCIvKmdsb2JhbCBhbmd1bGFyKi9cclxuXHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgYW5ndWxhclxyXG4gICAgICAgIC5tb2R1bGUoJ2FuZ3VsYXItY2xpY2stb3V0c2lkZScsIFtdKVxyXG4gICAgICAgIC5kaXJlY3RpdmUoJ2NsaWNrT3V0c2lkZScsIFsnJGRvY3VtZW50JywgJyRwYXJzZScsICckdGltZW91dCcsIGNsaWNrT3V0c2lkZV0pO1xyXG5cclxuICAgIHZhciBpPTA7XHJcbiAgICBmdW5jdGlvbiBjbGlja091dHNpZGUoJGRvY3VtZW50LCAkcGFyc2UsICR0aW1lb3V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJyxcclxuICAgICAgICAgICAgbGluazogZnVuY3Rpb24gKCRzY29wZSwgZWxlbSwgYXR0cikge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHBvc3Rwb25lIGxpbmtpbmcgdG8gbmV4dCBkaWdlc3QgdG8gYWxsb3cgZm9yIHVuaXF1ZSBpZCBnZW5lcmF0aW9uXHJcbiAgICAgICAgICAgICAgICB2YXIgaWRlbnRpdHk9aSsrO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5kYXRhKFwiaWRcIixpZGVudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNsYXNzTGlzdCA9IChhdHRyLm91dHNpZGVJZk5vdCAhPT0gdW5kZWZpbmVkKSA/IGF0dHIub3V0c2lkZUlmTm90LnJlcGxhY2UoJywgJywgJywnKS5zcGxpdCgnLCcpIDogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGVsZW1lbnRzIGlkIHNvIGl0IGlzIG5vdCBjb3VudGVkIGluIHRoZSBjbGljayBsaXN0ZW5pbmdcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5pZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5wdXNoKGF0dHIuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZXZlbnRIYW5kbGVyKGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIG91ciBlbGVtZW50IGFscmVhZHkgaGlkZGVuIGFuZCBhYm9ydCBpZiBzb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5lbGVtZW50KGVsZW0pLmhhc0NsYXNzKFwibmctaGlkZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY2xpY2sgdGFyZ2V0LCBubyBwb2ludCBnb2luZyBvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIWUudGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlIHx8IGUud2hpY2g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvZGUgPT0gMTMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBhdmFpbGFibGUgZWxlbWVudHMsIGxvb2tpbmcgZm9yIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QgdGhhdCBtaWdodCBtYXRjaCBhbmQgc28gd2lsbCBlYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlbGVtZW50ID0gZS50YXJnZXQ7IGVsZW1lbnQ7IGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGVsZW1lbnQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lcyA9IGVsZW1lbnQuY2xhc3NOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBjbGFzc0xpc3QubGVuZ3RoO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lcyAmJiBjbGFzc05hbWVzLmJhc2VWYWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMgPSBjbGFzc05hbWVzLmJhc2VWYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBlbGVtZW50cyBpZCdzIGFuZCBjbGFzc25hbWVzIGxvb2tpbmcgZm9yIGV4Y2VwdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgZXhhY3QgbWF0Y2hlcyBvbiBpZCdzIG9yIGNsYXNzZXMsIGJ1dCBvbmx5IGlmIHRoZXkgZXhpc3QgaW4gdGhlIGZpcnN0IHBsYWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpZCAhPT0gdW5kZWZpbmVkICYmIGlkID09PSBjbGFzc0xpc3RbaV0pIHx8IChjbGFzc05hbWVzICYmIGNsYXNzTmFtZXMgPT09IGNsYXNzTGlzdFtpXSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0kKGVsZW1lbnQpLmRhdGEoJ2lkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGE9PWlkZW50aXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxhc3RJdGVtLm5vZGVOYW1lIT0nI2RvY3VtZW50JylcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgZ290IHRoaXMgZmFyLCB0aGVuIHdlIGFyZSBnb29kIHRvIGdvIHdpdGggcHJvY2Vzc2luZyB0aGUgY29tbWFuZCBwYXNzZWQgaW4gdmlhIHRoZSBjbGljay1vdXRzaWRlIGF0dHJpYnV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gJHBhcnNlKGF0dHJbJ2NsaWNrT3V0c2lkZSddKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuKCRzY29wZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRldmljZXMgaGFzIGEgdG91Y2hzY3JlZW4sIGxpc3RlbiBmb3IgdGhpcyBldmVudFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfaGFzVG91Y2goKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnQub24oJ3RvdWNoc3RhcnQnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgbGlzdGVuIGZvciB0aGUgY2xpY2sgZXZlbnQgZXZlbiBpZiB0aGVyZSBpcyB0b3VjaCB0byBjYXRlciBmb3IgdG91Y2hzY3JlZW4gbGFwdG9wc1xyXG4gICAgICAgICAgICAgICAgICAgICRkb2N1bWVudC5vbignY2xpY2snLCBldmVudEhhbmRsZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBzY29wZSBpcyBkZXN0cm95ZWQsIGNsZWFuIHVwIHRoZSBkb2N1bWVudHMgZXZlbnQgaGFuZGxlcnMgYXMgd2UgZG9uJ3Qgd2FudCBpdCBoYW5naW5nIGFyb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2hhc1RvdWNoKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudC5vZmYoJ3RvdWNoc3RhcnQnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnQub2ZmKCdjbGljaycsIGV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByaXZhdGUgZnVuY3Rpb24gdG8gYXR0ZW1wdCB0byBmaWd1cmUgb3V0IGlmIHdlIGFyZSBvbiBhIHRvdWNoIGRldmljZVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF9oYXNUb3VjaCgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya3Mgb24gbW9zdCBicm93c2VycywgSUUxMC8xMSBhbmQgU3VyZmFjZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cztcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59KSgpO1xyXG4iLCIvKiEgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gLSB2MS42LjMgLSAyMDE2LTA0LTIwXG4qIGh0dHA6Ly90cmVudHJpY2hhcmRzb24uY29tL2V4YW1wbGVzL3RpbWVwaWNrZXJcbiogQ29weXJpZ2h0IChjKSAyMDE2IFRyZW50IFJpY2hhcmRzb247IExpY2Vuc2VkIE1JVCAqL1xuXG4oZnVuY3Rpb24oJCl7XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItYWYuanNcbi8qIEFmcmlrYWFucyB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IERlb24gSGV5bnMgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ2FmJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ0tpZXMgVHlkJyxcblx0XHR0aW1lVGV4dDogJ1R5ZCAnLFxuXHRcdGhvdXJUZXh0OiAnVXJlICcsXG5cdFx0bWludXRlVGV4dDogJ01pbnV0ZScsXG5cdFx0c2Vjb25kVGV4dDogJ1Nla29uZGVzJyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxsaXNla29uZGVzJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWtyb3Nla29uZGVzJyxcblx0XHR0aW1lem9uZVRleHQ6ICdUeWRzb25lJyxcblx0XHRjdXJyZW50VGV4dDogJ0h1aWRpZ2UgVHlkJyxcblx0XHRjbG9zZVRleHQ6ICdLbGFhcicsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1hbS5qc1xuLyogQXJtZW5pYW4gdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBBcnRhdmF6ZCBBdmV0aXN5YW4gYXJ0YXZhemRhQGhvdG1haWwuY29tICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydhbSddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICfUuNW21b/WgNWl1oQg1arVodW01aHVttWh1a/VqCcsXG5cdFx0dGltZVRleHQ6ICfUutWh1bTVodW21aHVr9WoJyxcblx0XHRob3VyVGV4dDogJ9S61aHVtCcsXG5cdFx0bWludXRlVGV4dDogJ9WQ1bjVutWlJyxcblx0XHRzZWNvbmRUZXh0OiAn1Y7VodaA1a/VtdWh1bYnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ9WE1avVrNWr1b7VodaA1a/VtdWh1bYnLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ9WE1avVr9aA1bjVvtWh1oDVr9W11aHVticsXG5cdFx0dGltZXpvbmVUZXh0OiAn1LrVodW01aHVtdWr1bYg1aPVuNW/1avVticsXG5cdFx0Y3VycmVudFRleHQ6ICfUsdW11arVtCcsXG5cdFx0Y2xvc2VUZXh0OiAn1ZPVodWv1aXVrCcsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1iZy5qc1xuLyogQnVsZ2FyaWFuIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgUGxhbWVuIEtvdmFuZGppZXYgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ2JnJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ9CY0LfQsdC10YDQtdGC0LUg0LLRgNC10LzQtScsXG5cdFx0dGltZVRleHQ6ICfQktGA0LXQvNC1Jyxcblx0XHRob3VyVGV4dDogJ9Cn0LDRgScsXG5cdFx0bWludXRlVGV4dDogJ9Cc0LjQvdGD0YLQuCcsXG5cdFx0c2Vjb25kVGV4dDogJ9Ch0LXQutGD0L3QtNC4Jyxcblx0XHRtaWxsaXNlY1RleHQ6ICfQnNC40LvQuNGB0LXQutGD0L3QtNC4Jyxcblx0XHRtaWNyb3NlY1RleHQ6ICfQnNC40LrRgNC+0YHQtdC60YPQvdC00LgnLFxuXHRcdHRpbWV6b25lVGV4dDogJ9Cn0LDRgdC+0LLQuCDQv9C+0Y/RgScsXG5cdFx0Y3VycmVudFRleHQ6ICfQodC10LPQsCcsXG5cdFx0Y2xvc2VUZXh0OiAn0JfQsNGC0LLQvtGA0LgnLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItY2EuanNcbi8qIENhdGFsYW4gdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBTZXJnaSBGYWJlciAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnY2EnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnRXNjb2xsaXIgdW5hIGhvcmEnLFxuXHRcdHRpbWVUZXh0OiAnSG9yYScsXG5cdFx0aG91clRleHQ6ICdIb3JlcycsXG5cdFx0bWludXRlVGV4dDogJ01pbnV0cycsXG5cdFx0c2Vjb25kVGV4dDogJ1NlZ29ucycsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsaXNlZ29ucycsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWljcm9zZWdvbnMnLFxuXHRcdHRpbWV6b25lVGV4dDogJ0Z1cyBob3JhcmknLFxuXHRcdGN1cnJlbnRUZXh0OiAnQXJhJyxcblx0XHRjbG9zZVRleHQ6ICdUYW5jYXInLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItY3MuanNcbi8qIEN6ZWNoIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgT25kxZllaiBWb2TDocSNZWsgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ2NzJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ1Z5YmVydGUgxI1hcycsXG5cdFx0dGltZVRleHQ6ICfEjGFzJyxcblx0XHRob3VyVGV4dDogJ0hvZGlueScsXG5cdFx0bWludXRlVGV4dDogJ01pbnV0eScsXG5cdFx0c2Vjb25kVGV4dDogJ1Z0ZcWZaW55Jyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxpc2VrdW5keScsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWlrcm9zZWt1bmR5Jyxcblx0XHR0aW1lem9uZVRleHQ6ICfEjGFzb3bDqSBww6FzbW8nLFxuXHRcdGN1cnJlbnRUZXh0OiAnTnluw60nLFxuXHRcdGNsb3NlVGV4dDogJ1phdsWZw610Jyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnZG9wLicsICdBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydvZHAuJywgJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1kYS5qc1xuLyogRGFuaXNoIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgTGFycyBILiBKZW5zZW4gKGh0dHA6Ly93d3cubGFyc2hqLmRrKSAqL1xuXG4gICAgJC50aW1lcGlja2VyLnJlZ2lvbmFsWydkYSddID0ge1xuICAgICAgICB0aW1lT25seVRpdGxlOiAnVsOmbGcgdGlkJyxcbiAgICAgICAgdGltZVRleHQ6ICdUaWQnLFxuICAgICAgICBob3VyVGV4dDogJ1RpbWUnLFxuICAgICAgICBtaW51dGVUZXh0OiAnTWludXQnLFxuICAgICAgICBzZWNvbmRUZXh0OiAnU2VrdW5kJyxcbiAgICAgICAgbWlsbGlzZWNUZXh0OiAnTWlsbGlzZWt1bmQnLFxuICAgICAgICBtaWNyb3NlY1RleHQ6ICdNaWtyb3Nla3VuZCcsXG4gICAgICAgIHRpbWV6b25lVGV4dDogJ1RpZHN6b25lJyxcbiAgICAgICAgY3VycmVudFRleHQ6ICdOdScsXG4gICAgICAgIGNsb3NlVGV4dDogJ0x1aycsXG4gICAgICAgIHRpbWVGb3JtYXQ6ICdISDptbScsXG4gICAgICAgIHRpbWVTdWZmaXg6ICcnLFxuICAgICAgICBhbU5hbWVzOiBbJ2FtJywgJ0FNJywgJ0EnXSxcbiAgICAgICAgcG1OYW1lczogWydwbScsICdQTScsICdQJ10sXG4gICAgICAgIGlzUlRMOiBmYWxzZVxuICAgIH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItZGUuanNcbi8qIEdlcm1hbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IE1hcnZpbiAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnZGUnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnWmVpdCB3w6RobGVuJyxcblx0XHR0aW1lVGV4dDogJ1plaXQnLFxuXHRcdGhvdXJUZXh0OiAnU3R1bmRlJyxcblx0XHRtaW51dGVUZXh0OiAnTWludXRlJyxcblx0XHRzZWNvbmRUZXh0OiAnU2VrdW5kZScsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsbGlzZWt1bmRlJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWtyb3Nla3VuZGUnLFxuXHRcdHRpbWV6b25lVGV4dDogJ1plaXR6b25lJyxcblx0XHRjdXJyZW50VGV4dDogJ0pldHp0Jyxcblx0XHRjbG9zZVRleHQ6ICdGZXJ0aWcnLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWyd2b3JtLicsICdBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWyduYWNobS4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLWVsLmpzXG4vKiBIZWxsZW5pYyB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IENocmlzdG9zIFBvbnRpa2lzICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydlbCddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICfOlc+AzrnOu86/zrPOriDPjs+BzrHPgicsXG5cdFx0dGltZVRleHQ6ICfOj8+BzrEnLFxuXHRcdGhvdXJUZXh0OiAnzo/Pgc61z4InLFxuXHRcdG1pbnV0ZVRleHQ6ICfOm861z4DPhM6sJyxcblx0XHRzZWNvbmRUZXh0OiAnzpTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xJyxcblx0XHRtaWxsaXNlY1RleHQ6ICfOp865zrvOuc6/z4PPhM6/zrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xJyxcblx0XHRtaWNyb3NlY1RleHQ6ICfOnM65zrrPgc6/zrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xJyxcblx0XHR0aW1lem9uZVRleHQ6ICfOls+Ozr3OtyDPjs+BzrHPgicsXG5cdFx0Y3VycmVudFRleHQ6ICfOpM+Oz4HOsScsXG5cdFx0Y2xvc2VUZXh0OiAnzprOu861zq/Pg865zrzOvycsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ8+ALs68LicsICdBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWyfOvC7OvC4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLWVzLmpzXG4vKiBTcGFuaXNoIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgSWFuYXLDqSBTw6l2aSAqL1xuLyogTW9kaWZpZWQgYnkgQ2FybG9zIE1hcnTDrW5leiAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnZXMnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnRWxlZ2lyIHVuYSBob3JhJyxcblx0XHR0aW1lVGV4dDogJ0hvcmEnLFxuXHRcdGhvdXJUZXh0OiAnSG9yYXMnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dG9zJyxcblx0XHRzZWNvbmRUZXh0OiAnU2VndW5kb3MnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGlzZWd1bmRvcycsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWljcm9zZWd1bmRvcycsXG5cdFx0dGltZXpvbmVUZXh0OiAnVXNvIGhvcmFyaW8nLFxuXHRcdGN1cnJlbnRUZXh0OiAnSG95Jyxcblx0XHRjbG9zZVRleHQ6ICdDZXJyYXInLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydhLm0uJywgJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ3AubS4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLWV0LmpzXG4vKiBFc3RvbmlhbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IEthcmwgU3V0dCAoa2FybEBzdXR0LmVlKSAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnZXQnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnVmFsaSBhZWcnLFxuXHRcdHRpbWVUZXh0OiAnQWVnJyxcblx0XHRob3VyVGV4dDogJ1R1bmQnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dCcsXG5cdFx0c2Vjb25kVGV4dDogJ1Nla3VuZCcsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsbGlzZWt1bmRpcycsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWlrcm9zZWt1bmRpcycsXG5cdFx0dGltZXpvbmVUZXh0OiAnQWphdsO2w7ZuZCcsXG5cdFx0Y3VycmVudFRleHQ6ICdQcmFlZ3UnLFxuXHRcdGNsb3NlVGV4dDogJ1ZhbG1pcycsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1ldS5qc1xuLyogQmFzcXVlIHRyYW5uc2xhdGlvbiBmb3IgSlF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFRyYW5zbGF0ZWQgYnkgWGFiaSBGZXIgKi9cbi8qIEZpeGVkIGJ5IEFzaWVyIEl0dXJyYWxkZSBTYXJhc29sYSAtIGlhbWV0emEgaW50ZXJha3RpYm9hICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydldSddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdBdWtlcmF0dSBvcmR1YScsXG5cdFx0dGltZVRleHQ6ICdPcmR1YScsXG5cdFx0aG91clRleHQ6ICdPcmR1YWsnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dHVhaycsXG5cdFx0c2Vjb25kVGV4dDogJ1NlZ3VuZG9haycsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsaXNlZ3VuZG9haycsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWlrcm9zZWd1bmRvYWsnLFxuXHRcdHRpbWV6b25lVGV4dDogJ09yZHUtZXJlbXVhJyxcblx0XHRjdXJyZW50VGV4dDogJ09yYWluJyxcblx0XHRjbG9zZVRleHQ6ICdJdHhpJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnYS5tLicsICdBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydwLm0uJywgJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1mYS5qc1xuLyogUGVyc2lhbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IE1leXNhbSBQb3VyIEdhbmppICovXG5cbiAgICAkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ2ZhJ10gPSB7XG4gICAgICAgIHRpbWVPbmx5VGl0bGU6ICfYp9mG2KrYrtin2Kgg2LLZhdin2YYnLFxuICAgICAgICB0aW1lVGV4dDogJ9iy2YXYp9mGJyxcbiAgICAgICAgaG91clRleHQ6ICfYs9in2LnYqicsXG4gICAgICAgIG1pbnV0ZVRleHQ6ICfYr9mC24zZgtmHJyxcbiAgICAgICAgc2Vjb25kVGV4dDogJ9ir2KfZhtuM2YcnLFxuICAgICAgICBtaWxsaXNlY1RleHQ6ICfZhduM2YTbjCDYq9in2YbbjNmHJyxcbiAgICAgICAgbWljcm9zZWNUZXh0OiAn2YXbjNqp2LHZiCDYq9in2YbbjNmHJyxcbiAgICAgICAgdGltZXpvbmVUZXh0OiAn2YXZhti32YLZhyDYstmF2KfZhtuMJyxcbiAgICAgICAgY3VycmVudFRleHQ6ICfYp9mE2KfZhicsXG4gICAgICAgIGNsb3NlVGV4dDogJ9in2YbYqtiu2KfYqCcsXG4gICAgICAgIHRpbWVGb3JtYXQ6ICdISDptbScsXG4gICAgICAgIHRpbWVTdWZmaXg6ICcnLFxuICAgICAgICBhbU5hbWVzOiBbJ9mC2KjZhCDYuNmH2LEnLCAnQU0nLCAnQSddLFxuICAgICAgICBwbU5hbWVzOiBbJ9io2LnYryDYuNmH2LEnLCAnUE0nLCAnUCddLFxuICAgICAgICBpc1JUTDogdHJ1ZVxuICAgIH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItZmkuanNcbi8qIEZpbm5pc2ggdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBKdWdhIFBhYXptYXlhIChodHRwOi8vZ2l0aHViLmNvbS9wYWF6bWF5YSkgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ2ZpJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ1ZhbGl0c2UgYWlrYScsXG5cdFx0dGltZVRleHQ6ICdBaWthJyxcblx0XHRob3VyVGV4dDogJ1R1bnRpJyxcblx0XHRtaW51dGVUZXh0OiAnTWludXV0dGknLFxuXHRcdHNlY29uZFRleHQ6ICdTZWt1bnRpJyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxsaXNla3VubmluJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWtyb3Nla3VudGlhJyxcblx0XHR0aW1lem9uZVRleHQ6ICdBaWthdnnDtmh5a2UnLFxuXHRcdGN1cnJlbnRUZXh0OiAnTnl0Jyxcblx0XHRjbG9zZVRleHQ6ICdTdWxqZScsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ2FwLicsICdBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydpcC4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLWZyLmpzXG4vKiBGcmVuY2ggdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBUaG9tYXMgTMOpdMOpICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydmciddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdDaG9pc2lyIHVuZSBoZXVyZScsXG5cdFx0dGltZVRleHQ6ICdIZXVyZScsXG5cdFx0aG91clRleHQ6ICdIZXVyZXMnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dGVzJyxcblx0XHRzZWNvbmRUZXh0OiAnU2Vjb25kZXMnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGxpc2Vjb25kZXMnLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ01pY3Jvc2Vjb25kZXMnLFxuXHRcdHRpbWV6b25lVGV4dDogJ0Z1c2VhdSBob3JhaXJlJyxcblx0XHRjdXJyZW50VGV4dDogJ01haW50ZW5hbnQnLFxuXHRcdGNsb3NlVGV4dDogJ1Rlcm1pbsOpJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLWdsLmpzXG4vKiBHYWxpY2lhbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IERhdmlkIEJhcnJhbCAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnZ2wnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnRWxpeGlyIHVuaGEgaG9yYScsXG5cdFx0dGltZVRleHQ6ICdIb3JhJyxcblx0XHRob3VyVGV4dDogJ0hvcmFzJyxcblx0XHRtaW51dGVUZXh0OiAnTWludXRvcycsXG5cdFx0c2Vjb25kVGV4dDogJ1NlZ3VuZG9zJyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxpc2VndW5kb3MnLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ01pY3Jvc3NlZ3VuZG9zJyxcblx0XHR0aW1lem9uZVRleHQ6ICdGdXNvIGhvcmFyaW8nLFxuXHRcdGN1cnJlbnRUZXh0OiAnQWdvcmEnLFxuXHRcdGNsb3NlVGV4dDogJ1BlY2hhcicsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ2EubS4nLCAnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsncC5tLicsICdQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItaGUuanNcbi8qIEhlYnJldyB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IExpb3IgTGFwaWQgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbXCJoZVwiXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiBcIteR15fXmdeo16og15bXntefXCIsXG5cdFx0dGltZVRleHQ6IFwi16nXoteUXCIsXG5cdFx0aG91clRleHQ6IFwi16nXoteV16pcIixcblx0XHRtaW51dGVUZXh0OiBcIteT16fXldeqXCIsXG5cdFx0c2Vjb25kVGV4dDogXCLXqdeg15nXldeqXCIsXG5cdFx0bWlsbGlzZWNUZXh0OiBcIteQ15zXpNeZ16og15TXqdeg15nXmdeUXCIsXG5cdFx0bWljcm9zZWNUZXh0OiBcItee15nXp9eo15VcIixcblx0XHR0aW1lem9uZVRleHQ6IFwi15DXlteV16gg15bXntefXCIsXG5cdFx0Y3VycmVudFRleHQ6IFwi16LXm9ep15nXlVwiLFxuXHRcdGNsb3NlVGV4dDpcIteh15LXldeoXCIsXG5cdFx0dGltZUZvcm1hdDogXCJISDptbVwiLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsn15zXpNeg15RcItemJywgJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ9eQ15fXlFwi16YnLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiB0cnVlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItaHIuanNcbi8qIENyb2F0aWFuIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgTWxhZGVuICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydociddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdPZGFiZXJpIHZyaWplbWUnLFxuXHRcdHRpbWVUZXh0OiAnVnJpamVtZScsXG5cdFx0aG91clRleHQ6ICdTYXRpJyxcblx0XHRtaW51dGVUZXh0OiAnTWludXRlJyxcblx0XHRzZWNvbmRUZXh0OiAnU2VrdW5kZScsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsaXNla3VuZGUnLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ01pa3Jvc2VrdW5kZScsXG5cdFx0dGltZXpvbmVUZXh0OiAnVnJlbWVuc2thIHpvbmEnLFxuXHRcdGN1cnJlbnRUZXh0OiAnU2FkYScsXG5cdFx0Y2xvc2VUZXh0OiAnR290b3ZvJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnYS5tLicsICdBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydwLm0uJywgJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1odS5qc1xuLyogSHVuZ2FyaWFuIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgVmFzIEfDoWJvciAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnaHUnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnVsOhbGFzc3pvbiBpZMWRcG9udG90Jyxcblx0XHR0aW1lVGV4dDogJ0lkxZEnLFxuXHRcdGhvdXJUZXh0OiAnw5NyYScsXG5cdFx0bWludXRlVGV4dDogJ1BlcmMnLFxuXHRcdHNlY29uZFRleHQ6ICdNw6Fzb2RwZXJjJyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxsaXN6ZWt1bmR1bW9zJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdFenJlZG3DoXNvZHBlcmMnLFxuXHRcdHRpbWV6b25lVGV4dDogJ0lkxZF6w7NuYScsXG5cdFx0Y3VycmVudFRleHQ6ICdNb3N0Jyxcblx0XHRjbG9zZVRleHQ6ICdLw6lzeicsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ2RlLicsICdBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydkdS4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLWlkLmpzXG4vKiBJbmRvbmVzaWFuIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgTmlhICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydpZCddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdQaWxpaCBXYWt0dScsXG5cdFx0dGltZVRleHQ6ICdXYWt0dScsXG5cdFx0aG91clRleHQ6ICdQdWt1bCcsXG5cdFx0bWludXRlVGV4dDogJ01lbml0Jyxcblx0XHRzZWNvbmRUZXh0OiAnRGV0aWsnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGlkZXRpaycsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWlrcm9kZXRpaycsXG5cdFx0dGltZXpvbmVUZXh0OiAnWm9uYSBXYWt0dScsXG5cdFx0Y3VycmVudFRleHQ6ICdTZWthcmFuZycsXG5cdFx0Y2xvc2VUZXh0OiAnT0snLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItaXQuanNcbi8qIEl0YWxpYW4gdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBNYXJjbyBcImxvZ2ljb2RlclwiIERlbCBUb25nbyAqL1xuXG4gICAgJC50aW1lcGlja2VyLnJlZ2lvbmFsWydpdCddID0ge1xuICAgICAgICB0aW1lT25seVRpdGxlOiAnU2NlZ2xpIG9yYXJpbycsXG4gICAgICAgIHRpbWVUZXh0OiAnT3JhcmlvJyxcbiAgICAgICAgaG91clRleHQ6ICdPcmEnLFxuICAgICAgICBtaW51dGVUZXh0OiAnTWludXRpJyxcbiAgICAgICAgc2Vjb25kVGV4dDogJ1NlY29uZGknLFxuICAgICAgICBtaWxsaXNlY1RleHQ6ICdNaWxsaXNlY29uZGknLFxuICAgICAgICBtaWNyb3NlY1RleHQ6ICdNaWNyb3NlY29uZGknLFxuICAgICAgICB0aW1lem9uZVRleHQ6ICdGdXNvIG9yYXJpbycsXG4gICAgICAgIGN1cnJlbnRUZXh0OiAnQWRlc3NvJyxcbiAgICAgICAgY2xvc2VUZXh0OiAnQ2hpdWRpJyxcbiAgICAgICAgdGltZUZvcm1hdDogJ0hIOm1tJyxcbiAgICAgICAgdGltZVN1ZmZpeDogJycsXG4gICAgICAgIGFtTmFtZXM6IFsnbS4nLCAnQU0nLCAnQSddLFxuICAgICAgICBwbU5hbWVzOiBbJ3AuJywgJ1BNJywgJ1AnXSxcbiAgICAgICAgaXNSVEw6IGZhbHNlXG4gICAgfTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1qYS5qc1xuLyogSmFwYW5lc2UgdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBKdW4gT21hZSAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnamEnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAn5pmC6ZaT44KS6YG45oqeJyxcblx0XHR0aW1lVGV4dDogJ+aZgumWkycsXG5cdFx0aG91clRleHQ6ICfmmYInLFxuXHRcdG1pbnV0ZVRleHQ6ICfliIYnLFxuXHRcdHNlY29uZFRleHQ6ICfnp5InLFxuXHRcdG1pbGxpc2VjVGV4dDogJ+ODn+ODquenkicsXG5cdFx0bWljcm9zZWNUZXh0OiAn44Oe44Kk44Kv44Ot56eSJyxcblx0XHR0aW1lem9uZVRleHQ6ICfjgr/jgqTjg6Djgr7jg7zjg7MnLFxuXHRcdGN1cnJlbnRUZXh0OiAn54++5pmC5Yi7Jyxcblx0XHRjbG9zZVRleHQ6ICfplonjgZjjgosnLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWyfljYjliY0nLCAnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsn5Y2I5b6MJywgJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1rby5qc1xuLyogS29yZWFuIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgR2VuaWUgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ2tvJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ+yLnOqwhCDshKDtg50nLFxuXHRcdHRpbWVUZXh0OiAn7Iuc6rCEJyxcblx0XHRob3VyVGV4dDogJ+yLnCcsXG5cdFx0bWludXRlVGV4dDogJ+u2hCcsXG5cdFx0c2Vjb25kVGV4dDogJ+y0iCcsXG5cdFx0bWlsbGlzZWNUZXh0OiAn67CA66as7LSIJyxcblx0XHRtaWNyb3NlY1RleHQ6ICfrp4jsnbTtgazroZwnLFxuXHRcdHRpbWV6b25lVGV4dDogJ+2RnOykgCDsi5zqsITrjIAnLFxuXHRcdGN1cnJlbnRUZXh0OiAn7ZiE7J6sIOyLnOqwgScsXG5cdFx0Y2xvc2VUZXh0OiAn64ur6riwJyxcblx0XHR0aW1lRm9ybWF0OiAndHQgaDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWyfsmKTsoIQnLCAnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsn7Jik7ZuEJywgJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1sdC5qc1xuLyogTGl0aHVhbmlhbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IElybWFudGFzIMWgaXVwxaFpbnNrYXMgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ2x0J10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ1Bhc2lyaW5raXRlIGxhaWvEhScsXG5cdFx0dGltZVRleHQ6ICdMYWlrYXMnLFxuXHRcdGhvdXJUZXh0OiAnVmFsYW5kb3MnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dMSXcycsXG5cdFx0c2Vjb25kVGV4dDogJ1Nla3VuZMSXcycsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsaXNla3VuZMSXcycsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWlrcm9zZWt1bmTEl3MnLFxuXHRcdHRpbWV6b25lVGV4dDogJ0xhaWtvIHpvbmEnLFxuXHRcdGN1cnJlbnRUZXh0OiAnRGFiYXInLFxuXHRcdGNsb3NlVGV4dDogJ1XFvmRhcnl0aScsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ3ByaWXFoXBpZXQnLCAnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsncG9waWV0JywgJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1sdi5qc1xuLyogTGF0dmlhbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IERtaXRyeSBCb2dhdHlraCAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnbHYnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnSWV2YWRpZXQgbGFpa3UnLFxuXHRcdHRpbWVUZXh0OiAnTGFpa3MnLFxuXHRcdGhvdXJUZXh0OiAnU3R1bmRhcycsXG5cdFx0bWludXRlVGV4dDogJ01pbsWrdGVzJyxcblx0XHRzZWNvbmRUZXh0OiAnU2VrdW5kZXMnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGlzZWt1bmRlcycsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWlrcm9zZWt1bmRlcycsXG5cdFx0dGltZXpvbmVUZXh0OiAnTGFpa2Egam9zbGEnLFxuXHRcdGN1cnJlbnRUZXh0OiAnVGFnYWQnLFxuXHRcdGNsb3NlVGV4dDogJ0FpenbEk3J0Jyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnQU0nLCAnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsnUE0nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLW1rLmpzXG4vKiBNYWNlZG9uaWFuIGN5cmlsaWMgdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBWbGF0a28gUmlzdG92c2tpICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydtayddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICfQntC00LHQtdGA0LXRgtC1INCy0YDQtdC80LUnLFxuXHRcdHRpbWVUZXh0OiAn0JLRgNC10LzQtScsXG5cdFx0aG91clRleHQ6ICfQp9Cw0YEnLFxuXHRcdG1pbnV0ZVRleHQ6ICfQnNC40L3Rg9GC0LgnLFxuXHRcdHNlY29uZFRleHQ6ICfQodC10LrRg9C90LTQuCcsXG5cdFx0bWlsbGlzZWNUZXh0OiAn0JzQuNC70LjRgdC10LrRg9C90LTQuCcsXG5cdFx0bWljcm9zZWNUZXh0OiAn0JzQuNC60YDQvtGB0LXQutGD0L3QtNC4Jyxcblx0XHR0aW1lem9uZVRleHQ6ICfQktGA0LXQvNC10L3RgdC60LAg0LfQvtC90LAnLFxuXHRcdGN1cnJlbnRUZXh0OiAn0KHQtdCz0LAnLFxuXHRcdGNsb3NlVGV4dDogJ9CX0LDRgtCy0L7RgNC4Jyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLW5sLmpzXG4vKiBEdXRjaCB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IE1hcnRpam4gdmFuIGRlciBMZWUgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ25sJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ1RpamRzdGlwJyxcblx0XHR0aW1lVGV4dDogJ1RpamQnLFxuXHRcdGhvdXJUZXh0OiAnVXVyJyxcblx0XHRtaW51dGVUZXh0OiAnTWludXV0Jyxcblx0XHRzZWNvbmRUZXh0OiAnU2Vjb25kZScsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsbGlzZWNvbmRlJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWNyb3NlY29uZGUnLFxuXHRcdHRpbWV6b25lVGV4dDogJ1RpamR6b25lJyxcblx0XHRjdXJyZW50VGV4dDogJ1ZhbmRhYWcnLFxuXHRcdGNsb3NlVGV4dDogJ1NsdWl0ZW4nLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItbm8uanNcbi8qIE5vcndlZ2lhbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IE1vcnRlbiBIYXVhbiAoaHR0cDovL2hhdWFuLm1lKSAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnbm8nXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnVmVsZyB0aWQnLFxuXHRcdHRpbWVUZXh0OiAnVGlkJyxcblx0XHRob3VyVGV4dDogJ1RpbWUnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dHQnLFxuXHRcdHNlY29uZFRleHQ6ICdTZWt1bmQnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGxpc2VrdW5kJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdtaWtyb3Nla3VuZCcsXG5cdFx0dGltZXpvbmVUZXh0OiAnVGlkc3NvbmUnLFxuXHRcdGN1cnJlbnRUZXh0OiAnTsOlJyxcblx0XHRjbG9zZVRleHQ6ICdMdWtrJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnYW0nLCAnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsncG0nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXBsLmpzXG4vKiBQb2xpc2ggdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBNaWNoYcWCIFBlbmEgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ3BsJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ1d5YmllcnogZ29kemluxJknLFxuXHRcdHRpbWVUZXh0OiAnQ3phcycsXG5cdFx0aG91clRleHQ6ICdHb2R6aW5hJyxcblx0XHRtaW51dGVUZXh0OiAnTWludXRhJyxcblx0XHRzZWNvbmRUZXh0OiAnU2VrdW5kYScsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsaXNla3VuZGEnLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ01pa3Jvc2VrdW5kYScsXG5cdFx0dGltZXpvbmVUZXh0OiAnU3RyZWZhIGN6YXNvd2EnLFxuXHRcdGN1cnJlbnRUZXh0OiAnVGVyYXonLFxuXHRcdGNsb3NlVGV4dDogJ0dvdG93ZScsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1wdC1CUi5qc1xuLyogQnJhemlsaWFuIFBvcnR1Z3Vlc2UgdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBEaW9nbyBEYW1pYW5pIChkaW9nb2RhbWlhbmlAZ21haWwuY29tKSAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsncHQtQlInXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnRXNjb2xoYSBvIGhvcsOhcmlvJyxcblx0XHR0aW1lVGV4dDogJ0hvcsOhcmlvJyxcblx0XHRob3VyVGV4dDogJ0hvcmEnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dG9zJyxcblx0XHRzZWNvbmRUZXh0OiAnU2VndW5kb3MnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGlzc2VndW5kb3MnLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ01pY3Jvc3NlZ3VuZG9zJyxcblx0XHR0aW1lem9uZVRleHQ6ICdGdXNvIGhvcsOhcmlvJyxcblx0XHRjdXJyZW50VGV4dDogJ0Fnb3JhJyxcblx0XHRjbG9zZVRleHQ6ICdGZWNoYXInLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydhLm0uJywgJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ3AubS4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXB0LmpzXG4vKiBQb3J0dWd1ZXNlIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgTHVhbiBBbG1laWRhICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydwdCddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdFc2NvbGhhIHVtYSBob3JhJyxcblx0XHR0aW1lVGV4dDogJ0hvcmEnLFxuXHRcdGhvdXJUZXh0OiAnSG9yYXMnLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW51dG9zJyxcblx0XHRzZWNvbmRUZXh0OiAnU2VndW5kb3MnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGlzc2VndW5kb3MnLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ01pY3Jvc3NlZ3VuZG9zJyxcblx0XHR0aW1lem9uZVRleHQ6ICdGdXNvIGhvcsOhcmlvJyxcblx0XHRjdXJyZW50VGV4dDogJ0Fnb3JhJyxcblx0XHRjbG9zZVRleHQ6ICdGZWNoYXInLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydhLm0uJywgJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ3AubS4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXJvLmpzXG4vKiBSb21hbmlhbiB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IFJvbWVvIEFkcmlhbiBDaW9hYmEgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ3JvJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ0FsZWdlxaNpIG8gb3LEgycsXG5cdFx0dGltZVRleHQ6ICdUaW1wJyxcblx0XHRob3VyVGV4dDogJ09yZScsXG5cdFx0bWludXRlVGV4dDogJ01pbnV0ZScsXG5cdFx0c2Vjb25kVGV4dDogJ1NlY3VuZGUnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGlzZWN1bmRlJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWNyb3NlY3VuZGUnLFxuXHRcdHRpbWV6b25lVGV4dDogJ0Z1cyBvcmFyJyxcblx0XHRjdXJyZW50VGV4dDogJ0FjdW0nLFxuXHRcdGNsb3NlVGV4dDogJ8OObmNoaWRlJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXJ1LmpzXG4vKiBSdXNzaWFuIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgVHJlbnQgUmljaGFyZHNvbiAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsncnUnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAn0JLRi9Cx0LXRgNC40YLQtSDQstGA0LXQvNGPJyxcblx0XHR0aW1lVGV4dDogJ9CS0YDQtdC80Y8nLFxuXHRcdGhvdXJUZXh0OiAn0KfQsNGB0YsnLFxuXHRcdG1pbnV0ZVRleHQ6ICfQnNC40L3Rg9GC0YsnLFxuXHRcdHNlY29uZFRleHQ6ICfQodC10LrRg9C90LTRiycsXG5cdFx0bWlsbGlzZWNUZXh0OiAn0JzQuNC70LvQuNGB0LXQutGD0L3QtNGLJyxcblx0XHRtaWNyb3NlY1RleHQ6ICfQnNC40LrRgNC+0YHQtdC60YPQvdC00YsnLFxuXHRcdHRpbWV6b25lVGV4dDogJ9Cn0LDRgdC+0LLQvtC5INC/0L7Rj9GBJyxcblx0XHRjdXJyZW50VGV4dDogJ9Ch0LXQudGH0LDRgScsXG5cdFx0Y2xvc2VUZXh0OiAn0J/RgNC40LzQtdC90LjRgtGMJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnQU0nLCAnQSddLFxuXHRcdHBtTmFtZXM6IFsnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXNrLmpzXG4vKiBTbG92YWsgdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBEYXZpZCBWYWxsbmVyICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydzayddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdadm/EvnRlIMSNYXMnLFxuXHRcdHRpbWVUZXh0OiAnxIxhcycsXG5cdFx0aG91clRleHQ6ICdIb2RpbnknLFxuXHRcdG1pbnV0ZVRleHQ6ICdNaW7DunR5Jyxcblx0XHRzZWNvbmRUZXh0OiAnU2VrdW5keScsXG5cdFx0bWlsbGlzZWNUZXh0OiAnTWlsaXNla3VuZHknLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ01pa3Jvc2VrdW5keScsXG5cdFx0dGltZXpvbmVUZXh0OiAnxIxhc292w6kgcMOhc21vJyxcblx0XHRjdXJyZW50VGV4dDogJ1RlcmF6Jyxcblx0XHRjbG9zZVRleHQ6ICdaYXZyaWXFpScsXG5cdFx0dGltZUZvcm1hdDogJ0g6bScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydkb3AuJywgJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ3BvcC4nLCAnUE0nLCAnUCddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXNsLmpzXG4vKiBTbG92ZW5pYW4gdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBIYWRhbGluIChodHRwczovL2dpdGh1Yi5jb20vaGFkYWxpbikgKi9cblxuICAgICQudGltZXBpY2tlci5yZWdpb25hbFsnc2wnXSA9IHtcbiAgICAgICAgdGltZU9ubHlUaXRsZTogJ0l6YmVyaXRlIMSNYXMnLFxuICAgICAgICB0aW1lVGV4dDogJ8SMYXMnLFxuICAgICAgICBob3VyVGV4dDogJ1VyYScsXG4gICAgICAgIG1pbnV0ZVRleHQ6ICdNaW51dGUnLFxuICAgICAgICBzZWNvbmRUZXh0OiAnU2VrdW5kZScsXG4gICAgICAgIG1pbGxpc2VjVGV4dDogJ01pbGlzZWt1bmRlJyxcbiAgICAgICAgbWljcm9zZWNUZXh0OiAnTWlrcm9zZWt1bmRlJyxcbiAgICAgICAgdGltZXpvbmVUZXh0OiAnxIxhc292bmkgcGFzJyxcbiAgICAgICAgY3VycmVudFRleHQ6ICdTZWRhaicsXG4gICAgICAgIGNsb3NlVGV4dDogJ1phcHJpJyxcbiAgICAgICAgdGltZUZvcm1hdDogJ0hIOm1tJyxcbiAgICAgICAgdGltZVN1ZmZpeDogJycsXG4gICAgICAgIGFtTmFtZXM6IFsnZG9wLicsICdBTScsICdBJ10sXG4gICAgICAgIHBtTmFtZXM6IFsncG9wLicsICdQTScsICdQJ10sXG4gICAgICAgIGlzUlRMOiBmYWxzZVxuICAgIH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItc3EuanNcbi8qIEFsYmFuaWFuIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgT2x0aSBCdXppICovXG5cbiAgICAkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ3NxJ10gPSB7XG4gICAgICAgIHRpbWVPbmx5VGl0bGU6ICdaZ2ppZGggb3JhcmluJyxcbiAgICAgICAgdGltZVRleHQ6ICdPcmFyaScsXG4gICAgICAgIGhvdXJUZXh0OiAnT3JhJyxcbiAgICAgICAgbWludXRlVGV4dDogJ01pbnV0YScsXG4gICAgICAgIHNlY29uZFRleHQ6ICdTZWtvbmRhJyxcbiAgICAgICAgbWlsbGlzZWNUZXh0OiAnTWluaXNla29uZGEnLFxuICAgICAgICBtaWNyb3NlY1RleHQ6ICdNaWtyb3Nla29uZGEnLFxuICAgICAgICB0aW1lem9uZVRleHQ6ICdab25hIGtvaG9yZScsXG4gICAgICAgIGN1cnJlbnRUZXh0OiAnVGFuaScsXG4gICAgICAgIGNsb3NlVGV4dDogJ01ieWxsJyxcbiAgICAgICAgdGltZUZvcm1hdDogJ0hIOm1tJyxcbiAgICAgICAgdGltZVN1ZmZpeDogJycsXG4gICAgICAgIGFtTmFtZXM6IFsnbS4nLCAnQU0nLCAnQSddLFxuICAgICAgICBwbU5hbWVzOiBbJ3AuJywgJ1BNJywgJ1AnXSxcbiAgICAgICAgaXNSVEw6IGZhbHNlXG4gICAgfTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci1zci1SUy5qc1xuLyogU2VyYmlhbiBjeXJpbGljIHRyYW5zbGF0aW9uIGZvciB0aGUgalF1ZXJ5IFRpbWVwaWNrZXIgQWRkb24gKi9cbi8qIFdyaXR0ZW4gYnkgVmxhZGltaXIgSmVsb3ZhYyAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnc3ItUlMnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAn0J7QtNCw0LHQtdGA0LjRgtC1INCy0YDQtdC80LUnLFxuXHRcdHRpbWVUZXh0OiAn0JLRgNC10LzQtScsXG5cdFx0aG91clRleHQ6ICfQodCw0YLQuCcsXG5cdFx0bWludXRlVGV4dDogJ9Cc0LjQvdGD0YLQuCcsXG5cdFx0c2Vjb25kVGV4dDogJ9Ch0LXQutGD0L3QtNC1Jyxcblx0XHRtaWxsaXNlY1RleHQ6ICfQnNC40LvQuNGB0LXQutGD0L3QtNC1Jyxcblx0XHRtaWNyb3NlY1RleHQ6ICfQnNC40LrRgNC+0YHQtdC60YPQvdC00LUnLFxuXHRcdHRpbWV6b25lVGV4dDogJ9CS0YDQtdC80LXQvdGB0LrQsCDQt9C+0L3QsCcsXG5cdFx0Y3VycmVudFRleHQ6ICfQodCw0LTQsCcsXG5cdFx0Y2xvc2VUZXh0OiAn0JfQsNGC0LLQvtGA0LgnLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItc3ItWVUuanNcbi8qIFNlcmJpYW4gbGF0aW4gdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBWbGFkaW1pciBKZWxvdmFjICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWydzci1ZVSddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdPZGFiZXJpdGUgdnJlbWUnLFxuXHRcdHRpbWVUZXh0OiAnVnJlbWUnLFxuXHRcdGhvdXJUZXh0OiAnU2F0aScsXG5cdFx0bWludXRlVGV4dDogJ01pbnV0aScsXG5cdFx0c2Vjb25kVGV4dDogJ1Nla3VuZGUnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ01pbGlzZWt1bmRlJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWtyb3Nla3VuZGUnLFxuXHRcdHRpbWV6b25lVGV4dDogJ1ZyZW1lbnNrYSB6b25hJyxcblx0XHRjdXJyZW50VGV4dDogJ1NhZGEnLFxuXHRcdGNsb3NlVGV4dDogJ1phdHZvcmknLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItc3YuanNcbi8qIFN3ZWRpc2ggdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBOZXZvbiAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnc3YnXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAnVsOkbGogZW4gdGlkJyxcblx0XHR0aW1lVGV4dDogJ1RpZCcsXG5cdFx0aG91clRleHQ6ICdUaW1tZScsXG5cdFx0bWludXRlVGV4dDogJ01pbnV0Jyxcblx0XHRzZWNvbmRUZXh0OiAnU2VrdW5kJyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxsaXNla3VuZCcsXG5cdFx0bWljcm9zZWNUZXh0OiAnTWlrcm9zZWt1bmQnLFxuXHRcdHRpbWV6b25lVGV4dDogJ1RpZHN6b24nLFxuXHRcdGN1cnJlbnRUZXh0OiAnTnUnLFxuXHRcdGNsb3NlVGV4dDogJ1N0w6RuZycsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci10aC5qc1xuLyogVGhhaSB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IFlvdGUgV2FjaGlyYXBvcm5wb25nc2EgKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ3RoJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ+C5gOC4peC4t+C4reC4geC5gOC4p+C4peC4sicsXG5cdFx0dGltZVRleHQ6ICfguYDguKfguKXguLIgJyxcblx0XHRob3VyVGV4dDogJ+C4iuC4seC5iOC4p+C5guC4oeC4hyAnLFxuXHRcdG1pbnV0ZVRleHQ6ICfguJnguLLguJfguLUnLFxuXHRcdHNlY29uZFRleHQ6ICfguKfguLTguJnguLLguJfguLUnLFxuXHRcdG1pbGxpc2VjVGV4dDogJ+C4oeC4tOC4peC4peC4tOC4p+C4tOC4meC4suC4l+C4tScsXG5cdFx0bWljcm9zZWNUZXh0OiAn4LmE4Lih4LmC4LiE4Lij4Li04Lin4Li04LiZ4Liy4LiX4Li1Jyxcblx0XHR0aW1lem9uZVRleHQ6ICfguYDguILguJXguYDguKfguKXguLInLFxuXHRcdGN1cnJlbnRUZXh0OiAn4LmA4Lin4Lil4Liy4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZJyxcblx0XHRjbG9zZVRleHQ6ICfguJvguLTguJQnLFxuXHRcdHRpbWVGb3JtYXQ6ICdoaDptbSB0dCcsXG5cdFx0dGltZVN1ZmZpeDogJydcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci10ci5qc1xuLyogVHVya2lzaCB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IEZlaG1pIENhbiBTYWdsYW0sIEVkaXRlZCBieSBHb2t0dWcgT3p0dXJrICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWyd0ciddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdaYW1hbiBTZcOnaW5peicsXG5cdFx0dGltZVRleHQ6ICdaYW1hbicsXG5cdFx0aG91clRleHQ6ICdTYWF0Jyxcblx0XHRtaW51dGVUZXh0OiAnRGFraWthJyxcblx0XHRzZWNvbmRUZXh0OiAnU2FuaXllJyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxpc2FuaXllJyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWtyb3Nhbml5ZScsXG5cdFx0dGltZXpvbmVUZXh0OiAnWmFtYW4gRGlsaW1pJyxcblx0XHRjdXJyZW50VGV4dDogJ8WedSBhbicsXG5cdFx0Y2xvc2VUZXh0OiAnVGFtYW0nLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWyfDlsOWJywgJ8OWJ10sXG5cdFx0cG1OYW1lczogWyfDllMnLCAnUyddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXVrLmpzXG4vKiBVa3JhaW5pYW4gdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBTZXJnZXkgTm9za292ICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWyd1ayddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICfQktC40LHQtdGA0ZbRgtGMINGH0LDRgScsXG5cdFx0dGltZVRleHQ6ICfQp9Cw0YEnLFxuXHRcdGhvdXJUZXh0OiAn0JPQvtC00LjQvdC4Jyxcblx0XHRtaW51dGVUZXh0OiAn0KXQstC40LvQuNC90LgnLFxuXHRcdHNlY29uZFRleHQ6ICfQodC10LrRg9C90LTQuCcsXG5cdFx0bWlsbGlzZWNUZXh0OiAn0JzRltC70ZbRgdC10LrRg9C90LTQuCcsXG5cdFx0bWljcm9zZWNUZXh0OiAn0JzRltC60YDQvtGB0LXQutGD0L3QtNC4Jyxcblx0XHR0aW1lem9uZVRleHQ6ICfQp9Cw0YHQvtCy0LjQuSDQv9C+0Y/RgScsXG5cdFx0Y3VycmVudFRleHQ6ICfQl9Cw0YDQsNC3Jyxcblx0XHRjbG9zZVRleHQ6ICfQl9Cw0LrRgNC40YLQuCcsXG5cdFx0dGltZUZvcm1hdDogJ0hIOm1tJyxcblx0XHR0aW1lU3VmZml4OiAnJyxcblx0XHRhbU5hbWVzOiBbJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ1BNJywgJ1AnXSxcblx0XHRpc1JUTDogZmFsc2Vcblx0fTtcblxuLy8gc291cmNlOiBzcmMvaTE4bi9qcXVlcnktdWktdGltZXBpY2tlci12aS5qc1xuLyogVmlldG5hbWVzZSB0cmFuc2xhdGlvbiBmb3IgdGhlIGpRdWVyeSBUaW1lcGlja2VyIEFkZG9uICovXG4vKiBXcml0dGVuIGJ5IE5ndXllbiBEaW5oIFRydW5nICovXG5cblx0JC50aW1lcGlja2VyLnJlZ2lvbmFsWyd2aSddID0ge1xuXHRcdHRpbWVPbmx5VGl0bGU6ICdDaOG7jW4gZ2nhu50nLFxuXHRcdHRpbWVUZXh0OiAnVGjhu51pIGdpYW4nLFxuXHRcdGhvdXJUZXh0OiAnR2nhu50nLFxuXHRcdG1pbnV0ZVRleHQ6ICdQaMO6dCcsXG5cdFx0c2Vjb25kVGV4dDogJ0dpw6J5Jyxcblx0XHRtaWxsaXNlY1RleHQ6ICdNaWxpIGdpw6J5Jyxcblx0XHRtaWNyb3NlY1RleHQ6ICdNaWNyw7QgZ2nDonknLFxuXHRcdHRpbWV6b25lVGV4dDogJ03DumkgZ2nhu50nLFxuXHRcdGN1cnJlbnRUZXh0OiAnSGnhu4duIHRo4budaScsXG5cdFx0Y2xvc2VUZXh0OiAnxJDDs25nJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsnU0EnLCAnUyddLFxuXHRcdHBtTmFtZXM6IFsnQ0gnLCAnQyddLFxuXHRcdGlzUlRMOiBmYWxzZVxuXHR9O1xuXG4vLyBzb3VyY2U6IHNyYy9pMThuL2pxdWVyeS11aS10aW1lcGlja2VyLXpoLUNOLmpzXG4vKiBTaW1wbGlmaWVkIENoaW5lc2UgdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAvXG4vIFdyaXR0ZW4gYnkgV2lsbCBMdSAqL1xuXG5cdCQudGltZXBpY2tlci5yZWdpb25hbFsnemgtQ04nXSA9IHtcblx0XHR0aW1lT25seVRpdGxlOiAn6YCJ5oup5pe26Ze0Jyxcblx0XHR0aW1lVGV4dDogJ+aXtumXtCcsXG5cdFx0aG91clRleHQ6ICflsI/ml7YnLFxuXHRcdG1pbnV0ZVRleHQ6ICfliIbpkp8nLFxuXHRcdHNlY29uZFRleHQ6ICfnp5Lpkp8nLFxuXHRcdG1pbGxpc2VjVGV4dDogJ+avq+enkicsXG5cdFx0bWljcm9zZWNUZXh0OiAn5b6u56eSJyxcblx0XHR0aW1lem9uZVRleHQ6ICfml7bljLonLFxuXHRcdGN1cnJlbnRUZXh0OiAn546w5Zyo5pe26Ze0Jyxcblx0XHRjbG9zZVRleHQ6ICflhbPpl60nLFxuXHRcdHRpbWVGb3JtYXQ6ICdISDptbScsXG5cdFx0dGltZVN1ZmZpeDogJycsXG5cdFx0YW1OYW1lczogWydBTScsICdBJ10sXG5cdFx0cG1OYW1lczogWydQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbi8vIHNvdXJjZTogc3JjL2kxOG4vanF1ZXJ5LXVpLXRpbWVwaWNrZXItemgtVFcuanNcbi8qIENoaW5lc2UgdHJhbnNsYXRpb24gZm9yIHRoZSBqUXVlcnkgVGltZXBpY2tlciBBZGRvbiAqL1xuLyogV3JpdHRlbiBieSBBbGFuZy5saW4gKi9cblxuXHQkLnRpbWVwaWNrZXIucmVnaW9uYWxbJ3poLVRXJ10gPSB7XG5cdFx0dGltZU9ubHlUaXRsZTogJ+mBuOaTh+aZguWIhuenkicsXG5cdFx0dGltZVRleHQ6ICfmmYLplpMnLFxuXHRcdGhvdXJUZXh0OiAn5pmCJyxcblx0XHRtaW51dGVUZXh0OiAn5YiGJyxcblx0XHRzZWNvbmRUZXh0OiAn56eSJyxcblx0XHRtaWxsaXNlY1RleHQ6ICfmr6vnp5InLFxuXHRcdG1pY3Jvc2VjVGV4dDogJ+W+ruenkicsXG5cdFx0dGltZXpvbmVUZXh0OiAn5pmC5Y2AJyxcblx0XHRjdXJyZW50VGV4dDogJ+ePvuWcqOaZgumWkycsXG5cdFx0Y2xvc2VUZXh0OiAn56K65a6aJyxcblx0XHR0aW1lRm9ybWF0OiAnSEg6bW0nLFxuXHRcdHRpbWVTdWZmaXg6ICcnLFxuXHRcdGFtTmFtZXM6IFsn5LiK5Y2IJywgJ0FNJywgJ0EnXSxcblx0XHRwbU5hbWVzOiBbJ+S4i+WNiCcsICdQTScsICdQJ10sXG5cdFx0aXNSVEw6IGZhbHNlXG5cdH07XG5cbn0pKGpRdWVyeSk7XG4iXX0=