From 74b3a96c24cde768144d2ffd6df949ebffacdb89 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Tue, 26 Sep 2023 08:24:35 -0700 Subject: [PATCH] Fixing Icon-Picker and cleanup sass (#14393) --- .../wwwroot/Scripts/media.js | 322 +- .../wwwroot/Scripts/media.min.js | 2 +- .../wwwroot/Scripts/trumbowyg-plugins.js | 7140 ++++++++--------- .../wwwroot/Scripts/trumbowyg-plugins.min.js | 2 +- .../Views/TaxonomyField-Tags.Edit.cshtml | 2 +- .../Assets/scss/components/_icon-picker.scss | 21 + .../Assets/scss/components/_sortable.scss | 5 + .../TheAdmin/Assets/scss/index.scss | 12 +- .../scss/{components => main}/_helpers.scss | 4 + .../scss/{components => main}/_layout.scss | 24 +- .../TheAdmin/Assets/scss/main/_overrides.scss | 7 + .../TheAdmin/Views/Layout.cshtml | 15 +- .../TheAdmin/wwwroot/css/TheAdmin.css | 83 +- .../TheAdmin/wwwroot/css/TheAdmin.min.css | 2 +- 14 files changed, 3866 insertions(+), 3775 deletions(-) create mode 100644 src/OrchardCore.Themes/TheAdmin/Assets/scss/components/_icon-picker.scss create mode 100644 src/OrchardCore.Themes/TheAdmin/Assets/scss/components/_sortable.scss rename src/OrchardCore.Themes/TheAdmin/Assets/scss/{components => main}/_helpers.scss (93%) rename src/OrchardCore.Themes/TheAdmin/Assets/scss/{components => main}/_layout.scss (71%) create mode 100644 src/OrchardCore.Themes/TheAdmin/Assets/scss/main/_overrides.scss diff --git a/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.js b/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.js index 8c2484f0ff9..f3fda24cd52 100644 --- a/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.js +++ b/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.js @@ -2475,6 +2475,166 @@ Vue.component('sortIndicator', { } } }); +// component +Vue.component('upload', { + template: '\ +
\ + \ +

{{ model.name }}

\ +
\ + \ + Error: {{ model.errorMessage }} \ +
\ +
\ + ', + props: { + model: Object, + uploadInputId: String + }, + mounted: function mounted() { + var _self$uploadInputId; + var self = this; + var uploadInput = document.getElementById((_self$uploadInputId = self.uploadInputId) !== null && _self$uploadInputId !== void 0 ? _self$uploadInputId : 'fileupload'); + $(uploadInput).bind('fileuploadprogress', function (e, data) { + if (data.files[0].name !== self.model.name) { + return; + } + self.model.percentage = parseInt(data.loaded / data.total * 100, 10); + }); + $(uploadInput).bind('fileuploaddone', function (e, data) { + if (data.files[0].name !== self.model.name) { + return; + } + if (data.result.files[0].error) { + self.handleFailure(data.files[0].name, data.result.files[0].error); + } else { + bus.$emit('removalRequest', self.model); + } + }); + $(uploadInput).bind('fileuploadfail', function (e, data) { + if (data.files[0].name !== self.model.name) { + return; + } + self.handleFailure(data.files[0].name, $('#t-error').val()); + }); + }, + methods: { + handleFailure: function handleFailure(fileName, message) { + if (fileName !== this.model.name) { + return; + } + this.model.errorMessage = message; + bus.$emit('ErrorOnUpload', this.model); + }, + dismissWarning: function dismissWarning() { + bus.$emit('removalRequest', this.model); + } + } +}); +// component +Vue.component('uploadList', { + template: '\ +
\ +
\ + {{ T.uploads }} \ + (Pending: {{ pendingCount }}) \ + ( {{ T.errors }}: {{ errorCount }} / {{ T.clearErrors }} ) \ +
\ +
\ + \ +
\ +
\ + \ +
\ +
\ +
\ +
\ +
\ + \ +
\ +
\ +
\ + ', + data: function data() { + return { + files: [], + T: {}, + expanded: false, + pendingCount: 0, + errorCount: 0 + }; + }, + props: { + uploadInputId: String + }, + created: function created() { + var self = this; + // retrieving localized strings from view + self.T.uploads = $('#t-uploads').val(); + self.T.errors = $('#t-errors').val(); + self.T.clearErrors = $('#t-clear-errors').val(); + }, + computed: { + fileCount: function fileCount() { + return this.files.length; + } + }, + mounted: function mounted() { + var _self$uploadInputId; + var self = this; + var uploadInput = document.getElementById((_self$uploadInputId = self.uploadInputId) !== null && _self$uploadInputId !== void 0 ? _self$uploadInputId : 'fileupload'); + $(uploadInput).bind('fileuploadadd', function (e, data) { + if (!data.files) { + return; + } + data.files.forEach(function (newFile) { + var alreadyInList = self.files.some(function (f) { + return f.name == newFile.name; + }); + if (!alreadyInList) { + self.files.push({ + name: newFile.name, + percentage: 0, + errorMessage: '' + }); + } else { + console.error('A file with the same name is already on the queue:' + newFile.name); + } + }); + }); + bus.$on('removalRequest', function (fileUpload) { + self.files.forEach(function (item, index, array) { + if (item.name == fileUpload.name) { + array.splice(index, 1); + } + }); + }); + bus.$on('ErrorOnUpload', function (fileUpload) { + self.updateCount(); + }); + }, + methods: { + updateCount: function updateCount() { + this.errorCount = this.files.filter(function (item) { + return item.errorMessage != ''; + }).length; + this.pendingCount = this.files.length - this.errorCount; + if (this.files.length < 1) { + this.expanded = false; + } + }, + clearErrors: function clearErrors() { + this.files = this.files.filter(function (item) { + return item.errorMessage == ''; + }); + } + }, + watch: { + files: function files() { + this.updateCount(); + } + } +}); function initializeAttachedMediaField(el, idOfUploadButton, uploadAction, mediaItemUrl, allowMultiple, allowMediaText, allowAnchors, tempUploadFolder, maxUploadChunkSize) { var target = $(document.getElementById($(el).data('for'))); var initialPaths = target.data("init"); @@ -3190,164 +3350,4 @@ Vue.component('mediaFieldThumbsContainer', { } } }); -// component -Vue.component('upload', { - template: '\ -
\ - \ -

{{ model.name }}

\ -
\ - \ - Error: {{ model.errorMessage }} \ -
\ -
\ - ', - props: { - model: Object, - uploadInputId: String - }, - mounted: function mounted() { - var _self$uploadInputId; - var self = this; - var uploadInput = document.getElementById((_self$uploadInputId = self.uploadInputId) !== null && _self$uploadInputId !== void 0 ? _self$uploadInputId : 'fileupload'); - $(uploadInput).bind('fileuploadprogress', function (e, data) { - if (data.files[0].name !== self.model.name) { - return; - } - self.model.percentage = parseInt(data.loaded / data.total * 100, 10); - }); - $(uploadInput).bind('fileuploaddone', function (e, data) { - if (data.files[0].name !== self.model.name) { - return; - } - if (data.result.files[0].error) { - self.handleFailure(data.files[0].name, data.result.files[0].error); - } else { - bus.$emit('removalRequest', self.model); - } - }); - $(uploadInput).bind('fileuploadfail', function (e, data) { - if (data.files[0].name !== self.model.name) { - return; - } - self.handleFailure(data.files[0].name, $('#t-error').val()); - }); - }, - methods: { - handleFailure: function handleFailure(fileName, message) { - if (fileName !== this.model.name) { - return; - } - this.model.errorMessage = message; - bus.$emit('ErrorOnUpload', this.model); - }, - dismissWarning: function dismissWarning() { - bus.$emit('removalRequest', this.model); - } - } -}); -// component -Vue.component('uploadList', { - template: '\ -
\ -
\ - {{ T.uploads }} \ - (Pending: {{ pendingCount }}) \ - ( {{ T.errors }}: {{ errorCount }} / {{ T.clearErrors }} ) \ -
\ -
\ - \ -
\ -
\ - \ -
\ -
\ -
\ -
\ -
\ - \ -
\ -
\ -
\ - ', - data: function data() { - return { - files: [], - T: {}, - expanded: false, - pendingCount: 0, - errorCount: 0 - }; - }, - props: { - uploadInputId: String - }, - created: function created() { - var self = this; - // retrieving localized strings from view - self.T.uploads = $('#t-uploads').val(); - self.T.errors = $('#t-errors').val(); - self.T.clearErrors = $('#t-clear-errors').val(); - }, - computed: { - fileCount: function fileCount() { - return this.files.length; - } - }, - mounted: function mounted() { - var _self$uploadInputId; - var self = this; - var uploadInput = document.getElementById((_self$uploadInputId = self.uploadInputId) !== null && _self$uploadInputId !== void 0 ? _self$uploadInputId : 'fileupload'); - $(uploadInput).bind('fileuploadadd', function (e, data) { - if (!data.files) { - return; - } - data.files.forEach(function (newFile) { - var alreadyInList = self.files.some(function (f) { - return f.name == newFile.name; - }); - if (!alreadyInList) { - self.files.push({ - name: newFile.name, - percentage: 0, - errorMessage: '' - }); - } else { - console.error('A file with the same name is already on the queue:' + newFile.name); - } - }); - }); - bus.$on('removalRequest', function (fileUpload) { - self.files.forEach(function (item, index, array) { - if (item.name == fileUpload.name) { - array.splice(index, 1); - } - }); - }); - bus.$on('ErrorOnUpload', function (fileUpload) { - self.updateCount(); - }); - }, - methods: { - updateCount: function updateCount() { - this.errorCount = this.files.filter(function (item) { - return item.errorMessage != ''; - }).length; - this.pendingCount = this.files.length - this.errorCount; - if (this.files.length < 1) { - this.expanded = false; - } - }, - clearErrors: function clearErrors() { - this.files = this.files.filter(function (item) { - return item.errorMessage == ''; - }); - } - }, - watch: { - files: function files() { - this.updateCount(); - } - } -}); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImpxdWVyeS5maWxldXBsb2FkLmpzIiwianF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanMiLCJNZWRpYUFwcC9hcHAuanMiLCJNZWRpYUFwcC9maWxldXBsb2FkLmpzIiwiTWVkaWFBcHAvZm9sZGVyQ29tcG9uZW50LmpzIiwiTWVkaWFBcHAvbWVkaWFJdGVtc0dyaWRDb21wb25lbnQuanMiLCJNZWRpYUFwcC9tZWRpYUl0ZW1zVGFibGVDb21wb25lbnQuanMiLCJNZWRpYUFwcC9wYWdlckNvbXBvbmVudC5qcyIsIk1lZGlhQXBwL3NvcnRJbmRpY2F0b3JDb21wb25lbnQuanMiLCJNZWRpYUZpZWxkL2F0dGFjaGVkTWVkaWFGaWVsZC5qcyIsIk1lZGlhRmllbGQvbWVkaWFmaWVsZC5qcyIsIk1lZGlhRmllbGQvbWVkaWFmaWVsZHNBcHBzQXJyYXkuanMiLCJNZWRpYUZpZWxkL21lZGlhRmllbGRUaHVtYnNDb250YWluZXIuanMiLCJTaGFyZWQvdXBsb2FkQ29tcG9uZW50LmpzIiwiU2hhcmVkL3VwbG9hZExpc3RDb21wb25lbnQuanMiXSwibmFtZXMiOlsiZmFjdG9yeSIsImRlZmluZSIsImFtZCIsImV4cG9ydHMiLCJfdHlwZW9mIiwicmVxdWlyZSIsIndpbmRvdyIsImpRdWVyeSIsIiQiLCJzdXBwb3J0IiwiZmlsZUlucHV0IiwiUmVnRXhwIiwidGVzdCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInByb3AiLCJ4aHJGaWxlVXBsb2FkIiwiUHJvZ3Jlc3NFdmVudCIsIkZpbGVSZWFkZXIiLCJ4aHJGb3JtRGF0YUZpbGVVcGxvYWQiLCJGb3JtRGF0YSIsImJsb2JTbGljZSIsIkJsb2IiLCJwcm90b3R5cGUiLCJzbGljZSIsIndlYmtpdFNsaWNlIiwibW96U2xpY2UiLCJnZXREcmFnSGFuZGxlciIsInR5cGUiLCJpc0RyYWdPdmVyIiwiZSIsImRhdGFUcmFuc2ZlciIsIm9yaWdpbmFsRXZlbnQiLCJpbkFycmF5IiwidHlwZXMiLCJfdHJpZ2dlciIsIkV2ZW50IiwiZGVsZWdhdGVkRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImRyb3BFZmZlY3QiLCJ3aWRnZXQiLCJvcHRpb25zIiwiZHJvcFpvbmUiLCJkb2N1bWVudCIsInBhc3RlWm9uZSIsInVuZGVmaW5lZCIsInJlcGxhY2VGaWxlSW5wdXQiLCJwYXJhbU5hbWUiLCJzaW5nbGVGaWxlVXBsb2FkcyIsImxpbWl0TXVsdGlGaWxlVXBsb2FkcyIsImxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSIsImxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZU92ZXJoZWFkIiwic2VxdWVudGlhbFVwbG9hZHMiLCJsaW1pdENvbmN1cnJlbnRVcGxvYWRzIiwiZm9yY2VJZnJhbWVUcmFuc3BvcnQiLCJyZWRpcmVjdCIsInJlZGlyZWN0UGFyYW1OYW1lIiwicG9zdE1lc3NhZ2UiLCJtdWx0aXBhcnQiLCJtYXhDaHVua1NpemUiLCJ1cGxvYWRlZEJ5dGVzIiwicmVjYWxjdWxhdGVQcm9ncmVzcyIsInByb2dyZXNzSW50ZXJ2YWwiLCJiaXRyYXRlSW50ZXJ2YWwiLCJhdXRvVXBsb2FkIiwidW5pcXVlRmlsZW5hbWVzIiwibWVzc2FnZXMiLCJpMThuIiwibWVzc2FnZSIsImNvbnRleHQiLCJ0b1N0cmluZyIsImVhY2giLCJrZXkiLCJ2YWx1ZSIsInJlcGxhY2UiLCJmb3JtRGF0YSIsImZvcm0iLCJzZXJpYWxpemVBcnJheSIsImFkZCIsImRhdGEiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJmaWxldXBsb2FkIiwicHJvY2VzcyIsImRvbmUiLCJzdWJtaXQiLCJwcm9jZXNzRGF0YSIsImNvbnRlbnRUeXBlIiwiY2FjaGUiLCJ0aW1lb3V0IiwiX3Byb21pc2VQaXBlIiwicGFydHMiLCJmbiIsImpxdWVyeSIsInNwbGl0IiwiTnVtYmVyIiwiX3NwZWNpYWxPcHRpb25zIiwiX2Jsb2JTbGljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX0JpdHJhdGVUaW1lciIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJnZXRUaW1lIiwibG9hZGVkIiwiYml0cmF0ZSIsImdldEJpdHJhdGUiLCJpbnRlcnZhbCIsInRpbWVEaWZmIiwiX2lzWEhSVXBsb2FkIiwiX2dldEZvcm1EYXRhIiwiaXNBcnJheSIsIm5hbWUiLCJwdXNoIiwiX2dldFRvdGFsIiwiZmlsZXMiLCJ0b3RhbCIsImluZGV4IiwiZmlsZSIsInNpemUiLCJfaW5pdFByb2dyZXNzT2JqZWN0Iiwib2JqIiwicHJvZ3Jlc3MiLCJfcHJvZ3Jlc3MiLCJleHRlbmQiLCJfaW5pdFJlc3BvbnNlT2JqZWN0IiwiX3Jlc3BvbnNlIiwiT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiX29uUHJvZ3Jlc3MiLCJsZW5ndGhDb21wdXRhYmxlIiwiX3RpbWUiLCJNYXRoIiwiZmxvb3IiLCJjaHVua1NpemUiLCJfYml0cmF0ZVRpbWVyIiwiX2luaXRQcm9ncmVzc0xpc3RlbmVyIiwidGhhdCIsInhociIsImFqYXhTZXR0aW5ncyIsInVwbG9hZCIsIm9uIiwib2UiLCJfZGVpbml0UHJvZ3Jlc3NMaXN0ZW5lciIsIm9mZiIsIl9pc0luc3RhbmNlT2YiLCJfZ2V0VW5pcXVlRmlsZW5hbWUiLCJtYXAiLCJTdHJpbmciLCJfIiwicDEiLCJwMiIsImV4dCIsIl9pbml0WEhSRGF0YSIsImhlYWRlcnMiLCJjb250ZW50UmFuZ2UiLCJibG9iIiwiZW5jb2RlVVJJIiwidXBsb2FkTmFtZSIsImZpZWxkIiwiYXBwZW5kIiwiZmlsZU5hbWUiLCJfaW5pdElmcmFtZVNldHRpbmdzIiwidGFyZ2V0SG9zdCIsInVybCIsImRhdGFUeXBlIiwibG9jYXRpb24iLCJob3N0IiwiX2luaXREYXRhU2V0dGluZ3MiLCJfY2h1bmtlZFVwbG9hZCIsIl9nZXRQYXJhbU5hbWUiLCJpbnB1dCIsImkiLCJsZW5ndGgiLCJfaW5pdEZvcm1TZXR0aW5ncyIsImhyZWYiLCJ0b1VwcGVyQ2FzZSIsImZvcm1BY2NlcHRDaGFyc2V0IiwiYXR0ciIsIl9nZXRBSkFYU2V0dGluZ3MiLCJfZ2V0RGVmZXJyZWRTdGF0ZSIsImRlZmVycmVkIiwic3RhdGUiLCJpc1Jlc29sdmVkIiwiaXNSZWplY3RlZCIsIl9lbmhhbmNlUHJvbWlzZSIsInByb21pc2UiLCJzdWNjZXNzIiwiZXJyb3IiLCJmYWlsIiwiY29tcGxldGUiLCJhbHdheXMiLCJfZ2V0WEhSUHJvbWlzZSIsInJlc29sdmVPclJlamVjdCIsImFyZ3MiLCJkZmQiLCJEZWZlcnJlZCIsInJlc29sdmVXaXRoIiwicmVqZWN0V2l0aCIsImFib3J0IiwiX2FkZENvbnZlbmllbmNlTWV0aG9kcyIsImdldFByb21pc2UiLCJyZXNvbHZlRnVuYyIsInJlamVjdEZ1bmMiLCJfcHJvY2Vzc1F1ZXVlIiwiZXJyb3JUaHJvd24iLCJqcVhIUiIsIl9vblNlbmQiLCJwcm9jZXNzaW5nIiwicmVzcG9uc2UiLCJfZ2V0VXBsb2FkZWRCeXRlcyIsInJhbmdlIiwiZ2V0UmVzcG9uc2VIZWFkZXIiLCJ1cHBlckJ5dGVzUG9zIiwicGFyc2VJbnQiLCJ0ZXN0T25seSIsImZzIiwidWIiLCJtY3MiLCJvIiwiY3VycmVudExvYWRlZCIsImFqYXgiLCJyZXN1bHQiLCJ0ZXh0U3RhdHVzIiwiX2JlZm9yZVNlbmQiLCJfYWN0aXZlIiwiX29uRG9uZSIsIl9vbkZhaWwiLCJfb25BbHdheXMiLCJqcVhIUm9yUmVzdWx0IiwianFYSFJvckVycm9yIiwiYWJvcnRlZCIsInNsb3QiLCJwaXBlIiwic2VuZCIsIl9zZW5kaW5nIiwibmV4dFNsb3QiLCJfc2xvdHMiLCJzaGlmdCIsInJlc29sdmUiLCJfc2VxdWVuY2UiLCJfb25BZGQiLCJmaWxlc0xlbmd0aCIsImxpbWl0IiwibGltaXRTaXplIiwib3ZlcmhlYWQiLCJiYXRjaFNpemUiLCJwYXJhbU5hbWVTZXQiLCJwYXJhbU5hbWVTbGljZSIsImZpbGVTZXQiLCJqIiwib3JpZ2luYWxGaWxlcyIsImVsZW1lbnQiLCJuZXdEYXRhIiwiX3JlcGxhY2VGaWxlSW5wdXQiLCJpbnB1dENsb25lIiwiY2xvbmUiLCJyZXN0b3JlRm9jdXMiLCJpcyIsImFjdGl2ZUVsZW1lbnQiLCJmaWxlSW5wdXRDbG9uZSIsInJlc2V0IiwiYWZ0ZXIiLCJkZXRhY2giLCJ0cmlnZ2VyIiwiY2xlYW5EYXRhIiwiZWwiLCJfaGFuZGxlRmlsZVRyZWVFbnRyeSIsImVudHJ5IiwicGF0aCIsImVudHJpZXMiLCJkaXJSZWFkZXIiLCJlcnJvckhhbmRsZXIiLCJzdWNjZXNzSGFuZGxlciIsIl9oYW5kbGVGaWxlVHJlZUVudHJpZXMiLCJyZWFkRW50cmllcyIsInJlc3VsdHMiLCJjb25jYXQiLCJpc0ZpbGUiLCJfZmlsZSIsInJlbGF0aXZlUGF0aCIsImlzRGlyZWN0b3J5IiwiY3JlYXRlUmVhZGVyIiwid2hlbiIsIkFycmF5IiwiX2dldERyb3BwZWRGaWxlcyIsIml0ZW1zIiwid2Via2l0R2V0QXNFbnRyeSIsImdldEFzRW50cnkiLCJpdGVtIiwiZ2V0QXNGaWxlIiwibWFrZUFycmF5IiwiX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzIiwiZmlsZVNpemUiLCJfZ2V0RmlsZUlucHV0RmlsZXMiLCJfb25DaGFuZ2UiLCJ0YXJnZXQiLCJfb25QYXN0ZSIsImNsaXBib2FyZERhdGEiLCJfb25Ecm9wIiwiX29uRHJhZ092ZXIiLCJfb25EcmFnRW50ZXIiLCJfb25EcmFnTGVhdmUiLCJfaW5pdEV2ZW50SGFuZGxlcnMiLCJfb24iLCJkcmFnb3ZlciIsImRyb3AiLCJkcmFnZW50ZXIiLCJkcmFnbGVhdmUiLCJwYXN0ZSIsImNoYW5nZSIsIl9kZXN0cm95RXZlbnRIYW5kbGVycyIsIl9vZmYiLCJfZGVzdHJveSIsIl9zZXRPcHRpb24iLCJyZWluaXQiLCJfc3VwZXIiLCJfaW5pdFNwZWNpYWxPcHRpb25zIiwiZmluZCIsIl9nZXRSZWdFeHAiLCJzdHIiLCJtb2RpZmllcnMiLCJwb3AiLCJqb2luIiwiX2lzUmVnRXhwT3B0aW9uIiwiX2luaXREYXRhQXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJ0b0xvd2VyQ2FzZSIsImNoYXJBdCIsIl9jcmVhdGUiLCJhY3RpdmUiLCJkaXNhYmxlZCIsInJlamVjdCIsInRoZW4iLCJjb3VudGVyIiwianNvbkFQSSIsImpzb25QYXJzZSIsIkpTT04iLCJhamF4VHJhbnNwb3J0IiwiYXN5bmMiLCJpbml0aWFsSWZyYW1lU3JjIiwiaWZyYW1lIiwiYWRkUGFyYW1DaGFyIiwiY29tcGxldGVDYWxsYmFjayIsImZpbGVJbnB1dENsb25lcyIsInBhcmFtTmFtZXMiLCJjb250ZW50cyIsImZpcnN0Q2hpbGQiLCJFcnJvciIsImFwcGVuZFRvIiwic2V0VGltZW91dCIsInJlbW92ZSIsInZhbCIsInJlbW92ZUF0dHIiLCJyZXBsYWNlV2l0aCIsImJvZHkiLCJhamF4U2V0dXAiLCJjb252ZXJ0ZXJzIiwiaWZyYW1lVGV4dCIsInRleHQiLCJpZnJhbWVKc29uIiwiaWZyYW1lSHRtbCIsImh0bWwiLCJpZnJhbWVYbWwiLCJ4bWxEb2MiLCJpc1hNTERvYyIsInBhcnNlWE1MIiwiWE1MRG9jdW1lbnQiLCJ4bWwiLCJpZnJhbWVTY3JpcHQiLCJnbG9iYWxFdmFsIiwiaW5pdGlhbGl6ZWQiLCJtZWRpYUFwcCIsImJ1cyIsIlZ1ZSIsImluaXRpYWxpemVNZWRpYUFwcGxpY2F0aW9uIiwiZGlzcGxheU1lZGlhQXBwbGljYXRpb24iLCJtZWRpYUFwcGxpY2F0aW9uVXJsIiwicGF0aEJhc2UiLCJjb25zb2xlIiwibWV0aG9kIiwiY29udGVudCIsInJvb3QiLCJmb2xkZXIiLCJzZWxlY3RlZEZvbGRlciIsIm1lZGlhSXRlbXMiLCJzZWxlY3RlZE1lZGlhcyIsImVycm9ycyIsImRyYWdEcm9wVGh1bWJuYWlsIiwiSW1hZ2UiLCJzbWFsbFRodW1icyIsImdyaWRWaWV3IiwibWVkaWFGaWx0ZXIiLCJzb3J0QnkiLCJzb3J0QXNjIiwiaXRlbXNJblBhZ2UiLCJjcmVhdGVkIiwic2VsZiIsInNyYyIsIiRvbiIsInNlbGVjdFJvb3QiLCJzZWxlY3RlZCIsImVycm9ySW5mbyIsImxvYWRGb2xkZXIiLCJuZXdOYW1lIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJtZWRpYSIsImZpbHRlciIsIm1lZGlhUGF0aCIsImNyZWF0ZUZvbGRlciIsImRlbGV0ZUZvbGRlciIsIm5ld1NvcnQiLCJjaGFuZ2VTb3J0IiwidG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYSIsInJlbmFtZU1lZGlhIiwiZGVsZXRlTWVkaWFJdGVtIiwiaGFuZGxlRHJhZ1N0YXJ0IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImN1cnJlbnRQcmVmcyIsInBhcnNlIiwiY29tcHV0ZWQiLCJpc0hvbWUiLCJwYXJlbnRzIiwicCIsInBhcmVudEZvbGRlciIsInVuc2hpZnQiLCJwYXJlbnQiLCJmaWx0ZXJlZE1lZGlhSXRlbXMiLCJmaWx0ZXJlZCIsImluZGV4T2YiLCJzb3J0IiwiYSIsImIiLCJtaW1lIiwibG9jYWxlQ29tcGFyZSIsImxhc3RNb2RpZnkiLCJoaWRkZW5Db3VudCIsInRodW1iU2l6ZSIsImdldCIsInNldCIsIm5ld1ByZWZzIiwid2F0Y2giLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwibmV3Rm9sZGVyIiwibW91bnRlZCIsIiRyZWZzIiwicm9vdEZvbGRlciIsInRvZ2dsZSIsIm1ldGhvZHMiLCJ1cGxvYWRVcmwiLCJ1cmxWYWx1ZSIsImVuY29kZVVSSUNvbXBvbmVudCIsIm1lZGlhVXJsIiwibG9nIiwiZm9yRWFjaCIsIm9wZW4iLCJzZWxlY3RBbGwiLCJ1blNlbGVjdEFsbCIsImludmVydFNlbGVjdGlvbiIsInRlbXAiLCJpc01lZGlhU2VsZWN0ZWQiLCJzcGxpY2UiLCJzb21lIiwiYXJyYXkiLCJtb2RlbCIsImNvbmZpcm1EaWFsb2ciLCJfb2JqZWN0U3ByZWFkIiwiY2FsbGJhY2siLCJyZXNwIiwiX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4iLCIkZW1pdCIsInJlc3BvbnNlVGV4dCIsImVtcHR5IiwibW9kYWwiLCJib290c3RyYXAiLCJNb2RhbCIsImdldE9yQ3JlYXRlSW5zdGFuY2UiLCJzaG93IiwiZm9jdXMiLCJzZWxlY3RBbmREZWxldGVNZWRpYSIsImRlbGV0ZU1lZGlhIiwiZGVsZXRlTWVkaWFMaXN0IiwibWVkaWFMaXN0IiwicGF0aHMiLCJtZWRpYU5hbWVzIiwic2V0RGF0YSIsInNldERyYWdJbWFnZSIsImVmZmVjdEFsbG93ZWQiLCJoYW5kbGVTY3JvbGxXaGlsZURyYWciLCJjbGllbnRZIiwic2Nyb2xsQnkiLCJpbm5lckhlaWdodCIsImtleXByZXNzIiwid2hpY2giLCJjbGljayIsImhpZGUiLCJlcnJvck1lc3NhZ2UiLCJvbGROYW1lIiwiY3VycmVudEZvbGRlciIsImdldEVsZW1lbnRCeUlkIiwic3R5bGUiLCJkaXNwbGF5IiwiY2h1bmtlZEZpbGVVcGxvYWRJZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJhbnRpRm9yZ2VyeVRva2VuIiwiRmlsZSIsImxhc3RNb2RpZmllZCIsImJpbmQiLCJkdCIsImNvbnRhaW5zIiwiZHJvcFpvbmVUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiYWRkQ2xhc3MiLCJob3ZlcmVkRHJvcFpvbmUiLCJjbG9zZXN0IiwicmVtb3ZlQ2xhc3MiLCJjb21wb25lbnQiLCJ0ZW1wbGF0ZSIsImRpciIsInByb3BzIiwic2VsZWN0ZWRJbk1lZGlhQXBwIiwibGV2ZWwiLCJjaGlsZHJlbiIsImlzSG92ZXJlZCIsInBhZGRpbmciLCJpc1NlbGVjdGVkIiwiaXNSb290IiwiaXNBbmNlc3Rvck9mU2VsZWN0ZWRGb2xkZXIiLCJsb2FkQ2hpbGRyZW4iLCJzZWxlY3QiLCJjIiwiZW10cHkiLCJoYW5kbGVEcmFnT3ZlciIsImhhbmRsZURyYWdMZWF2ZSIsIm1vdmVNZWRpYVRvRm9sZGVyIiwiZ2V0RGF0YSIsInNvdXJjZUZvbGRlciIsInRhcmdldEZvbGRlciIsImFsZXJ0IiwiVCIsImVkaXRCdXR0b24iLCJkZWxldGVCdXR0b24iLCJidWlsZE1lZGlhVXJsIiwiZHJhZ1N0YXJ0IiwiQm9vbGVhbiIsImltYWdlSGVhZGVyIiwibmFtZUhlYWRlciIsImxhc3RNb2RpZnlIZWFkZXIiLCJzaXplSGVhZGVyIiwidHlwZUhlYWRlciIsInZpZXdCdXR0b24iLCJwcmludERhdGVUaW1lIiwiZGF0ZW1pbGxpcyIsImQiLCJ0b0xvY2FsZVN0cmluZyIsInNvdXJjZUl0ZW1zIiwicGFnZVNpemUiLCJwYWdlU2l6ZU9wdGlvbnMiLCJjdXJyZW50IiwicGFnZXJGaXJzdEJ1dHRvbiIsInBhZ2VyUHJldmlvdXNCdXR0b24iLCJwYWdlck5leHRCdXR0b24iLCJwYWdlckxhc3RCdXR0b24iLCJwYWdlclBhZ2VTaXplTGFiZWwiLCJwYWdlclBhZ2VMYWJlbCIsInBhZ2VyVG90YWxMYWJlbCIsIm5leHQiLCJwcmV2aW91cyIsImdvRmlyc3QiLCJnb0xhc3QiLCJ0b3RhbFBhZ2VzIiwiZ29UbyIsInRhcmdldFBhZ2UiLCJwYWdlcyIsImNlaWwiLCJpc0xhc3RQYWdlIiwiaXNGaXJzdFBhZ2UiLCJjYW5Eb05leHQiLCJjYW5Eb1ByZXYiLCJjYW5Eb0ZpcnN0IiwiY2FuRG9MYXN0IiwiaXRlbXNJbkN1cnJlbnRQYWdlIiwic3RhcnQiLCJlbmQiLCJwYWdlTGlua3MiLCJsaW5rcyIsImJlZm9yZUN1cnJlbnQiLCJiZWZvcmVCZWZvcmVDdXJyZW50IiwiYWZ0ZXJDdXJyZW50IiwiYWZ0ZXJBZnRlckN1cnJlbnQiLCJjb2xuYW1lIiwic2VsZWN0ZWRjb2xuYW1lIiwiYXNjIiwiaXNBY3RpdmUiLCJpbml0aWFsaXplQXR0YWNoZWRNZWRpYUZpZWxkIiwiaWRPZlVwbG9hZEJ1dHRvbiIsInVwbG9hZEFjdGlvbiIsIm1lZGlhSXRlbVVybCIsImFsbG93TXVsdGlwbGUiLCJhbGxvd01lZGlhVGV4dCIsImFsbG93QW5jaG9ycyIsInRlbXBVcGxvYWRGb2xkZXIiLCJtYXhVcGxvYWRDaHVua1NpemUiLCJpbml0aWFsUGF0aHMiLCJtZWRpYUZpZWxkRWRpdG9yIiwiaWRwcmVmaXgiLCJtZWRpYUZpZWxkQXBwIiwibWVkaWFGaWVsZEFwcHMiLCJzZWxlY3RlZE1lZGlhIiwiaWRQcmVmaXgiLCJiYWNrdXBNZWRpYVRleHQiLCJiYWNrdXBBbmNob3IiLCJtZWRpYVRleHRtb2RhbCIsImFuY2hvcmluZ01vZGFsIiwibWVkaWFQYXRocyIsIngiLCJpc1JlbW92ZWQiLCJpc05ldyIsIm1lZGlhVGV4dCIsImFuY2hvciIsImF0dGFjaGVkRmlsZU5hbWUiLCJ2YWx1ZXMiLCJzaWduYWwiLCJ2dWVrZXkiLCJ5Iiwicm91bmQiLCJjYW5BZGRNZWRpYSIsIm5vblJlbW92ZWRNZWRpYUl0ZW1zIiwic2VsZWN0TWVkaWEiLCJzZWxlY3RvciIsImVkaXRvcklkIiwiY291bnQiLCJnZXRVbmlxdWVJZCIsIm5ld01lZGlhSXRlbXMiLCJlcnJvcm1zZyIsInIiLCJyYW5kb20iLCJ2IiwicmVtb3ZlU2VsZWN0ZWQiLCJldmVudCIsInJlbW92ZWQiLCJzaG93TWVkaWFUZXh0TW9kYWwiLCJtZWRpYVRleHRNb2RhbCIsImNhbmNlbE1lZGlhVGV4dE1vZGFsIiwic2hvd0FuY2hvck1vZGFsIiwiY2FuY2VsQW5jaG9yaW5nTW9kYWwiLCJyZXNldEFuY2hvciIsIm9uQW5jaG9yRHJvcCIsImltYWdlIiwiYW5jaG9ySW1hZ2UiLCJvZmZzZXRYIiwiY2xpZW50V2lkdGgiLCJvZmZzZXRZIiwiY2xpZW50SGVpZ2h0IiwiYW5jaG9yTGVmdCIsIm1vZGFsQm9keSIsIm9mZnNldCIsInBvc2l0aW9uIiwiYW5jaG9yVG9wIiwic2V0QW5jaG9yIiwiYWRkTWVkaWFGaWxlcyIsImRlZXAiLCJoYW5kbGVyIiwiaW5pdGlhbGl6ZU1lZGlhRmllbGQiLCJtb2RhbEJvZHlFbGVtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInNob3dNb2RhbCIsImFuY2hvckljb24iLCJxdWVyeVNlbGVjdG9yIiwiaXNJbnRlZ2VyIiwibWVkaWFOb3RGb3VuZCIsImRpc2NhcmRXYXJuaW5nIiwibm9JbWFnZXMiLCIkcGFyZW50IiwidXBsb2FkSW5wdXRJZCIsIl9zZWxmJHVwbG9hZElucHV0SWQiLCJ1cGxvYWRJbnB1dCIsInBlcmNlbnRhZ2UiLCJoYW5kbGVGYWlsdXJlIiwiZGlzbWlzc1dhcm5pbmciLCJleHBhbmRlZCIsInBlbmRpbmdDb3VudCIsImVycm9yQ291bnQiLCJ1cGxvYWRzIiwiY2xlYXJFcnJvcnMiLCJmaWxlQ291bnQiLCJuZXdGaWxl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TUFDSixDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7SUFFRmlRLEdBQUcsQ0FBQzBCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsVUFBVXNTLFVBQVUsRUFBRTtNQUMzQ3hTLElBQUksQ0FBQ3lTLFdBQVcsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQztFQUNOLENBQUM7RUFDRG5QLE9BQU8sRUFBRTtJQUNMbVAsV0FBVyxFQUFFLFNBQUFBLFlBQUEsRUFBWTtNQUNyQixJQUFJLENBQUNSLFVBQVUsR0FBRyxJQUFJLENBQUM1akIsS0FBSyxDQUFDc1MsTUFBTSxDQUFDLFVBQVV2SCxJQUFJLEVBQUU7UUFDaEQsT0FBT0EsSUFBSSxDQUFDa04sWUFBWSxJQUFJLEVBQUU7TUFDbEMsQ0FBQyxDQUFDLENBQUN0VSxNQUFNO01BQ1QsSUFBSSxDQUFDZ2dCLFlBQVksR0FBRyxJQUFJLENBQUMzakIsS0FBSyxDQUFDMkQsTUFBTSxHQUFHLElBQUksQ0FBQ2lnQixVQUFVO01BQ3ZELElBQUksSUFBSSxDQUFDNWpCLEtBQUssQ0FBQzJELE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdkIsSUFBSSxDQUFDK2YsUUFBUSxHQUFHLEtBQUs7TUFDekI7SUFDSixDQUFDO0lBQ0RJLFdBQVcsRUFBRSxTQUFBQSxZQUFBLEVBQVk7TUFDckIsSUFBSSxDQUFDOWpCLEtBQUssR0FBRyxJQUFJLENBQUNBLEtBQUssQ0FBQ3NTLE1BQU0sQ0FBQyxVQUFVdkgsSUFBSSxFQUFFO1FBQzNDLE9BQU9BLElBQUksQ0FBQ2tOLFlBQVksSUFBSSxFQUFFO01BQ2xDLENBQUMsQ0FBQztJQUNOO0VBQ0osQ0FBQztFQUNEeEQsS0FBSyxFQUFFO0lBQ0h6VSxLQUFLLEVBQUUsU0FBQUEsTUFBQSxFQUFZO01BQ2YsSUFBSSxDQUFDb2tCLFdBQVcsQ0FBQyxDQUFDO0lBQ3RCO0VBQ0o7QUFDSixDQUFDLENBQUMiLCJmaWxlIjoibWVkaWEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpblxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkXG4gKlxuICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICovXG5cbi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOlxuICAgIGRlZmluZShbJ2pxdWVyeScsICdqcXVlcnktdWkvdWkvd2lkZ2V0J10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgIC8vIE5vZGUvQ29tbW9uSlM6XG4gICAgZmFjdG9yeShyZXF1aXJlKCdqcXVlcnknKSwgcmVxdWlyZSgnLi92ZW5kb3IvanF1ZXJ5LnVpLndpZGdldCcpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCcm93c2VyIGdsb2JhbHM6XG4gICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTtcbiAgfVxufSkoZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIERldGVjdCBmaWxlIGlucHV0IHN1cHBvcnQsIGJhc2VkIG9uXG4gIC8vIGh0dHBzOi8vdmlsamFtaXMuY29tLzIwMTIvZmlsZS11cGxvYWQtc3VwcG9ydC1vbi1tb2JpbGUvXG4gICQuc3VwcG9ydC5maWxlSW5wdXQgPSAhKFxuICAgIG5ldyBSZWdFeHAoXG4gICAgICAvLyBIYW5kbGUgZGV2aWNlcyB3aGljaCBnaXZlIGZhbHNlIHBvc2l0aXZlcyBmb3IgdGhlIGZlYXR1cmUgZGV0ZWN0aW9uOlxuICAgICAgJyhBbmRyb2lkICgxXFxcXC5bMDE1Nl18MlxcXFwuWzAxXSkpJyArXG4gICAgICAgICd8KFdpbmRvd3MgUGhvbmUgKE9TIDd8OFxcXFwuMCkpfChYQkxXUCl8KFp1bmVXUCl8KFdQRGVza3RvcCknICtcbiAgICAgICAgJ3wodyhlYik/T1NCcm93c2VyKXwod2ViT1MpJyArXG4gICAgICAgICd8KEtpbmRsZS8oMVxcXFwuMHwyXFxcXC5bMDVdfDNcXFxcLjApKSdcbiAgICApLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHx8XG4gICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gZm9yIGFsbCBvdGhlciBkZXZpY2VzOlxuICAgICQoJzxpbnB1dCB0eXBlPVwiZmlsZVwiLz4nKS5wcm9wKCdkaXNhYmxlZCcpXG4gICk7XG5cbiAgLy8gVGhlIEZpbGVSZWFkZXIgQVBJIGlzIG5vdCBhY3R1YWxseSB1c2VkLCBidXQgd29ya3MgYXMgZmVhdHVyZSBkZXRlY3Rpb24sXG4gIC8vIGFzIHNvbWUgU2FmYXJpIHZlcnNpb25zICg1Pykgc3VwcG9ydCBYSFIgZmlsZSB1cGxvYWRzIHZpYSB0aGUgRm9ybURhdGEgQVBJLFxuICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2Fkcy5cbiAgLy8gd2luZG93LlhNTEh0dHBSZXF1ZXN0VXBsb2FkIGlzIG5vdCBhdmFpbGFibGUgb24gSUUxMCwgc28gd2UgY2hlY2sgZm9yXG4gIC8vIHdpbmRvdy5Qcm9ncmVzc0V2ZW50IGluc3RlYWQgdG8gZGV0ZWN0IFhIUjIgZmlsZSB1cGxvYWQgY2FwYWJpbGl0eTpcbiAgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQgPSAhISh3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7XG4gICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQgPSAhIXdpbmRvdy5Gb3JtRGF0YTtcblxuICAvLyBEZXRlY3Qgc3VwcG9ydCBmb3IgQmxvYiBzbGljaW5nIChyZXF1aXJlZCBmb3IgY2h1bmtlZCB1cGxvYWRzKTpcbiAgJC5zdXBwb3J0LmJsb2JTbGljZSA9XG4gICAgd2luZG93LkJsb2IgJiZcbiAgICAoQmxvYi5wcm90b3R5cGUuc2xpY2UgfHxcbiAgICAgIEJsb2IucHJvdG90eXBlLndlYmtpdFNsaWNlIHx8XG4gICAgICBCbG9iLnByb3RvdHlwZS5tb3pTbGljZSk7XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZHJhZyBoYW5kbGVycyBmb3IgZHJhZ292ZXIvZHJhZ2VudGVyL2RyYWdsZWF2ZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFdmVudCB0eXBlXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gRHJhZyBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBnZXREcmFnSGFuZGxlcih0eXBlKSB7XG4gICAgdmFyIGlzRHJhZ092ZXIgPSB0eXBlID09PSAnZHJhZ292ZXInO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5kYXRhVHJhbnNmZXIgPSBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICAgIHZhciBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcjtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YVRyYW5zZmVyICYmXG4gICAgICAgICQuaW5BcnJheSgnRmlsZXMnLCBkYXRhVHJhbnNmZXIudHlwZXMpICE9PSAtMSAmJlxuICAgICAgICB0aGlzLl90cmlnZ2VyKHR5cGUsICQuRXZlbnQodHlwZSwgeyBkZWxlZ2F0ZWRFdmVudDogZSB9KSkgIT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoaXNEcmFnT3Zlcikge1xuICAgICAgICAgIGRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBmaWxldXBsb2FkIHdpZGdldCBsaXN0ZW5zIGZvciBjaGFuZ2UgZXZlbnRzIG9uIGZpbGUgaW5wdXQgZmllbGRzIGRlZmluZWRcbiAgLy8gdmlhIGZpbGVJbnB1dCBzZXR0aW5nIGFuZCBwYXN0ZSBvciBkcm9wIGV2ZW50cyBvZiB0aGUgZ2l2ZW4gZHJvcFpvbmUuXG4gIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGpRdWVyeSBXaWRnZXQgbWV0aG9kcywgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0XG4gIC8vIGV4cG9zZXMgdGhlIFwiYWRkXCIgYW5kIFwic2VuZFwiIG1ldGhvZHMsIHRvIGFkZCBvciBkaXJlY3RseSBzZW5kIGZpbGVzIHVzaW5nXG4gIC8vIHRoZSBmaWxldXBsb2FkIEFQSS5cbiAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYWRkZWQgdmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBwYXN0ZSwgZHJhZyAmIGRyb3Agb3JcbiAgLy8gXCJhZGRcIiBtZXRob2QgYXJlIHVwbG9hZGVkIGltbWVkaWF0ZWx5LCBidXQgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGVcbiAgLy8gdGhlIFwiYWRkXCIgY2FsbGJhY2sgb3B0aW9uIHRvIHF1ZXVlIGZpbGUgdXBsb2Fkcy5cbiAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHtcbiAgICBvcHRpb25zOiB7XG4gICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LlxuICAgICAgLy8gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSBkcmFnICYgZHJvcCBzdXBwb3J0OlxuICAgICAgZHJvcFpvbmU6ICQoZG9jdW1lbnQpLFxuICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB1bmRlZmluZWQuXG4gICAgICAvLyBTZXQgdG8gYSBET00gbm9kZSBvciBqUXVlcnkgb2JqZWN0IHRvIGVuYWJsZSBmaWxlIHBhc3Rpbmc6XG4gICAgICBwYXN0ZVpvbmU6IHVuZGVmaW5lZCxcbiAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy5cbiAgICAgIC8vIElmIHVuZGVmaW5lZCwgaXQgaXMgc2V0IHRvIHRoZSBmaWxlIGlucHV0IGZpZWxkcyBpbnNpZGVcbiAgICAgIC8vIG9mIHRoZSB3aWRnZXQgZWxlbWVudCBvbiBwbHVnaW4gaW5pdGlhbGl6YXRpb24uXG4gICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuXG4gICAgICBmaWxlSW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggYSBjbG9uZSBhZnRlclxuICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnRcbiAgICAgIC8vIHF1ZXVlcyBhbmQgYWxsb3dzIGNoYW5nZSBldmVudHMgdG8gYmUgZmlyZWQgZm9yIHRoZSBzYW1lIGZpbGVcbiAgICAgIC8vIHNlbGVjdGlvbiwgYnV0IGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlOlxuICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSxcbiAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIGZpbGUgZm9ybSBkYXRhICh0aGUgcmVxdWVzdCBhcmd1bWVudCBuYW1lKS5cbiAgICAgIC8vIElmIHVuZGVmaW5lZCBvciBlbXB0eSwgdGhlIG5hbWUgcHJvcGVydHkgb2YgdGhlIGZpbGUgaW5wdXQgZmllbGQgaXNcbiAgICAgIC8vIHVzZWQsIG9yIFwiZmlsZXNbXVwiIGlmIHRoZSBmaWxlIGlucHV0IG5hbWUgcHJvcGVydHkgaXMgYWxzbyBlbXB0eSxcbiAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOlxuICAgICAgcGFyYW1OYW1lOiB1bmRlZmluZWQsXG4gICAgICAvLyBCeSBkZWZhdWx0LCBlYWNoIGZpbGUgb2YgYSBzZWxlY3Rpb24gaXMgdXBsb2FkZWQgdXNpbmcgYW4gaW5kaXZpZHVhbFxuICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlXG4gICAgICAvLyBzZWxlY3Rpb25zIGluIG9uZSByZXF1ZXN0IGVhY2g6XG4gICAgICBzaW5nbGVGaWxlVXBsb2FkczogdHJ1ZSxcbiAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsXG4gICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDpcbiAgICAgIGxpbWl0TXVsdGlGaWxlVXBsb2FkczogdW5kZWZpbmVkLFxuICAgICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb24gbGltaXRzIHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmVcbiAgICAgIC8vIFhIUiByZXF1ZXN0IHRvIGtlZXAgdGhlIHJlcXVlc3Qgc2l6ZSB1bmRlciBvciBlcXVhbCB0byB0aGUgZGVmaW5lZFxuICAgICAgLy8gbGltaXQgaW4gYnl0ZXM6XG4gICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemU6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE11bHRpcGFydCBmaWxlIHVwbG9hZHMgYWRkIGEgbnVtYmVyIG9mIGJ5dGVzIHRvIGVhY2ggdXBsb2FkZWQgZmlsZSxcbiAgICAgIC8vIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIG9wdGlvbiBhZGRzIGFuIG92ZXJoZWFkIGZvciBlYWNoIGZpbGUgdXNlZFxuICAgICAgLy8gaW4gdGhlIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSBjb25maWd1cmF0aW9uOlxuICAgICAgbGltaXRNdWx0aUZpbGVVcGxvYWRTaXplT3ZlcmhlYWQ6IDUxMixcbiAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGlzc3VlIGFsbCBmaWxlIHVwbG9hZCByZXF1ZXN0c1xuICAgICAgLy8gaW4gYSBzZXF1ZW50aWFsIG9yZGVyOlxuICAgICAgc2VxdWVudGlhbFVwbG9hZHM6IGZhbHNlLFxuICAgICAgLy8gVG8gbGltaXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHVwbG9hZHMsXG4gICAgICAvLyBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMDpcbiAgICAgIGxpbWl0Q29uY3VycmVudFVwbG9hZHM6IHVuZGVmaW5lZCxcbiAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGZvcmNlIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczpcbiAgICAgIGZvcmNlSWZyYW1lVHJhbnNwb3J0OiBmYWxzZSxcbiAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgYSByZWRpcmVjdCB1cmwgb24gdGhlXG4gICAgICAvLyBvcmlnaW4gc2VydmVyLCBmb3IgY3Jvc3MtZG9tYWluIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczpcbiAgICAgIHJlZGlyZWN0OiB1bmRlZmluZWQsXG4gICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSByZWRpcmVjdCB1cmwsIHNlbnQgYXMgcGFydCBvZiB0aGUgZm9ybVxuICAgICAgLy8gZGF0YSBhbmQgc2V0IHRvICdyZWRpcmVjdCcgaWYgdGhpcyBvcHRpb24gaXMgZW1wdHk6XG4gICAgICByZWRpcmVjdFBhcmFtTmFtZTogdW5kZWZpbmVkLFxuICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHBvc3RNZXNzYWdlIHdpbmRvdyxcbiAgICAgIC8vIHRvIGVuYWJsZSBwb3N0TWVzc2FnZSB0cmFuc3BvcnQgdXBsb2FkczpcbiAgICAgIHBvc3RNZXNzYWdlOiB1bmRlZmluZWQsXG4gICAgICAvLyBCeSBkZWZhdWx0LCBYSFIgZmlsZSB1cGxvYWRzIGFyZSBzZW50IGFzIG11bHRpcGFydC9mb3JtLWRhdGEuXG4gICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBpcyBhbHdheXMgdXNpbmcgbXVsdGlwYXJ0L2Zvcm0tZGF0YS5cbiAgICAgIC8vIFNldCB0byBmYWxzZSB0byBlbmFibGUgbm9uLW11bHRpcGFydCBYSFIgdXBsb2FkczpcbiAgICAgIG11bHRpcGFydDogdHJ1ZSxcbiAgICAgIC8vIFRvIHVwbG9hZCBsYXJnZSBmaWxlcyBpbiBzbWFsbGVyIGNodW5rcywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uXG4gICAgICAvLyB0byBhIHByZWZlcnJlZCBtYXhpbXVtIGNodW5rIHNpemUuIElmIHNldCB0byAwLCBudWxsIG9yIHVuZGVmaW5lZCxcbiAgICAgIC8vIG9yIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIEJsb2IgQVBJLCBmaWxlcyB3aWxsXG4gICAgICAvLyBiZSB1cGxvYWRlZCBhcyBhIHdob2xlLlxuICAgICAgbWF4Q2h1bmtTaXplOiB1bmRlZmluZWQsXG4gICAgICAvLyBXaGVuIGEgbm9uLW11bHRpcGFydCB1cGxvYWQgb3IgYSBjaHVua2VkIG11bHRpcGFydCB1cGxvYWQgaGFzIGJlZW5cbiAgICAgIC8vIGFib3J0ZWQsIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSB0aGUgdXBsb2FkIGJ5IHNldHRpbmdcbiAgICAgIC8vIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBhbHJlYWR5IHVwbG9hZGVkIGJ5dGVzLiBUaGlzIG9wdGlvbiBpcyBtb3N0XG4gICAgICAvLyB1c2VmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIG9wdGlvbnMgb2JqZWN0IGluc2lkZSBvZiB0aGUgXCJhZGRcIiBvclxuICAgICAgLy8gXCJzZW5kXCIgY2FsbGJhY2tzLCBhcyB0aGUgb3B0aW9ucyBhcmUgY2xvbmVkIGZvciBlYWNoIGZpbGUgdXBsb2FkLlxuICAgICAgdXBsb2FkZWRCeXRlczogdW5kZWZpbmVkLFxuICAgICAgLy8gQnkgZGVmYXVsdCwgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgZmlsZSB1cGxvYWRzIGFyZSByZW1vdmVkIGZyb20gdGhlXG4gICAgICAvLyBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb24uIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZSB0b1xuICAgICAgLy8gcHJldmVudCByZWNhbGN1bGF0aW5nIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgZGF0YTpcbiAgICAgIHJlY2FsY3VsYXRlUHJvZ3Jlc3M6IHRydWUsXG4gICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGFuZCB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50czpcbiAgICAgIHByb2dyZXNzSW50ZXJ2YWw6IDEwMCxcbiAgICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgcHJvZ3Jlc3MgYml0cmF0ZTpcbiAgICAgIGJpdHJhdGVJbnRlcnZhbDogNTAwLFxuICAgICAgLy8gQnkgZGVmYXVsdCwgdXBsb2FkcyBhcmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYWRkaW5nIGZpbGVzOlxuICAgICAgYXV0b1VwbG9hZDogdHJ1ZSxcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIGR1cGxpY2F0ZSBmaWxlIG5hbWVzIGFyZSBleHBlY3RlZCB0byBiZSBoYW5kbGVkIG9uXG4gICAgICAvLyB0aGUgc2VydmVyLXNpZGUuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlIChlLmcuIHdoZW4gdXBsb2FkaW5nXG4gICAgICAvLyBmaWxlcyBkaXJlY3RseSB0byBBbWF6b24gUzMpLCB0aGUgZm9sbG93aW5nIG9wdGlvbiBjYW4gYmUgc2V0IHRvXG4gICAgICAvLyBhbiBlbXB0eSBvYmplY3Qgb3IgYW4gb2JqZWN0IG1hcHBpbmcgZXhpc3RpbmcgZmlsZW5hbWVzLCBlLmcuOlxuICAgICAgLy8geyBcImltYWdlLmpwZ1wiOiB0cnVlLCBcImltYWdlICgxKS5qcGdcIjogdHJ1ZSB9XG4gICAgICAvLyBJZiBpdCBpcyBzZXQsIGFsbCBmaWxlcyB3aWxsIGJlIHVwbG9hZGVkIHdpdGggdW5pcXVlIGZpbGVuYW1lcyxcbiAgICAgIC8vIGFkZGluZyBpbmNyZWFzaW5nIG51bWJlciBzdWZmaXhlcyBpZiBuZWNlc3NhcnksIGUuZy46XG4gICAgICAvLyBcImltYWdlICgyKS5qcGdcIlxuICAgICAgdW5pcXVlRmlsZW5hbWVzOiB1bmRlZmluZWQsXG5cbiAgICAgIC8vIEVycm9yIGFuZCBpbmZvIG1lc3NhZ2VzOlxuICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgdXBsb2FkZWRCeXRlczogJ1VwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUnXG4gICAgICB9LFxuXG4gICAgICAvLyBUcmFuc2xhdGlvbiBmdW5jdGlvbiwgZ2V0cyB0aGUgbWVzc2FnZSBrZXkgdG8gYmUgdHJhbnNsYXRlZFxuICAgICAgLy8gYW5kIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgc3BlY2lmaWMgZGF0YSBhcyBhcmd1bWVudHM6XG4gICAgICBpMThuOiBmdW5jdGlvbiAobWVzc2FnZSwgY29udGV4dCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgbWVzc2FnZSA9IHRoaXMubWVzc2FnZXNbbWVzc2FnZV0gfHwgbWVzc2FnZS50b1N0cmluZygpO1xuICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCd7JyArIGtleSArICd9JywgdmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSxcblxuICAgICAgLy8gQWRkaXRpb25hbCBmb3JtIGRhdGEgdG8gYmUgc2VudCBhbG9uZyB3aXRoIHRoZSBmaWxlIHVwbG9hZHMgY2FuIGJlIHNldFxuICAgICAgLy8gdXNpbmcgdGhpcyBvcHRpb24sIHdoaWNoIGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kXG4gICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhXG4gICAgICAvLyBvYmplY3QgKGZvciBYSFIgZmlsZSB1cGxvYWRzKSwgb3IgYSBzaW1wbGUgb2JqZWN0LlxuICAgICAgLy8gVGhlIGZvcm0gb2YgdGhlIGZpcnN0IGZpbGVJbnB1dCBpcyBnaXZlbiBhcyBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uOlxuICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgICAgIHJldHVybiBmb3JtLnNlcmlhbGl6ZUFycmF5KCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWRcbiAgICAgIC8vIHdpZGdldCAodmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBkcmFnICYgZHJvcCwgcGFzdGUgb3IgYWRkIEFQSSBjYWxsKS5cbiAgICAgIC8vIElmIHRoZSBzaW5nbGVGaWxlVXBsb2FkcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhpcyBjYWxsYmFjayB3aWxsIGJlXG4gICAgICAvLyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBzZWxlY3Rpb24gZm9yIFhIUiBmaWxlIHVwbG9hZHMsIGVsc2VcbiAgICAgIC8vIG9uY2UgZm9yIGVhY2ggZmlsZSBzZWxlY3Rpb24uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHVwbG9hZCBzdGFydHMgd2hlbiB0aGUgc3VibWl0IG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBkYXRhIHBhcmFtZXRlci5cbiAgICAgIC8vIFRoZSBkYXRhIG9iamVjdCBjb250YWlucyBhIGZpbGVzIHByb3BlcnR5IGhvbGRpbmcgdGhlIGFkZGVkIGZpbGVzXG4gICAgICAvLyBhbmQgYWxsb3dzIHlvdSB0byBvdmVycmlkZSBwbHVnaW4gb3B0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSBhamF4IHNldHRpbmdzLlxuICAgICAgLy9cbiAgICAgIC8vIExpc3RlbmVycyBmb3IgdGhpcyBjYWxsYmFjayBjYW4gYWxzbyBiZSBib3VuZCB0aGUgZm9sbG93aW5nIHdheTpcbiAgICAgIC8vIC5vbignZmlsZXVwbG9hZGFkZCcsIGZ1bmMpO1xuICAgICAgLy9cbiAgICAgIC8vIGRhdGEuc3VibWl0KCkgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGFuZCBhbGxvd3MgdG8gYXR0YWNoIGFkZGl0aW9uYWxcbiAgICAgIC8vIGhhbmRsZXJzIHVzaW5nIGpRdWVyeSdzIERlZmVycmVkIGNhbGxiYWNrczpcbiAgICAgIC8vIGRhdGEuc3VibWl0KCkuZG9uZShmdW5jKS5mYWlsKGZ1bmMpLmFsd2F5cyhmdW5jKTtcbiAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuYXV0b1VwbG9hZCB8fFxuICAgICAgICAgIChkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmXG4gICAgICAgICAgICAkKHRoaXMpLmZpbGV1cGxvYWQoJ29wdGlvbicsICdhdXRvVXBsb2FkJykpXG4gICAgICAgICkge1xuICAgICAgICAgIGRhdGEucHJvY2VzcygpLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gT3RoZXIgY2FsbGJhY2tzOlxuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN1Ym1pdCBldmVudCBvZiBlYWNoIGZpbGUgdXBsb2FkOlxuICAgICAgLy8gc3VibWl0OiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5vbignZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDpcbiAgICAgIC8vIHNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2Fkc2VuZCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOlxuICAgICAgLy8gZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRkb25lJywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSB1cGxvYWRzOlxuICAgICAgLy8gZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSByZXF1ZXN0czpcbiAgICAgIC8vIGFsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRhbHdheXMnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6XG4gICAgICAvLyBwcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRwcm9ncmVzcycsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgZ2xvYmFsIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6XG4gICAgICAvLyBwcm9ncmVzc2FsbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDpcbiAgICAgIC8vIHN0YXJ0OiBmdW5jdGlvbiAoZSkge30sIC8vIC5vbignZmlsZXVwbG9hZHN0YXJ0JywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDpcbiAgICAgIC8vIHN0b3A6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLm9uKCdmaWxldXBsb2Fkc3RvcCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgY2hhbmdlIGV2ZW50cyBvZiB0aGUgZmlsZUlucHV0KHMpOlxuICAgICAgLy8gY2hhbmdlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5vbignZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgcGFzdGUgZXZlbnRzIHRvIHRoZSBwYXN0ZVpvbmUocyk6XG4gICAgICAvLyBwYXN0ZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRwYXN0ZScsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOlxuICAgICAgLy8gZHJvcDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRkcm9wJywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZvciBkcmFnb3ZlciBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOlxuICAgICAgLy8gZHJhZ292ZXI6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgYmVmb3JlIHRoZSBzdGFydCBvZiBlYWNoIGNodW5rIHVwbG9hZCByZXF1ZXN0IChiZWZvcmUgZm9ybSBkYXRhIGluaXRpYWxpemF0aW9uKTpcbiAgICAgIC8vIGNodW5rYmVmb3Jlc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRjaHVua2JlZm9yZXNlbmQnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGNodW5rIHVwbG9hZCByZXF1ZXN0OlxuICAgICAgLy8gY2h1bmtzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5vbignZmlsZXVwbG9hZGNodW5rc2VuZCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOlxuICAgICAgLy8gY2h1bmtkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5vbignZmlsZXVwbG9hZGNodW5rZG9uZScsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgY2h1bmsgdXBsb2FkczpcbiAgICAgIC8vIGNodW5rZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRjaHVua2ZhaWwnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIGNvbXBsZXRlZCAoc3VjY2VzcywgYWJvcnQgb3IgZXJyb3IpIGNodW5rIHVwbG9hZCByZXF1ZXN0czpcbiAgICAgIC8vIGNodW5rYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5vbignZmlsZXVwbG9hZGNodW5rYWx3YXlzJywgZnVuYyk7XG5cbiAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLlxuICAgICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgalF1ZXJ5IGFqYXggc2V0dGluZ3MgcmVxdWlyZWQgZm9yIHRoZSBmaWxlIHVwbG9hZHM6XG4gICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICBjYWNoZTogZmFsc2UsXG4gICAgICB0aW1lb3V0OiAwXG4gICAgfSxcblxuICAgIC8vIGpRdWVyeSB2ZXJzaW9ucyBiZWZvcmUgMS44IHJlcXVpcmUgcHJvbWlzZS5waXBlIGlmIHRoZSByZXR1cm4gdmFsdWUgaXNcbiAgICAvLyB1c2VkLCBhcyBwcm9taXNlLnRoZW4gaW4gb2xkZXIgdmVyc2lvbnMgaGFzIGEgZGlmZmVyZW50IGJlaGF2aW9yLCBzZWU6XG4gICAgLy8gaHR0cHM6Ly9ibG9nLmpxdWVyeS5jb20vMjAxMi8wOC8wOS9qcXVlcnktMS04LXJlbGVhc2VkL1xuICAgIC8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMTAxMFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZC9wdWxsLzM0MzVcbiAgICBfcHJvbWlzZVBpcGU6IChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGFydHMgPSAkLmZuLmpxdWVyeS5zcGxpdCgnLicpO1xuICAgICAgcmV0dXJuIE51bWJlcihwYXJ0c1swXSkgPiAxIHx8IE51bWJlcihwYXJ0c1sxXSkgPiA3ID8gJ3RoZW4nIDogJ3BpcGUnO1xuICAgIH0pKCksXG5cbiAgICAvLyBBIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IHJlcXVpcmUgcmVpbml0aWFsaXppbmcgZXZlbnQgbGlzdGVuZXJzIGFuZC9vclxuICAgIC8vIHNwZWNpYWwgaW5pdGlhbGl6YXRpb24gY29kZTpcbiAgICBfc3BlY2lhbE9wdGlvbnM6IFtcbiAgICAgICdmaWxlSW5wdXQnLFxuICAgICAgJ2Ryb3Bab25lJyxcbiAgICAgICdwYXN0ZVpvbmUnLFxuICAgICAgJ211bHRpcGFydCcsXG4gICAgICAnZm9yY2VJZnJhbWVUcmFuc3BvcnQnXG4gICAgXSxcblxuICAgIF9ibG9iU2xpY2U6XG4gICAgICAkLnN1cHBvcnQuYmxvYlNsaWNlICYmXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlO1xuICAgICAgICByZXR1cm4gc2xpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0sXG5cbiAgICBfQml0cmF0ZVRpbWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRpbWVzdGFtcCA9IERhdGUubm93ID8gRGF0ZS5ub3coKSA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5sb2FkZWQgPSAwO1xuICAgICAgdGhpcy5iaXRyYXRlID0gMDtcbiAgICAgIHRoaXMuZ2V0Qml0cmF0ZSA9IGZ1bmN0aW9uIChub3csIGxvYWRlZCwgaW50ZXJ2YWwpIHtcbiAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7XG4gICAgICAgIGlmICghdGhpcy5iaXRyYXRlIHx8ICFpbnRlcnZhbCB8fCB0aW1lRGlmZiA+IGludGVydmFsKSB7XG4gICAgICAgICAgdGhpcy5iaXRyYXRlID0gKGxvYWRlZCAtIHRoaXMubG9hZGVkKSAqICgxMDAwIC8gdGltZURpZmYpICogODtcbiAgICAgICAgICB0aGlzLmxvYWRlZCA9IGxvYWRlZDtcbiAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG5vdztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlO1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgX2lzWEhSVXBsb2FkOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgIW9wdGlvbnMuZm9yY2VJZnJhbWVUcmFuc3BvcnQgJiZcbiAgICAgICAgKCghb3B0aW9ucy5tdWx0aXBhcnQgJiYgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQpIHx8XG4gICAgICAgICAgJC5zdXBwb3J0LnhockZvcm1EYXRhRmlsZVVwbG9hZClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIF9nZXRGb3JtRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciBmb3JtRGF0YTtcbiAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm9ybURhdGEob3B0aW9ucy5mb3JtKTtcbiAgICAgIH1cbiAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm9ybURhdGE7XG4gICAgICB9XG4gICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3JtRGF0YSA9IFtdO1xuICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgZm9ybURhdGEucHVzaCh7IG5hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuXG4gICAgX2dldFRvdGFsOiBmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgIHZhciB0b3RhbCA9IDA7XG4gICAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkge1xuICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH0sXG5cbiAgICBfaW5pdFByb2dyZXNzT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICB2YXIgcHJvZ3Jlc3MgPSB7XG4gICAgICAgIGxvYWRlZDogMCxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICAgIGJpdHJhdGU6IDBcbiAgICAgIH07XG4gICAgICBpZiAob2JqLl9wcm9ncmVzcykge1xuICAgICAgICAkLmV4dGVuZChvYmouX3Byb2dyZXNzLCBwcm9ncmVzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmouX3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9pbml0UmVzcG9uc2VPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHZhciBwcm9wO1xuICAgICAgaWYgKG9iai5fcmVzcG9uc2UpIHtcbiAgICAgICAgZm9yIChwcm9wIGluIG9iai5fcmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iai5fcmVzcG9uc2UsIHByb3ApKSB7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9yZXNwb25zZVtwcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iai5fcmVzcG9uc2UgPSB7fTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICBpZiAoZS5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdyA/IERhdGUubm93KCkgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgICBsb2FkZWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhLl90aW1lICYmXG4gICAgICAgICAgZGF0YS5wcm9ncmVzc0ludGVydmFsICYmXG4gICAgICAgICAgbm93IC0gZGF0YS5fdGltZSA8IGRhdGEucHJvZ3Jlc3NJbnRlcnZhbCAmJlxuICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLl90aW1lID0gbm93O1xuICAgICAgICBsb2FkZWQgPVxuICAgICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgICAoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIChkYXRhLmNodW5rU2l6ZSB8fCBkYXRhLl9wcm9ncmVzcy50b3RhbClcbiAgICAgICAgICApICsgKGRhdGEudXBsb2FkZWRCeXRlcyB8fCAwKTtcbiAgICAgICAgLy8gQWRkIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHByZXZpb3VzbHkgbG9hZGVkIHN0YXRlXG4gICAgICAgIC8vIHRvIHRoZSBnbG9iYWwgbG9hZGVkIGNvdW50ZXI6XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCArPSBsb2FkZWQgLSBkYXRhLl9wcm9ncmVzcy5sb2FkZWQ7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSB0aGlzLl9iaXRyYXRlVGltZXIuZ2V0Qml0cmF0ZShcbiAgICAgICAgICBub3csXG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkLFxuICAgICAgICAgIGRhdGEuYml0cmF0ZUludGVydmFsXG4gICAgICAgICk7XG4gICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkO1xuICAgICAgICBkYXRhLl9wcm9ncmVzcy5iaXRyYXRlID0gZGF0YS5iaXRyYXRlID0gZGF0YS5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoXG4gICAgICAgICAgbm93LFxuICAgICAgICAgIGxvYWRlZCxcbiAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbFxuICAgICAgICApO1xuICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldFxuICAgICAgICAvLyB0byB0aGUgZmlsZSBzaXplKHMpIG9mIHRoZSBjdXJyZW50IHVwbG9hZCBhbmQgYSBsb2FkZWQgZGF0YVxuICAgICAgICAvLyBwcm9wZXJ0eSBjYWxjdWxhdGVkIGFjY29yZGluZ2x5OlxuICAgICAgICB0aGlzLl90cmlnZ2VyKFxuICAgICAgICAgICdwcm9ncmVzcycsXG4gICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7IGRlbGVnYXRlZEV2ZW50OiBlIH0pLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgKTtcbiAgICAgICAgLy8gVHJpZ2dlciBhIGdsb2JhbCBwcm9ncmVzcyBldmVudCBmb3IgYWxsIGN1cnJlbnQgZmlsZSB1cGxvYWRzLFxuICAgICAgICAvLyBpbmNsdWRpbmcgYWpheCBjYWxscyBxdWV1ZWQgZm9yIHNlcXVlbnRpYWwgZmlsZSB1cGxvYWRzOlxuICAgICAgICB0aGlzLl90cmlnZ2VyKFxuICAgICAgICAgICdwcm9ncmVzc2FsbCcsXG4gICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3NhbGwnLCB7IGRlbGVnYXRlZEV2ZW50OiBlIH0pLFxuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9pbml0UHJvZ3Jlc3NMaXN0ZW5lcjogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgeGhyID0gb3B0aW9ucy54aHIgPyBvcHRpb25zLnhocigpIDogJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICAvLyBBY2Nlc3MgdG8gdGhlIG5hdGl2ZSBYSFIgb2JqZWN0IGlzIHJlcXVpcmVkIHRvIGFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIGZvciB0aGUgdXBsb2FkIHByb2dyZXNzIGV2ZW50OlxuICAgICAgaWYgKHhoci51cGxvYWQpIHtcbiAgICAgICAgJCh4aHIudXBsb2FkKS5vbigncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOlxuICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7XG4gICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7XG4gICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsO1xuICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zLnhociA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geGhyO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfZGVpbml0UHJvZ3Jlc3NMaXN0ZW5lcjogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTtcbiAgICAgIGlmICh4aHIudXBsb2FkKSB7XG4gICAgICAgICQoeGhyLnVwbG9hZCkub2ZmKCdwcm9ncmVzcycpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfaXNJbnN0YW5jZU9mOiBmdW5jdGlvbiAodHlwZSwgb2JqKSB7XG4gICAgICAvLyBDcm9zcy1mcmFtZSBpbnN0YW5jZW9mIGNoZWNrXG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nO1xuICAgIH0sXG5cbiAgICBfZ2V0VW5pcXVlRmlsZW5hbWU6IGZ1bmN0aW9uIChuYW1lLCBtYXApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmIChtYXBbbmFtZV0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoXG4gICAgICAgICAgLyg/OiBcXCgoW1xcZF0rKVxcKSk/KFxcLlteLl0rKT8kLyxcbiAgICAgICAgICBmdW5jdGlvbiAoXywgcDEsIHAyKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwMSA/IE51bWJlcihwMSkgKyAxIDogMTtcbiAgICAgICAgICAgIHZhciBleHQgPSBwMiB8fCAnJztcbiAgICAgICAgICAgIHJldHVybiAnICgnICsgaW5kZXggKyAnKScgKyBleHQ7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VW5pcXVlRmlsZW5hbWUobmFtZSwgbWFwKTtcbiAgICAgIH1cbiAgICAgIG1hcFtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuXG4gICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBmb3JtRGF0YSxcbiAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sXG4gICAgICAgIC8vIElnbm9yZSBub24tbXVsdGlwYXJ0IHNldHRpbmcgaWYgbm90IHN1cHBvcnRlZDpcbiAgICAgICAgbXVsdGlwYXJ0ID0gb3B0aW9ucy5tdWx0aXBhcnQgfHwgISQuc3VwcG9ydC54aHJGaWxlVXBsb2FkLFxuICAgICAgICBwYXJhbU5hbWUgPVxuICAgICAgICAgICQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheSdcbiAgICAgICAgICAgID8gb3B0aW9ucy5wYXJhbU5hbWVbMF1cbiAgICAgICAgICAgIDogb3B0aW9ucy5wYXJhbU5hbWU7XG4gICAgICBvcHRpb25zLmhlYWRlcnMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkge1xuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtUmFuZ2UnXSA9IG9wdGlvbnMuY29udGVudFJhbmdlO1xuICAgICAgfVxuICAgICAgaWYgKCFtdWx0aXBhcnQgfHwgb3B0aW9ucy5ibG9iIHx8ICF0aGlzLl9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSkge1xuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9XG4gICAgICAgICAgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiJyArXG4gICAgICAgICAgZW5jb2RlVVJJKGZpbGUudXBsb2FkTmFtZSB8fCBmaWxlLm5hbWUpICtcbiAgICAgICAgICAnXCInO1xuICAgICAgfVxuICAgICAgaWYgKCFtdWx0aXBhcnQpIHtcbiAgICAgICAgb3B0aW9ucy5jb250ZW50VHlwZSA9IGZpbGUudHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgb3B0aW9ucy5kYXRhID0gb3B0aW9ucy5ibG9iIHx8IGZpbGU7XG4gICAgICB9IGVsc2UgaWYgKCQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyB3aW5kb3cucG9zdE1lc3NhZ2UgZG9lcyBub3QgYWxsb3cgc2VuZGluZyBGb3JtRGF0YVxuICAgICAgICAgIC8vIG9iamVjdHMsIHNvIHdlIGp1c3QgYWRkIHRoZSBGaWxlL0Jsb2Igb2JqZWN0cyB0b1xuICAgICAgICAgIC8vIHRoZSBmb3JtRGF0YSBhcnJheSBhbmQgbGV0IHRoZSBwb3N0TWVzc2FnZSB3aW5kb3dcbiAgICAgICAgICAvLyBjcmVhdGUgdGhlIEZvcm1EYXRhIG9iamVjdCBvdXQgb2YgdGhpcyBhcnJheTpcbiAgICAgICAgICBmb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBwYXJhbU5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmJsb2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7XG4gICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6XG4gICAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0pIHx8XG4gICAgICAgICAgICAgICAgICBwYXJhbU5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoYXQuX2lzSW5zdGFuY2VPZignRm9ybURhdGEnLCBvcHRpb25zLmZvcm1EYXRhKSkge1xuICAgICAgICAgICAgZm9ybURhdGEgPSBvcHRpb25zLmZvcm1EYXRhO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgJC5lYWNoKHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpLCBmdW5jdGlvbiAoaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmaWVsZC5uYW1lLCBmaWVsZC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgICBwYXJhbU5hbWUsXG4gICAgICAgICAgICAgIG9wdGlvbnMuYmxvYixcbiAgICAgICAgICAgICAgZmlsZS51cGxvYWROYW1lIHx8IGZpbGUubmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGFsbG93cyB0aGUgdGVzdHMgdG8gcnVuIHdpdGhcbiAgICAgICAgICAgICAgLy8gZHVtbXkgb2JqZWN0czpcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoYXQuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpIHx8XG4gICAgICAgICAgICAgICAgdGhhdC5faXNJbnN0YW5jZU9mKCdCbG9iJywgZmlsZSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZS51cGxvYWROYW1lIHx8IGZpbGUubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy51bmlxdWVGaWxlbmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdGhhdC5fZ2V0VW5pcXVlRmlsZW5hbWUoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVuaXF1ZUZpbGVuYW1lc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fFxuICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUsXG4gICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgZmlsZU5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5kYXRhID0gZm9ybURhdGE7XG4gICAgICB9XG4gICAgICAvLyBCbG9iIHJlZmVyZW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUsIGZyZWUgbWVtb3J5OlxuICAgICAgb3B0aW9ucy5ibG9iID0gbnVsbDtcbiAgICB9LFxuXG4gICAgX2luaXRJZnJhbWVTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciB0YXJnZXRIb3N0ID0gJCgnPGE+PC9hPicpLnByb3AoJ2hyZWYnLCBvcHRpb25zLnVybCkucHJvcCgnaG9zdCcpO1xuICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gaWZyYW1lIGVuYWJsZXMgdGhlIGlmcmFtZSB0cmFuc3BvcnQ6XG4gICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ2lmcmFtZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpO1xuICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBhIHNlcmlhbGl6ZWQgYXJyYXkgYXMgZm9ybSBkYXRhOlxuICAgICAgb3B0aW9ucy5mb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpO1xuICAgICAgLy8gQWRkIHJlZGlyZWN0IHVybCB0byBmb3JtIGRhdGEgb24gY3Jvc3MtZG9tYWluIHVwbG9hZHM6XG4gICAgICBpZiAob3B0aW9ucy5yZWRpcmVjdCAmJiB0YXJnZXRIb3N0ICYmIHRhcmdldEhvc3QgIT09IGxvY2F0aW9uLmhvc3QpIHtcbiAgICAgICAgb3B0aW9ucy5mb3JtRGF0YS5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLnJlZGlyZWN0UGFyYW1OYW1lIHx8ICdyZWRpcmVjdCcsXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbnMucmVkaXJlY3RcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9pbml0RGF0YVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2h1bmtlZFVwbG9hZChvcHRpb25zLCB0cnVlKSkge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBwb3N0bWVzc2FnZSBlbmFibGVzIHRoZVxuICAgICAgICAgIC8vIHBvc3RNZXNzYWdlIHRyYW5zcG9ydDpcbiAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ3Bvc3RtZXNzYWdlICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luaXRJZnJhbWVTZXR0aW5ncyhvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2dldFBhcmFtTmFtZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSxcbiAgICAgICAgcGFyYW1OYW1lID0gb3B0aW9ucy5wYXJhbU5hbWU7XG4gICAgICBpZiAoIXBhcmFtTmFtZSkge1xuICAgICAgICBwYXJhbU5hbWUgPSBbXTtcbiAgICAgICAgZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBpbnB1dCA9ICQodGhpcyksXG4gICAgICAgICAgICBuYW1lID0gaW5wdXQucHJvcCgnbmFtZScpIHx8ICdmaWxlc1tdJyxcbiAgICAgICAgICAgIGkgPSAoaW5wdXQucHJvcCgnZmlsZXMnKSB8fCBbMV0pLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoaSkge1xuICAgICAgICAgICAgcGFyYW1OYW1lLnB1c2gobmFtZSk7XG4gICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwYXJhbU5hbWUubGVuZ3RoKSB7XG4gICAgICAgICAgcGFyYW1OYW1lID0gW2ZpbGVJbnB1dC5wcm9wKCduYW1lJykgfHwgJ2ZpbGVzW10nXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghJC5pc0FycmF5KHBhcmFtTmFtZSkpIHtcbiAgICAgICAgcGFyYW1OYW1lID0gW3BhcmFtTmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1OYW1lO1xuICAgIH0sXG5cbiAgICBfaW5pdEZvcm1TZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIC8vIFJldHJpZXZlIG1pc3Npbmcgb3B0aW9ucyBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdGhlXG4gICAgICAvLyBhc3NvY2lhdGVkIGZvcm0sIGlmIGF2YWlsYWJsZTpcbiAgICAgIGlmICghb3B0aW9ucy5mb3JtIHx8ICFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7XG4gICAgICAgIG9wdGlvbnMuZm9ybSA9ICQob3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTtcbiAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSxcbiAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHdpZGdldCBmaWxlIGlucHV0J3MgZm9ybTpcbiAgICAgICAgaWYgKCFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7XG4gICAgICAgICAgb3B0aW9ucy5mb3JtID0gJCh0aGlzLm9wdGlvbnMuZmlsZUlucHV0LnByb3AoJ2Zvcm0nKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9wdGlvbnMucGFyYW1OYW1lID0gdGhpcy5fZ2V0UGFyYW1OYW1lKG9wdGlvbnMpO1xuICAgICAgaWYgKCFvcHRpb25zLnVybCkge1xuICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMuZm9ybS5wcm9wKCdhY3Rpb24nKSB8fCBsb2NhdGlvbi5ocmVmO1xuICAgICAgfVxuICAgICAgLy8gVGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgbXVzdCBiZSBcIlBPU1RcIiBvciBcIlBVVFwiOlxuICAgICAgb3B0aW9ucy50eXBlID0gKFxuICAgICAgICBvcHRpb25zLnR5cGUgfHxcbiAgICAgICAgKCQudHlwZShvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgfHxcbiAgICAgICAgJydcbiAgICAgICkudG9VcHBlckNhc2UoKTtcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucy50eXBlICE9PSAnUE9TVCcgJiZcbiAgICAgICAgb3B0aW9ucy50eXBlICE9PSAnUFVUJyAmJlxuICAgICAgICBvcHRpb25zLnR5cGUgIT09ICdQQVRDSCdcbiAgICAgICkge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpIHtcbiAgICAgICAgb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCA9IG9wdGlvbnMuZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfZ2V0QUpBWFNldHRpbmdzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKTtcbiAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7XG4gICAgICB0aGlzLl9pbml0RGF0YVNldHRpbmdzKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfSxcblxuICAgIC8vIGpRdWVyeSAxLjYgZG9lc24ndCBwcm92aWRlIC5zdGF0ZSgpLFxuICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKTpcbiAgICBfZ2V0RGVmZXJyZWRTdGF0ZTogZnVuY3Rpb24gKGRlZmVycmVkKSB7XG4gICAgICBpZiAoZGVmZXJyZWQuc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAoZGVmZXJyZWQuaXNSZXNvbHZlZCgpKSB7XG4gICAgICAgIHJldHVybiAncmVzb2x2ZWQnO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmVycmVkLmlzUmVqZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm4gJ3JlamVjdGVkJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAncGVuZGluZyc7XG4gICAgfSxcblxuICAgIC8vIE1hcHMganFYSFIgY2FsbGJhY2tzIHRvIHRoZSBlcXVpdmFsZW50XG4gICAgLy8gbWV0aG9kcyBvZiB0aGUgZ2l2ZW4gUHJvbWlzZSBvYmplY3Q6XG4gICAgX2VuaGFuY2VQcm9taXNlOiBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgcHJvbWlzZS5zdWNjZXNzID0gcHJvbWlzZS5kb25lO1xuICAgICAgcHJvbWlzZS5lcnJvciA9IHByb21pc2UuZmFpbDtcbiAgICAgIHByb21pc2UuY29tcGxldGUgPSBwcm9taXNlLmFsd2F5cztcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH0sXG5cbiAgICAvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZW5oYW5jZWQgd2l0aFxuICAgIC8vIHRoZSBqcVhIUiBtZXRob2RzIGFib3J0LCBzdWNjZXNzLCBlcnJvciBhbmQgY29tcGxldGU6XG4gICAgX2dldFhIUlByb21pc2U6IGZ1bmN0aW9uIChyZXNvbHZlT3JSZWplY3QsIGNvbnRleHQsIGFyZ3MpIHtcbiAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCksXG4gICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLm9wdGlvbnMuY29udGV4dCB8fCBwcm9taXNlO1xuICAgICAgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICBkZmQucmVzb2x2ZVdpdGgoY29udGV4dCwgYXJncyk7XG4gICAgICB9IGVsc2UgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgZGZkLnJlamVjdFdpdGgoY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgICBwcm9taXNlLmFib3J0ID0gZGZkLnByb21pc2U7XG4gICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7XG4gICAgfSxcblxuICAgIC8vIEFkZHMgY29udmVuaWVuY2UgbWV0aG9kcyB0byB0aGUgZGF0YSBjYWxsYmFjayBhcmd1bWVudDpcbiAgICBfYWRkQ29udmVuaWVuY2VNZXRob2RzOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBnZXRQcm9taXNlID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKHRoYXQsIGFyZ3MpLnByb21pc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIGRhdGEucHJvY2VzcyA9IGZ1bmN0aW9uIChyZXNvbHZlRnVuYywgcmVqZWN0RnVuYykge1xuICAgICAgICBpZiAocmVzb2x2ZUZ1bmMgfHwgcmVqZWN0RnVuYykge1xuICAgICAgICAgIGRhdGEuX3Byb2Nlc3NRdWV1ZSA9IHRoaXMuX3Byb2Nlc3NRdWV1ZSA9ICh0aGlzLl9wcm9jZXNzUXVldWUgfHxcbiAgICAgICAgICAgIGdldFByb21pc2UoW3RoaXNdKSlcbiAgICAgICAgICAgIFt0aGF0Ll9wcm9taXNlUGlwZV0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikge1xuICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0V2l0aCh0aGF0LCBbZGF0YV0pLnByb21pc2UoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvbWlzZShhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIFt0aGF0Ll9wcm9taXNlUGlwZV0ocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUXVldWUgfHwgZ2V0UHJvbWlzZShbdGhpc10pO1xuICAgICAgfTtcbiAgICAgIGRhdGEuc3VibWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSgpICE9PSAncGVuZGluZycpIHtcbiAgICAgICAgICBkYXRhLmpxWEhSID0gdGhpcy5qcVhIUiA9XG4gICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKFxuICAgICAgICAgICAgICAnc3VibWl0JyxcbiAgICAgICAgICAgICAgJC5FdmVudCgnc3VibWl0JywgeyBkZWxlZ2F0ZWRFdmVudDogZSB9KSxcbiAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgKSAhPT0gZmFsc2UgJiYgdGhhdC5fb25TZW5kKGUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTtcbiAgICAgIH07XG4gICAgICBkYXRhLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5qcVhIUikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcnJvclRocm93biA9ICdhYm9ydCc7XG4gICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWwnLCBudWxsLCB0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UpO1xuICAgICAgfTtcbiAgICAgIGRhdGEuc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmpxWEhSKSB7XG4gICAgICAgICAgcmV0dXJuIHRoYXQuX2dldERlZmVycmVkU3RhdGUodGhpcy5qcVhIUik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NRdWV1ZSkge1xuICAgICAgICAgIHJldHVybiB0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKHRoaXMuX3Byb2Nlc3NRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBkYXRhLnByb2Nlc3NpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIXRoaXMuanFYSFIgJiZcbiAgICAgICAgICB0aGlzLl9wcm9jZXNzUXVldWUgJiZcbiAgICAgICAgICB0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKHRoaXMuX3Byb2Nlc3NRdWV1ZSkgPT09ICdwZW5kaW5nJ1xuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIGRhdGEucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcbiAgICAgIH07XG4gICAgICBkYXRhLnJlc3BvbnNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZXMgdGhlIFJhbmdlIGhlYWRlciBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2VcbiAgICAvLyBhbmQgcmV0dXJucyB0aGUgdXBsb2FkZWQgYnl0ZXM6XG4gICAgX2dldFVwbG9hZGVkQnl0ZXM6IGZ1bmN0aW9uIChqcVhIUikge1xuICAgICAgdmFyIHJhbmdlID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JhbmdlJyksXG4gICAgICAgIHBhcnRzID0gcmFuZ2UgJiYgcmFuZ2Uuc3BsaXQoJy0nKSxcbiAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcbiAgICAgIHJldHVybiB1cHBlckJ5dGVzUG9zICYmIHVwcGVyQnl0ZXNQb3MgKyAxO1xuICAgIH0sXG5cbiAgICAvLyBVcGxvYWRzIGEgZmlsZSBpbiBtdWx0aXBsZSwgc2VxdWVudGlhbCByZXF1ZXN0c1xuICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy5cbiAgICAvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLCBvbmx5IHRlc3RzIGlmIHRoZSBmaWxlXG4gICAgLy8gc2hvdWxkIGJlIHVwbG9hZGVkIGluIGNodW5rcywgYnV0IGRvZXMgbm90IGludm9rZSBhbnlcbiAgICAvLyB1cGxvYWQgcmVxdWVzdHM6XG4gICAgX2NodW5rZWRVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zLCB0ZXN0T25seSkge1xuICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzIHx8IDA7XG4gICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLFxuICAgICAgICBmcyA9IGZpbGUuc2l6ZSxcbiAgICAgICAgdWIgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMsXG4gICAgICAgIG1jcyA9IG9wdGlvbnMubWF4Q2h1bmtTaXplIHx8IGZzLFxuICAgICAgICBzbGljZSA9IHRoaXMuX2Jsb2JTbGljZSxcbiAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLFxuICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKSxcbiAgICAgICAganFYSFIsXG4gICAgICAgIHVwbG9hZDtcbiAgICAgIGlmIChcbiAgICAgICAgIShcbiAgICAgICAgICB0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSAmJlxuICAgICAgICAgIHNsaWNlICYmXG4gICAgICAgICAgKHViIHx8ICgkLnR5cGUobWNzKSA9PT0gJ2Z1bmN0aW9uJyA/IG1jcyhvcHRpb25zKSA6IG1jcykgPCBmcylcbiAgICAgICAgKSB8fFxuICAgICAgICBvcHRpb25zLmRhdGFcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGVzdE9ubHkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodWIgPj0gZnMpIHtcbiAgICAgICAgZmlsZS5lcnJvciA9IG9wdGlvbnMuaTE4bigndXBsb2FkZWRCeXRlcycpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgb3B0aW9ucy5jb250ZXh0LCBbXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIGZpbGUuZXJyb3JcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgY2h1bmsgdXBsb2FkIG1ldGhvZDpcbiAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQ2xvbmUgdGhlIG9wdGlvbnMgb2JqZWN0IGZvciBlYWNoIGNodW5rIHVwbG9hZDpcbiAgICAgICAgdmFyIG8gPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyksXG4gICAgICAgICAgY3VycmVudExvYWRlZCA9IG8uX3Byb2dyZXNzLmxvYWRlZDtcbiAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbChcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHViLFxuICAgICAgICAgIHViICsgKCQudHlwZShtY3MpID09PSAnZnVuY3Rpb24nID8gbWNzKG8pIDogbWNzKSxcbiAgICAgICAgICBmaWxlLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgY2h1bmsgc2l6ZSwgYXMgdGhlIGJsb2IgaXRzZWxmXG4gICAgICAgIC8vIHdpbGwgYmUgZGVyZWZlcmVuY2VkIGFmdGVyIGRhdGEgcHJvY2Vzc2luZzpcbiAgICAgICAgby5jaHVua1NpemUgPSBvLmJsb2Iuc2l6ZTtcbiAgICAgICAgLy8gRXhwb3NlIHRoZSBjaHVuayBieXRlcyBwb3NpdGlvbiByYW5nZTpcbiAgICAgICAgby5jb250ZW50UmFuZ2UgPVxuICAgICAgICAgICdieXRlcyAnICsgdWIgKyAnLScgKyAodWIgKyBvLmNodW5rU2l6ZSAtIDEpICsgJy8nICsgZnM7XG4gICAgICAgIC8vIFRyaWdnZXIgY2h1bmtiZWZvcmVzZW5kIHRvIGFsbG93IGZvcm0gZGF0YSB0byBiZSB1cGRhdGVkIGZvciB0aGlzIGNodW5rXG4gICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rYmVmb3Jlc2VuZCcsIG51bGwsIG8pO1xuICAgICAgICAvLyBQcm9jZXNzIHRoZSB1cGxvYWQgZGF0YSAodGhlIGJsb2IgYW5kIHBvdGVudGlhbCBmb3JtIGRhdGEpOlxuICAgICAgICB0aGF0Ll9pbml0WEhSRGF0YShvKTtcbiAgICAgICAgLy8gQWRkIHByb2dyZXNzIGxpc3RlbmVycyBmb3IgdGhpcyBjaHVuayB1cGxvYWQ6XG4gICAgICAgIHRoYXQuX2luaXRQcm9ncmVzc0xpc3RlbmVyKG8pO1xuICAgICAgICBqcVhIUiA9IChcbiAgICAgICAgICAodGhhdC5fdHJpZ2dlcignY2h1bmtzZW5kJywgbnVsbCwgbykgIT09IGZhbHNlICYmICQuYWpheChvKSkgfHxcbiAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvLmNvbnRleHQpXG4gICAgICAgIClcbiAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikge1xuICAgICAgICAgICAgdWIgPSB0aGF0Ll9nZXRVcGxvYWRlZEJ5dGVzKGpxWEhSKSB8fCB1YiArIG8uY2h1bmtTaXplO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgbm8gZmluYWwgcHJvZ3Jlc3MgZXZlbnRcbiAgICAgICAgICAgIC8vIHdpdGggbG9hZGVkIGVxdWFsaW5nIHRvdGFsIGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgICAgICAgICAgLy8gZm9yIHRoaXMgY2h1bms6XG4gICAgICAgICAgICBpZiAoY3VycmVudExvYWRlZCArIG8uY2h1bmtTaXplIC0gby5fcHJvZ3Jlc3MubG9hZGVkKSB7XG4gICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7XG4gICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbG9hZGVkOiB1YiAtIG8udXBsb2FkZWRCeXRlcyxcbiAgICAgICAgICAgICAgICAgIHRvdGFsOiB1YiAtIG8udXBsb2FkZWRCeXRlc1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG8udXBsb2FkZWRCeXRlcyA9IHViO1xuICAgICAgICAgICAgby5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzO1xuICAgICAgICAgICAgby5qcVhIUiA9IGpxWEhSO1xuICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmtkb25lJywgbnVsbCwgbyk7XG4gICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pO1xuICAgICAgICAgICAgaWYgKHViIDwgZnMpIHtcbiAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSxcbiAgICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCBjaHVuazpcbiAgICAgICAgICAgICAgdXBsb2FkKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgoby5jb250ZXh0LCBbcmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikge1xuICAgICAgICAgICAgby5qcVhIUiA9IGpxWEhSO1xuICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1cztcbiAgICAgICAgICAgIG8uZXJyb3JUaHJvd24gPSBlcnJvclRocm93bjtcbiAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZmFpbCcsIG51bGwsIG8pO1xuICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTtcbiAgICAgICAgICAgIGRmZC5yZWplY3RXaXRoKG8uY29udGV4dCwgW2pxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bl0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGF0Ll9kZWluaXRQcm9ncmVzc0xpc3RlbmVyKG8pO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpO1xuICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7XG4gICAgICB9O1xuICAgICAgdXBsb2FkKCk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuXG4gICAgX2JlZm9yZVNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICBpZiAodGhpcy5fYWN0aXZlID09PSAwKSB7XG4gICAgICAgIC8vIHRoZSBzdGFydCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbiB1cGxvYWQgc3RhcnRzXG4gICAgICAgIC8vIGFuZCBubyBvdGhlciB1cGxvYWRzIGFyZSBjdXJyZW50bHkgcnVubmluZyxcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDpcbiAgICAgICAgdGhpcy5fdHJpZ2dlcignc3RhcnQnKTtcbiAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBnbG9iYWwgYml0cmF0ZSBwcm9ncmVzcyBjYWxjdWxhdGlvbjpcbiAgICAgICAgdGhpcy5fYml0cmF0ZVRpbWVyID0gbmV3IHRoaXMuX0JpdHJhdGVUaW1lcigpO1xuICAgICAgICAvLyBSZXNldCB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczpcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkID0gdGhpcy5fcHJvZ3Jlc3MudG90YWwgPSAwO1xuICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gMDtcbiAgICAgIH1cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGFpbmVyIG9iamVjdHMgZm9yIHRoZSAucmVzcG9uc2UoKSBhbmRcbiAgICAgIC8vIC5wcm9ncmVzcygpIG1ldGhvZHMgb24gdGhlIGRhdGEgb2JqZWN0IGFyZSBhdmFpbGFibGVcbiAgICAgIC8vIGFuZCByZXNldCB0byB0aGVpciBpbml0aWFsIHN0YXRlOlxuICAgICAgdGhpcy5faW5pdFJlc3BvbnNlT2JqZWN0KGRhdGEpO1xuICAgICAgdGhpcy5faW5pdFByb2dyZXNzT2JqZWN0KGRhdGEpO1xuICAgICAgZGF0YS5fcHJvZ3Jlc3MubG9hZGVkID0gZGF0YS5sb2FkZWQgPSBkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMDtcbiAgICAgIGRhdGEuX3Byb2dyZXNzLnRvdGFsID0gZGF0YS50b3RhbCA9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpIHx8IDE7XG4gICAgICBkYXRhLl9wcm9ncmVzcy5iaXRyYXRlID0gZGF0YS5iaXRyYXRlID0gMDtcbiAgICAgIHRoaXMuX2FjdGl2ZSArPSAxO1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHByb2dyZXNzIHZhbHVlczpcbiAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCArPSBkYXRhLmxvYWRlZDtcbiAgICAgIHRoaXMuX3Byb2dyZXNzLnRvdGFsICs9IGRhdGEudG90YWw7XG4gICAgfSxcblxuICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7XG4gICAgICB2YXIgdG90YWwgPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbCxcbiAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTtcbiAgICAgIGlmIChvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQgPCB0b3RhbCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBwcm9ncmVzcyBldmVudCBpZiBubyBmaW5hbCBwcm9ncmVzcyBldmVudFxuICAgICAgICAvLyB3aXRoIGxvYWRlZCBlcXVhbGluZyB0b3RhbCBoYXMgYmVlbiB0cmlnZ2VyZWQ6XG4gICAgICAgIHRoaXMuX29uUHJvZ3Jlc3MoXG4gICAgICAgICAgJC5FdmVudCgncHJvZ3Jlc3MnLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgbG9hZGVkOiB0b3RhbCxcbiAgICAgICAgICAgIHRvdGFsOiB0b3RhbFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJlc3BvbnNlLnJlc3VsdCA9IG9wdGlvbnMucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XG4gICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjtcbiAgICAgIHRoaXMuX3RyaWdnZXIoJ2RvbmUnLCBudWxsLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgX29uRmFpbDogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucykge1xuICAgICAgdmFyIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7XG4gICAgICBpZiAob3B0aW9ucy5yZWNhbGN1bGF0ZVByb2dyZXNzKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbVxuICAgICAgICAvLyB0aGUgZ2xvYmFsIHByb2dyZXNzIGNhbGN1bGF0aW9uOlxuICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgLT0gb3B0aW9ucy5fcHJvZ3Jlc3MubG9hZGVkO1xuICAgICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCAtPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbDtcbiAgICAgIH1cbiAgICAgIHJlc3BvbnNlLmpxWEhSID0gb3B0aW9ucy5qcVhIUiA9IGpxWEhSO1xuICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XG4gICAgICByZXNwb25zZS5lcnJvclRocm93biA9IG9wdGlvbnMuZXJyb3JUaHJvd24gPSBlcnJvclRocm93bjtcbiAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBudWxsLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7XG4gICAgICAvLyBqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzIGFuZCBqcVhIUm9yRXJyb3IgYXJlIGFkZGVkIHRvIHRoZVxuICAgICAgLy8gb3B0aW9ucyBvYmplY3QgdmlhIGRvbmUgYW5kIGZhaWwgY2FsbGJhY2tzXG4gICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgX29uU2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgIGlmICghZGF0YS5zdWJtaXQpIHtcbiAgICAgICAgdGhpcy5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIGRhdGEpO1xuICAgICAgfVxuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBqcVhIUixcbiAgICAgICAgYWJvcnRlZCxcbiAgICAgICAgc2xvdCxcbiAgICAgICAgcGlwZSxcbiAgICAgICAgb3B0aW9ucyA9IHRoYXQuX2dldEFKQVhTZXR0aW5ncyhkYXRhKSxcbiAgICAgICAgc2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGF0Ll9zZW5kaW5nICs9IDE7XG4gICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOlxuICAgICAgICAgIG9wdGlvbnMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGF0Ll9CaXRyYXRlVGltZXIoKTtcbiAgICAgICAgICBqcVhIUiA9XG4gICAgICAgICAgICBqcVhIUiB8fFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAoKGFib3J0ZWQgfHxcbiAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKFxuICAgICAgICAgICAgICAgICAgJ3NlbmQnLFxuICAgICAgICAgICAgICAgICAgJC5FdmVudCgnc2VuZCcsIHsgZGVsZWdhdGVkRXZlbnQ6IGUgfSksXG4gICAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICAgICAgKSA9PT0gZmFsc2UpICYmXG4gICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgb3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKSkgfHxcbiAgICAgICAgICAgICAgdGhhdC5fY2h1bmtlZFVwbG9hZChvcHRpb25zKSB8fFxuICAgICAgICAgICAgICAkLmFqYXgob3B0aW9ucylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpIHtcbiAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICB0aGF0Ll9vbkZhaWwoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5fZGVpbml0UHJvZ3Jlc3NMaXN0ZW5lcihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGF0Ll9vbkFsd2F5cyhcbiAgICAgICAgICAgICAgICAgIGpxWEhSb3JSZXN1bHQsXG4gICAgICAgICAgICAgICAgICB0ZXh0U3RhdHVzLFxuICAgICAgICAgICAgICAgICAganFYSFJvckVycm9yLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyAtPSAxO1xuICAgICAgICAgICAgICAgIHRoYXQuX2FjdGl2ZSAtPSAxO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJlxuICAgICAgICAgICAgICAgICAgb3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gdGhhdC5fc2VuZGluZ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIG5leHQgcXVldWVkIHVwbG9hZCxcbiAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaGFzIG5vdCBiZWVuIGFib3J0ZWQ6XG4gICAgICAgICAgICAgICAgICB2YXIgbmV4dFNsb3QgPSB0aGF0Ll9zbG90cy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHRTbG90KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKG5leHRTbG90KSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFNsb3QucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZVxuICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDpcbiAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBqcVhIUjtcbiAgICAgICAgfTtcbiAgICAgIHRoaXMuX2JlZm9yZVNlbmQoZSwgb3B0aW9ucyk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucy5zZXF1ZW50aWFsVXBsb2FkcyB8fFxuICAgICAgICAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiZcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA8PSB0aGlzLl9zZW5kaW5nKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IDEpIHtcbiAgICAgICAgICBzbG90ID0gJC5EZWZlcnJlZCgpO1xuICAgICAgICAgIHRoaXMuX3Nsb3RzLnB1c2goc2xvdCk7XG4gICAgICAgICAgcGlwZSA9IHNsb3RbdGhhdC5fcHJvbWlzZVBpcGVdKHNlbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fc2VxdWVuY2VbdGhhdC5fcHJvbWlzZVBpcGVdKHNlbmQsIHNlbmQpO1xuICAgICAgICAgIHBpcGUgPSB0aGlzLl9zZXF1ZW5jZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXR1cm4gdGhlIHBpcGVkIFByb21pc2Ugb2JqZWN0LCBlbmhhbmNlZCB3aXRoIGFuIGFib3J0IG1ldGhvZCxcbiAgICAgICAgLy8gd2hpY2ggaXMgZGVsZWdhdGVkIHRvIHRoZSBqcVhIUiBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdXBsb2FkLFxuICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6XG4gICAgICAgIHBpcGUuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYWJvcnRlZCA9IFt1bmRlZmluZWQsICdhYm9ydCcsICdhYm9ydCddO1xuICAgICAgICAgIGlmICghanFYSFIpIHtcbiAgICAgICAgICAgIGlmIChzbG90KSB7XG4gICAgICAgICAgICAgIHNsb3QucmVqZWN0V2l0aChvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwaXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZW5kKCk7XG4gICAgfSxcblxuICAgIF9vbkFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIGRhdGEpLFxuICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXMsXG4gICAgICAgIGZpbGVzTGVuZ3RoID0gZmlsZXMubGVuZ3RoLFxuICAgICAgICBsaW1pdCA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRzLFxuICAgICAgICBsaW1pdFNpemUgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSxcbiAgICAgICAgb3ZlcmhlYWQgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZU92ZXJoZWFkLFxuICAgICAgICBiYXRjaFNpemUgPSAwLFxuICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksXG4gICAgICAgIHBhcmFtTmFtZVNldCxcbiAgICAgICAgcGFyYW1OYW1lU2xpY2UsXG4gICAgICAgIGZpbGVTZXQsXG4gICAgICAgIGksXG4gICAgICAgIGogPSAwO1xuICAgICAgaWYgKCFmaWxlc0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobGltaXRTaXplICYmIGZpbGVzWzBdLnNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW1pdFNpemUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdCB8fCBsaW1pdFNpemUpIHx8XG4gICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKVxuICAgICAgKSB7XG4gICAgICAgIGZpbGVTZXQgPSBbZmlsZXNdO1xuICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTtcbiAgICAgIH0gZWxzZSBpZiAoIShvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzIHx8IGxpbWl0U2l6ZSkgJiYgbGltaXQpIHtcbiAgICAgICAgZmlsZVNldCA9IFtdO1xuICAgICAgICBwYXJhbU5hbWVTZXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGVzTGVuZ3RoOyBpICs9IGxpbWl0KSB7XG4gICAgICAgICAgZmlsZVNldC5wdXNoKGZpbGVzLnNsaWNlKGksIGkgKyBsaW1pdCkpO1xuICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lLnNsaWNlKGksIGkgKyBsaW1pdCk7XG4gICAgICAgICAgaWYgKCFwYXJhbU5hbWVTbGljZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgJiYgbGltaXRTaXplKSB7XG4gICAgICAgIGZpbGVTZXQgPSBbXTtcbiAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlc0xlbmd0aDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgYmF0Y2hTaXplICs9IGZpbGVzW2ldLnNpemUgKyBvdmVyaGVhZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpICsgMSA9PT0gZmlsZXNMZW5ndGggfHxcbiAgICAgICAgICAgIGJhdGNoU2l6ZSArIGZpbGVzW2kgKyAxXS5zaXplICsgb3ZlcmhlYWQgPiBsaW1pdFNpemUgfHxcbiAgICAgICAgICAgIChsaW1pdCAmJiBpICsgMSAtIGogPj0gbGltaXQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWxlU2V0LnB1c2goZmlsZXMuc2xpY2UoaiwgaSArIDEpKTtcbiAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lLnNsaWNlKGosIGkgKyAxKTtcbiAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpO1xuICAgICAgICAgICAgaiA9IGkgKyAxO1xuICAgICAgICAgICAgYmF0Y2hTaXplID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtTmFtZVNldCA9IHBhcmFtTmFtZTtcbiAgICAgIH1cbiAgICAgIGRhdGEub3JpZ2luYWxGaWxlcyA9IGZpbGVzO1xuICAgICAgJC5lYWNoKGZpbGVTZXQgfHwgZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICB2YXIgbmV3RGF0YSA9ICQuZXh0ZW5kKHt9LCBkYXRhKTtcbiAgICAgICAgbmV3RGF0YS5maWxlcyA9IGZpbGVTZXQgPyBlbGVtZW50IDogW2VsZW1lbnRdO1xuICAgICAgICBuZXdEYXRhLnBhcmFtTmFtZSA9IHBhcmFtTmFtZVNldFtpbmRleF07XG4gICAgICAgIHRoYXQuX2luaXRSZXNwb25zZU9iamVjdChuZXdEYXRhKTtcbiAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzT2JqZWN0KG5ld0RhdGEpO1xuICAgICAgICB0aGF0Ll9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgbmV3RGF0YSk7XG4gICAgICAgIHJlc3VsdCA9IHRoYXQuX3RyaWdnZXIoXG4gICAgICAgICAgJ2FkZCcsXG4gICAgICAgICAgJC5FdmVudCgnYWRkJywgeyBkZWxlZ2F0ZWRFdmVudDogZSB9KSxcbiAgICAgICAgICBuZXdEYXRhXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIF9yZXBsYWNlRmlsZUlucHV0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIGlucHV0ID0gZGF0YS5maWxlSW5wdXQsXG4gICAgICAgIGlucHV0Q2xvbmUgPSBpbnB1dC5jbG9uZSh0cnVlKSxcbiAgICAgICAgcmVzdG9yZUZvY3VzID0gaW5wdXQuaXMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgICAvLyBBZGQgYSByZWZlcmVuY2UgZm9yIHRoZSBuZXcgY2xvbmVkIGZpbGUgaW5wdXQgdG8gdGhlIGRhdGEgYXJndW1lbnQ6XG4gICAgICBkYXRhLmZpbGVJbnB1dENsb25lID0gaW5wdXRDbG9uZTtcbiAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTtcbiAgICAgIC8vIERldGFjaGluZyBhbGxvd3MgdG8gaW5zZXJ0IHRoZSBmaWxlSW5wdXQgb24gYW5vdGhlciBmb3JtXG4gICAgICAvLyB3aXRob3V0IGxvc2luZyB0aGUgZmlsZSBpbnB1dCB2YWx1ZTpcbiAgICAgIGlucHV0LmFmdGVyKGlucHV0Q2xvbmUpLmRldGFjaCgpO1xuICAgICAgLy8gSWYgdGhlIGZpbGVJbnB1dCBoYWQgZm9jdXMgYmVmb3JlIGl0IHdhcyBkZXRhY2hlZCxcbiAgICAgIC8vIHJlc3RvcmUgZm9jdXMgdG8gdGhlIGlucHV0Q2xvbmUuXG4gICAgICBpZiAocmVzdG9yZUZvY3VzKSB7XG4gICAgICAgIGlucHV0Q2xvbmUudHJpZ2dlcignZm9jdXMnKTtcbiAgICAgIH1cbiAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OlxuICAgICAgJC5jbGVhbkRhdGEoaW5wdXQub2ZmKCdyZW1vdmUnKSk7XG4gICAgICAvLyBSZXBsYWNlIHRoZSBvcmlnaW5hbCBmaWxlIGlucHV0IGVsZW1lbnQgaW4gdGhlIGZpbGVJbnB1dFxuICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nXG4gICAgICAvLyBldmVudCBoYW5kbGVyczpcbiAgICAgIHRoaXMub3B0aW9ucy5maWxlSW5wdXQgPSB0aGlzLm9wdGlvbnMuZmlsZUlucHV0Lm1hcChmdW5jdGlvbiAoaSwgZWwpIHtcbiAgICAgICAgaWYgKGVsID09PSBpbnB1dFswXSkge1xuICAgICAgICAgIHJldHVybiBpbnB1dENsb25lWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbDtcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgdGhlIHdpZGdldCBoYXMgYmVlbiBpbml0aWFsaXplZCBvbiB0aGUgZmlsZSBpbnB1dCBpdHNlbGYsXG4gICAgICAvLyBvdmVycmlkZSB0aGlzLmVsZW1lbnQgd2l0aCB0aGUgZmlsZSBpbnB1dCBjbG9uZTpcbiAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGlucHV0Q2xvbmU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9oYW5kbGVGaWxlVHJlZUVudHJ5OiBmdW5jdGlvbiAoZW50cnksIHBhdGgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLFxuICAgICAgICBlbnRyaWVzID0gW10sXG4gICAgICAgIGRpclJlYWRlcixcbiAgICAgICAgZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpZiAoZSAmJiAhZS5lbnRyeSkge1xuICAgICAgICAgICAgZS5lbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTaW5jZSAkLndoZW4gcmV0dXJucyBpbW1lZGlhdGVseSBpZiBvbmVcbiAgICAgICAgICAvLyBEZWZlcnJlZCBpcyByZWplY3RlZCwgd2UgdXNlIHJlc29sdmUgaW5zdGVhZC5cbiAgICAgICAgICAvLyBUaGlzIGFsbG93cyB2YWxpZCBmaWxlcyBhbmQgaW52YWxpZCBpdGVtc1xuICAgICAgICAgIC8vIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIGluIG9uZSBzZXQ6XG4gICAgICAgICAgZGZkLnJlc29sdmUoW2VdKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgICAgIHRoYXRcbiAgICAgICAgICAgIC5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMsIHBhdGggKyBlbnRyeS5uYW1lICsgJy8nKVxuICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbChlcnJvckhhbmRsZXIpO1xuICAgICAgICB9LFxuICAgICAgICByZWFkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkaXJSZWFkZXIucmVhZEVudHJpZXMoZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIoZW50cmllcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbnRyaWVzID0gZW50cmllcy5jb25jYXQocmVzdWx0cyk7XG4gICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgcGF0aCA9IHBhdGggfHwgJyc7XG4gICAgICBpZiAoZW50cnkuaXNGaWxlKSB7XG4gICAgICAgIGlmIChlbnRyeS5fZmlsZSkge1xuICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNVxuICAgICAgICAgIGVudHJ5Ll9maWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7XG4gICAgICAgICAgZGZkLnJlc29sdmUoZW50cnkuX2ZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudHJ5LmZpbGUoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgIGZpbGUucmVsYXRpdmVQYXRoID0gcGF0aDtcbiAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgZGlyUmVhZGVyID0gZW50cnkuY3JlYXRlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgbGlzdCBmb3IgZmlsZSBzeXN0ZW0gaXRlbXNcbiAgICAgICAgLy8gb3RoZXIgdGhhbiBmaWxlcyBvciBkaXJlY3RvcmllczpcbiAgICAgICAgZGZkLnJlc29sdmUoW10pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7XG4gICAgfSxcblxuICAgIF9oYW5kbGVGaWxlVHJlZUVudHJpZXM6IGZ1bmN0aW9uIChlbnRyaWVzLCBwYXRoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICByZXR1cm4gJC53aGVuXG4gICAgICAgIC5hcHBseShcbiAgICAgICAgICAkLFxuICAgICAgICAgICQubWFwKGVudHJpZXMsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cnkoZW50cnksIHBhdGgpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgW3RoaXMuX3Byb21pc2VQaXBlXShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfZ2V0RHJvcHBlZEZpbGVzOiBmdW5jdGlvbiAoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTtcbiAgICAgIHZhciBpdGVtcyA9IGRhdGFUcmFuc2Zlci5pdGVtcztcbiAgICAgIGlmIChcbiAgICAgICAgaXRlbXMgJiZcbiAgICAgICAgaXRlbXMubGVuZ3RoICYmXG4gICAgICAgIChpdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5IHx8IGl0ZW1zWzBdLmdldEFzRW50cnkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVUcmVlRW50cmllcyhcbiAgICAgICAgICAkLm1hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgICAgIGlmIChpdGVtLndlYmtpdEdldEFzRW50cnkpIHtcbiAgICAgICAgICAgICAgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1OlxuICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRBc0VudHJ5KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgkLm1ha2VBcnJheShkYXRhVHJhbnNmZXIuZmlsZXMpKS5wcm9taXNlKCk7XG4gICAgfSxcblxuICAgIF9nZXRTaW5nbGVGaWxlSW5wdXRGaWxlczogZnVuY3Rpb24gKGZpbGVJbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBmaWxlSW5wdXQgPSAkKGZpbGVJbnB1dCk7XG4gICAgICB2YXIgZW50cmllcyA9IGZpbGVJbnB1dC5wcm9wKCdlbnRyaWVzJyksXG4gICAgICAgIGZpbGVzLFxuICAgICAgICB2YWx1ZTtcbiAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoZW50cmllcyk7XG4gICAgICB9XG4gICAgICBmaWxlcyA9ICQubWFrZUFycmF5KGZpbGVJbnB1dC5wcm9wKCdmaWxlcycpKTtcbiAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gZmlsZUlucHV0LnByb3AoJ3ZhbHVlJyk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoW10pLnByb21pc2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgZmlsZXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGJyb3dzZXIgZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB0aGUgRmlsZSBBUEkgYW5kIHdlIGFkZCBhIHBzZXVkbyBGaWxlIG9iamVjdCB3aXRoXG4gICAgICAgIC8vIHRoZSBpbnB1dCB2YWx1ZSBhcyBuYW1lIHdpdGggcGF0aCBpbmZvcm1hdGlvbiByZW1vdmVkOlxuICAgICAgICBmaWxlcyA9IFt7IG5hbWU6IHZhbHVlLnJlcGxhY2UoL14uKlxcXFwvLCAnJykgfV07XG4gICAgICB9IGVsc2UgaWYgKGZpbGVzWzBdLm5hbWUgPT09IHVuZGVmaW5lZCAmJiBmaWxlc1swXS5maWxlTmFtZSkge1xuICAgICAgICAvLyBGaWxlIG5vcm1hbGl6YXRpb24gZm9yIFNhZmFyaSA0IGFuZCBGaXJlZm94IDM6XG4gICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7XG4gICAgICAgICAgZmlsZS5uYW1lID0gZmlsZS5maWxlTmFtZTtcbiAgICAgICAgICBmaWxlLnNpemUgPSBmaWxlLmZpbGVTaXplO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShmaWxlcykucHJvbWlzZSgpO1xuICAgIH0sXG5cbiAgICBfZ2V0RmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHtcbiAgICAgIGlmICghKGZpbGVJbnB1dCBpbnN0YW5jZW9mICQpIHx8IGZpbGVJbnB1dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKGZpbGVJbnB1dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJC53aGVuXG4gICAgICAgIC5hcHBseSgkLCAkLm1hcChmaWxlSW5wdXQsIHRoaXMuX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzKSlcbiAgICAgICAgW3RoaXMuX3Byb21pc2VQaXBlXShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgZmlsZUlucHV0OiAkKGUudGFyZ2V0KSxcbiAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pXG4gICAgICAgIH07XG4gICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XG4gICAgICAgIGlmICh0aGF0Lm9wdGlvbnMucmVwbGFjZUZpbGVJbnB1dCkge1xuICAgICAgICAgIHRoYXQuX3JlcGxhY2VGaWxlSW5wdXQoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoYXQuX3RyaWdnZXIoXG4gICAgICAgICAgICAnY2hhbmdlJyxcbiAgICAgICAgICAgICQuRXZlbnQoJ2NoYW5nZScsIHsgZGVsZWdhdGVkRXZlbnQ6IGUgfSksXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgKSAhPT0gZmFsc2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhhdC5fb25BZGQoZSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfb25QYXN0ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpdGVtcyA9XG4gICAgICAgICAgZS5vcmlnaW5hbEV2ZW50ICYmXG4gICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEgJiZcbiAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS5pdGVtcyxcbiAgICAgICAgZGF0YSA9IHsgZmlsZXM6IFtdIH07XG4gICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICQuZWFjaChpdGVtcywgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7XG4gICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpO1xuICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICBkYXRhLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXG4gICAgICAgICAgICAncGFzdGUnLFxuICAgICAgICAgICAgJC5FdmVudCgncGFzdGUnLCB7IGRlbGVnYXRlZEV2ZW50OiBlIH0pLFxuICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICkgIT09IGZhbHNlXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX29uQWRkKGUsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLmRhdGFUcmFuc2ZlciA9IGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBkYXRhVHJhbnNmZXIgPSBlLmRhdGFUcmFuc2ZlcixcbiAgICAgICAgZGF0YSA9IHt9O1xuICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgJiYgZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX2dldERyb3BwZWRGaWxlcyhkYXRhVHJhbnNmZXIpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcihcbiAgICAgICAgICAgICAgJ2Ryb3AnLFxuICAgICAgICAgICAgICAkLkV2ZW50KCdkcm9wJywgeyBkZWxlZ2F0ZWRFdmVudDogZSB9KSxcbiAgICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICAgKSAhPT0gZmFsc2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9vbkRyYWdPdmVyOiBnZXREcmFnSGFuZGxlcignZHJhZ292ZXInKSxcblxuICAgIF9vbkRyYWdFbnRlcjogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdlbnRlcicpLFxuXG4gICAgX29uRHJhZ0xlYXZlOiBnZXREcmFnSGFuZGxlcignZHJhZ2xlYXZlJyksXG5cbiAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLl9pc1hIUlVwbG9hZCh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwge1xuICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLFxuICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcCxcbiAgICAgICAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIG9uIGRyYWdlbnRlciBpcyByZXF1aXJlZCBmb3IgSUUxMCs6XG4gICAgICAgICAgZHJhZ2VudGVyOiB0aGlzLl9vbkRyYWdFbnRlcixcbiAgICAgICAgICAvLyBkcmFnbGVhdmUgaXMgbm90IHJlcXVpcmVkLCBidXQgYWRkZWQgZm9yIGNvbXBsZXRlbmVzczpcbiAgICAgICAgICBkcmFnbGVhdmU6IHRoaXMuX29uRHJhZ0xlYXZlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbih0aGlzLm9wdGlvbnMucGFzdGVab25lLCB7XG4gICAgICAgICAgcGFzdGU6IHRoaXMuX29uUGFzdGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoJC5zdXBwb3J0LmZpbGVJbnB1dCkge1xuICAgICAgICB0aGlzLl9vbih0aGlzLm9wdGlvbnMuZmlsZUlucHV0LCB7XG4gICAgICAgICAgY2hhbmdlOiB0aGlzLl9vbkNoYW5nZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2Rlc3Ryb3lFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmRyb3Bab25lLCAnZHJhZ2VudGVyIGRyYWdsZWF2ZSBkcmFnb3ZlciBkcm9wJyk7XG4gICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLnBhc3RlWm9uZSwgJ3Bhc3RlJyk7XG4gICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVJbnB1dCwgJ2NoYW5nZScpO1xuICAgIH0sXG5cbiAgICBfZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTtcbiAgICB9LFxuXG4gICAgX3NldE9wdGlvbjogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciByZWluaXQgPSAkLmluQXJyYXkoa2V5LCB0aGlzLl9zcGVjaWFsT3B0aW9ucykgIT09IC0xO1xuICAgICAgaWYgKHJlaW5pdCkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RXZlbnRIYW5kbGVycygpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3VwZXIoa2V5LCB2YWx1ZSk7XG4gICAgICBpZiAocmVpbml0KSB7XG4gICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfaW5pdFNwZWNpYWxPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5lbGVtZW50LmlzKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpXG4gICAgICAgICAgPyB0aGlzLmVsZW1lbnRcbiAgICAgICAgICA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xuICAgICAgfSBlbHNlIGlmICghKG9wdGlvbnMuZmlsZUlucHV0IGluc3RhbmNlb2YgJCkpIHtcbiAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KTtcbiAgICAgIH1cbiAgICAgIGlmICghKG9wdGlvbnMuZHJvcFpvbmUgaW5zdGFuY2VvZiAkKSkge1xuICAgICAgICBvcHRpb25zLmRyb3Bab25lID0gJChvcHRpb25zLmRyb3Bab25lKTtcbiAgICAgIH1cbiAgICAgIGlmICghKG9wdGlvbnMucGFzdGVab25lIGluc3RhbmNlb2YgJCkpIHtcbiAgICAgICAgb3B0aW9ucy5wYXN0ZVpvbmUgPSAkKG9wdGlvbnMucGFzdGVab25lKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikge1xuICAgICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KCcvJyksXG4gICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpO1xuICAgICAgcGFydHMuc2hpZnQoKTtcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhcnRzLmpvaW4oJy8nKSwgbW9kaWZpZXJzKTtcbiAgICB9LFxuXG4gICAgX2lzUmVnRXhwT3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAga2V5ICE9PSAndXJsJyAmJlxuICAgICAgICAkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAvXlxcLy4qXFwvW2lnbV17MCwzfSQvLnRlc3QodmFsdWUpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBfaW5pdERhdGFBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGRhdGEgPSB0aGlzLmVsZW1lbnQuZGF0YSgpO1xuICAgICAgLy8gSW5pdGlhbGl6ZSBvcHRpb25zIHNldCB2aWEgSFRNTDUgZGF0YS1hdHRyaWJ1dGVzOlxuICAgICAgJC5lYWNoKHRoaXMuZWxlbWVudFswXS5hdHRyaWJ1dGVzLCBmdW5jdGlvbiAoaW5kZXgsIGF0dHIpIHtcbiAgICAgICAgdmFyIGtleSA9IGF0dHIubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICBpZiAoL15kYXRhLS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgLy8gQ29udmVydCBoeXBoZW4tYXRlZCBrZXkgdG8gY2FtZWxDYXNlOlxuICAgICAgICAgIGtleSA9IGtleS5zbGljZSg1KS5yZXBsYWNlKC8tW2Etel0vZywgZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICBpZiAodGhhdC5faXNSZWdFeHBPcHRpb24oa2V5LCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhhdC5fZ2V0UmVnRXhwKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9pbml0RGF0YUF0dHJpYnV0ZXMoKTtcbiAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpO1xuICAgICAgdGhpcy5fc2xvdHMgPSBbXTtcbiAgICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fZ2V0WEhSUHJvbWlzZSh0cnVlKTtcbiAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwO1xuICAgICAgdGhpcy5faW5pdFByb2dyZXNzT2JqZWN0KHRoaXMpO1xuICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTtcbiAgICB9LFxuXG4gICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5XG4gICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczpcbiAgICBhY3RpdmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfSxcblxuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyB0byBxdWVyeVxuICAgIC8vIHRoZSB3aWRnZXQgdXBsb2FkIHByb2dyZXNzLlxuICAgIC8vIEl0IHJldHVybnMgYW4gb2JqZWN0IHdpdGggbG9hZGVkLCB0b3RhbCBhbmQgYml0cmF0ZSBwcm9wZXJ0aWVzXG4gICAgLy8gZm9yIHRoZSBydW5uaW5nIHVwbG9hZHM6XG4gICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcbiAgICB9LFxuXG4gICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIGFkZGluZyBmaWxlc1xuICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoXG4gICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgcHJvcGVydHkgYW5kIGNhbiBjb250YWluIGFkZGl0aW9uYWwgb3B0aW9uczpcbiAgICAvLyAuZmlsZXVwbG9hZCgnYWRkJywge2ZpbGVzOiBmaWxlc0xpc3R9KTtcbiAgICBhZGQ6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICBpZiAoIWRhdGEgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmZpbGVJbnB1dCAmJiAhZGF0YS5maWxlcykge1xuICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlcztcbiAgICAgICAgICB0aGF0Ll9vbkFkZChudWxsLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7XG4gICAgICAgIHRoaXMuX29uQWRkKG51bGwsIGRhdGEpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlc1xuICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoXG4gICAgLy8gbXVzdCBoYXZlIGEgZmlsZXMgb3IgZmlsZUlucHV0IHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pO1xuICAgIC8vIFRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGZvciB0aGUgZmlsZSB1cGxvYWQgY2FsbC5cbiAgICBzZW5kOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEgJiYgIXRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksXG4gICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKSxcbiAgICAgICAgICAgIGpxWEhSLFxuICAgICAgICAgICAgYWJvcnRlZDtcbiAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoanFYSFIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZmQucmVqZWN0KG51bGwsICdhYm9ydCcsICdhYm9ydCcpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZGZkLnJlamVjdCgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XG4gICAgICAgICAgICBqcVhIUiA9IHRoYXQuX29uU2VuZChudWxsLCBkYXRhKTtcbiAgICAgICAgICAgIGpxWEhSLnRoZW4oXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7XG4gICAgICAgICAgICAgICAgZGZkLnJlc29sdmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUik7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICBkZmQucmVqZWN0KGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTtcbiAgICAgICAgaWYgKGRhdGEuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uU2VuZChudWxsLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCIvKlxuICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWRcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKi9cblxuLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSAqL1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6XG4gICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgIC8vIE5vZGUvQ29tbW9uSlM6XG4gICAgZmFjdG9yeShyZXF1aXJlKCdqcXVlcnknKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzOlxuICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7XG4gIH1cbn0pKGZ1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBIZWxwZXIgdmFyaWFibGUgdG8gY3JlYXRlIHVuaXF1ZSBuYW1lcyBmb3IgdGhlIHRyYW5zcG9ydCBpZnJhbWVzOlxuICB2YXIgY291bnRlciA9IDAsXG4gICAganNvbkFQSSA9ICQsXG4gICAganNvblBhcnNlID0gJ3BhcnNlSlNPTic7XG5cbiAgaWYgKCdKU09OJyBpbiB3aW5kb3cgJiYgJ3BhcnNlJyBpbiBKU09OKSB7XG4gICAganNvbkFQSSA9IEpTT047XG4gICAganNvblBhcnNlID0gJ3BhcnNlJztcbiAgfVxuXG4gIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgZm91ciBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzXG4gIC8vIG9wdGlvbnMucGFyYW1OYW1lOiB0aGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBmaWxlIGZvcm0gZGF0YSxcbiAgLy8gIG92ZXJyaWRlcyB0aGUgbmFtZSBwcm9wZXJ0eSBvZiB0aGUgZmlsZSBpbnB1dCBmaWVsZChzKSxcbiAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICAvLyBvcHRpb25zLmZvcm1EYXRhOiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggbmFtZSBhbmQgdmFsdWUgcHJvcGVydGllcyxcbiAgLy8gIGVxdWl2YWxlbnQgdG8gdGhlIHJldHVybiBkYXRhIG9mIC5zZXJpYWxpemVBcnJheSgpLCBlLmcuOlxuICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XVxuICAvLyBvcHRpb25zLmluaXRpYWxJZnJhbWVTcmM6IHRoZSBVUkwgb2YgdGhlIGluaXRpYWwgaWZyYW1lIHNyYyxcbiAgLy8gIGJ5IGRlZmF1bHQgc2V0IHRvIFwiamF2YXNjcmlwdDpmYWxzZTtcIlxuICAkLmFqYXhUcmFuc3BvcnQoJ2lmcmFtZScsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuYXN5bmMpIHtcbiAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjXG4gICAgICAvLyBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTY6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2NyaXB0LXVybFxuICAgICAgdmFyIGluaXRpYWxJZnJhbWVTcmMgPSBvcHRpb25zLmluaXRpYWxJZnJhbWVTcmMgfHwgJ2phdmFzY3JpcHQ6ZmFsc2U7JyxcbiAgICAgICAgZm9ybSxcbiAgICAgICAgaWZyYW1lLFxuICAgICAgICBhZGRQYXJhbUNoYXI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykge1xuICAgICAgICAgIGZvcm0gPSAkKCc8Zm9ybSBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Zvcm0+Jyk7XG4gICAgICAgICAgZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcsIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpO1xuICAgICAgICAgIGFkZFBhcmFtQ2hhciA9IC9cXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nO1xuICAgICAgICAgIC8vIFhEb21haW5SZXF1ZXN0IG9ubHkgc3VwcG9ydHMgR0VUIGFuZCBQT1NUOlxuICAgICAgICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICdERUxFVEUnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsICsgYWRkUGFyYW1DaGFyICsgJ19tZXRob2Q9REVMRVRFJztcbiAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJztcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ1BVVCcpIHtcbiAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnO1xuICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnUEFUQ0gnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsICsgYWRkUGFyYW1DaGFyICsgJ19tZXRob2Q9UEFUQ0gnO1xuICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJRSB2ZXJzaW9ucyBiZWxvdyBJRTggY2Fubm90IHNldCB0aGUgbmFtZSBwcm9wZXJ0eSBvZlxuICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSxcbiAgICAgICAgICAvLyBzbyB3ZSBzZXQgdGhlIG5hbWUgYWxvbmcgd2l0aCB0aGUgaWZyYW1lIEhUTUwgbWFya3VwOlxuICAgICAgICAgIGNvdW50ZXIgKz0gMTtcbiAgICAgICAgICBpZnJhbWUgPSAkKFxuICAgICAgICAgICAgJzxpZnJhbWUgc3JjPVwiJyArXG4gICAgICAgICAgICAgIGluaXRpYWxJZnJhbWVTcmMgK1xuICAgICAgICAgICAgICAnXCIgbmFtZT1cImlmcmFtZS10cmFuc3BvcnQtJyArXG4gICAgICAgICAgICAgIGNvdW50ZXIgK1xuICAgICAgICAgICAgICAnXCI+PC9pZnJhbWU+J1xuICAgICAgICAgICkub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZmlsZUlucHV0Q2xvbmVzLFxuICAgICAgICAgICAgICBwYXJhbU5hbWVzID0gJC5pc0FycmF5KG9wdGlvbnMucGFyYW1OYW1lKVxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5wYXJhbU5hbWVcbiAgICAgICAgICAgICAgICA6IFtvcHRpb25zLnBhcmFtTmFtZV07XG4gICAgICAgICAgICBpZnJhbWUub2ZmKCdsb2FkJykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciByZXNwb25zZTtcbiAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93blxuICAgICAgICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgY3Jvc3MtZG9tYWluIGlmcmFtZSBjb250ZW50czpcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGlmcmFtZS5jb250ZW50cygpO1xuICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBDaHJvbWUgYW5kIEZpcmVmb3ggZG8gbm90IHRocm93IGFuXG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHdoZW4gY2FsbGluZyBpZnJhbWUuY29udGVudHMoKSBvblxuICAgICAgICAgICAgICAgIC8vIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc28gd2UgdW5pZnkgdGhlIHJlc3BvbnNlOlxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubGVuZ3RoIHx8ICFyZXNwb25zZVswXS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUaGUgY29tcGxldGUgY2FsbGJhY2sgcmV0dXJucyB0aGVcbiAgICAgICAgICAgICAgLy8gaWZyYW1lIGNvbnRlbnQgZG9jdW1lbnQgYXMgcmVzcG9uc2Ugb2JqZWN0OlxuICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKDIwMCwgJ3N1Y2Nlc3MnLCB7IGlmcmFtZTogcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUgZW5kbGVzcyBwcm9ncmVzcyBiYXIgYWN0aXZpdHkgYnVnXG4gICAgICAgICAgICAgIC8vIChoYXBwZW5zIG9uIGZvcm0gc3VibWl0cyB0byBpZnJhbWUgdGFyZ2V0cyk6XG4gICAgICAgICAgICAgICQoJzxpZnJhbWUgc3JjPVwiJyArIGluaXRpYWxJZnJhbWVTcmMgKyAnXCI+PC9pZnJhbWU+JykuYXBwZW5kVG8oXG4gICAgICAgICAgICAgICAgZm9ybVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZpbmcgdGhlIGZvcm0gaW4gYSBzZXRUaW1lb3V0IGNhbGxcbiAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXlcbiAgICAgICAgICAgICAgICAvLyB0aGUgcmVzcG9uc2UgcmVzdWx0XG4gICAgICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvcm1cbiAgICAgICAgICAgICAgLnByb3AoJ3RhcmdldCcsIGlmcmFtZS5wcm9wKCduYW1lJykpXG4gICAgICAgICAgICAgIC5wcm9wKCdhY3Rpb24nLCBvcHRpb25zLnVybClcbiAgICAgICAgICAgICAgLnByb3AoJ21ldGhvZCcsIG9wdGlvbnMudHlwZSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JtRGF0YSkge1xuICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkge1xuICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPVwiaGlkZGVuXCIvPicpXG4gICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpXG4gICAgICAgICAgICAgICAgICAudmFsKGZpZWxkLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKGZvcm0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQgJiZcbiAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQubGVuZ3RoICYmXG4gICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9PT0gJ1BPU1QnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmlsZUlucHV0Q2xvbmVzID0gb3B0aW9ucy5maWxlSW5wdXQuY2xvbmUoKTtcbiAgICAgICAgICAgICAgLy8gSW5zZXJ0IGEgY2xvbmUgZm9yIGVhY2ggZmlsZSBpbnB1dCBmaWVsZDpcbiAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuYWZ0ZXIoZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVJbnB1dENsb25lc1tpbmRleF07XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKCduYW1lJywgcGFyYW1OYW1lc1tpbmRleF0gfHwgb3B0aW9ucy5wYXJhbU5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEFwcGVuZGluZyB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgdG8gdGhlIGhpZGRlbiBmb3JtXG4gICAgICAgICAgICAgIC8vIHJlbW92ZXMgdGhlbSBmcm9tIHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9uOlxuICAgICAgICAgICAgICBmb3JtXG4gICAgICAgICAgICAgICAgLmFwcGVuZChvcHRpb25zLmZpbGVJbnB1dClcbiAgICAgICAgICAgICAgICAucHJvcCgnZW5jdHlwZScsICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgICAgICAgICAgICAgICAvLyBlbmN0eXBlIG11c3QgYmUgc2V0IGFzIGVuY29kaW5nIGZvciBJRTpcbiAgICAgICAgICAgICAgICAucHJvcCgnZW5jb2RpbmcnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpO1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEhUTUw1IGZvcm0gYXR0cmlidXRlIGZyb20gdGhlIGlucHV0KHMpOlxuICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5yZW1vdmVBdHRyKCdmb3JtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIC8vIFN1Ym1pdHRpbmcgdGhlIGZvcm0gaW4gYSBzZXRUaW1lb3V0IGNhbGwgZml4ZXMgYW4gaXNzdWUgd2l0aFxuICAgICAgICAgICAgICAvLyBTYWZhcmkgMTMgbm90IHRyaWdnZXJpbmcgdGhlIGlmcmFtZSBsb2FkIGV2ZW50IGFmdGVyIHJlc2V0dGluZ1xuICAgICAgICAgICAgICAvLyB0aGUgbG9hZCBldmVudCBoYW5kbGVyLCBzZWUgYWxzbzpcbiAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkL2lzc3Vlcy8zNjMzXG4gICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb25cbiAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOlxuICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uIChpbmRleCwgaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCBmb3JtIHByb3BlcnRpZXM6XG4gICAgICAgICAgICAgICAgICAkKGlucHV0KVxuICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGNsb25lLnByb3AoJ25hbWUnKSlcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2Zvcm0nLCBjbG9uZS5hdHRyKCdmb3JtJykpO1xuICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpZnJhbWUpIHtcbiAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaWZyYW1lIHNyYyBhYm9ydHMgdGhlIHJlcXVlc3RcbiAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuXG4gICAgICAgICAgICBpZnJhbWUub2ZmKCdsb2FkJykucHJvcCgnc3JjJywgaW5pdGlhbElmcmFtZVNyYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICBmb3JtLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IHJldHVybnMgdGhlIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlLlxuICAvLyBUaGUgZm9sbG93aW5nIGFkZHMgY29udmVydGVycyBmcm9tIGlmcmFtZSB0byB0ZXh0LCBqc29uLCBodG1sLCB4bWxcbiAgLy8gYW5kIHNjcmlwdC5cbiAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgQ29udGVudC1UeXBlIGZvciBKU09OIHJlc3BvbnNlcyBoYXMgdG8gYmUgdGV4dC9wbGFpblxuICAvLyBvciB0ZXh0L2h0bWwsIGlmIHRoZSBicm93c2VyIGRvZXNuJ3QgaW5jbHVkZSBhcHBsaWNhdGlvbi9qc29uIGluIHRoZVxuICAvLyBBY2NlcHQgaGVhZGVyLCBlbHNlIElFIHdpbGwgc2hvdyBhIGRvd25sb2FkIGRpYWxvZy5cbiAgLy8gVGhlIENvbnRlbnQtVHlwZSBmb3IgWE1MIHJlc3BvbnNlcyBvbiB0aGUgb3RoZXIgaGFuZCBoYXMgdG8gYmUgYWx3YXlzXG4gIC8vIGFwcGxpY2F0aW9uL3htbCBvciB0ZXh0L3htbCwgc28gSUUgcHJvcGVybHkgcGFyc2VzIHRoZSBYTUwgcmVzcG9uc2UuXG4gIC8vIFNlZSBhbHNvXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZC93aWtpL1NldHVwI2NvbnRlbnQtdHlwZS1uZWdvdGlhdGlvblxuICAkLmFqYXhTZXR1cCh7XG4gICAgY29udmVydGVyczoge1xuICAgICAgJ2lmcmFtZSB0ZXh0JzogZnVuY3Rpb24gKGlmcmFtZSkge1xuICAgICAgICByZXR1cm4gaWZyYW1lICYmICQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKTtcbiAgICAgIH0sXG4gICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICAgIHJldHVybiBpZnJhbWUgJiYganNvbkFQSVtqc29uUGFyc2VdKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7XG4gICAgICB9LFxuICAgICAgJ2lmcmFtZSBodG1sJzogZnVuY3Rpb24gKGlmcmFtZSkge1xuICAgICAgICByZXR1cm4gaWZyYW1lICYmICQoaWZyYW1lWzBdLmJvZHkpLmh0bWwoKTtcbiAgICAgIH0sXG4gICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHtcbiAgICAgICAgdmFyIHhtbERvYyA9IGlmcmFtZSAmJiBpZnJhbWVbMF07XG4gICAgICAgIHJldHVybiB4bWxEb2MgJiYgJC5pc1hNTERvYyh4bWxEb2MpXG4gICAgICAgICAgPyB4bWxEb2NcbiAgICAgICAgICA6ICQucGFyc2VYTUwoXG4gICAgICAgICAgICAgICh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHxcbiAgICAgICAgICAgICAgICAkKHhtbERvYy5ib2R5KS5odG1sKClcbiAgICAgICAgICAgICk7XG4gICAgICB9LFxuICAgICAgJ2lmcmFtZSBzY3JpcHQnOiBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICAgIHJldHVybiBpZnJhbWUgJiYgJC5nbG9iYWxFdmFsKCQoaWZyYW1lWzBdLmJvZHkpLnRleHQoKSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn0pO1xuIiwidmFyIGluaXRpYWxpemVkO1xyXG52YXIgbWVkaWFBcHA7XHJcblxyXG52YXIgYnVzID0gbmV3IFZ1ZSgpO1xyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZU1lZGlhQXBwbGljYXRpb24oZGlzcGxheU1lZGlhQXBwbGljYXRpb24sIG1lZGlhQXBwbGljYXRpb25VcmwsIHBhdGhCYXNlKSB7XHJcblxyXG4gICAgaWYgKGluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoIW1lZGlhQXBwbGljYXRpb25VcmwpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdtZWRpYUFwcGxpY2F0aW9uVXJsIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgJC5hamF4KHtcclxuICAgICAgICB1cmw6IG1lZGlhQXBwbGljYXRpb25VcmwsXHJcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoY29udGVudCkge1xyXG4gICAgICAgICAgICAkKCcudGEtY29udGVudCcpLmFwcGVuZChjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ21lZGlhYXBwbGljYXRpb246cmVhZHknKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByb290ID0ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJCgnI3QtbWVkaWFMaWJyYXJ5JykudGV4dCgpLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogJycsXHJcbiAgICAgICAgICAgICAgICBmb2xkZXI6ICcnLFxyXG4gICAgICAgICAgICAgICAgaXNEaXJlY3Rvcnk6IHRydWVcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIG1lZGlhQXBwID0gbmV3IFZ1ZSh7XHJcbiAgICAgICAgICAgICAgICBlbDogJyNtZWRpYUFwcCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb2xkZXI6IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhSXRlbXM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWVkaWFzOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdEcm9wVGh1bWJuYWlsOiBuZXcgSW1hZ2UoKSxcclxuICAgICAgICAgICAgICAgICAgICBzbWFsbFRodW1iczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JpZFZpZXc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhRmlsdGVyOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICBzb3J0Qnk6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvcnRBc2M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNJblBhZ2U6IFtdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kcmFnRHJvcFRodW1ibmFpbC5zcmMgPSAocGF0aEJhc2UgfHwgJycpICsgJy9PcmNoYXJkQ29yZS5NZWRpYS9JbWFnZXMvZHJhZy10aHVtYm5haWwucG5nJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnVzLiRvbignZm9sZGVyU2VsZWN0ZWQnLCBmdW5jdGlvbiAoZm9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRGb2xkZXIgPSBmb2xkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ2ZvbGRlckRlbGV0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0Um9vdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdmb2xkZXJBZGRlZCcsIGZ1bmN0aW9uIChmb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZEZvbGRlciA9IGZvbGRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnVzLiRvbignbWVkaWFMaXN0TW92ZWQnLCBmdW5jdGlvbiAoZXJyb3JJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZEZvbGRlcihzZWxmLnNlbGVjdGVkRm9sZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ySW5mbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMucHVzaChlcnJvckluZm8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ21lZGlhUmVuYW1lZCcsIGZ1bmN0aW9uIChuZXdOYW1lLCBuZXdQYXRoLCBvbGRQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZWRpYSA9IHNlbGYubWVkaWFJdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm1lZGlhUGF0aCA9PT0gb2xkUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYS5tZWRpYVBhdGggPSBuZXdQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYS5uYW1lID0gbmV3TmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnVzLiRvbignY3JlYXRlRm9sZGVyUmVxdWVzdGVkJywgZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlRm9sZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ2RlbGV0ZUZvbGRlclJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZUZvbGRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gaGFuZGxlcnMgZm9yIGFjdGlvbnMgaW4gYm90aCBncmlkIGFuZCB0YWJsZSB2aWV3LlxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ3NvcnRDaGFuZ2VSZXF1ZXN0ZWQnLCBmdW5jdGlvbiAobmV3U29ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZVNvcnQobmV3U29ydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ21lZGlhVG9nZ2xlUmVxdWVzdGVkJywgZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYShtZWRpYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ3JlbmFtZU1lZGlhUmVxdWVzdGVkJywgZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuYW1lTWVkaWEobWVkaWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdkZWxldGVNZWRpYVJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZU1lZGlhSXRlbShtZWRpYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ21lZGlhRHJhZ1N0YXJ0UmVxdWVzdGVkJywgZnVuY3Rpb24gKG1lZGlhLCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlRHJhZ1N0YXJ0KG1lZGlhLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgZm9yIHBhZ2VyIGV2ZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ3BhZ2VyRXZlbnQnLCBmdW5jdGlvbiAoaXRlbXNJblBhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtc0luUGFnZSA9IGl0ZW1zSW5QYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkTWVkaWFzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21lZGlhQXBwbGljYXRpb25QcmVmcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRGb2xkZXIgPSByb290O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRQcmVmcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21lZGlhQXBwbGljYXRpb25QcmVmcycpKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzSG9tZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZvbGRlciA9PSByb290O1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRGb2xkZXIgPSB0aGlzLnNlbGVjdGVkRm9sZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50Rm9sZGVyICYmIHBhcmVudEZvbGRlci5wYXRoICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnVuc2hpZnQocGFyZW50Rm9sZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlci5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICByb290OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb290O1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRNZWRpYUl0ZW1zOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRNZWRpYXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZCA9IHNlbGYubWVkaWFJdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlbGYubWVkaWFGaWx0ZXIudG9Mb3dlckNhc2UoKSkgPiAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzZWxmLnNvcnRCeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2l6ZSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb3J0QXNjID8gYS5zaXplIC0gYi5zaXplIDogYi5zaXplIC0gYS5zaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWltZSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb3J0QXNjID8gYS5taW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLm1pbWUudG9Mb3dlckNhc2UoKSkgOiBiLm1pbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGEubWltZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhc3RNb2RpZnknOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29ydEFzYyA/IGEubGFzdE1vZGlmeSAtIGIubGFzdE1vZGlmeSA6IGIubGFzdE1vZGlmeSAtIGEubGFzdE1vZGlmeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb3J0QXNjID8gYS5uYW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLm5hbWUudG9Mb3dlckNhc2UoKSkgOiBiLm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGEubmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuQ291bnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWVkaWFJdGVtcy5sZW5ndGggLSB0aGlzLmZpbHRlcmVkTWVkaWFJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB0aHVtYlNpemU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc21hbGxUaHVtYnMgPyAxMDAgOiAyNDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJlZnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsVGh1bWJzOiB0aGlzLnNtYWxsVGh1bWJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9sZGVyOiB0aGlzLnNlbGVjdGVkRm9sZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRWaWV3OiB0aGlzLmdyaWRWaWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYWxsVGh1bWJzID0gbmV3UHJlZnMuc21hbGxUaHVtYnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVyID0gbmV3UHJlZnMuc2VsZWN0ZWRGb2xkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRWaWV3ID0gbmV3UHJlZnMuZ3JpZFZpZXc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd2F0Y2g6IHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJlZnM6IGZ1bmN0aW9uIChuZXdQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbWVkaWFBcHBsaWNhdGlvblByZWZzJywgSlNPTi5zdHJpbmdpZnkobmV3UHJlZnMpKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9sZGVyOiBmdW5jdGlvbiAobmV3Rm9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWFGaWx0ZXIgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlciA9IG5ld0ZvbGRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRm9sZGVyKG5ld0ZvbGRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBtb3VudGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5yb290Rm9sZGVyLnRvZ2dsZSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcclxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRVcmw6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxWYWx1ZSA9ICQoJyN1cGxvYWRGaWxlcycpLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybFZhbHVlICsgKHVybFZhbHVlLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJykgKyBcInBhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5zZWxlY3RlZEZvbGRlci5wYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvb3Q6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlciA9IHRoaXMucm9vdDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRGb2xkZXI6IGZ1bmN0aW9uIChmb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZWRpYVVybCA9ICQoJyNnZXRNZWRpYUl0ZW1zVXJsJykudmFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZvbGRlci5wYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbWVkaWFVcmwgKyAobWVkaWFVcmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArIFwicGF0aD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChmb2xkZXIucGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5vcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZWRpYUl0ZW1zID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkTWVkaWFzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvcnRBc2MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgbG9hZGluZyBmb2xkZXI6JyArIGZvbGRlci5wYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdFJvb3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZWRNZWRpYUl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWFzLnB1c2godGhpcy5maWx0ZXJlZE1lZGlhSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB1blNlbGVjdEFsbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWFzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBpbnZlcnRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZpbHRlcmVkTWVkaWFJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNZWRpYVNlbGVjdGVkKHRoaXMuZmlsdGVyZWRNZWRpYUl0ZW1zW2ldKSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCh0aGlzLmZpbHRlcmVkTWVkaWFJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcyA9IHRlbXA7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVTZWxlY3Rpb25PZk1lZGlhOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNZWRpYVNlbGVjdGVkKG1lZGlhKSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWFzLnNwbGljZSh0aGlzLnNlbGVjdGVkTWVkaWFzLmluZGV4T2YobWVkaWEpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYXMucHVzaChtZWRpYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTWVkaWFTZWxlY3RlZDogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnNlbGVjdGVkTWVkaWFzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4LCBhcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudXJsLnRvTG93ZXJDYXNlKCkgPT09IG1lZGlhLnVybC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9sZGVyID0gdGhpcy5zZWxlY3RlZEZvbGRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcm9vdCBmb2xkZXIgY2FuJ3QgYmUgZGVsZXRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVyID09IHRoaXMucm9vdC5tb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtRGlhbG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiQoXCIjZGVsZXRlRm9sZGVyXCIpLmRhdGEoKSwgY2FsbGJhY2s6IGZ1bmN0aW9uIChyZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCgnI2RlbGV0ZUZvbGRlclVybCcpLnZhbCgpICsgXCI/cGF0aD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChmb2xkZXIucGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbjogJChcImlucHV0W25hbWU9J19fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuJ11cIikudmFsKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cy4kZW1pdCgnZGVsZXRlRm9sZGVyJywgZm9sZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGVGb2xkZXJNb2RhbC1lcnJvcnMnKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBib290c3RyYXAuTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSgkKCcjY3JlYXRlRm9sZGVyTW9kYWwnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2NyZWF0ZUZvbGRlck1vZGFsIC5tb2RhbC1ib2R5IGlucHV0JykudmFsKCcnKS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVuYW1lTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjcmVuYW1lTWVkaWFNb2RhbC1lcnJvcnMnKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBib290c3RyYXAuTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSgkKCcjcmVuYW1lTWVkaWFNb2RhbCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWwuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjb2xkLWl0ZW0tbmFtZScpLnZhbChtZWRpYS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlbmFtZU1lZGlhTW9kYWwgLm1vZGFsLWJvZHkgaW5wdXQnKS52YWwobWVkaWEubmFtZSkuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFuZERlbGV0ZU1lZGlhOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVNZWRpYSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlTWVkaWFMaXN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZWRpYUxpc3QgPSB0aGlzLnNlbGVjdGVkTWVkaWFzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFMaXN0Lmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybURpYWxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4kKFwiI2RlbGV0ZU1lZGlhXCIpLmRhdGEoKSwgY2FsbGJhY2s6IGZ1bmN0aW9uIChyZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGhzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKG1lZGlhTGlzdFtpXS5tZWRpYVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjZGVsZXRlTWVkaWFMaXN0VXJsJykudmFsKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbjogJChcImlucHV0W25hbWU9J19fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuJ11cIikudmFsKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHM6IHBhdGhzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VsZWN0ZWRNZWRpYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc2VsZi5tZWRpYUl0ZW1zICYmIHNlbGYubWVkaWFJdGVtcy5pbmRleE9mKHNlbGYuc2VsZWN0ZWRNZWRpYXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZWRpYUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhRGVsZXRlZCcsIHNlbGYuc2VsZWN0ZWRNZWRpYXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRNZWRpYXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlTWVkaWFJdGVtOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1EaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uJChcIiNkZWxldGVNZWRpYVwiKS5kYXRhKCksIGNhbGxiYWNrOiBmdW5jdGlvbiAocmVzcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoJyNkZWxldGVNZWRpYVVybCcpLnZhbCgpICsgXCI/cGF0aD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChtZWRpYS5tZWRpYVBhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46ICQoXCJpbnB1dFtuYW1lPSdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiddXCIpLnZhbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBzZWxmLm1lZGlhSXRlbXMgJiYgc2VsZi5tZWRpYUl0ZW1zLmluZGV4T2YobWVkaWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZWRpYUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cy4kZW1pdCgnbWVkaWFEZWxldGVkJywgbWVkaWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlbGYuc2VsZWN0ZWRNZWRpYSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZURyYWdTdGFydDogZnVuY3Rpb24gKG1lZGlhLCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHBhcnQgb2YgbW92ZSBtZWRpYSB0byBmb2xkZXI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGZvbGRlciBjb21wb25lbnQgb24gZHJvcCBldmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFOYW1lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWFzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhTmFtZXMucHVzaChpdGVtLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlIHVzZXIgZHJhZ3MgYW4gdW5zZWxlY3RlZCBpdGVtLCB3ZSBzZWxlY3QgaXQgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNZWRpYVNlbGVjdGVkKG1lZGlhKSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFOYW1lcy5wdXNoKG1lZGlhLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcy5wdXNoKG1lZGlhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgnbWVkaWFOYW1lcycsIEpTT04uc3RyaW5naWZ5KG1lZGlhTmFtZXMpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgnc291cmNlRm9sZGVyJywgdGhpcy5zZWxlY3RlZEZvbGRlci5wYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKHRoaXMuZHJhZ0Ryb3BUaHVtYm5haWwsIDEwLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVTY3JvbGxXaGlsZURyYWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmNsaWVudFkgPCAxNTApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxCeSgwLCAtMTApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5jbGllbnRZID4gd2luZG93LmlubmVySGVpZ2h0IC0gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VTb3J0OiBmdW5jdGlvbiAobmV3U29ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0QnkgPT0gbmV3U29ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0QXNjID0gIXRoaXMuc29ydEFzYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydEFzYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRCeSA9IG5ld1NvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJCgnI2NyZWF0ZS1mb2xkZXItbmFtZScpLmtleXByZXNzKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gZS53aGljaDtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gMTMpIHsgIC8vIHRoZSBlbnRlciBrZXkgY29kZVxyXG4gICAgICAgICAgICAgICAgICAgICQoJyNtb2RhbEZvb3Rlck9rJykuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJCgnI21vZGFsRm9vdGVyT2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSAkKCcjY3JlYXRlLWZvbGRlci1uYW1lJykudmFsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6ICQoJyNjcmVhdGVGb2xkZXJVcmwnKS52YWwoKSArIFwiP3BhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQobWVkaWFBcHAuc2VsZWN0ZWRGb2xkZXIucGF0aCkgKyBcIiZuYW1lPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46ICQoXCJpbnB1dFtuYW1lPSdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiddXCIpLnZhbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ2FkZEZvbGRlcicsIG1lZGlhQXBwLnNlbGVjdGVkRm9sZGVyLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gYm9vdHN0cmFwLk1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoJCgnI2NyZWF0ZUZvbGRlck1vZGFsJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGVGb2xkZXJNb2RhbC1lcnJvcnMnKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZVRleHQpLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+PC9kaXY+JykudGV4dChlcnJvck1lc3NhZ2UpLmFwcGVuZFRvKCQoJyNjcmVhdGVGb2xkZXJNb2RhbC1lcnJvcnMnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJCgnI3JlbmFtZU1lZGlhTW9kYWxGb290ZXJPaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3TmFtZSA9ICQoJyNuZXctaXRlbS1uYW1lJykudmFsKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2xkTmFtZSA9ICQoJyNvbGQtaXRlbS1uYW1lJykudmFsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5ld05hbWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRGb2xkZXIgPSBtZWRpYUFwcC5zZWxlY3RlZEZvbGRlci5wYXRoICsgXCIvXCI7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZvbGRlciA9PT0gXCIvXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rm9sZGVyID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3UGF0aCA9IGN1cnJlbnRGb2xkZXIgKyBuZXdOYW1lO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9sZFBhdGggPSBjdXJyZW50Rm9sZGVyICsgb2xkTmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobmV3UGF0aC50b0xvd2VyQ2FzZSgpID09PSBvbGRQYXRoLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBib290c3RyYXAuTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSgkKCcjcmVuYW1lTWVkaWFNb2RhbCcpKTtcclxuICAgICAgICAgICAgICAgICAgICBtb2RhbC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjcmVuYW1lTWVkaWFVcmwnKS52YWwoKSArIFwiP29sZFBhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQob2xkUGF0aCkgKyBcIiZuZXdQYXRoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld1BhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46ICQoXCJpbnB1dFtuYW1lPSdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiddXCIpLnZhbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBib290c3RyYXAuTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSgkKCcjcmVuYW1lTWVkaWFNb2RhbCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWwuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhUmVuYW1lZCcsIG5ld05hbWUsIG5ld1BhdGgsIG9sZFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjcmVuYW1lTWVkaWFNb2RhbC1lcnJvcnMnKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZVRleHQpLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+PC9kaXY+JykudGV4dChlcnJvck1lc3NhZ2UpLmFwcGVuZFRvKCQoJyNyZW5hbWVNZWRpYU1vZGFsLWVycm9ycycpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGlzcGxheU1lZGlhQXBwbGljYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYUFwcCcpLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKCdtZWRpYUFwcDpyZWFkeScpO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbiIsIiQoZG9jdW1lbnQpLm9uKCdtZWRpYUFwcDpyZWFkeScsIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBjaHVua2VkRmlsZVVwbG9hZElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuXHJcbiAgICAkKCcjZmlsZXVwbG9hZCcpXHJcbiAgICAgICAgLmZpbGV1cGxvYWQoe1xyXG4gICAgICAgICAgICBkcm9wWm9uZTogJCgnI21lZGlhQXBwJyksXHJcbiAgICAgICAgICAgIGxpbWl0Q29uY3VycmVudFVwbG9hZHM6IDIwLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB1cmw6ICQoJyN1cGxvYWRGaWxlcycpLnZhbCgpLFxyXG4gICAgICAgICAgICBtYXhDaHVua1NpemU6IE51bWJlcigkKCcjbWF4VXBsb2FkQ2h1bmtTaXplJykudmFsKCkgfHwgMCksXHJcbiAgICAgICAgICAgIGZvcm1EYXRhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYW50aUZvcmdlcnlUb2tlbiA9ICQoXCJpbnB1dFtuYW1lPV9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuXVwiKS52YWwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3BhdGgnLCB2YWx1ZTogbWVkaWFBcHAuc2VsZWN0ZWRGb2xkZXIucGF0aCB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ19fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuJywgdmFsdWU6IGFudGlGb3JnZXJ5VG9rZW4gfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdfX2NodW5rZWRGaWxlVXBsb2FkSWQnLCB2YWx1ZTogY2h1bmtlZEZpbGVVcGxvYWRJZCB9LFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgJC5lYWNoKGRhdGEucmVzdWx0LmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcHAubWVkaWFJdGVtcy5wdXNoKGZpbGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5vbignZmlsZXVwbG9hZGNodW5rYmVmb3Jlc2VuZCcsIChlLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmaWxlID0gb3B0aW9ucy5maWxlc1swXTtcclxuICAgICAgICAgICAgLy8gSGVyZSB3ZSByZXBsYWNlIHRoZSBibG9iIHdpdGggYSBGaWxlIG9iamVjdCB0byBlbnN1cmUgdGhlIGZpbGUgbmFtZSBhbmQgb3RoZXJzIGFyZSBwcmVzZXJ2ZWQgZm9yIHRoZSBiYWNrZW5kLlxyXG4gICAgICAgICAgICBvcHRpb25zLmJsb2IgPSBuZXcgRmlsZShcclxuICAgICAgICAgICAgICAgIFtvcHRpb25zLmJsb2JdLFxyXG4gICAgICAgICAgICAgICAgZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbn0pO1xyXG5cclxuXHJcbiQoZG9jdW1lbnQpLmJpbmQoJ2RyYWdvdmVyJywgZnVuY3Rpb24gKGUpIHtcclxuICAgIHZhciBkdCA9IGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XHJcbiAgICBpZiAoZHQudHlwZXMgJiYgKGR0LnR5cGVzLmluZGV4T2YgPyBkdC50eXBlcy5pbmRleE9mKCdGaWxlcycpICE9IC0xIDogZHQudHlwZXMuY29udGFpbnMoJ0ZpbGVzJykpKSB7XHJcbiAgICAgICAgdmFyIGRyb3Bab25lID0gJCgnI2N1c3RvbWRyb3B6b25lJyksXHJcbiAgICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuZHJvcFpvbmVUaW1lb3V0O1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkcm9wWm9uZS5hZGRDbGFzcygnaW4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGhvdmVyZWREcm9wWm9uZSA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoZHJvcFpvbmUpO1xyXG4gICAgICAgIHdpbmRvdy5kcm9wWm9uZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgd2luZG93LmRyb3Bab25lVGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgICAgIGRyb3Bab25lLnJlbW92ZUNsYXNzKCdpbicpO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcbiAgICB9ICAgIFxyXG59KTsiLCIvLyA8Zm9sZGVyPiBjb21wb25lbnRcclxuVnVlLmNvbXBvbmVudCgnZm9sZGVyJywge1xyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8bGkgOmNsYXNzPVwie3NlbGVjdGVkOiBpc1NlbGVjdGVkfVwiIFxyXG4gICAgICAgICAgICAgICAgdi1vbjpkcmFnbGVhdmUucHJldmVudCA9IFwiaGFuZGxlRHJhZ0xlYXZlKCRldmVudCk7XCIgXHJcbiAgICAgICAgICAgICAgICB2LW9uOmRyYWdvdmVyLnByZXZlbnQuc3RvcD1cImhhbmRsZURyYWdPdmVyKCRldmVudCk7XCIgXHJcbiAgICAgICAgICAgICAgICB2LW9uOmRyb3AucHJldmVudC5zdG9wID0gXCJtb3ZlTWVkaWFUb0ZvbGRlcihtb2RlbCwgJGV2ZW50KVwiID5cclxuICAgICAgICAgICAgPGRpdiA6Y2xhc3M9XCJ7Zm9sZGVyaG92ZXJlZDogaXNIb3ZlcmVkICwgdHJlZXJvb3Q6IGxldmVsID09IDF9XCIgPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIDpzdHlsZT1cInsgcGFkZGluZyR7ZG9jdW1lbnQuZGlyID09IFwibHRyXCIgPyBcIkxlZnRcIiA6IFwiUmlnaHRcIn06cGFkZGluZyArICdweCcgfVwiIHYtb246Y2xpY2s9XCJzZWxlY3RcIiAgZHJhZ2dhYmxlPVwiZmFsc2VcIiBjbGFzcz1cImZvbGRlci1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gdi1vbjpjbGljay5zdG9wPVwidG9nZ2xlXCIgY2xhc3M9XCJleHBhbmRcIiA6Y2xhc3M9XCJ7b3BlbmVkOiBvcGVuLCBjbG9zZWQ6ICFvcGVuLCBlbXB0eTogZW1wdHl9XCI+PGkgdi1pZj1cIm9wZW5cIiBjbGFzcz1cImZhLXNvbGlkIGZhLWNoZXZyb24tJHtkb2N1bWVudC5kaXIgPT0gXCJsdHJcIiA/IFwicmlnaHRcIiA6IFwibGVmdFwifVwiPjwvaT48L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9sZGVyLW5hbWUgbXMtMlwiPnt7bW9kZWwubmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBmb2xkZXItYWN0aW9uc1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHYtY2xvYWsgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHYtb246Y2xpY2s9XCJjcmVhdGVGb2xkZXJcIiB2LWlmPVwiaXNTZWxlY3RlZCB8fCBpc1Jvb3RcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdi1jbG9hayBocmVmPVwiamF2YXNjcmlwdDo7XCIgY2xhc3M9XCJidG4gYnRuLXNtXCIgdi1vbjpjbGljaz1cImRlbGV0ZUZvbGRlclwiIHYtaWY9XCJpc1NlbGVjdGVkICYmICFpc1Jvb3RcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxvbCB2LXNob3c9XCJvcGVuXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9sZGVyIHYtZm9yPVwiZm9sZGVyIGluIGNoaWxkcmVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgOmtleT1cImZvbGRlci5wYXRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsPVwiZm9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgOnNlbGVjdGVkLWluLW1lZGlhLWFwcD1cInNlbGVjdGVkSW5NZWRpYUFwcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDpsZXZlbD1cImxldmVsICsgMVwiPlxyXG4gICAgICAgICAgICAgICAgPC9mb2xkZXI+XHJcbiAgICAgICAgICAgIDwvb2w+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgICBgLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBtb2RlbDogT2JqZWN0LFxyXG4gICAgICAgIHNlbGVjdGVkSW5NZWRpYUFwcDogT2JqZWN0LFxyXG4gICAgICAgIGxldmVsOiBOdW1iZXJcclxuICAgIH0sXHJcbiAgICBkYXRhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBudWxsLCAvLyBub3QgaW5pdGlhbGl6ZWQgc3RhdGUgKGZvciBsYXp5LWxvYWRpbmcpXHJcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcclxuICAgICAgICAgICAgaXNIb3ZlcmVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcGFkZGluZzogMFxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBjb21wdXRlZDoge1xyXG4gICAgICAgIGVtcHR5OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5jaGlsZHJlbiB8fCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaXNTZWxlY3RlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRJbk1lZGlhQXBwLm5hbWUgPT0gdGhpcy5tb2RlbC5uYW1lKSAmJiAodGhpcy5zZWxlY3RlZEluTWVkaWFBcHAucGF0aCA9PSB0aGlzLm1vZGVsLnBhdGgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaXNSb290OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnBhdGggPT09ICcnO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBtb3VudGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCh0aGlzLmlzUm9vdCA9PSBmYWxzZSkgJiYgKHRoaXMuaXNBbmNlc3Rvck9mU2VsZWN0ZWRGb2xkZXIoKSkpe1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gdGhpcy5sZXZlbCA8IDMgPyAgMTYgOiAxNiArICh0aGlzLmxldmVsICogOCk7XHJcbiAgICB9LFxyXG4gICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBidXMuJG9uKCdkZWxldGVGb2xkZXInLCBmdW5jdGlvbiAoZm9sZGVyKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBzZWxmLmNoaWxkcmVuICYmIHNlbGYuY2hpbGRyZW4uaW5kZXhPZihmb2xkZXIpXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kZW1pdCgnZm9sZGVyRGVsZXRlZCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGJ1cy4kb24oJ2FkZEZvbGRlcicsIGZ1bmN0aW9uICh0YXJnZXQsIGZvbGRlcikge1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5tb2RlbCA9PSB0YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmNoaWxkcmVuICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5wdXNoKGZvbGRlcik7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgZm9sZGVyLnBhcmVudCA9IHNlbGYubW9kZWw7XHJcbiAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ2ZvbGRlckFkZGVkJywgZm9sZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIG1ldGhvZHM6IHtcclxuICAgICAgICBpc0FuY2VzdG9yT2ZTZWxlY3RlZEZvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBwYXJlbnRGb2xkZXIgPSBtZWRpYUFwcC5zZWxlY3RlZEZvbGRlcjtcclxuICAgICAgICAgICAgd2hpbGUgKHBhcmVudEZvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEZvbGRlci5wYXRoID09IHRoaXMubW9kZWwucGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnRGb2xkZXIgPSBwYXJlbnRGb2xkZXIucGFyZW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0b2dnbGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlbiAmJiAhdGhpcy5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkQ2hpbGRyZW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnZm9sZGVyU2VsZWN0ZWQnLCB0aGlzLm1vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkQ2hpbGRyZW4oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNyZWF0ZUZvbGRlcjogZnVuY3Rpb24gKCkgeyAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnY3JlYXRlRm9sZGVyUmVxdWVzdGVkJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZWxldGVGb2xkZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgYnVzLiRlbWl0KCdkZWxldGVGb2xkZXJSZXF1ZXN0ZWQnKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRDaGlsZHJlbjogZnVuY3Rpb24gKCkgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW4gPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogJCgnI2dldEZvbGRlcnNVcmwnKS52YWwoKSArIFwiP3BhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoc2VsZi5tb2RlbC5wYXRoKSxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLnBhcmVudCA9IHNlbGYubW9kZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVtdHB5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGhhbmRsZURyYWdPdmVyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzSG92ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBoYW5kbGVEcmFnTGVhdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIb3ZlcmVkID0gZmFsc2U7ICAgICAgICAgICAgXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtb3ZlTWVkaWFUb0ZvbGRlcjogZnVuY3Rpb24gKGZvbGRlciwgZSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICBzZWxmLmlzSG92ZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdmFyIG1lZGlhTmFtZXMgPSBKU09OLnBhcnNlKGUuZGF0YVRyYW5zZmVyLmdldERhdGEoJ21lZGlhTmFtZXMnKSk7IFxyXG5cclxuICAgICAgICAgICAgaWYgKG1lZGlhTmFtZXMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc291cmNlRm9sZGVyID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnc291cmNlRm9sZGVyJyk7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRGb2xkZXIgPSBmb2xkZXIucGF0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzb3VyY2VGb2xkZXIgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VGb2xkZXIgPSAncm9vdCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXRGb2xkZXIgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRGb2xkZXIgPSAncm9vdCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzb3VyY2VGb2xkZXIgPT09IHRhcmdldEZvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgYWxlcnQoJCgnI3NhbWVGb2xkZXJNZXNzYWdlJykudmFsKCkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25maXJtRGlhbG9nKHsuLi4kKFwiI21vdmVNZWRpYVwiKS5kYXRhKCksIGNhbGxiYWNrOiBmdW5jdGlvbiAocmVzcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoJyNtb3ZlTWVkaWFMaXN0VXJsJykudmFsKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbjogJChcImlucHV0W25hbWU9J19fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuJ11cIikudmFsKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYU5hbWVzOiBtZWRpYU5hbWVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRm9sZGVyOiBzb3VyY2VGb2xkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRGb2xkZXI6IHRhcmdldEZvbGRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhTGlzdE1vdmVkJyk7IC8vIE1lZGlhQXBwIHdpbGwgbGlzdGVuIHRvIHRoaXMsIGFuZCB0aGVuIGl0IHdpbGwgcmVsb2FkIHBhZ2Ugc28gdGhlIG1vdmVkIG1lZGlhcyB3b24ndCBiZSB0aGVyZSBhbnltb3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cy4kZW1pdCgnbWVkaWFMaXN0TW92ZWQnLCBlcnJvci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59KTtcclxuIiwiLy8gPG1lZGlhLWl0ZW1zLWdyaWQ+IGNvbXBvbmVudFxyXG5WdWUuY29tcG9uZW50KCdtZWRpYS1pdGVtcy1ncmlkJywge1xyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8b2wgY2xhc3M9XCJyb3cgbWVkaWEtaXRlbXMtZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIHYtZm9yPVwibWVkaWEgaW4gZmlsdGVyZWRNZWRpYUl0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICA6a2V5PVwibWVkaWEubmFtZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWVkaWEtaXRlbSBtZWRpYS1jb250YWluZXItbWFpbi1saXN0LWl0ZW0gY2FyZCBwLTBcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpzdHlsZT1cInt3aWR0aDogdGh1bWJTaXplICsgMiArICdweCd9XCJcclxuICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7c2VsZWN0ZWQ6IGlzTWVkaWFTZWxlY3RlZChtZWRpYSl9XCJcclxuICAgICAgICAgICAgICAgICAgICB2LW9uOmNsaWNrLnN0b3A9XCJ0b2dnbGVTZWxlY3Rpb25PZk1lZGlhKG1lZGlhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZVwiIHYtb246ZHJhZ3N0YXJ0PVwiZHJhZ1N0YXJ0KG1lZGlhLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRodW1iLWNvbnRhaW5lclwiIDpzdHlsZT1cIntoZWlnaHQ6IHRodW1iU2l6ZSArJ3B4J31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyB2LWlmPVwibWVkaWEubWltZS5zdGFydHNXaXRoKCdpbWFnZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3JjPVwiYnVpbGRNZWRpYVVybChtZWRpYS51cmwsIHRodW1iU2l6ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkYXRhLW1pbWU9XCJtZWRpYS5taW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3R5bGU9XCJ7bWF4SGVpZ2h0OiB0aHVtYlNpemUgKydweCcsIG1heFdpZHRoOiB0aHVtYlNpemUgKydweCd9XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgdi1lbHNlIGNsYXNzPVwiZmEtcmVndWxhciBmYS1maWxlIGRpc3BsYXktMVwiIDpkYXRhLW1pbWU9XCJtZWRpYS5taW1lXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWNvbnRhaW5lci1tYWluLWl0ZW0tdGl0bGUgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsb2F0LWVuZCBpbmxpbmUtbWVkaWEtYnV0dG9uIGVkaXQtYnV0dG9uXCIgdi1vbjpjbGljay5zdG9wPVwicmVuYW1lTWVkaWEobWVkaWEpXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1lZGl0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxvYXQtZW5kIGlubGluZS1tZWRpYS1idXR0b24gZGVsZXRlLWJ1dHRvblwiIHYtb246Y2xpY2suc3RvcD1cImRlbGV0ZU1lZGlhKG1lZGlhKVwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtdHJhc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cIm1lZGlhLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxvYXQtZW5kIGlubGluZS1tZWRpYS1idXR0b24gdmlldy1idXR0b25cIlwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtZG93bmxvYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lZGlhLWZpbGVuYW1lIGNhcmQtdGV4dCBzbWFsbFwiIDp0aXRsZT1cIm1lZGlhLm5hbWVcIj57eyBtZWRpYS5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC9vbD5cclxuICAgICAgICBgLFxyXG4gICAgZGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIFQ6IHt9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgZmlsdGVyZWRNZWRpYUl0ZW1zOiBBcnJheSxcclxuICAgICAgICBzZWxlY3RlZE1lZGlhczogQXJyYXksXHJcbiAgICAgICAgdGh1bWJTaXplOiBOdW1iZXJcclxuICAgIH0sXHJcbiAgICBjcmVhdGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vIHJldHJpZXZpbmcgbG9jYWxpemVkIHN0cmluZ3MgZnJvbSB2aWV3XHJcbiAgICAgICAgc2VsZi5ULmVkaXRCdXR0b24gPSAkKCcjdC1lZGl0LWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5kZWxldGVCdXR0b24gPSAkKCcjdC1kZWxldGUtYnV0dG9uJykudmFsKCk7XHJcbiAgICB9LFxyXG4gICAgbWV0aG9kczoge1xyXG4gICAgICAgIGlzTWVkaWFTZWxlY3RlZDogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnNlbGVjdGVkTWVkaWFzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4LCBhcnJheSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudXJsLnRvTG93ZXJDYXNlKCkgPT09IG1lZGlhLnVybC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGJ1aWxkTWVkaWFVcmw6IGZ1bmN0aW9uICh1cmwsIHRodW1iU2l6ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdXJsICsgKHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicpICsgJ3dpZHRoPScgKyB0aHVtYlNpemUgKyAnJmhlaWdodD0nICsgdGh1bWJTaXplO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnbWVkaWFUb2dnbGVSZXF1ZXN0ZWQnLCBtZWRpYSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICByZW5hbWVNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgncmVuYW1lTWVkaWFSZXF1ZXN0ZWQnLCBtZWRpYSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZWxldGVNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnZGVsZXRlTWVkaWFSZXF1ZXN0ZWQnLCBtZWRpYSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIChtZWRpYSwgZSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhRHJhZ1N0YXJ0UmVxdWVzdGVkJywgbWVkaWEsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7XHJcbiIsIi8vIDxtZWRpYS1pdGVtcy10YWJsZT4gY29tcG9uZW50XHJcblZ1ZS5jb21wb25lbnQoJ21lZGlhLWl0ZW1zLXRhYmxlJywge1xyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBtZWRpYS1pdGVtcy10YWJsZSBtLTBcIj5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaGVhZGVyLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIGNsYXNzPVwidGh1bWJuYWlsLWNvbHVtblwiPnt7IFQuaW1hZ2VIZWFkZXIgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIHYtb246Y2xpY2s9XCJjaGFuZ2VTb3J0KCduYW1lJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICB7eyBULm5hbWVIZWFkZXIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3J0LWluZGljYXRvciBjb2xuYW1lPVwibmFtZVwiIDpzZWxlY3RlZGNvbG5hbWU9XCJzb3J0QnlcIiA6YXNjPVwic29ydEFzY1wiPjwvc29ydC1pbmRpY2F0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiB2LW9uOmNsaWNrPVwiY2hhbmdlU29ydCgnbGFzdE1vZGlmeScpXCI+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgIHt7IFQubGFzdE1vZGlmeUhlYWRlciB9fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3J0LWluZGljYXRvciBjb2xuYW1lPVwibGFzdE1vZGlmeVwiIDpzZWxlY3RlZGNvbG5hbWU9XCJzb3J0QnlcIiA6YXNjPVwic29ydEFzY1wiPjwvc29ydC1pbmRpY2F0b3I+IFxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+IFxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIHYtb246Y2xpY2s9XCJjaGFuZ2VTb3J0KCdzaXplJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25hbC1jb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFQuc2l6ZUhlYWRlciB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPHNvcnQtaW5kaWNhdG9yIGNvbG5hbWU9XCJzaXplXCIgOnNlbGVjdGVkY29sbmFtZT1cInNvcnRCeVwiIDphc2M9XCJzb3J0QXNjXCI+PC9zb3J0LWluZGljYXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgdi1vbjpjbGljaz1cImNoYW5nZVNvcnQoJ21pbWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbmFsLWNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBULnR5cGVIZWFkZXIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3J0LWluZGljYXRvciBjb2xuYW1lPVwibWltZVwiIDpzZWxlY3RlZGNvbG5hbWU9XCJzb3J0QnlcIiA6YXNjPVwic29ydEFzY1wiPjwvc29ydC1pbmRpY2F0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cIm1lZGlhIGluIGZpbHRlcmVkTWVkaWFJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZWRpYS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7c2VsZWN0ZWQ6IGlzTWVkaWFTZWxlY3RlZChtZWRpYSl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2LW9uOmNsaWNrLnN0b3A9XCJ0b2dnbGVTZWxlY3Rpb25PZk1lZGlhKG1lZGlhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZVwiIHYtb246ZHJhZ3N0YXJ0PVwiZHJhZ1N0YXJ0KG1lZGlhLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6a2V5PVwibWVkaWEubmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRodW1ibmFpbC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyB2LWlmPVwibWVkaWEubWltZS5zdGFydHNXaXRoKCdpbWFnZScpXCIgZHJhZ2dhYmxlPVwiZmFsc2VcIiA6c3JjPVwiYnVpbGRNZWRpYVVybChtZWRpYS51cmwsIHRodW1iU2l6ZSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSB2LWVsc2UgY2xhc3M9XCJmYS1zb2xpZCBmYS1maWxlIGZhLWxnXCIgOmRhdGEtbWltZT1cIm1lZGlhLm1pbWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1uYW1lLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyZWFrLXdvcmRcIj4ge3sgbWVkaWEubmFtZSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBtZS0xIGVkaXQtYnV0dG9uXCIgdi1vbjpjbGljay5zdG9wPVwicmVuYW1lTWVkaWEobWVkaWEpXCI+IHt7IFQuZWRpdEJ1dHRvbiB9fSA8L2EgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBkZWxldGUtYnV0dG9uXCIgdi1vbjpjbGljay5zdG9wPVwiZGVsZXRlTWVkaWEobWVkaWEpXCI+IHt7IFQuZGVsZXRlQnV0dG9uIH19IDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwibWVkaWEudXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtIHZpZXctYnV0dG9uXCI+IHt7IFQudmlld0J1dHRvbiB9fSA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb2xcIj4ge3sgcHJpbnREYXRlVGltZShtZWRpYS5sYXN0TW9kaWZ5KSB9fSA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY29sIG9wdGlvbmFsLWNvbFwiPiB7eyBpc05hTihtZWRpYS5zaXplKT8gMCA6IE1hdGgucm91bmQobWVkaWEuc2l6ZSAvIDEwMjQpIH19IEtCPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNvbCBvcHRpb25hbC1jb2xcIj57eyBtZWRpYS5taW1lIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIGAsXHJcbiAgICBkYXRhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgVDoge31cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBzb3J0Qnk6IFN0cmluZyxcclxuICAgICAgICBzb3J0QXNjOiBCb29sZWFuLFxyXG4gICAgICAgIGZpbHRlcmVkTWVkaWFJdGVtczogQXJyYXksXHJcbiAgICAgICAgc2VsZWN0ZWRNZWRpYXM6IEFycmF5LFxyXG4gICAgICAgIHRodW1iU2l6ZTogTnVtYmVyXHJcbiAgICB9LFxyXG4gICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLlQuaW1hZ2VIZWFkZXIgPSAkKCcjdC1pbWFnZS1oZWFkZXInKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQubmFtZUhlYWRlciA9ICQoJyN0LW5hbWUtaGVhZGVyJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULmxhc3RNb2RpZnlIZWFkZXIgPSAkKCcjdC1sYXN0TW9kaWZ5LWhlYWRlcicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5zaXplSGVhZGVyID0gJCgnI3Qtc2l6ZS1oZWFkZXInKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQudHlwZUhlYWRlciA9ICQoJyN0LXR5cGUtaGVhZGVyJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULmVkaXRCdXR0b24gPSAkKCcjdC1lZGl0LWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5kZWxldGVCdXR0b24gPSAkKCcjdC1kZWxldGUtYnV0dG9uJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULnZpZXdCdXR0b24gPSAkKCcjdC12aWV3LWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgfSxcclxuICAgIG1ldGhvZHM6IHtcclxuICAgICAgICBpc01lZGlhU2VsZWN0ZWQ6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5zZWxlY3RlZE1lZGlhcy5zb21lKGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCwgYXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnVybC50b0xvd2VyQ2FzZSgpID09PSBtZWRpYS51cmwudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBidWlsZE1lZGlhVXJsOiBmdW5jdGlvbiAodXJsLCB0aHVtYlNpemUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVybCArICh1cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICd3aWR0aD0nICsgdGh1bWJTaXplICsgJyZoZWlnaHQ9JyArIHRodW1iU2l6ZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNoYW5nZVNvcnQ6IGZ1bmN0aW9uIChuZXdTb3J0KSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnc29ydENoYW5nZVJlcXVlc3RlZCcsIG5ld1NvcnQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnbWVkaWFUb2dnbGVSZXF1ZXN0ZWQnLCBtZWRpYSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICByZW5hbWVNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgncmVuYW1lTWVkaWFSZXF1ZXN0ZWQnLCBtZWRpYSk7ICAgICAgICAgICAgXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZWxldGVNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnZGVsZXRlTWVkaWFSZXF1ZXN0ZWQnLCBtZWRpYSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIChtZWRpYSwgZSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhRHJhZ1N0YXJ0UmVxdWVzdGVkJywgbWVkaWEsIGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcHJpbnREYXRlVGltZTogZnVuY3Rpb24gKGRhdGVtaWxsaXMpe1xyXG4gICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKGRhdGVtaWxsaXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7XHJcbiIsIi8vIFRoaXMgY29tcG9uZW50IHJlY2VpdmVzIGEgbGlzdCBvZiBhbGwgdGhlIGl0ZW1zLCB1bnBhZ2VkLlxyXG4vLyBBcyB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgcGFnZXIsIGl0IHJhaXNlcyBldmVudHMgd2l0aCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgcGFnZS5cclxuLy8gSXQncyB0aGUgcGFyZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gbGlzdGVuIGZvciB0aGVzZSBldmVudHMgYW5kIGRpc3BsYXkgdGhlIHJlY2VpdmVkIGl0ZW1zXHJcbi8vIDxwYWdlcj4gY29tcG9uZW50XHJcblZ1ZS5jb21wb25lbnQoJ3BhZ2VyJywge1xyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXY+XHJcbiAgICAgICAgPG5hdiBpZD1cIm1lZGlhLXBhZ2VyXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiIGFyaWEtbGFiZWw9XCJQYWdpbmF0aW9uIE5hdmlnYXRpb25cIiByb2xlPVwibmF2aWdhdGlvblwiIDpkYXRhLWNvbXB1dGVkLXRyaWdnZXI9XCJpdGVtc0luQ3VycmVudFBhZ2UubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInBhZ2luYXRpb24gcGFnaW5hdGlvbi1zbSBtLTBcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbSBtZWRpYS1maXJzdC1idXR0b25cIiA6Y2xhc3M9XCJ7ZGlzYWJsZWQgOiAhY2FuRG9GaXJzdH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIGhyZWY9XCIjXCIgOnRhYmluZGV4PVwiY2FuRG9GaXJzdCA/IDAgOiAtMVwiIHYtb246Y2xpY2s9XCJnb0ZpcnN0XCI+e3sgVC5wYWdlckZpcnN0QnV0dG9uIH19PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiIDpjbGFzcz1cIntkaXNhYmxlZCA6ICFjYW5Eb1ByZXZ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiIDp0YWJpbmRleD1cImNhbkRvUHJldiA/IDAgOiAtMVwiIHYtb246Y2xpY2s9XCJwcmV2aW91c1wiPnt7IFQucGFnZXJQcmV2aW91c0J1dHRvbiB9fTwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgdi1pZj1cImxpbmsgIT09IC0xXCIgY2xhc3M9XCJwYWdlLWl0ZW0gcGFnZS1udW1iZXJcIiAgOmNsYXNzPVwie2FjdGl2ZSA6IGN1cnJlbnQgPT0gbGluayAtIDF9XCIgdi1mb3I9XCJsaW5rIGluIHBhZ2VMaW5rc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cIiNcIiB2LW9uOmNsaWNrPVwiZ29UbyhsaW5rIC0gMSlcIiA6YXJpYS1sYWJlbD1cIidHb3RvIFBhZ2UnICsgbGlua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xpbmt9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiY3VycmVudCA9PSBsaW5rIC0xXCIgY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj4oY3VycmVudCk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiIDpjbGFzcz1cIntkaXNhYmxlZCA6ICFjYW5Eb05leHR9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiIDp0YWJpbmRleD1cImNhbkRvTmV4dCA/IDAgOiAtMVwiIHYtb246Y2xpY2s9XCJuZXh0XCI+e3sgVC5wYWdlck5leHRCdXR0b24gfX08L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtIG1lZGlhLWxhc3QtYnV0dG9uXCIgOmNsYXNzPVwie2Rpc2FibGVkIDogIWNhbkRvTGFzdH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIGhyZWY9XCIjXCIgOnRhYmluZGV4PVwiY2FuRG9MYXN0ID8gMCA6IC0xXCIgdi1vbjpjbGljaz1cImdvTGFzdFwiPnt7IFQucGFnZXJMYXN0QnV0dG9uIH19PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbSBtcy00IHBhZ2Utc2l6ZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZS1saW5rIGRpc2FibGVkIHRleHQtbXV0ZWQgcGFnZS1zaXplLWxhYmVsXCI+e3sgVC5wYWdlclBhZ2VTaXplTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiIGNsYXNzPVwicGFnZS1saW5rXCIgdi1tb2RlbD1cInBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwib3B0aW9uIGluIHBhZ2VTaXplT3B0aW9uc1wiIHYtYmluZDp2YWx1ZT1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgPC9uYXY+XHJcbiAgICAgICAgPG5hdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInBhZ2luYXRpb24gcGFnaW5hdGlvbi1zbSBtLTAgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtIG1zLTQgcGFnZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlLWxpbmsgZGlzYWJsZWQgdGV4dC1tdXRlZCBcIj57eyBULnBhZ2VyUGFnZUxhYmVsIH19IHt7Y3VycmVudCArIDF9fS97e3RvdGFsUGFnZXN9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gbXMtNCB0b3RhbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlLWxpbmsgZGlzYWJsZWQgdGV4dC1tdXRlZCBcIj4ge3sgVC5wYWdlclRvdGFsTGFiZWwgfX0ge3t0b3RhbH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICA8L25hdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBzb3VyY2VJdGVtczogQXJyYXlcclxuICAgIH0sXHJcbiAgICBkYXRhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcGFnZVNpemU6IDEwLFxyXG4gICAgICAgICAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMzAsIDUwLCAxMDBdLFxyXG4gICAgICAgICAgICBjdXJyZW50OiAwLFxyXG4gICAgICAgICAgICBUOiB7fVxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG4gICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gcmV0cmlldmluZyBsb2NhbGl6ZWQgc3RyaW5ncyBmcm9tIHZpZXdcclxuICAgICAgICBzZWxmLlQucGFnZXJGaXJzdEJ1dHRvbiA9ICQoJyN0LXBhZ2VyLWZpcnN0LWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5wYWdlclByZXZpb3VzQnV0dG9uID0gJCgnI3QtcGFnZXItcHJldmlvdXMtYnV0dG9uJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULnBhZ2VyTmV4dEJ1dHRvbiA9ICQoJyN0LXBhZ2VyLW5leHQtYnV0dG9uJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULnBhZ2VyTGFzdEJ1dHRvbiA9ICQoJyN0LXBhZ2VyLWxhc3QtYnV0dG9uJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULnBhZ2VyUGFnZVNpemVMYWJlbCA9ICQoJyN0LXBhZ2VyLXBhZ2Utc2l6ZS1sYWJlbCcpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5wYWdlclBhZ2VMYWJlbCA9ICQoJyN0LXBhZ2VyLXBhZ2UtbGFiZWwnKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQucGFnZXJUb3RhbExhYmVsID0gJCgnI3QtcGFnZXItdG90YWwtbGFiZWwnKS52YWwoKTsgICAgICAgIFxyXG4gICAgfSxcclxuICAgIG1ldGhvZHM6IHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuY3VycmVudCArIDE7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBwcmV2aW91czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmN1cnJlbnQgLSAxO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ29GaXJzdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ29MYXN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMudG90YWxQYWdlcyAtIDE7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnb1RvOiBmdW5jdGlvbiAodGFyZ2V0UGFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0YXJnZXRQYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBjb21wdXRlZDoge1xyXG4gICAgICAgIHRvdGFsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUl0ZW1zID8gdGhpcy5zb3VyY2VJdGVtcy5sZW5ndGggOiAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdG90YWxQYWdlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbCAvIHRoaXMucGFnZVNpemUpO1xyXG4gICAgICAgICAgICByZXR1cm4gcGFnZXMgPiAwID8gcGFnZXMgOiAxO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaXNMYXN0UGFnZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50ICsgMSA+PSB0aGlzLnRvdGFsUGFnZXM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpc0ZpcnN0UGFnZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50ID09PSAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2FuRG9OZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0xhc3RQYWdlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2FuRG9QcmV2OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0ZpcnN0UGFnZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNhbkRvRmlyc3Q6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRmlyc3RQYWdlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2FuRG9MYXN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0xhc3RQYWdlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gdGhpcyBjb21wdXRlZCBpcyBvbmx5IHRvIGhhdmUgYSBjZW50cmFsIHBsYWNlIHdoZXJlIHdlIGRldGVjdCBjaGFuZ2VzIGFuZCBsZXZlcmFnZSBWdWUgSlMgcmVhY3Rpdml0eSB0byByYWlzZSBvdXIgZXZlbnQuXHJcbiAgICAgICAgLy8gVGhhdCBldmVudCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIHBhcmVudCBtZWRpYSBhcHAgdG8gZGlzcGxheSB0aGUgaXRlbXMgaW4gdGhlIHBhZ2UuXHJcbiAgICAgICAgLy8gdGhpcyBsb2dpYyB3aWxsIG5vdCBydW4gaWYgdGhlIGNvbXB1dGVkIHByb3BlcnR5IGlzIG5vdCB1c2VkIGluIHRoZSB0ZW1wbGF0ZS4gV2UgdXNlIGEgZHVtbXkgXCJkYXRhLWNvbXB1dGVkLXRyaWdnZXJcIiBhdHRyaWJ1dGUgZm9yIHRoYXQuXHJcbiAgICAgICAgaXRlbXNJbkN1cnJlbnRQYWdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMucGFnZVNpemUgKiB0aGlzLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgIHZhciBlbmQgPSBzdGFydCArIHRoaXMucGFnZVNpemU7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnNvdXJjZUl0ZW1zLnNsaWNlKHN0YXJ0LCBlbmQpO1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ3BhZ2VyRXZlbnQnLCByZXN1bHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcGFnZUxpbmtzOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgbGlua3MgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGxpbmtzLnB1c2godGhpcy5jdXJyZW50ICsgMSk7XHJcblxyXG4gICAgICAgICAgICAvLyBBZGQgMiBpdGVtcyBiZWZvcmUgY3VycmVudFxyXG4gICAgICAgICAgICB2YXIgYmVmb3JlQ3VycmVudCA9IHRoaXMuY3VycmVudCA+IDAgPyB0aGlzLmN1cnJlbnQgOiAtMTtcclxuICAgICAgICAgICAgbGlua3MudW5zaGlmdChiZWZvcmVDdXJyZW50KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBiZWZvcmVCZWZvcmVDdXJyZW50ID0gdGhpcy5jdXJyZW50ID4gMSA/IHRoaXMuY3VycmVudCAtIDEgOiAtMTtcclxuICAgICAgICAgICAgbGlua3MudW5zaGlmdChiZWZvcmVCZWZvcmVDdXJyZW50KTtcclxuXHJcblxyXG4gICAgICAgICAgICAvLyBBZGQgMiBpdGVtcyBhZnRlciBjdXJyZW50XHJcbiAgICAgICAgICAgIHZhciBhZnRlckN1cnJlbnQgPSB0aGlzLnRvdGFsUGFnZXMgLSB0aGlzLmN1cnJlbnQgPiAxID8gdGhpcy5jdXJyZW50ICsgMiA6IC0xO1xyXG4gICAgICAgICAgICBsaW5rcy5wdXNoKGFmdGVyQ3VycmVudCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgYWZ0ZXJBZnRlckN1cnJlbnQgPSB0aGlzLnRvdGFsUGFnZXMgLSB0aGlzLmN1cnJlbnQgPiAyID8gdGhpcy5jdXJyZW50ICsgMyA6IC0xO1xyXG4gICAgICAgICAgICBsaW5rcy5wdXNoKGFmdGVyQWZ0ZXJDdXJyZW50KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBsaW5rcztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgd2F0Y2g6IHtcclxuICAgICAgICBzb3VyY2VJdGVtczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSAwOyAvLyByZXNldHRpbmcgY3VycmVudCBwYWdlIGFmdGVyIHJlY2VpdmluZyBhIG5ldyBsaXN0IG9mIHVucGFnZWQgaXRlbXNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhZ2VTaXplOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuIiwiLy8gPHNvcnQtaW5kaWNhdG9yPiBjb21wb25lbnRcclxuVnVlLmNvbXBvbmVudCgnc29ydEluZGljYXRvcicsIHtcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPGRpdiB2LXNob3c9XCJpc0FjdGl2ZVwiIGNsYXNzPVwic29ydC1pbmRpY2F0b3JcIj5cclxuICAgICAgICAgICAgPHNwYW4gdi1zaG93PVwiYXNjXCI+PGkgY2xhc3M9XCJzbWFsbCBmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gdi1zaG93PVwiIWFzY1wiPjxpIGNsYXNzPVwic21hbGwgZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBjb2xuYW1lOiBTdHJpbmcsXHJcbiAgICAgICAgc2VsZWN0ZWRjb2xuYW1lOiBTdHJpbmcsXHJcbiAgICAgICAgYXNjOiBCb29sZWFuXHJcbiAgICB9LFxyXG4gICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICBpc0FjdGl2ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xuYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5zZWxlY3RlZGNvbG5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pO1xyXG4iLCJmdW5jdGlvbiBpbml0aWFsaXplQXR0YWNoZWRNZWRpYUZpZWxkKGVsLCBpZE9mVXBsb2FkQnV0dG9uLCB1cGxvYWRBY3Rpb24sIG1lZGlhSXRlbVVybCwgYWxsb3dNdWx0aXBsZSwgYWxsb3dNZWRpYVRleHQsIGFsbG93QW5jaG9ycywgdGVtcFVwbG9hZEZvbGRlciwgbWF4VXBsb2FkQ2h1bmtTaXplKSB7XHJcblxyXG4gICAgdmFyIHRhcmdldCA9ICQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJChlbCkuZGF0YSgnZm9yJykpKTtcclxuICAgIHZhciBpbml0aWFsUGF0aHMgPSB0YXJnZXQuZGF0YShcImluaXRcIik7XHJcblxyXG4gICAgdmFyIG1lZGlhRmllbGRFZGl0b3IgPSAkKGVsKTtcclxuICAgIHZhciBpZHByZWZpeCA9IG1lZGlhRmllbGRFZGl0b3IuYXR0cihcImlkXCIpO1xyXG4gICAgdmFyIG1lZGlhRmllbGRBcHA7XHJcblxyXG4gICAgbWVkaWFGaWVsZEFwcHMucHVzaChtZWRpYUZpZWxkQXBwID0gbmV3IFZ1ZSh7XHJcbiAgICAgICAgZWw6IG1lZGlhRmllbGRFZGl0b3IuZ2V0KDApLFxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgbWVkaWFJdGVtczogW10sXHJcbiAgICAgICAgICAgIHNlbGVjdGVkTWVkaWE6IG51bGwsXHJcbiAgICAgICAgICAgIHNtYWxsVGh1bWJzOiBmYWxzZSxcclxuICAgICAgICAgICAgaWRQcmVmaXg6IGlkcHJlZml4LFxyXG4gICAgICAgICAgICBpbml0aWFsaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93TWVkaWFUZXh0OiBhbGxvd01lZGlhVGV4dCxcclxuICAgICAgICAgICAgYmFja3VwTWVkaWFUZXh0OiAnJyxcclxuICAgICAgICAgICAgYWxsb3dBbmNob3JzOiBhbGxvd0FuY2hvcnMsXHJcbiAgICAgICAgICAgIGJhY2t1cEFuY2hvcjogbnVsbCxcclxuICAgICAgICAgICAgbWVkaWFUZXh0bW9kYWw6IG51bGwsXHJcbiAgICAgICAgICAgIGFuY2hvcmluZ01vZGFsOiBudWxsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIHNlbGYuY3VycmVudFByZWZzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVkaWFGaWVsZFByZWZzJykpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICAgICAgcGF0aHM6IHtcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtZWRpYVBhdGhzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbml0aWFsUGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5tZWRpYVBhdGggPT09ICdub3QtZm91bmQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFQYXRocy5wdXNoKHsgcGF0aDogeC5tZWRpYVBhdGgsIGlzUmVtb3ZlZDogeC5pc1JlbW92ZWQsIGlzTmV3OiB4LmlzTmV3LCBtZWRpYVRleHQ6IHgubWVkaWFUZXh0LCBhbmNob3I6IHguYW5jaG9yLCBhdHRhY2hlZEZpbGVOYW1lOiB4LmF0dGFjaGVkRmlsZU5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG1lZGlhUGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFQYXRocyA9IHZhbHVlcyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2lnbmFsID0gJC5EZWZlcnJlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhUGF0aHMuZm9yRWFjaChmdW5jdGlvbiAoeCwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgbmFtZTogJyAnICsgeC5wYXRoLCBtaW1lOiAnJywgbWVkaWFQYXRoOiAnJywgYW5jaG9yOiB4LmFuY2hvciwgYXR0YWNoZWRGaWxlTmFtZTogeC5hdHRhY2hlZEZpbGVOYW1lIH0pOyAvLyBkb24ndCByZW1vdmUgdGhlIHNwYWNlLiBTb21ldGhpbmcgZGlmZmVyZW50IGlzIG5lZWRlZCBvciBpdCB3b250IHJlYWN0IHdoZW4gdGhlIHJlYWwgbmFtZSBhcnJpdmVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gJC53aGVuKHNpZ25hbCkuZG9uZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbWVkaWFJdGVtVXJsICsgXCI/cGF0aD1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh4LnBhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS52dWVrZXkgPSBkYXRhLm5hbWUgKyBpLnRvU3RyaW5nKCk7IC8vIEJlY2F1c2UgYSB1bmlxdWUga2V5IGlzIHJlcXVpcmVkIGJ5IFZ1ZSBvbiB2LWZvciBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tZWRpYVRleHQgPSB4Lm1lZGlhVGV4dDsgLy8gVGhpcyB2YWx1ZSBpcyBub3QgcmV0dXJuZWQgZnJvbSB0aGUgYWpheCBjYWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmFuY2hvciA9IHguYW5jaG9yOyAvLyBUaGlzIHZhbHVlIGlzIG5vdCByZXR1cm5lZCBmcm9tIHRoZSBhamF4IGNhbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuYXR0YWNoZWRGaWxlTmFtZSA9IHguYXR0YWNoZWRGaWxlTmFtZTsvLyBUaGlzIHZhbHVlIGlzIG5vdCByZXR1cm5lZCBmcm9tIHRoZSBhamF4IGNhbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpLCAxLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gKytsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lZGlhSXRlbXMucHVzaCh4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuc3BsaWNlKGksIDEsIHsgbmFtZTogeC5wYXRoLCBtaW1lOiAnJywgbWVkaWFQYXRoOiAnbm90LWZvdW5kJywgbWVkaWFUZXh0OiAnJywgYW5jaG9yOiB7IHg6IDAuNSwgeTogMC41IH0sIGF0dGFjaGVkRmlsZU5hbWU6IHguYXR0YWNoZWRGaWxlTmFtZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gKytsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lZGlhSXRlbXMucHVzaCh4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZpbGVTaXplOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLnNlbGVjdGVkTWVkaWEuc2l6ZSAvIDEwMjQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjYW5BZGRNZWRpYTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vblJlbW92ZWRNZWRpYUl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWVkaWFJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tZWRpYUl0ZW1zW2ldLmlzUmVtb3ZlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub25SZW1vdmVkTWVkaWFJdGVtcy5wdXNoKHRoaXMubWVkaWFJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBub25SZW1vdmVkTWVkaWFJdGVtcy5sZW5ndGggPT09IDAgfHwgbm9uUmVtb3ZlZE1lZGlhSXRlbXMubGVuZ3RoID4gMCAmJiBhbGxvd011bHRpcGxlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0aHVtYlNpemU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNtYWxsVGh1bWJzID8gMTIwIDogMjQwO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjdXJyZW50UHJlZnM6IHtcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsVGh1bWJzOiB0aGlzLnNtYWxsVGh1bWJzXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3UHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYWxsVGh1bWJzID0gbmV3UHJlZnMuc21hbGxUaHVtYnM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgc2VsZi5wYXRocyA9IGluaXRpYWxQYXRocztcclxuXHJcbiAgICAgICAgICAgIHNlbGYuJG9uKCdzZWxlY3RBbmREZWxldGVNZWRpYVJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RBbmREZWxldGVNZWRpYShtZWRpYSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgc2VsZi4kb24oJ3NlbGVjdE1lZGlhUmVxdWVzdGVkJywgZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE1lZGlhKG1lZGlhKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAnIycgKyBpZE9mVXBsb2FkQnV0dG9uO1xyXG4gICAgICAgICAgICB2YXIgZWRpdG9ySWQgPSBtZWRpYUZpZWxkRWRpdG9yLmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgICAgIHZhciBjaHVua2VkRmlsZVVwbG9hZElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuXHJcbiAgICAgICAgICAgICQoc2VsZWN0b3IpXHJcbiAgICAgICAgICAgICAgICAuZmlsZXVwbG9hZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogMjAsXHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcFpvbmU6ICQoJyMnICsgZWRpdG9ySWQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cGxvYWRBY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiBtYXhVcGxvYWRDaHVua1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBkYXRhLmZpbGVzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzW2ldLnVwbG9hZE5hbWUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0VW5pcXVlSWQoKSArIGRhdGEuZmlsZXNbaV0ubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXNbaV0uYXR0YWNoZWRGaWxlTmFtZSA9IGRhdGEuZmlsZXNbaV0ubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFudGlGb3JnZXJ5VG9rZW4gPSAkKFwiaW5wdXRbbmFtZT1fX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbl1cIikudmFsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAncGF0aCcsIHZhbHVlOiB0ZW1wVXBsb2FkRm9sZGVyIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbicsIHZhbHVlOiBhbnRpRm9yZ2VyeVRva2VuIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdfX2NodW5rZWRGaWxlVXBsb2FkSWQnLCB2YWx1ZTogY2h1bmtlZEZpbGVVcGxvYWRJZCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01lZGlhSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9ybXNnID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0LmZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5yZXN1bHQuZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3VsdC5maWxlc1tpXS5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBlcnJvciBpcyBkZWZpbmVkIHByb2JhYmx5IHRoZSBmaWxlIHR5cGUgaXMgbm90IGFsbG93ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQuZmlsZXNbaV0uZXJyb3IgPT09IHVuZGVmaW5lZCB8fCBkYXRhLnJlc3VsdC5maWxlc1tpXS5lcnJvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3VsdC5maWxlc1tpXS5hdHRhY2hlZEZpbGVOYW1lID0gZGF0YS5maWxlc1tpXS5hdHRhY2hlZEZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNZWRpYUl0ZW1zLnB1c2goZGF0YS5yZXN1bHQuZmlsZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ybXNnICs9IGRhdGEucmVzdWx0LmZpbGVzW2ldLmVycm9yICsgXCJcXG5cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3Jtc2cgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGVycm9ybXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuZXdNZWRpYUl0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01lZGlhSXRlbXMubGVuZ3RoID4gMSAmJiBhbGxvd011bHRpcGxlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJCgnI29ubHlPbmVJdGVtTWVzc2FnZScpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAubWVkaWFJdGVtcy5wdXNoKG5ld01lZGlhSXRlbXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUZpZWxkQXBwLm1lZGlhSXRlbXMgPSBtZWRpYUZpZWxkQXBwLm1lZGlhSXRlbXMuY29uY2F0KG5ld01lZGlhSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBvbiB1cGxvYWQuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGpxWEhSKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGV4dFN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yVGhyb3duKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9uKCdmaWxldXBsb2FkY2h1bmtiZWZvcmVzZW5kJywgKGUsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSByZXBsYWNlIHRoZSBibG9iIHdpdGggYSBGaWxlIG9iamVjdCB0byBlbnN1cmUgdGhlIGZpbGUgbmFtZSBhbmQgb3RoZXJzIGFyZSBwcmVzZXJ2ZWQgZm9yIHRoZSBiYWNrZW5kLlxyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYmxvYiA9IG5ldyBGaWxlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9ucy5ibG9iXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWV0aG9kczoge1xyXG4gICAgICAgICAgICBzZWxlY3RNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEgPSBtZWRpYTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0VW5pcXVlSWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVtb3ZlU2VsZWN0ZWQ6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlbW92ZWQgPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLm1lZGlhSXRlbXMgJiYgdGhpcy5tZWRpYUl0ZW1zLmluZGV4T2YodGhpcy5zZWxlY3RlZE1lZGlhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkID0gdGhpcy5tZWRpYUl0ZW1zW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC5pc1JlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMubWVkaWFJdGVtcy5zcGxpY2UoW2luZGV4XSwgMSwgcmVtb3ZlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWFJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW1vdmUgYnV0dG9uIGNhbiBhbHNvIHJlbW92ZSBhIHVuaXF1ZSBtZWRpYSBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVkaWFJdGVtcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRoaXMubWVkaWFJdGVtc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQuaXNSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLm1lZGlhSXRlbXMuc3BsaWNlKDAsIDEsIHJlbW92ZWQpOyAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbXMuc3BsaWNlKDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYSA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNob3dNZWRpYVRleHRNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lZGlhVGV4dE1vZGFsID0gbmV3IGJvb3RzdHJhcC5Nb2RhbCh0aGlzLiRyZWZzLm1lZGlhVGV4dE1vZGFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVkaWFUZXh0TW9kYWwuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrdXBNZWRpYVRleHQgPSB0aGlzLnNlbGVjdGVkTWVkaWEubWVkaWFUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjYW5jZWxNZWRpYVRleHRNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lZGlhVGV4dE1vZGFsLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5tZWRpYVRleHQgPSB0aGlzLmJhY2t1cE1lZGlhVGV4dDtcclxuICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgIHNob3dBbmNob3JNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuY2hvcmluZ01vZGFsID0gbmV3IGJvb3RzdHJhcC5Nb2RhbCh0aGlzLiRyZWZzLmFuY2hvcmluZ01vZGFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yaW5nTW9kYWwuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgLy8gQ2F1c2UgYSByZWZyZXNoIHRvIHJlY2FsYyBoZWlnaHRzLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvciA9IHtcclxuICAgICAgICAgICAgICAgICAgeDogdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvci54LFxyXG4gICAgICAgICAgICAgICAgICB5OiB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yLnlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja3VwQW5jaG9yID0gdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvcjtcclxuICAgICAgICAgICAgfSwgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjYW5jZWxBbmNob3JpbmdNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuY2hvcmluZ01vZGFsLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IgPSB0aGlzLmJhY2t1cEFuY2hvcjtcclxuICAgICAgICAgICAgfSwgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzZXRBbmNob3I6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvciA9IHsgeDogMC41LCB5OiAwLjUgfTtcclxuICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgIG9uQW5jaG9yRHJvcDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgeDogZXZlbnQub2Zmc2V0WCAvIGltYWdlLmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgeTogZXZlbnQub2Zmc2V0WSAvIGltYWdlLmNsaWVudEhlaWdodFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhbmNob3JMZWZ0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5hbmNob3JJbWFnZSAmJiB0aGlzLiRyZWZzLm1vZGFsQm9keSAmJiB0aGlzLnNlbGVjdGVkTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGltYWdlIGlzIHNocnVuayBjb21wYXJlIGFnYWluc3QgdGhlIG1vZGFsIGJvZHkuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9ICh0aGlzLiRyZWZzLm1vZGFsQm9keS5jbGllbnRXaWR0aCAtIHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UuY2xpZW50V2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSAodGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvci54ICogdGhpcy4kcmVmcy5hbmNob3JJbWFnZS5jbGllbnRXaWR0aCkgKyBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMTcpIHsgLy8gQWRqdXN0IHNvIHRoZSB0YXJnZXQgZG9lc24ndCBzaG93IG91dHNpZGUgaW1hZ2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gMTc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAtIDg7IC8vIEFkanVzdCB0byBoaXQgdGhlIG1vdXNlIHBvaW50ZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnMCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgICBcclxuICAgICAgICAgICAgYW5jaG9yVG9wOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5hbmNob3JJbWFnZSAmJiB0aGlzLnNlbGVjdGVkTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yLnkgKiB0aGlzLiRyZWZzLmFuY2hvckltYWdlLmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCAxNSkgeyAvLyBBZGp1c3RtZW50IHNvIHRoZSB0YXJnZXQgZG9lc24ndCBzaG93IG91dHNpZGUgaW1hZ2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gMTU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIDU7IC8vIEFkanVzdCB0byBoaXQgdGhlIG1vdXNlIHBvaW50ZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnMCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldEFuY2hvcjogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLiRyZWZzLmFuY2hvckltYWdlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBldmVudC5vZmZzZXRYIC8gaW1hZ2UuY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogZXZlbnQub2Zmc2V0WSAvIGltYWdlLmNsaWVudEhlaWdodFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAgICAgICAgIFxyXG4gICAgICAgICAgICBhZGRNZWRpYUZpbGVzOiBmdW5jdGlvbiAoZmlsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoZmlsZXMubGVuZ3RoID4gMSkgJiYgKGFsbG93TXVsdGlwbGUgPT09IGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KCQoJyNvbmx5T25lSXRlbU1lc3NhZ2UnKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5tZWRpYUl0ZW1zLnB1c2goZmlsZXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYUZpZWxkQXBwLm1lZGlhSXRlbXMgPSBtZWRpYUZpZWxkQXBwLm1lZGlhSXRlbXMuY29uY2F0KGZpbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYUZpZWxkQXBwLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2VsZWN0QW5kRGVsZXRlTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE1lZGlhID0gbWVkaWE7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0IGJlY2F1c2Ugc29tZXRpbWVzIFxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlU2VsZWN0ZWQgd2FzIGNhbGxlZCBldmVuIGJlZm9yZSB0aGUgbWVkaWEgd2FzIHNldC5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlU2VsZWN0ZWQoKTtcclxuICAgICAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdhdGNoOiB7XHJcbiAgICAgICAgICAgIG1lZGlhSXRlbXM6IHtcclxuICAgICAgICAgICAgICAgIGRlZXA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHByZXZpZXcgcmVuZGVyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7ICQoZG9jdW1lbnQpLnRyaWdnZXIoJ2NvbnRlbnRwcmV2aWV3OnJlbmRlcicpOyB9LCAxMDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgY3VycmVudFByZWZzOiBmdW5jdGlvbiAobmV3UHJlZnMpIHtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtZWRpYUZpZWxkUHJlZnMnLCBKU09OLnN0cmluZ2lmeShuZXdQcmVmcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSkpO1xyXG59XHJcbiIsImZ1bmN0aW9uIGluaXRpYWxpemVNZWRpYUZpZWxkKGVsLCBtb2RhbEJvZHlFbGVtZW50LCBtZWRpYUl0ZW1VcmwsIGFsbG93TXVsdGlwbGUsIGFsbG93TWVkaWFUZXh0LCBhbGxvd0FuY2hvcnMpIHtcclxuICAgIC8vQmFnUGFydCBjcmVhdGUgYSBzY3JpcHQgc2VjdGlvbiB3aXRob3V0IG90aGVyIERPTSBlbGVtZW50c1xyXG4gICAgaWYoZWwgPT09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgXHJcbiAgICB2YXIgdGFyZ2V0ID0gJChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgkKGVsKS5kYXRhKCdmb3InKSkpO1xyXG4gICAgdmFyIGluaXRpYWxQYXRocyA9IHRhcmdldC5kYXRhKFwiaW5pdFwiKTtcclxuXHJcbiAgICB2YXIgbWVkaWFGaWVsZEVkaXRvciA9ICQoZWwpO1xyXG4gICAgdmFyIGlkcHJlZml4ID0gbWVkaWFGaWVsZEVkaXRvci5hdHRyKFwiaWRcIik7XHJcbiAgICB2YXIgbWVkaWFGaWVsZEFwcDtcclxuXHJcbiAgICAvL3doZW4gaGlkZSBtb2RhbCBkZXRhY2ggbWVkaWEgYXBwIHRvIGF2b2lkIGlzc3VlIG9uIEJhZ1BhcnRcclxuICAgIG1vZGFsQm9keUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgJChcIiNtZWRpYUFwcFwiKS5hcHBlbmRUbygnYm9keScpO1xyXG4gICAgICAgICQoXCIjbWVkaWFBcHBcIikuaGlkZSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbWVkaWFGaWVsZEFwcHMucHVzaChtZWRpYUZpZWxkQXBwID0gbmV3IFZ1ZSh7XHJcbiAgICAgICAgZWw6IG1lZGlhRmllbGRFZGl0b3IuZ2V0KDApLFxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgbWVkaWFJdGVtczogW10sXHJcbiAgICAgICAgICAgIHNlbGVjdGVkTWVkaWE6IG51bGwsXHJcbiAgICAgICAgICAgIHNtYWxsVGh1bWJzOiBmYWxzZSxcclxuICAgICAgICAgICAgaWRQcmVmaXg6IGlkcHJlZml4LFxyXG4gICAgICAgICAgICBpbml0aWFsaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93TWVkaWFUZXh0OiBhbGxvd01lZGlhVGV4dCxcclxuICAgICAgICAgICAgYmFja3VwTWVkaWFUZXh0OiAnJyxcclxuICAgICAgICAgICAgYWxsb3dBbmNob3JzOiBhbGxvd0FuY2hvcnMsXHJcbiAgICAgICAgICAgIGJhY2t1cEFuY2hvcjogbnVsbCxcclxuICAgICAgICAgICAgbWVkaWFUZXh0TW9kYWw6IG51bGwsXHJcbiAgICAgICAgICAgIGFuY2hvcmluZ01vZGFsOiBudWxsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIHNlbGYuY3VycmVudFByZWZzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVkaWFGaWVsZFByZWZzJykpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICAgICAgcGF0aHM6IHtcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtZWRpYVBhdGhzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbml0aWFsUGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5tZWRpYVBhdGggPT09ICdub3QtZm91bmQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFQYXRocy5wdXNoKHsgcGF0aDogeC5tZWRpYVBhdGgsIG1lZGlhVGV4dDogeC5tZWRpYVRleHQsIGFuY2hvcjogeC5hbmNob3IgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG1lZGlhUGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFQYXRocyA9IHZhbHVlcyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2lnbmFsID0gJC5EZWZlcnJlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhUGF0aHMuZm9yRWFjaChmdW5jdGlvbiAoeCwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgbmFtZTogJyAnICsgeC5wYXRoLCBtaW1lOiAnJywgbWVkaWFQYXRoOiAnJyB9KTsgLy8gZG9uJ3QgcmVtb3ZlIHRoZSBzcGFjZS4gU29tZXRoaW5nIGRpZmZlcmVudCBpcyBuZWVkZWQgb3IgaXQgd29udCByZWFjdCB3aGVuIHRoZSByZWFsIG5hbWUgYXJyaXZlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9ICQud2hlbihzaWduYWwpLmRvbmUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG1lZGlhSXRlbVVybCArIFwiP3BhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoeC5wYXRoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudnVla2V5ID0gZGF0YS5uYW1lICsgaS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1lZGlhVGV4dCA9IHgubWVkaWFUZXh0OyAvLyBUaGlzIHZhbHVlIGlzIG5vdCByZXR1cm5lZCBmcm9tIHRoZSBhamF4IGNhbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuYW5jaG9yID0geC5hbmNob3I7IC8vIFRoaXMgdmFsdWUgaXMgbm90IHJldHVybmVkIGZyb20gdGhlIGFqYXggY2FsbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuc3BsaWNlKGksIDEsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSArK2xlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVkaWFJdGVtcy5wdXNoKHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpLCAxLCB7IG5hbWU6IHgucGF0aCwgbWltZTogJycsIG1lZGlhUGF0aDogJ25vdC1mb3VuZCcsIG1lZGlhVGV4dDogJycsIGFuY2hvcjogeyB4OiAwLCB5OiAwIH0gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09ICsrbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZWRpYUl0ZW1zLnB1c2goeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBzaWduYWwucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmaWxlU2l6ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5zZWxlY3RlZE1lZGlhLnNpemUgLyAxMDI0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY2FuQWRkTWVkaWE6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1lZGlhSXRlbXMubGVuZ3RoID09PSAwIHx8IHRoaXMubWVkaWFJdGVtcy5sZW5ndGggPiAwICYmIGFsbG93TXVsdGlwbGU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRodW1iU2l6ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc21hbGxUaHVtYnMgPyAxMjAgOiAyNDA7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGN1cnJlbnRQcmVmczoge1xyXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxUaHVtYnM6IHRoaXMuc21hbGxUaHVtYnNcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1ByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hbGxUaHVtYnMgPSBuZXdQcmVmcy5zbWFsbFRodW1icztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBzZWxmLnBhdGhzID0gaW5pdGlhbFBhdGhzO1xyXG5cclxuICAgICAgICAgICAgc2VsZi4kb24oJ3NlbGVjdEFuZERlbGV0ZU1lZGlhUmVxdWVzdGVkJywgZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdEFuZERlbGV0ZU1lZGlhKG1lZGlhKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBzZWxmLiRvbignc2VsZWN0TWVkaWFSZXF1ZXN0ZWQnLCBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0TWVkaWEobWVkaWEpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuJG9uKCdmaWxlc1VwbG9hZGVkJywgZnVuY3Rpb24gKGZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmFkZE1lZGlhRmlsZXMoZmlsZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1ldGhvZHM6IHtcclxuICAgICAgICAgICAgc2VsZWN0TWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhID0gbWVkaWE7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNob3dNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jYW5BZGRNZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoXCIjbWVkaWFBcHBcIikuYXBwZW5kVG8oJChtb2RhbEJvZHlFbGVtZW50KS5maW5kKCcubW9kYWwtYm9keScpKTtcclxuICAgICAgICAgICAgICAgICAgICAkKFwiI21lZGlhQXBwXCIpLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IGJvb3RzdHJhcC5Nb2RhbChtb2RhbEJvZHlFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBtb2RhbC5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQobW9kYWxCb2R5RWxlbWVudCkuZmluZCgnLm1lZGlhRmllbGRTZWxlY3RCdXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRNZWRpYUZpbGVzKG1lZGlhQXBwLnNlbGVjdGVkTWVkaWFzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdGhlIGluY2x1ZGVkIG1lZGlhcyB0byBiZSBzdGlsbCBzZWxlY3RlZCB0aGUgbmV4dCB0aW1lIHdlIG9wZW4gdGhlIG1vZGFsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUFwcC5zZWxlY3RlZE1lZGlhcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWwuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2hvd01lZGlhVGV4dE1vZGFsOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVkaWFUZXh0TW9kYWwgPSBuZXcgYm9vdHN0cmFwLk1vZGFsKHRoaXMuJHJlZnMubWVkaWFUZXh0TW9kYWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZWRpYVRleHRNb2RhbC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2t1cE1lZGlhVGV4dCA9IHRoaXMuc2VsZWN0ZWRNZWRpYS5tZWRpYVRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhbmNlbE1lZGlhVGV4dE1vZGFsOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVkaWFUZXh0TW9kYWwuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLm1lZGlhVGV4dCA9IHRoaXMuYmFja3VwTWVkaWFUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaG93QW5jaG9yTW9kYWw6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JpbmdNb2RhbCA9IG5ldyBib290c3RyYXAuTW9kYWwodGhpcy4kcmVmcy5hbmNob3JpbmdNb2RhbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuY2hvcmluZ01vZGFsLnNob3coKTtcclxuICAgICAgICAgICAgICAgIC8vIENhdXNlIGEgcmVmcmVzaCB0byByZWNhbGMgaGVpZ2h0cy5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgIHg6IHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IueCxcclxuICAgICAgICAgICAgICAgICAgeTogdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvci55XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2t1cEFuY2hvciA9IHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3I7XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNhbmNlbEFuY2hvcmluZ01vZGFsOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yaW5nTW9kYWwuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvciA9IHRoaXMuYmFja3VwQW5jaG9yO1xyXG4gICAgICAgICAgICB9LCAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXNldEFuY2hvcjogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yID0geyB4OiAwLjUsIHk6IDAuNSB9O1xyXG4gICAgICAgICAgICB9LCAgXHJcbiAgICAgICAgICAgIG9uQW5jaG9yRHJvcDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgeDogZXZlbnQub2Zmc2V0WCAvIGltYWdlLmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgeTogZXZlbnQub2Zmc2V0WSAvIGltYWdlLmNsaWVudEhlaWdodFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhbmNob3JMZWZ0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5hbmNob3JJbWFnZSAmJiB0aGlzLiRyZWZzLm1vZGFsQm9keSAmJiB0aGlzLnNlbGVjdGVkTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGltYWdlIGlzIHNocnVuayBjb21wYXJlIGFnYWluc3QgdGhlIG1vZGFsIGJvZHkuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9ICh0aGlzLiRyZWZzLm1vZGFsQm9keS5jbGllbnRXaWR0aCAtIHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UuY2xpZW50V2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSAodGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvci54ICogdGhpcy4kcmVmcy5hbmNob3JJbWFnZS5jbGllbnRXaWR0aCkgKyBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFuY2hvckljb24gPSBNYXRoLnJvdW5kKHRoaXMuJHJlZnMubW9kYWxCb2R5LnF1ZXJ5U2VsZWN0b3IoJy5pY29uLW1lZGlhLWFuY2hvcicpLmNsaWVudFdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihOdW1iZXIuaXNJbnRlZ2VyKGFuY2hvckljb24pKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAtIGFuY2hvckljb24vMjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcwJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgICAgICAgICAgICBcclxuICAgICAgICAgICAgYW5jaG9yVG9wOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5hbmNob3JJbWFnZSAmJiB0aGlzLnNlbGVjdGVkTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yLnkgKiB0aGlzLiRyZWZzLmFuY2hvckltYWdlLmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRBbmNob3I6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGltYWdlID0gdGhpcy4kcmVmcy5hbmNob3JJbWFnZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogZXZlbnQub2Zmc2V0WCAvIGltYWdlLmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGV2ZW50Lm9mZnNldFkgLyBpbWFnZS5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgICAgICAgICBcclxuICAgICAgICAgICAgYWRkTWVkaWFGaWxlczogZnVuY3Rpb24gKGZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKGZpbGVzLmxlbmd0aCA+IDEpICYmIChhbGxvd011bHRpcGxlID09PSBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGVydCgkKCcjb25seU9uZUl0ZW1NZXNzYWdlJykudmFsKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAubWVkaWFJdGVtcy5wdXNoKGZpbGVzWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYUZpZWxkQXBwLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5tZWRpYUl0ZW1zID0gbWVkaWFGaWVsZEFwcC5tZWRpYUl0ZW1zLmNvbmNhdChmaWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHJlbW92ZVNlbGVjdGVkOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLm1lZGlhSXRlbXMgJiYgdGhpcy5tZWRpYUl0ZW1zLmluZGV4T2YodGhpcy5zZWxlY3RlZE1lZGlhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtb3ZlIGJ1dHRvbiBjYW4gYWxzbyByZW1vdmUgYSB1bmlxdWUgbWVkaWEgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lZGlhSXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWFJdGVtcy5zcGxpY2UoMCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhID0gbnVsbDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2VsZWN0QW5kRGVsZXRlTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE1lZGlhID0gbWVkaWE7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0IGJlY2F1c2Ugc29tZXRpbWVzIHJlbW92ZVNlbGVjdGVkIHdhcyBjYWxsZWQgZXZlbiBiZWZvcmUgdGhlIG1lZGlhIHdhcyBzZXQuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZVNlbGVjdGVkKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3YXRjaDoge1xyXG4gICAgICAgICAgICBtZWRpYUl0ZW1zOiB7XHJcbiAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgaGFuZGxlciAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBwcmV2aWV3IHJlbmRlcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyAkKGRvY3VtZW50KS50cmlnZ2VyKCdjb250ZW50cHJldmlldzpyZW5kZXInKTsgfSwgMTAwKTsgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGN1cnJlbnRQcmVmczogZnVuY3Rpb24gKG5ld1ByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbWVkaWFGaWVsZFByZWZzJywgSlNPTi5zdHJpbmdpZnkobmV3UHJlZnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pKTtcclxufVxyXG4iLCIvLyBkaWZmZXJlbnQgbWVkaWEgZmllbGQgZWRpdG9ycyB3aWxsIGFkZCB0aGVtc2VsdmVzIHRvIHRoaXMgYXJyYXlcclxudmFyIG1lZGlhRmllbGRBcHBzID0gW107XHJcbiIsIi8vIDxtZWRpYS1maWVsZC10aHVtYnMtY29udGFpbmVyPiBjb21wb25lbnQgXHJcbi8vIGRpZmZlcmVudCBtZWRpYSBmaWVsZCBlZGl0b3JzIHNoYXJlIHRoaXMgY29tcG9uZW50IHRvIHByZXNlbnQgdGhlIHRodW1icy5cclxuVnVlLmNvbXBvbmVudCgnbWVkaWFGaWVsZFRodW1ic0NvbnRhaW5lcicsIHtcclxuICAgIHRlbXBsYXRlOiAnXFxcclxuICAgICAgIDxkaXYgOmlkPVwiaWRQcmVmaXggKyBcXCdfbWVkaWFDb250YWluZXJNYWluXFwnXCIgdi1jbG9haz5cXFxyXG4gICAgICAgICA8ZGl2IHYtaWY9XCJtZWRpYUl0ZW1zLmxlbmd0aCA8IDFcIiBjbGFzcz1cImNhcmQgdGV4dC1jZW50ZXJcIj5cXFxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz0gXCJjYXJkLWJvZHlcIiA+XFxcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGludFwiPnt7VC5ub0ltYWdlc319PC9zcGFuPlxcXHJcbiAgICAgICAgICAgICA8L2Rpdj5cXFxyXG4gICAgICAgICA8L2Rpdj5cXFxyXG4gICAgICAgICA8ZHJhZ2dhYmxlIDpsaXN0PVwibWVkaWFJdGVtc1wiIHRhZz1cIm9sXCIgY2xhc3M9XCJyb3cgbWVkaWEtaXRlbXMtZ3JpZFwiID5cXFxyXG4gICAgICAgICAgICA8bGkgdi1mb3I9XCJtZWRpYSBpbiBtZWRpYUl0ZW1zXCJcXFxyXG4gICAgICAgICAgICAgICAgOmtleT1cIm1lZGlhLnZ1ZWtleVwiIFxcXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lZGlhLWNvbnRhaW5lci1tYWluLWxpc3QtaXRlbSBjYXJkIHAtMFwiXFxcclxuICAgICAgICAgICAgICAgIDpzdHlsZT1cInt3aWR0aDogdGh1bWJTaXplICsgMiArIFxcJ3B4XFwnfVwiXFxcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cIntzZWxlY3RlZDogc2VsZWN0ZWRNZWRpYSA9PSBtZWRpYX1cIlxcXHJcbiAgICAgICAgICAgICAgICB2LW9uOmNsaWNrPVwic2VsZWN0TWVkaWEobWVkaWEpXCIgdi1pZj1cIiFtZWRpYS5pc1JlbW92ZWRcIj5cXFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cIm1lZGlhLm1lZGlhUGF0aCE9PSBcXCdub3QtZm91bmRcXCdcIj5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh1bWItY29udGFpbmVyXCIgOnN0eWxlPVwie2hlaWdodDogdGh1bWJTaXplICsgXFwncHhcXCd9XCIgPlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHYtaWY9XCJtZWRpYS5taW1lLnN0YXJ0c1dpdGgoXFwnaW1hZ2VcXCcpXCIgXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzcmM9XCJidWlsZE1lZGlhVXJsKG1lZGlhLnVybCwgdGh1bWJTaXplKVwiIFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZGF0YS1taW1lPVwibWVkaWEubWltZVwiXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHlsZT1cInttYXhIZWlnaHQ6IHRodW1iU2l6ZSArIFxcJ3B4XFwnICwgbWF4V2lkdGg6IHRodW1iU2l6ZSArIFxcJ3B4XFwnfVwiLz5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgdi1lbHNlIGNsYXNzPVwiZmEtcmVndWxhciBmYS1maWxlIGRpc3BsYXktMVwiIDpkYXRhLW1pbWU9XCJtZWRpYS5taW1lXCI+PC9pPlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWNvbnRhaW5lci1tYWluLWl0ZW0tdGl0bGUgY2FyZC1ib2R5XCI+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbG9hdC1lbmQgaW5saW5lLW1lZGlhLWJ1dHRvbiBkZWxldGUtYnV0dG9uXCJcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LW9uOmNsaWNrLnN0b3A9XCJzZWxlY3RBbmREZWxldGVNZWRpYShtZWRpYSlcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwibWVkaWEudXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbG9hdC1lbmQgaW5saW5lLW1lZGlhLWJ1dHRvbiB2aWV3LWJ1dHRvblwiXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1kb3dubG9hZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2E+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZWRpYS1maWxlbmFtZSBjYXJkLXRleHQgc21hbGxcIiA6dGl0bGU9XCJtZWRpYS5tZWRpYVBhdGhcIj57eyBtZWRpYS5pc05ldyA/IG1lZGlhLm5hbWUuc3Vic3RyKDM2KSA6IG1lZGlhLm5hbWUgfX08L3NwYW4+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZT5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh1bWItY29udGFpbmVyIGZsZXgtY29sdW1uXCIgOnN0eWxlPVwie2hlaWdodDogdGh1bWJTaXplICsgXFwncHhcXCd9XCI+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtYmFuIHRleHQtZGFuZ2VyIGQtYmxvY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXIgc21hbGwgZC1ibG9ja1wiPnt7IFQubWVkaWFOb3RGb3VuZCB9fTwvc3Bhbj5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlciBzbWFsbCBkLWJsb2NrIHRleHQtY2VudGVyXCI+e3sgVC5kaXNjYXJkV2FybmluZyB9fTwvc3Bhbj5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtY29udGFpbmVyLW1haW4taXRlbS10aXRsZSBjYXJkLWJvZHlcIj5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxvYXQtZW5kIGlubGluZS1tZWRpYS1idXR0b24gZGVsZXRlLWJ1dHRvblwiXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LW9uOmNsaWNrLnN0b3A9XCJzZWxlY3RBbmREZWxldGVNZWRpYShtZWRpYSlcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZWRpYS1maWxlbmFtZSBjYXJkLXRleHQgc21hbGwgdGV4dC1kYW5nZXJcIiA6dGl0bGU9XCJtZWRpYS5uYW1lXCI+e3sgbWVkaWEubmFtZSB9fTwvc3Bhbj5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxyXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcclxuICAgICAgICAgICAgPC9saT5cXFxyXG4gICAgICAgICA8L2RyYWdnYWJsZT5cXFxyXG4gICAgICAgPC9kaXY+XFxcclxuICAgICcsXHJcbiAgICBkYXRhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgVDoge31cclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgbWVkaWFJdGVtczogQXJyYXksXHJcbiAgICAgICAgc2VsZWN0ZWRNZWRpYTogT2JqZWN0LFxyXG4gICAgICAgIHRodW1iU2l6ZTogTnVtYmVyLFxyXG4gICAgICAgIGlkUHJlZml4OiBTdHJpbmdcclxuICAgIH0sXHJcbiAgICBjcmVhdGVkOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gcmV0cmlldmluZyBsb2NhbGl6ZWQgc3RyaW5ncyBmcm9tIHZpZXdcclxuICAgICAgICBzZWxmLlQubWVkaWFOb3RGb3VuZCA9ICQoJyN0LW1lZGlhLW5vdC1mb3VuZCcpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5kaXNjYXJkV2FybmluZyA9ICQoJyN0LWRpc2NhcmQtd2FybmluZycpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5ub0ltYWdlcyA9ICQoJyN0LW5vLWltYWdlcycpLnZhbCgpO1xyXG4gICAgfSxcclxuICAgIG1ldGhvZHM6IHtcclxuICAgICAgICBzZWxlY3RBbmREZWxldGVNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuJHBhcmVudC4kZW1pdCgnc2VsZWN0QW5kRGVsZXRlTWVkaWFSZXF1ZXN0ZWQnLCBtZWRpYSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWxlY3RNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuJHBhcmVudC4kZW1pdCgnc2VsZWN0TWVkaWFSZXF1ZXN0ZWQnLCBtZWRpYSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBidWlsZE1lZGlhVXJsOiBmdW5jdGlvbiAodXJsLCB0aHVtYlNpemUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVybCArICh1cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICd3aWR0aD0nICsgdGh1bWJTaXplICsgJyZoZWlnaHQ9JyArIHRodW1iU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIvLyA8dXBsb2FkPiBjb21wb25lbnRcclxuVnVlLmNvbXBvbmVudCgndXBsb2FkJywge1xyXG4gICAgdGVtcGxhdGU6ICdcXFxyXG4gICAgICAgIDxkaXYgOmNsYXNzPVwieyBcXCd1cGxvYWQtd2FybmluZ1xcJyA6IG1vZGVsLmVycm9yTWVzc2FnZSB9XCIgY2xhc3M9XCJ1cGxvYWQgbS0yIHAtMiBwdC0wXCI+IFxcXHJcbiAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJtb2RlbC5lcnJvck1lc3NhZ2VcIiB2LW9uOmNsaWNrPVwiZGlzbWlzc1dhcm5pbmcoKVwiIGNsYXNzPVwiY2xvc2Utd2FybmluZ1wiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IDwvc3Bhbj5cXFxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZC1uYW1lXCIgOnRpdGxlPVwibW9kZWwuZXJyb3JNZXNzYWdlXCI+e3sgbW9kZWwubmFtZSB9fTwvcD4gXFxcclxuICAgICAgICAgICAgPGRpdj4gXFxcclxuICAgICAgICAgICAgICAgPHNwYW4gdi1zaG93PVwiIW1vZGVsLmVycm9yTWVzc2FnZVwiIDpzdHlsZT1cInsgd2lkdGg6IG1vZGVsLnBlcmNlbnRhZ2UgKyBcXCclXFwnfVwiIGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+IDwvc3Bhbj4gXFxcclxuICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cIm1vZGVsLmVycm9yTWVzc2FnZVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiIDp0aXRsZT1cIm1vZGVsLmVycm9yTWVzc2FnZVwiPiBFcnJvcjoge3sgbW9kZWwuZXJyb3JNZXNzYWdlIH19IDwvc3Bhbj4gXFxcclxuICAgICAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgJyxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgbW9kZWw6IE9iamVjdCxcclxuICAgICAgICB1cGxvYWRJbnB1dElkOiBTdHJpbmdcclxuICAgIH0sXHJcbiAgICBtb3VudGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHZhciB1cGxvYWRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYudXBsb2FkSW5wdXRJZCA/PyAnZmlsZXVwbG9hZCcpO1xyXG4gICAgICAgICQodXBsb2FkSW5wdXQpLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzcycsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzWzBdLm5hbWUgIT09IHNlbGYubW9kZWwubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHNlbGYubW9kZWwucGVyY2VudGFnZSA9IHBhcnNlSW50KGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHVwbG9hZElucHV0KS5iaW5kKCdmaWxldXBsb2FkZG9uZScsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzWzBdLm5hbWUgIT09IHNlbGYubW9kZWwubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnJlc3VsdC5maWxlc1swXS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVGYWlsdXJlKGRhdGEuZmlsZXNbMF0ubmFtZSwgZGF0YS5yZXN1bHQuZmlsZXNbMF0uZXJyb3IpO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAgXHJcbiAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ3JlbW92YWxSZXF1ZXN0Jywgc2VsZi5tb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh1cGxvYWRJbnB1dCkuYmluZCgnZmlsZXVwbG9hZGZhaWwnLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5maWxlc1swXS5uYW1lICE9PSBzZWxmLm1vZGVsLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZWxmLmhhbmRsZUZhaWx1cmUoZGF0YS5maWxlc1swXS5uYW1lLCAkKCcjdC1lcnJvcicpLnZhbCgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgaGFuZGxlRmFpbHVyZTogZnVuY3Rpb24gKGZpbGVOYW1lLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPT0gdGhpcy5tb2RlbC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5lcnJvck1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ0Vycm9yT25VcGxvYWQnLCB0aGlzLm1vZGVsKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRpc21pc3NXYXJuaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgncmVtb3ZhbFJlcXVlc3QnLCB0aGlzLm1vZGVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIvLyA8dXBsb2FkLWxpc3Q+IGNvbXBvbmVudFxyXG5WdWUuY29tcG9uZW50KCd1cGxvYWRMaXN0Jywge1xyXG4gICAgdGVtcGxhdGU6ICdcXFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtbGlzdFwiIHYtc2hvdz1cImZpbGVzLmxlbmd0aCA+IDBcIj4gXFxcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiIEBjbGljaz1cImV4cGFuZGVkID0gIWV4cGFuZGVkXCI+IFxcXHJcbiAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgVC51cGxvYWRzIH19IDwvc3Bhbj4gXFxcclxuICAgICAgICAgICAgICAgIDxzcGFuIHYtc2hvdz1cInBlbmRpbmdDb3VudFwiPiAoUGVuZGluZzoge3sgcGVuZGluZ0NvdW50IH19KSA8L3NwYW4+IFxcXHJcbiAgICAgICAgICAgICAgICA8c3BhbiB2LXNob3c9XCJlcnJvckNvdW50XCIgOmNsYXNzPVwieyBcXCd0ZXh0LWRhbmdlclxcJyA6IGVycm9yQ291bnQgfVwiPiAoIHt7IFQuZXJyb3JzIH19OiB7eyBlcnJvckNvdW50IH19IC8gPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIHYtb246Y2xpY2suc3RvcD1cImNsZWFyRXJyb3JzXCIgPiB7eyBULmNsZWFyRXJyb3JzIH19IDwvYT4pPC9zcGFuPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtYnV0dG9uXCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiB2LXNob3c9XCJleHBhbmRlZFwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWNoZXZyb24tZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtc2hvdz1cIiFleHBhbmRlZFwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWNoZXZyb24tdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIiB2LXNob3c9XCJleHBhbmRlZFwiPiBcXFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXBcIj4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8dXBsb2FkIDp1cGxvYWQtaW5wdXQtaWQ9XCJ1cGxvYWRJbnB1dElkXCIgdi1mb3I9XCJmIGluIGZpbGVzXCIgOmtleT1cImYubmFtZVwiICA6bW9kZWw9XCJmXCI+PC91cGxvYWQ+IFxcXHJcbiAgICAgICAgICAgICAgICA8L2RpdiA+IFxcXHJcbiAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICcsXHJcbiAgICBkYXRhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmlsZXM6IFtdLFxyXG4gICAgICAgICAgICBUOiB7fSxcclxuICAgICAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBwZW5kaW5nQ291bnQ6IDAsXHJcbiAgICAgICAgICAgIGVycm9yQ291bnQ6IDBcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICB1cGxvYWRJbnB1dElkOiBTdHJpbmdcclxuICAgIH0sXHJcbiAgICBjcmVhdGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vIHJldHJpZXZpbmcgbG9jYWxpemVkIHN0cmluZ3MgZnJvbSB2aWV3XHJcbiAgICAgICAgc2VsZi5ULnVwbG9hZHMgPSAkKCcjdC11cGxvYWRzJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULmVycm9ycyA9ICQoJyN0LWVycm9ycycpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5jbGVhckVycm9ycyA9ICQoJyN0LWNsZWFyLWVycm9ycycpLnZhbCgpO1xyXG4gICAgfSxcclxuICAgIGNvbXB1dGVkOiB7XHJcbiAgICAgICAgZmlsZUNvdW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVzLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB2YXIgdXBsb2FkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLnVwbG9hZElucHV0SWQgPz8gJ2ZpbGV1cGxvYWQnKTtcclxuICAgICAgICAkKHVwbG9hZElucHV0KS5iaW5kKCdmaWxldXBsb2FkYWRkJywgZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKCFkYXRhLmZpbGVzKSB7IFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAobmV3RmlsZSkgeyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHZhciBhbHJlYWR5SW5MaXN0ID0gc2VsZi5maWxlcy5zb21lKGZ1bmN0aW9uIChmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYubmFtZSA9PSBuZXdGaWxlLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlJbkxpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVzLnB1c2goeyBuYW1lOiBuZXdGaWxlLm5hbWUsIHBlcmNlbnRhZ2U6IDAsIGVycm9yTWVzc2FnZTogJycgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0EgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgYWxyZWFkeSBvbiB0aGUgcXVldWU6JyArIG5ld0ZpbGUubmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgXHJcbiAgICAgICAgICAgIH0pOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBidXMuJG9uKCdyZW1vdmFsUmVxdWVzdCcsIGZ1bmN0aW9uIChmaWxlVXBsb2FkKSB7XHJcbiAgICAgICAgICAgIHNlbGYuZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgsIGFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09IGZpbGVVcGxvYWQubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBidXMuJG9uKCdFcnJvck9uVXBsb2FkJywgZnVuY3Rpb24gKGZpbGVVcGxvYWQpIHtcclxuICAgICAgICAgICAgc2VsZi51cGRhdGVDb3VudCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIG1ldGhvZHM6IHtcclxuICAgICAgICB1cGRhdGVDb3VudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yQ291bnQgPSB0aGlzLmZpbGVzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZXJyb3JNZXNzYWdlICE9ICcnO1xyXG4gICAgICAgICAgICB9KS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NvdW50ID0gdGhpcy5maWxlcy5sZW5ndGggLSB0aGlzLmVycm9yQ291bnQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXJFcnJvcnM6IGZ1bmN0aW9uICgpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5maWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5lcnJvck1lc3NhZ2UgPT0gJyc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB3YXRjaDoge1xyXG4gICAgICAgIGZpbGVzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ291bnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pO1xyXG4iXX0= +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImpxdWVyeS5maWxldXBsb2FkLmpzIiwianF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanMiLCJNZWRpYUFwcC9hcHAuanMiLCJNZWRpYUFwcC9maWxldXBsb2FkLmpzIiwiTWVkaWFBcHAvZm9sZGVyQ29tcG9uZW50LmpzIiwiTWVkaWFBcHAvbWVkaWFJdGVtc0dyaWRDb21wb25lbnQuanMiLCJNZWRpYUFwcC9tZWRpYUl0ZW1zVGFibGVDb21wb25lbnQuanMiLCJNZWRpYUFwcC9wYWdlckNvbXBvbmVudC5qcyIsIk1lZGlhQXBwL3NvcnRJbmRpY2F0b3JDb21wb25lbnQuanMiLCJTaGFyZWQvdXBsb2FkQ29tcG9uZW50LmpzIiwiU2hhcmVkL3VwbG9hZExpc3RDb21wb25lbnQuanMiLCJNZWRpYUZpZWxkL2F0dGFjaGVkTWVkaWFGaWVsZC5qcyIsIk1lZGlhRmllbGQvbWVkaWFmaWVsZC5qcyIsIk1lZGlhRmllbGQvbWVkaWFmaWVsZHNBcHBzQXJyYXkuanMiLCJNZWRpYUZpZWxkL21lZGlhRmllbGRUaHVtYnNDb250YWluZXIuanMiXSwibmFtZXMiOlsiZmFjdG9yeSIsImRlZmluZSIsImFtZCIsImV4cG9ydHMiLCJfdHlwZW9mIiwicmVxdWlyZSIsIndpbmRvdyIsImpRdWVyeSIsIiQiLCJzdXBwb3J0IiwiZmlsZUlucHV0IiwiUmVnRXhwIiwidGVzdCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInByb3AiLCJ4aHJGaWxlVXBsb2FkIiwiUHJvZ3Jlc3NFdmVudCIsIkZpbGVSZWFkZXIiLCJ4aHJGb3JtRGF0YUZpbGVVcGxvYWQiLCJGb3JtRGF0YSIsImJsb2JTbGljZSIsIkJsb2IiLCJwcm90b3R5cGUiLCJzbGljZSIsIndlYmtpdFNsaWNlIiwibW96U2xpY2UiLCJnZXREcmFnSGFuZGxlciIsInR5cGUiLCJpc0RyYWdPdmVyIiwiZSIsImRhdGFUcmFuc2ZlciIsIm9yaWdpbmFsRXZlbnQiLCJpbkFycmF5IiwidHlwZXMiLCJfdHJpZ2dlciIsIkV2ZW50IiwiZGVsZWdhdGVkRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImRyb3BFZmZlY3QiLCJ3aWRnZXQiLCJvcHRpb25zIiwiZHJvcFpvbmUiLCJkb2N1bWVudCIsInBhc3RlWm9uZSIsInVuZGVmaW5lZCIsInJlcGxhY2VGaWxlSW5wdXQiLCJwYXJhbU5hbWUiLCJzaW5nbGVGaWxlVXBsb2FkcyIsImxpbWl0TXVsdGlGaWxlVXBsb2FkcyIsImxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZSIsImxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZU92ZXJoZWFkIiwic2VxdWVudGlhbFVwbG9hZHMiLCJsaW1pdENvbmN1cnJlbnRVcGxvYWRzIiwiZm9yY2VJZnJhbWVUcmFuc3BvcnQiLCJyZWRpcmVjdCIsInJlZGlyZWN0UGFyYW1OYW1lIiwicG9zdE1lc3NhZ2UiLCJtdWx0aXBhcnQiLCJtYXhDaHVua1NpemUiLCJ1cGxvYWRlZEJ5dGVzIiwicmVjYWxjdWxhdGVQcm9ncmVzcyIsInByb2dyZXNzSW50ZXJ2YWwiLCJiaXRyYXRlSW50ZXJ2YWwiLCJhdXRvVXBsb2FkIiwidW5pcXVlRmlsZW5hbWVzIiwibWVzc2FnZXMiLCJpMThuIiwibWVzc2FnZSIsImNvbnRleHQiLCJ0b1N0cmluZyIsImVhY2giLCJrZXkiLCJ2YWx1ZSIsInJlcGxhY2UiLCJmb3JtRGF0YSIsImZvcm0iLCJzZXJpYWxpemVBcnJheSIsImFkZCIsImRhdGEiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJmaWxldXBsb2FkIiwicHJvY2VzcyIsImRvbmUiLCJzdWJtaXQiLCJwcm9jZXNzRGF0YSIsImNvbnRlbnRUeXBlIiwiY2FjaGUiLCJ0aW1lb3V0IiwiX3Byb21pc2VQaXBlIiwicGFydHMiLCJmbiIsImpxdWVyeSIsInNwbGl0IiwiTnVtYmVyIiwiX3NwZWNpYWxPcHRpb25zIiwiX2Jsb2JTbGljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX0JpdHJhdGVUaW1lciIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJnZXRUaW1lIiwibG9hZGVkIiwiYml0cmF0ZSIsImdldEJpdHJhdGUiLCJpbnRlcnZhbCIsInRpbWVEaWZmIiwiX2lzWEhSVXBsb2FkIiwiX2dldEZvcm1EYXRhIiwiaXNBcnJheSIsIm5hbWUiLCJwdXNoIiwiX2dldFRvdGFsIiwiZmlsZXMiLCJ0b3RhbCIsImluZGV4IiwiZmlsZSIsInNpemUiLCJfaW5pdFByb2dyZXNzT2JqZWN0Iiwib2JqIiwicHJvZ3Jlc3MiLCJfcHJvZ3Jlc3MiLCJleHRlbmQiLCJfaW5pdFJlc3BvbnNlT2JqZWN0IiwiX3Jlc3BvbnNlIiwiT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiX29uUHJvZ3Jlc3MiLCJsZW5ndGhDb21wdXRhYmxlIiwiX3RpbWUiLCJNYXRoIiwiZmxvb3IiLCJjaHVua1NpemUiLCJfYml0cmF0ZVRpbWVyIiwiX2luaXRQcm9ncmVzc0xpc3RlbmVyIiwidGhhdCIsInhociIsImFqYXhTZXR0aW5ncyIsInVwbG9hZCIsIm9uIiwib2UiLCJfZGVpbml0UHJvZ3Jlc3NMaXN0ZW5lciIsIm9mZiIsIl9pc0luc3RhbmNlT2YiLCJfZ2V0VW5pcXVlRmlsZW5hbWUiLCJtYXAiLCJTdHJpbmciLCJfIiwicDEiLCJwMiIsImV4dCIsIl9pbml0WEhSRGF0YSIsImhlYWRlcnMiLCJjb250ZW50UmFuZ2UiLCJibG9iIiwiZW5jb2RlVVJJIiwidXBsb2FkTmFtZSIsImZpZWxkIiwiYXBwZW5kIiwiZmlsZU5hbWUiLCJfaW5pdElmcmFtZVNldHRpbmdzIiwidGFyZ2V0SG9zdCIsInVybCIsImRhdGFUeXBlIiwibG9jYXRpb24iLCJob3N0IiwiX2luaXREYXRhU2V0dGluZ3MiLCJfY2h1bmtlZFVwbG9hZCIsIl9nZXRQYXJhbU5hbWUiLCJpbnB1dCIsImkiLCJsZW5ndGgiLCJfaW5pdEZvcm1TZXR0aW5ncyIsImhyZWYiLCJ0b1VwcGVyQ2FzZSIsImZvcm1BY2NlcHRDaGFyc2V0IiwiYXR0ciIsIl9nZXRBSkFYU2V0dGluZ3MiLCJfZ2V0RGVmZXJyZWRTdGF0ZSIsImRlZmVycmVkIiwic3RhdGUiLCJpc1Jlc29sdmVkIiwiaXNSZWplY3RlZCIsIl9lbmhhbmNlUHJvbWlzZSIsInByb21pc2UiLCJzdWNjZXNzIiwiZXJyb3IiLCJmYWlsIiwiY29tcGxldGUiLCJhbHdheXMiLCJfZ2V0WEhSUHJvbWlzZSIsInJlc29sdmVPclJlamVjdCIsImFyZ3MiLCJkZmQiLCJEZWZlcnJlZCIsInJlc29sdmVXaXRoIiwicmVqZWN0V2l0aCIsImFib3J0IiwiX2FkZENvbnZlbmllbmNlTWV0aG9kcyIsImdldFByb21pc2UiLCJyZXNvbHZlRnVuYyIsInJlamVjdEZ1bmMiLCJfcHJvY2Vzc1F1ZXVlIiwiZXJyb3JUaHJvd24iLCJqcVhIUiIsIl9vblNlbmQiLCJwcm9jZXNzaW5nIiwicmVzcG9uc2UiLCJfZ2V0VXBsb2FkZWRCeXRlcyIsInJhbmdlIiwiZ2V0UmVzcG9uc2VIZWFkZXIiLCJ1cHBlckJ5dGVzUG9zIiwicGFyc2VJbnQiLCJ0ZXN0T25seSIsImZzIiwidWIiLCJtY3MiLCJvIiwiY3VycmVudExvYWRlZCIsImFqYXgiLCJyZXN1bHQiLCJ0ZXh0U3RhdHVzIiwiX2JlZm9yZVNlbmQiLCJfYWN0aXZlIiwiX29uRG9uZSIsIl9vbkZhaWwiLCJfb25BbHdheXMiLCJqcVhIUm9yUmVzdWx0IiwianFYSFJvckVycm9yIiwiYWJvcnRlZCIsInNsb3QiLCJwaXBlIiwic2VuZCIsIl9zZW5kaW5nIiwibmV4dFNsb3QiLCJfc2xvdHMiLCJzaGlmdCIsInJlc29sdmUiLCJfc2VxdWVuY2UiLCJfb25BZGQiLCJmaWxlc0xlbmd0aCIsImxpbWl0IiwibGltaXRTaXplIiwib3ZlcmhlYWQiLCJiYXRjaFNpemUiLCJwYXJhbU5hbWVTZXQiLCJwYXJhbU5hbWVTbGljZSIsImZpbGVTZXQiLCJqIiwib3JpZ2luYWxGaWxlcyIsImVsZW1lbnQiLCJuZXdEYXRhIiwiX3JlcGxhY2VGaWxlSW5wdXQiLCJpbnB1dENsb25lIiwiY2xvbmUiLCJyZXN0b3JlRm9jdXMiLCJpcyIsImFjdGl2ZUVsZW1lbnQiLCJmaWxlSW5wdXRDbG9uZSIsInJlc2V0IiwiYWZ0ZXIiLCJkZXRhY2giLCJ0cmlnZ2VyIiwiY2xlYW5EYXRhIiwiZWwiLCJfaGFuZGxlRmlsZVRyZWVFbnRyeSIsImVudHJ5IiwicGF0aCIsImVudHJpZXMiLCJkaXJSZWFkZXIiLCJlcnJvckhhbmRsZXIiLCJzdWNjZXNzSGFuZGxlciIsIl9oYW5kbGVGaWxlVHJlZUVudHJpZXMiLCJyZWFkRW50cmllcyIsInJlc3VsdHMiLCJjb25jYXQiLCJpc0ZpbGUiLCJfZmlsZSIsInJlbGF0aXZlUGF0aCIsImlzRGlyZWN0b3J5IiwiY3JlYXRlUmVhZGVyIiwid2hlbiIsIkFycmF5IiwiX2dldERyb3BwZWRGaWxlcyIsIml0ZW1zIiwid2Via2l0R2V0QXNFbnRyeSIsImdldEFzRW50cnkiLCJpdGVtIiwiZ2V0QXNGaWxlIiwibWFrZUFycmF5IiwiX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzIiwiZmlsZVNpemUiLCJfZ2V0RmlsZUlucHV0RmlsZXMiLCJfb25DaGFuZ2UiLCJ0YXJnZXQiLCJfb25QYXN0ZSIsImNsaXBib2FyZERhdGEiLCJfb25Ecm9wIiwiX29uRHJhZ092ZXIiLCJfb25EcmFnRW50ZXIiLCJfb25EcmFnTGVhdmUiLCJfaW5pdEV2ZW50SGFuZGxlcnMiLCJfb24iLCJkcmFnb3ZlciIsImRyb3AiLCJkcmFnZW50ZXIiLCJkcmFnbGVhdmUiLCJwYXN0ZSIsImNoYW5nZSIsIl9kZXN0cm95RXZlbnRIYW5kbGVycyIsIl9vZmYiLCJfZGVzdHJveSIsIl9zZXRPcHRpb24iLCJyZWluaXQiLCJfc3VwZXIiLCJfaW5pdFNwZWNpYWxPcHRpb25zIiwiZmluZCIsIl9nZXRSZWdFeHAiLCJzdHIiLCJtb2RpZmllcnMiLCJwb3AiLCJqb2luIiwiX2lzUmVnRXhwT3B0aW9uIiwiX2luaXREYXRhQXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJ0b0xvd2VyQ2FzZSIsImNoYXJBdCIsIl9jcmVhdGUiLCJhY3RpdmUiLCJkaXNhYmxlZCIsInJlamVjdCIsInRoZW4iLCJjb3VudGVyIiwianNvbkFQSSIsImpzb25QYXJzZSIsIkpTT04iLCJhamF4VHJhbnNwb3J0IiwiYXN5bmMiLCJpbml0aWFsSWZyYW1lU3JjIiwiaWZyYW1lIiwiYWRkUGFyYW1DaGFyIiwiY29tcGxldGVDYWxsYmFjayIsImZpbGVJbnB1dENsb25lcyIsInBhcmFtTmFtZXMiLCJjb250ZW50cyIsImZpcnN0Q2hpbGQiLCJFcnJvciIsImFwcGVuZFRvIiwic2V0VGltZW91dCIsInJlbW92ZSIsInZhbCIsInJlbW92ZUF0dHIiLCJyZXBsYWNlV2l0aCIsImJvZHkiLCJhamF4U2V0dXAiLCJjb252ZXJ0ZXJzIiwiaWZyYW1lVGV4dCIsInRleHQiLCJpZnJhbWVKc29uIiwiaWZyYW1lSHRtbCIsImh0bWwiLCJpZnJhbWVYbWwiLCJ4bWxEb2MiLCJpc1hNTERvYyIsInBhcnNlWE1MIiwiWE1MRG9jdW1lbnQiLCJ4bWwiLCJpZnJhbWVTY3JpcHQiLCJnbG9iYWxFdmFsIiwiaW5pdGlhbGl6ZWQiLCJtZWRpYUFwcCIsImJ1cyIsIlZ1ZSIsImluaXRpYWxpemVNZWRpYUFwcGxpY2F0aW9uIiwiZGlzcGxheU1lZGlhQXBwbGljYXRpb24iLCJtZWRpYUFwcGxpY2F0aW9uVXJsIiwicGF0aEJhc2UiLCJjb25zb2xlIiwibWV0aG9kIiwiY29udGVudCIsInJvb3QiLCJmb2xkZXIiLCJzZWxlY3RlZEZvbGRlciIsIm1lZGlhSXRlbXMiLCJzZWxlY3RlZE1lZGlhcyIsImVycm9ycyIsImRyYWdEcm9wVGh1bWJuYWlsIiwiSW1hZ2UiLCJzbWFsbFRodW1icyIsImdyaWRWaWV3IiwibWVkaWFGaWx0ZXIiLCJzb3J0QnkiLCJzb3J0QXNjIiwiaXRlbXNJblBhZ2UiLCJjcmVhdGVkIiwic2VsZiIsInNyYyIsIiRvbiIsInNlbGVjdFJvb3QiLCJzZWxlY3RlZCIsImVycm9ySW5mbyIsImxvYWRGb2xkZXIiLCJuZXdOYW1lIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJtZWRpYSIsImZpbHRlciIsIm1lZGlhUGF0aCIsImNyZWF0ZUZvbGRlciIsImRlbGV0ZUZvbGRlciIsIm5ld1NvcnQiLCJjaGFuZ2VTb3J0IiwidG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYSIsInJlbmFtZU1lZGlhIiwiZGVsZXRlTWVkaWFJdGVtIiwiaGFuZGxlRHJhZ1N0YXJ0IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImN1cnJlbnRQcmVmcyIsInBhcnNlIiwiY29tcHV0ZWQiLCJpc0hvbWUiLCJwYXJlbnRzIiwicCIsInBhcmVudEZvbGRlciIsInVuc2hpZnQiLCJwYXJlbnQiLCJmaWx0ZXJlZE1lZGlhSXRlbXMiLCJmaWx0ZXJlZCIsImluZGV4T2YiLCJzb3J0IiwiYSIsImIiLCJtaW1lIiwibG9jYWxlQ29tcGFyZSIsImxhc3RNb2RpZnkiLCJoaWRkZW5Db3VudCIsInRodW1iU2l6ZSIsImdldCIsInNldCIsIm5ld1ByZWZzIiwid2F0Y2giLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwibmV3Rm9sZGVyIiwibW91bnRlZCIsIiRyZWZzIiwicm9vdEZvbGRlciIsInRvZ2dsZSIsIm1ldGhvZHMiLCJ1cGxvYWRVcmwiLCJ1cmxWYWx1ZSIsImVuY29kZVVSSUNvbXBvbmVudCIsIm1lZGlhVXJsIiwibG9nIiwiZm9yRWFjaCIsIm9wZW4iLCJzZWxlY3RBbGwiLCJ1blNlbGVjdEFsbCIsImludmVydFNlbGVjdGlvbiIsInRlbXAiLCJpc01lZGlhU2VsZWN0ZWQiLCJzcGxpY2UiLCJzb21lIiwiYXJyYXkiLCJtb2RlbCIsImNvbmZpcm1EaWFsb2ciLCJfb2JqZWN0U3ByZWFkIiwiY2FsbGJhY2siLCJyZXNwIiwiX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4iLCIkZW1pdCIsInJlc3BvbnNlVGV4dCIsImVtcHR5IiwibW9kYWwiLCJib290c3RyYXAiLCJNb2RhbCIsImdldE9yQ3JlYXRlSW5zdGFuY2UiLCJzaG93IiwiZm9jdXMiLCJzZWxlY3RBbmREZWxldGVNZWRpYSIsImRlbGV0ZU1lZGlhIiwiZGVsZXRlTWVkaWFMaXN0IiwibWVkaWFMaXN0IiwicGF0aHMiLCJtZWRpYU5hbWVzIiwic2V0RGF0YSIsInNldERyYWdJbWFnZSIsImVmZmVjdEFsbG93ZWQiLCJoYW5kbGVTY3JvbGxXaGlsZURyYWciLCJjbGllbnRZIiwic2Nyb2xsQnkiLCJpbm5lckhlaWdodCIsImtleXByZXNzIiwid2hpY2giLCJjbGljayIsImhpZGUiLCJlcnJvck1lc3NhZ2UiLCJvbGROYW1lIiwiY3VycmVudEZvbGRlciIsImdldEVsZW1lbnRCeUlkIiwic3R5bGUiLCJkaXNwbGF5IiwiY2h1bmtlZEZpbGVVcGxvYWRJZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJhbnRpRm9yZ2VyeVRva2VuIiwiRmlsZSIsImxhc3RNb2RpZmllZCIsImJpbmQiLCJkdCIsImNvbnRhaW5zIiwiZHJvcFpvbmVUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiYWRkQ2xhc3MiLCJob3ZlcmVkRHJvcFpvbmUiLCJjbG9zZXN0IiwicmVtb3ZlQ2xhc3MiLCJjb21wb25lbnQiLCJ0ZW1wbGF0ZSIsImRpciIsInByb3BzIiwic2VsZWN0ZWRJbk1lZGlhQXBwIiwibGV2ZWwiLCJjaGlsZHJlbiIsImlzSG92ZXJlZCIsInBhZGRpbmciLCJpc1NlbGVjdGVkIiwiaXNSb290IiwiaXNBbmNlc3Rvck9mU2VsZWN0ZWRGb2xkZXIiLCJsb2FkQ2hpbGRyZW4iLCJzZWxlY3QiLCJjIiwiZW10cHkiLCJoYW5kbGVEcmFnT3ZlciIsImhhbmRsZURyYWdMZWF2ZSIsIm1vdmVNZWRpYVRvRm9sZGVyIiwiZ2V0RGF0YSIsInNvdXJjZUZvbGRlciIsInRhcmdldEZvbGRlciIsImFsZXJ0IiwiVCIsImVkaXRCdXR0b24iLCJkZWxldGVCdXR0b24iLCJidWlsZE1lZGlhVXJsIiwiZHJhZ1N0YXJ0IiwiQm9vbGVhbiIsImltYWdlSGVhZGVyIiwibmFtZUhlYWRlciIsImxhc3RNb2RpZnlIZWFkZXIiLCJzaXplSGVhZGVyIiwidHlwZUhlYWRlciIsInZpZXdCdXR0b24iLCJwcmludERhdGVUaW1lIiwiZGF0ZW1pbGxpcyIsImQiLCJ0b0xvY2FsZVN0cmluZyIsInNvdXJjZUl0ZW1zIiwicGFnZVNpemUiLCJwYWdlU2l6ZU9wdGlvbnMiLCJjdXJyZW50IiwicGFnZXJGaXJzdEJ1dHRvbiIsInBhZ2VyUHJldmlvdXNCdXR0b24iLCJwYWdlck5leHRCdXR0b24iLCJwYWdlckxhc3RCdXR0b24iLCJwYWdlclBhZ2VTaXplTGFiZWwiLCJwYWdlclBhZ2VMYWJlbCIsInBhZ2VyVG90YWxMYWJlbCIsIm5leHQiLCJwcmV2aW91cyIsImdvRmlyc3QiLCJnb0xhc3QiLCJ0b3RhbFBhZ2VzIiwiZ29UbyIsInRhcmdldFBhZ2UiLCJwYWdlcyIsImNlaWwiLCJpc0xhc3RQYWdlIiwiaXNGaXJzdFBhZ2UiLCJjYW5Eb05leHQiLCJjYW5Eb1ByZXYiLCJjYW5Eb0ZpcnN0IiwiY2FuRG9MYXN0IiwiaXRlbXNJbkN1cnJlbnRQYWdlIiwic3RhcnQiLCJlbmQiLCJwYWdlTGlua3MiLCJsaW5rcyIsImJlZm9yZUN1cnJlbnQiLCJiZWZvcmVCZWZvcmVDdXJyZW50IiwiYWZ0ZXJDdXJyZW50IiwiYWZ0ZXJBZnRlckN1cnJlbnQiLCJjb2xuYW1lIiwic2VsZWN0ZWRjb2xuYW1lIiwiYXNjIiwiaXNBY3RpdmUiLCJ1cGxvYWRJbnB1dElkIiwiX3NlbGYkdXBsb2FkSW5wdXRJZCIsInVwbG9hZElucHV0IiwicGVyY2VudGFnZSIsImhhbmRsZUZhaWx1cmUiLCJkaXNtaXNzV2FybmluZyIsImV4cGFuZGVkIiwicGVuZGluZ0NvdW50IiwiZXJyb3JDb3VudCIsInVwbG9hZHMiLCJjbGVhckVycm9ycyIsImZpbGVDb3VudCIsIm5ld0ZpbGUiLCJhbHJlYWR5SW5MaXN0IiwiZiIsImZpbGVVcGxvYWQiLCJ1cGRhdGVDb3VudCIsImluaXRpYWxpemVBdHRhY2hlZE1lZGlhRmllbGQiLCJpZE9mVXBsb2FkQnV0dG9uIiwidXBsb2FkQWN0aW9uIiwibWVkaWFJdGVtVXJsIiwiYWxsb3dNdWx0aXBsZSIsImFsbG93TWVkaWFUZXh0IiwiYWxsb3dBbmNob3JzIiwidGVtcFVwbG9hZEZvbGRlciIsIm1heFVwbG9hZENodW5rU2l6ZSIsImluaXRpYWxQYXRocyIsIm1lZGlhRmllbGRFZGl0b3IiLCJpZHByZWZpeCIsIm1lZGlhRmllbGRBcHAiLCJtZWRpYUZpZWxkQXBwcyIsInNlbGVjdGVkTWVkaWEiLCJpZFByZWZpeCIsImJhY2t1cE1lZGlhVGV4dCIsImJhY2t1cEFuY2hvciIsIm1lZGlhVGV4dG1vZGFsIiwiYW5jaG9yaW5nTW9kYWwiLCJtZWRpYVBhdGhzIiwieCIsImlzUmVtb3ZlZCIsImlzTmV3IiwibWVkaWFUZXh0IiwiYW5jaG9yIiwiYXR0YWNoZWRGaWxlTmFtZSIsInZhbHVlcyIsInNpZ25hbCIsInZ1ZWtleSIsInkiLCJyb3VuZCIsImNhbkFkZE1lZGlhIiwibm9uUmVtb3ZlZE1lZGlhSXRlbXMiLCJzZWxlY3RNZWRpYSIsInNlbGVjdG9yIiwiZWRpdG9ySWQiLCJjb3VudCIsImdldFVuaXF1ZUlkIiwibmV3TWVkaWFJdGVtcyIsImVycm9ybXNnIiwiciIsInJhbmRvbSIsInYiLCJyZW1vdmVTZWxlY3RlZCIsImV2ZW50IiwicmVtb3ZlZCIsInNob3dNZWRpYVRleHRNb2RhbCIsIm1lZGlhVGV4dE1vZGFsIiwiY2FuY2VsTWVkaWFUZXh0TW9kYWwiLCJzaG93QW5jaG9yTW9kYWwiLCJjYW5jZWxBbmNob3JpbmdNb2RhbCIsInJlc2V0QW5jaG9yIiwib25BbmNob3JEcm9wIiwiaW1hZ2UiLCJhbmNob3JJbWFnZSIsIm9mZnNldFgiLCJjbGllbnRXaWR0aCIsIm9mZnNldFkiLCJjbGllbnRIZWlnaHQiLCJhbmNob3JMZWZ0IiwibW9kYWxCb2R5Iiwib2Zmc2V0IiwicG9zaXRpb24iLCJhbmNob3JUb3AiLCJzZXRBbmNob3IiLCJhZGRNZWRpYUZpbGVzIiwiZGVlcCIsImhhbmRsZXIiLCJpbml0aWFsaXplTWVkaWFGaWVsZCIsIm1vZGFsQm9keUVsZW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwic2hvd01vZGFsIiwiYW5jaG9ySWNvbiIsInF1ZXJ5U2VsZWN0b3IiLCJpc0ludGVnZXIiLCJtZWRp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RUFBRWxlO0VBQ2QsQ0FBQztFQUNEd1AsT0FBTyxFQUFFLFNBQUFBLFFBQUEsRUFBWTtJQUVqQixJQUFJQyxJQUFJLEdBQUcsSUFBSTs7SUFFZjtJQUNBQSxJQUFJLENBQUNrSixDQUFDLENBQUNvSixhQUFhLEdBQUc1cUIsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUN5VixHQUFHLENBQUMsQ0FBQztJQUNwRDZDLElBQUksQ0FBQ2tKLENBQUMsQ0FBQ3FKLGNBQWMsR0FBRzdxQixDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQ3lWLEdBQUcsQ0FBQyxDQUFDO0lBQ3JENkMsSUFBSSxDQUFDa0osQ0FBQyxDQUFDc0osUUFBUSxHQUFHOXFCLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQ3lWLEdBQUcsQ0FBQyxDQUFDO0VBQzdDLENBQUM7RUFDRG1HLE9BQU8sRUFBRTtJQUNMK0Isb0JBQW9CLEVBQUUsU0FBQUEscUJBQVUzRSxLQUFLLEVBQUU7TUFDbkMsSUFBSSxDQUFDK1IsT0FBTyxDQUFDN04sS0FBSyxDQUFDLCtCQUErQixFQUFFbEUsS0FBSyxDQUFDO0lBQzlELENBQUM7SUFDRGtQLFdBQVcsRUFBRSxTQUFBQSxZQUFVbFAsS0FBSyxFQUFFO01BQzFCLElBQUksQ0FBQytSLE9BQU8sQ0FBQzdOLEtBQUssQ0FBQyxzQkFBc0IsRUFBRWxFLEtBQUssQ0FBQztJQUNyRCxDQUFDO0lBQ0QySSxhQUFhLEVBQUUsU0FBQUEsY0FBVTlYLEdBQUcsRUFBRW1SLFNBQVMsRUFBRTtNQUNyQyxPQUFPblIsR0FBRyxJQUFJQSxHQUFHLENBQUMyUSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBR1EsU0FBUyxHQUFHLFVBQVUsR0FBR0EsU0FBUztJQUNyRztFQUNKO0FBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6Im1lZGlhLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIGpRdWVyeSBGaWxlIFVwbG9hZCBQbHVnaW5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZFxuICpcbiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuXG4vKiBnbG9iYWwgZGVmaW5lLCByZXF1aXJlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAndXNlIHN0cmljdCc7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZTpcbiAgICBkZWZpbmUoWydqcXVlcnknLCAnanF1ZXJ5LXVpL3VpL3dpZGdldCddLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBOb2RlL0NvbW1vbkpTOlxuICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJy4vdmVuZG9yL2pxdWVyeS51aS53aWRnZXQnKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzOlxuICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7XG4gIH1cbn0pKGZ1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBEZXRlY3QgZmlsZSBpbnB1dCBzdXBwb3J0LCBiYXNlZCBvblxuICAvLyBodHRwczovL3ZpbGphbWlzLmNvbS8yMDEyL2ZpbGUtdXBsb2FkLXN1cHBvcnQtb24tbW9iaWxlL1xuICAkLnN1cHBvcnQuZmlsZUlucHV0ID0gIShcbiAgICBuZXcgUmVnRXhwKFxuICAgICAgLy8gSGFuZGxlIGRldmljZXMgd2hpY2ggZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMgZm9yIHRoZSBmZWF0dXJlIGRldGVjdGlvbjpcbiAgICAgICcoQW5kcm9pZCAoMVxcXFwuWzAxNTZdfDJcXFxcLlswMV0pKScgK1xuICAgICAgICAnfChXaW5kb3dzIFBob25lIChPUyA3fDhcXFxcLjApKXwoWEJMV1ApfChadW5lV1ApfChXUERlc2t0b3ApJyArXG4gICAgICAgICd8KHcoZWIpP09TQnJvd3Nlcil8KHdlYk9TKScgK1xuICAgICAgICAnfChLaW5kbGUvKDFcXFxcLjB8MlxcXFwuWzA1XXwzXFxcXC4wKSknXG4gICAgKS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSB8fFxuICAgIC8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZvciBhbGwgb3RoZXIgZGV2aWNlczpcbiAgICAkKCc8aW5wdXQgdHlwZT1cImZpbGVcIi8+JykucHJvcCgnZGlzYWJsZWQnKVxuICApO1xuXG4gIC8vIFRoZSBGaWxlUmVhZGVyIEFQSSBpcyBub3QgYWN0dWFsbHkgdXNlZCwgYnV0IHdvcmtzIGFzIGZlYXR1cmUgZGV0ZWN0aW9uLFxuICAvLyBhcyBzb21lIFNhZmFyaSB2ZXJzaW9ucyAoNT8pIHN1cHBvcnQgWEhSIGZpbGUgdXBsb2FkcyB2aWEgdGhlIEZvcm1EYXRhIEFQSSxcbiAgLy8gYnV0IG5vdCBub24tbXVsdGlwYXJ0IFhIUiBmaWxlIHVwbG9hZHMuXG4gIC8vIHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTAsIHNvIHdlIGNoZWNrIGZvclxuICAvLyB3aW5kb3cuUHJvZ3Jlc3NFdmVudCBpbnN0ZWFkIHRvIGRldGVjdCBYSFIyIGZpbGUgdXBsb2FkIGNhcGFiaWxpdHk6XG4gICQuc3VwcG9ydC54aHJGaWxlVXBsb2FkID0gISEod2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZpbGVSZWFkZXIpO1xuICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkID0gISF3aW5kb3cuRm9ybURhdGE7XG5cbiAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6XG4gICQuc3VwcG9ydC5ibG9iU2xpY2UgPVxuICAgIHdpbmRvdy5CbG9iICYmXG4gICAgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8XG4gICAgICBCbG9iLnByb3RvdHlwZS53ZWJraXRTbGljZSB8fFxuICAgICAgQmxvYi5wcm90b3R5cGUubW96U2xpY2UpO1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGRyYWcgaGFuZGxlcnMgZm9yIGRyYWdvdmVyL2RyYWdlbnRlci9kcmFnbGVhdmVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRXZlbnQgdHlwZVxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IERyYWcgaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RHJhZ0hhbmRsZXIodHlwZSkge1xuICAgIHZhciBpc0RyYWdPdmVyID0gdHlwZSA9PT0gJ2RyYWdvdmVyJztcbiAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XG4gICAgICB2YXIgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXI7XG4gICAgICBpZiAoXG4gICAgICAgIGRhdGFUcmFuc2ZlciAmJlxuICAgICAgICAkLmluQXJyYXkoJ0ZpbGVzJywgZGF0YVRyYW5zZmVyLnR5cGVzKSAhPT0gLTEgJiZcbiAgICAgICAgdGhpcy5fdHJpZ2dlcih0eXBlLCAkLkV2ZW50KHR5cGUsIHsgZGVsZWdhdGVkRXZlbnQ6IGUgfSkpICE9PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGlzRHJhZ092ZXIpIHtcbiAgICAgICAgICBkYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgZmlsZXVwbG9hZCB3aWRnZXQgbGlzdGVucyBmb3IgY2hhbmdlIGV2ZW50cyBvbiBmaWxlIGlucHV0IGZpZWxkcyBkZWZpbmVkXG4gIC8vIHZpYSBmaWxlSW5wdXQgc2V0dGluZyBhbmQgcGFzdGUgb3IgZHJvcCBldmVudHMgb2YgdGhlIGdpdmVuIGRyb3Bab25lLlxuICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBqUXVlcnkgV2lkZ2V0IG1ldGhvZHMsIHRoZSBmaWxldXBsb2FkIHdpZGdldFxuICAvLyBleHBvc2VzIHRoZSBcImFkZFwiIGFuZCBcInNlbmRcIiBtZXRob2RzLCB0byBhZGQgb3IgZGlyZWN0bHkgc2VuZCBmaWxlcyB1c2luZ1xuICAvLyB0aGUgZmlsZXVwbG9hZCBBUEkuXG4gIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yXG4gIC8vIFwiYWRkXCIgbWV0aG9kIGFyZSB1cGxvYWRlZCBpbW1lZGlhdGVseSwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlXG4gIC8vIHRoZSBcImFkZFwiIGNhbGxiYWNrIG9wdGlvbiB0byBxdWV1ZSBmaWxlIHVwbG9hZHMuXG4gICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCB7XG4gICAgb3B0aW9uczoge1xuICAgICAgLy8gVGhlIGRyb3AgdGFyZ2V0IGVsZW1lbnQocyksIGJ5IHRoZSBkZWZhdWx0IHRoZSBjb21wbGV0ZSBkb2N1bWVudC5cbiAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgZHJhZyAmIGRyb3Agc3VwcG9ydDpcbiAgICAgIGRyb3Bab25lOiAkKGRvY3VtZW50KSxcbiAgICAgIC8vIFRoZSBwYXN0ZSB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdW5kZWZpbmVkLlxuICAgICAgLy8gU2V0IHRvIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IG9iamVjdCB0byBlbmFibGUgZmlsZSBwYXN0aW5nOlxuICAgICAgcGFzdGVab25lOiB1bmRlZmluZWQsXG4gICAgICAvLyBUaGUgZmlsZSBpbnB1dCBmaWVsZChzKSwgdGhhdCBhcmUgbGlzdGVuZWQgdG8gZm9yIGNoYW5nZSBldmVudHMuXG4gICAgICAvLyBJZiB1bmRlZmluZWQsIGl0IGlzIHNldCB0byB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgaW5zaWRlXG4gICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLlxuICAgICAgLy8gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgY2hhbmdlIGxpc3RlbmVyLlxuICAgICAgZmlsZUlucHV0OiB1bmRlZmluZWQsXG4gICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXJcbiAgICAgIC8vIGVhY2ggaW5wdXQgZmllbGQgY2hhbmdlIGV2ZW50LiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpZnJhbWUgdHJhbnNwb3J0XG4gICAgICAvLyBxdWV1ZXMgYW5kIGFsbG93cyBjaGFuZ2UgZXZlbnRzIHRvIGJlIGZpcmVkIGZvciB0aGUgc2FtZSBmaWxlXG4gICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZTpcbiAgICAgIHJlcGxhY2VGaWxlSW5wdXQ6IHRydWUsXG4gICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBmaWxlIGZvcm0gZGF0YSAodGhlIHJlcXVlc3QgYXJndW1lbnQgbmFtZSkuXG4gICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzXG4gICAgICAvLyB1c2VkLCBvciBcImZpbGVzW11cIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksXG4gICAgICAvLyBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nczpcbiAgICAgIHBhcmFtTmFtZTogdW5kZWZpbmVkLFxuICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWxcbiAgICAgIC8vIHJlcXVlc3QgZm9yIFhIUiB0eXBlIHVwbG9hZHMuIFNldCB0byBmYWxzZSB0byB1cGxvYWQgZmlsZVxuICAgICAgLy8gc2VsZWN0aW9ucyBpbiBvbmUgcmVxdWVzdCBlYWNoOlxuICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsXG4gICAgICAvLyBUbyBsaW1pdCB0aGUgbnVtYmVyIG9mIGZpbGVzIHVwbG9hZGVkIHdpdGggb25lIFhIUiByZXF1ZXN0LFxuICAgICAgLy8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDA6XG4gICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCxcbiAgICAgIC8vIFRoZSBmb2xsb3dpbmcgb3B0aW9uIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGZpbGVzIHVwbG9hZGVkIHdpdGggb25lXG4gICAgICAvLyBYSFIgcmVxdWVzdCB0byBrZWVwIHRoZSByZXF1ZXN0IHNpemUgdW5kZXIgb3IgZXF1YWwgdG8gdGhlIGRlZmluZWRcbiAgICAgIC8vIGxpbWl0IGluIGJ5dGVzOlxuICAgICAgbGltaXRNdWx0aUZpbGVVcGxvYWRTaXplOiB1bmRlZmluZWQsXG4gICAgICAvLyBNdWx0aXBhcnQgZmlsZSB1cGxvYWRzIGFkZCBhIG51bWJlciBvZiBieXRlcyB0byBlYWNoIHVwbG9hZGVkIGZpbGUsXG4gICAgICAvLyB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBvcHRpb24gYWRkcyBhbiBvdmVyaGVhZCBmb3IgZWFjaCBmaWxlIHVzZWRcbiAgICAgIC8vIGluIHRoZSBsaW1pdE11bHRpRmlsZVVwbG9hZFNpemUgY29uZmlndXJhdGlvbjpcbiAgICAgIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZU92ZXJoZWFkOiA1MTIsXG4gICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBpc3N1ZSBhbGwgZmlsZSB1cGxvYWQgcmVxdWVzdHNcbiAgICAgIC8vIGluIGEgc2VxdWVudGlhbCBvcmRlcjpcbiAgICAgIHNlcXVlbnRpYWxVcGxvYWRzOiBmYWxzZSxcbiAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzLFxuICAgICAgLy8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDA6XG4gICAgICBsaW1pdENvbmN1cnJlbnRVcGxvYWRzOiB1bmRlZmluZWQsXG4gICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSB0byBmb3JjZSBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6XG4gICAgICBmb3JjZUlmcmFtZVRyYW5zcG9ydDogZmFsc2UsXG4gICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcmVkaXJlY3QgdXJsIG9uIHRoZVxuICAgICAgLy8gb3JpZ2luIHNlcnZlciwgZm9yIGNyb3NzLWRvbWFpbiBpZnJhbWUgdHJhbnNwb3J0IHVwbG9hZHM6XG4gICAgICByZWRpcmVjdDogdW5kZWZpbmVkLFxuICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgcmVkaXJlY3QgdXJsLCBzZW50IGFzIHBhcnQgb2YgdGhlIGZvcm1cbiAgICAgIC8vIGRhdGEgYW5kIHNldCB0byAncmVkaXJlY3QnIGlmIHRoaXMgb3B0aW9uIGlzIGVtcHR5OlxuICAgICAgcmVkaXJlY3RQYXJhbU5hbWU6IHVuZGVmaW5lZCxcbiAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgYSBwb3N0TWVzc2FnZSB3aW5kb3csXG4gICAgICAvLyB0byBlbmFibGUgcG9zdE1lc3NhZ2UgdHJhbnNwb3J0IHVwbG9hZHM6XG4gICAgICBwb3N0TWVzc2FnZTogdW5kZWZpbmVkLFxuICAgICAgLy8gQnkgZGVmYXVsdCwgWEhSIGZpbGUgdXBsb2FkcyBhcmUgc2VudCBhcyBtdWx0aXBhcnQvZm9ybS1kYXRhLlxuICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgaXMgYWx3YXlzIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGEuXG4gICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZW5hYmxlIG5vbi1tdWx0aXBhcnQgWEhSIHVwbG9hZHM6XG4gICAgICBtdWx0aXBhcnQ6IHRydWUsXG4gICAgICAvLyBUbyB1cGxvYWQgbGFyZ2UgZmlsZXMgaW4gc21hbGxlciBjaHVua3MsIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvblxuICAgICAgLy8gdG8gYSBwcmVmZXJyZWQgbWF4aW11bSBjaHVuayBzaXplLiBJZiBzZXQgdG8gMCwgbnVsbCBvciB1bmRlZmluZWQsXG4gICAgICAvLyBvciB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1aXJlZCBCbG9iIEFQSSwgZmlsZXMgd2lsbFxuICAgICAgLy8gYmUgdXBsb2FkZWQgYXMgYSB3aG9sZS5cbiAgICAgIG1heENodW5rU2l6ZTogdW5kZWZpbmVkLFxuICAgICAgLy8gV2hlbiBhIG5vbi1tdWx0aXBhcnQgdXBsb2FkIG9yIGEgY2h1bmtlZCBtdWx0aXBhcnQgdXBsb2FkIGhhcyBiZWVuXG4gICAgICAvLyBhYm9ydGVkLCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgdGhlIHVwbG9hZCBieSBzZXR0aW5nXG4gICAgICAvLyBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgYWxyZWFkeSB1cGxvYWRlZCBieXRlcy4gVGhpcyBvcHRpb24gaXMgbW9zdFxuICAgICAgLy8gdXNlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBvcHRpb25zIG9iamVjdCBpbnNpZGUgb2YgdGhlIFwiYWRkXCIgb3JcbiAgICAgIC8vIFwic2VuZFwiIGNhbGxiYWNrcywgYXMgdGhlIG9wdGlvbnMgYXJlIGNsb25lZCBmb3IgZWFjaCBmaWxlIHVwbG9hZC5cbiAgICAgIHVwbG9hZGVkQnl0ZXM6IHVuZGVmaW5lZCxcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAgLy8gZ2xvYmFsIHByb2dyZXNzIGNhbGN1bGF0aW9uLiBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gZmFsc2UgdG9cbiAgICAgIC8vIHByZXZlbnQgcmVjYWxjdWxhdGluZyB0aGUgZ2xvYmFsIHByb2dyZXNzIGRhdGE6XG4gICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLFxuICAgICAgLy8gSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIGNhbGN1bGF0ZSBhbmQgdHJpZ2dlciBwcm9ncmVzcyBldmVudHM6XG4gICAgICBwcm9ncmVzc0ludGVydmFsOiAxMDAsXG4gICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6XG4gICAgICBiaXRyYXRlSW50ZXJ2YWw6IDUwMCxcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIHVwbG9hZHMgYXJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFkZGluZyBmaWxlczpcbiAgICAgIGF1dG9VcGxvYWQ6IHRydWUsXG4gICAgICAvLyBCeSBkZWZhdWx0LCBkdXBsaWNhdGUgZmlsZSBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgaGFuZGxlZCBvblxuICAgICAgLy8gdGhlIHNlcnZlci1zaWRlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSAoZS5nLiB3aGVuIHVwbG9hZGluZ1xuICAgICAgLy8gZmlsZXMgZGlyZWN0bHkgdG8gQW1hem9uIFMzKSwgdGhlIGZvbGxvd2luZyBvcHRpb24gY2FuIGJlIHNldCB0b1xuICAgICAgLy8gYW4gZW1wdHkgb2JqZWN0IG9yIGFuIG9iamVjdCBtYXBwaW5nIGV4aXN0aW5nIGZpbGVuYW1lcywgZS5nLjpcbiAgICAgIC8vIHsgXCJpbWFnZS5qcGdcIjogdHJ1ZSwgXCJpbWFnZSAoMSkuanBnXCI6IHRydWUgfVxuICAgICAgLy8gSWYgaXQgaXMgc2V0LCBhbGwgZmlsZXMgd2lsbCBiZSB1cGxvYWRlZCB3aXRoIHVuaXF1ZSBmaWxlbmFtZXMsXG4gICAgICAvLyBhZGRpbmcgaW5jcmVhc2luZyBudW1iZXIgc3VmZml4ZXMgaWYgbmVjZXNzYXJ5LCBlLmcuOlxuICAgICAgLy8gXCJpbWFnZSAoMikuanBnXCJcbiAgICAgIHVuaXF1ZUZpbGVuYW1lczogdW5kZWZpbmVkLFxuXG4gICAgICAvLyBFcnJvciBhbmQgaW5mbyBtZXNzYWdlczpcbiAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIHVwbG9hZGVkQnl0ZXM6ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJ1xuICAgICAgfSxcblxuICAgICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24sIGdldHMgdGhlIG1lc3NhZ2Uga2V5IHRvIGJlIHRyYW5zbGF0ZWRcbiAgICAgIC8vIGFuZCBhbiBvYmplY3Qgd2l0aCBjb250ZXh0IHNwZWNpZmljIGRhdGEgYXMgYXJndW1lbnRzOlxuICAgICAgaTE4bjogZnVuY3Rpb24gKG1lc3NhZ2UsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW21lc3NhZ2VdIHx8IG1lc3NhZ2UudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAkLmVhY2goY29udGV4dCwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgneycgKyBrZXkgKyAnfScsIHZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFkZGl0aW9uYWwgZm9ybSBkYXRhIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmlsZSB1cGxvYWRzIGNhbiBiZSBzZXRcbiAgICAgIC8vIHVzaW5nIHRoaXMgb3B0aW9uLCB3aGljaCBhY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBuYW1lIGFuZFxuICAgICAgLy8gdmFsdWUgcHJvcGVydGllcywgYSBmdW5jdGlvbiByZXR1cm5pbmcgc3VjaCBhbiBhcnJheSwgYSBGb3JtRGF0YVxuICAgICAgLy8gb2JqZWN0IChmb3IgWEhSIGZpbGUgdXBsb2FkcyksIG9yIGEgc2ltcGxlIG9iamVjdC5cbiAgICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBmaXJzdCBmaWxlSW5wdXQgaXMgZ2l2ZW4gYXMgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbjpcbiAgICAgIGZvcm1EYXRhOiBmdW5jdGlvbiAoZm9ybSkge1xuICAgICAgICByZXR1cm4gZm9ybS5zZXJpYWxpemVBcnJheSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gVGhlIGFkZCBjYWxsYmFjayBpcyBpbnZva2VkIGFzIHNvb24gYXMgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBmaWxldXBsb2FkXG4gICAgICAvLyB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3AsIHBhc3RlIG9yIGFkZCBBUEkgY2FsbCkuXG4gICAgICAvLyBJZiB0aGUgc2luZ2xlRmlsZVVwbG9hZHMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZVxuICAgICAgLy8gY2FsbGVkIG9uY2UgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VsZWN0aW9uIGZvciBYSFIgZmlsZSB1cGxvYWRzLCBlbHNlXG4gICAgICAvLyBvbmNlIGZvciBlYWNoIGZpbGUgc2VsZWN0aW9uLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB1cGxvYWQgc3RhcnRzIHdoZW4gdGhlIHN1Ym1pdCBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgZGF0YSBwYXJhbWV0ZXIuXG4gICAgICAvLyBUaGUgZGF0YSBvYmplY3QgY29udGFpbnMgYSBmaWxlcyBwcm9wZXJ0eSBob2xkaW5nIHRoZSBhZGRlZCBmaWxlc1xuICAgICAgLy8gYW5kIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgcGx1Z2luIG9wdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgYWpheCBzZXR0aW5ncy5cbiAgICAgIC8vXG4gICAgICAvLyBMaXN0ZW5lcnMgZm9yIHRoaXMgY2FsbGJhY2sgY2FuIGFsc28gYmUgYm91bmQgdGhlIGZvbGxvd2luZyB3YXk6XG4gICAgICAvLyAub24oJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTtcbiAgICAgIC8vXG4gICAgICAvLyBkYXRhLnN1Ym1pdCgpIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBhbmQgYWxsb3dzIHRvIGF0dGFjaCBhZGRpdGlvbmFsXG4gICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6XG4gICAgICAvLyBkYXRhLnN1Ym1pdCgpLmRvbmUoZnVuYykuZmFpbChmdW5jKS5hbHdheXMoZnVuYyk7XG4gICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhLmF1dG9VcGxvYWQgfHxcbiAgICAgICAgICAoZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgJCh0aGlzKS5maWxldXBsb2FkKCdvcHRpb24nLCAnYXV0b1VwbG9hZCcpKVxuICAgICAgICApIHtcbiAgICAgICAgICBkYXRhLnByb2Nlc3MoKS5kb25lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIE90aGVyIGNhbGxiYWNrczpcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdWJtaXQgZXZlbnQgb2YgZWFjaCBmaWxlIHVwbG9hZDpcbiAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRzdWJtaXQnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6XG4gICAgICAvLyBzZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5vbignZmlsZXVwbG9hZHNlbmQnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgdXBsb2FkczpcbiAgICAgIC8vIGRvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkZG9uZScsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgdXBsb2FkczpcbiAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkZmFpbCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6XG4gICAgICAvLyBhbHdheXM6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkYWx3YXlzJywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnRzOlxuICAgICAgLy8gcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIGdsb2JhbCB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnRzOlxuICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkcHJvZ3Jlc3NhbGwnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6XG4gICAgICAvLyBzdGFydDogZnVuY3Rpb24gKGUpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRzdGFydCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdG9wLCBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0b3AgZXZlbnQ6XG4gICAgICAvLyBzdG9wOiBmdW5jdGlvbiAoZSkge30sIC8vIC5vbignZmlsZXVwbG9hZHN0b3AnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIGNoYW5nZSBldmVudHMgb2YgdGhlIGZpbGVJbnB1dChzKTpcbiAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRjaGFuZ2UnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOlxuICAgICAgLy8gcGFzdGU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkcGFzdGUnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyb3AgZXZlbnRzIG9mIHRoZSBkcm9wWm9uZShzKTpcbiAgICAgIC8vIGRyb3A6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkZHJvcCcsIGZ1bmMpO1xuXG4gICAgICAvLyBDYWxsYmFjayBmb3IgZHJhZ292ZXIgZXZlbnRzIG9mIHRoZSBkcm9wWm9uZShzKTpcbiAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5vbignZmlsZXVwbG9hZGRyYWdvdmVyJywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGJlZm9yZSB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdCAoYmVmb3JlIGZvcm0gZGF0YSBpbml0aWFsaXphdGlvbik6XG4gICAgICAvLyBjaHVua2JlZm9yZXNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkY2h1bmtiZWZvcmVzZW5kJywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDpcbiAgICAgIC8vIGNodW5rc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRjaHVua3NlbmQnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgY2h1bmsgdXBsb2FkczpcbiAgICAgIC8vIGNodW5rZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRjaHVua2RvbmUnLCBmdW5jKTtcblxuICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGNodW5rIHVwbG9hZHM6XG4gICAgICAvLyBjaHVua2ZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLm9uKCdmaWxldXBsb2FkY2h1bmtmYWlsJywgZnVuYyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6XG4gICAgICAvLyBjaHVua2Fsd2F5czogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAub24oJ2ZpbGV1cGxvYWRjaHVua2Fsd2F5cycsIGZ1bmMpO1xuXG4gICAgICAvLyBUaGUgcGx1Z2luIG9wdGlvbnMgYXJlIHVzZWQgYXMgc2V0dGluZ3Mgb2JqZWN0IGZvciB0aGUgYWpheCBjYWxscy5cbiAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGpRdWVyeSBhamF4IHNldHRpbmdzIHJlcXVpcmVkIGZvciB0aGUgZmlsZSB1cGxvYWRzOlxuICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgdGltZW91dDogMFxuICAgIH0sXG5cbiAgICAvLyBqUXVlcnkgdmVyc2lvbnMgYmVmb3JlIDEuOCByZXF1aXJlIHByb21pc2UucGlwZSBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzXG4gICAgLy8gdXNlZCwgYXMgcHJvbWlzZS50aGVuIGluIG9sZGVyIHZlcnNpb25zIGhhcyBhIGRpZmZlcmVudCBiZWhhdmlvciwgc2VlOlxuICAgIC8vIGh0dHBzOi8vYmxvZy5qcXVlcnkuY29tLzIwMTIvMDgvMDkvanF1ZXJ5LTEtOC1yZWxlYXNlZC9cbiAgICAvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTEwMTBcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvcHVsbC8zNDM1XG4gICAgX3Byb21pc2VQaXBlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBhcnRzID0gJC5mbi5qcXVlcnkuc3BsaXQoJy4nKTtcbiAgICAgIHJldHVybiBOdW1iZXIocGFydHNbMF0pID4gMSB8fCBOdW1iZXIocGFydHNbMV0pID4gNyA/ICd0aGVuJyA6ICdwaXBlJztcbiAgICB9KSgpLFxuXG4gICAgLy8gQSBsaXN0IG9mIG9wdGlvbnMgdGhhdCByZXF1aXJlIHJlaW5pdGlhbGl6aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQvb3JcbiAgICAvLyBzcGVjaWFsIGluaXRpYWxpemF0aW9uIGNvZGU6XG4gICAgX3NwZWNpYWxPcHRpb25zOiBbXG4gICAgICAnZmlsZUlucHV0JyxcbiAgICAgICdkcm9wWm9uZScsXG4gICAgICAncGFzdGVab25lJyxcbiAgICAgICdtdWx0aXBhcnQnLFxuICAgICAgJ2ZvcmNlSWZyYW1lVHJhbnNwb3J0J1xuICAgIF0sXG5cbiAgICBfYmxvYlNsaWNlOlxuICAgICAgJC5zdXBwb3J0LmJsb2JTbGljZSAmJlxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2xpY2UgPSB0aGlzLnNsaWNlIHx8IHRoaXMud2Via2l0U2xpY2UgfHwgdGhpcy5tb3pTbGljZTtcbiAgICAgICAgcmV0dXJuIHNsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9LFxuXG4gICAgX0JpdHJhdGVUaW1lcjogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50aW1lc3RhbXAgPSBEYXRlLm5vdyA/IERhdGUubm93KCkgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMubG9hZGVkID0gMDtcbiAgICAgIHRoaXMuYml0cmF0ZSA9IDA7XG4gICAgICB0aGlzLmdldEJpdHJhdGUgPSBmdW5jdGlvbiAobm93LCBsb2FkZWQsIGludGVydmFsKSB7XG4gICAgICAgIHZhciB0aW1lRGlmZiA9IG5vdyAtIHRoaXMudGltZXN0YW1wO1xuICAgICAgICBpZiAoIXRoaXMuYml0cmF0ZSB8fCAhaW50ZXJ2YWwgfHwgdGltZURpZmYgPiBpbnRlcnZhbCkge1xuICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IChsb2FkZWQgLSB0aGlzLmxvYWRlZCkgKiAoMTAwMCAvIHRpbWVEaWZmKSAqIDg7XG4gICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7XG4gICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBub3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYml0cmF0ZTtcbiAgICAgIH07XG4gICAgfSxcblxuICAgIF9pc1hIUlVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICFvcHRpb25zLmZvcmNlSWZyYW1lVHJhbnNwb3J0ICYmXG4gICAgICAgICgoIW9wdGlvbnMubXVsdGlwYXJ0ICYmICQuc3VwcG9ydC54aHJGaWxlVXBsb2FkKSB8fFxuICAgICAgICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBfZ2V0Rm9ybURhdGE6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICB2YXIgZm9ybURhdGE7XG4gICAgICBpZiAoJC50eXBlKG9wdGlvbnMuZm9ybURhdGEpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhKG9wdGlvbnMuZm9ybSk7XG4gICAgICB9XG4gICAgICBpZiAoJC5pc0FycmF5KG9wdGlvbnMuZm9ybURhdGEpKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhO1xuICAgICAgfVxuICAgICAgaWYgKCQudHlwZShvcHRpb25zLmZvcm1EYXRhKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9ybURhdGEgPSBbXTtcbiAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgIGZvcm1EYXRhLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcblxuICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICB2YXIgdG90YWwgPSAwO1xuICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcbiAgICAgICAgdG90YWwgKz0gZmlsZS5zaXplIHx8IDE7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9LFxuXG4gICAgX2luaXRQcm9ncmVzc09iamVjdDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgdmFyIHByb2dyZXNzID0ge1xuICAgICAgICBsb2FkZWQ6IDAsXG4gICAgICAgIHRvdGFsOiAwLFxuICAgICAgICBiaXRyYXRlOiAwXG4gICAgICB9O1xuICAgICAgaWYgKG9iai5fcHJvZ3Jlc3MpIHtcbiAgICAgICAgJC5leHRlbmQob2JqLl9wcm9ncmVzcywgcHJvZ3Jlc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqLl9wcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfaW5pdFJlc3BvbnNlT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICB2YXIgcHJvcDtcbiAgICAgIGlmIChvYmouX3Jlc3BvbnNlKSB7XG4gICAgICAgIGZvciAocHJvcCBpbiBvYmouX3Jlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmouX3Jlc3BvbnNlLCBwcm9wKSkge1xuICAgICAgICAgICAgZGVsZXRlIG9iai5fcmVzcG9uc2VbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmouX3Jlc3BvbnNlID0ge307XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9vblByb2dyZXNzOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3cgPyBEYXRlLm5vdygpIDogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgICAgbG9hZGVkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YS5fdGltZSAmJlxuICAgICAgICAgIGRhdGEucHJvZ3Jlc3NJbnRlcnZhbCAmJlxuICAgICAgICAgIG5vdyAtIGRhdGEuX3RpbWUgPCBkYXRhLnByb2dyZXNzSW50ZXJ2YWwgJiZcbiAgICAgICAgICBlLmxvYWRlZCAhPT0gZS50b3RhbFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5fdGltZSA9IG5vdztcbiAgICAgICAgbG9hZGVkID1cbiAgICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgICAgKGUubG9hZGVkIC8gZS50b3RhbCkgKiAoZGF0YS5jaHVua1NpemUgfHwgZGF0YS5fcHJvZ3Jlc3MudG90YWwpXG4gICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7XG4gICAgICAgIC8vIEFkZCB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBzdGF0ZVxuICAgICAgICAvLyB0byB0aGUgZ2xvYmFsIGxvYWRlZCBjb3VudGVyOlxuICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gbG9hZGVkIC0gZGF0YS5fcHJvZ3Jlc3MubG9hZGVkO1xuICAgICAgICB0aGlzLl9wcm9ncmVzcy5iaXRyYXRlID0gdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoXG4gICAgICAgICAgbm93LFxuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCxcbiAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbFxuICAgICAgICApO1xuICAgICAgICBkYXRhLl9wcm9ncmVzcy5sb2FkZWQgPSBkYXRhLmxvYWRlZCA9IGxvYWRlZDtcbiAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IGRhdGEuX2JpdHJhdGVUaW1lci5nZXRCaXRyYXRlKFxuICAgICAgICAgIG5vdyxcbiAgICAgICAgICBsb2FkZWQsXG4gICAgICAgICAgZGF0YS5iaXRyYXRlSW50ZXJ2YWxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gVHJpZ2dlciBhIGN1c3RvbSBwcm9ncmVzcyBldmVudCB3aXRoIGEgdG90YWwgZGF0YSBwcm9wZXJ0eSBzZXRcbiAgICAgICAgLy8gdG8gdGhlIGZpbGUgc2l6ZShzKSBvZiB0aGUgY3VycmVudCB1cGxvYWQgYW5kIGEgbG9hZGVkIGRhdGFcbiAgICAgICAgLy8gcHJvcGVydHkgY2FsY3VsYXRlZCBhY2NvcmRpbmdseTpcbiAgICAgICAgdGhpcy5fdHJpZ2dlcihcbiAgICAgICAgICAncHJvZ3Jlc3MnLFxuICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzJywgeyBkZWxlZ2F0ZWRFdmVudDogZSB9KSxcbiAgICAgICAgICBkYXRhXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRyaWdnZXIgYSBnbG9iYWwgcHJvZ3Jlc3MgZXZlbnQgZm9yIGFsbCBjdXJyZW50IGZpbGUgdXBsb2FkcyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIGFqYXggY2FsbHMgcXVldWVkIGZvciBzZXF1ZW50aWFsIGZpbGUgdXBsb2FkczpcbiAgICAgICAgdGhpcy5fdHJpZ2dlcihcbiAgICAgICAgICAncHJvZ3Jlc3NhbGwnLFxuICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzYWxsJywgeyBkZWxlZ2F0ZWRFdmVudDogZSB9KSxcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfaW5pdFByb2dyZXNzTGlzdGVuZXI6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgIHhociA9IG9wdGlvbnMueGhyID8gb3B0aW9ucy54aHIoKSA6ICQuYWpheFNldHRpbmdzLnhocigpO1xuICAgICAgLy8gQWNjZXNzIHRvIHRoZSBuYXRpdmUgWEhSIG9iamVjdCBpcyByZXF1aXJlZCB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDpcbiAgICAgIGlmICh4aHIudXBsb2FkKSB7XG4gICAgICAgICQoeGhyLnVwbG9hZCkub24oJ3Byb2dyZXNzJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgb2UgPSBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9ncmVzcyBldmVudCBwcm9wZXJ0aWVzIGdldCBjb3BpZWQgb3ZlcjpcbiAgICAgICAgICBlLmxlbmd0aENvbXB1dGFibGUgPSBvZS5sZW5ndGhDb21wdXRhYmxlO1xuICAgICAgICAgIGUubG9hZGVkID0gb2UubG9hZGVkO1xuICAgICAgICAgIGUudG90YWwgPSBvZS50b3RhbDtcbiAgICAgICAgICB0aGF0Ll9vblByb2dyZXNzKGUsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb3B0aW9ucy54aHIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHhocjtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2RlaW5pdFByb2dyZXNzTGlzdGVuZXI6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgPyBvcHRpb25zLnhocigpIDogJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICAkKHhoci51cGxvYWQpLm9mZigncHJvZ3Jlc3MnKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikge1xuICAgICAgLy8gQ3Jvc3MtZnJhbWUgaW5zdGFuY2VvZiBjaGVja1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgdHlwZSArICddJztcbiAgICB9LFxuXG4gICAgX2dldFVuaXF1ZUZpbGVuYW1lOiBmdW5jdGlvbiAobmFtZSwgbWFwKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIG5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgICBpZiAobWFwW25hbWVdKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFxuICAgICAgICAgIC8oPzogXFwoKFtcXGRdKylcXCkpPyhcXC5bXi5dKyk/JC8sXG4gICAgICAgICAgZnVuY3Rpb24gKF8sIHAxLCBwMikge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcDEgPyBOdW1iZXIocDEpICsgMSA6IDE7XG4gICAgICAgICAgICB2YXIgZXh0ID0gcDIgfHwgJyc7XG4gICAgICAgICAgICByZXR1cm4gJyAoJyArIGluZGV4ICsgJyknICsgZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFVuaXF1ZUZpbGVuYW1lKG5hbWUsIG1hcCk7XG4gICAgICB9XG4gICAgICBtYXBbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcblxuICAgIF9pbml0WEhSRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLFxuICAgICAgICAvLyBJZ25vcmUgbm9uLW11bHRpcGFydCBzZXR0aW5nIGlmIG5vdCBzdXBwb3J0ZWQ6XG4gICAgICAgIG11bHRpcGFydCA9IG9wdGlvbnMubXVsdGlwYXJ0IHx8ICEkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCxcbiAgICAgICAgcGFyYW1OYW1lID1cbiAgICAgICAgICAkLnR5cGUob3B0aW9ucy5wYXJhbU5hbWUpID09PSAnYXJyYXknXG4gICAgICAgICAgICA/IG9wdGlvbnMucGFyYW1OYW1lWzBdXG4gICAgICAgICAgICA6IG9wdGlvbnMucGFyYW1OYW1lO1xuICAgICAgb3B0aW9ucy5oZWFkZXJzID0gJC5leHRlbmQoe30sIG9wdGlvbnMuaGVhZGVycyk7XG4gICAgICBpZiAob3B0aW9ucy5jb250ZW50UmFuZ2UpIHtcbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTtcbiAgICAgIH1cbiAgICAgIGlmICghbXVsdGlwYXJ0IHx8IG9wdGlvbnMuYmxvYiB8fCAhdGhpcy5faXNJbnN0YW5jZU9mKCdGaWxlJywgZmlsZSkpIHtcbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LURpc3Bvc2l0aW9uJ10gPVxuICAgICAgICAgICdhdHRhY2htZW50OyBmaWxlbmFtZT1cIicgK1xuICAgICAgICAgIGVuY29kZVVSSShmaWxlLnVwbG9hZE5hbWUgfHwgZmlsZS5uYW1lKSArXG4gICAgICAgICAgJ1wiJztcbiAgICAgIH1cbiAgICAgIGlmICghbXVsdGlwYXJ0KSB7XG4gICAgICAgIG9wdGlvbnMuY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgIG9wdGlvbnMuZGF0YSA9IG9wdGlvbnMuYmxvYiB8fCBmaWxlO1xuICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7XG4gICAgICAgICAgLy8gd2luZG93LnBvc3RNZXNzYWdlIGRvZXMgbm90IGFsbG93IHNlbmRpbmcgRm9ybURhdGFcbiAgICAgICAgICAvLyBvYmplY3RzLCBzbyB3ZSBqdXN0IGFkZCB0aGUgRmlsZS9CbG9iIG9iamVjdHMgdG9cbiAgICAgICAgICAvLyB0aGUgZm9ybURhdGEgYXJyYXkgYW5kIGxldCB0aGUgcG9zdE1lc3NhZ2Ugd2luZG93XG4gICAgICAgICAgLy8gY3JlYXRlIHRoZSBGb3JtRGF0YSBvYmplY3Qgb3V0IG9mIHRoaXMgYXJyYXk6XG4gICAgICAgICAgZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogcGFyYW1OYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5ibG9iXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkge1xuICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOlxuICAgICAgICAgICAgICAgICAgKCQudHlwZShvcHRpb25zLnBhcmFtTmFtZSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fFxuICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWxlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0Zvcm1EYXRhJywgb3B0aW9ucy5mb3JtRGF0YSkpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhID0gb3B0aW9ucy5mb3JtRGF0YTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgICQuZWFjaCh0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKSwgZnVuY3Rpb24gKGluZGV4LCBmaWVsZCkge1xuICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoZmllbGQubmFtZSwgZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgICAgcGFyYW1OYW1lLFxuICAgICAgICAgICAgICBvcHRpb25zLmJsb2IsXG4gICAgICAgICAgICAgIGZpbGUudXBsb2FkTmFtZSB8fCBmaWxlLm5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBhbGxvd3MgdGhlIHRlc3RzIHRvIHJ1biB3aXRoXG4gICAgICAgICAgICAgIC8vIGR1bW15IG9iamVjdHM6XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fFxuICAgICAgICAgICAgICAgIHRoYXQuX2lzSW5zdGFuY2VPZignQmxvYicsIGZpbGUpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGZpbGUudXBsb2FkTmFtZSB8fCBmaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudW5pcXVlRmlsZW5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHRoYXQuX2dldFVuaXF1ZUZpbGVuYW1lKFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51bmlxdWVGaWxlbmFtZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICgkLnR5cGUob3B0aW9ucy5wYXJhbU5hbWUpID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lW2luZGV4XSkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLFxuICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgIGZpbGVOYW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuZGF0YSA9IGZvcm1EYXRhO1xuICAgICAgfVxuICAgICAgLy8gQmxvYiByZWZlcmVuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBmcmVlIG1lbW9yeTpcbiAgICAgIG9wdGlvbnMuYmxvYiA9IG51bGw7XG4gICAgfSxcblxuICAgIF9pbml0SWZyYW1lU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTtcbiAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIGlmcmFtZSBlbmFibGVzIHRoZSBpZnJhbWUgdHJhbnNwb3J0OlxuICAgICAgb3B0aW9ucy5kYXRhVHlwZSA9ICdpZnJhbWUgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTtcbiAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YTpcbiAgICAgIG9wdGlvbnMuZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTtcbiAgICAgIC8vIEFkZCByZWRpcmVjdCB1cmwgdG8gZm9ybSBkYXRhIG9uIGNyb3NzLWRvbWFpbiB1cGxvYWRzOlxuICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7XG4gICAgICAgIG9wdGlvbnMuZm9ybURhdGEucHVzaCh7XG4gICAgICAgICAgbmFtZTogb3B0aW9ucy5yZWRpcmVjdFBhcmFtTmFtZSB8fCAncmVkaXJlY3QnLFxuICAgICAgICAgIHZhbHVlOiBvcHRpb25zLnJlZGlyZWN0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfaW5pdERhdGFTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkge1xuICAgICAgICBpZiAoIXRoaXMuX2NodW5rZWRVcGxvYWQob3B0aW9ucywgdHJ1ZSkpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdFhIUkRhdGEob3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc0xpc3RlbmVyKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gcG9zdG1lc3NhZ2UgZW5hYmxlcyB0aGVcbiAgICAgICAgICAvLyBwb3N0TWVzc2FnZSB0cmFuc3BvcnQ6XG4gICAgICAgICAgb3B0aW9ucy5kYXRhVHlwZSA9ICdwb3N0bWVzc2FnZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbml0SWZyYW1lU2V0dGluZ3Mob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9nZXRQYXJhbU5hbWU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICB2YXIgZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCksXG4gICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lO1xuICAgICAgaWYgKCFwYXJhbU5hbWUpIHtcbiAgICAgICAgcGFyYW1OYW1lID0gW107XG4gICAgICAgIGZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgaW5wdXQgPSAkKHRoaXMpLFxuICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsXG4gICAgICAgICAgICBpID0gKGlucHV0LnByb3AoJ2ZpbGVzJykgfHwgWzFdKS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKGkpIHtcbiAgICAgICAgICAgIHBhcmFtTmFtZS5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcGFyYW1OYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHBhcmFtTmFtZSA9IFtmaWxlSW5wdXQucHJvcCgnbmFtZScpIHx8ICdmaWxlc1tdJ107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISQuaXNBcnJheShwYXJhbU5hbWUpKSB7XG4gICAgICAgIHBhcmFtTmFtZSA9IFtwYXJhbU5hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmFtTmFtZTtcbiAgICB9LFxuXG4gICAgX2luaXRGb3JtU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAvLyBSZXRyaWV2ZSBtaXNzaW5nIG9wdGlvbnMgZnJvbSB0aGUgaW5wdXQgZmllbGQgYW5kIHRoZVxuICAgICAgLy8gYXNzb2NpYXRlZCBmb3JtLCBpZiBhdmFpbGFibGU6XG4gICAgICBpZiAoIW9wdGlvbnMuZm9ybSB8fCAhb3B0aW9ucy5mb3JtLmxlbmd0aCkge1xuICAgICAgICBvcHRpb25zLmZvcm0gPSAkKG9wdGlvbnMuZmlsZUlucHV0LnByb3AoJ2Zvcm0nKSk7XG4gICAgICAgIC8vIElmIHRoZSBnaXZlbiBmaWxlIGlucHV0IGRvZXNuJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGZvcm0sXG4gICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCB3aWRnZXQgZmlsZSBpbnB1dCdzIGZvcm06XG4gICAgICAgIGlmICghb3B0aW9ucy5mb3JtLmxlbmd0aCkge1xuICAgICAgICAgIG9wdGlvbnMuZm9ybSA9ICQodGhpcy5vcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTtcbiAgICAgIGlmICghb3B0aW9ucy51cmwpIHtcbiAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLmZvcm0ucHJvcCgnYWN0aW9uJykgfHwgbG9jYXRpb24uaHJlZjtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIG11c3QgYmUgXCJQT1NUXCIgb3IgXCJQVVRcIjpcbiAgICAgIG9wdGlvbnMudHlwZSA9IChcbiAgICAgICAgb3B0aW9ucy50eXBlIHx8XG4gICAgICAgICgkLnR5cGUob3B0aW9ucy5mb3JtLnByb3AoJ21ldGhvZCcpKSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBvcHRpb25zLmZvcm0ucHJvcCgnbWV0aG9kJykpIHx8XG4gICAgICAgICcnXG4gICAgICApLnRvVXBwZXJDYXNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMudHlwZSAhPT0gJ1BPU1QnICYmXG4gICAgICAgIG9wdGlvbnMudHlwZSAhPT0gJ1BVVCcgJiZcbiAgICAgICAgb3B0aW9ucy50eXBlICE9PSAnUEFUQ0gnXG4gICAgICApIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KSB7XG4gICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2dldEFKQVhTZXR0aW5nczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7XG4gICAgICB0aGlzLl9pbml0Rm9ybVNldHRpbmdzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5faW5pdERhdGFTZXR0aW5ncyhvcHRpb25zKTtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH0sXG5cbiAgICAvLyBqUXVlcnkgMS42IGRvZXNuJ3QgcHJvdmlkZSAuc3RhdGUoKSxcbiAgICAvLyB3aGlsZSBqUXVlcnkgMS44KyByZW1vdmVkIC5pc1JlamVjdGVkKCkgYW5kIC5pc1Jlc29sdmVkKCk6XG4gICAgX2dldERlZmVycmVkU3RhdGU6IGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuICAgICAgaWYgKGRlZmVycmVkLnN0YXRlKSB7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5zdGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmVycmVkLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICByZXR1cm4gJ3Jlc29sdmVkJztcbiAgICAgIH1cbiAgICAgIGlmIChkZWZlcnJlZC5pc1JlamVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgIH0sXG5cbiAgICAvLyBNYXBzIGpxWEhSIGNhbGxiYWNrcyB0byB0aGUgZXF1aXZhbGVudFxuICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OlxuICAgIF9lbmhhbmNlUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgIHByb21pc2Uuc3VjY2VzcyA9IHByb21pc2UuZG9uZTtcbiAgICAgIHByb21pc2UuZXJyb3IgPSBwcm9taXNlLmZhaWw7XG4gICAgICBwcm9taXNlLmNvbXBsZXRlID0gcHJvbWlzZS5hbHdheXM7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuXG4gICAgLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGVuaGFuY2VkIHdpdGhcbiAgICAvLyB0aGUganFYSFIgbWV0aG9kcyBhYm9ydCwgc3VjY2VzcywgZXJyb3IgYW5kIGNvbXBsZXRlOlxuICAgIF9nZXRYSFJQcm9taXNlOiBmdW5jdGlvbiAocmVzb2x2ZU9yUmVqZWN0LCBjb250ZXh0LCBhcmdzKSB7XG4gICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpLFxuICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcy5vcHRpb25zLmNvbnRleHQgfHwgcHJvbWlzZTtcbiAgICAgIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IHRydWUpIHtcbiAgICAgICAgZGZkLnJlc29sdmVXaXRoKGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfSBlbHNlIGlmIChyZXNvbHZlT3JSZWplY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGRmZC5yZWplY3RXaXRoKGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZS5hYm9ydCA9IGRmZC5wcm9taXNlO1xuICAgICAgcmV0dXJuIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpO1xuICAgIH0sXG5cbiAgICAvLyBBZGRzIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gdGhlIGRhdGEgY2FsbGJhY2sgYXJndW1lbnQ6XG4gICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgZ2V0UHJvbWlzZSA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBhcmdzKS5wcm9taXNlKCk7XG4gICAgICAgIH07XG4gICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHtcbiAgICAgICAgaWYgKHJlc29sdmVGdW5jIHx8IHJlamVjdEZ1bmMpIHtcbiAgICAgICAgICBkYXRhLl9wcm9jZXNzUXVldWUgPSB0aGlzLl9wcm9jZXNzUXVldWUgPSAodGhpcy5fcHJvY2Vzc1F1ZXVlIHx8XG4gICAgICAgICAgICBnZXRQcm9taXNlKFt0aGlzXSkpXG4gICAgICAgICAgICBbdGhhdC5fcHJvbWlzZVBpcGVdKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGdldFByb21pc2UoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBbdGhhdC5fcHJvbWlzZVBpcGVdKHJlc29sdmVGdW5jLCByZWplY3RGdW5jKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKTtcbiAgICAgIH07XG4gICAgICBkYXRhLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUoKSAhPT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgZGF0YS5qcVhIUiA9IHRoaXMuanFYSFIgPVxuICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcihcbiAgICAgICAgICAgICAgJ3N1Ym1pdCcsXG4gICAgICAgICAgICAgICQuRXZlbnQoJ3N1Ym1pdCcsIHsgZGVsZWdhdGVkRXZlbnQ6IGUgfSksXG4gICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICkgIT09IGZhbHNlICYmIHRoYXQuX29uU2VuZChlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5qcVhIUiB8fCB0aGF0Ll9nZXRYSFJQcm9taXNlKCk7XG4gICAgICB9O1xuICAgICAgZGF0YS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuanFYSFIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5qcVhIUi5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXJyb3JUaHJvd24gPSAnYWJvcnQnO1xuICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsJywgbnVsbCwgdGhpcyk7XG4gICAgICAgIHJldHVybiB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlKTtcbiAgICAgIH07XG4gICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5qcVhIUikge1xuICAgICAgICAgIHJldHVybiB0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKHRoaXMuanFYSFIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUpIHtcbiAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZGF0YS5wcm9jZXNzaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICF0aGlzLmpxWEhSICYmXG4gICAgICAgICAgdGhpcy5fcHJvY2Vzc1F1ZXVlICYmXG4gICAgICAgICAgdGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpID09PSAncGVuZGluZydcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBkYXRhLnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICB9O1xuICAgICAgZGF0YS5yZXNwb25zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlO1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgLy8gUGFyc2VzIHRoZSBSYW5nZSBoZWFkZXIgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlXG4gICAgLy8gYW5kIHJldHVybnMgdGhlIHVwbG9hZGVkIGJ5dGVzOlxuICAgIF9nZXRVcGxvYWRlZEJ5dGVzOiBmdW5jdGlvbiAoanFYSFIpIHtcbiAgICAgIHZhciByYW5nZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdSYW5nZScpLFxuICAgICAgICBwYXJ0cyA9IHJhbmdlICYmIHJhbmdlLnNwbGl0KCctJyksXG4gICAgICAgIHVwcGVyQnl0ZXNQb3MgPSBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICYmIHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XG4gICAgICByZXR1cm4gdXBwZXJCeXRlc1BvcyAmJiB1cHBlckJ5dGVzUG9zICsgMTtcbiAgICB9LFxuXG4gICAgLy8gVXBsb2FkcyBhIGZpbGUgaW4gbXVsdGlwbGUsIHNlcXVlbnRpYWwgcmVxdWVzdHNcbiAgICAvLyBieSBzcGxpdHRpbmcgdGhlIGZpbGUgdXAgaW4gbXVsdGlwbGUgYmxvYiBjaHVua3MuXG4gICAgLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgb25seSB0ZXN0cyBpZiB0aGUgZmlsZVxuICAgIC8vIHNob3VsZCBiZSB1cGxvYWRlZCBpbiBjaHVua3MsIGJ1dCBkb2VzIG5vdCBpbnZva2UgYW55XG4gICAgLy8gdXBsb2FkIHJlcXVlc3RzOlxuICAgIF9jaHVua2VkVXBsb2FkOiBmdW5jdGlvbiAob3B0aW9ucywgdGVzdE9ubHkpIHtcbiAgICAgIG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG9wdGlvbnMudXBsb2FkZWRCeXRlcyB8fCAwO1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBmaWxlID0gb3B0aW9ucy5maWxlc1swXSxcbiAgICAgICAgZnMgPSBmaWxlLnNpemUsXG4gICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLFxuICAgICAgICBtY3MgPSBvcHRpb25zLm1heENodW5rU2l6ZSB8fCBmcyxcbiAgICAgICAgc2xpY2UgPSB0aGlzLl9ibG9iU2xpY2UsXG4gICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSxcbiAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksXG4gICAgICAgIGpxWEhSLFxuICAgICAgICB1cGxvYWQ7XG4gICAgICBpZiAoXG4gICAgICAgICEoXG4gICAgICAgICAgdGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykgJiZcbiAgICAgICAgICBzbGljZSAmJlxuICAgICAgICAgICh1YiB8fCAoJC50eXBlKG1jcykgPT09ICdmdW5jdGlvbicgPyBtY3Mob3B0aW9ucykgOiBtY3MpIDwgZnMpXG4gICAgICAgICkgfHxcbiAgICAgICAgb3B0aW9ucy5kYXRhXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRlc3RPbmx5KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHViID49IGZzKSB7XG4gICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIG9wdGlvbnMuY29udGV4dCwgW1xuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICBmaWxlLmVycm9yXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6XG4gICAgICB1cGxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6XG4gICAgICAgIHZhciBvID0gJC5leHRlbmQoe30sIG9wdGlvbnMpLFxuICAgICAgICAgIGN1cnJlbnRMb2FkZWQgPSBvLl9wcm9ncmVzcy5sb2FkZWQ7XG4gICAgICAgIG8uYmxvYiA9IHNsaWNlLmNhbGwoXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB1YixcbiAgICAgICAgICB1YiArICgkLnR5cGUobWNzKSA9PT0gJ2Z1bmN0aW9uJyA/IG1jcyhvKSA6IG1jcyksXG4gICAgICAgICAgZmlsZS50eXBlXG4gICAgICAgICk7XG4gICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZlxuICAgICAgICAvLyB3aWxsIGJlIGRlcmVmZXJlbmNlZCBhZnRlciBkYXRhIHByb2Nlc3Npbmc6XG4gICAgICAgIG8uY2h1bmtTaXplID0gby5ibG9iLnNpemU7XG4gICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6XG4gICAgICAgIG8uY29udGVudFJhbmdlID1cbiAgICAgICAgICAnYnl0ZXMgJyArIHViICsgJy0nICsgKHViICsgby5jaHVua1NpemUgLSAxKSArICcvJyArIGZzO1xuICAgICAgICAvLyBUcmlnZ2VyIGNodW5rYmVmb3Jlc2VuZCB0byBhbGxvdyBmb3JtIGRhdGEgdG8gYmUgdXBkYXRlZCBmb3IgdGhpcyBjaHVua1xuICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2JlZm9yZXNlbmQnLCBudWxsLCBvKTtcbiAgICAgICAgLy8gUHJvY2VzcyB0aGUgdXBsb2FkIGRhdGEgKHRoZSBibG9iIGFuZCBwb3RlbnRpYWwgZm9ybSBkYXRhKTpcbiAgICAgICAgdGhhdC5faW5pdFhIUkRhdGEobyk7XG4gICAgICAgIC8vIEFkZCBwcm9ncmVzcyBsaXN0ZW5lcnMgZm9yIHRoaXMgY2h1bmsgdXBsb2FkOlxuICAgICAgICB0aGF0Ll9pbml0UHJvZ3Jlc3NMaXN0ZW5lcihvKTtcbiAgICAgICAganFYSFIgPSAoXG4gICAgICAgICAgKHRoYXQuX3RyaWdnZXIoJ2NodW5rc2VuZCcsIG51bGwsIG8pICE9PSBmYWxzZSAmJiAkLmFqYXgobykpIHx8XG4gICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgby5jb250ZXh0KVxuICAgICAgICApXG4gICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpIHtcbiAgICAgICAgICAgIHViID0gdGhhdC5fZ2V0VXBsb2FkZWRCeXRlcyhqcVhIUikgfHwgdWIgKyBvLmNodW5rU2l6ZTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50XG4gICAgICAgICAgICAvLyB3aXRoIGxvYWRlZCBlcXVhbGluZyB0b3RhbCBoYXMgYmVlbiB0cmlnZ2VyZWRcbiAgICAgICAgICAgIC8vIGZvciB0aGlzIGNodW5rOlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkge1xuICAgICAgICAgICAgICB0aGF0Ll9vblByb2dyZXNzKFxuICAgICAgICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzJywge1xuICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsXG4gICAgICAgICAgICAgICAgICB0b3RhbDogdWIgLSBvLnVwbG9hZGVkQnl0ZXNcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBvXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvLnVwbG9hZGVkQnl0ZXMgPSB1YjtcbiAgICAgICAgICAgIG8ucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgICAgby50ZXh0U3RhdHVzID0gdGV4dFN0YXR1cztcbiAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjtcbiAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZG9uZScsIG51bGwsIG8pO1xuICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmthbHdheXMnLCBudWxsLCBvKTtcbiAgICAgICAgICAgIGlmICh1YiA8IGZzKSB7XG4gICAgICAgICAgICAgIC8vIEZpbGUgdXBsb2FkIG5vdCB5ZXQgY29tcGxldGUsXG4gICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6XG4gICAgICAgICAgICAgIHVwbG9hZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKG8uY29udGV4dCwgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjtcbiAgICAgICAgICAgIG8udGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XG4gICAgICAgICAgICBvLmVycm9yVGhyb3duID0gZXJyb3JUaHJvd247XG4gICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2ZhaWwnLCBudWxsLCBvKTtcbiAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rYWx3YXlzJywgbnVsbCwgbyk7XG4gICAgICAgICAgICBkZmQucmVqZWN0V2l0aChvLmNvbnRleHQsIFtqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd25dKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hbHdheXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhhdC5fZGVpbml0UHJvZ3Jlc3NMaXN0ZW5lcihvKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTtcbiAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpO1xuICAgICAgfTtcbiAgICAgIHVwbG9hZCgpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfSxcblxuICAgIF9iZWZvcmVTZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gMCkge1xuICAgICAgICAvLyB0aGUgc3RhcnQgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYW4gdXBsb2FkIHN0YXJ0c1xuICAgICAgICAvLyBhbmQgbm8gb3RoZXIgdXBsb2FkcyBhcmUgY3VycmVudGx5IHJ1bm5pbmcsXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6XG4gICAgICAgIHRoaXMuX3RyaWdnZXIoJ3N0YXJ0Jyk7XG4gICAgICAgIC8vIFNldCB0aW1lciBmb3IgZ2xvYmFsIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246XG4gICAgICAgIHRoaXMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGlzLl9CaXRyYXRlVGltZXIoKTtcbiAgICAgICAgLy8gUmVzZXQgdGhlIGdsb2JhbCBwcm9ncmVzcyB2YWx1ZXM6XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCA9IHRoaXMuX3Byb2dyZXNzLnRvdGFsID0gMDtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3MuYml0cmF0ZSA9IDA7XG4gICAgICB9XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRhaW5lciBvYmplY3RzIGZvciB0aGUgLnJlc3BvbnNlKCkgYW5kXG4gICAgICAvLyAucHJvZ3Jlc3MoKSBtZXRob2RzIG9uIHRoZSBkYXRhIG9iamVjdCBhcmUgYXZhaWxhYmxlXG4gICAgICAvLyBhbmQgcmVzZXQgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZTpcbiAgICAgIHRoaXMuX2luaXRSZXNwb25zZU9iamVjdChkYXRhKTtcbiAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdChkYXRhKTtcbiAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7XG4gICAgICBkYXRhLl9wcm9ncmVzcy50b3RhbCA9IGRhdGEudG90YWwgPSB0aGlzLl9nZXRUb3RhbChkYXRhLmZpbGVzKSB8fCAxO1xuICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IDA7XG4gICAgICB0aGlzLl9hY3RpdmUgKz0gMTtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGdsb2JhbCBwcm9ncmVzcyB2YWx1ZXM6XG4gICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gZGF0YS5sb2FkZWQ7XG4gICAgICB0aGlzLl9wcm9ncmVzcy50b3RhbCArPSBkYXRhLnRvdGFsO1xuICAgIH0sXG5cbiAgICBfb25Eb25lOiBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucykge1xuICAgICAgdmFyIHRvdGFsID0gb3B0aW9ucy5fcHJvZ3Jlc3MudG90YWwsXG4gICAgICAgIHJlc3BvbnNlID0gb3B0aW9ucy5fcmVzcG9uc2U7XG4gICAgICBpZiAob3B0aW9ucy5fcHJvZ3Jlc3MubG9hZGVkIDwgdG90YWwpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgbm8gZmluYWwgcHJvZ3Jlc3MgZXZlbnRcbiAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOlxuICAgICAgICB0aGlzLl9vblByb2dyZXNzKFxuICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzJywge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGxvYWRlZDogdG90YWwsXG4gICAgICAgICAgICB0b3RhbDogdG90YWxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXNwb25zZS5yZXN1bHQgPSBvcHRpb25zLnJlc3VsdCA9IHJlc3VsdDtcbiAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzO1xuICAgICAgcmVzcG9uc2UuanFYSFIgPSBvcHRpb25zLmpxWEhSID0ganFYSFI7XG4gICAgICB0aGlzLl90cmlnZ2VyKCdkb25lJywgbnVsbCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIF9vbkZhaWw6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpIHtcbiAgICAgIHZhciByZXNwb25zZSA9IG9wdGlvbnMuX3Jlc3BvbnNlO1xuICAgICAgaWYgKG9wdGlvbnMucmVjYWxjdWxhdGVQcm9ncmVzcykge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGZhaWxlZCAoZXJyb3Igb3IgYWJvcnQpIGZpbGUgdXBsb2FkIGZyb21cbiAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjpcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkIC09IG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZDtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3MudG90YWwgLT0gb3B0aW9ucy5fcHJvZ3Jlc3MudG90YWw7XG4gICAgICB9XG4gICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjtcbiAgICAgIHJlc3BvbnNlLnRleHRTdGF0dXMgPSBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzO1xuICAgICAgcmVzcG9uc2UuZXJyb3JUaHJvd24gPSBvcHRpb25zLmVycm9yVGhyb3duID0gZXJyb3JUaHJvd247XG4gICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIF9vbkFsd2F5czogZnVuY3Rpb24gKGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSb3JFcnJvciwgb3B0aW9ucykge1xuICAgICAgLy8ganFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cyBhbmQganFYSFJvckVycm9yIGFyZSBhZGRlZCB0byB0aGVcbiAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHZpYSBkb25lIGFuZCBmYWlsIGNhbGxiYWNrc1xuICAgICAgdGhpcy5fdHJpZ2dlcignYWx3YXlzJywgbnVsbCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIF9vblNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICBpZiAoIWRhdGEuc3VibWl0KSB7XG4gICAgICAgIHRoaXMuX2FkZENvbnZlbmllbmNlTWV0aG9kcyhlLCBkYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAganFYSFIsXG4gICAgICAgIGFib3J0ZWQsXG4gICAgICAgIHNsb3QsXG4gICAgICAgIHBpcGUsXG4gICAgICAgIG9wdGlvbnMgPSB0aGF0Ll9nZXRBSkFYU2V0dGluZ3MoZGF0YSksXG4gICAgICAgIHNlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhhdC5fc2VuZGluZyArPSAxO1xuICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgYml0cmF0ZSBwcm9ncmVzcyBjYWxjdWxhdGlvbjpcbiAgICAgICAgICBvcHRpb25zLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhhdC5fQml0cmF0ZVRpbWVyKCk7XG4gICAgICAgICAganFYSFIgPVxuICAgICAgICAgICAganFYSFIgfHxcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgKChhYm9ydGVkIHx8XG4gICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcihcbiAgICAgICAgICAgICAgICAgICdzZW5kJyxcbiAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3NlbmQnLCB7IGRlbGVnYXRlZEV2ZW50OiBlIH0pLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgICAgICkgPT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgICAgIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UsIG9wdGlvbnMuY29udGV4dCwgYWJvcnRlZCkpIHx8XG4gICAgICAgICAgICAgIHRoYXQuX2NodW5rZWRVcGxvYWQob3B0aW9ucykgfHxcbiAgICAgICAgICAgICAgJC5hamF4KG9wdGlvbnMpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5fb25Eb25lKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5fb25GYWlsKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5hbHdheXMoZnVuY3Rpb24gKGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSb3JFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoYXQuX2RlaW5pdFByb2dyZXNzTGlzdGVuZXIob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhhdC5fb25BbHdheXMoXG4gICAgICAgICAgICAgICAgICBqcVhIUm9yUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgdGV4dFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgIGpxWEhSb3JFcnJvcixcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTtcbiAgICAgICAgICAgICAgICB0aGF0Ll9hY3RpdmUgLT0gMTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgJiZcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IHRoYXQuX3NlbmRpbmdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXh0IHF1ZXVlZCB1cGxvYWQsXG4gICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBub3QgYmVlbiBhYm9ydGVkOlxuICAgICAgICAgICAgICAgICAgdmFyIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0U2xvdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fZ2V0RGVmZXJyZWRTdGF0ZShuZXh0U2xvdCkgPT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgIG5leHRTbG90LnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9hY3RpdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdG9wIGNhbGxiYWNrIGlzIHRyaWdnZXJlZCB3aGVuIGFsbCB1cGxvYWRzIGhhdmVcbiAgICAgICAgICAgICAgICAgIC8vIGJlZW4gY29tcGxldGVkLCBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0b3AgZXZlbnQ6XG4gICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdzdG9wJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ganFYSFI7XG4gICAgICAgIH07XG4gICAgICB0aGlzLl9iZWZvcmVTZW5kKGUsIG9wdGlvbnMpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHxcbiAgICAgICAgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzICYmXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPD0gdGhpcy5fc2VuZGluZylcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiAxKSB7XG4gICAgICAgICAgc2xvdCA9ICQuRGVmZXJyZWQoKTtcbiAgICAgICAgICB0aGlzLl9zbG90cy5wdXNoKHNsb3QpO1xuICAgICAgICAgIHBpcGUgPSBzbG90W3RoYXQuX3Byb21pc2VQaXBlXShzZW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlW3RoYXQuX3Byb21pc2VQaXBlXShzZW5kLCBzZW5kKTtcbiAgICAgICAgICBwaXBlID0gdGhpcy5fc2VxdWVuY2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsXG4gICAgICAgIC8vIHdoaWNoIGlzIGRlbGVnYXRlZCB0byB0aGUganFYSFIgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHVwbG9hZCxcbiAgICAgICAgLy8gYW5kIGpxWEhSIGNhbGxiYWNrcyBtYXBwZWQgdG8gdGhlIGVxdWl2YWxlbnQgUHJvbWlzZSBtZXRob2RzOlxuICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTtcbiAgICAgICAgICBpZiAoIWpxWEhSKSB7XG4gICAgICAgICAgICBpZiAoc2xvdCkge1xuICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VuZCgpO1xuICAgIH0sXG5cbiAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKSxcbiAgICAgICAgZmlsZXMgPSBkYXRhLmZpbGVzLFxuICAgICAgICBmaWxlc0xlbmd0aCA9IGZpbGVzLmxlbmd0aCxcbiAgICAgICAgbGltaXQgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkcyxcbiAgICAgICAgbGltaXRTaXplID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemUsXG4gICAgICAgIG92ZXJoZWFkID0gb3B0aW9ucy5saW1pdE11bHRpRmlsZVVwbG9hZFNpemVPdmVyaGVhZCxcbiAgICAgICAgYmF0Y2hTaXplID0gMCxcbiAgICAgICAgcGFyYW1OYW1lID0gdGhpcy5fZ2V0UGFyYW1OYW1lKG9wdGlvbnMpLFxuICAgICAgICBwYXJhbU5hbWVTZXQsXG4gICAgICAgIHBhcmFtTmFtZVNsaWNlLFxuICAgICAgICBmaWxlU2V0LFxuICAgICAgICBpLFxuICAgICAgICBqID0gMDtcbiAgICAgIGlmICghZmlsZXNMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGxpbWl0U2l6ZSAmJiBmaWxlc1swXS5zaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGltaXRTaXplID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhKG9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgfHwgbGltaXQgfHwgbGltaXRTaXplKSB8fFxuICAgICAgICAhdGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucylcbiAgICAgICkge1xuICAgICAgICBmaWxlU2V0ID0gW2ZpbGVzXTtcbiAgICAgICAgcGFyYW1OYW1lU2V0ID0gW3BhcmFtTmFtZV07XG4gICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdFNpemUpICYmIGxpbWl0KSB7XG4gICAgICAgIGZpbGVTZXQgPSBbXTtcbiAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlc0xlbmd0aDsgaSArPSBsaW1pdCkge1xuICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShpLCBpICsgbGltaXQpKTtcbiAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShpLCBpICsgbGltaXQpO1xuICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyYW1OYW1lU2V0LnB1c2gocGFyYW1OYW1lU2xpY2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0U2l6ZSkge1xuICAgICAgICBmaWxlU2V0ID0gW107XG4gICAgICAgIHBhcmFtTmFtZVNldCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXNMZW5ndGg7IGkgPSBpICsgMSkge1xuICAgICAgICAgIGJhdGNoU2l6ZSArPSBmaWxlc1tpXS5zaXplICsgb3ZlcmhlYWQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaSArIDEgPT09IGZpbGVzTGVuZ3RoIHx8XG4gICAgICAgICAgICBiYXRjaFNpemUgKyBmaWxlc1tpICsgMV0uc2l6ZSArIG92ZXJoZWFkID4gbGltaXRTaXplIHx8XG4gICAgICAgICAgICAobGltaXQgJiYgaSArIDEgLSBqID49IGxpbWl0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsZVNldC5wdXNoKGZpbGVzLnNsaWNlKGosIGkgKyAxKSk7XG4gICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShqLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoIXBhcmFtTmFtZVNsaWNlLmxlbmd0aCkge1xuICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmFtTmFtZVNldC5wdXNoKHBhcmFtTmFtZVNsaWNlKTtcbiAgICAgICAgICAgIGogPSBpICsgMTtcbiAgICAgICAgICAgIGJhdGNoU2l6ZSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7XG4gICAgICB9XG4gICAgICBkYXRhLm9yaWdpbmFsRmlsZXMgPSBmaWxlcztcbiAgICAgICQuZWFjaChmaWxlU2V0IHx8IGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIG5ld0RhdGEgPSAkLmV4dGVuZCh7fSwgZGF0YSk7XG4gICAgICAgIG5ld0RhdGEuZmlsZXMgPSBmaWxlU2V0ID8gZWxlbWVudCA6IFtlbGVtZW50XTtcbiAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdO1xuICAgICAgICB0aGF0Ll9pbml0UmVzcG9uc2VPYmplY3QobmV3RGF0YSk7XG4gICAgICAgIHRoYXQuX2luaXRQcm9ncmVzc09iamVjdChuZXdEYXRhKTtcbiAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpO1xuICAgICAgICByZXN1bHQgPSB0aGF0Ll90cmlnZ2VyKFxuICAgICAgICAgICdhZGQnLFxuICAgICAgICAgICQuRXZlbnQoJ2FkZCcsIHsgZGVsZWdhdGVkRXZlbnQ6IGUgfSksXG4gICAgICAgICAgbmV3RGF0YVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBfcmVwbGFjZUZpbGVJbnB1dDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBpbnB1dCA9IGRhdGEuZmlsZUlucHV0LFxuICAgICAgICBpbnB1dENsb25lID0gaW5wdXQuY2xvbmUodHJ1ZSksXG4gICAgICAgIHJlc3RvcmVGb2N1cyA9IGlucHV0LmlzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgLy8gQWRkIGEgcmVmZXJlbmNlIGZvciB0aGUgbmV3IGNsb25lZCBmaWxlIGlucHV0IHRvIHRoZSBkYXRhIGFyZ3VtZW50OlxuICAgICAgZGF0YS5maWxlSW5wdXRDbG9uZSA9IGlucHV0Q2xvbmU7XG4gICAgICAkKCc8Zm9ybT48L2Zvcm0+JykuYXBwZW5kKGlucHV0Q2xvbmUpWzBdLnJlc2V0KCk7XG4gICAgICAvLyBEZXRhY2hpbmcgYWxsb3dzIHRvIGluc2VydCB0aGUgZmlsZUlucHV0IG9uIGFub3RoZXIgZm9ybVxuICAgICAgLy8gd2l0aG91dCBsb3NpbmcgdGhlIGZpbGUgaW5wdXQgdmFsdWU6XG4gICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTtcbiAgICAgIC8vIElmIHRoZSBmaWxlSW5wdXQgaGFkIGZvY3VzIGJlZm9yZSBpdCB3YXMgZGV0YWNoZWQsXG4gICAgICAvLyByZXN0b3JlIGZvY3VzIHRvIHRoZSBpbnB1dENsb25lLlxuICAgICAgaWYgKHJlc3RvcmVGb2N1cykge1xuICAgICAgICBpbnB1dENsb25lLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBtZW1vcnkgbGVha3Mgd2l0aCB0aGUgZGV0YWNoZWQgZmlsZSBpbnB1dDpcbiAgICAgICQuY2xlYW5EYXRhKGlucHV0Lm9mZigncmVtb3ZlJykpO1xuICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXRcbiAgICAgIC8vIGVsZW1lbnRzIHNldCB3aXRoIHRoZSBjbG9uZSwgd2hpY2ggaGFzIGJlZW4gY29waWVkIGluY2x1ZGluZ1xuICAgICAgLy8gZXZlbnQgaGFuZGxlcnM6XG4gICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7XG4gICAgICAgIGlmIChlbCA9PT0gaW5wdXRbMF0pIHtcbiAgICAgICAgICByZXR1cm4gaW5wdXRDbG9uZVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9KTtcbiAgICAgIC8vIElmIHRoZSB3aWRnZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb24gdGhlIGZpbGUgaW5wdXQgaXRzZWxmLFxuICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6XG4gICAgICBpZiAoaW5wdXRbMF0gPT09IHRoaXMuZWxlbWVudFswXSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfaGFuZGxlRmlsZVRyZWVFbnRyeTogZnVuY3Rpb24gKGVudHJ5LCBwYXRoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSxcbiAgICAgICAgZW50cmllcyA9IFtdLFxuICAgICAgICBkaXJSZWFkZXIsXG4gICAgICAgIGVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgaWYgKGUgJiYgIWUuZW50cnkpIHtcbiAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lXG4gICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuXG4gICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXNcbiAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OlxuICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NIYW5kbGVyID0gZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgICAgICB0aGF0XG4gICAgICAgICAgICAuX2hhbmRsZUZpbGVUcmVlRW50cmllcyhlbnRyaWVzLCBwYXRoICsgZW50cnkubmFtZSArICcvJylcbiAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVhZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyKGVudHJpZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cmllcyA9IGVudHJpZXMuY29uY2F0KHJlc3VsdHMpO1xuICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7XG4gICAgICAgIH07XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIHBhdGggPSBwYXRoIHx8ICcnO1xuICAgICAgaWYgKGVudHJ5LmlzRmlsZSkge1xuICAgICAgICBpZiAoZW50cnkuX2ZpbGUpIHtcbiAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzVcbiAgICAgICAgICBlbnRyeS5fZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoO1xuICAgICAgICAgIGRmZC5yZXNvbHZlKGVudHJ5Ll9maWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICBmaWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7XG4gICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlKTtcbiAgICAgICAgICB9LCBlcnJvckhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpO1xuICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IGxpc3QgZm9yIGZpbGUgc3lzdGVtIGl0ZW1zXG4gICAgICAgIC8vIG90aGVyIHRoYW4gZmlsZXMgb3IgZGlyZWN0b3JpZXM6XG4gICAgICAgIGRmZC5yZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpO1xuICAgIH0sXG5cbiAgICBfaGFuZGxlRmlsZVRyZWVFbnRyaWVzOiBmdW5jdGlvbiAoZW50cmllcywgcGF0aCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgcmV0dXJuICQud2hlblxuICAgICAgICAuYXBwbHkoXG4gICAgICAgICAgJCxcbiAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGF0Ll9oYW5kbGVGaWxlVHJlZUVudHJ5KGVudHJ5LCBwYXRoKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIFt0aGlzLl9wcm9taXNlUGlwZV0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgX2dldERyb3BwZWRGaWxlczogZnVuY3Rpb24gKGRhdGFUcmFuc2Zlcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBkYXRhVHJhbnNmZXIgPSBkYXRhVHJhbnNmZXIgfHwge307XG4gICAgICB2YXIgaXRlbXMgPSBkYXRhVHJhbnNmZXIuaXRlbXM7XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW1zICYmXG4gICAgICAgIGl0ZW1zLmxlbmd0aCAmJlxuICAgICAgICAoaXRlbXNbMF0ud2Via2l0R2V0QXNFbnRyeSB8fCBpdGVtc1swXS5nZXRBc0VudHJ5KVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoXG4gICAgICAgICAgJC5tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgICAgICBpZiAoaXRlbS53ZWJraXRHZXRBc0VudHJ5KSB7XG4gICAgICAgICAgICAgIGVudHJ5ID0gaXRlbS53ZWJraXRHZXRBc0VudHJ5KCk7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNTpcbiAgICAgICAgICAgICAgICBlbnRyeS5fZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoJC5tYWtlQXJyYXkoZGF0YVRyYW5zZmVyLmZpbGVzKSkucHJvbWlzZSgpO1xuICAgIH0sXG5cbiAgICBfZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgZmlsZUlucHV0ID0gJChmaWxlSW5wdXQpO1xuICAgICAgdmFyIGVudHJpZXMgPSBmaWxlSW5wdXQucHJvcCgnZW50cmllcycpLFxuICAgICAgICBmaWxlcyxcbiAgICAgICAgdmFsdWU7XG4gICAgICBpZiAoZW50cmllcyAmJiBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKGVudHJpZXMpO1xuICAgICAgfVxuICAgICAgZmlsZXMgPSAkLm1ha2VBcnJheShmaWxlSW5wdXQucHJvcCgnZmlsZXMnKSk7XG4gICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICB2YWx1ZSA9IGZpbGVJbnB1dC5wcm9wKCd2YWx1ZScpO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKFtdKS5wcm9taXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGZpbGVzIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBicm93c2VyIGRvZXMgbm90XG4gICAgICAgIC8vIHN1cHBvcnQgdGhlIEZpbGUgQVBJIGFuZCB3ZSBhZGQgYSBwc2V1ZG8gRmlsZSBvYmplY3Qgd2l0aFxuICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgYXMgbmFtZSB3aXRoIHBhdGggaW5mb3JtYXRpb24gcmVtb3ZlZDpcbiAgICAgICAgZmlsZXMgPSBbeyBuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXFxcLywgJycpIH1dO1xuICAgICAgfSBlbHNlIGlmIChmaWxlc1swXS5uYW1lID09PSB1bmRlZmluZWQgJiYgZmlsZXNbMF0uZmlsZU5hbWUpIHtcbiAgICAgICAgLy8gRmlsZSBub3JtYWxpemF0aW9uIGZvciBTYWZhcmkgNCBhbmQgRmlyZWZveCAzOlxuICAgICAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkge1xuICAgICAgICAgIGZpbGUubmFtZSA9IGZpbGUuZmlsZU5hbWU7XG4gICAgICAgICAgZmlsZS5zaXplID0gZmlsZS5maWxlU2l6ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmUoZmlsZXMpLnByb21pc2UoKTtcbiAgICB9LFxuXG4gICAgX2dldEZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7XG4gICAgICBpZiAoIShmaWxlSW5wdXQgaW5zdGFuY2VvZiAkKSB8fCBmaWxlSW5wdXQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRTaW5nbGVGaWxlSW5wdXRGaWxlcyhmaWxlSW5wdXQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICQud2hlblxuICAgICAgICAuYXBwbHkoJCwgJC5tYXAoZmlsZUlucHV0LCB0aGlzLl9nZXRTaW5nbGVGaWxlSW5wdXRGaWxlcykpXG4gICAgICAgIFt0aGlzLl9wcm9taXNlUGlwZV0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgX29uQ2hhbmdlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIGZpbGVJbnB1dDogJChlLnRhcmdldCksXG4gICAgICAgICAgZm9ybTogJChlLnRhcmdldC5mb3JtKVxuICAgICAgICB9O1xuICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzO1xuICAgICAgICBpZiAodGhhdC5vcHRpb25zLnJlcGxhY2VGaWxlSW5wdXQpIHtcbiAgICAgICAgICB0aGF0Ll9yZXBsYWNlRmlsZUlucHV0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGF0Ll90cmlnZ2VyKFxuICAgICAgICAgICAgJ2NoYW5nZScsXG4gICAgICAgICAgICAkLkV2ZW50KCdjaGFuZ2UnLCB7IGRlbGVnYXRlZEV2ZW50OiBlIH0pLFxuICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICkgIT09IGZhbHNlXG4gICAgICAgICkge1xuICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgX29uUGFzdGU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaXRlbXMgPVxuICAgICAgICAgIGUub3JpZ2luYWxFdmVudCAmJlxuICAgICAgICAgIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmXG4gICAgICAgICAgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXMsXG4gICAgICAgIGRhdGEgPSB7IGZpbGVzOiBbXSB9O1xuICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAkLmVhY2goaXRlbXMsIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkge1xuICAgICAgICAgIHZhciBmaWxlID0gaXRlbS5nZXRBc0ZpbGUgJiYgaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgZGF0YS5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyKFxuICAgICAgICAgICAgJ3Bhc3RlJyxcbiAgICAgICAgICAgICQuRXZlbnQoJ3Bhc3RlJywgeyBkZWxlZ2F0ZWRFdmVudDogZSB9KSxcbiAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICApICE9PSBmYWxzZVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25Ecm9wOiBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5kYXRhVHJhbnNmZXIgPSBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2ZlcjtcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXIsXG4gICAgICAgIGRhdGEgPSB7fTtcbiAgICAgIGlmIChkYXRhVHJhbnNmZXIgJiYgZGF0YVRyYW5zZmVyLmZpbGVzICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9nZXREcm9wcGVkRmlsZXMoZGF0YVRyYW5zZmVyKS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoXG4gICAgICAgICAgICAgICdkcm9wJyxcbiAgICAgICAgICAgICAgJC5FdmVudCgnZHJvcCcsIHsgZGVsZWdhdGVkRXZlbnQ6IGUgfSksXG4gICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICkgIT09IGZhbHNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25EcmFnT3ZlcjogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdvdmVyJyksXG5cbiAgICBfb25EcmFnRW50ZXI6IGdldERyYWdIYW5kbGVyKCdkcmFnZW50ZXInKSxcblxuICAgIF9vbkRyYWdMZWF2ZTogZ2V0RHJhZ0hhbmRsZXIoJ2RyYWdsZWF2ZScpLFxuXG4gICAgX2luaXRFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5faXNYSFJVcGxvYWQodGhpcy5vcHRpb25zKSkge1xuICAgICAgICB0aGlzLl9vbih0aGlzLm9wdGlvbnMuZHJvcFpvbmUsIHtcbiAgICAgICAgICBkcmFnb3ZlcjogdGhpcy5fb25EcmFnT3ZlcixcbiAgICAgICAgICBkcm9wOiB0aGlzLl9vbkRyb3AsXG4gICAgICAgICAgLy8gZXZlbnQucHJldmVudERlZmF1bHQoKSBvbiBkcmFnZW50ZXIgaXMgcmVxdWlyZWQgZm9yIElFMTArOlxuICAgICAgICAgIGRyYWdlbnRlcjogdGhpcy5fb25EcmFnRW50ZXIsXG4gICAgICAgICAgLy8gZHJhZ2xlYXZlIGlzIG5vdCByZXF1aXJlZCwgYnV0IGFkZGVkIGZvciBjb21wbGV0ZW5lc3M6XG4gICAgICAgICAgZHJhZ2xlYXZlOiB0aGlzLl9vbkRyYWdMZWF2ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLnBhc3RlWm9uZSwge1xuICAgICAgICAgIHBhc3RlOiB0aGlzLl9vblBhc3RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCQuc3VwcG9ydC5maWxlSW5wdXQpIHtcbiAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVJbnB1dCwge1xuICAgICAgICAgIGNoYW5nZTogdGhpcy5fb25DaGFuZ2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgJ2RyYWdlbnRlciBkcmFnbGVhdmUgZHJhZ292ZXIgZHJvcCcpO1xuICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsICdwYXN0ZScpO1xuICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTtcbiAgICB9LFxuXG4gICAgX2Rlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lFdmVudEhhbmRsZXJzKCk7XG4gICAgfSxcblxuICAgIF9zZXRPcHRpb246IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTtcbiAgICAgIGlmIChyZWluaXQpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N1cGVyKGtleSwgdmFsdWUpO1xuICAgICAgaWYgKHJlaW5pdCkge1xuICAgICAgICB0aGlzLl9pbml0U3BlY2lhbE9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAob3B0aW9ucy5maWxlSW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXRbdHlwZT1cImZpbGVcIl0nKVxuICAgICAgICAgID8gdGhpcy5lbGVtZW50XG4gICAgICAgICAgOiB0aGlzLmVsZW1lbnQuZmluZCgnaW5wdXRbdHlwZT1cImZpbGVcIl0nKTtcbiAgICAgIH0gZWxzZSBpZiAoIShvcHRpb25zLmZpbGVJbnB1dCBpbnN0YW5jZW9mICQpKSB7XG4gICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ID0gJChvcHRpb25zLmZpbGVJbnB1dCk7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zLmRyb3Bab25lIGluc3RhbmNlb2YgJCkpIHtcbiAgICAgICAgb3B0aW9ucy5kcm9wWm9uZSA9ICQob3B0aW9ucy5kcm9wWm9uZSk7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zLnBhc3RlWm9uZSBpbnN0YW5jZW9mICQpKSB7XG4gICAgICAgIG9wdGlvbnMucGFzdGVab25lID0gJChvcHRpb25zLnBhc3RlWm9uZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIF9nZXRSZWdFeHA6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnLycpLFxuICAgICAgICBtb2RpZmllcnMgPSBwYXJ0cy5wb3AoKTtcbiAgICAgIHBhcnRzLnNoaWZ0KCk7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7XG4gICAgfSxcblxuICAgIF9pc1JlZ0V4cE9wdGlvbjogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGtleSAhPT0gJ3VybCcgJiZcbiAgICAgICAgJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgL15cXC8uKlxcL1tpZ21dezAsM30kLy50ZXN0KHZhbHVlKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkYXRhID0gdGhpcy5lbGVtZW50LmRhdGEoKTtcbiAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczpcbiAgICAgICQuZWFjaCh0aGlzLmVsZW1lbnRbMF0uYXR0cmlidXRlcywgZnVuY3Rpb24gKGluZGV4LCBhdHRyKSB7XG4gICAgICAgIHZhciBrZXkgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgaWYgKC9eZGF0YS0vLnRlc3Qoa2V5KSkge1xuICAgICAgICAgIC8vIENvbnZlcnQgaHlwaGVuLWF0ZWQga2V5IHRvIGNhbWVsQ2FzZTpcbiAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoNSkucmVwbGFjZSgvLVthLXpdL2csIGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgICAgICAgaWYgKHRoYXQuX2lzUmVnRXhwT3B0aW9uKGtleSwgdmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgX2NyZWF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5faW5pdERhdGFBdHRyaWJ1dGVzKCk7XG4gICAgICB0aGlzLl9pbml0U3BlY2lhbE9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Nsb3RzID0gW107XG4gICAgICB0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX2dldFhIUlByb21pc2UodHJ1ZSk7XG4gICAgICB0aGlzLl9zZW5kaW5nID0gdGhpcy5fYWN0aXZlID0gMDtcbiAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdCh0aGlzKTtcbiAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7XG4gICAgfSxcblxuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyB0byBxdWVyeVxuICAgIC8vIHRoZSBudW1iZXIgb2YgYWN0aXZlIHVwbG9hZHM6XG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH0sXG5cbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnlcbiAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy5cbiAgICAvLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGxvYWRlZCwgdG90YWwgYW5kIGJpdHJhdGUgcHJvcGVydGllc1xuICAgIC8vIGZvciB0aGUgcnVubmluZyB1cGxvYWRzOlxuICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgfSxcblxuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBhZGRpbmcgZmlsZXNcbiAgICAvLyB1c2luZyB0aGUgZmlsZXVwbG9hZCBBUEkuIFRoZSBkYXRhIHBhcmFtZXRlciBhY2NlcHRzIGFuIG9iamVjdCB3aGljaFxuICAgIC8vIG11c3QgaGF2ZSBhIGZpbGVzIHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gICAgLy8gLmZpbGV1cGxvYWQoJ2FkZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7XG4gICAgYWRkOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgaWYgKCFkYXRhIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHtcbiAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XG4gICAgICAgICAgdGhhdC5fb25BZGQobnVsbCwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpO1xuICAgICAgICB0aGlzLl9vbkFkZChudWxsLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHNlbmRpbmcgZmlsZXNcbiAgICAvLyB1c2luZyB0aGUgZmlsZXVwbG9hZCBBUEkuIFRoZSBkYXRhIHBhcmFtZXRlciBhY2NlcHRzIGFuIG9iamVjdCB3aGljaFxuICAgIC8vIG11c3QgaGF2ZSBhIGZpbGVzIG9yIGZpbGVJbnB1dCBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOlxuICAgIC8vIC5maWxldXBsb2FkKCdzZW5kJywge2ZpbGVzOiBmaWxlc0xpc3R9KTtcbiAgICAvLyBUaGUgbWV0aG9kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBmb3IgdGhlIGZpbGUgdXBsb2FkIGNhbGwuXG4gICAgc2VuZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlmIChkYXRhICYmICF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKGRhdGEuZmlsZUlucHV0ICYmICFkYXRhLmZpbGVzKSB7XG4gICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLFxuICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksXG4gICAgICAgICAgICBqcVhIUixcbiAgICAgICAgICAgIGFib3J0ZWQ7XG4gICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGpxWEhSKSB7XG4gICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGZkLnJlamVjdChudWxsLCAnYWJvcnQnLCAnYWJvcnQnKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHtcbiAgICAgICAgICAgIGlmIChhYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRmZC5yZWplY3QoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzO1xuICAgICAgICAgICAganFYSFIgPSB0aGF0Ll9vblNlbmQobnVsbCwgZGF0YSk7XG4gICAgICAgICAgICBqcVhIUi50aGVuKFxuICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikge1xuICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7XG4gICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKGZhbHNlLCBkYXRhICYmIGRhdGEuY29udGV4dCk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiLypcbiAqIGpRdWVyeSBJZnJhbWUgVHJhbnNwb3J0IFBsdWdpblxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkXG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICovXG5cbi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUgKi9cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOlxuICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBOb2RlL0NvbW1vbkpTOlxuICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFsczpcbiAgICBmYWN0b3J5KHdpbmRvdy5qUXVlcnkpO1xuICB9XG59KShmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gSGVscGVyIHZhcmlhYmxlIHRvIGNyZWF0ZSB1bmlxdWUgbmFtZXMgZm9yIHRoZSB0cmFuc3BvcnQgaWZyYW1lczpcbiAgdmFyIGNvdW50ZXIgPSAwLFxuICAgIGpzb25BUEkgPSAkLFxuICAgIGpzb25QYXJzZSA9ICdwYXJzZUpTT04nO1xuXG4gIGlmICgnSlNPTicgaW4gd2luZG93ICYmICdwYXJzZScgaW4gSlNPTikge1xuICAgIGpzb25BUEkgPSBKU09OO1xuICAgIGpzb25QYXJzZSA9ICdwYXJzZSc7XG4gIH1cblxuICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIGZvdXIgYWRkaXRpb25hbCBvcHRpb25zOlxuICAvLyBvcHRpb25zLmZpbGVJbnB1dDogYSBqUXVlcnkgY29sbGVjdGlvbiBvZiBmaWxlIGlucHV0IGZpZWxkc1xuICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsXG4gIC8vICBvdmVycmlkZXMgdGhlIG5hbWUgcHJvcGVydHkgb2YgdGhlIGZpbGUgaW5wdXQgZmllbGQocyksXG4gIC8vICBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsXG4gIC8vICBlcXVpdmFsZW50IHRvIHRoZSByZXR1cm4gZGF0YSBvZiAuc2VyaWFsaXplQXJyYXkoKSwgZS5nLjpcbiAgLy8gIFt7bmFtZTogJ2EnLCB2YWx1ZTogMX0sIHtuYW1lOiAnYicsIHZhbHVlOiAyfV1cbiAgLy8gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjOiB0aGUgVVJMIG9mIHRoZSBpbml0aWFsIGlmcmFtZSBzcmMsXG4gIC8vICBieSBkZWZhdWx0IHNldCB0byBcImphdmFzY3JpcHQ6ZmFsc2U7XCJcbiAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmFzeW5jKSB7XG4gICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGluaXRpYWwgaWZyYW1lIHNyY1xuICAgICAgLy8gcHJldmVudHMgd2FybmluZyBwb3B1cHMgb24gSFRUUFMgaW4gSUU2OlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNjcmlwdC11cmxcbiAgICAgIHZhciBpbml0aWFsSWZyYW1lU3JjID0gb3B0aW9ucy5pbml0aWFsSWZyYW1lU3JjIHx8ICdqYXZhc2NyaXB0OmZhbHNlOycsXG4gICAgICAgIGZvcm0sXG4gICAgICAgIGlmcmFtZSxcbiAgICAgICAgYWRkUGFyYW1DaGFyO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogZnVuY3Rpb24gKF8sIGNvbXBsZXRlQ2FsbGJhY2spIHtcbiAgICAgICAgICBmb3JtID0gJCgnPGZvcm0gc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+PC9mb3JtPicpO1xuICAgICAgICAgIGZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnLCBvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KTtcbiAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXFw/Ly50ZXN0KG9wdGlvbnMudXJsKSA/ICcmJyA6ICc/JztcbiAgICAgICAgICAvLyBYRG9tYWluUmVxdWVzdCBvbmx5IHN1cHBvcnRzIEdFVCBhbmQgUE9TVDpcbiAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSAnREVMRVRFJykge1xuICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPURFTEVURSc7XG4gICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdQVVQnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsICsgYWRkUGFyYW1DaGFyICsgJ19tZXRob2Q9UFVUJztcbiAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJztcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ1BBVENIJykge1xuICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJztcbiAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSUUgdmVyc2lvbnMgYmVsb3cgSUU4IGNhbm5vdCBzZXQgdGhlIG5hbWUgcHJvcGVydHkgb2ZcbiAgICAgICAgICAvLyBlbGVtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBET00sXG4gICAgICAgICAgLy8gc28gd2Ugc2V0IHRoZSBuYW1lIGFsb25nIHdpdGggdGhlIGlmcmFtZSBIVE1MIG1hcmt1cDpcbiAgICAgICAgICBjb3VudGVyICs9IDE7XG4gICAgICAgICAgaWZyYW1lID0gJChcbiAgICAgICAgICAgICc8aWZyYW1lIHNyYz1cIicgK1xuICAgICAgICAgICAgICBpbml0aWFsSWZyYW1lU3JjICtcbiAgICAgICAgICAgICAgJ1wiIG5hbWU9XCJpZnJhbWUtdHJhbnNwb3J0LScgK1xuICAgICAgICAgICAgICBjb3VudGVyICtcbiAgICAgICAgICAgICAgJ1wiPjwvaWZyYW1lPidcbiAgICAgICAgICApLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZpbGVJbnB1dENsb25lcyxcbiAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSlcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMucGFyYW1OYW1lXG4gICAgICAgICAgICAgICAgOiBbb3B0aW9ucy5wYXJhbU5hbWVdO1xuICAgICAgICAgICAgaWZyYW1lLm9mZignbG9hZCcpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgcmVzcG9uc2U7XG4gICAgICAgICAgICAgIC8vIFdyYXAgaW4gYSB0cnkvY2F0Y2ggYmxvY2sgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd25cbiAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIGNyb3NzLWRvbWFpbiBpZnJhbWUgY29udGVudHM6XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBpZnJhbWUuY29udGVudHMoKTtcbiAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lIGFuZCBGaXJlZm94IGRvIG5vdCB0aHJvdyBhblxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgaWZyYW1lLmNvbnRlbnRzKCkgb25cbiAgICAgICAgICAgICAgICAvLyBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNvIHdlIHVuaWZ5IHRoZSByZXNwb25zZTpcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmxlbmd0aCB8fCAhcmVzcG9uc2VbMF0uZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gVGhlIGNvbXBsZXRlIGNhbGxiYWNrIHJldHVybnMgdGhlXG4gICAgICAgICAgICAgIC8vIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlIG9iamVjdDpcbiAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjaygyMDAsICdzdWNjZXNzJywgeyBpZnJhbWU6IHJlc3BvbnNlIH0pO1xuICAgICAgICAgICAgICAvLyBGaXggZm9yIElFIGVuZGxlc3MgcHJvZ3Jlc3MgYmFyIGFjdGl2aXR5IGJ1Z1xuICAgICAgICAgICAgICAvLyAoaGFwcGVucyBvbiBmb3JtIHN1Ym1pdHMgdG8gaWZyYW1lIHRhcmdldHMpOlxuICAgICAgICAgICAgICAkKCc8aWZyYW1lIHNyYz1cIicgKyBpbml0aWFsSWZyYW1lU3JjICsgJ1wiPjwvaWZyYW1lPicpLmFwcGVuZFRvKFxuICAgICAgICAgICAgICAgIGZvcm1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92aW5nIHRoZSBmb3JtIGluIGEgc2V0VGltZW91dCBjYWxsXG4gICAgICAgICAgICAgICAgLy8gYWxsb3dzIENocm9tZSdzIGRldmVsb3BlciB0b29scyB0byBkaXNwbGF5XG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHJlc3VsdFxuICAgICAgICAgICAgICAgIGZvcm0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3JtXG4gICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKVxuICAgICAgICAgICAgICAucHJvcCgnYWN0aW9uJywgb3B0aW9ucy51cmwpXG4gICAgICAgICAgICAgIC5wcm9wKCdtZXRob2QnLCBvcHRpb25zLnR5cGUpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHtcbiAgICAgICAgICAgICAgICAkKCc8aW5wdXQgdHlwZT1cImhpZGRlblwiLz4nKVxuICAgICAgICAgICAgICAgICAgLnByb3AoJ25hbWUnLCBmaWVsZC5uYW1lKVxuICAgICAgICAgICAgICAgICAgLnZhbChmaWVsZC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhmb3JtKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0ICYmXG4gICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpbGVJbnB1dENsb25lcyA9IG9wdGlvbnMuZmlsZUlucHV0LmNsb25lKCk7XG4gICAgICAgICAgICAgIC8vIEluc2VydCBhIGNsb25lIGZvciBlYWNoIGZpbGUgaW5wdXQgZmllbGQ6XG4gICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmFmdGVyKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlSW5wdXRDbG9uZXNbaW5kZXhdO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgnbmFtZScsIHBhcmFtTmFtZXNbaW5kZXhdIHx8IG9wdGlvbnMucGFyYW1OYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBBcHBlbmRpbmcgdGhlIGZpbGUgaW5wdXQgZmllbGRzIHRvIHRoZSBoaWRkZW4gZm9ybVxuICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjpcbiAgICAgICAgICAgICAgZm9ybVxuICAgICAgICAgICAgICAgIC5hcHBlbmQob3B0aW9ucy5maWxlSW5wdXQpXG4gICAgICAgICAgICAgICAgLnByb3AoJ2VuY3R5cGUnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gICAgICAgICAgICAgICAgLy8gZW5jdHlwZSBtdXN0IGJlIHNldCBhcyBlbmNvZGluZyBmb3IgSUU6XG4gICAgICAgICAgICAgICAgLnByb3AoJ2VuY29kaW5nJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKTtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBIVE1MNSBmb3JtIGF0dHJpYnV0ZSBmcm9tIHRoZSBpbnB1dChzKTpcbiAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQucmVtb3ZlQXR0cignZm9ybScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAvLyBTdWJtaXR0aW5nIHRoZSBmb3JtIGluIGEgc2V0VGltZW91dCBjYWxsIGZpeGVzIGFuIGlzc3VlIHdpdGhcbiAgICAgICAgICAgICAgLy8gU2FmYXJpIDEzIG5vdCB0cmlnZ2VyaW5nIHRoZSBpZnJhbWUgbG9hZCBldmVudCBhZnRlciByZXNldHRpbmdcbiAgICAgICAgICAgICAgLy8gdGhlIGxvYWQgZXZlbnQgaGFuZGxlciwgc2VlIGFsc286XG4gICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZC9pc3N1ZXMvMzYzM1xuICAgICAgICAgICAgICBmb3JtLnN1Ym1pdCgpO1xuICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIGZpbGUgaW5wdXQgZmllbGRzIGF0IHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9uXG4gICAgICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0aGUgY2xvbmVzIHdpdGggdGhlIG9yaWdpbmFsczpcbiAgICAgICAgICAgICAgaWYgKGZpbGVJbnB1dENsb25lcyAmJiBmaWxlSW5wdXRDbG9uZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGlucHV0KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSAkKGZpbGVJbnB1dENsb25lc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgZm9ybSBwcm9wZXJ0aWVzOlxuICAgICAgICAgICAgICAgICAgJChpbnB1dClcbiAgICAgICAgICAgICAgICAgICAgLnByb3AoJ25hbWUnLCBjbG9uZS5wcm9wKCduYW1lJykpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdmb3JtJywgY2xvbmUuYXR0cignZm9ybScpKTtcbiAgICAgICAgICAgICAgICAgIGNsb25lLnJlcGxhY2VXaXRoKGlucHV0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9ybS5hcHBlbmQoaWZyYW1lKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaWZyYW1lKSB7XG4gICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICAvLyBhbmQgcHJldmVudHMgd2FybmluZyBwb3B1cHMgb24gSFRUUFMgaW4gSUU2LlxuICAgICAgICAgICAgaWZyYW1lLm9mZignbG9hZCcpLnByb3AoJ3NyYycsIGluaXRpYWxJZnJhbWVTcmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9KTtcblxuICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS5cbiAgLy8gVGhlIGZvbGxvd2luZyBhZGRzIGNvbnZlcnRlcnMgZnJvbSBpZnJhbWUgdG8gdGV4dCwganNvbiwgaHRtbCwgeG1sXG4gIC8vIGFuZCBzY3JpcHQuXG4gIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW5cbiAgLy8gb3IgdGV4dC9odG1sLCBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IGluY2x1ZGUgYXBwbGljYXRpb24vanNvbiBpbiB0aGVcbiAgLy8gQWNjZXB0IGhlYWRlciwgZWxzZSBJRSB3aWxsIHNob3cgYSBkb3dubG9hZCBkaWFsb2cuXG4gIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5c1xuICAvLyBhcHBsaWNhdGlvbi94bWwgb3IgdGV4dC94bWwsIHNvIElFIHByb3Blcmx5IHBhcnNlcyB0aGUgWE1MIHJlc3BvbnNlLlxuICAvLyBTZWUgYWxzb1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb25cbiAgJC5hamF4U2V0dXAoe1xuICAgIGNvbnZlcnRlcnM6IHtcbiAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCk7XG4gICAgICB9LFxuICAgICAgJ2lmcmFtZSBqc29uJzogZnVuY3Rpb24gKGlmcmFtZSkge1xuICAgICAgICByZXR1cm4gaWZyYW1lICYmIGpzb25BUElbanNvblBhcnNlXSgkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCkpO1xuICAgICAgfSxcbiAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkKGlmcmFtZVswXS5ib2R5KS5odG1sKCk7XG4gICAgICB9LFxuICAgICAgJ2lmcmFtZSB4bWwnOiBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICAgIHZhciB4bWxEb2MgPSBpZnJhbWUgJiYgaWZyYW1lWzBdO1xuICAgICAgICByZXR1cm4geG1sRG9jICYmICQuaXNYTUxEb2MoeG1sRG9jKVxuICAgICAgICAgID8geG1sRG9jXG4gICAgICAgICAgOiAkLnBhcnNlWE1MKFxuICAgICAgICAgICAgICAoeG1sRG9jLlhNTERvY3VtZW50ICYmIHhtbERvYy5YTUxEb2N1bWVudC54bWwpIHx8XG4gICAgICAgICAgICAgICAgJCh4bWxEb2MuYm9keSkuaHRtbCgpXG4gICAgICAgICAgICApO1xuICAgICAgfSxcbiAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkge1xuICAgICAgICByZXR1cm4gaWZyYW1lICYmICQuZ2xvYmFsRXZhbCgkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59KTtcbiIsInZhciBpbml0aWFsaXplZDtcclxudmFyIG1lZGlhQXBwO1xyXG5cclxudmFyIGJ1cyA9IG5ldyBWdWUoKTtcclxuXHJcbmZ1bmN0aW9uIGluaXRpYWxpemVNZWRpYUFwcGxpY2F0aW9uKGRpc3BsYXlNZWRpYUFwcGxpY2F0aW9uLCBtZWRpYUFwcGxpY2F0aW9uVXJsLCBwYXRoQmFzZSkge1xyXG5cclxuICAgIGlmIChpbml0aWFsaXplZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKCFtZWRpYUFwcGxpY2F0aW9uVXJsKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignbWVkaWFBcHBsaWNhdGlvblVybCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgICQuYWpheCh7XHJcbiAgICAgICAgdXJsOiBtZWRpYUFwcGxpY2F0aW9uVXJsLFxyXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgJCgnLnRhLWNvbnRlbnQnKS5hcHBlbmQoY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKCdtZWRpYWFwcGxpY2F0aW9uOnJlYWR5Jyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcm9vdCA9IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICQoJyN0LW1lZGlhTGlicmFyeScpLnRleHQoKSxcclxuICAgICAgICAgICAgICAgIHBhdGg6ICcnLFxyXG4gICAgICAgICAgICAgICAgZm9sZGVyOiAnJyxcclxuICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5OiB0cnVlXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBtZWRpYUFwcCA9IG5ldyBWdWUoe1xyXG4gICAgICAgICAgICAgICAgZWw6ICcjbWVkaWFBcHAnLFxyXG4gICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9sZGVyOiB7fSxcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYUl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1lZGlhczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBkcmFnRHJvcFRodW1ibmFpbDogbmV3IEltYWdlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgc21hbGxUaHVtYnM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRWaWV3OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYUZpbHRlcjogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgc29ydEJ5OiAnJyxcclxuICAgICAgICAgICAgICAgICAgICBzb3J0QXNjOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zSW5QYWdlOiBbXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZHJhZ0Ryb3BUaHVtYm5haWwuc3JjID0gKHBhdGhCYXNlIHx8ICcnKSArICcvT3JjaGFyZENvcmUuTWVkaWEvSW1hZ2VzL2RyYWctdGh1bWJuYWlsLnBuZyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ2ZvbGRlclNlbGVjdGVkJywgZnVuY3Rpb24gKGZvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkRm9sZGVyID0gZm9sZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdmb2xkZXJEZWxldGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdFJvb3QoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnVzLiRvbignZm9sZGVyQWRkZWQnLCBmdW5jdGlvbiAoZm9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRGb2xkZXIgPSBmb2xkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlci5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ21lZGlhTGlzdE1vdmVkJywgZnVuY3Rpb24gKGVycm9ySW5mbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRGb2xkZXIoc2VsZi5zZWxlY3RlZEZvbGRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckluZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLnB1c2goZXJyb3JJbmZvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdtZWRpYVJlbmFtZWQnLCBmdW5jdGlvbiAobmV3TmFtZSwgbmV3UGF0aCwgb2xkUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWEgPSBzZWxmLm1lZGlhSXRlbXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5tZWRpYVBhdGggPT09IG9sZFBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEubWVkaWFQYXRoID0gbmV3UGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEubmFtZSA9IG5ld05hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1cy4kb24oJ2NyZWF0ZUZvbGRlclJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZUZvbGRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdkZWxldGVGb2xkZXJSZXF1ZXN0ZWQnLCBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVGb2xkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29tbW9uIGhhbmRsZXJzIGZvciBhY3Rpb25zIGluIGJvdGggZ3JpZCBhbmQgdGFibGUgdmlldy5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdzb3J0Q2hhbmdlUmVxdWVzdGVkJywgZnVuY3Rpb24gKG5ld1NvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VTb3J0KG5ld1NvcnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdtZWRpYVRvZ2dsZVJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRvZ2dsZVNlbGVjdGlvbk9mTWVkaWEobWVkaWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdyZW5hbWVNZWRpYVJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmFtZU1lZGlhKG1lZGlhKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnVzLiRvbignZGVsZXRlTWVkaWFSZXF1ZXN0ZWQnLCBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVNZWRpYUl0ZW0obWVkaWEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdtZWRpYURyYWdTdGFydFJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZURyYWdTdGFydChtZWRpYSwgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGZvciBwYWdlciBldmVudHNcclxuICAgICAgICAgICAgICAgICAgICBidXMuJG9uKCdwYWdlckV2ZW50JywgZnVuY3Rpb24gKGl0ZW1zSW5QYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbXNJblBhZ2UgPSBpdGVtc0luUGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE1lZGlhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtZWRpYUFwcGxpY2F0aW9uUHJlZnMnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkRm9sZGVyID0gcm9vdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50UHJlZnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtZWRpYUFwcGxpY2F0aW9uUHJlZnMnKSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBpc0hvbWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGb2xkZXIgPT0gcm9vdDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVyID0gdGhpcy5zZWxlY3RlZEZvbGRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudEZvbGRlciAmJiBwYXJlbnRGb2xkZXIucGF0aCAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC51bnNoaWZ0KHBhcmVudEZvbGRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRGb2xkZXIgPSBwYXJlbnRGb2xkZXIucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkTWVkaWFJdGVtczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkTWVkaWFzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyZWQgPSBzZWxmLm1lZGlhSXRlbXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWxmLm1lZGlhRmlsdGVyLnRvTG93ZXJDYXNlKCkpID4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZi5zb3J0QnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NpemUnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29ydEFzYyA/IGEuc2l6ZSAtIGIuc2l6ZSA6IGIuc2l6ZSAtIGEuc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pbWUnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29ydEFzYyA/IGEubWltZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5taW1lLnRvTG93ZXJDYXNlKCkpIDogYi5taW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShhLm1pbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXN0TW9kaWZ5JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNvcnRBc2MgPyBhLmxhc3RNb2RpZnkgLSBiLmxhc3RNb2RpZnkgOiBiLmxhc3RNb2RpZnkgLSBhLmxhc3RNb2RpZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29ydEFzYyA/IGEubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5uYW1lLnRvTG93ZXJDYXNlKCkpIDogYi5uYW1lLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShhLm5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkNvdW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1lZGlhSXRlbXMubGVuZ3RoIC0gdGhpcy5maWx0ZXJlZE1lZGlhSXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGh1bWJTaXplOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNtYWxsVGh1bWJzID8gMTAwIDogMjQwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFByZWZzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbFRodW1iczogdGhpcy5zbWFsbFRodW1icyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZvbGRlcjogdGhpcy5zZWxlY3RlZEZvbGRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkVmlldzogdGhpcy5ncmlkVmlld1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV3UHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFsbFRodW1icyA9IG5ld1ByZWZzLnNtYWxsVGh1bWJzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlciA9IG5ld1ByZWZzLnNlbGVjdGVkRm9sZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkVmlldyA9IG5ld1ByZWZzLmdyaWRWaWV3O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHdhdGNoOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFByZWZzOiBmdW5jdGlvbiAobmV3UHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21lZGlhQXBwbGljYXRpb25QcmVmcycsIEpTT04uc3RyaW5naWZ5KG5ld1ByZWZzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZvbGRlcjogZnVuY3Rpb24gKG5ld0ZvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhRmlsdGVyID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXIgPSBuZXdGb2xkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZEZvbGRlcihuZXdGb2xkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucm9vdEZvbGRlci50b2dnbGUoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkVXJsOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsVmFsdWUgPSAkKCcjdXBsb2FkRmlsZXMnKS52YWwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmxWYWx1ZSArICh1cmxWYWx1ZS5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicpICsgXCJwYXRoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuc2VsZWN0ZWRGb2xkZXIucGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb290OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXIgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBsb2FkRm9sZGVyOiBmdW5jdGlvbiAoZm9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFVcmwgPSAkKCcjZ2V0TWVkaWFJdGVtc1VybCcpLnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmb2xkZXIucGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG1lZGlhVXJsICsgKG1lZGlhVXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJykgKyBcInBhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZm9sZGVyLnBhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVkaWFJdGVtcyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE1lZGlhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ydEJ5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3J0QXNjID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGxvYWRpbmcgZm9sZGVyOicgKyBmb2xkZXIucGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RSb290KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0QWxsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZpbHRlcmVkTWVkaWFJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcy5wdXNoKHRoaXMuZmlsdGVyZWRNZWRpYUl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgdW5TZWxlY3RBbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgaW52ZXJ0U2VsZWN0aW9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJlZE1lZGlhSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWVkaWFTZWxlY3RlZCh0aGlzLmZpbHRlcmVkTWVkaWFJdGVtc1tpXSkgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2godGhpcy5maWx0ZXJlZE1lZGlhSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYXMgPSB0ZW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWVkaWFTZWxlY3RlZChtZWRpYSkgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcy5zcGxpY2UodGhpcy5zZWxlY3RlZE1lZGlhcy5pbmRleE9mKG1lZGlhKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWFzLnB1c2gobWVkaWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBpc01lZGlhU2VsZWN0ZWQ6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5zZWxlY3RlZE1lZGlhcy5zb21lKGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCwgYXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnVybC50b0xvd2VyQ2FzZSgpID09PSBtZWRpYS51cmwudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGb2xkZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGRlciA9IHRoaXMuc2VsZWN0ZWRGb2xkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJvb3QgZm9sZGVyIGNhbid0IGJlIGRlbGV0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlciA9PSB0aGlzLnJvb3QubW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybURpYWxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4kKFwiI2RlbGV0ZUZvbGRlclwiKS5kYXRhKCksIGNhbGxiYWNrOiBmdW5jdGlvbiAocmVzcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoJyNkZWxldGVGb2xkZXJVcmwnKS52YWwoKSArIFwiP3BhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZm9sZGVyLnBhdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46ICQoXCJpbnB1dFtuYW1lPSdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiddXCIpLnZhbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ2RlbGV0ZUZvbGRlcicsIGZvbGRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlRm9sZGVyTW9kYWwtZXJyb3JzJykuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gYm9vdHN0cmFwLk1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoJCgnI2NyZWF0ZUZvbGRlck1vZGFsJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGVGb2xkZXJNb2RhbCAubW9kYWwtYm9keSBpbnB1dCcpLnZhbCgnJykuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbmFtZU1lZGlhOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlbmFtZU1lZGlhTW9kYWwtZXJyb3JzJykuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gYm9vdHN0cmFwLk1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoJCgnI3JlbmFtZU1lZGlhTW9kYWwnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnI29sZC1pdGVtLW5hbWUnKS52YWwobWVkaWEubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZW5hbWVNZWRpYU1vZGFsIC5tb2RhbC1ib2R5IGlucHV0JykudmFsKG1lZGlhLm5hbWUpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbmREZWxldGVNZWRpYTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlTWVkaWEoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZU1lZGlhTGlzdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFMaXN0ID0gdGhpcy5zZWxlY3RlZE1lZGlhcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhTGlzdC5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1EaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uJChcIiNkZWxldGVNZWRpYVwiKS5kYXRhKCksIGNhbGxiYWNrOiBmdW5jdGlvbiAocmVzcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXRocyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaChtZWRpYUxpc3RbaV0ubWVkaWFQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCgnI2RlbGV0ZU1lZGlhTGlzdFVybCcpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46ICQoXCJpbnB1dFtuYW1lPSdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiddXCIpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiBwYXRoc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlbGVjdGVkTWVkaWFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHNlbGYubWVkaWFJdGVtcyAmJiBzZWxmLm1lZGlhSXRlbXMuaW5kZXhPZihzZWxmLnNlbGVjdGVkTWVkaWFzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVkaWFJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzLiRlbWl0KCdtZWRpYURlbGV0ZWQnLCBzZWxmLnNlbGVjdGVkTWVkaWFzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkTWVkaWFzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZU1lZGlhSXRlbTogZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtRGlhbG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiQoXCIjZGVsZXRlTWVkaWFcIikuZGF0YSgpLCBjYWxsYmFjazogZnVuY3Rpb24gKHJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjZGVsZXRlTWVkaWFVcmwnKS52YWwoKSArIFwiP3BhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQobWVkaWEubWVkaWFQYXRoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiAkKFwiaW5wdXRbbmFtZT0nX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4nXVwiKS52YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc2VsZi5tZWRpYUl0ZW1zICYmIHNlbGYubWVkaWFJdGVtcy5pbmRleE9mKG1lZGlhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVkaWFJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhRGVsZXRlZCcsIG1lZGlhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zZWxmLnNlbGVjdGVkTWVkaWEgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVEcmFnU3RhcnQ6IGZ1bmN0aW9uIChtZWRpYSwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBwYXJ0IG9mIG1vdmUgbWVkaWEgdG8gZm9sZGVyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVwYXJlIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBmb2xkZXIgY29tcG9uZW50IG9uIGRyb3AgZXZlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lZGlhTmFtZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYU5hbWVzLnB1c2goaXRlbS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSB1c2VyIGRyYWdzIGFuIHVuc2VsZWN0ZWQgaXRlbSwgd2Ugc2VsZWN0IGl0IGZpcnN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWVkaWFTZWxlY3RlZChtZWRpYSkgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhTmFtZXMucHVzaChtZWRpYS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYXMucHVzaChtZWRpYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ21lZGlhTmFtZXMnLCBKU09OLnN0cmluZ2lmeShtZWRpYU5hbWVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3NvdXJjZUZvbGRlcicsIHRoaXMuc2VsZWN0ZWRGb2xkZXIucGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZSh0aGlzLmRyYWdEcm9wVGh1bWJuYWlsLCAxMCwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2Nyb2xsV2hpbGVEcmFnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5jbGllbnRZIDwgMTUwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgLTEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuY2xpZW50WSA+IHdpbmRvdy5pbm5lckhlaWdodCAtIDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbEJ5KDAsIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlU29ydDogZnVuY3Rpb24gKG5ld1NvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydEJ5ID09IG5ld1NvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydEFzYyA9ICF0aGlzLnNvcnRBc2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRBc2MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0QnkgPSBuZXdTb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoJyNjcmVhdGUtZm9sZGVyLW5hbWUnKS5rZXlwcmVzcyhmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGUud2hpY2g7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09IDEzKSB7ICAvLyB0aGUgZW50ZXIga2V5IGNvZGVcclxuICAgICAgICAgICAgICAgICAgICAkKCcjbW9kYWxGb290ZXJPaycpLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoJyNtb2RhbEZvb3Rlck9rJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gJCgnI2NyZWF0ZS1mb2xkZXItbmFtZScpLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjY3JlYXRlRm9sZGVyVXJsJykudmFsKCkgKyBcIj9wYXRoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG1lZGlhQXBwLnNlbGVjdGVkRm9sZGVyLnBhdGgpICsgXCImbmFtZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiAkKFwiaW5wdXRbbmFtZT0nX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4nXVwiKS52YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnVzLiRlbWl0KCdhZGRGb2xkZXInLCBtZWRpYUFwcC5zZWxlY3RlZEZvbGRlciwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IGJvb3RzdHJhcC5Nb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKCQoJyNjcmVhdGVGb2xkZXJNb2RhbCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWwuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlRm9sZGVyTW9kYWwtZXJyb3JzJykuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2VUZXh0KS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPjwvZGl2PicpLnRleHQoZXJyb3JNZXNzYWdlKS5hcHBlbmRUbygkKCcjY3JlYXRlRm9sZGVyTW9kYWwtZXJyb3JzJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoJyNyZW5hbWVNZWRpYU1vZGFsRm9vdGVyT2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5ld05hbWUgPSAkKCcjbmV3LWl0ZW0tbmFtZScpLnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9sZE5hbWUgPSAkKCcjb2xkLWl0ZW0tbmFtZScpLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50Rm9sZGVyID0gbWVkaWFBcHAuc2VsZWN0ZWRGb2xkZXIucGF0aCArIFwiL1wiO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb2xkZXIgPT09IFwiL1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEZvbGRlciA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIG5ld1BhdGggPSBjdXJyZW50Rm9sZGVyICsgbmV3TmFtZTtcclxuICAgICAgICAgICAgICAgIHZhciBvbGRQYXRoID0gY3VycmVudEZvbGRlciArIG9sZE5hbWU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1BhdGgudG9Mb3dlckNhc2UoKSA9PT0gb2xkUGF0aC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gYm9vdHN0cmFwLk1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoJCgnI3JlbmFtZU1lZGlhTW9kYWwnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogJCgnI3JlbmFtZU1lZGlhVXJsJykudmFsKCkgKyBcIj9vbGRQYXRoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9sZFBhdGgpICsgXCImbmV3UGF0aD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdQYXRoKSxcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuOiAkKFwiaW5wdXRbbmFtZT0nX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4nXVwiKS52YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gYm9vdHN0cmFwLk1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoJCgnI3JlbmFtZU1lZGlhTW9kYWwnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnVzLiRlbWl0KCdtZWRpYVJlbmFtZWQnLCBuZXdOYW1lLCBuZXdQYXRoLCBvbGRQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlbmFtZU1lZGlhTW9kYWwtZXJyb3JzJykuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2VUZXh0KS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPjwvZGl2PicpLnRleHQoZXJyb3JNZXNzYWdlKS5hcHBlbmRUbygkKCcjcmVuYW1lTWVkaWFNb2RhbC1lcnJvcnMnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRpc3BsYXlNZWRpYUFwcGxpY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWFBcHAnKS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcignbWVkaWFBcHA6cmVhZHknKTtcclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG4iLCIkKGRvY3VtZW50KS5vbignbWVkaWFBcHA6cmVhZHknLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgY2h1bmtlZEZpbGVVcGxvYWRJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XHJcblxyXG4gICAgJCgnI2ZpbGV1cGxvYWQnKVxyXG4gICAgICAgIC5maWxldXBsb2FkKHtcclxuICAgICAgICAgICAgZHJvcFpvbmU6ICQoJyNtZWRpYUFwcCcpLFxyXG4gICAgICAgICAgICBsaW1pdENvbmN1cnJlbnRVcGxvYWRzOiAyMCxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgdXJsOiAkKCcjdXBsb2FkRmlsZXMnKS52YWwoKSxcclxuICAgICAgICAgICAgbWF4Q2h1bmtTaXplOiBOdW1iZXIoJCgnI21heFVwbG9hZENodW5rU2l6ZScpLnZhbCgpIHx8IDApLFxyXG4gICAgICAgICAgICBmb3JtRGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFudGlGb3JnZXJ5VG9rZW4gPSAkKFwiaW5wdXRbbmFtZT1fX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbl1cIikudmFsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdwYXRoJywgdmFsdWU6IG1lZGlhQXBwLnNlbGVjdGVkRm9sZGVyLnBhdGggfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbicsIHZhbHVlOiBhbnRpRm9yZ2VyeVRva2VuIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnX19jaHVua2VkRmlsZVVwbG9hZElkJywgdmFsdWU6IGNodW5rZWRGaWxlVXBsb2FkSWQgfSxcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLnJlc3VsdC5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBwLm1lZGlhSXRlbXMucHVzaChmaWxlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAub24oJ2ZpbGV1cGxvYWRjaHVua2JlZm9yZXNlbmQnLCAoZSwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF07XHJcbiAgICAgICAgICAgIC8vIEhlcmUgd2UgcmVwbGFjZSB0aGUgYmxvYiB3aXRoIGEgRmlsZSBvYmplY3QgdG8gZW5zdXJlIHRoZSBmaWxlIG5hbWUgYW5kIG90aGVycyBhcmUgcHJlc2VydmVkIGZvciB0aGUgYmFja2VuZC5cclxuICAgICAgICAgICAgb3B0aW9ucy5ibG9iID0gbmV3IEZpbGUoXHJcbiAgICAgICAgICAgICAgICBbb3B0aW9ucy5ibG9iXSxcclxuICAgICAgICAgICAgICAgIGZpbGUubmFtZSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG59KTtcclxuXHJcblxyXG4kKGRvY3VtZW50KS5iaW5kKCdkcmFnb3ZlcicsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICB2YXIgZHQgPSBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyO1xyXG4gICAgaWYgKGR0LnR5cGVzICYmIChkdC50eXBlcy5pbmRleE9mID8gZHQudHlwZXMuaW5kZXhPZignRmlsZXMnKSAhPSAtMSA6IGR0LnR5cGVzLmNvbnRhaW5zKCdGaWxlcycpKSkge1xyXG4gICAgICAgIHZhciBkcm9wWm9uZSA9ICQoJyNjdXN0b21kcm9wem9uZScpLFxyXG4gICAgICAgICAgICB0aW1lb3V0ID0gd2luZG93LmRyb3Bab25lVGltZW91dDtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHJvcFpvbmUuYWRkQ2xhc3MoJ2luJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBob3ZlcmVkRHJvcFpvbmUgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KGRyb3Bab25lKTtcclxuICAgICAgICB3aW5kb3cuZHJvcFpvbmVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5kcm9wWm9uZVRpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgICAgICBkcm9wWm9uZS5yZW1vdmVDbGFzcygnaW4nKTtcclxuICAgICAgICB9LCAxMDApO1xyXG4gICAgfSAgICBcclxufSk7IiwiLy8gPGZvbGRlcj4gY29tcG9uZW50XHJcblZ1ZS5jb21wb25lbnQoJ2ZvbGRlcicsIHtcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPGxpIDpjbGFzcz1cIntzZWxlY3RlZDogaXNTZWxlY3RlZH1cIiBcclxuICAgICAgICAgICAgICAgIHYtb246ZHJhZ2xlYXZlLnByZXZlbnQgPSBcImhhbmRsZURyYWdMZWF2ZSgkZXZlbnQpO1wiIFxyXG4gICAgICAgICAgICAgICAgdi1vbjpkcmFnb3Zlci5wcmV2ZW50LnN0b3A9XCJoYW5kbGVEcmFnT3ZlcigkZXZlbnQpO1wiIFxyXG4gICAgICAgICAgICAgICAgdi1vbjpkcm9wLnByZXZlbnQuc3RvcCA9IFwibW92ZU1lZGlhVG9Gb2xkZXIobW9kZWwsICRldmVudClcIiA+XHJcbiAgICAgICAgICAgIDxkaXYgOmNsYXNzPVwie2ZvbGRlcmhvdmVyZWQ6IGlzSG92ZXJlZCAsIHRyZWVyb290OiBsZXZlbCA9PSAxfVwiID5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiA6c3R5bGU9XCJ7IHBhZGRpbmcke2RvY3VtZW50LmRpciA9PSBcImx0clwiID8gXCJMZWZ0XCIgOiBcIlJpZ2h0XCJ9OnBhZGRpbmcgKyAncHgnIH1cIiB2LW9uOmNsaWNrPVwic2VsZWN0XCIgIGRyYWdnYWJsZT1cImZhbHNlXCIgY2xhc3M9XCJmb2xkZXItbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIHYtb246Y2xpY2suc3RvcD1cInRvZ2dsZVwiIGNsYXNzPVwiZXhwYW5kXCIgOmNsYXNzPVwie29wZW5lZDogb3BlbiwgY2xvc2VkOiAhb3BlbiwgZW1wdHk6IGVtcHR5fVwiPjxpIHYtaWY9XCJvcGVuXCIgY2xhc3M9XCJmYS1zb2xpZCBmYS1jaGV2cm9uLSR7ZG9jdW1lbnQuZGlyID09IFwibHRyXCIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIn1cIj48L2k+PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbGRlci1uYW1lIG1zLTJcIj57e21vZGVsLm5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZm9sZGVyLWFjdGlvbnNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB2LWNsb2FrIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cImJ0biBidG4tc21cIiB2LW9uOmNsaWNrPVwiY3JlYXRlRm9sZGVyXCIgdi1pZj1cImlzU2VsZWN0ZWQgfHwgaXNSb290XCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1wbHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHYtY2xvYWsgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHYtb246Y2xpY2s9XCJkZWxldGVGb2xkZXJcIiB2LWlmPVwiaXNTZWxlY3RlZCAmJiAhaXNSb290XCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS10cmFzaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8b2wgdi1zaG93PVwib3BlblwiPlxyXG4gICAgICAgICAgICAgICAgPGZvbGRlciB2LWZvcj1cImZvbGRlciBpbiBjaGlsZHJlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDprZXk9XCJmb2xkZXIucGF0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDptb2RlbD1cImZvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDpzZWxlY3RlZC1pbi1tZWRpYS1hcHA9XCJzZWxlY3RlZEluTWVkaWFBcHBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6bGV2ZWw9XCJsZXZlbCArIDFcIj5cclxuICAgICAgICAgICAgICAgIDwvZm9sZGVyPlxyXG4gICAgICAgICAgICA8L29sPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgICAgYCxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgbW9kZWw6IE9iamVjdCxcclxuICAgICAgICBzZWxlY3RlZEluTWVkaWFBcHA6IE9iamVjdCxcclxuICAgICAgICBsZXZlbDogTnVtYmVyXHJcbiAgICB9LFxyXG4gICAgZGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9wZW46IGZhbHNlLFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogbnVsbCwgLy8gbm90IGluaXRpYWxpemVkIHN0YXRlIChmb3IgbGF6eS1sb2FkaW5nKVxyXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIGlzSG92ZXJlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IDBcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICBlbXB0eTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuY2hpbGRyZW4gfHwgdGhpcy5jaGlsZHJlbi5sZW5ndGggPT0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzU2VsZWN0ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnNlbGVjdGVkSW5NZWRpYUFwcC5uYW1lID09IHRoaXMubW9kZWwubmFtZSkgJiYgKHRoaXMuc2VsZWN0ZWRJbk1lZGlhQXBwLnBhdGggPT0gdGhpcy5tb2RlbC5wYXRoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzUm9vdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5wYXRoID09PSAnJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICgodGhpcy5pc1Jvb3QgPT0gZmFsc2UpICYmICh0aGlzLmlzQW5jZXN0b3JPZlNlbGVjdGVkRm9sZGVyKCkpKXtcclxuICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFkZGluZyA9IHRoaXMubGV2ZWwgPCAzID8gIDE2IDogMTYgKyAodGhpcy5sZXZlbCAqIDgpO1xyXG4gICAgfSxcclxuICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgYnVzLiRvbignZGVsZXRlRm9sZGVyJywgZnVuY3Rpb24gKGZvbGRlcikge1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc2VsZi5jaGlsZHJlbiAmJiBzZWxmLmNoaWxkcmVuLmluZGV4T2YoZm9sZGVyKVxyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ2ZvbGRlckRlbGV0ZWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBidXMuJG9uKCdhZGRGb2xkZXInLCBmdW5jdGlvbiAodGFyZ2V0LCBmb2xkZXIpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGYubW9kZWwgPT0gdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGlsZHJlbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4ucHVzaChmb2xkZXIpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGZvbGRlci5wYXJlbnQgPSBzZWxmLm1vZGVsO1xyXG4gICAgICAgICAgICAgICAgYnVzLiRlbWl0KCdmb2xkZXJBZGRlZCcsIGZvbGRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgaXNBbmNlc3Rvck9mU2VsZWN0ZWRGb2xkZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcGFyZW50Rm9sZGVyID0gbWVkaWFBcHAuc2VsZWN0ZWRGb2xkZXI7XHJcbiAgICAgICAgICAgIHdoaWxlIChwYXJlbnRGb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRGb2xkZXIucGF0aCA9PSB0aGlzLm1vZGVsLnBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50Rm9sZGVyID0gcGFyZW50Rm9sZGVyLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW4gJiYgIXRoaXMuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZENoaWxkcmVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlbGVjdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ2ZvbGRlclNlbGVjdGVkJywgdGhpcy5tb2RlbCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZENoaWxkcmVuKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjcmVhdGVGb2xkZXI6IGZ1bmN0aW9uICgpIHsgICAgICAgICAgIFxyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ2NyZWF0ZUZvbGRlclJlcXVlc3RlZCcpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVsZXRlRm9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGJ1cy4kZW1pdCgnZGVsZXRlRm9sZGVyUmVxdWVzdGVkJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkQ2hpbGRyZW46IGZ1bmN0aW9uICgpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICQoJyNnZXRGb2xkZXJzVXJsJykudmFsKCkgKyBcIj9wYXRoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHNlbGYubW9kZWwucGF0aCksXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy5wYXJlbnQgPSBzZWxmLm1vZGVsO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbXRweSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBoYW5kbGVEcmFnT3ZlcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0hvdmVyZWQgPSB0cnVlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGFuZGxlRHJhZ0xlYXZlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzSG92ZXJlZCA9IGZhbHNlOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbW92ZU1lZGlhVG9Gb2xkZXI6IGZ1bmN0aW9uIChmb2xkZXIsIGUpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgc2VsZi5pc0hvdmVyZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHZhciBtZWRpYU5hbWVzID0gSlNPTi5wYXJzZShlLmRhdGFUcmFuc2Zlci5nZXREYXRhKCdtZWRpYU5hbWVzJykpOyBcclxuXHJcbiAgICAgICAgICAgIGlmIChtZWRpYU5hbWVzLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNvdXJjZUZvbGRlciA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3NvdXJjZUZvbGRlcicpO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0Rm9sZGVyID0gZm9sZGVyLnBhdGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoc291cmNlRm9sZGVyID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgc291cmNlRm9sZGVyID0gJ3Jvb3QnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0Rm9sZGVyID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Rm9sZGVyID0gJ3Jvb3QnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc291cmNlRm9sZGVyID09PSB0YXJnZXRGb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCQoJyNzYW1lRm9sZGVyTWVzc2FnZScpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uZmlybURpYWxvZyh7Li4uJChcIiNtb3ZlTWVkaWFcIikuZGF0YSgpLCBjYWxsYmFjazogZnVuY3Rpb24gKHJlc3ApIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjbW92ZU1lZGlhTGlzdFVybCcpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW46ICQoXCJpbnB1dFtuYW1lPSdfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiddXCIpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFOYW1lczogbWVkaWFOYW1lcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZvbGRlcjogc291cmNlRm9sZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Rm9sZGVyOiB0YXJnZXRGb2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzLiRlbWl0KCdtZWRpYUxpc3RNb3ZlZCcpOyAvLyBNZWRpYUFwcCB3aWxsIGxpc3RlbiB0byB0aGlzLCBhbmQgdGhlbiBpdCB3aWxsIHJlbG9hZCBwYWdlIHNvIHRoZSBtb3ZlZCBtZWRpYXMgd29uJ3QgYmUgdGhlcmUgYW55bW9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhTGlzdE1vdmVkJywgZXJyb3IucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSk7XHJcbiIsIi8vIDxtZWRpYS1pdGVtcy1ncmlkPiBjb21wb25lbnRcclxuVnVlLmNvbXBvbmVudCgnbWVkaWEtaXRlbXMtZ3JpZCcsIHtcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPG9sIGNsYXNzPVwicm93IG1lZGlhLWl0ZW1zLWdyaWRcIj5cclxuICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cIm1lZGlhIGluIGZpbHRlcmVkTWVkaWFJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgOmtleT1cIm1lZGlhLm5hbWVcIiBcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1lZGlhLWl0ZW0gbWVkaWEtY29udGFpbmVyLW1haW4tbGlzdC1pdGVtIGNhcmQgcC0wXCJcclxuICAgICAgICAgICAgICAgICAgICA6c3R5bGU9XCJ7d2lkdGg6IHRodW1iU2l6ZSArIDIgKyAncHgnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwie3NlbGVjdGVkOiBpc01lZGlhU2VsZWN0ZWQobWVkaWEpfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdi1vbjpjbGljay5zdG9wPVwidG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYShtZWRpYSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIiB2LW9uOmRyYWdzdGFydD1cImRyYWdTdGFydChtZWRpYSwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aHVtYi1jb250YWluZXJcIiA6c3R5bGU9XCJ7aGVpZ2h0OiB0aHVtYlNpemUgKydweCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgdi1pZj1cIm1lZGlhLm1pbWUuc3RhcnRzV2l0aCgnaW1hZ2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNyYz1cImJ1aWxkTWVkaWFVcmwobWVkaWEudXJsLCB0aHVtYlNpemUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZGF0YS1taW1lPVwibWVkaWEubWltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnN0eWxlPVwie21heEhlaWdodDogdGh1bWJTaXplICsncHgnLCBtYXhXaWR0aDogdGh1bWJTaXplICsncHgnfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIHYtZWxzZSBjbGFzcz1cImZhLXJlZ3VsYXIgZmEtZmlsZSBkaXNwbGF5LTFcIiA6ZGF0YS1taW1lPVwibWVkaWEubWltZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1jb250YWluZXItbWFpbi1pdGVtLXRpdGxlIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbG9hdC1lbmQgaW5saW5lLW1lZGlhLWJ1dHRvbiBlZGl0LWJ1dHRvblwiIHYtb246Y2xpY2suc3RvcD1cInJlbmFtZU1lZGlhKG1lZGlhKVwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtZWRpdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsb2F0LWVuZCBpbmxpbmUtbWVkaWEtYnV0dG9uIGRlbGV0ZS1idXR0b25cIiB2LW9uOmNsaWNrLnN0b3A9XCJkZWxldGVNZWRpYShtZWRpYSlcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgOmhyZWY9XCJtZWRpYS51cmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsb2F0LWVuZCBpbmxpbmUtbWVkaWEtYnV0dG9uIHZpZXctYnV0dG9uXCJcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLWRvd25sb2FkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZWRpYS1maWxlbmFtZSBjYXJkLXRleHQgc21hbGxcIiA6dGl0bGU9XCJtZWRpYS5uYW1lXCI+e3sgbWVkaWEubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvb2w+XHJcbiAgICAgICAgYCxcclxuICAgIGRhdGE6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBUOiB7fVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIGZpbHRlcmVkTWVkaWFJdGVtczogQXJyYXksXHJcbiAgICAgICAgc2VsZWN0ZWRNZWRpYXM6IEFycmF5LFxyXG4gICAgICAgIHRodW1iU2l6ZTogTnVtYmVyXHJcbiAgICB9LFxyXG4gICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAvLyByZXRyaWV2aW5nIGxvY2FsaXplZCBzdHJpbmdzIGZyb20gdmlld1xyXG4gICAgICAgIHNlbGYuVC5lZGl0QnV0dG9uID0gJCgnI3QtZWRpdC1idXR0b24nKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQuZGVsZXRlQnV0dG9uID0gJCgnI3QtZGVsZXRlLWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgfSxcclxuICAgIG1ldGhvZHM6IHtcclxuICAgICAgICBpc01lZGlhU2VsZWN0ZWQ6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5zZWxlY3RlZE1lZGlhcy5zb21lKGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCwgYXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnVybC50b0xvd2VyQ2FzZSgpID09PSBtZWRpYS51cmwudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBidWlsZE1lZGlhVXJsOiBmdW5jdGlvbiAodXJsLCB0aHVtYlNpemUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVybCArICh1cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICd3aWR0aD0nICsgdGh1bWJTaXplICsgJyZoZWlnaHQ9JyArIHRodW1iU2l6ZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvZ2dsZVNlbGVjdGlvbk9mTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhVG9nZ2xlUmVxdWVzdGVkJywgbWVkaWEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVuYW1lTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ3JlbmFtZU1lZGlhUmVxdWVzdGVkJywgbWVkaWEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVsZXRlTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ2RlbGV0ZU1lZGlhUmVxdWVzdGVkJywgbWVkaWEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHJhZ1N0YXJ0OiBmdW5jdGlvbiAobWVkaWEsIGUpIHtcclxuICAgICAgICAgICAgYnVzLiRlbWl0KCdtZWRpYURyYWdTdGFydFJlcXVlc3RlZCcsIG1lZGlhLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIvLyA8bWVkaWEtaXRlbXMtdGFibGU+IGNvbXBvbmVudFxyXG5WdWUuY29tcG9uZW50KCdtZWRpYS1pdGVtcy10YWJsZScsIHtcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgbWVkaWEtaXRlbXMtdGFibGUgbS0wXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhlYWRlci1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBjbGFzcz1cInRodW1ibmFpbC1jb2x1bW5cIj57eyBULmltYWdlSGVhZGVyIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiB2LW9uOmNsaWNrPVwiY2hhbmdlU29ydCgnbmFtZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAge3sgVC5uYW1lSGVhZGVyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8c29ydC1pbmRpY2F0b3IgY29sbmFtZT1cIm5hbWVcIiA6c2VsZWN0ZWRjb2xuYW1lPVwic29ydEJ5XCIgOmFzYz1cInNvcnRBc2NcIj48L3NvcnQtaW5kaWNhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgdi1vbjpjbGljaz1cImNoYW5nZVNvcnQoJ2xhc3RNb2RpZnknKVwiPiBcclxuICAgICAgICAgICAgICAgICAgICAgICB7eyBULmxhc3RNb2RpZnlIZWFkZXIgfX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8c29ydC1pbmRpY2F0b3IgY29sbmFtZT1cImxhc3RNb2RpZnlcIiA6c2VsZWN0ZWRjb2xuYW1lPVwic29ydEJ5XCIgOmFzYz1cInNvcnRBc2NcIj48L3NvcnQtaW5kaWNhdG9yPiBcclxuICAgICAgICAgICAgICAgICAgICA8L3RoPiBcclxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiB2LW9uOmNsaWNrPVwiY2hhbmdlU29ydCgnc2l6ZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9uYWwtY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBULnNpemVIZWFkZXIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3J0LWluZGljYXRvciBjb2xuYW1lPVwic2l6ZVwiIDpzZWxlY3RlZGNvbG5hbWU9XCJzb3J0QnlcIiA6YXNjPVwic29ydEFzY1wiPjwvc29ydC1pbmRpY2F0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIHYtb246Y2xpY2s9XCJjaGFuZ2VTb3J0KCdtaW1lJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25hbC1jb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgVC50eXBlSGVhZGVyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8c29ydC1pbmRpY2F0b3IgY29sbmFtZT1cIm1pbWVcIiA6c2VsZWN0ZWRjb2xuYW1lPVwic29ydEJ5XCIgOmFzYz1cInNvcnRBc2NcIj48L3NvcnQtaW5kaWNhdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XCJtZWRpYSBpbiBmaWx0ZXJlZE1lZGlhSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWVkaWEtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwie3NlbGVjdGVkOiBpc01lZGlhU2VsZWN0ZWQobWVkaWEpfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdi1vbjpjbGljay5zdG9wPVwidG9nZ2xlU2VsZWN0aW9uT2ZNZWRpYShtZWRpYSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIiB2LW9uOmRyYWdzdGFydD1cImRyYWdTdGFydChtZWRpYSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOmtleT1cIm1lZGlhLm5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0aHVtYm5haWwtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgdi1pZj1cIm1lZGlhLm1pbWUuc3RhcnRzV2l0aCgnaW1hZ2UnKVwiIGRyYWdnYWJsZT1cImZhbHNlXCIgOnNyYz1cImJ1aWxkTWVkaWFVcmwobWVkaWEudXJsLCB0aHVtYlNpemUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgdi1lbHNlIGNsYXNzPVwiZmEtc29saWQgZmEtZmlsZSBmYS1sZ1wiIDpkYXRhLW1pbWU9XCJtZWRpYS5taW1lXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtbmFtZS1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmVhay13b3JkXCI+IHt7IG1lZGlhLm5hbWUgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gbWUtMSBlZGl0LWJ1dHRvblwiIHYtb246Y2xpY2suc3RvcD1cInJlbmFtZU1lZGlhKG1lZGlhKVwiPiB7eyBULmVkaXRCdXR0b24gfX0gPC9hID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gZGVsZXRlLWJ1dHRvblwiIHYtb246Y2xpY2suc3RvcD1cImRlbGV0ZU1lZGlhKG1lZGlhKVwiPiB7eyBULmRlbGV0ZUJ1dHRvbiB9fSA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cIm1lZGlhLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSB2aWV3LWJ1dHRvblwiPiB7eyBULnZpZXdCdXR0b24gfX0gPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY29sXCI+IHt7IHByaW50RGF0ZVRpbWUobWVkaWEubGFzdE1vZGlmeSkgfX0gPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNvbCBvcHRpb25hbC1jb2xcIj4ge3sgaXNOYU4obWVkaWEuc2l6ZSk/IDAgOiBNYXRoLnJvdW5kKG1lZGlhLnNpemUgLyAxMDI0KSB9fSBLQjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jb2wgb3B0aW9uYWwtY29sXCI+e3sgbWVkaWEubWltZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgICBgLFxyXG4gICAgZGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIFQ6IHt9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgc29ydEJ5OiBTdHJpbmcsXHJcbiAgICAgICAgc29ydEFzYzogQm9vbGVhbixcclxuICAgICAgICBmaWx0ZXJlZE1lZGlhSXRlbXM6IEFycmF5LFxyXG4gICAgICAgIHNlbGVjdGVkTWVkaWFzOiBBcnJheSxcclxuICAgICAgICB0aHVtYlNpemU6IE51bWJlclxyXG4gICAgfSxcclxuICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5ULmltYWdlSGVhZGVyID0gJCgnI3QtaW1hZ2UtaGVhZGVyJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULm5hbWVIZWFkZXIgPSAkKCcjdC1uYW1lLWhlYWRlcicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5sYXN0TW9kaWZ5SGVhZGVyID0gJCgnI3QtbGFzdE1vZGlmeS1oZWFkZXInKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQuc2l6ZUhlYWRlciA9ICQoJyN0LXNpemUtaGVhZGVyJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULnR5cGVIZWFkZXIgPSAkKCcjdC10eXBlLWhlYWRlcicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5lZGl0QnV0dG9uID0gJCgnI3QtZWRpdC1idXR0b24nKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQuZGVsZXRlQnV0dG9uID0gJCgnI3QtZGVsZXRlLWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC52aWV3QnV0dG9uID0gJCgnI3Qtdmlldy1idXR0b24nKS52YWwoKTtcclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgaXNNZWRpYVNlbGVjdGVkOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuc2VsZWN0ZWRNZWRpYXMuc29tZShmdW5jdGlvbiAoZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC51cmwudG9Mb3dlckNhc2UoKSA9PT0gbWVkaWEudXJsLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYnVpbGRNZWRpYVVybDogZnVuY3Rpb24gKHVybCwgdGh1bWJTaXplKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1cmwgKyAodXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJykgKyAnd2lkdGg9JyArIHRodW1iU2l6ZSArICcmaGVpZ2h0PScgKyB0aHVtYlNpemU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjaGFuZ2VTb3J0OiBmdW5jdGlvbiAobmV3U29ydCkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ3NvcnRDaGFuZ2VSZXF1ZXN0ZWQnLCBuZXdTb3J0KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvZ2dsZVNlbGVjdGlvbk9mTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ21lZGlhVG9nZ2xlUmVxdWVzdGVkJywgbWVkaWEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVuYW1lTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ3JlbmFtZU1lZGlhUmVxdWVzdGVkJywgbWVkaWEpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVsZXRlTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ2RlbGV0ZU1lZGlhUmVxdWVzdGVkJywgbWVkaWEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHJhZ1N0YXJ0OiBmdW5jdGlvbiAobWVkaWEsIGUpIHtcclxuICAgICAgICAgICAgYnVzLiRlbWl0KCdtZWRpYURyYWdTdGFydFJlcXVlc3RlZCcsIG1lZGlhLCBlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHByaW50RGF0ZVRpbWU6IGZ1bmN0aW9uIChkYXRlbWlsbGlzKXtcclxuICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShkYXRlbWlsbGlzKTtcclxuICAgICAgICAgICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTsgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0pO1xyXG4iLCIvLyBUaGlzIGNvbXBvbmVudCByZWNlaXZlcyBhIGxpc3Qgb2YgYWxsIHRoZSBpdGVtcywgdW5wYWdlZC5cclxuLy8gQXMgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIHBhZ2VyLCBpdCByYWlzZXMgZXZlbnRzIHdpdGggdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IHBhZ2UuXHJcbi8vIEl0J3MgdGhlIHBhcmVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGxpc3RlbiBmb3IgdGhlc2UgZXZlbnRzIGFuZCBkaXNwbGF5IHRoZSByZWNlaXZlZCBpdGVtc1xyXG4vLyA8cGFnZXI+IGNvbXBvbmVudFxyXG5WdWUuY29tcG9uZW50KCdwYWdlcicsIHtcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxuYXYgaWQ9XCJtZWRpYS1wYWdlclwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiBhcmlhLWxhYmVsPVwiUGFnaW5hdGlvbiBOYXZpZ2F0aW9uXCIgcm9sZT1cIm5hdmlnYXRpb25cIiA6ZGF0YS1jb21wdXRlZC10cmlnZ2VyPVwiaXRlbXNJbkN1cnJlbnRQYWdlLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJwYWdpbmF0aW9uIHBhZ2luYXRpb24tc20gbS0wXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gbWVkaWEtZmlyc3QtYnV0dG9uXCIgOmNsYXNzPVwie2Rpc2FibGVkIDogIWNhbkRvRmlyc3R9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiIDp0YWJpbmRleD1cImNhbkRvRmlyc3QgPyAwIDogLTFcIiB2LW9uOmNsaWNrPVwiZ29GaXJzdFwiPnt7IFQucGFnZXJGaXJzdEJ1dHRvbiB9fTwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIiA6Y2xhc3M9XCJ7ZGlzYWJsZWQgOiAhY2FuRG9QcmV2fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cIiNcIiA6dGFiaW5kZXg9XCJjYW5Eb1ByZXYgPyAwIDogLTFcIiB2LW9uOmNsaWNrPVwicHJldmlvdXNcIj57eyBULnBhZ2VyUHJldmlvdXNCdXR0b24gfX08L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIHYtaWY9XCJsaW5rICE9PSAtMVwiIGNsYXNzPVwicGFnZS1pdGVtIHBhZ2UtbnVtYmVyXCIgIDpjbGFzcz1cInthY3RpdmUgOiBjdXJyZW50ID09IGxpbmsgLSAxfVwiIHYtZm9yPVwibGluayBpbiBwYWdlTGlua3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIGhyZWY9XCIjXCIgdi1vbjpjbGljaz1cImdvVG8obGluayAtIDEpXCIgOmFyaWEtbGFiZWw9XCInR290byBQYWdlJyArIGxpbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tsaW5rfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cImN1cnJlbnQgPT0gbGluayAtMVwiIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+KGN1cnJlbnQpPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIiA6Y2xhc3M9XCJ7ZGlzYWJsZWQgOiAhY2FuRG9OZXh0fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cIiNcIiA6dGFiaW5kZXg9XCJjYW5Eb05leHQgPyAwIDogLTFcIiB2LW9uOmNsaWNrPVwibmV4dFwiPnt7IFQucGFnZXJOZXh0QnV0dG9uIH19PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbSBtZWRpYS1sYXN0LWJ1dHRvblwiIDpjbGFzcz1cIntkaXNhYmxlZCA6ICFjYW5Eb0xhc3R9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiIDp0YWJpbmRleD1cImNhbkRvTGFzdCA/IDAgOiAtMVwiIHYtb246Y2xpY2s9XCJnb0xhc3RcIj57eyBULnBhZ2VyTGFzdEJ1dHRvbiB9fTwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gbXMtNCBwYWdlLXNpemUtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2UtbGluayBkaXNhYmxlZCB0ZXh0LW11dGVkIHBhZ2Utc2l6ZS1sYWJlbFwiPnt7IFQucGFnZXJQYWdlU2l6ZUxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cInBhZ2UtbGlua1wiIHYtbW9kZWw9XCJwYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIm9wdGlvbiBpbiBwYWdlU2l6ZU9wdGlvbnNcIiB2LWJpbmQ6dmFsdWU9XCJvcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwvbmF2PlxyXG4gICAgICAgIDxuYXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJwYWdpbmF0aW9uIHBhZ2luYXRpb24tc20gbS0wIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbSBtcy00IHBhZ2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZS1saW5rIGRpc2FibGVkIHRleHQtbXV0ZWQgXCI+e3sgVC5wYWdlclBhZ2VMYWJlbCB9fSB7e2N1cnJlbnQgKyAxfX0ve3t0b3RhbFBhZ2VzfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtIG1zLTQgdG90YWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZS1saW5rIGRpc2FibGVkIHRleHQtbXV0ZWQgXCI+IHt7IFQucGFnZXJUb3RhbExhYmVsIH19IHt7dG90YWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgPC9uYXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgc291cmNlSXRlbXM6IEFycmF5XHJcbiAgICB9LFxyXG4gICAgZGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiAxMCxcclxuICAgICAgICAgICAgcGFnZVNpemVPcHRpb25zOiBbMTAsIDMwLCA1MCwgMTAwXSxcclxuICAgICAgICAgICAgY3VycmVudDogMCxcclxuICAgICAgICAgICAgVDoge31cclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHJldHJpZXZpbmcgbG9jYWxpemVkIHN0cmluZ3MgZnJvbSB2aWV3XHJcbiAgICAgICAgc2VsZi5ULnBhZ2VyRmlyc3RCdXR0b24gPSAkKCcjdC1wYWdlci1maXJzdC1idXR0b24nKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQucGFnZXJQcmV2aW91c0J1dHRvbiA9ICQoJyN0LXBhZ2VyLXByZXZpb3VzLWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5wYWdlck5leHRCdXR0b24gPSAkKCcjdC1wYWdlci1uZXh0LWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5wYWdlckxhc3RCdXR0b24gPSAkKCcjdC1wYWdlci1sYXN0LWJ1dHRvbicpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5wYWdlclBhZ2VTaXplTGFiZWwgPSAkKCcjdC1wYWdlci1wYWdlLXNpemUtbGFiZWwnKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQucGFnZXJQYWdlTGFiZWwgPSAkKCcjdC1wYWdlci1wYWdlLWxhYmVsJykudmFsKCk7XHJcbiAgICAgICAgc2VsZi5ULnBhZ2VyVG90YWxMYWJlbCA9ICQoJyN0LXBhZ2VyLXRvdGFsLWxhYmVsJykudmFsKCk7ICAgICAgICBcclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmN1cnJlbnQgKyAxO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcHJldmlvdXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50IC0gMTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGdvRmlyc3Q6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGdvTGFzdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnRvdGFsUGFnZXMgLSAxO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ29UbzogZnVuY3Rpb24gKHRhcmdldFBhZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGFyZ2V0UGFnZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgY29tcHV0ZWQ6IHtcclxuICAgICAgICB0b3RhbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VJdGVtcyA/IHRoaXMuc291cmNlSXRlbXMubGVuZ3RoIDogMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvdGFsUGFnZXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgICAgICAgcmV0dXJuIHBhZ2VzID4gMCA/IHBhZ2VzIDogMTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzTGFzdFBhZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudCArIDEgPj0gdGhpcy50b3RhbFBhZ2VzO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaXNGaXJzdFBhZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudCA9PT0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNhbkRvTmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNMYXN0UGFnZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNhbkRvUHJldjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNGaXJzdFBhZ2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjYW5Eb0ZpcnN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0ZpcnN0UGFnZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNhbkRvTGFzdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNMYXN0UGFnZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIHRoaXMgY29tcHV0ZWQgaXMgb25seSB0byBoYXZlIGEgY2VudHJhbCBwbGFjZSB3aGVyZSB3ZSBkZXRlY3QgY2hhbmdlcyBhbmQgbGV2ZXJhZ2UgVnVlIEpTIHJlYWN0aXZpdHkgdG8gcmFpc2Ugb3VyIGV2ZW50LlxyXG4gICAgICAgIC8vIFRoYXQgZXZlbnQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBwYXJlbnQgbWVkaWEgYXBwIHRvIGRpc3BsYXkgdGhlIGl0ZW1zIGluIHRoZSBwYWdlLlxyXG4gICAgICAgIC8vIHRoaXMgbG9naWMgd2lsbCBub3QgcnVuIGlmIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBpcyBub3QgdXNlZCBpbiB0aGUgdGVtcGxhdGUuIFdlIHVzZSBhIGR1bW15IFwiZGF0YS1jb21wdXRlZC10cmlnZ2VyXCIgYXR0cmlidXRlIGZvciB0aGF0LlxyXG4gICAgICAgIGl0ZW1zSW5DdXJyZW50UGFnZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnBhZ2VTaXplICogdGhpcy5jdXJyZW50O1xyXG4gICAgICAgICAgICB2YXIgZW5kID0gc3RhcnQgKyB0aGlzLnBhZ2VTaXplO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5zb3VyY2VJdGVtcy5zbGljZShzdGFydCwgZW5kKTtcclxuICAgICAgICAgICAgYnVzLiRlbWl0KCdwYWdlckV2ZW50JywgcmVzdWx0KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhZ2VMaW5rczogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIGxpbmtzID0gW107XHJcblxyXG4gICAgICAgICAgICBsaW5rcy5wdXNoKHRoaXMuY3VycmVudCArIDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gQWRkIDIgaXRlbXMgYmVmb3JlIGN1cnJlbnRcclxuICAgICAgICAgICAgdmFyIGJlZm9yZUN1cnJlbnQgPSB0aGlzLmN1cnJlbnQgPiAwID8gdGhpcy5jdXJyZW50IDogLTE7XHJcbiAgICAgICAgICAgIGxpbmtzLnVuc2hpZnQoYmVmb3JlQ3VycmVudCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgYmVmb3JlQmVmb3JlQ3VycmVudCA9IHRoaXMuY3VycmVudCA+IDEgPyB0aGlzLmN1cnJlbnQgLSAxIDogLTE7XHJcbiAgICAgICAgICAgIGxpbmtzLnVuc2hpZnQoYmVmb3JlQmVmb3JlQ3VycmVudCk7XHJcblxyXG5cclxuICAgICAgICAgICAgLy8gQWRkIDIgaXRlbXMgYWZ0ZXIgY3VycmVudFxyXG4gICAgICAgICAgICB2YXIgYWZ0ZXJDdXJyZW50ID0gdGhpcy50b3RhbFBhZ2VzIC0gdGhpcy5jdXJyZW50ID4gMSA/IHRoaXMuY3VycmVudCArIDIgOiAtMTtcclxuICAgICAgICAgICAgbGlua3MucHVzaChhZnRlckN1cnJlbnQpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGFmdGVyQWZ0ZXJDdXJyZW50ID0gdGhpcy50b3RhbFBhZ2VzIC0gdGhpcy5jdXJyZW50ID4gMiA/IHRoaXMuY3VycmVudCArIDMgOiAtMTtcclxuICAgICAgICAgICAgbGlua3MucHVzaChhZnRlckFmdGVyQ3VycmVudCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbGlua3M7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHdhdGNoOiB7XHJcbiAgICAgICAgc291cmNlSXRlbXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gMDsgLy8gcmVzZXR0aW5nIGN1cnJlbnQgcGFnZSBhZnRlciByZWNlaXZpbmcgYSBuZXcgbGlzdCBvZiB1bnBhZ2VkIGl0ZW1zXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwYWdlU2l6ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7XHJcbiIsIi8vIDxzb3J0LWluZGljYXRvcj4gY29tcG9uZW50XHJcblZ1ZS5jb21wb25lbnQoJ3NvcnRJbmRpY2F0b3InLCB7XHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICAgIDxkaXYgdi1zaG93PVwiaXNBY3RpdmVcIiBjbGFzcz1cInNvcnQtaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIHYtc2hvdz1cImFzY1wiPjxpIGNsYXNzPVwic21hbGwgZmEgZmEtY2hldnJvbi11cFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHYtc2hvdz1cIiFhc2NcIj48aSBjbGFzcz1cInNtYWxsIGZhIGZhLWNoZXZyb24tZG93blwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgY29sbmFtZTogU3RyaW5nLFxyXG4gICAgICAgIHNlbGVjdGVkY29sbmFtZTogU3RyaW5nLFxyXG4gICAgICAgIGFzYzogQm9vbGVhblxyXG4gICAgfSxcclxuICAgIGNvbXB1dGVkOiB7XHJcbiAgICAgICAgaXNBY3RpdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbmFtZS50b0xvd2VyQ2FzZSgpID09IHRoaXMuc2VsZWN0ZWRjb2xuYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuIiwiLy8gPHVwbG9hZD4gY29tcG9uZW50XHJcblZ1ZS5jb21wb25lbnQoJ3VwbG9hZCcsIHtcclxuICAgIHRlbXBsYXRlOiAnXFxcclxuICAgICAgICA8ZGl2IDpjbGFzcz1cInsgXFwndXBsb2FkLXdhcm5pbmdcXCcgOiBtb2RlbC5lcnJvck1lc3NhZ2UgfVwiIGNsYXNzPVwidXBsb2FkIG0tMiBwLTIgcHQtMFwiPiBcXFxyXG4gICAgICAgICAgICA8c3BhbiB2LWlmPVwibW9kZWwuZXJyb3JNZXNzYWdlXCIgdi1vbjpjbGljaz1cImRpc21pc3NXYXJuaW5nKClcIiBjbGFzcz1cImNsb3NlLXdhcm5pbmdcIj48aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiA8L3NwYW4+XFxcclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ1cGxvYWQtbmFtZVwiIDp0aXRsZT1cIm1vZGVsLmVycm9yTWVzc2FnZVwiPnt7IG1vZGVsLm5hbWUgfX08L3A+IFxcXHJcbiAgICAgICAgICAgIDxkaXY+IFxcXHJcbiAgICAgICAgICAgICAgIDxzcGFuIHYtc2hvdz1cIiFtb2RlbC5lcnJvck1lc3NhZ2VcIiA6c3R5bGU9XCJ7IHdpZHRoOiBtb2RlbC5wZXJjZW50YWdlICsgXFwnJVxcJ31cIiBjbGFzcz1cInByb2dyZXNzLWJhclwiPiA8L3NwYW4+IFxcXHJcbiAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJtb2RlbC5lcnJvck1lc3NhZ2VcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIiA6dGl0bGU9XCJtb2RlbC5lcnJvck1lc3NhZ2VcIj4gRXJyb3I6IHt7IG1vZGVsLmVycm9yTWVzc2FnZSB9fSA8L3NwYW4+IFxcXHJcbiAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICcsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIG1vZGVsOiBPYmplY3QsXHJcbiAgICAgICAgdXBsb2FkSW5wdXRJZDogU3RyaW5nXHJcbiAgICB9LFxyXG4gICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB2YXIgdXBsb2FkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLnVwbG9hZElucHV0SWQgPz8gJ2ZpbGV1cGxvYWQnKTtcclxuICAgICAgICAkKHVwbG9hZElucHV0KS5iaW5kKCdmaWxldXBsb2FkcHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5maWxlc1swXS5uYW1lICE9PSBzZWxmLm1vZGVsLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBzZWxmLm1vZGVsLnBlcmNlbnRhZ2UgPSBwYXJzZUludChkYXRhLmxvYWRlZCAvIGRhdGEudG90YWwgKiAxMDAsIDEwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh1cGxvYWRJbnB1dCkuYmluZCgnZmlsZXVwbG9hZGRvbmUnLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5maWxlc1swXS5uYW1lICE9PSBzZWxmLm1vZGVsLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQuZmlsZXNbMF0uZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlRmFpbHVyZShkYXRhLmZpbGVzWzBdLm5hbWUsIGRhdGEucmVzdWx0LmZpbGVzWzBdLmVycm9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHsgIFxyXG4gICAgICAgICAgICAgICAgYnVzLiRlbWl0KCdyZW1vdmFsUmVxdWVzdCcsIHNlbGYubW9kZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodXBsb2FkSW5wdXQpLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXNbMF0ubmFtZSAhPT0gc2VsZi5tb2RlbC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2VsZi5oYW5kbGVGYWlsdXJlKGRhdGEuZmlsZXNbMF0ubmFtZSwgJCgnI3QtZXJyb3InKS52YWwoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgbWV0aG9kczoge1xyXG4gICAgICAgIGhhbmRsZUZhaWx1cmU6IGZ1bmN0aW9uIChmaWxlTmFtZSwgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT09IHRoaXMubW9kZWwubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZXJyb3JNZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgICAgICAgYnVzLiRlbWl0KCdFcnJvck9uVXBsb2FkJywgdGhpcy5tb2RlbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBkaXNtaXNzV2FybmluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBidXMuJGVtaXQoJ3JlbW92YWxSZXF1ZXN0JywgdGhpcy5tb2RlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuIiwiLy8gPHVwbG9hZC1saXN0PiBjb21wb25lbnRcclxuVnVlLmNvbXBvbmVudCgndXBsb2FkTGlzdCcsIHtcclxuICAgIHRlbXBsYXRlOiAnXFxcclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWxpc3RcIiB2LXNob3c9XCJmaWxlcy5sZW5ndGggPiAwXCI+IFxcXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIiBAY2xpY2s9XCJleHBhbmRlZCA9ICFleHBhbmRlZFwiPiBcXFxyXG4gICAgICAgICAgICAgICAgPHNwYW4+IHt7IFQudXBsb2FkcyB9fSA8L3NwYW4+IFxcXHJcbiAgICAgICAgICAgICAgICA8c3BhbiB2LXNob3c9XCJwZW5kaW5nQ291bnRcIj4gKFBlbmRpbmc6IHt7IHBlbmRpbmdDb3VudCB9fSkgPC9zcGFuPiBcXFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gdi1zaG93PVwiZXJyb3JDb3VudFwiIDpjbGFzcz1cInsgXFwndGV4dC1kYW5nZXJcXCcgOiBlcnJvckNvdW50IH1cIj4gKCB7eyBULmVycm9ycyB9fToge3sgZXJyb3JDb3VudCB9fSAvIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiB2LW9uOmNsaWNrLnN0b3A9XCJjbGVhckVycm9yc1wiID4ge3sgVC5jbGVhckVycm9ycyB9fSA8L2E+KTwvc3Bhbj4gXFxcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWJ1dHRvblwiPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgdi1zaG93PVwiZXhwYW5kZWRcIj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1jaGV2cm9uLWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiB2LXNob3c9XCIhZXhwYW5kZWRcIj4gXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1jaGV2cm9uLXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IFxcXHJcbiAgICAgICAgICAgIDwvZGl2PiBcXFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCIgdi1zaG93PVwiZXhwYW5kZWRcIj4gXFxcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwXCI+IFxcXHJcbiAgICAgICAgICAgICAgICAgICAgPHVwbG9hZCA6dXBsb2FkLWlucHV0LWlkPVwidXBsb2FkSW5wdXRJZFwiIHYtZm9yPVwiZiBpbiBmaWxlc1wiIDprZXk9XCJmLm5hbWVcIiAgOm1vZGVsPVwiZlwiPjwvdXBsb2FkPiBcXFxyXG4gICAgICAgICAgICAgICAgPC9kaXYgPiBcXFxyXG4gICAgICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICA8L2Rpdj4gXFxcclxuICAgICAgICAnLFxyXG4gICAgZGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpbGVzOiBbXSxcclxuICAgICAgICAgICAgVDoge30sXHJcbiAgICAgICAgICAgIGV4cGFuZGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcGVuZGluZ0NvdW50OiAwLFxyXG4gICAgICAgICAgICBlcnJvckNvdW50OiAwXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgdXBsb2FkSW5wdXRJZDogU3RyaW5nXHJcbiAgICB9LFxyXG4gICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAvLyByZXRyaWV2aW5nIGxvY2FsaXplZCBzdHJpbmdzIGZyb20gdmlld1xyXG4gICAgICAgIHNlbGYuVC51cGxvYWRzID0gJCgnI3QtdXBsb2FkcycpLnZhbCgpO1xyXG4gICAgICAgIHNlbGYuVC5lcnJvcnMgPSAkKCcjdC1lcnJvcnMnKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQuY2xlYXJFcnJvcnMgPSAkKCcjdC1jbGVhci1lcnJvcnMnKS52YWwoKTtcclxuICAgIH0sXHJcbiAgICBjb21wdXRlZDoge1xyXG4gICAgICAgIGZpbGVDb3VudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlcy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHVwbG9hZElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi51cGxvYWRJbnB1dElkID8/ICdmaWxldXBsb2FkJyk7XHJcbiAgICAgICAgJCh1cGxvYWRJbnB1dCkuYmluZCgnZmlsZXVwbG9hZGFkZCcsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmICghZGF0YS5maWxlcykgeyBcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhLmZpbGVzLmZvckVhY2goZnVuY3Rpb24gKG5ld0ZpbGUpIHsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB2YXIgYWxyZWFkeUluTGlzdCA9IHNlbGYuZmlsZXMuc29tZShmdW5jdGlvbiAoZikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmLm5hbWUgPT0gbmV3RmlsZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5SW5MaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlcy5wdXNoKHsgbmFtZTogbmV3RmlsZS5uYW1lLCBwZXJjZW50YWdlOiAwLCBlcnJvck1lc3NhZ2U6ICcnIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgb24gdGhlIHF1ZXVlOicgKyBuZXdGaWxlLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYnVzLiRvbigncmVtb3ZhbFJlcXVlc3QnLCBmdW5jdGlvbiAoZmlsZVVwbG9hZCkge1xyXG4gICAgICAgICAgICBzZWxmLmZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4LCBhcnJheSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBmaWxlVXBsb2FkLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYnVzLiRvbignRXJyb3JPblVwbG9hZCcsIGZ1bmN0aW9uIChmaWxlVXBsb2FkKSB7XHJcbiAgICAgICAgICAgIHNlbGYudXBkYXRlQ291bnQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgdXBkYXRlQ291bnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gdGhpcy5maWxlcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmVycm9yTWVzc2FnZSAhPSAnJztcclxuICAgICAgICAgICAgfSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDb3VudCA9IHRoaXMuZmlsZXMubGVuZ3RoIC0gdGhpcy5lcnJvckNvdW50O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWxlcy5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyRXJyb3JzOiBmdW5jdGlvbiAoKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZXJyb3JNZXNzYWdlID09ICcnO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgd2F0Y2g6IHtcclxuICAgICAgICBmaWxlczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvdW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuIiwiZnVuY3Rpb24gaW5pdGlhbGl6ZUF0dGFjaGVkTWVkaWFGaWVsZChlbCwgaWRPZlVwbG9hZEJ1dHRvbiwgdXBsb2FkQWN0aW9uLCBtZWRpYUl0ZW1VcmwsIGFsbG93TXVsdGlwbGUsIGFsbG93TWVkaWFUZXh0LCBhbGxvd0FuY2hvcnMsIHRlbXBVcGxvYWRGb2xkZXIsIG1heFVwbG9hZENodW5rU2l6ZSkge1xyXG5cclxuICAgIHZhciB0YXJnZXQgPSAkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCQoZWwpLmRhdGEoJ2ZvcicpKSk7XHJcbiAgICB2YXIgaW5pdGlhbFBhdGhzID0gdGFyZ2V0LmRhdGEoXCJpbml0XCIpO1xyXG5cclxuICAgIHZhciBtZWRpYUZpZWxkRWRpdG9yID0gJChlbCk7XHJcbiAgICB2YXIgaWRwcmVmaXggPSBtZWRpYUZpZWxkRWRpdG9yLmF0dHIoXCJpZFwiKTtcclxuICAgIHZhciBtZWRpYUZpZWxkQXBwO1xyXG5cclxuICAgIG1lZGlhRmllbGRBcHBzLnB1c2gobWVkaWFGaWVsZEFwcCA9IG5ldyBWdWUoe1xyXG4gICAgICAgIGVsOiBtZWRpYUZpZWxkRWRpdG9yLmdldCgwKSxcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIG1lZGlhSXRlbXM6IFtdLFxyXG4gICAgICAgICAgICBzZWxlY3RlZE1lZGlhOiBudWxsLFxyXG4gICAgICAgICAgICBzbWFsbFRodW1iczogZmFsc2UsXHJcbiAgICAgICAgICAgIGlkUHJlZml4OiBpZHByZWZpeCxcclxuICAgICAgICAgICAgaW5pdGlhbGl6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbGxvd01lZGlhVGV4dDogYWxsb3dNZWRpYVRleHQsXHJcbiAgICAgICAgICAgIGJhY2t1cE1lZGlhVGV4dDogJycsXHJcbiAgICAgICAgICAgIGFsbG93QW5jaG9yczogYWxsb3dBbmNob3JzLFxyXG4gICAgICAgICAgICBiYWNrdXBBbmNob3I6IG51bGwsXHJcbiAgICAgICAgICAgIG1lZGlhVGV4dG1vZGFsOiBudWxsLFxyXG4gICAgICAgICAgICBhbmNob3JpbmdNb2RhbDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBzZWxmLmN1cnJlbnRQcmVmcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21lZGlhRmllbGRQcmVmcycpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXB1dGVkOiB7XHJcbiAgICAgICAgICAgIHBhdGhzOiB7XHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFQYXRocyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaW5pdGlhbFBhdGhzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgubWVkaWFQYXRoID09PSAnbm90LWZvdW5kJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUGF0aHMucHVzaCh7IHBhdGg6IHgubWVkaWFQYXRoLCBpc1JlbW92ZWQ6IHguaXNSZW1vdmVkLCBpc05ldzogeC5pc05ldywgbWVkaWFUZXh0OiB4Lm1lZGlhVGV4dCwgYW5jaG9yOiB4LmFuY2hvciwgYXR0YWNoZWRGaWxlTmFtZTogeC5hdHRhY2hlZEZpbGVOYW1lIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShtZWRpYVBhdGhzKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1lZGlhUGF0aHMgPSB2YWx1ZXMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpZ25hbCA9ICQuRGVmZXJyZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHgsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7IG5hbWU6ICcgJyArIHgucGF0aCwgbWltZTogJycsIG1lZGlhUGF0aDogJycsIGFuY2hvcjogeC5hbmNob3IsIGF0dGFjaGVkRmlsZU5hbWU6IHguYXR0YWNoZWRGaWxlTmFtZSB9KTsgLy8gZG9uJ3QgcmVtb3ZlIHRoZSBzcGFjZS4gU29tZXRoaW5nIGRpZmZlcmVudCBpcyBuZWVkZWQgb3IgaXQgd29udCByZWFjdCB3aGVuIHRoZSByZWFsIG5hbWUgYXJyaXZlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9ICQud2hlbihzaWduYWwpLmRvbmUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG1lZGlhSXRlbVVybCArIFwiP3BhdGg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoeC5wYXRoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudnVla2V5ID0gZGF0YS5uYW1lICsgaS50b1N0cmluZygpOyAvLyBCZWNhdXNlIGEgdW5pcXVlIGtleSBpcyByZXF1aXJlZCBieSBWdWUgb24gdi1mb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubWVkaWFUZXh0ID0geC5tZWRpYVRleHQ7IC8vIFRoaXMgdmFsdWUgaXMgbm90IHJldHVybmVkIGZyb20gdGhlIGFqYXggY2FsbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hbmNob3IgPSB4LmFuY2hvcjsgLy8gVGhpcyB2YWx1ZSBpcyBub3QgcmV0dXJuZWQgZnJvbSB0aGUgYWpheCBjYWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmF0dGFjaGVkRmlsZU5hbWUgPSB4LmF0dGFjaGVkRmlsZU5hbWU7Ly8gVGhpcyB2YWx1ZSBpcyBub3QgcmV0dXJuZWQgZnJvbSB0aGUgYWpheCBjYWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5zcGxpY2UoaSwgMSwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09ICsrbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZWRpYUl0ZW1zLnB1c2goeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpLCAxLCB7IG5hbWU6IHgucGF0aCwgbWltZTogJycsIG1lZGlhUGF0aDogJ25vdC1mb3VuZCcsIG1lZGlhVGV4dDogJycsIGFuY2hvcjogeyB4OiAwLjUsIHk6IDAuNSB9LCBhdHRhY2hlZEZpbGVOYW1lOiB4LmF0dGFjaGVkRmlsZU5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09ICsrbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZWRpYUl0ZW1zLnB1c2goeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzaWduYWwucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmaWxlU2l6ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5zZWxlY3RlZE1lZGlhLnNpemUgLyAxMDI0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY2FuQWRkTWVkaWE6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBub25SZW1vdmVkTWVkaWFJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1lZGlhSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWVkaWFJdGVtc1tpXS5pc1JlbW92ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9uUmVtb3ZlZE1lZGlhSXRlbXMucHVzaCh0aGlzLm1lZGlhSXRlbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9uUmVtb3ZlZE1lZGlhSXRlbXMubGVuZ3RoID09PSAwIHx8IG5vblJlbW92ZWRNZWRpYUl0ZW1zLmxlbmd0aCA+IDAgJiYgYWxsb3dNdWx0aXBsZTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGh1bWJTaXplOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zbWFsbFRodW1icyA/IDEyMCA6IDI0MDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY3VycmVudFByZWZzOiB7XHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzbWFsbFRodW1iczogdGhpcy5zbWFsbFRodW1ic1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1ByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFsbFRodW1icyA9IG5ld1ByZWZzLnNtYWxsVGh1bWJzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBtb3VudGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIHNlbGYucGF0aHMgPSBpbml0aWFsUGF0aHM7XHJcblxyXG4gICAgICAgICAgICBzZWxmLiRvbignc2VsZWN0QW5kRGVsZXRlTWVkaWFSZXF1ZXN0ZWQnLCBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QW5kRGVsZXRlTWVkaWEobWVkaWEpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuJG9uKCdzZWxlY3RNZWRpYVJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RNZWRpYShtZWRpYSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gJyMnICsgaWRPZlVwbG9hZEJ1dHRvbjtcclxuICAgICAgICAgICAgdmFyIGVkaXRvcklkID0gbWVkaWFGaWVsZEVkaXRvci5hdHRyKCdpZCcpO1xyXG4gICAgICAgICAgICB2YXIgY2h1bmtlZEZpbGVVcGxvYWRJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XHJcblxyXG4gICAgICAgICAgICAkKHNlbGVjdG9yKVxyXG4gICAgICAgICAgICAgICAgLmZpbGV1cGxvYWQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0Q29uY3VycmVudFVwbG9hZHM6IDIwLFxyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bab25lOiAkKCcjJyArIGVkaXRvcklkKSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXBsb2FkQWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heENodW5rU2l6ZTogbWF4VXBsb2FkQ2h1bmtTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gZGF0YS5maWxlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlc1tpXS51cGxvYWROYW1lID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldFVuaXF1ZUlkKCkgKyBkYXRhLmZpbGVzW2ldLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzW2ldLmF0dGFjaGVkRmlsZU5hbWUgPSBkYXRhLmZpbGVzW2ldLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdWJtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbnRpRm9yZ2VyeVRva2VuID0gJChcImlucHV0W25hbWU9X19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW5dXCIpLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3BhdGgnLCB2YWx1ZTogdGVtcFVwbG9hZEZvbGRlciB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4nLCB2YWx1ZTogYW50aUZvcmdlcnlUb2tlbiB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnX19jaHVua2VkRmlsZVVwbG9hZElkJywgdmFsdWU6IGNodW5rZWRGaWxlVXBsb2FkSWQgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGRvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdNZWRpYUl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcm1zZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnJlc3VsdC5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEucmVzdWx0LmZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXN1bHQuZmlsZXNbaV0uaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgZXJyb3IgaXMgZGVmaW5lZCBwcm9iYWJseSB0aGUgZmlsZSB0eXBlIGlzIG5vdCBhbGxvd2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0LmZpbGVzW2ldLmVycm9yID09PSB1bmRlZmluZWQgfHwgZGF0YS5yZXN1bHQuZmlsZXNbaV0uZXJyb3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXN1bHQuZmlsZXNbaV0uYXR0YWNoZWRGaWxlTmFtZSA9IGRhdGEuZmlsZXNbaV0uYXR0YWNoZWRGaWxlTmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWVkaWFJdGVtcy5wdXNoKGRhdGEucmVzdWx0LmZpbGVzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcm1zZyArPSBkYXRhLnJlc3VsdC5maWxlc1tpXS5lcnJvciArIFwiXFxuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ybXNnICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChlcnJvcm1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmV3TWVkaWFJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNZWRpYUl0ZW1zLmxlbmd0aCA+IDEgJiYgYWxsb3dNdWx0aXBsZSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCQoJyNvbmx5T25lSXRlbU1lc3NhZ2UnKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUZpZWxkQXBwLm1lZGlhSXRlbXMucHVzaChuZXdNZWRpYUl0ZW1zWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5tZWRpYUl0ZW1zID0gbWVkaWFGaWVsZEFwcC5tZWRpYUl0ZW1zLmNvbmNhdChuZXdNZWRpYUl0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igb24gdXBsb2FkLicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhqcVhIUik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRleHRTdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvclRocm93bik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5vbignZmlsZXVwbG9hZGNodW5rYmVmb3Jlc2VuZCcsIChlLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgcmVwbGFjZSB0aGUgYmxvYiB3aXRoIGEgRmlsZSBvYmplY3QgdG8gZW5zdXJlIHRoZSBmaWxlIG5hbWUgYW5kIG90aGVycyBhcmUgcHJlc2VydmVkIGZvciB0aGUgYmFja2VuZC5cclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJsb2IgPSBuZXcgRmlsZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnMuYmxvYl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZmlsZS50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1ldGhvZHM6IHtcclxuICAgICAgICAgICAgc2VsZWN0TWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhID0gbWVkaWE7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdldFVuaXF1ZUlkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHJlbW92ZVNlbGVjdGVkOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZW1vdmVkID0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5tZWRpYUl0ZW1zICYmIHRoaXMubWVkaWFJdGVtcy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRNZWRpYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRoaXMubWVkaWFJdGVtc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQuaXNSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLm1lZGlhSXRlbXMuc3BsaWNlKFtpbmRleF0sIDEsIHJlbW92ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtb3ZlIGJ1dHRvbiBjYW4gYWxzbyByZW1vdmUgYSB1bmlxdWUgbWVkaWEgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lZGlhSXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0aGlzLm1lZGlhSXRlbXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkLmlzUmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5tZWRpYUl0ZW1zLnNwbGljZSgwLCAxLCByZW1vdmVkKTsgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW1zLnNwbGljZSgwLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEgPSBudWxsO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaG93TWVkaWFUZXh0TW9kYWw6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZWRpYVRleHRNb2RhbCA9IG5ldyBib290c3RyYXAuTW9kYWwodGhpcy4kcmVmcy5tZWRpYVRleHRNb2RhbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lZGlhVGV4dE1vZGFsLnNob3coKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja3VwTWVkaWFUZXh0ID0gdGhpcy5zZWxlY3RlZE1lZGlhLm1lZGlhVGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY2FuY2VsTWVkaWFUZXh0TW9kYWw6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZWRpYVRleHRNb2RhbC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEubWVkaWFUZXh0ID0gdGhpcy5iYWNrdXBNZWRpYVRleHQ7XHJcbiAgICAgICAgICAgIH0sIFxyXG4gICAgICAgICAgICBzaG93QW5jaG9yTW9kYWw6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JpbmdNb2RhbCA9IG5ldyBib290c3RyYXAuTW9kYWwodGhpcy4kcmVmcy5hbmNob3JpbmdNb2RhbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuY2hvcmluZ01vZGFsLnNob3coKTtcclxuICAgICAgICAgICAgICAgIC8vIENhdXNlIGEgcmVmcmVzaCB0byByZWNhbGMgaGVpZ2h0cy5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgIHg6IHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IueCxcclxuICAgICAgICAgICAgICAgICAgeTogdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvci55XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2t1cEFuY2hvciA9IHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3I7XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgICBcclxuICAgICAgICAgICAgY2FuY2VsQW5jaG9yaW5nTW9kYWw6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JpbmdNb2RhbC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yID0gdGhpcy5iYWNrdXBBbmNob3I7XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlc2V0QW5jaG9yOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IgPSB7IHg6IDAuNSwgeTogMC41IH07XHJcbiAgICAgICAgICAgIH0sIFxyXG4gICAgICAgICAgICBvbkFuY2hvckRyb3A6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLiRyZWZzLmFuY2hvckltYWdlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvciA9IHtcclxuICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50Lm9mZnNldFggLyBpbWFnZS5jbGllbnRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgIHk6IGV2ZW50Lm9mZnNldFkgLyBpbWFnZS5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYW5jaG9yTGVmdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UgJiYgdGhpcy4kcmVmcy5tb2RhbEJvZHkgJiYgdGhpcy5zZWxlY3RlZE1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBpbWFnZSBpcyBzaHJ1bmsgY29tcGFyZSBhZ2FpbnN0IHRoZSBtb2RhbCBib2R5LlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAodGhpcy4kcmVmcy5tb2RhbEJvZHkuY2xpZW50V2lkdGggLSB0aGlzLiRyZWZzLmFuY2hvckltYWdlLmNsaWVudFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gKHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IueCAqIHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UuY2xpZW50V2lkdGgpICsgb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDE3KSB7IC8vIEFkanVzdCBzbyB0aGUgdGFyZ2V0IGRvZXNuJ3Qgc2hvdyBvdXRzaWRlIGltYWdlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDE3O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gLSA4OyAvLyBBZGp1c3QgdG8gaGl0IHRoZSBtb3VzZSBwb2ludGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFuY2hvclRvcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UgJiYgdGhpcy5zZWxlY3RlZE1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvci55ICogdGhpcy4kcmVmcy5hbmNob3JJbWFnZS5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMTUpIHsgLy8gQWRqdXN0bWVudCBzbyB0aGUgdGFyZ2V0IGRvZXNuJ3Qgc2hvdyBvdXRzaWRlIGltYWdlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDE1O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyA1OyAvLyBBZGp1c3QgdG8gaGl0IHRoZSBtb3VzZSBwb2ludGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRBbmNob3I6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGltYWdlID0gdGhpcy4kcmVmcy5hbmNob3JJbWFnZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogZXZlbnQub2Zmc2V0WCAvIGltYWdlLmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGV2ZW50Lm9mZnNldFkgLyBpbWFnZS5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgICAgICAgICBcclxuICAgICAgICAgICAgYWRkTWVkaWFGaWxlczogZnVuY3Rpb24gKGZpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKGZpbGVzLmxlbmd0aCA+IDEpICYmIChhbGxvd011bHRpcGxlID09PSBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGVydCgkKCcjb25seU9uZUl0ZW1NZXNzYWdlJykudmFsKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAubWVkaWFJdGVtcy5wdXNoKGZpbGVzWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYUZpZWxkQXBwLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5tZWRpYUl0ZW1zID0gbWVkaWFGaWVsZEFwcC5tZWRpYUl0ZW1zLmNvbmNhdChmaWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNlbGVjdEFuZERlbGV0ZU1lZGlhOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRNZWRpYSA9IG1lZGlhO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0VGltZW91dCBiZWNhdXNlIHNvbWV0aW1lcyBcclxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZVNlbGVjdGVkIHdhcyBjYWxsZWQgZXZlbiBiZWZvcmUgdGhlIG1lZGlhIHdhcyBzZXQuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZVNlbGVjdGVkKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB3YXRjaDoge1xyXG4gICAgICAgICAgICBtZWRpYUl0ZW1zOiB7XHJcbiAgICAgICAgICAgICAgICBkZWVwOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgaGFuZGxlciAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBwcmV2aWV3IHJlbmRlcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyAkKGRvY3VtZW50KS50cmlnZ2VyKCdjb250ZW50cHJldmlldzpyZW5kZXInKTsgfSwgMTAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgIGN1cnJlbnRQcmVmczogZnVuY3Rpb24gKG5ld1ByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbWVkaWFGaWVsZFByZWZzJywgSlNPTi5zdHJpbmdpZnkobmV3UHJlZnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pKTtcclxufVxyXG4iLCJmdW5jdGlvbiBpbml0aWFsaXplTWVkaWFGaWVsZChlbCwgbW9kYWxCb2R5RWxlbWVudCwgbWVkaWFJdGVtVXJsLCBhbGxvd011bHRpcGxlLCBhbGxvd01lZGlhVGV4dCwgYWxsb3dBbmNob3JzKSB7XHJcbiAgICAvL0JhZ1BhcnQgY3JlYXRlIGEgc2NyaXB0IHNlY3Rpb24gd2l0aG91dCBvdGhlciBET00gZWxlbWVudHNcclxuICAgIGlmKGVsID09PSBudWxsKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIFxyXG4gICAgdmFyIHRhcmdldCA9ICQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJChlbCkuZGF0YSgnZm9yJykpKTtcclxuICAgIHZhciBpbml0aWFsUGF0aHMgPSB0YXJnZXQuZGF0YShcImluaXRcIik7XHJcblxyXG4gICAgdmFyIG1lZGlhRmllbGRFZGl0b3IgPSAkKGVsKTtcclxuICAgIHZhciBpZHByZWZpeCA9IG1lZGlhRmllbGRFZGl0b3IuYXR0cihcImlkXCIpO1xyXG4gICAgdmFyIG1lZGlhRmllbGRBcHA7XHJcblxyXG4gICAgLy93aGVuIGhpZGUgbW9kYWwgZGV0YWNoIG1lZGlhIGFwcCB0byBhdm9pZCBpc3N1ZSBvbiBCYWdQYXJ0XHJcbiAgICBtb2RhbEJvZHlFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICQoXCIjbWVkaWFBcHBcIikuYXBwZW5kVG8oJ2JvZHknKTtcclxuICAgICAgICAkKFwiI21lZGlhQXBwXCIpLmhpZGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIG1lZGlhRmllbGRBcHBzLnB1c2gobWVkaWFGaWVsZEFwcCA9IG5ldyBWdWUoe1xyXG4gICAgICAgIGVsOiBtZWRpYUZpZWxkRWRpdG9yLmdldCgwKSxcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIG1lZGlhSXRlbXM6IFtdLFxyXG4gICAgICAgICAgICBzZWxlY3RlZE1lZGlhOiBudWxsLFxyXG4gICAgICAgICAgICBzbWFsbFRodW1iczogZmFsc2UsXHJcbiAgICAgICAgICAgIGlkUHJlZml4OiBpZHByZWZpeCxcclxuICAgICAgICAgICAgaW5pdGlhbGl6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbGxvd01lZGlhVGV4dDogYWxsb3dNZWRpYVRleHQsXHJcbiAgICAgICAgICAgIGJhY2t1cE1lZGlhVGV4dDogJycsXHJcbiAgICAgICAgICAgIGFsbG93QW5jaG9yczogYWxsb3dBbmNob3JzLFxyXG4gICAgICAgICAgICBiYWNrdXBBbmNob3I6IG51bGwsXHJcbiAgICAgICAgICAgIG1lZGlhVGV4dE1vZGFsOiBudWxsLFxyXG4gICAgICAgICAgICBhbmNob3JpbmdNb2RhbDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBzZWxmLmN1cnJlbnRQcmVmcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21lZGlhRmllbGRQcmVmcycpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXB1dGVkOiB7XHJcbiAgICAgICAgICAgIHBhdGhzOiB7XHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFQYXRocyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaW5pdGlhbFBhdGhzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgubWVkaWFQYXRoID09PSAnbm90LWZvdW5kJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUGF0aHMucHVzaCh7IHBhdGg6IHgubWVkaWFQYXRoLCBtZWRpYVRleHQ6IHgubWVkaWFUZXh0LCBhbmNob3I6IHguYW5jaG9yIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShtZWRpYVBhdGhzKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1lZGlhUGF0aHMgPSB2YWx1ZXMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpZ25hbCA9ICQuRGVmZXJyZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHgsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7IG5hbWU6ICcgJyArIHgucGF0aCwgbWltZTogJycsIG1lZGlhUGF0aDogJycgfSk7IC8vIGRvbid0IHJlbW92ZSB0aGUgc3BhY2UuIFNvbWV0aGluZyBkaWZmZXJlbnQgaXMgbmVlZGVkIG9yIGl0IHdvbnQgcmVhY3Qgd2hlbiB0aGUgcmVhbCBuYW1lIGFycml2ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSAkLndoZW4oc2lnbmFsKS5kb25lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtZWRpYUl0ZW1VcmwgKyBcIj9wYXRoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHgucGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnZ1ZWtleSA9IGRhdGEubmFtZSArIGkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tZWRpYVRleHQgPSB4Lm1lZGlhVGV4dDsgLy8gVGhpcyB2YWx1ZSBpcyBub3QgcmV0dXJuZWQgZnJvbSB0aGUgYWpheCBjYWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmFuY2hvciA9IHguYW5jaG9yOyAvLyBUaGlzIHZhbHVlIGlzIG5vdCByZXR1cm5lZCBmcm9tIHRoZSBhamF4IGNhbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpLCAxLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gKytsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lZGlhSXRlbXMucHVzaCh5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5zcGxpY2UoaSwgMSwgeyBuYW1lOiB4LnBhdGgsIG1pbWU6ICcnLCBtZWRpYVBhdGg6ICdub3QtZm91bmQnLCBtZWRpYVRleHQ6ICcnLCBhbmNob3I6IHsgeDogMCwgeTogMCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSArK2xlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVkaWFJdGVtcy5wdXNoKHgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmlsZVNpemU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuc2VsZWN0ZWRNZWRpYS5zaXplIC8gMTAyNCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhbkFkZE1lZGlhOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYUl0ZW1zLmxlbmd0aCA9PT0gMCB8fCB0aGlzLm1lZGlhSXRlbXMubGVuZ3RoID4gMCAmJiBhbGxvd011bHRpcGxlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0aHVtYlNpemU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNtYWxsVGh1bWJzID8gMTIwIDogMjQwO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjdXJyZW50UHJlZnM6IHtcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsVGh1bWJzOiB0aGlzLnNtYWxsVGh1bWJzXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3UHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYWxsVGh1bWJzID0gbmV3UHJlZnMuc21hbGxUaHVtYnM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgc2VsZi5wYXRocyA9IGluaXRpYWxQYXRocztcclxuXHJcbiAgICAgICAgICAgIHNlbGYuJG9uKCdzZWxlY3RBbmREZWxldGVNZWRpYVJlcXVlc3RlZCcsIGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RBbmREZWxldGVNZWRpYShtZWRpYSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgc2VsZi4kb24oJ3NlbGVjdE1lZGlhUmVxdWVzdGVkJywgZnVuY3Rpb24gKG1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdE1lZGlhKG1lZGlhKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBzZWxmLiRvbignZmlsZXNVcGxvYWRlZCcsIGZ1bmN0aW9uIChmaWxlcykge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5hZGRNZWRpYUZpbGVzKGZpbGVzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgICAgIHNlbGVjdE1lZGlhOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYSA9IG1lZGlhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaG93TW9kYWw6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuY2FuQWRkTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKFwiI21lZGlhQXBwXCIpLmFwcGVuZFRvKCQobW9kYWxCb2R5RWxlbWVudCkuZmluZCgnLm1vZGFsLWJvZHknKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChcIiNtZWRpYUFwcFwiKS5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBib290c3RyYXAuTW9kYWwobW9kYWxCb2R5RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkKG1vZGFsQm9keUVsZW1lbnQpLmZpbmQoJy5tZWRpYUZpZWxkU2VsZWN0QnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkTWVkaWFGaWxlcyhtZWRpYUFwcC5zZWxlY3RlZE1lZGlhcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSBpbmNsdWRlZCBtZWRpYXMgdG8gYmUgc3RpbGwgc2VsZWN0ZWQgdGhlIG5leHQgdGltZSB3ZSBvcGVuIHRoZSBtb2RhbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcHAuc2VsZWN0ZWRNZWRpYXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNob3dNZWRpYVRleHRNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lZGlhVGV4dE1vZGFsID0gbmV3IGJvb3RzdHJhcC5Nb2RhbCh0aGlzLiRyZWZzLm1lZGlhVGV4dE1vZGFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVkaWFUZXh0TW9kYWwuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrdXBNZWRpYVRleHQgPSB0aGlzLnNlbGVjdGVkTWVkaWEubWVkaWFUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjYW5jZWxNZWRpYVRleHRNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lZGlhVGV4dE1vZGFsLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5tZWRpYVRleHQgPSB0aGlzLmJhY2t1cE1lZGlhVGV4dDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2hvd0FuY2hvck1vZGFsOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yaW5nTW9kYWwgPSBuZXcgYm9vdHN0cmFwLk1vZGFsKHRoaXMuJHJlZnMuYW5jaG9yaW5nTW9kYWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JpbmdNb2RhbC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAvLyBDYXVzZSBhIHJlZnJlc2ggdG8gcmVjYWxjIGhlaWdodHMuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICB4OiB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yLngsXHJcbiAgICAgICAgICAgICAgICAgIHk6IHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IueVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrdXBBbmNob3IgPSB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yO1xyXG4gICAgICAgICAgICB9LCAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjYW5jZWxBbmNob3JpbmdNb2RhbDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuY2hvcmluZ01vZGFsLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IgPSB0aGlzLmJhY2t1cEFuY2hvcjtcclxuICAgICAgICAgICAgfSwgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzZXRBbmNob3I6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvciA9IHsgeDogMC41LCB5OiAwLjUgfTtcclxuICAgICAgICAgICAgfSwgIFxyXG4gICAgICAgICAgICBvbkFuY2hvckRyb3A6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLiRyZWZzLmFuY2hvckltYWdlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvciA9IHtcclxuICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50Lm9mZnNldFggLyBpbWFnZS5jbGllbnRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgIHk6IGV2ZW50Lm9mZnNldFkgLyBpbWFnZS5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYW5jaG9yTGVmdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UgJiYgdGhpcy4kcmVmcy5tb2RhbEJvZHkgJiYgdGhpcy5zZWxlY3RlZE1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBpbWFnZSBpcyBzaHJ1bmsgY29tcGFyZSBhZ2FpbnN0IHRoZSBtb2RhbCBib2R5LlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAodGhpcy4kcmVmcy5tb2RhbEJvZHkuY2xpZW50V2lkdGggLSB0aGlzLiRyZWZzLmFuY2hvckltYWdlLmNsaWVudFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gKHRoaXMuc2VsZWN0ZWRNZWRpYS5hbmNob3IueCAqIHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UuY2xpZW50V2lkdGgpICsgb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbmNob3JJY29uID0gTWF0aC5yb3VuZCh0aGlzLiRyZWZzLm1vZGFsQm9keS5xdWVyeVNlbGVjdG9yKCcuaWNvbi1tZWRpYS1hbmNob3InKS5jbGllbnRXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoTnVtYmVyLmlzSW50ZWdlcihhbmNob3JJY29uKSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gLSBhbmNob3JJY29uLzI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnMCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFuY2hvclRvcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2UgJiYgdGhpcy5zZWxlY3RlZE1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5zZWxlY3RlZE1lZGlhLmFuY2hvci55ICogdGhpcy4kcmVmcy5hbmNob3JJbWFnZS5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcwJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0QW5jaG9yOiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuJHJlZnMuYW5jaG9ySW1hZ2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVkaWEuYW5jaG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50Lm9mZnNldFggLyBpbWFnZS5jbGllbnRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBldmVudC5vZmZzZXRZIC8gaW1hZ2UuY2xpZW50SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sICAgICAgICAgXHJcbiAgICAgICAgICAgIGFkZE1lZGlhRmlsZXM6IGZ1bmN0aW9uIChmaWxlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKChmaWxlcy5sZW5ndGggPiAxKSAmJiAoYWxsb3dNdWx0aXBsZSA9PT0gZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJCgnI29ubHlPbmVJdGVtTWVzc2FnZScpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICBtZWRpYUZpZWxkQXBwLm1lZGlhSXRlbXMucHVzaChmaWxlc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFGaWVsZEFwcC5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAubWVkaWFJdGVtcyA9IG1lZGlhRmllbGRBcHAubWVkaWFJdGVtcy5jb25jYXQoZmlsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhRmllbGRBcHAuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZW1vdmVTZWxlY3RlZDogZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lZGlhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5tZWRpYUl0ZW1zICYmIHRoaXMubWVkaWFJdGVtcy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRNZWRpYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbW92ZSBidXR0b24gY2FuIGFsc28gcmVtb3ZlIGEgdW5pcXVlIG1lZGlhIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZWRpYUl0ZW1zLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbXMuc3BsaWNlKDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZWRpYSA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNlbGVjdEFuZERlbGV0ZU1lZGlhOiBmdW5jdGlvbiAobWVkaWEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRNZWRpYSA9IG1lZGlhO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0VGltZW91dCBiZWNhdXNlIHNvbWV0aW1lcyByZW1vdmVTZWxlY3RlZCB3YXMgY2FsbGVkIGV2ZW4gYmVmb3JlIHRoZSBtZWRpYSB3YXMgc2V0LlxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVTZWxlY3RlZCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2F0Y2g6IHtcclxuICAgICAgICAgICAgbWVkaWFJdGVtczoge1xyXG4gICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGhhbmRsZXIgKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgcHJldmlldyByZW5kZXJpbmdcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgJChkb2N1bWVudCkudHJpZ2dlcignY29udGVudHByZXZpZXc6cmVuZGVyJyk7IH0sIDEwMCk7IFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjdXJyZW50UHJlZnM6IGZ1bmN0aW9uIChuZXdQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21lZGlhRmllbGRQcmVmcycsIEpTT04uc3RyaW5naWZ5KG5ld1ByZWZzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KSk7XHJcbn1cclxuIiwiLy8gZGlmZmVyZW50IG1lZGlhIGZpZWxkIGVkaXRvcnMgd2lsbCBhZGQgdGhlbXNlbHZlcyB0byB0aGlzIGFycmF5XHJcbnZhciBtZWRpYUZpZWxkQXBwcyA9IFtdO1xyXG4iLCIvLyA8bWVkaWEtZmllbGQtdGh1bWJzLWNvbnRhaW5lcj4gY29tcG9uZW50IFxyXG4vLyBkaWZmZXJlbnQgbWVkaWEgZmllbGQgZWRpdG9ycyBzaGFyZSB0aGlzIGNvbXBvbmVudCB0byBwcmVzZW50IHRoZSB0aHVtYnMuXHJcblZ1ZS5jb21wb25lbnQoJ21lZGlhRmllbGRUaHVtYnNDb250YWluZXInLCB7XHJcbiAgICB0ZW1wbGF0ZTogJ1xcXHJcbiAgICAgICA8ZGl2IDppZD1cImlkUHJlZml4ICsgXFwnX21lZGlhQ29udGFpbmVyTWFpblxcJ1wiIHYtY2xvYWs+XFxcclxuICAgICAgICAgPGRpdiB2LWlmPVwibWVkaWFJdGVtcy5sZW5ndGggPCAxXCIgY2xhc3M9XCJjYXJkIHRleHQtY2VudGVyXCI+XFxcclxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9IFwiY2FyZC1ib2R5XCIgPlxcXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpbnRcIj57e1Qubm9JbWFnZXN9fTwvc3Bhbj5cXFxyXG4gICAgICAgICAgICAgPC9kaXY+XFxcclxuICAgICAgICAgPC9kaXY+XFxcclxuICAgICAgICAgPGRyYWdnYWJsZSA6bGlzdD1cIm1lZGlhSXRlbXNcIiB0YWc9XCJvbFwiIGNsYXNzPVwicm93IG1lZGlhLWl0ZW1zLWdyaWRcIiA+XFxcclxuICAgICAgICAgICAgPGxpIHYtZm9yPVwibWVkaWEgaW4gbWVkaWFJdGVtc1wiXFxcclxuICAgICAgICAgICAgICAgIDprZXk9XCJtZWRpYS52dWVrZXlcIiBcXFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZWRpYS1jb250YWluZXItbWFpbi1saXN0LWl0ZW0gY2FyZCBwLTBcIlxcXHJcbiAgICAgICAgICAgICAgICA6c3R5bGU9XCJ7d2lkdGg6IHRodW1iU2l6ZSArIDIgKyBcXCdweFxcJ31cIlxcXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7c2VsZWN0ZWQ6IHNlbGVjdGVkTWVkaWEgPT0gbWVkaWF9XCJcXFxyXG4gICAgICAgICAgICAgICAgdi1vbjpjbGljaz1cInNlbGVjdE1lZGlhKG1lZGlhKVwiIHYtaWY9XCIhbWVkaWEuaXNSZW1vdmVkXCI+XFxcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJtZWRpYS5tZWRpYVBhdGghPT0gXFwnbm90LWZvdW5kXFwnXCI+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRodW1iLWNvbnRhaW5lclwiIDpzdHlsZT1cIntoZWlnaHQ6IHRodW1iU2l6ZSArIFxcJ3B4XFwnfVwiID5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyB2LWlmPVwibWVkaWEubWltZS5zdGFydHNXaXRoKFxcJ2ltYWdlXFwnKVwiIFxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3JjPVwiYnVpbGRNZWRpYVVybChtZWRpYS51cmwsIHRodW1iU2l6ZSlcIiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmRhdGEtbWltZT1cIm1lZGlhLm1pbWVcIlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3R5bGU9XCJ7bWF4SGVpZ2h0OiB0aHVtYlNpemUgKyBcXCdweFxcJyAsIG1heFdpZHRoOiB0aHVtYlNpemUgKyBcXCdweFxcJ31cIi8+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIHYtZWxzZSBjbGFzcz1cImZhLXJlZ3VsYXIgZmEtZmlsZSBkaXNwbGF5LTFcIiA6ZGF0YS1taW1lPVwibWVkaWEubWltZVwiPjwvaT5cXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1jb250YWluZXItbWFpbi1pdGVtLXRpdGxlIGNhcmQtYm9keVwiPlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxvYXQtZW5kIGlubGluZS1tZWRpYS1idXR0b24gZGVsZXRlLWJ1dHRvblwiXFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi1vbjpjbGljay5zdG9wPVwic2VsZWN0QW5kRGVsZXRlTWVkaWEobWVkaWEpXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS10cmFzaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2E+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cIm1lZGlhLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxvYXQtZW5kIGlubGluZS1tZWRpYS1idXR0b24gdmlldy1idXR0b25cIlwiPjxpIGNsYXNzPVwiZmEtc29saWQgZmEtZG93bmxvYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9hPiBcXFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVkaWEtZmlsZW5hbWUgY2FyZC10ZXh0IHNtYWxsXCIgOnRpdGxlPVwibWVkaWEubWVkaWFQYXRoXCI+e3sgbWVkaWEuaXNOZXcgPyBtZWRpYS5uYW1lLnN1YnN0cigzNikgOiBtZWRpYS5uYW1lIH19PC9zcGFuPlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiB2LWVsc2U+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRodW1iLWNvbnRhaW5lciBmbGV4LWNvbHVtblwiIDpzdHlsZT1cIntoZWlnaHQ6IHRodW1iU2l6ZSArIFxcJ3B4XFwnfVwiPlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWJhbiB0ZXh0LWRhbmdlciBkLWJsb2NrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyIHNtYWxsIGQtYmxvY2tcIj57eyBULm1lZGlhTm90Rm91bmQgfX08L3NwYW4+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXIgc21hbGwgZC1ibG9jayB0ZXh0LWNlbnRlclwiPnt7IFQuZGlzY2FyZFdhcm5pbmcgfX08L3NwYW4+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWNvbnRhaW5lci1tYWluLWl0ZW0tdGl0bGUgY2FyZC1ib2R5XCI+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsb2F0LWVuZCBpbmxpbmUtbWVkaWEtYnV0dG9uIGRlbGV0ZS1idXR0b25cIlxcXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi1vbjpjbGljay5zdG9wPVwic2VsZWN0QW5kRGVsZXRlTWVkaWEobWVkaWEpXCI+PGkgY2xhc3M9XCJmYS1zb2xpZCBmYS10cmFzaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2E+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVkaWEtZmlsZW5hbWUgY2FyZC10ZXh0IHNtYWxsIHRleHQtZGFuZ2VyXCIgOnRpdGxlPVwibWVkaWEubmFtZVwiPnt7IG1lZGlhLm5hbWUgfX08L3NwYW4+XFxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXHJcbiAgICAgICAgICAgIDwvbGk+XFxcclxuICAgICAgICAgPC9kcmFnZ2FibGU+XFxcclxuICAgICAgIDwvZGl2PlxcXHJcbiAgICAnLFxyXG4gICAgZGF0YTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIFQ6IHt9XHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIG1lZGlhSXRlbXM6IEFycmF5LFxyXG4gICAgICAgIHNlbGVjdGVkTWVkaWE6IE9iamVjdCxcclxuICAgICAgICB0aHVtYlNpemU6IE51bWJlcixcclxuICAgICAgICBpZFByZWZpeDogU3RyaW5nXHJcbiAgICB9LFxyXG4gICAgY3JlYXRlZDogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHJldHJpZXZpbmcgbG9jYWxpemVkIHN0cmluZ3MgZnJvbSB2aWV3XHJcbiAgICAgICAgc2VsZi5ULm1lZGlhTm90Rm91bmQgPSAkKCcjdC1tZWRpYS1ub3QtZm91bmQnKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQuZGlzY2FyZFdhcm5pbmcgPSAkKCcjdC1kaXNjYXJkLXdhcm5pbmcnKS52YWwoKTtcclxuICAgICAgICBzZWxmLlQubm9JbWFnZXMgPSAkKCcjdC1uby1pbWFnZXMnKS52YWwoKTtcclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgc2VsZWN0QW5kRGVsZXRlTWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICB0aGlzLiRwYXJlbnQuJGVtaXQoJ3NlbGVjdEFuZERlbGV0ZU1lZGlhUmVxdWVzdGVkJywgbWVkaWEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2VsZWN0TWVkaWE6IGZ1bmN0aW9uIChtZWRpYSkge1xyXG4gICAgICAgICAgICB0aGlzLiRwYXJlbnQuJGVtaXQoJ3NlbGVjdE1lZGlhUmVxdWVzdGVkJywgbWVkaWEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYnVpbGRNZWRpYVVybDogZnVuY3Rpb24gKHVybCwgdGh1bWJTaXplKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1cmwgKyAodXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJykgKyAnd2lkdGg9JyArIHRodW1iU2l6ZSArICcmaGVpZ2h0PScgKyB0aHVtYlNpemU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuIl19 diff --git a/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.min.js b/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.min.js index 22e23993cce..1d911339353 100644 --- a/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.min.js +++ b/src/OrchardCore.Modules/OrchardCore.Media/wwwroot/Scripts/media.min.js @@ -1 +1 @@ -function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function ownKeys(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function _objectSpread(e){for(var t=1;t').prop("disabled")),e.support.xhrFileUpload=!(!window.ProgressEvent||!window.FileReader),e.support.xhrFormDataFileUpload=!!window.FormData,e.support.blobSlice=window.Blob&&(Blob.prototype.slice||Blob.prototype.webkitSlice||Blob.prototype.mozSlice),e.widget("blueimp.fileupload",{options:{dropZone:e(document),pasteZone:void 0,fileInput:void 0,replaceFileInput:!0,paramName:void 0,singleFileUploads:!0,limitMultiFileUploads:void 0,limitMultiFileUploadSize:void 0,limitMultiFileUploadSizeOverhead:512,sequentialUploads:!1,limitConcurrentUploads:void 0,forceIframeTransport:!1,redirect:void 0,redirectParamName:void 0,postMessage:void 0,multipart:!0,maxChunkSize:void 0,uploadedBytes:void 0,recalculateProgress:!0,progressInterval:100,bitrateInterval:500,autoUpload:!0,uniqueFilenames:void 0,messages:{uploadedBytes:"Uploaded bytes exceed file size"},i18n:function(t,i){return t=this.messages[t]||t.toString(),i&&e.each(i,(function(e,i){t=t.replace("{"+e+"}",i)})),t},formData:function(e){return e.serializeArray()},add:function(t,i){if(t.isDefaultPrevented())return!1;(i.autoUpload||!1!==i.autoUpload&&e(this).fileupload("option","autoUpload"))&&i.process().done((function(){i.submit()}))},processData:!1,contentType:!1,cache:!1,timeout:0},_promisePipe:(i=e.fn.jquery.split("."),Number(i[0])>1||Number(i[1])>7?"then":"pipe"),_specialOptions:["fileInput","dropZone","pasteZone","multipart","forceIframeTransport"],_blobSlice:e.support.blobSlice&&function(){return(this.slice||this.webkitSlice||this.mozSlice).apply(this,arguments)},_BitrateTimer:function(){this.timestamp=Date.now?Date.now():(new Date).getTime(),this.loaded=0,this.bitrate=0,this.getBitrate=function(e,t,i){var n=e-this.timestamp;return(!this.bitrate||!i||n>i)&&(this.bitrate=(t-this.loaded)*(1e3/n)*8,this.loaded=t,this.timestamp=e),this.bitrate}},_isXHRUpload:function(t){return!t.forceIframeTransport&&(!t.multipart&&e.support.xhrFileUpload||e.support.xhrFormDataFileUpload)},_getFormData:function(t){var i;return"function"===e.type(t.formData)?t.formData(t.form):e.isArray(t.formData)?t.formData:"object"===e.type(t.formData)?(i=[],e.each(t.formData,(function(e,t){i.push({name:e,value:t})})),i):[]},_getTotal:function(t){var i=0;return e.each(t,(function(e,t){i+=t.size||1})),i},_initProgressObject:function(t){var i={loaded:0,total:0,bitrate:0};t._progress?e.extend(t._progress,i):t._progress=i},_initResponseObject:function(e){var t;if(e._response)for(t in e._response)Object.prototype.hasOwnProperty.call(e._response,t)&&delete e._response[t];else e._response={}},_onProgress:function(t,i){if(t.lengthComputable){var n,a=Date.now?Date.now():(new Date).getTime();if(i._time&&i.progressInterval&&a-i._time").prop("href",t.url).prop("host");t.dataType="iframe "+(t.dataType||""),t.formData=this._getFormData(t),t.redirect&&i&&i!==location.host&&t.formData.push({name:t.redirectParamName||"redirect",value:t.redirect})},_initDataSettings:function(e){this._isXHRUpload(e)?(this._chunkedUpload(e,!0)||(e.data||this._initXHRData(e),this._initProgressListener(e)),e.postMessage&&(e.dataType="postmessage "+(e.dataType||""))):this._initIframeSettings(e)},_getParamName:function(t){var i=e(t.fileInput),n=t.paramName;return n?e.isArray(n)||(n=[n]):(n=[],i.each((function(){for(var t=e(this),i=t.prop("name")||"files[]",a=(t.prop("files")||[1]).length;a;)n.push(i),a-=1})),n.length||(n=[i.prop("name")||"files[]"])),n},_initFormSettings:function(t){t.form&&t.form.length||(t.form=e(t.fileInput.prop("form")),t.form.length||(t.form=e(this.options.fileInput.prop("form")))),t.paramName=this._getParamName(t),t.url||(t.url=t.form.prop("action")||location.href),t.type=(t.type||"string"===e.type(t.form.prop("method"))&&t.form.prop("method")||"").toUpperCase(),"POST"!==t.type&&"PUT"!==t.type&&"PATCH"!==t.type&&(t.type="POST"),t.formAcceptCharset||(t.formAcceptCharset=t.form.attr("accept-charset"))},_getAJAXSettings:function(t){var i=e.extend({},this.options,t);return this._initFormSettings(i),this._initDataSettings(i),i},_getDeferredState:function(e){return e.state?e.state():e.isResolved()?"resolved":e.isRejected()?"rejected":"pending"},_enhancePromise:function(e){return e.success=e.done,e.error=e.fail,e.complete=e.always,e},_getXHRPromise:function(t,i,n){var a=e.Deferred(),r=a.promise();return i=i||this.options.context||r,!0===t?a.resolveWith(i,n):!1===t&&a.rejectWith(i,n),r.abort=a.promise,this._enhancePromise(r)},_addConvenienceMethods:function(t,i){var n=this,a=function(t){return e.Deferred().resolveWith(n,t).promise()};i.process=function(t,r){return(t||r)&&(i._processQueue=this._processQueue=(this._processQueue||a([this]))[n._promisePipe]((function(){return i.errorThrown?e.Deferred().rejectWith(n,[i]).promise():a(arguments)}))[n._promisePipe](t,r)),this._processQueue||a([this])},i.submit=function(){return"pending"!==this.state()&&(i.jqXHR=this.jqXHR=!1!==n._trigger("submit",e.Event("submit",{delegatedEvent:t}),this)&&n._onSend(t,this)),this.jqXHR||n._getXHRPromise()},i.abort=function(){return this.jqXHR?this.jqXHR.abort():(this.errorThrown="abort",n._trigger("fail",null,this),n._getXHRPromise(!1))},i.state=function(){return this.jqXHR?n._getDeferredState(this.jqXHR):this._processQueue?n._getDeferredState(this._processQueue):void 0},i.processing=function(){return!this.jqXHR&&this._processQueue&&"pending"===n._getDeferredState(this._processQueue)},i.progress=function(){return this._progress},i.response=function(){return this._response}},_getUploadedBytes:function(e){var t=e.getResponseHeader("Range"),i=t&&t.split("-"),n=i&&i.length>1&&parseInt(i[1],10);return n&&n+1},_chunkedUpload:function(t,i){t.uploadedBytes=t.uploadedBytes||0;var n,a,r=this,o=t.files[0],s=o.size,l=t.uploadedBytes,d=t.maxChunkSize||s,c=this._blobSlice,u=e.Deferred(),p=u.promise();return!(!(this._isXHRUpload(t)&&c&&(l||("function"===e.type(d)?d(t):d)=s?(o.error=t.i18n("uploadedBytes"),this._getXHRPromise(!1,t.context,[null,"error",o.error])):(a=function(){var i=e.extend({},t),p=i._progress.loaded;i.blob=c.call(o,l,l+("function"===e.type(d)?d(i):d),o.type),i.chunkSize=i.blob.size,i.contentRange="bytes "+l+"-"+(l+i.chunkSize-1)+"/"+s,r._trigger("chunkbeforesend",null,i),r._initXHRData(i),r._initProgressListener(i),n=(!1!==r._trigger("chunksend",null,i)&&e.ajax(i)||r._getXHRPromise(!1,i.context)).done((function(n,o,d){l=r._getUploadedBytes(d)||l+i.chunkSize,p+i.chunkSize-i._progress.loaded&&r._onProgress(e.Event("progress",{lengthComputable:!0,loaded:l-i.uploadedBytes,total:l-i.uploadedBytes}),i),t.uploadedBytes=i.uploadedBytes=l,i.result=n,i.textStatus=o,i.jqXHR=d,r._trigger("chunkdone",null,i),r._trigger("chunkalways",null,i),ls._sending)for(var n=s._slots.shift();n;){if("pending"===s._getDeferredState(n)){n.resolve();break}n=s._slots.shift()}0===s._active&&s._trigger("stop")}))};return this._beforeSend(t,l),this.options.sequentialUploads||this.options.limitConcurrentUploads&&this.options.limitConcurrentUploads<=this._sending?(this.options.limitConcurrentUploads>1?(r=e.Deferred(),this._slots.push(r),o=r[s._promisePipe](d)):(this._sequence=this._sequence[s._promisePipe](d,d),o=this._sequence),o.abort=function(){return a=[void 0,"abort","abort"],n?n.abort():(r&&r.rejectWith(l.context,a),d())},this._enhancePromise(o)):d()},_onAdd:function(t,i){var n,a,r,o,s=this,l=!0,d=e.extend({},this.options,i),c=i.files,u=c.length,p=d.limitMultiFileUploads,m=d.limitMultiFileUploadSize,f=d.limitMultiFileUploadSizeOverhead,h=0,g=this._getParamName(d),v=0;if(!u)return!1;if(m&&void 0===c[0].size&&(m=void 0),(d.singleFileUploads||p||m)&&this._isXHRUpload(d))if(d.singleFileUploads||m||!p)if(!d.singleFileUploads&&m)for(r=[],n=[],o=0;om||p&&o+1-v>=p)&&(r.push(c.slice(v,o+1)),(a=g.slice(v,o+1)).length||(a=g),n.push(a),v=o+1,h=0);else n=g;else for(r=[],n=[],o=0;o").append(n)[0].reset(),i.after(n).detach(),a&&n.trigger("focus"),e.cleanData(i.off("remove")),this.options.fileInput=this.options.fileInput.map((function(e,t){return t===i[0]?n[0]:t})),i[0]===this.element[0]&&(this.element=n)},_handleFileTreeEntry:function(t,i){var n,a=this,r=e.Deferred(),o=[],s=function(e){e&&!e.entry&&(e.entry=t),r.resolve([e])};return i=i||"",t.isFile?t._file?(t._file.relativePath=i,r.resolve(t._file)):t.file((function(e){e.relativePath=i,r.resolve(e)}),s):t.isDirectory?(n=t.createReader(),function e(){n.readEntries((function(n){n.length?(o=o.concat(n),e()):function(e){a._handleFileTreeEntries(e,i+t.name+"/").done((function(e){r.resolve(e)})).fail(s)}(o)}),s)}()):r.resolve([]),r.promise()},_handleFileTreeEntries:function(t,i){var n=this;return e.when.apply(e,e.map(t,(function(e){return n._handleFileTreeEntry(e,i)})))[this._promisePipe]((function(){return Array.prototype.concat.apply([],arguments)}))},_getDroppedFiles:function(t){var i=(t=t||{}).items;return i&&i.length&&(i[0].webkitGetAsEntry||i[0].getAsEntry)?this._handleFileTreeEntries(e.map(i,(function(e){var t;return e.webkitGetAsEntry?((t=e.webkitGetAsEntry())&&(t._file=e.getAsFile()),t):e.getAsEntry()}))):e.Deferred().resolve(e.makeArray(t.files)).promise()},_getSingleFileInputFiles:function(t){var i,n,a=(t=e(t)).prop("entries");if(a&&a.length)return this._handleFileTreeEntries(a);if((i=e.makeArray(t.prop("files"))).length)void 0===i[0].name&&i[0].fileName&&e.each(i,(function(e,t){t.name=t.fileName,t.size=t.fileSize}));else{if(!(n=t.prop("value")))return e.Deferred().resolve([]).promise();i=[{name:n.replace(/^.*\\/,"")}]}return e.Deferred().resolve(i).promise()},_getFileInputFiles:function(t){return t instanceof e&&1!==t.length?e.when.apply(e,e.map(t,this._getSingleFileInputFiles))[this._promisePipe]((function(){return Array.prototype.concat.apply([],arguments)})):this._getSingleFileInputFiles(t)},_onChange:function(t){var i=this,n={fileInput:e(t.target),form:e(t.target.form)};this._getFileInputFiles(n.fileInput).always((function(a){n.files=a,i.options.replaceFileInput&&i._replaceFileInput(n),!1!==i._trigger("change",e.Event("change",{delegatedEvent:t}),n)&&i._onAdd(t,n)}))},_onPaste:function(t){var i=t.originalEvent&&t.originalEvent.clipboardData&&t.originalEvent.clipboardData.items,n={files:[]};i&&i.length&&(e.each(i,(function(e,t){var i=t.getAsFile&&t.getAsFile();i&&n.files.push(i)})),!1!==this._trigger("paste",e.Event("paste",{delegatedEvent:t}),n)&&this._onAdd(t,n))},_onDrop:function(t){t.dataTransfer=t.originalEvent&&t.originalEvent.dataTransfer;var i=this,n=t.dataTransfer,a={};n&&n.files&&n.files.length&&(t.preventDefault(),this._getDroppedFiles(n).always((function(n){a.files=n,!1!==i._trigger("drop",e.Event("drop",{delegatedEvent:t}),a)&&i._onAdd(t,a)})))},_onDragOver:t("dragover"),_onDragEnter:t("dragenter"),_onDragLeave:t("dragleave"),_initEventHandlers:function(){this._isXHRUpload(this.options)&&(this._on(this.options.dropZone,{dragover:this._onDragOver,drop:this._onDrop,dragenter:this._onDragEnter,dragleave:this._onDragLeave}),this._on(this.options.pasteZone,{paste:this._onPaste})),e.support.fileInput&&this._on(this.options.fileInput,{change:this._onChange})},_destroyEventHandlers:function(){this._off(this.options.dropZone,"dragenter dragleave dragover drop"),this._off(this.options.pasteZone,"paste"),this._off(this.options.fileInput,"change")},_destroy:function(){this._destroyEventHandlers()},_setOption:function(t,i){var n=-1!==e.inArray(t,this._specialOptions);n&&this._destroyEventHandlers(),this._super(t,i),n&&(this._initSpecialOptions(),this._initEventHandlers())},_initSpecialOptions:function(){var t=this.options;void 0===t.fileInput?t.fileInput=this.element.is('input[type="file"]')?this.element:this.element.find('input[type="file"]'):t.fileInput instanceof e||(t.fileInput=e(t.fileInput)),t.dropZone instanceof e||(t.dropZone=e(t.dropZone)),t.pasteZone instanceof e||(t.pasteZone=e(t.pasteZone))},_getRegExp:function(e){var t=e.split("/"),i=t.pop();return t.shift(),new RegExp(t.join("/"),i)},_isRegExpOption:function(t,i){return"url"!==t&&"string"===e.type(i)&&/^\/.*\/[igm]{0,3}$/.test(i)},_initDataAttributes:function(){var t=this,i=this.options,n=this.element.data();e.each(this.element[0].attributes,(function(e,a){var r,o=a.name.toLowerCase();/^data-/.test(o)&&(o=o.slice(5).replace(/-[a-z]/g,(function(e){return e.charAt(1).toUpperCase()})),r=n[o],t._isRegExpOption(o,r)&&(r=t._getRegExp(r)),i[o]=r)}))},_create:function(){this._initDataAttributes(),this._initSpecialOptions(),this._slots=[],this._sequence=this._getXHRPromise(!0),this._sending=this._active=0,this._initProgressObject(this),this._initEventHandlers()},active:function(){return this._active},progress:function(){return this._progress},add:function(t){var i=this;t&&!this.options.disabled&&(t.fileInput&&!t.files?this._getFileInputFiles(t.fileInput).always((function(e){t.files=e,i._onAdd(null,t)})):(t.files=e.makeArray(t.files),this._onAdd(null,t)))},send:function(t){if(t&&!this.options.disabled){if(t.fileInput&&!t.files){var i,n,a=this,r=e.Deferred(),o=r.promise();return o.abort=function(){return n=!0,i?i.abort():(r.reject(null,"abort","abort"),o)},this._getFileInputFiles(t.fileInput).always((function(e){n||(e.length?(t.files=e,(i=a._onSend(null,t)).then((function(e,t,i){r.resolve(e,t,i)}),(function(e,t,i){r.reject(e,t,i)}))):r.reject())})),this._enhancePromise(o)}if(t.files=e.makeArray(t.files),t.files.length)return this._onSend(null,t)}return this._getXHRPromise(!1,t&&t.context)}})})),function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"object"===("undefined"==typeof exports?"undefined":_typeof(exports))?e(require("jquery")):e(window.jQuery)}((function(e){"use strict";var t=0,i=e,n="parseJSON";"JSON"in window&&"parse"in JSON&&(i=JSON,n="parse"),e.ajaxTransport("iframe",(function(i){if(i.async){var n,a,r,o=i.initialIframeSrc||"javascript:false;";return{send:function(s,l){(n=e('
')).attr("accept-charset",i.formAcceptCharset),r=/\?/.test(i.url)?"&":"?","DELETE"===i.type?(i.url=i.url+r+"_method=DELETE",i.type="POST"):"PUT"===i.type?(i.url=i.url+r+"_method=PUT",i.type="POST"):"PATCH"===i.type&&(i.url=i.url+r+"_method=PATCH",i.type="POST"),a=e('').on("load",(function(){var t,r=e.isArray(i.paramName)?i.paramName:[i.paramName];a.off("load").on("load",(function(){var t;try{if(!(t=a.contents()).length||!t[0].firstChild)throw new Error}catch(e){t=void 0}l(200,"success",{iframe:t}),e('').appendTo(n),window.setTimeout((function(){n.remove()}),0)})),n.prop("target",a.prop("name")).prop("action",i.url).prop("method",i.type),i.formData&&e.each(i.formData,(function(t,i){e('').prop("name",i.name).val(i.value).appendTo(n)})),i.fileInput&&i.fileInput.length&&"POST"===i.type&&(t=i.fileInput.clone(),i.fileInput.after((function(e){return t[e]})),i.paramName&&i.fileInput.each((function(t){e(this).prop("name",r[t]||i.paramName)})),n.append(i.fileInput).prop("enctype","multipart/form-data").prop("encoding","multipart/form-data"),i.fileInput.removeAttr("form")),window.setTimeout((function(){n.submit(),t&&t.length&&i.fileInput.each((function(i,n){var a=e(t[i]);e(n).prop("name",a.prop("name")).attr("form",a.attr("form")),a.replaceWith(n)}))}),0)})),n.append(a).appendTo(document.body)},abort:function(){a&&a.off("load").prop("src",o),n&&n.remove()}}}})),e.ajaxSetup({converters:{"iframe text":function(t){return t&&e(t[0].body).text()},"iframe json":function(t){return t&&i[n](e(t[0].body).text())},"iframe html":function(t){return t&&e(t[0].body).html()},"iframe xml":function(t){var i=t&&t[0];return i&&e.isXMLDoc(i)?i:e.parseXML(i.XMLDocument&&i.XMLDocument.xml||e(i.body).html())},"iframe script":function(t){return t&&e.globalEval(e(t[0].body).text())}}})}));var bus=new Vue;function initializeMediaApplication(e,t,i){initialized||(initialized=!0,t||console.error("mediaApplicationUrl variable is not defined"),$.ajax({url:t,method:"GET",success:function(t){$(".ta-content").append(t),$(document).trigger("mediaapplication:ready");var n={name:$("#t-mediaLibrary").text(),path:"",folder:"",isDirectory:!0};mediaApp=new Vue({el:"#mediaApp",data:{selectedFolder:{},mediaItems:[],selectedMedias:[],errors:[],dragDropThumbnail:new Image,smallThumbs:!1,gridView:!1,mediaFilter:"",sortBy:"",sortAsc:!0,itemsInPage:[]},created:function(){var e=this;e.dragDropThumbnail.src=(i||"")+"/OrchardCore.Media/Images/drag-thumbnail.png",bus.$on("folderSelected",(function(t){e.selectedFolder=t})),bus.$on("folderDeleted",(function(){e.selectRoot()})),bus.$on("folderAdded",(function(t){e.selectedFolder=t,t.selected=!0})),bus.$on("mediaListMoved",(function(t){e.loadFolder(e.selectedFolder),t&&e.errors.push(t)})),bus.$on("mediaRenamed",(function(t,i,n){var a=e.mediaItems.filter((function(e){return e.mediaPath===n}))[0];a.mediaPath=i,a.name=t})),bus.$on("createFolderRequested",(function(t){e.createFolder()})),bus.$on("deleteFolderRequested",(function(t){e.deleteFolder()})),bus.$on("sortChangeRequested",(function(t){e.changeSort(t)})),bus.$on("mediaToggleRequested",(function(t){e.toggleSelectionOfMedia(t)})),bus.$on("renameMediaRequested",(function(t){e.renameMedia(t)})),bus.$on("deleteMediaRequested",(function(t){e.deleteMediaItem(t)})),bus.$on("mediaDragStartRequested",(function(t,i){e.handleDragStart(t,i)})),bus.$on("pagerEvent",(function(t){e.itemsInPage=t,e.selectedMedias=[]})),localStorage.getItem("mediaApplicationPrefs")?e.currentPrefs=JSON.parse(localStorage.getItem("mediaApplicationPrefs")):e.selectedFolder=n},computed:{isHome:function(){return this.selectedFolder==n},parents:function(){var e=[];for(parentFolder=this.selectedFolder;parentFolder&&""!=parentFolder.path;)e.unshift(parentFolder),parentFolder=parentFolder.parent;return e},root:function(){return n},filteredMediaItems:function(){var e=this;e.selectedMedias=[];var t=e.mediaItems.filter((function(t){return t.name.toLowerCase().indexOf(e.mediaFilter.toLowerCase())>-1}));switch(e.sortBy){case"size":t.sort((function(t,i){return e.sortAsc?t.size-i.size:i.size-t.size}));break;case"mime":t.sort((function(t,i){return e.sortAsc?t.mime.toLowerCase().localeCompare(i.mime.toLowerCase()):i.mime.toLowerCase().localeCompare(t.mime.toLowerCase())}));break;case"lastModify":t.sort((function(t,i){return e.sortAsc?t.lastModify-i.lastModify:i.lastModify-t.lastModify}));break;default:t.sort((function(t,i){return e.sortAsc?t.name.toLowerCase().localeCompare(i.name.toLowerCase()):i.name.toLowerCase().localeCompare(t.name.toLowerCase())}))}return t},hiddenCount:function(){return this.mediaItems.length-this.filteredMediaItems.length},thumbSize:function(){return this.smallThumbs?100:240},currentPrefs:{get:function(){return{smallThumbs:this.smallThumbs,selectedFolder:this.selectedFolder,gridView:this.gridView}},set:function(e){e&&(this.smallThumbs=e.smallThumbs,this.selectedFolder=e.selectedFolder,this.gridView=e.gridView)}}},watch:{currentPrefs:function(e){localStorage.setItem("mediaApplicationPrefs",JSON.stringify(e))},selectedFolder:function(e){this.mediaFilter="",this.selectedFolder=e,this.loadFolder(e)}},mounted:function(){this.$refs.rootFolder.toggle()},methods:{uploadUrl:function(){if(!this.selectedFolder)return null;var e=$("#uploadFiles").val();return e+(-1==e.indexOf("?")?"?":"&")+"path="+encodeURIComponent(this.selectedFolder.path)},selectRoot:function(){this.selectedFolder=this.root},loadFolder:function(e){this.errors=[],this.selectedMedias=[];var t=this,i=$("#getMediaItemsUrl").val();console.log(e.path),$.ajax({url:i+(-1==i.indexOf("?")?"?":"&")+"path="+encodeURIComponent(e.path),method:"GET",success:function(e){e.forEach((function(e){e.open=!1})),t.mediaItems=e,t.selectedMedias=[],t.sortBy="",t.sortAsc=!0},error:function(i){console.log("error loading folder:"+e.path),t.selectRoot()}})},selectAll:function(){this.selectedMedias=[];for(var e=0;e-1&&(t.mediaItems.splice(n,1),bus.$emit("mediaDeleted",t.selectedMedias[i]))}t.selectedMedias=[]},error:function(e){console.error(e.responseText)}})}}}))},deleteMediaItem:function(e){var t=this;e&&confirmDialog(_objectSpread(_objectSpread({},$("#deleteMedia").data()),{},{callback:function(i){i&&$.ajax({url:$("#deleteMediaUrl").val()+"?path="+encodeURIComponent(e.mediaPath),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val()},success:function(i){var n=t.mediaItems&&t.mediaItems.indexOf(e);n>-1&&(t.mediaItems.splice(n,1),bus.$emit("mediaDeleted",e))},error:function(e){console.error(e.responseText)}})}}))},handleDragStart:function(e,t){var i=[];this.selectedMedias.forEach((function(e){i.push(e.name)})),0==this.isMediaSelected(e)&&(i.push(e.name),this.selectedMedias.push(e)),t.dataTransfer.setData("mediaNames",JSON.stringify(i)),t.dataTransfer.setData("sourceFolder",this.selectedFolder.path),t.dataTransfer.setDragImage(this.dragDropThumbnail,10,10),t.dataTransfer.effectAllowed="move"},handleScrollWhileDrag:function(e){e.clientY<150&&window.scrollBy(0,-10),e.clientY>window.innerHeight-100&&window.scrollBy(0,10)},changeSort:function(e){this.sortBy==e?this.sortAsc=!this.sortAsc:(this.sortAsc=!0,this.sortBy=e)}}}),$("#create-folder-name").keypress((function(e){if(13==e.which)return $("#modalFooterOk").click(),!1})),$("#modalFooterOk").on("click",(function(e){var t=$("#create-folder-name").val();""!==t&&$.ajax({url:$("#createFolderUrl").val()+"?path="+encodeURIComponent(mediaApp.selectedFolder.path)+"&name="+encodeURIComponent(t),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val()},success:function(e){bus.$emit("addFolder",mediaApp.selectedFolder,e),bootstrap.Modal.getOrCreateInstance($("#createFolderModal")).hide()},error:function(e){$("#createFolderModal-errors").empty();var t=JSON.parse(e.responseText).value;$('').text(t).appendTo($("#createFolderModal-errors"))}})})),$("#renameMediaModalFooterOk").on("click",(function(e){var t=$("#new-item-name").val(),i=$("#old-item-name").val();if(""!==t){var n=mediaApp.selectedFolder.path+"/";"/"===n&&(n="");var a=n+t,r=n+i;if(a.toLowerCase()!==r.toLowerCase())$.ajax({url:$("#renameMediaUrl").val()+"?oldPath="+encodeURIComponent(r)+"&newPath="+encodeURIComponent(a),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val()},success:function(e){bootstrap.Modal.getOrCreateInstance($("#renameMediaModal")).hide(),bus.$emit("mediaRenamed",t,a,r)},error:function(e){$("#renameMediaModal-errors").empty();var t=JSON.parse(e.responseText).value;$('').text(t).appendTo($("#renameMediaModal-errors"))}});else bootstrap.Modal.getOrCreateInstance($("#renameMediaModal")).hide()}})),e&&(document.getElementById("mediaApp").style.display=""),$(document).trigger("mediaApp:ready")},error:function(e){console.error(e.responseText)}}))}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function ownKeys(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function _objectSpread(e){for(var t=1;t0&&a},thumbSize:function(){return this.smallThumbs?120:240},currentPrefs:{get:function(){return{smallThumbs:this.smallThumbs}},set:function(e){e&&(this.smallThumbs=e.smallThumbs)}}},mounted:function(){var e=this;e.paths=c,e.$on("selectAndDeleteMediaRequested",(function(t){e.selectAndDeleteMedia(t)})),e.$on("selectMediaRequested",(function(t){e.selectMedia(t)}));var n="#"+t,r=u.attr("id"),o=crypto.randomUUID();$(n).fileupload({limitConcurrentUploads:20,dropZone:$("#"+r),dataType:"json",url:i,maxChunkSize:l,add:function(t,i){var n,a=i.files.length;for(n=0;n0)for(var r=0;r1&&!1===a?(alert($("#onlyOneItemMessage").val()),d.mediaItems.push(i[0]),d.initialized=!0):(d.mediaItems=d.mediaItems.concat(i),d.initialized=!0)):alert(n)},error:function(e,t,i){console.log("Error on upload."),console.log(e),console.log(t),console.log(i)}}).on("fileuploadchunkbeforesend",(function(e,t){var i=t.files[0];t.blob=new File([t.blob],i.name,{type:i.type,lastModified:i.lastModified})}))},methods:{selectMedia:function(e){this.selectedMedia=e},getUniqueId:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}))},removeSelected:function(e){if(this.selectedMedia){var t=this.mediaItems&&this.mediaItems.indexOf(this.selectedMedia);t>-1&&(this.mediaItems[t].isRemoved=!0,this.mediaItems.splice(t,1))}else 1===this.mediaItems.length&&(this.mediaItems[t].isRemoved=!0,this.mediaItems.splice(0,1));this.selectedMedia=null},showMediaTextModal:function(e){this.mediaTextModal=new bootstrap.Modal(this.$refs.mediaTextModal),this.mediaTextModal.show(),this.backupMediaText=this.selectedMedia.mediaText},cancelMediaTextModal:function(e){this.mediaTextModal.hide(),this.selectedMedia.mediaText=this.backupMediaText},showAnchorModal:function(e){this.anchoringModal=new bootstrap.Modal(this.$refs.anchoringModal),this.anchoringModal.show(),this.selectedMedia.anchor={x:this.selectedMedia.anchor.x,y:this.selectedMedia.anchor.y},this.backupAnchor=this.selectedMedia.anchor},cancelAnchoringModal:function(e){this.anchoringModal.hide(),this.selectedMedia.anchor=this.backupAnchor},resetAnchor:function(e){this.selectedMedia.anchor={x:.5,y:.5}},onAnchorDrop:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},anchorLeft:function(){if(this.$refs.anchorImage&&this.$refs.modalBody&&this.selectedMedia){var e=(this.$refs.modalBody.clientWidth-this.$refs.anchorImage.clientWidth)/2,t=this.selectedMedia.anchor.x*this.$refs.anchorImage.clientWidth+e;return t<17?t=17:t-=8,t+"px"}return"0"},anchorTop:function(){if(this.$refs.anchorImage&&this.selectedMedia){var e=this.selectedMedia.anchor.y*this.$refs.anchorImage.clientHeight;return e<15?e=15:e+=5,e+"px"}return"0"},setAnchor:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},addMediaFiles:function(e){e.length>1&&!1===a?(alert($("#onlyOneItemMessage").val()),d.mediaItems.push(e[0]),d.initialized=!0):(d.mediaItems=d.mediaItems.concat(e),d.initialized=!0)},selectAndDeleteMedia:function(e){var t=this;t.selectedMedia=e,setTimeout((function(){t.removeSelected()}),100)}},watch:{mediaItems:{deep:!0,handler:function(){setTimeout((function(){$(document).trigger("contentpreview:render")}),100)}},currentPrefs:function(e){localStorage.setItem("mediaFieldPrefs",JSON.stringify(e))}}}))}function initializeMediaField(e,t,i,n,a,r){if(null!==e){var o,s=$(document.getElementById($(e).data("for"))).data("init"),l=$(e),d=l.attr("id");t.addEventListener("hidden.bs.modal",(function(e){$("#mediaApp").appendTo("body"),$("#mediaApp").hide()})),mediaFieldApps.push(o=new Vue({el:l.get(0),data:{mediaItems:[],selectedMedia:null,smallThumbs:!1,idPrefix:d,initialized:!1,allowMediaText:a,backupMediaText:"",allowAnchors:r,backupAnchor:null,mediaTextModal:null,anchoringModal:null},created:function(){this.currentPrefs=JSON.parse(localStorage.getItem("mediaFieldPrefs"))},computed:{paths:{get:function(){var e=[];return this.initialized?(this.mediaItems.forEach((function(t){"not-found"!==t.mediaPath&&e.push({path:t.mediaPath,mediaText:t.mediaText,anchor:t.anchor})})),JSON.stringify(e)):JSON.stringify(s)},set:function(e){var t=this,n=e||[],a=$.Deferred(),r=[],o=0;n.forEach((function(e,n){r.push({name:" "+e.path,mime:"",mediaPath:""}),promise=$.when(a).done((function(){$.ajax({url:i+"?path="+encodeURIComponent(e.path),method:"GET",success:function(i){i.vuekey=i.name+n.toString(),i.mediaText=e.mediaText,i.anchor=e.anchor,r.splice(n,1,i),r.length===++o&&(r.forEach((function(e){t.mediaItems.push(e)})),t.initialized=!0)},error:function(i){console.log(i),r.splice(n,1,{name:e.path,mime:"",mediaPath:"not-found",mediaText:"",anchor:{x:0,y:0}}),r.length===++o&&(r.forEach((function(e){t.mediaItems.push(e)})),t.initialized=!0)}})}))})),a.resolve()}},fileSize:function(){return Math.round(this.selectedMedia.size/1024)},canAddMedia:function(){return 0===this.mediaItems.length||this.mediaItems.length>0&&n},thumbSize:function(){return this.smallThumbs?120:240},currentPrefs:{get:function(){return{smallThumbs:this.smallThumbs}},set:function(e){e&&(this.smallThumbs=e.smallThumbs)}}},mounted:function(){var e=this;e.paths=s,e.$on("selectAndDeleteMediaRequested",(function(t){e.selectAndDeleteMedia(t)})),e.$on("selectMediaRequested",(function(t){e.selectMedia(t)})),e.$on("filesUploaded",(function(t){e.addMediaFiles(t)}))},methods:{selectMedia:function(e){this.selectedMedia=e},showModal:function(e){var i=this;if(i.canAddMedia){$("#mediaApp").appendTo($(t).find(".modal-body")),$("#mediaApp").show();var n=new bootstrap.Modal(t);n.show(),$(t).find(".mediaFieldSelectButton").off("click").on("click",(function(e){return i.addMediaFiles(mediaApp.selectedMedias),mediaApp.selectedMedias=[],n.hide(),!0}))}},showMediaTextModal:function(e){this.mediaTextModal=new bootstrap.Modal(this.$refs.mediaTextModal),this.mediaTextModal.show(),this.backupMediaText=this.selectedMedia.mediaText},cancelMediaTextModal:function(e){this.mediaTextModal.hide(),this.selectedMedia.mediaText=this.backupMediaText},showAnchorModal:function(e){this.anchoringModal=new bootstrap.Modal(this.$refs.anchoringModal),this.anchoringModal.show(),this.selectedMedia.anchor={x:this.selectedMedia.anchor.x,y:this.selectedMedia.anchor.y},this.backupAnchor=this.selectedMedia.anchor},cancelAnchoringModal:function(e){this.anchoringModal.hide(),this.selectedMedia.anchor=this.backupAnchor},resetAnchor:function(e){this.selectedMedia.anchor={x:.5,y:.5}},onAnchorDrop:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},anchorLeft:function(){if(this.$refs.anchorImage&&this.$refs.modalBody&&this.selectedMedia){var e=(this.$refs.modalBody.clientWidth-this.$refs.anchorImage.clientWidth)/2,t=this.selectedMedia.anchor.x*this.$refs.anchorImage.clientWidth+e,i=Math.round(this.$refs.modalBody.querySelector(".icon-media-anchor").clientWidth);return Number.isInteger(i)&&(t-=i/2),t+"px"}return"0"},anchorTop:function(){return this.$refs.anchorImage&&this.selectedMedia?this.selectedMedia.anchor.y*this.$refs.anchorImage.clientHeight+"px":"0"},setAnchor:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},addMediaFiles:function(e){e.length>1&&!1===n?(alert($("#onlyOneItemMessage").val()),o.mediaItems.push(e[0]),o.initialized=!0):(o.mediaItems=o.mediaItems.concat(e),o.initialized=!0)},removeSelected:function(e){if(this.selectedMedia){var t=this.mediaItems&&this.mediaItems.indexOf(this.selectedMedia);t>-1&&this.mediaItems.splice(t,1)}else 1===this.mediaItems.length&&this.mediaItems.splice(0,1);this.selectedMedia=null},selectAndDeleteMedia:function(e){var t=this;t.selectedMedia=e,setTimeout((function(){t.removeSelected()}),100)}},watch:{mediaItems:{deep:!0,handler:function(){setTimeout((function(){$(document).trigger("contentpreview:render")}),100)}},currentPrefs:function(e){localStorage.setItem("mediaFieldPrefs",JSON.stringify(e))}}}))}}$(document).on("mediaApp:ready",(function(){var e=crypto.randomUUID();$("#fileupload").fileupload({dropZone:$("#mediaApp"),limitConcurrentUploads:20,dataType:"json",url:$("#uploadFiles").val(),maxChunkSize:Number($("#maxUploadChunkSize").val()||0),formData:function(){var t=$("input[name=__RequestVerificationToken]").val();return[{name:"path",value:mediaApp.selectedFolder.path},{name:"__RequestVerificationToken",value:t},{name:"__chunkedFileUploadId",value:e}]},done:function(e,t){$.each(t.result.files,(function(e,t){t.error||mediaApp.mediaItems.push(t)}))}}).on("fileuploadchunkbeforesend",(function(e,t){var i=t.files[0];t.blob=new File([t.blob],i.name,{type:i.type,lastModified:i.lastModified})}))})),$(document).bind("dragover",(function(e){var t=e.originalEvent.dataTransfer;if(t.types&&(t.types.indexOf?-1!=t.types.indexOf("Files"):t.types.contains("Files"))){var i=$("#customdropzone"),n=window.dropZoneTimeout;n?clearTimeout(n):i.addClass("in");$(e.target).closest(i);window.dropZoneTimeout=setTimeout((function(){window.dropZoneTimeout=null,i.removeClass("in")}),100)}})),Vue.component("folder",{template:'\n
  • \n \n
      \n \n \n
    \n
  • \n '),props:{model:Object,selectedInMediaApp:Object,level:Number},data:function(){return{open:!1,children:null,parent:null,isHovered:!1,padding:0}},computed:{empty:function(){return!this.children||0==this.children.length},isSelected:function(){return this.selectedInMediaApp.name==this.model.name&&this.selectedInMediaApp.path==this.model.path},isRoot:function(){return""===this.model.path}},mounted:function(){0==this.isRoot&&this.isAncestorOfSelectedFolder()&&this.toggle(),this.padding=this.level<3?16:16+8*this.level},created:function(){var e=this;bus.$on("deleteFolder",(function(t){if(e.children){var i=e.children&&e.children.indexOf(t);i>-1&&(e.children.splice(i,1),bus.$emit("folderDeleted"))}})),bus.$on("addFolder",(function(t,i){e.model==t&&(null!==e.children&&e.children.push(i),i.parent=e.model,bus.$emit("folderAdded",i))}))},methods:{isAncestorOfSelectedFolder:function(){for(parentFolder=mediaApp.selectedFolder;parentFolder;){if(parentFolder.path==this.model.path)return!0;parentFolder=parentFolder.parent}return!1},toggle:function(){this.open=!this.open,this.open&&!this.children&&this.loadChildren()},select:function(){bus.$emit("folderSelected",this.model),this.loadChildren()},createFolder:function(){bus.$emit("createFolderRequested")},deleteFolder:function(){bus.$emit("deleteFolderRequested")},loadChildren:function(){var e=this;0==this.open&&(this.open=!0),$.ajax({url:$("#getFoldersUrl").val()+"?path="+encodeURIComponent(e.model.path),method:"GET",success:function(t){e.children=t,e.children.forEach((function(t){t.parent=e.model}))},error:function(e){emtpy=!1,console.error(e.responseText)}})},handleDragOver:function(e){this.isHovered=!0},handleDragLeave:function(e){this.isHovered=!1},moveMediaToFolder:function(e,t){this.isHovered=!1;var i=JSON.parse(t.dataTransfer.getData("mediaNames"));if(!(i.length<1)){var n=t.dataTransfer.getData("sourceFolder"),a=e.path;""===n&&(n="root"),""===a&&(a="root"),n!==a?confirmDialog(_objectSpread(_objectSpread({},$("#moveMedia").data()),{},{callback:function(e){e&&$.ajax({url:$("#moveMediaListUrl").val(),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val(),mediaNames:i,sourceFolder:n,targetFolder:a},success:function(){bus.$emit("mediaListMoved")},error:function(e){console.error(e.responseText),bus.$emit("mediaListMoved",e.responseText)}})}})):alert($("#sameFolderMessage").val())}}}}),Vue.component("media-items-grid",{template:'\n
      \n
    1. \n
      \n \n \n
      \n
      \n \n \n \n {{ media.name }}\n
      \n
    2. \n
    \n ',data:function(){return{T:{}}},props:{filteredMediaItems:Array,selectedMedias:Array,thumbSize:Number},created:function(){this.T.editButton=$("#t-edit-button").val(),this.T.deleteButton=$("#t-delete-button").val()},methods:{isMediaSelected:function(e){return this.selectedMedias.some((function(t,i,n){return t.url.toLowerCase()===e.url.toLowerCase()}))},buildMediaUrl:function(e,t){return e+(-1==e.indexOf("?")?"?":"&")+"width="+t+"&height="+t},toggleSelectionOfMedia:function(e){bus.$emit("mediaToggleRequested",e)},renameMedia:function(e){bus.$emit("renameMediaRequested",e)},deleteMedia:function(e){bus.$emit("deleteMediaRequested",e)},dragStart:function(e,t){bus.$emit("mediaDragStartRequested",e,t)}}}),Vue.component("media-items-table",{template:'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{ T.imageHeader }}\n {{ T.nameHeader }}\n \n \n {{ T.lastModifyHeader }} \n \n \n \n {{ T.sizeHeader }}\n \n \n \n \n {{ T.typeHeader }}\n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    {{ printDateTime(media.lastModify) }}
    \n
    \n
    {{ isNaN(media.size)? 0 : Math.round(media.size / 1024) }} KB
    \n
    \n
    {{ media.mime }}
    \n
    \n ',data:function(){return{T:{}}},props:{sortBy:String,sortAsc:Boolean,filteredMediaItems:Array,selectedMedias:Array,thumbSize:Number},created:function(){var e=this;e.T.imageHeader=$("#t-image-header").val(),e.T.nameHeader=$("#t-name-header").val(),e.T.lastModifyHeader=$("#t-lastModify-header").val(),e.T.sizeHeader=$("#t-size-header").val(),e.T.typeHeader=$("#t-type-header").val(),e.T.editButton=$("#t-edit-button").val(),e.T.deleteButton=$("#t-delete-button").val(),e.T.viewButton=$("#t-view-button").val()},methods:{isMediaSelected:function(e){return this.selectedMedias.some((function(t,i,n){return t.url.toLowerCase()===e.url.toLowerCase()}))},buildMediaUrl:function(e,t){return e+(-1==e.indexOf("?")?"?":"&")+"width="+t+"&height="+t},changeSort:function(e){bus.$emit("sortChangeRequested",e)},toggleSelectionOfMedia:function(e){bus.$emit("mediaToggleRequested",e)},renameMedia:function(e){bus.$emit("renameMediaRequested",e)},deleteMedia:function(e){bus.$emit("deleteMediaRequested",e)},dragStart:function(e,t){bus.$emit("mediaDragStartRequested",e,t)},printDateTime:function(e){return new Date(e).toLocaleString()}}}),Vue.component("pager",{template:'\n
    \n \n \n
    \n ',props:{sourceItems:Array},data:function(){return{pageSize:10,pageSizeOptions:[10,30,50,100],current:0,T:{}}},created:function(){var e=this;e.T.pagerFirstButton=$("#t-pager-first-button").val(),e.T.pagerPreviousButton=$("#t-pager-previous-button").val(),e.T.pagerNextButton=$("#t-pager-next-button").val(),e.T.pagerLastButton=$("#t-pager-last-button").val(),e.T.pagerPageSizeLabel=$("#t-pager-page-size-label").val(),e.T.pagerPageLabel=$("#t-pager-page-label").val(),e.T.pagerTotalLabel=$("#t-pager-total-label").val()},methods:{next:function(){this.current=this.current+1},previous:function(){this.current=this.current-1},goFirst:function(){this.current=0},goLast:function(){this.current=this.totalPages-1},goTo:function(e){this.current=e}},computed:{total:function(){return this.sourceItems?this.sourceItems.length:0},totalPages:function(){var e=Math.ceil(this.total/this.pageSize);return e>0?e:1},isLastPage:function(){return this.current+1>=this.totalPages},isFirstPage:function(){return 0===this.current},canDoNext:function(){return!this.isLastPage},canDoPrev:function(){return!this.isFirstPage},canDoFirst:function(){return!this.isFirstPage},canDoLast:function(){return!this.isLastPage},itemsInCurrentPage:function(){var e=this.pageSize*this.current,t=e+this.pageSize,i=this.sourceItems.slice(e,t);return bus.$emit("pagerEvent",i),i},pageLinks:function(){var e=[];e.push(this.current+1);var t=this.current>0?this.current:-1;e.unshift(t);var i=this.current>1?this.current-1:-1;e.unshift(i);var n=this.totalPages-this.current>1?this.current+2:-1;e.push(n);var a=this.totalPages-this.current>2?this.current+3:-1;return e.push(a),e}},watch:{sourceItems:function(){this.current=0},pageSize:function(){this.current=0}}}),Vue.component("sortIndicator",{template:'\n
    \n \n \n
    \n ',props:{colname:String,selectedcolname:String,asc:Boolean},computed:{isActive:function(){return this.colname.toLowerCase()==this.selectedcolname.toLowerCase()}}});var mediaFieldApps=[];Vue.component("mediaFieldThumbsContainer",{template:'
    {{T.noImages}}
  • {{ media.isNew ? media.name.substr(36) : media.name }}
    {{ T.mediaNotFound }} {{ T.discardWarning }}
    {{ media.name }}
  • ',data:function(){return{T:{}}},props:{mediaItems:Array,selectedMedia:Object,thumbSize:Number,idPrefix:String},created:function(){var e=this;e.T.mediaNotFound=$("#t-media-not-found").val(),e.T.discardWarning=$("#t-discard-warning").val(),e.T.noImages=$("#t-no-images").val()},methods:{selectAndDeleteMedia:function(e){this.$parent.$emit("selectAndDeleteMediaRequested",e)},selectMedia:function(e){this.$parent.$emit("selectMediaRequested",e)},buildMediaUrl:function(e,t){return e+(-1==e.indexOf("?")?"?":"&")+"width="+t+"&height="+t}}}),Vue.component("upload",{template:'

    {{ model.name }}

    Error: {{ model.errorMessage }}
    ',props:{model:Object,uploadInputId:String},mounted:function(){var e,t=this,i=document.getElementById(null!==(e=t.uploadInputId)&&void 0!==e?e:"fileupload");$(i).bind("fileuploadprogress",(function(e,i){i.files[0].name===t.model.name&&(t.model.percentage=parseInt(i.loaded/i.total*100,10))})),$(i).bind("fileuploaddone",(function(e,i){i.files[0].name===t.model.name&&(i.result.files[0].error?t.handleFailure(i.files[0].name,i.result.files[0].error):bus.$emit("removalRequest",t.model))})),$(i).bind("fileuploadfail",(function(e,i){i.files[0].name===t.model.name&&t.handleFailure(i.files[0].name,$("#t-error").val())}))},methods:{handleFailure:function(e,t){e===this.model.name&&(this.model.errorMessage=t,bus.$emit("ErrorOnUpload",this.model))},dismissWarning:function(){bus.$emit("removalRequest",this.model)}}}),Vue.component("uploadList",{template:'
    {{ T.uploads }} (Pending: {{ pendingCount }}) ( {{ T.errors }}: {{ errorCount }} / {{ T.clearErrors }} )
    ',data:function(){return{files:[],T:{},expanded:!1,pendingCount:0,errorCount:0}},props:{uploadInputId:String},created:function(){var e=this;e.T.uploads=$("#t-uploads").val(),e.T.errors=$("#t-errors").val(),e.T.clearErrors=$("#t-clear-errors").val()},computed:{fileCount:function(){return this.files.length}},mounted:function(){var e,t=this,i=document.getElementById(null!==(e=t.uploadInputId)&&void 0!==e?e:"fileupload");$(i).bind("fileuploadadd",(function(e,i){i.files&&i.files.forEach((function(e){t.files.some((function(t){return t.name==e.name}))?console.error("A file with the same name is already on the queue:"+e.name):t.files.push({name:e.name,percentage:0,errorMessage:""})}))})),bus.$on("removalRequest",(function(e){t.files.forEach((function(t,i,n){t.name==e.name&&n.splice(i,1)}))})),bus.$on("ErrorOnUpload",(function(e){t.updateCount()}))},methods:{updateCount:function(){this.errorCount=this.files.filter((function(e){return""!=e.errorMessage})).length,this.pendingCount=this.files.length-this.errorCount,this.files.length<1&&(this.expanded=!1)},clearErrors:function(){this.files=this.files.filter((function(e){return""==e.errorMessage}))}},watch:{files:function(){this.updateCount()}}}); +function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function ownKeys(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function _objectSpread(e){for(var t=1;t').prop("disabled")),e.support.xhrFileUpload=!(!window.ProgressEvent||!window.FileReader),e.support.xhrFormDataFileUpload=!!window.FormData,e.support.blobSlice=window.Blob&&(Blob.prototype.slice||Blob.prototype.webkitSlice||Blob.prototype.mozSlice),e.widget("blueimp.fileupload",{options:{dropZone:e(document),pasteZone:void 0,fileInput:void 0,replaceFileInput:!0,paramName:void 0,singleFileUploads:!0,limitMultiFileUploads:void 0,limitMultiFileUploadSize:void 0,limitMultiFileUploadSizeOverhead:512,sequentialUploads:!1,limitConcurrentUploads:void 0,forceIframeTransport:!1,redirect:void 0,redirectParamName:void 0,postMessage:void 0,multipart:!0,maxChunkSize:void 0,uploadedBytes:void 0,recalculateProgress:!0,progressInterval:100,bitrateInterval:500,autoUpload:!0,uniqueFilenames:void 0,messages:{uploadedBytes:"Uploaded bytes exceed file size"},i18n:function(t,i){return t=this.messages[t]||t.toString(),i&&e.each(i,(function(e,i){t=t.replace("{"+e+"}",i)})),t},formData:function(e){return e.serializeArray()},add:function(t,i){if(t.isDefaultPrevented())return!1;(i.autoUpload||!1!==i.autoUpload&&e(this).fileupload("option","autoUpload"))&&i.process().done((function(){i.submit()}))},processData:!1,contentType:!1,cache:!1,timeout:0},_promisePipe:(i=e.fn.jquery.split("."),Number(i[0])>1||Number(i[1])>7?"then":"pipe"),_specialOptions:["fileInput","dropZone","pasteZone","multipart","forceIframeTransport"],_blobSlice:e.support.blobSlice&&function(){return(this.slice||this.webkitSlice||this.mozSlice).apply(this,arguments)},_BitrateTimer:function(){this.timestamp=Date.now?Date.now():(new Date).getTime(),this.loaded=0,this.bitrate=0,this.getBitrate=function(e,t,i){var n=e-this.timestamp;return(!this.bitrate||!i||n>i)&&(this.bitrate=(t-this.loaded)*(1e3/n)*8,this.loaded=t,this.timestamp=e),this.bitrate}},_isXHRUpload:function(t){return!t.forceIframeTransport&&(!t.multipart&&e.support.xhrFileUpload||e.support.xhrFormDataFileUpload)},_getFormData:function(t){var i;return"function"===e.type(t.formData)?t.formData(t.form):e.isArray(t.formData)?t.formData:"object"===e.type(t.formData)?(i=[],e.each(t.formData,(function(e,t){i.push({name:e,value:t})})),i):[]},_getTotal:function(t){var i=0;return e.each(t,(function(e,t){i+=t.size||1})),i},_initProgressObject:function(t){var i={loaded:0,total:0,bitrate:0};t._progress?e.extend(t._progress,i):t._progress=i},_initResponseObject:function(e){var t;if(e._response)for(t in e._response)Object.prototype.hasOwnProperty.call(e._response,t)&&delete e._response[t];else e._response={}},_onProgress:function(t,i){if(t.lengthComputable){var n,a=Date.now?Date.now():(new Date).getTime();if(i._time&&i.progressInterval&&a-i._time").prop("href",t.url).prop("host");t.dataType="iframe "+(t.dataType||""),t.formData=this._getFormData(t),t.redirect&&i&&i!==location.host&&t.formData.push({name:t.redirectParamName||"redirect",value:t.redirect})},_initDataSettings:function(e){this._isXHRUpload(e)?(this._chunkedUpload(e,!0)||(e.data||this._initXHRData(e),this._initProgressListener(e)),e.postMessage&&(e.dataType="postmessage "+(e.dataType||""))):this._initIframeSettings(e)},_getParamName:function(t){var i=e(t.fileInput),n=t.paramName;return n?e.isArray(n)||(n=[n]):(n=[],i.each((function(){for(var t=e(this),i=t.prop("name")||"files[]",a=(t.prop("files")||[1]).length;a;)n.push(i),a-=1})),n.length||(n=[i.prop("name")||"files[]"])),n},_initFormSettings:function(t){t.form&&t.form.length||(t.form=e(t.fileInput.prop("form")),t.form.length||(t.form=e(this.options.fileInput.prop("form")))),t.paramName=this._getParamName(t),t.url||(t.url=t.form.prop("action")||location.href),t.type=(t.type||"string"===e.type(t.form.prop("method"))&&t.form.prop("method")||"").toUpperCase(),"POST"!==t.type&&"PUT"!==t.type&&"PATCH"!==t.type&&(t.type="POST"),t.formAcceptCharset||(t.formAcceptCharset=t.form.attr("accept-charset"))},_getAJAXSettings:function(t){var i=e.extend({},this.options,t);return this._initFormSettings(i),this._initDataSettings(i),i},_getDeferredState:function(e){return e.state?e.state():e.isResolved()?"resolved":e.isRejected()?"rejected":"pending"},_enhancePromise:function(e){return e.success=e.done,e.error=e.fail,e.complete=e.always,e},_getXHRPromise:function(t,i,n){var a=e.Deferred(),r=a.promise();return i=i||this.options.context||r,!0===t?a.resolveWith(i,n):!1===t&&a.rejectWith(i,n),r.abort=a.promise,this._enhancePromise(r)},_addConvenienceMethods:function(t,i){var n=this,a=function(t){return e.Deferred().resolveWith(n,t).promise()};i.process=function(t,r){return(t||r)&&(i._processQueue=this._processQueue=(this._processQueue||a([this]))[n._promisePipe]((function(){return i.errorThrown?e.Deferred().rejectWith(n,[i]).promise():a(arguments)}))[n._promisePipe](t,r)),this._processQueue||a([this])},i.submit=function(){return"pending"!==this.state()&&(i.jqXHR=this.jqXHR=!1!==n._trigger("submit",e.Event("submit",{delegatedEvent:t}),this)&&n._onSend(t,this)),this.jqXHR||n._getXHRPromise()},i.abort=function(){return this.jqXHR?this.jqXHR.abort():(this.errorThrown="abort",n._trigger("fail",null,this),n._getXHRPromise(!1))},i.state=function(){return this.jqXHR?n._getDeferredState(this.jqXHR):this._processQueue?n._getDeferredState(this._processQueue):void 0},i.processing=function(){return!this.jqXHR&&this._processQueue&&"pending"===n._getDeferredState(this._processQueue)},i.progress=function(){return this._progress},i.response=function(){return this._response}},_getUploadedBytes:function(e){var t=e.getResponseHeader("Range"),i=t&&t.split("-"),n=i&&i.length>1&&parseInt(i[1],10);return n&&n+1},_chunkedUpload:function(t,i){t.uploadedBytes=t.uploadedBytes||0;var n,a,r=this,o=t.files[0],s=o.size,l=t.uploadedBytes,d=t.maxChunkSize||s,c=this._blobSlice,u=e.Deferred(),p=u.promise();return!(!(this._isXHRUpload(t)&&c&&(l||("function"===e.type(d)?d(t):d)=s?(o.error=t.i18n("uploadedBytes"),this._getXHRPromise(!1,t.context,[null,"error",o.error])):(a=function(){var i=e.extend({},t),p=i._progress.loaded;i.blob=c.call(o,l,l+("function"===e.type(d)?d(i):d),o.type),i.chunkSize=i.blob.size,i.contentRange="bytes "+l+"-"+(l+i.chunkSize-1)+"/"+s,r._trigger("chunkbeforesend",null,i),r._initXHRData(i),r._initProgressListener(i),n=(!1!==r._trigger("chunksend",null,i)&&e.ajax(i)||r._getXHRPromise(!1,i.context)).done((function(n,o,d){l=r._getUploadedBytes(d)||l+i.chunkSize,p+i.chunkSize-i._progress.loaded&&r._onProgress(e.Event("progress",{lengthComputable:!0,loaded:l-i.uploadedBytes,total:l-i.uploadedBytes}),i),t.uploadedBytes=i.uploadedBytes=l,i.result=n,i.textStatus=o,i.jqXHR=d,r._trigger("chunkdone",null,i),r._trigger("chunkalways",null,i),ls._sending)for(var n=s._slots.shift();n;){if("pending"===s._getDeferredState(n)){n.resolve();break}n=s._slots.shift()}0===s._active&&s._trigger("stop")}))};return this._beforeSend(t,l),this.options.sequentialUploads||this.options.limitConcurrentUploads&&this.options.limitConcurrentUploads<=this._sending?(this.options.limitConcurrentUploads>1?(r=e.Deferred(),this._slots.push(r),o=r[s._promisePipe](d)):(this._sequence=this._sequence[s._promisePipe](d,d),o=this._sequence),o.abort=function(){return a=[void 0,"abort","abort"],n?n.abort():(r&&r.rejectWith(l.context,a),d())},this._enhancePromise(o)):d()},_onAdd:function(t,i){var n,a,r,o,s=this,l=!0,d=e.extend({},this.options,i),c=i.files,u=c.length,p=d.limitMultiFileUploads,m=d.limitMultiFileUploadSize,f=d.limitMultiFileUploadSizeOverhead,h=0,g=this._getParamName(d),v=0;if(!u)return!1;if(m&&void 0===c[0].size&&(m=void 0),(d.singleFileUploads||p||m)&&this._isXHRUpload(d))if(d.singleFileUploads||m||!p)if(!d.singleFileUploads&&m)for(r=[],n=[],o=0;om||p&&o+1-v>=p)&&(r.push(c.slice(v,o+1)),(a=g.slice(v,o+1)).length||(a=g),n.push(a),v=o+1,h=0);else n=g;else for(r=[],n=[],o=0;o").append(n)[0].reset(),i.after(n).detach(),a&&n.trigger("focus"),e.cleanData(i.off("remove")),this.options.fileInput=this.options.fileInput.map((function(e,t){return t===i[0]?n[0]:t})),i[0]===this.element[0]&&(this.element=n)},_handleFileTreeEntry:function(t,i){var n,a=this,r=e.Deferred(),o=[],s=function(e){e&&!e.entry&&(e.entry=t),r.resolve([e])};return i=i||"",t.isFile?t._file?(t._file.relativePath=i,r.resolve(t._file)):t.file((function(e){e.relativePath=i,r.resolve(e)}),s):t.isDirectory?(n=t.createReader(),function e(){n.readEntries((function(n){n.length?(o=o.concat(n),e()):function(e){a._handleFileTreeEntries(e,i+t.name+"/").done((function(e){r.resolve(e)})).fail(s)}(o)}),s)}()):r.resolve([]),r.promise()},_handleFileTreeEntries:function(t,i){var n=this;return e.when.apply(e,e.map(t,(function(e){return n._handleFileTreeEntry(e,i)})))[this._promisePipe]((function(){return Array.prototype.concat.apply([],arguments)}))},_getDroppedFiles:function(t){var i=(t=t||{}).items;return i&&i.length&&(i[0].webkitGetAsEntry||i[0].getAsEntry)?this._handleFileTreeEntries(e.map(i,(function(e){var t;return e.webkitGetAsEntry?((t=e.webkitGetAsEntry())&&(t._file=e.getAsFile()),t):e.getAsEntry()}))):e.Deferred().resolve(e.makeArray(t.files)).promise()},_getSingleFileInputFiles:function(t){var i,n,a=(t=e(t)).prop("entries");if(a&&a.length)return this._handleFileTreeEntries(a);if((i=e.makeArray(t.prop("files"))).length)void 0===i[0].name&&i[0].fileName&&e.each(i,(function(e,t){t.name=t.fileName,t.size=t.fileSize}));else{if(!(n=t.prop("value")))return e.Deferred().resolve([]).promise();i=[{name:n.replace(/^.*\\/,"")}]}return e.Deferred().resolve(i).promise()},_getFileInputFiles:function(t){return t instanceof e&&1!==t.length?e.when.apply(e,e.map(t,this._getSingleFileInputFiles))[this._promisePipe]((function(){return Array.prototype.concat.apply([],arguments)})):this._getSingleFileInputFiles(t)},_onChange:function(t){var i=this,n={fileInput:e(t.target),form:e(t.target.form)};this._getFileInputFiles(n.fileInput).always((function(a){n.files=a,i.options.replaceFileInput&&i._replaceFileInput(n),!1!==i._trigger("change",e.Event("change",{delegatedEvent:t}),n)&&i._onAdd(t,n)}))},_onPaste:function(t){var i=t.originalEvent&&t.originalEvent.clipboardData&&t.originalEvent.clipboardData.items,n={files:[]};i&&i.length&&(e.each(i,(function(e,t){var i=t.getAsFile&&t.getAsFile();i&&n.files.push(i)})),!1!==this._trigger("paste",e.Event("paste",{delegatedEvent:t}),n)&&this._onAdd(t,n))},_onDrop:function(t){t.dataTransfer=t.originalEvent&&t.originalEvent.dataTransfer;var i=this,n=t.dataTransfer,a={};n&&n.files&&n.files.length&&(t.preventDefault(),this._getDroppedFiles(n).always((function(n){a.files=n,!1!==i._trigger("drop",e.Event("drop",{delegatedEvent:t}),a)&&i._onAdd(t,a)})))},_onDragOver:t("dragover"),_onDragEnter:t("dragenter"),_onDragLeave:t("dragleave"),_initEventHandlers:function(){this._isXHRUpload(this.options)&&(this._on(this.options.dropZone,{dragover:this._onDragOver,drop:this._onDrop,dragenter:this._onDragEnter,dragleave:this._onDragLeave}),this._on(this.options.pasteZone,{paste:this._onPaste})),e.support.fileInput&&this._on(this.options.fileInput,{change:this._onChange})},_destroyEventHandlers:function(){this._off(this.options.dropZone,"dragenter dragleave dragover drop"),this._off(this.options.pasteZone,"paste"),this._off(this.options.fileInput,"change")},_destroy:function(){this._destroyEventHandlers()},_setOption:function(t,i){var n=-1!==e.inArray(t,this._specialOptions);n&&this._destroyEventHandlers(),this._super(t,i),n&&(this._initSpecialOptions(),this._initEventHandlers())},_initSpecialOptions:function(){var t=this.options;void 0===t.fileInput?t.fileInput=this.element.is('input[type="file"]')?this.element:this.element.find('input[type="file"]'):t.fileInput instanceof e||(t.fileInput=e(t.fileInput)),t.dropZone instanceof e||(t.dropZone=e(t.dropZone)),t.pasteZone instanceof e||(t.pasteZone=e(t.pasteZone))},_getRegExp:function(e){var t=e.split("/"),i=t.pop();return t.shift(),new RegExp(t.join("/"),i)},_isRegExpOption:function(t,i){return"url"!==t&&"string"===e.type(i)&&/^\/.*\/[igm]{0,3}$/.test(i)},_initDataAttributes:function(){var t=this,i=this.options,n=this.element.data();e.each(this.element[0].attributes,(function(e,a){var r,o=a.name.toLowerCase();/^data-/.test(o)&&(o=o.slice(5).replace(/-[a-z]/g,(function(e){return e.charAt(1).toUpperCase()})),r=n[o],t._isRegExpOption(o,r)&&(r=t._getRegExp(r)),i[o]=r)}))},_create:function(){this._initDataAttributes(),this._initSpecialOptions(),this._slots=[],this._sequence=this._getXHRPromise(!0),this._sending=this._active=0,this._initProgressObject(this),this._initEventHandlers()},active:function(){return this._active},progress:function(){return this._progress},add:function(t){var i=this;t&&!this.options.disabled&&(t.fileInput&&!t.files?this._getFileInputFiles(t.fileInput).always((function(e){t.files=e,i._onAdd(null,t)})):(t.files=e.makeArray(t.files),this._onAdd(null,t)))},send:function(t){if(t&&!this.options.disabled){if(t.fileInput&&!t.files){var i,n,a=this,r=e.Deferred(),o=r.promise();return o.abort=function(){return n=!0,i?i.abort():(r.reject(null,"abort","abort"),o)},this._getFileInputFiles(t.fileInput).always((function(e){n||(e.length?(t.files=e,(i=a._onSend(null,t)).then((function(e,t,i){r.resolve(e,t,i)}),(function(e,t,i){r.reject(e,t,i)}))):r.reject())})),this._enhancePromise(o)}if(t.files=e.makeArray(t.files),t.files.length)return this._onSend(null,t)}return this._getXHRPromise(!1,t&&t.context)}})})),function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"object"===("undefined"==typeof exports?"undefined":_typeof(exports))?e(require("jquery")):e(window.jQuery)}((function(e){"use strict";var t=0,i=e,n="parseJSON";"JSON"in window&&"parse"in JSON&&(i=JSON,n="parse"),e.ajaxTransport("iframe",(function(i){if(i.async){var n,a,r,o=i.initialIframeSrc||"javascript:false;";return{send:function(s,l){(n=e('
    ')).attr("accept-charset",i.formAcceptCharset),r=/\?/.test(i.url)?"&":"?","DELETE"===i.type?(i.url=i.url+r+"_method=DELETE",i.type="POST"):"PUT"===i.type?(i.url=i.url+r+"_method=PUT",i.type="POST"):"PATCH"===i.type&&(i.url=i.url+r+"_method=PATCH",i.type="POST"),a=e('').on("load",(function(){var t,r=e.isArray(i.paramName)?i.paramName:[i.paramName];a.off("load").on("load",(function(){var t;try{if(!(t=a.contents()).length||!t[0].firstChild)throw new Error}catch(e){t=void 0}l(200,"success",{iframe:t}),e('').appendTo(n),window.setTimeout((function(){n.remove()}),0)})),n.prop("target",a.prop("name")).prop("action",i.url).prop("method",i.type),i.formData&&e.each(i.formData,(function(t,i){e('').prop("name",i.name).val(i.value).appendTo(n)})),i.fileInput&&i.fileInput.length&&"POST"===i.type&&(t=i.fileInput.clone(),i.fileInput.after((function(e){return t[e]})),i.paramName&&i.fileInput.each((function(t){e(this).prop("name",r[t]||i.paramName)})),n.append(i.fileInput).prop("enctype","multipart/form-data").prop("encoding","multipart/form-data"),i.fileInput.removeAttr("form")),window.setTimeout((function(){n.submit(),t&&t.length&&i.fileInput.each((function(i,n){var a=e(t[i]);e(n).prop("name",a.prop("name")).attr("form",a.attr("form")),a.replaceWith(n)}))}),0)})),n.append(a).appendTo(document.body)},abort:function(){a&&a.off("load").prop("src",o),n&&n.remove()}}}})),e.ajaxSetup({converters:{"iframe text":function(t){return t&&e(t[0].body).text()},"iframe json":function(t){return t&&i[n](e(t[0].body).text())},"iframe html":function(t){return t&&e(t[0].body).html()},"iframe xml":function(t){var i=t&&t[0];return i&&e.isXMLDoc(i)?i:e.parseXML(i.XMLDocument&&i.XMLDocument.xml||e(i.body).html())},"iframe script":function(t){return t&&e.globalEval(e(t[0].body).text())}}})}));var bus=new Vue;function initializeMediaApplication(e,t,i){initialized||(initialized=!0,t||console.error("mediaApplicationUrl variable is not defined"),$.ajax({url:t,method:"GET",success:function(t){$(".ta-content").append(t),$(document).trigger("mediaapplication:ready");var n={name:$("#t-mediaLibrary").text(),path:"",folder:"",isDirectory:!0};mediaApp=new Vue({el:"#mediaApp",data:{selectedFolder:{},mediaItems:[],selectedMedias:[],errors:[],dragDropThumbnail:new Image,smallThumbs:!1,gridView:!1,mediaFilter:"",sortBy:"",sortAsc:!0,itemsInPage:[]},created:function(){var e=this;e.dragDropThumbnail.src=(i||"")+"/OrchardCore.Media/Images/drag-thumbnail.png",bus.$on("folderSelected",(function(t){e.selectedFolder=t})),bus.$on("folderDeleted",(function(){e.selectRoot()})),bus.$on("folderAdded",(function(t){e.selectedFolder=t,t.selected=!0})),bus.$on("mediaListMoved",(function(t){e.loadFolder(e.selectedFolder),t&&e.errors.push(t)})),bus.$on("mediaRenamed",(function(t,i,n){var a=e.mediaItems.filter((function(e){return e.mediaPath===n}))[0];a.mediaPath=i,a.name=t})),bus.$on("createFolderRequested",(function(t){e.createFolder()})),bus.$on("deleteFolderRequested",(function(t){e.deleteFolder()})),bus.$on("sortChangeRequested",(function(t){e.changeSort(t)})),bus.$on("mediaToggleRequested",(function(t){e.toggleSelectionOfMedia(t)})),bus.$on("renameMediaRequested",(function(t){e.renameMedia(t)})),bus.$on("deleteMediaRequested",(function(t){e.deleteMediaItem(t)})),bus.$on("mediaDragStartRequested",(function(t,i){e.handleDragStart(t,i)})),bus.$on("pagerEvent",(function(t){e.itemsInPage=t,e.selectedMedias=[]})),localStorage.getItem("mediaApplicationPrefs")?e.currentPrefs=JSON.parse(localStorage.getItem("mediaApplicationPrefs")):e.selectedFolder=n},computed:{isHome:function(){return this.selectedFolder==n},parents:function(){var e=[];for(parentFolder=this.selectedFolder;parentFolder&&""!=parentFolder.path;)e.unshift(parentFolder),parentFolder=parentFolder.parent;return e},root:function(){return n},filteredMediaItems:function(){var e=this;e.selectedMedias=[];var t=e.mediaItems.filter((function(t){return t.name.toLowerCase().indexOf(e.mediaFilter.toLowerCase())>-1}));switch(e.sortBy){case"size":t.sort((function(t,i){return e.sortAsc?t.size-i.size:i.size-t.size}));break;case"mime":t.sort((function(t,i){return e.sortAsc?t.mime.toLowerCase().localeCompare(i.mime.toLowerCase()):i.mime.toLowerCase().localeCompare(t.mime.toLowerCase())}));break;case"lastModify":t.sort((function(t,i){return e.sortAsc?t.lastModify-i.lastModify:i.lastModify-t.lastModify}));break;default:t.sort((function(t,i){return e.sortAsc?t.name.toLowerCase().localeCompare(i.name.toLowerCase()):i.name.toLowerCase().localeCompare(t.name.toLowerCase())}))}return t},hiddenCount:function(){return this.mediaItems.length-this.filteredMediaItems.length},thumbSize:function(){return this.smallThumbs?100:240},currentPrefs:{get:function(){return{smallThumbs:this.smallThumbs,selectedFolder:this.selectedFolder,gridView:this.gridView}},set:function(e){e&&(this.smallThumbs=e.smallThumbs,this.selectedFolder=e.selectedFolder,this.gridView=e.gridView)}}},watch:{currentPrefs:function(e){localStorage.setItem("mediaApplicationPrefs",JSON.stringify(e))},selectedFolder:function(e){this.mediaFilter="",this.selectedFolder=e,this.loadFolder(e)}},mounted:function(){this.$refs.rootFolder.toggle()},methods:{uploadUrl:function(){if(!this.selectedFolder)return null;var e=$("#uploadFiles").val();return e+(-1==e.indexOf("?")?"?":"&")+"path="+encodeURIComponent(this.selectedFolder.path)},selectRoot:function(){this.selectedFolder=this.root},loadFolder:function(e){this.errors=[],this.selectedMedias=[];var t=this,i=$("#getMediaItemsUrl").val();console.log(e.path),$.ajax({url:i+(-1==i.indexOf("?")?"?":"&")+"path="+encodeURIComponent(e.path),method:"GET",success:function(e){e.forEach((function(e){e.open=!1})),t.mediaItems=e,t.selectedMedias=[],t.sortBy="",t.sortAsc=!0},error:function(i){console.log("error loading folder:"+e.path),t.selectRoot()}})},selectAll:function(){this.selectedMedias=[];for(var e=0;e-1&&(t.mediaItems.splice(n,1),bus.$emit("mediaDeleted",t.selectedMedias[i]))}t.selectedMedias=[]},error:function(e){console.error(e.responseText)}})}}}))},deleteMediaItem:function(e){var t=this;e&&confirmDialog(_objectSpread(_objectSpread({},$("#deleteMedia").data()),{},{callback:function(i){i&&$.ajax({url:$("#deleteMediaUrl").val()+"?path="+encodeURIComponent(e.mediaPath),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val()},success:function(i){var n=t.mediaItems&&t.mediaItems.indexOf(e);n>-1&&(t.mediaItems.splice(n,1),bus.$emit("mediaDeleted",e))},error:function(e){console.error(e.responseText)}})}}))},handleDragStart:function(e,t){var i=[];this.selectedMedias.forEach((function(e){i.push(e.name)})),0==this.isMediaSelected(e)&&(i.push(e.name),this.selectedMedias.push(e)),t.dataTransfer.setData("mediaNames",JSON.stringify(i)),t.dataTransfer.setData("sourceFolder",this.selectedFolder.path),t.dataTransfer.setDragImage(this.dragDropThumbnail,10,10),t.dataTransfer.effectAllowed="move"},handleScrollWhileDrag:function(e){e.clientY<150&&window.scrollBy(0,-10),e.clientY>window.innerHeight-100&&window.scrollBy(0,10)},changeSort:function(e){this.sortBy==e?this.sortAsc=!this.sortAsc:(this.sortAsc=!0,this.sortBy=e)}}}),$("#create-folder-name").keypress((function(e){if(13==e.which)return $("#modalFooterOk").click(),!1})),$("#modalFooterOk").on("click",(function(e){var t=$("#create-folder-name").val();""!==t&&$.ajax({url:$("#createFolderUrl").val()+"?path="+encodeURIComponent(mediaApp.selectedFolder.path)+"&name="+encodeURIComponent(t),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val()},success:function(e){bus.$emit("addFolder",mediaApp.selectedFolder,e),bootstrap.Modal.getOrCreateInstance($("#createFolderModal")).hide()},error:function(e){$("#createFolderModal-errors").empty();var t=JSON.parse(e.responseText).value;$('').text(t).appendTo($("#createFolderModal-errors"))}})})),$("#renameMediaModalFooterOk").on("click",(function(e){var t=$("#new-item-name").val(),i=$("#old-item-name").val();if(""!==t){var n=mediaApp.selectedFolder.path+"/";"/"===n&&(n="");var a=n+t,r=n+i;if(a.toLowerCase()!==r.toLowerCase())$.ajax({url:$("#renameMediaUrl").val()+"?oldPath="+encodeURIComponent(r)+"&newPath="+encodeURIComponent(a),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val()},success:function(e){bootstrap.Modal.getOrCreateInstance($("#renameMediaModal")).hide(),bus.$emit("mediaRenamed",t,a,r)},error:function(e){$("#renameMediaModal-errors").empty();var t=JSON.parse(e.responseText).value;$('').text(t).appendTo($("#renameMediaModal-errors"))}});else bootstrap.Modal.getOrCreateInstance($("#renameMediaModal")).hide()}})),e&&(document.getElementById("mediaApp").style.display=""),$(document).trigger("mediaApp:ready")},error:function(e){console.error(e.responseText)}}))}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function ownKeys(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function _objectSpread(e){for(var t=1;t0&&a},thumbSize:function(){return this.smallThumbs?120:240},currentPrefs:{get:function(){return{smallThumbs:this.smallThumbs}},set:function(e){e&&(this.smallThumbs=e.smallThumbs)}}},mounted:function(){var e=this;e.paths=c,e.$on("selectAndDeleteMediaRequested",(function(t){e.selectAndDeleteMedia(t)})),e.$on("selectMediaRequested",(function(t){e.selectMedia(t)}));var n="#"+t,r=u.attr("id"),o=crypto.randomUUID();$(n).fileupload({limitConcurrentUploads:20,dropZone:$("#"+r),dataType:"json",url:i,maxChunkSize:l,add:function(t,i){var n,a=i.files.length;for(n=0;n0)for(var r=0;r1&&!1===a?(alert($("#onlyOneItemMessage").val()),d.mediaItems.push(i[0]),d.initialized=!0):(d.mediaItems=d.mediaItems.concat(i),d.initialized=!0)):alert(n)},error:function(e,t,i){console.log("Error on upload."),console.log(e),console.log(t),console.log(i)}}).on("fileuploadchunkbeforesend",(function(e,t){var i=t.files[0];t.blob=new File([t.blob],i.name,{type:i.type,lastModified:i.lastModified})}))},methods:{selectMedia:function(e){this.selectedMedia=e},getUniqueId:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}))},removeSelected:function(e){if(this.selectedMedia){var t=this.mediaItems&&this.mediaItems.indexOf(this.selectedMedia);t>-1&&(this.mediaItems[t].isRemoved=!0,this.mediaItems.splice(t,1))}else 1===this.mediaItems.length&&(this.mediaItems[t].isRemoved=!0,this.mediaItems.splice(0,1));this.selectedMedia=null},showMediaTextModal:function(e){this.mediaTextModal=new bootstrap.Modal(this.$refs.mediaTextModal),this.mediaTextModal.show(),this.backupMediaText=this.selectedMedia.mediaText},cancelMediaTextModal:function(e){this.mediaTextModal.hide(),this.selectedMedia.mediaText=this.backupMediaText},showAnchorModal:function(e){this.anchoringModal=new bootstrap.Modal(this.$refs.anchoringModal),this.anchoringModal.show(),this.selectedMedia.anchor={x:this.selectedMedia.anchor.x,y:this.selectedMedia.anchor.y},this.backupAnchor=this.selectedMedia.anchor},cancelAnchoringModal:function(e){this.anchoringModal.hide(),this.selectedMedia.anchor=this.backupAnchor},resetAnchor:function(e){this.selectedMedia.anchor={x:.5,y:.5}},onAnchorDrop:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},anchorLeft:function(){if(this.$refs.anchorImage&&this.$refs.modalBody&&this.selectedMedia){var e=(this.$refs.modalBody.clientWidth-this.$refs.anchorImage.clientWidth)/2,t=this.selectedMedia.anchor.x*this.$refs.anchorImage.clientWidth+e;return t<17?t=17:t-=8,t+"px"}return"0"},anchorTop:function(){if(this.$refs.anchorImage&&this.selectedMedia){var e=this.selectedMedia.anchor.y*this.$refs.anchorImage.clientHeight;return e<15?e=15:e+=5,e+"px"}return"0"},setAnchor:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},addMediaFiles:function(e){e.length>1&&!1===a?(alert($("#onlyOneItemMessage").val()),d.mediaItems.push(e[0]),d.initialized=!0):(d.mediaItems=d.mediaItems.concat(e),d.initialized=!0)},selectAndDeleteMedia:function(e){var t=this;t.selectedMedia=e,setTimeout((function(){t.removeSelected()}),100)}},watch:{mediaItems:{deep:!0,handler:function(){setTimeout((function(){$(document).trigger("contentpreview:render")}),100)}},currentPrefs:function(e){localStorage.setItem("mediaFieldPrefs",JSON.stringify(e))}}}))}function initializeMediaField(e,t,i,n,a,r){if(null!==e){var o,s=$(document.getElementById($(e).data("for"))).data("init"),l=$(e),d=l.attr("id");t.addEventListener("hidden.bs.modal",(function(e){$("#mediaApp").appendTo("body"),$("#mediaApp").hide()})),mediaFieldApps.push(o=new Vue({el:l.get(0),data:{mediaItems:[],selectedMedia:null,smallThumbs:!1,idPrefix:d,initialized:!1,allowMediaText:a,backupMediaText:"",allowAnchors:r,backupAnchor:null,mediaTextModal:null,anchoringModal:null},created:function(){this.currentPrefs=JSON.parse(localStorage.getItem("mediaFieldPrefs"))},computed:{paths:{get:function(){var e=[];return this.initialized?(this.mediaItems.forEach((function(t){"not-found"!==t.mediaPath&&e.push({path:t.mediaPath,mediaText:t.mediaText,anchor:t.anchor})})),JSON.stringify(e)):JSON.stringify(s)},set:function(e){var t=this,n=e||[],a=$.Deferred(),r=[],o=0;n.forEach((function(e,n){r.push({name:" "+e.path,mime:"",mediaPath:""}),promise=$.when(a).done((function(){$.ajax({url:i+"?path="+encodeURIComponent(e.path),method:"GET",success:function(i){i.vuekey=i.name+n.toString(),i.mediaText=e.mediaText,i.anchor=e.anchor,r.splice(n,1,i),r.length===++o&&(r.forEach((function(e){t.mediaItems.push(e)})),t.initialized=!0)},error:function(i){console.log(i),r.splice(n,1,{name:e.path,mime:"",mediaPath:"not-found",mediaText:"",anchor:{x:0,y:0}}),r.length===++o&&(r.forEach((function(e){t.mediaItems.push(e)})),t.initialized=!0)}})}))})),a.resolve()}},fileSize:function(){return Math.round(this.selectedMedia.size/1024)},canAddMedia:function(){return 0===this.mediaItems.length||this.mediaItems.length>0&&n},thumbSize:function(){return this.smallThumbs?120:240},currentPrefs:{get:function(){return{smallThumbs:this.smallThumbs}},set:function(e){e&&(this.smallThumbs=e.smallThumbs)}}},mounted:function(){var e=this;e.paths=s,e.$on("selectAndDeleteMediaRequested",(function(t){e.selectAndDeleteMedia(t)})),e.$on("selectMediaRequested",(function(t){e.selectMedia(t)})),e.$on("filesUploaded",(function(t){e.addMediaFiles(t)}))},methods:{selectMedia:function(e){this.selectedMedia=e},showModal:function(e){var i=this;if(i.canAddMedia){$("#mediaApp").appendTo($(t).find(".modal-body")),$("#mediaApp").show();var n=new bootstrap.Modal(t);n.show(),$(t).find(".mediaFieldSelectButton").off("click").on("click",(function(e){return i.addMediaFiles(mediaApp.selectedMedias),mediaApp.selectedMedias=[],n.hide(),!0}))}},showMediaTextModal:function(e){this.mediaTextModal=new bootstrap.Modal(this.$refs.mediaTextModal),this.mediaTextModal.show(),this.backupMediaText=this.selectedMedia.mediaText},cancelMediaTextModal:function(e){this.mediaTextModal.hide(),this.selectedMedia.mediaText=this.backupMediaText},showAnchorModal:function(e){this.anchoringModal=new bootstrap.Modal(this.$refs.anchoringModal),this.anchoringModal.show(),this.selectedMedia.anchor={x:this.selectedMedia.anchor.x,y:this.selectedMedia.anchor.y},this.backupAnchor=this.selectedMedia.anchor},cancelAnchoringModal:function(e){this.anchoringModal.hide(),this.selectedMedia.anchor=this.backupAnchor},resetAnchor:function(e){this.selectedMedia.anchor={x:.5,y:.5}},onAnchorDrop:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},anchorLeft:function(){if(this.$refs.anchorImage&&this.$refs.modalBody&&this.selectedMedia){var e=(this.$refs.modalBody.clientWidth-this.$refs.anchorImage.clientWidth)/2,t=this.selectedMedia.anchor.x*this.$refs.anchorImage.clientWidth+e,i=Math.round(this.$refs.modalBody.querySelector(".icon-media-anchor").clientWidth);return Number.isInteger(i)&&(t-=i/2),t+"px"}return"0"},anchorTop:function(){return this.$refs.anchorImage&&this.selectedMedia?this.selectedMedia.anchor.y*this.$refs.anchorImage.clientHeight+"px":"0"},setAnchor:function(e){var t=this.$refs.anchorImage;this.selectedMedia.anchor={x:e.offsetX/t.clientWidth,y:e.offsetY/t.clientHeight}},addMediaFiles:function(e){e.length>1&&!1===n?(alert($("#onlyOneItemMessage").val()),o.mediaItems.push(e[0]),o.initialized=!0):(o.mediaItems=o.mediaItems.concat(e),o.initialized=!0)},removeSelected:function(e){if(this.selectedMedia){var t=this.mediaItems&&this.mediaItems.indexOf(this.selectedMedia);t>-1&&this.mediaItems.splice(t,1)}else 1===this.mediaItems.length&&this.mediaItems.splice(0,1);this.selectedMedia=null},selectAndDeleteMedia:function(e){var t=this;t.selectedMedia=e,setTimeout((function(){t.removeSelected()}),100)}},watch:{mediaItems:{deep:!0,handler:function(){setTimeout((function(){$(document).trigger("contentpreview:render")}),100)}},currentPrefs:function(e){localStorage.setItem("mediaFieldPrefs",JSON.stringify(e))}}}))}}$(document).on("mediaApp:ready",(function(){var e=crypto.randomUUID();$("#fileupload").fileupload({dropZone:$("#mediaApp"),limitConcurrentUploads:20,dataType:"json",url:$("#uploadFiles").val(),maxChunkSize:Number($("#maxUploadChunkSize").val()||0),formData:function(){var t=$("input[name=__RequestVerificationToken]").val();return[{name:"path",value:mediaApp.selectedFolder.path},{name:"__RequestVerificationToken",value:t},{name:"__chunkedFileUploadId",value:e}]},done:function(e,t){$.each(t.result.files,(function(e,t){t.error||mediaApp.mediaItems.push(t)}))}}).on("fileuploadchunkbeforesend",(function(e,t){var i=t.files[0];t.blob=new File([t.blob],i.name,{type:i.type,lastModified:i.lastModified})}))})),$(document).bind("dragover",(function(e){var t=e.originalEvent.dataTransfer;if(t.types&&(t.types.indexOf?-1!=t.types.indexOf("Files"):t.types.contains("Files"))){var i=$("#customdropzone"),n=window.dropZoneTimeout;n?clearTimeout(n):i.addClass("in");$(e.target).closest(i);window.dropZoneTimeout=setTimeout((function(){window.dropZoneTimeout=null,i.removeClass("in")}),100)}})),Vue.component("folder",{template:'\n
  • \n \n
      \n \n \n
    \n
  • \n '),props:{model:Object,selectedInMediaApp:Object,level:Number},data:function(){return{open:!1,children:null,parent:null,isHovered:!1,padding:0}},computed:{empty:function(){return!this.children||0==this.children.length},isSelected:function(){return this.selectedInMediaApp.name==this.model.name&&this.selectedInMediaApp.path==this.model.path},isRoot:function(){return""===this.model.path}},mounted:function(){0==this.isRoot&&this.isAncestorOfSelectedFolder()&&this.toggle(),this.padding=this.level<3?16:16+8*this.level},created:function(){var e=this;bus.$on("deleteFolder",(function(t){if(e.children){var i=e.children&&e.children.indexOf(t);i>-1&&(e.children.splice(i,1),bus.$emit("folderDeleted"))}})),bus.$on("addFolder",(function(t,i){e.model==t&&(null!==e.children&&e.children.push(i),i.parent=e.model,bus.$emit("folderAdded",i))}))},methods:{isAncestorOfSelectedFolder:function(){for(parentFolder=mediaApp.selectedFolder;parentFolder;){if(parentFolder.path==this.model.path)return!0;parentFolder=parentFolder.parent}return!1},toggle:function(){this.open=!this.open,this.open&&!this.children&&this.loadChildren()},select:function(){bus.$emit("folderSelected",this.model),this.loadChildren()},createFolder:function(){bus.$emit("createFolderRequested")},deleteFolder:function(){bus.$emit("deleteFolderRequested")},loadChildren:function(){var e=this;0==this.open&&(this.open=!0),$.ajax({url:$("#getFoldersUrl").val()+"?path="+encodeURIComponent(e.model.path),method:"GET",success:function(t){e.children=t,e.children.forEach((function(t){t.parent=e.model}))},error:function(e){emtpy=!1,console.error(e.responseText)}})},handleDragOver:function(e){this.isHovered=!0},handleDragLeave:function(e){this.isHovered=!1},moveMediaToFolder:function(e,t){this.isHovered=!1;var i=JSON.parse(t.dataTransfer.getData("mediaNames"));if(!(i.length<1)){var n=t.dataTransfer.getData("sourceFolder"),a=e.path;""===n&&(n="root"),""===a&&(a="root"),n!==a?confirmDialog(_objectSpread(_objectSpread({},$("#moveMedia").data()),{},{callback:function(e){e&&$.ajax({url:$("#moveMediaListUrl").val(),method:"POST",data:{__RequestVerificationToken:$("input[name='__RequestVerificationToken']").val(),mediaNames:i,sourceFolder:n,targetFolder:a},success:function(){bus.$emit("mediaListMoved")},error:function(e){console.error(e.responseText),bus.$emit("mediaListMoved",e.responseText)}})}})):alert($("#sameFolderMessage").val())}}}}),Vue.component("media-items-grid",{template:'\n
      \n
    1. \n
      \n \n \n
      \n
      \n \n \n \n {{ media.name }}\n
      \n
    2. \n
    \n ',data:function(){return{T:{}}},props:{filteredMediaItems:Array,selectedMedias:Array,thumbSize:Number},created:function(){this.T.editButton=$("#t-edit-button").val(),this.T.deleteButton=$("#t-delete-button").val()},methods:{isMediaSelected:function(e){return this.selectedMedias.some((function(t,i,n){return t.url.toLowerCase()===e.url.toLowerCase()}))},buildMediaUrl:function(e,t){return e+(-1==e.indexOf("?")?"?":"&")+"width="+t+"&height="+t},toggleSelectionOfMedia:function(e){bus.$emit("mediaToggleRequested",e)},renameMedia:function(e){bus.$emit("renameMediaRequested",e)},deleteMedia:function(e){bus.$emit("deleteMediaRequested",e)},dragStart:function(e,t){bus.$emit("mediaDragStartRequested",e,t)}}}),Vue.component("media-items-table",{template:'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{ T.imageHeader }}\n {{ T.nameHeader }}\n \n \n {{ T.lastModifyHeader }} \n \n \n \n {{ T.sizeHeader }}\n \n \n \n \n {{ T.typeHeader }}\n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    {{ printDateTime(media.lastModify) }}
    \n
    \n
    {{ isNaN(media.size)? 0 : Math.round(media.size / 1024) }} KB
    \n
    \n
    {{ media.mime }}
    \n
    \n ',data:function(){return{T:{}}},props:{sortBy:String,sortAsc:Boolean,filteredMediaItems:Array,selectedMedias:Array,thumbSize:Number},created:function(){var e=this;e.T.imageHeader=$("#t-image-header").val(),e.T.nameHeader=$("#t-name-header").val(),e.T.lastModifyHeader=$("#t-lastModify-header").val(),e.T.sizeHeader=$("#t-size-header").val(),e.T.typeHeader=$("#t-type-header").val(),e.T.editButton=$("#t-edit-button").val(),e.T.deleteButton=$("#t-delete-button").val(),e.T.viewButton=$("#t-view-button").val()},methods:{isMediaSelected:function(e){return this.selectedMedias.some((function(t,i,n){return t.url.toLowerCase()===e.url.toLowerCase()}))},buildMediaUrl:function(e,t){return e+(-1==e.indexOf("?")?"?":"&")+"width="+t+"&height="+t},changeSort:function(e){bus.$emit("sortChangeRequested",e)},toggleSelectionOfMedia:function(e){bus.$emit("mediaToggleRequested",e)},renameMedia:function(e){bus.$emit("renameMediaRequested",e)},deleteMedia:function(e){bus.$emit("deleteMediaRequested",e)},dragStart:function(e,t){bus.$emit("mediaDragStartRequested",e,t)},printDateTime:function(e){return new Date(e).toLocaleString()}}}),Vue.component("pager",{template:'\n
    \n \n \n
    \n ',props:{sourceItems:Array},data:function(){return{pageSize:10,pageSizeOptions:[10,30,50,100],current:0,T:{}}},created:function(){var e=this;e.T.pagerFirstButton=$("#t-pager-first-button").val(),e.T.pagerPreviousButton=$("#t-pager-previous-button").val(),e.T.pagerNextButton=$("#t-pager-next-button").val(),e.T.pagerLastButton=$("#t-pager-last-button").val(),e.T.pagerPageSizeLabel=$("#t-pager-page-size-label").val(),e.T.pagerPageLabel=$("#t-pager-page-label").val(),e.T.pagerTotalLabel=$("#t-pager-total-label").val()},methods:{next:function(){this.current=this.current+1},previous:function(){this.current=this.current-1},goFirst:function(){this.current=0},goLast:function(){this.current=this.totalPages-1},goTo:function(e){this.current=e}},computed:{total:function(){return this.sourceItems?this.sourceItems.length:0},totalPages:function(){var e=Math.ceil(this.total/this.pageSize);return e>0?e:1},isLastPage:function(){return this.current+1>=this.totalPages},isFirstPage:function(){return 0===this.current},canDoNext:function(){return!this.isLastPage},canDoPrev:function(){return!this.isFirstPage},canDoFirst:function(){return!this.isFirstPage},canDoLast:function(){return!this.isLastPage},itemsInCurrentPage:function(){var e=this.pageSize*this.current,t=e+this.pageSize,i=this.sourceItems.slice(e,t);return bus.$emit("pagerEvent",i),i},pageLinks:function(){var e=[];e.push(this.current+1);var t=this.current>0?this.current:-1;e.unshift(t);var i=this.current>1?this.current-1:-1;e.unshift(i);var n=this.totalPages-this.current>1?this.current+2:-1;e.push(n);var a=this.totalPages-this.current>2?this.current+3:-1;return e.push(a),e}},watch:{sourceItems:function(){this.current=0},pageSize:function(){this.current=0}}}),Vue.component("sortIndicator",{template:'\n
    \n \n \n
    \n ',props:{colname:String,selectedcolname:String,asc:Boolean},computed:{isActive:function(){return this.colname.toLowerCase()==this.selectedcolname.toLowerCase()}}}),Vue.component("upload",{template:'

    {{ model.name }}

    Error: {{ model.errorMessage }}
    ',props:{model:Object,uploadInputId:String},mounted:function(){var e,t=this,i=document.getElementById(null!==(e=t.uploadInputId)&&void 0!==e?e:"fileupload");$(i).bind("fileuploadprogress",(function(e,i){i.files[0].name===t.model.name&&(t.model.percentage=parseInt(i.loaded/i.total*100,10))})),$(i).bind("fileuploaddone",(function(e,i){i.files[0].name===t.model.name&&(i.result.files[0].error?t.handleFailure(i.files[0].name,i.result.files[0].error):bus.$emit("removalRequest",t.model))})),$(i).bind("fileuploadfail",(function(e,i){i.files[0].name===t.model.name&&t.handleFailure(i.files[0].name,$("#t-error").val())}))},methods:{handleFailure:function(e,t){e===this.model.name&&(this.model.errorMessage=t,bus.$emit("ErrorOnUpload",this.model))},dismissWarning:function(){bus.$emit("removalRequest",this.model)}}}),Vue.component("uploadList",{template:'
    {{ T.uploads }} (Pending: {{ pendingCount }}) ( {{ T.errors }}: {{ errorCount }} / {{ T.clearErrors }} )
    ',data:function(){return{files:[],T:{},expanded:!1,pendingCount:0,errorCount:0}},props:{uploadInputId:String},created:function(){var e=this;e.T.uploads=$("#t-uploads").val(),e.T.errors=$("#t-errors").val(),e.T.clearErrors=$("#t-clear-errors").val()},computed:{fileCount:function(){return this.files.length}},mounted:function(){var e,t=this,i=document.getElementById(null!==(e=t.uploadInputId)&&void 0!==e?e:"fileupload");$(i).bind("fileuploadadd",(function(e,i){i.files&&i.files.forEach((function(e){t.files.some((function(t){return t.name==e.name}))?console.error("A file with the same name is already on the queue:"+e.name):t.files.push({name:e.name,percentage:0,errorMessage:""})}))})),bus.$on("removalRequest",(function(e){t.files.forEach((function(t,i,n){t.name==e.name&&n.splice(i,1)}))})),bus.$on("ErrorOnUpload",(function(e){t.updateCount()}))},methods:{updateCount:function(){this.errorCount=this.files.filter((function(e){return""!=e.errorMessage})).length,this.pendingCount=this.files.length-this.errorCount,this.files.length<1&&(this.expanded=!1)},clearErrors:function(){this.files=this.files.filter((function(e){return""==e.errorMessage}))}},watch:{files:function(){this.updateCount()}}});var mediaFieldApps=[];Vue.component("mediaFieldThumbsContainer",{template:'
    {{T.noImages}}
  • {{ media.isNew ? media.name.substr(36) : media.name }}
    {{ T.mediaNotFound }} {{ T.discardWarning }}
    {{ media.name }}
  • ',data:function(){return{T:{}}},props:{mediaItems:Array,selectedMedia:Object,thumbSize:Number,idPrefix:String},created:function(){var e=this;e.T.mediaNotFound=$("#t-media-not-found").val(),e.T.discardWarning=$("#t-discard-warning").val(),e.T.noImages=$("#t-no-images").val()},methods:{selectAndDeleteMedia:function(e){this.$parent.$emit("selectAndDeleteMediaRequested",e)},selectMedia:function(e){this.$parent.$emit("selectMediaRequested",e)},buildMediaUrl:function(e,t){return e+(-1==e.indexOf("?")?"?":"&")+"width="+t+"&height="+t}}}); diff --git a/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.js b/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.js index a5be329e5a0..6e424c7a127 100644 --- a/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.js +++ b/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.js @@ -4,588 +4,325 @@ */ /* =========================================================== - * trumbowyg.colors.js v1.2 - * Colors picker plugin for Trumbowyg + * trumbowyg.base64.js v1.0 + * Base64 plugin for Trumbowyg * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Alexandre Demode (Alex-D) - * Twitter : @AlexandreDemode - * Website : alex-d.fr + * Author : Cyril Biencourt (lizardK) */ (function ($) { 'use strict'; + var isSupported = function isSupported() { + return typeof FileReader !== 'undefined'; + }; + var isValidImage = function isValidImage(type) { + return /^data:image\/[a-z]?/i.test(type); + }; $.extend(true, $.trumbowyg, { langs: { // jshint camelcase:false en: { - foreColor: 'Text color', - backColor: 'Background color', - foreColorRemove: 'Remove text color', - backColorRemove: 'Remove background color' + base64: 'Image as base64', + file: 'File', + errFileReaderNotSupported: 'FileReader is not supported by your browser.', + errInvalidImage: 'Invalid image file.' }, az: { - foreColor: 'Yazı rəngi', - backColor: 'Arxa plan rəngi', - foreColorRemove: 'Yazı rəngini sil', - backColorRemove: 'Arxa plan rəngini sil' + base64: 'base64 olaraq şəkil', + file: 'Fayl', + errFileReaderNotSupported: 'FileReader brauzeriniz tərəfindən dəstəklənmir.', + errInvalidImage: 'Yanlış şəkil faylı.' }, by: { - foreColor: 'Колер тэксту', - backColor: 'Колер фону тэксту', - foreColorRemove: 'Выдаліць колер тэксту', - backColorRemove: 'Выдаліць колер фону тэксту' - }, - ca: { - foreColor: 'Color del text', - backColor: 'Color del fons', - foreColorRemove: 'Eliminar color del text', - backColorRemove: 'Eliminar color del fons' + base64: 'Выява (фармат base64)', + file: 'Файл', + errFileReaderNotSupported: 'FileReader не падтрымліваецца вашым браўзэрам.', + errInvalidImage: 'Несапраўдны файл выявы.' }, cs: { - foreColor: 'Barva textu', - backColor: 'Barva pozadí' + base64: 'Vložit obrázek', + file: 'Soubor' }, da: { - foreColor: 'Tekstfarve', - backColor: 'Baggrundsfarve' - }, - de: { - foreColor: 'Textfarbe', - backColor: 'Hintergrundfarbe' - }, - es: { - foreColor: 'Color del texto', - backColor: 'Color del fondo', - foreColorRemove: 'Eliminar color del texto', - backColorRemove: 'Eliminar color del fondo' + base64: 'Billede som base64', + file: 'Fil', + errFileReaderNotSupported: 'FileReader er ikke understøttet af din browser.', + errInvalidImage: 'Ugyldig billedfil.' }, et: { - foreColor: 'Teksti värv', - backColor: 'Taustavärv', - foreColorRemove: 'Eemalda teksti värv', - backColorRemove: 'Eemalda taustavärv' + base64: 'Pilt base64 formaadis', + file: 'Fail', + errFileReaderNotSupported: 'Teie veebilehitseja ei toeta FileReader funktsiooni.', + errInvalidImage: 'Vigane pildifail.' }, fr: { - foreColor: 'Couleur du texte', - backColor: 'Couleur de fond', - foreColorRemove: 'Supprimer la couleur du texte', - backColorRemove: 'Supprimer la couleur de fond' + base64: 'Image en base64', + file: 'Fichier', + errFileReaderNotSupported: 'FileReader n\'est pas supporté par votre navigateur.', + errInvalidImage: 'Fichier image invalide.' }, hu: { - foreColor: 'Betű szín', - backColor: 'Háttér szín', - foreColorRemove: 'Betű szín eltávolítása', - backColorRemove: 'Háttér szín eltávolítása' + base64: 'Kép beszúrás inline', + file: 'Fájl', + errFileReaderNotSupported: 'Ez a böngésző nem támogatja a FileReader funkciót.', + errInvalidImage: 'Érvénytelen képfájl.' }, ja: { - foreColor: '文字色', - backColor: '背景色' + base64: '画像 (Base64形式)', + file: 'ファイル', + errFileReaderNotSupported: 'あなたのブラウザーはFileReaderをサポートしていません', + errInvalidImage: '画像形式が正しくありません' }, ko: { - foreColor: '글자색', - backColor: '배경색', - foreColorRemove: '글자색 지우기', - backColorRemove: '배경색 지우기' + base64: '그림 넣기(base64)', + file: '파일', + errFileReaderNotSupported: 'FileReader가 현재 브라우저를 지원하지 않습니다.', + errInvalidImage: '유효하지 않은 파일' }, nl: { - foreColor: 'Tekstkleur', - backColor: 'Achtergrondkleur' + base64: 'Afbeelding inline', + file: 'Bestand', + errFileReaderNotSupported: 'Uw browser ondersteunt deze functionaliteit niet.', + errInvalidImage: 'De gekozen afbeelding is ongeldig.' }, pt_br: { - foreColor: 'Cor de fonte', - backColor: 'Cor de fundo' + base64: 'Imagem em base64', + file: 'Arquivo', + errFileReaderNotSupported: 'FileReader não é suportado pelo seu navegador.', + errInvalidImage: 'Arquivo de imagem inválido.' }, ru: { - foreColor: 'Цвет текста', - backColor: 'Цвет выделения текста', - foreColorRemove: 'Очистить цвет текста', - backColorRemove: 'Очистить цвет выделения текста' + base64: 'Изображение как код в base64', + file: 'Файл', + errFileReaderNotSupported: 'FileReader не поддерживается вашим браузером.', + errInvalidImage: 'Недопустимый файл изображения.' }, sl: { - foreColor: 'Barva teksta', - backColor: 'Barva ozadja', - foreColorRemove: 'Ponastavi barvo teksta', - backColorRemove: 'Ponastavi barvo ozadja' - }, - sk: { - foreColor: 'Farba textu', - backColor: 'Farba pozadia' + base64: 'Slika kot base64', + file: 'Datoteka', + errFileReaderNotSupported: 'FileReader ni podprt v tem brskalniku.', + errInvalidImage: 'Neveljavna datoteka s sliko.' }, tr: { - foreColor: 'Yazı rengi', - backColor: 'Arka plan rengi', - foreColorRemove: 'Yazı rengini kaldır', - backColorRemove: 'Arka plan rengini kaldır' + base64: 'Base64 olarak resim', + file: 'Dosya', + errFileReaderNotSupported: 'FileReader tarayıcınız tarafından desteklenmiyor.', + errInvalidImage: 'Geçersiz resim dosyası.' }, zh_cn: { - foreColor: '文字颜色', - backColor: '背景颜色' + base64: '图片(Base64编码)', + file: '文件' }, zh_tw: { - foreColor: '文字顏色', - backColor: '背景顏色' - } - } - }); - - // jshint camelcase:true - - function hex(x) { - return ('0' + parseInt(x).toString(16)).slice(-2); - } - function colorToHex(rgb) { - if (rgb.search('rgb') === -1) { - return rgb.replace('#', ''); - } else if (rgb === 'rgba(0, 0, 0, 0)') { - return 'transparent'; - } else { - rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/); - if (rgb == null) { - return 'transparent'; // No match, return transparent as unkown color + base64: '圖片(base64編碼)', + file: '檔案', + errFileReaderNotSupported: '你的瀏覽器不支援FileReader', + errInvalidImage: '不正確的檔案格式' } + }, + // jshint camelcase:true - return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); - } - } - function colorTagHandler(element, trumbowyg) { - var tags = []; - if (!element.style) { - return tags; - } - - // background color - if (element.style.backgroundColor !== '') { - var backColor = colorToHex(element.style.backgroundColor); - if (trumbowyg.o.plugins.colors.colorList.indexOf(backColor) >= 0) { - tags.push('backColor' + backColor); - } else { - tags.push('backColorFree'); + plugins: { + base64: { + shouldInit: isSupported, + init: function init(trumbowyg) { + var btnDef = { + isSupported: isSupported, + fn: function fn() { + trumbowyg.saveRange(); + var file; + var $modal = trumbowyg.openModalInsert( + // Title + trumbowyg.lang.base64, + // Fields + { + file: { + type: 'file', + required: true, + attributes: { + accept: 'image/*' + } + }, + alt: { + label: 'description', + value: trumbowyg.getRangeText() + } + }, + // Callback + function (values) { + var fReader = new FileReader(); + fReader.onloadend = function (e) { + if (isValidImage(e.target.result)) { + trumbowyg.execCmd('insertImage', fReader.result, false, true); + $(['img[src="', fReader.result, '"]:not([alt])'].join(''), trumbowyg.$box).attr('alt', values.alt); + trumbowyg.closeModal(); + } else { + trumbowyg.addErrorOnModalField($('input[type=file]', $modal), trumbowyg.lang.errInvalidImage); + } + }; + fReader.readAsDataURL(file); + }); + $('input[type=file]').on('change', function (e) { + file = e.target.files[0]; + }); + } + }; + trumbowyg.addBtnDef('base64', btnDef); + } } } + }); +})(jQuery); +/* =========================================================== + * trumbowyg.base64.js v1.0 + * Base64 plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Cyril Biencourt (lizardK) + */ +!function (e) { + "use strict"; - // text color - var foreColor; - if (element.style.color !== '') { - foreColor = colorToHex(element.style.color); - } else if (element.hasAttribute('color')) { - foreColor = colorToHex(element.getAttribute('color')); - } - if (foreColor) { - if (trumbowyg.o.plugins.colors.colorList.indexOf(foreColor) >= 0) { - tags.push('foreColor' + foreColor); - } else { - tags.push('foreColorFree'); - } - } - return tags; - } - var defaultOptions = { - colorList: ['ffffff', '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646', 'ffff00', 'f2f2f2', '7f7f7f', 'ddd9c3', 'c6d9f0', 'dbe5f1', 'f2dcdb', 'ebf1dd', 'e5e0ec', 'dbeef3', 'fdeada', 'fff2ca', 'd8d8d8', '595959', 'c4bd97', '8db3e2', 'b8cce4', 'e5b9b7', 'd7e3bc', 'ccc1d9', 'b7dde8', 'fbd5b5', 'ffe694', 'bfbfbf', '3f3f3f', '938953', '548dd4', '95b3d7', 'd99694', 'c3d69b', 'b2a2c7', 'b7dde8', 'fac08f', 'f2c314', 'a5a5a5', '262626', '494429', '17365d', '366092', '953734', '76923c', '5f497a', '92cddc', 'e36c09', 'c09100', '7f7f7f', '0c0c0c', '1d1b10', '0f243e', '244061', '632423', '4f6128', '3f3151', '31859b', '974806', '7f6000'], - foreColorList: null, - // fallbacks on colorList - backColorList: null, - // fallbacks on colorList - allowCustomForeColor: true, - allowCustomBackColor: true, - displayAsList: false + var a = function a() { + return "undefined" != typeof FileReader; }; - - // Add all colors in two dropdowns - $.extend(true, $.trumbowyg, { - plugins: { - color: { - init: function init(trumbowyg) { - trumbowyg.o.plugins.colors = trumbowyg.o.plugins.colors || defaultOptions; - var dropdownClass = trumbowyg.o.plugins.colors.displayAsList ? trumbowyg.o.prefix + 'dropdown--color-list' : ''; - var foreColorBtnDef = { - dropdown: buildDropdown('foreColor', trumbowyg), - dropdownClass: dropdownClass - }, - backColorBtnDef = { - dropdown: buildDropdown('backColor', trumbowyg), - dropdownClass: dropdownClass - }; - trumbowyg.addBtnDef('foreColor', foreColorBtnDef); - trumbowyg.addBtnDef('backColor', backColorBtnDef); - }, - tagHandler: colorTagHandler - } - } - }); - function buildDropdown(_fn, trumbowyg) { - var dropdown = [], - trumbowygColorOptions = trumbowyg.o.plugins.colors, - colorList = trumbowygColorOptions[_fn + 'List'] || trumbowygColorOptions.colorList; - $.each(colorList, function (i, color) { - var btn = _fn + color, - btnDef = { - fn: _fn, - forceCss: true, - hasIcon: false, - text: trumbowyg.lang['#' + color] || '#' + color, - param: '#' + color, - style: 'background-color: #' + color + ';' - }; - if (trumbowygColorOptions.displayAsList && _fn === 'foreColor') { - btnDef.style = 'color: #' + color + ' !important;'; - } - trumbowyg.addBtnDef(btn, btnDef); - dropdown.push(btn); - }); - - // Remove color - var removeColorButtonName = _fn + 'Remove', - removeColorBtnDef = { - fn: 'removeFormat', - hasIcon: false, - param: _fn, - style: 'background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);' - }; - if (trumbowygColorOptions.displayAsList) { - removeColorBtnDef.style = ''; - } - trumbowyg.addBtnDef(removeColorButtonName, removeColorBtnDef); - dropdown.push(removeColorButtonName); - - // Custom color - if (trumbowygColorOptions['allowCustom' + _fn.charAt(0).toUpperCase() + _fn.substr(1)]) { - // add free color btn - var freeColorButtonName = _fn + 'Free', - freeColorBtnDef = { - fn: function fn() { - trumbowyg.openModalInsert(trumbowyg.lang[_fn], { - color: { - label: _fn, - forceCss: true, - type: 'color', - value: '#FFFFFF' - } - }, - // callback - function (values) { - trumbowyg.execCmd(_fn, values.color); - return true; - }); - }, - hasIcon: false, - text: '#', - // style adjust for displaying the text - style: 'text-indent: 0; line-height: 20px; padding: 0 5px;' - }; - trumbowyg.addBtnDef(freeColorButtonName, freeColorBtnDef); - dropdown.push(freeColorButtonName); - } - return dropdown; - } -})(jQuery); -/* =========================================================== - * trumbowyg.colors.js v1.2 - * Colors picker plugin for Trumbowyg - * http://alex-d.github.com/Trumbowyg - * =========================================================== - * Author : Alexandre Demode (Alex-D) - * Twitter : @AlexandreDemode - * Website : alex-d.fr - */ -!function (o) { - "use strict"; - - function r(o) { - return ("0" + parseInt(o).toString(16)).slice(-2); - } - function e(o) { - return -1 === o.search("rgb") ? o.replace("#", "") : "rgba(0, 0, 0, 0)" === o || null == (o = o.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/)) ? "transparent" : r(o[1]) + r(o[2]) + r(o[3]); - } - o.extend(!0, o.trumbowyg, { + e.extend(!0, e.trumbowyg, { langs: { en: { - foreColor: "Text color", - backColor: "Background color", - foreColorRemove: "Remove text color", - backColorRemove: "Remove background color" + base64: "Image as base64", + file: "File", + errFileReaderNotSupported: "FileReader is not supported by your browser.", + errInvalidImage: "Invalid image file." }, az: { - foreColor: "Yazı rəngi", - backColor: "Arxa plan rəngi", - foreColorRemove: "Yazı rəngini sil", - backColorRemove: "Arxa plan rəngini sil" + base64: "base64 olaraq şəkil", + file: "Fayl", + errFileReaderNotSupported: "FileReader brauzeriniz tərəfindən dəstəklənmir.", + errInvalidImage: "Yanlış şəkil faylı." }, by: { - foreColor: "Колер тэксту", - backColor: "Колер фону тэксту", - foreColorRemove: "Выдаліць колер тэксту", - backColorRemove: "Выдаліць колер фону тэксту" - }, - ca: { - foreColor: "Color del text", - backColor: "Color del fons", - foreColorRemove: "Eliminar color del text", - backColorRemove: "Eliminar color del fons" + base64: "Выява (фармат base64)", + file: "Файл", + errFileReaderNotSupported: "FileReader не падтрымліваецца вашым браўзэрам.", + errInvalidImage: "Несапраўдны файл выявы." }, cs: { - foreColor: "Barva textu", - backColor: "Barva pozadí" + base64: "Vložit obrázek", + file: "Soubor" }, da: { - foreColor: "Tekstfarve", - backColor: "Baggrundsfarve" - }, - de: { - foreColor: "Textfarbe", - backColor: "Hintergrundfarbe" - }, - es: { - foreColor: "Color del texto", - backColor: "Color del fondo", - foreColorRemove: "Eliminar color del texto", - backColorRemove: "Eliminar color del fondo" + base64: "Billede som base64", + file: "Fil", + errFileReaderNotSupported: "FileReader er ikke understøttet af din browser.", + errInvalidImage: "Ugyldig billedfil." }, et: { - foreColor: "Teksti värv", - backColor: "Taustavärv", - foreColorRemove: "Eemalda teksti värv", - backColorRemove: "Eemalda taustavärv" + base64: "Pilt base64 formaadis", + file: "Fail", + errFileReaderNotSupported: "Teie veebilehitseja ei toeta FileReader funktsiooni.", + errInvalidImage: "Vigane pildifail." }, fr: { - foreColor: "Couleur du texte", - backColor: "Couleur de fond", - foreColorRemove: "Supprimer la couleur du texte", - backColorRemove: "Supprimer la couleur de fond" + base64: "Image en base64", + file: "Fichier", + errFileReaderNotSupported: "FileReader n'est pas supporté par votre navigateur.", + errInvalidImage: "Fichier image invalide." }, hu: { - foreColor: "Betű szín", - backColor: "Háttér szín", - foreColorRemove: "Betű szín eltávolítása", - backColorRemove: "Háttér szín eltávolítása" + base64: "Kép beszúrás inline", + file: "Fájl", + errFileReaderNotSupported: "Ez a böngésző nem támogatja a FileReader funkciót.", + errInvalidImage: "Érvénytelen képfájl." }, ja: { - foreColor: "文字色", - backColor: "背景色" + base64: "画像 (Base64形式)", + file: "ファイル", + errFileReaderNotSupported: "あなたのブラウザーはFileReaderをサポートしていません", + errInvalidImage: "画像形式が正しくありません" }, ko: { - foreColor: "글자색", - backColor: "배경색", - foreColorRemove: "글자색 지우기", - backColorRemove: "배경색 지우기" + base64: "그림 넣기(base64)", + file: "파일", + errFileReaderNotSupported: "FileReader가 현재 브라우저를 지원하지 않습니다.", + errInvalidImage: "유효하지 않은 파일" }, nl: { - foreColor: "Tekstkleur", - backColor: "Achtergrondkleur" + base64: "Afbeelding inline", + file: "Bestand", + errFileReaderNotSupported: "Uw browser ondersteunt deze functionaliteit niet.", + errInvalidImage: "De gekozen afbeelding is ongeldig." }, pt_br: { - foreColor: "Cor de fonte", - backColor: "Cor de fundo" + base64: "Imagem em base64", + file: "Arquivo", + errFileReaderNotSupported: "FileReader não é suportado pelo seu navegador.", + errInvalidImage: "Arquivo de imagem inválido." }, ru: { - foreColor: "Цвет текста", - backColor: "Цвет выделения текста", - foreColorRemove: "Очистить цвет текста", - backColorRemove: "Очистить цвет выделения текста" + base64: "Изображение как код в base64", + file: "Файл", + errFileReaderNotSupported: "FileReader не поддерживается вашим браузером.", + errInvalidImage: "Недопустимый файл изображения." }, sl: { - foreColor: "Barva teksta", - backColor: "Barva ozadja", - foreColorRemove: "Ponastavi barvo teksta", - backColorRemove: "Ponastavi barvo ozadja" - }, - sk: { - foreColor: "Farba textu", - backColor: "Farba pozadia" + base64: "Slika kot base64", + file: "Datoteka", + errFileReaderNotSupported: "FileReader ni podprt v tem brskalniku.", + errInvalidImage: "Neveljavna datoteka s sliko." }, tr: { - foreColor: "Yazı rengi", - backColor: "Arka plan rengi", - foreColorRemove: "Yazı rengini kaldır", - backColorRemove: "Arka plan rengini kaldır" + base64: "Base64 olarak resim", + file: "Dosya", + errFileReaderNotSupported: "FileReader tarayıcınız tarafından desteklenmiyor.", + errInvalidImage: "Geçersiz resim dosyası." }, zh_cn: { - foreColor: "文字颜色", - backColor: "背景颜色" + base64: "图片(Base64编码)", + file: "文件" }, zh_tw: { - foreColor: "文字顏色", - backColor: "背景顏色" - } - } - }); - var l = { - colorList: ["ffffff", "000000", "eeece1", "1f497d", "4f81bd", "c0504d", "9bbb59", "8064a2", "4bacc6", "f79646", "ffff00", "f2f2f2", "7f7f7f", "ddd9c3", "c6d9f0", "dbe5f1", "f2dcdb", "ebf1dd", "e5e0ec", "dbeef3", "fdeada", "fff2ca", "d8d8d8", "595959", "c4bd97", "8db3e2", "b8cce4", "e5b9b7", "d7e3bc", "ccc1d9", "b7dde8", "fbd5b5", "ffe694", "bfbfbf", "3f3f3f", "938953", "548dd4", "95b3d7", "d99694", "c3d69b", "b2a2c7", "b7dde8", "fac08f", "f2c314", "a5a5a5", "262626", "494429", "17365d", "366092", "953734", "76923c", "5f497a", "92cddc", "e36c09", "c09100", "7f7f7f", "0c0c0c", "1d1b10", "0f243e", "244061", "632423", "4f6128", "3f3151", "31859b", "974806", "7f6000"], - foreColorList: null, - backColorList: null, - allowCustomForeColor: !0, - allowCustomBackColor: !0, - displayAsList: !1 - }; - function a(r, e) { - var l = [], - a = e.o.plugins.colors, - t = a[r + "List"] || a.colorList; - o.each(t, function (o, t) { - var c = r + t, - f = { - fn: r, - forceCss: !0, - hasIcon: !1, - text: e.lang["#" + t] || "#" + t, - param: "#" + t, - style: "background-color: #" + t + ";" - }; - a.displayAsList && "foreColor" === r && (f.style = "color: #" + t + " !important;"), e.addBtnDef(c, f), l.push(c); - }); - var c = r + "Remove", - f = { - fn: "removeFormat", - hasIcon: !1, - param: r, - style: "background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);" - }; - if (a.displayAsList && (f.style = ""), e.addBtnDef(c, f), l.push(c), a["allowCustom" + r.charAt(0).toUpperCase() + r.substr(1)]) { - var n = r + "Free", - d = { - fn: function fn() { - e.openModalInsert(e.lang[r], { - color: { - label: r, - forceCss: !0, - type: "color", - value: "#FFFFFF" - } - }, function (o) { - return e.execCmd(r, o.color), !0; - }); - }, - hasIcon: !1, - text: "#", - style: "text-indent: 0; line-height: 20px; padding: 0 5px;" - }; - e.addBtnDef(n, d), l.push(n); - } - return l; - } - o.extend(!0, o.trumbowyg, { - plugins: { - color: { - init: function init(o) { - o.o.plugins.colors = o.o.plugins.colors || l; - var r = o.o.plugins.colors.displayAsList ? o.o.prefix + "dropdown--color-list" : "", - e = { - dropdown: a("foreColor", o), - dropdownClass: r - }, - t = { - dropdown: a("backColor", o), - dropdownClass: r - }; - o.addBtnDef("foreColor", e), o.addBtnDef("backColor", t); - }, - tagHandler: function tagHandler(o, r) { - var l, - a = []; - if (!o.style) return a; - if ("" !== o.style.backgroundColor) { - var t = e(o.style.backgroundColor); - r.o.plugins.colors.colorList.indexOf(t) >= 0 ? a.push("backColor" + t) : a.push("backColorFree"); - } - return "" !== o.style.color ? l = e(o.style.color) : o.hasAttribute("color") && (l = e(o.getAttribute("color"))), l && (r.o.plugins.colors.colorList.indexOf(l) >= 0 ? a.push("foreColor" + l) : a.push("foreColorFree")), a; - } + base64: "圖片(base64編碼)", + file: "檔案", + errFileReaderNotSupported: "你的瀏覽器不支援FileReader", + errInvalidImage: "不正確的檔案格式" } - } - }); -}(jQuery); -/* =========================================================== - * trumbowyg.allowTagsFromPaste.js v1.0.2 - * It cleans tags from pasted text, whilst allowing several specified tags - * http://alex-d.github.com/Trumbowyg - * =========================================================== - * Author : Fathi Anshory (0x00000F5C) - * Twitter : @fscchannl - * Notes: - * - removeformatPasted must be set to FALSE since it was applied prior to pasteHandlers, or else it will be useless - * - It is most advisable to use along with the cleanpaste plugin, or else you'd end up with dirty markup - */ - -(function ($) { - 'use strict'; - - var defaultOptions = { - // When empty, all tags are allowed making this plugin useless - // If you want to remove all tags, use removeformatPasted core option instead - allowedTags: [], - // List of tags which can be allowed - removableTags: ['a', 'abbr', 'address', 'b', 'bdi', 'bdo', 'blockquote', 'br', 'cite', 'code', 'del', 'dfn', 'details', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'ins', 'kbd', 'mark', 'meter', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'small', 'span', 'strong', 'sub', 'summary', 'sup', 'time', 'u', 'var', 'wbr', 'img', 'map', 'area', 'canvas', 'figcaption', 'figure', 'picture', 'audio', 'source', 'track', 'video', 'ul', 'ol', 'li', 'dl', 'dt', 'dd', 'table', 'caption', 'th', 'tr', 'td', 'thead', 'tbody', 'tfoot', 'col', 'colgroup', 'style', 'div', 'p', 'form', 'input', 'textarea', 'button', 'select', 'optgroup', 'option', 'label', 'fieldset', 'legend', 'datalist', 'keygen', 'output', 'iframe', 'link', 'nav', 'header', 'hgroup', 'footer', 'main', 'section', 'article', 'aside', 'dialog', 'script', 'noscript', 'embed', 'object', 'param'] - }; - $.extend(true, $.trumbowyg, { + }, plugins: { - allowTagsFromPaste: { - init: function init(trumbowyg) { - if (!trumbowyg.o.plugins.allowTagsFromPaste) { - return; - } - - // Force disable remove format pasted - trumbowyg.o.removeformatPasted = false; - var allowedTags = trumbowyg.o.plugins.allowTagsFromPaste.allowedTags || defaultOptions.allowedTags; - var removableTags = trumbowyg.o.plugins.allowTagsFromPaste.removableTags || defaultOptions.removableTags; - if (allowedTags.length === 0) { - return; - } - - // Get list of tags to remove - var tagsToRemove = $(removableTags).not(allowedTags).get(); - trumbowyg.pasteHandlers.push(function () { - setTimeout(function () { - var processNodes = trumbowyg.$ed.html(); - $.each(tagsToRemove, function (iterator, tagName) { - processNodes = processNodes.replace(new RegExp('<\\/?' + tagName + '(\\s[^>]*)?>', 'gi'), ''); + base64: { + shouldInit: a, + init: function init(r) { + var i = { + isSupported: a, + fn: function fn() { + var a; + r.saveRange(); + var i = r.openModalInsert(r.lang.base64, { + file: { + type: "file", + required: !0, + attributes: { + accept: "image/*" + } + }, + alt: { + label: "description", + value: r.getRangeText() + } + }, function (l) { + var t = new FileReader(); + t.onloadend = function (a) { + var d; + d = a.target.result, /^data:image\/[a-z]?/i.test(d) ? (r.execCmd("insertImage", t.result, !1, !0), e(['img[src="', t.result, '"]:not([alt])'].join(""), r.$box).attr("alt", l.alt), r.closeModal()) : r.addErrorOnModalField(e("input[type=file]", i), r.lang.errInvalidImage); + }, t.readAsDataURL(a); }); - trumbowyg.$ed.html(processNodes); - }, 0); - }); - } - } - } - }); -})(jQuery); -/* =========================================================== - * trumbowyg.allowTagsFromPaste.js v1.0.2 - * It cleans tags from pasted text, whilst allowing several specified tags - * http://alex-d.github.com/Trumbowyg - * =========================================================== - * Author : Fathi Anshory (0x00000F5C) - * Twitter : @fscchannl - * Notes: - * - removeformatPasted must be set to FALSE since it was applied prior to pasteHandlers, or else it will be useless - * - It is most advisable to use along with the cleanpaste plugin, or else you'd end up with dirty markup - */ -!function (e) { - "use strict"; - - var a = { - allowedTags: [], - removableTags: ["a", "abbr", "address", "b", "bdi", "bdo", "blockquote", "br", "cite", "code", "del", "dfn", "details", "em", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "ins", "kbd", "mark", "meter", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "small", "span", "strong", "sub", "summary", "sup", "time", "u", "var", "wbr", "img", "map", "area", "canvas", "figcaption", "figure", "picture", "audio", "source", "track", "video", "ul", "ol", "li", "dl", "dt", "dd", "table", "caption", "th", "tr", "td", "thead", "tbody", "tfoot", "col", "colgroup", "style", "div", "p", "form", "input", "textarea", "button", "select", "optgroup", "option", "label", "fieldset", "legend", "datalist", "keygen", "output", "iframe", "link", "nav", "header", "hgroup", "footer", "main", "section", "article", "aside", "dialog", "script", "noscript", "embed", "object", "param"] - }; - e.extend(!0, e.trumbowyg, { - plugins: { - allowTagsFromPaste: { - init: function init(t) { - if (t.o.plugins.allowTagsFromPaste) { - t.o.removeformatPasted = !1; - var o = t.o.plugins.allowTagsFromPaste.allowedTags || a.allowedTags, - r = t.o.plugins.allowTagsFromPaste.removableTags || a.removableTags; - if (0 !== o.length) { - var s = e(r).not(o).get(); - t.pasteHandlers.push(function () { - setTimeout(function () { - var a = t.$ed.html(); - e.each(s, function (e, t) { - a = a.replace(new RegExp("<\\/?" + t + "(\\s[^>]*)?>", "gi"), ""); - }), t.$ed.html(a); - }, 0); + e("input[type=file]").on("change", function (e) { + a = e.target.files[0]; }); } - } + }; + r.addBtnDef("base64", i); } } } @@ -781,686 +518,949 @@ }); }(jQuery); /* =========================================================== - * trumbowyg.base64.js v1.0 - * Base64 plugin for Trumbowyg + * trumbowyg.allowTagsFromPaste.js v1.0.2 + * It cleans tags from pasted text, whilst allowing several specified tags * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Cyril Biencourt (lizardK) + * Author : Fathi Anshory (0x00000F5C) + * Twitter : @fscchannl + * Notes: + * - removeformatPasted must be set to FALSE since it was applied prior to pasteHandlers, or else it will be useless + * - It is most advisable to use along with the cleanpaste plugin, or else you'd end up with dirty markup */ (function ($) { 'use strict'; - var isSupported = function isSupported() { - return typeof FileReader !== 'undefined'; - }; - var isValidImage = function isValidImage(type) { - return /^data:image\/[a-z]?/i.test(type); + var defaultOptions = { + // When empty, all tags are allowed making this plugin useless + // If you want to remove all tags, use removeformatPasted core option instead + allowedTags: [], + // List of tags which can be allowed + removableTags: ['a', 'abbr', 'address', 'b', 'bdi', 'bdo', 'blockquote', 'br', 'cite', 'code', 'del', 'dfn', 'details', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'ins', 'kbd', 'mark', 'meter', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'small', 'span', 'strong', 'sub', 'summary', 'sup', 'time', 'u', 'var', 'wbr', 'img', 'map', 'area', 'canvas', 'figcaption', 'figure', 'picture', 'audio', 'source', 'track', 'video', 'ul', 'ol', 'li', 'dl', 'dt', 'dd', 'table', 'caption', 'th', 'tr', 'td', 'thead', 'tbody', 'tfoot', 'col', 'colgroup', 'style', 'div', 'p', 'form', 'input', 'textarea', 'button', 'select', 'optgroup', 'option', 'label', 'fieldset', 'legend', 'datalist', 'keygen', 'output', 'iframe', 'link', 'nav', 'header', 'hgroup', 'footer', 'main', 'section', 'article', 'aside', 'dialog', 'script', 'noscript', 'embed', 'object', 'param'] }; $.extend(true, $.trumbowyg, { - langs: { - // jshint camelcase:false - en: { - base64: 'Image as base64', - file: 'File', - errFileReaderNotSupported: 'FileReader is not supported by your browser.', - errInvalidImage: 'Invalid image file.' - }, - az: { - base64: 'base64 olaraq şəkil', - file: 'Fayl', - errFileReaderNotSupported: 'FileReader brauzeriniz tərəfindən dəstəklənmir.', - errInvalidImage: 'Yanlış şəkil faylı.' - }, - by: { - base64: 'Выява (фармат base64)', - file: 'Файл', - errFileReaderNotSupported: 'FileReader не падтрымліваецца вашым браўзэрам.', - errInvalidImage: 'Несапраўдны файл выявы.' - }, - cs: { - base64: 'Vložit obrázek', - file: 'Soubor' - }, - da: { - base64: 'Billede som base64', - file: 'Fil', - errFileReaderNotSupported: 'FileReader er ikke understøttet af din browser.', - errInvalidImage: 'Ugyldig billedfil.' - }, - et: { - base64: 'Pilt base64 formaadis', - file: 'Fail', - errFileReaderNotSupported: 'Teie veebilehitseja ei toeta FileReader funktsiooni.', - errInvalidImage: 'Vigane pildifail.' - }, - fr: { - base64: 'Image en base64', - file: 'Fichier', - errFileReaderNotSupported: 'FileReader n\'est pas supporté par votre navigateur.', - errInvalidImage: 'Fichier image invalide.' - }, - hu: { - base64: 'Kép beszúrás inline', - file: 'Fájl', - errFileReaderNotSupported: 'Ez a böngésző nem támogatja a FileReader funkciót.', - errInvalidImage: 'Érvénytelen képfájl.' - }, - ja: { - base64: '画像 (Base64形式)', - file: 'ファイル', - errFileReaderNotSupported: 'あなたのブラウザーはFileReaderをサポートしていません', - errInvalidImage: '画像形式が正しくありません' - }, - ko: { - base64: '그림 넣기(base64)', - file: '파일', - errFileReaderNotSupported: 'FileReader가 현재 브라우저를 지원하지 않습니다.', - errInvalidImage: '유효하지 않은 파일' - }, - nl: { - base64: 'Afbeelding inline', - file: 'Bestand', - errFileReaderNotSupported: 'Uw browser ondersteunt deze functionaliteit niet.', - errInvalidImage: 'De gekozen afbeelding is ongeldig.' - }, - pt_br: { - base64: 'Imagem em base64', - file: 'Arquivo', - errFileReaderNotSupported: 'FileReader não é suportado pelo seu navegador.', - errInvalidImage: 'Arquivo de imagem inválido.' - }, - ru: { - base64: 'Изображение как код в base64', - file: 'Файл', - errFileReaderNotSupported: 'FileReader не поддерживается вашим браузером.', - errInvalidImage: 'Недопустимый файл изображения.' - }, - sl: { - base64: 'Slika kot base64', - file: 'Datoteka', - errFileReaderNotSupported: 'FileReader ni podprt v tem brskalniku.', - errInvalidImage: 'Neveljavna datoteka s sliko.' - }, - tr: { - base64: 'Base64 olarak resim', - file: 'Dosya', - errFileReaderNotSupported: 'FileReader tarayıcınız tarafından desteklenmiyor.', - errInvalidImage: 'Geçersiz resim dosyası.' - }, - zh_cn: { - base64: '图片(Base64编码)', - file: '文件' - }, - zh_tw: { - base64: '圖片(base64編碼)', - file: '檔案', - errFileReaderNotSupported: '你的瀏覽器不支援FileReader', - errInvalidImage: '不正確的檔案格式' - } - }, - // jshint camelcase:true - plugins: { - base64: { - shouldInit: isSupported, + allowTagsFromPaste: { init: function init(trumbowyg) { - var btnDef = { - isSupported: isSupported, - fn: function fn() { - trumbowyg.saveRange(); - var file; - var $modal = trumbowyg.openModalInsert( - // Title - trumbowyg.lang.base64, - // Fields - { - file: { - type: 'file', - required: true, - attributes: { - accept: 'image/*' - } - }, - alt: { - label: 'description', - value: trumbowyg.getRangeText() - } - }, - // Callback - function (values) { - var fReader = new FileReader(); - fReader.onloadend = function (e) { - if (isValidImage(e.target.result)) { - trumbowyg.execCmd('insertImage', fReader.result, false, true); - $(['img[src="', fReader.result, '"]:not([alt])'].join(''), trumbowyg.$box).attr('alt', values.alt); - trumbowyg.closeModal(); - } else { - trumbowyg.addErrorOnModalField($('input[type=file]', $modal), trumbowyg.lang.errInvalidImage); - } - }; - fReader.readAsDataURL(file); - }); - $('input[type=file]').on('change', function (e) { - file = e.target.files[0]; + if (!trumbowyg.o.plugins.allowTagsFromPaste) { + return; + } + + // Force disable remove format pasted + trumbowyg.o.removeformatPasted = false; + var allowedTags = trumbowyg.o.plugins.allowTagsFromPaste.allowedTags || defaultOptions.allowedTags; + var removableTags = trumbowyg.o.plugins.allowTagsFromPaste.removableTags || defaultOptions.removableTags; + if (allowedTags.length === 0) { + return; + } + + // Get list of tags to remove + var tagsToRemove = $(removableTags).not(allowedTags).get(); + trumbowyg.pasteHandlers.push(function () { + setTimeout(function () { + var processNodes = trumbowyg.$ed.html(); + $.each(tagsToRemove, function (iterator, tagName) { + processNodes = processNodes.replace(new RegExp('<\\/?' + tagName + '(\\s[^>]*)?>', 'gi'), ''); }); - } - }; - trumbowyg.addBtnDef('base64', btnDef); + trumbowyg.$ed.html(processNodes); + }, 0); + }); } } } }); })(jQuery); /* =========================================================== - * trumbowyg.base64.js v1.0 - * Base64 plugin for Trumbowyg + * trumbowyg.allowTagsFromPaste.js v1.0.2 + * It cleans tags from pasted text, whilst allowing several specified tags * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Cyril Biencourt (lizardK) + * Author : Fathi Anshory (0x00000F5C) + * Twitter : @fscchannl + * Notes: + * - removeformatPasted must be set to FALSE since it was applied prior to pasteHandlers, or else it will be useless + * - It is most advisable to use along with the cleanpaste plugin, or else you'd end up with dirty markup */ !function (e) { "use strict"; - var a = function a() { - return "undefined" != typeof FileReader; + var a = { + allowedTags: [], + removableTags: ["a", "abbr", "address", "b", "bdi", "bdo", "blockquote", "br", "cite", "code", "del", "dfn", "details", "em", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "ins", "kbd", "mark", "meter", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "small", "span", "strong", "sub", "summary", "sup", "time", "u", "var", "wbr", "img", "map", "area", "canvas", "figcaption", "figure", "picture", "audio", "source", "track", "video", "ul", "ol", "li", "dl", "dt", "dd", "table", "caption", "th", "tr", "td", "thead", "tbody", "tfoot", "col", "colgroup", "style", "div", "p", "form", "input", "textarea", "button", "select", "optgroup", "option", "label", "fieldset", "legend", "datalist", "keygen", "output", "iframe", "link", "nav", "header", "hgroup", "footer", "main", "section", "article", "aside", "dialog", "script", "noscript", "embed", "object", "param"] }; e.extend(!0, e.trumbowyg, { + plugins: { + allowTagsFromPaste: { + init: function init(t) { + if (t.o.plugins.allowTagsFromPaste) { + t.o.removeformatPasted = !1; + var o = t.o.plugins.allowTagsFromPaste.allowedTags || a.allowedTags, + r = t.o.plugins.allowTagsFromPaste.removableTags || a.removableTags; + if (0 !== o.length) { + var s = e(r).not(o).get(); + t.pasteHandlers.push(function () { + setTimeout(function () { + var a = t.$ed.html(); + e.each(s, function (e, t) { + a = a.replace(new RegExp("<\\/?" + t + "(\\s[^>]*)?>", "gi"), ""); + }), t.$ed.html(a); + }, 0); + }); + } + } + } + } + } + }); +}(jQuery); +/* =========================================================== + * trumbowyg.colors.js v1.2 + * Colors picker plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { langs: { + // jshint camelcase:false en: { - base64: "Image as base64", - file: "File", - errFileReaderNotSupported: "FileReader is not supported by your browser.", - errInvalidImage: "Invalid image file." + foreColor: 'Text color', + backColor: 'Background color', + foreColorRemove: 'Remove text color', + backColorRemove: 'Remove background color' }, az: { - base64: "base64 olaraq şəkil", - file: "Fayl", - errFileReaderNotSupported: "FileReader brauzeriniz tərəfindən dəstəklənmir.", - errInvalidImage: "Yanlış şəkil faylı." + foreColor: 'Yazı rəngi', + backColor: 'Arxa plan rəngi', + foreColorRemove: 'Yazı rəngini sil', + backColorRemove: 'Arxa plan rəngini sil' }, by: { - base64: "Выява (фармат base64)", - file: "Файл", - errFileReaderNotSupported: "FileReader не падтрымліваецца вашым браўзэрам.", - errInvalidImage: "Несапраўдны файл выявы." + foreColor: 'Колер тэксту', + backColor: 'Колер фону тэксту', + foreColorRemove: 'Выдаліць колер тэксту', + backColorRemove: 'Выдаліць колер фону тэксту' + }, + ca: { + foreColor: 'Color del text', + backColor: 'Color del fons', + foreColorRemove: 'Eliminar color del text', + backColorRemove: 'Eliminar color del fons' }, cs: { - base64: "Vložit obrázek", - file: "Soubor" + foreColor: 'Barva textu', + backColor: 'Barva pozadí' }, da: { - base64: "Billede som base64", - file: "Fil", - errFileReaderNotSupported: "FileReader er ikke understøttet af din browser.", - errInvalidImage: "Ugyldig billedfil." - }, - et: { - base64: "Pilt base64 formaadis", - file: "Fail", - errFileReaderNotSupported: "Teie veebilehitseja ei toeta FileReader funktsiooni.", - errInvalidImage: "Vigane pildifail." + foreColor: 'Tekstfarve', + backColor: 'Baggrundsfarve' }, - fr: { - base64: "Image en base64", - file: "Fichier", - errFileReaderNotSupported: "FileReader n'est pas supporté par votre navigateur.", - errInvalidImage: "Fichier image invalide." + de: { + foreColor: 'Textfarbe', + backColor: 'Hintergrundfarbe' }, - hu: { - base64: "Kép beszúrás inline", - file: "Fájl", - errFileReaderNotSupported: "Ez a böngésző nem támogatja a FileReader funkciót.", - errInvalidImage: "Érvénytelen képfájl." + es: { + foreColor: 'Color del texto', + backColor: 'Color del fondo', + foreColorRemove: 'Eliminar color del texto', + backColorRemove: 'Eliminar color del fondo' + }, + et: { + foreColor: 'Teksti värv', + backColor: 'Taustavärv', + foreColorRemove: 'Eemalda teksti värv', + backColorRemove: 'Eemalda taustavärv' + }, + fr: { + foreColor: 'Couleur du texte', + backColor: 'Couleur de fond', + foreColorRemove: 'Supprimer la couleur du texte', + backColorRemove: 'Supprimer la couleur de fond' + }, + hu: { + foreColor: 'Betű szín', + backColor: 'Háttér szín', + foreColorRemove: 'Betű szín eltávolítása', + backColorRemove: 'Háttér szín eltávolítása' }, ja: { - base64: "画像 (Base64形式)", - file: "ファイル", - errFileReaderNotSupported: "あなたのブラウザーはFileReaderをサポートしていません", - errInvalidImage: "画像形式が正しくありません" + foreColor: '文字色', + backColor: '背景色' }, ko: { - base64: "그림 넣기(base64)", - file: "파일", - errFileReaderNotSupported: "FileReader가 현재 브라우저를 지원하지 않습니다.", - errInvalidImage: "유효하지 않은 파일" + foreColor: '글자색', + backColor: '배경색', + foreColorRemove: '글자색 지우기', + backColorRemove: '배경색 지우기' }, nl: { - base64: "Afbeelding inline", - file: "Bestand", - errFileReaderNotSupported: "Uw browser ondersteunt deze functionaliteit niet.", - errInvalidImage: "De gekozen afbeelding is ongeldig." + foreColor: 'Tekstkleur', + backColor: 'Achtergrondkleur' }, pt_br: { - base64: "Imagem em base64", - file: "Arquivo", - errFileReaderNotSupported: "FileReader não é suportado pelo seu navegador.", - errInvalidImage: "Arquivo de imagem inválido." + foreColor: 'Cor de fonte', + backColor: 'Cor de fundo' }, ru: { - base64: "Изображение как код в base64", - file: "Файл", - errFileReaderNotSupported: "FileReader не поддерживается вашим браузером.", - errInvalidImage: "Недопустимый файл изображения." + foreColor: 'Цвет текста', + backColor: 'Цвет выделения текста', + foreColorRemove: 'Очистить цвет текста', + backColorRemove: 'Очистить цвет выделения текста' }, sl: { - base64: "Slika kot base64", - file: "Datoteka", - errFileReaderNotSupported: "FileReader ni podprt v tem brskalniku.", - errInvalidImage: "Neveljavna datoteka s sliko." + foreColor: 'Barva teksta', + backColor: 'Barva ozadja', + foreColorRemove: 'Ponastavi barvo teksta', + backColorRemove: 'Ponastavi barvo ozadja' + }, + sk: { + foreColor: 'Farba textu', + backColor: 'Farba pozadia' }, tr: { - base64: "Base64 olarak resim", - file: "Dosya", - errFileReaderNotSupported: "FileReader tarayıcınız tarafından desteklenmiyor.", - errInvalidImage: "Geçersiz resim dosyası." + foreColor: 'Yazı rengi', + backColor: 'Arka plan rengi', + foreColorRemove: 'Yazı rengini kaldır', + backColorRemove: 'Arka plan rengini kaldır' }, zh_cn: { - base64: "图片(Base64编码)", - file: "文件" + foreColor: '文字颜色', + backColor: '背景颜色' }, zh_tw: { - base64: "圖片(base64編碼)", - file: "檔案", - errFileReaderNotSupported: "你的瀏覽器不支援FileReader", - errInvalidImage: "不正確的檔案格式" - } - }, - plugins: { - base64: { - shouldInit: a, - init: function init(r) { - var i = { - isSupported: a, - fn: function fn() { - var a; - r.saveRange(); - var i = r.openModalInsert(r.lang.base64, { - file: { - type: "file", - required: !0, - attributes: { - accept: "image/*" - } - }, - alt: { - label: "description", - value: r.getRangeText() - } - }, function (l) { - var t = new FileReader(); - t.onloadend = function (a) { - var d; - d = a.target.result, /^data:image\/[a-z]?/i.test(d) ? (r.execCmd("insertImage", t.result, !1, !0), e(['img[src="', t.result, '"]:not([alt])'].join(""), r.$box).attr("alt", l.alt), r.closeModal()) : r.addErrorOnModalField(e("input[type=file]", i), r.lang.errInvalidImage); - }, t.readAsDataURL(a); - }); - e("input[type=file]").on("change", function (e) { - a = e.target.files[0]; - }); - } - }; - r.addBtnDef("base64", i); - } + foreColor: '文字顏色', + backColor: '背景顏色' } } }); -}(jQuery); -/* =========================================================== - * trumbowyg.emoji.js v0.1 - * Emoji picker plugin for Trumbowyg - * http://alex-d.github.com/Trumbowyg - * =========================================================== - * Author : Nicolas Pion - * Twitter : @nicolas_pion - */ -(function ($) { - 'use strict'; + // jshint camelcase:true + + function hex(x) { + return ('0' + parseInt(x).toString(16)).slice(-2); + } + function colorToHex(rgb) { + if (rgb.search('rgb') === -1) { + return rgb.replace('#', ''); + } else if (rgb === 'rgba(0, 0, 0, 0)') { + return 'transparent'; + } else { + rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/); + if (rgb == null) { + return 'transparent'; // No match, return transparent as unkown color + } + + return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); + } + } + function colorTagHandler(element, trumbowyg) { + var tags = []; + if (!element.style) { + return tags; + } + + // background color + if (element.style.backgroundColor !== '') { + var backColor = colorToHex(element.style.backgroundColor); + if (trumbowyg.o.plugins.colors.colorList.indexOf(backColor) >= 0) { + tags.push('backColor' + backColor); + } else { + tags.push('backColorFree'); + } + } + // text color + var foreColor; + if (element.style.color !== '') { + foreColor = colorToHex(element.style.color); + } else if (element.hasAttribute('color')) { + foreColor = colorToHex(element.getAttribute('color')); + } + if (foreColor) { + if (trumbowyg.o.plugins.colors.colorList.indexOf(foreColor) >= 0) { + tags.push('foreColor' + foreColor); + } else { + tags.push('foreColorFree'); + } + } + return tags; + } var defaultOptions = { - emojiList: ['⁉', '™', 'ℹ', '↔', '↕', '↖', '↗', '↘', '↙', '⌨', '☀', '☁', '☂', '☃', '☄', '☑', '☔', '☕', '☘', '☠', '☢', '☣', '☦', '☸', '☹', '♀', '♂', '♈', '♉', '♐', '♑', '♒', '♓', '♠', '♣', '♥', '♦', '♨', '⚒', '⚓', '⚔', '⚕', '⚖', '⚗', '⚙', '✂', '✅', '✈', '✉', '✒', '✔', '✖', '✡', '✨', '✳', '✴', '❄', '❇', '❓', '❔', '❕', '❗', '❣', '❤', '➕', '➖', '➗', '⤴', '⤵', '〰', '㊗', '㊙', '😀', '😃', '😄', '😁', '😆', '😅', '😂', '🤣', '☺', '😊', '😇', '🙂', '🙃', '😉', '😌', '🥲', '😍', '🥰', '😘', '😗', '😙', '😚', '😋', '😛', '😝', '😜', '🤪', '🤨', '🧐', '🤓', '😎', '🤩', '🥳', '😏', '😒', '😞', '😔', '😟', '😕', '🙁', '😣', '😖', '😫', '😩', '🥺', '😢', '😭', '😤', '😮', '😠', '😡', '🤬', '🤯', '😳', '😶', '🥵', '🥶', '😱', '😨', '😰', '😥', '😓', '🤗', '🤔', '🤭', '🥱', '🤫', '🤥', '😐', '😑', '😬', '🙄', '😯', '😦', '😧', '😲', '😴', '🤤', '😪', '😵', '🤐', '🥴', '🤢', '🤮', '🤧', '😷', '🤒', '🤕', '🤑', '🤠', '🥸', '😈', '👿', '👹', '👺', '🤡', '💩', '👻', '💀', '👽', '👾', '🤖', '🎃', '😺', '😸', '😹', '😻', '😼', '😽', '🙀', '😿', '😾', '🤲', '👐', '🙌', '👏', '🤝', '👍', '👎', '👊', '✊', '🤛', '🤜', '🤞', '✌', '🤟', '🤘', '👌', '🤏', '🤌', '👈', '👉', '👆', '👇', '☝', '✋', '🤚', '🖐', '🖖', '👋', '🤙', '💪', '🦾', '🖕', '✍', '🙏', '🦶', '🦵', '🦿', '💄', '💋', '👄', '🦷', '👅', '👂', '🦻', '👃', '👣', '👁', '👀', '🧠', '🫀', '🫁', '🦴', '🗣', '👤', '👥', '🫂', '👶', '👧', '🧒', '👦', '👩', '🧑', '👨', '👱', '🧔', '👵', '🧓', '👴', '👲', '👳', '🧕', '👮', '👷', '💂', '🕵', '👰', '🤵', '👸', '🤴', '🦸', '🦹', '🥷', '🤶', '🎅', '🧙', '🧝', '🧛', '🧟', '🧞', '🧜', '🧚', '👼', '🤰', '🤱', '🙇', '💁', '🙅', '🙆', '🙋', '🧏', '🤦', '🤷', '🙎', '🙍', '💇', '💆', '🧖', '💅', '🤳', '💃', '🕺', '👯', '🕴', '🚶', '🧎', '🏃', '🧍', '👫', '👭', '👬', '💑', '💏', '👪', '🧶', '🧵', '🧥', '🥼', '🦺', '👚', '👕', '👖', '🩲', '🩳', '👔', '👗', '👙', '🩱', '👘', '🥻', '🥿', '👠', '👡', '👢', '👞', '👟', '🥾', '🩴', '🧦', '🧤', '🧣', '🎩', '🧢', '👒', '🎓', '⛑', '🪖', '👑', '💍', '👝', '👛', '👜', '💼', '🎒', '🧳', '👓', '🕶', '🥽', '🌂', '🦱', '🦰', '🦳', '🦲', '🐶', '🐱', '🐭', '🐹', '🐰', '🦊', '🐻', '🐼', '🐨', '🐯', '🦁', '🐮', '🐷', '🐽', '🐸', '🐵', '🙈', '🙉', '🙊', '🐒', '🐔', '🐧', '🐦', '🐤', '🐣', '🐥', '🦆', '🦤', '🦅', '🦉', '🦇', '🐺', '🐗', '🐴', '🦄', '🐝', '🐛', '🦋', '🐌', '🪱', '🐞', '🐜', '🪰', '🦟', '🪳', '🪲', '🦗', '🕷', '🕸', '🦂', '🐢', '🐍', '🦎', '🦖', '🦕', '🐙', '🦑', '🦐', '🦞', '🦀', '🐡', '🐠', '🐟', '🦭', '🐬', '🐳', '🐋', '🦈', '🐊', '🐅', '🐆', '🦓', '🦍', '🦧', '🐘', '🦣', '🦬', '🦛', '🦏', '🐪', '🐫', '🦒', '🦘', '🐃', '🐂', '🐄', '🐎', '🐖', '🐏', '🐑', '🦙', '🐐', '🦌', '🐕', '🐩', '🦮', '🐈', '🐓', '🦃', '🦚', '🦜', '🦢', '🦩', '🕊', '🐇', '🦝', '🦨', '🦡', '🦫', '🦦', '🦥', '🐁', '🐀', '🐿', '🦔', '🐾', '🐉', '🐲', '🌵', '🎄', '🌲', '🌳', '🌴', '🌱', '🌿', '🍀', '🎍', '🎋', '🍃', '🍂', '🍁', '🪶', '🍄', '🐚', '🪨', '🪵', '🌾', '🪴', '💐', '🌷', '🌹', '🥀', '🌺', '🌸', '🌼', '🌻', '🌞', '🌝', '🌛', '🌜', '🌚', '🌕', '🌖', '🌗', '🌘', '🌑', '🌒', '🌓', '🌔', '🌙', '🌎', '🌍', '🌏', '🪐', '💫', '⭐', '🌟', '⚡', '💥', '🔥', '🌪', '🌈', '🌤', '⛅', '🌥', '🌦', '🌧', '⛈', '🌩', '🌨', '⛄', '🌬', '💨', '💧', '💦', '🌊', '🌫', '🍏', '🍎', '🍐', '🍊', '🍋', '🍌', '🍉', '🍇', '🫐', '🍓', '🍈', '🍒', '🍑', '🥭', '🍍', '🥥', '🥝', '🍅', '🍆', '🥑', '🫒', '🥦', '🥬', '🫑', '🥒', '🌶', '🌽', '🥕', '🧄', '🧅', '🥔', '🍠', '🥐', '🥯', '🍞', '🥖', '🫓', '🥨', '🧀', '🥚', '🍳', '🧈', '🥞', '🧇', '🥓', '🥩', '🍗', '🍖', '🌭', '🍔', '🍟', '🍕', '🥪', '🥙', '🧆', '🌮', '🌯', '🫔', '🥗', '🥘', '🫕', '🥫', '🍝', '🍜', '🍲', '🍛', '🍣', '🍱', '🥟', '🦪', '🍤', '🍙', '🍚', '🍘', '🍥', '🥠', '🥮', '🍢', '🍡', '🍧', '🍨', '🍦', '🥧', '🧁', '🍰', '🎂', '🍮', '🍭', '🍬', '🍫', '🍿', '🍩', '🍪', '🌰', '🥜', '🍯', '🥛', '🍼', '🍵', '🫖', '🧉', '🧋', '🧃', '🥤', '🍶', '🍺', '🍻', '🥂', '🍷', '🥃', '🍸', '🍹', '🍾', '🧊', '🥄', '🍴', '🍽', '🥣', '🥡', '🥢', '🧂', '⚽', '🏀', '🏈', '⚾', '🥎', '🎾', '🏐', '🏉', '🥏', '🪃', '🎱', '🪀', '🏓', '🏸', '🏒', '🏑', '🥍', '🏏', '🥅', '⛳', '🪁', '🏹', '🎣', '🤿', '🥊', '🥋', '🎽', '🛹', '🛼', '🛷', '⛸', '🥌', '🎿', '⛷', '🏂', '🪂', '🏋', '🤼', '🤸', '⛹', '🤺', '🤾', '🏌', '🏇', '🧘', '🏄', '🏊', '🤽', '🚣', '🧗', '🚵', '🚴', '🏆', '🥇', '🥈', '🥉', '🏅', '🎖', '🏵', '🎗', '🎫', '🎟', '🎪', '🤹', '🎭', '🩰', '🎨', '🎬', '🎤', '🎧', '🎼', '🎹', '🥁', '🪘', '🎷', '🎺', '🎸', '🪕', '🎻', '🪗', '🎲', '♟', '🎯', '🎳', '🎮', '🎰', '🧩', '🚗', '🚕', '🚙', '🛻', '🚌', '🚎', '🏎', '🚓', '🚑', '🚒', '🚐', '🚚', '🚛', '🚜', '🦯', '🦽', '🦼', '🛴', '🚲', '🛵', '🏍', '🛺', '🚨', '🚔', '🚍', '🚘', '🚖', '🚡', '🚠', '🚟', '🚃', '🚋', '🚞', '🚝', '🚄', '🚅', '🚈', '🚂', '🚆', '🚇', '🚊', '🚉', '🛫', '🛬', '🛩', '💺', '🛰', '🚀', '🛸', '🚁', '🛶', '⛵', '🚤', '🛥', '🛳', '⛴', '🚢', '⛽', '🚧', '🚦', '🚥', '🚏', '🗺', '🗿', '🗽', '🗼', '🏰', '🏯', '🏟', '🎡', '🎢', '🎠', '⛲', '⛱', '🏖', '🏝', '🏜', '🌋', '⛰', '🏔', '🗻', '🏕', '⛺', '🏠', '🏡', '🏘', '🏚', '🛖', '🏗', '🏭', '🏢', '🏬', '🏣', '🏤', '🏥', '🏦', '🏨', '🏪', '🏫', '🏩', '💒', '🏛', '⛪', '🕌', '🕍', '🛕', '🕋', '⛩', '🛤', '🛣', '🗾', '🎑', '🏞', '🌅', '🌄', '🌠', '🎇', '🎆', '🌇', '🌆', '🏙', '🌃', '🌌', '🌉', '🌁', '⌚', '📱', '📲', '💻', '🖥', '🖨', '🖱', '🖲', '🕹', '🗜', '💽', '💾', '💿', '📀', '📼', '📷', '📸', '📹', '🎥', '📽', '🎞', '📞', '☎', '📟', '📠', '📺', '📻', '🎙', '🎚', '🎛', '🧭', '⏱', '⏲', '⏰', '🕰', '⌛', '⏳', '📡', '🔋', '🔌', '💡', '🔦', '🕯', '🪔', '🧯', '🛢', '💸', '💵', '💴', '💶', '💷', '🪙', '💰', '💳', '💎', '🪜', '🧰', '🪛', '🔧', '🔨', '🛠', '⛏', '🔩', '🧱', '⛓', '🪝', '🪢', '🧲', '🔫', '💣', '🧨', '🪓', '🪚', '🔪', '🗡', '🛡', '🚬', '⚰', '🪦', '⚱', '🏺', '🪄', '🔮', '📿', '🧿', '💈', '🔭', '🔬', '🕳', '🪟', '🩹', '🩺', '💊', '💉', '🩸', '🧬', '🦠', '🧫', '🧪', '🌡', '🪤', '🧹', '🧺', '🪡', '🧻', '🚽', '🪠', '🪣', '🚰', '🚿', '🛁', '🛀', '🪥', '🧼', '🪒', '🧽', '🧴', '🛎', '🔑', '🗝', '🚪', '🪑', '🪞', '🛋', '🛏', '🛌', '🧸', '🖼', '🛍', '🛒', '🎁', '🎈', '🎏', '🎀', '🎊', '🎉', '🪅', '🪆', '🎎', '🏮', '🎐', '🧧', '📩', '📨', '📧', '💌', '📥', '📤', '📦', '🏷', '📪', '📫', '📬', '📭', '📮', '📯', '🪧', '📜', '📃', '📄', '📑', '🧾', '📊', '📈', '📉', '🗒', '🗓', '📆', '📅', '🗑', '📇', '🗃', '🗳', '🗄', '📋', '📁', '📂', '🗂', '🗞', '📰', '📓', '📔', '📒', '📕', '📗', '📘', '📙', '📚', '📖', '🔖', '🧷', '🔗', '📎', '🖇', '📐', '📏', '🧮', '📌', '📍', '🖊', '🖋', '🖌', '🖍', '📝', '✏', '🔍', '🔎', '🔏', '🔐', '🔒', '🔓', '🧡', '💛', '💚', '💙', '💜', '🖤', '🤎', '🤍', '💔', '💕', '💞', '💓', '💗', '💖', '💘', '💝', '💟', '☮', '✝', '☪', '🕉', '🔯', '🕎', '☯', '🛐', '⛎', '♊', '♋', '♌', '♍', '♎', '♏', '🆔', '⚛', '🉑', '📴', '📳', '🈶', '🈚', '🈸', '🈺', '🈷', '🆚', '💮', '🉐', '🈴', '🈵', '🈹', '🈲', '🅰', '🅱', '🆎', '🆑', '🅾', '🆘', '❌', '⭕', '🛑', '⛔', '📛', '🚫', '💯', '💢', '🚷', '🚯', '🚳', '🚱', '🔞', '📵', '🚭', '‼', '🔅', '🔆', '〽', '⚠', '🚸', '🔱', '⚜', '🔰', '♻', '🈯', '💹', '❎', '🌐', '💠', 'Ⓜ', '🌀', '💤', '🏧', '🚾', '♿', '🅿', '🈳', '🈂', '🛂', '🛃', '🛄', '🛅', '🛗', '🚹', '🚺', '🚼', '🚻', '🚮', '🎦', '📶', '🈁', '🔣', '🔤', '🔡', '🔠', '🆖', '🆗', '🆙', '🆒', '🆕', '🆓', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '🔟', '🔢', '#', '*', '⏏', '▶', '⏸', '⏯', '⏹', '⏺', '⏭', '⏮', '⏩', '⏪', '⏫', '⏬', '◀', '🔼', '🔽', '➡', '⬅', '⬆', '⬇', '↪', '↩', '🔀', '🔁', '🔂', '🔄', '🔃', '🎵', '🎶', '♾', '💲', '💱', '©', '®', '➰', '➿', '🔚', '🔙', '🔛', '🔝', '🔜', '🔘', '⚪', '⚫', '🔴', '🔵', '🟤', '🟣', '🟢', '🟡', '🟠', '🔺', '🔻', '🔸', '🔹', '🔶', '🔷', '🔳', '🔲', '▪', '▫', '◾', '◽', '◼', '◻', '⬛', '⬜', '🟧', '🟦', '🟥', '🟫', '🟪', '🟩', '🟨', '🔈', '🔇', '🔉', '🔊', '🔔', '🔕', '📣', '📢', '🗨', '💬', '💭', '🗯', '🃏', '🎴', '🀄', '🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛', '🕜', '🕝', '🕞', '🕟', '🕠', '🕡', '🕢', '🕣', '🕤', '🕥', '🕦', '🕧', '⚧', '🏳', '🏴', '🏁', '🚩', '🇦', '🇩', '🇧', '🇮', '🇻', '🇰', '🇨', '🇹', '🇭', '🇪', '🇸', '🇬', '🇫', '🇵', '🇯', '🎌', '🇽', '🇱', '🇲', '🇾', '🇳', '🇴', '🇶', '🇷', '🇼', '🇿', '🇺', '🏻', '🏼', '🏽', '🏾', '🏿'] + colorList: ['ffffff', '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646', 'ffff00', 'f2f2f2', '7f7f7f', 'ddd9c3', 'c6d9f0', 'dbe5f1', 'f2dcdb', 'ebf1dd', 'e5e0ec', 'dbeef3', 'fdeada', 'fff2ca', 'd8d8d8', '595959', 'c4bd97', '8db3e2', 'b8cce4', 'e5b9b7', 'd7e3bc', 'ccc1d9', 'b7dde8', 'fbd5b5', 'ffe694', 'bfbfbf', '3f3f3f', '938953', '548dd4', '95b3d7', 'd99694', 'c3d69b', 'b2a2c7', 'b7dde8', 'fac08f', 'f2c314', 'a5a5a5', '262626', '494429', '17365d', '366092', '953734', '76923c', '5f497a', '92cddc', 'e36c09', 'c09100', '7f7f7f', '0c0c0c', '1d1b10', '0f243e', '244061', '632423', '4f6128', '3f3151', '31859b', '974806', '7f6000'], + foreColorList: null, + // fallbacks on colorList + backColorList: null, + // fallbacks on colorList + allowCustomForeColor: true, + allowCustomBackColor: true, + displayAsList: false }; - // Add all emoji in a dropdown + // Add all colors in two dropdowns $.extend(true, $.trumbowyg, { - langs: { - // jshint camelcase:false - en: { - emoji: 'Add an emoji' - }, - az: { - emoji: 'Emoji yerləşdir' - }, - ca: { - emoji: 'Afegir una emoticona' - }, - da: { - emoji: 'Tilføj et humørikon' - }, - de: { - emoji: 'Emoticon einfügen' - }, - es: { - emoji: 'Añadir un emoticono' - }, - et: { - emoji: 'Lisa emotikon' - }, - fr: { - emoji: 'Ajouter un emoji' - }, - hu: { - emoji: 'Emoji beszúrás' - }, - ja: { - emoji: '絵文字の挿入' - }, - ko: { - emoji: '이모지 넣기' - }, - ru: { - emoji: 'Вставить emoji' - }, - sl: { - emoji: 'Vstavi emotikon' - }, - tr: { - emoji: 'Emoji ekle' - }, - zh_cn: { - emoji: '添加表情' - } - }, - // jshint camelcase:true plugins: { - emoji: { + color: { init: function init(trumbowyg) { - trumbowyg.o.plugins.emoji = trumbowyg.o.plugins.emoji || defaultOptions; - var emojiBtnDef = { - dropdown: buildDropdown(trumbowyg) - }; - trumbowyg.addBtnDef('emoji', emojiBtnDef); - } + trumbowyg.o.plugins.colors = trumbowyg.o.plugins.colors || defaultOptions; + var dropdownClass = trumbowyg.o.plugins.colors.displayAsList ? trumbowyg.o.prefix + 'dropdown--color-list' : ''; + var foreColorBtnDef = { + dropdown: buildDropdown('foreColor', trumbowyg), + dropdownClass: dropdownClass + }, + backColorBtnDef = { + dropdown: buildDropdown('backColor', trumbowyg), + dropdownClass: dropdownClass + }; + trumbowyg.addBtnDef('foreColor', foreColorBtnDef); + trumbowyg.addBtnDef('backColor', backColorBtnDef); + }, + tagHandler: colorTagHandler } } }); - function buildDropdown(trumbowyg) { - var dropdown = []; - $.each(trumbowyg.o.plugins.emoji.emojiList, function (i, emoji) { - if ($.isArray(emoji)) { - // Custom emoji behaviour - var emojiCode = emoji[0], - emojiUrl = emoji[1], - emojiHtml = '' + emojiCode + '', - customEmojiBtnName = 'emoji-' + emojiCode.replace(/:/g, ''), - customEmojiBtnDef = { - hasIcon: false, - text: emojiHtml, - fn: function fn() { - trumbowyg.execCmd('insertImage', emojiUrl, false, true); - return true; - } - }; - trumbowyg.addBtnDef(customEmojiBtnName, customEmojiBtnDef); - dropdown.push(customEmojiBtnName); - } else { - // Default behaviour - var btn = emoji.replace(/:/g, ''), - defaultEmojiBtnName = 'emoji-' + btn, - defaultEmojiBtnDef = { - text: emoji, - fn: function fn() { - var encodedEmoji = String.fromCodePoint(emoji.replace('&#', '0')); - trumbowyg.execCmd('insertText', encodedEmoji); - return true; - } - }; - trumbowyg.addBtnDef(defaultEmojiBtnName, defaultEmojiBtnDef); - dropdown.push(defaultEmojiBtnName); + function buildDropdown(_fn, trumbowyg) { + var dropdown = [], + trumbowygColorOptions = trumbowyg.o.plugins.colors, + colorList = trumbowygColorOptions[_fn + 'List'] || trumbowygColorOptions.colorList; + $.each(colorList, function (i, color) { + var btn = _fn + color, + btnDef = { + fn: _fn, + forceCss: true, + hasIcon: false, + text: trumbowyg.lang['#' + color] || '#' + color, + param: '#' + color, + style: 'background-color: #' + color + ';' + }; + if (trumbowygColorOptions.displayAsList && _fn === 'foreColor') { + btnDef.style = 'color: #' + color + ' !important;'; } + trumbowyg.addBtnDef(btn, btnDef); + dropdown.push(btn); }); + + // Remove color + var removeColorButtonName = _fn + 'Remove', + removeColorBtnDef = { + fn: 'removeFormat', + hasIcon: false, + param: _fn, + style: 'background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);' + }; + if (trumbowygColorOptions.displayAsList) { + removeColorBtnDef.style = ''; + } + trumbowyg.addBtnDef(removeColorButtonName, removeColorBtnDef); + dropdown.push(removeColorButtonName); + + // Custom color + if (trumbowygColorOptions['allowCustom' + _fn.charAt(0).toUpperCase() + _fn.substr(1)]) { + // add free color btn + var freeColorButtonName = _fn + 'Free', + freeColorBtnDef = { + fn: function fn() { + trumbowyg.openModalInsert(trumbowyg.lang[_fn], { + color: { + label: _fn, + forceCss: true, + type: 'color', + value: '#FFFFFF' + } + }, + // callback + function (values) { + trumbowyg.execCmd(_fn, values.color); + return true; + }); + }, + hasIcon: false, + text: '#', + // style adjust for displaying the text + style: 'text-indent: 0; line-height: 20px; padding: 0 5px;' + }; + trumbowyg.addBtnDef(freeColorButtonName, freeColorBtnDef); + dropdown.push(freeColorButtonName); + } return dropdown; } })(jQuery); /* =========================================================== - * trumbowyg.emoji.js v0.1 - * Emoji picker plugin for Trumbowyg + * trumbowyg.colors.js v1.2 + * Colors picker plugin for Trumbowyg * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Nicolas Pion - * Twitter : @nicolas_pion + * Author : Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr */ -!function (x) { +!function (o) { "use strict"; - var F = { - emojiList: ["⁉", "™", "ℹ", "↔", "↕", "↖", "↗", "↘", "↙", "⌨", "☀", "☁", "☂", "☃", "☄", "☑", "☔", "☕", "☘", "☠", "☢", "☣", "☦", "☸", "☹", "♀", "♂", "♈", "♉", "♐", "♑", "♒", "♓", "♠", "♣", "♥", "♦", "♨", "⚒", "⚓", "⚔", "⚕", "⚖", "⚗", "⚙", "✂", "✅", "✈", "✉", "✒", "✔", "✖", "✡", "✨", "✳", "✴", "❄", "❇", "❓", "❔", "❕", "❗", "❣", "❤", "➕", "➖", "➗", "⤴", "⤵", "〰", "㊗", "㊙", "😀", "😃", "😄", "😁", "😆", "😅", "😂", "🤣", "☺", "😊", "😇", "🙂", "🙃", "😉", "😌", "🥲", "😍", "🥰", "😘", "😗", "😙", "😚", "😋", "😛", "😝", "😜", "🤪", "🤨", "🧐", "🤓", "😎", "🤩", "🥳", "😏", "😒", "😞", "😔", "😟", "😕", "🙁", "😣", "😖", "😫", "😩", "🥺", "😢", "😭", "😤", "😮", "😠", "😡", "🤬", "🤯", "😳", "😶", "🥵", "🥶", "😱", "😨", "😰", "😥", "😓", "🤗", "🤔", "🤭", "🥱", "🤫", "🤥", "😐", "😑", "😬", "🙄", "😯", "😦", "😧", "😲", "😴", "🤤", "😪", "😵", "🤐", "🥴", "🤢", "🤮", "🤧", "😷", "🤒", "🤕", "🤑", "🤠", "🥸", "😈", "👿", "👹", "👺", "🤡", "💩", "👻", "💀", "👽", "👾", "🤖", "🎃", "😺", "😸", "😹", "😻", "😼", "😽", "🙀", "😿", "😾", "🤲", "👐", "🙌", "👏", "🤝", "👍", "👎", "👊", "✊", "🤛", "🤜", "🤞", "✌", "🤟", "🤘", "👌", "🤏", "🤌", "👈", "👉", "👆", "👇", "☝", "✋", "🤚", "🖐", "🖖", "👋", "🤙", "💪", "🦾", "🖕", "✍", "🙏", "🦶", "🦵", "🦿", "💄", "💋", "👄", "🦷", "👅", "👂", "🦻", "👃", "👣", "👁", "👀", "🧠", "🫀", "🫁", "🦴", "🗣", "👤", "👥", "🫂", "👶", "👧", "🧒", "👦", "👩", "🧑", "👨", "👱", "🧔", "👵", "🧓", "👴", "👲", "👳", "🧕", "👮", "👷", "💂", "🕵", "👰", "🤵", "👸", "🤴", "🦸", "🦹", "🥷", "🤶", "🎅", "🧙", "🧝", "🧛", "🧟", "🧞", "🧜", "🧚", "👼", "🤰", "🤱", "🙇", "💁", "🙅", "🙆", "🙋", "🧏", "🤦", "🤷", "🙎", "🙍", "💇", "💆", "🧖", "💅", "🤳", "💃", "🕺", "👯", "🕴", "🚶", "🧎", "🏃", "🧍", "👫", "👭", "👬", "💑", "💏", "👪", "🧶", "🧵", "🧥", "🥼", "🦺", "👚", "👕", "👖", "🩲", "🩳", "👔", "👗", "👙", "🩱", "👘", "🥻", "🥿", "👠", "👡", "👢", "👞", "👟", "🥾", "🩴", "🧦", "🧤", "🧣", "🎩", "🧢", "👒", "🎓", "⛑", "🪖", "👑", "💍", "👝", "👛", "👜", "💼", "🎒", "🧳", "👓", "🕶", "🥽", "🌂", "🦱", "🦰", "🦳", "🦲", "🐶", "🐱", "🐭", "🐹", "🐰", "🦊", "🐻", "🐼", "🐨", "🐯", "🦁", "🐮", "🐷", "🐽", "🐸", "🐵", "🙈", "🙉", "🙊", "🐒", "🐔", "🐧", "🐦", "🐤", "🐣", "🐥", "🦆", "🦤", "🦅", "🦉", "🦇", "🐺", "🐗", "🐴", "🦄", "🐝", "🐛", "🦋", "🐌", "🪱", "🐞", "🐜", "🪰", "🦟", "🪳", "🪲", "🦗", "🕷", "🕸", "🦂", "🐢", "🐍", "🦎", "🦖", "🦕", "🐙", "🦑", "🦐", "🦞", "🦀", "🐡", "🐠", "🐟", "🦭", "🐬", "🐳", "🐋", "🦈", "🐊", "🐅", "🐆", "🦓", "🦍", "🦧", "🐘", "🦣", "🦬", "🦛", "🦏", "🐪", "🐫", "🦒", "🦘", "🐃", "🐂", "🐄", "🐎", "🐖", "🐏", "🐑", "🦙", "🐐", "🦌", "🐕", "🐩", "🦮", "🐈", "🐓", "🦃", "🦚", "🦜", "🦢", "🦩", "🕊", "🐇", "🦝", "🦨", "🦡", "🦫", "🦦", "🦥", "🐁", "🐀", "🐿", "🦔", "🐾", "🐉", "🐲", "🌵", "🎄", "🌲", "🌳", "🌴", "🌱", "🌿", "🍀", "🎍", "🎋", "🍃", "🍂", "🍁", "🪶", "🍄", "🐚", "🪨", "🪵", "🌾", "🪴", "💐", "🌷", "🌹", "🥀", "🌺", "🌸", "🌼", "🌻", "🌞", "🌝", "🌛", "🌜", "🌚", "🌕", "🌖", "🌗", "🌘", "🌑", "🌒", "🌓", "🌔", "🌙", "🌎", "🌍", "🌏", "🪐", "💫", "⭐", "🌟", "⚡", "💥", "🔥", "🌪", "🌈", "🌤", "⛅", "🌥", "🌦", "🌧", "⛈", "🌩", "🌨", "⛄", "🌬", "💨", "💧", "💦", "🌊", "🌫", "🍏", "🍎", "🍐", "🍊", "🍋", "🍌", "🍉", "🍇", "🫐", "🍓", "🍈", "🍒", "🍑", "🥭", "🍍", "🥥", "🥝", "🍅", "🍆", "🥑", "🫒", "🥦", "🥬", "🫑", "🥒", "🌶", "🌽", "🥕", "🧄", "🧅", "🥔", "🍠", "🥐", "🥯", "🍞", "🥖", "🫓", "🥨", "🧀", "🥚", "🍳", "🧈", "🥞", "🧇", "🥓", "🥩", "🍗", "🍖", "🌭", "🍔", "🍟", "🍕", "🥪", "🥙", "🧆", "🌮", "🌯", "🫔", "🥗", "🥘", "🫕", "🥫", "🍝", "🍜", "🍲", "🍛", "🍣", "🍱", "🥟", "🦪", "🍤", "🍙", "🍚", "🍘", "🍥", "🥠", "🥮", "🍢", "🍡", "🍧", "🍨", "🍦", "🥧", "🧁", "🍰", "🎂", "🍮", "🍭", "🍬", "🍫", "🍿", "🍩", "🍪", "🌰", "🥜", "🍯", "🥛", "🍼", "🍵", "🫖", "🧉", "🧋", "🧃", "🥤", "🍶", "🍺", "🍻", "🥂", "🍷", "🥃", "🍸", "🍹", "🍾", "🧊", "🥄", "🍴", "🍽", "🥣", "🥡", "🥢", "🧂", "⚽", "🏀", "🏈", "⚾", "🥎", "🎾", "🏐", "🏉", "🥏", "🪃", "🎱", "🪀", "🏓", "🏸", "🏒", "🏑", "🥍", "🏏", "🥅", "⛳", "🪁", "🏹", "🎣", "🤿", "🥊", "🥋", "🎽", "🛹", "🛼", "🛷", "⛸", "🥌", "🎿", "⛷", "🏂", "🪂", "🏋", "🤼", "🤸", "⛹", "🤺", "🤾", "🏌", "🏇", "🧘", "🏄", "🏊", "🤽", "🚣", "🧗", "🚵", "🚴", "🏆", "🥇", "🥈", "🥉", "🏅", "🎖", "🏵", "🎗", "🎫", "🎟", "🎪", "🤹", "🎭", "🩰", "🎨", "🎬", "🎤", "🎧", "🎼", "🎹", "🥁", "🪘", "🎷", "🎺", "🎸", "🪕", "🎻", "🪗", "🎲", "♟", "🎯", "🎳", "🎮", "🎰", "🧩", "🚗", "🚕", "🚙", "🛻", "🚌", "🚎", "🏎", "🚓", "🚑", "🚒", "🚐", "🚚", "🚛", "🚜", "🦯", "🦽", "🦼", "🛴", "🚲", "🛵", "🏍", "🛺", "🚨", "🚔", "🚍", "🚘", "🚖", "🚡", "🚠", "🚟", "🚃", "🚋", "🚞", "🚝", "🚄", "🚅", "🚈", "🚂", "🚆", "🚇", "🚊", "🚉", "🛫", "🛬", "🛩", "💺", "🛰", "🚀", "🛸", "🚁", "🛶", "⛵", "🚤", "🛥", "🛳", "⛴", "🚢", "⛽", "🚧", "🚦", "🚥", "🚏", "🗺", "🗿", "🗽", "🗼", "🏰", "🏯", "🏟", "🎡", "🎢", "🎠", "⛲", "⛱", "🏖", "🏝", "🏜", "🌋", "⛰", "🏔", "🗻", "🏕", "⛺", "🏠", "🏡", "🏘", "🏚", "🛖", "🏗", "🏭", "🏢", "🏬", "🏣", "🏤", "🏥", "🏦", "🏨", "🏪", "🏫", "🏩", "💒", "🏛", "⛪", "🕌", "🕍", "🛕", "🕋", "⛩", "🛤", "🛣", "🗾", "🎑", "🏞", "🌅", "🌄", "🌠", "🎇", "🎆", "🌇", "🌆", "🏙", "🌃", "🌌", "🌉", "🌁", "⌚", "📱", "📲", "💻", "🖥", "🖨", "🖱", "🖲", "🕹", "🗜", "💽", "💾", "💿", "📀", "📼", "📷", "📸", "📹", "🎥", "📽", "🎞", "📞", "☎", "📟", "📠", "📺", "📻", "🎙", "🎚", "🎛", "🧭", "⏱", "⏲", "⏰", "🕰", "⌛", "⏳", "📡", "🔋", "🔌", "💡", "🔦", "🕯", "🪔", "🧯", "🛢", "💸", "💵", "💴", "💶", "💷", "🪙", "💰", "💳", "💎", "🪜", "🧰", "🪛", "🔧", "🔨", "🛠", "⛏", "🔩", "🧱", "⛓", "🪝", "🪢", "🧲", "🔫", "💣", "🧨", "🪓", "🪚", "🔪", "🗡", "🛡", "🚬", "⚰", "🪦", "⚱", "🏺", "🪄", "🔮", "📿", "🧿", "💈", "🔭", "🔬", "🕳", "🪟", "🩹", "🩺", "💊", "💉", "🩸", "🧬", "🦠", "🧫", "🧪", "🌡", "🪤", "🧹", "🧺", "🪡", "🧻", "🚽", "🪠", "🪣", "🚰", "🚿", "🛁", "🛀", "🪥", "🧼", "🪒", "🧽", "🧴", "🛎", "🔑", "🗝", "🚪", "🪑", "🪞", "🛋", "🛏", "🛌", "🧸", "🖼", "🛍", "🛒", "🎁", "🎈", "🎏", "🎀", "🎊", "🎉", "🪅", "🪆", "🎎", "🏮", "🎐", "🧧", "📩", "📨", "📧", "💌", "📥", "📤", "📦", "🏷", "📪", "📫", "📬", "📭", "📮", "📯", "🪧", "📜", "📃", "📄", "📑", "🧾", "📊", "📈", "📉", "🗒", "🗓", "📆", "📅", "🗑", "📇", "🗃", "🗳", "🗄", "📋", "📁", "📂", "🗂", "🗞", "📰", "📓", "📔", "📒", "📕", "📗", "📘", "📙", "📚", "📖", "🔖", "🧷", "🔗", "📎", "🖇", "📐", "📏", "🧮", "📌", "📍", "🖊", "🖋", "🖌", "🖍", "📝", "✏", "🔍", "🔎", "🔏", "🔐", "🔒", "🔓", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤎", "🤍", "💔", "💕", "💞", "💓", "💗", "💖", "💘", "💝", "💟", "☮", "✝", "☪", "🕉", "🔯", "🕎", "☯", "🛐", "⛎", "♊", "♋", "♌", "♍", "♎", "♏", "🆔", "⚛", "🉑", "📴", "📳", "🈶", "🈚", "🈸", "🈺", "🈷", "🆚", "💮", "🉐", "🈴", "🈵", "🈹", "🈲", "🅰", "🅱", "🆎", "🆑", "🅾", "🆘", "❌", "⭕", "🛑", "⛔", "📛", "🚫", "💯", "💢", "🚷", "🚯", "🚳", "🚱", "🔞", "📵", "🚭", "‼", "🔅", "🔆", "〽", "⚠", "🚸", "🔱", "⚜", "🔰", "♻", "🈯", "💹", "❎", "🌐", "💠", "Ⓜ", "🌀", "💤", "🏧", "🚾", "♿", "🅿", "🈳", "🈂", "🛂", "🛃", "🛄", "🛅", "🛗", "🚹", "🚺", "🚼", "🚻", "🚮", "🎦", "📶", "🈁", "🔣", "🔤", "🔡", "🔠", "🆖", "🆗", "🆙", "🆒", "🆕", "🆓", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "🔟", "🔢", "#", "*", "⏏", "▶", "⏸", "⏯", "⏹", "⏺", "⏭", "⏮", "⏩", "⏪", "⏫", "⏬", "◀", "🔼", "🔽", "➡", "⬅", "⬆", "⬇", "↪", "↩", "🔀", "🔁", "🔂", "🔄", "🔃", "🎵", "🎶", "♾", "💲", "💱", "©", "®", "➰", "➿", "🔚", "🔙", "🔛", "🔝", "🔜", "🔘", "⚪", "⚫", "🔴", "🔵", "🟤", "🟣", "🟢", "🟡", "🟠", "🔺", "🔻", "🔸", "🔹", "🔶", "🔷", "🔳", "🔲", "▪", "▫", "◾", "◽", "◼", "◻", "⬛", "⬜", "🟧", "🟦", "🟥", "🟫", "🟪", "🟩", "🟨", "🔈", "🔇", "🔉", "🔊", "🔔", "🔕", "📣", "📢", "🗨", "💬", "💭", "🗯", "🃏", "🎴", "🀄", "🕐", "🕑", "🕒", "🕓", "🕔", "🕕", "🕖", "🕗", "🕘", "🕙", "🕚", "🕛", "🕜", "🕝", "🕞", "🕟", "🕠", "🕡", "🕢", "🕣", "🕤", "🕥", "🕦", "🕧", "⚧", "🏳", "🏴", "🏁", "🚩", "🇦", "🇩", "🇧", "🇮", "🇻", "🇰", "🇨", "🇹", "🇭", "🇪", "🇸", "🇬", "🇫", "🇵", "🇯", "🎌", "🇽", "🇱", "🇲", "🇾", "🇳", "🇴", "🇶", "🇷", "🇼", "🇿", "🇺", "🏻", "🏼", "🏽", "🏾", "🏿"] - }; - function A(F) { - var A = []; - return x.each(F.o.plugins.emoji.emojiList, function (E, B) { - if (x.isArray(B)) { - var C = B[0], - D = B[1], - e = '' + C + '', - i = "emoji-" + C.replace(/:/g, ""), - o = { - hasIcon: !1, - text: e, - fn: function fn() { - return F.execCmd("insertImage", D, !1, !0), !0; - } - }; - F.addBtnDef(i, o), A.push(i); - } else { - var n = "emoji-" + B.replace(/:/g, ""), - m = { - text: B, - fn: function fn() { - var x = String.fromCodePoint(B.replace("&#", "0")); - return F.execCmd("insertText", x), !0; - } - }; - F.addBtnDef(n, m), A.push(n); - } - }), A; + function r(o) { + return ("0" + parseInt(o).toString(16)).slice(-2); } - x.extend(!0, x.trumbowyg, { + function e(o) { + return -1 === o.search("rgb") ? o.replace("#", "") : "rgba(0, 0, 0, 0)" === o || null == (o = o.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/)) ? "transparent" : r(o[1]) + r(o[2]) + r(o[3]); + } + o.extend(!0, o.trumbowyg, { langs: { en: { - emoji: "Add an emoji" + foreColor: "Text color", + backColor: "Background color", + foreColorRemove: "Remove text color", + backColorRemove: "Remove background color" }, az: { - emoji: "Emoji yerləşdir" + foreColor: "Yazı rəngi", + backColor: "Arxa plan rəngi", + foreColorRemove: "Yazı rəngini sil", + backColorRemove: "Arxa plan rəngini sil" + }, + by: { + foreColor: "Колер тэксту", + backColor: "Колер фону тэксту", + foreColorRemove: "Выдаліць колер тэксту", + backColorRemove: "Выдаліць колер фону тэксту" }, ca: { - emoji: "Afegir una emoticona" + foreColor: "Color del text", + backColor: "Color del fons", + foreColorRemove: "Eliminar color del text", + backColorRemove: "Eliminar color del fons" + }, + cs: { + foreColor: "Barva textu", + backColor: "Barva pozadí" }, da: { - emoji: "Tilføj et humørikon" + foreColor: "Tekstfarve", + backColor: "Baggrundsfarve" }, de: { - emoji: "Emoticon einfügen" + foreColor: "Textfarbe", + backColor: "Hintergrundfarbe" }, es: { - emoji: "Añadir un emoticono" + foreColor: "Color del texto", + backColor: "Color del fondo", + foreColorRemove: "Eliminar color del texto", + backColorRemove: "Eliminar color del fondo" }, et: { - emoji: "Lisa emotikon" + foreColor: "Teksti värv", + backColor: "Taustavärv", + foreColorRemove: "Eemalda teksti värv", + backColorRemove: "Eemalda taustavärv" }, fr: { - emoji: "Ajouter un emoji" + foreColor: "Couleur du texte", + backColor: "Couleur de fond", + foreColorRemove: "Supprimer la couleur du texte", + backColorRemove: "Supprimer la couleur de fond" }, hu: { - emoji: "Emoji beszúrás" + foreColor: "Betű szín", + backColor: "Háttér szín", + foreColorRemove: "Betű szín eltávolítása", + backColorRemove: "Háttér szín eltávolítása" }, ja: { - emoji: "絵文字の挿入" + foreColor: "文字色", + backColor: "背景色" }, ko: { - emoji: "이모지 넣기" + foreColor: "글자색", + backColor: "배경색", + foreColorRemove: "글자색 지우기", + backColorRemove: "배경색 지우기" + }, + nl: { + foreColor: "Tekstkleur", + backColor: "Achtergrondkleur" + }, + pt_br: { + foreColor: "Cor de fonte", + backColor: "Cor de fundo" }, ru: { - emoji: "Вставить emoji" + foreColor: "Цвет текста", + backColor: "Цвет выделения текста", + foreColorRemove: "Очистить цвет текста", + backColorRemove: "Очистить цвет выделения текста" }, sl: { - emoji: "Vstavi emotikon" + foreColor: "Barva teksta", + backColor: "Barva ozadja", + foreColorRemove: "Ponastavi barvo teksta", + backColorRemove: "Ponastavi barvo ozadja" + }, + sk: { + foreColor: "Farba textu", + backColor: "Farba pozadia" }, tr: { - emoji: "Emoji ekle" + foreColor: "Yazı rengi", + backColor: "Arka plan rengi", + foreColorRemove: "Yazı rengini kaldır", + backColorRemove: "Arka plan rengini kaldır" }, zh_cn: { - emoji: "添加表情" + foreColor: "文字颜色", + backColor: "背景颜色" + }, + zh_tw: { + foreColor: "文字顏色", + backColor: "背景顏色" } - }, - plugins: { - emoji: { - init: function init(x) { - x.o.plugins.emoji = x.o.plugins.emoji || F; - var E = { - dropdown: A(x) - }; - x.addBtnDef("emoji", E); + } + }); + var l = { + colorList: ["ffffff", "000000", "eeece1", "1f497d", "4f81bd", "c0504d", "9bbb59", "8064a2", "4bacc6", "f79646", "ffff00", "f2f2f2", "7f7f7f", "ddd9c3", "c6d9f0", "dbe5f1", "f2dcdb", "ebf1dd", "e5e0ec", "dbeef3", "fdeada", "fff2ca", "d8d8d8", "595959", "c4bd97", "8db3e2", "b8cce4", "e5b9b7", "d7e3bc", "ccc1d9", "b7dde8", "fbd5b5", "ffe694", "bfbfbf", "3f3f3f", "938953", "548dd4", "95b3d7", "d99694", "c3d69b", "b2a2c7", "b7dde8", "fac08f", "f2c314", "a5a5a5", "262626", "494429", "17365d", "366092", "953734", "76923c", "5f497a", "92cddc", "e36c09", "c09100", "7f7f7f", "0c0c0c", "1d1b10", "0f243e", "244061", "632423", "4f6128", "3f3151", "31859b", "974806", "7f6000"], + foreColorList: null, + backColorList: null, + allowCustomForeColor: !0, + allowCustomBackColor: !0, + displayAsList: !1 + }; + function a(r, e) { + var l = [], + a = e.o.plugins.colors, + t = a[r + "List"] || a.colorList; + o.each(t, function (o, t) { + var c = r + t, + f = { + fn: r, + forceCss: !0, + hasIcon: !1, + text: e.lang["#" + t] || "#" + t, + param: "#" + t, + style: "background-color: #" + t + ";" + }; + a.displayAsList && "foreColor" === r && (f.style = "color: #" + t + " !important;"), e.addBtnDef(c, f), l.push(c); + }); + var c = r + "Remove", + f = { + fn: "removeFormat", + hasIcon: !1, + param: r, + style: "background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);" + }; + if (a.displayAsList && (f.style = ""), e.addBtnDef(c, f), l.push(c), a["allowCustom" + r.charAt(0).toUpperCase() + r.substr(1)]) { + var n = r + "Free", + d = { + fn: function fn() { + e.openModalInsert(e.lang[r], { + color: { + label: r, + forceCss: !0, + type: "color", + value: "#FFFFFF" + } + }, function (o) { + return e.execCmd(r, o.color), !0; + }); + }, + hasIcon: !1, + text: "#", + style: "text-indent: 0; line-height: 20px; padding: 0 5px;" + }; + e.addBtnDef(n, d), l.push(n); + } + return l; + } + o.extend(!0, o.trumbowyg, { + plugins: { + color: { + init: function init(o) { + o.o.plugins.colors = o.o.plugins.colors || l; + var r = o.o.plugins.colors.displayAsList ? o.o.prefix + "dropdown--color-list" : "", + e = { + dropdown: a("foreColor", o), + dropdownClass: r + }, + t = { + dropdown: a("backColor", o), + dropdownClass: r + }; + o.addBtnDef("foreColor", e), o.addBtnDef("backColor", t); + }, + tagHandler: function tagHandler(o, r) { + var l, + a = []; + if (!o.style) return a; + if ("" !== o.style.backgroundColor) { + var t = e(o.style.backgroundColor); + r.o.plugins.colors.colorList.indexOf(t) >= 0 ? a.push("backColor" + t) : a.push("backColorFree"); + } + return "" !== o.style.color ? l = e(o.style.color) : o.hasAttribute("color") && (l = e(o.getAttribute("color"))), l && (r.o.plugins.colors.colorList.indexOf(l) >= 0 ? a.push("foreColor" + l) : a.push("foreColorFree")), a; } } } }); }(jQuery); +/* =========================================================== + * trumbowyg.emoji.js v0.1 + * Emoji picker plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Nicolas Pion + * Twitter : @nicolas_pion + */ + (function ($) { 'use strict'; + var defaultOptions = { + emojiList: ['⁉', '™', 'ℹ', '↔', '↕', '↖', '↗', '↘', '↙', '⌨', '☀', '☁', '☂', '☃', '☄', '☑', '☔', '☕', '☘', '☠', '☢', '☣', '☦', '☸', '☹', '♀', '♂', '♈', '♉', '♐', '♑', '♒', '♓', '♠', '♣', '♥', '♦', '♨', '⚒', '⚓', '⚔', '⚕', '⚖', '⚗', '⚙', '✂', '✅', '✈', '✉', '✒', '✔', '✖', '✡', '✨', '✳', '✴', '❄', '❇', '❓', '❔', '❕', '❗', '❣', '❤', '➕', '➖', '➗', '⤴', '⤵', '〰', '㊗', '㊙', '😀', '😃', '😄', '😁', '😆', '😅', '😂', '🤣', '☺', '😊', '😇', '🙂', '🙃', '😉', '😌', '🥲', '😍', '🥰', '😘', '😗', '😙', '😚', '😋', '😛', '😝', '😜', '🤪', '🤨', '🧐', '🤓', '😎', '🤩', '🥳', '😏', '😒', '😞', '😔', '😟', '😕', '🙁', '😣', '😖', '😫', '😩', '🥺', '😢', '😭', '😤', '😮', '😠', '😡', '🤬', '🤯', '😳', '😶', '🥵', '🥶', '😱', '😨', '😰', '😥', '😓', '🤗', '🤔', '🤭', '🥱', '🤫', '🤥', '😐', '😑', '😬', '🙄', '😯', '😦', '😧', '😲', '😴', '🤤', '😪', '😵', '🤐', '🥴', '🤢', '🤮', '🤧', '😷', '🤒', '🤕', '🤑', '🤠', '🥸', '😈', '👿', '👹', '👺', '🤡', '💩', '👻', '💀', '👽', '👾', '🤖', '🎃', '😺', '😸', '😹', '😻', '😼', '😽', '🙀', '😿', '😾', '🤲', '👐', '🙌', '👏', '🤝', '👍', '👎', '👊', '✊', '🤛', '🤜', '🤞', '✌', '🤟', '🤘', '👌', '🤏', '🤌', '👈', '👉', '👆', '👇', '☝', '✋', '🤚', '🖐', '🖖', '👋', '🤙', '💪', '🦾', '🖕', '✍', '🙏', '🦶', '🦵', '🦿', '💄', '💋', '👄', '🦷', '👅', '👂', '🦻', '👃', '👣', '👁', '👀', '🧠', '🫀', '🫁', '🦴', '🗣', '👤', '👥', '🫂', '👶', '👧', '🧒', '👦', '👩', '🧑', '👨', '👱', '🧔', '👵', '🧓', '👴', '👲', '👳', '🧕', '👮', '👷', '💂', '🕵', '👰', '🤵', '👸', '🤴', '🦸', '🦹', '🥷', '🤶', '🎅', '🧙', '🧝', '🧛', '🧟', '🧞', '🧜', '🧚', '👼', '🤰', '🤱', '🙇', '💁', '🙅', '🙆', '🙋', '🧏', '🤦', '🤷', '🙎', '🙍', '💇', '💆', '🧖', '💅', '🤳', '💃', '🕺', '👯', '🕴', '🚶', '🧎', '🏃', '🧍', '👫', '👭', '👬', '💑', '💏', '👪', '🧶', '🧵', '🧥', '🥼', '🦺', '👚', '👕', '👖', '🩲', '🩳', '👔', '👗', '👙', '🩱', '👘', '🥻', '🥿', '👠', '👡', '👢', '👞', '👟', '🥾', '🩴', '🧦', '🧤', '🧣', '🎩', '🧢', '👒', '🎓', '⛑', '🪖', '👑', '💍', '👝', '👛', '👜', '💼', '🎒', '🧳', '👓', '🕶', '🥽', '🌂', '🦱', '🦰', '🦳', '🦲', '🐶', '🐱', '🐭', '🐹', '🐰', '🦊', '🐻', '🐼', '🐨', '🐯', '🦁', '🐮', '🐷', '🐽', '🐸', '🐵', '🙈', '🙉', '🙊', '🐒', '🐔', '🐧', '🐦', '🐤', '🐣', '🐥', '🦆', '🦤', '🦅', '🦉', '🦇', '🐺', '🐗', '🐴', '🦄', '🐝', '🐛', '🦋', '🐌', '🪱', '🐞', '🐜', '🪰', '🦟', '🪳', '🪲', '🦗', '🕷', '🕸', '🦂', '🐢', '🐍', '🦎', '🦖', '🦕', '🐙', '🦑', '🦐', '🦞', '🦀', '🐡', '🐠', '🐟', '🦭', '🐬', '🐳', '🐋', '🦈', '🐊', '🐅', '🐆', '🦓', '🦍', '🦧', '🐘', '🦣', '🦬', '🦛', '🦏', '🐪', '🐫', '🦒', '🦘', '🐃', '🐂', '🐄', '🐎', '🐖', '🐏', '🐑', '🦙', '🐐', '🦌', '🐕', '🐩', '🦮', '🐈', '🐓', '🦃', '🦚', '🦜', '🦢', '🦩', '🕊', '🐇', '🦝', '🦨', '🦡', '🦫', '🦦', '🦥', '🐁', '🐀', '🐿', '🦔', '🐾', '🐉', '🐲', '🌵', '🎄', '🌲', '🌳', '🌴', '🌱', '🌿', '🍀', '🎍', '🎋', '🍃', '🍂', '🍁', '🪶', '🍄', '🐚', '🪨', '🪵', '🌾', '🪴', '💐', '🌷', '🌹', '🥀', '🌺', '🌸', '🌼', '🌻', '🌞', '🌝', '🌛', '🌜', '🌚', '🌕', '🌖', '🌗', '🌘', '🌑', '🌒', '🌓', '🌔', '🌙', '🌎', '🌍', '🌏', '🪐', '💫', '⭐', '🌟', '⚡', '💥', '🔥', '🌪', '🌈', '🌤', '⛅', '🌥', '🌦', '🌧', '⛈', '🌩', '🌨', '⛄', '🌬', '💨', '💧', '💦', '🌊', '🌫', '🍏', '🍎', '🍐', '🍊', '🍋', '🍌', '🍉', '🍇', '🫐', '🍓', '🍈', '🍒', '🍑', '🥭', '🍍', '🥥', '🥝', '🍅', '🍆', '🥑', '🫒', '🥦', '🥬', '🫑', '🥒', '🌶', '🌽', '🥕', '🧄', '🧅', '🥔', '🍠', '🥐', '🥯', '🍞', '🥖', '🫓', '🥨', '🧀', '🥚', '🍳', '🧈', '🥞', '🧇', '🥓', '🥩', '🍗', '🍖', '🌭', '🍔', '🍟', '🍕', '🥪', '🥙', '🧆', '🌮', '🌯', '🫔', '🥗', '🥘', '🫕', '🥫', '🍝', '🍜', '🍲', '🍛', '🍣', '🍱', '🥟', '🦪', '🍤', '🍙', '🍚', '🍘', '🍥', '🥠', '🥮', '🍢', '🍡', '🍧', '🍨', '🍦', '🥧', '🧁', '🍰', '🎂', '🍮', '🍭', '🍬', '🍫', '🍿', '🍩', '🍪', '🌰', '🥜', '🍯', '🥛', '🍼', '🍵', '🫖', '🧉', '🧋', '🧃', '🥤', '🍶', '🍺', '🍻', '🥂', '🍷', '🥃', '🍸', '🍹', '🍾', '🧊', '🥄', '🍴', '🍽', '🥣', '🥡', '🥢', '🧂', '⚽', '🏀', '🏈', '⚾', '🥎', '🎾', '🏐', '🏉', '🥏', '🪃', '🎱', '🪀', '🏓', '🏸', '🏒', '🏑', '🥍', '🏏', '🥅', '⛳', '🪁', '🏹', '🎣', '🤿', '🥊', '🥋', '🎽', '🛹', '🛼', '🛷', '⛸', '🥌', '🎿', '⛷', '🏂', '🪂', '🏋', '🤼', '🤸', '⛹', '🤺', '🤾', '🏌', '🏇', '🧘', '🏄', '🏊', '🤽', '🚣', '🧗', '🚵', '🚴', '🏆', '🥇', '🥈', '🥉', '🏅', '🎖', '🏵', '🎗', '🎫', '🎟', '🎪', '🤹', '🎭', '🩰', '🎨', '🎬', '🎤', '🎧', '🎼', '🎹', '🥁', '🪘', '🎷', '🎺', '🎸', '🪕', '🎻', '🪗', '🎲', '♟', '🎯', '🎳', '🎮', '🎰', '🧩', '🚗', '🚕', '🚙', '🛻', '🚌', '🚎', '🏎', '🚓', '🚑', '🚒', '🚐', '🚚', '🚛', '🚜', '🦯', '🦽', '🦼', '🛴', '🚲', '🛵', '🏍', '🛺', '🚨', '🚔', '🚍', '🚘', '🚖', '🚡', '🚠', '🚟', '🚃', '🚋', '🚞', '🚝', '🚄', '🚅', '🚈', '🚂', '🚆', '🚇', '🚊', '🚉', '🛫', '🛬', '🛩', '💺', '🛰', '🚀', '🛸', '🚁', '🛶', '⛵', '🚤', '🛥', '🛳', '⛴', '🚢', '⛽', '🚧', '🚦', '🚥', '🚏', '🗺', '🗿', '🗽', '🗼', '🏰', '🏯', '🏟', '🎡', '🎢', '🎠', '⛲', '⛱', '🏖', '🏝', '🏜', '🌋', '⛰', '🏔', '🗻', '🏕', '⛺', '🏠', '🏡', '🏘', '🏚', '🛖', '🏗', '🏭', '🏢', '🏬', '🏣', '🏤', '🏥', '🏦', '🏨', '🏪', '🏫', '🏩', '💒', '🏛', '⛪', '🕌', '🕍', '🛕', '🕋', '⛩', '🛤', '🛣', '🗾', '🎑', '🏞', '🌅', '🌄', '🌠', '🎇', '🎆', '🌇', '🌆', '🏙', '🌃', '🌌', '🌉', '🌁', '⌚', '📱', '📲', '💻', '🖥', '🖨', '🖱', '🖲', '🕹', '🗜', '💽', '💾', '💿', '📀', '📼', '📷', '📸', '📹', '🎥', '📽', '🎞', '📞', '☎', '📟', '📠', '📺', '📻', '🎙', '🎚', '🎛', '🧭', '⏱', '⏲', '⏰', '🕰', '⌛', '⏳', '📡', '🔋', '🔌', '💡', '🔦', '🕯', '🪔', '🧯', '🛢', '💸', '💵', '💴', '💶', '💷', '🪙', '💰', '💳', '💎', '🪜', '🧰', '🪛', '🔧', '🔨', '🛠', '⛏', '🔩', '🧱', '⛓', '🪝', '🪢', '🧲', '🔫', '💣', '🧨', '🪓', '🪚', '🔪', '🗡', '🛡', '🚬', '⚰', '🪦', '⚱', '🏺', '🪄', '🔮', '📿', '🧿', '💈', '🔭', '🔬', '🕳', '🪟', '🩹', '🩺', '💊', '💉', '🩸', '🧬', '🦠', '🧫', '🧪', '🌡', '🪤', '🧹', '🧺', '🪡', '🧻', '🚽', '🪠', '🪣', '🚰', '🚿', '🛁', '🛀', '🪥', '🧼', '🪒', '🧽', '🧴', '🛎', '🔑', '🗝', '🚪', '🪑', '🪞', '🛋', '🛏', '🛌', '🧸', '🖼', '🛍', '🛒', '🎁', '🎈', '🎏', '🎀', '🎊', '🎉', '🪅', '🪆', '🎎', '🏮', '🎐', '🧧', '📩', '📨', '📧', '💌', '📥', '📤', '📦', '🏷', '📪', '📫', '📬', '📭', '📮', '📯', '🪧', '📜', '📃', '📄', '📑', '🧾', '📊', '📈', '📉', '🗒', '🗓', '📆', '📅', '🗑', '📇', '🗃', '🗳', '🗄', '📋', '📁', '📂', '🗂', '🗞', '📰', '📓', '📔', '📒', '📕', '📗', '📘', '📙', '📚', '📖', '🔖', '🧷', '🔗', '📎', '🖇', '📐', '📏', '🧮', '📌', '📍', '🖊', '🖋', '🖌', '🖍', '📝', '✏', '🔍', '🔎', '🔏', '🔐', '🔒', '🔓', '🧡', '💛', '💚', '💙', '💜', '🖤', '🤎', '🤍', '💔', '💕', '💞', '💓', '💗', '💖', '💘', '💝', '💟', '☮', '✝', '☪', '🕉', '🔯', '🕎', '☯', '🛐', '⛎', '♊', '♋', '♌', '♍', '♎', '♏', '🆔', '⚛', '🉑', '📴', '📳', '🈶', '🈚', '🈸', '🈺', '🈷', '🆚', '💮', '🉐', '🈴', '🈵', '🈹', '🈲', '🅰', '🅱', '🆎', '🆑', '🅾', '🆘', '❌', '⭕', '🛑', '⛔', '📛', '🚫', '💯', '💢', '🚷', '🚯', '🚳', '🚱', '🔞', '📵', '🚭', '‼', '🔅', '🔆', '〽', '⚠', '🚸', '🔱', '⚜', '🔰', '♻', '🈯', '💹', '❎', '🌐', '💠', 'Ⓜ', '🌀', '💤', '🏧', '🚾', '♿', '🅿', '🈳', '🈂', '🛂', '🛃', '🛄', '🛅', '🛗', '🚹', '🚺', '🚼', '🚻', '🚮', '🎦', '📶', '🈁', '🔣', '🔤', '🔡', '🔠', '🆖', '🆗', '🆙', '🆒', '🆕', '🆓', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '🔟', '🔢', '#', '*', '⏏', '▶', '⏸', '⏯', '⏹', '⏺', '⏭', '⏮', '⏩', '⏪', '⏫', '⏬', '◀', '🔼', '🔽', '➡', '⬅', '⬆', '⬇', '↪', '↩', '🔀', '🔁', '🔂', '🔄', '🔃', '🎵', '🎶', '♾', '💲', '💱', '©', '®', '➰', '➿', '🔚', '🔙', '🔛', '🔝', '🔜', '🔘', '⚪', '⚫', '🔴', '🔵', '🟤', '🟣', '🟢', '🟡', '🟠', '🔺', '🔻', '🔸', '🔹', '🔶', '🔷', '🔳', '🔲', '▪', '▫', '◾', '◽', '◼', '◻', '⬛', '⬜', '🟧', '🟦', '🟥', '🟫', '🟪', '🟩', '🟨', '🔈', '🔇', '🔉', '🔊', '🔔', '🔕', '📣', '📢', '🗨', '💬', '💭', '🗯', '🃏', '🎴', '🀄', '🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛', '🕜', '🕝', '🕞', '🕟', '🕠', '🕡', '🕢', '🕣', '🕤', '🕥', '🕦', '🕧', '⚧', '🏳', '🏴', '🏁', '🚩', '🇦', '🇩', '🇧', '🇮', '🇻', '🇰', '🇨', '🇹', '🇭', '🇪', '🇸', '🇬', '🇫', '🇵', '🇯', '🎌', '🇽', '🇱', '🇲', '🇾', '🇳', '🇴', '🇶', '🇷', '🇼', '🇿', '🇺', '🏻', '🏼', '🏽', '🏾', '🏿'] + }; + + // Add all emoji in a dropdown $.extend(true, $.trumbowyg, { langs: { // jshint camelcase:false en: { - fontFamily: 'Font' + emoji: 'Add an emoji' }, az: { - fontFamily: 'Şrift' - }, - by: { - fontFamily: 'Шрыфт' + emoji: 'Emoji yerləşdir' }, ca: { - fontFamily: 'Font' + emoji: 'Afegir una emoticona' }, da: { - fontFamily: 'Skrifttype' + emoji: 'Tilføj et humørikon' }, de: { - fontFamily: 'Schriftart' + emoji: 'Emoticon einfügen' }, es: { - fontFamily: 'Fuente' + emoji: 'Añadir un emoticono' }, et: { - fontFamily: 'Font' + emoji: 'Lisa emotikon' }, fr: { - fontFamily: 'Police' + emoji: 'Ajouter un emoji' }, hu: { - fontFamily: 'Betűtípus' - }, - ko: { - fontFamily: '글꼴' + emoji: 'Emoji beszúrás' }, - nl: { - fontFamily: 'Lettertype' + ja: { + emoji: '絵文字の挿入' }, - pt_br: { - fontFamily: 'Fonte' + ko: { + emoji: '이모지 넣기' }, ru: { - fontFamily: 'Шрифт' + emoji: 'Вставить emoji' }, sl: { - fontFamily: 'Pisava' + emoji: 'Vstavi emotikon' }, tr: { - fontFamily: 'Yazı tipi' + emoji: 'Emoji ekle' }, - zh_tw: { - fontFamily: '字體' + zh_cn: { + emoji: '添加表情' } - } - }); - // jshint camelcase:true - - var defaultOptions = { - fontList: [{ - name: 'Arial', - family: 'Arial, Helvetica, sans-serif' - }, { - name: 'Arial Black', - family: 'Arial Black, Gadget, sans-serif' - }, { - name: 'Comic Sans', - family: 'Comic Sans MS, Textile, cursive, sans-serif' - }, { - name: 'Courier New', - family: 'Courier New, Courier, monospace' - }, { - name: 'Georgia', - family: 'Georgia, serif' - }, { - name: 'Impact', - family: 'Impact, Charcoal, sans-serif' - }, { - name: 'Lucida Console', - family: 'Lucida Console, Monaco, monospace' - }, { - name: 'Lucida Sans', - family: 'Lucida Sans Uncide, Lucida Grande, sans-serif' - }, { - name: 'Palatino', - family: 'Palatino Linotype, Book Antiqua, Palatino, serif' - }, { - name: 'Tahoma', - family: 'Tahoma, Geneva, sans-serif' - }, { - name: 'Times New Roman', - family: 'Times New Roman, Times, serif' - }, { - name: 'Trebuchet', - family: 'Trebuchet MS, Helvetica, sans-serif' - }, { - name: 'Verdana', - family: 'Verdana, Geneva, sans-serif' - }] - }; - - // Add dropdown with web safe fonts - $.extend(true, $.trumbowyg, { + }, + // jshint camelcase:true plugins: { - fontfamily: { + emoji: { init: function init(trumbowyg) { - trumbowyg.o.plugins.fontfamily = $.extend({}, defaultOptions, trumbowyg.o.plugins.fontfamily || {}); - trumbowyg.addBtnDef('fontfamily', { - dropdown: buildDropdown(trumbowyg), - hasIcon: false, - text: trumbowyg.lang.fontFamily - }); + trumbowyg.o.plugins.emoji = trumbowyg.o.plugins.emoji || defaultOptions; + var emojiBtnDef = { + dropdown: buildDropdown(trumbowyg) + }; + trumbowyg.addBtnDef('emoji', emojiBtnDef); } } } }); function buildDropdown(trumbowyg) { var dropdown = []; - $.each(trumbowyg.o.plugins.fontfamily.fontList, function (index, font) { - trumbowyg.addBtnDef('fontfamily_' + index, { - title: '' + font.name + '', - hasIcon: false, - fn: function fn() { - trumbowyg.execCmd('fontName', font.family, true); - } - }); - dropdown.push('fontfamily_' + index); + $.each(trumbowyg.o.plugins.emoji.emojiList, function (i, emoji) { + if ($.isArray(emoji)) { + // Custom emoji behaviour + var emojiCode = emoji[0], + emojiUrl = emoji[1], + emojiHtml = '' + emojiCode + '', + customEmojiBtnName = 'emoji-' + emojiCode.replace(/:/g, ''), + customEmojiBtnDef = { + hasIcon: false, + text: emojiHtml, + fn: function fn() { + trumbowyg.execCmd('insertImage', emojiUrl, false, true); + return true; + } + }; + trumbowyg.addBtnDef(customEmojiBtnName, customEmojiBtnDef); + dropdown.push(customEmojiBtnName); + } else { + // Default behaviour + var btn = emoji.replace(/:/g, ''), + defaultEmojiBtnName = 'emoji-' + btn, + defaultEmojiBtnDef = { + text: emoji, + fn: function fn() { + var encodedEmoji = String.fromCodePoint(emoji.replace('&#', '0')); + trumbowyg.execCmd('insertText', encodedEmoji); + return true; + } + }; + trumbowyg.addBtnDef(defaultEmojiBtnName, defaultEmojiBtnDef); + dropdown.push(defaultEmojiBtnName); + } }); return dropdown; } })(jQuery); -!function (a) { +/* =========================================================== + * trumbowyg.emoji.js v0.1 + * Emoji picker plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Nicolas Pion + * Twitter : @nicolas_pion + */ +!function (x) { + "use strict"; + + var F = { + emojiList: ["⁉", "™", "ℹ", "↔", "↕", "↖", "↗", "↘", "↙", "⌨", "☀", "☁", "☂", "☃", "☄", "☑", "☔", "☕", "☘", "☠", "☢", "☣", "☦", "☸", "☹", "♀", "♂", "♈", "♉", "♐", "♑", "♒", "♓", "♠", "♣", "♥", "♦", "♨", "⚒", "⚓", "⚔", "⚕", "⚖", "⚗", "⚙", "✂", "✅", "✈", "✉", "✒", "✔", "✖", "✡", "✨", "✳", "✴", "❄", "❇", "❓", "❔", "❕", "❗", "❣", "❤", "➕", "➖", "➗", "⤴", "⤵", "〰", "㊗", "㊙", "😀", "😃", "😄", "😁", "😆", "😅", "😂", "🤣", "☺", "😊", "😇", "🙂", "🙃", "😉", "😌", "🥲", "😍", "🥰", "😘", "😗", "😙", "😚", "😋", "😛", "😝", "😜", "🤪", "🤨", "🧐", "🤓", "😎", "🤩", "🥳", "😏", "😒", "😞", "😔", "😟", "😕", "🙁", "😣", "😖", "😫", "😩", "🥺", "😢", "😭", "😤", "😮", "😠", "😡", "🤬", "🤯", "😳", "😶", "🥵", "🥶", "😱", "😨", "😰", "😥", "😓", "🤗", "🤔", "🤭", "🥱", "🤫", "🤥", "😐", "😑", "😬", "🙄", "😯", "😦", "😧", "😲", "😴", "🤤", "😪", "😵", "🤐", "🥴", "🤢", "🤮", "🤧", "😷", "🤒", "🤕", "🤑", "🤠", "🥸", "😈", "👿", "👹", "👺", "🤡", "💩", "👻", "💀", "👽", "👾", "🤖", "🎃", "😺", "😸", "😹", "😻", "😼", "😽", "🙀", "😿", "😾", "🤲", "👐", "🙌", "👏", "🤝", "👍", "👎", "👊", "✊", "🤛", "🤜", "🤞", "✌", "🤟", "🤘", "👌", "🤏", "🤌", "👈", "👉", "👆", "👇", "☝", "✋", "🤚", "🖐", "🖖", "👋", "🤙", "💪", "🦾", "🖕", "✍", "🙏", "🦶", "🦵", "🦿", "💄", "💋", "👄", "🦷", "👅", "👂", "🦻", "👃", "👣", "👁", "👀", "🧠", "🫀", "🫁", "🦴", "🗣", "👤", "👥", "🫂", "👶", "👧", "🧒", "👦", "👩", "🧑", "👨", "👱", "🧔", "👵", "🧓", "👴", "👲", "👳", "🧕", "👮", "👷", "💂", "🕵", "👰", "🤵", "👸", "🤴", "🦸", "🦹", "🥷", "🤶", "🎅", "🧙", "🧝", "🧛", "🧟", "🧞", "🧜", "🧚", "👼", "🤰", "🤱", "🙇", "💁", "🙅", "🙆", "🙋", "🧏", "🤦", "🤷", "🙎", "🙍", "💇", "💆", "🧖", "💅", "🤳", "💃", "🕺", "👯", "🕴", "🚶", "🧎", "🏃", "🧍", "👫", "👭", "👬", "💑", "💏", "👪", "🧶", "🧵", "🧥", "🥼", "🦺", "👚", "👕", "👖", "🩲", "🩳", "👔", "👗", "👙", "🩱", "👘", "🥻", "🥿", "👠", "👡", "👢", "👞", "👟", "🥾", "🩴", "🧦", "🧤", "🧣", "🎩", "🧢", "👒", "🎓", "⛑", "🪖", "👑", "💍", "👝", "👛", "👜", "💼", "🎒", "🧳", "👓", "🕶", "🥽", "🌂", "🦱", "🦰", "🦳", "🦲", "🐶", "🐱", "🐭", "🐹", "🐰", "🦊", "🐻", "🐼", "🐨", "🐯", "🦁", "🐮", "🐷", "🐽", "🐸", "🐵", "🙈", "🙉", "🙊", "🐒", "🐔", "🐧", "🐦", "🐤", "🐣", "🐥", "🦆", "🦤", "🦅", "🦉", "🦇", "🐺", "🐗", "🐴", "🦄", "🐝", "🐛", "🦋", "🐌", "🪱", "🐞", "🐜", "🪰", "🦟", "🪳", "🪲", "🦗", "🕷", "🕸", "🦂", "🐢", "🐍", "🦎", "🦖", "🦕", "🐙", "🦑", "🦐", "🦞", "🦀", "🐡", "🐠", "🐟", "🦭", "🐬", "🐳", "🐋", "🦈", "🐊", "🐅", "🐆", "🦓", "🦍", "🦧", "🐘", "🦣", "🦬", "🦛", "🦏", "🐪", "🐫", "🦒", "🦘", "🐃", "🐂", "🐄", "🐎", "🐖", "🐏", "🐑", "🦙", "🐐", "🦌", "🐕", "🐩", "🦮", "🐈", "🐓", "🦃", "🦚", "🦜", "🦢", "🦩", "🕊", "🐇", "🦝", "🦨", "🦡", "🦫", "🦦", "🦥", "🐁", "🐀", "🐿", "🦔", "🐾", "🐉", "🐲", "🌵", "🎄", "🌲", "🌳", "🌴", "🌱", "🌿", "🍀", "🎍", "🎋", "🍃", "🍂", "🍁", "🪶", "🍄", "🐚", "🪨", "🪵", "🌾", "🪴", "💐", "🌷", "🌹", "🥀", "🌺", "🌸", "🌼", "🌻", "🌞", "🌝", "🌛", "🌜", "🌚", "🌕", "🌖", "🌗", "🌘", "🌑", "🌒", "🌓", "🌔", "🌙", "🌎", "🌍", "🌏", "🪐", "💫", "⭐", "🌟", "⚡", "💥", "🔥", "🌪", "🌈", "🌤", "⛅", "🌥", "🌦", "🌧", "⛈", "🌩", "🌨", "⛄", "🌬", "💨", "💧", "💦", "🌊", "🌫", "🍏", "🍎", "🍐", "🍊", "🍋", "🍌", "🍉", "🍇", "🫐", "🍓", "🍈", "🍒", "🍑", "🥭", "🍍", "🥥", "🥝", "🍅", "🍆", "🥑", "🫒", "🥦", "🥬", "🫑", "🥒", "🌶", "🌽", "🥕", "🧄", "🧅", "🥔", "🍠", "🥐", "🥯", "🍞", "🥖", "🫓", "🥨", "🧀", "🥚", "🍳", "🧈", "🥞", "🧇", "🥓", "🥩", "🍗", "🍖", "🌭", "🍔", "🍟", "🍕", "🥪", "🥙", "🧆", "🌮", "🌯", "🫔", "🥗", "🥘", "🫕", "🥫", "🍝", "🍜", "🍲", "🍛", "🍣", "🍱", "🥟", "🦪", "🍤", "🍙", "🍚", "🍘", "🍥", "🥠", "🥮", "🍢", "🍡", "🍧", "🍨", "🍦", "🥧", "🧁", "🍰", "🎂", "🍮", "🍭", "🍬", "🍫", "🍿", "🍩", "🍪", "🌰", "🥜", "🍯", "🥛", "🍼", "🍵", "🫖", "🧉", "🧋", "🧃", "🥤", "🍶", "🍺", "🍻", "🥂", "🍷", "🥃", "🍸", "🍹", "🍾", "🧊", "🥄", "🍴", "🍽", "🥣", "🥡", "🥢", "🧂", "⚽", "🏀", "🏈", "⚾", "🥎", "🎾", "🏐", "🏉", "🥏", "🪃", "🎱", "🪀", "🏓", "🏸", "🏒", "🏑", "🥍", "🏏", "🥅", "⛳", "🪁", "🏹", "🎣", "🤿", "🥊", "🥋", "🎽", "🛹", "🛼", "🛷", "⛸", "🥌", "🎿", "⛷", "🏂", "🪂", "🏋", "🤼", "🤸", "⛹", "🤺", "🤾", "🏌", "🏇", "🧘", "🏄", "🏊", "🤽", "🚣", "🧗", "🚵", "🚴", "🏆", "🥇", "🥈", "🥉", "🏅", "🎖", "🏵", "🎗", "🎫", "🎟", "🎪", "🤹", "🎭", "🩰", "🎨", "🎬", "🎤", "🎧", "🎼", "🎹", "🥁", "🪘", "🎷", "🎺", "🎸", "🪕", "🎻", "🪗", "🎲", "♟", "🎯", "🎳", "🎮", "🎰", "🧩", "🚗", "🚕", "🚙", "🛻", "🚌", "🚎", "🏎", "🚓", "🚑", "🚒", "🚐", "🚚", "🚛", "🚜", "🦯", "🦽", "🦼", "🛴", "🚲", "🛵", "🏍", "🛺", "🚨", "🚔", "🚍", "🚘", "🚖", "🚡", "🚠", "🚟", "🚃", "🚋", "🚞", "🚝", "🚄", "🚅", "🚈", "🚂", "🚆", "🚇", "🚊", "🚉", "🛫", "🛬", "🛩", "💺", "🛰", "🚀", "🛸", "🚁", "🛶", "⛵", "🚤", "🛥", "🛳", "⛴", "🚢", "⛽", "🚧", "🚦", "🚥", "🚏", "🗺", "🗿", "🗽", "🗼", "🏰", "🏯", "🏟", "🎡", "🎢", "🎠", "⛲", "⛱", "🏖", "🏝", "🏜", "🌋", "⛰", "🏔", "🗻", "🏕", "⛺", "🏠", "🏡", "🏘", "🏚", "🛖", "🏗", "🏭", "🏢", "🏬", "🏣", "🏤", "🏥", "🏦", "🏨", "🏪", "🏫", "🏩", "💒", "🏛", "⛪", "🕌", "🕍", "🛕", "🕋", "⛩", "🛤", "🛣", "🗾", "🎑", "🏞", "🌅", "🌄", "🌠", "🎇", "🎆", "🌇", "🌆", "🏙", "🌃", "🌌", "🌉", "🌁", "⌚", "📱", "📲", "💻", "🖥", "🖨", "🖱", "🖲", "🕹", "🗜", "💽", "💾", "💿", "📀", "📼", "📷", "📸", "📹", "🎥", "📽", "🎞", "📞", "☎", "📟", "📠", "📺", "📻", "🎙", "🎚", "🎛", "🧭", "⏱", "⏲", "⏰", "🕰", "⌛", "⏳", "📡", "🔋", "🔌", "💡", "🔦", "🕯", "🪔", "🧯", "🛢", "💸", "💵", "💴", "💶", "💷", "🪙", "💰", "💳", "💎", "🪜", "🧰", "🪛", "🔧", "🔨", "🛠", "⛏", "🔩", "🧱", "⛓", "🪝", "🪢", "🧲", "🔫", "💣", "🧨", "🪓", "🪚", "🔪", "🗡", "🛡", "🚬", "⚰", "🪦", "⚱", "🏺", "🪄", "🔮", "📿", "🧿", "💈", "🔭", "🔬", "🕳", "🪟", "🩹", "🩺", "💊", "💉", "🩸", "🧬", "🦠", "🧫", "🧪", "🌡", "🪤", "🧹", "🧺", "🪡", "🧻", "🚽", "🪠", "🪣", "🚰", "🚿", "🛁", "🛀", "🪥", "🧼", "🪒", "🧽", "🧴", "🛎", "🔑", "🗝", "🚪", "🪑", "🪞", "🛋", "🛏", "🛌", "🧸", "🖼", "🛍", "🛒", "🎁", "🎈", "🎏", "🎀", "🎊", "🎉", "🪅", "🪆", "🎎", "🏮", "🎐", "🧧", "📩", "📨", "📧", "💌", "📥", "📤", "📦", "🏷", "📪", "📫", "📬", "📭", "📮", "📯", "🪧", "📜", "📃", "📄", "📑", "🧾", "📊", "📈", "📉", "🗒", "🗓", "📆", "📅", "🗑", "📇", "🗃", "🗳", "🗄", "📋", "📁", "📂", "🗂", "🗞", "📰", "📓", "📔", "📒", "📕", "📗", "📘", "📙", "📚", "📖", "🔖", "🧷", "🔗", "📎", "🖇", "📐", "📏", "🧮", "📌", "📍", "🖊", "🖋", "🖌", "🖍", "📝", "✏", "🔍", "🔎", "🔏", "🔐", "🔒", "🔓", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤎", "🤍", "💔", "💕", "💞", "💓", "💗", "💖", "💘", "💝", "💟", "☮", "✝", "☪", "🕉", "🔯", "🕎", "☯", "🛐", "⛎", "♊", "♋", "♌", "♍", "♎", "♏", "🆔", "⚛", "🉑", "📴", "📳", "🈶", "🈚", "🈸", "🈺", "🈷", "🆚", "💮", "🉐", "🈴", "🈵", "🈹", "🈲", "🅰", "🅱", "🆎", "🆑", "🅾", "🆘", "❌", "⭕", "🛑", "⛔", "📛", "🚫", "💯", "💢", "🚷", "🚯", "🚳", "🚱", "🔞", "📵", "🚭", "‼", "🔅", "🔆", "〽", "⚠", "🚸", "🔱", "⚜", "🔰", "♻", "🈯", "💹", "❎", "🌐", "💠", "Ⓜ", "🌀", "💤", "🏧", "🚾", "♿", "🅿", "🈳", "🈂", "🛂", "🛃", "🛄", "🛅", "🛗", "🚹", "🚺", "🚼", "🚻", "🚮", "🎦", "📶", "🈁", "🔣", "🔤", "🔡", "🔠", "🆖", "🆗", "🆙", "🆒", "🆕", "🆓", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "🔟", "🔢", "#", "*", "⏏", "▶", "⏸", "⏯", "⏹", "⏺", "⏭", "⏮", "⏩", "⏪", "⏫", "⏬", "◀", "🔼", "🔽", "➡", "⬅", "⬆", "⬇", "↪", "↩", "🔀", "🔁", "🔂", "🔄", "🔃", "🎵", "🎶", "♾", "💲", "💱", "©", "®", "➰", "➿", "🔚", "🔙", "🔛", "🔝", "🔜", "🔘", "⚪", "⚫", "🔴", "🔵", "🟤", "🟣", "🟢", "🟡", "🟠", "🔺", "🔻", "🔸", "🔹", "🔶", "🔷", "🔳", "🔲", "▪", "▫", "◾", "◽", "◼", "◻", "⬛", "⬜", "🟧", "🟦", "🟥", "🟫", "🟪", "🟩", "🟨", "🔈", "🔇", "🔉", "🔊", "🔔", "🔕", "📣", "📢", "🗨", "💬", "💭", "🗯", "🃏", "🎴", "🀄", "🕐", "🕑", "🕒", "🕓", "🕔", "🕕", "🕖", "🕗", "🕘", "🕙", "🕚", "🕛", "🕜", "🕝", "🕞", "🕟", "🕠", "🕡", "🕢", "🕣", "🕤", "🕥", "🕦", "🕧", "⚧", "🏳", "🏴", "🏁", "🚩", "🇦", "🇩", "🇧", "🇮", "🇻", "🇰", "🇨", "🇹", "🇭", "🇪", "🇸", "🇬", "🇫", "🇵", "🇯", "🎌", "🇽", "🇱", "🇲", "🇾", "🇳", "🇴", "🇶", "🇷", "🇼", "🇿", "🇺", "🏻", "🏼", "🏽", "🏾", "🏿"] + }; + function A(F) { + var A = []; + return x.each(F.o.plugins.emoji.emojiList, function (E, B) { + if (x.isArray(B)) { + var C = B[0], + D = B[1], + e = '' + C + '', + i = "emoji-" + C.replace(/:/g, ""), + o = { + hasIcon: !1, + text: e, + fn: function fn() { + return F.execCmd("insertImage", D, !1, !0), !0; + } + }; + F.addBtnDef(i, o), A.push(i); + } else { + var n = "emoji-" + B.replace(/:/g, ""), + m = { + text: B, + fn: function fn() { + var x = String.fromCodePoint(B.replace("&#", "0")); + return F.execCmd("insertText", x), !0; + } + }; + F.addBtnDef(n, m), A.push(n); + } + }), A; + } + x.extend(!0, x.trumbowyg, { + langs: { + en: { + emoji: "Add an emoji" + }, + az: { + emoji: "Emoji yerləşdir" + }, + ca: { + emoji: "Afegir una emoticona" + }, + da: { + emoji: "Tilføj et humørikon" + }, + de: { + emoji: "Emoticon einfügen" + }, + es: { + emoji: "Añadir un emoticono" + }, + et: { + emoji: "Lisa emotikon" + }, + fr: { + emoji: "Ajouter un emoji" + }, + hu: { + emoji: "Emoji beszúrás" + }, + ja: { + emoji: "絵文字の挿入" + }, + ko: { + emoji: "이모지 넣기" + }, + ru: { + emoji: "Вставить emoji" + }, + sl: { + emoji: "Vstavi emotikon" + }, + tr: { + emoji: "Emoji ekle" + }, + zh_cn: { + emoji: "添加表情" + } + }, + plugins: { + emoji: { + init: function init(x) { + x.o.plugins.emoji = x.o.plugins.emoji || F; + var E = { + dropdown: A(x) + }; + x.addBtnDef("emoji", E); + } + } + } + }); +}(jQuery); +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { + langs: { + // jshint camelcase:false + en: { + fontFamily: 'Font' + }, + az: { + fontFamily: 'Şrift' + }, + by: { + fontFamily: 'Шрыфт' + }, + ca: { + fontFamily: 'Font' + }, + da: { + fontFamily: 'Skrifttype' + }, + de: { + fontFamily: 'Schriftart' + }, + es: { + fontFamily: 'Fuente' + }, + et: { + fontFamily: 'Font' + }, + fr: { + fontFamily: 'Police' + }, + hu: { + fontFamily: 'Betűtípus' + }, + ko: { + fontFamily: '글꼴' + }, + nl: { + fontFamily: 'Lettertype' + }, + pt_br: { + fontFamily: 'Fonte' + }, + ru: { + fontFamily: 'Шрифт' + }, + sl: { + fontFamily: 'Pisava' + }, + tr: { + fontFamily: 'Yazı tipi' + }, + zh_tw: { + fontFamily: '字體' + } + } + }); + // jshint camelcase:true + + var defaultOptions = { + fontList: [{ + name: 'Arial', + family: 'Arial, Helvetica, sans-serif' + }, { + name: 'Arial Black', + family: 'Arial Black, Gadget, sans-serif' + }, { + name: 'Comic Sans', + family: 'Comic Sans MS, Textile, cursive, sans-serif' + }, { + name: 'Courier New', + family: 'Courier New, Courier, monospace' + }, { + name: 'Georgia', + family: 'Georgia, serif' + }, { + name: 'Impact', + family: 'Impact, Charcoal, sans-serif' + }, { + name: 'Lucida Console', + family: 'Lucida Console, Monaco, monospace' + }, { + name: 'Lucida Sans', + family: 'Lucida Sans Uncide, Lucida Grande, sans-serif' + }, { + name: 'Palatino', + family: 'Palatino Linotype, Book Antiqua, Palatino, serif' + }, { + name: 'Tahoma', + family: 'Tahoma, Geneva, sans-serif' + }, { + name: 'Times New Roman', + family: 'Times New Roman, Times, serif' + }, { + name: 'Trebuchet', + family: 'Trebuchet MS, Helvetica, sans-serif' + }, { + name: 'Verdana', + family: 'Verdana, Geneva, sans-serif' + }] + }; + + // Add dropdown with web safe fonts + $.extend(true, $.trumbowyg, { + plugins: { + fontfamily: { + init: function init(trumbowyg) { + trumbowyg.o.plugins.fontfamily = $.extend({}, defaultOptions, trumbowyg.o.plugins.fontfamily || {}); + trumbowyg.addBtnDef('fontfamily', { + dropdown: buildDropdown(trumbowyg), + hasIcon: false, + text: trumbowyg.lang.fontFamily + }); + } + } + } + }); + function buildDropdown(trumbowyg) { + var dropdown = []; + $.each(trumbowyg.o.plugins.fontfamily.fontList, function (index, font) { + trumbowyg.addBtnDef('fontfamily_' + index, { + title: '' + font.name + '', + hasIcon: false, + fn: function fn() { + trumbowyg.execCmd('fontName', font.family, true); + } + }); + dropdown.push('fontfamily_' + index); + }); + return dropdown; + } +})(jQuery); +!function (a) { "use strict"; a.extend(!0, a.trumbowyg, { @@ -1593,1401 +1593,1318 @@ langs: { // jshint camelcase:false en: { - fontsize: 'Font size', - fontsizes: { - 'x-small': 'Extra small', - 'small': 'Small', - 'medium': 'Regular', - 'large': 'Large', - 'x-large': 'Extra large', - 'custom': 'Custom' - }, - fontCustomSize: { - title: 'Custom Font Size', - label: 'Font Size', - value: '48px' - } + giphy: 'Insert GIF' }, az: { - fontsize: 'Şrift həcmi', - fontsizes: { - 'x-small': 'Daha kiçik', - 'small': 'Kiçik', - 'medium': 'Normal', - 'large': 'Böyük', - 'x-large': 'Daha böyük', - 'custom': 'Fərdi həcm' - }, - fontCustomSize: { - title: 'Fərdi şrift həcmi', - label: 'Şrift həcmi', - value: '48px' - } + giphy: 'GIF yerləşdir' }, by: { - fontsize: 'Памер шрыфта', - fontsizes: { - 'x-small': 'Вельмі маленькі', - 'small': 'Маленькі', - 'medium': 'Звычайны', - 'large': 'Вялікі', - 'x-large': 'Вельмі вялікі', - 'custom': 'Карыстальніцкі' - }, - fontCustomSize: { - title: 'Карыстальніцкі Памер Шрыфта', - label: 'Памер Шрыфта', - value: '48px' - } - }, - ca: { - fontsize: 'Mida de la lletra', - fontsizes: { - 'x-small': 'Molt petita', - 'small': 'Petita', - 'medium': 'Normal', - 'large': 'Gran', - 'x-large': 'Molt Gran', - 'custom': 'Personalitzada' - }, - fontCustomSize: { - title: 'Mida de lletra personalitzada', - label: 'Mida de lletra', - value: '48px' - } - }, - da: { - fontsize: 'Skriftstørrelse', - fontsizes: { - 'x-small': 'Ekstra lille', - 'small': 'Lille', - 'medium': 'Normal', - 'large': 'Stor', - 'x-large': 'Ekstra stor', - 'custom': 'Brugerdefineret' - } - }, - de: { - fontsize: 'Schriftgröße', - fontsizes: { - 'x-small': 'Sehr klein', - 'small': 'Klein', - 'medium': 'Normal', - 'large': 'Groß', - 'x-large': 'Sehr groß', - 'custom': 'Benutzerdefiniert' - }, - fontCustomSize: { - title: 'Benutzerdefinierte Schriftgröße', - label: 'Schriftgröße', - value: '48px' - } - }, - es: { - fontsize: 'Tamaño de Fuente', - fontsizes: { - 'x-small': 'Extra pequeña', - 'small': 'Pegueña', - 'medium': 'Regular', - 'large': 'Grande', - 'x-large': 'Extra Grande', - 'custom': 'Customizada' - }, - fontCustomSize: { - title: 'Tamaño de Fuente Customizada', - label: 'Tamaño de Fuente', - value: '48px' - } + giphy: 'Уставіць GIF' }, et: { - fontsize: 'Teksti suurus', - fontsizes: { - 'x-small': 'Väga väike', - 'small': 'Väike', - 'medium': 'Tavaline', - 'large': 'Suur', - 'x-large': 'Väga suur', - 'custom': 'Määra ise' - }, - fontCustomSize: { - title: 'Kohandatud teksti suurus', - label: 'Teksti suurus', - value: '48px' - } + giphy: 'Sisesta GIF' }, fr: { - fontsize: 'Taille de la police', - fontsizes: { - 'x-small': 'Très petit', - 'small': 'Petit', - 'medium': 'Normal', - 'large': 'Grand', - 'x-large': 'Très grand', - 'custom': 'Taille personnalisée' - }, - fontCustomSize: { - title: 'Taille de police personnalisée', - label: 'Taille de la police', - value: '48px' - } + giphy: 'Insérer un GIF' }, hu: { - fontsize: 'Betű méret', - fontsizes: { - 'x-small': 'Extra kicsi', - 'small': 'Kicsi', - 'medium': 'Normális', - 'large': 'Nagy', - 'x-large': 'Extra nagy', - 'custom': 'Egyedi' - }, - fontCustomSize: { - title: 'Egyedi betű méret', - label: 'Betű méret', - value: '48px' - } - }, - it: { - fontsize: 'Dimensioni del testo', - fontsizes: { - 'x-small': 'Molto piccolo', - 'small': 'piccolo', - 'regular': 'normale', - 'large': 'grande', - 'x-large': 'Molto grande', - 'custom': 'Personalizzato' - }, - fontCustomSize: { - title: 'Dimensioni del testo personalizzato', - label: 'Dimensioni del testo', - value: '48px' - } - }, - ko: { - fontsize: '글꼴 크기', - fontsizes: { - 'x-small': '아주 작게', - 'small': '작게', - 'medium': '보통', - 'large': '크게', - 'x-large': '아주 크게', - 'custom': '사용자 지정' - }, - fontCustomSize: { - title: '사용자 지정 글꼴 크기', - label: '글꼴 크기', - value: '48px' - } - }, - nl: { - fontsize: 'Lettergrootte', - fontsizes: { - 'x-small': 'Extra klein', - 'small': 'Klein', - 'medium': 'Normaal', - 'large': 'Groot', - 'x-large': 'Extra groot', - 'custom': 'Handmatig' - }, - fontCustomSize: { - title: 'Handmatige lettergrootte', - label: 'Lettergrootte', - value: '48px' - } - }, - pt_br: { - fontsize: 'Tamanho da fonte', - fontsizes: { - 'x-small': 'Extra pequeno', - 'small': 'Pequeno', - 'regular': 'Médio', - 'large': 'Grande', - 'x-large': 'Extra grande', - 'custom': 'Personalizado' - }, - fontCustomSize: { - title: 'Tamanho de Fonte Personalizado', - label: 'Tamanho de Fonte', - value: '48px' - } + giphy: 'GIF beszúrás' }, ru: { - fontsize: 'Размер шрифта', - fontsizes: { - 'x-small': 'Очень маленький', - 'small': 'Маленький', - 'medium': 'Обычный', - 'large': 'Большой', - 'x-large': 'Очень большой', - 'custom': 'Пользовательский' - }, - fontCustomSize: { - title: 'Пользовательский Размер Шрифта', - label: 'Размер Шрифта', - value: '48px' - } + giphy: 'Вставить GIF' }, sl: { - fontsize: 'Velikost pisave', - fontsizes: { - 'x-small': 'Ekstra majhna', - 'small': 'Majhna', - 'medium': 'Navadno', - 'large': 'Velika', - 'x-large': 'Ekstra velika', - 'custom': 'Poljubna' - }, - fontCustomSize: { - title: 'Poljubna velikost pisave', - label: 'Velikost pisave', - value: '48px' - } + giphy: 'Vstavi GIF' }, tr: { - fontsize: 'Yazı boyutu', - fontsizes: { - 'x-small': 'Çok küçük', - 'small': 'Küçük', - 'medium': 'Normal', - 'large': 'Büyük', - 'x-large': 'Çok büyük', - 'custom': 'Özel' - }, - fontCustomSize: { - title: 'Özel Yazı Boyutu', - label: 'Yazı Boyutu', - value: '48px' - } - }, - zh_tw: { - fontsize: '字體大小', - fontsizes: { - 'x-small': '最小', - 'small': '小', - 'medium': '中', - 'large': '大', - 'x-large': '最大', - 'custom': '自訂大小' - }, - fontCustomSize: { - title: '自訂義字體大小', - label: '字體大小', - value: '48px' - } + giphy: 'GIF ekle' } + // jshint camelcase:true } }); - // jshint camelcase:true - var defaultOptions = { - sizeList: ['x-small', 'small', 'medium', 'large', 'x-large'], - allowCustomSize: true - }; + var giphyLogo = ''; // jshint ignore:line - // Add dropdown with font sizes - $.extend(true, $.trumbowyg, { - plugins: { - fontsize: { - init: function init(trumbowyg) { - trumbowyg.o.plugins.fontsize = $.extend({}, defaultOptions, trumbowyg.o.plugins.fontsize || {}); - trumbowyg.addBtnDef('fontsize', { - dropdown: buildDropdown(trumbowyg) - }); + var CANCEL_EVENT = 'tbwcancel'; + + // Throttle helper + function trumbowygThrottle(callback, delay) { + var last; + var timer; + return function () { + var context = this; + var now = +new Date(); + var args = arguments; + if (last && now < last + delay) { + clearTimeout(timer); + timer = setTimeout(function () { + last = now; + callback.apply(context, args); + }, delay); + } else { + last = now; + callback.apply(context, args); + } + }; + } + + // Fills modal with response gifs + function renderGifs(response, $giphyModal, trumbowyg, mustEmpty) { + var width = ($giphyModal.width() - 20) / 3; + var html = response.data.filter(function (gifData) { + // jshint camelcase:false + var downsized = gifData.images.downsized || gifData.images.downsized_medium; + // jshint camelcase:true + return !!downsized.url; + }).map(function (gifData) { + // jshint camelcase:false + var downsized = gifData.images.downsized || gifData.images.downsized_medium; + // jshint camelcase:true + var image = downsized, + imageRatio = image.height / image.width, + altText = gifData.title; + var imgHtml = '' + altText + ''; + return '
    ' + imgHtml + '
    '; + }).join(''); + if (mustEmpty === true) { + if (html.length === 0) { + if ($('.' + trumbowyg.o.prefix + 'giphy-no-result', $giphyModal).length > 0) { + return; } + html = ''; } + $giphyModal.empty(); } - }); - function setFontSize(trumbowyg, size) { - trumbowyg.$ed.focus(); - trumbowyg.saveRange(); - - // Temporary size - trumbowyg.execCmd('fontSize', '1'); - var fontElements = trumbowyg.$ed.find('font[size="1"]'); - - // Remove previous font-size span tags. Needed to prevent Firefox from - // nesting multiple spans on font-size changes. - // (see https://github.com/Alex-D/Trumbowyg/issues/1252) - fontElements.find('span[style*="font-size"]').contents().unwrap(); + $giphyModal.append(html); - // Find elements that were added and change to with chosen size - fontElements.replaceWith(function () { - return $('', { - css: { - 'font-size': size - }, - html: this.innerHTML - }); + // Remove gray overlay on image load + // moved here from inline callback definition due to CSP issue + // Note: this is being done post-factum because load event doesn't bubble up and so can't be delegated + var addLoadedClass = function addLoadedClass(img) { + img.classList.add('tbw-loaded'); + }; + $('img', $giphyModal).each(function () { + var img = this; + if (img.complete) { + // images load instantly when cached and esp. when loaded in previous modal open + addLoadedClass(img); + } else { + img.addEventListener('load', function () { + addLoadedClass(this); + }); + } }); + $('img', $giphyModal).on('click', function () { + var src = $(this).attr('src'), + alt = $(this).attr('alt'); + trumbowyg.restoreRange(); + trumbowyg.execCmd('insertImage', src, false, true); - // Remove and leftover elements - $(trumbowyg.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(); - trumbowyg.restoreRange(); - trumbowyg.syncCode(); - trumbowyg.$c.trigger('tbwchange'); - } - function buildDropdown(trumbowyg) { - var dropdown = []; - $.each(trumbowyg.o.plugins.fontsize.sizeList, function (index, size) { - trumbowyg.addBtnDef('fontsize_' + size, { - text: '' + (trumbowyg.lang.fontsizes[size] || size) + '', - hasIcon: false, - fn: function fn() { - setFontSize(trumbowyg, size); - } - }); - dropdown.push('fontsize_' + size); + // relay alt tag into inserted image + if (alt) { + var $img = $('img[src="' + src + '"]:not([alt])', trumbowyg.$box); + $img.attr('alt', alt); + // Note: This seems to fire relatively early and could be wrapped in a setTimeout if needed + trumbowyg.syncCode(); + } + $('img', $giphyModal).off(); + trumbowyg.closeModal(); }); - if (trumbowyg.o.plugins.fontsize.allowCustomSize) { - var customSizeButtonName = 'fontsize_custom'; - var customSizeBtnDef = { - fn: function fn() { - trumbowyg.openModalInsert(trumbowyg.lang.fontCustomSize.title, { - size: { - label: trumbowyg.lang.fontCustomSize.label, - value: trumbowyg.lang.fontCustomSize.value + } + var defaultOptions = { + rating: 'g', + apiKey: null, + throttleDelay: 300, + noResultGifUrl: 'https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif' + }; + + // Add dropdown with font sizes + $.extend(true, $.trumbowyg, { + plugins: { + giphy: { + init: function init(trumbowyg) { + trumbowyg.o.plugins.giphy = $.extend({}, defaultOptions, trumbowyg.o.plugins.giphy || {}); + trumbowyg.addBtnDef('giphy', { + fn: function fn() { + if (trumbowyg.o.plugins.giphy.apiKey === null) { + throw new Error('You must set a Giphy API Key'); + } + var BASE_URL = 'https://api.giphy.com/v1/gifs/search?api_key=' + trumbowyg.o.plugins.giphy.apiKey + '&rating=' + trumbowyg.o.plugins.giphy.rating, + DEFAULT_URL = BASE_URL.replace('/search', '/trending'); + var previousAjaxCall = { + abort: function abort() {} + }; + var prefix = trumbowyg.o.prefix; + + // Create and open the modal + var searchInput = '', + closeButton = '', + poweredByGiphy = '
    Powered by' + giphyLogo + '
    ', + giphyModalHtml = searchInput + closeButton + poweredByGiphy + '
    '; + trumbowyg.openModal(null, giphyModalHtml, false).one(CANCEL_EVENT, function () { + try { + previousAjaxCall.abort(); + } catch (e) {} + trumbowyg.closeModal(); + }); + var $giphyInput = $('.' + prefix + 'giphy-search'), + $giphyClose = $('.' + prefix + 'giphy-close'), + $giphyModal = $('.' + prefix + 'giphy-modal'); + var ajaxError = function ajaxError() { + if (!navigator.onLine && !$('.' + prefix + 'giphy-offline', $giphyModal).length) { + $giphyModal.empty(); + $giphyModal.append('

    You are offline

    '); + } + }; + + // Load trending gifs as default + $.ajax({ + url: DEFAULT_URL, + dataType: 'json', + success: function success(response) { + renderGifs(response, $giphyModal, trumbowyg, true); + }, + error: ajaxError + }); + var searchGifsOnInput = function searchGifsOnInput() { + var query = $giphyInput.val(); + if (query.length === 0) { + return; + } + try { + previousAjaxCall.abort(); + } catch (e) {} + previousAjaxCall = $.ajax({ + url: BASE_URL + '&q=' + encodeURIComponent(query), + dataType: 'json', + success: function success(response) { + renderGifs(response, $giphyModal, trumbowyg, true); + }, + error: ajaxError + }); + }; + var throttledInputRequest = trumbowygThrottle(searchGifsOnInput, trumbowyg.o.plugins.giphy.throttleDelay); + $giphyInput.on('input', throttledInputRequest); + $giphyInput.focus(); + $giphyClose.one('click', function () { + $giphyModal.trigger(CANCEL_EVENT); + }); } - }, function (form) { - setFontSize(trumbowyg, form.size); - return true; }); - }, - text: '' + trumbowyg.lang.fontsizes.custom + '', - hasIcon: false - }; - trumbowyg.addBtnDef(customSizeButtonName, customSizeBtnDef); - dropdown.push(customSizeButtonName); + } + } } - return dropdown; - } + }); })(jQuery); -!function (e) { +!function (i) { "use strict"; - e.extend(!0, e.trumbowyg, { + i.extend(!0, i.trumbowyg, { langs: { en: { - fontsize: "Font size", - fontsizes: { - "x-small": "Extra small", - small: "Small", - medium: "Regular", - large: "Large", - "x-large": "Extra large", - custom: "Custom" - }, - fontCustomSize: { - title: "Custom Font Size", - label: "Font Size", - value: "48px" - } + giphy: "Insert GIF" }, az: { - fontsize: "Şrift həcmi", - fontsizes: { - "x-small": "Daha kiçik", - small: "Kiçik", - medium: "Normal", - large: "Böyük", - "x-large": "Daha böyük", - custom: "Fərdi həcm" - }, - fontCustomSize: { - title: "Fərdi şrift həcmi", - label: "Şrift həcmi", - value: "48px" + giphy: "GIF yerləşdir" + }, + by: { + giphy: "Уставіць GIF" + }, + et: { + giphy: "Sisesta GIF" + }, + fr: { + giphy: "Insérer un GIF" + }, + hu: { + giphy: "GIF beszúrás" + }, + ru: { + giphy: "Вставить GIF" + }, + sl: { + giphy: "Vstavi GIF" + }, + tr: { + giphy: "GIF ekle" + } + } + }); + var e = "tbwcancel"; + function t(e, t, n, l) { + var a = (t.width() - 20) / 3, + o = e.data.filter(function (i) { + return !!(i.images.downsized || i.images.downsized_medium).url; + }).map(function (i) { + var e = i.images.downsized || i.images.downsized_medium, + t = e.height / e.width, + n = i.title; + return '
    ' + ("' + n + '') + "
    "; + }).join(""); + if (!0 === l) { + if (0 === o.length) { + if (i("." + n.o.prefix + "giphy-no-result", t).length > 0) return; + o = ''; + } + t.empty(); + } + t.append(o); + var c = function c(i) { + i.classList.add("tbw-loaded"); + }; + i("img", t).each(function () { + var i = this; + i.complete ? c(i) : i.addEventListener("load", function () { + c(this); + }); + }), i("img", t).on("click", function () { + var e = i(this).attr("src"), + l = i(this).attr("alt"); + (n.restoreRange(), n.execCmd("insertImage", e, !1, !0), l) && (i('img[src="' + e + '"]:not([alt])', n.$box).attr("alt", l), n.syncCode()); + i("img", t).off(), n.closeModal(); + }); + } + var n = { + rating: "g", + apiKey: null, + throttleDelay: 300, + noResultGifUrl: "https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif" + }; + i.extend(!0, i.trumbowyg, { + plugins: { + giphy: { + init: function init(l) { + l.o.plugins.giphy = i.extend({}, n, l.o.plugins.giphy || {}), l.addBtnDef("giphy", { + fn: function fn() { + if (null === l.o.plugins.giphy.apiKey) throw new Error("You must set a Giphy API Key"); + var n = "https://api.giphy.com/v1/gifs/search?api_key=" + l.o.plugins.giphy.apiKey + "&rating=" + l.o.plugins.giphy.rating, + a = n.replace("/search", "/trending"), + o = { + abort: function abort() {} + }, + c = l.o.prefix, + r = '' + ('') + ('
    Powered by
    ') + '
    '; + l.openModal(null, r, !1).one(e, function () { + try { + o.abort(); + } catch (i) {} + l.closeModal(); + }); + var s = i("." + c + "giphy-search"), + g = i("." + c + "giphy-close"), + p = i("." + c + "giphy-modal"), + h = function h() { + navigator.onLine || i("." + c + "giphy-offline", p).length || (p.empty(), p.append('

    You are offline

    ')); + }; + i.ajax({ + url: a, + dataType: "json", + success: function success(i) { + t(i, p, l, !0); + }, + error: h + }); + var u, + d, + y, + f, + m = (u = function u() { + var e = s.val(); + if (0 !== e.length) { + try { + o.abort(); + } catch (i) {} + o = i.ajax({ + url: n + "&q=" + encodeURIComponent(e), + dataType: "json", + success: function success(i) { + t(i, p, l, !0); + }, + error: h + }); + } + }, d = l.o.plugins.giphy.throttleDelay, function () { + var i = this, + e = +new Date(), + t = arguments; + y && e < y + d ? (clearTimeout(f), f = setTimeout(function () { + y = e, u.apply(i, t); + }, d)) : (y = e, u.apply(i, t)); + }); + s.on("input", m), s.focus(), g.one("click", function () { + p.trigger(e); + }); + } + }); + } + } + } + }); +}(jQuery); +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { + langs: { + // jshint camelcase:false + en: { + fontsize: 'Font size', + fontsizes: { + 'x-small': 'Extra small', + 'small': 'Small', + 'medium': 'Regular', + 'large': 'Large', + 'x-large': 'Extra large', + 'custom': 'Custom' + }, + fontCustomSize: { + title: 'Custom Font Size', + label: 'Font Size', + value: '48px' + } + }, + az: { + fontsize: 'Şrift həcmi', + fontsizes: { + 'x-small': 'Daha kiçik', + 'small': 'Kiçik', + 'medium': 'Normal', + 'large': 'Böyük', + 'x-large': 'Daha böyük', + 'custom': 'Fərdi həcm' + }, + fontCustomSize: { + title: 'Fərdi şrift həcmi', + label: 'Şrift həcmi', + value: '48px' } }, by: { - fontsize: "Памер шрыфта", + fontsize: 'Памер шрыфта', fontsizes: { - "x-small": "Вельмі маленькі", - small: "Маленькі", - medium: "Звычайны", - large: "Вялікі", - "x-large": "Вельмі вялікі", - custom: "Карыстальніцкі" + 'x-small': 'Вельмі маленькі', + 'small': 'Маленькі', + 'medium': 'Звычайны', + 'large': 'Вялікі', + 'x-large': 'Вельмі вялікі', + 'custom': 'Карыстальніцкі' }, fontCustomSize: { - title: "Карыстальніцкі Памер Шрыфта", - label: "Памер Шрыфта", - value: "48px" + title: 'Карыстальніцкі Памер Шрыфта', + label: 'Памер Шрыфта', + value: '48px' } }, ca: { - fontsize: "Mida de la lletra", + fontsize: 'Mida de la lletra', fontsizes: { - "x-small": "Molt petita", - small: "Petita", - medium: "Normal", - large: "Gran", - "x-large": "Molt Gran", - custom: "Personalitzada" + 'x-small': 'Molt petita', + 'small': 'Petita', + 'medium': 'Normal', + 'large': 'Gran', + 'x-large': 'Molt Gran', + 'custom': 'Personalitzada' }, fontCustomSize: { - title: "Mida de lletra personalitzada", - label: "Mida de lletra", - value: "48px" + title: 'Mida de lletra personalitzada', + label: 'Mida de lletra', + value: '48px' } }, da: { - fontsize: "Skriftstørrelse", + fontsize: 'Skriftstørrelse', fontsizes: { - "x-small": "Ekstra lille", - small: "Lille", - medium: "Normal", - large: "Stor", - "x-large": "Ekstra stor", - custom: "Brugerdefineret" + 'x-small': 'Ekstra lille', + 'small': 'Lille', + 'medium': 'Normal', + 'large': 'Stor', + 'x-large': 'Ekstra stor', + 'custom': 'Brugerdefineret' } }, de: { - fontsize: "Schriftgröße", + fontsize: 'Schriftgröße', fontsizes: { - "x-small": "Sehr klein", - small: "Klein", - medium: "Normal", - large: "Groß", - "x-large": "Sehr groß", - custom: "Benutzerdefiniert" + 'x-small': 'Sehr klein', + 'small': 'Klein', + 'medium': 'Normal', + 'large': 'Groß', + 'x-large': 'Sehr groß', + 'custom': 'Benutzerdefiniert' }, fontCustomSize: { - title: "Benutzerdefinierte Schriftgröße", - label: "Schriftgröße", - value: "48px" + title: 'Benutzerdefinierte Schriftgröße', + label: 'Schriftgröße', + value: '48px' } }, es: { - fontsize: "Tamaño de Fuente", + fontsize: 'Tamaño de Fuente', fontsizes: { - "x-small": "Extra pequeña", - small: "Pegueña", - medium: "Regular", - large: "Grande", - "x-large": "Extra Grande", - custom: "Customizada" - }, + 'x-small': 'Extra pequeña', + 'small': 'Pegueña', + 'medium': 'Regular', + 'large': 'Grande', + 'x-large': 'Extra Grande', + 'custom': 'Customizada' + }, fontCustomSize: { - title: "Tamaño de Fuente Customizada", - label: "Tamaño de Fuente", - value: "48px" + title: 'Tamaño de Fuente Customizada', + label: 'Tamaño de Fuente', + value: '48px' } }, et: { - fontsize: "Teksti suurus", + fontsize: 'Teksti suurus', fontsizes: { - "x-small": "Väga väike", - small: "Väike", - medium: "Tavaline", - large: "Suur", - "x-large": "Väga suur", - custom: "Määra ise" + 'x-small': 'Väga väike', + 'small': 'Väike', + 'medium': 'Tavaline', + 'large': 'Suur', + 'x-large': 'Väga suur', + 'custom': 'Määra ise' }, fontCustomSize: { - title: "Kohandatud teksti suurus", - label: "Teksti suurus", - value: "48px" + title: 'Kohandatud teksti suurus', + label: 'Teksti suurus', + value: '48px' } }, fr: { - fontsize: "Taille de la police", + fontsize: 'Taille de la police', fontsizes: { - "x-small": "Très petit", - small: "Petit", - medium: "Normal", - large: "Grand", - "x-large": "Très grand", - custom: "Taille personnalisée" + 'x-small': 'Très petit', + 'small': 'Petit', + 'medium': 'Normal', + 'large': 'Grand', + 'x-large': 'Très grand', + 'custom': 'Taille personnalisée' }, fontCustomSize: { - title: "Taille de police personnalisée", - label: "Taille de la police", - value: "48px" + title: 'Taille de police personnalisée', + label: 'Taille de la police', + value: '48px' } }, hu: { - fontsize: "Betű méret", + fontsize: 'Betű méret', fontsizes: { - "x-small": "Extra kicsi", - small: "Kicsi", - medium: "Normális", - large: "Nagy", - "x-large": "Extra nagy", - custom: "Egyedi" + 'x-small': 'Extra kicsi', + 'small': 'Kicsi', + 'medium': 'Normális', + 'large': 'Nagy', + 'x-large': 'Extra nagy', + 'custom': 'Egyedi' }, fontCustomSize: { - title: "Egyedi betű méret", - label: "Betű méret", - value: "48px" + title: 'Egyedi betű méret', + label: 'Betű méret', + value: '48px' } }, it: { - fontsize: "Dimensioni del testo", + fontsize: 'Dimensioni del testo', fontsizes: { - "x-small": "Molto piccolo", - small: "piccolo", - regular: "normale", - large: "grande", - "x-large": "Molto grande", - custom: "Personalizzato" + 'x-small': 'Molto piccolo', + 'small': 'piccolo', + 'regular': 'normale', + 'large': 'grande', + 'x-large': 'Molto grande', + 'custom': 'Personalizzato' }, fontCustomSize: { - title: "Dimensioni del testo personalizzato", - label: "Dimensioni del testo", - value: "48px" + title: 'Dimensioni del testo personalizzato', + label: 'Dimensioni del testo', + value: '48px' } }, ko: { - fontsize: "글꼴 크기", + fontsize: '글꼴 크기', fontsizes: { - "x-small": "아주 작게", - small: "작게", - medium: "보통", - large: "크게", - "x-large": "아주 크게", - custom: "사용자 지정" + 'x-small': '아주 작게', + 'small': '작게', + 'medium': '보통', + 'large': '크게', + 'x-large': '아주 크게', + 'custom': '사용자 지정' }, fontCustomSize: { - title: "사용자 지정 글꼴 크기", - label: "글꼴 크기", - value: "48px" + title: '사용자 지정 글꼴 크기', + label: '글꼴 크기', + value: '48px' } }, nl: { - fontsize: "Lettergrootte", + fontsize: 'Lettergrootte', fontsizes: { - "x-small": "Extra klein", - small: "Klein", - medium: "Normaal", - large: "Groot", - "x-large": "Extra groot", - custom: "Handmatig" + 'x-small': 'Extra klein', + 'small': 'Klein', + 'medium': 'Normaal', + 'large': 'Groot', + 'x-large': 'Extra groot', + 'custom': 'Handmatig' }, fontCustomSize: { - title: "Handmatige lettergrootte", - label: "Lettergrootte", - value: "48px" + title: 'Handmatige lettergrootte', + label: 'Lettergrootte', + value: '48px' } }, pt_br: { - fontsize: "Tamanho da fonte", + fontsize: 'Tamanho da fonte', fontsizes: { - "x-small": "Extra pequeno", - small: "Pequeno", - regular: "Médio", - large: "Grande", - "x-large": "Extra grande", - custom: "Personalizado" + 'x-small': 'Extra pequeno', + 'small': 'Pequeno', + 'regular': 'Médio', + 'large': 'Grande', + 'x-large': 'Extra grande', + 'custom': 'Personalizado' }, fontCustomSize: { - title: "Tamanho de Fonte Personalizado", - label: "Tamanho de Fonte", - value: "48px" + title: 'Tamanho de Fonte Personalizado', + label: 'Tamanho de Fonte', + value: '48px' } }, ru: { - fontsize: "Размер шрифта", + fontsize: 'Размер шрифта', fontsizes: { - "x-small": "Очень маленький", - small: "Маленький", - medium: "Обычный", - large: "Большой", - "x-large": "Очень большой", - custom: "Пользовательский" + 'x-small': 'Очень маленький', + 'small': 'Маленький', + 'medium': 'Обычный', + 'large': 'Большой', + 'x-large': 'Очень большой', + 'custom': 'Пользовательский' }, fontCustomSize: { - title: "Пользовательский Размер Шрифта", - label: "Размер Шрифта", - value: "48px" + title: 'Пользовательский Размер Шрифта', + label: 'Размер Шрифта', + value: '48px' } }, sl: { - fontsize: "Velikost pisave", + fontsize: 'Velikost pisave', fontsizes: { - "x-small": "Ekstra majhna", - small: "Majhna", - medium: "Navadno", - large: "Velika", - "x-large": "Ekstra velika", - custom: "Poljubna" + 'x-small': 'Ekstra majhna', + 'small': 'Majhna', + 'medium': 'Navadno', + 'large': 'Velika', + 'x-large': 'Ekstra velika', + 'custom': 'Poljubna' }, fontCustomSize: { - title: "Poljubna velikost pisave", - label: "Velikost pisave", - value: "48px" + title: 'Poljubna velikost pisave', + label: 'Velikost pisave', + value: '48px' } }, tr: { - fontsize: "Yazı boyutu", + fontsize: 'Yazı boyutu', fontsizes: { - "x-small": "Çok küçük", - small: "Küçük", - medium: "Normal", - large: "Büyük", - "x-large": "Çok büyük", - custom: "Özel" + 'x-small': 'Çok küçük', + 'small': 'Küçük', + 'medium': 'Normal', + 'large': 'Büyük', + 'x-large': 'Çok büyük', + 'custom': 'Özel' }, fontCustomSize: { - title: "Özel Yazı Boyutu", - label: "Yazı Boyutu", - value: "48px" + title: 'Özel Yazı Boyutu', + label: 'Yazı Boyutu', + value: '48px' } }, zh_tw: { - fontsize: "字體大小", + fontsize: '字體大小', fontsizes: { - "x-small": "最小", - small: "小", - medium: "中", - large: "大", - "x-large": "最大", - custom: "自訂大小" + 'x-small': '最小', + 'small': '小', + 'medium': '中', + 'large': '大', + 'x-large': '最大', + 'custom': '自訂大小' }, fontCustomSize: { - title: "自訂義字體大小", - label: "字體大小", - value: "48px" + title: '自訂義字體大小', + label: '字體大小', + value: '48px' } } } }); - var t = { - sizeList: ["x-small", "small", "medium", "large", "x-large"], - allowCustomSize: !0 + // jshint camelcase:true + + var defaultOptions = { + sizeList: ['x-small', 'small', 'medium', 'large', 'x-large'], + allowCustomSize: true }; - function l(t, l) { - t.$ed.focus(), t.saveRange(), t.execCmd("fontSize", "1"); - var a = t.$ed.find('font[size="1"]'); - a.find('span[style*="font-size"]').contents().unwrap(), a.replaceWith(function () { - return e("", { - css: { - "font-size": l - }, - html: this.innerHTML - }); - }), e(t.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(), t.restoreRange(), t.syncCode(), t.$c.trigger("tbwchange"); - } - function a(t) { - var a = []; - if (e.each(t.o.plugins.fontsize.sizeList, function (e, s) { - t.addBtnDef("fontsize_" + s, { - text: '' + (t.lang.fontsizes[s] || s) + "", - hasIcon: !1, - fn: function fn() { - l(t, s); - } - }), a.push("fontsize_" + s); - }), t.o.plugins.fontsize.allowCustomSize) { - var s = "fontsize_custom", - i = { - fn: function fn() { - t.openModalInsert(t.lang.fontCustomSize.title, { - size: { - label: t.lang.fontCustomSize.label, - value: t.lang.fontCustomSize.value - } - }, function (e) { - return l(t, e.size), !0; - }); - }, - text: '' + t.lang.fontsizes.custom + "", - hasIcon: !1 - }; - t.addBtnDef(s, i), a.push(s); - } - return a; - } - e.extend(!0, e.trumbowyg, { + + // Add dropdown with font sizes + $.extend(true, $.trumbowyg, { plugins: { fontsize: { - init: function init(l) { - l.o.plugins.fontsize = e.extend({}, t, l.o.plugins.fontsize || {}), l.addBtnDef("fontsize", { - dropdown: a(l) + init: function init(trumbowyg) { + trumbowyg.o.plugins.fontsize = $.extend({}, defaultOptions, trumbowyg.o.plugins.fontsize || {}); + trumbowyg.addBtnDef('fontsize', { + dropdown: buildDropdown(trumbowyg) }); } } } }); -}(jQuery); -/*/* =========================================================== - * trumbowyg.history.js v1.0 - * history plugin for Trumbowyg - * http://alex-d.github.com/Trumbowyg - * =========================================================== - * Author : Sven Dunemann [dunemann@forelabs.eu] - */ + function setFontSize(trumbowyg, size) { + trumbowyg.$ed.focus(); + trumbowyg.saveRange(); -(function ($) { - 'use strict'; + // Temporary size + trumbowyg.execCmd('fontSize', '1'); + var fontElements = trumbowyg.$ed.find('font[size="1"]'); - $.extend(true, $.trumbowyg, { - plugins: { - history: { - destroy: function destroy(t) { - t.$c.off('tbwinit.history tbwchange.history'); + // Remove previous font-size span tags. Needed to prevent Firefox from + // nesting multiple spans on font-size changes. + // (see https://github.com/Alex-D/Trumbowyg/issues/1252) + fontElements.find('span[style*="font-size"]').contents().unwrap(); + + // Find elements that were added and change to with chosen size + fontElements.replaceWith(function () { + return $('', { + css: { + 'font-size': size }, - init: function init(t) { - t.o.plugins.history = $.extend(true, { - _stack: [], - _index: -1, - _focusEl: undefined - }, t.o.plugins.history || {}); - var btnBuildDefRedo = { - title: t.lang.redo, - ico: 'redo', - key: 'Y', - fn: function fn() { - if (t.o.plugins.history._index < t.o.plugins.history._stack.length - 1) { - t.o.plugins.history._index += 1; - var index = t.o.plugins.history._index; - var newState = t.o.plugins.history._stack[index]; - t.execCmd('html', newState); - // because of some semantic optimisations we have to save the state back - // to history - t.o.plugins.history._stack[index] = t.$ed.html(); - carretToEnd(); - toggleButtonStates(); - } - } - }; - var btnBuildDefUndo = { - title: t.lang.undo, - ico: 'undo', - key: 'Z', - fn: function fn() { - if (t.o.plugins.history._index > 0) { - t.o.plugins.history._index -= 1; - var index = t.o.plugins.history._index, - newState = t.o.plugins.history._stack[index]; - t.execCmd('html', newState); - // because of some semantic optimisations we have to save the state back - // to history - t.o.plugins.history._stack[index] = t.$ed.html(); - carretToEnd(); - toggleButtonStates(); - } - } - }; - var pushToHistory = function pushToHistory() { - var index = t.o.plugins.history._index, - stack = t.o.plugins.history._stack, - latestState = stack.slice(-1)[0] || '

    ', - prevState = stack[index], - newState = t.$ed.html(), - focusEl = t.doc.getSelection().focusNode, - focusElText = '', - latestStateTagsList, - newStateTagsList, - prevFocusEl = t.o.plugins.history._focusEl; - latestStateTagsList = $('
    ' + latestState + '
    ').find('*').map(function () { - return this.localName; - }); - newStateTagsList = $('
    ' + newState + '
    ').find('*').map(function () { - return this.localName; - }); - if (focusEl) { - t.o.plugins.history._focusEl = focusEl; - focusElText = focusEl.outerHTML || focusEl.textContent; - } - if (newState !== prevState) { - // a new stack entry is defined when current insert ends on a whitespace character - // or count of node elements has been changed - // or focused element differs from previous one - if (focusElText.slice(-1).match(/\s/) || !arraysAreIdentical(latestStateTagsList, newStateTagsList) || t.o.plugins.history._index <= 0 || focusEl !== prevFocusEl) { - t.o.plugins.history._index += 1; - // remove newer entries in history when something new was added - // because timeline was changes with interaction - t.o.plugins.history._stack = stack.slice(0, t.o.plugins.history._index); - // now add new state to modified history - t.o.plugins.history._stack.push(newState); - } else { - // modify last stack entry - t.o.plugins.history._stack[index] = newState; - } - toggleButtonStates(); - } - }; - var toggleButtonStates = function toggleButtonStates() { - var index = t.o.plugins.history._index, - stackSize = t.o.plugins.history._stack.length, - undoState = index > 0, - redoState = stackSize !== 0 && index !== stackSize - 1; - toggleButtonState('historyUndo', undoState); - toggleButtonState('historyRedo', redoState); - }; - var toggleButtonState = function toggleButtonState(btn, enable) { - var button = t.$box.find('.trumbowyg-' + btn + '-button'); - if (enable) { - button.removeClass('trumbowyg-disable'); - } else if (!button.hasClass('trumbowyg-disable')) { - button.addClass('trumbowyg-disable'); - } - }; - var arraysAreIdentical = function arraysAreIdentical(a, b) { - if (a === b) { - return true; - } - if (a == null || b == null) { - return false; - } - if (a.length !== b.length) { - return false; - } - for (var i = 0; i < a.length; i += 1) { - if (a[i] !== b[i]) { - return false; - } + html: this.innerHTML + }); + }); + + // Remove and leftover elements + $(trumbowyg.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(); + trumbowyg.restoreRange(); + trumbowyg.syncCode(); + trumbowyg.$c.trigger('tbwchange'); + } + function buildDropdown(trumbowyg) { + var dropdown = []; + $.each(trumbowyg.o.plugins.fontsize.sizeList, function (index, size) { + trumbowyg.addBtnDef('fontsize_' + size, { + text: '' + (trumbowyg.lang.fontsizes[size] || size) + '', + hasIcon: false, + fn: function fn() { + setFontSize(trumbowyg, size); + } + }); + dropdown.push('fontsize_' + size); + }); + if (trumbowyg.o.plugins.fontsize.allowCustomSize) { + var customSizeButtonName = 'fontsize_custom'; + var customSizeBtnDef = { + fn: function fn() { + trumbowyg.openModalInsert(trumbowyg.lang.fontCustomSize.title, { + size: { + label: trumbowyg.lang.fontCustomSize.label, + value: trumbowyg.lang.fontCustomSize.value } + }, function (form) { + setFontSize(trumbowyg, form.size); return true; - }; - var carretToEnd = function carretToEnd() { - var node = t.doc.getSelection().focusNode, - range = t.doc.createRange(); - if (node.childNodes.length > 0) { - range.setStartAfter(node.childNodes[node.childNodes.length - 1]); - range.setEndAfter(node.childNodes[node.childNodes.length - 1]); - t.doc.getSelection().removeAllRanges(); - t.doc.getSelection().addRange(range); - } - }; - t.$c.on('tbwinit.history tbwchange.history', pushToHistory); - t.addBtnDef('historyRedo', btnBuildDefRedo); - t.addBtnDef('historyUndo', btnBuildDefUndo); - } - } + }); + }, + text: '' + trumbowyg.lang.fontsizes.custom + '', + hasIcon: false + }; + trumbowyg.addBtnDef(customSizeButtonName, customSizeBtnDef); + dropdown.push(customSizeButtonName); } - }); + return dropdown; + } })(jQuery); -/*/* =========================================================== - * trumbowyg.history.js v1.0 - * history plugin for Trumbowyg - * http://alex-d.github.com/Trumbowyg - * =========================================================== - * Author : Sven Dunemann [dunemann@forelabs.eu] - */ -!function (i) { +!function (e) { "use strict"; - i.extend(!0, i.trumbowyg, { - plugins: { - history: { - destroy: function destroy(i) { - i.$c.off("tbwinit.history tbwchange.history"); - }, - init: function init(t) { - t.o.plugins.history = i.extend(!0, { - _stack: [], - _index: -1, - _focusEl: void 0 - }, t.o.plugins.history || {}); - var o = { - title: t.lang.redo, - ico: "redo", - key: "Y", - fn: function fn() { - if (t.o.plugins.history._index < t.o.plugins.history._stack.length - 1) { - t.o.plugins.history._index += 1; - var i = t.o.plugins.history._index, - o = t.o.plugins.history._stack[i]; - t.execCmd("html", o), t.o.plugins.history._stack[i] = t.$ed.html(), r(), s(); - } - } - }, - n = { - title: t.lang.undo, - ico: "undo", - key: "Z", - fn: function fn() { - if (t.o.plugins.history._index > 0) { - t.o.plugins.history._index -= 1; - var i = t.o.plugins.history._index, - o = t.o.plugins.history._stack[i]; - t.execCmd("html", o), t.o.plugins.history._stack[i] = t.$ed.html(), r(), s(); - } - } - }, - s = function s() { - var i = t.o.plugins.history._index, - o = t.o.plugins.history._stack.length, - n = 0 !== o && i !== o - 1; - e("historyUndo", i > 0), e("historyRedo", n); - }, - e = function e(i, o) { - var n = t.$box.find(".trumbowyg-" + i + "-button"); - o ? n.removeClass("trumbowyg-disable") : n.hasClass("trumbowyg-disable") || n.addClass("trumbowyg-disable"); - }, - l = function l(i, t) { - if (i === t) return !0; - if (null == i || null == t) return !1; - if (i.length !== t.length) return !1; - for (var o = 0; o < i.length; o += 1) if (i[o] !== t[o]) return !1; - return !0; - }, - r = function r() { - var i = t.doc.getSelection().focusNode, - o = t.doc.createRange(); - i.childNodes.length > 0 && (o.setStartAfter(i.childNodes[i.childNodes.length - 1]), o.setEndAfter(i.childNodes[i.childNodes.length - 1]), t.doc.getSelection().removeAllRanges(), t.doc.getSelection().addRange(o)); - }; - t.$c.on("tbwinit.history tbwchange.history", function () { - var o, - n, - e = t.o.plugins.history._index, - r = t.o.plugins.history._stack, - d = r.slice(-1)[0] || "

    ", - u = r[e], - h = t.$ed.html(), - c = t.doc.getSelection().focusNode, - g = "", - a = t.o.plugins.history._focusEl; - o = i("
    " + d + "
    ").find("*").map(function () { - return this.localName; - }), n = i("
    " + h + "
    ").find("*").map(function () { - return this.localName; - }), c && (t.o.plugins.history._focusEl = c, g = c.outerHTML || c.textContent), h !== u && (g.slice(-1).match(/\s/) || !l(o, n) || t.o.plugins.history._index <= 0 || c !== a ? (t.o.plugins.history._index += 1, t.o.plugins.history._stack = r.slice(0, t.o.plugins.history._index), t.o.plugins.history._stack.push(h)) : t.o.plugins.history._stack[e] = h, s()); - }), t.addBtnDef("historyRedo", o), t.addBtnDef("historyUndo", n); - } - } - } - }); -}(jQuery); -(function ($) { - 'use strict'; - - $.extend(true, $.trumbowyg, { + e.extend(!0, e.trumbowyg, { langs: { - // jshint camelcase:false en: { - giphy: 'Insert GIF' + fontsize: "Font size", + fontsizes: { + "x-small": "Extra small", + small: "Small", + medium: "Regular", + large: "Large", + "x-large": "Extra large", + custom: "Custom" + }, + fontCustomSize: { + title: "Custom Font Size", + label: "Font Size", + value: "48px" + } }, az: { - giphy: 'GIF yerləşdir' + fontsize: "Şrift həcmi", + fontsizes: { + "x-small": "Daha kiçik", + small: "Kiçik", + medium: "Normal", + large: "Böyük", + "x-large": "Daha böyük", + custom: "Fərdi həcm" + }, + fontCustomSize: { + title: "Fərdi şrift həcmi", + label: "Şrift həcmi", + value: "48px" + } }, by: { - giphy: 'Уставіць GIF' + fontsize: "Памер шрыфта", + fontsizes: { + "x-small": "Вельмі маленькі", + small: "Маленькі", + medium: "Звычайны", + large: "Вялікі", + "x-large": "Вельмі вялікі", + custom: "Карыстальніцкі" + }, + fontCustomSize: { + title: "Карыстальніцкі Памер Шрыфта", + label: "Памер Шрыфта", + value: "48px" + } + }, + ca: { + fontsize: "Mida de la lletra", + fontsizes: { + "x-small": "Molt petita", + small: "Petita", + medium: "Normal", + large: "Gran", + "x-large": "Molt Gran", + custom: "Personalitzada" + }, + fontCustomSize: { + title: "Mida de lletra personalitzada", + label: "Mida de lletra", + value: "48px" + } + }, + da: { + fontsize: "Skriftstørrelse", + fontsizes: { + "x-small": "Ekstra lille", + small: "Lille", + medium: "Normal", + large: "Stor", + "x-large": "Ekstra stor", + custom: "Brugerdefineret" + } + }, + de: { + fontsize: "Schriftgröße", + fontsizes: { + "x-small": "Sehr klein", + small: "Klein", + medium: "Normal", + large: "Groß", + "x-large": "Sehr groß", + custom: "Benutzerdefiniert" + }, + fontCustomSize: { + title: "Benutzerdefinierte Schriftgröße", + label: "Schriftgröße", + value: "48px" + } + }, + es: { + fontsize: "Tamaño de Fuente", + fontsizes: { + "x-small": "Extra pequeña", + small: "Pegueña", + medium: "Regular", + large: "Grande", + "x-large": "Extra Grande", + custom: "Customizada" + }, + fontCustomSize: { + title: "Tamaño de Fuente Customizada", + label: "Tamaño de Fuente", + value: "48px" + } }, et: { - giphy: 'Sisesta GIF' + fontsize: "Teksti suurus", + fontsizes: { + "x-small": "Väga väike", + small: "Väike", + medium: "Tavaline", + large: "Suur", + "x-large": "Väga suur", + custom: "Määra ise" + }, + fontCustomSize: { + title: "Kohandatud teksti suurus", + label: "Teksti suurus", + value: "48px" + } }, fr: { - giphy: 'Insérer un GIF' + fontsize: "Taille de la police", + fontsizes: { + "x-small": "Très petit", + small: "Petit", + medium: "Normal", + large: "Grand", + "x-large": "Très grand", + custom: "Taille personnalisée" + }, + fontCustomSize: { + title: "Taille de police personnalisée", + label: "Taille de la police", + value: "48px" + } }, hu: { - giphy: 'GIF beszúrás' - }, - ru: { - giphy: 'Вставить GIF' + fontsize: "Betű méret", + fontsizes: { + "x-small": "Extra kicsi", + small: "Kicsi", + medium: "Normális", + large: "Nagy", + "x-large": "Extra nagy", + custom: "Egyedi" + }, + fontCustomSize: { + title: "Egyedi betű méret", + label: "Betű méret", + value: "48px" + } }, - sl: { - giphy: 'Vstavi GIF' + it: { + fontsize: "Dimensioni del testo", + fontsizes: { + "x-small": "Molto piccolo", + small: "piccolo", + regular: "normale", + large: "grande", + "x-large": "Molto grande", + custom: "Personalizzato" + }, + fontCustomSize: { + title: "Dimensioni del testo personalizzato", + label: "Dimensioni del testo", + value: "48px" + } }, - tr: { - giphy: 'GIF ekle' - } - // jshint camelcase:true - } - }); - - var giphyLogo = ''; // jshint ignore:line - - var CANCEL_EVENT = 'tbwcancel'; - - // Throttle helper - function trumbowygThrottle(callback, delay) { - var last; - var timer; - return function () { - var context = this; - var now = +new Date(); - var args = arguments; - if (last && now < last + delay) { - clearTimeout(timer); - timer = setTimeout(function () { - last = now; - callback.apply(context, args); - }, delay); - } else { - last = now; - callback.apply(context, args); - } - }; - } - - // Fills modal with response gifs - function renderGifs(response, $giphyModal, trumbowyg, mustEmpty) { - var width = ($giphyModal.width() - 20) / 3; - var html = response.data.filter(function (gifData) { - // jshint camelcase:false - var downsized = gifData.images.downsized || gifData.images.downsized_medium; - // jshint camelcase:true - return !!downsized.url; - }).map(function (gifData) { - // jshint camelcase:false - var downsized = gifData.images.downsized || gifData.images.downsized_medium; - // jshint camelcase:true - var image = downsized, - imageRatio = image.height / image.width, - altText = gifData.title; - var imgHtml = '' + altText + ''; - return '
    ' + imgHtml + '
    '; - }).join(''); - if (mustEmpty === true) { - if (html.length === 0) { - if ($('.' + trumbowyg.o.prefix + 'giphy-no-result', $giphyModal).length > 0) { - return; - } - html = ''; - } - $giphyModal.empty(); - } - $giphyModal.append(html); - - // Remove gray overlay on image load - // moved here from inline callback definition due to CSP issue - // Note: this is being done post-factum because load event doesn't bubble up and so can't be delegated - var addLoadedClass = function addLoadedClass(img) { - img.classList.add('tbw-loaded'); - }; - $('img', $giphyModal).each(function () { - var img = this; - if (img.complete) { - // images load instantly when cached and esp. when loaded in previous modal open - addLoadedClass(img); - } else { - img.addEventListener('load', function () { - addLoadedClass(this); - }); - } - }); - $('img', $giphyModal).on('click', function () { - var src = $(this).attr('src'), - alt = $(this).attr('alt'); - trumbowyg.restoreRange(); - trumbowyg.execCmd('insertImage', src, false, true); - - // relay alt tag into inserted image - if (alt) { - var $img = $('img[src="' + src + '"]:not([alt])', trumbowyg.$box); - $img.attr('alt', alt); - // Note: This seems to fire relatively early and could be wrapped in a setTimeout if needed - trumbowyg.syncCode(); - } - $('img', $giphyModal).off(); - trumbowyg.closeModal(); - }); - } - var defaultOptions = { - rating: 'g', - apiKey: null, - throttleDelay: 300, - noResultGifUrl: 'https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif' - }; - - // Add dropdown with font sizes - $.extend(true, $.trumbowyg, { - plugins: { - giphy: { - init: function init(trumbowyg) { - trumbowyg.o.plugins.giphy = $.extend({}, defaultOptions, trumbowyg.o.plugins.giphy || {}); - trumbowyg.addBtnDef('giphy', { - fn: function fn() { - if (trumbowyg.o.plugins.giphy.apiKey === null) { - throw new Error('You must set a Giphy API Key'); - } - var BASE_URL = 'https://api.giphy.com/v1/gifs/search?api_key=' + trumbowyg.o.plugins.giphy.apiKey + '&rating=' + trumbowyg.o.plugins.giphy.rating, - DEFAULT_URL = BASE_URL.replace('/search', '/trending'); - var previousAjaxCall = { - abort: function abort() {} - }; - var prefix = trumbowyg.o.prefix; - - // Create and open the modal - var searchInput = '', - closeButton = '', - poweredByGiphy = '
    Powered by' + giphyLogo + '
    ', - giphyModalHtml = searchInput + closeButton + poweredByGiphy + '
    '; - trumbowyg.openModal(null, giphyModalHtml, false).one(CANCEL_EVENT, function () { - try { - previousAjaxCall.abort(); - } catch (e) {} - trumbowyg.closeModal(); - }); - var $giphyInput = $('.' + prefix + 'giphy-search'), - $giphyClose = $('.' + prefix + 'giphy-close'), - $giphyModal = $('.' + prefix + 'giphy-modal'); - var ajaxError = function ajaxError() { - if (!navigator.onLine && !$('.' + prefix + 'giphy-offline', $giphyModal).length) { - $giphyModal.empty(); - $giphyModal.append('

    You are offline

    '); - } - }; - - // Load trending gifs as default - $.ajax({ - url: DEFAULT_URL, - dataType: 'json', - success: function success(response) { - renderGifs(response, $giphyModal, trumbowyg, true); - }, - error: ajaxError - }); - var searchGifsOnInput = function searchGifsOnInput() { - var query = $giphyInput.val(); - if (query.length === 0) { - return; - } - try { - previousAjaxCall.abort(); - } catch (e) {} - previousAjaxCall = $.ajax({ - url: BASE_URL + '&q=' + encodeURIComponent(query), - dataType: 'json', - success: function success(response) { - renderGifs(response, $giphyModal, trumbowyg, true); - }, - error: ajaxError - }); - }; - var throttledInputRequest = trumbowygThrottle(searchGifsOnInput, trumbowyg.o.plugins.giphy.throttleDelay); - $giphyInput.on('input', throttledInputRequest); - $giphyInput.focus(); - $giphyClose.one('click', function () { - $giphyModal.trigger(CANCEL_EVENT); - }); - } - }); + ko: { + fontsize: "글꼴 크기", + fontsizes: { + "x-small": "아주 작게", + small: "작게", + medium: "보통", + large: "크게", + "x-large": "아주 크게", + custom: "사용자 지정" + }, + fontCustomSize: { + title: "사용자 지정 글꼴 크기", + label: "글꼴 크기", + value: "48px" } - } - } - }); -})(jQuery); -!function (i) { - "use strict"; - - i.extend(!0, i.trumbowyg, { - langs: { - en: { - giphy: "Insert GIF" }, - az: { - giphy: "GIF yerləşdir" - }, - by: { - giphy: "Уставіць GIF" - }, - et: { - giphy: "Sisesta GIF" - }, - fr: { - giphy: "Insérer un GIF" + nl: { + fontsize: "Lettergrootte", + fontsizes: { + "x-small": "Extra klein", + small: "Klein", + medium: "Normaal", + large: "Groot", + "x-large": "Extra groot", + custom: "Handmatig" + }, + fontCustomSize: { + title: "Handmatige lettergrootte", + label: "Lettergrootte", + value: "48px" + } }, - hu: { - giphy: "GIF beszúrás" + pt_br: { + fontsize: "Tamanho da fonte", + fontsizes: { + "x-small": "Extra pequeno", + small: "Pequeno", + regular: "Médio", + large: "Grande", + "x-large": "Extra grande", + custom: "Personalizado" + }, + fontCustomSize: { + title: "Tamanho de Fonte Personalizado", + label: "Tamanho de Fonte", + value: "48px" + } }, ru: { - giphy: "Вставить GIF" + fontsize: "Размер шрифта", + fontsizes: { + "x-small": "Очень маленький", + small: "Маленький", + medium: "Обычный", + large: "Большой", + "x-large": "Очень большой", + custom: "Пользовательский" + }, + fontCustomSize: { + title: "Пользовательский Размер Шрифта", + label: "Размер Шрифта", + value: "48px" + } }, sl: { - giphy: "Vstavi GIF" - }, - tr: { - giphy: "GIF ekle" - } - } - }); - var e = "tbwcancel"; - function t(e, t, n, l) { - var a = (t.width() - 20) / 3, - o = e.data.filter(function (i) { - return !!(i.images.downsized || i.images.downsized_medium).url; - }).map(function (i) { - var e = i.images.downsized || i.images.downsized_medium, - t = e.height / e.width, - n = i.title; - return '
    ' + ("' + n + '') + "
    "; - }).join(""); - if (!0 === l) { - if (0 === o.length) { - if (i("." + n.o.prefix + "giphy-no-result", t).length > 0) return; - o = ''; + fontsize: "Velikost pisave", + fontsizes: { + "x-small": "Ekstra majhna", + small: "Majhna", + medium: "Navadno", + large: "Velika", + "x-large": "Ekstra velika", + custom: "Poljubna" + }, + fontCustomSize: { + title: "Poljubna velikost pisave", + label: "Velikost pisave", + value: "48px" + } + }, + tr: { + fontsize: "Yazı boyutu", + fontsizes: { + "x-small": "Çok küçük", + small: "Küçük", + medium: "Normal", + large: "Büyük", + "x-large": "Çok büyük", + custom: "Özel" + }, + fontCustomSize: { + title: "Özel Yazı Boyutu", + label: "Yazı Boyutu", + value: "48px" + } + }, + zh_tw: { + fontsize: "字體大小", + fontsizes: { + "x-small": "最小", + small: "小", + medium: "中", + large: "大", + "x-large": "最大", + custom: "自訂大小" + }, + fontCustomSize: { + title: "自訂義字體大小", + label: "字體大小", + value: "48px" + } } - t.empty(); } - t.append(o); - var c = function c(i) { - i.classList.add("tbw-loaded"); - }; - i("img", t).each(function () { - var i = this; - i.complete ? c(i) : i.addEventListener("load", function () { - c(this); + }); + var t = { + sizeList: ["x-small", "small", "medium", "large", "x-large"], + allowCustomSize: !0 + }; + function l(t, l) { + t.$ed.focus(), t.saveRange(), t.execCmd("fontSize", "1"); + var a = t.$ed.find('font[size="1"]'); + a.find('span[style*="font-size"]').contents().unwrap(), a.replaceWith(function () { + return e("", { + css: { + "font-size": l + }, + html: this.innerHTML }); - }), i("img", t).on("click", function () { - var e = i(this).attr("src"), - l = i(this).attr("alt"); - (n.restoreRange(), n.execCmd("insertImage", e, !1, !0), l) && (i('img[src="' + e + '"]:not([alt])', n.$box).attr("alt", l), n.syncCode()); - i("img", t).off(), n.closeModal(); - }); + }), e(t.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(), t.restoreRange(), t.syncCode(), t.$c.trigger("tbwchange"); } - var n = { - rating: "g", - apiKey: null, - throttleDelay: 300, - noResultGifUrl: "https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif" - }; - i.extend(!0, i.trumbowyg, { + function a(t) { + var a = []; + if (e.each(t.o.plugins.fontsize.sizeList, function (e, s) { + t.addBtnDef("fontsize_" + s, { + text: '' + (t.lang.fontsizes[s] || s) + "", + hasIcon: !1, + fn: function fn() { + l(t, s); + } + }), a.push("fontsize_" + s); + }), t.o.plugins.fontsize.allowCustomSize) { + var s = "fontsize_custom", + i = { + fn: function fn() { + t.openModalInsert(t.lang.fontCustomSize.title, { + size: { + label: t.lang.fontCustomSize.label, + value: t.lang.fontCustomSize.value + } + }, function (e) { + return l(t, e.size), !0; + }); + }, + text: '' + t.lang.fontsizes.custom + "", + hasIcon: !1 + }; + t.addBtnDef(s, i), a.push(s); + } + return a; + } + e.extend(!0, e.trumbowyg, { plugins: { - giphy: { + fontsize: { init: function init(l) { - l.o.plugins.giphy = i.extend({}, n, l.o.plugins.giphy || {}), l.addBtnDef("giphy", { - fn: function fn() { - if (null === l.o.plugins.giphy.apiKey) throw new Error("You must set a Giphy API Key"); - var n = "https://api.giphy.com/v1/gifs/search?api_key=" + l.o.plugins.giphy.apiKey + "&rating=" + l.o.plugins.giphy.rating, - a = n.replace("/search", "/trending"), - o = { - abort: function abort() {} - }, - c = l.o.prefix, - r = '' + ('') + ('
    Powered by
    ') + '
    '; - l.openModal(null, r, !1).one(e, function () { - try { - o.abort(); - } catch (i) {} - l.closeModal(); - }); - var s = i("." + c + "giphy-search"), - g = i("." + c + "giphy-close"), - p = i("." + c + "giphy-modal"), - h = function h() { - navigator.onLine || i("." + c + "giphy-offline", p).length || (p.empty(), p.append('

    You are offline

    ')); - }; - i.ajax({ - url: a, - dataType: "json", - success: function success(i) { - t(i, p, l, !0); - }, - error: h - }); - var u, - d, - y, - f, - m = (u = function u() { - var e = s.val(); - if (0 !== e.length) { - try { - o.abort(); - } catch (i) {} - o = i.ajax({ - url: n + "&q=" + encodeURIComponent(e), - dataType: "json", - success: function success(i) { - t(i, p, l, !0); - }, - error: h - }); - } - }, d = l.o.plugins.giphy.throttleDelay, function () { - var i = this, - e = +new Date(), - t = arguments; - y && e < y + d ? (clearTimeout(f), f = setTimeout(function () { - y = e, u.apply(i, t); - }, d)) : (y = e, u.apply(i, t)); - }); - s.on("input", m), s.focus(), g.one("click", function () { - p.trigger(e); - }); - } + l.o.plugins.fontsize = e.extend({}, t, l.o.plugins.fontsize || {}), l.addBtnDef("fontsize", { + dropdown: a(l) }); } } } }); }(jQuery); -/* =========================================================== - * trumbowyg.indent.js v1.0 - * Indent or Outdent plugin for Trumbowyg +/*/* =========================================================== + * trumbowyg.history.js v1.0 + * history plugin for Trumbowyg * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Fabacks - * Website : https://github.com/Fabacks + * Author : Sven Dunemann [dunemann@forelabs.eu] */ (function ($) { 'use strict'; - $.extend(true, $.trumbowyg, { - langs: { - // jshint camelcase:false - en: { - indent: 'Indent', - outdent: 'Outdent' - }, - az: { - indent: 'Girinti', - outdent: 'Çıxıntı' - }, - by: { - indent: 'Водступ', - outdent: 'Выступ' - }, - et: { - indent: 'Taande suurendamine', - outdent: 'Taande vähendamine' - }, - fr: { - indent: 'Augmenter le retrait', - outdent: 'Diminuer le retrait' - }, - pt_br: { - indent: 'Aumentar Recuo', - outdent: 'Diminuir Recuo' - }, - ru: { - indent: 'Отступ', - outdent: 'Выступ' - }, - sl: { - indent: 'Povečaj zamik', - outdent: 'Zmanjšaj zamik' - }, - tr: { - indent: 'Girinti', - outdent: 'Çıkıntı' - } - // jshint camelcase:true - } - }); - - // Adds the extra button definition $.extend(true, $.trumbowyg, { plugins: { - paragraph: { - init: function init(trumbowyg) { - var indentBtnDef = { - fn: 'indent', - title: trumbowyg.lang.indent, - isSupported: function isSupported() { - return !!document.queryCommandSupported && !!document.queryCommandSupported('indent'); - }, - ico: 'indent' + history: { + destroy: function destroy(t) { + t.$c.off('tbwinit.history tbwchange.history'); + }, + init: function init(t) { + t.o.plugins.history = $.extend(true, { + _stack: [], + _index: -1, + _focusEl: undefined + }, t.o.plugins.history || {}); + var btnBuildDefRedo = { + title: t.lang.redo, + ico: 'redo', + key: 'Y', + fn: function fn() { + if (t.o.plugins.history._index < t.o.plugins.history._stack.length - 1) { + t.o.plugins.history._index += 1; + var index = t.o.plugins.history._index; + var newState = t.o.plugins.history._stack[index]; + t.execCmd('html', newState); + // because of some semantic optimisations we have to save the state back + // to history + t.o.plugins.history._stack[index] = t.$ed.html(); + carretToEnd(); + toggleButtonStates(); + } + } }; - var outdentBtnDef = { - fn: 'outdent', - title: trumbowyg.lang.outdent, - isSupported: function isSupported() { - return !!document.queryCommandSupported && !!document.queryCommandSupported('outdent'); - }, - ico: 'outdent' + var btnBuildDefUndo = { + title: t.lang.undo, + ico: 'undo', + key: 'Z', + fn: function fn() { + if (t.o.plugins.history._index > 0) { + t.o.plugins.history._index -= 1; + var index = t.o.plugins.history._index, + newState = t.o.plugins.history._stack[index]; + t.execCmd('html', newState); + // because of some semantic optimisations we have to save the state back + // to history + t.o.plugins.history._stack[index] = t.$ed.html(); + carretToEnd(); + toggleButtonStates(); + } + } }; - trumbowyg.addBtnDef('indent', indentBtnDef); - trumbowyg.addBtnDef('outdent', outdentBtnDef); + var pushToHistory = function pushToHistory() { + var index = t.o.plugins.history._index, + stack = t.o.plugins.history._stack, + latestState = stack.slice(-1)[0] || '

    ', + prevState = stack[index], + newState = t.$ed.html(), + focusEl = t.doc.getSelection().focusNode, + focusElText = '', + latestStateTagsList, + newStateTagsList, + prevFocusEl = t.o.plugins.history._focusEl; + latestStateTagsList = $('
    ' + latestState + '
    ').find('*').map(function () { + return this.localName; + }); + newStateTagsList = $('
    ' + newState + '
    ').find('*').map(function () { + return this.localName; + }); + if (focusEl) { + t.o.plugins.history._focusEl = focusEl; + focusElText = focusEl.outerHTML || focusEl.textContent; + } + if (newState !== prevState) { + // a new stack entry is defined when current insert ends on a whitespace character + // or count of node elements has been changed + // or focused element differs from previous one + if (focusElText.slice(-1).match(/\s/) || !arraysAreIdentical(latestStateTagsList, newStateTagsList) || t.o.plugins.history._index <= 0 || focusEl !== prevFocusEl) { + t.o.plugins.history._index += 1; + // remove newer entries in history when something new was added + // because timeline was changes with interaction + t.o.plugins.history._stack = stack.slice(0, t.o.plugins.history._index); + // now add new state to modified history + t.o.plugins.history._stack.push(newState); + } else { + // modify last stack entry + t.o.plugins.history._stack[index] = newState; + } + toggleButtonStates(); + } + }; + var toggleButtonStates = function toggleButtonStates() { + var index = t.o.plugins.history._index, + stackSize = t.o.plugins.history._stack.length, + undoState = index > 0, + redoState = stackSize !== 0 && index !== stackSize - 1; + toggleButtonState('historyUndo', undoState); + toggleButtonState('historyRedo', redoState); + }; + var toggleButtonState = function toggleButtonState(btn, enable) { + var button = t.$box.find('.trumbowyg-' + btn + '-button'); + if (enable) { + button.removeClass('trumbowyg-disable'); + } else if (!button.hasClass('trumbowyg-disable')) { + button.addClass('trumbowyg-disable'); + } + }; + var arraysAreIdentical = function arraysAreIdentical(a, b) { + if (a === b) { + return true; + } + if (a == null || b == null) { + return false; + } + if (a.length !== b.length) { + return false; + } + for (var i = 0; i < a.length; i += 1) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + }; + var carretToEnd = function carretToEnd() { + var node = t.doc.getSelection().focusNode, + range = t.doc.createRange(); + if (node.childNodes.length > 0) { + range.setStartAfter(node.childNodes[node.childNodes.length - 1]); + range.setEndAfter(node.childNodes[node.childNodes.length - 1]); + t.doc.getSelection().removeAllRanges(); + t.doc.getSelection().addRange(range); + } + }; + t.$c.on('tbwinit.history tbwchange.history', pushToHistory); + t.addBtnDef('historyRedo', btnBuildDefRedo); + t.addBtnDef('historyUndo', btnBuildDefUndo); } } } }); })(jQuery); +/*/* =========================================================== + * trumbowyg.history.js v1.0 + * history plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Sven Dunemann [dunemann@forelabs.eu] + */ +!function (i) { + "use strict"; + + i.extend(!0, i.trumbowyg, { + plugins: { + history: { + destroy: function destroy(i) { + i.$c.off("tbwinit.history tbwchange.history"); + }, + init: function init(t) { + t.o.plugins.history = i.extend(!0, { + _stack: [], + _index: -1, + _focusEl: void 0 + }, t.o.plugins.history || {}); + var o = { + title: t.lang.redo, + ico: "redo", + key: "Y", + fn: function fn() { + if (t.o.plugins.history._index < t.o.plugins.history._stack.length - 1) { + t.o.plugins.history._index += 1; + var i = t.o.plugins.history._index, + o = t.o.plugins.history._stack[i]; + t.execCmd("html", o), t.o.plugins.history._stack[i] = t.$ed.html(), r(), s(); + } + } + }, + n = { + title: t.lang.undo, + ico: "undo", + key: "Z", + fn: function fn() { + if (t.o.plugins.history._index > 0) { + t.o.plugins.history._index -= 1; + var i = t.o.plugins.history._index, + o = t.o.plugins.history._stack[i]; + t.execCmd("html", o), t.o.plugins.history._stack[i] = t.$ed.html(), r(), s(); + } + } + }, + s = function s() { + var i = t.o.plugins.history._index, + o = t.o.plugins.history._stack.length, + n = 0 !== o && i !== o - 1; + e("historyUndo", i > 0), e("historyRedo", n); + }, + e = function e(i, o) { + var n = t.$box.find(".trumbowyg-" + i + "-button"); + o ? n.removeClass("trumbowyg-disable") : n.hasClass("trumbowyg-disable") || n.addClass("trumbowyg-disable"); + }, + l = function l(i, t) { + if (i === t) return !0; + if (null == i || null == t) return !1; + if (i.length !== t.length) return !1; + for (var o = 0; o < i.length; o += 1) if (i[o] !== t[o]) return !1; + return !0; + }, + r = function r() { + var i = t.doc.getSelection().focusNode, + o = t.doc.createRange(); + i.childNodes.length > 0 && (o.setStartAfter(i.childNodes[i.childNodes.length - 1]), o.setEndAfter(i.childNodes[i.childNodes.length - 1]), t.doc.getSelection().removeAllRanges(), t.doc.getSelection().addRange(o)); + }; + t.$c.on("tbwinit.history tbwchange.history", function () { + var o, + n, + e = t.o.plugins.history._index, + r = t.o.plugins.history._stack, + d = r.slice(-1)[0] || "

    ", + u = r[e], + h = t.$ed.html(), + c = t.doc.getSelection().focusNode, + g = "", + a = t.o.plugins.history._focusEl; + o = i("
    " + d + "
    ").find("*").map(function () { + return this.localName; + }), n = i("
    " + h + "
    ").find("*").map(function () { + return this.localName; + }), c && (t.o.plugins.history._focusEl = c, g = c.outerHTML || c.textContent), h !== u && (g.slice(-1).match(/\s/) || !l(o, n) || t.o.plugins.history._index <= 0 || c !== a ? (t.o.plugins.history._index += 1, t.o.plugins.history._stack = r.slice(0, t.o.plugins.history._index), t.o.plugins.history._stack.push(h)) : t.o.plugins.history._stack[e] = h, s()); + }), t.addBtnDef("historyRedo", o), t.addBtnDef("historyUndo", n); + } + } + } + }); +}(jQuery); /* =========================================================== * trumbowyg.indent.js v1.0 * Indent or Outdent plugin for Trumbowyg @@ -2996,29 +2913,112 @@ * Author : Fabacks * Website : https://github.com/Fabacks */ -!function (n) { - "use strict"; - n.extend(!0, n.trumbowyg, { +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { langs: { + // jshint camelcase:false en: { - indent: "Indent", - outdent: "Outdent" + indent: 'Indent', + outdent: 'Outdent' }, az: { - indent: "Girinti", - outdent: "Çıxıntı" + indent: 'Girinti', + outdent: 'Çıxıntı' }, by: { - indent: "Водступ", - outdent: "Выступ" + indent: 'Водступ', + outdent: 'Выступ' }, et: { - indent: "Taande suurendamine", - outdent: "Taande vähendamine" + indent: 'Taande suurendamine', + outdent: 'Taande vähendamine' }, fr: { - indent: "Augmenter le retrait", + indent: 'Augmenter le retrait', + outdent: 'Diminuer le retrait' + }, + pt_br: { + indent: 'Aumentar Recuo', + outdent: 'Diminuir Recuo' + }, + ru: { + indent: 'Отступ', + outdent: 'Выступ' + }, + sl: { + indent: 'Povečaj zamik', + outdent: 'Zmanjšaj zamik' + }, + tr: { + indent: 'Girinti', + outdent: 'Çıkıntı' + } + // jshint camelcase:true + } + }); + + // Adds the extra button definition + $.extend(true, $.trumbowyg, { + plugins: { + paragraph: { + init: function init(trumbowyg) { + var indentBtnDef = { + fn: 'indent', + title: trumbowyg.lang.indent, + isSupported: function isSupported() { + return !!document.queryCommandSupported && !!document.queryCommandSupported('indent'); + }, + ico: 'indent' + }; + var outdentBtnDef = { + fn: 'outdent', + title: trumbowyg.lang.outdent, + isSupported: function isSupported() { + return !!document.queryCommandSupported && !!document.queryCommandSupported('outdent'); + }, + ico: 'outdent' + }; + trumbowyg.addBtnDef('indent', indentBtnDef); + trumbowyg.addBtnDef('outdent', outdentBtnDef); + } + } + } + }); +})(jQuery); +/* =========================================================== + * trumbowyg.indent.js v1.0 + * Indent or Outdent plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Fabacks + * Website : https://github.com/Fabacks + */ +!function (n) { + "use strict"; + + n.extend(!0, n.trumbowyg, { + langs: { + en: { + indent: "Indent", + outdent: "Outdent" + }, + az: { + indent: "Girinti", + outdent: "Çıxıntı" + }, + by: { + indent: "Водступ", + outdent: "Выступ" + }, + et: { + indent: "Taande suurendamine", + outdent: "Taande vähendamine" + }, + fr: { + indent: "Augmenter le retrait", outdent: "Diminuer le retrait" }, pt_br: { @@ -4164,99 +4164,342 @@ }); }(jQuery); /* =========================================================== - * trumbowyg.pasteembed.js v1.0 - * Url paste to iframe with noembed. Plugin for Trumbowyg + * trumbowyg.noembed.js v1.0 + * noEmbed plugin for Trumbowyg * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Max Seelig - * Facebook : https://facebook.com/maxse - * Website : https://www.maxmade.nl/ + * Author : Jake Johns (jakejohns) */ (function ($) { 'use strict'; var defaultOptions = { - enabled: true, - endpoints: ['https://noembed.com/embed?nowrap=on', 'https://api.maxmade.nl/url2iframe/embed'] + proxy: 'https://noembed.com/embed?nowrap=on', + urlFiled: 'url', + data: [], + success: undefined, + error: undefined }; $.extend(true, $.trumbowyg, { + langs: { + // jshint camelcase:false + en: { + noembed: 'Noembed', + noembedError: 'Error' + }, + az: { + noembed: 'Noembed', + noembedError: 'Xəta' + }, + by: { + noembedError: 'Памылка' + }, + cs: { + noembedError: 'Chyba' + }, + da: { + noembedError: 'Fejl' + }, + et: { + noembed: 'Noembed', + noembedError: 'Viga' + }, + fr: { + noembedError: 'Erreur' + }, + hu: { + noembed: 'Noembed', + noembedError: 'Hiba' + }, + ja: { + noembedError: 'エラー' + }, + ko: { + noembed: 'oEmbed 넣기', + noembedError: '에러' + }, + pt_br: { + noembed: 'Incorporar', + noembedError: 'Erro' + }, + ru: { + noembedError: 'Ошибка' + }, + sl: { + noembed: 'Noembed', + noembedError: 'Napaka' + }, + sk: { + noembedError: 'Chyba' + }, + tr: { + noembedError: 'Hata' + }, + zh_tw: { + noembed: '插入影片', + noembedError: '錯誤' + } + // jshint camelcase:true + }, + plugins: { - pasteEmbed: { + noembed: { init: function init(trumbowyg) { - trumbowyg.o.plugins.pasteEmbed = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.pasteEmbed || {}); - if (!trumbowyg.o.plugins.pasteEmbed.enabled) { - return; - } - trumbowyg.pasteHandlers.push(function (pasteEvent) { - try { - var clipboardData = (pasteEvent.originalEvent || pasteEvent).clipboardData, - pastedData = clipboardData.getData('Text'), - endpoints = trumbowyg.o.plugins.pasteEmbed.endpoints, - request = null; - if (pastedData.startsWith('http')) { - pasteEvent.stopPropagation(); - pasteEvent.preventDefault(); - var query = { - url: pastedData.trim() - }; - var content = ''; - var index = 0; - if (request && request.transport) { - request.transport.abort(); + trumbowyg.o.plugins.noembed = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.noembed || {}); + var btnDef = { + fn: function fn() { + var $modal = trumbowyg.openModalInsert( + // Title + trumbowyg.lang.noembed, + // Fields + { + url: { + label: 'URL', + required: true } - request = $.ajax({ - crossOrigin: true, - url: endpoints[index], + }, + // Callback + function (data) { + $.ajax({ + url: trumbowyg.o.plugins.noembed.proxy, type: 'GET', - data: query, + data: data, cache: false, - dataType: 'jsonp', - success: function success(res) { - if (res.html) { - index = 0; - content = res.html; - } else { - index += 1; - } - }, - error: function error() { - index += 1; - }, - complete: function complete() { - if (content.length === 0 && index < endpoints.length - 1) { - this.url = endpoints[index]; - this.data = query; - $.ajax(this); - } - if (index === endpoints.length - 1) { - content = $('', { - href: pastedData, - text: pastedData - }).prop('outerHTML'); + dataType: 'json', + success: function success(data) { + if (trumbowyg.o.plugins.noembed.success) { + trumbowyg.o.plugins.noembed.success(data, trumbowyg, $modal); + return; } - if (content.length > 0) { - index = 0; - trumbowyg.execCmd('insertHTML', content); + if (!data.html) { + trumbowyg.addErrorOnModalField($('input[type=text]', $modal), data.error); + return; } + trumbowyg.execCmd('insertHTML', data.html); + setTimeout(function () { + trumbowyg.closeModal(); + }, 250); + }, + error: trumbowyg.o.plugins.noembed.error || function () { + trumbowyg.addErrorOnModalField($('input[type=text]', $modal), trumbowyg.lang.noembedError); } }); - } - } catch (c) {} - }); + }); + } + }; + trumbowyg.addBtnDef('noembed', btnDef); } } } }); })(jQuery); /* =========================================================== - * trumbowyg.pasteembed.js v1.0 - * Url paste to iframe with noembed. Plugin for Trumbowyg + * trumbowyg.noembed.js v1.0 + * noEmbed plugin for Trumbowyg * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Max Seelig - * Facebook : https://facebook.com/maxse - * Website : https://www.maxmade.nl/ + * Author : Jake Johns (jakejohns) + */ +!function (e) { + "use strict"; + + var r = { + proxy: "https://noembed.com/embed?nowrap=on", + urlFiled: "url", + data: [], + success: void 0, + error: void 0 + }; + e.extend(!0, e.trumbowyg, { + langs: { + en: { + noembed: "Noembed", + noembedError: "Error" + }, + az: { + noembed: "Noembed", + noembedError: "Xəta" + }, + by: { + noembedError: "Памылка" + }, + cs: { + noembedError: "Chyba" + }, + da: { + noembedError: "Fejl" + }, + et: { + noembed: "Noembed", + noembedError: "Viga" + }, + fr: { + noembedError: "Erreur" + }, + hu: { + noembed: "Noembed", + noembedError: "Hiba" + }, + ja: { + noembedError: "エラー" + }, + ko: { + noembed: "oEmbed 넣기", + noembedError: "에러" + }, + pt_br: { + noembed: "Incorporar", + noembedError: "Erro" + }, + ru: { + noembedError: "Ошибка" + }, + sl: { + noembed: "Noembed", + noembedError: "Napaka" + }, + sk: { + noembedError: "Chyba" + }, + tr: { + noembedError: "Hata" + }, + zh_tw: { + noembed: "插入影片", + noembedError: "錯誤" + } + }, + plugins: { + noembed: { + init: function init(o) { + o.o.plugins.noembed = e.extend(!0, {}, r, o.o.plugins.noembed || {}); + var n = { + fn: function fn() { + var r = o.openModalInsert(o.lang.noembed, { + url: { + label: "URL", + required: !0 + } + }, function (n) { + e.ajax({ + url: o.o.plugins.noembed.proxy, + type: "GET", + data: n, + cache: !1, + dataType: "json", + success: function success(n) { + o.o.plugins.noembed.success ? o.o.plugins.noembed.success(n, o, r) : n.html ? (o.execCmd("insertHTML", n.html), setTimeout(function () { + o.closeModal(); + }, 250)) : o.addErrorOnModalField(e("input[type=text]", r), n.error); + }, + error: o.o.plugins.noembed.error || function () { + o.addErrorOnModalField(e("input[type=text]", r), o.lang.noembedError); + } + }); + }); + } + }; + o.addBtnDef("noembed", n); + } + } + } + }); +}(jQuery); +/* =========================================================== + * trumbowyg.pasteembed.js v1.0 + * Url paste to iframe with noembed. Plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Max Seelig + * Facebook : https://facebook.com/maxse + * Website : https://www.maxmade.nl/ + */ + +(function ($) { + 'use strict'; + + var defaultOptions = { + enabled: true, + endpoints: ['https://noembed.com/embed?nowrap=on', 'https://api.maxmade.nl/url2iframe/embed'] + }; + $.extend(true, $.trumbowyg, { + plugins: { + pasteEmbed: { + init: function init(trumbowyg) { + trumbowyg.o.plugins.pasteEmbed = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.pasteEmbed || {}); + if (!trumbowyg.o.plugins.pasteEmbed.enabled) { + return; + } + trumbowyg.pasteHandlers.push(function (pasteEvent) { + try { + var clipboardData = (pasteEvent.originalEvent || pasteEvent).clipboardData, + pastedData = clipboardData.getData('Text'), + endpoints = trumbowyg.o.plugins.pasteEmbed.endpoints, + request = null; + if (pastedData.startsWith('http')) { + pasteEvent.stopPropagation(); + pasteEvent.preventDefault(); + var query = { + url: pastedData.trim() + }; + var content = ''; + var index = 0; + if (request && request.transport) { + request.transport.abort(); + } + request = $.ajax({ + crossOrigin: true, + url: endpoints[index], + type: 'GET', + data: query, + cache: false, + dataType: 'jsonp', + success: function success(res) { + if (res.html) { + index = 0; + content = res.html; + } else { + index += 1; + } + }, + error: function error() { + index += 1; + }, + complete: function complete() { + if (content.length === 0 && index < endpoints.length - 1) { + this.url = endpoints[index]; + this.data = query; + $.ajax(this); + } + if (index === endpoints.length - 1) { + content = $('', { + href: pastedData, + text: pastedData + }).prop('outerHTML'); + } + if (content.length > 0) { + index = 0; + trumbowyg.execCmd('insertHTML', content); + } + } + }); + } + } catch (c) {} + }); + } + } + } + }); +})(jQuery); +/* =========================================================== + * trumbowyg.pasteembed.js v1.0 + * Url paste to iframe with noembed. Plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Max Seelig + * Facebook : https://facebook.com/maxse + * Website : https://www.maxmade.nl/ */ !function (t) { "use strict"; @@ -4384,303 +4627,60 @@ }); }(jQuery); /* =========================================================== - * trumbowyg.noembed.js v1.0 - * noEmbed plugin for Trumbowyg + * trumbowyg.preformatted.js v1.0 + * Preformatted plugin for Trumbowyg * http://alex-d.github.com/Trumbowyg * =========================================================== - * Author : Jake Johns (jakejohns) + * Author : Casella Edoardo (Civile) */ (function ($) { 'use strict'; - var defaultOptions = { - proxy: 'https://noembed.com/embed?nowrap=on', - urlFiled: 'url', - data: [], - success: undefined, - error: undefined - }; $.extend(true, $.trumbowyg, { langs: { // jshint camelcase:false en: { - noembed: 'Noembed', - noembedError: 'Error' + preformatted: 'Code sample
    '
           },
           az: {
    -        noembed: 'Noembed',
    -        noembedError: 'Xəta'
    +        preformatted: 'Kod nümunəsi 
    '
           },
           by: {
    -        noembedError: 'Памылка'
    -      },
    -      cs: {
    -        noembedError: 'Chyba'
    +        preformatted: 'Прыклад кода 
    '
           },
           da: {
    -        noembedError: 'Fejl'
    +        preformatted: 'Præformateret 
    '
           },
           et: {
    -        noembed: 'Noembed',
    -        noembedError: 'Viga'
    +        preformatted: 'Eelvormindatud tekst 
    '
           },
           fr: {
    -        noembedError: 'Erreur'
    +        preformatted: 'Exemple de code 
    '
           },
           hu: {
    -        noembed: 'Noembed',
    -        noembedError: 'Hiba'
    +        preformatted: 'Kód minta 
    '
    +      },
    +      it: {
    +        preformatted: 'Codice 
    '
           },
           ja: {
    -        noembedError: 'エラー'
    +        preformatted: 'コードサンプル 
    '
           },
           ko: {
    -        noembed: 'oEmbed 넣기',
    -        noembedError: '에러'
    +        preformatted: '코드 예제 
    '
           },
           pt_br: {
    -        noembed: 'Incorporar',
    -        noembedError: 'Erro'
    +        preformatted: 'Exemple de código 
    '
           },
           ru: {
    -        noembedError: 'Ошибка'
    +        preformatted: 'Пример кода 
    '
           },
           sl: {
    -        noembed: 'Noembed',
    -        noembedError: 'Napaka'
    -      },
    -      sk: {
    -        noembedError: 'Chyba'
    +        preformatted: 'Vstavi neformatiran tekst 
    '
           },
           tr: {
    -        noembedError: 'Hata'
    -      },
    -      zh_tw: {
    -        noembed: '插入影片',
    -        noembedError: '錯誤'
    -      }
    -      // jshint camelcase:true
    -    },
    -
    -    plugins: {
    -      noembed: {
    -        init: function init(trumbowyg) {
    -          trumbowyg.o.plugins.noembed = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.noembed || {});
    -          var btnDef = {
    -            fn: function fn() {
    -              var $modal = trumbowyg.openModalInsert(
    -              // Title
    -              trumbowyg.lang.noembed,
    -              // Fields
    -              {
    -                url: {
    -                  label: 'URL',
    -                  required: true
    -                }
    -              },
    -              // Callback
    -              function (data) {
    -                $.ajax({
    -                  url: trumbowyg.o.plugins.noembed.proxy,
    -                  type: 'GET',
    -                  data: data,
    -                  cache: false,
    -                  dataType: 'json',
    -                  success: function success(data) {
    -                    if (trumbowyg.o.plugins.noembed.success) {
    -                      trumbowyg.o.plugins.noembed.success(data, trumbowyg, $modal);
    -                      return;
    -                    }
    -                    if (!data.html) {
    -                      trumbowyg.addErrorOnModalField($('input[type=text]', $modal), data.error);
    -                      return;
    -                    }
    -                    trumbowyg.execCmd('insertHTML', data.html);
    -                    setTimeout(function () {
    -                      trumbowyg.closeModal();
    -                    }, 250);
    -                  },
    -                  error: trumbowyg.o.plugins.noembed.error || function () {
    -                    trumbowyg.addErrorOnModalField($('input[type=text]', $modal), trumbowyg.lang.noembedError);
    -                  }
    -                });
    -              });
    -            }
    -          };
    -          trumbowyg.addBtnDef('noembed', btnDef);
    -        }
    -      }
    -    }
    -  });
    -})(jQuery);
    -/* ===========================================================
    - * trumbowyg.noembed.js v1.0
    - * noEmbed plugin for Trumbowyg
    - * http://alex-d.github.com/Trumbowyg
    - * ===========================================================
    - * Author : Jake Johns (jakejohns)
    - */
    -!function (e) {
    -  "use strict";
    -
    -  var r = {
    -    proxy: "https://noembed.com/embed?nowrap=on",
    -    urlFiled: "url",
    -    data: [],
    -    success: void 0,
    -    error: void 0
    -  };
    -  e.extend(!0, e.trumbowyg, {
    -    langs: {
    -      en: {
    -        noembed: "Noembed",
    -        noembedError: "Error"
    -      },
    -      az: {
    -        noembed: "Noembed",
    -        noembedError: "Xəta"
    -      },
    -      by: {
    -        noembedError: "Памылка"
    -      },
    -      cs: {
    -        noembedError: "Chyba"
    -      },
    -      da: {
    -        noembedError: "Fejl"
    -      },
    -      et: {
    -        noembed: "Noembed",
    -        noembedError: "Viga"
    -      },
    -      fr: {
    -        noembedError: "Erreur"
    -      },
    -      hu: {
    -        noembed: "Noembed",
    -        noembedError: "Hiba"
    -      },
    -      ja: {
    -        noembedError: "エラー"
    -      },
    -      ko: {
    -        noembed: "oEmbed 넣기",
    -        noembedError: "에러"
    -      },
    -      pt_br: {
    -        noembed: "Incorporar",
    -        noembedError: "Erro"
    -      },
    -      ru: {
    -        noembedError: "Ошибка"
    -      },
    -      sl: {
    -        noembed: "Noembed",
    -        noembedError: "Napaka"
    -      },
    -      sk: {
    -        noembedError: "Chyba"
    -      },
    -      tr: {
    -        noembedError: "Hata"
    -      },
    -      zh_tw: {
    -        noembed: "插入影片",
    -        noembedError: "錯誤"
    -      }
    -    },
    -    plugins: {
    -      noembed: {
    -        init: function init(o) {
    -          o.o.plugins.noembed = e.extend(!0, {}, r, o.o.plugins.noembed || {});
    -          var n = {
    -            fn: function fn() {
    -              var r = o.openModalInsert(o.lang.noembed, {
    -                url: {
    -                  label: "URL",
    -                  required: !0
    -                }
    -              }, function (n) {
    -                e.ajax({
    -                  url: o.o.plugins.noembed.proxy,
    -                  type: "GET",
    -                  data: n,
    -                  cache: !1,
    -                  dataType: "json",
    -                  success: function success(n) {
    -                    o.o.plugins.noembed.success ? o.o.plugins.noembed.success(n, o, r) : n.html ? (o.execCmd("insertHTML", n.html), setTimeout(function () {
    -                      o.closeModal();
    -                    }, 250)) : o.addErrorOnModalField(e("input[type=text]", r), n.error);
    -                  },
    -                  error: o.o.plugins.noembed.error || function () {
    -                    o.addErrorOnModalField(e("input[type=text]", r), o.lang.noembedError);
    -                  }
    -                });
    -              });
    -            }
    -          };
    -          o.addBtnDef("noembed", n);
    -        }
    -      }
    -    }
    -  });
    -}(jQuery);
    -/* ===========================================================
    - * trumbowyg.preformatted.js v1.0
    - * Preformatted plugin for Trumbowyg
    - * http://alex-d.github.com/Trumbowyg
    - * ===========================================================
    - * Author : Casella Edoardo (Civile)
    - */
    -
    -(function ($) {
    -  'use strict';
    -
    -  $.extend(true, $.trumbowyg, {
    -    langs: {
    -      // jshint camelcase:false
    -      en: {
    -        preformatted: 'Code sample 
    '
    -      },
    -      az: {
    -        preformatted: 'Kod nümunəsi 
    '
    -      },
    -      by: {
    -        preformatted: 'Прыклад кода 
    '
    -      },
    -      da: {
    -        preformatted: 'Præformateret 
    '
    -      },
    -      et: {
    -        preformatted: 'Eelvormindatud tekst 
    '
    -      },
    -      fr: {
    -        preformatted: 'Exemple de code 
    '
    -      },
    -      hu: {
    -        preformatted: 'Kód minta 
    '
    -      },
    -      it: {
    -        preformatted: 'Codice 
    '
    -      },
    -      ja: {
    -        preformatted: 'コードサンプル 
    '
    -      },
    -      ko: {
    -        preformatted: '코드 예제 
    '
    -      },
    -      pt_br: {
    -        preformatted: 'Exemple de código 
    '
    -      },
    -      ru: {
    -        preformatted: 'Пример кода 
    '
    -      },
    -      sl: {
    -        preformatted: 'Vstavi neformatiran tekst 
    '
    -      },
    -      tr: {
    -        preformatted: 'Kod örneği 
    '
    +        preformatted: 'Kod örneği 
    '
           },
           zh_cn: {
             preformatted: '代码示例 
    '
    @@ -4874,1018 +4874,290 @@
         }
       });
     }(jQuery);
    -;
    +/* ===========================================================
    + * trumbowyg.table.js v3.0
    + * Table plugin for Trumbowyg
    + * http://alex-d.github.com/Trumbowyg
    + * ===========================================================
    + * Author : Alexandre Demode (Alex-D)
    + *          Twitter : @AlexandreDemode
    + *          Website : alex-d.fr
    + * Original Author : Sven Dunemann [dunemann@forelabs.eu]
    + */
    +
     (function ($) {
       'use strict';
     
       var defaultOptions = {
    -    minSize: 32,
    -    step: 4
    -  };
    -  function preventDefault(e) {
    -    e.stopPropagation();
    -    e.preventDefault();
    -  }
    -  var ResizeWithCanvas = function ResizeWithCanvas(trumbowyg) {
    -    // variable to create canvas and save img in resize mode
    -    this.resizeCanvas = document.createElement('canvas');
    -    // to allow canvas to get focus
    -    this.resizeCanvas.setAttribute('tabindex', '0');
    -    this.resizeCanvas.id = 'trumbowyg-resizimg-' + +new Date();
    -    this.ctx = null;
    -    this.resizeImg = null;
    -    this.pressEscape = function (obj) {
    -      obj.reset();
    -    };
    -    this.pressBackspaceOrDelete = function (obj) {
    -      $(obj.resizeCanvas).remove();
    -      obj.resizeImg = null;
    -      if (trumbowyg !== null) {
    -        trumbowyg.syncCode();
    -        // notify changes
    -        trumbowyg.$c.trigger('tbwchange');
    -      }
    -    };
    -
    -    // PRIVATE FUNCTION
    -    var focusedNow = false;
    -    var isCursorSeResize = false;
    -
    -    // calculate offset to change mouse over square in the canvas
    -    var offsetX, offsetY;
    -    var reOffset = function reOffset(canvas) {
    -      var BB = canvas.getBoundingClientRect();
    -      offsetX = BB.left;
    -      offsetY = BB.top;
    -    };
    -    var updateCanvas = function updateCanvas(canvas, ctx, img, canvasWidth, canvasHeight) {
    -      ctx.translate(0.5, 0.5);
    -      ctx.lineWidth = 1;
    -
    -      // image
    -      ctx.drawImage(img, 5, 5, canvasWidth - 10, canvasHeight - 10);
    -
    -      // border
    -      ctx.beginPath();
    -      ctx.rect(5, 5, canvasWidth - 10, canvasHeight - 10);
    -      ctx.stroke();
    -
    -      // square in the angle
    -      ctx.beginPath();
    -      ctx.fillStyle = 'rgb(255, 255, 255)';
    -      ctx.rect(canvasWidth - 10, canvasHeight - 10, 9, 9);
    -      ctx.fill();
    -      ctx.stroke();
    -
    -      // get the offset to change the mouse cursor
    -      reOffset(canvas);
    -      return ctx;
    -    };
    -
    -    // PUBLIC FUNCTION
    -    // necessary to correctly print cursor over square. Called once for instance. Useless with trumbowyg.
    -    this.init = function () {
    -      var _this = this;
    -      $(window).on('scroll resize', function () {
    -        _this.reCalcOffset();
    -      });
    -    };
    -    this.reCalcOffset = function () {
    -      reOffset(this.resizeCanvas);
    -    };
    -    this.canvasId = function () {
    -      return this.resizeCanvas.id;
    -    };
    -    this.isActive = function () {
    -      return this.resizeImg !== null;
    -    };
    -    this.isFocusedNow = function () {
    -      return focusedNow;
    -    };
    -    this.blurNow = function () {
    -      focusedNow = false;
    -    };
    -
    -    // restore image in the HTML of the editor
    -    this.reset = function () {
    -      if (this.resizeImg === null) {
    -        return;
    -      }
    -
    -      // set style of image to avoid issue on resize because this attribute have priority over width and height attribute
    -      this.resizeImg.setAttribute('style', 'width: 100%; max-width: ' + (this.resizeCanvas.clientWidth - 10) + 'px; height: auto; max-height: ' + (this.resizeCanvas.clientHeight - 10) + 'px;');
    -      $(this.resizeCanvas).replaceWith($(this.resizeImg));
    -
    -      // reset canvas style
    -      this.resizeCanvas.removeAttribute('style');
    -      this.resizeImg = null;
    -    };
    -
    -    // setup canvas with points and border to allow the resizing operation
    -    this.setup = function (img, resizableOptions) {
    -      this.resizeImg = img;
    -      if (!this.resizeCanvas.getContext) {
    -        return false;
    +    rows: 8,
    +    columns: 8,
    +    allowHorizontalResize: true,
    +    colorList: ['ffffff', '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646', 'ffff00', 'f2f2f2', '7f7f7f', 'ddd9c3', 'c6d9f0', 'dbe5f1', 'f2dcdb', 'ebf1dd', 'e5e0ec', 'dbeef3', 'fdeada', 'fff2ca', 'd8d8d8', '595959', 'c4bd97', '8db3e2', 'b8cce4', 'e5b9b7', 'd7e3bc', 'ccc1d9', 'b7dde8', 'fbd5b5', 'ffe694', 'bfbfbf', '3f3f3f', '938953', '548dd4', '95b3d7', 'd99694', 'c3d69b', 'b2a2c7', 'b7dde8', 'fac08f', 'f2c314', 'a5a5a5', '262626', '494429', '17365d', '366092', '953734', '76923c', '5f497a', '92cddc', 'e36c09', 'c09100', '7f7f7f', '0c0c0c', '1d1b10', '0f243e', '244061', '632423', '4f6128', '3f3151', '31859b', '974806', '7f6000'],
    +    backgroundColorList: null,
    +    // fallbacks on colorList
    +    allowCustomBackgroundColor: true,
    +    displayBackgroundColorsAsList: false,
    +    borderColorList: null,
    +    // fallbacks on colorList
    +    allowCustomBorderColor: true,
    +    displayBorderColorsAsList: false,
    +    dropdown: [{
    +      title: 'tableRows',
    +      buttons: ['tableAddHeaderRow', 'tableAddRowAbove', 'tableAddRow', 'tableDeleteRow']
    +    }, {
    +      title: 'tableColumns',
    +      buttons: ['tableAddColumnLeft', 'tableAddColumn', 'tableDeleteColumn']
    +    }, {
    +      title: 'tableVerticalAlign',
    +      buttons: ['tableVerticalAlignTop', 'tableVerticalAlignMiddle', 'tableVerticalAlignBottom']
    +    }, {
    +      title: 'tableOthers',
    +      buttons: [
    +      // Cell merge/split
    +      'tableMergeCells', 'tableUnmergeCells', 'tableDestroy']
    +    }]
    +  };
    +  function ucFirst(value) {
    +    return value[0].toUpperCase() + value.slice(1);
    +  }
    +  function hex(x) {
    +    return ('0' + parseInt(x).toString(16)).slice(-2);
    +  }
    +  function colorToHex(rgb) {
    +    if (rgb.search('rgb') === -1) {
    +      return rgb.replace('#', '');
    +    } else if (rgb === 'rgba(0, 0, 0, 0)') {
    +      return 'transparent';
    +    } else {
    +      rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/);
    +      if (rgb == null) {
    +        return 'transparent'; // No match, return transparent as unkown color
           }
    -      focusedNow = true;
    -
    -      // draw canvas
    -      this.resizeCanvas.width = $(this.resizeImg).width() + 10;
    -      this.resizeCanvas.height = $(this.resizeImg).height() + 10;
    -      this.resizeCanvas.style.margin = '-5px';
    -      this.ctx = this.resizeCanvas.getContext('2d');
    -
    -      // replace image with canvas
    -      $(this.resizeImg).replaceWith($(this.resizeCanvas));
    -      updateCanvas(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height);
    -
    -      // enable resize
    -      $(this.resizeCanvas).resizableSafe(resizableOptions).on('mousedown', preventDefault);
    -      var _this = this;
    -      $(this.resizeCanvas).on('mousemove', function (e) {
    -        var mouseX = Math.round(e.clientX - offsetX);
    -        var mouseY = Math.round(e.clientY - offsetY);
    -        var wasCursorSeResize = isCursorSeResize;
    -        _this.ctx.rect(_this.resizeCanvas.width - 10, _this.resizeCanvas.height - 10, 9, 9);
    -        isCursorSeResize = _this.ctx.isPointInPath(mouseX, mouseY);
    -        if (wasCursorSeResize !== isCursorSeResize) {
    -          this.style.cursor = isCursorSeResize ? 'se-resize' : 'default';
    -        }
    -      }).on('keydown', function (e) {
    -        if (!_this.isActive()) {
    -          return;
    -        }
    -        var x = e.keyCode;
    -        if (x === 27) {
    -          // ESC
    -          _this.pressEscape(_this);
    -        } else if (x === 8 || x === 46) {
    -          // BACKSPACE or DELETE
    -          _this.pressBackspaceOrDelete(_this);
    -        }
    -      }).on('focus', preventDefault).on('blur', function () {
    -        _this.reset();
    -        // save changes
    -        if (trumbowyg !== null) {
    -          trumbowyg.syncCode();
    -          // notify changes
    -          trumbowyg.$c.trigger('tbwchange');
    -        }
    -      });
    -      this.resizeCanvas.focus();
    -      return true;
    -    };
     
    -    // update the canvas after the resizing
    -    this.refresh = function () {
    -      if (!this.resizeCanvas.getContext) {
    -        return;
    -      }
    -      this.resizeCanvas.width = this.resizeCanvas.clientWidth;
    -      this.resizeCanvas.height = this.resizeCanvas.clientHeight;
    -      updateCanvas(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height);
    -    };
    -  };
    -  $.extend(true, $.trumbowyg, {
    -    plugins: {
    -      resizimg: {
    -        destroyResizable: function destroyResizable() {},
    -        init: function init(trumbowyg) {
    -          var destroyResizable = this.destroyResizable;
    -
    -          // object to interact with canvas
    -          var resizeWithCanvas = new ResizeWithCanvas(trumbowyg);
    -          this.destroyResizable = function () {
    -            // clean html code
    -            trumbowyg.$ed.find('canvas.resizable').resizableSafe('destroy').off('mousedown', preventDefault).removeClass('resizable');
    -            resizeWithCanvas.reset();
    -            trumbowyg.syncCode();
    -          };
    -          trumbowyg.o.plugins.resizimg = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.resizimg || {}, {
    -            resizable: {
    -              resizeWidth: false,
    -              onDragStart: function onDragStart(ev, $el) {
    -                var opt = trumbowyg.o.plugins.resizimg;
    -                var x = ev.pageX - $el.offset().left;
    -                var y = ev.pageY - $el.offset().top;
    -                if (x < $el.width() - opt.minSize || y < $el.height() - opt.minSize) {
    -                  return false;
    -                }
    -              },
    -              onDrag: function onDrag(ev, $el, newWidth, newHeight) {
    -                var opt = trumbowyg.o.plugins.resizimg;
    -                if (newHeight < opt.minSize) {
    -                  newHeight = opt.minSize;
    -                }
    -                newHeight -= newHeight % opt.step;
    -                $el.height(newHeight);
    -                return false;
    -              },
    -              onDragEnd: function onDragEnd() {
    -                // resize update canvas information
    -                resizeWithCanvas.refresh();
    -                trumbowyg.syncCode();
    -              }
    -            }
    -          });
    -          function initResizable() {
    -            trumbowyg.$ed.find('img').off('click').on('click', function (e) {
    -              // if I'm already do a resize, reset it
    -              if (resizeWithCanvas.isActive()) {
    -                resizeWithCanvas.reset();
    -              }
    -              // initialize resize of image
    -              resizeWithCanvas.setup(this, trumbowyg.o.plugins.resizimg.resizable);
    -              preventDefault(e);
    -            });
    -          }
    -          trumbowyg.$c.on('tbwinit', function () {
    -            initResizable();
    -
    -            // disable resize when click on other items
    -            trumbowyg.$ed.on('click', function (e) {
    -              // check if I've clicked out of canvas or image to reset it
    -              if ($(e.target).is('img') || e.target.id === resizeWithCanvas.canvasId()) {
    -                return;
    -              }
    -              preventDefault(e);
    -              resizeWithCanvas.reset();
    -              //sync
    -              trumbowyg.syncCode();
    -              // notify changes
    -              trumbowyg.$c.trigger('tbwchange');
    -            });
    -            trumbowyg.$ed.on('scroll', function () {
    -              resizeWithCanvas.reCalcOffset();
    -            });
    -          });
    -          trumbowyg.$c.on('tbwfocus tbwchange', initResizable);
    -          trumbowyg.$c.on('tbwresize', function () {
    -            resizeWithCanvas.reCalcOffset();
    -          });
    -
    -          // Destroy
    -          trumbowyg.$c.on('tbwblur', function () {
    -            // when canvas is created the tbwblur is called
    -            // this code avoid to destroy the canvas that allow the image resizing
    -            if (resizeWithCanvas.isFocusedNow()) {
    -              resizeWithCanvas.blurNow();
    -            } else {
    -              destroyResizable();
    -            }
    -          });
    -        },
    -        destroy: function destroy() {
    -          this.destroyResizable();
    -        }
    -      }
    -    }
    -  });
    -})(jQuery);
    -!function (e) {
    -  "use strict";
    -
    -  var i = {
    -    minSize: 32,
    -    step: 4
    -  };
    -  function t(e) {
    -    e.stopPropagation(), e.preventDefault();
    -  }
    -  var s = function s(i) {
    -    this.resizeCanvas = document.createElement("canvas"), this.resizeCanvas.setAttribute("tabindex", "0"), this.resizeCanvas.id = "trumbowyg-resizimg-" + +new Date(), this.ctx = null, this.resizeImg = null, this.pressEscape = function (e) {
    -      e.reset();
    -    }, this.pressBackspaceOrDelete = function (t) {
    -      e(t.resizeCanvas).remove(), t.resizeImg = null, null !== i && (i.syncCode(), i.$c.trigger("tbwchange"));
    -    };
    -    var s,
    -      n,
    -      r = !1,
    -      a = !1,
    -      o = function o(e) {
    -        var i = e.getBoundingClientRect();
    -        s = i.left, n = i.top;
    -      },
    -      h = function h(e, i, t, s, n) {
    -        return i.translate(.5, .5), i.lineWidth = 1, i.drawImage(t, 5, 5, s - 10, n - 10), i.beginPath(), i.rect(5, 5, s - 10, n - 10), i.stroke(), i.beginPath(), i.fillStyle = "rgb(255, 255, 255)", i.rect(s - 10, n - 10, 9, 9), i.fill(), i.stroke(), o(e), i;
    -      };
    -    // necessary to correctly print cursor over square. Called once for instance. Useless with trumbowyg.
    -    this.init = function () {
    -      var i = this;
    -      e(window).on("scroll resize", function () {
    -        i.reCalcOffset();
    -      });
    -    }, this.reCalcOffset = function () {
    -      o(this.resizeCanvas);
    -    }, this.canvasId = function () {
    -      return this.resizeCanvas.id;
    -    }, this.isActive = function () {
    -      return null !== this.resizeImg;
    -    }, this.isFocusedNow = function () {
    -      return r;
    -    }, this.blurNow = function () {
    -      r = !1;
    -    }, this.reset = function () {
    -      null !== this.resizeImg && (this.resizeImg.setAttribute("style", "width: 100%; max-width: " + (this.resizeCanvas.clientWidth - 10) + "px; height: auto; max-height: " + (this.resizeCanvas.clientHeight - 10) + "px;"), e(this.resizeCanvas).replaceWith(e(this.resizeImg)), this.resizeCanvas.removeAttribute("style"), this.resizeImg = null);
    -    }, this.setup = function (o, c) {
    -      if (this.resizeImg = o, !this.resizeCanvas.getContext) return !1;
    -      r = !0, this.resizeCanvas.width = e(this.resizeImg).width() + 10, this.resizeCanvas.height = e(this.resizeImg).height() + 10, this.resizeCanvas.style.margin = "-5px", this.ctx = this.resizeCanvas.getContext("2d"), e(this.resizeImg).replaceWith(e(this.resizeCanvas)), h(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height), e(this.resizeCanvas).resizableSafe(c).on("mousedown", t);
    -      var u = this;
    -      return e(this.resizeCanvas).on("mousemove", function (e) {
    -        var i = Math.round(e.clientX - s),
    -          t = Math.round(e.clientY - n),
    -          r = a;
    -        u.ctx.rect(u.resizeCanvas.width - 10, u.resizeCanvas.height - 10, 9, 9), r !== (a = u.ctx.isPointInPath(i, t)) && (this.style.cursor = a ? "se-resize" : "default");
    -      }).on("keydown", function (e) {
    -        if (u.isActive()) {
    -          var i = e.keyCode;
    -          27 === i ? u.pressEscape(u) : 8 !== i && 46 !== i || u.pressBackspaceOrDelete(u);
    -        }
    -      }).on("focus", t).on("blur", function () {
    -        u.reset(), null !== i && (i.syncCode(), i.$c.trigger("tbwchange"));
    -      }), this.resizeCanvas.focus(), !0;
    -    }, this.refresh = function () {
    -      this.resizeCanvas.getContext && (this.resizeCanvas.width = this.resizeCanvas.clientWidth, this.resizeCanvas.height = this.resizeCanvas.clientHeight, h(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height));
    -    };
    -  };
    -  e.extend(!0, e.trumbowyg, {
    -    plugins: {
    -      resizimg: {
    -        destroyResizable: function destroyResizable() {},
    -        init: function init(n) {
    -          var r = this.destroyResizable,
    -            a = new s(n);
    -          function o() {
    -            n.$ed.find("img").off("click").on("click", function (e) {
    -              a.isActive() && a.reset(), a.setup(this, n.o.plugins.resizimg.resizable), t(e);
    -            });
    -          }
    -          this.destroyResizable = function () {
    -            n.$ed.find("canvas.resizable").resizableSafe("destroy").off("mousedown", t).removeClass("resizable"), a.reset(), n.syncCode();
    -          }, n.o.plugins.resizimg = e.extend(!0, {}, i, n.o.plugins.resizimg || {}, {
    -            resizable: {
    -              resizeWidth: !1,
    -              onDragStart: function onDragStart(e, i) {
    -                var t = n.o.plugins.resizimg,
    -                  s = e.pageX - i.offset().left,
    -                  r = e.pageY - i.offset().top;
    -                if (s < i.width() - t.minSize || r < i.height() - t.minSize) return !1;
    -              },
    -              onDrag: function onDrag(e, i, t, s) {
    -                var r = n.o.plugins.resizimg;
    -                return s < r.minSize && (s = r.minSize), s -= s % r.step, i.height(s), !1;
    -              },
    -              onDragEnd: function onDragEnd() {
    -                a.refresh(), n.syncCode();
    -              }
    -            }
    -          }), n.$c.on("tbwinit", function () {
    -            o(), n.$ed.on("click", function (i) {
    -              e(i.target).is("img") || i.target.id === a.canvasId() || (t(i), a.reset(), n.syncCode(), n.$c.trigger("tbwchange"));
    -            }), n.$ed.on("scroll", function () {
    -              a.reCalcOffset();
    -            });
    -          }), n.$c.on("tbwfocus tbwchange", o), n.$c.on("tbwresize", function () {
    -            a.reCalcOffset();
    -          }), n.$c.on("tbwblur", function () {
    -            a.isFocusedNow() ? a.blurNow() : r();
    -          });
    -        },
    -        destroy: function destroy() {
    -          this.destroyResizable();
    -        }
    -      }
    -    }
    -  });
    -}(jQuery);
    -/* ===========================================================
    - * trumbowyg.specialchars.js v0.99
    - * Unicode characters picker plugin for Trumbowyg
    - * http://alex-d.github.com/Trumbowyg
    - * ===========================================================
    - * Author : Renaud Hoyoux (geektortoise)
    -*/
    -
    -(function ($) {
    -  'use strict';
    -
    -  var defaultOptions = {
    -    symbolList: [
    -    // currencies
    -    '0024', '20AC', '00A3', '00A2', '00A5', '00A4', '2030', null,
    -    // legal signs
    -    '00A9', '00AE', '2122', null,
    -    // textual sign
    -    '00A7', '00B6', '00C6', '00E6', '0152', '0153', null, '2022', '25CF', '2023', '25B6', '2B29', '25C6', null,
    -    //maths
    -    '00B1', '00D7', '00F7', '21D2', '21D4', '220F', '2211', '2243', '2264', '2265']
    -  };
    +      return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
    +    }
    +  }
       $.extend(true, $.trumbowyg, {
         langs: {
    +      // jshint camelcase:false
           en: {
    -        specialChars: 'Special characters'
    +        table: 'Insert table',
    +        tableRows: 'Rows',
    +        tableColumns: 'Columns',
    +        tableVerticalAlign: 'Vertical align',
    +        tableOthers: 'Others',
    +        tableAddHeaderRow: 'Insert head row',
    +        tableAddRowAbove: 'Insert row above',
    +        tableAddRow: 'Insert row below',
    +        tableAddColumnLeft: 'Insert column to the left',
    +        tableAddColumn: 'Insert column to the right',
    +        tableDeleteRow: 'Delete row',
    +        tableDeleteColumn: 'Delete column',
    +        tableDestroy: 'Delete table',
    +        tableMergeCells: 'Merge cells',
    +        tableUnmergeCells: 'Unmerge cells',
    +        tableVerticalAlignTop: 'Align text to top',
    +        tableVerticalAlignMiddle: 'Center text vertically',
    +        tableVerticalAlignBottom: 'Align text to bottom',
    +        tableCellBackgroundColor: 'Cell background color'
           },
           az: {
    -        specialChars: 'Xüsusi simvollar'
    +        table: 'Cədvəl yerləşdir',
    +        tableAddRow: 'Sətir əlavə et',
    +        tableAddRowAbove: 'Yuxarı sətir əlavə et',
    +        tableAddColumnLeft: 'Sola sütun əlavə et',
    +        tableAddColumn: 'Sağa sütun əlavə et',
    +        tableDeleteRow: 'Sətri sil',
    +        tableDeleteColumn: 'Sütunu sil',
    +        tableDestroy: 'Cədvəli sil'
           },
    -      by: {
    -        specialChars: 'Спецыяльныя сімвалы'
    +      ca: {
    +        table: 'Inserir taula',
    +        tableAddRow: 'Afegir fila',
    +        tableAddRowAbove: 'Afegir fila a dalt',
    +        tableAddColumnLeft: 'Afegir columna a l\'esquerra',
    +        tableAddColumn: 'Afegir columna a la dreta',
    +        tableDeleteRow: 'Esborrar fila',
    +        tableDeleteColumn: 'Esborrar columna',
    +        tableDestroy: 'Esborrar taula',
    +        error: 'Error'
           },
    -      et: {
    -        specialChars: 'Erimärgid'
    +      cs: {
    +        table: 'Vytvořit příkaz Table',
    +        tableAddRow: 'Přidat řádek',
    +        tableAddRowAbove: 'Přidat řádek',
    +        tableAddColumnLeft: 'Přidat sloupec',
    +        tableAddColumn: 'Přidat sloupec'
           },
    -      fr: {
    -        specialChars: 'Caractères spéciaux'
    +      da: {
    +        table: 'Indsæt tabel',
    +        tableAddRow: 'Tilføj række',
    +        tableAddRowAbove: 'Tilføj række',
    +        tableAddColumnLeft: 'Tilføj kolonne',
    +        tableAddColumn: 'Tilføj kolonne',
    +        tableDeleteRow: 'Slet række',
    +        tableDeleteColumn: 'Slet kolonne',
    +        tableDestroy: 'Slet tabel'
           },
    -      hu: {
    -        specialChars: 'Speciális karakterek'
    +      de: {
    +        table: 'Tabelle einfügen',
    +        tableAddRow: 'Zeile hinzufügen',
    +        tableAddRowAbove: 'Zeile hinzufügen',
    +        tableAddColumnLeft: 'Spalte hinzufügen',
    +        tableAddColumn: 'Spalte hinzufügen',
    +        tableDeleteRow: 'Zeile löschen',
    +        tableDeleteColumn: 'Spalte löschen',
    +        tableDestroy: 'Tabelle löschen'
           },
    -      ko: {
    -        specialChars: '특수문자'
    -      },
    -      ru: {
    -        specialChars: 'Специальные символы'
    -      },
    -      sl: {
    -        specialChars: 'Posebni znaki'
    -      },
    -      tr: {
    -        specialChars: 'Özel karakterler'
    -      }
    -    },
    -    plugins: {
    -      specialchars: {
    -        init: function init(trumbowyg) {
    -          trumbowyg.o.plugins.specialchars = trumbowyg.o.plugins.specialchars || defaultOptions;
    -          var specialCharsBtnDef = {
    -            dropdown: buildDropdown(trumbowyg)
    -          };
    -          trumbowyg.addBtnDef('specialChars', specialCharsBtnDef);
    -        }
    -      }
    -    }
    -  });
    -  function buildDropdown(trumbowyg) {
    -    var dropdown = [];
    -    $.each(trumbowyg.o.plugins.specialchars.symbolList, function (i, symbol) {
    -      if (symbol === null) {
    -        symbol = ' ';
    -      } else {
    -        symbol = '&#x' + symbol;
    -      }
    -      var btn = symbol.replace(/:/g, ''),
    -        defaultSymbolBtnName = 'symbol-' + btn,
    -        defaultSymbolBtnDef = {
    -          text: symbol,
    -          hasIcon: false,
    -          fn: function fn() {
    -            var encodedSymbol = String.fromCodePoint(parseInt(symbol.replace('&#', '0')));
    -            trumbowyg.execCmd('insertText', encodedSymbol);
    -            return true;
    -          }
    -        };
    -      trumbowyg.addBtnDef(defaultSymbolBtnName, defaultSymbolBtnDef);
    -      dropdown.push(defaultSymbolBtnName);
    -    });
    -    return dropdown;
    -  }
    -})(jQuery);
    -/* ===========================================================
    - * trumbowyg.specialchars.js v0.99
    - * Unicode characters picker plugin for Trumbowyg
    - * http://alex-d.github.com/Trumbowyg
    - * ===========================================================
    - * Author : Renaud Hoyoux (geektortoise)
    -*/
    -!function (a) {
    -  "use strict";
    -
    -  var s = {
    -    symbolList: ["0024", "20AC", "00A3", "00A2", "00A5", "00A4", "2030", null, "00A9", "00AE", "2122", null, "00A7", "00B6", "00C6", "00E6", "0152", "0153", null, "2022", "25CF", "2023", "25B6", "2B29", "25C6", null, "00B1", "00D7", "00F7", "21D2", "21D4", "220F", "2211", "2243", "2264", "2265"]
    -  };
    -  function r(s) {
    -    var r = [];
    -    return a.each(s.o.plugins.specialchars.symbolList, function (a, e) {
    -      var i = "symbol-" + (e = null === e ? " " : "&#x" + e).replace(/:/g, ""),
    -        l = {
    -          text: e,
    -          hasIcon: !1,
    -          fn: function fn() {
    -            var a = String.fromCodePoint(parseInt(e.replace("&#", "0")));
    -            return s.execCmd("insertText", a), !0;
    -          }
    -        };
    -      s.addBtnDef(i, l), r.push(i);
    -    }), r;
    -  }
    -  a.extend(!0, a.trumbowyg, {
    -    langs: {
    -      en: {
    -        specialChars: "Special characters"
    -      },
    -      az: {
    -        specialChars: "Xüsusi simvollar"
    -      },
    -      by: {
    -        specialChars: "Спецыяльныя сімвалы"
    -      },
    -      et: {
    -        specialChars: "Erimärgid"
    +      et: {
    +        table: 'Sisesta tabel',
    +        tableAddRow: 'Lisa rida',
    +        tableAddRowAbove: 'Lisa rida üles',
    +        tableAddColumnLeft: 'Lisa tulp vasakule',
    +        tableAddColumn: 'Lisa tulp paremale',
    +        tableDeleteRow: 'Kustuta rida',
    +        tableDeleteColumn: 'Kustuta tulp',
    +        tableDestroy: 'Kustuta tabel'
           },
           fr: {
    -        specialChars: "Caractères spéciaux"
    +        table: 'Insérer un tableau',
    +        tableRows: 'Lignes',
    +        tableColumns: 'Colonnes',
    +        tableVerticalAlign: 'Alignement vertical',
    +        tableOthers: 'Autres',
    +        tableAddHeaderRow: 'Insérer une line d\'en-tête',
    +        tableAddRowAbove: 'Insérer une ligne au dessus',
    +        tableAddRow: 'Insérer une ligne en dessous',
    +        tableAddColumnLeft: 'Insérer une colonne à gauche',
    +        tableAddColumn: 'Insérer une colonne à droite',
    +        tableDeleteRow: 'Supprimer la ligne',
    +        tableDeleteColumn: 'Supprimer la colonne',
    +        tableDestroy: 'Supprimer le tableau',
    +        tableMergeCells: 'Fusionner les cellules',
    +        tableUnmergeCells: 'Dissocier les cellules',
    +        tableVerticalAlignTop: 'Aligner en haut',
    +        tableVerticalAlignMiddle: 'Aligner au milieu',
    +        tableVerticalAlignBottom: 'Aligner en bas',
    +        tableCellBackgroundColor: 'Couleur de fond des cellules',
    +        tableBorderColor: 'Couleur de la bordure du tableau'
           },
           hu: {
    -        specialChars: "Speciális karakterek"
    -      },
    -      ko: {
    -        specialChars: "특수문자"
    -      },
    -      ru: {
    -        specialChars: "Специальные символы"
    -      },
    -      sl: {
    -        specialChars: "Posebni znaki"
    -      },
    -      tr: {
    -        specialChars: "Özel karakterler"
    -      }
    -    },
    -    plugins: {
    -      specialchars: {
    -        init: function init(a) {
    -          a.o.plugins.specialchars = a.o.plugins.specialchars || s;
    -          var e = {
    -            dropdown: r(a)
    -          };
    -          a.addBtnDef("specialChars", e);
    -        }
    -      }
    -    }
    -  });
    -}(jQuery);
    -(function ($) {
    -  'use strict';
    -
    -  // Adds the language variables
    -  $.extend(true, $.trumbowyg, {
    -    langs: {
    -      // jshint camelcase:false
    -      en: {
    -        template: 'Template'
    -      },
    -      az: {
    -        template: 'Şablon'
    -      },
    -      by: {
    -        template: 'Шаблон'
    -      },
    -      da: {
    -        template: 'Skabelon'
    -      },
    -      de: {
    -        template: 'Vorlage'
    -      },
    -      et: {
    -        template: 'Mall'
    -      },
    -      fr: {
    -        template: 'Patron'
    +        table: 'Táblázat beszúrás',
    +        tableAddRow: 'Sor hozzáadás',
    +        tableAddRowAbove: 'Sor beszúrás fönt',
    +        tableAddColumnLeft: 'Sor beszúrás balra',
    +        tableAddColumn: 'Sor beszúrás jobbra',
    +        tableDeleteRow: 'Sor törlés',
    +        tableDeleteColumn: 'Oszlop törlés',
    +        tableDestroy: 'Táblázat törlés'
           },
    -      hu: {
    -        template: 'Sablon'
    +      id: {
    +        table: 'Sisipkan tabel',
    +        tableAddRow: 'Sisipkan baris',
    +        tableAddRowAbove: 'Sisipkan baris',
    +        tableAddColumnLeft: 'Sisipkan kolom',
    +        tableAddColumn: 'Sisipkan kolom',
    +        tableDeleteRow: 'Hapus baris',
    +        tableDeleteColumn: 'Hapus kolom',
    +        tableDestroy: 'Hapus tabel'
           },
           ja: {
    -        template: 'テンプレート'
    +        table: '表の挿入',
    +        tableAddRow: '行の追加',
    +        tableAddRowAbove: '行の追加',
    +        tableAddColumnLeft: '列の追加',
    +        tableAddColumn: '列の追加'
           },
           ko: {
    -        template: '서식'
    -      },
    -      nl: {
    -        template: 'Sjabloon'
    +        table: '표 넣기',
    +        tableAddRow: '줄 추가',
    +        tableAddRowAbove: '줄 추가',
    +        tableAddColumnLeft: '칸 추가',
    +        tableAddColumn: '칸 추가',
    +        tableDeleteRow: '줄 삭제',
    +        tableDeleteColumn: '칸 삭제',
    +        tableDestroy: '표 지우기'
           },
           pt_br: {
    -        template: 'Modelo'
    +        table: 'Inserir tabela',
    +        tableAddRow: 'Adicionar linha',
    +        tableAddRowAbove: 'Adicionar linha',
    +        tableAddColumnLeft: 'Adicionar coluna',
    +        tableAddColumn: 'Adicionar coluna',
    +        tableDeleteRow: 'Deletar linha',
    +        tableDeleteColumn: 'Deletar coluna',
    +        tableDestroy: 'Deletar tabela'
           },
           ru: {
    -        template: 'Шаблон'
    +        table: 'Вставить таблицу',
    +        tableAddRow: 'Добавить строку',
    +        tableAddRowAbove: 'Добавить строку',
    +        tableAddColumnLeft: 'Добавить столбец',
    +        tableAddColumn: 'Добавить столбец',
    +        tableDeleteRow: 'Удалить строку',
    +        tableDeleteColumn: 'Удалить столбец',
    +        tableDestroy: 'Удалить таблицу'
           },
           sl: {
    -        template: 'Predloga'
    +        table: 'Dodaj tabelo',
    +        tableAddRow: 'Dodaj vrstico',
    +        tableAddRowAbove: 'Vrini vrstico',
    +        tableAddColumnLeft: 'Vrini stolpec',
    +        tableAddColumn: 'Dodaj stolpec',
    +        tableDeleteRow: 'Izbriši vrstico',
    +        tableDeleteColumn: 'Izbriši stolpec',
    +        tableDestroy: 'Izbriši tabelo'
    +      },
    +      sk: {
    +        table: 'Vytvoriť tabuľky',
    +        tableAddRow: 'Pridať riadok',
    +        tableAddRowAbove: 'Pridať riadok',
    +        tableAddColumnLeft: 'Pridať stĺpec',
    +        tableAddColumn: 'Pridať stĺpec'
           },
           tr: {
    -        template: 'Şablon'
    +        table: 'Tablo ekle',
    +        tableAddRow: 'Satır ekle',
    +        tableAddRowAbove: 'Yukarıya satır ekle',
    +        tableAddColumnLeft: 'Sola sütun ekle',
    +        tableAddColumn: 'Sağa sütun ekle',
    +        tableDeleteRow: 'Satırı sil',
    +        tableDeleteColumn: 'Sütunu sil',
    +        tableDestroy: 'Tabloyu sil'
           },
           zh_tw: {
    -        template: '模板'
    -      }
    -      // jshint camelcase:true
    -    }
    -  });
    -
    -  // Adds the extra button definition
    -  $.extend(true, $.trumbowyg, {
    -    plugins: {
    -      template: {
    -        shouldInit: function shouldInit(trumbowyg) {
    -          return trumbowyg.o.plugins.hasOwnProperty('templates');
    -        },
    -        init: function init(trumbowyg) {
    -          trumbowyg.addBtnDef('template', {
    -            dropdown: templateSelector(trumbowyg),
    -            hasIcon: false,
    -            text: trumbowyg.lang.template
    -          });
    -        }
    -      }
    -    }
    -  });
    -
    -  // Creates the template-selector dropdown.
    -  function templateSelector(trumbowyg) {
    -    var available = trumbowyg.o.plugins.templates;
    -    var templates = [];
    -    $.each(available, function (index, template) {
    -      trumbowyg.addBtnDef('template_' + index, {
    -        fn: function fn() {
    -          trumbowyg.html(template.html);
    -        },
    -        hasIcon: false,
    -        title: template.name
    -      });
    -      templates.push('template_' + index);
    -    });
    -    return templates;
    -  }
    -})(jQuery);
    -!function (t) {
    -  "use strict";
    -
    -  function e(e) {
    -    var a = e.o.plugins.templates,
    -      l = [];
    -    return t.each(a, function (t, a) {
    -      e.addBtnDef("template_" + t, {
    -        fn: function fn() {
    -          e.html(a.html);
    -        },
    -        hasIcon: !1,
    -        title: a.name
    -      }), l.push("template_" + t);
    -    }), l;
    -  }
    -  t.extend(!0, t.trumbowyg, {
    -    langs: {
    -      en: {
    -        template: "Template"
    -      },
    -      az: {
    -        template: "Şablon"
    -      },
    -      by: {
    -        template: "Шаблон"
    -      },
    -      da: {
    -        template: "Skabelon"
    -      },
    -      de: {
    -        template: "Vorlage"
    -      },
    -      et: {
    -        template: "Mall"
    -      },
    -      fr: {
    -        template: "Patron"
    -      },
    -      hu: {
    -        template: "Sablon"
    -      },
    -      ja: {
    -        template: "テンプレート"
    -      },
    -      ko: {
    -        template: "서식"
    -      },
    -      nl: {
    -        template: "Sjabloon"
    -      },
    -      pt_br: {
    -        template: "Modelo"
    -      },
    -      ru: {
    -        template: "Шаблон"
    -      },
    -      sl: {
    -        template: "Predloga"
    -      },
    -      tr: {
    -        template: "Şablon"
    +        table: '插入表格',
    +        tableAddRow: '加入行',
    +        tableAddRowAbove: '加入行',
    +        tableAddColumnLeft: '加入列',
    +        tableAddColumn: '加入列',
    +        tableDeleteRow: '刪除行',
    +        tableDeleteColumn: '刪除列',
    +        tableDestroy: '刪除表格'
           },
    -      zh_tw: {
    -        template: "模板"
    -      }
    -    }
    -  }), t.extend(!0, t.trumbowyg, {
    +      es: {
    +        table: 'Insertar tabla',
    +        tableAddRow: 'Agregar fila',
    +        tableAddRowAbove: 'Agregar fila arriba',
    +        tableAddColumnLeft: 'Agregar columna a la izquierda',
    +        tableAddColumn: 'Agregar columna a la derecha',
    +        tableDeleteRow: 'Borrar fila',
    +        tableDeleteColumn: 'Borrar columna',
    +        tableDestroy: 'Borrar tabla'
    +      } // jshint camelcase:true
    +    },
    +
         plugins: {
    -      template: {
    -        shouldInit: function shouldInit(t) {
    -          return t.o.plugins.hasOwnProperty("templates");
    -        },
    +      table: {
    +        // jshint maxstatements:false
             init: function init(t) {
    -          t.addBtnDef("template", {
    -            dropdown: e(t),
    -            hasIcon: !1,
    -            text: t.lang.template
    -          });
    -        }
    -      }
    -    }
    -  });
    -}(jQuery);
    -/* ===========================================================
    - * trumbowyg.table.js v3.0
    - * Table plugin for Trumbowyg
    - * http://alex-d.github.com/Trumbowyg
    - * ===========================================================
    - * Author : Alexandre Demode (Alex-D)
    - *          Twitter : @AlexandreDemode
    - *          Website : alex-d.fr
    - * Original Author : Sven Dunemann [dunemann@forelabs.eu]
    - */
    +          t.o.plugins.table = $.extend(true, {}, defaultOptions, t.o.plugins.table || {});
     
    -(function ($) {
    -  'use strict';
    +          // State
    +          var tableSelectedCells;
     
    -  var defaultOptions = {
    -    rows: 8,
    -    columns: 8,
    -    allowHorizontalResize: true,
    -    colorList: ['ffffff', '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646', 'ffff00', 'f2f2f2', '7f7f7f', 'ddd9c3', 'c6d9f0', 'dbe5f1', 'f2dcdb', 'ebf1dd', 'e5e0ec', 'dbeef3', 'fdeada', 'fff2ca', 'd8d8d8', '595959', 'c4bd97', '8db3e2', 'b8cce4', 'e5b9b7', 'd7e3bc', 'ccc1d9', 'b7dde8', 'fbd5b5', 'ffe694', 'bfbfbf', '3f3f3f', '938953', '548dd4', '95b3d7', 'd99694', 'c3d69b', 'b2a2c7', 'b7dde8', 'fac08f', 'f2c314', 'a5a5a5', '262626', '494429', '17365d', '366092', '953734', '76923c', '5f497a', '92cddc', 'e36c09', 'c09100', '7f7f7f', '0c0c0c', '1d1b10', '0f243e', '244061', '632423', '4f6128', '3f3151', '31859b', '974806', '7f6000'],
    -    backgroundColorList: null,
    -    // fallbacks on colorList
    -    allowCustomBackgroundColor: true,
    -    displayBackgroundColorsAsList: false,
    -    borderColorList: null,
    -    // fallbacks on colorList
    -    allowCustomBorderColor: true,
    -    displayBorderColorsAsList: false,
    -    dropdown: [{
    -      title: 'tableRows',
    -      buttons: ['tableAddHeaderRow', 'tableAddRowAbove', 'tableAddRow', 'tableDeleteRow']
    -    }, {
    -      title: 'tableColumns',
    -      buttons: ['tableAddColumnLeft', 'tableAddColumn', 'tableDeleteColumn']
    -    }, {
    -      title: 'tableVerticalAlign',
    -      buttons: ['tableVerticalAlignTop', 'tableVerticalAlignMiddle', 'tableVerticalAlignBottom']
    -    }, {
    -      title: 'tableOthers',
    -      buttons: [
    -      // Cell merge/split
    -      'tableMergeCells', 'tableUnmergeCells', 'tableDestroy']
    -    }]
    -  };
    -  function ucFirst(value) {
    -    return value[0].toUpperCase() + value.slice(1);
    -  }
    -  function hex(x) {
    -    return ('0' + parseInt(x).toString(16)).slice(-2);
    -  }
    -  function colorToHex(rgb) {
    -    if (rgb.search('rgb') === -1) {
    -      return rgb.replace('#', '');
    -    } else if (rgb === 'rgba(0, 0, 0, 0)') {
    -      return 'transparent';
    -    } else {
    -      rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/);
    -      if (rgb == null) {
    -        return 'transparent'; // No match, return transparent as unkown color
    -      }
    -
    -      return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
    -    }
    -  }
    -  $.extend(true, $.trumbowyg, {
    -    langs: {
    -      // jshint camelcase:false
    -      en: {
    -        table: 'Insert table',
    -        tableRows: 'Rows',
    -        tableColumns: 'Columns',
    -        tableVerticalAlign: 'Vertical align',
    -        tableOthers: 'Others',
    -        tableAddHeaderRow: 'Insert head row',
    -        tableAddRowAbove: 'Insert row above',
    -        tableAddRow: 'Insert row below',
    -        tableAddColumnLeft: 'Insert column to the left',
    -        tableAddColumn: 'Insert column to the right',
    -        tableDeleteRow: 'Delete row',
    -        tableDeleteColumn: 'Delete column',
    -        tableDestroy: 'Delete table',
    -        tableMergeCells: 'Merge cells',
    -        tableUnmergeCells: 'Unmerge cells',
    -        tableVerticalAlignTop: 'Align text to top',
    -        tableVerticalAlignMiddle: 'Center text vertically',
    -        tableVerticalAlignBottom: 'Align text to bottom',
    -        tableCellBackgroundColor: 'Cell background color'
    -      },
    -      az: {
    -        table: 'Cədvəl yerləşdir',
    -        tableAddRow: 'Sətir əlavə et',
    -        tableAddRowAbove: 'Yuxarı sətir əlavə et',
    -        tableAddColumnLeft: 'Sola sütun əlavə et',
    -        tableAddColumn: 'Sağa sütun əlavə et',
    -        tableDeleteRow: 'Sətri sil',
    -        tableDeleteColumn: 'Sütunu sil',
    -        tableDestroy: 'Cədvəli sil'
    -      },
    -      ca: {
    -        table: 'Inserir taula',
    -        tableAddRow: 'Afegir fila',
    -        tableAddRowAbove: 'Afegir fila a dalt',
    -        tableAddColumnLeft: 'Afegir columna a l\'esquerra',
    -        tableAddColumn: 'Afegir columna a la dreta',
    -        tableDeleteRow: 'Esborrar fila',
    -        tableDeleteColumn: 'Esborrar columna',
    -        tableDestroy: 'Esborrar taula',
    -        error: 'Error'
    -      },
    -      cs: {
    -        table: 'Vytvořit příkaz Table',
    -        tableAddRow: 'Přidat řádek',
    -        tableAddRowAbove: 'Přidat řádek',
    -        tableAddColumnLeft: 'Přidat sloupec',
    -        tableAddColumn: 'Přidat sloupec'
    -      },
    -      da: {
    -        table: 'Indsæt tabel',
    -        tableAddRow: 'Tilføj række',
    -        tableAddRowAbove: 'Tilføj række',
    -        tableAddColumnLeft: 'Tilføj kolonne',
    -        tableAddColumn: 'Tilføj kolonne',
    -        tableDeleteRow: 'Slet række',
    -        tableDeleteColumn: 'Slet kolonne',
    -        tableDestroy: 'Slet tabel'
    -      },
    -      de: {
    -        table: 'Tabelle einfügen',
    -        tableAddRow: 'Zeile hinzufügen',
    -        tableAddRowAbove: 'Zeile hinzufügen',
    -        tableAddColumnLeft: 'Spalte hinzufügen',
    -        tableAddColumn: 'Spalte hinzufügen',
    -        tableDeleteRow: 'Zeile löschen',
    -        tableDeleteColumn: 'Spalte löschen',
    -        tableDestroy: 'Tabelle löschen'
    -      },
    -      et: {
    -        table: 'Sisesta tabel',
    -        tableAddRow: 'Lisa rida',
    -        tableAddRowAbove: 'Lisa rida üles',
    -        tableAddColumnLeft: 'Lisa tulp vasakule',
    -        tableAddColumn: 'Lisa tulp paremale',
    -        tableDeleteRow: 'Kustuta rida',
    -        tableDeleteColumn: 'Kustuta tulp',
    -        tableDestroy: 'Kustuta tabel'
    -      },
    -      fr: {
    -        table: 'Insérer un tableau',
    -        tableRows: 'Lignes',
    -        tableColumns: 'Colonnes',
    -        tableVerticalAlign: 'Alignement vertical',
    -        tableOthers: 'Autres',
    -        tableAddHeaderRow: 'Insérer une line d\'en-tête',
    -        tableAddRowAbove: 'Insérer une ligne au dessus',
    -        tableAddRow: 'Insérer une ligne en dessous',
    -        tableAddColumnLeft: 'Insérer une colonne à gauche',
    -        tableAddColumn: 'Insérer une colonne à droite',
    -        tableDeleteRow: 'Supprimer la ligne',
    -        tableDeleteColumn: 'Supprimer la colonne',
    -        tableDestroy: 'Supprimer le tableau',
    -        tableMergeCells: 'Fusionner les cellules',
    -        tableUnmergeCells: 'Dissocier les cellules',
    -        tableVerticalAlignTop: 'Aligner en haut',
    -        tableVerticalAlignMiddle: 'Aligner au milieu',
    -        tableVerticalAlignBottom: 'Aligner en bas',
    -        tableCellBackgroundColor: 'Couleur de fond des cellules',
    -        tableBorderColor: 'Couleur de la bordure du tableau'
    -      },
    -      hu: {
    -        table: 'Táblázat beszúrás',
    -        tableAddRow: 'Sor hozzáadás',
    -        tableAddRowAbove: 'Sor beszúrás fönt',
    -        tableAddColumnLeft: 'Sor beszúrás balra',
    -        tableAddColumn: 'Sor beszúrás jobbra',
    -        tableDeleteRow: 'Sor törlés',
    -        tableDeleteColumn: 'Oszlop törlés',
    -        tableDestroy: 'Táblázat törlés'
    -      },
    -      id: {
    -        table: 'Sisipkan tabel',
    -        tableAddRow: 'Sisipkan baris',
    -        tableAddRowAbove: 'Sisipkan baris',
    -        tableAddColumnLeft: 'Sisipkan kolom',
    -        tableAddColumn: 'Sisipkan kolom',
    -        tableDeleteRow: 'Hapus baris',
    -        tableDeleteColumn: 'Hapus kolom',
    -        tableDestroy: 'Hapus tabel'
    -      },
    -      ja: {
    -        table: '表の挿入',
    -        tableAddRow: '行の追加',
    -        tableAddRowAbove: '行の追加',
    -        tableAddColumnLeft: '列の追加',
    -        tableAddColumn: '列の追加'
    -      },
    -      ko: {
    -        table: '표 넣기',
    -        tableAddRow: '줄 추가',
    -        tableAddRowAbove: '줄 추가',
    -        tableAddColumnLeft: '칸 추가',
    -        tableAddColumn: '칸 추가',
    -        tableDeleteRow: '줄 삭제',
    -        tableDeleteColumn: '칸 삭제',
    -        tableDestroy: '표 지우기'
    -      },
    -      pt_br: {
    -        table: 'Inserir tabela',
    -        tableAddRow: 'Adicionar linha',
    -        tableAddRowAbove: 'Adicionar linha',
    -        tableAddColumnLeft: 'Adicionar coluna',
    -        tableAddColumn: 'Adicionar coluna',
    -        tableDeleteRow: 'Deletar linha',
    -        tableDeleteColumn: 'Deletar coluna',
    -        tableDestroy: 'Deletar tabela'
    -      },
    -      ru: {
    -        table: 'Вставить таблицу',
    -        tableAddRow: 'Добавить строку',
    -        tableAddRowAbove: 'Добавить строку',
    -        tableAddColumnLeft: 'Добавить столбец',
    -        tableAddColumn: 'Добавить столбец',
    -        tableDeleteRow: 'Удалить строку',
    -        tableDeleteColumn: 'Удалить столбец',
    -        tableDestroy: 'Удалить таблицу'
    -      },
    -      sl: {
    -        table: 'Dodaj tabelo',
    -        tableAddRow: 'Dodaj vrstico',
    -        tableAddRowAbove: 'Vrini vrstico',
    -        tableAddColumnLeft: 'Vrini stolpec',
    -        tableAddColumn: 'Dodaj stolpec',
    -        tableDeleteRow: 'Izbriši vrstico',
    -        tableDeleteColumn: 'Izbriši stolpec',
    -        tableDestroy: 'Izbriši tabelo'
    -      },
    -      sk: {
    -        table: 'Vytvoriť tabuľky',
    -        tableAddRow: 'Pridať riadok',
    -        tableAddRowAbove: 'Pridať riadok',
    -        tableAddColumnLeft: 'Pridať stĺpec',
    -        tableAddColumn: 'Pridať stĺpec'
    -      },
    -      tr: {
    -        table: 'Tablo ekle',
    -        tableAddRow: 'Satır ekle',
    -        tableAddRowAbove: 'Yukarıya satır ekle',
    -        tableAddColumnLeft: 'Sola sütun ekle',
    -        tableAddColumn: 'Sağa sütun ekle',
    -        tableDeleteRow: 'Satırı sil',
    -        tableDeleteColumn: 'Sütunu sil',
    -        tableDestroy: 'Tabloyu sil'
    -      },
    -      zh_tw: {
    -        table: '插入表格',
    -        tableAddRow: '加入行',
    -        tableAddRowAbove: '加入行',
    -        tableAddColumnLeft: '加入列',
    -        tableAddColumn: '加入列',
    -        tableDeleteRow: '刪除行',
    -        tableDeleteColumn: '刪除列',
    -        tableDestroy: '刪除表格'
    -      },
    -      es: {
    -        table: 'Insertar tabla',
    -        tableAddRow: 'Agregar fila',
    -        tableAddRowAbove: 'Agregar fila arriba',
    -        tableAddColumnLeft: 'Agregar columna a la izquierda',
    -        tableAddColumn: 'Agregar columna a la derecha',
    -        tableDeleteRow: 'Borrar fila',
    -        tableDeleteColumn: 'Borrar columna',
    -        tableDestroy: 'Borrar tabla'
    -      } // jshint camelcase:true
    -    },
    -
    -    plugins: {
    -      table: {
    -        // jshint maxstatements:false
    -        init: function init(t) {
    -          t.o.plugins.table = $.extend(true, {}, defaultOptions, t.o.plugins.table || {});
    -
    -          // State
    -          var tableSelectedCells;
    -
    -          ////////////////////////////////////////////////////
    -          // Dropdown
    +          ////////////////////////////////////////////////////
    +          // Dropdown
     
               var buildButtonDef = {
                 fn: function fn() {
    @@ -7872,62 +7144,790 @@
                       f = "free" + l(t);
                     a.addBtnDef(f, u), i.push(f);
                   }
    -              return i;
    -            },
    -            W = {
    -              dropdown: Q("tableCellBackgroundColor", a.o.plugins.table.backgroundColorList || a.o.plugins.table.colorList, a.o.plugins.table.displayBackgroundColorsAsList, a.o.plugins.table.allowCustomBackgroundColor, function (t) {
    -                return function () {
    -                  var l = e(a.doc.getSelection().anchorNode).closest("table");
    -                  if (0 !== l.length) {
    -                    var o = b(l);
    -                    L(function (e) {
    -                      e.css({
    -                        backgroundColor: t
    -                      });
    -                    }, o), R(l);
    -                  }
    -                };
    -              }),
    -              dropdownClass: F(a.o.plugins.table.displayBackgroundColorsAsList)
    -            },
    -            Y = {
    -              dropdown: Q("tableBorderColor", a.o.plugins.table.borderColorList || a.o.plugins.table.colorList, a.o.plugins.table.displayBorderColorsAsList, a.o.plugins.table.allowCustomBorderColor, function (t) {
    -                return function () {
    -                  var l = e(a.doc.getSelection().anchorNode).closest("table");
    -                  if (0 !== l.length) {
    -                    var o = {
    -                      borderColor: t
    -                    };
    -                    0 === parseInt(l.css("border-width"), 10) && (o.borderWidth = "2px", o.borderStyle = "solid"), "" === t && (o.borderWidth = "", o.borderStyle = ""), l.css(o);
    -                  }
    -                };
    -              }),
    -              dropdownClass: F(a.o.plugins.table.displayBorderColorsAsList)
    -            };
    -          a.addBtnDef("table", n), a.addBtnDef("tableAddHeaderRow", p), a.addBtnDef("tableAddRowAbove", f), a.addBtnDef("tableAddRow", g), a.addBtnDef("tableAddColumnLeft", A), a.addBtnDef("tableAddColumn", v), a.addBtnDef("tableMergeCells", x), a.addBtnDef("tableUnmergeCells", y), a.addBtnDef("tableVerticalAlignTop", j), a.addBtnDef("tableVerticalAlignMiddle", O), a.addBtnDef("tableVerticalAlignBottom", U), a.addBtnDef("tableCellBackgroundColor", W), a.addBtnDef("tableBorderColor", Y), a.addBtnDef("tableDeleteRow", w), a.addBtnDef("tableDeleteColumn", C), a.addBtnDef("tableDestroy", h);
    -        },
    -        destroy: function destroy(t) {
    -          e(window).off("resize.tbwTable"), e(t.doc).off("selectionchange.tbwTable").off("mousemove.tbwTable").off("mouseup.tbwTable"), t.$c.off("tbwchange.tbwTable"), e("table", t.$ed).off("mousedown.tbwTable");
    -        },
    -        tagHandler: function tagHandler(e, t) {
    -          var a = [];
    -          if ("TABLE" === e.tagName) {
    -            a.push("table");
    -            var n = e.style.borderColor;
    -            if ("" !== n) {
    -              var r = o(n);
    -              t.o.plugins.table.colorList.indexOf(r) >= 0 ? a.push("tableBorderColor" + r) : a.push("freeTableBorderColor");
    +              return i;
    +            },
    +            W = {
    +              dropdown: Q("tableCellBackgroundColor", a.o.plugins.table.backgroundColorList || a.o.plugins.table.colorList, a.o.plugins.table.displayBackgroundColorsAsList, a.o.plugins.table.allowCustomBackgroundColor, function (t) {
    +                return function () {
    +                  var l = e(a.doc.getSelection().anchorNode).closest("table");
    +                  if (0 !== l.length) {
    +                    var o = b(l);
    +                    L(function (e) {
    +                      e.css({
    +                        backgroundColor: t
    +                      });
    +                    }, o), R(l);
    +                  }
    +                };
    +              }),
    +              dropdownClass: F(a.o.plugins.table.displayBackgroundColorsAsList)
    +            },
    +            Y = {
    +              dropdown: Q("tableBorderColor", a.o.plugins.table.borderColorList || a.o.plugins.table.colorList, a.o.plugins.table.displayBorderColorsAsList, a.o.plugins.table.allowCustomBorderColor, function (t) {
    +                return function () {
    +                  var l = e(a.doc.getSelection().anchorNode).closest("table");
    +                  if (0 !== l.length) {
    +                    var o = {
    +                      borderColor: t
    +                    };
    +                    0 === parseInt(l.css("border-width"), 10) && (o.borderWidth = "2px", o.borderStyle = "solid"), "" === t && (o.borderWidth = "", o.borderStyle = ""), l.css(o);
    +                  }
    +                };
    +              }),
    +              dropdownClass: F(a.o.plugins.table.displayBorderColorsAsList)
    +            };
    +          a.addBtnDef("table", n), a.addBtnDef("tableAddHeaderRow", p), a.addBtnDef("tableAddRowAbove", f), a.addBtnDef("tableAddRow", g), a.addBtnDef("tableAddColumnLeft", A), a.addBtnDef("tableAddColumn", v), a.addBtnDef("tableMergeCells", x), a.addBtnDef("tableUnmergeCells", y), a.addBtnDef("tableVerticalAlignTop", j), a.addBtnDef("tableVerticalAlignMiddle", O), a.addBtnDef("tableVerticalAlignBottom", U), a.addBtnDef("tableCellBackgroundColor", W), a.addBtnDef("tableBorderColor", Y), a.addBtnDef("tableDeleteRow", w), a.addBtnDef("tableDeleteColumn", C), a.addBtnDef("tableDestroy", h);
    +        },
    +        destroy: function destroy(t) {
    +          e(window).off("resize.tbwTable"), e(t.doc).off("selectionchange.tbwTable").off("mousemove.tbwTable").off("mouseup.tbwTable"), t.$c.off("tbwchange.tbwTable"), e("table", t.$ed).off("mousedown.tbwTable");
    +        },
    +        tagHandler: function tagHandler(e, t) {
    +          var a = [];
    +          if ("TABLE" === e.tagName) {
    +            a.push("table");
    +            var n = e.style.borderColor;
    +            if ("" !== n) {
    +              var r = o(n);
    +              t.o.plugins.table.colorList.indexOf(r) >= 0 ? a.push("tableBorderColor" + r) : a.push("freeTableBorderColor");
    +            }
    +          }
    +          if (!e.style) return a;
    +          var d = e.style.verticalAlign;
    +          "" !== d && a.push("tableVerticalAlign" + l(d));
    +          var i = e.style.backgroundColor;
    +          if (("TH" === e.tagName || "TD" === e.tagName) && "" !== i) {
    +            var s = o(i);
    +            t.o.plugins.table.colorList.indexOf(s) >= 0 ? a.push("tableCellBackgroundColor" + s) : a.push("freeTableCellBackgroundColor");
    +          }
    +          return a;
    +        }
    +      }
    +    }
    +  });
    +}(jQuery);
    +(function ($) {
    +  'use strict';
    +
    +  // Adds the language variables
    +  $.extend(true, $.trumbowyg, {
    +    langs: {
    +      // jshint camelcase:false
    +      en: {
    +        template: 'Template'
    +      },
    +      az: {
    +        template: 'Şablon'
    +      },
    +      by: {
    +        template: 'Шаблон'
    +      },
    +      da: {
    +        template: 'Skabelon'
    +      },
    +      de: {
    +        template: 'Vorlage'
    +      },
    +      et: {
    +        template: 'Mall'
    +      },
    +      fr: {
    +        template: 'Patron'
    +      },
    +      hu: {
    +        template: 'Sablon'
    +      },
    +      ja: {
    +        template: 'テンプレート'
    +      },
    +      ko: {
    +        template: '서식'
    +      },
    +      nl: {
    +        template: 'Sjabloon'
    +      },
    +      pt_br: {
    +        template: 'Modelo'
    +      },
    +      ru: {
    +        template: 'Шаблон'
    +      },
    +      sl: {
    +        template: 'Predloga'
    +      },
    +      tr: {
    +        template: 'Şablon'
    +      },
    +      zh_tw: {
    +        template: '模板'
    +      }
    +      // jshint camelcase:true
    +    }
    +  });
    +
    +  // Adds the extra button definition
    +  $.extend(true, $.trumbowyg, {
    +    plugins: {
    +      template: {
    +        shouldInit: function shouldInit(trumbowyg) {
    +          return trumbowyg.o.plugins.hasOwnProperty('templates');
    +        },
    +        init: function init(trumbowyg) {
    +          trumbowyg.addBtnDef('template', {
    +            dropdown: templateSelector(trumbowyg),
    +            hasIcon: false,
    +            text: trumbowyg.lang.template
    +          });
    +        }
    +      }
    +    }
    +  });
    +
    +  // Creates the template-selector dropdown.
    +  function templateSelector(trumbowyg) {
    +    var available = trumbowyg.o.plugins.templates;
    +    var templates = [];
    +    $.each(available, function (index, template) {
    +      trumbowyg.addBtnDef('template_' + index, {
    +        fn: function fn() {
    +          trumbowyg.html(template.html);
    +        },
    +        hasIcon: false,
    +        title: template.name
    +      });
    +      templates.push('template_' + index);
    +    });
    +    return templates;
    +  }
    +})(jQuery);
    +!function (t) {
    +  "use strict";
    +
    +  function e(e) {
    +    var a = e.o.plugins.templates,
    +      l = [];
    +    return t.each(a, function (t, a) {
    +      e.addBtnDef("template_" + t, {
    +        fn: function fn() {
    +          e.html(a.html);
    +        },
    +        hasIcon: !1,
    +        title: a.name
    +      }), l.push("template_" + t);
    +    }), l;
    +  }
    +  t.extend(!0, t.trumbowyg, {
    +    langs: {
    +      en: {
    +        template: "Template"
    +      },
    +      az: {
    +        template: "Şablon"
    +      },
    +      by: {
    +        template: "Шаблон"
    +      },
    +      da: {
    +        template: "Skabelon"
    +      },
    +      de: {
    +        template: "Vorlage"
    +      },
    +      et: {
    +        template: "Mall"
    +      },
    +      fr: {
    +        template: "Patron"
    +      },
    +      hu: {
    +        template: "Sablon"
    +      },
    +      ja: {
    +        template: "テンプレート"
    +      },
    +      ko: {
    +        template: "서식"
    +      },
    +      nl: {
    +        template: "Sjabloon"
    +      },
    +      pt_br: {
    +        template: "Modelo"
    +      },
    +      ru: {
    +        template: "Шаблон"
    +      },
    +      sl: {
    +        template: "Predloga"
    +      },
    +      tr: {
    +        template: "Şablon"
    +      },
    +      zh_tw: {
    +        template: "模板"
    +      }
    +    }
    +  }), t.extend(!0, t.trumbowyg, {
    +    plugins: {
    +      template: {
    +        shouldInit: function shouldInit(t) {
    +          return t.o.plugins.hasOwnProperty("templates");
    +        },
    +        init: function init(t) {
    +          t.addBtnDef("template", {
    +            dropdown: e(t),
    +            hasIcon: !1,
    +            text: t.lang.template
    +          });
    +        }
    +      }
    +    }
    +  });
    +}(jQuery);
    +/* ===========================================================
    + * trumbowyg.specialchars.js v0.99
    + * Unicode characters picker plugin for Trumbowyg
    + * http://alex-d.github.com/Trumbowyg
    + * ===========================================================
    + * Author : Renaud Hoyoux (geektortoise)
    +*/
    +
    +(function ($) {
    +  'use strict';
    +
    +  var defaultOptions = {
    +    symbolList: [
    +    // currencies
    +    '0024', '20AC', '00A3', '00A2', '00A5', '00A4', '2030', null,
    +    // legal signs
    +    '00A9', '00AE', '2122', null,
    +    // textual sign
    +    '00A7', '00B6', '00C6', '00E6', '0152', '0153', null, '2022', '25CF', '2023', '25B6', '2B29', '25C6', null,
    +    //maths
    +    '00B1', '00D7', '00F7', '21D2', '21D4', '220F', '2211', '2243', '2264', '2265']
    +  };
    +  $.extend(true, $.trumbowyg, {
    +    langs: {
    +      en: {
    +        specialChars: 'Special characters'
    +      },
    +      az: {
    +        specialChars: 'Xüsusi simvollar'
    +      },
    +      by: {
    +        specialChars: 'Спецыяльныя сімвалы'
    +      },
    +      et: {
    +        specialChars: 'Erimärgid'
    +      },
    +      fr: {
    +        specialChars: 'Caractères spéciaux'
    +      },
    +      hu: {
    +        specialChars: 'Speciális karakterek'
    +      },
    +      ko: {
    +        specialChars: '특수문자'
    +      },
    +      ru: {
    +        specialChars: 'Специальные символы'
    +      },
    +      sl: {
    +        specialChars: 'Posebni znaki'
    +      },
    +      tr: {
    +        specialChars: 'Özel karakterler'
    +      }
    +    },
    +    plugins: {
    +      specialchars: {
    +        init: function init(trumbowyg) {
    +          trumbowyg.o.plugins.specialchars = trumbowyg.o.plugins.specialchars || defaultOptions;
    +          var specialCharsBtnDef = {
    +            dropdown: buildDropdown(trumbowyg)
    +          };
    +          trumbowyg.addBtnDef('specialChars', specialCharsBtnDef);
    +        }
    +      }
    +    }
    +  });
    +  function buildDropdown(trumbowyg) {
    +    var dropdown = [];
    +    $.each(trumbowyg.o.plugins.specialchars.symbolList, function (i, symbol) {
    +      if (symbol === null) {
    +        symbol = ' ';
    +      } else {
    +        symbol = '&#x' + symbol;
    +      }
    +      var btn = symbol.replace(/:/g, ''),
    +        defaultSymbolBtnName = 'symbol-' + btn,
    +        defaultSymbolBtnDef = {
    +          text: symbol,
    +          hasIcon: false,
    +          fn: function fn() {
    +            var encodedSymbol = String.fromCodePoint(parseInt(symbol.replace('&#', '0')));
    +            trumbowyg.execCmd('insertText', encodedSymbol);
    +            return true;
    +          }
    +        };
    +      trumbowyg.addBtnDef(defaultSymbolBtnName, defaultSymbolBtnDef);
    +      dropdown.push(defaultSymbolBtnName);
    +    });
    +    return dropdown;
    +  }
    +})(jQuery);
    +/* ===========================================================
    + * trumbowyg.specialchars.js v0.99
    + * Unicode characters picker plugin for Trumbowyg
    + * http://alex-d.github.com/Trumbowyg
    + * ===========================================================
    + * Author : Renaud Hoyoux (geektortoise)
    +*/
    +!function (a) {
    +  "use strict";
    +
    +  var s = {
    +    symbolList: ["0024", "20AC", "00A3", "00A2", "00A5", "00A4", "2030", null, "00A9", "00AE", "2122", null, "00A7", "00B6", "00C6", "00E6", "0152", "0153", null, "2022", "25CF", "2023", "25B6", "2B29", "25C6", null, "00B1", "00D7", "00F7", "21D2", "21D4", "220F", "2211", "2243", "2264", "2265"]
    +  };
    +  function r(s) {
    +    var r = [];
    +    return a.each(s.o.plugins.specialchars.symbolList, function (a, e) {
    +      var i = "symbol-" + (e = null === e ? " " : "&#x" + e).replace(/:/g, ""),
    +        l = {
    +          text: e,
    +          hasIcon: !1,
    +          fn: function fn() {
    +            var a = String.fromCodePoint(parseInt(e.replace("&#", "0")));
    +            return s.execCmd("insertText", a), !0;
    +          }
    +        };
    +      s.addBtnDef(i, l), r.push(i);
    +    }), r;
    +  }
    +  a.extend(!0, a.trumbowyg, {
    +    langs: {
    +      en: {
    +        specialChars: "Special characters"
    +      },
    +      az: {
    +        specialChars: "Xüsusi simvollar"
    +      },
    +      by: {
    +        specialChars: "Спецыяльныя сімвалы"
    +      },
    +      et: {
    +        specialChars: "Erimärgid"
    +      },
    +      fr: {
    +        specialChars: "Caractères spéciaux"
    +      },
    +      hu: {
    +        specialChars: "Speciális karakterek"
    +      },
    +      ko: {
    +        specialChars: "특수문자"
    +      },
    +      ru: {
    +        specialChars: "Специальные символы"
    +      },
    +      sl: {
    +        specialChars: "Posebni znaki"
    +      },
    +      tr: {
    +        specialChars: "Özel karakterler"
    +      }
    +    },
    +    plugins: {
    +      specialchars: {
    +        init: function init(a) {
    +          a.o.plugins.specialchars = a.o.plugins.specialchars || s;
    +          var e = {
    +            dropdown: r(a)
    +          };
    +          a.addBtnDef("specialChars", e);
    +        }
    +      }
    +    }
    +  });
    +}(jQuery);
    +;
    +(function ($) {
    +  'use strict';
    +
    +  var defaultOptions = {
    +    minSize: 32,
    +    step: 4
    +  };
    +  function preventDefault(e) {
    +    e.stopPropagation();
    +    e.preventDefault();
    +  }
    +  var ResizeWithCanvas = function ResizeWithCanvas(trumbowyg) {
    +    // variable to create canvas and save img in resize mode
    +    this.resizeCanvas = document.createElement('canvas');
    +    // to allow canvas to get focus
    +    this.resizeCanvas.setAttribute('tabindex', '0');
    +    this.resizeCanvas.id = 'trumbowyg-resizimg-' + +new Date();
    +    this.ctx = null;
    +    this.resizeImg = null;
    +    this.pressEscape = function (obj) {
    +      obj.reset();
    +    };
    +    this.pressBackspaceOrDelete = function (obj) {
    +      $(obj.resizeCanvas).remove();
    +      obj.resizeImg = null;
    +      if (trumbowyg !== null) {
    +        trumbowyg.syncCode();
    +        // notify changes
    +        trumbowyg.$c.trigger('tbwchange');
    +      }
    +    };
    +
    +    // PRIVATE FUNCTION
    +    var focusedNow = false;
    +    var isCursorSeResize = false;
    +
    +    // calculate offset to change mouse over square in the canvas
    +    var offsetX, offsetY;
    +    var reOffset = function reOffset(canvas) {
    +      var BB = canvas.getBoundingClientRect();
    +      offsetX = BB.left;
    +      offsetY = BB.top;
    +    };
    +    var updateCanvas = function updateCanvas(canvas, ctx, img, canvasWidth, canvasHeight) {
    +      ctx.translate(0.5, 0.5);
    +      ctx.lineWidth = 1;
    +
    +      // image
    +      ctx.drawImage(img, 5, 5, canvasWidth - 10, canvasHeight - 10);
    +
    +      // border
    +      ctx.beginPath();
    +      ctx.rect(5, 5, canvasWidth - 10, canvasHeight - 10);
    +      ctx.stroke();
    +
    +      // square in the angle
    +      ctx.beginPath();
    +      ctx.fillStyle = 'rgb(255, 255, 255)';
    +      ctx.rect(canvasWidth - 10, canvasHeight - 10, 9, 9);
    +      ctx.fill();
    +      ctx.stroke();
    +
    +      // get the offset to change the mouse cursor
    +      reOffset(canvas);
    +      return ctx;
    +    };
    +
    +    // PUBLIC FUNCTION
    +    // necessary to correctly print cursor over square. Called once for instance. Useless with trumbowyg.
    +    this.init = function () {
    +      var _this = this;
    +      $(window).on('scroll resize', function () {
    +        _this.reCalcOffset();
    +      });
    +    };
    +    this.reCalcOffset = function () {
    +      reOffset(this.resizeCanvas);
    +    };
    +    this.canvasId = function () {
    +      return this.resizeCanvas.id;
    +    };
    +    this.isActive = function () {
    +      return this.resizeImg !== null;
    +    };
    +    this.isFocusedNow = function () {
    +      return focusedNow;
    +    };
    +    this.blurNow = function () {
    +      focusedNow = false;
    +    };
    +
    +    // restore image in the HTML of the editor
    +    this.reset = function () {
    +      if (this.resizeImg === null) {
    +        return;
    +      }
    +
    +      // set style of image to avoid issue on resize because this attribute have priority over width and height attribute
    +      this.resizeImg.setAttribute('style', 'width: 100%; max-width: ' + (this.resizeCanvas.clientWidth - 10) + 'px; height: auto; max-height: ' + (this.resizeCanvas.clientHeight - 10) + 'px;');
    +      $(this.resizeCanvas).replaceWith($(this.resizeImg));
    +
    +      // reset canvas style
    +      this.resizeCanvas.removeAttribute('style');
    +      this.resizeImg = null;
    +    };
    +
    +    // setup canvas with points and border to allow the resizing operation
    +    this.setup = function (img, resizableOptions) {
    +      this.resizeImg = img;
    +      if (!this.resizeCanvas.getContext) {
    +        return false;
    +      }
    +      focusedNow = true;
    +
    +      // draw canvas
    +      this.resizeCanvas.width = $(this.resizeImg).width() + 10;
    +      this.resizeCanvas.height = $(this.resizeImg).height() + 10;
    +      this.resizeCanvas.style.margin = '-5px';
    +      this.ctx = this.resizeCanvas.getContext('2d');
    +
    +      // replace image with canvas
    +      $(this.resizeImg).replaceWith($(this.resizeCanvas));
    +      updateCanvas(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height);
    +
    +      // enable resize
    +      $(this.resizeCanvas).resizableSafe(resizableOptions).on('mousedown', preventDefault);
    +      var _this = this;
    +      $(this.resizeCanvas).on('mousemove', function (e) {
    +        var mouseX = Math.round(e.clientX - offsetX);
    +        var mouseY = Math.round(e.clientY - offsetY);
    +        var wasCursorSeResize = isCursorSeResize;
    +        _this.ctx.rect(_this.resizeCanvas.width - 10, _this.resizeCanvas.height - 10, 9, 9);
    +        isCursorSeResize = _this.ctx.isPointInPath(mouseX, mouseY);
    +        if (wasCursorSeResize !== isCursorSeResize) {
    +          this.style.cursor = isCursorSeResize ? 'se-resize' : 'default';
    +        }
    +      }).on('keydown', function (e) {
    +        if (!_this.isActive()) {
    +          return;
    +        }
    +        var x = e.keyCode;
    +        if (x === 27) {
    +          // ESC
    +          _this.pressEscape(_this);
    +        } else if (x === 8 || x === 46) {
    +          // BACKSPACE or DELETE
    +          _this.pressBackspaceOrDelete(_this);
    +        }
    +      }).on('focus', preventDefault).on('blur', function () {
    +        _this.reset();
    +        // save changes
    +        if (trumbowyg !== null) {
    +          trumbowyg.syncCode();
    +          // notify changes
    +          trumbowyg.$c.trigger('tbwchange');
    +        }
    +      });
    +      this.resizeCanvas.focus();
    +      return true;
    +    };
    +
    +    // update the canvas after the resizing
    +    this.refresh = function () {
    +      if (!this.resizeCanvas.getContext) {
    +        return;
    +      }
    +      this.resizeCanvas.width = this.resizeCanvas.clientWidth;
    +      this.resizeCanvas.height = this.resizeCanvas.clientHeight;
    +      updateCanvas(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height);
    +    };
    +  };
    +  $.extend(true, $.trumbowyg, {
    +    plugins: {
    +      resizimg: {
    +        destroyResizable: function destroyResizable() {},
    +        init: function init(trumbowyg) {
    +          var destroyResizable = this.destroyResizable;
    +
    +          // object to interact with canvas
    +          var resizeWithCanvas = new ResizeWithCanvas(trumbowyg);
    +          this.destroyResizable = function () {
    +            // clean html code
    +            trumbowyg.$ed.find('canvas.resizable').resizableSafe('destroy').off('mousedown', preventDefault).removeClass('resizable');
    +            resizeWithCanvas.reset();
    +            trumbowyg.syncCode();
    +          };
    +          trumbowyg.o.plugins.resizimg = $.extend(true, {}, defaultOptions, trumbowyg.o.plugins.resizimg || {}, {
    +            resizable: {
    +              resizeWidth: false,
    +              onDragStart: function onDragStart(ev, $el) {
    +                var opt = trumbowyg.o.plugins.resizimg;
    +                var x = ev.pageX - $el.offset().left;
    +                var y = ev.pageY - $el.offset().top;
    +                if (x < $el.width() - opt.minSize || y < $el.height() - opt.minSize) {
    +                  return false;
    +                }
    +              },
    +              onDrag: function onDrag(ev, $el, newWidth, newHeight) {
    +                var opt = trumbowyg.o.plugins.resizimg;
    +                if (newHeight < opt.minSize) {
    +                  newHeight = opt.minSize;
    +                }
    +                newHeight -= newHeight % opt.step;
    +                $el.height(newHeight);
    +                return false;
    +              },
    +              onDragEnd: function onDragEnd() {
    +                // resize update canvas information
    +                resizeWithCanvas.refresh();
    +                trumbowyg.syncCode();
    +              }
                 }
    +          });
    +          function initResizable() {
    +            trumbowyg.$ed.find('img').off('click').on('click', function (e) {
    +              // if I'm already do a resize, reset it
    +              if (resizeWithCanvas.isActive()) {
    +                resizeWithCanvas.reset();
    +              }
    +              // initialize resize of image
    +              resizeWithCanvas.setup(this, trumbowyg.o.plugins.resizimg.resizable);
    +              preventDefault(e);
    +            });
               }
    -          if (!e.style) return a;
    -          var d = e.style.verticalAlign;
    -          "" !== d && a.push("tableVerticalAlign" + l(d));
    -          var i = e.style.backgroundColor;
    -          if (("TH" === e.tagName || "TD" === e.tagName) && "" !== i) {
    -            var s = o(i);
    -            t.o.plugins.table.colorList.indexOf(s) >= 0 ? a.push("tableCellBackgroundColor" + s) : a.push("freeTableCellBackgroundColor");
    +          trumbowyg.$c.on('tbwinit', function () {
    +            initResizable();
    +
    +            // disable resize when click on other items
    +            trumbowyg.$ed.on('click', function (e) {
    +              // check if I've clicked out of canvas or image to reset it
    +              if ($(e.target).is('img') || e.target.id === resizeWithCanvas.canvasId()) {
    +                return;
    +              }
    +              preventDefault(e);
    +              resizeWithCanvas.reset();
    +              //sync
    +              trumbowyg.syncCode();
    +              // notify changes
    +              trumbowyg.$c.trigger('tbwchange');
    +            });
    +            trumbowyg.$ed.on('scroll', function () {
    +              resizeWithCanvas.reCalcOffset();
    +            });
    +          });
    +          trumbowyg.$c.on('tbwfocus tbwchange', initResizable);
    +          trumbowyg.$c.on('tbwresize', function () {
    +            resizeWithCanvas.reCalcOffset();
    +          });
    +
    +          // Destroy
    +          trumbowyg.$c.on('tbwblur', function () {
    +            // when canvas is created the tbwblur is called
    +            // this code avoid to destroy the canvas that allow the image resizing
    +            if (resizeWithCanvas.isFocusedNow()) {
    +              resizeWithCanvas.blurNow();
    +            } else {
    +              destroyResizable();
    +            }
    +          });
    +        },
    +        destroy: function destroy() {
    +          this.destroyResizable();
    +        }
    +      }
    +    }
    +  });
    +})(jQuery);
    +!function (e) {
    +  "use strict";
    +
    +  var i = {
    +    minSize: 32,
    +    step: 4
    +  };
    +  function t(e) {
    +    e.stopPropagation(), e.preventDefault();
    +  }
    +  var s = function s(i) {
    +    this.resizeCanvas = document.createElement("canvas"), this.resizeCanvas.setAttribute("tabindex", "0"), this.resizeCanvas.id = "trumbowyg-resizimg-" + +new Date(), this.ctx = null, this.resizeImg = null, this.pressEscape = function (e) {
    +      e.reset();
    +    }, this.pressBackspaceOrDelete = function (t) {
    +      e(t.resizeCanvas).remove(), t.resizeImg = null, null !== i && (i.syncCode(), i.$c.trigger("tbwchange"));
    +    };
    +    var s,
    +      n,
    +      r = !1,
    +      a = !1,
    +      o = function o(e) {
    +        var i = e.getBoundingClientRect();
    +        s = i.left, n = i.top;
    +      },
    +      h = function h(e, i, t, s, n) {
    +        return i.translate(.5, .5), i.lineWidth = 1, i.drawImage(t, 5, 5, s - 10, n - 10), i.beginPath(), i.rect(5, 5, s - 10, n - 10), i.stroke(), i.beginPath(), i.fillStyle = "rgb(255, 255, 255)", i.rect(s - 10, n - 10, 9, 9), i.fill(), i.stroke(), o(e), i;
    +      };
    +    // necessary to correctly print cursor over square. Called once for instance. Useless with trumbowyg.
    +    this.init = function () {
    +      var i = this;
    +      e(window).on("scroll resize", function () {
    +        i.reCalcOffset();
    +      });
    +    }, this.reCalcOffset = function () {
    +      o(this.resizeCanvas);
    +    }, this.canvasId = function () {
    +      return this.resizeCanvas.id;
    +    }, this.isActive = function () {
    +      return null !== this.resizeImg;
    +    }, this.isFocusedNow = function () {
    +      return r;
    +    }, this.blurNow = function () {
    +      r = !1;
    +    }, this.reset = function () {
    +      null !== this.resizeImg && (this.resizeImg.setAttribute("style", "width: 100%; max-width: " + (this.resizeCanvas.clientWidth - 10) + "px; height: auto; max-height: " + (this.resizeCanvas.clientHeight - 10) + "px;"), e(this.resizeCanvas).replaceWith(e(this.resizeImg)), this.resizeCanvas.removeAttribute("style"), this.resizeImg = null);
    +    }, this.setup = function (o, c) {
    +      if (this.resizeImg = o, !this.resizeCanvas.getContext) return !1;
    +      r = !0, this.resizeCanvas.width = e(this.resizeImg).width() + 10, this.resizeCanvas.height = e(this.resizeImg).height() + 10, this.resizeCanvas.style.margin = "-5px", this.ctx = this.resizeCanvas.getContext("2d"), e(this.resizeImg).replaceWith(e(this.resizeCanvas)), h(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height), e(this.resizeCanvas).resizableSafe(c).on("mousedown", t);
    +      var u = this;
    +      return e(this.resizeCanvas).on("mousemove", function (e) {
    +        var i = Math.round(e.clientX - s),
    +          t = Math.round(e.clientY - n),
    +          r = a;
    +        u.ctx.rect(u.resizeCanvas.width - 10, u.resizeCanvas.height - 10, 9, 9), r !== (a = u.ctx.isPointInPath(i, t)) && (this.style.cursor = a ? "se-resize" : "default");
    +      }).on("keydown", function (e) {
    +        if (u.isActive()) {
    +          var i = e.keyCode;
    +          27 === i ? u.pressEscape(u) : 8 !== i && 46 !== i || u.pressBackspaceOrDelete(u);
    +        }
    +      }).on("focus", t).on("blur", function () {
    +        u.reset(), null !== i && (i.syncCode(), i.$c.trigger("tbwchange"));
    +      }), this.resizeCanvas.focus(), !0;
    +    }, this.refresh = function () {
    +      this.resizeCanvas.getContext && (this.resizeCanvas.width = this.resizeCanvas.clientWidth, this.resizeCanvas.height = this.resizeCanvas.clientHeight, h(this.resizeCanvas, this.ctx, this.resizeImg, this.resizeCanvas.width, this.resizeCanvas.height));
    +    };
    +  };
    +  e.extend(!0, e.trumbowyg, {
    +    plugins: {
    +      resizimg: {
    +        destroyResizable: function destroyResizable() {},
    +        init: function init(n) {
    +          var r = this.destroyResizable,
    +            a = new s(n);
    +          function o() {
    +            n.$ed.find("img").off("click").on("click", function (e) {
    +              a.isActive() && a.reset(), a.setup(this, n.o.plugins.resizimg.resizable), t(e);
    +            });
               }
    -          return a;
    +          this.destroyResizable = function () {
    +            n.$ed.find("canvas.resizable").resizableSafe("destroy").off("mousedown", t).removeClass("resizable"), a.reset(), n.syncCode();
    +          }, n.o.plugins.resizimg = e.extend(!0, {}, i, n.o.plugins.resizimg || {}, {
    +            resizable: {
    +              resizeWidth: !1,
    +              onDragStart: function onDragStart(e, i) {
    +                var t = n.o.plugins.resizimg,
    +                  s = e.pageX - i.offset().left,
    +                  r = e.pageY - i.offset().top;
    +                if (s < i.width() - t.minSize || r < i.height() - t.minSize) return !1;
    +              },
    +              onDrag: function onDrag(e, i, t, s) {
    +                var r = n.o.plugins.resizimg;
    +                return s < r.minSize && (s = r.minSize), s -= s % r.step, i.height(s), !1;
    +              },
    +              onDragEnd: function onDragEnd() {
    +                a.refresh(), n.syncCode();
    +              }
    +            }
    +          }), n.$c.on("tbwinit", function () {
    +            o(), n.$ed.on("click", function (i) {
    +              e(i.target).is("img") || i.target.id === a.canvasId() || (t(i), a.reset(), n.syncCode(), n.$c.trigger("tbwchange"));
    +            }), n.$ed.on("scroll", function () {
    +              a.reCalcOffset();
    +            });
    +          }), n.$c.on("tbwfocus tbwchange", o), n.$c.on("tbwresize", function () {
    +            a.reCalcOffset();
    +          }), n.$c.on("tbwblur", function () {
    +            a.isFocusedNow() ? a.blurNow() : r();
    +          });
    +        },
    +        destroy: function destroy() {
    +          this.destroyResizable();
             }
           }
         }
    diff --git a/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.min.js b/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.min.js
    index 08eea91dd5f..0881a10f0c3 100644
    --- a/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.min.js
    +++ b/src/OrchardCore.Modules/OrchardCore.Resources/wwwroot/Scripts/trumbowyg-plugins.min.js
    @@ -1 +1 @@
    -function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}!function(e){"use strict";function t(e){return("0"+parseInt(e).toString(16)).slice(-2)}function o(e){return-1===e.search("rgb")?e.replace("#",""):"rgba(0, 0, 0, 0)"===e||null==(e=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/))?"transparent":t(e[1])+t(e[2])+t(e[3])}e.extend(!0,e.trumbowyg,{langs:{en:{foreColor:"Text color",backColor:"Background color",foreColorRemove:"Remove text color",backColorRemove:"Remove background color"},az:{foreColor:"Yazı rəngi",backColor:"Arxa plan rəngi",foreColorRemove:"Yazı rəngini sil",backColorRemove:"Arxa plan rəngini sil"},by:{foreColor:"Колер тэксту",backColor:"Колер фону тэксту",foreColorRemove:"Выдаліць колер тэксту",backColorRemove:"Выдаліць колер фону тэксту"},ca:{foreColor:"Color del text",backColor:"Color del fons",foreColorRemove:"Eliminar color del text",backColorRemove:"Eliminar color del fons"},cs:{foreColor:"Barva textu",backColor:"Barva pozadí"},da:{foreColor:"Tekstfarve",backColor:"Baggrundsfarve"},de:{foreColor:"Textfarbe",backColor:"Hintergrundfarbe"},es:{foreColor:"Color del texto",backColor:"Color del fondo",foreColorRemove:"Eliminar color del texto",backColorRemove:"Eliminar color del fondo"},et:{foreColor:"Teksti värv",backColor:"Taustavärv",foreColorRemove:"Eemalda teksti värv",backColorRemove:"Eemalda taustavärv"},fr:{foreColor:"Couleur du texte",backColor:"Couleur de fond",foreColorRemove:"Supprimer la couleur du texte",backColorRemove:"Supprimer la couleur de fond"},hu:{foreColor:"Betű szín",backColor:"Háttér szín",foreColorRemove:"Betű szín eltávolítása",backColorRemove:"Háttér szín eltávolítása"},ja:{foreColor:"文字色",backColor:"背景色"},ko:{foreColor:"글자색",backColor:"배경색",foreColorRemove:"글자색 지우기",backColorRemove:"배경색 지우기"},nl:{foreColor:"Tekstkleur",backColor:"Achtergrondkleur"},pt_br:{foreColor:"Cor de fonte",backColor:"Cor de fundo"},ru:{foreColor:"Цвет текста",backColor:"Цвет выделения текста",foreColorRemove:"Очистить цвет текста",backColorRemove:"Очистить цвет выделения текста"},sl:{foreColor:"Barva teksta",backColor:"Barva ozadja",foreColorRemove:"Ponastavi barvo teksta",backColorRemove:"Ponastavi barvo ozadja"},sk:{foreColor:"Farba textu",backColor:"Farba pozadia"},tr:{foreColor:"Yazı rengi",backColor:"Arka plan rengi",foreColorRemove:"Yazı rengini kaldır",backColorRemove:"Arka plan rengini kaldır"},zh_cn:{foreColor:"文字颜色",backColor:"背景颜色"},zh_tw:{foreColor:"文字顏色",backColor:"背景顏色"}}});var a={colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"],foreColorList:null,backColorList:null,allowCustomForeColor:!0,allowCustomBackColor:!0,displayAsList:!1};function n(t,o){var a=[],n=o.o.plugins.colors,r=n[t+"List"]||n.colorList;e.each(r,(function(e,r){var l=t+r,i={fn:t,forceCss:!0,hasIcon:!1,text:o.lang["#"+r]||"#"+r,param:"#"+r,style:"background-color: #"+r+";"};n.displayAsList&&"foreColor"===t&&(i.style="color: #"+r+" !important;"),o.addBtnDef(l,i),a.push(l)}));var l=t+"Remove",i={fn:"removeFormat",hasIcon:!1,param:t,style:"background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);"};if(n.displayAsList&&(i.style=""),o.addBtnDef(l,i),a.push(l),n["allowCustom"+t.charAt(0).toUpperCase()+t.substr(1)]){var s=t+"Free",d={fn:function(){o.openModalInsert(o.lang[t],{color:{label:t,forceCss:!0,type:"color",value:"#FFFFFF"}},(function(e){return o.execCmd(t,e.color),!0}))},hasIcon:!1,text:"#",style:"text-indent: 0; line-height: 20px; padding: 0 5px;"};o.addBtnDef(s,d),a.push(s)}return a}e.extend(!0,e.trumbowyg,{plugins:{color:{init:function(e){e.o.plugins.colors=e.o.plugins.colors||a;var t=e.o.plugins.colors.displayAsList?e.o.prefix+"dropdown--color-list":"",o={dropdown:n("foreColor",e),dropdownClass:t},r={dropdown:n("backColor",e),dropdownClass:t};e.addBtnDef("foreColor",o),e.addBtnDef("backColor",r)},tagHandler:function(e,t){var a,n=[];if(!e.style)return n;if(""!==e.style.backgroundColor){var r=o(e.style.backgroundColor);t.o.plugins.colors.colorList.indexOf(r)>=0?n.push("backColor"+r):n.push("backColorFree")}return""!==e.style.color?a=o(e.style.color):e.hasAttribute("color")&&(a=o(e.getAttribute("color"))),a&&(t.o.plugins.colors.colorList.indexOf(a)>=0?n.push("foreColor"+a):n.push("foreColorFree")),n}}}})}(jQuery),function(e){"use strict";function t(e){return("0"+parseInt(e).toString(16)).slice(-2)}function o(e){return-1===e.search("rgb")?e.replace("#",""):"rgba(0, 0, 0, 0)"===e||null==(e=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/))?"transparent":t(e[1])+t(e[2])+t(e[3])}e.extend(!0,e.trumbowyg,{langs:{en:{foreColor:"Text color",backColor:"Background color",foreColorRemove:"Remove text color",backColorRemove:"Remove background color"},az:{foreColor:"Yazı rəngi",backColor:"Arxa plan rəngi",foreColorRemove:"Yazı rəngini sil",backColorRemove:"Arxa plan rəngini sil"},by:{foreColor:"Колер тэксту",backColor:"Колер фону тэксту",foreColorRemove:"Выдаліць колер тэксту",backColorRemove:"Выдаліць колер фону тэксту"},ca:{foreColor:"Color del text",backColor:"Color del fons",foreColorRemove:"Eliminar color del text",backColorRemove:"Eliminar color del fons"},cs:{foreColor:"Barva textu",backColor:"Barva pozadí"},da:{foreColor:"Tekstfarve",backColor:"Baggrundsfarve"},de:{foreColor:"Textfarbe",backColor:"Hintergrundfarbe"},es:{foreColor:"Color del texto",backColor:"Color del fondo",foreColorRemove:"Eliminar color del texto",backColorRemove:"Eliminar color del fondo"},et:{foreColor:"Teksti värv",backColor:"Taustavärv",foreColorRemove:"Eemalda teksti värv",backColorRemove:"Eemalda taustavärv"},fr:{foreColor:"Couleur du texte",backColor:"Couleur de fond",foreColorRemove:"Supprimer la couleur du texte",backColorRemove:"Supprimer la couleur de fond"},hu:{foreColor:"Betű szín",backColor:"Háttér szín",foreColorRemove:"Betű szín eltávolítása",backColorRemove:"Háttér szín eltávolítása"},ja:{foreColor:"文字色",backColor:"背景色"},ko:{foreColor:"글자색",backColor:"배경색",foreColorRemove:"글자색 지우기",backColorRemove:"배경색 지우기"},nl:{foreColor:"Tekstkleur",backColor:"Achtergrondkleur"},pt_br:{foreColor:"Cor de fonte",backColor:"Cor de fundo"},ru:{foreColor:"Цвет текста",backColor:"Цвет выделения текста",foreColorRemove:"Очистить цвет текста",backColorRemove:"Очистить цвет выделения текста"},sl:{foreColor:"Barva teksta",backColor:"Barva ozadja",foreColorRemove:"Ponastavi barvo teksta",backColorRemove:"Ponastavi barvo ozadja"},sk:{foreColor:"Farba textu",backColor:"Farba pozadia"},tr:{foreColor:"Yazı rengi",backColor:"Arka plan rengi",foreColorRemove:"Yazı rengini kaldır",backColorRemove:"Arka plan rengini kaldır"},zh_cn:{foreColor:"文字颜色",backColor:"背景颜色"},zh_tw:{foreColor:"文字顏色",backColor:"背景顏色"}}});var a={colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"],foreColorList:null,backColorList:null,allowCustomForeColor:!0,allowCustomBackColor:!0,displayAsList:!1};function n(t,o){var a=[],n=o.o.plugins.colors,r=n[t+"List"]||n.colorList;e.each(r,(function(e,r){var l=t+r,i={fn:t,forceCss:!0,hasIcon:!1,text:o.lang["#"+r]||"#"+r,param:"#"+r,style:"background-color: #"+r+";"};n.displayAsList&&"foreColor"===t&&(i.style="color: #"+r+" !important;"),o.addBtnDef(l,i),a.push(l)}));var l=t+"Remove",i={fn:"removeFormat",hasIcon:!1,param:t,style:"background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);"};if(n.displayAsList&&(i.style=""),o.addBtnDef(l,i),a.push(l),n["allowCustom"+t.charAt(0).toUpperCase()+t.substr(1)]){var s=t+"Free",d={fn:function(){o.openModalInsert(o.lang[t],{color:{label:t,forceCss:!0,type:"color",value:"#FFFFFF"}},(function(e){return o.execCmd(t,e.color),!0}))},hasIcon:!1,text:"#",style:"text-indent: 0; line-height: 20px; padding: 0 5px;"};o.addBtnDef(s,d),a.push(s)}return a}e.extend(!0,e.trumbowyg,{plugins:{color:{init:function(e){e.o.plugins.colors=e.o.plugins.colors||a;var t=e.o.plugins.colors.displayAsList?e.o.prefix+"dropdown--color-list":"",o={dropdown:n("foreColor",e),dropdownClass:t},r={dropdown:n("backColor",e),dropdownClass:t};e.addBtnDef("foreColor",o),e.addBtnDef("backColor",r)},tagHandler:function(e,t){var a,n=[];if(!e.style)return n;if(""!==e.style.backgroundColor){var r=o(e.style.backgroundColor);t.o.plugins.colors.colorList.indexOf(r)>=0?n.push("backColor"+r):n.push("backColorFree")}return""!==e.style.color?a=o(e.style.color):e.hasAttribute("color")&&(a=o(e.getAttribute("color"))),a&&(t.o.plugins.colors.colorList.indexOf(a)>=0?n.push("foreColor"+a):n.push("foreColorFree")),n}}}})}(jQuery),function(e){"use strict";var t={allowedTags:[],removableTags:["a","abbr","address","b","bdi","bdo","blockquote","br","cite","code","del","dfn","details","em","h1","h2","h3","h4","h5","h6","hr","i","ins","kbd","mark","meter","pre","progress","q","rp","rt","ruby","s","samp","small","span","strong","sub","summary","sup","time","u","var","wbr","img","map","area","canvas","figcaption","figure","picture","audio","source","track","video","ul","ol","li","dl","dt","dd","table","caption","th","tr","td","thead","tbody","tfoot","col","colgroup","style","div","p","form","input","textarea","button","select","optgroup","option","label","fieldset","legend","datalist","keygen","output","iframe","link","nav","header","hgroup","footer","main","section","article","aside","dialog","script","noscript","embed","object","param"]};e.extend(!0,e.trumbowyg,{plugins:{allowTagsFromPaste:{init:function(o){if(o.o.plugins.allowTagsFromPaste){o.o.removeformatPasted=!1;var a=o.o.plugins.allowTagsFromPaste.allowedTags||t.allowedTags,n=o.o.plugins.allowTagsFromPaste.removableTags||t.removableTags;if(0!==a.length){var r=e(n).not(a).get();o.pasteHandlers.push((function(){setTimeout((function(){var t=o.$ed.html();e.each(r,(function(e,o){t=t.replace(new RegExp("<\\/?"+o+"(\\s[^>]*)?>","gi"),"")})),o.$ed.html(t)}),0)}))}}}}}})}(jQuery),function(e){"use strict";var t={allowedTags:[],removableTags:["a","abbr","address","b","bdi","bdo","blockquote","br","cite","code","del","dfn","details","em","h1","h2","h3","h4","h5","h6","hr","i","ins","kbd","mark","meter","pre","progress","q","rp","rt","ruby","s","samp","small","span","strong","sub","summary","sup","time","u","var","wbr","img","map","area","canvas","figcaption","figure","picture","audio","source","track","video","ul","ol","li","dl","dt","dd","table","caption","th","tr","td","thead","tbody","tfoot","col","colgroup","style","div","p","form","input","textarea","button","select","optgroup","option","label","fieldset","legend","datalist","keygen","output","iframe","link","nav","header","hgroup","footer","main","section","article","aside","dialog","script","noscript","embed","object","param"]};e.extend(!0,e.trumbowyg,{plugins:{allowTagsFromPaste:{init:function(o){if(o.o.plugins.allowTagsFromPaste){o.o.removeformatPasted=!1;var a=o.o.plugins.allowTagsFromPaste.allowedTags||t.allowedTags,n=o.o.plugins.allowTagsFromPaste.removableTags||t.removableTags;if(0!==a.length){var r=e(n).not(a).get();o.pasteHandlers.push((function(){setTimeout((function(){var t=o.$ed.html();e.each(r,(function(e,o){t=t.replace(new RegExp("<\\/?"+o+"(\\s[^>]*)?>","gi"),"")})),o.$ed.html(t)}),0)}))}}}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{cleanPaste:{init:function(t){t.pasteHandlers.push((function(o){setTimeout((function(){try{t.saveRange();var a=(o.originalEvent||o).clipboardData.getData("Text"),n=t.doc.getSelection().focusNode,r=t.doc.createRange(),l=((s=(s=(s=(s=(s=(s=(s=(s=(s=a.trim()).replace(/<[^> ]*/g,(function(e){return e.toLowerCase()})).replace(/<[^>]*>/g,(function(e){return e.replace(/ [^=]+=/g,(function(e){return e.toLowerCase()}))})).replace(/<[^>]*>/g,(function(e){return e.replace(/( [^=]+=)([^"][^ >]*)/g,'$1"$2"')}))).replace(/)/g,")/g,")/g,")/g,"\s*/g,"")).replace(/ /gi," ")).replace(/ <\//gi,"]*>/g,(function(e){return e.replace(/ ([^=]+)="[^"]*"/g,(function(e,t){return-1!==["alt","href","src","title"].indexOf(t)?e:""}))}))).replace(/<\?xml[^>]*>/g,"")).replace(/<[^ >]+:[^>]*>/g,"")).replace(/<\/[^ >]+:[^>]*>/g,"")).replace(/<(div|span|style|meta|link).*?>/gi,"")),i=e(l)[0]||t.doc.createTextNode(l);""===t.$ed.html()?t.$ed[0].appendChild(i):(r.setStartAfter(n),r.setEndAfter(n),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),t.range.insertNode(i)),(r=t.doc.createRange()).setStartAfter(i),r.setEndAfter(i),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),o.stopPropagation(),o.preventDefault(),t.saveRange(),t.syncCode(),t.$c.trigger("tbwchange")}catch(e){}var s}),0)}))}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{cleanPaste:{init:function(t){t.pasteHandlers.push((function(o){setTimeout((function(){try{t.saveRange();var a=(o.originalEvent||o).clipboardData.getData("Text"),n=t.doc.getSelection().focusNode,r=t.doc.createRange(),l=((s=(s=(s=(s=(s=(s=(s=(s=(s=a.trim()).replace(/<[^> ]*/g,(function(e){return e.toLowerCase()})).replace(/<[^>]*>/g,(function(e){return e.replace(/ [^=]+=/g,(function(e){return e.toLowerCase()}))})).replace(/<[^>]*>/g,(function(e){return e.replace(/( [^=]+=)([^"][^ >]*)/g,'$1"$2"')}))).replace(/)/g,")/g,")/g,")/g,"\s*/g,"")).replace(/ /gi," ")).replace(/ <\//gi,"]*>/g,(function(e){return e.replace(/ ([^=]+)="[^"]*"/g,(function(e,t){return-1!==["alt","href","src","title"].indexOf(t)?e:""}))}))).replace(/<\?xml[^>]*>/g,"")).replace(/<[^ >]+:[^>]*>/g,"")).replace(/<\/[^ >]+:[^>]*>/g,"")).replace(/<(div|span|style|meta|link).*?>/gi,"")),i=e(l)[0]||t.doc.createTextNode(l);""===t.$ed.html()?t.$ed[0].appendChild(i):(r.setStartAfter(n),r.setEndAfter(n),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),t.range.insertNode(i)),(r=t.doc.createRange()).setStartAfter(i),r.setEndAfter(i),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),o.stopPropagation(),o.preventDefault(),t.saveRange(),t.syncCode(),t.$c.trigger("tbwchange")}catch(e){}var s}),0)}))}}}})}(jQuery),function(e){"use strict";var t=function(){return"undefined"!=typeof FileReader};e.extend(!0,e.trumbowyg,{langs:{en:{base64:"Image as base64",file:"File",errFileReaderNotSupported:"FileReader is not supported by your browser.",errInvalidImage:"Invalid image file."},az:{base64:"base64 olaraq şəkil",file:"Fayl",errFileReaderNotSupported:"FileReader brauzeriniz tərəfindən dəstəklənmir.",errInvalidImage:"Yanlış şəkil faylı."},by:{base64:"Выява (фармат base64)",file:"Файл",errFileReaderNotSupported:"FileReader не падтрымліваецца вашым браўзэрам.",errInvalidImage:"Несапраўдны файл выявы."},cs:{base64:"Vložit obrázek",file:"Soubor"},da:{base64:"Billede som base64",file:"Fil",errFileReaderNotSupported:"FileReader er ikke understøttet af din browser.",errInvalidImage:"Ugyldig billedfil."},et:{base64:"Pilt base64 formaadis",file:"Fail",errFileReaderNotSupported:"Teie veebilehitseja ei toeta FileReader funktsiooni.",errInvalidImage:"Vigane pildifail."},fr:{base64:"Image en base64",file:"Fichier",errFileReaderNotSupported:"FileReader n'est pas supporté par votre navigateur.",errInvalidImage:"Fichier image invalide."},hu:{base64:"Kép beszúrás inline",file:"Fájl",errFileReaderNotSupported:"Ez a böngésző nem támogatja a FileReader funkciót.",errInvalidImage:"Érvénytelen képfájl."},ja:{base64:"画像 (Base64形式)",file:"ファイル",errFileReaderNotSupported:"あなたのブラウザーはFileReaderをサポートしていません",errInvalidImage:"画像形式が正しくありません"},ko:{base64:"그림 넣기(base64)",file:"파일",errFileReaderNotSupported:"FileReader가 현재 브라우저를 지원하지 않습니다.",errInvalidImage:"유효하지 않은 파일"},nl:{base64:"Afbeelding inline",file:"Bestand",errFileReaderNotSupported:"Uw browser ondersteunt deze functionaliteit niet.",errInvalidImage:"De gekozen afbeelding is ongeldig."},pt_br:{base64:"Imagem em base64",file:"Arquivo",errFileReaderNotSupported:"FileReader não é suportado pelo seu navegador.",errInvalidImage:"Arquivo de imagem inválido."},ru:{base64:"Изображение как код в base64",file:"Файл",errFileReaderNotSupported:"FileReader не поддерживается вашим браузером.",errInvalidImage:"Недопустимый файл изображения."},sl:{base64:"Slika kot base64",file:"Datoteka",errFileReaderNotSupported:"FileReader ni podprt v tem brskalniku.",errInvalidImage:"Neveljavna datoteka s sliko."},tr:{base64:"Base64 olarak resim",file:"Dosya",errFileReaderNotSupported:"FileReader tarayıcınız tarafından desteklenmiyor.",errInvalidImage:"Geçersiz resim dosyası."},zh_cn:{base64:"图片(Base64编码)",file:"文件"},zh_tw:{base64:"圖片(base64編碼)",file:"檔案",errFileReaderNotSupported:"你的瀏覽器不支援FileReader",errInvalidImage:"不正確的檔案格式"}},plugins:{base64:{shouldInit:t,init:function(o){var a={isSupported:t,fn:function(){var t;o.saveRange();var a=o.openModalInsert(o.lang.base64,{file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:o.getRangeText()}},(function(n){var r=new FileReader;r.onloadend=function(t){var l;l=t.target.result,/^data:image\/[a-z]?/i.test(l)?(o.execCmd("insertImage",r.result,!1,!0),e(['img[src="',r.result,'"]:not([alt])'].join(""),o.$box).attr("alt",n.alt),o.closeModal()):o.addErrorOnModalField(e("input[type=file]",a),o.lang.errInvalidImage)},r.readAsDataURL(t)}));e("input[type=file]").on("change",(function(e){t=e.target.files[0]}))}};o.addBtnDef("base64",a)}}}})}(jQuery),function(e){"use strict";var t=function(){return"undefined"!=typeof FileReader};e.extend(!0,e.trumbowyg,{langs:{en:{base64:"Image as base64",file:"File",errFileReaderNotSupported:"FileReader is not supported by your browser.",errInvalidImage:"Invalid image file."},az:{base64:"base64 olaraq şəkil",file:"Fayl",errFileReaderNotSupported:"FileReader brauzeriniz tərəfindən dəstəklənmir.",errInvalidImage:"Yanlış şəkil faylı."},by:{base64:"Выява (фармат base64)",file:"Файл",errFileReaderNotSupported:"FileReader не падтрымліваецца вашым браўзэрам.",errInvalidImage:"Несапраўдны файл выявы."},cs:{base64:"Vložit obrázek",file:"Soubor"},da:{base64:"Billede som base64",file:"Fil",errFileReaderNotSupported:"FileReader er ikke understøttet af din browser.",errInvalidImage:"Ugyldig billedfil."},et:{base64:"Pilt base64 formaadis",file:"Fail",errFileReaderNotSupported:"Teie veebilehitseja ei toeta FileReader funktsiooni.",errInvalidImage:"Vigane pildifail."},fr:{base64:"Image en base64",file:"Fichier",errFileReaderNotSupported:"FileReader n'est pas supporté par votre navigateur.",errInvalidImage:"Fichier image invalide."},hu:{base64:"Kép beszúrás inline",file:"Fájl",errFileReaderNotSupported:"Ez a böngésző nem támogatja a FileReader funkciót.",errInvalidImage:"Érvénytelen képfájl."},ja:{base64:"画像 (Base64形式)",file:"ファイル",errFileReaderNotSupported:"あなたのブラウザーはFileReaderをサポートしていません",errInvalidImage:"画像形式が正しくありません"},ko:{base64:"그림 넣기(base64)",file:"파일",errFileReaderNotSupported:"FileReader가 현재 브라우저를 지원하지 않습니다.",errInvalidImage:"유효하지 않은 파일"},nl:{base64:"Afbeelding inline",file:"Bestand",errFileReaderNotSupported:"Uw browser ondersteunt deze functionaliteit niet.",errInvalidImage:"De gekozen afbeelding is ongeldig."},pt_br:{base64:"Imagem em base64",file:"Arquivo",errFileReaderNotSupported:"FileReader não é suportado pelo seu navegador.",errInvalidImage:"Arquivo de imagem inválido."},ru:{base64:"Изображение как код в base64",file:"Файл",errFileReaderNotSupported:"FileReader не поддерживается вашим браузером.",errInvalidImage:"Недопустимый файл изображения."},sl:{base64:"Slika kot base64",file:"Datoteka",errFileReaderNotSupported:"FileReader ni podprt v tem brskalniku.",errInvalidImage:"Neveljavna datoteka s sliko."},tr:{base64:"Base64 olarak resim",file:"Dosya",errFileReaderNotSupported:"FileReader tarayıcınız tarafından desteklenmiyor.",errInvalidImage:"Geçersiz resim dosyası."},zh_cn:{base64:"图片(Base64编码)",file:"文件"},zh_tw:{base64:"圖片(base64編碼)",file:"檔案",errFileReaderNotSupported:"你的瀏覽器不支援FileReader",errInvalidImage:"不正確的檔案格式"}},plugins:{base64:{shouldInit:t,init:function(o){var a={isSupported:t,fn:function(){var t;o.saveRange();var a=o.openModalInsert(o.lang.base64,{file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:o.getRangeText()}},(function(n){var r=new FileReader;r.onloadend=function(t){var l;l=t.target.result,/^data:image\/[a-z]?/i.test(l)?(o.execCmd("insertImage",r.result,!1,!0),e(['img[src="',r.result,'"]:not([alt])'].join(""),o.$box).attr("alt",n.alt),o.closeModal()):o.addErrorOnModalField(e("input[type=file]",a),o.lang.errInvalidImage)},r.readAsDataURL(t)}));e("input[type=file]").on("change",(function(e){t=e.target.files[0]}))}};o.addBtnDef("base64",a)}}}})}(jQuery),function(e){"use strict";var t={emojiList:["⁉","™","ℹ","↔","↕","↖","↗","↘","↙","⌨","☀","☁","☂","☃","☄","☑","☔","☕","☘","☠","☢","☣","☦","☸","☹","♀","♂","♈","♉","♐","♑","♒","♓","♠","♣","♥","♦","♨","⚒","⚓","⚔","⚕","⚖","⚗","⚙","✂","✅","✈","✉","✒","✔","✖","✡","✨","✳","✴","❄","❇","❓","❔","❕","❗","❣","❤","➕","➖","➗","⤴","⤵","〰","㊗","㊙","😀","😃","😄","😁","😆","😅","😂","🤣","☺","😊","😇","🙂","🙃","😉","😌","🥲","😍","🥰","😘","😗","😙","😚","😋","😛","😝","😜","🤪","🤨","🧐","🤓","😎","🤩","🥳","😏","😒","😞","😔","😟","😕","🙁","😣","😖","😫","😩","🥺","😢","😭","😤","😮","😠","😡","🤬","🤯","😳","😶","🥵","🥶","😱","😨","😰","😥","😓","🤗","🤔","🤭","🥱","🤫","🤥","😐","😑","😬","🙄","😯","😦","😧","😲","😴","🤤","😪","😵","🤐","🥴","🤢","🤮","🤧","😷","🤒","🤕","🤑","🤠","🥸","😈","👿","👹","👺","🤡","💩","👻","💀","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🤲","👐","🙌","👏","🤝","👍","👎","👊","✊","🤛","🤜","🤞","✌","🤟","🤘","👌","🤏","🤌","👈","👉","👆","👇","☝","✋","🤚","🖐","🖖","👋","🤙","💪","🦾","🖕","✍","🙏","🦶","🦵","🦿","💄","💋","👄","🦷","👅","👂","🦻","👃","👣","👁","👀","🧠","🫀","🫁","🦴","🗣","👤","👥","🫂","👶","👧","🧒","👦","👩","🧑","👨","👱","🧔","👵","🧓","👴","👲","👳","🧕","👮","👷","💂","🕵","👰","🤵","👸","🤴","🦸","🦹","🥷","🤶","🎅","🧙","🧝","🧛","🧟","🧞","🧜","🧚","👼","🤰","🤱","🙇","💁","🙅","🙆","🙋","🧏","🤦","🤷","🙎","🙍","💇","💆","🧖","💅","🤳","💃","🕺","👯","🕴","🚶","🧎","🏃","🧍","👫","👭","👬","💑","💏","👪","🧶","🧵","🧥","🥼","🦺","👚","👕","👖","🩲","🩳","👔","👗","👙","🩱","👘","🥻","🥿","👠","👡","👢","👞","👟","🥾","🩴","🧦","🧤","🧣","🎩","🧢","👒","🎓","⛑","🪖","👑","💍","👝","👛","👜","💼","🎒","🧳","👓","🕶","🥽","🌂","🦱","🦰","🦳","🦲","🐶","🐱","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐽","🐸","🐵","🙈","🙉","🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🦆","🦤","🦅","🦉","🦇","🐺","🐗","🐴","🦄","🐝","🐛","🦋","🐌","🪱","🐞","🐜","🪰","🦟","🪳","🪲","🦗","🕷","🕸","🦂","🐢","🐍","🦎","🦖","🦕","🐙","🦑","🦐","🦞","🦀","🐡","🐠","🐟","🦭","🐬","🐳","🐋","🦈","🐊","🐅","🐆","🦓","🦍","🦧","🐘","🦣","🦬","🦛","🦏","🐪","🐫","🦒","🦘","🐃","🐂","🐄","🐎","🐖","🐏","🐑","🦙","🐐","🦌","🐕","🐩","🦮","🐈","🐓","🦃","🦚","🦜","🦢","🦩","🕊","🐇","🦝","🦨","🦡","🦫","🦦","🦥","🐁","🐀","🐿","🦔","🐾","🐉","🐲","🌵","🎄","🌲","🌳","🌴","🌱","🌿","🍀","🎍","🎋","🍃","🍂","🍁","🪶","🍄","🐚","🪨","🪵","🌾","🪴","💐","🌷","🌹","🥀","🌺","🌸","🌼","🌻","🌞","🌝","🌛","🌜","🌚","🌕","🌖","🌗","🌘","🌑","🌒","🌓","🌔","🌙","🌎","🌍","🌏","🪐","💫","⭐","🌟","⚡","💥","🔥","🌪","🌈","🌤","⛅","🌥","🌦","🌧","⛈","🌩","🌨","⛄","🌬","💨","💧","💦","🌊","🌫","🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🫐","🍓","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🫒","🥦","🥬","🫑","🥒","🌶","🌽","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🫓","🥨","🧀","🥚","🍳","🧈","🥞","🧇","🥓","🥩","🍗","🍖","🌭","🍔","🍟","🍕","🥪","🥙","🧆","🌮","🌯","🫔","🥗","🥘","🫕","🥫","🍝","🍜","🍲","🍛","🍣","🍱","🥟","🦪","🍤","🍙","🍚","🍘","🍥","🥠","🥮","🍢","🍡","🍧","🍨","🍦","🥧","🧁","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🌰","🥜","🍯","🥛","🍼","🍵","🫖","🧉","🧋","🧃","🥤","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🍾","🧊","🥄","🍴","🍽","🥣","🥡","🥢","🧂","⚽","🏀","🏈","⚾","🥎","🎾","🏐","🏉","🥏","🪃","🎱","🪀","🏓","🏸","🏒","🏑","🥍","🏏","🥅","⛳","🪁","🏹","🎣","🤿","🥊","🥋","🎽","🛹","🛼","🛷","⛸","🥌","🎿","⛷","🏂","🪂","🏋","🤼","🤸","⛹","🤺","🤾","🏌","🏇","🧘","🏄","🏊","🤽","🚣","🧗","🚵","🚴","🏆","🥇","🥈","🥉","🏅","🎖","🏵","🎗","🎫","🎟","🎪","🤹","🎭","🩰","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🪘","🎷","🎺","🎸","🪕","🎻","🪗","🎲","♟","🎯","🎳","🎮","🎰","🧩","🚗","🚕","🚙","🛻","🚌","🚎","🏎","🚓","🚑","🚒","🚐","🚚","🚛","🚜","🦯","🦽","🦼","🛴","🚲","🛵","🏍","🛺","🚨","🚔","🚍","🚘","🚖","🚡","🚠","🚟","🚃","🚋","🚞","🚝","🚄","🚅","🚈","🚂","🚆","🚇","🚊","🚉","🛫","🛬","🛩","💺","🛰","🚀","🛸","🚁","🛶","⛵","🚤","🛥","🛳","⛴","🚢","⛽","🚧","🚦","🚥","🚏","🗺","🗿","🗽","🗼","🏰","🏯","🏟","🎡","🎢","🎠","⛲","⛱","🏖","🏝","🏜","🌋","⛰","🏔","🗻","🏕","⛺","🏠","🏡","🏘","🏚","🛖","🏗","🏭","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","🏛","⛪","🕌","🕍","🛕","🕋","⛩","🛤","🛣","🗾","🎑","🏞","🌅","🌄","🌠","🎇","🎆","🌇","🌆","🏙","🌃","🌌","🌉","🌁","⌚","📱","📲","💻","🖥","🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽","🎞","📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","🧭","⏱","⏲","⏰","🕰","⌛","⏳","📡","🔋","🔌","💡","🔦","🕯","🪔","🧯","🛢","💸","💵","💴","💶","💷","🪙","💰","💳","💎","🪜","🧰","🪛","🔧","🔨","🛠","⛏","🔩","🧱","⛓","🪝","🪢","🧲","🔫","💣","🧨","🪓","🪚","🔪","🗡","🛡","🚬","⚰","🪦","⚱","🏺","🪄","🔮","📿","🧿","💈","🔭","🔬","🕳","🪟","🩹","🩺","💊","💉","🩸","🧬","🦠","🧫","🧪","🌡","🪤","🧹","🧺","🪡","🧻","🚽","🪠","🪣","🚰","🚿","🛁","🛀","🪥","🧼","🪒","🧽","🧴","🛎","🔑","🗝","🚪","🪑","🪞","🛋","🛏","🛌","🧸","🖼","🛍","🛒","🎁","🎈","🎏","🎀","🎊","🎉","🪅","🪆","🎎","🏮","🎐","🧧","📩","📨","📧","💌","📥","📤","📦","🏷","📪","📫","📬","📭","📮","📯","🪧","📜","📃","📄","📑","🧾","📊","📈","📉","🗒","🗓","📆","📅","🗑","📇","🗃","🗳","🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒","📕","📗","📘","📙","📚","📖","🔖","🧷","🔗","📎","🖇","📐","📏","🧮","📌","📍","🖊","🖋","🖌","🖍","📝","✏","🔍","🔎","🔏","🔐","🔒","🔓","🧡","💛","💚","💙","💜","🖤","🤎","🤍","💔","💕","💞","💓","💗","💖","💘","💝","💟","☮","✝","☪","🕉","🔯","🕎","☯","🛐","⛎","♊","♋","♌","♍","♎","♏","🆔","⚛","🉑","📴","📳","🈶","🈚","🈸","🈺","🈷","🆚","💮","🉐","🈴","🈵","🈹","🈲","🅰","🅱","🆎","🆑","🅾","🆘","❌","⭕","🛑","⛔","📛","🚫","💯","💢","🚷","🚯","🚳","🚱","🔞","📵","🚭","‼","🔅","🔆","〽","⚠","🚸","🔱","⚜","🔰","♻","🈯","💹","❎","🌐","💠","Ⓜ","🌀","💤","🏧","🚾","♿","🅿","🈳","🈂","🛂","🛃","🛄","🛅","🛗","🚹","🚺","🚼","🚻","🚮","🎦","📶","🈁","🔣","🔤","🔡","🔠","🆖","🆗","🆙","🆒","🆕","🆓","0","1","2","3","4","5","6","7","8","9","🔟","🔢","#","*","⏏","▶","⏸","⏯","⏹","⏺","⏭","⏮","⏩","⏪","⏫","⏬","◀","🔼","🔽","➡","⬅","⬆","⬇","↪","↩","🔀","🔁","🔂","🔄","🔃","🎵","🎶","♾","💲","💱","©","®","➰","➿","🔚","🔙","🔛","🔝","🔜","🔘","⚪","⚫","🔴","🔵","🟤","🟣","🟢","🟡","🟠","🔺","🔻","🔸","🔹","🔶","🔷","🔳","🔲","▪","▫","◾","◽","◼","◻","⬛","⬜","🟧","🟦","🟥","🟫","🟪","🟩","🟨","🔈","🔇","🔉","🔊","🔔","🔕","📣","📢","🗨","💬","💭","🗯","🃏","🎴","🀄","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧","⚧","🏳","🏴","🏁","🚩","🇦","🇩","🇧","🇮","🇻","🇰","🇨","🇹","🇭","🇪","🇸","🇬","🇫","🇵","🇯","🎌","🇽","🇱","🇲","🇾","🇳","🇴","🇶","🇷","🇼","🇿","🇺","🏻","🏼","🏽","🏾","🏿"]};function o(t){var o=[];return e.each(t.o.plugins.emoji.emojiList,(function(a,n){if(e.isArray(n)){var r=n[0],l=n[1],i=''+r+'',s="emoji-"+r.replace(/:/g,""),d={hasIcon:!1,text:i,fn:function(){return t.execCmd("insertImage",l,!1,!0),!0}};t.addBtnDef(s,d),o.push(s)}else{var x="emoji-"+n.replace(/:/g,""),F={text:n,fn:function(){var e=String.fromCodePoint(n.replace("&#","0"));return t.execCmd("insertText",e),!0}};t.addBtnDef(x,F),o.push(x)}})),o}e.extend(!0,e.trumbowyg,{langs:{en:{emoji:"Add an emoji"},az:{emoji:"Emoji yerləşdir"},ca:{emoji:"Afegir una emoticona"},da:{emoji:"Tilføj et humørikon"},de:{emoji:"Emoticon einfügen"},es:{emoji:"Añadir un emoticono"},et:{emoji:"Lisa emotikon"},fr:{emoji:"Ajouter un emoji"},hu:{emoji:"Emoji beszúrás"},ja:{emoji:"絵文字の挿入"},ko:{emoji:"이모지 넣기"},ru:{emoji:"Вставить emoji"},sl:{emoji:"Vstavi emotikon"},tr:{emoji:"Emoji ekle"},zh_cn:{emoji:"添加表情"}},plugins:{emoji:{init:function(e){e.o.plugins.emoji=e.o.plugins.emoji||t;var a={dropdown:o(e)};e.addBtnDef("emoji",a)}}}})}(jQuery),function(e){"use strict";var t={emojiList:["⁉","™","ℹ","↔","↕","↖","↗","↘","↙","⌨","☀","☁","☂","☃","☄","☑","☔","☕","☘","☠","☢","☣","☦","☸","☹","♀","♂","♈","♉","♐","♑","♒","♓","♠","♣","♥","♦","♨","⚒","⚓","⚔","⚕","⚖","⚗","⚙","✂","✅","✈","✉","✒","✔","✖","✡","✨","✳","✴","❄","❇","❓","❔","❕","❗","❣","❤","➕","➖","➗","⤴","⤵","〰","㊗","㊙","😀","😃","😄","😁","😆","😅","😂","🤣","☺","😊","😇","🙂","🙃","😉","😌","🥲","😍","🥰","😘","😗","😙","😚","😋","😛","😝","😜","🤪","🤨","🧐","🤓","😎","🤩","🥳","😏","😒","😞","😔","😟","😕","🙁","😣","😖","😫","😩","🥺","😢","😭","😤","😮","😠","😡","🤬","🤯","😳","😶","🥵","🥶","😱","😨","😰","😥","😓","🤗","🤔","🤭","🥱","🤫","🤥","😐","😑","😬","🙄","😯","😦","😧","😲","😴","🤤","😪","😵","🤐","🥴","🤢","🤮","🤧","😷","🤒","🤕","🤑","🤠","🥸","😈","👿","👹","👺","🤡","💩","👻","💀","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🤲","👐","🙌","👏","🤝","👍","👎","👊","✊","🤛","🤜","🤞","✌","🤟","🤘","👌","🤏","🤌","👈","👉","👆","👇","☝","✋","🤚","🖐","🖖","👋","🤙","💪","🦾","🖕","✍","🙏","🦶","🦵","🦿","💄","💋","👄","🦷","👅","👂","🦻","👃","👣","👁","👀","🧠","🫀","🫁","🦴","🗣","👤","👥","🫂","👶","👧","🧒","👦","👩","🧑","👨","👱","🧔","👵","🧓","👴","👲","👳","🧕","👮","👷","💂","🕵","👰","🤵","👸","🤴","🦸","🦹","🥷","🤶","🎅","🧙","🧝","🧛","🧟","🧞","🧜","🧚","👼","🤰","🤱","🙇","💁","🙅","🙆","🙋","🧏","🤦","🤷","🙎","🙍","💇","💆","🧖","💅","🤳","💃","🕺","👯","🕴","🚶","🧎","🏃","🧍","👫","👭","👬","💑","💏","👪","🧶","🧵","🧥","🥼","🦺","👚","👕","👖","🩲","🩳","👔","👗","👙","🩱","👘","🥻","🥿","👠","👡","👢","👞","👟","🥾","🩴","🧦","🧤","🧣","🎩","🧢","👒","🎓","⛑","🪖","👑","💍","👝","👛","👜","💼","🎒","🧳","👓","🕶","🥽","🌂","🦱","🦰","🦳","🦲","🐶","🐱","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐽","🐸","🐵","🙈","🙉","🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🦆","🦤","🦅","🦉","🦇","🐺","🐗","🐴","🦄","🐝","🐛","🦋","🐌","🪱","🐞","🐜","🪰","🦟","🪳","🪲","🦗","🕷","🕸","🦂","🐢","🐍","🦎","🦖","🦕","🐙","🦑","🦐","🦞","🦀","🐡","🐠","🐟","🦭","🐬","🐳","🐋","🦈","🐊","🐅","🐆","🦓","🦍","🦧","🐘","🦣","🦬","🦛","🦏","🐪","🐫","🦒","🦘","🐃","🐂","🐄","🐎","🐖","🐏","🐑","🦙","🐐","🦌","🐕","🐩","🦮","🐈","🐓","🦃","🦚","🦜","🦢","🦩","🕊","🐇","🦝","🦨","🦡","🦫","🦦","🦥","🐁","🐀","🐿","🦔","🐾","🐉","🐲","🌵","🎄","🌲","🌳","🌴","🌱","🌿","🍀","🎍","🎋","🍃","🍂","🍁","🪶","🍄","🐚","🪨","🪵","🌾","🪴","💐","🌷","🌹","🥀","🌺","🌸","🌼","🌻","🌞","🌝","🌛","🌜","🌚","🌕","🌖","🌗","🌘","🌑","🌒","🌓","🌔","🌙","🌎","🌍","🌏","🪐","💫","⭐","🌟","⚡","💥","🔥","🌪","🌈","🌤","⛅","🌥","🌦","🌧","⛈","🌩","🌨","⛄","🌬","💨","💧","💦","🌊","🌫","🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🫐","🍓","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🫒","🥦","🥬","🫑","🥒","🌶","🌽","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🫓","🥨","🧀","🥚","🍳","🧈","🥞","🧇","🥓","🥩","🍗","🍖","🌭","🍔","🍟","🍕","🥪","🥙","🧆","🌮","🌯","🫔","🥗","🥘","🫕","🥫","🍝","🍜","🍲","🍛","🍣","🍱","🥟","🦪","🍤","🍙","🍚","🍘","🍥","🥠","🥮","🍢","🍡","🍧","🍨","🍦","🥧","🧁","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🌰","🥜","🍯","🥛","🍼","🍵","🫖","🧉","🧋","🧃","🥤","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🍾","🧊","🥄","🍴","🍽","🥣","🥡","🥢","🧂","⚽","🏀","🏈","⚾","🥎","🎾","🏐","🏉","🥏","🪃","🎱","🪀","🏓","🏸","🏒","🏑","🥍","🏏","🥅","⛳","🪁","🏹","🎣","🤿","🥊","🥋","🎽","🛹","🛼","🛷","⛸","🥌","🎿","⛷","🏂","🪂","🏋","🤼","🤸","⛹","🤺","🤾","🏌","🏇","🧘","🏄","🏊","🤽","🚣","🧗","🚵","🚴","🏆","🥇","🥈","🥉","🏅","🎖","🏵","🎗","🎫","🎟","🎪","🤹","🎭","🩰","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🪘","🎷","🎺","🎸","🪕","🎻","🪗","🎲","♟","🎯","🎳","🎮","🎰","🧩","🚗","🚕","🚙","🛻","🚌","🚎","🏎","🚓","🚑","🚒","🚐","🚚","🚛","🚜","🦯","🦽","🦼","🛴","🚲","🛵","🏍","🛺","🚨","🚔","🚍","🚘","🚖","🚡","🚠","🚟","🚃","🚋","🚞","🚝","🚄","🚅","🚈","🚂","🚆","🚇","🚊","🚉","🛫","🛬","🛩","💺","🛰","🚀","🛸","🚁","🛶","⛵","🚤","🛥","🛳","⛴","🚢","⛽","🚧","🚦","🚥","🚏","🗺","🗿","🗽","🗼","🏰","🏯","🏟","🎡","🎢","🎠","⛲","⛱","🏖","🏝","🏜","🌋","⛰","🏔","🗻","🏕","⛺","🏠","🏡","🏘","🏚","🛖","🏗","🏭","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","🏛","⛪","🕌","🕍","🛕","🕋","⛩","🛤","🛣","🗾","🎑","🏞","🌅","🌄","🌠","🎇","🎆","🌇","🌆","🏙","🌃","🌌","🌉","🌁","⌚","📱","📲","💻","🖥","🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽","🎞","📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","🧭","⏱","⏲","⏰","🕰","⌛","⏳","📡","🔋","🔌","💡","🔦","🕯","🪔","🧯","🛢","💸","💵","💴","💶","💷","🪙","💰","💳","💎","🪜","🧰","🪛","🔧","🔨","🛠","⛏","🔩","🧱","⛓","🪝","🪢","🧲","🔫","💣","🧨","🪓","🪚","🔪","🗡","🛡","🚬","⚰","🪦","⚱","🏺","🪄","🔮","📿","🧿","💈","🔭","🔬","🕳","🪟","🩹","🩺","💊","💉","🩸","🧬","🦠","🧫","🧪","🌡","🪤","🧹","🧺","🪡","🧻","🚽","🪠","🪣","🚰","🚿","🛁","🛀","🪥","🧼","🪒","🧽","🧴","🛎","🔑","🗝","🚪","🪑","🪞","🛋","🛏","🛌","🧸","🖼","🛍","🛒","🎁","🎈","🎏","🎀","🎊","🎉","🪅","🪆","🎎","🏮","🎐","🧧","📩","📨","📧","💌","📥","📤","📦","🏷","📪","📫","📬","📭","📮","📯","🪧","📜","📃","📄","📑","🧾","📊","📈","📉","🗒","🗓","📆","📅","🗑","📇","🗃","🗳","🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒","📕","📗","📘","📙","📚","📖","🔖","🧷","🔗","📎","🖇","📐","📏","🧮","📌","📍","🖊","🖋","🖌","🖍","📝","✏","🔍","🔎","🔏","🔐","🔒","🔓","🧡","💛","💚","💙","💜","🖤","🤎","🤍","💔","💕","💞","💓","💗","💖","💘","💝","💟","☮","✝","☪","🕉","🔯","🕎","☯","🛐","⛎","♊","♋","♌","♍","♎","♏","🆔","⚛","🉑","📴","📳","🈶","🈚","🈸","🈺","🈷","🆚","💮","🉐","🈴","🈵","🈹","🈲","🅰","🅱","🆎","🆑","🅾","🆘","❌","⭕","🛑","⛔","📛","🚫","💯","💢","🚷","🚯","🚳","🚱","🔞","📵","🚭","‼","🔅","🔆","〽","⚠","🚸","🔱","⚜","🔰","♻","🈯","💹","❎","🌐","💠","Ⓜ","🌀","💤","🏧","🚾","♿","🅿","🈳","🈂","🛂","🛃","🛄","🛅","🛗","🚹","🚺","🚼","🚻","🚮","🎦","📶","🈁","🔣","🔤","🔡","🔠","🆖","🆗","🆙","🆒","🆕","🆓","0","1","2","3","4","5","6","7","8","9","🔟","🔢","#","*","⏏","▶","⏸","⏯","⏹","⏺","⏭","⏮","⏩","⏪","⏫","⏬","◀","🔼","🔽","➡","⬅","⬆","⬇","↪","↩","🔀","🔁","🔂","🔄","🔃","🎵","🎶","♾","💲","💱","©","®","➰","➿","🔚","🔙","🔛","🔝","🔜","🔘","⚪","⚫","🔴","🔵","🟤","🟣","🟢","🟡","🟠","🔺","🔻","🔸","🔹","🔶","🔷","🔳","🔲","▪","▫","◾","◽","◼","◻","⬛","⬜","🟧","🟦","🟥","🟫","🟪","🟩","🟨","🔈","🔇","🔉","🔊","🔔","🔕","📣","📢","🗨","💬","💭","🗯","🃏","🎴","🀄","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧","⚧","🏳","🏴","🏁","🚩","🇦","🇩","🇧","🇮","🇻","🇰","🇨","🇹","🇭","🇪","🇸","🇬","🇫","🇵","🇯","🎌","🇽","🇱","🇲","🇾","🇳","🇴","🇶","🇷","🇼","🇿","🇺","🏻","🏼","🏽","🏾","🏿"]};function o(t){var o=[];return e.each(t.o.plugins.emoji.emojiList,(function(a,n){if(e.isArray(n)){var r=n[0],l=n[1],i=''+r+'',s="emoji-"+r.replace(/:/g,""),d={hasIcon:!1,text:i,fn:function(){return t.execCmd("insertImage",l,!1,!0),!0}};t.addBtnDef(s,d),o.push(s)}else{var x="emoji-"+n.replace(/:/g,""),F={text:n,fn:function(){var e=String.fromCodePoint(n.replace("&#","0"));return t.execCmd("insertText",e),!0}};t.addBtnDef(x,F),o.push(x)}})),o}e.extend(!0,e.trumbowyg,{langs:{en:{emoji:"Add an emoji"},az:{emoji:"Emoji yerləşdir"},ca:{emoji:"Afegir una emoticona"},da:{emoji:"Tilføj et humørikon"},de:{emoji:"Emoticon einfügen"},es:{emoji:"Añadir un emoticono"},et:{emoji:"Lisa emotikon"},fr:{emoji:"Ajouter un emoji"},hu:{emoji:"Emoji beszúrás"},ja:{emoji:"絵文字の挿入"},ko:{emoji:"이모지 넣기"},ru:{emoji:"Вставить emoji"},sl:{emoji:"Vstavi emotikon"},tr:{emoji:"Emoji ekle"},zh_cn:{emoji:"添加表情"}},plugins:{emoji:{init:function(e){e.o.plugins.emoji=e.o.plugins.emoji||t;var a={dropdown:o(e)};e.addBtnDef("emoji",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{fontFamily:"Font"},az:{fontFamily:"Şrift"},by:{fontFamily:"Шрыфт"},ca:{fontFamily:"Font"},da:{fontFamily:"Skrifttype"},de:{fontFamily:"Schriftart"},es:{fontFamily:"Fuente"},et:{fontFamily:"Font"},fr:{fontFamily:"Police"},hu:{fontFamily:"Betűtípus"},ko:{fontFamily:"글꼴"},nl:{fontFamily:"Lettertype"},pt_br:{fontFamily:"Fonte"},ru:{fontFamily:"Шрифт"},sl:{fontFamily:"Pisava"},tr:{fontFamily:"Yazı tipi"},zh_tw:{fontFamily:"字體"}}});var t={fontList:[{name:"Arial",family:"Arial, Helvetica, sans-serif"},{name:"Arial Black",family:"Arial Black, Gadget, sans-serif"},{name:"Comic Sans",family:"Comic Sans MS, Textile, cursive, sans-serif"},{name:"Courier New",family:"Courier New, Courier, monospace"},{name:"Georgia",family:"Georgia, serif"},{name:"Impact",family:"Impact, Charcoal, sans-serif"},{name:"Lucida Console",family:"Lucida Console, Monaco, monospace"},{name:"Lucida Sans",family:"Lucida Sans Uncide, Lucida Grande, sans-serif"},{name:"Palatino",family:"Palatino Linotype, Book Antiqua, Palatino, serif"},{name:"Tahoma",family:"Tahoma, Geneva, sans-serif"},{name:"Times New Roman",family:"Times New Roman, Times, serif"},{name:"Trebuchet",family:"Trebuchet MS, Helvetica, sans-serif"},{name:"Verdana",family:"Verdana, Geneva, sans-serif"}]};function o(t){var o=[];return e.each(t.o.plugins.fontfamily.fontList,(function(e,a){t.addBtnDef("fontfamily_"+e,{title:''+a.name+"",hasIcon:!1,fn:function(){t.execCmd("fontName",a.family,!0)}}),o.push("fontfamily_"+e)})),o}e.extend(!0,e.trumbowyg,{plugins:{fontfamily:{init:function(a){a.o.plugins.fontfamily=e.extend({},t,a.o.plugins.fontfamily||{}),a.addBtnDef("fontfamily",{dropdown:o(a),hasIcon:!1,text:a.lang.fontFamily})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{fontFamily:"Font"},az:{fontFamily:"Şrift"},by:{fontFamily:"Шрыфт"},ca:{fontFamily:"Font"},da:{fontFamily:"Skrifttype"},de:{fontFamily:"Schriftart"},es:{fontFamily:"Fuente"},et:{fontFamily:"Font"},fr:{fontFamily:"Police"},hu:{fontFamily:"Betűtípus"},ko:{fontFamily:"글꼴"},nl:{fontFamily:"Lettertype"},pt_br:{fontFamily:"Fonte"},ru:{fontFamily:"Шрифт"},sl:{fontFamily:"Pisava"},tr:{fontFamily:"Yazı tipi"},zh_tw:{fontFamily:"字體"}}});var t={fontList:[{name:"Arial",family:"Arial, Helvetica, sans-serif"},{name:"Arial Black",family:"Arial Black, Gadget, sans-serif"},{name:"Comic Sans",family:"Comic Sans MS, Textile, cursive, sans-serif"},{name:"Courier New",family:"Courier New, Courier, monospace"},{name:"Georgia",family:"Georgia, serif"},{name:"Impact",family:"Impact, Charcoal, sans-serif"},{name:"Lucida Console",family:"Lucida Console, Monaco, monospace"},{name:"Lucida Sans",family:"Lucida Sans Uncide, Lucida Grande, sans-serif"},{name:"Palatino",family:"Palatino Linotype, Book Antiqua, Palatino, serif"},{name:"Tahoma",family:"Tahoma, Geneva, sans-serif"},{name:"Times New Roman",family:"Times New Roman, Times, serif"},{name:"Trebuchet",family:"Trebuchet MS, Helvetica, sans-serif"},{name:"Verdana",family:"Verdana, Geneva, sans-serif"}]};function o(t){var o=[];return e.each(t.o.plugins.fontfamily.fontList,(function(e,a){t.addBtnDef("fontfamily_"+e,{title:''+a.name+"",hasIcon:!1,fn:function(){t.execCmd("fontName",a.family,!0)}}),o.push("fontfamily_"+e)})),o}e.extend(!0,e.trumbowyg,{plugins:{fontfamily:{init:function(a){a.o.plugins.fontfamily=e.extend({},t,a.o.plugins.fontfamily||{}),a.addBtnDef("fontfamily",{dropdown:o(a),hasIcon:!1,text:a.lang.fontFamily})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{fontsize:"Font size",fontsizes:{"x-small":"Extra small",small:"Small",medium:"Regular",large:"Large","x-large":"Extra large",custom:"Custom"},fontCustomSize:{title:"Custom Font Size",label:"Font Size",value:"48px"}},az:{fontsize:"Şrift həcmi",fontsizes:{"x-small":"Daha kiçik",small:"Kiçik",medium:"Normal",large:"Böyük","x-large":"Daha böyük",custom:"Fərdi həcm"},fontCustomSize:{title:"Fərdi şrift həcmi",label:"Şrift həcmi",value:"48px"}},by:{fontsize:"Памер шрыфта",fontsizes:{"x-small":"Вельмі маленькі",small:"Маленькі",medium:"Звычайны",large:"Вялікі","x-large":"Вельмі вялікі",custom:"Карыстальніцкі"},fontCustomSize:{title:"Карыстальніцкі Памер Шрыфта",label:"Памер Шрыфта",value:"48px"}},ca:{fontsize:"Mida de la lletra",fontsizes:{"x-small":"Molt petita",small:"Petita",medium:"Normal",large:"Gran","x-large":"Molt Gran",custom:"Personalitzada"},fontCustomSize:{title:"Mida de lletra personalitzada",label:"Mida de lletra",value:"48px"}},da:{fontsize:"Skriftstørrelse",fontsizes:{"x-small":"Ekstra lille",small:"Lille",medium:"Normal",large:"Stor","x-large":"Ekstra stor",custom:"Brugerdefineret"}},de:{fontsize:"Schriftgröße",fontsizes:{"x-small":"Sehr klein",small:"Klein",medium:"Normal",large:"Groß","x-large":"Sehr groß",custom:"Benutzerdefiniert"},fontCustomSize:{title:"Benutzerdefinierte Schriftgröße",label:"Schriftgröße",value:"48px"}},es:{fontsize:"Tamaño de Fuente",fontsizes:{"x-small":"Extra pequeña",small:"Pegueña",medium:"Regular",large:"Grande","x-large":"Extra Grande",custom:"Customizada"},fontCustomSize:{title:"Tamaño de Fuente Customizada",label:"Tamaño de Fuente",value:"48px"}},et:{fontsize:"Teksti suurus",fontsizes:{"x-small":"Väga väike",small:"Väike",medium:"Tavaline",large:"Suur","x-large":"Väga suur",custom:"Määra ise"},fontCustomSize:{title:"Kohandatud teksti suurus",label:"Teksti suurus",value:"48px"}},fr:{fontsize:"Taille de la police",fontsizes:{"x-small":"Très petit",small:"Petit",medium:"Normal",large:"Grand","x-large":"Très grand",custom:"Taille personnalisée"},fontCustomSize:{title:"Taille de police personnalisée",label:"Taille de la police",value:"48px"}},hu:{fontsize:"Betű méret",fontsizes:{"x-small":"Extra kicsi",small:"Kicsi",medium:"Normális",large:"Nagy","x-large":"Extra nagy",custom:"Egyedi"},fontCustomSize:{title:"Egyedi betű méret",label:"Betű méret",value:"48px"}},it:{fontsize:"Dimensioni del testo",fontsizes:{"x-small":"Molto piccolo",small:"piccolo",regular:"normale",large:"grande","x-large":"Molto grande",custom:"Personalizzato"},fontCustomSize:{title:"Dimensioni del testo personalizzato",label:"Dimensioni del testo",value:"48px"}},ko:{fontsize:"글꼴 크기",fontsizes:{"x-small":"아주 작게",small:"작게",medium:"보통",large:"크게","x-large":"아주 크게",custom:"사용자 지정"},fontCustomSize:{title:"사용자 지정 글꼴 크기",label:"글꼴 크기",value:"48px"}},nl:{fontsize:"Lettergrootte",fontsizes:{"x-small":"Extra klein",small:"Klein",medium:"Normaal",large:"Groot","x-large":"Extra groot",custom:"Handmatig"},fontCustomSize:{title:"Handmatige lettergrootte",label:"Lettergrootte",value:"48px"}},pt_br:{fontsize:"Tamanho da fonte",fontsizes:{"x-small":"Extra pequeno",small:"Pequeno",regular:"Médio",large:"Grande","x-large":"Extra grande",custom:"Personalizado"},fontCustomSize:{title:"Tamanho de Fonte Personalizado",label:"Tamanho de Fonte",value:"48px"}},ru:{fontsize:"Размер шрифта",fontsizes:{"x-small":"Очень маленький",small:"Маленький",medium:"Обычный",large:"Большой","x-large":"Очень большой",custom:"Пользовательский"},fontCustomSize:{title:"Пользовательский Размер Шрифта",label:"Размер Шрифта",value:"48px"}},sl:{fontsize:"Velikost pisave",fontsizes:{"x-small":"Ekstra majhna",small:"Majhna",medium:"Navadno",large:"Velika","x-large":"Ekstra velika",custom:"Poljubna"},fontCustomSize:{title:"Poljubna velikost pisave",label:"Velikost pisave",value:"48px"}},tr:{fontsize:"Yazı boyutu",fontsizes:{"x-small":"Çok küçük",small:"Küçük",medium:"Normal",large:"Büyük","x-large":"Çok büyük",custom:"Özel"},fontCustomSize:{title:"Özel Yazı Boyutu",label:"Yazı Boyutu",value:"48px"}},zh_tw:{fontsize:"字體大小",fontsizes:{"x-small":"最小",small:"小",medium:"中",large:"大","x-large":"最大",custom:"自訂大小"},fontCustomSize:{title:"自訂義字體大小",label:"字體大小",value:"48px"}}}});var t={sizeList:["x-small","small","medium","large","x-large"],allowCustomSize:!0};function o(t,o){t.$ed.focus(),t.saveRange(),t.execCmd("fontSize","1");var a=t.$ed.find('font[size="1"]');a.find('span[style*="font-size"]').contents().unwrap(),a.replaceWith((function(){return e("",{css:{"font-size":o},html:this.innerHTML})})),e(t.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(),t.restoreRange(),t.syncCode(),t.$c.trigger("tbwchange")}function a(t){var a=[];if(e.each(t.o.plugins.fontsize.sizeList,(function(e,n){t.addBtnDef("fontsize_"+n,{text:''+(t.lang.fontsizes[n]||n)+"",hasIcon:!1,fn:function(){o(t,n)}}),a.push("fontsize_"+n)})),t.o.plugins.fontsize.allowCustomSize){var n="fontsize_custom",r={fn:function(){t.openModalInsert(t.lang.fontCustomSize.title,{size:{label:t.lang.fontCustomSize.label,value:t.lang.fontCustomSize.value}},(function(e){return o(t,e.size),!0}))},text:''+t.lang.fontsizes.custom+"",hasIcon:!1};t.addBtnDef(n,r),a.push(n)}return a}e.extend(!0,e.trumbowyg,{plugins:{fontsize:{init:function(o){o.o.plugins.fontsize=e.extend({},t,o.o.plugins.fontsize||{}),o.addBtnDef("fontsize",{dropdown:a(o)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{fontsize:"Font size",fontsizes:{"x-small":"Extra small",small:"Small",medium:"Regular",large:"Large","x-large":"Extra large",custom:"Custom"},fontCustomSize:{title:"Custom Font Size",label:"Font Size",value:"48px"}},az:{fontsize:"Şrift həcmi",fontsizes:{"x-small":"Daha kiçik",small:"Kiçik",medium:"Normal",large:"Böyük","x-large":"Daha böyük",custom:"Fərdi həcm"},fontCustomSize:{title:"Fərdi şrift həcmi",label:"Şrift həcmi",value:"48px"}},by:{fontsize:"Памер шрыфта",fontsizes:{"x-small":"Вельмі маленькі",small:"Маленькі",medium:"Звычайны",large:"Вялікі","x-large":"Вельмі вялікі",custom:"Карыстальніцкі"},fontCustomSize:{title:"Карыстальніцкі Памер Шрыфта",label:"Памер Шрыфта",value:"48px"}},ca:{fontsize:"Mida de la lletra",fontsizes:{"x-small":"Molt petita",small:"Petita",medium:"Normal",large:"Gran","x-large":"Molt Gran",custom:"Personalitzada"},fontCustomSize:{title:"Mida de lletra personalitzada",label:"Mida de lletra",value:"48px"}},da:{fontsize:"Skriftstørrelse",fontsizes:{"x-small":"Ekstra lille",small:"Lille",medium:"Normal",large:"Stor","x-large":"Ekstra stor",custom:"Brugerdefineret"}},de:{fontsize:"Schriftgröße",fontsizes:{"x-small":"Sehr klein",small:"Klein",medium:"Normal",large:"Groß","x-large":"Sehr groß",custom:"Benutzerdefiniert"},fontCustomSize:{title:"Benutzerdefinierte Schriftgröße",label:"Schriftgröße",value:"48px"}},es:{fontsize:"Tamaño de Fuente",fontsizes:{"x-small":"Extra pequeña",small:"Pegueña",medium:"Regular",large:"Grande","x-large":"Extra Grande",custom:"Customizada"},fontCustomSize:{title:"Tamaño de Fuente Customizada",label:"Tamaño de Fuente",value:"48px"}},et:{fontsize:"Teksti suurus",fontsizes:{"x-small":"Väga väike",small:"Väike",medium:"Tavaline",large:"Suur","x-large":"Väga suur",custom:"Määra ise"},fontCustomSize:{title:"Kohandatud teksti suurus",label:"Teksti suurus",value:"48px"}},fr:{fontsize:"Taille de la police",fontsizes:{"x-small":"Très petit",small:"Petit",medium:"Normal",large:"Grand","x-large":"Très grand",custom:"Taille personnalisée"},fontCustomSize:{title:"Taille de police personnalisée",label:"Taille de la police",value:"48px"}},hu:{fontsize:"Betű méret",fontsizes:{"x-small":"Extra kicsi",small:"Kicsi",medium:"Normális",large:"Nagy","x-large":"Extra nagy",custom:"Egyedi"},fontCustomSize:{title:"Egyedi betű méret",label:"Betű méret",value:"48px"}},it:{fontsize:"Dimensioni del testo",fontsizes:{"x-small":"Molto piccolo",small:"piccolo",regular:"normale",large:"grande","x-large":"Molto grande",custom:"Personalizzato"},fontCustomSize:{title:"Dimensioni del testo personalizzato",label:"Dimensioni del testo",value:"48px"}},ko:{fontsize:"글꼴 크기",fontsizes:{"x-small":"아주 작게",small:"작게",medium:"보통",large:"크게","x-large":"아주 크게",custom:"사용자 지정"},fontCustomSize:{title:"사용자 지정 글꼴 크기",label:"글꼴 크기",value:"48px"}},nl:{fontsize:"Lettergrootte",fontsizes:{"x-small":"Extra klein",small:"Klein",medium:"Normaal",large:"Groot","x-large":"Extra groot",custom:"Handmatig"},fontCustomSize:{title:"Handmatige lettergrootte",label:"Lettergrootte",value:"48px"}},pt_br:{fontsize:"Tamanho da fonte",fontsizes:{"x-small":"Extra pequeno",small:"Pequeno",regular:"Médio",large:"Grande","x-large":"Extra grande",custom:"Personalizado"},fontCustomSize:{title:"Tamanho de Fonte Personalizado",label:"Tamanho de Fonte",value:"48px"}},ru:{fontsize:"Размер шрифта",fontsizes:{"x-small":"Очень маленький",small:"Маленький",medium:"Обычный",large:"Большой","x-large":"Очень большой",custom:"Пользовательский"},fontCustomSize:{title:"Пользовательский Размер Шрифта",label:"Размер Шрифта",value:"48px"}},sl:{fontsize:"Velikost pisave",fontsizes:{"x-small":"Ekstra majhna",small:"Majhna",medium:"Navadno",large:"Velika","x-large":"Ekstra velika",custom:"Poljubna"},fontCustomSize:{title:"Poljubna velikost pisave",label:"Velikost pisave",value:"48px"}},tr:{fontsize:"Yazı boyutu",fontsizes:{"x-small":"Çok küçük",small:"Küçük",medium:"Normal",large:"Büyük","x-large":"Çok büyük",custom:"Özel"},fontCustomSize:{title:"Özel Yazı Boyutu",label:"Yazı Boyutu",value:"48px"}},zh_tw:{fontsize:"字體大小",fontsizes:{"x-small":"最小",small:"小",medium:"中",large:"大","x-large":"最大",custom:"自訂大小"},fontCustomSize:{title:"自訂義字體大小",label:"字體大小",value:"48px"}}}});var t={sizeList:["x-small","small","medium","large","x-large"],allowCustomSize:!0};function o(t,o){t.$ed.focus(),t.saveRange(),t.execCmd("fontSize","1");var a=t.$ed.find('font[size="1"]');a.find('span[style*="font-size"]').contents().unwrap(),a.replaceWith((function(){return e("",{css:{"font-size":o},html:this.innerHTML})})),e(t.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(),t.restoreRange(),t.syncCode(),t.$c.trigger("tbwchange")}function a(t){var a=[];if(e.each(t.o.plugins.fontsize.sizeList,(function(e,n){t.addBtnDef("fontsize_"+n,{text:''+(t.lang.fontsizes[n]||n)+"",hasIcon:!1,fn:function(){o(t,n)}}),a.push("fontsize_"+n)})),t.o.plugins.fontsize.allowCustomSize){var n="fontsize_custom",r={fn:function(){t.openModalInsert(t.lang.fontCustomSize.title,{size:{label:t.lang.fontCustomSize.label,value:t.lang.fontCustomSize.value}},(function(e){return o(t,e.size),!0}))},text:''+t.lang.fontsizes.custom+"",hasIcon:!1};t.addBtnDef(n,r),a.push(n)}return a}e.extend(!0,e.trumbowyg,{plugins:{fontsize:{init:function(o){o.o.plugins.fontsize=e.extend({},t,o.o.plugins.fontsize||{}),o.addBtnDef("fontsize",{dropdown:a(o)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{history:{destroy:function(e){e.$c.off("tbwinit.history tbwchange.history")},init:function(t){t.o.plugins.history=e.extend(!0,{_stack:[],_index:-1,_focusEl:void 0},t.o.plugins.history||{});var o={title:t.lang.redo,ico:"redo",key:"Y",fn:function(){if(t.o.plugins.history._index0){t.o.plugins.history._index-=1;var e=t.o.plugins.history._index,o=t.o.plugins.history._stack[e];t.execCmd("html",o),t.o.plugins.history._stack[e]=t.$ed.html(),i(),n()}}},n=function(){var e=t.o.plugins.history._index,o=t.o.plugins.history._stack.length,a=0!==o&&e!==o-1;r("historyUndo",e>0),r("historyRedo",a)},r=function(e,o){var a=t.$box.find(".trumbowyg-"+e+"-button");o?a.removeClass("trumbowyg-disable"):a.hasClass("trumbowyg-disable")||a.addClass("trumbowyg-disable")},l=function(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;for(var o=0;o0&&(o.setStartAfter(e.childNodes[e.childNodes.length-1]),o.setEndAfter(e.childNodes[e.childNodes.length-1]),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(o))};t.$c.on("tbwinit.history tbwchange.history",(function(){var o,a,r=t.o.plugins.history._index,i=t.o.plugins.history._stack,s=i.slice(-1)[0]||"

    ",d=i[r],x=t.$ed.html(),F=t.doc.getSelection().focusNode,u="",c=t.o.plugins.history._focusEl;o=e("
    "+s+"
    ").find("*").map((function(){return this.localName})),a=e("
    "+x+"
    ").find("*").map((function(){return this.localName})),F&&(t.o.plugins.history._focusEl=F,u=F.outerHTML||F.textContent),x!==d&&(u.slice(-1).match(/\s/)||!l(o,a)||t.o.plugins.history._index<=0||F!==c?(t.o.plugins.history._index+=1,t.o.plugins.history._stack=i.slice(0,t.o.plugins.history._index),t.o.plugins.history._stack.push(x)):t.o.plugins.history._stack[r]=x,n())})),t.addBtnDef("historyRedo",o),t.addBtnDef("historyUndo",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{history:{destroy:function(e){e.$c.off("tbwinit.history tbwchange.history")},init:function(t){t.o.plugins.history=e.extend(!0,{_stack:[],_index:-1,_focusEl:void 0},t.o.plugins.history||{});var o={title:t.lang.redo,ico:"redo",key:"Y",fn:function(){if(t.o.plugins.history._index0){t.o.plugins.history._index-=1;var e=t.o.plugins.history._index,o=t.o.plugins.history._stack[e];t.execCmd("html",o),t.o.plugins.history._stack[e]=t.$ed.html(),l(),n()}}},n=function(){var e=t.o.plugins.history._index,o=t.o.plugins.history._stack.length,a=0!==o&&e!==o-1;r("historyUndo",e>0),r("historyRedo",a)},r=function(e,o){var a=t.$box.find(".trumbowyg-"+e+"-button");o?a.removeClass("trumbowyg-disable"):a.hasClass("trumbowyg-disable")||a.addClass("trumbowyg-disable")},l=function(){var e=t.doc.getSelection().focusNode,o=t.doc.createRange();e.childNodes.length>0&&(o.setStartAfter(e.childNodes[e.childNodes.length-1]),o.setEndAfter(e.childNodes[e.childNodes.length-1]),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(o))};t.$c.on("tbwinit.history tbwchange.history",(function(){var o,a,r=t.o.plugins.history._index,l=t.o.plugins.history._stack,i=l.slice(-1)[0]||"

    ",s=l[r],d=t.$ed.html(),x=t.doc.getSelection().focusNode,F="",u=t.o.plugins.history._focusEl;o=e("
    "+i+"
    ").find("*").map((function(){return this.localName})),a=e("
    "+d+"
    ").find("*").map((function(){return this.localName})),x&&(t.o.plugins.history._focusEl=x,F=x.outerHTML||x.textContent),d!==s&&(F.slice(-1).match(/\s/)||!function(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;for(var o=0;o'+("'+a+'')+""})).join("");if(!0===n){if(0===l.length){if(e("."+a.o.prefix+"giphy-no-result",o).length>0)return;l=''}o.empty()}o.append(l);var i=function(e){e.classList.add("tbw-loaded")};e("img",o).each((function(){var e=this;e.complete?i(e):e.addEventListener("load",(function(){i(this)}))})),e("img",o).on("click",(function(){var t=e(this).attr("src"),n=e(this).attr("alt");(a.restoreRange(),a.execCmd("insertImage",t,!1,!0),n)&&(e('img[src="'+t+'"]:not([alt])',a.$box).attr("alt",n),a.syncCode());e("img",o).off(),a.closeModal()}))}var a={rating:"g",apiKey:null,throttleDelay:300,noResultGifUrl:"https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif"};e.extend(!0,e.trumbowyg,{plugins:{giphy:{init:function(n){n.o.plugins.giphy=e.extend({},a,n.o.plugins.giphy||{}),n.addBtnDef("giphy",{fn:function(){if(null===n.o.plugins.giphy.apiKey)throw new Error("You must set a Giphy API Key");var a="https://api.giphy.com/v1/gifs/search?api_key="+n.o.plugins.giphy.apiKey+"&rating="+n.o.plugins.giphy.rating,r=a.replace("/search","/trending"),l={abort:function(){}},i=n.o.prefix,s=''+('')+('
    Powered by
    ')+'
    ';n.openModal(null,s,!1).one(t,(function(){try{l.abort()}catch(e){}n.closeModal()}));var d=e("."+i+"giphy-search"),x=e("."+i+"giphy-close"),F=e("."+i+"giphy-modal"),u=function(){navigator.onLine||e("."+i+"giphy-offline",F).length||(F.empty(),F.append('

    You are offline

    '))};e.ajax({url:r,dataType:"json",success:function(e){o(e,F,n,!0)},error:u});var c,f,m,p,g=(c=function(){var t=d.val();if(0!==t.length){try{l.abort()}catch(e){}l=e.ajax({url:a+"&q="+encodeURIComponent(t),dataType:"json",success:function(e){o(e,F,n,!0)},error:u})}},f=n.o.plugins.giphy.throttleDelay,function(){var e=this,t=+new Date,o=arguments;m&&t'+a+''})).join("");if(!0===n){if(0===l.length){if(e("."+a.o.prefix+"giphy-no-result",o).length>0)return;l=''}o.empty()}o.append(l);var i=function(e){e.classList.add("tbw-loaded")};e("img",o).each((function(){var e=this;e.complete?i(e):e.addEventListener("load",(function(){i(this)}))})),e("img",o).on("click",(function(){var t=e(this).attr("src"),n=e(this).attr("alt");a.restoreRange(),a.execCmd("insertImage",t,!1,!0),n&&(e('img[src="'+t+'"]:not([alt])',a.$box).attr("alt",n),a.syncCode()),e("img",o).off(),a.closeModal()}))}var a={rating:"g",apiKey:null,throttleDelay:300,noResultGifUrl:"https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif"};e.extend(!0,e.trumbowyg,{plugins:{giphy:{init:function(n){n.o.plugins.giphy=e.extend({},a,n.o.plugins.giphy||{}),n.addBtnDef("giphy",{fn:function(){if(null===n.o.plugins.giphy.apiKey)throw new Error("You must set a Giphy API Key");var a="https://api.giphy.com/v1/gifs/search?api_key="+n.o.plugins.giphy.apiKey+"&rating="+n.o.plugins.giphy.rating,r=a.replace("/search","/trending"),l={abort:function(){}},i=n.o.prefix,s='
    Powered by
    ';n.openModal(null,s,!1).one(t,(function(){try{l.abort()}catch(e){}n.closeModal()}));var d=e("."+i+"giphy-search"),x=e("."+i+"giphy-close"),F=e("."+i+"giphy-modal"),u=function(){navigator.onLine||e("."+i+"giphy-offline",F).length||(F.empty(),F.append('

    You are offline

    '))};e.ajax({url:r,dataType:"json",success:function(e){o(e,F,n,!0)},error:u});var c,f,m,p,g=(c=function(){var t=d.val();if(0!==t.length){try{l.abort()}catch(e){}l=e.ajax({url:a+"&q="+encodeURIComponent(t),dataType:"json",success:function(e){o(e,F,n,!0)},error:u})}},f=n.o.plugins.giphy.throttleDelay,function(){var e=this,t=+new Date,o=arguments;m&&t")[0];return o.range.deleteContents(),o.range.insertNode(n),!0}))}};o.addBtnDef("insertAudio",a)}}}})}(jQuery),function(e){"use strict";var t={src:{label:"URL",required:!0},autoplay:{label:"AutoPlay",required:!1,type:"checkbox"},muted:{label:"Muted",required:!1,type:"checkbox"},preload:{label:"preload options",required:!1}};e.extend(!0,e.trumbowyg,{langs:{en:{insertAudio:"Insert Audio"},az:{insertAudio:"Səs yerləşdir"},by:{insertAudio:"Уставіць аўдыё"},ca:{insertAudio:"Inserir Audio"},da:{insertAudio:"Indsæt lyd"},es:{insertAudio:"Insertar Audio"},et:{insertAudio:"Lisa helifail"},fr:{insertAudio:"Insérer un son"},hu:{insertAudio:"Audio beszúrás"},ja:{insertAudio:"音声の挿入"},ko:{insertAudio:"소리 넣기"},pt_br:{insertAudio:"Inserir áudio"},ru:{insertAudio:"Вставить аудио"},sl:{insertAudio:"Vstavi zvočno datoteko"},tr:{insertAudio:"Ses Ekle"}},plugins:{insertAudio:{init:function(o){var a={fn:function(){o.openModalInsert(o.lang.insertAudio,t,(function(t){var a="")[0];return o.range.deleteContents(),o.range.insertNode(n),!0}))}};o.addBtnDef("insertAudio",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},az:{lineheight:"Sətir yüksəkliyi",lineheights:{.9:"Kiçik",normal:"Normal",1.5:"Böyük","2.0":"Daha böyük"}},by:{lineheight:"Міжрадковы інтэрвал",lineheights:{.9:"Маленькі",normal:"Звычайны",1.5:"Вялікі","2.0":"Вельмі вялікі"}},da:{lineheight:"Linjehøjde",lineheights:{.9:"Lille",normal:"Normal",1.5:"Stor","2.0":"Ekstra stor"}},et:{lineheight:"Reavahe",lineheights:{.9:"Väike",normal:"Tavaline",1.5:"Suur","2.0":"Väga suur"}},fr:{lineheight:"Hauteur de ligne",lineheights:{.9:"Petite",normal:"Normale",1.5:"Grande","2.0":"Très grande"}},hu:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},it:{lineheight:"Altezza linea",lineheights:{.9:"Bassa",normal:"Normale",1.5:"Alta","2.0":"Molto alta"}},ko:{lineheight:"줄 간격",lineheights:{.9:"좁게",normal:"보통",1.5:"넓게","2.0":"아주 넓게"}},nl:{lineheight:"Regelhoogte",lineheights:{.9:"Klein",normal:"Normaal",1.5:"Groot","2.0":"Extra groot"}},pt_br:{lineheight:"Altura de linha",lineheights:{.9:"Pequena",normal:"Regular",1.5:"Grande","2.0":"Extra grande"}},ru:{lineheight:"Межстрочный интервал",lineheights:{.9:"Маленький",normal:"Обычный",1.5:"Большой","2.0":"Очень большой"}},sl:{lineheight:"Višina vrstice",lineheights:{.9:"Majhna",normal:"Navadna",1.5:"Velika","2.0":"Ekstra velika"}},tr:{lineheight:"Satır yüksekliği",lineheights:{.9:"Küçük",normal:"Normal",1.5:"Büyük","2.0":"Çok Büyük"}},zh_tw:{lineheight:"文字間距",lineheights:{.9:"小",normal:"正常",1.5:"大","2.0":"特大"}}}});var t={sizeList:["0.9","normal","1.5","2.0"]};function o(t){var o=[];return e.each(t.o.plugins.lineheight.sizeList,(function(a,n){t.addBtnDef("lineheight_"+n,{text:t.lang.lineheights[n]||n,hasIcon:!1,fn:function(){if(t.saveRange(),""!==t.getRangeText().replace(/\s/g,""))try{var o=function(){var e,t=null;window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement());return t}();e(o).css("lineHeight",n)}catch(e){}}}),o.push("lineheight_"+n)})),o}e.extend(!0,e.trumbowyg,{plugins:{lineheight:{init:function(a){a.o.plugins.lineheight=e.extend({},t,a.o.plugins.lineheight||{}),a.addBtnDef("lineheight",{dropdown:o(a)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},az:{lineheight:"Sətir yüksəkliyi",lineheights:{.9:"Kiçik",normal:"Normal",1.5:"Böyük","2.0":"Daha böyük"}},by:{lineheight:"Міжрадковы інтэрвал",lineheights:{.9:"Маленькі",normal:"Звычайны",1.5:"Вялікі","2.0":"Вельмі вялікі"}},da:{lineheight:"Linjehøjde",lineheights:{.9:"Lille",normal:"Normal",1.5:"Stor","2.0":"Ekstra stor"}},et:{lineheight:"Reavahe",lineheights:{.9:"Väike",normal:"Tavaline",1.5:"Suur","2.0":"Väga suur"}},fr:{lineheight:"Hauteur de ligne",lineheights:{.9:"Petite",normal:"Normale",1.5:"Grande","2.0":"Très grande"}},hu:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},it:{lineheight:"Altezza linea",lineheights:{.9:"Bassa",normal:"Normale",1.5:"Alta","2.0":"Molto alta"}},ko:{lineheight:"줄 간격",lineheights:{.9:"좁게",normal:"보통",1.5:"넓게","2.0":"아주 넓게"}},nl:{lineheight:"Regelhoogte",lineheights:{.9:"Klein",normal:"Normaal",1.5:"Groot","2.0":"Extra groot"}},pt_br:{lineheight:"Altura de linha",lineheights:{.9:"Pequena",normal:"Regular",1.5:"Grande","2.0":"Extra grande"}},ru:{lineheight:"Межстрочный интервал",lineheights:{.9:"Маленький",normal:"Обычный",1.5:"Большой","2.0":"Очень большой"}},sl:{lineheight:"Višina vrstice",lineheights:{.9:"Majhna",normal:"Navadna",1.5:"Velika","2.0":"Ekstra velika"}},tr:{lineheight:"Satır yüksekliği",lineheights:{.9:"Küçük",normal:"Normal",1.5:"Büyük","2.0":"Çok Büyük"}},zh_tw:{lineheight:"文字間距",lineheights:{.9:"小",normal:"正常",1.5:"大","2.0":"特大"}}}});var t={sizeList:["0.9","normal","1.5","2.0"]};function o(t){var o=[];return e.each(t.o.plugins.lineheight.sizeList,(function(a,n){t.addBtnDef("lineheight_"+n,{text:t.lang.lineheights[n]||n,hasIcon:!1,fn:function(){if(t.saveRange(),""!==t.getRangeText().replace(/\s/g,""))try{var o=function(){var e,t=null;return window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement()),t}();e(o).css("lineHeight",n)}catch(e){}}}),o.push("lineheight_"+n)})),o}e.extend(!0,e.trumbowyg,{plugins:{lineheight:{init:function(a){a.o.plugins.lineheight=e.extend({},t,a.o.plugins.lineheight||{}),a.addBtnDef("lineheight",{dropdown:o(a)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{mathml:"Insert Formulas",formulas:"Formulas",inline:"Inline"},az:{mathml:"Düstur əlavə et",formulas:"Düsturlar",inline:"Sətir içi"},by:{mathml:"Уставіць формулу",formulas:"Формула",inline:"Inline-элемент"},ca:{mathml:"Inserir Fórmula",formulas:"Fórmula",inline:"En línia"},da:{mathml:"Indsæt formler",formulas:"Formler",inline:"Inline"},es:{mathml:"Insertar Fórmula",formulas:"Fórmula",inline:"En línea"},et:{mathml:"Sisesta valem",formulas:"Valemid",inline:"Teksti sees"},fr:{mathml:"Inserer une formule",formulas:"Formule",inline:"En ligne"},hu:{mathml:"Formulák beszúrás",formulas:"Formulák",inline:"Inline"},ko:{mathml:"수식 넣기",formulas:"수식",inline:"글 안에 넣기"},pt_br:{mathml:"Inserir fórmulas",formulas:"Fórmulas",inline:"Em linha"},ru:{mathml:"Вставить формулу",formulas:"Формула",inline:"Строчный элемент"},sl:{mathml:"Vstavi matematični izraz",formulas:"Formula",inline:"V vrstici"},tr:{mathml:"Formül Ekle",formulas:"Formüller",inline:"Satır içi"},zh_tw:{mathml:"插入方程式",formulas:"方程式",inline:"內嵌"}},plugins:{mathml:{init:function(t){var o={formulas:{label:t.lang.formulas,required:!0,value:""},inline:{label:t.lang.inline,attributes:{checked:!0},type:"checkbox",required:!1}},a=function(o){var a=o.inline?"$":"$$";if(t.currentMathNode)e(t.currentMathNode).html(a+" "+o.formulas+" "+a).attr("formulas",o.formulas).attr("inline",o.inline?"true":"false");else{var r=''+a+" "+o.formulas+" "+a+"",l=e(r)[0];l.onclick=n,t.range.deleteContents(),t.range.insertNode(l)}return t.currentMathNode=!1,MathJax.Hub.Queue(["Typeset",MathJax.Hub]),!0},n=function(){t.currentMathNode=this,o.formulas.value=e(this).attr("formulas"),"true"===e(this).attr("inline")?o.inline.attributes.checked=!0:delete o.inline.attributes.checked,t.openModalInsert(t.lang.mathml,o,a)},r={fn:function(){t.saveRange(),o.formulas.value=t.getRangeText(),o.inline.attributes.checked=!0,t.openModalInsert(t.lang.mathml,o,a)}};t.$ta.on("tbwinit",(function(){t.$ed.find("[formulas]").each((function(e,t){t.onclick=n}))})),t.addBtnDef("mathml",r)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{mathml:"Insert Formulas",formulas:"Formulas",inline:"Inline"},az:{mathml:"Düstur əlavə et",formulas:"Düsturlar",inline:"Sətir içi"},by:{mathml:"Уставіць формулу",formulas:"Формула",inline:"Inline-элемент"},ca:{mathml:"Inserir Fórmula",formulas:"Fórmula",inline:"En línia"},da:{mathml:"Indsæt formler",formulas:"Formler",inline:"Inline"},es:{mathml:"Insertar Fórmula",formulas:"Fórmula",inline:"En línea"},et:{mathml:"Sisesta valem",formulas:"Valemid",inline:"Teksti sees"},fr:{mathml:"Inserer une formule",formulas:"Formule",inline:"En ligne"},hu:{mathml:"Formulák beszúrás",formulas:"Formulák",inline:"Inline"},ko:{mathml:"수식 넣기",formulas:"수식",inline:"글 안에 넣기"},pt_br:{mathml:"Inserir fórmulas",formulas:"Fórmulas",inline:"Em linha"},ru:{mathml:"Вставить формулу",formulas:"Формула",inline:"Строчный элемент"},sl:{mathml:"Vstavi matematični izraz",formulas:"Formula",inline:"V vrstici"},tr:{mathml:"Formül Ekle",formulas:"Formüller",inline:"Satır içi"},zh_tw:{mathml:"插入方程式",formulas:"方程式",inline:"內嵌"}},plugins:{mathml:{init:function(t){var o={formulas:{label:t.lang.formulas,required:!0,value:""},inline:{label:t.lang.inline,attributes:{checked:!0},type:"checkbox",required:!1}},a=function(o){var a=o.inline?"$":"$$";if(t.currentMathNode)e(t.currentMathNode).html(a+" "+o.formulas+" "+a).attr("formulas",o.formulas).attr("inline",o.inline?"true":"false");else{var r=''+a+" "+o.formulas+" "+a+"",l=e(r)[0];l.onclick=n,t.range.deleteContents(),t.range.insertNode(l)}return t.currentMathNode=!1,MathJax.Hub.Queue(["Typeset",MathJax.Hub]),!0},n=function(){t.currentMathNode=this,o.formulas.value=e(this).attr("formulas"),"true"===e(this).attr("inline")?o.inline.attributes.checked=!0:delete o.inline.attributes.checked,t.openModalInsert(t.lang.mathml,o,a)},r={fn:function(){t.saveRange(),o.formulas.value=t.getRangeText(),o.inline.attributes.checked=!0,t.openModalInsert(t.lang.mathml,o,a)}};t.$ta.on("tbwinit",(function(){t.$ed.find("[formulas]").each((function(e,t){t.onclick=n}))})),t.addBtnDef("mathml",r)}}}})}(jQuery),function(e){"use strict";var t={source:[],formatDropdownItem:function(e){return e.login},formatResult:function(e){return"@"+e.login+" "}};function o(t,o){var a=[];return e.each(t,(function(e,t){var n="mention-"+e,r={hasIcon:!1,text:o.o.plugins.mention.formatDropdownItem(t),fn:function(){return o.execCmd("insertHTML",o.o.plugins.mention.formatResult(t)),!0}};o.addBtnDef(n,r),a.push(n)})),a}e.extend(!0,e.trumbowyg,{langs:{en:{mention:"Mention"},az:{mention:"Bildirmək"},by:{mention:"Згадаць"},da:{mention:"Nævn"},et:{mention:"Maini"},fr:{mention:"Mentionner"},hu:{mention:"Említ"},ko:{mention:"언급"},pt_br:{mention:"Menção"},ru:{mention:"Упомянуть"},sl:{mention:"Omeni"},tr:{mention:"Bahset"},zh_tw:{mention:"標記"}},plugins:{mention:{init:function(a){a.o.plugins.mention=e.extend(!0,{},t,a.o.plugins.mention||{});var n={dropdown:o(a.o.plugins.mention.source,a)};a.addBtnDef("mention",n)}}}})}(jQuery),function(e){"use strict";var t={source:[],formatDropdownItem:function(e){return e.login},formatResult:function(e){return"@"+e.login+" "}};function o(t,o){var a=[];return e.each(t,(function(e,t){var n="mention-"+e,r={hasIcon:!1,text:o.o.plugins.mention.formatDropdownItem(t),fn:function(){return o.execCmd("insertHTML",o.o.plugins.mention.formatResult(t)),!0}};o.addBtnDef(n,r),a.push(n)})),a}e.extend(!0,e.trumbowyg,{langs:{en:{mention:"Mention"},az:{mention:"Bildirmək"},by:{mention:"Згадаць"},da:{mention:"Nævn"},et:{mention:"Maini"},fr:{mention:"Mentionner"},hu:{mention:"Említ"},ko:{mention:"언급"},pt_br:{mention:"Menção"},ru:{mention:"Упомянуть"},sl:{mention:"Omeni"},tr:{mention:"Bahset"},zh_tw:{mention:"標記"}},plugins:{mention:{init:function(a){a.o.plugins.mention=e.extend(!0,{},t,a.o.plugins.mention||{});var n={dropdown:o(a.o.plugins.mention.source,a)};a.addBtnDef("mention",n)}}}})}(jQuery),function(e){"use strict";var t={enabled:!0,endpoints:["https://noembed.com/embed?nowrap=on","https://api.maxmade.nl/url2iframe/embed"]};e.extend(!0,e.trumbowyg,{plugins:{pasteEmbed:{init:function(o){o.o.plugins.pasteEmbed=e.extend(!0,{},t,o.o.plugins.pasteEmbed||{}),o.o.plugins.pasteEmbed.enabled&&o.pasteHandlers.push((function(t){try{var a=(t.originalEvent||t).clipboardData.getData("Text"),n=o.o.plugins.pasteEmbed.endpoints,r=null;if(a.startsWith("http")){t.stopPropagation(),t.preventDefault();var l={url:a.trim()},i="",s=0;r&&r.transport&&r.transport.abort(),r=e.ajax({crossOrigin:!0,url:n[s],type:"GET",data:l,cache:!1,dataType:"jsonp",success:function(e){e.html?(s=0,i=e.html):s+=1},error:function(){s+=1},complete:function(){0===i.length&&s",{href:a,text:a}).prop("outerHTML")),i.length>0&&(s=0,o.execCmd("insertHTML",i))}})}}catch(e){}}))}}}})}(jQuery),function(e){"use strict";var t={enabled:!0,endpoints:["https://noembed.com/embed?nowrap=on","https://api.maxmade.nl/url2iframe/embed"]};e.extend(!0,e.trumbowyg,{plugins:{pasteEmbed:{init:function(o){o.o.plugins.pasteEmbed=e.extend(!0,{},t,o.o.plugins.pasteEmbed||{}),o.o.plugins.pasteEmbed.enabled&&o.pasteHandlers.push((function(t){try{var a=(t.originalEvent||t).clipboardData.getData("Text"),n=o.o.plugins.pasteEmbed.endpoints,r=null;if(a.startsWith("http")){t.stopPropagation(),t.preventDefault();var l={url:a.trim()},i="",s=0;r&&r.transport&&r.transport.abort(),r=e.ajax({crossOrigin:!0,url:n[s],type:"GET",data:l,cache:!1,dataType:"jsonp",success:function(e){e.html?(s=0,i=e.html):s+=1},error:function(){s+=1},complete:function(){0===i.length&&s",{href:a,text:a}).prop("outerHTML")),i.length>0&&(s=0,o.execCmd("insertHTML",i))}})}}catch(e){}}))}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{pasteImage:{init:function(e){e.pasteHandlers.push((function(t){try{for(var o,a=(t.originalEvent||t).clipboardData.items,n=!1,r=a.length-1;r>=0;r-=1)a[r].type.match(/^image\//)&&((o=new FileReader).onloadend=function(t){e.execCmd("insertImage",t.target.result,!1,!0)},o.readAsDataURL(a[r].getAsFile()),n=!0);n&&(t.stopPropagation(),t.preventDefault())}catch(e){}}))}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{pasteImage:{init:function(e){e.pasteHandlers.push((function(t){try{for(var o,a=(t.originalEvent||t).clipboardData.items,n=!1,r=a.length-1;r>=0;r-=1)a[r].type.match(/^image\//)&&((o=new FileReader).onloadend=function(t){e.execCmd("insertImage",t.target.result,!1,!0)},o.readAsDataURL(a[r].getAsFile()),n=!0);n&&(t.stopPropagation(),t.preventDefault())}catch(e){}}))}}}})}(jQuery),function(e){"use strict";var t={proxy:"https://noembed.com/embed?nowrap=on",urlFiled:"url",data:[],success:void 0,error:void 0};e.extend(!0,e.trumbowyg,{langs:{en:{noembed:"Noembed",noembedError:"Error"},az:{noembed:"Noembed",noembedError:"Xəta"},by:{noembedError:"Памылка"},cs:{noembedError:"Chyba"},da:{noembedError:"Fejl"},et:{noembed:"Noembed",noembedError:"Viga"},fr:{noembedError:"Erreur"},hu:{noembed:"Noembed",noembedError:"Hiba"},ja:{noembedError:"エラー"},ko:{noembed:"oEmbed 넣기",noembedError:"에러"},pt_br:{noembed:"Incorporar",noembedError:"Erro"},ru:{noembedError:"Ошибка"},sl:{noembed:"Noembed",noembedError:"Napaka"},sk:{noembedError:"Chyba"},tr:{noembedError:"Hata"},zh_tw:{noembed:"插入影片",noembedError:"錯誤"}},plugins:{noembed:{init:function(o){o.o.plugins.noembed=e.extend(!0,{},t,o.o.plugins.noembed||{});var a={fn:function(){var t=o.openModalInsert(o.lang.noembed,{url:{label:"URL",required:!0}},(function(a){e.ajax({url:o.o.plugins.noembed.proxy,type:"GET",data:a,cache:!1,dataType:"json",success:function(a){o.o.plugins.noembed.success?o.o.plugins.noembed.success(a,o,t):a.html?(o.execCmd("insertHTML",a.html),setTimeout((function(){o.closeModal()}),250)):o.addErrorOnModalField(e("input[type=text]",t),a.error)},error:o.o.plugins.noembed.error||function(){o.addErrorOnModalField(e("input[type=text]",t),o.lang.noembedError)}})}))}};o.addBtnDef("noembed",a)}}}})}(jQuery),function(e){"use strict";var t={proxy:"https://noembed.com/embed?nowrap=on",urlFiled:"url",data:[],success:void 0,error:void 0};e.extend(!0,e.trumbowyg,{langs:{en:{noembed:"Noembed",noembedError:"Error"},az:{noembed:"Noembed",noembedError:"Xəta"},by:{noembedError:"Памылка"},cs:{noembedError:"Chyba"},da:{noembedError:"Fejl"},et:{noembed:"Noembed",noembedError:"Viga"},fr:{noembedError:"Erreur"},hu:{noembed:"Noembed",noembedError:"Hiba"},ja:{noembedError:"エラー"},ko:{noembed:"oEmbed 넣기",noembedError:"에러"},pt_br:{noembed:"Incorporar",noembedError:"Erro"},ru:{noembedError:"Ошибка"},sl:{noembed:"Noembed",noembedError:"Napaka"},sk:{noembedError:"Chyba"},tr:{noembedError:"Hata"},zh_tw:{noembed:"插入影片",noembedError:"錯誤"}},plugins:{noembed:{init:function(o){o.o.plugins.noembed=e.extend(!0,{},t,o.o.plugins.noembed||{});var a={fn:function(){var t=o.openModalInsert(o.lang.noembed,{url:{label:"URL",required:!0}},(function(a){e.ajax({url:o.o.plugins.noembed.proxy,type:"GET",data:a,cache:!1,dataType:"json",success:function(a){o.o.plugins.noembed.success?o.o.plugins.noembed.success(a,o,t):a.html?(o.execCmd("insertHTML",a.html),setTimeout((function(){o.closeModal()}),250)):o.addErrorOnModalField(e("input[type=text]",t),a.error)},error:o.o.plugins.noembed.error||function(){o.addErrorOnModalField(e("input[type=text]",t),o.lang.noembedError)}})}))}};o.addBtnDef("noembed",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{preformatted:"Code sample
    "},az:{preformatted:"Kod nümunəsi 
    "},by:{preformatted:"Прыклад кода 
    "},da:{preformatted:"Præformateret 
    "},et:{preformatted:"Eelvormindatud tekst 
    "},fr:{preformatted:"Exemple de code 
    "},hu:{preformatted:"Kód minta 
    "},it:{preformatted:"Codice 
    "},ja:{preformatted:"コードサンプル 
    "},ko:{preformatted:"코드 예제 
    "},pt_br:{preformatted:"Exemple de código 
    "},ru:{preformatted:"Пример кода 
    "},sl:{preformatted:"Vstavi neformatiran tekst 
    "},tr:{preformatted:"Kod örneği 
    "},zh_cn:{preformatted:"代码示例 
    "},zh_tw:{preformatted:"代碼範例 
    "}},plugins:{preformatted:{init:function(t){var o={fn:function(){t.saveRange();var o,a,n=t.getRangeText();if(""!==n.replace(/\s/g,""))try{var r=function(){var e,t=null;window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement());return t}().tagName.toLowerCase();if("code"===r||"pre"===r)return function(){var t=null;if(document.selection)t=document.selection.createRange().parentElement();else{var o=window.getSelection();o.rangeCount>0&&(t=o.getRangeAt(0).startContainer.parentNode)}var a=e(t).contents().closest("pre").length,n=e(t).contents().closest("code").length;a&&n?e(t).contents().unwrap("code").unwrap("pre"):a?e(t).contents().unwrap("pre"):n&&e(t).contents().unwrap("code")}();t.execCmd("insertHTML","
    "+(o=n,(a=document.createElement("DIV")).innerHTML=o,(a.textContent||a.innerText||"")+"
    "))}catch(e){}},tag:"pre"};t.addBtnDef("preformatted",o)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{preformatted:"Code sample
    "},az:{preformatted:"Kod nümunəsi 
    "},by:{preformatted:"Прыклад кода 
    "},da:{preformatted:"Præformateret 
    "},et:{preformatted:"Eelvormindatud tekst 
    "},fr:{preformatted:"Exemple de code 
    "},hu:{preformatted:"Kód minta 
    "},it:{preformatted:"Codice 
    "},ja:{preformatted:"コードサンプル 
    "},ko:{preformatted:"코드 예제 
    "},pt_br:{preformatted:"Exemple de código 
    "},ru:{preformatted:"Пример кода 
    "},sl:{preformatted:"Vstavi neformatiran tekst 
    "},tr:{preformatted:"Kod örneği 
    "},zh_cn:{preformatted:"代码示例 
    "},zh_tw:{preformatted:"代碼範例 
    "}},plugins:{preformatted:{init:function(t){var o={fn:function(){t.saveRange();var o,a,n=t.getRangeText();if(""!==n.replace(/\s/g,""))try{var r=function(){var e,t=null;return window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement()),t}().tagName.toLowerCase();if("code"===r||"pre"===r)return function(){var t=null;if(document.selection)t=document.selection.createRange().parentElement();else{var o=window.getSelection();o.rangeCount>0&&(t=o.getRangeAt(0).startContainer.parentNode)}var a=e(t).contents().closest("pre").length,n=e(t).contents().closest("code").length;a&&n?e(t).contents().unwrap("code").unwrap("pre"):a?e(t).contents().unwrap("pre"):n&&e(t).contents().unwrap("code")}();t.execCmd("insertHTML","
    "+(o=n,(a=document.createElement("DIV")).innerHTML=o,(a.textContent||a.innerText||"")+"
    "))}catch(e){}},tag:"pre"};t.addBtnDef("preformatted",o)}}}})}(jQuery),function(e){"use strict";var t={minSize:32,step:4};function o(e){e.stopPropagation(),e.preventDefault()}var a=function(t){this.resizeCanvas=document.createElement("canvas"),this.resizeCanvas.setAttribute("tabindex","0"),this.resizeCanvas.id="trumbowyg-resizimg-"+ +new Date,this.ctx=null,this.resizeImg=null,this.pressEscape=function(e){e.reset()},this.pressBackspaceOrDelete=function(o){e(o.resizeCanvas).remove(),o.resizeImg=null,null!==t&&(t.syncCode(),t.$c.trigger("tbwchange"))};var a,n,r=!1,l=!1,i=function(e){var t=e.getBoundingClientRect();a=t.left,n=t.top},s=function(e,t,o,a,n){return t.translate(.5,.5),t.lineWidth=1,t.drawImage(o,5,5,a-10,n-10),t.beginPath(),t.rect(5,5,a-10,n-10),t.stroke(),t.beginPath(),t.fillStyle="rgb(255, 255, 255)",t.rect(a-10,n-10,9,9),t.fill(),t.stroke(),i(e),t};this.init=function(){var t=this;e(window).on("scroll resize",(function(){t.reCalcOffset()}))},this.reCalcOffset=function(){i(this.resizeCanvas)},this.canvasId=function(){return this.resizeCanvas.id},this.isActive=function(){return null!==this.resizeImg},this.isFocusedNow=function(){return r},this.blurNow=function(){r=!1},this.reset=function(){null!==this.resizeImg&&(this.resizeImg.setAttribute("style","width: 100%; max-width: "+(this.resizeCanvas.clientWidth-10)+"px; height: auto; max-height: "+(this.resizeCanvas.clientHeight-10)+"px;"),e(this.resizeCanvas).replaceWith(e(this.resizeImg)),this.resizeCanvas.removeAttribute("style"),this.resizeImg=null)},this.setup=function(i,d){if(this.resizeImg=i,!this.resizeCanvas.getContext)return!1;r=!0,this.resizeCanvas.width=e(this.resizeImg).width()+10,this.resizeCanvas.height=e(this.resizeImg).height()+10,this.resizeCanvas.style.margin="-5px",this.ctx=this.resizeCanvas.getContext("2d"),e(this.resizeImg).replaceWith(e(this.resizeCanvas)),s(this.resizeCanvas,this.ctx,this.resizeImg,this.resizeCanvas.width,this.resizeCanvas.height),e(this.resizeCanvas).resizableSafe(d).on("mousedown",o);var x=this;return e(this.resizeCanvas).on("mousemove",(function(e){var t=Math.round(e.clientX-a),o=Math.round(e.clientY-n),r=l;x.ctx.rect(x.resizeCanvas.width-10,x.resizeCanvas.height-10,9,9),r!==(l=x.ctx.isPointInPath(t,o))&&(this.style.cursor=l?"se-resize":"default")})).on("keydown",(function(e){if(x.isActive()){var t=e.keyCode;27===t?x.pressEscape(x):8!==t&&46!==t||x.pressBackspaceOrDelete(x)}})).on("focus",o).on("blur",(function(){x.reset(),null!==t&&(t.syncCode(),t.$c.trigger("tbwchange"))})),this.resizeCanvas.focus(),!0},this.refresh=function(){this.resizeCanvas.getContext&&(this.resizeCanvas.width=this.resizeCanvas.clientWidth,this.resizeCanvas.height=this.resizeCanvas.clientHeight,s(this.resizeCanvas,this.ctx,this.resizeImg,this.resizeCanvas.width,this.resizeCanvas.height))}};e.extend(!0,e.trumbowyg,{plugins:{resizimg:{destroyResizable:function(){},init:function(n){var r=this.destroyResizable,l=new a(n);function i(){n.$ed.find("img").off("click").on("click",(function(e){l.isActive()&&l.reset(),l.setup(this,n.o.plugins.resizimg.resizable),o(e)}))}this.destroyResizable=function(){n.$ed.find("canvas.resizable").resizableSafe("destroy").off("mousedown",o).removeClass("resizable"),l.reset(),n.syncCode()},n.o.plugins.resizimg=e.extend(!0,{},t,n.o.plugins.resizimg||{},{resizable:{resizeWidth:!1,onDragStart:function(e,t){var o=n.o.plugins.resizimg,a=e.pageX-t.offset().left,r=e.pageY-t.offset().top;if(a",r);if(0===a.$box.find("."+o+"-"+t).length?a.$box.append(i.hide()):i=a.$box.find("."+o+"-"+t),i.html(""),a.$box.find("."+a.o.prefix+"table-button").hasClass(a.o.prefix+"active-button")){var s=e(a.doc.getSelection().anchorNode).closest("table"),F=x(s),u=void 0!==n;e(a.o.plugins.table.dropdown).each((function(t,o){i.append(e("
    ",{html:a.lang[o.title]?a.lang[o.title]:o.title,class:a.o.prefix+"table-dropdown-title"})).text();var n=e("
    ",{class:a.o.prefix+"dropdown-button-group"});e(o.buttons).each((function(t,o){if("tableAddHeaderRow"===o&&0!==e("thead",s).length)return;if("tableMergeCells"!==o||u){if("tableUnmergeCells"===o){var r=!1;if(R((function(e){var t=e.is("[colspan]")||e.is("[rowspan]");r=r||t}),F),!r)return}n.append(a.buildSubBtn(o))}})),i.append(n)}))}else{var c=e("");e("").appendTo(c);for(var f=0;f").appendTo(c),p=0;p").appendTo(m);c.find("td").on("mouseover",l),c.find("td").on("mousedown",d),i.append(c),i.append(e('
    1x1
    '))}a.dropdown(t)},class:a.o.prefix+"open-dropdown"},l=function(t){var o=e(t.target).closest("table"),a=this.cellIndex,n=this.parentNode.rowIndex;o.find("td").removeClass("active");for(var r=0;r<=n;r+=1)for(var l=0;l<=a;l+=1)o.find("tr:nth-of-type("+(r+1)+")").find("td:nth-of-type("+(l+1)+")").addClass("active");o.next(".trumbowyg-table-size").html(a+1+"x"+(n+1))},i=function(t){var o=a.o.tagClasses[t.tagName.toLowerCase()];o&&e(t).addClass(o)},s=function(t){i(t[0]),e("*",t).each((function(e,t){i(t)}))},d=function(){a.saveRange();var t=e("
    "),o=e(""),n=e("");n.appendTo(o);for(var r=0;r<=this.cellIndex;r+=1)e(""),i=this.cellIndex,d=this.parentNode.rowIndex,x=0;x<=d;x+=1)for(var F=e("").appendTo(l),u=0;u<=i;u+=1)e(""),d=l.index(a);if(t)d=Math.max(0,d-1),a=e(l[d]);else{var x=e(n).closest("td, th").attr("rowspan"),F=parseInt(x||1,10);a=e(l[d+=F-1])}var u=e("tbody tr",o),c=0!==a.closest("thead").length;c&&(a=u.first());for(var f=r[d],m=r[d+1],p=r[0].length,g=0;g").appendTo(i)}0===d&&(t||c)?a.before(i):a.after(i),s(o),S()}))},c={title:a.lang.tableAddRowAbove,text:a.lang.tableAddRowAbove,ico:"row-above",fn:u(!0)},f={title:a.lang.tableAddRow,text:a.lang.tableAddRow,ico:"row-below",fn:u(!1)},m={title:a.lang.tableAddHeaderRow,text:a.lang.tableAddHeaderRow,ico:"header-row",fn:F((function(t,o,a,n){if(0!==e("thead",t).length)return!1;for(var r=n[0].length,l=e(""),i=e("").appendTo(l),d=0;d").appendTo(i);t.prepend(l),s(t),S()}))},p=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return F((function(o,n,r,l){var i=l[e("tr",o).index(n)],d=e(r).closest("td, th"),x=D(d[0],i);if(t)x=Math.max(0,x-1);else{var F=d.attr("colspan");x+=parseInt(F||1,10)-1}for(var u=l.length,c=t&&0===x,f=0;f1){var d=A(n,[i,l]);d.element.setAttribute("colspan",d.colspan-1)}else s.element.remove()}y(),_()}))},A=function(e,t){var o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0!==t){var a=e[t[0]][t[1]];return o&&void 0!==a.mergedIn&&(a=e[a.mergedIn[0]][a.mergedIn[1]]),a}},y=function(t){var o=x(t),a=e("tr",t);e(o).each((function(t,n){n.every((function(e){return void 0!==e.mergedIn}))&&(e(o[t-1]).each((function(e,t){void 0!==t.mergedIn&&(t=A(o,t.mergedIn)),t.rowspan-=1,t.rowspan<=1?t.element.removeAttribute("rowspan"):t.element.setAttribute("rowspan",t.rowspan)})),a[t].remove())})),e('[class=""]',t).removeAttr("class"),e('[style=""]',t).removeAttr("style")},w={title:a.lang.tableMergeCells,text:a.lang.tableMergeCells,ico:"table-merge",fn:F((function(t,o,a,r){if(function(t){if(0===n.length)return!1;var o=n[0],a=A(t,o).tag;if(!n.every((function(e){return A(t,e).tag===a})))return!1;var r=[],l=[];if(e(n).each((function(e,o){for(var a=o[0],n=o[1],i=t[a][n],s=a+i.rowspan;a1&&s.attr("rowspan",c),f>1&&s.attr("colspan",f),y(t),S()}}}))},E={title:a.lang.tableUnmergeCells,text:a.lang.tableUnmergeCells,ico:"table-unmerge",fn:F((function(t,o,n,r){R((function(o){o.removeAttr("colspan").removeAttr("rowspan");for(var n=e("tr",t).index(o.closest("tr")),l=D(o[0],r[n]),i=r[n][l],s=0;s1){var i=t.getRangeAt(0),s=t.getRangeAt(o-1);r=i.startContainer.childNodes[i.startOffset],l=s.startContainer.childNodes[s.startOffset]}var d=e(r).closest("td, th"),F=e(l).closest("td, th"),u=d.closest("table"),c=F.closest("table");if(e('[class="'+k+'"]',a.$ed).removeAttr("class"),e("."+k,a.$ed).removeClass(k),0===u.length&&0===c.length||u[0]!==c[0]||d[0]===F[0])e("."+z,a.$ed).removeClass(z);else{u.addClass(z);var f=x(u),m=e("tr",u),p=d.closest("tr"),g=m.index(p),b=F.closest("tr"),h=m.index(b),v=D(d[0],f[g]),C=D(F[0],f[h]),A=Math.min(g,h),y=Math.max(g,h),w=Math.min(v,C),E=Math.max(v,C),B=[];m.each((function(t,o){ty||e("td, th",o).each((function(o,a){var n=D(a,f[t]);nE||(B.push([t,n]),e(a).addClass(k))}))})),n=B}}))}));var R=function(t,o){if(void 0!==n)e(n).each((function(a,n){var r=A(o,n,!1);void 0===r.mergedIn&&t(e(r.element))}));else{var r=e(a.doc.getSelection().anchorNode).closest("td, th");if(0===r.length)return;t(r)}},I="trumbowyg-table-handle-for",S=function(){if(a.o.plugins.table.allowHorizontalResize){var t,o,n,r=e(a.o.prefix+"table-resize-layers"),l=r.length>0;l||(r=e("
    ",{class:a.o.prefix+"table-resize-layers"}).appendTo(a.$edBox),e(a.o.prefix+"table-resize-vertical-handle",r).each((function(t,o){e(o).off().remove()}))),e("table",a.$ed).each((function(l,i){e("td, th",e(i)).each((function(l,i){e("
    ",{class:a.o.prefix+"table-resize-vertical-handle"}).prop(I,i).on("mousedown.tbwTable",(function(a){a.preventDefault(),a.stopPropagation();var r=e(a.target).prop(I);n=e(r).closest("table"),t=x(n);var l=e("tr",n),i=e(r).closest("tr"),s=l.index(i),d=t[s],F=D(r,d),u=t[s][F];void 0!==u.mergedIn&&(u=t[u.mergedIn[0]][u.mergedIn[1]]),o=F+u.colspan-1,T(n,t),L(n,t),n.css({maxWidth:""})})).appendTo(r)}))})),_(),l||(e(a.doc).on("mousemove.tbwTable",(function(a){if(void 0!==o){a.preventDefault(),a.stopPropagation();var r=n[0].getBoundingClientRect(),l=a.pageX-r.left-(j(t,o).element.getBoundingClientRect().left-r.left),i=e("col",n)[o];e(i).css({width:l}),_()}})).on("mouseup.tbwTable",(function(e){void 0!==o&&(e.preventDefault(),e.stopPropagation(),T(n,t),M(n,t),n=void 0,t=void 0,o=void 0,a.syncCode(),_())})),e(window).on("resize.tbwTable",(function(){_()})))}},T=function(t,o){var a=e("colgroup",t);0===a.length&&(a=e("
    ").prependTo(t));for(var n=o[0].length,r=e("col",a).length;r").appendTo(a)},j=function(e,t){var o,a=0;do{o=e[a][t],a+=1}while(void 0===o.element||1!==o.colspan);return o},N=function(t,o){var a=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e("colgroup",t),r=e("col",n),l=t[0].offsetWidth;t.css({maxWidth:t[0].offsetWidth});for(var i=o[0].length,s=[],d=0;d=0?a.push("tableBorderColor"+l):a.push("freeTableBorderColor")}}if(!e.style)return a;var i=e.style.verticalAlign;""!==i&&a.push("tableVerticalAlign"+o(i));var s=e.style.backgroundColor;if(("TH"===e.tagName||"TD"===e.tagName)&&""!==s){var d=n(s);t.o.plugins.table.colorList.indexOf(d)>=0?a.push("tableCellBackgroundColor"+d):a.push("freeTableCellBackgroundColor")}return a}}}})}(jQuery),function(e){"use strict";var t={rows:8,columns:8,allowHorizontalResize:!0,colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"],backgroundColorList:null,allowCustomBackgroundColor:!0,displayBackgroundColorsAsList:!1,borderColorList:null,allowCustomBorderColor:!0,displayBorderColorsAsList:!1,dropdown:[{title:"tableRows",buttons:["tableAddHeaderRow","tableAddRowAbove","tableAddRow","tableDeleteRow"]},{title:"tableColumns",buttons:["tableAddColumnLeft","tableAddColumn","tableDeleteColumn"]},{title:"tableVerticalAlign",buttons:["tableVerticalAlignTop","tableVerticalAlignMiddle","tableVerticalAlignBottom"]},{title:"tableOthers",buttons:["tableMergeCells","tableUnmergeCells","tableDestroy"]}]};function o(e){return e[0].toUpperCase()+e.slice(1)}function a(e){return("0"+parseInt(e).toString(16)).slice(-2)}function n(e){return-1===e.search("rgb")?e.replace("#",""):"rgba(0, 0, 0, 0)"===e||null==(e=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/))?"transparent":a(e[1])+a(e[2])+a(e[3])}e.extend(!0,e.trumbowyg,{langs:{en:{table:"Insert table",tableRows:"Rows",tableColumns:"Columns",tableVerticalAlign:"Vertical align",tableOthers:"Others",tableAddHeaderRow:"Insert head row",tableAddRowAbove:"Insert row above",tableAddRow:"Insert row below",tableAddColumnLeft:"Insert column to the left",tableAddColumn:"Insert column to the right",tableDeleteRow:"Delete row",tableDeleteColumn:"Delete column",tableDestroy:"Delete table",tableMergeCells:"Merge cells",tableUnmergeCells:"Unmerge cells",tableVerticalAlignTop:"Align text to top",tableVerticalAlignMiddle:"Center text vertically",tableVerticalAlignBottom:"Align text to bottom",tableCellBackgroundColor:"Cell background color"},az:{table:"Cədvəl yerləşdir",tableAddRow:"Sətir əlavə et",tableAddRowAbove:"Yuxarı sətir əlavə et",tableAddColumnLeft:"Sola sütun əlavə et",tableAddColumn:"Sağa sütun əlavə et",tableDeleteRow:"Sətri sil",tableDeleteColumn:"Sütunu sil",tableDestroy:"Cədvəli sil"},ca:{table:"Inserir taula",tableAddRow:"Afegir fila",tableAddRowAbove:"Afegir fila a dalt",tableAddColumnLeft:"Afegir columna a l'esquerra",tableAddColumn:"Afegir columna a la dreta",tableDeleteRow:"Esborrar fila",tableDeleteColumn:"Esborrar columna",tableDestroy:"Esborrar taula",error:"Error"},cs:{table:"Vytvořit příkaz Table",tableAddRow:"Přidat řádek",tableAddRowAbove:"Přidat řádek",tableAddColumnLeft:"Přidat sloupec",tableAddColumn:"Přidat sloupec"},da:{table:"Indsæt tabel",tableAddRow:"Tilføj række",tableAddRowAbove:"Tilføj række",tableAddColumnLeft:"Tilføj kolonne",tableAddColumn:"Tilføj kolonne",tableDeleteRow:"Slet række",tableDeleteColumn:"Slet kolonne",tableDestroy:"Slet tabel"},de:{table:"Tabelle einfügen",tableAddRow:"Zeile hinzufügen",tableAddRowAbove:"Zeile hinzufügen",tableAddColumnLeft:"Spalte hinzufügen",tableAddColumn:"Spalte hinzufügen",tableDeleteRow:"Zeile löschen",tableDeleteColumn:"Spalte löschen",tableDestroy:"Tabelle löschen"},et:{table:"Sisesta tabel",tableAddRow:"Lisa rida",tableAddRowAbove:"Lisa rida üles",tableAddColumnLeft:"Lisa tulp vasakule",tableAddColumn:"Lisa tulp paremale",tableDeleteRow:"Kustuta rida",tableDeleteColumn:"Kustuta tulp",tableDestroy:"Kustuta tabel"},fr:{table:"Insérer un tableau",tableRows:"Lignes",tableColumns:"Colonnes",tableVerticalAlign:"Alignement vertical",tableOthers:"Autres",tableAddHeaderRow:"Insérer une line d'en-tête",tableAddRowAbove:"Insérer une ligne au dessus",tableAddRow:"Insérer une ligne en dessous",tableAddColumnLeft:"Insérer une colonne à gauche",tableAddColumn:"Insérer une colonne à droite",tableDeleteRow:"Supprimer la ligne",tableDeleteColumn:"Supprimer la colonne",tableDestroy:"Supprimer le tableau",tableMergeCells:"Fusionner les cellules",tableUnmergeCells:"Dissocier les cellules",tableVerticalAlignTop:"Aligner en haut",tableVerticalAlignMiddle:"Aligner au milieu",tableVerticalAlignBottom:"Aligner en bas",tableCellBackgroundColor:"Couleur de fond des cellules",tableBorderColor:"Couleur de la bordure du tableau"},hu:{table:"Táblázat beszúrás",tableAddRow:"Sor hozzáadás",tableAddRowAbove:"Sor beszúrás fönt",tableAddColumnLeft:"Sor beszúrás balra",tableAddColumn:"Sor beszúrás jobbra",tableDeleteRow:"Sor törlés",tableDeleteColumn:"Oszlop törlés",tableDestroy:"Táblázat törlés"},id:{table:"Sisipkan tabel",tableAddRow:"Sisipkan baris",tableAddRowAbove:"Sisipkan baris",tableAddColumnLeft:"Sisipkan kolom",tableAddColumn:"Sisipkan kolom",tableDeleteRow:"Hapus baris",tableDeleteColumn:"Hapus kolom",tableDestroy:"Hapus tabel"},ja:{table:"表の挿入",tableAddRow:"行の追加",tableAddRowAbove:"行の追加",tableAddColumnLeft:"列の追加",tableAddColumn:"列の追加"},ko:{table:"표 넣기",tableAddRow:"줄 추가",tableAddRowAbove:"줄 추가",tableAddColumnLeft:"칸 추가",tableAddColumn:"칸 추가",tableDeleteRow:"줄 삭제",tableDeleteColumn:"칸 삭제",tableDestroy:"표 지우기"},pt_br:{table:"Inserir tabela",tableAddRow:"Adicionar linha",tableAddRowAbove:"Adicionar linha",tableAddColumnLeft:"Adicionar coluna",tableAddColumn:"Adicionar coluna",tableDeleteRow:"Deletar linha",tableDeleteColumn:"Deletar coluna",tableDestroy:"Deletar tabela"},ru:{table:"Вставить таблицу",tableAddRow:"Добавить строку",tableAddRowAbove:"Добавить строку",tableAddColumnLeft:"Добавить столбец",tableAddColumn:"Добавить столбец",tableDeleteRow:"Удалить строку",tableDeleteColumn:"Удалить столбец",tableDestroy:"Удалить таблицу"},sl:{table:"Dodaj tabelo",tableAddRow:"Dodaj vrstico",tableAddRowAbove:"Vrini vrstico",tableAddColumnLeft:"Vrini stolpec",tableAddColumn:"Dodaj stolpec",tableDeleteRow:"Izbriši vrstico",tableDeleteColumn:"Izbriši stolpec",tableDestroy:"Izbriši tabelo"},sk:{table:"Vytvoriť tabuľky",tableAddRow:"Pridať riadok",tableAddRowAbove:"Pridať riadok",tableAddColumnLeft:"Pridať stĺpec",tableAddColumn:"Pridať stĺpec"},tr:{table:"Tablo ekle",tableAddRow:"Satır ekle",tableAddRowAbove:"Yukarıya satır ekle",tableAddColumnLeft:"Sola sütun ekle",tableAddColumn:"Sağa sütun ekle",tableDeleteRow:"Satırı sil",tableDeleteColumn:"Sütunu sil",tableDestroy:"Tabloyu sil"},zh_tw:{table:"插入表格",tableAddRow:"加入行",tableAddRowAbove:"加入行",tableAddColumnLeft:"加入列",tableAddColumn:"加入列",tableDeleteRow:"刪除行",tableDeleteColumn:"刪除列",tableDestroy:"刪除表格"},es:{table:"Insertar tabla",tableAddRow:"Agregar fila",tableAddRowAbove:"Agregar fila arriba",tableAddColumnLeft:"Agregar columna a la izquierda",tableAddColumn:"Agregar columna a la derecha",tableDeleteRow:"Borrar fila",tableDeleteColumn:"Borrar columna",tableDestroy:"Borrar tabla"}},plugins:{table:{init:function(a){var n;a.o.plugins.table=e.extend(!0,{},t,a.o.plugins.table||{});var r={fn:function(){a.saveRange();var t="table",o=a.o.prefix+"dropdown",r={class:o+"-"+t+" "+o+" "+a.o.prefix+"fixed-top"};r["data-"+o]=t;var i=e("
    ",r);if(0===a.$box.find("."+o+"-"+t).length?a.$box.append(i.hide()):i=a.$box.find("."+o+"-"+t),i.html(""),a.$box.find("."+a.o.prefix+"table-button").hasClass(a.o.prefix+"active-button")){var s=e(a.doc.getSelection().anchorNode).closest("table"),F=x(s),u=void 0!==n;e(a.o.plugins.table.dropdown).each((function(t,o){i.append(e("
    ",{html:a.lang[o.title]?a.lang[o.title]:o.title,class:a.o.prefix+"table-dropdown-title"})).text();var n=e("
    ",{class:a.o.prefix+"dropdown-button-group"});e(o.buttons).each((function(t,o){if(("tableAddHeaderRow"!==o||0===e("thead",s).length)&&("tableMergeCells"!==o||u)){if("tableUnmergeCells"===o){var r=!1;if(R((function(e){var t=e.is("[colspan]")||e.is("[rowspan]");r=r||t}),F),!r)return}n.append(a.buildSubBtn(o))}})),i.append(n)}))}else{var c=e("
    ",{scope:"col"}).appendTo(n);o.appendTo(t);for(var l=e("
    ").appendTo(F);l.appendTo(t),s(t);for(var c=a.range.endContainer;c.nodeType!==Node.ELEMENT_NODE;)c=c.parentNode;c!==a.$ed[0]&&a.range.setEndAfter(c),a.range.collapse(),a.range.insertNode(t[0]),"P"===c.nodeName&&0===c.textContent.trim().length&&c.remove(),a.syncCode(),S()},x=function(t){for(var o=e("tr",t),a=[],n=0;n0&&void 0!==arguments[0]&&arguments[0];return F((function(o,a,n,r){var l=e("tr",o),i=e("
    ");e("").appendTo(c);for(var f=0;f").appendTo(c),p=0;p").appendTo(m);c.find("td").on("mouseover",l),c.find("td").on("mousedown",d),i.append(c),i.append(e('
    1x1
    '))}a.dropdown(t)},class:a.o.prefix+"open-dropdown"},l=function(t){var o=e(t.target).closest("table"),a=this.cellIndex,n=this.parentNode.rowIndex;o.find("td").removeClass("active");for(var r=0;r<=n;r+=1)for(var l=0;l<=a;l+=1)o.find("tr:nth-of-type("+(r+1)+")").find("td:nth-of-type("+(l+1)+")").addClass("active");o.next(".trumbowyg-table-size").html(a+1+"x"+(n+1))},i=function(t){var o=a.o.tagClasses[t.tagName.toLowerCase()];o&&e(t).addClass(o)},s=function(t){i(t[0]),e("*",t).each((function(e,t){i(t)}))},d=function(){a.saveRange();var t=e("
    "),o=e(""),n=e("");n.appendTo(o);for(var r=0;r<=this.cellIndex;r+=1)e(""),i=this.cellIndex,d=this.parentNode.rowIndex,x=0;x<=d;x+=1)for(var F=e("").appendTo(l),u=0;u<=i;u+=1)e(""),d=l.index(a);if(t)d=Math.max(0,d-1),a=e(l[d]);else{var x=e(n).closest("td, th").attr("rowspan"),F=parseInt(x||1,10);a=e(l[d+=F-1])}var u=e("tbody tr",o),c=0!==a.closest("thead").length;c&&(a=u.first());for(var f=r[d],m=r[d+1],p=r[0].length,g=0;g").appendTo(i)}0===d&&(t||c)?a.before(i):a.after(i),s(o),S()}))},c={title:a.lang.tableAddRowAbove,text:a.lang.tableAddRowAbove,ico:"row-above",fn:u(!0)},f={title:a.lang.tableAddRow,text:a.lang.tableAddRow,ico:"row-below",fn:u(!1)},m={title:a.lang.tableAddHeaderRow,text:a.lang.tableAddHeaderRow,ico:"header-row",fn:F((function(t,o,a,n){if(0!==e("thead",t).length)return!1;for(var r=n[0].length,l=e(""),i=e("").appendTo(l),d=0;d").appendTo(i);t.prepend(l),s(t),S()}))},p=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return F((function(o,n,r,l){var i=l[e("tr",o).index(n)],d=e(r).closest("td, th"),x=D(d[0],i);if(t)x=Math.max(0,x-1);else{var F=d.attr("colspan");x+=parseInt(F||1,10)-1}for(var u=l.length,c=t&&0===x,f=0;f1){var d=A(n,[i,l]);d.element.setAttribute("colspan",d.colspan-1)}else s.element.remove()}y(),_()}))},A=function(e,t){var o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0!==t){var a=e[t[0]][t[1]];return o&&void 0!==a.mergedIn&&(a=e[a.mergedIn[0]][a.mergedIn[1]]),a}},y=function(t){var o=x(t),a=e("tr",t);e(o).each((function(t,n){n.every((function(e){return void 0!==e.mergedIn}))&&(e(o[t-1]).each((function(e,t){void 0!==t.mergedIn&&(t=A(o,t.mergedIn)),t.rowspan-=1,t.rowspan<=1?t.element.removeAttribute("rowspan"):t.element.setAttribute("rowspan",t.rowspan)})),a[t].remove())})),e('[class=""]',t).removeAttr("class"),e('[style=""]',t).removeAttr("style")},w={title:a.lang.tableMergeCells,text:a.lang.tableMergeCells,ico:"table-merge",fn:F((function(t,o,a,r){if(function(t){if(0===n.length)return!1;var o=n[0],a=A(t,o).tag;if(!n.every((function(e){return A(t,e).tag===a})))return!1;var r=[],l=[];if(e(n).each((function(e,o){for(var a=o[0],n=o[1],i=t[a][n],s=a+i.rowspan;a1&&s.attr("rowspan",c),f>1&&s.attr("colspan",f),y(t),S()}}}))},E={title:a.lang.tableUnmergeCells,text:a.lang.tableUnmergeCells,ico:"table-unmerge",fn:F((function(t,o,n,r){R((function(o){o.removeAttr("colspan").removeAttr("rowspan");for(var n=e("tr",t).index(o.closest("tr")),l=D(o[0],r[n]),i=r[n][l],s=0;s1){var i=t.getRangeAt(0),s=t.getRangeAt(o-1);r=i.startContainer.childNodes[i.startOffset],l=s.startContainer.childNodes[s.startOffset]}var d=e(r).closest("td, th"),F=e(l).closest("td, th"),u=d.closest("table"),c=F.closest("table");if(e('[class="'+k+'"]',a.$ed).removeAttr("class"),e("."+k,a.$ed).removeClass(k),0===u.length&&0===c.length||u[0]!==c[0]||d[0]===F[0])e("."+z,a.$ed).removeClass(z);else{u.addClass(z);var f=x(u),m=e("tr",u),p=d.closest("tr"),g=m.index(p),b=F.closest("tr"),h=m.index(b),v=D(d[0],f[g]),C=D(F[0],f[h]),A=Math.min(g,h),y=Math.max(g,h),w=Math.min(v,C),E=Math.max(v,C),B=[];m.each((function(t,o){ty||e("td, th",o).each((function(o,a){var n=D(a,f[t]);nE||(B.push([t,n]),e(a).addClass(k))}))})),n=B}}))}));var R=function(t,o){if(void 0!==n)e(n).each((function(a,n){var r=A(o,n,!1);void 0===r.mergedIn&&t(e(r.element))}));else{var r=e(a.doc.getSelection().anchorNode).closest("td, th");if(0===r.length)return;t(r)}},I="trumbowyg-table-handle-for",S=function(){if(a.o.plugins.table.allowHorizontalResize){var t,o,n,r=e(a.o.prefix+"table-resize-layers"),l=r.length>0;l||(r=e("
    ",{class:a.o.prefix+"table-resize-layers"}).appendTo(a.$edBox),e(a.o.prefix+"table-resize-vertical-handle",r).each((function(t,o){e(o).off().remove()}))),e("table",a.$ed).each((function(l,i){e("td, th",e(i)).each((function(l,i){e("
    ",{class:a.o.prefix+"table-resize-vertical-handle"}).prop(I,i).on("mousedown.tbwTable",(function(a){a.preventDefault(),a.stopPropagation();var r=e(a.target).prop(I);n=e(r).closest("table"),t=x(n);var l=e("tr",n),i=e(r).closest("tr"),s=l.index(i),d=t[s],F=D(r,d),u=t[s][F];void 0!==u.mergedIn&&(u=t[u.mergedIn[0]][u.mergedIn[1]]),o=F+u.colspan-1,T(n,t),L(n,t),n.css({maxWidth:""})})).appendTo(r)}))})),_(),l||(e(a.doc).on("mousemove.tbwTable",(function(a){if(void 0!==o){a.preventDefault(),a.stopPropagation();var r=n[0].getBoundingClientRect(),l=a.pageX-r.left-(j(t,o).element.getBoundingClientRect().left-r.left),i=e("col",n)[o];e(i).css({width:l}),_()}})).on("mouseup.tbwTable",(function(e){void 0!==o&&(e.preventDefault(),e.stopPropagation(),T(n,t),M(n,t),n=void 0,t=void 0,o=void 0,a.syncCode(),_())})),e(window).on("resize.tbwTable",(function(){_()})))}},T=function(t,o){var a=e("colgroup",t);0===a.length&&(a=e("
    ").prependTo(t));for(var n=o[0].length,r=e("col",a).length;r").appendTo(a)},j=function(e,t){var o,a=0;do{o=e[a][t],a+=1}while(void 0===o.element||1!==o.colspan);return o},N=function(t,o){var a=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e("colgroup",t),r=e("col",n),l=t[0].offsetWidth;t.css({maxWidth:t[0].offsetWidth});for(var i=o[0].length,s=[],d=0;d=0?a.push("tableBorderColor"+l):a.push("freeTableBorderColor")}}if(!e.style)return a;var i=e.style.verticalAlign;""!==i&&a.push("tableVerticalAlign"+o(i));var s=e.style.backgroundColor;if(("TH"===e.tagName||"TD"===e.tagName)&&""!==s){var d=n(s);t.o.plugins.table.colorList.indexOf(d)>=0?a.push("tableCellBackgroundColor"+d):a.push("freeTableCellBackgroundColor")}return a}}}})}(jQuery),function(e){"use strict";var t={serverPath:"",fileFieldName:"fileToUpload",data:[],headers:{},xhrFields:{},urlPropertyName:"file",statusPropertyName:"success",success:void 0,error:void 0,imageWidthModalEdit:!1};function o(e,t){var a=t.shift(),n=t;if(null!==e){if(0===n.length)return e[a];if("object"===_typeof(e))return o(e[a],n)}return e}!function(){if(!e.trumbowyg.addedXhrProgressEvent){var t=e.ajaxSettings.xhr;e.ajaxSetup({xhr:function(){var e=this,o=t();return o&&"object"===_typeof(o.upload)&&void 0!==e.progressUpload&&o.upload.addEventListener("progress",(function(t){e.progressUpload(t)}),!1),o}}),e.trumbowyg.addedXhrProgressEvent=!0}}(),e.extend(!0,e.trumbowyg,{langs:{en:{upload:"Upload",file:"File",uploadError:"Error"},az:{upload:"Yüklə",file:"Fayl",uploadError:"Xəta"},by:{upload:"Загрузка",file:"Файл",uploadError:"Памылка"},ca:{upload:"Pujar fitxer",file:"Fitxer",uploadError:"Error"},cs:{upload:"Nahrát obrázek",file:"Soubor",uploadError:"Chyba"},da:{upload:"Upload",file:"Fil",uploadError:"Fejl"},de:{upload:"Hochladen",file:"Datei",uploadError:"Fehler"},es:{upload:"Subir archivo",file:"Archivo",uploadError:"Error"},et:{upload:"Lae üles",file:"Fail",uploadError:"Viga"},fr:{upload:"Envoi",file:"Fichier",uploadError:"Erreur"},hu:{upload:"Feltöltés",file:"Fájl",uploadError:"Hiba"},ja:{upload:"アップロード",file:"ファイル",uploadError:"エラー"},ko:{upload:"그림 올리기",file:"파일",uploadError:"에러"},pt_br:{upload:"Enviar do local",file:"Arquivo",uploadError:"Erro"},ru:{upload:"Загрузка",file:"Файл",uploadError:"Ошибка"},sl:{upload:"Naloži datoteko",file:"Datoteka",uploadError:"Napaka"},sk:{upload:"Nahrať",file:"Súbor",uploadError:"Chyba"},tr:{upload:"Yükle",file:"Dosya",uploadError:"Hata"},zh_cn:{upload:"上传",file:"文件",uploadError:"错误"},zh_tw:{upload:"上傳",file:"文件",uploadError:"錯誤"}},plugins:{upload:{init:function(a){a.o.plugins.upload=e.extend(!0,{},t,a.o.plugins.upload||{});var n={fn:function(){a.saveRange();var t,n=a.o.prefix,r={file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:a.getRangeText()}};a.o.plugins.upload.imageWidthModalEdit&&(r.width={value:""});var l=!1,i=a.openModalInsert(a.lang.upload,r,(function(r){if(!l){l=!0;var s=new FormData;s.append(a.o.plugins.upload.fileFieldName,t),a.o.plugins.upload.data.map((function(e){s.append(e.name,e.value)})),e.map(r,(function(e,t){"file"!==t&&s.append(t,e)})),0===e("."+n+"progress",i).length&&e("."+n+"modal-title",i).after(e("
    ",{class:n+"progress"}).append(e("
    ",{class:n+"progress-bar"}))),e.ajax({url:a.o.plugins.upload.serverPath,headers:a.o.plugins.upload.headers,xhrFields:a.o.plugins.upload.xhrFields,type:"POST",data:s,cache:!1,dataType:"json",processData:!1,contentType:!1,progressUpload:function(t){e("."+n+"progress-bar").css("width",Math.round(100*t.loaded/t.total)+"%")},success:function(t){if(a.o.plugins.upload.success)a.o.plugins.upload.success(t,a,i,r);else if(o(t,a.o.plugins.upload.statusPropertyName.split("."))){var n=o(t,a.o.plugins.upload.urlPropertyName.split("."));a.execCmd("insertImage",n,!1,!0);var s=e('img[src="'+n+'"]:not([alt])',a.$box);s.attr("alt",r.alt),a.o.plugins.upload.imageWidthModalEdit&&parseInt(r.width)>0&&s.attr({width:r.width}),setTimeout((function(){a.closeModal()}),250),a.$c.trigger("tbwuploadsuccess",[a,t,n])}else a.addErrorOnModalField(e("input[type=file]",i),a.lang[t.message]),a.$c.trigger("tbwuploaderror",[a,t]);l=!1},error:a.o.plugins.upload.error||function(){a.addErrorOnModalField(e("input[type=file]",i),a.lang.uploadError),a.$c.trigger("tbwuploaderror",[a]),l=!1}})}}));e("input[type=file]").on("change",(function(e){try{t=e.target.files[0]}catch(o){t=e.target.value}}))}};a.addBtnDef("upload",n)}}}})}(jQuery),function(e){"use strict";var t={serverPath:"",fileFieldName:"fileToUpload",data:[],headers:{},xhrFields:{},urlPropertyName:"file",statusPropertyName:"success",success:void 0,error:void 0,imageWidthModalEdit:!1};function o(e,t){var a=t.shift(),n=t;if(null!==e){if(0===n.length)return e[a];if("object"==_typeof(e))return o(e[a],n)}return e}!function(){if(!e.trumbowyg.addedXhrProgressEvent){var t=e.ajaxSettings.xhr;e.ajaxSetup({xhr:function(){var e=this,o=t();return o&&"object"==_typeof(o.upload)&&void 0!==e.progressUpload&&o.upload.addEventListener("progress",(function(t){e.progressUpload(t)}),!1),o}}),e.trumbowyg.addedXhrProgressEvent=!0}}(),e.extend(!0,e.trumbowyg,{langs:{en:{upload:"Upload",file:"File",uploadError:"Error"},az:{upload:"Yüklə",file:"Fayl",uploadError:"Xəta"},by:{upload:"Загрузка",file:"Файл",uploadError:"Памылка"},ca:{upload:"Pujar fitxer",file:"Fitxer",uploadError:"Error"},cs:{upload:"Nahrát obrázek",file:"Soubor",uploadError:"Chyba"},da:{upload:"Upload",file:"Fil",uploadError:"Fejl"},de:{upload:"Hochladen",file:"Datei",uploadError:"Fehler"},es:{upload:"Subir archivo",file:"Archivo",uploadError:"Error"},et:{upload:"Lae üles",file:"Fail",uploadError:"Viga"},fr:{upload:"Envoi",file:"Fichier",uploadError:"Erreur"},hu:{upload:"Feltöltés",file:"Fájl",uploadError:"Hiba"},ja:{upload:"アップロード",file:"ファイル",uploadError:"エラー"},ko:{upload:"그림 올리기",file:"파일",uploadError:"에러"},pt_br:{upload:"Enviar do local",file:"Arquivo",uploadError:"Erro"},ru:{upload:"Загрузка",file:"Файл",uploadError:"Ошибка"},sl:{upload:"Naloži datoteko",file:"Datoteka",uploadError:"Napaka"},sk:{upload:"Nahrať",file:"Súbor",uploadError:"Chyba"},tr:{upload:"Yükle",file:"Dosya",uploadError:"Hata"},zh_cn:{upload:"上传",file:"文件",uploadError:"错误"},zh_tw:{upload:"上傳",file:"文件",uploadError:"錯誤"}},plugins:{upload:{init:function(a){a.o.plugins.upload=e.extend(!0,{},t,a.o.plugins.upload||{});var n={fn:function(){a.saveRange();var t,n=a.o.prefix,r={file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:a.getRangeText()}};a.o.plugins.upload.imageWidthModalEdit&&(r.width={value:""});var l=!1,i=a.openModalInsert(a.lang.upload,r,(function(r){if(!l){l=!0;var s=new FormData;s.append(a.o.plugins.upload.fileFieldName,t),a.o.plugins.upload.data.map((function(e){s.append(e.name,e.value)})),e.map(r,(function(e,t){"file"!==t&&s.append(t,e)})),0===e("."+n+"progress",i).length&&e("."+n+"modal-title",i).after(e("
    ",{class:n+"progress"}).append(e("
    ",{class:n+"progress-bar"}))),e.ajax({url:a.o.plugins.upload.serverPath,headers:a.o.plugins.upload.headers,xhrFields:a.o.plugins.upload.xhrFields,type:"POST",data:s,cache:!1,dataType:"json",processData:!1,contentType:!1,progressUpload:function(t){e("."+n+"progress-bar").css("width",Math.round(100*t.loaded/t.total)+"%")},success:function(t){if(a.o.plugins.upload.success)a.o.plugins.upload.success(t,a,i,r);else if(o(t,a.o.plugins.upload.statusPropertyName.split("."))){var n=o(t,a.o.plugins.upload.urlPropertyName.split("."));a.execCmd("insertImage",n,!1,!0);var s=e('img[src="'+n+'"]:not([alt])',a.$box);s.attr("alt",r.alt),a.o.plugins.upload.imageWidthModalEdit&&parseInt(r.width)>0&&s.attr({width:r.width}),setTimeout((function(){a.closeModal()}),250),a.$c.trigger("tbwuploadsuccess",[a,t,n])}else a.addErrorOnModalField(e("input[type=file]",i),a.lang[t.message]),a.$c.trigger("tbwuploaderror",[a,t]);l=!1},error:a.o.plugins.upload.error||function(){a.addErrorOnModalField(e("input[type=file]",i),a.lang.uploadError),a.$c.trigger("tbwuploaderror",[a]),l=!1}})}}));e("input[type=file]").on("change",(function(e){try{t=e.target.files[0]}catch(o){t=e.target.value}}))}};a.addBtnDef("upload",n)}}}})}(jQuery); +function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}!function(e){"use strict";var t=function(){return"undefined"!=typeof FileReader};e.extend(!0,e.trumbowyg,{langs:{en:{base64:"Image as base64",file:"File",errFileReaderNotSupported:"FileReader is not supported by your browser.",errInvalidImage:"Invalid image file."},az:{base64:"base64 olaraq şəkil",file:"Fayl",errFileReaderNotSupported:"FileReader brauzeriniz tərəfindən dəstəklənmir.",errInvalidImage:"Yanlış şəkil faylı."},by:{base64:"Выява (фармат base64)",file:"Файл",errFileReaderNotSupported:"FileReader не падтрымліваецца вашым браўзэрам.",errInvalidImage:"Несапраўдны файл выявы."},cs:{base64:"Vložit obrázek",file:"Soubor"},da:{base64:"Billede som base64",file:"Fil",errFileReaderNotSupported:"FileReader er ikke understøttet af din browser.",errInvalidImage:"Ugyldig billedfil."},et:{base64:"Pilt base64 formaadis",file:"Fail",errFileReaderNotSupported:"Teie veebilehitseja ei toeta FileReader funktsiooni.",errInvalidImage:"Vigane pildifail."},fr:{base64:"Image en base64",file:"Fichier",errFileReaderNotSupported:"FileReader n'est pas supporté par votre navigateur.",errInvalidImage:"Fichier image invalide."},hu:{base64:"Kép beszúrás inline",file:"Fájl",errFileReaderNotSupported:"Ez a böngésző nem támogatja a FileReader funkciót.",errInvalidImage:"Érvénytelen képfájl."},ja:{base64:"画像 (Base64形式)",file:"ファイル",errFileReaderNotSupported:"あなたのブラウザーはFileReaderをサポートしていません",errInvalidImage:"画像形式が正しくありません"},ko:{base64:"그림 넣기(base64)",file:"파일",errFileReaderNotSupported:"FileReader가 현재 브라우저를 지원하지 않습니다.",errInvalidImage:"유효하지 않은 파일"},nl:{base64:"Afbeelding inline",file:"Bestand",errFileReaderNotSupported:"Uw browser ondersteunt deze functionaliteit niet.",errInvalidImage:"De gekozen afbeelding is ongeldig."},pt_br:{base64:"Imagem em base64",file:"Arquivo",errFileReaderNotSupported:"FileReader não é suportado pelo seu navegador.",errInvalidImage:"Arquivo de imagem inválido."},ru:{base64:"Изображение как код в base64",file:"Файл",errFileReaderNotSupported:"FileReader не поддерживается вашим браузером.",errInvalidImage:"Недопустимый файл изображения."},sl:{base64:"Slika kot base64",file:"Datoteka",errFileReaderNotSupported:"FileReader ni podprt v tem brskalniku.",errInvalidImage:"Neveljavna datoteka s sliko."},tr:{base64:"Base64 olarak resim",file:"Dosya",errFileReaderNotSupported:"FileReader tarayıcınız tarafından desteklenmiyor.",errInvalidImage:"Geçersiz resim dosyası."},zh_cn:{base64:"图片(Base64编码)",file:"文件"},zh_tw:{base64:"圖片(base64編碼)",file:"檔案",errFileReaderNotSupported:"你的瀏覽器不支援FileReader",errInvalidImage:"不正確的檔案格式"}},plugins:{base64:{shouldInit:t,init:function(o){var a={isSupported:t,fn:function(){var t;o.saveRange();var a=o.openModalInsert(o.lang.base64,{file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:o.getRangeText()}},(function(n){var r=new FileReader;r.onloadend=function(t){var l;l=t.target.result,/^data:image\/[a-z]?/i.test(l)?(o.execCmd("insertImage",r.result,!1,!0),e(['img[src="',r.result,'"]:not([alt])'].join(""),o.$box).attr("alt",n.alt),o.closeModal()):o.addErrorOnModalField(e("input[type=file]",a),o.lang.errInvalidImage)},r.readAsDataURL(t)}));e("input[type=file]").on("change",(function(e){t=e.target.files[0]}))}};o.addBtnDef("base64",a)}}}})}(jQuery),function(e){"use strict";var t=function(){return"undefined"!=typeof FileReader};e.extend(!0,e.trumbowyg,{langs:{en:{base64:"Image as base64",file:"File",errFileReaderNotSupported:"FileReader is not supported by your browser.",errInvalidImage:"Invalid image file."},az:{base64:"base64 olaraq şəkil",file:"Fayl",errFileReaderNotSupported:"FileReader brauzeriniz tərəfindən dəstəklənmir.",errInvalidImage:"Yanlış şəkil faylı."},by:{base64:"Выява (фармат base64)",file:"Файл",errFileReaderNotSupported:"FileReader не падтрымліваецца вашым браўзэрам.",errInvalidImage:"Несапраўдны файл выявы."},cs:{base64:"Vložit obrázek",file:"Soubor"},da:{base64:"Billede som base64",file:"Fil",errFileReaderNotSupported:"FileReader er ikke understøttet af din browser.",errInvalidImage:"Ugyldig billedfil."},et:{base64:"Pilt base64 formaadis",file:"Fail",errFileReaderNotSupported:"Teie veebilehitseja ei toeta FileReader funktsiooni.",errInvalidImage:"Vigane pildifail."},fr:{base64:"Image en base64",file:"Fichier",errFileReaderNotSupported:"FileReader n'est pas supporté par votre navigateur.",errInvalidImage:"Fichier image invalide."},hu:{base64:"Kép beszúrás inline",file:"Fájl",errFileReaderNotSupported:"Ez a böngésző nem támogatja a FileReader funkciót.",errInvalidImage:"Érvénytelen képfájl."},ja:{base64:"画像 (Base64形式)",file:"ファイル",errFileReaderNotSupported:"あなたのブラウザーはFileReaderをサポートしていません",errInvalidImage:"画像形式が正しくありません"},ko:{base64:"그림 넣기(base64)",file:"파일",errFileReaderNotSupported:"FileReader가 현재 브라우저를 지원하지 않습니다.",errInvalidImage:"유효하지 않은 파일"},nl:{base64:"Afbeelding inline",file:"Bestand",errFileReaderNotSupported:"Uw browser ondersteunt deze functionaliteit niet.",errInvalidImage:"De gekozen afbeelding is ongeldig."},pt_br:{base64:"Imagem em base64",file:"Arquivo",errFileReaderNotSupported:"FileReader não é suportado pelo seu navegador.",errInvalidImage:"Arquivo de imagem inválido."},ru:{base64:"Изображение как код в base64",file:"Файл",errFileReaderNotSupported:"FileReader не поддерживается вашим браузером.",errInvalidImage:"Недопустимый файл изображения."},sl:{base64:"Slika kot base64",file:"Datoteka",errFileReaderNotSupported:"FileReader ni podprt v tem brskalniku.",errInvalidImage:"Neveljavna datoteka s sliko."},tr:{base64:"Base64 olarak resim",file:"Dosya",errFileReaderNotSupported:"FileReader tarayıcınız tarafından desteklenmiyor.",errInvalidImage:"Geçersiz resim dosyası."},zh_cn:{base64:"图片(Base64编码)",file:"文件"},zh_tw:{base64:"圖片(base64編碼)",file:"檔案",errFileReaderNotSupported:"你的瀏覽器不支援FileReader",errInvalidImage:"不正確的檔案格式"}},plugins:{base64:{shouldInit:t,init:function(o){var a={isSupported:t,fn:function(){var t;o.saveRange();var a=o.openModalInsert(o.lang.base64,{file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:o.getRangeText()}},(function(n){var r=new FileReader;r.onloadend=function(t){var l;l=t.target.result,/^data:image\/[a-z]?/i.test(l)?(o.execCmd("insertImage",r.result,!1,!0),e(['img[src="',r.result,'"]:not([alt])'].join(""),o.$box).attr("alt",n.alt),o.closeModal()):o.addErrorOnModalField(e("input[type=file]",a),o.lang.errInvalidImage)},r.readAsDataURL(t)}));e("input[type=file]").on("change",(function(e){t=e.target.files[0]}))}};o.addBtnDef("base64",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{cleanPaste:{init:function(t){t.pasteHandlers.push((function(o){setTimeout((function(){try{t.saveRange();var a=(o.originalEvent||o).clipboardData.getData("Text"),n=t.doc.getSelection().focusNode,r=t.doc.createRange(),l=((s=(s=(s=(s=(s=(s=(s=(s=(s=a.trim()).replace(/<[^> ]*/g,(function(e){return e.toLowerCase()})).replace(/<[^>]*>/g,(function(e){return e.replace(/ [^=]+=/g,(function(e){return e.toLowerCase()}))})).replace(/<[^>]*>/g,(function(e){return e.replace(/( [^=]+=)([^"][^ >]*)/g,'$1"$2"')}))).replace(/)/g,")/g,")/g,")/g,"\s*/g,"")).replace(/ /gi," ")).replace(/ <\//gi,"]*>/g,(function(e){return e.replace(/ ([^=]+)="[^"]*"/g,(function(e,t){return-1!==["alt","href","src","title"].indexOf(t)?e:""}))}))).replace(/<\?xml[^>]*>/g,"")).replace(/<[^ >]+:[^>]*>/g,"")).replace(/<\/[^ >]+:[^>]*>/g,"")).replace(/<(div|span|style|meta|link).*?>/gi,"")),i=e(l)[0]||t.doc.createTextNode(l);""===t.$ed.html()?t.$ed[0].appendChild(i):(r.setStartAfter(n),r.setEndAfter(n),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),t.range.insertNode(i)),(r=t.doc.createRange()).setStartAfter(i),r.setEndAfter(i),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),o.stopPropagation(),o.preventDefault(),t.saveRange(),t.syncCode(),t.$c.trigger("tbwchange")}catch(e){}var s}),0)}))}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{cleanPaste:{init:function(t){t.pasteHandlers.push((function(o){setTimeout((function(){try{t.saveRange();var a=(o.originalEvent||o).clipboardData.getData("Text"),n=t.doc.getSelection().focusNode,r=t.doc.createRange(),l=((s=(s=(s=(s=(s=(s=(s=(s=(s=a.trim()).replace(/<[^> ]*/g,(function(e){return e.toLowerCase()})).replace(/<[^>]*>/g,(function(e){return e.replace(/ [^=]+=/g,(function(e){return e.toLowerCase()}))})).replace(/<[^>]*>/g,(function(e){return e.replace(/( [^=]+=)([^"][^ >]*)/g,'$1"$2"')}))).replace(/)/g,")/g,")/g,")/g,"\s*/g,"")).replace(/ /gi," ")).replace(/ <\//gi,"]*>/g,(function(e){return e.replace(/ ([^=]+)="[^"]*"/g,(function(e,t){return-1!==["alt","href","src","title"].indexOf(t)?e:""}))}))).replace(/<\?xml[^>]*>/g,"")).replace(/<[^ >]+:[^>]*>/g,"")).replace(/<\/[^ >]+:[^>]*>/g,"")).replace(/<(div|span|style|meta|link).*?>/gi,"")),i=e(l)[0]||t.doc.createTextNode(l);""===t.$ed.html()?t.$ed[0].appendChild(i):(r.setStartAfter(n),r.setEndAfter(n),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),t.range.insertNode(i)),(r=t.doc.createRange()).setStartAfter(i),r.setEndAfter(i),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(r),o.stopPropagation(),o.preventDefault(),t.saveRange(),t.syncCode(),t.$c.trigger("tbwchange")}catch(e){}var s}),0)}))}}}})}(jQuery),function(e){"use strict";var t={allowedTags:[],removableTags:["a","abbr","address","b","bdi","bdo","blockquote","br","cite","code","del","dfn","details","em","h1","h2","h3","h4","h5","h6","hr","i","ins","kbd","mark","meter","pre","progress","q","rp","rt","ruby","s","samp","small","span","strong","sub","summary","sup","time","u","var","wbr","img","map","area","canvas","figcaption","figure","picture","audio","source","track","video","ul","ol","li","dl","dt","dd","table","caption","th","tr","td","thead","tbody","tfoot","col","colgroup","style","div","p","form","input","textarea","button","select","optgroup","option","label","fieldset","legend","datalist","keygen","output","iframe","link","nav","header","hgroup","footer","main","section","article","aside","dialog","script","noscript","embed","object","param"]};e.extend(!0,e.trumbowyg,{plugins:{allowTagsFromPaste:{init:function(o){if(o.o.plugins.allowTagsFromPaste){o.o.removeformatPasted=!1;var a=o.o.plugins.allowTagsFromPaste.allowedTags||t.allowedTags,n=o.o.plugins.allowTagsFromPaste.removableTags||t.removableTags;if(0!==a.length){var r=e(n).not(a).get();o.pasteHandlers.push((function(){setTimeout((function(){var t=o.$ed.html();e.each(r,(function(e,o){t=t.replace(new RegExp("<\\/?"+o+"(\\s[^>]*)?>","gi"),"")})),o.$ed.html(t)}),0)}))}}}}}})}(jQuery),function(e){"use strict";var t={allowedTags:[],removableTags:["a","abbr","address","b","bdi","bdo","blockquote","br","cite","code","del","dfn","details","em","h1","h2","h3","h4","h5","h6","hr","i","ins","kbd","mark","meter","pre","progress","q","rp","rt","ruby","s","samp","small","span","strong","sub","summary","sup","time","u","var","wbr","img","map","area","canvas","figcaption","figure","picture","audio","source","track","video","ul","ol","li","dl","dt","dd","table","caption","th","tr","td","thead","tbody","tfoot","col","colgroup","style","div","p","form","input","textarea","button","select","optgroup","option","label","fieldset","legend","datalist","keygen","output","iframe","link","nav","header","hgroup","footer","main","section","article","aside","dialog","script","noscript","embed","object","param"]};e.extend(!0,e.trumbowyg,{plugins:{allowTagsFromPaste:{init:function(o){if(o.o.plugins.allowTagsFromPaste){o.o.removeformatPasted=!1;var a=o.o.plugins.allowTagsFromPaste.allowedTags||t.allowedTags,n=o.o.plugins.allowTagsFromPaste.removableTags||t.removableTags;if(0!==a.length){var r=e(n).not(a).get();o.pasteHandlers.push((function(){setTimeout((function(){var t=o.$ed.html();e.each(r,(function(e,o){t=t.replace(new RegExp("<\\/?"+o+"(\\s[^>]*)?>","gi"),"")})),o.$ed.html(t)}),0)}))}}}}}})}(jQuery),function(e){"use strict";function t(e){return("0"+parseInt(e).toString(16)).slice(-2)}function o(e){return-1===e.search("rgb")?e.replace("#",""):"rgba(0, 0, 0, 0)"===e||null==(e=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/))?"transparent":t(e[1])+t(e[2])+t(e[3])}e.extend(!0,e.trumbowyg,{langs:{en:{foreColor:"Text color",backColor:"Background color",foreColorRemove:"Remove text color",backColorRemove:"Remove background color"},az:{foreColor:"Yazı rəngi",backColor:"Arxa plan rəngi",foreColorRemove:"Yazı rəngini sil",backColorRemove:"Arxa plan rəngini sil"},by:{foreColor:"Колер тэксту",backColor:"Колер фону тэксту",foreColorRemove:"Выдаліць колер тэксту",backColorRemove:"Выдаліць колер фону тэксту"},ca:{foreColor:"Color del text",backColor:"Color del fons",foreColorRemove:"Eliminar color del text",backColorRemove:"Eliminar color del fons"},cs:{foreColor:"Barva textu",backColor:"Barva pozadí"},da:{foreColor:"Tekstfarve",backColor:"Baggrundsfarve"},de:{foreColor:"Textfarbe",backColor:"Hintergrundfarbe"},es:{foreColor:"Color del texto",backColor:"Color del fondo",foreColorRemove:"Eliminar color del texto",backColorRemove:"Eliminar color del fondo"},et:{foreColor:"Teksti värv",backColor:"Taustavärv",foreColorRemove:"Eemalda teksti värv",backColorRemove:"Eemalda taustavärv"},fr:{foreColor:"Couleur du texte",backColor:"Couleur de fond",foreColorRemove:"Supprimer la couleur du texte",backColorRemove:"Supprimer la couleur de fond"},hu:{foreColor:"Betű szín",backColor:"Háttér szín",foreColorRemove:"Betű szín eltávolítása",backColorRemove:"Háttér szín eltávolítása"},ja:{foreColor:"文字色",backColor:"背景色"},ko:{foreColor:"글자색",backColor:"배경색",foreColorRemove:"글자색 지우기",backColorRemove:"배경색 지우기"},nl:{foreColor:"Tekstkleur",backColor:"Achtergrondkleur"},pt_br:{foreColor:"Cor de fonte",backColor:"Cor de fundo"},ru:{foreColor:"Цвет текста",backColor:"Цвет выделения текста",foreColorRemove:"Очистить цвет текста",backColorRemove:"Очистить цвет выделения текста"},sl:{foreColor:"Barva teksta",backColor:"Barva ozadja",foreColorRemove:"Ponastavi barvo teksta",backColorRemove:"Ponastavi barvo ozadja"},sk:{foreColor:"Farba textu",backColor:"Farba pozadia"},tr:{foreColor:"Yazı rengi",backColor:"Arka plan rengi",foreColorRemove:"Yazı rengini kaldır",backColorRemove:"Arka plan rengini kaldır"},zh_cn:{foreColor:"文字颜色",backColor:"背景颜色"},zh_tw:{foreColor:"文字顏色",backColor:"背景顏色"}}});var a={colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"],foreColorList:null,backColorList:null,allowCustomForeColor:!0,allowCustomBackColor:!0,displayAsList:!1};function n(t,o){var a=[],n=o.o.plugins.colors,r=n[t+"List"]||n.colorList;e.each(r,(function(e,r){var l=t+r,i={fn:t,forceCss:!0,hasIcon:!1,text:o.lang["#"+r]||"#"+r,param:"#"+r,style:"background-color: #"+r+";"};n.displayAsList&&"foreColor"===t&&(i.style="color: #"+r+" !important;"),o.addBtnDef(l,i),a.push(l)}));var l=t+"Remove",i={fn:"removeFormat",hasIcon:!1,param:t,style:"background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);"};if(n.displayAsList&&(i.style=""),o.addBtnDef(l,i),a.push(l),n["allowCustom"+t.charAt(0).toUpperCase()+t.substr(1)]){var s=t+"Free",d={fn:function(){o.openModalInsert(o.lang[t],{color:{label:t,forceCss:!0,type:"color",value:"#FFFFFF"}},(function(e){return o.execCmd(t,e.color),!0}))},hasIcon:!1,text:"#",style:"text-indent: 0; line-height: 20px; padding: 0 5px;"};o.addBtnDef(s,d),a.push(s)}return a}e.extend(!0,e.trumbowyg,{plugins:{color:{init:function(e){e.o.plugins.colors=e.o.plugins.colors||a;var t=e.o.plugins.colors.displayAsList?e.o.prefix+"dropdown--color-list":"",o={dropdown:n("foreColor",e),dropdownClass:t},r={dropdown:n("backColor",e),dropdownClass:t};e.addBtnDef("foreColor",o),e.addBtnDef("backColor",r)},tagHandler:function(e,t){var a,n=[];if(!e.style)return n;if(""!==e.style.backgroundColor){var r=o(e.style.backgroundColor);t.o.plugins.colors.colorList.indexOf(r)>=0?n.push("backColor"+r):n.push("backColorFree")}return""!==e.style.color?a=o(e.style.color):e.hasAttribute("color")&&(a=o(e.getAttribute("color"))),a&&(t.o.plugins.colors.colorList.indexOf(a)>=0?n.push("foreColor"+a):n.push("foreColorFree")),n}}}})}(jQuery),function(e){"use strict";function t(e){return("0"+parseInt(e).toString(16)).slice(-2)}function o(e){return-1===e.search("rgb")?e.replace("#",""):"rgba(0, 0, 0, 0)"===e||null==(e=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/))?"transparent":t(e[1])+t(e[2])+t(e[3])}e.extend(!0,e.trumbowyg,{langs:{en:{foreColor:"Text color",backColor:"Background color",foreColorRemove:"Remove text color",backColorRemove:"Remove background color"},az:{foreColor:"Yazı rəngi",backColor:"Arxa plan rəngi",foreColorRemove:"Yazı rəngini sil",backColorRemove:"Arxa plan rəngini sil"},by:{foreColor:"Колер тэксту",backColor:"Колер фону тэксту",foreColorRemove:"Выдаліць колер тэксту",backColorRemove:"Выдаліць колер фону тэксту"},ca:{foreColor:"Color del text",backColor:"Color del fons",foreColorRemove:"Eliminar color del text",backColorRemove:"Eliminar color del fons"},cs:{foreColor:"Barva textu",backColor:"Barva pozadí"},da:{foreColor:"Tekstfarve",backColor:"Baggrundsfarve"},de:{foreColor:"Textfarbe",backColor:"Hintergrundfarbe"},es:{foreColor:"Color del texto",backColor:"Color del fondo",foreColorRemove:"Eliminar color del texto",backColorRemove:"Eliminar color del fondo"},et:{foreColor:"Teksti värv",backColor:"Taustavärv",foreColorRemove:"Eemalda teksti värv",backColorRemove:"Eemalda taustavärv"},fr:{foreColor:"Couleur du texte",backColor:"Couleur de fond",foreColorRemove:"Supprimer la couleur du texte",backColorRemove:"Supprimer la couleur de fond"},hu:{foreColor:"Betű szín",backColor:"Háttér szín",foreColorRemove:"Betű szín eltávolítása",backColorRemove:"Háttér szín eltávolítása"},ja:{foreColor:"文字色",backColor:"背景色"},ko:{foreColor:"글자색",backColor:"배경색",foreColorRemove:"글자색 지우기",backColorRemove:"배경색 지우기"},nl:{foreColor:"Tekstkleur",backColor:"Achtergrondkleur"},pt_br:{foreColor:"Cor de fonte",backColor:"Cor de fundo"},ru:{foreColor:"Цвет текста",backColor:"Цвет выделения текста",foreColorRemove:"Очистить цвет текста",backColorRemove:"Очистить цвет выделения текста"},sl:{foreColor:"Barva teksta",backColor:"Barva ozadja",foreColorRemove:"Ponastavi barvo teksta",backColorRemove:"Ponastavi barvo ozadja"},sk:{foreColor:"Farba textu",backColor:"Farba pozadia"},tr:{foreColor:"Yazı rengi",backColor:"Arka plan rengi",foreColorRemove:"Yazı rengini kaldır",backColorRemove:"Arka plan rengini kaldır"},zh_cn:{foreColor:"文字颜色",backColor:"背景颜色"},zh_tw:{foreColor:"文字顏色",backColor:"背景顏色"}}});var a={colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"],foreColorList:null,backColorList:null,allowCustomForeColor:!0,allowCustomBackColor:!0,displayAsList:!1};function n(t,o){var a=[],n=o.o.plugins.colors,r=n[t+"List"]||n.colorList;e.each(r,(function(e,r){var l=t+r,i={fn:t,forceCss:!0,hasIcon:!1,text:o.lang["#"+r]||"#"+r,param:"#"+r,style:"background-color: #"+r+";"};n.displayAsList&&"foreColor"===t&&(i.style="color: #"+r+" !important;"),o.addBtnDef(l,i),a.push(l)}));var l=t+"Remove",i={fn:"removeFormat",hasIcon:!1,param:t,style:"background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);"};if(n.displayAsList&&(i.style=""),o.addBtnDef(l,i),a.push(l),n["allowCustom"+t.charAt(0).toUpperCase()+t.substr(1)]){var s=t+"Free",d={fn:function(){o.openModalInsert(o.lang[t],{color:{label:t,forceCss:!0,type:"color",value:"#FFFFFF"}},(function(e){return o.execCmd(t,e.color),!0}))},hasIcon:!1,text:"#",style:"text-indent: 0; line-height: 20px; padding: 0 5px;"};o.addBtnDef(s,d),a.push(s)}return a}e.extend(!0,e.trumbowyg,{plugins:{color:{init:function(e){e.o.plugins.colors=e.o.plugins.colors||a;var t=e.o.plugins.colors.displayAsList?e.o.prefix+"dropdown--color-list":"",o={dropdown:n("foreColor",e),dropdownClass:t},r={dropdown:n("backColor",e),dropdownClass:t};e.addBtnDef("foreColor",o),e.addBtnDef("backColor",r)},tagHandler:function(e,t){var a,n=[];if(!e.style)return n;if(""!==e.style.backgroundColor){var r=o(e.style.backgroundColor);t.o.plugins.colors.colorList.indexOf(r)>=0?n.push("backColor"+r):n.push("backColorFree")}return""!==e.style.color?a=o(e.style.color):e.hasAttribute("color")&&(a=o(e.getAttribute("color"))),a&&(t.o.plugins.colors.colorList.indexOf(a)>=0?n.push("foreColor"+a):n.push("foreColorFree")),n}}}})}(jQuery),function(e){"use strict";var t={emojiList:["⁉","™","ℹ","↔","↕","↖","↗","↘","↙","⌨","☀","☁","☂","☃","☄","☑","☔","☕","☘","☠","☢","☣","☦","☸","☹","♀","♂","♈","♉","♐","♑","♒","♓","♠","♣","♥","♦","♨","⚒","⚓","⚔","⚕","⚖","⚗","⚙","✂","✅","✈","✉","✒","✔","✖","✡","✨","✳","✴","❄","❇","❓","❔","❕","❗","❣","❤","➕","➖","➗","⤴","⤵","〰","㊗","㊙","😀","😃","😄","😁","😆","😅","😂","🤣","☺","😊","😇","🙂","🙃","😉","😌","🥲","😍","🥰","😘","😗","😙","😚","😋","😛","😝","😜","🤪","🤨","🧐","🤓","😎","🤩","🥳","😏","😒","😞","😔","😟","😕","🙁","😣","😖","😫","😩","🥺","😢","😭","😤","😮","😠","😡","🤬","🤯","😳","😶","🥵","🥶","😱","😨","😰","😥","😓","🤗","🤔","🤭","🥱","🤫","🤥","😐","😑","😬","🙄","😯","😦","😧","😲","😴","🤤","😪","😵","🤐","🥴","🤢","🤮","🤧","😷","🤒","🤕","🤑","🤠","🥸","😈","👿","👹","👺","🤡","💩","👻","💀","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🤲","👐","🙌","👏","🤝","👍","👎","👊","✊","🤛","🤜","🤞","✌","🤟","🤘","👌","🤏","🤌","👈","👉","👆","👇","☝","✋","🤚","🖐","🖖","👋","🤙","💪","🦾","🖕","✍","🙏","🦶","🦵","🦿","💄","💋","👄","🦷","👅","👂","🦻","👃","👣","👁","👀","🧠","🫀","🫁","🦴","🗣","👤","👥","🫂","👶","👧","🧒","👦","👩","🧑","👨","👱","🧔","👵","🧓","👴","👲","👳","🧕","👮","👷","💂","🕵","👰","🤵","👸","🤴","🦸","🦹","🥷","🤶","🎅","🧙","🧝","🧛","🧟","🧞","🧜","🧚","👼","🤰","🤱","🙇","💁","🙅","🙆","🙋","🧏","🤦","🤷","🙎","🙍","💇","💆","🧖","💅","🤳","💃","🕺","👯","🕴","🚶","🧎","🏃","🧍","👫","👭","👬","💑","💏","👪","🧶","🧵","🧥","🥼","🦺","👚","👕","👖","🩲","🩳","👔","👗","👙","🩱","👘","🥻","🥿","👠","👡","👢","👞","👟","🥾","🩴","🧦","🧤","🧣","🎩","🧢","👒","🎓","⛑","🪖","👑","💍","👝","👛","👜","💼","🎒","🧳","👓","🕶","🥽","🌂","🦱","🦰","🦳","🦲","🐶","🐱","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐽","🐸","🐵","🙈","🙉","🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🦆","🦤","🦅","🦉","🦇","🐺","🐗","🐴","🦄","🐝","🐛","🦋","🐌","🪱","🐞","🐜","🪰","🦟","🪳","🪲","🦗","🕷","🕸","🦂","🐢","🐍","🦎","🦖","🦕","🐙","🦑","🦐","🦞","🦀","🐡","🐠","🐟","🦭","🐬","🐳","🐋","🦈","🐊","🐅","🐆","🦓","🦍","🦧","🐘","🦣","🦬","🦛","🦏","🐪","🐫","🦒","🦘","🐃","🐂","🐄","🐎","🐖","🐏","🐑","🦙","🐐","🦌","🐕","🐩","🦮","🐈","🐓","🦃","🦚","🦜","🦢","🦩","🕊","🐇","🦝","🦨","🦡","🦫","🦦","🦥","🐁","🐀","🐿","🦔","🐾","🐉","🐲","🌵","🎄","🌲","🌳","🌴","🌱","🌿","🍀","🎍","🎋","🍃","🍂","🍁","🪶","🍄","🐚","🪨","🪵","🌾","🪴","💐","🌷","🌹","🥀","🌺","🌸","🌼","🌻","🌞","🌝","🌛","🌜","🌚","🌕","🌖","🌗","🌘","🌑","🌒","🌓","🌔","🌙","🌎","🌍","🌏","🪐","💫","⭐","🌟","⚡","💥","🔥","🌪","🌈","🌤","⛅","🌥","🌦","🌧","⛈","🌩","🌨","⛄","🌬","💨","💧","💦","🌊","🌫","🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🫐","🍓","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🫒","🥦","🥬","🫑","🥒","🌶","🌽","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🫓","🥨","🧀","🥚","🍳","🧈","🥞","🧇","🥓","🥩","🍗","🍖","🌭","🍔","🍟","🍕","🥪","🥙","🧆","🌮","🌯","🫔","🥗","🥘","🫕","🥫","🍝","🍜","🍲","🍛","🍣","🍱","🥟","🦪","🍤","🍙","🍚","🍘","🍥","🥠","🥮","🍢","🍡","🍧","🍨","🍦","🥧","🧁","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🌰","🥜","🍯","🥛","🍼","🍵","🫖","🧉","🧋","🧃","🥤","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🍾","🧊","🥄","🍴","🍽","🥣","🥡","🥢","🧂","⚽","🏀","🏈","⚾","🥎","🎾","🏐","🏉","🥏","🪃","🎱","🪀","🏓","🏸","🏒","🏑","🥍","🏏","🥅","⛳","🪁","🏹","🎣","🤿","🥊","🥋","🎽","🛹","🛼","🛷","⛸","🥌","🎿","⛷","🏂","🪂","🏋","🤼","🤸","⛹","🤺","🤾","🏌","🏇","🧘","🏄","🏊","🤽","🚣","🧗","🚵","🚴","🏆","🥇","🥈","🥉","🏅","🎖","🏵","🎗","🎫","🎟","🎪","🤹","🎭","🩰","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🪘","🎷","🎺","🎸","🪕","🎻","🪗","🎲","♟","🎯","🎳","🎮","🎰","🧩","🚗","🚕","🚙","🛻","🚌","🚎","🏎","🚓","🚑","🚒","🚐","🚚","🚛","🚜","🦯","🦽","🦼","🛴","🚲","🛵","🏍","🛺","🚨","🚔","🚍","🚘","🚖","🚡","🚠","🚟","🚃","🚋","🚞","🚝","🚄","🚅","🚈","🚂","🚆","🚇","🚊","🚉","🛫","🛬","🛩","💺","🛰","🚀","🛸","🚁","🛶","⛵","🚤","🛥","🛳","⛴","🚢","⛽","🚧","🚦","🚥","🚏","🗺","🗿","🗽","🗼","🏰","🏯","🏟","🎡","🎢","🎠","⛲","⛱","🏖","🏝","🏜","🌋","⛰","🏔","🗻","🏕","⛺","🏠","🏡","🏘","🏚","🛖","🏗","🏭","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","🏛","⛪","🕌","🕍","🛕","🕋","⛩","🛤","🛣","🗾","🎑","🏞","🌅","🌄","🌠","🎇","🎆","🌇","🌆","🏙","🌃","🌌","🌉","🌁","⌚","📱","📲","💻","🖥","🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽","🎞","📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","🧭","⏱","⏲","⏰","🕰","⌛","⏳","📡","🔋","🔌","💡","🔦","🕯","🪔","🧯","🛢","💸","💵","💴","💶","💷","🪙","💰","💳","💎","🪜","🧰","🪛","🔧","🔨","🛠","⛏","🔩","🧱","⛓","🪝","🪢","🧲","🔫","💣","🧨","🪓","🪚","🔪","🗡","🛡","🚬","⚰","🪦","⚱","🏺","🪄","🔮","📿","🧿","💈","🔭","🔬","🕳","🪟","🩹","🩺","💊","💉","🩸","🧬","🦠","🧫","🧪","🌡","🪤","🧹","🧺","🪡","🧻","🚽","🪠","🪣","🚰","🚿","🛁","🛀","🪥","🧼","🪒","🧽","🧴","🛎","🔑","🗝","🚪","🪑","🪞","🛋","🛏","🛌","🧸","🖼","🛍","🛒","🎁","🎈","🎏","🎀","🎊","🎉","🪅","🪆","🎎","🏮","🎐","🧧","📩","📨","📧","💌","📥","📤","📦","🏷","📪","📫","📬","📭","📮","📯","🪧","📜","📃","📄","📑","🧾","📊","📈","📉","🗒","🗓","📆","📅","🗑","📇","🗃","🗳","🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒","📕","📗","📘","📙","📚","📖","🔖","🧷","🔗","📎","🖇","📐","📏","🧮","📌","📍","🖊","🖋","🖌","🖍","📝","✏","🔍","🔎","🔏","🔐","🔒","🔓","🧡","💛","💚","💙","💜","🖤","🤎","🤍","💔","💕","💞","💓","💗","💖","💘","💝","💟","☮","✝","☪","🕉","🔯","🕎","☯","🛐","⛎","♊","♋","♌","♍","♎","♏","🆔","⚛","🉑","📴","📳","🈶","🈚","🈸","🈺","🈷","🆚","💮","🉐","🈴","🈵","🈹","🈲","🅰","🅱","🆎","🆑","🅾","🆘","❌","⭕","🛑","⛔","📛","🚫","💯","💢","🚷","🚯","🚳","🚱","🔞","📵","🚭","‼","🔅","🔆","〽","⚠","🚸","🔱","⚜","🔰","♻","🈯","💹","❎","🌐","💠","Ⓜ","🌀","💤","🏧","🚾","♿","🅿","🈳","🈂","🛂","🛃","🛄","🛅","🛗","🚹","🚺","🚼","🚻","🚮","🎦","📶","🈁","🔣","🔤","🔡","🔠","🆖","🆗","🆙","🆒","🆕","🆓","0","1","2","3","4","5","6","7","8","9","🔟","🔢","#","*","⏏","▶","⏸","⏯","⏹","⏺","⏭","⏮","⏩","⏪","⏫","⏬","◀","🔼","🔽","➡","⬅","⬆","⬇","↪","↩","🔀","🔁","🔂","🔄","🔃","🎵","🎶","♾","💲","💱","©","®","➰","➿","🔚","🔙","🔛","🔝","🔜","🔘","⚪","⚫","🔴","🔵","🟤","🟣","🟢","🟡","🟠","🔺","🔻","🔸","🔹","🔶","🔷","🔳","🔲","▪","▫","◾","◽","◼","◻","⬛","⬜","🟧","🟦","🟥","🟫","🟪","🟩","🟨","🔈","🔇","🔉","🔊","🔔","🔕","📣","📢","🗨","💬","💭","🗯","🃏","🎴","🀄","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧","⚧","🏳","🏴","🏁","🚩","🇦","🇩","🇧","🇮","🇻","🇰","🇨","🇹","🇭","🇪","🇸","🇬","🇫","🇵","🇯","🎌","🇽","🇱","🇲","🇾","🇳","🇴","🇶","🇷","🇼","🇿","🇺","🏻","🏼","🏽","🏾","🏿"]};function o(t){var o=[];return e.each(t.o.plugins.emoji.emojiList,(function(a,n){if(e.isArray(n)){var r=n[0],l=n[1],i=''+r+'',s="emoji-"+r.replace(/:/g,""),d={hasIcon:!1,text:i,fn:function(){return t.execCmd("insertImage",l,!1,!0),!0}};t.addBtnDef(s,d),o.push(s)}else{var x="emoji-"+n.replace(/:/g,""),F={text:n,fn:function(){var e=String.fromCodePoint(n.replace("&#","0"));return t.execCmd("insertText",e),!0}};t.addBtnDef(x,F),o.push(x)}})),o}e.extend(!0,e.trumbowyg,{langs:{en:{emoji:"Add an emoji"},az:{emoji:"Emoji yerləşdir"},ca:{emoji:"Afegir una emoticona"},da:{emoji:"Tilføj et humørikon"},de:{emoji:"Emoticon einfügen"},es:{emoji:"Añadir un emoticono"},et:{emoji:"Lisa emotikon"},fr:{emoji:"Ajouter un emoji"},hu:{emoji:"Emoji beszúrás"},ja:{emoji:"絵文字の挿入"},ko:{emoji:"이모지 넣기"},ru:{emoji:"Вставить emoji"},sl:{emoji:"Vstavi emotikon"},tr:{emoji:"Emoji ekle"},zh_cn:{emoji:"添加表情"}},plugins:{emoji:{init:function(e){e.o.plugins.emoji=e.o.plugins.emoji||t;var a={dropdown:o(e)};e.addBtnDef("emoji",a)}}}})}(jQuery),function(e){"use strict";var t={emojiList:["⁉","™","ℹ","↔","↕","↖","↗","↘","↙","⌨","☀","☁","☂","☃","☄","☑","☔","☕","☘","☠","☢","☣","☦","☸","☹","♀","♂","♈","♉","♐","♑","♒","♓","♠","♣","♥","♦","♨","⚒","⚓","⚔","⚕","⚖","⚗","⚙","✂","✅","✈","✉","✒","✔","✖","✡","✨","✳","✴","❄","❇","❓","❔","❕","❗","❣","❤","➕","➖","➗","⤴","⤵","〰","㊗","㊙","😀","😃","😄","😁","😆","😅","😂","🤣","☺","😊","😇","🙂","🙃","😉","😌","🥲","😍","🥰","😘","😗","😙","😚","😋","😛","😝","😜","🤪","🤨","🧐","🤓","😎","🤩","🥳","😏","😒","😞","😔","😟","😕","🙁","😣","😖","😫","😩","🥺","😢","😭","😤","😮","😠","😡","🤬","🤯","😳","😶","🥵","🥶","😱","😨","😰","😥","😓","🤗","🤔","🤭","🥱","🤫","🤥","😐","😑","😬","🙄","😯","😦","😧","😲","😴","🤤","😪","😵","🤐","🥴","🤢","🤮","🤧","😷","🤒","🤕","🤑","🤠","🥸","😈","👿","👹","👺","🤡","💩","👻","💀","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🤲","👐","🙌","👏","🤝","👍","👎","👊","✊","🤛","🤜","🤞","✌","🤟","🤘","👌","🤏","🤌","👈","👉","👆","👇","☝","✋","🤚","🖐","🖖","👋","🤙","💪","🦾","🖕","✍","🙏","🦶","🦵","🦿","💄","💋","👄","🦷","👅","👂","🦻","👃","👣","👁","👀","🧠","🫀","🫁","🦴","🗣","👤","👥","🫂","👶","👧","🧒","👦","👩","🧑","👨","👱","🧔","👵","🧓","👴","👲","👳","🧕","👮","👷","💂","🕵","👰","🤵","👸","🤴","🦸","🦹","🥷","🤶","🎅","🧙","🧝","🧛","🧟","🧞","🧜","🧚","👼","🤰","🤱","🙇","💁","🙅","🙆","🙋","🧏","🤦","🤷","🙎","🙍","💇","💆","🧖","💅","🤳","💃","🕺","👯","🕴","🚶","🧎","🏃","🧍","👫","👭","👬","💑","💏","👪","🧶","🧵","🧥","🥼","🦺","👚","👕","👖","🩲","🩳","👔","👗","👙","🩱","👘","🥻","🥿","👠","👡","👢","👞","👟","🥾","🩴","🧦","🧤","🧣","🎩","🧢","👒","🎓","⛑","🪖","👑","💍","👝","👛","👜","💼","🎒","🧳","👓","🕶","🥽","🌂","🦱","🦰","🦳","🦲","🐶","🐱","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐽","🐸","🐵","🙈","🙉","🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🦆","🦤","🦅","🦉","🦇","🐺","🐗","🐴","🦄","🐝","🐛","🦋","🐌","🪱","🐞","🐜","🪰","🦟","🪳","🪲","🦗","🕷","🕸","🦂","🐢","🐍","🦎","🦖","🦕","🐙","🦑","🦐","🦞","🦀","🐡","🐠","🐟","🦭","🐬","🐳","🐋","🦈","🐊","🐅","🐆","🦓","🦍","🦧","🐘","🦣","🦬","🦛","🦏","🐪","🐫","🦒","🦘","🐃","🐂","🐄","🐎","🐖","🐏","🐑","🦙","🐐","🦌","🐕","🐩","🦮","🐈","🐓","🦃","🦚","🦜","🦢","🦩","🕊","🐇","🦝","🦨","🦡","🦫","🦦","🦥","🐁","🐀","🐿","🦔","🐾","🐉","🐲","🌵","🎄","🌲","🌳","🌴","🌱","🌿","🍀","🎍","🎋","🍃","🍂","🍁","🪶","🍄","🐚","🪨","🪵","🌾","🪴","💐","🌷","🌹","🥀","🌺","🌸","🌼","🌻","🌞","🌝","🌛","🌜","🌚","🌕","🌖","🌗","🌘","🌑","🌒","🌓","🌔","🌙","🌎","🌍","🌏","🪐","💫","⭐","🌟","⚡","💥","🔥","🌪","🌈","🌤","⛅","🌥","🌦","🌧","⛈","🌩","🌨","⛄","🌬","💨","💧","💦","🌊","🌫","🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🫐","🍓","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🫒","🥦","🥬","🫑","🥒","🌶","🌽","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🫓","🥨","🧀","🥚","🍳","🧈","🥞","🧇","🥓","🥩","🍗","🍖","🌭","🍔","🍟","🍕","🥪","🥙","🧆","🌮","🌯","🫔","🥗","🥘","🫕","🥫","🍝","🍜","🍲","🍛","🍣","🍱","🥟","🦪","🍤","🍙","🍚","🍘","🍥","🥠","🥮","🍢","🍡","🍧","🍨","🍦","🥧","🧁","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🌰","🥜","🍯","🥛","🍼","🍵","🫖","🧉","🧋","🧃","🥤","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🍾","🧊","🥄","🍴","🍽","🥣","🥡","🥢","🧂","⚽","🏀","🏈","⚾","🥎","🎾","🏐","🏉","🥏","🪃","🎱","🪀","🏓","🏸","🏒","🏑","🥍","🏏","🥅","⛳","🪁","🏹","🎣","🤿","🥊","🥋","🎽","🛹","🛼","🛷","⛸","🥌","🎿","⛷","🏂","🪂","🏋","🤼","🤸","⛹","🤺","🤾","🏌","🏇","🧘","🏄","🏊","🤽","🚣","🧗","🚵","🚴","🏆","🥇","🥈","🥉","🏅","🎖","🏵","🎗","🎫","🎟","🎪","🤹","🎭","🩰","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🪘","🎷","🎺","🎸","🪕","🎻","🪗","🎲","♟","🎯","🎳","🎮","🎰","🧩","🚗","🚕","🚙","🛻","🚌","🚎","🏎","🚓","🚑","🚒","🚐","🚚","🚛","🚜","🦯","🦽","🦼","🛴","🚲","🛵","🏍","🛺","🚨","🚔","🚍","🚘","🚖","🚡","🚠","🚟","🚃","🚋","🚞","🚝","🚄","🚅","🚈","🚂","🚆","🚇","🚊","🚉","🛫","🛬","🛩","💺","🛰","🚀","🛸","🚁","🛶","⛵","🚤","🛥","🛳","⛴","🚢","⛽","🚧","🚦","🚥","🚏","🗺","🗿","🗽","🗼","🏰","🏯","🏟","🎡","🎢","🎠","⛲","⛱","🏖","🏝","🏜","🌋","⛰","🏔","🗻","🏕","⛺","🏠","🏡","🏘","🏚","🛖","🏗","🏭","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","🏛","⛪","🕌","🕍","🛕","🕋","⛩","🛤","🛣","🗾","🎑","🏞","🌅","🌄","🌠","🎇","🎆","🌇","🌆","🏙","🌃","🌌","🌉","🌁","⌚","📱","📲","💻","🖥","🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽","🎞","📞","☎","📟","📠","📺","📻","🎙","🎚","🎛","🧭","⏱","⏲","⏰","🕰","⌛","⏳","📡","🔋","🔌","💡","🔦","🕯","🪔","🧯","🛢","💸","💵","💴","💶","💷","🪙","💰","💳","💎","🪜","🧰","🪛","🔧","🔨","🛠","⛏","🔩","🧱","⛓","🪝","🪢","🧲","🔫","💣","🧨","🪓","🪚","🔪","🗡","🛡","🚬","⚰","🪦","⚱","🏺","🪄","🔮","📿","🧿","💈","🔭","🔬","🕳","🪟","🩹","🩺","💊","💉","🩸","🧬","🦠","🧫","🧪","🌡","🪤","🧹","🧺","🪡","🧻","🚽","🪠","🪣","🚰","🚿","🛁","🛀","🪥","🧼","🪒","🧽","🧴","🛎","🔑","🗝","🚪","🪑","🪞","🛋","🛏","🛌","🧸","🖼","🛍","🛒","🎁","🎈","🎏","🎀","🎊","🎉","🪅","🪆","🎎","🏮","🎐","🧧","📩","📨","📧","💌","📥","📤","📦","🏷","📪","📫","📬","📭","📮","📯","🪧","📜","📃","📄","📑","🧾","📊","📈","📉","🗒","🗓","📆","📅","🗑","📇","🗃","🗳","🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒","📕","📗","📘","📙","📚","📖","🔖","🧷","🔗","📎","🖇","📐","📏","🧮","📌","📍","🖊","🖋","🖌","🖍","📝","✏","🔍","🔎","🔏","🔐","🔒","🔓","🧡","💛","💚","💙","💜","🖤","🤎","🤍","💔","💕","💞","💓","💗","💖","💘","💝","💟","☮","✝","☪","🕉","🔯","🕎","☯","🛐","⛎","♊","♋","♌","♍","♎","♏","🆔","⚛","🉑","📴","📳","🈶","🈚","🈸","🈺","🈷","🆚","💮","🉐","🈴","🈵","🈹","🈲","🅰","🅱","🆎","🆑","🅾","🆘","❌","⭕","🛑","⛔","📛","🚫","💯","💢","🚷","🚯","🚳","🚱","🔞","📵","🚭","‼","🔅","🔆","〽","⚠","🚸","🔱","⚜","🔰","♻","🈯","💹","❎","🌐","💠","Ⓜ","🌀","💤","🏧","🚾","♿","🅿","🈳","🈂","🛂","🛃","🛄","🛅","🛗","🚹","🚺","🚼","🚻","🚮","🎦","📶","🈁","🔣","🔤","🔡","🔠","🆖","🆗","🆙","🆒","🆕","🆓","0","1","2","3","4","5","6","7","8","9","🔟","🔢","#","*","⏏","▶","⏸","⏯","⏹","⏺","⏭","⏮","⏩","⏪","⏫","⏬","◀","🔼","🔽","➡","⬅","⬆","⬇","↪","↩","🔀","🔁","🔂","🔄","🔃","🎵","🎶","♾","💲","💱","©","®","➰","➿","🔚","🔙","🔛","🔝","🔜","🔘","⚪","⚫","🔴","🔵","🟤","🟣","🟢","🟡","🟠","🔺","🔻","🔸","🔹","🔶","🔷","🔳","🔲","▪","▫","◾","◽","◼","◻","⬛","⬜","🟧","🟦","🟥","🟫","🟪","🟩","🟨","🔈","🔇","🔉","🔊","🔔","🔕","📣","📢","🗨","💬","💭","🗯","🃏","🎴","🀄","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧","⚧","🏳","🏴","🏁","🚩","🇦","🇩","🇧","🇮","🇻","🇰","🇨","🇹","🇭","🇪","🇸","🇬","🇫","🇵","🇯","🎌","🇽","🇱","🇲","🇾","🇳","🇴","🇶","🇷","🇼","🇿","🇺","🏻","🏼","🏽","🏾","🏿"]};function o(t){var o=[];return e.each(t.o.plugins.emoji.emojiList,(function(a,n){if(e.isArray(n)){var r=n[0],l=n[1],i=''+r+'',s="emoji-"+r.replace(/:/g,""),d={hasIcon:!1,text:i,fn:function(){return t.execCmd("insertImage",l,!1,!0),!0}};t.addBtnDef(s,d),o.push(s)}else{var x="emoji-"+n.replace(/:/g,""),F={text:n,fn:function(){var e=String.fromCodePoint(n.replace("&#","0"));return t.execCmd("insertText",e),!0}};t.addBtnDef(x,F),o.push(x)}})),o}e.extend(!0,e.trumbowyg,{langs:{en:{emoji:"Add an emoji"},az:{emoji:"Emoji yerləşdir"},ca:{emoji:"Afegir una emoticona"},da:{emoji:"Tilføj et humørikon"},de:{emoji:"Emoticon einfügen"},es:{emoji:"Añadir un emoticono"},et:{emoji:"Lisa emotikon"},fr:{emoji:"Ajouter un emoji"},hu:{emoji:"Emoji beszúrás"},ja:{emoji:"絵文字の挿入"},ko:{emoji:"이모지 넣기"},ru:{emoji:"Вставить emoji"},sl:{emoji:"Vstavi emotikon"},tr:{emoji:"Emoji ekle"},zh_cn:{emoji:"添加表情"}},plugins:{emoji:{init:function(e){e.o.plugins.emoji=e.o.plugins.emoji||t;var a={dropdown:o(e)};e.addBtnDef("emoji",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{fontFamily:"Font"},az:{fontFamily:"Şrift"},by:{fontFamily:"Шрыфт"},ca:{fontFamily:"Font"},da:{fontFamily:"Skrifttype"},de:{fontFamily:"Schriftart"},es:{fontFamily:"Fuente"},et:{fontFamily:"Font"},fr:{fontFamily:"Police"},hu:{fontFamily:"Betűtípus"},ko:{fontFamily:"글꼴"},nl:{fontFamily:"Lettertype"},pt_br:{fontFamily:"Fonte"},ru:{fontFamily:"Шрифт"},sl:{fontFamily:"Pisava"},tr:{fontFamily:"Yazı tipi"},zh_tw:{fontFamily:"字體"}}});var t={fontList:[{name:"Arial",family:"Arial, Helvetica, sans-serif"},{name:"Arial Black",family:"Arial Black, Gadget, sans-serif"},{name:"Comic Sans",family:"Comic Sans MS, Textile, cursive, sans-serif"},{name:"Courier New",family:"Courier New, Courier, monospace"},{name:"Georgia",family:"Georgia, serif"},{name:"Impact",family:"Impact, Charcoal, sans-serif"},{name:"Lucida Console",family:"Lucida Console, Monaco, monospace"},{name:"Lucida Sans",family:"Lucida Sans Uncide, Lucida Grande, sans-serif"},{name:"Palatino",family:"Palatino Linotype, Book Antiqua, Palatino, serif"},{name:"Tahoma",family:"Tahoma, Geneva, sans-serif"},{name:"Times New Roman",family:"Times New Roman, Times, serif"},{name:"Trebuchet",family:"Trebuchet MS, Helvetica, sans-serif"},{name:"Verdana",family:"Verdana, Geneva, sans-serif"}]};function o(t){var o=[];return e.each(t.o.plugins.fontfamily.fontList,(function(e,a){t.addBtnDef("fontfamily_"+e,{title:''+a.name+"",hasIcon:!1,fn:function(){t.execCmd("fontName",a.family,!0)}}),o.push("fontfamily_"+e)})),o}e.extend(!0,e.trumbowyg,{plugins:{fontfamily:{init:function(a){a.o.plugins.fontfamily=e.extend({},t,a.o.plugins.fontfamily||{}),a.addBtnDef("fontfamily",{dropdown:o(a),hasIcon:!1,text:a.lang.fontFamily})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{fontFamily:"Font"},az:{fontFamily:"Şrift"},by:{fontFamily:"Шрыфт"},ca:{fontFamily:"Font"},da:{fontFamily:"Skrifttype"},de:{fontFamily:"Schriftart"},es:{fontFamily:"Fuente"},et:{fontFamily:"Font"},fr:{fontFamily:"Police"},hu:{fontFamily:"Betűtípus"},ko:{fontFamily:"글꼴"},nl:{fontFamily:"Lettertype"},pt_br:{fontFamily:"Fonte"},ru:{fontFamily:"Шрифт"},sl:{fontFamily:"Pisava"},tr:{fontFamily:"Yazı tipi"},zh_tw:{fontFamily:"字體"}}});var t={fontList:[{name:"Arial",family:"Arial, Helvetica, sans-serif"},{name:"Arial Black",family:"Arial Black, Gadget, sans-serif"},{name:"Comic Sans",family:"Comic Sans MS, Textile, cursive, sans-serif"},{name:"Courier New",family:"Courier New, Courier, monospace"},{name:"Georgia",family:"Georgia, serif"},{name:"Impact",family:"Impact, Charcoal, sans-serif"},{name:"Lucida Console",family:"Lucida Console, Monaco, monospace"},{name:"Lucida Sans",family:"Lucida Sans Uncide, Lucida Grande, sans-serif"},{name:"Palatino",family:"Palatino Linotype, Book Antiqua, Palatino, serif"},{name:"Tahoma",family:"Tahoma, Geneva, sans-serif"},{name:"Times New Roman",family:"Times New Roman, Times, serif"},{name:"Trebuchet",family:"Trebuchet MS, Helvetica, sans-serif"},{name:"Verdana",family:"Verdana, Geneva, sans-serif"}]};function o(t){var o=[];return e.each(t.o.plugins.fontfamily.fontList,(function(e,a){t.addBtnDef("fontfamily_"+e,{title:''+a.name+"",hasIcon:!1,fn:function(){t.execCmd("fontName",a.family,!0)}}),o.push("fontfamily_"+e)})),o}e.extend(!0,e.trumbowyg,{plugins:{fontfamily:{init:function(a){a.o.plugins.fontfamily=e.extend({},t,a.o.plugins.fontfamily||{}),a.addBtnDef("fontfamily",{dropdown:o(a),hasIcon:!1,text:a.lang.fontFamily})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{giphy:"Insert GIF"},az:{giphy:"GIF yerləşdir"},by:{giphy:"Уставіць GIF"},et:{giphy:"Sisesta GIF"},fr:{giphy:"Insérer un GIF"},hu:{giphy:"GIF beszúrás"},ru:{giphy:"Вставить GIF"},sl:{giphy:"Vstavi GIF"},tr:{giphy:"GIF ekle"}}});var t="tbwcancel";function o(t,o,a,n){var r=(o.width()-20)/3,l=t.data.filter((function(e){return!!(e.images.downsized||e.images.downsized_medium).url})).map((function(e){var t=e.images.downsized||e.images.downsized_medium,o=t.height/t.width,a=e.title;return'
    '+("'+a+'')+"
    "})).join("");if(!0===n){if(0===l.length){if(e("."+a.o.prefix+"giphy-no-result",o).length>0)return;l=''}o.empty()}o.append(l);var i=function(e){e.classList.add("tbw-loaded")};e("img",o).each((function(){var e=this;e.complete?i(e):e.addEventListener("load",(function(){i(this)}))})),e("img",o).on("click",(function(){var t=e(this).attr("src"),n=e(this).attr("alt");(a.restoreRange(),a.execCmd("insertImage",t,!1,!0),n)&&(e('img[src="'+t+'"]:not([alt])',a.$box).attr("alt",n),a.syncCode());e("img",o).off(),a.closeModal()}))}var a={rating:"g",apiKey:null,throttleDelay:300,noResultGifUrl:"https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif"};e.extend(!0,e.trumbowyg,{plugins:{giphy:{init:function(n){n.o.plugins.giphy=e.extend({},a,n.o.plugins.giphy||{}),n.addBtnDef("giphy",{fn:function(){if(null===n.o.plugins.giphy.apiKey)throw new Error("You must set a Giphy API Key");var a="https://api.giphy.com/v1/gifs/search?api_key="+n.o.plugins.giphy.apiKey+"&rating="+n.o.plugins.giphy.rating,r=a.replace("/search","/trending"),l={abort:function(){}},i=n.o.prefix,s=''+('')+('
    Powered by
    ')+'
    ';n.openModal(null,s,!1).one(t,(function(){try{l.abort()}catch(e){}n.closeModal()}));var d=e("."+i+"giphy-search"),x=e("."+i+"giphy-close"),F=e("."+i+"giphy-modal"),u=function(){navigator.onLine||e("."+i+"giphy-offline",F).length||(F.empty(),F.append('

    You are offline

    '))};e.ajax({url:r,dataType:"json",success:function(e){o(e,F,n,!0)},error:u});var c,f,m,p,g=(c=function(){var t=d.val();if(0!==t.length){try{l.abort()}catch(e){}l=e.ajax({url:a+"&q="+encodeURIComponent(t),dataType:"json",success:function(e){o(e,F,n,!0)},error:u})}},f=n.o.plugins.giphy.throttleDelay,function(){var e=this,t=+new Date,o=arguments;m&&t'+a+'
    '})).join("");if(!0===n){if(0===l.length){if(e("."+a.o.prefix+"giphy-no-result",o).length>0)return;l=''}o.empty()}o.append(l);var i=function(e){e.classList.add("tbw-loaded")};e("img",o).each((function(){var e=this;e.complete?i(e):e.addEventListener("load",(function(){i(this)}))})),e("img",o).on("click",(function(){var t=e(this).attr("src"),n=e(this).attr("alt");a.restoreRange(),a.execCmd("insertImage",t,!1,!0),n&&(e('img[src="'+t+'"]:not([alt])',a.$box).attr("alt",n),a.syncCode()),e("img",o).off(),a.closeModal()}))}var a={rating:"g",apiKey:null,throttleDelay:300,noResultGifUrl:"https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif"};e.extend(!0,e.trumbowyg,{plugins:{giphy:{init:function(n){n.o.plugins.giphy=e.extend({},a,n.o.plugins.giphy||{}),n.addBtnDef("giphy",{fn:function(){if(null===n.o.plugins.giphy.apiKey)throw new Error("You must set a Giphy API Key");var a="https://api.giphy.com/v1/gifs/search?api_key="+n.o.plugins.giphy.apiKey+"&rating="+n.o.plugins.giphy.rating,r=a.replace("/search","/trending"),l={abort:function(){}},i=n.o.prefix,s='
    Powered by
    ';n.openModal(null,s,!1).one(t,(function(){try{l.abort()}catch(e){}n.closeModal()}));var d=e("."+i+"giphy-search"),x=e("."+i+"giphy-close"),F=e("."+i+"giphy-modal"),u=function(){navigator.onLine||e("."+i+"giphy-offline",F).length||(F.empty(),F.append('

    You are offline

    '))};e.ajax({url:r,dataType:"json",success:function(e){o(e,F,n,!0)},error:u});var c,f,m,p,g=(c=function(){var t=d.val();if(0!==t.length){try{l.abort()}catch(e){}l=e.ajax({url:a+"&q="+encodeURIComponent(t),dataType:"json",success:function(e){o(e,F,n,!0)},error:u})}},f=n.o.plugins.giphy.throttleDelay,function(){var e=this,t=+new Date,o=arguments;m&&t",{css:{"font-size":o},html:this.innerHTML})})),e(t.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(),t.restoreRange(),t.syncCode(),t.$c.trigger("tbwchange")}function a(t){var a=[];if(e.each(t.o.plugins.fontsize.sizeList,(function(e,n){t.addBtnDef("fontsize_"+n,{text:''+(t.lang.fontsizes[n]||n)+"",hasIcon:!1,fn:function(){o(t,n)}}),a.push("fontsize_"+n)})),t.o.plugins.fontsize.allowCustomSize){var n="fontsize_custom",r={fn:function(){t.openModalInsert(t.lang.fontCustomSize.title,{size:{label:t.lang.fontCustomSize.label,value:t.lang.fontCustomSize.value}},(function(e){return o(t,e.size),!0}))},text:''+t.lang.fontsizes.custom+"",hasIcon:!1};t.addBtnDef(n,r),a.push(n)}return a}e.extend(!0,e.trumbowyg,{plugins:{fontsize:{init:function(o){o.o.plugins.fontsize=e.extend({},t,o.o.plugins.fontsize||{}),o.addBtnDef("fontsize",{dropdown:a(o)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{fontsize:"Font size",fontsizes:{"x-small":"Extra small",small:"Small",medium:"Regular",large:"Large","x-large":"Extra large",custom:"Custom"},fontCustomSize:{title:"Custom Font Size",label:"Font Size",value:"48px"}},az:{fontsize:"Şrift həcmi",fontsizes:{"x-small":"Daha kiçik",small:"Kiçik",medium:"Normal",large:"Böyük","x-large":"Daha böyük",custom:"Fərdi həcm"},fontCustomSize:{title:"Fərdi şrift həcmi",label:"Şrift həcmi",value:"48px"}},by:{fontsize:"Памер шрыфта",fontsizes:{"x-small":"Вельмі маленькі",small:"Маленькі",medium:"Звычайны",large:"Вялікі","x-large":"Вельмі вялікі",custom:"Карыстальніцкі"},fontCustomSize:{title:"Карыстальніцкі Памер Шрыфта",label:"Памер Шрыфта",value:"48px"}},ca:{fontsize:"Mida de la lletra",fontsizes:{"x-small":"Molt petita",small:"Petita",medium:"Normal",large:"Gran","x-large":"Molt Gran",custom:"Personalitzada"},fontCustomSize:{title:"Mida de lletra personalitzada",label:"Mida de lletra",value:"48px"}},da:{fontsize:"Skriftstørrelse",fontsizes:{"x-small":"Ekstra lille",small:"Lille",medium:"Normal",large:"Stor","x-large":"Ekstra stor",custom:"Brugerdefineret"}},de:{fontsize:"Schriftgröße",fontsizes:{"x-small":"Sehr klein",small:"Klein",medium:"Normal",large:"Groß","x-large":"Sehr groß",custom:"Benutzerdefiniert"},fontCustomSize:{title:"Benutzerdefinierte Schriftgröße",label:"Schriftgröße",value:"48px"}},es:{fontsize:"Tamaño de Fuente",fontsizes:{"x-small":"Extra pequeña",small:"Pegueña",medium:"Regular",large:"Grande","x-large":"Extra Grande",custom:"Customizada"},fontCustomSize:{title:"Tamaño de Fuente Customizada",label:"Tamaño de Fuente",value:"48px"}},et:{fontsize:"Teksti suurus",fontsizes:{"x-small":"Väga väike",small:"Väike",medium:"Tavaline",large:"Suur","x-large":"Väga suur",custom:"Määra ise"},fontCustomSize:{title:"Kohandatud teksti suurus",label:"Teksti suurus",value:"48px"}},fr:{fontsize:"Taille de la police",fontsizes:{"x-small":"Très petit",small:"Petit",medium:"Normal",large:"Grand","x-large":"Très grand",custom:"Taille personnalisée"},fontCustomSize:{title:"Taille de police personnalisée",label:"Taille de la police",value:"48px"}},hu:{fontsize:"Betű méret",fontsizes:{"x-small":"Extra kicsi",small:"Kicsi",medium:"Normális",large:"Nagy","x-large":"Extra nagy",custom:"Egyedi"},fontCustomSize:{title:"Egyedi betű méret",label:"Betű méret",value:"48px"}},it:{fontsize:"Dimensioni del testo",fontsizes:{"x-small":"Molto piccolo",small:"piccolo",regular:"normale",large:"grande","x-large":"Molto grande",custom:"Personalizzato"},fontCustomSize:{title:"Dimensioni del testo personalizzato",label:"Dimensioni del testo",value:"48px"}},ko:{fontsize:"글꼴 크기",fontsizes:{"x-small":"아주 작게",small:"작게",medium:"보통",large:"크게","x-large":"아주 크게",custom:"사용자 지정"},fontCustomSize:{title:"사용자 지정 글꼴 크기",label:"글꼴 크기",value:"48px"}},nl:{fontsize:"Lettergrootte",fontsizes:{"x-small":"Extra klein",small:"Klein",medium:"Normaal",large:"Groot","x-large":"Extra groot",custom:"Handmatig"},fontCustomSize:{title:"Handmatige lettergrootte",label:"Lettergrootte",value:"48px"}},pt_br:{fontsize:"Tamanho da fonte",fontsizes:{"x-small":"Extra pequeno",small:"Pequeno",regular:"Médio",large:"Grande","x-large":"Extra grande",custom:"Personalizado"},fontCustomSize:{title:"Tamanho de Fonte Personalizado",label:"Tamanho de Fonte",value:"48px"}},ru:{fontsize:"Размер шрифта",fontsizes:{"x-small":"Очень маленький",small:"Маленький",medium:"Обычный",large:"Большой","x-large":"Очень большой",custom:"Пользовательский"},fontCustomSize:{title:"Пользовательский Размер Шрифта",label:"Размер Шрифта",value:"48px"}},sl:{fontsize:"Velikost pisave",fontsizes:{"x-small":"Ekstra majhna",small:"Majhna",medium:"Navadno",large:"Velika","x-large":"Ekstra velika",custom:"Poljubna"},fontCustomSize:{title:"Poljubna velikost pisave",label:"Velikost pisave",value:"48px"}},tr:{fontsize:"Yazı boyutu",fontsizes:{"x-small":"Çok küçük",small:"Küçük",medium:"Normal",large:"Büyük","x-large":"Çok büyük",custom:"Özel"},fontCustomSize:{title:"Özel Yazı Boyutu",label:"Yazı Boyutu",value:"48px"}},zh_tw:{fontsize:"字體大小",fontsizes:{"x-small":"最小",small:"小",medium:"中",large:"大","x-large":"最大",custom:"自訂大小"},fontCustomSize:{title:"自訂義字體大小",label:"字體大小",value:"48px"}}}});var t={sizeList:["x-small","small","medium","large","x-large"],allowCustomSize:!0};function o(t,o){t.$ed.focus(),t.saveRange(),t.execCmd("fontSize","1");var a=t.$ed.find('font[size="1"]');a.find('span[style*="font-size"]').contents().unwrap(),a.replaceWith((function(){return e("",{css:{"font-size":o},html:this.innerHTML})})),e(t.range.startContainer.parentElement).find('span[style=""]').contents().unwrap(),t.restoreRange(),t.syncCode(),t.$c.trigger("tbwchange")}function a(t){var a=[];if(e.each(t.o.plugins.fontsize.sizeList,(function(e,n){t.addBtnDef("fontsize_"+n,{text:''+(t.lang.fontsizes[n]||n)+"",hasIcon:!1,fn:function(){o(t,n)}}),a.push("fontsize_"+n)})),t.o.plugins.fontsize.allowCustomSize){var n="fontsize_custom",r={fn:function(){t.openModalInsert(t.lang.fontCustomSize.title,{size:{label:t.lang.fontCustomSize.label,value:t.lang.fontCustomSize.value}},(function(e){return o(t,e.size),!0}))},text:''+t.lang.fontsizes.custom+"",hasIcon:!1};t.addBtnDef(n,r),a.push(n)}return a}e.extend(!0,e.trumbowyg,{plugins:{fontsize:{init:function(o){o.o.plugins.fontsize=e.extend({},t,o.o.plugins.fontsize||{}),o.addBtnDef("fontsize",{dropdown:a(o)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{history:{destroy:function(e){e.$c.off("tbwinit.history tbwchange.history")},init:function(t){t.o.plugins.history=e.extend(!0,{_stack:[],_index:-1,_focusEl:void 0},t.o.plugins.history||{});var o={title:t.lang.redo,ico:"redo",key:"Y",fn:function(){if(t.o.plugins.history._index0){t.o.plugins.history._index-=1;var e=t.o.plugins.history._index,o=t.o.plugins.history._stack[e];t.execCmd("html",o),t.o.plugins.history._stack[e]=t.$ed.html(),i(),n()}}},n=function(){var e=t.o.plugins.history._index,o=t.o.plugins.history._stack.length,a=0!==o&&e!==o-1;r("historyUndo",e>0),r("historyRedo",a)},r=function(e,o){var a=t.$box.find(".trumbowyg-"+e+"-button");o?a.removeClass("trumbowyg-disable"):a.hasClass("trumbowyg-disable")||a.addClass("trumbowyg-disable")},l=function(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;for(var o=0;o0&&(o.setStartAfter(e.childNodes[e.childNodes.length-1]),o.setEndAfter(e.childNodes[e.childNodes.length-1]),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(o))};t.$c.on("tbwinit.history tbwchange.history",(function(){var o,a,r=t.o.plugins.history._index,i=t.o.plugins.history._stack,s=i.slice(-1)[0]||"

    ",d=i[r],x=t.$ed.html(),F=t.doc.getSelection().focusNode,u="",c=t.o.plugins.history._focusEl;o=e("
    "+s+"
    ").find("*").map((function(){return this.localName})),a=e("
    "+x+"
    ").find("*").map((function(){return this.localName})),F&&(t.o.plugins.history._focusEl=F,u=F.outerHTML||F.textContent),x!==d&&(u.slice(-1).match(/\s/)||!l(o,a)||t.o.plugins.history._index<=0||F!==c?(t.o.plugins.history._index+=1,t.o.plugins.history._stack=i.slice(0,t.o.plugins.history._index),t.o.plugins.history._stack.push(x)):t.o.plugins.history._stack[r]=x,n())})),t.addBtnDef("historyRedo",o),t.addBtnDef("historyUndo",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{history:{destroy:function(e){e.$c.off("tbwinit.history tbwchange.history")},init:function(t){t.o.plugins.history=e.extend(!0,{_stack:[],_index:-1,_focusEl:void 0},t.o.plugins.history||{});var o={title:t.lang.redo,ico:"redo",key:"Y",fn:function(){if(t.o.plugins.history._index0){t.o.plugins.history._index-=1;var e=t.o.plugins.history._index,o=t.o.plugins.history._stack[e];t.execCmd("html",o),t.o.plugins.history._stack[e]=t.$ed.html(),l(),n()}}},n=function(){var e=t.o.plugins.history._index,o=t.o.plugins.history._stack.length,a=0!==o&&e!==o-1;r("historyUndo",e>0),r("historyRedo",a)},r=function(e,o){var a=t.$box.find(".trumbowyg-"+e+"-button");o?a.removeClass("trumbowyg-disable"):a.hasClass("trumbowyg-disable")||a.addClass("trumbowyg-disable")},l=function(){var e=t.doc.getSelection().focusNode,o=t.doc.createRange();e.childNodes.length>0&&(o.setStartAfter(e.childNodes[e.childNodes.length-1]),o.setEndAfter(e.childNodes[e.childNodes.length-1]),t.doc.getSelection().removeAllRanges(),t.doc.getSelection().addRange(o))};t.$c.on("tbwinit.history tbwchange.history",(function(){var o,a,r=t.o.plugins.history._index,l=t.o.plugins.history._stack,i=l.slice(-1)[0]||"

    ",s=l[r],d=t.$ed.html(),x=t.doc.getSelection().focusNode,F="",u=t.o.plugins.history._focusEl;o=e("
    "+i+"
    ").find("*").map((function(){return this.localName})),a=e("
    "+d+"
    ").find("*").map((function(){return this.localName})),x&&(t.o.plugins.history._focusEl=x,F=x.outerHTML||x.textContent),d!==s&&(F.slice(-1).match(/\s/)||!function(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;for(var o=0;o")[0];return o.range.deleteContents(),o.range.insertNode(n),!0}))}};o.addBtnDef("insertAudio",a)}}}})}(jQuery),function(e){"use strict";var t={src:{label:"URL",required:!0},autoplay:{label:"AutoPlay",required:!1,type:"checkbox"},muted:{label:"Muted",required:!1,type:"checkbox"},preload:{label:"preload options",required:!1}};e.extend(!0,e.trumbowyg,{langs:{en:{insertAudio:"Insert Audio"},az:{insertAudio:"Səs yerləşdir"},by:{insertAudio:"Уставіць аўдыё"},ca:{insertAudio:"Inserir Audio"},da:{insertAudio:"Indsæt lyd"},es:{insertAudio:"Insertar Audio"},et:{insertAudio:"Lisa helifail"},fr:{insertAudio:"Insérer un son"},hu:{insertAudio:"Audio beszúrás"},ja:{insertAudio:"音声の挿入"},ko:{insertAudio:"소리 넣기"},pt_br:{insertAudio:"Inserir áudio"},ru:{insertAudio:"Вставить аудио"},sl:{insertAudio:"Vstavi zvočno datoteko"},tr:{insertAudio:"Ses Ekle"}},plugins:{insertAudio:{init:function(o){var a={fn:function(){o.openModalInsert(o.lang.insertAudio,t,(function(t){var a="")[0];return o.range.deleteContents(),o.range.insertNode(n),!0}))}};o.addBtnDef("insertAudio",a)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},az:{lineheight:"Sətir yüksəkliyi",lineheights:{.9:"Kiçik",normal:"Normal",1.5:"Böyük","2.0":"Daha böyük"}},by:{lineheight:"Міжрадковы інтэрвал",lineheights:{.9:"Маленькі",normal:"Звычайны",1.5:"Вялікі","2.0":"Вельмі вялікі"}},da:{lineheight:"Linjehøjde",lineheights:{.9:"Lille",normal:"Normal",1.5:"Stor","2.0":"Ekstra stor"}},et:{lineheight:"Reavahe",lineheights:{.9:"Väike",normal:"Tavaline",1.5:"Suur","2.0":"Väga suur"}},fr:{lineheight:"Hauteur de ligne",lineheights:{.9:"Petite",normal:"Normale",1.5:"Grande","2.0":"Très grande"}},hu:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},it:{lineheight:"Altezza linea",lineheights:{.9:"Bassa",normal:"Normale",1.5:"Alta","2.0":"Molto alta"}},ko:{lineheight:"줄 간격",lineheights:{.9:"좁게",normal:"보통",1.5:"넓게","2.0":"아주 넓게"}},nl:{lineheight:"Regelhoogte",lineheights:{.9:"Klein",normal:"Normaal",1.5:"Groot","2.0":"Extra groot"}},pt_br:{lineheight:"Altura de linha",lineheights:{.9:"Pequena",normal:"Regular",1.5:"Grande","2.0":"Extra grande"}},ru:{lineheight:"Межстрочный интервал",lineheights:{.9:"Маленький",normal:"Обычный",1.5:"Большой","2.0":"Очень большой"}},sl:{lineheight:"Višina vrstice",lineheights:{.9:"Majhna",normal:"Navadna",1.5:"Velika","2.0":"Ekstra velika"}},tr:{lineheight:"Satır yüksekliği",lineheights:{.9:"Küçük",normal:"Normal",1.5:"Büyük","2.0":"Çok Büyük"}},zh_tw:{lineheight:"文字間距",lineheights:{.9:"小",normal:"正常",1.5:"大","2.0":"特大"}}}});var t={sizeList:["0.9","normal","1.5","2.0"]};function o(t){var o=[];return e.each(t.o.plugins.lineheight.sizeList,(function(a,n){t.addBtnDef("lineheight_"+n,{text:t.lang.lineheights[n]||n,hasIcon:!1,fn:function(){if(t.saveRange(),""!==t.getRangeText().replace(/\s/g,""))try{var o=function(){var e,t=null;window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement());return t}();e(o).css("lineHeight",n)}catch(e){}}}),o.push("lineheight_"+n)})),o}e.extend(!0,e.trumbowyg,{plugins:{lineheight:{init:function(a){a.o.plugins.lineheight=e.extend({},t,a.o.plugins.lineheight||{}),a.addBtnDef("lineheight",{dropdown:o(a)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},az:{lineheight:"Sətir yüksəkliyi",lineheights:{.9:"Kiçik",normal:"Normal",1.5:"Böyük","2.0":"Daha böyük"}},by:{lineheight:"Міжрадковы інтэрвал",lineheights:{.9:"Маленькі",normal:"Звычайны",1.5:"Вялікі","2.0":"Вельмі вялікі"}},da:{lineheight:"Linjehøjde",lineheights:{.9:"Lille",normal:"Normal",1.5:"Stor","2.0":"Ekstra stor"}},et:{lineheight:"Reavahe",lineheights:{.9:"Väike",normal:"Tavaline",1.5:"Suur","2.0":"Väga suur"}},fr:{lineheight:"Hauteur de ligne",lineheights:{.9:"Petite",normal:"Normale",1.5:"Grande","2.0":"Très grande"}},hu:{lineheight:"Line height",lineheights:{.9:"Small",normal:"Regular",1.5:"Large","2.0":"Extra large"}},it:{lineheight:"Altezza linea",lineheights:{.9:"Bassa",normal:"Normale",1.5:"Alta","2.0":"Molto alta"}},ko:{lineheight:"줄 간격",lineheights:{.9:"좁게",normal:"보통",1.5:"넓게","2.0":"아주 넓게"}},nl:{lineheight:"Regelhoogte",lineheights:{.9:"Klein",normal:"Normaal",1.5:"Groot","2.0":"Extra groot"}},pt_br:{lineheight:"Altura de linha",lineheights:{.9:"Pequena",normal:"Regular",1.5:"Grande","2.0":"Extra grande"}},ru:{lineheight:"Межстрочный интервал",lineheights:{.9:"Маленький",normal:"Обычный",1.5:"Большой","2.0":"Очень большой"}},sl:{lineheight:"Višina vrstice",lineheights:{.9:"Majhna",normal:"Navadna",1.5:"Velika","2.0":"Ekstra velika"}},tr:{lineheight:"Satır yüksekliği",lineheights:{.9:"Küçük",normal:"Normal",1.5:"Büyük","2.0":"Çok Büyük"}},zh_tw:{lineheight:"文字間距",lineheights:{.9:"小",normal:"正常",1.5:"大","2.0":"特大"}}}});var t={sizeList:["0.9","normal","1.5","2.0"]};function o(t){var o=[];return e.each(t.o.plugins.lineheight.sizeList,(function(a,n){t.addBtnDef("lineheight_"+n,{text:t.lang.lineheights[n]||n,hasIcon:!1,fn:function(){if(t.saveRange(),""!==t.getRangeText().replace(/\s/g,""))try{var o=function(){var e,t=null;return window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement()),t}();e(o).css("lineHeight",n)}catch(e){}}}),o.push("lineheight_"+n)})),o}e.extend(!0,e.trumbowyg,{plugins:{lineheight:{init:function(a){a.o.plugins.lineheight=e.extend({},t,a.o.plugins.lineheight||{}),a.addBtnDef("lineheight",{dropdown:o(a)})}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{mathml:"Insert Formulas",formulas:"Formulas",inline:"Inline"},az:{mathml:"Düstur əlavə et",formulas:"Düsturlar",inline:"Sətir içi"},by:{mathml:"Уставіць формулу",formulas:"Формула",inline:"Inline-элемент"},ca:{mathml:"Inserir Fórmula",formulas:"Fórmula",inline:"En línia"},da:{mathml:"Indsæt formler",formulas:"Formler",inline:"Inline"},es:{mathml:"Insertar Fórmula",formulas:"Fórmula",inline:"En línea"},et:{mathml:"Sisesta valem",formulas:"Valemid",inline:"Teksti sees"},fr:{mathml:"Inserer une formule",formulas:"Formule",inline:"En ligne"},hu:{mathml:"Formulák beszúrás",formulas:"Formulák",inline:"Inline"},ko:{mathml:"수식 넣기",formulas:"수식",inline:"글 안에 넣기"},pt_br:{mathml:"Inserir fórmulas",formulas:"Fórmulas",inline:"Em linha"},ru:{mathml:"Вставить формулу",formulas:"Формула",inline:"Строчный элемент"},sl:{mathml:"Vstavi matematični izraz",formulas:"Formula",inline:"V vrstici"},tr:{mathml:"Formül Ekle",formulas:"Formüller",inline:"Satır içi"},zh_tw:{mathml:"插入方程式",formulas:"方程式",inline:"內嵌"}},plugins:{mathml:{init:function(t){var o={formulas:{label:t.lang.formulas,required:!0,value:""},inline:{label:t.lang.inline,attributes:{checked:!0},type:"checkbox",required:!1}},a=function(o){var a=o.inline?"$":"$$";if(t.currentMathNode)e(t.currentMathNode).html(a+" "+o.formulas+" "+a).attr("formulas",o.formulas).attr("inline",o.inline?"true":"false");else{var r=''+a+" "+o.formulas+" "+a+"",l=e(r)[0];l.onclick=n,t.range.deleteContents(),t.range.insertNode(l)}return t.currentMathNode=!1,MathJax.Hub.Queue(["Typeset",MathJax.Hub]),!0},n=function(){t.currentMathNode=this,o.formulas.value=e(this).attr("formulas"),"true"===e(this).attr("inline")?o.inline.attributes.checked=!0:delete o.inline.attributes.checked,t.openModalInsert(t.lang.mathml,o,a)},r={fn:function(){t.saveRange(),o.formulas.value=t.getRangeText(),o.inline.attributes.checked=!0,t.openModalInsert(t.lang.mathml,o,a)}};t.$ta.on("tbwinit",(function(){t.$ed.find("[formulas]").each((function(e,t){t.onclick=n}))})),t.addBtnDef("mathml",r)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{mathml:"Insert Formulas",formulas:"Formulas",inline:"Inline"},az:{mathml:"Düstur əlavə et",formulas:"Düsturlar",inline:"Sətir içi"},by:{mathml:"Уставіць формулу",formulas:"Формула",inline:"Inline-элемент"},ca:{mathml:"Inserir Fórmula",formulas:"Fórmula",inline:"En línia"},da:{mathml:"Indsæt formler",formulas:"Formler",inline:"Inline"},es:{mathml:"Insertar Fórmula",formulas:"Fórmula",inline:"En línea"},et:{mathml:"Sisesta valem",formulas:"Valemid",inline:"Teksti sees"},fr:{mathml:"Inserer une formule",formulas:"Formule",inline:"En ligne"},hu:{mathml:"Formulák beszúrás",formulas:"Formulák",inline:"Inline"},ko:{mathml:"수식 넣기",formulas:"수식",inline:"글 안에 넣기"},pt_br:{mathml:"Inserir fórmulas",formulas:"Fórmulas",inline:"Em linha"},ru:{mathml:"Вставить формулу",formulas:"Формула",inline:"Строчный элемент"},sl:{mathml:"Vstavi matematični izraz",formulas:"Formula",inline:"V vrstici"},tr:{mathml:"Formül Ekle",formulas:"Formüller",inline:"Satır içi"},zh_tw:{mathml:"插入方程式",formulas:"方程式",inline:"內嵌"}},plugins:{mathml:{init:function(t){var o={formulas:{label:t.lang.formulas,required:!0,value:""},inline:{label:t.lang.inline,attributes:{checked:!0},type:"checkbox",required:!1}},a=function(o){var a=o.inline?"$":"$$";if(t.currentMathNode)e(t.currentMathNode).html(a+" "+o.formulas+" "+a).attr("formulas",o.formulas).attr("inline",o.inline?"true":"false");else{var r=''+a+" "+o.formulas+" "+a+"",l=e(r)[0];l.onclick=n,t.range.deleteContents(),t.range.insertNode(l)}return t.currentMathNode=!1,MathJax.Hub.Queue(["Typeset",MathJax.Hub]),!0},n=function(){t.currentMathNode=this,o.formulas.value=e(this).attr("formulas"),"true"===e(this).attr("inline")?o.inline.attributes.checked=!0:delete o.inline.attributes.checked,t.openModalInsert(t.lang.mathml,o,a)},r={fn:function(){t.saveRange(),o.formulas.value=t.getRangeText(),o.inline.attributes.checked=!0,t.openModalInsert(t.lang.mathml,o,a)}};t.$ta.on("tbwinit",(function(){t.$ed.find("[formulas]").each((function(e,t){t.onclick=n}))})),t.addBtnDef("mathml",r)}}}})}(jQuery),function(e){"use strict";var t={source:[],formatDropdownItem:function(e){return e.login},formatResult:function(e){return"@"+e.login+" "}};function o(t,o){var a=[];return e.each(t,(function(e,t){var n="mention-"+e,r={hasIcon:!1,text:o.o.plugins.mention.formatDropdownItem(t),fn:function(){return o.execCmd("insertHTML",o.o.plugins.mention.formatResult(t)),!0}};o.addBtnDef(n,r),a.push(n)})),a}e.extend(!0,e.trumbowyg,{langs:{en:{mention:"Mention"},az:{mention:"Bildirmək"},by:{mention:"Згадаць"},da:{mention:"Nævn"},et:{mention:"Maini"},fr:{mention:"Mentionner"},hu:{mention:"Említ"},ko:{mention:"언급"},pt_br:{mention:"Menção"},ru:{mention:"Упомянуть"},sl:{mention:"Omeni"},tr:{mention:"Bahset"},zh_tw:{mention:"標記"}},plugins:{mention:{init:function(a){a.o.plugins.mention=e.extend(!0,{},t,a.o.plugins.mention||{});var n={dropdown:o(a.o.plugins.mention.source,a)};a.addBtnDef("mention",n)}}}})}(jQuery),function(e){"use strict";var t={source:[],formatDropdownItem:function(e){return e.login},formatResult:function(e){return"@"+e.login+" "}};function o(t,o){var a=[];return e.each(t,(function(e,t){var n="mention-"+e,r={hasIcon:!1,text:o.o.plugins.mention.formatDropdownItem(t),fn:function(){return o.execCmd("insertHTML",o.o.plugins.mention.formatResult(t)),!0}};o.addBtnDef(n,r),a.push(n)})),a}e.extend(!0,e.trumbowyg,{langs:{en:{mention:"Mention"},az:{mention:"Bildirmək"},by:{mention:"Згадаць"},da:{mention:"Nævn"},et:{mention:"Maini"},fr:{mention:"Mentionner"},hu:{mention:"Említ"},ko:{mention:"언급"},pt_br:{mention:"Menção"},ru:{mention:"Упомянуть"},sl:{mention:"Omeni"},tr:{mention:"Bahset"},zh_tw:{mention:"標記"}},plugins:{mention:{init:function(a){a.o.plugins.mention=e.extend(!0,{},t,a.o.plugins.mention||{});var n={dropdown:o(a.o.plugins.mention.source,a)};a.addBtnDef("mention",n)}}}})}(jQuery),function(e){"use strict";var t={proxy:"https://noembed.com/embed?nowrap=on",urlFiled:"url",data:[],success:void 0,error:void 0};e.extend(!0,e.trumbowyg,{langs:{en:{noembed:"Noembed",noembedError:"Error"},az:{noembed:"Noembed",noembedError:"Xəta"},by:{noembedError:"Памылка"},cs:{noembedError:"Chyba"},da:{noembedError:"Fejl"},et:{noembed:"Noembed",noembedError:"Viga"},fr:{noembedError:"Erreur"},hu:{noembed:"Noembed",noembedError:"Hiba"},ja:{noembedError:"エラー"},ko:{noembed:"oEmbed 넣기",noembedError:"에러"},pt_br:{noembed:"Incorporar",noembedError:"Erro"},ru:{noembedError:"Ошибка"},sl:{noembed:"Noembed",noembedError:"Napaka"},sk:{noembedError:"Chyba"},tr:{noembedError:"Hata"},zh_tw:{noembed:"插入影片",noembedError:"錯誤"}},plugins:{noembed:{init:function(o){o.o.plugins.noembed=e.extend(!0,{},t,o.o.plugins.noembed||{});var a={fn:function(){var t=o.openModalInsert(o.lang.noembed,{url:{label:"URL",required:!0}},(function(a){e.ajax({url:o.o.plugins.noembed.proxy,type:"GET",data:a,cache:!1,dataType:"json",success:function(a){o.o.plugins.noembed.success?o.o.plugins.noembed.success(a,o,t):a.html?(o.execCmd("insertHTML",a.html),setTimeout((function(){o.closeModal()}),250)):o.addErrorOnModalField(e("input[type=text]",t),a.error)},error:o.o.plugins.noembed.error||function(){o.addErrorOnModalField(e("input[type=text]",t),o.lang.noembedError)}})}))}};o.addBtnDef("noembed",a)}}}})}(jQuery),function(e){"use strict";var t={proxy:"https://noembed.com/embed?nowrap=on",urlFiled:"url",data:[],success:void 0,error:void 0};e.extend(!0,e.trumbowyg,{langs:{en:{noembed:"Noembed",noembedError:"Error"},az:{noembed:"Noembed",noembedError:"Xəta"},by:{noembedError:"Памылка"},cs:{noembedError:"Chyba"},da:{noembedError:"Fejl"},et:{noembed:"Noembed",noembedError:"Viga"},fr:{noembedError:"Erreur"},hu:{noembed:"Noembed",noembedError:"Hiba"},ja:{noembedError:"エラー"},ko:{noembed:"oEmbed 넣기",noembedError:"에러"},pt_br:{noembed:"Incorporar",noembedError:"Erro"},ru:{noembedError:"Ошибка"},sl:{noembed:"Noembed",noembedError:"Napaka"},sk:{noembedError:"Chyba"},tr:{noembedError:"Hata"},zh_tw:{noembed:"插入影片",noembedError:"錯誤"}},plugins:{noembed:{init:function(o){o.o.plugins.noembed=e.extend(!0,{},t,o.o.plugins.noembed||{});var a={fn:function(){var t=o.openModalInsert(o.lang.noembed,{url:{label:"URL",required:!0}},(function(a){e.ajax({url:o.o.plugins.noembed.proxy,type:"GET",data:a,cache:!1,dataType:"json",success:function(a){o.o.plugins.noembed.success?o.o.plugins.noembed.success(a,o,t):a.html?(o.execCmd("insertHTML",a.html),setTimeout((function(){o.closeModal()}),250)):o.addErrorOnModalField(e("input[type=text]",t),a.error)},error:o.o.plugins.noembed.error||function(){o.addErrorOnModalField(e("input[type=text]",t),o.lang.noembedError)}})}))}};o.addBtnDef("noembed",a)}}}})}(jQuery),function(e){"use strict";var t={enabled:!0,endpoints:["https://noembed.com/embed?nowrap=on","https://api.maxmade.nl/url2iframe/embed"]};e.extend(!0,e.trumbowyg,{plugins:{pasteEmbed:{init:function(o){o.o.plugins.pasteEmbed=e.extend(!0,{},t,o.o.plugins.pasteEmbed||{}),o.o.plugins.pasteEmbed.enabled&&o.pasteHandlers.push((function(t){try{var a=(t.originalEvent||t).clipboardData.getData("Text"),n=o.o.plugins.pasteEmbed.endpoints,r=null;if(a.startsWith("http")){t.stopPropagation(),t.preventDefault();var l={url:a.trim()},i="",s=0;r&&r.transport&&r.transport.abort(),r=e.ajax({crossOrigin:!0,url:n[s],type:"GET",data:l,cache:!1,dataType:"jsonp",success:function(e){e.html?(s=0,i=e.html):s+=1},error:function(){s+=1},complete:function(){0===i.length&&s",{href:a,text:a}).prop("outerHTML")),i.length>0&&(s=0,o.execCmd("insertHTML",i))}})}}catch(e){}}))}}}})}(jQuery),function(e){"use strict";var t={enabled:!0,endpoints:["https://noembed.com/embed?nowrap=on","https://api.maxmade.nl/url2iframe/embed"]};e.extend(!0,e.trumbowyg,{plugins:{pasteEmbed:{init:function(o){o.o.plugins.pasteEmbed=e.extend(!0,{},t,o.o.plugins.pasteEmbed||{}),o.o.plugins.pasteEmbed.enabled&&o.pasteHandlers.push((function(t){try{var a=(t.originalEvent||t).clipboardData.getData("Text"),n=o.o.plugins.pasteEmbed.endpoints,r=null;if(a.startsWith("http")){t.stopPropagation(),t.preventDefault();var l={url:a.trim()},i="",s=0;r&&r.transport&&r.transport.abort(),r=e.ajax({crossOrigin:!0,url:n[s],type:"GET",data:l,cache:!1,dataType:"jsonp",success:function(e){e.html?(s=0,i=e.html):s+=1},error:function(){s+=1},complete:function(){0===i.length&&s",{href:a,text:a}).prop("outerHTML")),i.length>0&&(s=0,o.execCmd("insertHTML",i))}})}}catch(e){}}))}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{pasteImage:{init:function(e){e.pasteHandlers.push((function(t){try{for(var o,a=(t.originalEvent||t).clipboardData.items,n=!1,r=a.length-1;r>=0;r-=1)a[r].type.match(/^image\//)&&((o=new FileReader).onloadend=function(t){e.execCmd("insertImage",t.target.result,!1,!0)},o.readAsDataURL(a[r].getAsFile()),n=!0);n&&(t.stopPropagation(),t.preventDefault())}catch(e){}}))}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{plugins:{pasteImage:{init:function(e){e.pasteHandlers.push((function(t){try{for(var o,a=(t.originalEvent||t).clipboardData.items,n=!1,r=a.length-1;r>=0;r-=1)a[r].type.match(/^image\//)&&((o=new FileReader).onloadend=function(t){e.execCmd("insertImage",t.target.result,!1,!0)},o.readAsDataURL(a[r].getAsFile()),n=!0);n&&(t.stopPropagation(),t.preventDefault())}catch(e){}}))}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{preformatted:"Code sample
    "},az:{preformatted:"Kod nümunəsi 
    "},by:{preformatted:"Прыклад кода 
    "},da:{preformatted:"Præformateret 
    "},et:{preformatted:"Eelvormindatud tekst 
    "},fr:{preformatted:"Exemple de code 
    "},hu:{preformatted:"Kód minta 
    "},it:{preformatted:"Codice 
    "},ja:{preformatted:"コードサンプル 
    "},ko:{preformatted:"코드 예제 
    "},pt_br:{preformatted:"Exemple de código 
    "},ru:{preformatted:"Пример кода 
    "},sl:{preformatted:"Vstavi neformatiran tekst 
    "},tr:{preformatted:"Kod örneği 
    "},zh_cn:{preformatted:"代码示例 
    "},zh_tw:{preformatted:"代碼範例 
    "}},plugins:{preformatted:{init:function(t){var o={fn:function(){t.saveRange();var o,a,n=t.getRangeText();if(""!==n.replace(/\s/g,""))try{var r=function(){var e,t=null;window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement());return t}().tagName.toLowerCase();if("code"===r||"pre"===r)return function(){var t=null;if(document.selection)t=document.selection.createRange().parentElement();else{var o=window.getSelection();o.rangeCount>0&&(t=o.getRangeAt(0).startContainer.parentNode)}var a=e(t).contents().closest("pre").length,n=e(t).contents().closest("code").length;a&&n?e(t).contents().unwrap("code").unwrap("pre"):a?e(t).contents().unwrap("pre"):n&&e(t).contents().unwrap("code")}();t.execCmd("insertHTML","
    "+(o=n,(a=document.createElement("DIV")).innerHTML=o,(a.textContent||a.innerText||"")+"
    "))}catch(e){}},tag:"pre"};t.addBtnDef("preformatted",o)}}}})}(jQuery),function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{preformatted:"Code sample
    "},az:{preformatted:"Kod nümunəsi 
    "},by:{preformatted:"Прыклад кода 
    "},da:{preformatted:"Præformateret 
    "},et:{preformatted:"Eelvormindatud tekst 
    "},fr:{preformatted:"Exemple de code 
    "},hu:{preformatted:"Kód minta 
    "},it:{preformatted:"Codice 
    "},ja:{preformatted:"コードサンプル 
    "},ko:{preformatted:"코드 예제 
    "},pt_br:{preformatted:"Exemple de código 
    "},ru:{preformatted:"Пример кода 
    "},sl:{preformatted:"Vstavi neformatiran tekst 
    "},tr:{preformatted:"Kod örneği 
    "},zh_cn:{preformatted:"代码示例 
    "},zh_tw:{preformatted:"代碼範例 
    "}},plugins:{preformatted:{init:function(t){var o={fn:function(){t.saveRange();var o,a,n=t.getRangeText();if(""!==n.replace(/\s/g,""))try{var r=function(){var e,t=null;return window.getSelection?(e=window.getSelection()).rangeCount&&1!==(t=e.getRangeAt(0).commonAncestorContainer).nodeType&&(t=t.parentNode):(e=document.selection)&&"Control"!==e.type&&(t=e.createRange().parentElement()),t}().tagName.toLowerCase();if("code"===r||"pre"===r)return function(){var t=null;if(document.selection)t=document.selection.createRange().parentElement();else{var o=window.getSelection();o.rangeCount>0&&(t=o.getRangeAt(0).startContainer.parentNode)}var a=e(t).contents().closest("pre").length,n=e(t).contents().closest("code").length;a&&n?e(t).contents().unwrap("code").unwrap("pre"):a?e(t).contents().unwrap("pre"):n&&e(t).contents().unwrap("code")}();t.execCmd("insertHTML","
    "+(o=n,(a=document.createElement("DIV")).innerHTML=o,(a.textContent||a.innerText||"")+"
    "))}catch(e){}},tag:"pre"};t.addBtnDef("preformatted",o)}}}})}(jQuery),function(e){"use strict";var t={rows:8,columns:8,allowHorizontalResize:!0,colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"],backgroundColorList:null,allowCustomBackgroundColor:!0,displayBackgroundColorsAsList:!1,borderColorList:null,allowCustomBorderColor:!0,displayBorderColorsAsList:!1,dropdown:[{title:"tableRows",buttons:["tableAddHeaderRow","tableAddRowAbove","tableAddRow","tableDeleteRow"]},{title:"tableColumns",buttons:["tableAddColumnLeft","tableAddColumn","tableDeleteColumn"]},{title:"tableVerticalAlign",buttons:["tableVerticalAlignTop","tableVerticalAlignMiddle","tableVerticalAlignBottom"]},{title:"tableOthers",buttons:["tableMergeCells","tableUnmergeCells","tableDestroy"]}]};function o(e){return e[0].toUpperCase()+e.slice(1)}function a(e){return("0"+parseInt(e).toString(16)).slice(-2)}function n(e){return-1===e.search("rgb")?e.replace("#",""):"rgba(0, 0, 0, 0)"===e||null==(e=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/))?"transparent":a(e[1])+a(e[2])+a(e[3])}e.extend(!0,e.trumbowyg,{langs:{en:{table:"Insert table",tableRows:"Rows",tableColumns:"Columns",tableVerticalAlign:"Vertical align",tableOthers:"Others",tableAddHeaderRow:"Insert head row",tableAddRowAbove:"Insert row above",tableAddRow:"Insert row below",tableAddColumnLeft:"Insert column to the left",tableAddColumn:"Insert column to the right",tableDeleteRow:"Delete row",tableDeleteColumn:"Delete column",tableDestroy:"Delete table",tableMergeCells:"Merge cells",tableUnmergeCells:"Unmerge cells",tableVerticalAlignTop:"Align text to top",tableVerticalAlignMiddle:"Center text vertically",tableVerticalAlignBottom:"Align text to bottom",tableCellBackgroundColor:"Cell background color"},az:{table:"Cədvəl yerləşdir",tableAddRow:"Sətir əlavə et",tableAddRowAbove:"Yuxarı sətir əlavə et",tableAddColumnLeft:"Sola sütun əlavə et",tableAddColumn:"Sağa sütun əlavə et",tableDeleteRow:"Sətri sil",tableDeleteColumn:"Sütunu sil",tableDestroy:"Cədvəli sil"},ca:{table:"Inserir taula",tableAddRow:"Afegir fila",tableAddRowAbove:"Afegir fila a dalt",tableAddColumnLeft:"Afegir columna a l'esquerra",tableAddColumn:"Afegir columna a la dreta",tableDeleteRow:"Esborrar fila",tableDeleteColumn:"Esborrar columna",tableDestroy:"Esborrar taula",error:"Error"},cs:{table:"Vytvořit příkaz Table",tableAddRow:"Přidat řádek",tableAddRowAbove:"Přidat řádek",tableAddColumnLeft:"Přidat sloupec",tableAddColumn:"Přidat sloupec"},da:{table:"Indsæt tabel",tableAddRow:"Tilføj række",tableAddRowAbove:"Tilføj række",tableAddColumnLeft:"Tilføj kolonne",tableAddColumn:"Tilføj kolonne",tableDeleteRow:"Slet række",tableDeleteColumn:"Slet kolonne",tableDestroy:"Slet tabel"},de:{table:"Tabelle einfügen",tableAddRow:"Zeile hinzufügen",tableAddRowAbove:"Zeile hinzufügen",tableAddColumnLeft:"Spalte hinzufügen",tableAddColumn:"Spalte hinzufügen",tableDeleteRow:"Zeile löschen",tableDeleteColumn:"Spalte löschen",tableDestroy:"Tabelle löschen"},et:{table:"Sisesta tabel",tableAddRow:"Lisa rida",tableAddRowAbove:"Lisa rida üles",tableAddColumnLeft:"Lisa tulp vasakule",tableAddColumn:"Lisa tulp paremale",tableDeleteRow:"Kustuta rida",tableDeleteColumn:"Kustuta tulp",tableDestroy:"Kustuta tabel"},fr:{table:"Insérer un tableau",tableRows:"Lignes",tableColumns:"Colonnes",tableVerticalAlign:"Alignement vertical",tableOthers:"Autres",tableAddHeaderRow:"Insérer une line d'en-tête",tableAddRowAbove:"Insérer une ligne au dessus",tableAddRow:"Insérer une ligne en dessous",tableAddColumnLeft:"Insérer une colonne à gauche",tableAddColumn:"Insérer une colonne à droite",tableDeleteRow:"Supprimer la ligne",tableDeleteColumn:"Supprimer la colonne",tableDestroy:"Supprimer le tableau",tableMergeCells:"Fusionner les cellules",tableUnmergeCells:"Dissocier les cellules",tableVerticalAlignTop:"Aligner en haut",tableVerticalAlignMiddle:"Aligner au milieu",tableVerticalAlignBottom:"Aligner en bas",tableCellBackgroundColor:"Couleur de fond des cellules",tableBorderColor:"Couleur de la bordure du tableau"},hu:{table:"Táblázat beszúrás",tableAddRow:"Sor hozzáadás",tableAddRowAbove:"Sor beszúrás fönt",tableAddColumnLeft:"Sor beszúrás balra",tableAddColumn:"Sor beszúrás jobbra",tableDeleteRow:"Sor törlés",tableDeleteColumn:"Oszlop törlés",tableDestroy:"Táblázat törlés"},id:{table:"Sisipkan tabel",tableAddRow:"Sisipkan baris",tableAddRowAbove:"Sisipkan baris",tableAddColumnLeft:"Sisipkan kolom",tableAddColumn:"Sisipkan kolom",tableDeleteRow:"Hapus baris",tableDeleteColumn:"Hapus kolom",tableDestroy:"Hapus tabel"},ja:{table:"表の挿入",tableAddRow:"行の追加",tableAddRowAbove:"行の追加",tableAddColumnLeft:"列の追加",tableAddColumn:"列の追加"},ko:{table:"표 넣기",tableAddRow:"줄 추가",tableAddRowAbove:"줄 추가",tableAddColumnLeft:"칸 추가",tableAddColumn:"칸 추가",tableDeleteRow:"줄 삭제",tableDeleteColumn:"칸 삭제",tableDestroy:"표 지우기"},pt_br:{table:"Inserir tabela",tableAddRow:"Adicionar linha",tableAddRowAbove:"Adicionar linha",tableAddColumnLeft:"Adicionar coluna",tableAddColumn:"Adicionar coluna",tableDeleteRow:"Deletar linha",tableDeleteColumn:"Deletar coluna",tableDestroy:"Deletar tabela"},ru:{table:"Вставить таблицу",tableAddRow:"Добавить строку",tableAddRowAbove:"Добавить строку",tableAddColumnLeft:"Добавить столбец",tableAddColumn:"Добавить столбец",tableDeleteRow:"Удалить строку",tableDeleteColumn:"Удалить столбец",tableDestroy:"Удалить таблицу"},sl:{table:"Dodaj tabelo",tableAddRow:"Dodaj vrstico",tableAddRowAbove:"Vrini vrstico",tableAddColumnLeft:"Vrini stolpec",tableAddColumn:"Dodaj stolpec",tableDeleteRow:"Izbriši vrstico",tableDeleteColumn:"Izbriši stolpec",tableDestroy:"Izbriši tabelo"},sk:{table:"Vytvoriť tabuľky",tableAddRow:"Pridať riadok",tableAddRowAbove:"Pridať riadok",tableAddColumnLeft:"Pridať stĺpec",tableAddColumn:"Pridať stĺpec"},tr:{table:"Tablo ekle",tableAddRow:"Satır ekle",tableAddRowAbove:"Yukarıya satır ekle",tableAddColumnLeft:"Sola sütun ekle",tableAddColumn:"Sağa sütun ekle",tableDeleteRow:"Satırı sil",tableDeleteColumn:"Sütunu sil",tableDestroy:"Tabloyu sil"},zh_tw:{table:"插入表格",tableAddRow:"加入行",tableAddRowAbove:"加入行",tableAddColumnLeft:"加入列",tableAddColumn:"加入列",tableDeleteRow:"刪除行",tableDeleteColumn:"刪除列",tableDestroy:"刪除表格"},es:{table:"Insertar tabla",tableAddRow:"Agregar fila",tableAddRowAbove:"Agregar fila arriba",tableAddColumnLeft:"Agregar columna a la izquierda",tableAddColumn:"Agregar columna a la derecha",tableDeleteRow:"Borrar fila",tableDeleteColumn:"Borrar columna",tableDestroy:"Borrar tabla"}},plugins:{table:{init:function(a){var n;a.o.plugins.table=e.extend(!0,{},t,a.o.plugins.table||{});var r={fn:function(){a.saveRange();var t="table",o=a.o.prefix+"dropdown",r={class:o+"-"+t+" "+o+" "+a.o.prefix+"fixed-top"};r["data-"+o]=t;var i=e("
    ",r);if(0===a.$box.find("."+o+"-"+t).length?a.$box.append(i.hide()):i=a.$box.find("."+o+"-"+t),i.html(""),a.$box.find("."+a.o.prefix+"table-button").hasClass(a.o.prefix+"active-button")){var s=e(a.doc.getSelection().anchorNode).closest("table"),F=x(s),u=void 0!==n;e(a.o.plugins.table.dropdown).each((function(t,o){i.append(e("
    ",{html:a.lang[o.title]?a.lang[o.title]:o.title,class:a.o.prefix+"table-dropdown-title"})).text();var n=e("
    ",{class:a.o.prefix+"dropdown-button-group"});e(o.buttons).each((function(t,o){if("tableAddHeaderRow"===o&&0!==e("thead",s).length)return;if("tableMergeCells"!==o||u){if("tableUnmergeCells"===o){var r=!1;if(R((function(e){var t=e.is("[colspan]")||e.is("[rowspan]");r=r||t}),F),!r)return}n.append(a.buildSubBtn(o))}})),i.append(n)}))}else{var c=e("
    ",{scope:"col"}).appendTo(n);o.appendTo(t);for(var l=e("
    ").appendTo(F);l.appendTo(t),s(t);for(var c=a.range.endContainer;c.nodeType!==Node.ELEMENT_NODE;)c=c.parentNode;c!==a.$ed[0]&&a.range.setEndAfter(c),a.range.collapse(),a.range.insertNode(t[0]),"P"===c.nodeName&&0===c.textContent.trim().length&&c.remove(),a.syncCode(),S()},x=function(t){for(var o=e("tr",t),a=[],n=0;n0&&void 0!==arguments[0]&&arguments[0];return F((function(o,a,n,r){var l=e("tr",o),i=e("
    ");e("").appendTo(c);for(var f=0;f").appendTo(c),p=0;p").appendTo(m);c.find("td").on("mouseover",l),c.find("td").on("mousedown",d),i.append(c),i.append(e('
    1x1
    '))}a.dropdown(t)},class:a.o.prefix+"open-dropdown"},l=function(t){var o=e(t.target).closest("table"),a=this.cellIndex,n=this.parentNode.rowIndex;o.find("td").removeClass("active");for(var r=0;r<=n;r+=1)for(var l=0;l<=a;l+=1)o.find("tr:nth-of-type("+(r+1)+")").find("td:nth-of-type("+(l+1)+")").addClass("active");o.next(".trumbowyg-table-size").html(a+1+"x"+(n+1))},i=function(t){var o=a.o.tagClasses[t.tagName.toLowerCase()];o&&e(t).addClass(o)},s=function(t){i(t[0]),e("*",t).each((function(e,t){i(t)}))},d=function(){a.saveRange();var t=e("
    "),o=e(""),n=e("");n.appendTo(o);for(var r=0;r<=this.cellIndex;r+=1)e(""),i=this.cellIndex,d=this.parentNode.rowIndex,x=0;x<=d;x+=1)for(var F=e("").appendTo(l),u=0;u<=i;u+=1)e(""),d=l.index(a);if(t)d=Math.max(0,d-1),a=e(l[d]);else{var x=e(n).closest("td, th").attr("rowspan"),F=parseInt(x||1,10);a=e(l[d+=F-1])}var u=e("tbody tr",o),c=0!==a.closest("thead").length;c&&(a=u.first());for(var f=r[d],m=r[d+1],p=r[0].length,g=0;g").appendTo(i)}0===d&&(t||c)?a.before(i):a.after(i),s(o),S()}))},c={title:a.lang.tableAddRowAbove,text:a.lang.tableAddRowAbove,ico:"row-above",fn:u(!0)},f={title:a.lang.tableAddRow,text:a.lang.tableAddRow,ico:"row-below",fn:u(!1)},m={title:a.lang.tableAddHeaderRow,text:a.lang.tableAddHeaderRow,ico:"header-row",fn:F((function(t,o,a,n){if(0!==e("thead",t).length)return!1;for(var r=n[0].length,l=e(""),i=e("").appendTo(l),d=0;d").appendTo(i);t.prepend(l),s(t),S()}))},p=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return F((function(o,n,r,l){var i=l[e("tr",o).index(n)],d=e(r).closest("td, th"),x=D(d[0],i);if(t)x=Math.max(0,x-1);else{var F=d.attr("colspan");x+=parseInt(F||1,10)-1}for(var u=l.length,c=t&&0===x,f=0;f1){var d=A(n,[i,l]);d.element.setAttribute("colspan",d.colspan-1)}else s.element.remove()}y(),_()}))},A=function(e,t){var o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0!==t){var a=e[t[0]][t[1]];return o&&void 0!==a.mergedIn&&(a=e[a.mergedIn[0]][a.mergedIn[1]]),a}},y=function(t){var o=x(t),a=e("tr",t);e(o).each((function(t,n){n.every((function(e){return void 0!==e.mergedIn}))&&(e(o[t-1]).each((function(e,t){void 0!==t.mergedIn&&(t=A(o,t.mergedIn)),t.rowspan-=1,t.rowspan<=1?t.element.removeAttribute("rowspan"):t.element.setAttribute("rowspan",t.rowspan)})),a[t].remove())})),e('[class=""]',t).removeAttr("class"),e('[style=""]',t).removeAttr("style")},w={title:a.lang.tableMergeCells,text:a.lang.tableMergeCells,ico:"table-merge",fn:F((function(t,o,a,r){if(function(t){if(0===n.length)return!1;var o=n[0],a=A(t,o).tag;if(!n.every((function(e){return A(t,e).tag===a})))return!1;var r=[],l=[];if(e(n).each((function(e,o){for(var a=o[0],n=o[1],i=t[a][n],s=a+i.rowspan;a1&&s.attr("rowspan",c),f>1&&s.attr("colspan",f),y(t),S()}}}))},E={title:a.lang.tableUnmergeCells,text:a.lang.tableUnmergeCells,ico:"table-unmerge",fn:F((function(t,o,n,r){R((function(o){o.removeAttr("colspan").removeAttr("rowspan");for(var n=e("tr",t).index(o.closest("tr")),l=D(o[0],r[n]),i=r[n][l],s=0;s1){var i=t.getRangeAt(0),s=t.getRangeAt(o-1);r=i.startContainer.childNodes[i.startOffset],l=s.startContainer.childNodes[s.startOffset]}var d=e(r).closest("td, th"),F=e(l).closest("td, th"),u=d.closest("table"),c=F.closest("table");if(e('[class="'+k+'"]',a.$ed).removeAttr("class"),e("."+k,a.$ed).removeClass(k),0===u.length&&0===c.length||u[0]!==c[0]||d[0]===F[0])e("."+z,a.$ed).removeClass(z);else{u.addClass(z);var f=x(u),m=e("tr",u),p=d.closest("tr"),g=m.index(p),b=F.closest("tr"),h=m.index(b),v=D(d[0],f[g]),C=D(F[0],f[h]),A=Math.min(g,h),y=Math.max(g,h),w=Math.min(v,C),E=Math.max(v,C),B=[];m.each((function(t,o){ty||e("td, th",o).each((function(o,a){var n=D(a,f[t]);nE||(B.push([t,n]),e(a).addClass(k))}))})),n=B}}))}));var R=function(t,o){if(void 0!==n)e(n).each((function(a,n){var r=A(o,n,!1);void 0===r.mergedIn&&t(e(r.element))}));else{var r=e(a.doc.getSelection().anchorNode).closest("td, th");if(0===r.length)return;t(r)}},I="trumbowyg-table-handle-for",S=function(){if(a.o.plugins.table.allowHorizontalResize){var t,o,n,r=e(a.o.prefix+"table-resize-layers"),l=r.length>0;l||(r=e("
    ",{class:a.o.prefix+"table-resize-layers"}).appendTo(a.$edBox),e(a.o.prefix+"table-resize-vertical-handle",r).each((function(t,o){e(o).off().remove()}))),e("table",a.$ed).each((function(l,i){e("td, th",e(i)).each((function(l,i){e("
    ",{class:a.o.prefix+"table-resize-vertical-handle"}).prop(I,i).on("mousedown.tbwTable",(function(a){a.preventDefault(),a.stopPropagation();var r=e(a.target).prop(I);n=e(r).closest("table"),t=x(n);var l=e("tr",n),i=e(r).closest("tr"),s=l.index(i),d=t[s],F=D(r,d),u=t[s][F];void 0!==u.mergedIn&&(u=t[u.mergedIn[0]][u.mergedIn[1]]),o=F+u.colspan-1,T(n,t),L(n,t),n.css({maxWidth:""})})).appendTo(r)}))})),_(),l||(e(a.doc).on("mousemove.tbwTable",(function(a){if(void 0!==o){a.preventDefault(),a.stopPropagation();var r=n[0].getBoundingClientRect(),l=a.pageX-r.left-(j(t,o).element.getBoundingClientRect().left-r.left),i=e("col",n)[o];e(i).css({width:l}),_()}})).on("mouseup.tbwTable",(function(e){void 0!==o&&(e.preventDefault(),e.stopPropagation(),T(n,t),M(n,t),n=void 0,t=void 0,o=void 0,a.syncCode(),_())})),e(window).on("resize.tbwTable",(function(){_()})))}},T=function(t,o){var a=e("colgroup",t);0===a.length&&(a=e("
    ").prependTo(t));for(var n=o[0].length,r=e("col",a).length;r").appendTo(a)},j=function(e,t){var o,a=0;do{o=e[a][t],a+=1}while(void 0===o.element||1!==o.colspan);return o},N=function(t,o){var a=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e("colgroup",t),r=e("col",n),l=t[0].offsetWidth;t.css({maxWidth:t[0].offsetWidth});for(var i=o[0].length,s=[],d=0;d=0?a.push("tableBorderColor"+l):a.push("freeTableBorderColor")}}if(!e.style)return a;var i=e.style.verticalAlign;""!==i&&a.push("tableVerticalAlign"+o(i));var s=e.style.backgroundColor;if(("TH"===e.tagName||"TD"===e.tagName)&&""!==s){var d=n(s);t.o.plugins.table.colorList.indexOf(d)>=0?a.push("tableCellBackgroundColor"+d):a.push("freeTableCellBackgroundColor")}return a}}}})}(jQuery),function(e){"use strict";var t={rows:8,columns:8,allowHorizontalResize:!0,colorList:["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"],backgroundColorList:null,allowCustomBackgroundColor:!0,displayBackgroundColorsAsList:!1,borderColorList:null,allowCustomBorderColor:!0,displayBorderColorsAsList:!1,dropdown:[{title:"tableRows",buttons:["tableAddHeaderRow","tableAddRowAbove","tableAddRow","tableDeleteRow"]},{title:"tableColumns",buttons:["tableAddColumnLeft","tableAddColumn","tableDeleteColumn"]},{title:"tableVerticalAlign",buttons:["tableVerticalAlignTop","tableVerticalAlignMiddle","tableVerticalAlignBottom"]},{title:"tableOthers",buttons:["tableMergeCells","tableUnmergeCells","tableDestroy"]}]};function o(e){return e[0].toUpperCase()+e.slice(1)}function a(e){return("0"+parseInt(e).toString(16)).slice(-2)}function n(e){return-1===e.search("rgb")?e.replace("#",""):"rgba(0, 0, 0, 0)"===e||null==(e=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d?(.\d+)))?\)$/))?"transparent":a(e[1])+a(e[2])+a(e[3])}e.extend(!0,e.trumbowyg,{langs:{en:{table:"Insert table",tableRows:"Rows",tableColumns:"Columns",tableVerticalAlign:"Vertical align",tableOthers:"Others",tableAddHeaderRow:"Insert head row",tableAddRowAbove:"Insert row above",tableAddRow:"Insert row below",tableAddColumnLeft:"Insert column to the left",tableAddColumn:"Insert column to the right",tableDeleteRow:"Delete row",tableDeleteColumn:"Delete column",tableDestroy:"Delete table",tableMergeCells:"Merge cells",tableUnmergeCells:"Unmerge cells",tableVerticalAlignTop:"Align text to top",tableVerticalAlignMiddle:"Center text vertically",tableVerticalAlignBottom:"Align text to bottom",tableCellBackgroundColor:"Cell background color"},az:{table:"Cədvəl yerləşdir",tableAddRow:"Sətir əlavə et",tableAddRowAbove:"Yuxarı sətir əlavə et",tableAddColumnLeft:"Sola sütun əlavə et",tableAddColumn:"Sağa sütun əlavə et",tableDeleteRow:"Sətri sil",tableDeleteColumn:"Sütunu sil",tableDestroy:"Cədvəli sil"},ca:{table:"Inserir taula",tableAddRow:"Afegir fila",tableAddRowAbove:"Afegir fila a dalt",tableAddColumnLeft:"Afegir columna a l'esquerra",tableAddColumn:"Afegir columna a la dreta",tableDeleteRow:"Esborrar fila",tableDeleteColumn:"Esborrar columna",tableDestroy:"Esborrar taula",error:"Error"},cs:{table:"Vytvořit příkaz Table",tableAddRow:"Přidat řádek",tableAddRowAbove:"Přidat řádek",tableAddColumnLeft:"Přidat sloupec",tableAddColumn:"Přidat sloupec"},da:{table:"Indsæt tabel",tableAddRow:"Tilføj række",tableAddRowAbove:"Tilføj række",tableAddColumnLeft:"Tilføj kolonne",tableAddColumn:"Tilføj kolonne",tableDeleteRow:"Slet række",tableDeleteColumn:"Slet kolonne",tableDestroy:"Slet tabel"},de:{table:"Tabelle einfügen",tableAddRow:"Zeile hinzufügen",tableAddRowAbove:"Zeile hinzufügen",tableAddColumnLeft:"Spalte hinzufügen",tableAddColumn:"Spalte hinzufügen",tableDeleteRow:"Zeile löschen",tableDeleteColumn:"Spalte löschen",tableDestroy:"Tabelle löschen"},et:{table:"Sisesta tabel",tableAddRow:"Lisa rida",tableAddRowAbove:"Lisa rida üles",tableAddColumnLeft:"Lisa tulp vasakule",tableAddColumn:"Lisa tulp paremale",tableDeleteRow:"Kustuta rida",tableDeleteColumn:"Kustuta tulp",tableDestroy:"Kustuta tabel"},fr:{table:"Insérer un tableau",tableRows:"Lignes",tableColumns:"Colonnes",tableVerticalAlign:"Alignement vertical",tableOthers:"Autres",tableAddHeaderRow:"Insérer une line d'en-tête",tableAddRowAbove:"Insérer une ligne au dessus",tableAddRow:"Insérer une ligne en dessous",tableAddColumnLeft:"Insérer une colonne à gauche",tableAddColumn:"Insérer une colonne à droite",tableDeleteRow:"Supprimer la ligne",tableDeleteColumn:"Supprimer la colonne",tableDestroy:"Supprimer le tableau",tableMergeCells:"Fusionner les cellules",tableUnmergeCells:"Dissocier les cellules",tableVerticalAlignTop:"Aligner en haut",tableVerticalAlignMiddle:"Aligner au milieu",tableVerticalAlignBottom:"Aligner en bas",tableCellBackgroundColor:"Couleur de fond des cellules",tableBorderColor:"Couleur de la bordure du tableau"},hu:{table:"Táblázat beszúrás",tableAddRow:"Sor hozzáadás",tableAddRowAbove:"Sor beszúrás fönt",tableAddColumnLeft:"Sor beszúrás balra",tableAddColumn:"Sor beszúrás jobbra",tableDeleteRow:"Sor törlés",tableDeleteColumn:"Oszlop törlés",tableDestroy:"Táblázat törlés"},id:{table:"Sisipkan tabel",tableAddRow:"Sisipkan baris",tableAddRowAbove:"Sisipkan baris",tableAddColumnLeft:"Sisipkan kolom",tableAddColumn:"Sisipkan kolom",tableDeleteRow:"Hapus baris",tableDeleteColumn:"Hapus kolom",tableDestroy:"Hapus tabel"},ja:{table:"表の挿入",tableAddRow:"行の追加",tableAddRowAbove:"行の追加",tableAddColumnLeft:"列の追加",tableAddColumn:"列の追加"},ko:{table:"표 넣기",tableAddRow:"줄 추가",tableAddRowAbove:"줄 추가",tableAddColumnLeft:"칸 추가",tableAddColumn:"칸 추가",tableDeleteRow:"줄 삭제",tableDeleteColumn:"칸 삭제",tableDestroy:"표 지우기"},pt_br:{table:"Inserir tabela",tableAddRow:"Adicionar linha",tableAddRowAbove:"Adicionar linha",tableAddColumnLeft:"Adicionar coluna",tableAddColumn:"Adicionar coluna",tableDeleteRow:"Deletar linha",tableDeleteColumn:"Deletar coluna",tableDestroy:"Deletar tabela"},ru:{table:"Вставить таблицу",tableAddRow:"Добавить строку",tableAddRowAbove:"Добавить строку",tableAddColumnLeft:"Добавить столбец",tableAddColumn:"Добавить столбец",tableDeleteRow:"Удалить строку",tableDeleteColumn:"Удалить столбец",tableDestroy:"Удалить таблицу"},sl:{table:"Dodaj tabelo",tableAddRow:"Dodaj vrstico",tableAddRowAbove:"Vrini vrstico",tableAddColumnLeft:"Vrini stolpec",tableAddColumn:"Dodaj stolpec",tableDeleteRow:"Izbriši vrstico",tableDeleteColumn:"Izbriši stolpec",tableDestroy:"Izbriši tabelo"},sk:{table:"Vytvoriť tabuľky",tableAddRow:"Pridať riadok",tableAddRowAbove:"Pridať riadok",tableAddColumnLeft:"Pridať stĺpec",tableAddColumn:"Pridať stĺpec"},tr:{table:"Tablo ekle",tableAddRow:"Satır ekle",tableAddRowAbove:"Yukarıya satır ekle",tableAddColumnLeft:"Sola sütun ekle",tableAddColumn:"Sağa sütun ekle",tableDeleteRow:"Satırı sil",tableDeleteColumn:"Sütunu sil",tableDestroy:"Tabloyu sil"},zh_tw:{table:"插入表格",tableAddRow:"加入行",tableAddRowAbove:"加入行",tableAddColumnLeft:"加入列",tableAddColumn:"加入列",tableDeleteRow:"刪除行",tableDeleteColumn:"刪除列",tableDestroy:"刪除表格"},es:{table:"Insertar tabla",tableAddRow:"Agregar fila",tableAddRowAbove:"Agregar fila arriba",tableAddColumnLeft:"Agregar columna a la izquierda",tableAddColumn:"Agregar columna a la derecha",tableDeleteRow:"Borrar fila",tableDeleteColumn:"Borrar columna",tableDestroy:"Borrar tabla"}},plugins:{table:{init:function(a){var n;a.o.plugins.table=e.extend(!0,{},t,a.o.plugins.table||{});var r={fn:function(){a.saveRange();var t="table",o=a.o.prefix+"dropdown",r={class:o+"-"+t+" "+o+" "+a.o.prefix+"fixed-top"};r["data-"+o]=t;var i=e("
    ",r);if(0===a.$box.find("."+o+"-"+t).length?a.$box.append(i.hide()):i=a.$box.find("."+o+"-"+t),i.html(""),a.$box.find("."+a.o.prefix+"table-button").hasClass(a.o.prefix+"active-button")){var s=e(a.doc.getSelection().anchorNode).closest("table"),F=x(s),u=void 0!==n;e(a.o.plugins.table.dropdown).each((function(t,o){i.append(e("
    ",{html:a.lang[o.title]?a.lang[o.title]:o.title,class:a.o.prefix+"table-dropdown-title"})).text();var n=e("
    ",{class:a.o.prefix+"dropdown-button-group"});e(o.buttons).each((function(t,o){if(("tableAddHeaderRow"!==o||0===e("thead",s).length)&&("tableMergeCells"!==o||u)){if("tableUnmergeCells"===o){var r=!1;if(R((function(e){var t=e.is("[colspan]")||e.is("[rowspan]");r=r||t}),F),!r)return}n.append(a.buildSubBtn(o))}})),i.append(n)}))}else{var c=e("
    ",{scope:"col"}).appendTo(n);o.appendTo(t);for(var l=e("
    ").appendTo(F);l.appendTo(t),s(t);for(var c=a.range.endContainer;c.nodeType!==Node.ELEMENT_NODE;)c=c.parentNode;c!==a.$ed[0]&&a.range.setEndAfter(c),a.range.collapse(),a.range.insertNode(t[0]),"P"===c.nodeName&&0===c.textContent.trim().length&&c.remove(),a.syncCode(),S()},x=function(t){for(var o=e("tr",t),a=[],n=0;n0&&void 0!==arguments[0]&&arguments[0];return F((function(o,a,n,r){var l=e("tr",o),i=e("
    ");e("").appendTo(c);for(var f=0;f").appendTo(c),p=0;p").appendTo(m);c.find("td").on("mouseover",l),c.find("td").on("mousedown",d),i.append(c),i.append(e('
    1x1
    '))}a.dropdown(t)},class:a.o.prefix+"open-dropdown"},l=function(t){var o=e(t.target).closest("table"),a=this.cellIndex,n=this.parentNode.rowIndex;o.find("td").removeClass("active");for(var r=0;r<=n;r+=1)for(var l=0;l<=a;l+=1)o.find("tr:nth-of-type("+(r+1)+")").find("td:nth-of-type("+(l+1)+")").addClass("active");o.next(".trumbowyg-table-size").html(a+1+"x"+(n+1))},i=function(t){var o=a.o.tagClasses[t.tagName.toLowerCase()];o&&e(t).addClass(o)},s=function(t){i(t[0]),e("*",t).each((function(e,t){i(t)}))},d=function(){a.saveRange();var t=e("
    "),o=e(""),n=e("");n.appendTo(o);for(var r=0;r<=this.cellIndex;r+=1)e(""),i=this.cellIndex,d=this.parentNode.rowIndex,x=0;x<=d;x+=1)for(var F=e("").appendTo(l),u=0;u<=i;u+=1)e(""),d=l.index(a);if(t)d=Math.max(0,d-1),a=e(l[d]);else{var x=e(n).closest("td, th").attr("rowspan"),F=parseInt(x||1,10);a=e(l[d+=F-1])}var u=e("tbody tr",o),c=0!==a.closest("thead").length;c&&(a=u.first());for(var f=r[d],m=r[d+1],p=r[0].length,g=0;g").appendTo(i)}0===d&&(t||c)?a.before(i):a.after(i),s(o),S()}))},c={title:a.lang.tableAddRowAbove,text:a.lang.tableAddRowAbove,ico:"row-above",fn:u(!0)},f={title:a.lang.tableAddRow,text:a.lang.tableAddRow,ico:"row-below",fn:u(!1)},m={title:a.lang.tableAddHeaderRow,text:a.lang.tableAddHeaderRow,ico:"header-row",fn:F((function(t,o,a,n){if(0!==e("thead",t).length)return!1;for(var r=n[0].length,l=e(""),i=e("").appendTo(l),d=0;d").appendTo(i);t.prepend(l),s(t),S()}))},p=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return F((function(o,n,r,l){var i=l[e("tr",o).index(n)],d=e(r).closest("td, th"),x=D(d[0],i);if(t)x=Math.max(0,x-1);else{var F=d.attr("colspan");x+=parseInt(F||1,10)-1}for(var u=l.length,c=t&&0===x,f=0;f1){var d=A(n,[i,l]);d.element.setAttribute("colspan",d.colspan-1)}else s.element.remove()}y(),_()}))},A=function(e,t){var o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0!==t){var a=e[t[0]][t[1]];return o&&void 0!==a.mergedIn&&(a=e[a.mergedIn[0]][a.mergedIn[1]]),a}},y=function(t){var o=x(t),a=e("tr",t);e(o).each((function(t,n){n.every((function(e){return void 0!==e.mergedIn}))&&(e(o[t-1]).each((function(e,t){void 0!==t.mergedIn&&(t=A(o,t.mergedIn)),t.rowspan-=1,t.rowspan<=1?t.element.removeAttribute("rowspan"):t.element.setAttribute("rowspan",t.rowspan)})),a[t].remove())})),e('[class=""]',t).removeAttr("class"),e('[style=""]',t).removeAttr("style")},w={title:a.lang.tableMergeCells,text:a.lang.tableMergeCells,ico:"table-merge",fn:F((function(t,o,a,r){if(function(t){if(0===n.length)return!1;var o=n[0],a=A(t,o).tag;if(!n.every((function(e){return A(t,e).tag===a})))return!1;var r=[],l=[];if(e(n).each((function(e,o){for(var a=o[0],n=o[1],i=t[a][n],s=a+i.rowspan;a1&&s.attr("rowspan",c),f>1&&s.attr("colspan",f),y(t),S()}}}))},E={title:a.lang.tableUnmergeCells,text:a.lang.tableUnmergeCells,ico:"table-unmerge",fn:F((function(t,o,n,r){R((function(o){o.removeAttr("colspan").removeAttr("rowspan");for(var n=e("tr",t).index(o.closest("tr")),l=D(o[0],r[n]),i=r[n][l],s=0;s1){var i=t.getRangeAt(0),s=t.getRangeAt(o-1);r=i.startContainer.childNodes[i.startOffset],l=s.startContainer.childNodes[s.startOffset]}var d=e(r).closest("td, th"),F=e(l).closest("td, th"),u=d.closest("table"),c=F.closest("table");if(e('[class="'+k+'"]',a.$ed).removeAttr("class"),e("."+k,a.$ed).removeClass(k),0===u.length&&0===c.length||u[0]!==c[0]||d[0]===F[0])e("."+z,a.$ed).removeClass(z);else{u.addClass(z);var f=x(u),m=e("tr",u),p=d.closest("tr"),g=m.index(p),b=F.closest("tr"),h=m.index(b),v=D(d[0],f[g]),C=D(F[0],f[h]),A=Math.min(g,h),y=Math.max(g,h),w=Math.min(v,C),E=Math.max(v,C),B=[];m.each((function(t,o){ty||e("td, th",o).each((function(o,a){var n=D(a,f[t]);nE||(B.push([t,n]),e(a).addClass(k))}))})),n=B}}))}));var R=function(t,o){if(void 0!==n)e(n).each((function(a,n){var r=A(o,n,!1);void 0===r.mergedIn&&t(e(r.element))}));else{var r=e(a.doc.getSelection().anchorNode).closest("td, th");if(0===r.length)return;t(r)}},I="trumbowyg-table-handle-for",S=function(){if(a.o.plugins.table.allowHorizontalResize){var t,o,n,r=e(a.o.prefix+"table-resize-layers"),l=r.length>0;l||(r=e("
    ",{class:a.o.prefix+"table-resize-layers"}).appendTo(a.$edBox),e(a.o.prefix+"table-resize-vertical-handle",r).each((function(t,o){e(o).off().remove()}))),e("table",a.$ed).each((function(l,i){e("td, th",e(i)).each((function(l,i){e("
    ",{class:a.o.prefix+"table-resize-vertical-handle"}).prop(I,i).on("mousedown.tbwTable",(function(a){a.preventDefault(),a.stopPropagation();var r=e(a.target).prop(I);n=e(r).closest("table"),t=x(n);var l=e("tr",n),i=e(r).closest("tr"),s=l.index(i),d=t[s],F=D(r,d),u=t[s][F];void 0!==u.mergedIn&&(u=t[u.mergedIn[0]][u.mergedIn[1]]),o=F+u.colspan-1,T(n,t),L(n,t),n.css({maxWidth:""})})).appendTo(r)}))})),_(),l||(e(a.doc).on("mousemove.tbwTable",(function(a){if(void 0!==o){a.preventDefault(),a.stopPropagation();var r=n[0].getBoundingClientRect(),l=a.pageX-r.left-(j(t,o).element.getBoundingClientRect().left-r.left),i=e("col",n)[o];e(i).css({width:l}),_()}})).on("mouseup.tbwTable",(function(e){void 0!==o&&(e.preventDefault(),e.stopPropagation(),T(n,t),M(n,t),n=void 0,t=void 0,o=void 0,a.syncCode(),_())})),e(window).on("resize.tbwTable",(function(){_()})))}},T=function(t,o){var a=e("colgroup",t);0===a.length&&(a=e("
    ").prependTo(t));for(var n=o[0].length,r=e("col",a).length;r").appendTo(a)},j=function(e,t){var o,a=0;do{o=e[a][t],a+=1}while(void 0===o.element||1!==o.colspan);return o},N=function(t,o){var a=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e("colgroup",t),r=e("col",n),l=t[0].offsetWidth;t.css({maxWidth:t[0].offsetWidth});for(var i=o[0].length,s=[],d=0;d=0?a.push("tableBorderColor"+l):a.push("freeTableBorderColor")}}if(!e.style)return a;var i=e.style.verticalAlign;""!==i&&a.push("tableVerticalAlign"+o(i));var s=e.style.backgroundColor;if(("TH"===e.tagName||"TD"===e.tagName)&&""!==s){var d=n(s);t.o.plugins.table.colorList.indexOf(d)>=0?a.push("tableCellBackgroundColor"+d):a.push("freeTableCellBackgroundColor")}return a}}}})}(jQuery),function(e){"use strict";function t(t){var o=t.o.plugins.templates,a=[];return e.each(o,(function(e,o){t.addBtnDef("template_"+e,{fn:function(){t.html(o.html)},hasIcon:!1,title:o.name}),a.push("template_"+e)})),a}e.extend(!0,e.trumbowyg,{langs:{en:{template:"Template"},az:{template:"Şablon"},by:{template:"Шаблон"},da:{template:"Skabelon"},de:{template:"Vorlage"},et:{template:"Mall"},fr:{template:"Patron"},hu:{template:"Sablon"},ja:{template:"テンプレート"},ko:{template:"서식"},nl:{template:"Sjabloon"},pt_br:{template:"Modelo"},ru:{template:"Шаблон"},sl:{template:"Predloga"},tr:{template:"Şablon"},zh_tw:{template:"模板"}}}),e.extend(!0,e.trumbowyg,{plugins:{template:{shouldInit:function(e){return e.o.plugins.hasOwnProperty("templates")},init:function(e){e.addBtnDef("template",{dropdown:t(e),hasIcon:!1,text:e.lang.template})}}}})}(jQuery),function(e){"use strict";function t(t){var o=t.o.plugins.templates,a=[];return e.each(o,(function(e,o){t.addBtnDef("template_"+e,{fn:function(){t.html(o.html)},hasIcon:!1,title:o.name}),a.push("template_"+e)})),a}e.extend(!0,e.trumbowyg,{langs:{en:{template:"Template"},az:{template:"Şablon"},by:{template:"Шаблон"},da:{template:"Skabelon"},de:{template:"Vorlage"},et:{template:"Mall"},fr:{template:"Patron"},hu:{template:"Sablon"},ja:{template:"テンプレート"},ko:{template:"서식"},nl:{template:"Sjabloon"},pt_br:{template:"Modelo"},ru:{template:"Шаблон"},sl:{template:"Predloga"},tr:{template:"Şablon"},zh_tw:{template:"模板"}}}),e.extend(!0,e.trumbowyg,{plugins:{template:{shouldInit:function(e){return e.o.plugins.hasOwnProperty("templates")},init:function(e){e.addBtnDef("template",{dropdown:t(e),hasIcon:!1,text:e.lang.template})}}}})}(jQuery),function(e){"use strict";var t={symbolList:["0024","20AC","00A3","00A2","00A5","00A4","2030",null,"00A9","00AE","2122",null,"00A7","00B6","00C6","00E6","0152","0153",null,"2022","25CF","2023","25B6","2B29","25C6",null,"00B1","00D7","00F7","21D2","21D4","220F","2211","2243","2264","2265"]};function o(t){var o=[];return e.each(t.o.plugins.specialchars.symbolList,(function(e,a){var n="symbol-"+(a=null===a?" ":"&#x"+a).replace(/:/g,""),r={text:a,hasIcon:!1,fn:function(){var e=String.fromCodePoint(parseInt(a.replace("&#","0")));return t.execCmd("insertText",e),!0}};t.addBtnDef(n,r),o.push(n)})),o}e.extend(!0,e.trumbowyg,{langs:{en:{specialChars:"Special characters"},az:{specialChars:"Xüsusi simvollar"},by:{specialChars:"Спецыяльныя сімвалы"},et:{specialChars:"Erimärgid"},fr:{specialChars:"Caractères spéciaux"},hu:{specialChars:"Speciális karakterek"},ko:{specialChars:"특수문자"},ru:{specialChars:"Специальные символы"},sl:{specialChars:"Posebni znaki"},tr:{specialChars:"Özel karakterler"}},plugins:{specialchars:{init:function(e){e.o.plugins.specialchars=e.o.plugins.specialchars||t;var a={dropdown:o(e)};e.addBtnDef("specialChars",a)}}}})}(jQuery),function(e){"use strict";var t={symbolList:["0024","20AC","00A3","00A2","00A5","00A4","2030",null,"00A9","00AE","2122",null,"00A7","00B6","00C6","00E6","0152","0153",null,"2022","25CF","2023","25B6","2B29","25C6",null,"00B1","00D7","00F7","21D2","21D4","220F","2211","2243","2264","2265"]};function o(t){var o=[];return e.each(t.o.plugins.specialchars.symbolList,(function(e,a){var n="symbol-"+(a=null===a?" ":"&#x"+a).replace(/:/g,""),r={text:a,hasIcon:!1,fn:function(){var e=String.fromCodePoint(parseInt(a.replace("&#","0")));return t.execCmd("insertText",e),!0}};t.addBtnDef(n,r),o.push(n)})),o}e.extend(!0,e.trumbowyg,{langs:{en:{specialChars:"Special characters"},az:{specialChars:"Xüsusi simvollar"},by:{specialChars:"Спецыяльныя сімвалы"},et:{specialChars:"Erimärgid"},fr:{specialChars:"Caractères spéciaux"},hu:{specialChars:"Speciális karakterek"},ko:{specialChars:"특수문자"},ru:{specialChars:"Специальные символы"},sl:{specialChars:"Posebni znaki"},tr:{specialChars:"Özel karakterler"}},plugins:{specialchars:{init:function(e){e.o.plugins.specialchars=e.o.plugins.specialchars||t;var a={dropdown:o(e)};e.addBtnDef("specialChars",a)}}}})}(jQuery),function(e){"use strict";var t={minSize:32,step:4};function o(e){e.stopPropagation(),e.preventDefault()}var a=function(t){this.resizeCanvas=document.createElement("canvas"),this.resizeCanvas.setAttribute("tabindex","0"),this.resizeCanvas.id="trumbowyg-resizimg-"+ +new Date,this.ctx=null,this.resizeImg=null,this.pressEscape=function(e){e.reset()},this.pressBackspaceOrDelete=function(o){e(o.resizeCanvas).remove(),o.resizeImg=null,null!==t&&(t.syncCode(),t.$c.trigger("tbwchange"))};var a,n,r=!1,l=!1,i=function(e){var t=e.getBoundingClientRect();a=t.left,n=t.top},s=function(e,t,o,a,n){return t.translate(.5,.5),t.lineWidth=1,t.drawImage(o,5,5,a-10,n-10),t.beginPath(),t.rect(5,5,a-10,n-10),t.stroke(),t.beginPath(),t.fillStyle="rgb(255, 255, 255)",t.rect(a-10,n-10,9,9),t.fill(),t.stroke(),i(e),t};this.init=function(){var t=this;e(window).on("scroll resize",(function(){t.reCalcOffset()}))},this.reCalcOffset=function(){i(this.resizeCanvas)},this.canvasId=function(){return this.resizeCanvas.id},this.isActive=function(){return null!==this.resizeImg},this.isFocusedNow=function(){return r},this.blurNow=function(){r=!1},this.reset=function(){null!==this.resizeImg&&(this.resizeImg.setAttribute("style","width: 100%; max-width: "+(this.resizeCanvas.clientWidth-10)+"px; height: auto; max-height: "+(this.resizeCanvas.clientHeight-10)+"px;"),e(this.resizeCanvas).replaceWith(e(this.resizeImg)),this.resizeCanvas.removeAttribute("style"),this.resizeImg=null)},this.setup=function(i,d){if(this.resizeImg=i,!this.resizeCanvas.getContext)return!1;r=!0,this.resizeCanvas.width=e(this.resizeImg).width()+10,this.resizeCanvas.height=e(this.resizeImg).height()+10,this.resizeCanvas.style.margin="-5px",this.ctx=this.resizeCanvas.getContext("2d"),e(this.resizeImg).replaceWith(e(this.resizeCanvas)),s(this.resizeCanvas,this.ctx,this.resizeImg,this.resizeCanvas.width,this.resizeCanvas.height),e(this.resizeCanvas).resizableSafe(d).on("mousedown",o);var x=this;return e(this.resizeCanvas).on("mousemove",(function(e){var t=Math.round(e.clientX-a),o=Math.round(e.clientY-n),r=l;x.ctx.rect(x.resizeCanvas.width-10,x.resizeCanvas.height-10,9,9),r!==(l=x.ctx.isPointInPath(t,o))&&(this.style.cursor=l?"se-resize":"default")})).on("keydown",(function(e){if(x.isActive()){var t=e.keyCode;27===t?x.pressEscape(x):8!==t&&46!==t||x.pressBackspaceOrDelete(x)}})).on("focus",o).on("blur",(function(){x.reset(),null!==t&&(t.syncCode(),t.$c.trigger("tbwchange"))})),this.resizeCanvas.focus(),!0},this.refresh=function(){this.resizeCanvas.getContext&&(this.resizeCanvas.width=this.resizeCanvas.clientWidth,this.resizeCanvas.height=this.resizeCanvas.clientHeight,s(this.resizeCanvas,this.ctx,this.resizeImg,this.resizeCanvas.width,this.resizeCanvas.height))}};e.extend(!0,e.trumbowyg,{plugins:{resizimg:{destroyResizable:function(){},init:function(n){var r=this.destroyResizable,l=new a(n);function i(){n.$ed.find("img").off("click").on("click",(function(e){l.isActive()&&l.reset(),l.setup(this,n.o.plugins.resizimg.resizable),o(e)}))}this.destroyResizable=function(){n.$ed.find("canvas.resizable").resizableSafe("destroy").off("mousedown",o).removeClass("resizable"),l.reset(),n.syncCode()},n.o.plugins.resizimg=e.extend(!0,{},t,n.o.plugins.resizimg||{},{resizable:{resizeWidth:!1,onDragStart:function(e,t){var o=n.o.plugins.resizimg,a=e.pageX-t.offset().left,r=e.pageY-t.offset().top;if(a",{class:n+"progress"}).append(e("
    ",{class:n+"progress-bar"}))),e.ajax({url:a.o.plugins.upload.serverPath,headers:a.o.plugins.upload.headers,xhrFields:a.o.plugins.upload.xhrFields,type:"POST",data:s,cache:!1,dataType:"json",processData:!1,contentType:!1,progressUpload:function(t){e("."+n+"progress-bar").css("width",Math.round(100*t.loaded/t.total)+"%")},success:function(t){if(a.o.plugins.upload.success)a.o.plugins.upload.success(t,a,i,r);else if(o(t,a.o.plugins.upload.statusPropertyName.split("."))){var n=o(t,a.o.plugins.upload.urlPropertyName.split("."));a.execCmd("insertImage",n,!1,!0);var s=e('img[src="'+n+'"]:not([alt])',a.$box);s.attr("alt",r.alt),a.o.plugins.upload.imageWidthModalEdit&&parseInt(r.width)>0&&s.attr({width:r.width}),setTimeout((function(){a.closeModal()}),250),a.$c.trigger("tbwuploadsuccess",[a,t,n])}else a.addErrorOnModalField(e("input[type=file]",i),a.lang[t.message]),a.$c.trigger("tbwuploaderror",[a,t]);l=!1},error:a.o.plugins.upload.error||function(){a.addErrorOnModalField(e("input[type=file]",i),a.lang.uploadError),a.$c.trigger("tbwuploaderror",[a]),l=!1}})}}));e("input[type=file]").on("change",(function(e){try{t=e.target.files[0]}catch(o){t=e.target.value}}))}};a.addBtnDef("upload",n)}}}})}(jQuery),function(e){"use strict";var t={serverPath:"",fileFieldName:"fileToUpload",data:[],headers:{},xhrFields:{},urlPropertyName:"file",statusPropertyName:"success",success:void 0,error:void 0,imageWidthModalEdit:!1};function o(e,t){var a=t.shift(),n=t;if(null!==e){if(0===n.length)return e[a];if("object"==_typeof(e))return o(e[a],n)}return e}!function(){if(!e.trumbowyg.addedXhrProgressEvent){var t=e.ajaxSettings.xhr;e.ajaxSetup({xhr:function(){var e=this,o=t();return o&&"object"==_typeof(o.upload)&&void 0!==e.progressUpload&&o.upload.addEventListener("progress",(function(t){e.progressUpload(t)}),!1),o}}),e.trumbowyg.addedXhrProgressEvent=!0}}(),e.extend(!0,e.trumbowyg,{langs:{en:{upload:"Upload",file:"File",uploadError:"Error"},az:{upload:"Yüklə",file:"Fayl",uploadError:"Xəta"},by:{upload:"Загрузка",file:"Файл",uploadError:"Памылка"},ca:{upload:"Pujar fitxer",file:"Fitxer",uploadError:"Error"},cs:{upload:"Nahrát obrázek",file:"Soubor",uploadError:"Chyba"},da:{upload:"Upload",file:"Fil",uploadError:"Fejl"},de:{upload:"Hochladen",file:"Datei",uploadError:"Fehler"},es:{upload:"Subir archivo",file:"Archivo",uploadError:"Error"},et:{upload:"Lae üles",file:"Fail",uploadError:"Viga"},fr:{upload:"Envoi",file:"Fichier",uploadError:"Erreur"},hu:{upload:"Feltöltés",file:"Fájl",uploadError:"Hiba"},ja:{upload:"アップロード",file:"ファイル",uploadError:"エラー"},ko:{upload:"그림 올리기",file:"파일",uploadError:"에러"},pt_br:{upload:"Enviar do local",file:"Arquivo",uploadError:"Erro"},ru:{upload:"Загрузка",file:"Файл",uploadError:"Ошибка"},sl:{upload:"Naloži datoteko",file:"Datoteka",uploadError:"Napaka"},sk:{upload:"Nahrať",file:"Súbor",uploadError:"Chyba"},tr:{upload:"Yükle",file:"Dosya",uploadError:"Hata"},zh_cn:{upload:"上传",file:"文件",uploadError:"错误"},zh_tw:{upload:"上傳",file:"文件",uploadError:"錯誤"}},plugins:{upload:{init:function(a){a.o.plugins.upload=e.extend(!0,{},t,a.o.plugins.upload||{});var n={fn:function(){a.saveRange();var t,n=a.o.prefix,r={file:{type:"file",required:!0,attributes:{accept:"image/*"}},alt:{label:"description",value:a.getRangeText()}};a.o.plugins.upload.imageWidthModalEdit&&(r.width={value:""});var l=!1,i=a.openModalInsert(a.lang.upload,r,(function(r){if(!l){l=!0;var s=new FormData;s.append(a.o.plugins.upload.fileFieldName,t),a.o.plugins.upload.data.map((function(e){s.append(e.name,e.value)})),e.map(r,(function(e,t){"file"!==t&&s.append(t,e)})),0===e("."+n+"progress",i).length&&e("."+n+"modal-title",i).after(e("
    ",{class:n+"progress"}).append(e("
    ",{class:n+"progress-bar"}))),e.ajax({url:a.o.plugins.upload.serverPath,headers:a.o.plugins.upload.headers,xhrFields:a.o.plugins.upload.xhrFields,type:"POST",data:s,cache:!1,dataType:"json",processData:!1,contentType:!1,progressUpload:function(t){e("."+n+"progress-bar").css("width",Math.round(100*t.loaded/t.total)+"%")},success:function(t){if(a.o.plugins.upload.success)a.o.plugins.upload.success(t,a,i,r);else if(o(t,a.o.plugins.upload.statusPropertyName.split("."))){var n=o(t,a.o.plugins.upload.urlPropertyName.split("."));a.execCmd("insertImage",n,!1,!0);var s=e('img[src="'+n+'"]:not([alt])',a.$box);s.attr("alt",r.alt),a.o.plugins.upload.imageWidthModalEdit&&parseInt(r.width)>0&&s.attr({width:r.width}),setTimeout((function(){a.closeModal()}),250),a.$c.trigger("tbwuploadsuccess",[a,t,n])}else a.addErrorOnModalField(e("input[type=file]",i),a.lang[t.message]),a.$c.trigger("tbwuploaderror",[a,t]);l=!1},error:a.o.plugins.upload.error||function(){a.addErrorOnModalField(e("input[type=file]",i),a.lang.uploadError),a.$c.trigger("tbwuploaderror",[a]),l=!1}})}}));e("input[type=file]").on("change",(function(e){try{t=e.target.files[0]}catch(o){t=e.target.value}}))}};a.addBtnDef("upload",n)}}}})}(jQuery); diff --git a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Views/TaxonomyField-Tags.Edit.cshtml b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Views/TaxonomyField-Tags.Edit.cshtml index cddd3d56cd1..4c850e9a7c7 100644 --- a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Views/TaxonomyField-Tags.Edit.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Views/TaxonomyField-Tags.Edit.cshtml @@ -38,7 +38,7 @@ @if (Model.Taxonomy == null) { -
    ",{scope:"col"}).appendTo(n);o.appendTo(t);for(var l=e("
    ").appendTo(F);l.appendTo(t),s(t);for(var c=a.range.endContainer;c.nodeType!==Node.ELEMENT_NODE;)c=c.parentNode;c!==a.$ed[0]&&a.range.setEndAfter(c),a.range.collapse(),a.range.insertNode(t[0]),"P"===c.nodeName&&0===c.textContent.trim().length&&c.remove(),a.syncCode(),S()},x=function(t){for(var o=e("tr",t),a=[],n=0;n0&&void 0!==arguments[0]&&arguments[0];return F((function(o,a,n,r){var l=e("tr",o),i=e("