From 30d0df8e2f1340583b1413154dc4ad76d165b234 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 6 Jul 2020 12:17:08 +0200 Subject: [PATCH] Update frontend --- priv/static/index.html | 2 +- priv/static/static/config.json | 2 +- .../static/css/app.613cef07981cd95ccceb.css | 5 - .../css/app.613cef07981cd95ccceb.css.map | 1 - .../css/vendors~app.18fea621d430000acc27.css | 306 ------------------ .../vendors~app.18fea621d430000acc27.css.map | 1 - .../static/font/fontello.1589385935077.eot | Bin 22976 -> 0 bytes .../static/font/fontello.1589385935077.svg | 124 ------- .../static/font/fontello.1589385935077.ttf | Bin 22808 -> 0 bytes .../static/font/fontello.1589385935077.woff | Bin 13988 -> 0 bytes .../static/font/fontello.1589385935077.woff2 | Bin 11796 -> 0 bytes priv/static/static/fontello.json | 24 ++ priv/static/static/img/nsfw.74818f9.png | Bin 35104 -> 0 bytes .../static/js/2.18e4adec273c4ce867a8.js | 2 - .../static/js/2.18e4adec273c4ce867a8.js.map | 1 - .../static/js/app.838ffa9aecf210c7d744.js | 2 - .../static/js/app.838ffa9aecf210c7d744.js.map | 1 - .../js/vendors~app.561a1c605d1dfb0e6f74.js | 69 ---- .../vendors~app.561a1c605d1dfb0e6f74.js.map | 1 - priv/static/static/terms-of-service.html | 7 +- priv/static/static/themes/redmond-xx-se.json | 4 +- priv/static/static/themes/redmond-xx.json | 4 +- priv/static/static/themes/redmond-xxi.json | 4 +- priv/static/sw-pleroma-workbox.js | 28 ++ priv/static/sw-pleroma-workbox.js.map | 1 + priv/static/sw-pleroma.js | 11 +- priv/static/sw-pleroma.js.map | 2 +- priv/static/sw.js | 13 +- 28 files changed, 83 insertions(+), 532 deletions(-) delete mode 100644 priv/static/static/css/app.613cef07981cd95ccceb.css delete mode 100644 priv/static/static/css/app.613cef07981cd95ccceb.css.map delete mode 100644 priv/static/static/css/vendors~app.18fea621d430000acc27.css delete mode 100644 priv/static/static/css/vendors~app.18fea621d430000acc27.css.map delete mode 100644 priv/static/static/font/fontello.1589385935077.eot delete mode 100644 priv/static/static/font/fontello.1589385935077.svg delete mode 100644 priv/static/static/font/fontello.1589385935077.ttf delete mode 100644 priv/static/static/font/fontello.1589385935077.woff delete mode 100644 priv/static/static/font/fontello.1589385935077.woff2 delete mode 100644 priv/static/static/img/nsfw.74818f9.png delete mode 100644 priv/static/static/js/2.18e4adec273c4ce867a8.js delete mode 100644 priv/static/static/js/2.18e4adec273c4ce867a8.js.map delete mode 100644 priv/static/static/js/app.838ffa9aecf210c7d744.js delete mode 100644 priv/static/static/js/app.838ffa9aecf210c7d744.js.map delete mode 100644 priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js delete mode 100644 priv/static/static/js/vendors~app.561a1c605d1dfb0e6f74.js.map create mode 100644 priv/static/sw-pleroma-workbox.js create mode 100644 priv/static/sw-pleroma-workbox.js.map diff --git a/priv/static/index.html b/priv/static/index.html index ddd4ec4eb..279deb8b6 100644 --- a/priv/static/index.html +++ b/priv/static/index.html @@ -1 +1 @@ -Pleroma
\ No newline at end of file +Pleroma
\ No newline at end of file diff --git a/priv/static/static/config.json b/priv/static/static/config.json index 727dde73b..0030f78f1 100644 --- a/priv/static/static/config.json +++ b/priv/static/static/config.json @@ -14,7 +14,6 @@ "logoMargin": ".1em", "logoMask": true, "minimalScopesMode": false, - "noAttachmentLinks": false, "nsfwCensorImage": "", "postContentType": "text/plain", "redirectRootLogin": "/main/friends", @@ -22,6 +21,7 @@ "scopeCopy": true, "showFeaturesPanel": true, "showInstanceSpecificPanel": false, + "sidebarRight": false, "subjectLineBehavior": "email", "theme": "pleroma-dark", "webPushNotifications": false diff --git a/priv/static/static/css/app.613cef07981cd95ccceb.css b/priv/static/static/css/app.613cef07981cd95ccceb.css deleted file mode 100644 index c1d5f8188..000000000 --- a/priv/static/static/css/app.613cef07981cd95ccceb.css +++ /dev/null @@ -1,5 +0,0 @@ -.with-load-more-footer{padding:10px;text-align:center;border-top:1px solid;border-top-color:#222;border-top-color:var(--border, #222)}.with-load-more-footer .error{font-size:14px} -.tab-switcher{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.tab-switcher .contents{-ms-flex:1 0 auto;flex:1 0 auto;min-height:0px}.tab-switcher .contents .hidden{display:none}.tab-switcher .contents.scrollable-tabs{-ms-flex-preferred-size:0;flex-basis:0;overflow-y:auto}.tab-switcher .tabs{display:-ms-flexbox;display:flex;position:relative;width:100%;overflow-y:hidden;overflow-x:auto;padding-top:5px;box-sizing:border-box}.tab-switcher .tabs::after,.tab-switcher .tabs::before{display:block;content:"";-ms-flex:1 1 auto;flex:1 1 auto;border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border, #222)}.tab-switcher .tabs .tab-wrapper{height:28px;position:relative;display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto}.tab-switcher .tabs .tab-wrapper .tab{width:100%;min-width:1px;position:relative;border-bottom-left-radius:0;border-bottom-right-radius:0;padding:6px 1em;padding-bottom:99px;margin-bottom:-93px;white-space:nowrap;color:#b9b9ba;color:var(--tabText, #b9b9ba);background-color:#182230;background-color:var(--tab, #182230)}.tab-switcher .tabs .tab-wrapper .tab:not(.active){z-index:4}.tab-switcher .tabs .tab-wrapper .tab:not(.active):hover{z-index:6}.tab-switcher .tabs .tab-wrapper .tab.active{background:transparent;z-index:5;color:#b9b9ba;color:var(--tabActiveText, #b9b9ba)}.tab-switcher .tabs .tab-wrapper .tab img{max-height:26px;vertical-align:top;margin-top:-5px}.tab-switcher .tabs .tab-wrapper:not(.active)::after{content:"";position:absolute;left:0;right:0;bottom:0;z-index:7;border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border, #222)} -.with-subscription-loading{padding:10px;text-align:center}.with-subscription-loading .error{font-size:14px} - -/*# sourceMappingURL=app.613cef07981cd95ccceb.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/app.613cef07981cd95ccceb.css.map b/priv/static/static/css/app.613cef07981cd95ccceb.css.map deleted file mode 100644 index 556e0bb0b..000000000 --- a/priv/static/static/css/app.613cef07981cd95ccceb.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/hocs/with_load_more/with_load_more.scss","webpack:///./src/components/tab_switcher/tab_switcher.scss","webpack:///./src/hocs/with_subscription/with_subscription.scss"],"names":[],"mappings":"AAAA,uBAAuB,aAAa,kBAAkB,qBAAqB,sBAAsB,qCAAqC,8BAA8B,e;ACApK,cAAc,oBAAoB,aAAa,0BAA0B,sBAAsB,wBAAwB,kBAAkB,cAAc,eAAe,gCAAgC,aAAa,wCAAwC,0BAA0B,aAAa,gBAAgB,oBAAoB,oBAAoB,aAAa,kBAAkB,WAAW,kBAAkB,gBAAgB,gBAAgB,sBAAsB,uDAAuD,cAAc,WAAW,kBAAkB,cAAc,wBAAwB,yBAAyB,wCAAwC,iCAAiC,YAAY,kBAAkB,oBAAoB,aAAa,kBAAkB,cAAc,sCAAsC,WAAW,cAAc,kBAAkB,4BAA4B,6BAA6B,gBAAgB,oBAAoB,oBAAoB,mBAAmB,cAAc,8BAA8B,yBAAyB,qCAAqC,mDAAmD,UAAU,yDAAyD,UAAU,6CAA6C,uBAAuB,UAAU,cAAc,oCAAoC,0CAA0C,gBAAgB,mBAAmB,gBAAgB,qDAAqD,WAAW,kBAAkB,OAAO,QAAQ,SAAS,UAAU,wBAAwB,yBAAyB,wC;ACAtlD,2BAA2B,aAAa,kBAAkB,kCAAkC,e","file":"static/css/app.613cef07981cd95ccceb.css","sourcesContent":[".with-load-more-footer{padding:10px;text-align:center;border-top:1px solid;border-top-color:#222;border-top-color:var(--border, #222)}.with-load-more-footer .error{font-size:14px}",".tab-switcher{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.tab-switcher .contents{-ms-flex:1 0 auto;flex:1 0 auto;min-height:0px}.tab-switcher .contents .hidden{display:none}.tab-switcher .contents.scrollable-tabs{-ms-flex-preferred-size:0;flex-basis:0;overflow-y:auto}.tab-switcher .tabs{display:-ms-flexbox;display:flex;position:relative;width:100%;overflow-y:hidden;overflow-x:auto;padding-top:5px;box-sizing:border-box}.tab-switcher .tabs::after,.tab-switcher .tabs::before{display:block;content:\"\";-ms-flex:1 1 auto;flex:1 1 auto;border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border, #222)}.tab-switcher .tabs .tab-wrapper{height:28px;position:relative;display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto}.tab-switcher .tabs .tab-wrapper .tab{width:100%;min-width:1px;position:relative;border-bottom-left-radius:0;border-bottom-right-radius:0;padding:6px 1em;padding-bottom:99px;margin-bottom:-93px;white-space:nowrap;color:#b9b9ba;color:var(--tabText, #b9b9ba);background-color:#182230;background-color:var(--tab, #182230)}.tab-switcher .tabs .tab-wrapper .tab:not(.active){z-index:4}.tab-switcher .tabs .tab-wrapper .tab:not(.active):hover{z-index:6}.tab-switcher .tabs .tab-wrapper .tab.active{background:transparent;z-index:5;color:#b9b9ba;color:var(--tabActiveText, #b9b9ba)}.tab-switcher .tabs .tab-wrapper .tab img{max-height:26px;vertical-align:top;margin-top:-5px}.tab-switcher .tabs .tab-wrapper:not(.active)::after{content:\"\";position:absolute;left:0;right:0;bottom:0;z-index:7;border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border, #222)}",".with-subscription-loading{padding:10px;text-align:center}.with-subscription-loading .error{font-size:14px}"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/vendors~app.18fea621d430000acc27.css b/priv/static/static/css/vendors~app.18fea621d430000acc27.css deleted file mode 100644 index ef783cbb3..000000000 --- a/priv/static/static/css/vendors~app.18fea621d430000acc27.css +++ /dev/null @@ -1,306 +0,0 @@ -/*! - * Cropper.js v1.5.6 - * https://fengyuanchen.github.io/cropperjs - * - * Copyright 2015-present Chen Fengyuan - * Released under the MIT license - * - * Date: 2019-10-04T04:33:44.164Z - */ - -.cropper-container { - direction: ltr; - font-size: 0; - line-height: 0; - position: relative; - -ms-touch-action: none; - touch-action: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.cropper-container img { - display: block; - height: 100%; - image-orientation: 0deg; - max-height: none !important; - max-width: none !important; - min-height: 0 !important; - min-width: 0 !important; - width: 100%; -} - -.cropper-wrap-box, -.cropper-canvas, -.cropper-drag-box, -.cropper-crop-box, -.cropper-modal { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; -} - -.cropper-wrap-box, -.cropper-canvas { - overflow: hidden; -} - -.cropper-drag-box { - background-color: #fff; - opacity: 0; -} - -.cropper-modal { - background-color: #000; - opacity: 0.5; -} - -.cropper-view-box { - display: block; - height: 100%; - outline: 1px solid #39f; - outline-color: rgba(51, 153, 255, 0.75); - overflow: hidden; - width: 100%; -} - -.cropper-dashed { - border: 0 dashed #eee; - display: block; - opacity: 0.5; - position: absolute; -} - -.cropper-dashed.dashed-h { - border-bottom-width: 1px; - border-top-width: 1px; - height: calc(100% / 3); - left: 0; - top: calc(100% / 3); - width: 100%; -} - -.cropper-dashed.dashed-v { - border-left-width: 1px; - border-right-width: 1px; - height: 100%; - left: calc(100% / 3); - top: 0; - width: calc(100% / 3); -} - -.cropper-center { - display: block; - height: 0; - left: 50%; - opacity: 0.75; - position: absolute; - top: 50%; - width: 0; -} - -.cropper-center::before, -.cropper-center::after { - background-color: #eee; - content: ' '; - display: block; - position: absolute; -} - -.cropper-center::before { - height: 1px; - left: -3px; - top: 0; - width: 7px; -} - -.cropper-center::after { - height: 7px; - left: 0; - top: -3px; - width: 1px; -} - -.cropper-face, -.cropper-line, -.cropper-point { - display: block; - height: 100%; - opacity: 0.1; - position: absolute; - width: 100%; -} - -.cropper-face { - background-color: #fff; - left: 0; - top: 0; -} - -.cropper-line { - background-color: #39f; -} - -.cropper-line.line-e { - cursor: ew-resize; - right: -3px; - top: 0; - width: 5px; -} - -.cropper-line.line-n { - cursor: ns-resize; - height: 5px; - left: 0; - top: -3px; -} - -.cropper-line.line-w { - cursor: ew-resize; - left: -3px; - top: 0; - width: 5px; -} - -.cropper-line.line-s { - bottom: -3px; - cursor: ns-resize; - height: 5px; - left: 0; -} - -.cropper-point { - background-color: #39f; - height: 5px; - opacity: 0.75; - width: 5px; -} - -.cropper-point.point-e { - cursor: ew-resize; - margin-top: -3px; - right: -3px; - top: 50%; -} - -.cropper-point.point-n { - cursor: ns-resize; - left: 50%; - margin-left: -3px; - top: -3px; -} - -.cropper-point.point-w { - cursor: ew-resize; - left: -3px; - margin-top: -3px; - top: 50%; -} - -.cropper-point.point-s { - bottom: -3px; - cursor: s-resize; - left: 50%; - margin-left: -3px; -} - -.cropper-point.point-ne { - cursor: nesw-resize; - right: -3px; - top: -3px; -} - -.cropper-point.point-nw { - cursor: nwse-resize; - left: -3px; - top: -3px; -} - -.cropper-point.point-sw { - bottom: -3px; - cursor: nesw-resize; - left: -3px; -} - -.cropper-point.point-se { - bottom: -3px; - cursor: nwse-resize; - height: 20px; - opacity: 1; - right: -3px; - width: 20px; -} - -@media (min-width: 768px) { - .cropper-point.point-se { - height: 15px; - width: 15px; - } -} - -@media (min-width: 992px) { - .cropper-point.point-se { - height: 10px; - width: 10px; - } -} - -@media (min-width: 1200px) { - .cropper-point.point-se { - height: 5px; - opacity: 0.75; - width: 5px; - } -} - -.cropper-point.point-se::before { - background-color: #39f; - bottom: -50%; - content: ' '; - display: block; - height: 200%; - opacity: 0; - position: absolute; - right: -50%; - width: 200%; -} - -.cropper-invisible { - opacity: 0; -} - -.cropper-bg { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC'); -} - -.cropper-hide { - display: block; - height: 0; - position: absolute; - width: 0; -} - -.cropper-hidden { - display: none !important; -} - -.cropper-move { - cursor: move; -} - -.cropper-crop { - cursor: crosshair; -} - -.cropper-disabled .cropper-drag-box, -.cropper-disabled .cropper-face, -.cropper-disabled .cropper-line, -.cropper-disabled .cropper-point { - cursor: not-allowed; -} - - -/*# sourceMappingURL=vendors~app.18fea621d430000acc27.css.map*/ \ No newline at end of file diff --git a/priv/static/static/css/vendors~app.18fea621d430000acc27.css.map b/priv/static/static/css/vendors~app.18fea621d430000acc27.css.map deleted file mode 100644 index 057d67d6a..000000000 --- a/priv/static/static/css/vendors~app.18fea621d430000acc27.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./node_modules/cropperjs/dist/cropper.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"static/css/vendors~app.18fea621d430000acc27.css","sourcesContent":["/*!\n * Cropper.js v1.5.6\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2019-10-04T04:33:44.164Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n}\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: 0.5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline: 1px solid #39f;\n outline-color: rgba(51, 153, 255, 0.75);\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: 0.5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n}\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n}\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: 0.75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center::before,\n.cropper-center::after {\n background-color: #eee;\n content: ' ';\n display: block;\n position: absolute;\n}\n\n.cropper-center::before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n}\n\n.cropper-center::after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n}\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: 0.1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n}\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n}\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: 0.75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n}\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n}\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n}\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n}\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n}\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n}\n\n@media (min-width: 768px) {\n .cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n}\n\n@media (min-width: 1200px) {\n .cropper-point.point-se {\n height: 5px;\n opacity: 0.75;\n width: 5px;\n }\n}\n\n.cropper-point.point-se::before {\n background-color: #39f;\n bottom: -50%;\n content: ' ';\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n}\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/font/fontello.1589385935077.eot b/priv/static/static/font/fontello.1589385935077.eot deleted file mode 100644 index e5f37013a88506e2a6a91b2c0758388f4f1a2885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22976 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 - - -Copyright (C) 2020 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/priv/static/static/font/fontello.1589385935077.ttf b/priv/static/static/font/fontello.1589385935077.ttf deleted file mode 100644 index 0fde96cea20a6b7bfc8f046945623605824290d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22808 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 diff --git a/priv/static/static/font/fontello.1589385935077.woff b/priv/static/static/font/fontello.1589385935077.woff deleted file mode 100644 index f48488a77850b21ce51ab6a4c2eb77daeca013e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13988 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 diff --git a/priv/static/static/font/fontello.1589385935077.woff2 b/priv/static/static/font/fontello.1589385935077.woff2 deleted file mode 100644 index 012eb93051fe38d464bffb06f4dfd053c338ba6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11796 zcmV+vF6+^EPew8T0RR9104@{&4*&oF09hCS04=%z0RR9100000000000000000000 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 C9?j?g diff --git a/priv/static/static/fontello.json b/priv/static/static/fontello.json index 7f0e7cdd5..6083c0bfa 100755 --- a/priv/static/static/fontello.json +++ b/priv/static/static/fontello.json @@ -363,6 +363,30 @@ "css": "ok", "code": 59431, "src": "fontawesome" + }, + { + "uid": "4109c474ff99cad28fd5a2c38af2ec6f", + "css": "filter", + "code": 61616, + "src": "fontawesome" + }, + { + "uid": "9a76bc135eac17d2c8b8ad4a5774fc87", + "css": "download", + "code": 59429, + "src": "fontawesome" + }, + { + "uid": "f04a5d24e9e659145b966739c4fde82a", + "css": "bookmark", + "code": 59430, + "src": "fontawesome" + }, + { + "uid": "2f5ef6f6b7aaebc56458ab4e865beff5", + "css": "bookmark-empty", + "code": 61591, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/priv/static/static/img/nsfw.74818f9.png b/priv/static/static/img/nsfw.74818f9.png deleted file mode 100644 index d251377676855aa1c25428a1175c1372b10940cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35104 zcmeFXbyQs2mo8cf?jbnAA;F<=ha^}C?h>r1DkNAzA%%q?!GpUKf`s7i?ixI}LvVL{ z1J3DRpMI}j-`iu{`(Ljysz&WybAEHJZ_RJ6z4zLIDoV0AnBc*DgXdr8yLU@0G^MzYUntqft+bz_O_-LR!|xT7Z{WVim)&R01(p!36@T))i_`7 z;Y7Mm<-(C`D8!rLr9NyD)Edz9zR@U$kyN{>()Zs!2VWbbTu(~aUZCB-4;G8gYxp`r zci+oIul(uH;pzTqqKQkRCq?gmrUV7v+Dcdd&jXes30}8`?4HA`T^zmnuF0@2pS?-E znkLSZyS6Trj{O}=MB3y6N#u=i>U@*`;im<*1+l^F`xC?Qt`5(;2Br?dm~A=SDF(S! zx8pi=)^OTmmz10N(tCz9*~rx*OA>KUg(gD2Pnvat3ufJ6S?DDV%H|T|e>_CTi!9GI z{#+Af*&19g;qgn%Us~?&iQO8yiOsQneP40#DL3r7xP;yEx9Fq#g2SvEqf6biq89B9 zd;v-k2l!!yBssJCZqj>Ui|nKwmpO~F_DFWtBB6b@p%RWn*?Hy7V9%_in6qS>lzFS# zR}_P3mU2TLUGSz9VQ29`9{93}!`@`k!FY?rScU)cq& zI;b_6Ik3e^b&ZPv(#y`-&NSYi4Y~|1cVkNrIIwHl4$94Q3G1+}xsICcH#+WBd0e?UpDwYspTysEG@_ynA>$*`D!mr%-b=3HWVQ>ONA&jRH<*&`qPO$1-0rFRZPq#j zO2;AX&XF%?V7sNOG{n^DRU)fp&1dvX6t2B5WhMkywSK9fw^1JtPjo}qA!~m`D~HErKC-hKnigL}Q2oBl zD%vAuMSB+inWcGWBIH+3>s(N$P!2ZnFP4rT8&14LRh| z#&!Rhn$kBnsf`!TaKq;<`h#cZ~N#vwZ3*F z_SeXm>mQ8B9R|r6y$B@!cxK=TUuyj6p(cW&t zhAHW%5ICw+n@ry2+a!ejnM8Jr;)Nd@iM>}f0Zr5R)Q36}H_qI&bdyQBA@Vjqfw(6W z^j~}@xuQL|Lx~ul>nSIkpJLtUklT}N_<`fHre=5Ft-SrTG?gy=+tVQ$@F_{d0*F<- zK&-L4Y6e?;-cmKpDfOCUB&ZQs9Ppf?Cx}@XQdP206|baHv9)_k*Fv<80VATEN>(d6 zivK2xRpM=uS{Xndu&H;wYQZ!mOnInDLm#g$Ak0hQsEg>vmB?+YtD$OD#4-fTnpw|s zi^;YIz<*IiWt>+EI}6DT_wZPh6g!Y|HY2KN<+9PNeoehXKTlV}o^1t9;wB$w_Tv;R zKR@N`Bs3Q<-9QQhyWJm1)EgECfisIJbG)AQ29X9ioB{FP2!^qIAXTewI+r!zAAG`0 z`TPTAK#ybJ=sY3(OB@(9^%ZW5ReD#FCuz^V!4j{KUIn9CblJMhdd)~f+5 z_KTT3c3o(uS^AsmIG=hb_px7_*XBo5JwmkiQqguovcTZa7CD$u>`Y5nW$4i#5=qx& z9*5{bnt80eZSO$bcMHwl%PUHY?kGiH(>|^g0)d2PPr|D7&msmCygsj`JmZ_TWk;$; z89BtSdHU^iOisrw3F)@oJm2TUZP~quRSf6rd6Ppxu0^K*Za&ZBB9a-Kn zmbX=5R=h!_?AV>@x6#Qapv{rp^sWUXhmU%Vrh){0J^fzt{pPk9nEfs-fm^7V!)xAq zxk;+zrS7Jj?^3<<7aHEY*xoQvz~uf)t~J>=hqadZHZjLDt!F^+J;Fj_hd@>JPf`b` zFDZgh$}=OQi#Xleav5U;pi z&Cq;8CnO5rJIRo>wPqOf`|u@mFu%{gECu*MjI~a^fO1>d0CMo%tn$fmy%^-afM2|5 zX8<*P9;z3QQFMICA1&@?`%@ngORDOR@yJ;I z5xyuhNr5sBuo)~H18*It6XK|+#m@$&9iE|c z*P0P;Hj3*ar%ii71x#V8^Sz%LC~!!mZ+Vm`R*+Pc!(FgP^*FF`@9lOI;(;;G%R%#h z_|GUu6K0b^SLFL9uydQ&aqi#ANK|C~eum*ARf?Fj=q`asWO+#5qVrdJGfLTek;D%B zw||f^){^NmWNg2%!?aps6w6`br8e-P%~>|@3i3yHk{cOSuIB}O>gy+lcVG^G(kHRU z<}rIStYz{pd;7(zzZha69!x%iprA+pnyWu@*zePX#9^g~>hL9*B!S*S{w zmYebNG@;~_WHsX<_Dk>4Ulmd;yK(jWR90qPdg+F3sX=5d;nf%7hp3A-p^Z!E#}&qx zqsInnV;13PEw@VHyjP{$iV3k`Mvm~=3$<8MA^r382K()+Nb2FiM;Hg20%=|3JY@67Qrv zPoOp3=Hrq6qIm&dWXm{n%Tp?2>%~Cr^MJvqM0_^FSK11BjyJ+>lEux6H7+(;SG{e4 zz%-#SJ~noj%1iN3EVoAf-IqU>?a$r3(LIM~(iBSTG4j2h0;;K~Cy~`Yq`+ zrwx{0%%retCe<;jeS9kj#i(;J+9pQ*Rt}~nHr)>m-L#Za^KE_dXkaG9WxgC!UvIu% z6wEN=;4xzS46tn0x8oQSZ-rB5aT$6i9KF7xNiE}qj7I$as=F#h*M5ouY-umXKKPeL><<|qjmw@ivGdwfXtm4!!MaWDdEJnVfJo)deV#-1_yfvXuHKzsG96l$}{up?oKfdjg z1F_5q$kTzuQA>$2XEf7SgZ-~)@Z2ecamGpNl#JS{khdJY6b2*I$dg0k;Cz`r@1x|z zf4}Pd_&PXoZtbd5vBR5x(xj7p0L5nUEPUi6dj!#TXa26y*8$mHF=@+WxIu{#AA(gop;V}qOI({3`^2uj zfd{|<%_ETs<$i%-J8jD&D~S9KnQk-Cf zAgYC0T9>A;cK(x3nAGL-mEW=Kv`Tq(wK$U9dhPBpeE97d-K_vD^IZh!9o(*qRrtC) zNkmkT&SRTchHV!rut=&o>w`Jb`st#V+zpfvh*UCTf$#YwY!Lt1hxrGI7vLAX3%l_UHjUru`I9u-twgs(sDOc%k0ovq*3Q- zV^hp-U9G~4Y*5=ye!xa6Ob8(NjfQz852G@2sddxRONUExXoB5%*)U=TKUwStnR`#7 zg(v1@|G9=SM7K?h)-Pt#Z}0WNceYd#%tJ+lsK%j{CatoW=xIaED)s;=^2bc&@4`hm zAI8?hK3`6Df8x*usWa7O){uO8YeYVa_uZFxjBT_^J4>PekC3B6J&%VNnsu7^^l4!B z&r5C$Iv{KPyB1W~`iE7(o8Qq4(yMD)IO4tK)YeaVR~fc6bY))lu)Bx(BvJS~w@#=L z`;g^M0D^zNYAO&9S@@xv#=at~eq>FTxGVG3Vetc1aY-`kcnz9RvuqM0N1{(9QobKu zgz?##GU?M|?^_x*{S2*zxmI!O^v}j(b!Qf$A@a4o&H&IsBH z62;wM?j@sYV-@lo67K9v^Dab-a`RU<0*|OTwYHi+8GY6Ju#u<2AEv(S?gP=yDbz524QVBx4=;>81 zI`3c<%4e=(7_p%_VfaocZ_;t>o-8-gzFuBZet!Uwp|8-$G%9Qlm}oVW|MvDp*2`jo zy_?Lan6|?)I1fjfh9-*a3%j4Me0*Qm9eyM{OV4T^6u1)XL5-#74=0c4Z~GS254d{M z3Qs1@e@8%!0}~jsWayPUIcV4kBwID*&_p>Lx;xze{AO`_$xDQd;x{TMhLVd)ZwFAU z@PmS!Uup2DKN@6<=QVZtE6TXx8ihV4lFWFs#V2{5jo#nW&e3=_mCrI;x6!^2opV}> z2ef+~;%pZ%v1O{K3ok#z+Y#_`eU(jI3Q;2s2=#qqv)Mz(AcyMg8htcJIdyl4`E*0Q z={brA{|1H=Q##>?QHf{X#<;@}9ux(8JZ{6nVSP`d4}v|VRU>^B(~-i|Nk>43Qy?vhPrnJ*XJG%=NN_}NzLa`qC%3{1m9 z#L+y1L8&6r7gwPM# z)1^2~{`w@{eF?zgsB(xPV$nh2^Z+6k2inwQ-1Pogx<)<0MIMk%w{B5*x$uO(B4n8D zSL~nbc!cK2n`1#CqtD(%K;u;A3}xlTn*2|HsP`>(l7hHaH&JvmwOTOR1lVR=ArX=L zdN0(0r8TTwzZ%7lGPsMVmxqd$XBd_i2LFU;#o+0y0{{TffBJmO0_FgIc)leT*n-mx z#D038`i=g#F<*~xg~aXY@U3Q_8s_t-N_!hPLVCDM4i`rnocE>WDlm-{*nrld0RD{1w@tz(60C{IC5HUJ!K1HA+OcH8t@y^vAs_v?!0d}r#6E~eW zCXJ{)#8g;KO6G3}dx)tRowvG2aOlIS$9`KuOgRzO ze?|VMkF1=c%D;RbXf(61hCO;bSpU-!0{)jB%+cQJ(FOwMgjzwZp*9Y1PA(3v|6q@> zhW*RoKON2^_#;umQnp~n2NXFeF}jBi2t#ba77*dbpI|;AJ_w&6H#>+&kcXX@TM*1H zD8vP37vvG(;t~S#LQFwI|A3OSfjfX~z|aRMgf)!A!U7@;f$(z!xu8&XZc|=fc3yt4 z06PfEE5L3d1c3^fa)EilT#$c2DBD|@S=fNA{@JSsD2N3_Sb&R{2Pg;xv-1l;OxSr% zcum-a1fd{yEAz6k*gH7e+FL5yE1P_Tf*t;Aod3-D zUr1_DGYhzby^GxcVo?7tJJG+g@|^|T!Peg8AMw?pc7GlHRYigJ z7#$qs1pO_LsM$EzHHE_1|j$L)U++{SRIL zt@dBhh57Gy#!wrG7@aengm^BpY%u@;z<|Beg#!Rs)eoO1;-#b{0002ZK~7N`ZRH6$ z))O2)iTh~)fCeBZ^+p3Ry))l`{HJRtETgrA$6({KATEqZj2nPr)3NC(L zVRG)8Q{BTYgu^oCpLngvV!SLzey;Y;F-YEu(P^hzTemcSK5INS;qsPtD(;)9g|?pD z!uj^vY7F8$VQRz0bfa#l|2QNfhHpk%N=iz~6kA=BhK`Qz8-R(9j*brV^TYT5p@aWT zn8;V6c~2uEpl7o?U z66_`mHKKmH$&D^@Ci*2|hh+A)PQd${H@#0mPqpqh?7XVMqvZRUuSOKd>^kRAQNy=S zxfr9RW4oN4JR@nhe)G!GQ-nF-JMKiEW~N)HE@DM)9}@uCZ?eBkmIDDV;^M6d?4F-6 zJm>9j-F(+>=Vt*g0;!QDJf$yqu z4FXBW8w?y~FtF3RNsP6C3ct2IzhW^^_@5!D8R_SwB2{c-K`Qv&>CM#bwtA#Uva!)Vdfx+_1bc36XRODcf>MK10l-KxVN~v94De$3{>7$pc z7d{B~Z7cIKgSdBegNK8}pPUdP$^w(PAG9(iheYzUN;41~C|=k%sRC5qp;)RSO8t9y zpH)TPFi>T&5-*u+vvO99l{A$Fa)@xP_5h9b+!1%=6LJ0YeI(6bJtU}zL+91+8MVGi zJgY2vd}@0m9(Fux!{Sgr>9U?P|H0IE)?FDq^If5S1n$=dPW-Deu&rdCa%ne2?iJCe4{qU&c7Dy=o&jN;4e`=7FCkY?b^Idg0p>I1XQv0hdm3)OyK>r1 z%Dt~aea6imYf1vswIk9@xP)AJ`+9u3i6u$1SmI#^UU@1=StsREGDZfB5(WR7o*ckZ zEK%V3^APdqzIctssw7lb9h5wS7U4A!egqAks+@-d>C=^6dX=zlwG3}7uix@`V- zssULiD6c2=^V$`5=(_$rg^0AJoE~)1y`1IpWG`#2K^B`YvrdLlOoQ=L^XG;*m3Fes zl4%d7zrD9fsSAo!A^x+1jk8iuRHXdG-xT(-t_`AWGvRG;Yplk{#V8xmbq=1%OcRv6 zF#?+uXB2y%bLc6{F(tvjat3-GOi=BvL7ZQNP3)M-w_$|hakG>P@`Sx$i7OK=I@w|B zCF1~!B)4^5t%!;!7#l=tHYfemQj3X^Fem%sg)qw$THK^WCHveQ@QqQSU(0kdolRO@;xU$)Iw^M4 z8jf+YB<$-nMj?yQTSslICXtdP*)81B=llCcni*_1dHRESH%9`|7IjcUG@i|`5~qT!=E(2IP5RBrvrEZ+E@bw2`%KbsVj zC6%@5$$jrPqBc+QrsI0K?Q?fGR}VY4-bh4s0joh1Z|@LGDAB&9sA8SO>x3mWd&N)F znE-j1Qhu=@J$)5@>BDD?QTH#t9u~6|g;dmZh)!wnv|D1wuEj=f3>mY5wW-<|hN$U= zs7;&%!^Tn8cFgmZ?!Y20`Af)RMYZ2WSfi!01rGccoz|sZ6xT=lmHN#Y$}vTScL_kq zbQ=MhOQP@JPDvVu^5OU#!Ekl&XhP@#d$*2pPca5mh|t=e>o+tsA4`PgCK5wP~Z0fbrU3lB|g~G z7SyFeJe9B0*W7S?f?$JF_{)=hhbRe23CbX#W%neh-y0B(f*}p|3i@XbSb9Umyp+{1 zfH^rTRvA`Jp$S*r^p-`4?7~4}o(i#TQeDup@p^dI@4!Ohyr^df(%Hg_Pw~lQA|%>h zzSK0^&v>B(HKk%bdVh#R)ML6Go9Y4h!`l=7OJJ|C*6D$q7&NFJwyIAeXT=b8M@H2J>Ciqy|+B9-*KO>Ge=@Q z>g}YsGo=25=>wV<@?>}J*A0b|UMOtutPQ+rOR*@)s19--Fp?am@yctW2LAELEh-Ef zE-wL*UidMal~?kQ7w4=Io;{00G-P*VWgY9LXkYn7#X(7D^&8_|bfqQFqEe+otZ^8B z&rN;f6i@|d5Cve{sUb}eN2`BoMP6^)Vl!`LS_M9d>Xl#H zJSiyT7^QQ{^TlZ4TvwZIqP_ut+A(Ht)bm$H4Mr|^*oBD|@zAAu)dt3$Q@HvX_q;|U z={@N=wEUKztRbCizH9%dQAS0PbN3`68jlNn&E8(L2xp?NwMJiqJ1m(tRDvWfu~3UD zZz?SsgY{ui9*tfoudau1EYZp+&%=OZsFs+$KYF`Ue!YVjs}T3DHv~_Vy~=@2SNgBi zes|r<-mYyMtfl-K^cs~Fiv``KUT#5R6sVK@p?~^jM71eLFucc&#GrXxI>v%}!g_M; z%er1AKNYnTAaFLK(bbVi7A@jvoJ%tLK*6vy;qKHyQ;(WJCO{CjwVhyG z%@hh!8NMvz4i4wcxh5l^`RZiRg90ujOF@UFg~8{Pc=-ZZD( zrKfH)TNXhMOI4ysajOeDtheVKWNm(h)!-&tNKG{ZMG`^EK=RHmxposXx@qJJ9`3cS zFxX?q;^&H#8EZozDF=t)C>>{bi;D}ipX${j8ELft@$V@$fh$heQHb@D)x5YfpQBsa z#tG@wx>V)qN=}&FKz;`yYOBw@=N}&S3BvyMqi<89D$dc{eI#Wxb+GQreR&2%=^2fG z-OTCQt8V}%?sE5{FzK3?s~6rI!~krcWn;w}Y-7Rpz@w z8%^5@%+L_SvuWLxg$IqgfamkK*QEPG^P?n3h?*LEA)JO3_v-`PtC0)w>TDhAbM1Xo z=pEa8zxV>f*oY3IGGf)4nI66}VjP#Bepow}Kh0J)=~oPMRHUA$KoWoUcAGf9=@2TI za*_c7qk=Iv4s>o0%NWmxL)|HMt=7@ds!EG~;(%#Xe8t2k)?@6CccA))m7n!J&AYi< z4JBTZ)i^lvE7tJ`*5D3Rjg@4b@=nkUGc9bdjYQS}6#!PD4#&atoTWcAFC88CP1f1kG+IR@kXxOqFYlDg6nk$o7{osa&W;xAn1> z`s7TD?MJ+9>koC!mD%K#{HcrUy=y*$tyS1j!Sd^oFp70No~ucsZ7}?HSfIS7TOr2{ zAZ>X6vm2-r`Qg2bpjo%N6$AbY`_k9VM?is`@EZF3G6B*V$ACIq)ya$@$3Kn~9U9%CCYEM@or<-*qD+DavlnLwJ1Km+s`R;GqvwG@oe`3_MK5(Jo_EHDDO~9 z$=-y8Ev>g#O1W9QSXYJMcV%;pbo{CtrRMHBVjx8FnOf4H=eNbNga?hds=WiVbw=@_ znUk(Zx`Sx?2V(lVPjJMKC+!TBoT`qD2O7VN%}GB_OmDfUzM(L6(HnKR@*ZT5pfEK;dwl8S*d!>gACF3sR)u7(D#!UBRZJ`MwAn z_8YbbEqJ3OT(S)^Q`zHG#hT-NAP+4o%W~>gZPqsmc@V}AY z5~uWnZziEq+@TipGUE&Fe^6CHcK0X=5i| z=3*zjZ?`je-iDl}VDx#LHC7FOP<~s!Wr$a!tgI&Xw~*4}pU^JE*%%1-)O@`t;Awg{ zdeH3~t<{(azV?vT_>@IsH>55%;ol4M%{{4=Ek55tD)@s?T|+rFy&W+EeuYrtEyt#ouMiZ{esIm=kbGCbYBrk@EbGthsf^ z8$?p?xaqlg`!0;Jqgb$=L;vFM;7QB!ap$Ir`6T>u63`BsKamWAH@UaboP| zcOj~^DRuvv;_9Hh{v{G&XZ<*E%7CbTnFKRWopd&6>KqnVU-(sgK4f2X>C zz;AVDI~WO~uqJl*>v$W75Av_5fTQL>F%8+;aaw7=7w9TP0ViRFn$YzUx+2~mWpwac zTH=k^@aU1__!n{vnqJVC#tAL55MUWC)0joVk?+`EzP#E;WjEB=UmlJElk-vy{Z9`u3mf3>QsKNKv|PC`sAF!O4Z>cLtWwIzE{i_h?H)m(jY)&_Q3r*ohOa(D9v>N{F<1nCxlRcBC7vE}C}@fV;mbWHmbSGZvhV+Kf1Rlp&aYe3g| z%);IBWXc8_rINEj#BJjAtB3Zd`Cq{KVsW85)L(}UKZfqorLM;%TTf<*P4nzSc;{tu9^SnqQ6)uZJcXl) z8FFwYNv!klh01O!wEqyVw*Jj`J*!HM@$mSD8}kKbFEcJQ3!Urjj8{!A5KRw{C#INPTcg~1l)*ZsIsQ$ifG;U7y%#e1##|&6=ZeZ4SrsO zsw#1P8fEynJyP&cCy~+PiAe|tvyB5(@k!zab)r+H9J)(T!a$KLSj*Iq5#KIe-4r9G z%V+28FMW1}cdSJQij;O}w}j(4tgQ1N?z16@Uf*qt1n|MK>I22+WUqL1Ag;IZ>JY`m z+IIri)8x6`-HJVlUw4Pmb84q$k~hWT)rZj+L{6T*B-7Q`=eGT=yF<_e47uZ>mGsj~cT_!HpH>2auwrEa9iMXpjTXLm;jT#fKfAGbo_ zDAR`%1~Z=HK|@sDkqT&Ym`NMzs>$*jOlDQqr7$W{CN2hBtJ6Q3kfz`HDBk0@EF@>- z+F@sKRxw^yuto?a17E+f%dJbHrf~Q2e*H=wE3(y-=s^d~j|C{SU zgs-g9-r8ksEiICAbGc56M6k=$mkU%f&7PAhU2VZ60q; zUP`vXy$kk+W=U}Dti0@Jjb9p-O9aUbc|gNnr16+z_5JE6d-pdsDRqfQu)%<`0Do{D zuA>;`tfxCkQ{ksC0pKWD3jQQiz7wOt({3BzaHIC*)p9jb-xT(%rQZalPD>G~N{tn^ z1lgeC!raK>Ns0A@s=e29)Z13;0$omruXo>AO}_ld2=hw-4mW8nE_yC(2;O9`1BjMH z_u`vk*^G?4`NKr`OEjuVwnqrUxJTwZ?L@eiuly@l>ev0l10L?3$g`(2@%1vr2vNC> z;6nX&28q|MztudWuXG^oQ72f6d^^?!8?DPi7lw|U>GJo9E(V9#Y{(M@_$4d>`WFS5>*K;(+K0;yf( zPkm7*@(A49v`d)mXux)@G=;xGfujbL==lj^;UM98=)mSYuAYo}ALPq~we{)E%wSi| z4->BKp!H(9qLB2iV2gMinR}lzL(j|cjt;vPyX$SSCE+ors8FEtg^P4&hO#^%7YJ=EkG9#&snmeOOnOeWXZ@?SK^?xLjgw;uyS3#qZa?;H zx@=uG%T_MfZAbP;;hzI2H(txG1Xw<)?4V2D+x^ZHzRn9H_WCSj5ujv!q42!&Yc(b~F%P_OKFljF;WQ4f}W*F7Vr|LA=gJS#R znz&p9mAy1c?jXW;I(aO}`dXT_AqAb5cMyvxxd#Nk+H_erW{{& zoJSJ^w)+$z$TC_JR$pWKLN){xT4TQql>>2*y1rCLrO%XXiumWK#FIkwh@XtMaw}rf zED1_cB-zY#wse3=A@RiGZ4~yVKUeM+GAFF`mu>FTAo`6bq^RO;%>uyZP*DB)4}wCh zv*t>0p?p8(U1Z`DWX0gc<_$$tLD=W+*DtCw^E}Z%PSd7@6I50z}Drpq@=jz^iL z&wKcJK~KT}W$8g2+to*G#%-ml;s6X8xS9Li8Xy6H}@d zU5?zK^)R}12|D|*;g+k2(A1ogGF>(%F+R#`{D>a4)QEw|9Xet&k`lJ60HGyO z7VgrXLlpJOfl71VD6w6Q^YW6af(RtauN3CC-z%#map>sOgC2I9H2DJF31hjq=l5`e z4c?$^ko22ae-cVC^qk%?GOG`x9LV`StlxIFuIE&l{K~|#T;)NuQZfU)*jnqc_Rvky zLY9;+7ndxZ&aoP((30SeRl&-SQQ0ZP6_eZamff&+!9#TosP`KxuP*-{l++gobDR=A zx+NQ3FXKBsJ%G&NQ{_($9e?eT6AUHSe?W(ra^v{O2meI$?PSdYE%B!so6GO}t%uRW zl7*XXf1a1rl<3j>JZ@w0NZJAWtz%db=Qn))gWU-wr!e7>p4)M^%cUjCX)p@6u8ho6c?5JB*c$ZUk7Rm>OhJtH!bfY14Pl zI4hFXpaB6-(*wRMb+4>YYa0wu4}JLRm4TT63Ee*OX%o2!n^PtzS@|1gRWC-n)6*7# zrJ3N87s3nwUiPKw_tl59^6|g>+d0IoAYN`R=2^CEKerv%`8>2u;LLW}(k*Q=lIxKa zur_J;;tWY+3|26UCYgGB8BW*bpV);F@?FipdXk)UeDwZuucJzpY9vZDJ8?8ZNxXVf z-07otKmc~@(REo<`p0JxlWynre6t>h)~i?Ec_GY9quU!3y=%NuwNo?m>6rKtlfTf@ z1M1JTGeAd|nv(~2U$(RN{0|s_M|w0xC_Fhh+#+1ut}sb4(mSSjT)(FMoxVA900n`- zR@a|_=3QJ#XJREcj`G!&%C$GGJkXyj*Z!5qUkt)ls;_EE9o$^4dn5Gxpgu?-@p>jvdxERA7L#=zYU*UdF%?_`ljxkyB)uGns${i+)9#hH2>Qn^ z?->Qnq$EseR%O=2o{OK$PlNFt5%?&tQC>$R6f(uP3~@F^bxeKPyp-0|536xSTMvrk zG971dcHp$I_|;tSqkXCj(`-X;Hv3z7eqUS4Ks|V6C^yXE$4W30AgEhGld5-}M7uFq zXo>g3tWX)jwl{nHhHV?u&lLO9t%v7HTG$crpzm%4 z9>(OZqQcs!Qsb-HK2x^oFvsDtcveHyzSOIj!!He&_Oor9a9gOgGFp|G2VR93 zrSP-IJkDmqGPS!O-_H=G$CXR8vbYZ|tU zwjM{a$y?*^9j}o;B4RiS-ZlrkyOB6)c1}&Pj&P@PoG&teKlH+mec_Yyn-# zV;({iY^4s4t^UX7NG1)X~inGNsU(2j8%vzKvS-s}t`|AS|s zuA>Hy{VVj;WFL=(UBRvm#c6RXi~RLLGf$a2_=^+OeT! z*x|NbloD;7^wY5Yddb#AgAz&7noH_!7n?+2#V0HqXX3pdfz(+B$p*f`eX-e5AMqZG z;?}%gO~_DDqth~vVlLWHo#$uAw*3|ob;%GviJ%&L5*byby^Ib5adHG`*b3K?AD&yL zYfa0Y;tAiPdL6N8E$76AXLxPsJ<*Pe0UrKT?|k>HbY>hKJf5h$%(&ksRBQZJU?wTR z?wCMg)mS!a`ZXkR1U=&p(?GFy3PsFEwJ^6eFYX1~Ko#%u17}Rr@rK-*!W^eYYbQAay{7eH z=$SVRdyPZ{PI7{i)Fw)TaSM|>+AjhWB(w8gLtL+-P%LY*t(G|`$u9>GcUuxb?LCdP zoaH{(OPhYjnO6=;0@`d#l<*<-wMR*46a(u%4;9qAE;qho30t}CyKiSI)LzR8xc$Ta zd&oe1Y36p4Z<0%Z#|Ve!;iZbrep}s}b3X~XKZgq4XCW_(7B7Drg#Xy+$>zNgvp@cB zC1QSgvF<0Z!sl4~>|wzvKMl-^D`m?;m^8kQ-R-=-+y5+37?kF>v>&4B0(D0WfBA_0 zFjaE0^7cU&-OD%x$7>~~BB^-pAC_zr{hN61?5DEWx>-~*A4K?0kFwvdg=BI*V5nTJ zsep)c<#L7k^Jea{+3O3RyAN26)n_u;iu=S5kxvdAQ8wV8-fU4*o3hOZZzwln#ZLGq zF)!_h;7FIbY={nEKH8Os?+-1i_i@U5T(C+6ZYb}gD!+{pZ);s3OZ(tLB-EHr{{C^T znpr5U4q>yUsd&+2({#Q9)D(^PWBN4P!`Eu&z@4$E@g{R=LcO=iu?R%(FZ=<5DZogNP3 z1J_YY-mRD%tcCA)os@a?% zt&109Ik850GK3El1Ul&25s?sUW^>$JW+LWqJ=o8=zqF-A%p{I{sV!nk=<@qE^-mNM7sLrMbrRFUa731$4-7%&L+`r12xojViA4{iG50}-X;XcjpWnJ-Z z4I2C6kAhahFIp5Nj%K}k(8~(DK&KGHJU#t2JA2PaH|YV{V|Rz_A^SFk&7n-~ z#>d&T&$@^YmRvGVO+Y&|*@l?cW1Mbv9&;u7>i8u|b|K6Ndq`yONgJiJsz08j;=muH zCJ07!tkPHh0I9`5#-(9d&?vDW3^0qIw^L@x$bWNsk4LgiDbaa(B=LGSDbo5AY}i%& zuoX!dC`|~EX3%8ewy$oq0`>M**&v=}rZY1`Jx*2*`gt-vZ_oGq&g(@Qwmti_s;}z~ z>d?}woKNX_E=(DFo@SD|urp6pPV%~( z-|z_wKK6~sJ-cIOolRNya-yI~VH*C4+BNrnzUs%`iAD9PHSAWg*!sGrNrJM~$n$+L zI1471CbFL2YPl8tSQ+J<)h|tsZpnUN;A7z#bIhcaAAP#W{9&|!cSogF^u?cwYUXraP_L*&lkAmfL@?1bQwMxe}A30XbZ7kTmZH|rD{m#b0rDvk> z65bVOmFL>ejf1}XD>U`dFzhIS7|w~7zs7|9nfda0yfbOpk(65R*6tU)o2fC%TM;L0 z@w=Xq{d!n-ol_q-v<#4B1SQqG1@PZGuQutsP3Xg$cfb9+7LB{TCR zlllAJ{sjbu_zC{SfQNcjXxb<8RD{V#za}2TX^bYSwM@?eP0qJAAC9gGQ3bZRiyvx7 z$O0d;o?%=4L5-cn(e4;?^_@)h2BUgiXw%i{56Zj2i-{`PnG4*BD@Eq1g`e*?Hq(h7 zRDRffa;2Lh!HOc=f!PV686RYtet=NRfDsfr)CbwYMvv6Mn&l8YT)tn)j$vQKA zAR4bUa_-`>WaS;JjrOn+6c94L_7bjsmH=8Y=-m3D>hG&-2%wfaE~Bh`Z(_ zj-??cD~1iQbBVFGh~rR5K}c=w9UqxwhN>0k@8BA9>cROKxm$|hQmmdcls^Hdo3DxG zBx})B7`~>Y8Kov7Nnpq~DUdKKhuZAc2V#28KNh+AmC%y7mD)_a3P9(PSkFG#uO(4K z!SMOxQ&MUG7K>Uqw|@W2YmFMDS{Xa#6)As-&+?o~w;RH3dZmmn(<}^Fu8JO(I|b*T zNAIJkd0FykXR~@Kf6YXFTEa_rNLKVzDl3D}0N*Pq2j2blmd5k^vFTN68{2;umLiB1mI&0s67_gX~@%>(DnYWEDuHyxnC4i+zZ zIoJfdqFQEGIj7Vpu%q^eR2Uz2AtQ$MBGr?<+m}rGRRQi5k=&qi=uFS>%b*GhQxbIvo5zy}eabT-_5r2!sUpV8J~=aQBel8X!QB z#sdUt+@%wOYjB4U+%34fL(m2qYustPfd*#5_xsQDtXZ?>tsd?@_uM+?RPEZkx^Ew} zJM~w3;26_k@eOLM*y>C2bY>|8GNNY(niDe69yP4wc|a58Bx5qidU!t)Pl2TMFXmZH zUMxZX$|ChW0f!oi#)na4tD_2sv&C$G_VTRR;0x~%lq>do$E|JSozDhjyyKDGvu)`9 z2X_S$+4x-7lM+myYx?HZ*JAYVL8>K7;A)z-mv^y4I3W3$?z@#$n%@H(a}C`PAcZ_~ zP}C6Kck*V`cX3HOng>j*H40;j9Spjc z_Y6H742PG+wNH&NgM-N22?$!k{VsHw&rL*R4>t5s;)Y(Nr~hnwjKy)K+R>7-!Jvs% z5s5nUs$Yr79S_8>qdmIqEm?x4(k{FQFN0>F&wxQwEk(q>WF7+>Bro=+Y5Sq2@&4n{ zJEK>|ccT3Koedo?Ms&K-q)_V=Q(OU)#Ex|t7J(Psj=64jy4!|k#^ysA!TaZJp;6EEGUofp zC!~x>STb8;B5cIRbk<9eQ+Ou+!f#Ab8blI%I>}@b%m4ast0LDl`Xw7eH6G?Ma8z|4 z^g2+gQ=v=2sdMVfPle`54c53|U&}Kqq?Y!S?$y_LAZ=|};$uKMPz8#1+OPR9yG^u6 zb}CX1Np|WqSq~HCH#CeLp*jiMx$KsIq%>MeT8E)EQj5Jr{#5uT_OIAP5vI&kjMPiy zU#~Ofi61m+9=0b!(2hgA&Y26wvDN8skOhhF^Pj!=x%pHVw|M;kZHn}a%ZefC+ufarYJk8{?XIwo^ zr+YL=g)VTh^a(;(=1KQ{9Sp`W#I>r>g%?y*{y$ImVeq|VVD_87b28+kL$odKO~d9O zYeb-hM>}ZV{ijgIj_h85JX+mz=+6@)Q1#D|Ajbs7lRc2U`wqGle`k=kbbmX(?06qF z)WUdp6&P>i0XUVUnt48{adXy;FOj*$IS$yCdsa)%*Q}&|EQ>*>L1<$2UF!bW%1Mk4 zkAn8W6u`iwISa%sx_Z>ZyQe#+RShuJQh**w-K(g<9cRw)Nj#GS%f=%e;aZZKZ{3j9 zS7JurEB#(NyTsLIw-^OCtl~~O;Zhfxp;mFsmHyO!O0jZNZ&V*JrtL>wTHR8f?Y(&r zr-mO|nM`nc4p4E=#6?r%`EK^WhN&CR0YeL`s_9TI5MMOPy3y`v7U8|#(-|npO!}O` zZI31DTp)X&XA3Va2^e@p%6>#c50bmi3h;%49J62ckB*m}bWFW@B+dtBm zWC!iRISd6p|D_fg0ld3|`?uO~WodZJkq-RGfmVDRvQtuGvY}OVj5tkn z*~MSFi{QD4nf^L-G5|OdO?loge{Fn3gca{knatA__} zVd~YUyQS5Q8Kw?U#-Rq%b15*HE!?8TjpEsC2;~ZcPHge(F81k1fc@{OpCvOm>_`Rw~&8lH`R|@jW6N4u`Ki9=ha$%3W$| zK;$WmV*eJ3{&&m4Co3X%%&eS!>g-CG(3-``e2=l3U`B^votxu>{#(j{-ld-*<2lBZ z%Kjapi-H5q`fl9MN5Wc`5JN3*P4fNDms_;XFm#ZdDMN##$d%Pyg#^tz_CDi(%!ZC# z^Q#~PeDhT&17M8tFKXm-8cc6Hx>V$vmZ)MZKY5W+1RDrBS^v~C|H9pAvUf)Q+tBCr(+EBqh)`aJ&tJT(*kT79$8nY`Xe2Vb&80va7dk;HHTq5rGDAMh3JFm zwu~|i@4wE+!r8b}eBqb9%jV}!cPNUh*GH_o9Z#^G_sHHsX$)g#x#QiD#>da6_g(zmk2riS z$9jXLc8yyc#19TLOVU%CMMR=kkqR)n*53N#AL=Du+#iQte#0Pp4#5$D8&$OeH;O&> zZ@bF5lp`jD$)P7I!oy?aKBq_1fg7&h%rDL|W!Gb{4#^e!lY4Zmu z!d#izfBbz^{trHFzmnT$04Q>S?O8h|{(ANYOMSm2jdY-pkM6X3l)Sk+ZiZE>zdsV* zK?3-mqTe{2VD1ho-addY{<@SYUq3!4(fJ-E&WV{qOa8tU=b=a(5K=Ng@WI~iyaT%W z_#)1&CEdPf)$f)6+4O0$Ti+G~YUk^^$0tzQ`5(~szL?2LNH{puON=AYTnH@{-%1U+Hbju43H z9;WB<&F0~R&k7%66+%&|I7DQs|3|{^TgjX>d))TZZ&@x#>+Go|+(H{B^kOe+GIzKJ zTCYqa-y08KNm2EzlAqiW!OsA>z7~txOusU5QcVZPe^jXL?gmEV z&Vzn~X1ErVl%bg(*!R~!#=yI7S=MhMAvUwAGSb)?Wt?x$q&}!xW{(}_JQEm2~@visazm8M3r6MUNi2vHABvl!`)^|?i2o-{f zS(?J8N+G7NV(Lr3;;gy~eBfdm(;&3IzUka-!$#zl$97W`5M$u^=q&4kJ0LIK-uvOX zT47Wlt-hHJTV`d29F27H^m+pCSt@&?0yS&y zjVXP|A+uY?PwrPN$)>dvpREOI+39YChjvZw}zFvlmZ|t65e+-+>BE48lD6S3$UvXV7BuhxSK_#_cqy zak3|@oVDfpWFgpm=E{AS_IU$+hM&eJYwFauZ4oXtpYe2bxK7OAfUJCv*d4*iT^aPN z(d6W?1LJP0h8TR9Et`{jnfikNl8b90uG;gX6GLq99BWtvplAcV4}F>D-f~s{`5_mV-}_@h1Q&c1|`us<{V$aY{TT8KwpneR@o z;h}1BwhO$LCY2g`5-GHd+F}$S<#hs!XJh^-jBN~;_jG4?r_UcQxa^4oRQ)=9wR8NF zYpt>3f3wNYre0RG5_iKA62ogJUUasygNre6ksdz?w*IABai{QP_S%|>#D>E{OjfDk zqlI@T_Y`3e!}sg42AcKi_LJxxlBeOgO3!armn9QPL*vEsb*se>nee(5)TYL0!x2)Ez!{EIoyq_%KZ0ngAC;g>N>0_5S636OSUkqVS4SW`2L`hN*H7Up zJkLrlBtk`6Zv}~K=}e=h^+$qz&w0|SiP7bJBrfQqh$}j^KdPX8FloK?$B$>joUA`0 zI0GZN0@7DeUA803Deq#_t7%k^c2|Q#9@38+QT`+1Q#y?N$w768Q#1CR@tt==T&ABt zvm>H@S5!#7rWT!ggg5ldSp$QUNJ0nbV!u}a2ho2_fI&BcTzHsRck&l(Y$lTd50iaU zQ>P~}E_T#m4*r-KGl1QjhGq5B@_PeU+VCf&FEe~`yWo8;|Dstd^`#K~Gs-p;>rkb{KpmQ3(_35gyoyg@b5*$n4W-o%JnK6z^#m zJjHSa{hRSFj>B)Iy6|+mr5>#6j&rA_BB?FN;;er1l+~w*XK1U@?F5G$;Ss5yQ(O=~ z#Nj_&aj^Jb4>;YSu&(ON)Zffpg;W7l5&u!ue_M|DjhFArx>xzP55K4*?r45AdVHwA z&ezSd1o`B$89lw_)Pm5pgQfDcVo=8(*+W)ac(3}35ZyHb`APX`L2D>pf5HfiM;`+Y z&Q3WxavA0dVL|{#@p&l_SJ>)O?Ab!Qm22-U96pEUXehz;{%OpDz-9#&Q0+aPA@k#= z{cC}@h$wj<&M*gGOrHZ;qFaV_b1p=5vqIs%@$=PjAvSoh%okiLKsdWy?;WYJ2AqQ7 zx|4U^_|_+5zXW6XSod0TAl^-W28n(;;fb+ryB|0%)JxOq-C}ZK@rB4$k)Fu6SHOfw zFz~Jz9QyswnlV~7efpo&%G-8Tn-{U)M*k;8rnVaz3eM5&B!x3s+@KJ(oCcEa%=?a( zJ+czETEo19RoI9;QQpz{rByfTRCJu3y&81qzEto>alt=3bB&4uG<>zKFAzM4 z{ad+{o=?GE9j%Zd(@@Hmt{>G{AN4m&WUaZx@sJ1^@hllMi+q(C=tmyrvl4SYulg^Y zM+7?Ub~8VR=GpvEgi9Dp{(<2;J>S1OKFe)L#Hv&>(j1(+G#P?3J6j%A86u znLLK0i7nifzLd2#w}5chXwFWref^9!b{2_?%+tiS2`4c7#Qyu|ZJfG2L25j>Gv311 z)}9i6z{52k=>=tuj67yFXaF(>*1B+vyXdaXB^J)M`yF(WJREHmy8fqdM&kTX=G=5) zuT<)wI`8KpJ?S&7ePO-;#0K%-e>65m@|f@v7MmClX>`?0av^trbi7Fhs5@VGk2@x!%ASRXejW#^YG%Jr32lr;$xxAo0qC&E-_}K5&vULkIA?(@lSol8ULA=cs`tmuISbJ0G8 zWK3>kUkh)oUhfEe^vAL^!V2^rKf++dz`L+q`}_L6tt3zx8EDRPyr^3T=zDLK*jxi7pO)@M$;vY-G8({(30&V_w>P-9ou*!Q}BeKd)cXw zbmTVjM!z55&YSSu`A@TU{H5*HLqzMJMPwMSxMX|%0|}7LxNJD(&x7MWezqqRxp`ef zJNWs6w;iTF_!jI7n? z;mw27>?|rrB^#sa1+y8VXMCXXdVZt?`z)Mmp}U|RG+ zbJU&6-`$S%vB@g;_>$-;@uwQHJ1fJxOKcZD@f#$@(x+3D-XO*Y=D{mP!_R#!it${p zv4Is|x>w5@ef1?|Eo!I^t=C5?#d{d)(6q^)Wstq0|2k0$bq%Ex1J+VzFaDm7`K32q z!$;;Taxn>>5eCR;deh!T2L_cT<&|PLCgxQ_6HRNpThlo%^$!ZnU1NE69C3#=cVnI> zF3p$5Xxm|uq7T7UZB0p!3mvH}`_a1uz~|>p4}>ofK6tL!JXl{jcN?unR>q8b(p+nw zY!%8IPi^8pdvA}!`o{D8kg3(>m~EUZC8%pu??b;6pk83s@#GYMXm^*2mH9yR;n|Uv ztXP&#T771~iZ8t7J!?79mj1>q*~V0>V?$Z)0?%t6iZnVt2u-WGG1L>y#=>I9@D|s) zs+Bn;OMg@1wSU2rRVG$8P#5+TGY1s{sPPW4*qR!P;@pCW%SJi+9Q5`m;Di|N4YSp4 zO~E@9B@1)DaYgo}bWbFxj71qDsc(2mbB<)x%xOOPe&_%60=V-;)MDwSXbZFER86Qk z7S)EmIEp$vv0m>>(!csUN96Jv{@lmIm@i&1l;Oy!4HdTxaVZ)cG zkPb+?&KQZB=h4sg6V=)q8j70v^#aoCtpgmSGRgF9v?hpVoFZ;I_O(Hia|v$7TlE@M3yR*Jt(um!XdZ3Jg}5k{hcj#U^?i- zsu)L4C+}$OS7t*rh+F(r_Pd^5-bh_P%jCd=^+w>-?ctX@eO`+%)HQAXl!p4|e!Y}d zpHHw1sB2pNDZ%+nbMi}WaZ9U4knJHm-DfSKn;*M^HDgR*D+1lC^=CUX5JGuqy*{ah zRvhiRftz6w?(083!v0kj$eN#{f|zTfk;53sk(e9!aV6(oKjZwTA!1h~3tzRT^RWbf z8r1C)hLceHjxR=?vn9|FwEHL-Z+_lFPpBY!!ZE>c}~(=((H_3kM&23cH({s zcQ#kkI~fow96jn4aa&}Qs-{!a!auQe*HVy;t&dpaR;to{3$$}@j<&?m>T7Cq!Zs&zvlWmu<|xN5Jw8d3mF}f=Um=tsSrX zR{JZ>ZObilG6s3+0k?$(-|&zF+(~=L1`zTxN9DnHukUm4xs&4pL~|hdT0*@clkCcm zy<5cBaY*)api4DXNamP;@7G5X`smCAN!`uM^PLExD#nHsT^a&aKMCKHH63?1{#>%R ze~{jODA?NCKa*Y3ufrUnM5v*I-S!j_k5}X33egAcC)wcTX%}NLKA%-A6DJ~CX~I^H zSQ6r)1baQ+uLJdjrEF?td75AEr5k7XXHT?b`4#wL8ZzTs!<7uKeyilD=Jq+~l4+{Bp9R2HNb@ zwoq?6)(~|J{46H7Uf;Io)f^5N7_UzmEQdw058ObiT`cP76)FwH)+S}pkX8+0EkP6j_i_I$3;-8Ya%*s|%vfE$qW7&i!EZ4e%K)Tp8}t-em3)?=mr5rr)vwvq>&iM&K3|w+4e1II zMLR94ZARfo%SCv)!|PwJF%02K)^4CLL*as8a`8pc&iq6@HH##m!8~3dk#C+Y7teGI z>iP5B=6JP1fQE+ z;E8L1nOO5jhWZq<(wmn)MPkz0r7)@(1K1Oa_ZaU@RRHp&;J!LeS}4{(!cY_MR<}N- z$?6n#hrh=+u0N~x7`CuZzd(>$Hp*K?{DMeX#?Q|V-x{gz2)Qqf+>f;dN*FbNsD7jS zdld$otdO8oawp_%?Hzl6^y0_BK;=%KEd}@Zkv8z zzjkaD)q(kS)2>A4>6@5Te={Q~|K-{vx1@`grxaNR`nhcn_$|4`C5bIkah(lU4%PMk zF$K*F#ENAY6}&7-1!3uu?y_+y&Cy8iG6vjWD$+B!XJb>k-_~o|p@b1igDlJ0dZ1#; zEe?@!rqBAM>j!GCG^DR6pPwB57HH!WmLlofJU(%GxZ_xJ9v#~81}hBzFT4j~c;auA zMP*r&0=XrlJv?2X#g23%8T~cDSQRFWkAAG`=HgINn$uV008HTFeFy#*>D^WOxx1$`RDKJ&Q-wdM>CB}Dk1b{qIQST;ia%dw(#Kq=}M)N7w=;sHH{ zp5OL)@#-#|{^nO!C`<>*84F802y0xseVm>rvXw?r?z3!nzp>Cp!ZcBTJ6?Mq66$lG zKCTS-KndL1ana9CeXh_v)u)G}0i|O}|<&g#Z2j%WaQx#BB0hkZ##U08aRdEmwkFY_RpU6cfn!|aM0 z%{$BbS_z5mwMWFC1MXyXKHb5!SsavLy{P!13cHz;pCh?>x&C$l! z{E_65smQkj zBgo%@o4QcgVb-r?A?s)R;$siolFJ{bNQI zSF4GbBpe(s&5ukFll>jqlpmNqtR1cj*41_;XO0y;J_VJ@=h=c9?7b2QS(y^0AW~{5 zQS|CBn#a4W`B;ssY@F%=$+4q^Cp$XzuV*oXK482L`lB>geRH*oAKyeAKpiiyf9F-? z_PbxzEw}H_q-{llq1wcGPZ-v_#Ir^>s*HeNrZtttKL-{)W{6)%F4Nio+iw~?eX#@0 zJl%2$J3M=EOR=H?rFzYWaP{w@QD$07YMg3khk3B*fJEB z)CLtjGQh-Q1e;ZIL2SjxQPR9VngR*@Z}7Fx?o|CQ>?)SJ!VUZY^UJpW%B#bjWRE4? zcn!|{O~f!Zi2vdZiw@}w7yq-j%DM8z@({JXYGe?m-JI2Rh=(QuOvaV$yCH!;Aho9OZgc$q$`dSBqk~|Sq&c@ zXK-ElW$MFFd&3X%gW9irA=|k)!xm}jwQ^s=`!QB&#oRD#4Dd~FAT1P(1R$ZUmmh}J z0ew>l0**~SW4wR%*}A(-NbA-+X;#zvUkf#(fq9xhi&?g~vk(W--^N6Vyp&GHRXJiB zL;-6goHE(R#pyhHC*CdHPJgItnHk*kKbweVGasG`xLRRJe=MD_)G1SG8nm{=xDIY` zg`*(mvO>s0^T_lw)?y~w``bO)W9qKXSGt8UjDKZ0YJEiJz()n*_XuHb{9E+HN|%gg z6yup&pQL1rZzA5tOnt*XLq+PZ$(w5M)hS++$Kjn?wfFknUwDtewJy46ncH{u>($!w zre$0dPyX4y%0uC9ld`W`rhAjFxGZAT%Xg{cg$o3Vuv9Afd2&@?*4N5CN<}yGCPAX6 z+5H!KV?Sg5?N{)rqF->d%YHzQYsZf%Xcj6HlUK6DB(K=kIq}r6`Oih!QSX=5Bl5mM z2wj{1arat6l9qaTQO%o(dAHUJ%nG1Q0`@;0-?gX-w7A?8Cs0usG>>jhTL9mVIkC2k zW@EPvS18mJZ1mkmd8z-2kcZp~HI5~R>pfhZ@szzvn(EX1L0Z6RUxmulhJ4ir5l-1P z0ktNg>EC(+T|*z8ZqXt)`4H)u*K`hSU+nMB?Uje{3My&ylxH>!(jD5&h>foO<(q}m zUpJDVV2>5;{h}{!tOT$+<&7kc66OY}^h~@}PTpX5sp8dT?+i4d&1lT!T>lP)$=u<- zGUu4}a?LYfsHx0UCqk(NIy#g@^b~VOGm0&ct7@;d%sRMjnD@g>8eAVprVssQfx z^W%_O+=|J)OQYa|>i%yL%`cIDdW0=M$NMo z1etV9vd`St?Zt{77jr8wTlc`}hTqDQBLn0k@0^^z*4y+!OukLI>Cc%> z8nWtfkPh;{l>@lit)!KXeaK=Zy*ZorLc$H)@O20O>}{>9L$x~l*6zDSw!=#?vIFOj zvRd>w<)dn`AylN?pLyEk#cVX+>v8uZ^4I@do zUcvddSLPgW*IaLvPVUkGhdRTx`$UmrWp`~UThVOG;skTuzvL&2PSQQC8()Ee_`Pip z!CO9r?X;}MpY8*+-Xa%$db=ObN&0qit2s5Qpx``qd>LCNE`iE+`qu5Ji%eSG?_k-c zxYOGGd>q}pk8)#L*Q=%}J^MuBy$^Tz{B}KgTaIHbej+Z8P_wFAjuWUPJwSW?W++0N zj`6$k@#0va$CCW~#bi|ic49zZbN%UM3i+DHv6u6-*+BgPY=4I70nrT^6~zCRh94+l zL=D_4+?_{s73;$9rz?NKf&^FakblN9W>biV=U`CoIh#4f?etH8wbk@W2Z!>9g2T98 z?pGb3atgjZc_SG|IJ$oWqEpz(aVH4qeOWX%NP%jq=2($5-?PF+D@$ zkVOj?7j{a6w8f-4D=Wsn2TzJHNR<&ft;WEcVhm}Ix8o*dK}7>2C4iyOOY1j28|9Qr zt}B{%Vns7i6rqd_l*avRlY*k3iNDJZ6qpz^YR+Y}5Vq`W#BKxq&0#sg>x=mMbz9jv z-^73IZ@;DDadf!S62*m-8Hi9SKGgeFQ zHcowIY*D#k`Gg>*3fa<(X5V|+F5nw?Y!V4-*@3>nvh<#_ia6ga@_AY*yJF< zPC0pblEn45QQo==&w!_U>WZUQRQcpT{xo0db!x8jEweFC(GRE1VPX}oO^u@Rdo0`- zIh&%0n>&Z|I(C*+cG8;@dC7V@pXHe-94UiUpT*ogH>_YEx1UMx1DTD#Kl)wC`)=$j za(+#gf^pJTxH>u1Ue|rdLH+&VbRr{2Gb?NfGej$MX`#R{t`%S@T{7)>nV*1g+$UV66#2={l$j$OTlWs!3RpjCBA9CUmwpNSYm^%@;k3VPpk?e{4jOgF92Pmhm`rbh&5h@Cc-n-z zN+jikMEM8+p=Vqe0u#%Px-2hYbbA_G$l9yu({qSGf?My<#?)V~o_aF<_{}oY>u}hd z?K03laK=GGhwI&n_%Pw0wYOq$?dHPaQYXhRO7fANk5bVUc5*FgsA~6CL~tUe|Awp3 z|5IJG;Q{8UG%XVas=i)xYn^yc(*?bJA?NAm9U!#>g^6(6`=RR66Lt|nh6N_xgR*4l z9t-Zp0A@Bt+V~r7ORT;91EVn$?!|y&hvjnfSS?m zAoZnTHdR+>p2~L1u{BY5yC1ms#*HpCr9EAg`Kd^BjTXHAcZjDuGSa9yMQZcG0GvLX z#JRD+B*!=6Hu4W0nJ%W`7%sTPwO6CbHdE)hIJITto%OZUA4OrY+VdMQa$|(gcW=t4 z>5+?f=3afFs58ocvR9jMtOS!9S??yfc{sJutQ(WnuEXi;X#3fx~SH>>T!_T-WoS*p4Cm(MsDeRYnDdGqTRwfKa9SE-8Il50YXSw z#$8OkEPL+RS_G|si#WG#g|1wU!yctRQ#49ybgkY*`XHw$iuru&lQ;oxE6(D z#~ZIW1!l%Fz8u(w^b|IxuJw=X$?7Oky!>5E-s?vf(5&V@#ji=5dZlWH(9x% zPO$C6hB=iO7}GRD6pxfTYk$6vT`O7GhX}=%7JpmUV`XA8X+`YKxqi$a`)TsvEoXXeHZnsCNd-MAto+pBDuuBXS!MY>n7>hvHwS%<|v_ zrlW%izDFm#BdyKLG>ECi-g`x33+bvAJ1&J7!4?sRQ4OawSCYezO)wG`ot=h6JAzZs zZy14L%YDZzU~s!Z*j_7yT<*V8b=|V)HGRcnT0-I*$8kYBcG&@XhuKP&BD#7i<1dwX zj{jg&RN>_u7O=q(sWc4 z6mC9T_5c>bXb#XzI9=E0y@ukiXP8O@})GINKwSbyjm zxsuj}&|=Okc4&Xt289bHJ(S*q+M0->Ry&B#^Tn0>5W%>l=+X|t(!&>gMxzYhA3hPC zif*|l4SN-w?Wy*qAfcqG^}@=Cc2PQ@rnF1F@%Ca~MRnOLj?)D?q8(7ERm;^s!cf@u zp|(*rm8ocUmvbf7NzFlxS#l|GJ?`L>GaEpu-UalADQ(a`R8?20Mn^I6hsHBs^{_`P zBkTKZhKr(xT1yBEDw*-E-vmGtvXOjk#(R=gduG# zEL|$q9U}IMRgB~%q@)+glH?}h8Z;U<8&rZW5V%$?BbE(0=ax6Pg&kzsxA58CZW|F@ zH1J?0B^Z9m-1(8TlIE#^?D{g7u@%{bpab~pA_N9jMACb=-I%r@{z71n=jKQP@BH&! z1&&@j^)fB+Rf$VeW=JqYG4Pc+2SW4FG=svhoIM}KxD{sJF5!h?pd@$xt)0&~9D4C# zEN!Z{?%lT^hPI}p{3_Hod!>7gbUzk+gTYo6pSK;BdFowl15JmjJ^gNZy|x~-pIzr4 zH~;R%9KI+GaJ9>fuIDqI7WfZ?jBKRDr0BmYPnRu91LZW_?Cd-#!-m5U{6EnGhu#ax z9yC#t%JWyeXJM3(2`o$N*_@xex_I{%jgU$pNe<#BRLA@6 zLlr|>3Fc?O^e#qU!?L;_Quzv!{R2K&R1ymrYs+`}>budhiEe8mF@)Ya^eJ?gy>qzeW@8K znv}GQ2%~nqdrtS#XC}15WGq2|5)yKAxCI2oF7a-K7+mZ zbFvwO_LHLjpuL6%7tj;#dLoU>EOvm2qT8H4cl(9Y(#vh1kg99`71p`{vb&jSK*P42 zVB=p^)dAy;@G`E4{+f|UD_!BmrCL)hBi5~^IHS##&!lq8aZJRzEjfFr*tKkpxN>Rm zO8}lD_oPPrURte^p$-1H5z36R zkdn|&(cQHE_5#7h``G4%KVa1P<1bi`-mtd=J8~k`!b5jW{E)pw+E|sHY2U4>mcOqy z#OIgVG&V&AjoUA9HKqr~txJH*&5H!O^F*pV_^Pw$X=U2$i9->-_xnzgGon?}sI!lG zw~woKt~}EtITkE!(BArO4dYr-d)auQD!TN=#JI@|@iL6g^uENng%4>vav=)00SLPt z>Hz8!4gmDe%-+@qo7QZ6;@CR9!xDMEInhBwDdsJ_^P!4m6^mp? zrqM)a?5{~B`TB7yv`1aL1&Xq1_&6<1W!Y98#|t(58uHw7qZ?W%pPtZrPEo#fa#Na- zg?ei_P*la#z#o2zBZvh&uy-(kwch+Ywf!^3CaEohde?PEBTs!S; zTF}2%(|cuBAsm3?zW6WKR~x?2e_9F4N^wJp7buTMz1LnIV>qR=7+)J(&_AQpJfBDn z510FvNjh9+v0Xft6Hmb3GVS%KJ$A$43OiQ(-ez0pd{pG5jpuZg+T6=0aaVG})q-29 z^Mje=JLg}~zEF1HhVAKhu%N&BSV{a@2*y4&NjY!*fu=iU9$jV2R;)fne`#q+^QvgkRk)hU5^#Nu?zGl`*WX5&`=_=GlQcI{E z$lTEV==Z4F98k>xm}AdJaS6hfTJ@=At&c=PdinVDjexc6&BcVz>lo@>s%Ld01MuTb zrn8EkKY(q#5F@Lcl&#$5yFEM>L3^hLX+n&yoB~{TnfRy;iF`&YVpg%Jcp>L4`fsHQ ze9-+J>ks(cDisUYzNb3P0X!=PSr8q{vJW|*P(I}}G9&;BrO8PZ7n~gPMq)^r;iXs( z=Ug6=?{(h>8(%Lu$IQO@p~DI5-qmY&-4dR&bVFtO5*?LC*x+jVH7S{e6aVt1-dhV# zuQU3W0~MkCZ0mNs4a3G6k32r<`d%gGRcS{D3dybZ)n7)>7B7gKKRR6r)e&5Ho|f09 ziBuTi%z&h7d$G)Sgfk9hhyo(DEf{Ni|E)8gaHu#6wnQ>8(JlWrWJ%ZhP*C!$T`fS=4Y8U^D)kvQgWnrNyV!Hw+3yY6SXykmsrEKJxbA?S zwL-b~yOOk{?r<~Ri~0lJSOaKz6M>Q%lTV8drOw=*W>e>N|HQd%`==f|C*9#RLhi5N zE;lJ*x?LqwWj9QXry><`;pFTT*XF{&*qZYO9M29|Nu~JOZpgSJ>ig9q^t{wXe7QRP zg{nOqTb)S*${h4Nfe_+GHo?(uvSFU(t|H%)kOQII`an?W?ZqNg~>NsUPi zRuR$W3`pL<+9<1FYF1cNqU#xi-^mnk63s=~xI1)Jrvg~I(8)rN9gdowyROc87&Ut33tD#Xt4ya ziqvtBtFRXO6R`Q0;KwR7)HJaB?@!`0s&LWulr3bu1AnbHEK1t?J}g;;^+R_WgMwLd zxslbBmg&nBoo({a0`ckJWv(1f)Ug#LF9`ke?~^LyX+^IWuL0?O&IDHFzZ{k}m@IDx z7r##Fgw?Ry#)(x#ja2USs?fX%XwuB;=9sbM3#8q`nVIQu$s6%yRbO!en)-LT}$oICQVI8JDqaEe78BJ z?1Bw&)PX3$;G)iKNjV+*uBb)~o)*~l1G!EaeW}ioH}38$f}YlcKaiy3#V-jj|4U(? z-oC~RTFXNdf<#`NRzWXQF)ie?Q>= iH>3PNot9ZT0<;XVeIF)yjQ{j4Rz+DgnTii40sj|{GO1Dk diff --git a/priv/static/static/js/2.18e4adec273c4ce867a8.js b/priv/static/static/js/2.18e4adec273c4ce867a8.js deleted file mode 100644 index d191aa852..000000000 --- a/priv/static/static/js/2.18e4adec273c4ce867a8.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{587:function(t,e,i){var c=i(588);"string"==typeof c&&(c=[[t.i,c,""]]),c.locals&&(t.exports=c.locals);(0,i(3).default)("2eec4758",c,!0,{})},588:function(t,e,i){(t.exports=i(2)(!1)).push([t.i,".sticker-picker{width:100%}.sticker-picker .contents{min-height:250px}.sticker-picker .contents .sticker-picker-content{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 4px}.sticker-picker .contents .sticker-picker-content .sticker{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;margin:4px;width:56px;height:56px}.sticker-picker .contents .sticker-picker-content .sticker img{height:100%}.sticker-picker .contents .sticker-picker-content .sticker img:hover{filter:drop-shadow(0 0 5px var(--accent,#d8a070))}",""])},589:function(t,e,i){"use strict";i.r(e);var c=i(91),n={components:{TabSwitcher:i(53).a},data:function(){return{meta:{stickers:[]},path:""}},computed:{pack:function(){return this.$store.state.instance.stickers||[]}},methods:{clear:function(){this.meta={stickers:[]}},pick:function(t,e){var i=this,n=this.$store;fetch(t).then((function(t){t.blob().then((function(t){var a=new File([t],e,{mimetype:"image/png"}),r=new FormData;r.append("file",a),c.a.uploadMedia({store:n,formData:r}).then((function(t){i.$emit("uploaded",t),i.clear()}),(function(t){console.warn("Can't attach sticker"),console.warn(t),i.$emit("upload-failed","default")}))}))}))}}},a=i(0);var r=function(t){i(587)},s=Object(a.a)(n,(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"sticker-picker"},[i("tab-switcher",{staticClass:"tab-switcher",attrs:{"render-only-focused":!0,"scrollable-tabs":""}},t._l(t.pack,(function(e){return i("div",{key:e.path,staticClass:"sticker-picker-content",attrs:{"image-tooltip":e.meta.title,image:e.path+e.meta.tabIcon}},t._l(e.meta.stickers,(function(c){return i("div",{key:c,staticClass:"sticker",on:{click:function(i){return i.stopPropagation(),i.preventDefault(),t.pick(e.path+c,e.meta.title)}}},[i("img",{attrs:{src:e.path+c}})])})),0)})),0)],1)}),[],!1,r,null,null);e.default=s.exports}}]); -//# sourceMappingURL=2.18e4adec273c4ce867a8.js.map \ No newline at end of file diff --git a/priv/static/static/js/2.18e4adec273c4ce867a8.js.map b/priv/static/static/js/2.18e4adec273c4ce867a8.js.map deleted file mode 100644 index a7f98bfef..000000000 --- a/priv/static/static/js/2.18e4adec273c4ce867a8.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/sticker_picker/sticker_picker.vue?e513","webpack:///./src/components/sticker_picker/sticker_picker.vue?1909","webpack:///./src/components/sticker_picker/sticker_picker.js","webpack:///./src/components/sticker_picker/sticker_picker.vue","webpack:///./src/components/sticker_picker/sticker_picker.vue?7504"],"names":["content","module","i","locals","exports","add","default","push","StickerPicker","components","TabSwitcher","data","meta","stickers","path","computed","pack","this","$store","state","instance","methods","clear","pick","sticker","name","store","fetch","then","res","blob","file","File","mimetype","formData","FormData","append","statusPosterService","uploadMedia","fileData","$emit","error","console","warn","__vue_styles__","context","Component","_vm","_h","$createElement","_c","_self","staticClass","attrs","_l","stickerpack","key","title","tabIcon","on","$event","stopPropagation","preventDefault"],"mappings":"6EAGA,IAAIA,EAAU,EAAQ,KACA,iBAAZA,IAAsBA,EAAU,CAAC,CAACC,EAAOC,EAAIF,EAAS,MAC7DA,EAAQG,SAAQF,EAAOG,QAAUJ,EAAQG,SAG/BE,EADH,EAAQ,GAAkEC,SACnE,WAAYN,GAAS,EAAM,K,qBCRlCC,EAAOG,QAAU,EAAQ,EAAR,EAA4D,IAK/EG,KAAK,CAACN,EAAOC,EAAI,4iBAA6iB,M,oDC8CvjBM,EA/CO,CACpBC,WAAY,CACVC,Y,MAAAA,GAEFC,KAJoB,WAKlB,MAAO,CACLC,KAAM,CACJC,SAAU,IAEZC,KAAM,KAGVC,SAAU,CACRC,KADQ,WAEN,OAAOC,KAAKC,OAAOC,MAAMC,SAASP,UAAY,KAGlDQ,QAAS,CACPC,MADO,WAELL,KAAKL,KAAO,CACVC,SAAU,KAGdU,KANO,SAMDC,EAASC,GAAM,WACbC,EAAQT,KAAKC,OAEnBS,MAAMH,GACHI,MAAK,SAACC,GACLA,EAAIC,OAAOF,MAAK,SAACE,GACf,IAAIC,EAAO,IAAIC,KAAK,CAACF,GAAOL,EAAM,CAAEQ,SAAU,cAC1CC,EAAW,IAAIC,SACnBD,EAASE,OAAO,OAAQL,GACxBM,IAAoBC,YAAY,CAAEZ,QAAOQ,aACtCN,MAAK,SAACW,GACL,EAAKC,MAAM,WAAYD,GACvB,EAAKjB,WACJ,SAACmB,GACFC,QAAQC,KAAK,wBACbD,QAAQC,KAAKF,GACb,EAAKD,MAAM,gBAAiB,uB,OCnC5C,IAEII,EAVJ,SAAsBC,GACpB,EAAQ,MAeNC,EAAY,YACd,GCjBW,WAAa,IAAIC,EAAI9B,KAAS+B,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACE,YAAY,kBAAkB,CAACF,EAAG,eAAe,CAACE,YAAY,eAAeC,MAAM,CAAC,uBAAsB,EAAK,kBAAkB,KAAKN,EAAIO,GAAIP,EAAQ,MAAE,SAASQ,GAAa,OAAOL,EAAG,MAAM,CAACM,IAAID,EAAYzC,KAAKsC,YAAY,yBAAyBC,MAAM,CAAC,gBAAgBE,EAAY3C,KAAK6C,MAAM,MAAQF,EAAYzC,KAAOyC,EAAY3C,KAAK8C,UAAUX,EAAIO,GAAIC,EAAY3C,KAAa,UAAE,SAASY,GAAS,OAAO0B,EAAG,MAAM,CAACM,IAAIhC,EAAQ4B,YAAY,UAAUO,GAAG,CAAC,MAAQ,SAASC,GAAyD,OAAjDA,EAAOC,kBAAkBD,EAAOE,iBAAwBf,EAAIxB,KAAKgC,EAAYzC,KAAOU,EAAS+B,EAAY3C,KAAK6C,UAAU,CAACP,EAAG,MAAM,CAACG,MAAM,CAAC,IAAME,EAAYzC,KAAOU,UAAe,MAAK,IAAI,KACjvB,IDOY,EAahCoB,EAToB,KAEU,MAYjB,UAAAE,EAAiB","file":"static/js/2.18e4adec273c4ce867a8.js","sourcesContent":["// style-loader: Adds some css to the DOM by adding a \n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./checkbox.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./checkbox.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./checkbox.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-01a5cae8\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./checkbox.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"checkbox\",class:{ disabled: _vm.disabled, indeterminate: _vm.indeterminate }},[_c('input',{attrs:{\"type\":\"checkbox\",\"disabled\":_vm.disabled},domProps:{\"checked\":_vm.checked,\"indeterminate\":_vm.indeterminate},on:{\"change\":function($event){return _vm.$emit('change', $event.target.checked)}}}),_vm._v(\" \"),_c('i',{staticClass:\"checkbox-indicator\"}),_vm._v(\" \"),(!!_vm.$slots.default)?_c('span',{staticClass:\"label\"},[_vm._t(\"default\")],2):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { filter, sortBy, includes } from 'lodash'\n\nexport const notificationsFromStore = store => store.state.statuses.notifications.data\n\nexport const visibleTypes = store => ([\n store.state.config.notificationVisibility.likes && 'like',\n store.state.config.notificationVisibility.mentions && 'mention',\n store.state.config.notificationVisibility.repeats && 'repeat',\n store.state.config.notificationVisibility.follows && 'follow',\n store.state.config.notificationVisibility.followRequest && 'follow_request',\n store.state.config.notificationVisibility.moves && 'move',\n store.state.config.notificationVisibility.emojiReactions && 'pleroma:emoji_reaction'\n].filter(_ => _))\n\nconst statusNotifications = ['like', 'mention', 'repeat', 'pleroma:emoji_reaction']\n\nexport const isStatusNotification = (type) => includes(statusNotifications, type)\n\nconst sortById = (a, b) => {\n const seqA = Number(a.id)\n const seqB = Number(b.id)\n const isSeqA = !Number.isNaN(seqA)\n const isSeqB = !Number.isNaN(seqB)\n if (isSeqA && isSeqB) {\n return seqA > seqB ? -1 : 1\n } else if (isSeqA && !isSeqB) {\n return 1\n } else if (!isSeqA && isSeqB) {\n return -1\n } else {\n return a.id > b.id ? -1 : 1\n }\n}\n\nexport const filteredNotificationsFromStore = (store, types) => {\n // map is just to clone the array since sort mutates it and it causes some issues\n let sortedNotifications = notificationsFromStore(store).map(_ => _).sort(sortById)\n sortedNotifications = sortBy(sortedNotifications, 'seen')\n return sortedNotifications.filter(\n (notification) => (types || visibleTypes(store)).includes(notification.type)\n )\n}\n\nexport const unseenNotificationsFromStore = store =>\n filter(filteredNotificationsFromStore(store), ({ seen }) => !seen)\n","import { includes } from 'lodash'\n\nconst generateProfileLink = (id, screenName, restrictedNicknames) => {\n const complicated = !screenName || (isExternal(screenName) || includes(restrictedNicknames, screenName))\n return {\n name: (complicated ? 'external-user-profile' : 'user-profile'),\n params: (complicated ? { id } : { name: screenName })\n }\n}\n\nconst isExternal = screenName => screenName && screenName.includes('@')\n\nexport default generateProfileLink\n","// TODO this func might as well take the entire file and use its mimetype\n// or the entire service could be just mimetype service that only operates\n// on mimetypes and not files. Currently the naming is confusing.\nconst fileType = mimetype => {\n if (mimetype.match(/text\\/html/)) {\n return 'html'\n }\n\n if (mimetype.match(/image/)) {\n return 'image'\n }\n\n if (mimetype.match(/video/)) {\n return 'video'\n }\n\n if (mimetype.match(/audio/)) {\n return 'audio'\n }\n\n return 'unknown'\n}\n\nconst fileMatchesSomeType = (types, file) =>\n types.some(type => fileType(file.mimetype) === type)\n\nconst fileTypeService = {\n fileType,\n fileMatchesSomeType\n}\n\nexport default fileTypeService\n","const DialogModal = {\n props: {\n darkOverlay: {\n default: true,\n type: Boolean\n },\n onCancel: {\n default: () => {},\n type: Function\n }\n }\n}\n\nexport default DialogModal\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./dialog_modal.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./dialog_modal.js\"\nimport __vue_script__ from \"!!babel-loader!./dialog_modal.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-70b9d662\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./dialog_modal.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{class:{ 'dark-overlay': _vm.darkOverlay },on:{\"click\":function($event){if($event.target !== $event.currentTarget){ return null; }$event.stopPropagation();return _vm.onCancel()}}},[_c('div',{staticClass:\"dialog-modal panel panel-default\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"panel-heading dialog-modal-heading\"},[_c('div',{staticClass:\"title\"},[_vm._t(\"header\")],2)]),_vm._v(\" \"),_c('div',{staticClass:\"dialog-modal-content\"},[_vm._t(\"default\")],2),_vm._v(\" \"),_c('div',{staticClass:\"dialog-modal-footer user-interactions panel-footer\"},[_vm._t(\"footer\")],2)])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import DialogModal from '../dialog_modal/dialog_modal.vue'\nimport Popover from '../popover/popover.vue'\n\nconst FORCE_NSFW = 'mrf_tag:media-force-nsfw'\nconst STRIP_MEDIA = 'mrf_tag:media-strip'\nconst FORCE_UNLISTED = 'mrf_tag:force-unlisted'\nconst DISABLE_REMOTE_SUBSCRIPTION = 'mrf_tag:disable-remote-subscription'\nconst DISABLE_ANY_SUBSCRIPTION = 'mrf_tag:disable-any-subscription'\nconst SANDBOX = 'mrf_tag:sandbox'\nconst QUARANTINE = 'mrf_tag:quarantine'\n\nconst ModerationTools = {\n props: [\n 'user'\n ],\n data () {\n return {\n tags: {\n FORCE_NSFW,\n STRIP_MEDIA,\n FORCE_UNLISTED,\n DISABLE_REMOTE_SUBSCRIPTION,\n DISABLE_ANY_SUBSCRIPTION,\n SANDBOX,\n QUARANTINE\n },\n showDeleteUserDialog: false,\n toggled: false\n }\n },\n components: {\n DialogModal,\n Popover\n },\n computed: {\n tagsSet () {\n return new Set(this.user.tags)\n },\n hasTagPolicy () {\n return this.$store.state.instance.tagPolicyAvailable\n }\n },\n methods: {\n hasTag (tagName) {\n return this.tagsSet.has(tagName)\n },\n toggleTag (tag) {\n const store = this.$store\n if (this.tagsSet.has(tag)) {\n store.state.api.backendInteractor.untagUser({ user: this.user, tag }).then(response => {\n if (!response.ok) { return }\n store.commit('untagUser', { user: this.user, tag })\n })\n } else {\n store.state.api.backendInteractor.tagUser({ user: this.user, tag }).then(response => {\n if (!response.ok) { return }\n store.commit('tagUser', { user: this.user, tag })\n })\n }\n },\n toggleRight (right) {\n const store = this.$store\n if (this.user.rights[right]) {\n store.state.api.backendInteractor.deleteRight({ user: this.user, right }).then(response => {\n if (!response.ok) { return }\n store.commit('updateRight', { user: this.user, right, value: false })\n })\n } else {\n store.state.api.backendInteractor.addRight({ user: this.user, right }).then(response => {\n if (!response.ok) { return }\n store.commit('updateRight', { user: this.user, right, value: true })\n })\n }\n },\n toggleActivationStatus () {\n this.$store.dispatch('toggleActivationStatus', { user: this.user })\n },\n deleteUserDialog (show) {\n this.showDeleteUserDialog = show\n },\n deleteUser () {\n const store = this.$store\n const user = this.user\n const { id, name } = user\n store.state.api.backendInteractor.deleteUser({ user })\n .then(e => {\n this.$store.dispatch('markStatusesAsDeleted', status => user.id === status.user.id)\n const isProfile = this.$route.name === 'external-user-profile' || this.$route.name === 'user-profile'\n const isTargetUser = this.$route.params.name === name || this.$route.params.id === id\n if (isProfile && isTargetUser) {\n window.history.back()\n }\n })\n },\n setToggled (value) {\n this.toggled = value\n }\n }\n}\n\nexport default ModerationTools\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./moderation_tools.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./moderation_tools.js\"\nimport __vue_script__ from \"!!babel-loader!./moderation_tools.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-168f1ca6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./moderation_tools.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('Popover',{staticClass:\"moderation-tools-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"bottom\",\"offset\":{ y: 5 }},on:{\"show\":function($event){return _vm.setToggled(true)},\"close\":function($event){return _vm.setToggled(false)}}},[_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.user.is_local)?_c('span',[_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleRight(\"admin\")}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.rights.admin ? 'user_card.admin_menu.revoke_admin' : 'user_card.admin_menu.grant_admin'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleRight(\"moderator\")}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.rights.moderator ? 'user_card.admin_menu.revoke_moderator' : 'user_card.admin_menu.grant_moderator'))+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}})]):_vm._e(),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleActivationStatus()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.deactivated ? 'user_card.admin_menu.activate_account' : 'user_card.admin_menu.deactivate_account'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.deleteUserDialog(true)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_account'))+\"\\n \")]),_vm._v(\" \"),(_vm.hasTagPolicy)?_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}}):_vm._e(),_vm._v(\" \"),(_vm.hasTagPolicy)?_c('span',[_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.FORCE_NSFW)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.force_nsfw'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.FORCE_NSFW) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.STRIP_MEDIA)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.strip_media'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.STRIP_MEDIA) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.FORCE_UNLISTED)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.force_unlisted'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.FORCE_UNLISTED) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.SANDBOX)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.sandbox'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.SANDBOX) }})]),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.DISABLE_REMOTE_SUBSCRIPTION)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.disable_remote_subscription'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.DISABLE_REMOTE_SUBSCRIPTION) }})]):_vm._e(),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.DISABLE_ANY_SUBSCRIPTION)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.disable_any_subscription'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.DISABLE_ANY_SUBSCRIPTION) }})]):_vm._e(),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){return _vm.toggleTag(_vm.tags.QUARANTINE)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.quarantine'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.QUARANTINE) }})]):_vm._e()]):_vm._e()])]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default btn-block\",class:{ toggled: _vm.toggled },attrs:{\"slot\":\"trigger\"},slot:\"trigger\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.moderation'))+\"\\n \")])]),_vm._v(\" \"),_c('portal',{attrs:{\"to\":\"modal\"}},[(_vm.showDeleteUserDialog)?_c('DialogModal',{attrs:{\"on-cancel\":_vm.deleteUserDialog.bind(this, false)}},[_c('template',{slot:\"header\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_user'))+\"\\n \")]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('user_card.admin_menu.delete_user_confirmation')))]),_vm._v(\" \"),_c('template',{slot:\"footer\"},[_c('button',{staticClass:\"btn btn-default\",on:{\"click\":function($event){return _vm.deleteUserDialog(false)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.cancel'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default danger\",on:{\"click\":function($event){return _vm.deleteUser()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_user'))+\"\\n \")])])],2):_vm._e()],1)],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import ProgressButton from '../progress_button/progress_button.vue'\nimport Popover from '../popover/popover.vue'\n\nconst AccountActions = {\n props: [\n 'user', 'relationship'\n ],\n data () {\n return { }\n },\n components: {\n ProgressButton,\n Popover\n },\n methods: {\n showRepeats () {\n this.$store.dispatch('showReblogs', this.user.id)\n },\n hideRepeats () {\n this.$store.dispatch('hideReblogs', this.user.id)\n },\n blockUser () {\n this.$store.dispatch('blockUser', this.user.id)\n },\n unblockUser () {\n this.$store.dispatch('unblockUser', this.user.id)\n },\n reportUser () {\n this.$store.dispatch('openUserReportingModal', this.user.id)\n }\n }\n}\n\nexport default AccountActions\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./account_actions.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./account_actions.js\"\nimport __vue_script__ from \"!!babel-loader!./account_actions.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-bf5e6e30\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./account_actions.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"account-actions\"},[_c('Popover',{attrs:{\"trigger\":\"click\",\"placement\":\"bottom\"}},[_c('div',{staticClass:\"account-tools-popover\",attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.relationship.following)?[(_vm.relationship.showing_reblogs)?_c('button',{staticClass:\"btn btn-default dropdown-item\",on:{\"click\":_vm.hideRepeats}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.hide_repeats'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(!_vm.relationship.showing_reblogs)?_c('button',{staticClass:\"btn btn-default dropdown-item\",on:{\"click\":_vm.showRepeats}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.show_repeats'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}})]:_vm._e(),_vm._v(\" \"),(_vm.relationship.blocking)?_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.unblockUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.unblock'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.blockUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.block'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.reportUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.report'))+\"\\n \")])],2)]),_vm._v(\" \"),_c('div',{staticClass:\"btn btn-default ellipsis-button\",attrs:{\"slot\":\"trigger\"},slot:\"trigger\"},[_c('i',{staticClass:\"icon-ellipsis trigger-button\"})])])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport RemoteFollow from '../remote_follow/remote_follow.vue'\nimport ProgressButton from '../progress_button/progress_button.vue'\nimport FollowButton from '../follow_button/follow_button.vue'\nimport ModerationTools from '../moderation_tools/moderation_tools.vue'\nimport AccountActions from '../account_actions/account_actions.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport { mapGetters } from 'vuex'\n\nexport default {\n props: [\n 'userId', 'switcher', 'selected', 'hideBio', 'rounded', 'bordered', 'allowZoomingAvatar'\n ],\n data () {\n return {\n followRequestInProgress: false,\n betterShadow: this.$store.state.interface.browserSupport.cssFilter\n }\n },\n created () {\n this.$store.dispatch('fetchUserRelationship', this.user.id)\n },\n computed: {\n user () {\n return this.$store.getters.findUser(this.userId)\n },\n relationship () {\n return this.$store.getters.relationship(this.userId)\n },\n classes () {\n return [{\n 'user-card-rounded-t': this.rounded === 'top', // set border-top-left-radius and border-top-right-radius\n 'user-card-rounded': this.rounded === true, // set border-radius for all sides\n 'user-card-bordered': this.bordered === true // set border for all sides\n }]\n },\n style () {\n return {\n backgroundImage: [\n `linear-gradient(to bottom, var(--profileTint), var(--profileTint))`,\n `url(${this.user.cover_photo})`\n ].join(', ')\n }\n },\n isOtherUser () {\n return this.user.id !== this.$store.state.users.currentUser.id\n },\n subscribeUrl () {\n // eslint-disable-next-line no-undef\n const serverUrl = new URL(this.user.statusnet_profile_url)\n return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`\n },\n loggedIn () {\n return this.$store.state.users.currentUser\n },\n dailyAvg () {\n const days = Math.ceil((new Date() - new Date(this.user.created_at)) / (60 * 60 * 24 * 1000))\n return Math.round(this.user.statuses_count / days)\n },\n userHighlightType: {\n get () {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n return (data && data.type) || 'disabled'\n },\n set (type) {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n if (type !== 'disabled') {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: (data && data.color) || '#FFFFFF', type })\n } else {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: undefined })\n }\n },\n ...mapGetters(['mergedConfig'])\n },\n userHighlightColor: {\n get () {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n return data && data.color\n },\n set (color) {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color })\n }\n },\n visibleRole () {\n const rights = this.user.rights\n if (!rights) { return }\n const validRole = rights.admin || rights.moderator\n const roleTitle = rights.admin ? 'admin' : 'moderator'\n return validRole && roleTitle\n },\n hideFollowsCount () {\n return this.isOtherUser && this.user.hide_follows_count\n },\n hideFollowersCount () {\n return this.isOtherUser && this.user.hide_followers_count\n },\n ...mapGetters(['mergedConfig'])\n },\n components: {\n UserAvatar,\n RemoteFollow,\n ModerationTools,\n AccountActions,\n ProgressButton,\n FollowButton\n },\n methods: {\n muteUser () {\n this.$store.dispatch('muteUser', this.user.id)\n },\n unmuteUser () {\n this.$store.dispatch('unmuteUser', this.user.id)\n },\n subscribeUser () {\n return this.$store.dispatch('subscribeUser', this.user.id)\n },\n unsubscribeUser () {\n return this.$store.dispatch('unsubscribeUser', this.user.id)\n },\n setProfileView (v) {\n if (this.switcher) {\n const store = this.$store\n store.commit('setProfileView', { v })\n }\n },\n linkClicked ({ target }) {\n if (target.tagName === 'SPAN') {\n target = target.parentNode\n }\n if (target.tagName === 'A') {\n window.open(target.href, '_blank')\n }\n },\n userProfileLink (user) {\n return generateProfileLink(\n user.id, user.screen_name,\n this.$store.state.instance.restrictedNicknames\n )\n },\n zoomAvatar () {\n const attachment = {\n url: this.user.profile_image_url_original,\n mimetype: 'image'\n }\n this.$store.dispatch('setMedia', [attachment])\n this.$store.dispatch('setCurrent', attachment)\n },\n mentionUser () {\n this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./user_card.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./user_card.js\"\nimport __vue_script__ from \"!!babel-loader!./user_card.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4d895630\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./user_card.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"user-card\",class:_vm.classes},[_c('div',{staticClass:\"background-image\",class:{ 'hide-bio': _vm.hideBio },style:(_vm.style)}),_vm._v(\" \"),_c('div',{staticClass:\"panel-heading\"},[_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"container\"},[(_vm.allowZoomingAvatar)?_c('a',{staticClass:\"user-info-avatar-link\",on:{\"click\":_vm.zoomAvatar}},[_c('UserAvatar',{attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.user}}),_vm._v(\" \"),_vm._m(0)],1):_c('router-link',{attrs:{\"to\":_vm.userProfileLink(_vm.user)}},[_c('UserAvatar',{attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.user}})],1),_vm._v(\" \"),_c('div',{staticClass:\"user-summary\"},[_c('div',{staticClass:\"top-line\"},[(_vm.user.name_html)?_c('div',{staticClass:\"user-name\",attrs:{\"title\":_vm.user.name},domProps:{\"innerHTML\":_vm._s(_vm.user.name_html)}}):_c('div',{staticClass:\"user-name\",attrs:{\"title\":_vm.user.name}},[_vm._v(\"\\n \"+_vm._s(_vm.user.name)+\"\\n \")]),_vm._v(\" \"),(!_vm.isOtherUser)?_c('router-link',{attrs:{\"to\":{ name: 'user-settings' }}},[_c('i',{staticClass:\"button-icon icon-wrench usersettings\",attrs:{\"title\":_vm.$t('tool_tip.user_settings')}})]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && !_vm.user.is_local)?_c('a',{attrs:{\"href\":_vm.user.statusnet_profile_url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"icon-link-ext usersettings\"})]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && _vm.loggedIn)?_c('AccountActions',{attrs:{\"user\":_vm.user,\"relationship\":_vm.relationship}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"bottom-line\"},[_c('router-link',{staticClass:\"user-screen-name\",attrs:{\"to\":_vm.userProfileLink(_vm.user)}},[_vm._v(\"\\n @\"+_vm._s(_vm.user.screen_name)+\"\\n \")]),_vm._v(\" \"),(!_vm.hideBio && !!_vm.visibleRole)?_c('span',{staticClass:\"alert staff\"},[_vm._v(_vm._s(_vm.visibleRole))]):_vm._e(),_vm._v(\" \"),(_vm.user.locked)?_c('span',[_c('i',{staticClass:\"icon icon-lock\"})]):_vm._e(),_vm._v(\" \"),(!_vm.mergedConfig.hideUserStats && !_vm.hideBio)?_c('span',{staticClass:\"dailyAvg\"},[_vm._v(_vm._s(_vm.dailyAvg)+\" \"+_vm._s(_vm.$t('user_card.per_day')))]):_vm._e()],1)])],1),_vm._v(\" \"),_c('div',{staticClass:\"user-meta\"},[(_vm.relationship.followed_by && _vm.loggedIn && _vm.isOtherUser)?_c('div',{staticClass:\"following\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.follows_you'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && (_vm.loggedIn || !_vm.switcher))?_c('div',{staticClass:\"highlighter\"},[(_vm.userHighlightType !== 'disabled')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightColor),expression:\"userHighlightColor\"}],staticClass:\"userHighlightText\",attrs:{\"id\":'userHighlightColorTx'+_vm.user.id,\"type\":\"text\"},domProps:{\"value\":(_vm.userHighlightColor)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.userHighlightColor=$event.target.value}}}):_vm._e(),_vm._v(\" \"),(_vm.userHighlightType !== 'disabled')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightColor),expression:\"userHighlightColor\"}],staticClass:\"userHighlightCl\",attrs:{\"id\":'userHighlightColor'+_vm.user.id,\"type\":\"color\"},domProps:{\"value\":(_vm.userHighlightColor)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.userHighlightColor=$event.target.value}}}):_vm._e(),_vm._v(\" \"),_c('label',{staticClass:\"userHighlightSel select\",attrs:{\"for\":\"style-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightType),expression:\"userHighlightType\"}],staticClass:\"userHighlightSel\",attrs:{\"id\":'userHighlightSel'+_vm.user.id},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.userHighlightType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{attrs:{\"value\":\"disabled\"}},[_vm._v(\"No highlight\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"solid\"}},[_vm._v(\"Solid bg\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"striped\"}},[_vm._v(\"Striped bg\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"side\"}},[_vm._v(\"Side stripe\")])]),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]):_vm._e()]),_vm._v(\" \"),(_vm.loggedIn && _vm.isOtherUser)?_c('div',{staticClass:\"user-interactions\"},[_c('div',{staticClass:\"btn-group\"},[_c('FollowButton',{attrs:{\"relationship\":_vm.relationship}}),_vm._v(\" \"),(_vm.relationship.following)?[(!_vm.relationship.subscribing)?_c('ProgressButton',{staticClass:\"btn btn-default\",attrs:{\"click\":_vm.subscribeUser,\"title\":_vm.$t('user_card.subscribe')}},[_c('i',{staticClass:\"icon-bell-alt\"})]):_c('ProgressButton',{staticClass:\"btn btn-default toggled\",attrs:{\"click\":_vm.unsubscribeUser,\"title\":_vm.$t('user_card.unsubscribe')}},[_c('i',{staticClass:\"icon-bell-ringing-o\"})])]:_vm._e()],2),_vm._v(\" \"),_c('div',[(_vm.relationship.muting)?_c('button',{staticClass:\"btn btn-default btn-block toggled\",on:{\"click\":_vm.unmuteUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.muted'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default btn-block\",on:{\"click\":_vm.muteUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.mute'))+\"\\n \")])]),_vm._v(\" \"),_c('div',[_c('button',{staticClass:\"btn btn-default btn-block\",on:{\"click\":_vm.mentionUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.mention'))+\"\\n \")])]),_vm._v(\" \"),(_vm.loggedIn.role === \"admin\")?_c('ModerationTools',{attrs:{\"user\":_vm.user}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.loggedIn && _vm.user.is_local)?_c('div',{staticClass:\"user-interactions\"},[_c('RemoteFollow',{attrs:{\"user\":_vm.user}})],1):_vm._e()])]),_vm._v(\" \"),(!_vm.hideBio)?_c('div',{staticClass:\"panel-body\"},[(!_vm.mergedConfig.hideUserStats && _vm.switcher)?_c('div',{staticClass:\"user-counts\"},[_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();return _vm.setProfileView('statuses')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.statuses')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.user.statuses_count)+\" \"),_c('br')])]),_vm._v(\" \"),_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();return _vm.setProfileView('friends')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.followees')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.hideFollowsCount ? _vm.$t('user_card.hidden') : _vm.user.friends_count))])]),_vm._v(\" \"),_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();return _vm.setProfileView('followers')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.followers')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.hideFollowersCount ? _vm.$t('user_card.hidden') : _vm.user.followers_count))])])]):_vm._e(),_vm._v(\" \"),(!_vm.hideBio && _vm.user.description_html)?_c('p',{staticClass:\"user-card-bio\",domProps:{\"innerHTML\":_vm._s(_vm.user.description_html)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}):(!_vm.hideBio)?_c('p',{staticClass:\"user-card-bio\"},[_vm._v(\"\\n \"+_vm._s(_vm.user.description)+\"\\n \")]):_vm._e()]):_vm._e()])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"user-info-avatar-link-overlay\"},[_c('i',{staticClass:\"button-icon icon-zoom-in\"})])}]\nexport { render, staticRenderFns }","import StillImage from '../still-image/still-image.vue'\n\nconst UserAvatar = {\n props: [\n 'user',\n 'betterShadow',\n 'compact'\n ],\n data () {\n return {\n showPlaceholder: false\n }\n },\n components: {\n StillImage\n },\n computed: {\n imgSrc () {\n return this.showPlaceholder ? '/images/avi.png' : this.user.profile_image_url_original\n }\n },\n methods: {\n imageLoadError () {\n this.showPlaceholder = true\n }\n },\n watch: {\n src () {\n this.showPlaceholder = false\n }\n }\n}\n\nexport default UserAvatar\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./user_avatar.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./user_avatar.js\"\nimport __vue_script__ from \"!!babel-loader!./user_avatar.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-056a5e34\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./user_avatar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('StillImage',{staticClass:\"avatar\",class:{ 'avatar-compact': _vm.compact, 'better-shadow': _vm.betterShadow },attrs:{\"alt\":_vm.user.screen_name,\"title\":_vm.user.screen_name,\"src\":_vm.imgSrc,\"image-load-error\":_vm.imageLoadError}})}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { mapGetters } from 'vuex'\n\nconst FavoriteButton = {\n props: ['status', 'loggedIn'],\n data () {\n return {\n animated: false\n }\n },\n methods: {\n favorite () {\n if (!this.status.favorited) {\n this.$store.dispatch('favorite', { id: this.status.id })\n } else {\n this.$store.dispatch('unfavorite', { id: this.status.id })\n }\n this.animated = true\n setTimeout(() => {\n this.animated = false\n }, 500)\n }\n },\n computed: {\n classes () {\n return {\n 'icon-star-empty': !this.status.favorited,\n 'icon-star': this.status.favorited,\n 'animate-spin': this.animated\n }\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default FavoriteButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./favorite_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./favorite_button.js\"\nimport __vue_script__ from \"!!babel-loader!./favorite_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2ced002f\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./favorite_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.loggedIn)?_c('div',[_c('i',{staticClass:\"button-icon favorite-button fav-active\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.favorite')},on:{\"click\":function($event){$event.preventDefault();return _vm.favorite()}}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.fave_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.fave_num))]):_vm._e()]):_c('div',[_c('i',{staticClass:\"button-icon favorite-button\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.favorite')}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.fave_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.fave_num))]):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Popover from '../popover/popover.vue'\nimport { mapGetters } from 'vuex'\n\nconst ReactButton = {\n props: ['status'],\n data () {\n return {\n filterWord: ''\n }\n },\n components: {\n Popover\n },\n methods: {\n addReaction (event, emoji, close) {\n const existingReaction = this.status.emoji_reactions.find(r => r.name === emoji)\n if (existingReaction && existingReaction.me) {\n this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })\n } else {\n this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })\n }\n close()\n }\n },\n computed: {\n commonEmojis () {\n return ['❤️', '😠', '👀', '😂', '🔥']\n },\n emojis () {\n if (this.filterWord !== '') {\n return this.$store.state.instance.emoji.filter(emoji => emoji.displayText.includes(this.filterWord))\n }\n return this.$store.state.instance.emoji || []\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default ReactButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./react_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./react_button.js\"\nimport __vue_script__ from \"!!babel-loader!./react_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-185f65eb\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./react_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Popover',{staticClass:\"react-button-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"top\",\"offset\":{ y: 5 }},scopedSlots:_vm._u([{key:\"content\",fn:function(ref){\nvar close = ref.close;\nreturn _c('div',{},[_c('div',{staticClass:\"reaction-picker-filter\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.filterWord),expression:\"filterWord\"}],attrs:{\"placeholder\":_vm.$t('emoji.search_emoji')},domProps:{\"value\":(_vm.filterWord)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.filterWord=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"reaction-picker\"},[_vm._l((_vm.commonEmojis),function(emoji){return _c('span',{key:emoji,staticClass:\"emoji-button\",on:{\"click\":function($event){return _vm.addReaction($event, emoji, close)}}},[_vm._v(\"\\n \"+_vm._s(emoji)+\"\\n \")])}),_vm._v(\" \"),_c('div',{staticClass:\"reaction-picker-divider\"}),_vm._v(\" \"),_vm._l((_vm.emojis),function(emoji,key){return _c('span',{key:key,staticClass:\"emoji-button\",on:{\"click\":function($event){return _vm.addReaction($event, emoji.replacement, close)}}},[_vm._v(\"\\n \"+_vm._s(emoji.replacement)+\"\\n \")])}),_vm._v(\" \"),_c('div',{staticClass:\"reaction-bottom-fader\"})],2)])}}])},[_vm._v(\" \"),_c('i',{staticClass:\"icon-smile button-icon add-reaction-button\",attrs:{\"slot\":\"trigger\",\"title\":_vm.$t('tool_tip.add_reaction')},slot:\"trigger\"})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { mapGetters } from 'vuex'\n\nconst RetweetButton = {\n props: ['status', 'loggedIn', 'visibility'],\n data () {\n return {\n animated: false\n }\n },\n methods: {\n retweet () {\n if (!this.status.repeated) {\n this.$store.dispatch('retweet', { id: this.status.id })\n } else {\n this.$store.dispatch('unretweet', { id: this.status.id })\n }\n this.animated = true\n setTimeout(() => {\n this.animated = false\n }, 500)\n }\n },\n computed: {\n classes () {\n return {\n 'retweeted': this.status.repeated,\n 'retweeted-empty': !this.status.repeated,\n 'animate-spin': this.animated\n }\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default RetweetButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./retweet_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./retweet_button.js\"\nimport __vue_script__ from \"!!babel-loader!./retweet_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-538410cc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./retweet_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.loggedIn)?_c('div',[(_vm.visibility !== 'private' && _vm.visibility !== 'direct')?[_c('i',{staticClass:\"button-icon retweet-button icon-retweet rt-active\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.repeat')},on:{\"click\":function($event){$event.preventDefault();return _vm.retweet()}}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.repeat_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.repeat_num))]):_vm._e()]:[_c('i',{staticClass:\"button-icon icon-lock\",class:_vm.classes,attrs:{\"title\":_vm.$t('timeline.no_retweet_hint')}})]],2):(!_vm.loggedIn)?_c('div',[_c('i',{staticClass:\"button-icon icon-retweet\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.repeat')}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.repeat_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.repeat_num))]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Popover from '../popover/popover.vue'\n\nconst ExtraButtons = {\n props: [ 'status' ],\n components: { Popover },\n methods: {\n deleteStatus () {\n const confirmed = window.confirm(this.$t('status.delete_confirm'))\n if (confirmed) {\n this.$store.dispatch('deleteStatus', { id: this.status.id })\n }\n },\n pinStatus () {\n this.$store.dispatch('pinStatus', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n unpinStatus () {\n this.$store.dispatch('unpinStatus', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n muteConversation () {\n this.$store.dispatch('muteConversation', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n unmuteConversation () {\n this.$store.dispatch('unmuteConversation', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n copyLink () {\n navigator.clipboard.writeText(this.statusLink)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n }\n },\n computed: {\n currentUser () { return this.$store.state.users.currentUser },\n canDelete () {\n if (!this.currentUser) { return }\n const superuser = this.currentUser.rights.moderator || this.currentUser.rights.admin\n return superuser || this.status.user.id === this.currentUser.id\n },\n ownStatus () {\n return this.status.user.id === this.currentUser.id\n },\n canPin () {\n return this.ownStatus && (this.status.visibility === 'public' || this.status.visibility === 'unlisted')\n },\n canMute () {\n return !!this.currentUser\n },\n statusLink () {\n return `${this.$store.state.instance.server}${this.$router.resolve({ name: 'conversation', params: { id: this.status.id } }).href}`\n }\n }\n}\n\nexport default ExtraButtons\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./extra_buttons.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./extra_buttons.js\"\nimport __vue_script__ from \"!!babel-loader!./extra_buttons.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-b30b8de6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./extra_buttons.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Popover',{staticClass:\"extra-button-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"top\"},scopedSlots:_vm._u([{key:\"content\",fn:function(ref){\nvar close = ref.close;\nreturn _c('div',{},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.canMute && !_vm.status.thread_muted)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.muteConversation($event)}}},[_c('i',{staticClass:\"icon-eye-off\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.mute_conversation\")))])]):_vm._e(),_vm._v(\" \"),(_vm.canMute && _vm.status.thread_muted)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.unmuteConversation($event)}}},[_c('i',{staticClass:\"icon-eye-off\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.unmute_conversation\")))])]):_vm._e(),_vm._v(\" \"),(!_vm.status.pinned && _vm.canPin)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.pinStatus($event)},close]}},[_c('i',{staticClass:\"icon-pin\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.pin\")))])]):_vm._e(),_vm._v(\" \"),(_vm.status.pinned && _vm.canPin)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.unpinStatus($event)},close]}},[_c('i',{staticClass:\"icon-pin\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.unpin\")))])]):_vm._e(),_vm._v(\" \"),(_vm.canDelete)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.deleteStatus($event)},close]}},[_c('i',{staticClass:\"icon-cancel\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.delete\")))])]):_vm._e(),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":[function($event){$event.preventDefault();return _vm.copyLink($event)},close]}},[_c('i',{staticClass:\"icon-share\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.copy_link\")))])])])])}}])},[_vm._v(\" \"),_c('i',{staticClass:\"icon-ellipsis button-icon\",attrs:{\"slot\":\"trigger\"},slot:\"trigger\"})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\n\nconst AvatarList = {\n props: ['users'],\n computed: {\n slicedUsers () {\n return this.users ? this.users.slice(0, 15) : []\n }\n },\n components: {\n UserAvatar\n },\n methods: {\n userProfileLink (user) {\n return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)\n }\n }\n}\n\nexport default AvatarList\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./avatar_list.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./avatar_list.js\"\nimport __vue_script__ from \"!!babel-loader!./avatar_list.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4cea5bcf\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./avatar_list.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"avatars\"},_vm._l((_vm.slicedUsers),function(user){return _c('router-link',{key:user.id,staticClass:\"avatars-item\",attrs:{\"to\":_vm.userProfileLink(user)}},[_c('UserAvatar',{staticClass:\"avatar-small\",attrs:{\"user\":user}})],1)}),1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import StillImage from '../still-image/still-image.vue'\nimport VideoAttachment from '../video_attachment/video_attachment.vue'\nimport nsfwImage from '../../assets/nsfw.png'\nimport fileTypeService from '../../services/file_type/file_type.service.js'\nimport { mapGetters } from 'vuex'\n\nconst Attachment = {\n props: [\n 'attachment',\n 'nsfw',\n 'statusId',\n 'size',\n 'allowPlay',\n 'setMedia',\n 'naturalSizeLoad'\n ],\n data () {\n return {\n nsfwImage: this.$store.state.instance.nsfwCensorImage || nsfwImage,\n hideNsfwLocal: this.$store.getters.mergedConfig.hideNsfw,\n preloadImage: this.$store.getters.mergedConfig.preloadImage,\n loading: false,\n img: fileTypeService.fileType(this.attachment.mimetype) === 'image' && document.createElement('img'),\n modalOpen: false,\n showHidden: false\n }\n },\n components: {\n StillImage,\n VideoAttachment\n },\n computed: {\n usePlaceHolder () {\n return this.size === 'hide' || this.type === 'unknown'\n },\n referrerpolicy () {\n return this.$store.state.instance.mediaProxyAvailable ? '' : 'no-referrer'\n },\n type () {\n return fileTypeService.fileType(this.attachment.mimetype)\n },\n hidden () {\n return this.nsfw && this.hideNsfwLocal && !this.showHidden\n },\n isEmpty () {\n return (this.type === 'html' && !this.attachment.oembed) || this.type === 'unknown'\n },\n isSmall () {\n return this.size === 'small'\n },\n fullwidth () {\n return this.type === 'html' || this.type === 'audio'\n },\n ...mapGetters(['mergedConfig'])\n },\n methods: {\n linkClicked ({ target }) {\n if (target.tagName === 'A') {\n window.open(target.href, '_blank')\n }\n },\n openModal (event) {\n const modalTypes = this.mergedConfig.playVideosInModal\n ? ['image', 'video']\n : ['image']\n if (fileTypeService.fileMatchesSomeType(modalTypes, this.attachment) ||\n this.usePlaceHolder\n ) {\n event.stopPropagation()\n event.preventDefault()\n this.setMedia()\n this.$store.dispatch('setCurrent', this.attachment)\n }\n },\n toggleHidden (event) {\n if (\n (this.mergedConfig.useOneClickNsfw && !this.showHidden) &&\n (this.type !== 'video' || this.mergedConfig.playVideosInModal)\n ) {\n this.openModal(event)\n return\n }\n if (this.img && !this.preloadImage) {\n if (this.img.onload) {\n this.img.onload()\n } else {\n this.loading = true\n this.img.src = this.attachment.url\n this.img.onload = () => {\n this.loading = false\n this.showHidden = !this.showHidden\n }\n }\n } else {\n this.showHidden = !this.showHidden\n }\n },\n onImageLoad (image) {\n const width = image.naturalWidth\n const height = image.naturalHeight\n this.naturalSizeLoad && this.naturalSizeLoad({ width, height })\n }\n }\n}\n\nexport default Attachment\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./attachment.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./attachment.js\"\nimport __vue_script__ from \"!!babel-loader!./attachment.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-61e0eb0c\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./attachment.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {\nvar _obj;\nvar _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.usePlaceHolder)?_c('div',{on:{\"click\":_vm.openModal}},[(_vm.type !== 'html')?_c('a',{staticClass:\"placeholder\",attrs:{\"target\":\"_blank\",\"href\":_vm.attachment.url}},[_vm._v(\"\\n [\"+_vm._s(_vm.nsfw ? \"NSFW/\" : \"\")+_vm._s(_vm.type.toUpperCase())+\"]\\n \")]):_vm._e()]):_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.isEmpty),expression:\"!isEmpty\"}],staticClass:\"attachment\",class:( _obj = {}, _obj[_vm.type] = true, _obj.loading = _vm.loading, _obj['fullwidth'] = _vm.fullwidth, _obj['nsfw-placeholder'] = _vm.hidden, _obj )},[(_vm.hidden)?_c('a',{staticClass:\"image-attachment\",attrs:{\"href\":_vm.attachment.url},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleHidden($event)}}},[_c('img',{key:_vm.nsfwImage,staticClass:\"nsfw\",class:{'small': _vm.isSmall},attrs:{\"src\":_vm.nsfwImage}}),_vm._v(\" \"),(_vm.type === 'video')?_c('i',{staticClass:\"play-icon icon-play-circled\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.nsfw && _vm.hideNsfwLocal && !_vm.hidden)?_c('div',{staticClass:\"hider\"},[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleHidden($event)}}},[_vm._v(\"Hide\")])]):_vm._e(),_vm._v(\" \"),(_vm.type === 'image' && (!_vm.hidden || _vm.preloadImage))?_c('a',{staticClass:\"image-attachment\",class:{'hidden': _vm.hidden && _vm.preloadImage },attrs:{\"href\":_vm.attachment.url,\"target\":\"_blank\",\"title\":_vm.attachment.description},on:{\"click\":_vm.openModal}},[_c('StillImage',{attrs:{\"referrerpolicy\":_vm.referrerpolicy,\"mimetype\":_vm.attachment.mimetype,\"src\":_vm.attachment.large_thumb_url || _vm.attachment.url,\"image-load-handler\":_vm.onImageLoad}})],1):_vm._e(),_vm._v(\" \"),(_vm.type === 'video' && !_vm.hidden)?_c('a',{staticClass:\"video-container\",class:{'small': _vm.isSmall},attrs:{\"href\":_vm.allowPlay ? undefined : _vm.attachment.url},on:{\"click\":_vm.openModal}},[_c('VideoAttachment',{staticClass:\"video\",attrs:{\"attachment\":_vm.attachment,\"controls\":_vm.allowPlay}}),_vm._v(\" \"),(!_vm.allowPlay)?_c('i',{staticClass:\"play-icon icon-play-circled\"}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.type === 'audio')?_c('audio',{attrs:{\"src\":_vm.attachment.url,\"controls\":\"\"}}):_vm._e(),_vm._v(\" \"),(_vm.type === 'html' && _vm.attachment.oembed)?_c('div',{staticClass:\"oembed\",on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}},[(_vm.attachment.thumb_url)?_c('div',{staticClass:\"image\"},[_c('img',{attrs:{\"src\":_vm.attachment.thumb_url}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"text\"},[_c('h1',[_c('a',{attrs:{\"href\":_vm.attachment.url}},[_vm._v(_vm._s(_vm.attachment.oembed.title))])]),_vm._v(\" \"),_c('div',{domProps:{\"innerHTML\":_vm._s(_vm.attachment.oembed.oembedHTML)}})])]):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Timeago from '../timeago/timeago.vue'\nimport { forEach, map } from 'lodash'\n\nexport default {\n name: 'Poll',\n props: ['basePoll'],\n components: { Timeago },\n data () {\n return {\n loading: false,\n choices: []\n }\n },\n created () {\n if (!this.$store.state.polls.pollsObject[this.pollId]) {\n this.$store.dispatch('mergeOrAddPoll', this.basePoll)\n }\n this.$store.dispatch('trackPoll', this.pollId)\n },\n destroyed () {\n this.$store.dispatch('untrackPoll', this.pollId)\n },\n computed: {\n pollId () {\n return this.basePoll.id\n },\n poll () {\n const storePoll = this.$store.state.polls.pollsObject[this.pollId]\n return storePoll || {}\n },\n options () {\n return (this.poll && this.poll.options) || []\n },\n expiresAt () {\n return (this.poll && this.poll.expires_at) || 0\n },\n expired () {\n return (this.poll && this.poll.expired) || false\n },\n loggedIn () {\n return this.$store.state.users.currentUser\n },\n showResults () {\n return this.poll.voted || this.expired || !this.loggedIn\n },\n totalVotesCount () {\n return this.poll.votes_count\n },\n containerClass () {\n return {\n loading: this.loading\n }\n },\n choiceIndices () {\n // Convert array of booleans into an array of indices of the\n // items that were 'true', so [true, false, false, true] becomes\n // [0, 3].\n return this.choices\n .map((entry, index) => entry && index)\n .filter(value => typeof value === 'number')\n },\n isDisabled () {\n const noChoice = this.choiceIndices.length === 0\n return this.loading || noChoice\n }\n },\n methods: {\n percentageForOption (count) {\n return this.totalVotesCount === 0 ? 0 : Math.round(count / this.totalVotesCount * 100)\n },\n resultTitle (option) {\n return `${option.votes_count}/${this.totalVotesCount} ${this.$t('polls.votes')}`\n },\n fetchPoll () {\n this.$store.dispatch('refreshPoll', { id: this.statusId, pollId: this.poll.id })\n },\n activateOption (index) {\n // forgive me father: doing checking the radio/checkboxes\n // in code because of customized input elements need either\n // a) an extra element for the actual graphic, or b) use a\n // pseudo element for the label. We use b) which mandates\n // using \"for\" and \"id\" matching which isn't nice when the\n // same poll appears multiple times on the site (notifs and\n // timeline for example). With code we can make sure it just\n // works without altering the pseudo element implementation.\n const allElements = this.$el.querySelectorAll('input')\n const clickedElement = this.$el.querySelector(`input[value=\"${index}\"]`)\n if (this.poll.multiple) {\n // Checkboxes, toggle only the clicked one\n clickedElement.checked = !clickedElement.checked\n } else {\n // Radio button, uncheck everything and check the clicked one\n forEach(allElements, element => { element.checked = false })\n clickedElement.checked = true\n }\n this.choices = map(allElements, e => e.checked)\n },\n optionId (index) {\n return `poll${this.poll.id}-${index}`\n },\n vote () {\n if (this.choiceIndices.length === 0) return\n this.loading = true\n this.$store.dispatch(\n 'votePoll',\n { id: this.statusId, pollId: this.poll.id, choices: this.choiceIndices }\n ).then(poll => {\n this.loading = false\n })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./poll.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./poll.js\"\nimport __vue_script__ from \"!!babel-loader!./poll.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-db51c57e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./poll.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"poll\",class:_vm.containerClass},[_vm._l((_vm.options),function(option,index){return _c('div',{key:index,staticClass:\"poll-option\"},[(_vm.showResults)?_c('div',{staticClass:\"option-result\",attrs:{\"title\":_vm.resultTitle(option)}},[_c('div',{staticClass:\"option-result-label\"},[_c('span',{staticClass:\"result-percentage\"},[_vm._v(\"\\n \"+_vm._s(_vm.percentageForOption(option.votes_count))+\"%\\n \")]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(option.title))])]),_vm._v(\" \"),_c('div',{staticClass:\"result-fill\",style:({ 'width': ((_vm.percentageForOption(option.votes_count)) + \"%\") })})]):_c('div',{on:{\"click\":function($event){return _vm.activateOption(index)}}},[(_vm.poll.multiple)?_c('input',{attrs:{\"type\":\"checkbox\",\"disabled\":_vm.loading},domProps:{\"value\":index}}):_c('input',{attrs:{\"type\":\"radio\",\"disabled\":_vm.loading},domProps:{\"value\":index}}),_vm._v(\" \"),_c('label',{staticClass:\"option-vote\"},[_c('div',[_vm._v(_vm._s(option.title))])])])])}),_vm._v(\" \"),_c('div',{staticClass:\"footer faint\"},[(!_vm.showResults)?_c('button',{staticClass:\"btn btn-default poll-vote-button\",attrs:{\"type\":\"button\",\"disabled\":_vm.isDisabled},on:{\"click\":_vm.vote}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('polls.vote'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"total\"},[_vm._v(\"\\n \"+_vm._s(_vm.totalVotesCount)+\" \"+_vm._s(_vm.$t(\"polls.votes\"))+\" · \\n \")]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":_vm.expired ? 'polls.expired' : 'polls.expires_in'}},[_c('Timeago',{attrs:{\"time\":_vm.expiresAt,\"auto-update\":60,\"now-threshold\":0}})],1)],1)],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Attachment from '../attachment/attachment.vue'\nimport { chunk, last, dropRight, sumBy } from 'lodash'\n\nconst Gallery = {\n props: [\n 'attachments',\n 'nsfw',\n 'setMedia'\n ],\n data () {\n return {\n sizes: {}\n }\n },\n components: { Attachment },\n computed: {\n rows () {\n if (!this.attachments) {\n return []\n }\n const rows = chunk(this.attachments, 3)\n if (last(rows).length === 1 && rows.length > 1) {\n // if 1 attachment on last row -> add it to the previous row instead\n const lastAttachment = last(rows)[0]\n const allButLastRow = dropRight(rows)\n last(allButLastRow).push(lastAttachment)\n return allButLastRow\n }\n return rows\n },\n useContainFit () {\n return this.$store.getters.mergedConfig.useContainFit\n }\n },\n methods: {\n onNaturalSizeLoad (id, size) {\n this.$set(this.sizes, id, size)\n },\n rowStyle (itemsPerRow) {\n return { 'padding-bottom': `${(100 / (itemsPerRow + 0.6))}%` }\n },\n itemStyle (id, row) {\n const total = sumBy(row, item => this.getAspectRatio(item.id))\n return { flex: `${this.getAspectRatio(id) / total} 1 0%` }\n },\n getAspectRatio (id) {\n const size = this.sizes[id]\n return size ? size.width / size.height : 1\n }\n }\n}\n\nexport default Gallery\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./gallery.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./gallery.js\"\nimport __vue_script__ from \"!!babel-loader!./gallery.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-68a574b8\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./gallery.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"galleryContainer\",staticStyle:{\"width\":\"100%\"}},_vm._l((_vm.rows),function(row,index){return _c('div',{key:index,staticClass:\"gallery-row\",class:{ 'contain-fit': _vm.useContainFit, 'cover-fit': !_vm.useContainFit },style:(_vm.rowStyle(row.length))},[_c('div',{staticClass:\"gallery-row-inner\"},_vm._l((row),function(attachment){return _c('attachment',{key:attachment.id,style:(_vm.itemStyle(attachment.id, row)),attrs:{\"set-media\":_vm.setMedia,\"nsfw\":_vm.nsfw,\"attachment\":attachment,\"allow-play\":false,\"natural-size-load\":_vm.onNaturalSizeLoad.bind(null, attachment.id)}})}),1)])}),0)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const LinkPreview = {\n name: 'LinkPreview',\n props: [\n 'card',\n 'size',\n 'nsfw'\n ],\n data () {\n return {\n imageLoaded: false\n }\n },\n computed: {\n useImage () {\n // Currently BE shoudn't give cards if tagged NSFW, this is a bit paranoid\n // as it makes sure to hide the image if somehow NSFW tagged preview can\n // exist.\n return this.card.image && !this.nsfw && this.size !== 'hide'\n },\n useDescription () {\n return this.card.description && /\\S/.test(this.card.description)\n }\n },\n created () {\n if (this.useImage) {\n const newImg = new Image()\n newImg.onload = () => {\n this.imageLoaded = true\n }\n newImg.src = this.card.image\n }\n }\n}\n\nexport default LinkPreview\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./link-preview.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./link-preview.js\"\nimport __vue_script__ from \"!!babel-loader!./link-preview.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7c8d99ac\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./link-preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('a',{staticClass:\"link-preview-card\",attrs:{\"href\":_vm.card.url,\"target\":\"_blank\",\"rel\":\"noopener\"}},[(_vm.useImage && _vm.imageLoaded)?_c('div',{staticClass:\"card-image\",class:{ 'small-image': _vm.size === 'small' }},[_c('img',{attrs:{\"src\":_vm.card.image}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"card-content\"},[_c('span',{staticClass:\"card-host faint\"},[_vm._v(_vm._s(_vm.card.provider_name))]),_vm._v(\" \"),_c('h4',{staticClass:\"card-title\"},[_vm._v(_vm._s(_vm.card.title))]),_vm._v(\" \"),(_vm.useDescription)?_c('p',{staticClass:\"card-description\"},[_vm._v(_vm._s(_vm.card.description))]):_vm._e()])])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Attachment from '../attachment/attachment.vue'\nimport Poll from '../poll/poll.vue'\nimport Gallery from '../gallery/gallery.vue'\nimport LinkPreview from '../link-preview/link-preview.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport fileType from 'src/services/file_type/file_type.service'\nimport { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js'\nimport { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js'\nimport { mapGetters, mapState } from 'vuex'\n\nconst StatusContent = {\n name: 'StatusContent',\n props: [\n 'status',\n 'focused',\n 'noHeading',\n 'fullContent'\n ],\n data () {\n return {\n showingTall: this.inConversation && this.focused,\n showingLongSubject: false,\n // not as computed because it sets the initial state which will be changed later\n expandingSubject: !this.$store.getters.mergedConfig.collapseMessageWithSubject\n }\n },\n computed: {\n localCollapseSubjectDefault () {\n return this.mergedConfig.collapseMessageWithSubject\n },\n hideAttachments () {\n return (this.mergedConfig.hideAttachments && !this.inConversation) ||\n (this.mergedConfig.hideAttachmentsInConv && this.inConversation)\n },\n // This is a bit hacky, but we want to approximate post height before rendering\n // so we count newlines (masto uses

for paragraphs, GS uses
between them)\n // as well as approximate line count by counting characters and approximating ~80\n // per line.\n //\n // Using max-height + overflow: auto for status components resulted in false positives\n // very often with japanese characters, and it was very annoying.\n tallStatus () {\n const lengthScore = this.status.statusnet_html.split(/ 20\n },\n longSubject () {\n return this.status.summary.length > 900\n },\n // When a status has a subject and is also tall, we should only have one show more/less button. If the default is to collapse statuses with subjects, we just treat it like a status with a subject; otherwise, we just treat it like a tall status.\n mightHideBecauseSubject () {\n return this.status.summary && (!this.tallStatus || this.localCollapseSubjectDefault)\n },\n mightHideBecauseTall () {\n return this.tallStatus && (!this.status.summary || !this.localCollapseSubjectDefault)\n },\n hideSubjectStatus () {\n return this.mightHideBecauseSubject && !this.expandingSubject\n },\n hideTallStatus () {\n return this.mightHideBecauseTall && !this.showingTall\n },\n showingMore () {\n return (this.mightHideBecauseTall && this.showingTall) || (this.mightHideBecauseSubject && this.expandingSubject)\n },\n nsfwClickthrough () {\n if (!this.status.nsfw) {\n return false\n }\n if (this.status.summary && this.localCollapseSubjectDefault) {\n return false\n }\n return true\n },\n attachmentSize () {\n if ((this.mergedConfig.hideAttachments && !this.inConversation) ||\n (this.mergedConfig.hideAttachmentsInConv && this.inConversation) ||\n (this.status.attachments.length > this.maxThumbnails)) {\n return 'hide'\n } else if (this.compact) {\n return 'small'\n }\n return 'normal'\n },\n galleryTypes () {\n if (this.attachmentSize === 'hide') {\n return []\n }\n return this.mergedConfig.playVideosInModal\n ? ['image', 'video']\n : ['image']\n },\n galleryAttachments () {\n return this.status.attachments.filter(\n file => fileType.fileMatchesSomeType(this.galleryTypes, file)\n )\n },\n nonGalleryAttachments () {\n return this.status.attachments.filter(\n file => !fileType.fileMatchesSomeType(this.galleryTypes, file)\n )\n },\n hasImageAttachments () {\n return this.status.attachments.some(\n file => fileType.fileType(file.mimetype) === 'image'\n )\n },\n hasVideoAttachments () {\n return this.status.attachments.some(\n file => fileType.fileType(file.mimetype) === 'video'\n )\n },\n maxThumbnails () {\n return this.mergedConfig.maxThumbnails\n },\n postBodyHtml () {\n const html = this.status.statusnet_html\n\n if (this.mergedConfig.greentext) {\n try {\n if (html.includes('>')) {\n // This checks if post has '>' at the beginning, excluding mentions so that @mention >impying works\n return processHtml(html, (string) => {\n if (string.includes('>') &&\n string\n .replace(/<[^>]+?>/gi, '') // remove all tags\n .replace(/@\\w+/gi, '') // remove mentions (even failed ones)\n .trim()\n .startsWith('>')) {\n return `${string}`\n } else {\n return string\n }\n })\n } else {\n return html\n }\n } catch (e) {\n console.err('Failed to process status html', e)\n return html\n }\n } else {\n return html\n }\n },\n contentHtml () {\n if (!this.status.summary_html) {\n return this.postBodyHtml\n }\n return this.status.summary_html + '
' + this.postBodyHtml\n },\n ...mapGetters(['mergedConfig']),\n ...mapState({\n betterShadow: state => state.interface.browserSupport.cssFilter,\n currentUser: state => state.users.currentUser\n })\n },\n components: {\n Attachment,\n Poll,\n Gallery,\n LinkPreview\n },\n methods: {\n linkClicked (event) {\n const target = event.target.closest('.status-content a')\n if (target) {\n if (target.className.match(/mention/)) {\n const href = target.href\n const attn = this.status.attentions.find(attn => mentionMatchesUrl(attn, href))\n if (attn) {\n event.stopPropagation()\n event.preventDefault()\n const link = this.generateUserProfileLink(attn.id, attn.screen_name)\n this.$router.push(link)\n return\n }\n }\n if (target.rel.match(/(?:^|\\s)tag(?:$|\\s)/) || target.className.match(/hashtag/)) {\n // Extract tag name from link url\n const tag = extractTagFromUrl(target.href)\n if (tag) {\n const link = this.generateTagLink(tag)\n this.$router.push(link)\n return\n }\n }\n window.open(target.href, '_blank')\n }\n },\n toggleShowMore () {\n if (this.mightHideBecauseTall) {\n this.showingTall = !this.showingTall\n } else if (this.mightHideBecauseSubject) {\n this.expandingSubject = !this.expandingSubject\n }\n },\n generateUserProfileLink (id, name) {\n return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)\n },\n generateTagLink (tag) {\n return `/tag/${tag}`\n },\n setMedia () {\n const attachments = this.attachmentSize === 'hide' ? this.status.attachments : this.galleryAttachments\n return () => this.$store.dispatch('setMedia', attachments)\n }\n }\n}\n\nexport default StatusContent\n","/**\n * This is a tiny purpose-built HTML parser/processor. This basically detects any type of visual newline and\n * allows it to be processed, useful for greentexting, mostly\n *\n * known issue: doesn't handle CDATA so nested CDATA might not work well\n *\n * @param {Object} input - input data\n * @param {(string) => string} processor - function that will be called on every line\n * @return {string} processed html\n */\nexport const processHtml = (html, processor) => {\n const handledTags = new Set(['p', 'br', 'div'])\n const openCloseTags = new Set(['p', 'div'])\n\n let buffer = '' // Current output buffer\n const level = [] // How deep we are in tags and which tags were there\n let textBuffer = '' // Current line content\n let tagBuffer = null // Current tag buffer, if null = we are not currently reading a tag\n\n // Extracts tag name from tag, i.e. => span\n const getTagName = (tag) => {\n const result = /(?:<\\/(\\w+)>|<(\\w+)\\s?[^/]*?\\/?>)/gi.exec(tag)\n return result && (result[1] || result[2])\n }\n\n const flush = () => { // Processes current line buffer, adds it to output buffer and clears line buffer\n if (textBuffer.trim().length > 0) {\n buffer += processor(textBuffer)\n } else {\n buffer += textBuffer\n }\n textBuffer = ''\n }\n\n const handleBr = (tag) => { // handles single newlines/linebreaks/selfclosing\n flush()\n buffer += tag\n }\n\n const handleOpen = (tag) => { // handles opening tags\n flush()\n buffer += tag\n level.push(tag)\n }\n\n const handleClose = (tag) => { // handles closing tags\n flush()\n buffer += tag\n if (level[level.length - 1] === tag) {\n level.pop()\n }\n }\n\n for (let i = 0; i < html.length; i++) {\n const char = html[i]\n if (char === '<' && tagBuffer === null) {\n tagBuffer = char\n } else if (char !== '>' && tagBuffer !== null) {\n tagBuffer += char\n } else if (char === '>' && tagBuffer !== null) {\n tagBuffer += char\n const tagFull = tagBuffer\n tagBuffer = null\n const tagName = getTagName(tagFull)\n if (handledTags.has(tagName)) {\n if (tagName === 'br') {\n handleBr(tagFull)\n } else if (openCloseTags.has(tagName)) {\n if (tagFull[1] === '/') {\n handleClose(tagFull)\n } else if (tagFull[tagFull.length - 2] === '/') {\n // self-closing\n handleBr(tagFull)\n } else {\n handleOpen(tagFull)\n }\n }\n } else {\n textBuffer += tagFull\n }\n } else if (char === '\\n') {\n handleBr(char)\n } else {\n textBuffer += char\n }\n }\n if (tagBuffer) {\n textBuffer += tagBuffer\n }\n\n flush()\n\n return buffer\n}\n","export const mentionMatchesUrl = (attention, url) => {\n if (url === attention.statusnet_profile_url) {\n return true\n }\n const [namepart, instancepart] = attention.screen_name.split('@')\n const matchstring = new RegExp('://' + instancepart + '/.*' + namepart + '$', 'g')\n\n return !!url.match(matchstring)\n}\n\n/**\n * Extract tag name from pleroma or mastodon url.\n * i.e https://bikeshed.party/tag/photo or https://quey.org/tags/sky\n * @param {string} url\n */\nexport const extractTagFromUrl = (url) => {\n const regex = /tag[s]*\\/(\\w+)$/g\n const result = regex.exec(url)\n if (!result) {\n return false\n }\n return result[1]\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./status_content.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./status_content.js\"\nimport __vue_script__ from \"!!babel-loader!./status_content.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-43c5cfd4\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status_content.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"status-body\"},[_vm._t(\"header\"),_vm._v(\" \"),(_vm.longSubject)?_c('div',{staticClass:\"status-content-wrapper\",class:{ 'tall-status': !_vm.showingLongSubject }},[(!_vm.showingLongSubject)?_c('a',{staticClass:\"tall-status-hider\",class:{ 'tall-status-hider_focused': _vm.focused },attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showingLongSubject=true}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(\"general.show_more\"))+\"\\n \"),(_vm.hasImageAttachments)?_c('span',{staticClass:\"icon-picture\"}):_vm._e(),_vm._v(\" \"),(_vm.hasVideoAttachments)?_c('span',{staticClass:\"icon-video\"}):_vm._e(),_vm._v(\" \"),(_vm.status.card)?_c('span',{staticClass:\"icon-link\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"status-content media-body\",domProps:{\"innerHTML\":_vm._s(_vm.contentHtml)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}),_vm._v(\" \"),(_vm.showingLongSubject)?_c('a',{staticClass:\"status-unhider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showingLongSubject=false}}},[_vm._v(_vm._s(_vm.$t(\"general.show_less\")))]):_vm._e()]):_c('div',{staticClass:\"status-content-wrapper\",class:{'tall-status': _vm.hideTallStatus}},[(_vm.hideTallStatus)?_c('a',{staticClass:\"tall-status-hider\",class:{ 'tall-status-hider_focused': _vm.focused },attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(_vm._s(_vm.$t(\"general.show_more\")))]):_vm._e(),_vm._v(\" \"),(!_vm.hideSubjectStatus)?_c('div',{staticClass:\"status-content media-body\",domProps:{\"innerHTML\":_vm._s(_vm.contentHtml)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}):_c('div',{staticClass:\"status-content media-body\",domProps:{\"innerHTML\":_vm._s(_vm.status.summary_html)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}),_vm._v(\" \"),(_vm.hideSubjectStatus)?_c('a',{staticClass:\"cw-status-hider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(_vm._s(_vm.$t(\"general.show_more\")))]):_vm._e(),_vm._v(\" \"),(_vm.showingMore)?_c('a',{staticClass:\"status-unhider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(_vm._s(_vm.$t(\"general.show_less\")))]):_vm._e()]),_vm._v(\" \"),(_vm.status.poll && _vm.status.poll.options)?_c('div',[_c('poll',{attrs:{\"base-poll\":_vm.status.poll}})],1):_vm._e(),_vm._v(\" \"),(_vm.status.attachments.length !== 0 && (!_vm.hideSubjectStatus || _vm.showingLongSubject))?_c('div',{staticClass:\"attachments media-body\"},[_vm._l((_vm.nonGalleryAttachments),function(attachment){return _c('attachment',{key:attachment.id,staticClass:\"non-gallery\",attrs:{\"size\":_vm.attachmentSize,\"nsfw\":_vm.nsfwClickthrough,\"attachment\":attachment,\"allow-play\":true,\"set-media\":_vm.setMedia()}})}),_vm._v(\" \"),(_vm.galleryAttachments.length > 0)?_c('gallery',{attrs:{\"nsfw\":_vm.nsfwClickthrough,\"attachments\":_vm.galleryAttachments,\"set-media\":_vm.setMedia()}}):_vm._e()],2):_vm._e(),_vm._v(\" \"),(_vm.status.card && !_vm.hideSubjectStatus && !_vm.noHeading)?_c('div',{staticClass:\"link-preview media-body\"},[_c('link-preview',{attrs:{\"card\":_vm.status.card,\"size\":_vm.attachmentSize,\"nsfw\":_vm.nsfwClickthrough}})],1):_vm._e(),_vm._v(\" \"),_vm._t(\"footer\")],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { find } from 'lodash'\n\nconst StatusPopover = {\n name: 'StatusPopover',\n props: [\n 'statusId'\n ],\n data () {\n return {\n error: false\n }\n },\n computed: {\n status () {\n return find(this.$store.state.statuses.allStatuses, { id: this.statusId })\n }\n },\n components: {\n Status: () => import('../status/status.vue'),\n Popover: () => import('../popover/popover.vue')\n },\n methods: {\n enter () {\n if (!this.status) {\n this.$store.dispatch('fetchStatus', this.statusId)\n .then(data => (this.error = false))\n .catch(e => (this.error = true))\n }\n }\n }\n}\n\nexport default StatusPopover\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./status_popover.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./status_popover.js\"\nimport __vue_script__ from \"!!babel-loader!./status_popover.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3b873076\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status_popover.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Popover',{attrs:{\"trigger\":\"hover\",\"popover-class\":\"status-popover\",\"bound-to\":{ x: 'container' }},on:{\"show\":_vm.enter}},[_c('template',{slot:\"trigger\"},[_vm._t(\"default\")],2),_vm._v(\" \"),_c('div',{attrs:{\"slot\":\"content\"},slot:\"content\"},[(_vm.status)?_c('Status',{attrs:{\"is-preview\":true,\"statusoid\":_vm.status,\"compact\":true}}):(_vm.error)?_c('div',{staticClass:\"status-preview-no-content faint\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('status.status_unavailable'))+\"\\n \")]):_c('div',{staticClass:\"status-preview-no-content\"},[_c('i',{staticClass:\"icon-spin4 animate-spin\"})])],1)],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport Popover from '../popover/popover.vue'\n\nconst EMOJI_REACTION_COUNT_CUTOFF = 12\n\nconst EmojiReactions = {\n name: 'EmojiReactions',\n components: {\n UserAvatar,\n Popover\n },\n props: ['status'],\n data: () => ({\n showAll: false\n }),\n computed: {\n tooManyReactions () {\n return this.status.emoji_reactions.length > EMOJI_REACTION_COUNT_CUTOFF\n },\n emojiReactions () {\n return this.showAll\n ? this.status.emoji_reactions\n : this.status.emoji_reactions.slice(0, EMOJI_REACTION_COUNT_CUTOFF)\n },\n showMoreString () {\n return `+${this.status.emoji_reactions.length - EMOJI_REACTION_COUNT_CUTOFF}`\n },\n accountsForEmoji () {\n return this.status.emoji_reactions.reduce((acc, reaction) => {\n acc[reaction.name] = reaction.accounts || []\n return acc\n }, {})\n },\n loggedIn () {\n return !!this.$store.state.users.currentUser\n }\n },\n methods: {\n toggleShowAll () {\n this.showAll = !this.showAll\n },\n reactedWith (emoji) {\n return this.status.emoji_reactions.find(r => r.name === emoji).me\n },\n fetchEmojiReactionsByIfMissing () {\n const hasNoAccounts = this.status.emoji_reactions.find(r => !r.accounts)\n if (hasNoAccounts) {\n this.$store.dispatch('fetchEmojiReactionsBy', this.status.id)\n }\n },\n reactWith (emoji) {\n this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })\n },\n unreact (emoji) {\n this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })\n },\n emojiOnClick (emoji, event) {\n if (!this.loggedIn) return\n\n if (this.reactedWith(emoji)) {\n this.unreact(emoji)\n } else {\n this.reactWith(emoji)\n }\n }\n }\n}\n\nexport default EmojiReactions\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./emoji_reactions.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./emoji_reactions.js\"\nimport __vue_script__ from \"!!babel-loader!./emoji_reactions.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-09ec7fb6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./emoji_reactions.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"emoji-reactions\"},[_vm._l((_vm.emojiReactions),function(reaction){return _c('Popover',{key:reaction.name,attrs:{\"trigger\":\"hover\",\"placement\":\"top\",\"offset\":{ y: 5 }}},[_c('div',{staticClass:\"reacted-users\",attrs:{\"slot\":\"content\"},slot:\"content\"},[(_vm.accountsForEmoji[reaction.name].length)?_c('div',_vm._l((_vm.accountsForEmoji[reaction.name]),function(account){return _c('div',{key:account.id,staticClass:\"reacted-user\"},[_c('UserAvatar',{staticClass:\"avatar-small\",attrs:{\"user\":account,\"compact\":true}}),_vm._v(\" \"),_c('div',{staticClass:\"reacted-user-names\"},[_c('span',{staticClass:\"reacted-user-name\",domProps:{\"innerHTML\":_vm._s(account.name_html)}}),_vm._v(\" \"),_c('span',{staticClass:\"reacted-user-screen-name\"},[_vm._v(_vm._s(account.screen_name))])])],1)}),0):_c('div',[_c('i',{staticClass:\"icon-spin4 animate-spin\"})])]),_vm._v(\" \"),_c('button',{staticClass:\"emoji-reaction btn btn-default\",class:{ 'picked-reaction': _vm.reactedWith(reaction.name), 'not-clickable': !_vm.loggedIn },attrs:{\"slot\":\"trigger\"},on:{\"click\":function($event){return _vm.emojiOnClick(reaction.name, $event)},\"mouseenter\":function($event){return _vm.fetchEmojiReactionsByIfMissing()}},slot:\"trigger\"},[_c('span',{staticClass:\"reaction-emoji\"},[_vm._v(_vm._s(reaction.name))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(reaction.count))])])])}),_vm._v(\" \"),(_vm.tooManyReactions)?_c('a',{staticClass:\"emoji-reaction-expand faint\",attrs:{\"href\":\"javascript:void(0)\"},on:{\"click\":_vm.toggleShowAll}},[_vm._v(\"\\n \"+_vm._s(_vm.showAll ? _vm.$t('general.show_less') : _vm.showMoreString)+\"\\n \")]):_vm._e()],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import FavoriteButton from '../favorite_button/favorite_button.vue'\nimport ReactButton from '../react_button/react_button.vue'\nimport RetweetButton from '../retweet_button/retweet_button.vue'\nimport ExtraButtons from '../extra_buttons/extra_buttons.vue'\nimport PostStatusForm from '../post_status_form/post_status_form.vue'\nimport UserCard from '../user_card/user_card.vue'\nimport UserAvatar from '../user_avatar/user_avatar.vue'\nimport AvatarList from '../avatar_list/avatar_list.vue'\nimport Timeago from '../timeago/timeago.vue'\nimport StatusContent from '../status_content/status_content.vue'\nimport StatusPopover from '../status_popover/status_popover.vue'\nimport EmojiReactions from '../emoji_reactions/emoji_reactions.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'\nimport { filter, unescape, uniqBy } from 'lodash'\nimport { mapGetters, mapState } from 'vuex'\n\nconst Status = {\n name: 'Status',\n props: [\n 'statusoid',\n 'expandable',\n 'inConversation',\n 'focused',\n 'highlight',\n 'compact',\n 'replies',\n 'isPreview',\n 'noHeading',\n 'inlineExpanded',\n 'showPinned',\n 'inProfile',\n 'profileUserId'\n ],\n data () {\n return {\n replying: false,\n unmuted: false,\n userExpanded: false,\n error: null\n }\n },\n computed: {\n muteWords () {\n return this.mergedConfig.muteWords\n },\n repeaterClass () {\n const user = this.statusoid.user\n return highlightClass(user)\n },\n userClass () {\n const user = this.retweet ? (this.statusoid.retweeted_status.user) : this.statusoid.user\n return highlightClass(user)\n },\n deleted () {\n return this.statusoid.deleted\n },\n repeaterStyle () {\n const user = this.statusoid.user\n const highlight = this.mergedConfig.highlight\n return highlightStyle(highlight[user.screen_name])\n },\n userStyle () {\n if (this.noHeading) return\n const user = this.retweet ? (this.statusoid.retweeted_status.user) : this.statusoid.user\n const highlight = this.mergedConfig.highlight\n return highlightStyle(highlight[user.screen_name])\n },\n userProfileLink () {\n return this.generateUserProfileLink(this.status.user.id, this.status.user.screen_name)\n },\n replyProfileLink () {\n if (this.isReply) {\n return this.generateUserProfileLink(this.status.in_reply_to_user_id, this.replyToName)\n }\n },\n retweet () { return !!this.statusoid.retweeted_status },\n retweeter () { return this.statusoid.user.name || this.statusoid.user.screen_name },\n retweeterHtml () { return this.statusoid.user.name_html },\n retweeterProfileLink () { return this.generateUserProfileLink(this.statusoid.user.id, this.statusoid.user.screen_name) },\n status () {\n if (this.retweet) {\n return this.statusoid.retweeted_status\n } else {\n return this.statusoid\n }\n },\n statusFromGlobalRepository () {\n // NOTE: Consider to replace status with statusFromGlobalRepository\n return this.$store.state.statuses.allStatusesObject[this.status.id]\n },\n loggedIn () {\n return !!this.currentUser\n },\n muteWordHits () {\n const statusText = this.status.text.toLowerCase()\n const statusSummary = this.status.summary.toLowerCase()\n const hits = filter(this.muteWords, (muteWord) => {\n return statusText.includes(muteWord.toLowerCase()) || statusSummary.includes(muteWord.toLowerCase())\n })\n\n return hits\n },\n muted () {\n const relationship = this.$store.getters.relationship(this.status.user.id)\n return !this.unmuted && (\n (!(this.inProfile && this.status.user.id === this.profileUserId) && relationship.muting) ||\n (!this.inConversation && this.status.thread_muted) ||\n this.muteWordHits.length > 0)\n },\n hideFilteredStatuses () {\n return this.mergedConfig.hideFilteredStatuses\n },\n hideStatus () {\n return (this.hideReply || this.deleted) || (this.muted && this.hideFilteredStatuses)\n },\n isFocused () {\n // retweet or root of an expanded conversation\n if (this.focused) {\n return true\n } else if (!this.inConversation) {\n return false\n }\n // use conversation highlight only when in conversation\n return this.status.id === this.highlight\n },\n isReply () {\n return !!(this.status.in_reply_to_status_id && this.status.in_reply_to_user_id)\n },\n replyToName () {\n if (this.status.in_reply_to_screen_name) {\n return this.status.in_reply_to_screen_name\n } else {\n const user = this.$store.getters.findUser(this.status.in_reply_to_user_id)\n return user && user.screen_name\n }\n },\n hideReply () {\n if (this.mergedConfig.replyVisibility === 'all') {\n return false\n }\n if (this.inConversation || !this.isReply) {\n return false\n }\n if (this.status.user.id === this.currentUser.id) {\n return false\n }\n if (this.status.type === 'retweet') {\n return false\n }\n const checkFollowing = this.mergedConfig.replyVisibility === 'following'\n for (var i = 0; i < this.status.attentions.length; ++i) {\n if (this.status.user.id === this.status.attentions[i].id) {\n continue\n }\n // There's zero guarantee of this working. If we happen to have that user and their\n // relationship in store then it will work, but there's kinda little chance of having\n // them for people you're not following.\n const relationship = this.$store.state.users.relationships[this.status.attentions[i].id]\n if (checkFollowing && relationship && relationship.following) {\n return false\n }\n if (this.status.attentions[i].id === this.currentUser.id) {\n return false\n }\n }\n return this.status.attentions.length > 0\n },\n replySubject () {\n if (!this.status.summary) return ''\n const decodedSummary = unescape(this.status.summary)\n const behavior = this.mergedConfig.subjectLineBehavior\n const startsWithRe = decodedSummary.match(/^re[: ]/i)\n if ((behavior !== 'noop' && startsWithRe) || behavior === 'masto') {\n return decodedSummary\n } else if (behavior === 'email') {\n return 're: '.concat(decodedSummary)\n } else if (behavior === 'noop') {\n return ''\n }\n },\n combinedFavsAndRepeatsUsers () {\n // Use the status from the global status repository since favs and repeats are saved in it\n const combinedUsers = [].concat(\n this.statusFromGlobalRepository.favoritedBy,\n this.statusFromGlobalRepository.rebloggedBy\n )\n return uniqBy(combinedUsers, 'id')\n },\n tags () {\n return this.status.tags.filter(tagObj => tagObj.hasOwnProperty('name')).map(tagObj => tagObj.name).join(' ')\n },\n hidePostStats () {\n return this.mergedConfig.hidePostStats\n },\n ...mapGetters(['mergedConfig']),\n ...mapState({\n betterShadow: state => state.interface.browserSupport.cssFilter,\n currentUser: state => state.users.currentUser\n })\n },\n components: {\n FavoriteButton,\n ReactButton,\n RetweetButton,\n ExtraButtons,\n PostStatusForm,\n UserCard,\n UserAvatar,\n AvatarList,\n Timeago,\n StatusPopover,\n EmojiReactions,\n StatusContent\n },\n methods: {\n visibilityIcon (visibility) {\n switch (visibility) {\n case 'private':\n return 'icon-lock'\n case 'unlisted':\n return 'icon-lock-open-alt'\n case 'direct':\n return 'icon-mail-alt'\n default:\n return 'icon-globe'\n }\n },\n showError (error) {\n this.error = error\n },\n clearError () {\n this.error = undefined\n },\n toggleReplying () {\n this.replying = !this.replying\n },\n gotoOriginal (id) {\n if (this.inConversation) {\n this.$emit('goto', id)\n }\n },\n toggleExpanded () {\n this.$emit('toggleExpanded')\n },\n toggleMute () {\n this.unmuted = !this.unmuted\n },\n toggleUserExpanded () {\n this.userExpanded = !this.userExpanded\n },\n generateUserProfileLink (id, name) {\n return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)\n }\n },\n watch: {\n 'highlight': function (id) {\n if (this.status.id === id) {\n let rect = this.$el.getBoundingClientRect()\n if (rect.top < 100) {\n // Post is above screen, match its top to screen top\n window.scrollBy(0, rect.top - 100)\n } else if (rect.height >= (window.innerHeight - 50)) {\n // Post we want to see is taller than screen so match its top to screen top\n window.scrollBy(0, rect.top - 100)\n } else if (rect.bottom > window.innerHeight - 50) {\n // Post is below screen, match its bottom to screen bottom\n window.scrollBy(0, rect.bottom - window.innerHeight + 50)\n }\n }\n },\n 'status.repeat_num': function (num) {\n // refetch repeats when repeat_num is changed in any way\n if (this.isFocused && this.statusFromGlobalRepository.rebloggedBy && this.statusFromGlobalRepository.rebloggedBy.length !== num) {\n this.$store.dispatch('fetchRepeats', this.status.id)\n }\n },\n 'status.fave_num': function (num) {\n // refetch favs when fave_num is changed in any way\n if (this.isFocused && this.statusFromGlobalRepository.favoritedBy && this.statusFromGlobalRepository.favoritedBy.length !== num) {\n this.$store.dispatch('fetchFavs', this.status.id)\n }\n }\n },\n filters: {\n capitalize: function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n }\n }\n}\n\nexport default Status\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./status.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./status.js\"\nimport __vue_script__ from \"!!babel-loader!./status.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2d68efa0\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.hideStatus)?_c('div',{staticClass:\"status-el\",class:[{ 'status-el_focused': _vm.isFocused }, { 'status-conversation': _vm.inlineExpanded }]},[(_vm.error)?_c('div',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.error)+\"\\n \"),_c('i',{staticClass:\"button-icon icon-cancel\",on:{\"click\":_vm.clearError}})]):_vm._e(),_vm._v(\" \"),(_vm.muted && !_vm.isPreview)?[_c('div',{staticClass:\"media status container muted\"},[_c('small',[_c('router-link',{attrs:{\"to\":_vm.userProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.screen_name)+\"\\n \")])],1),_vm._v(\" \"),_c('small',{staticClass:\"muteWords\"},[_vm._v(_vm._s(_vm.muteWordHits.join(', ')))]),_vm._v(\" \"),_c('a',{staticClass:\"unmute\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMute($event)}}},[_c('i',{staticClass:\"button-icon icon-eye-off\"})])])]:[(_vm.showPinned)?_c('div',{staticClass:\"status-pin\"},[_c('i',{staticClass:\"fa icon-pin faint\"}),_vm._v(\" \"),_c('span',{staticClass:\"faint\"},[_vm._v(_vm._s(_vm.$t('status.pinned')))])]):_vm._e(),_vm._v(\" \"),(_vm.retweet && !_vm.noHeading && !_vm.inConversation)?_c('div',{staticClass:\"media container retweet-info\",class:[_vm.repeaterClass, { highlighted: _vm.repeaterStyle }],style:([_vm.repeaterStyle])},[(_vm.retweet)?_c('UserAvatar',{staticClass:\"media-left\",attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.statusoid.user}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"media-body faint\"},[_c('span',{staticClass:\"user-name\"},[(_vm.retweeterHtml)?_c('router-link',{attrs:{\"to\":_vm.retweeterProfileLink},domProps:{\"innerHTML\":_vm._s(_vm.retweeterHtml)}}):_c('router-link',{attrs:{\"to\":_vm.retweeterProfileLink}},[_vm._v(_vm._s(_vm.retweeter))])],1),_vm._v(\" \"),_c('i',{staticClass:\"fa icon-retweet retweeted\",attrs:{\"title\":_vm.$t('tool_tip.repeat')}}),_vm._v(\"\\n \"+_vm._s(_vm.$t('timeline.repeated'))+\"\\n \")])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"media status\",class:[_vm.userClass, { highlighted: _vm.userStyle, 'is-retweet': _vm.retweet && !_vm.inConversation }],style:([ _vm.userStyle ]),attrs:{\"data-tags\":_vm.tags}},[(!_vm.noHeading)?_c('div',{staticClass:\"media-left\"},[_c('router-link',{attrs:{\"to\":_vm.userProfileLink},nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleUserExpanded($event)}}},[_c('UserAvatar',{attrs:{\"compact\":_vm.compact,\"better-shadow\":_vm.betterShadow,\"user\":_vm.status.user}})],1)],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.userExpanded)?_c('UserCard',{staticClass:\"status-usercard\",attrs:{\"user-id\":_vm.status.user.id,\"rounded\":true,\"bordered\":true}}):_vm._e(),_vm._v(\" \"),(!_vm.noHeading)?_c('div',{staticClass:\"media-heading\"},[_c('div',{staticClass:\"heading-name-row\"},[_c('div',{staticClass:\"name-and-account-name\"},[(_vm.status.user.name_html)?_c('h4',{staticClass:\"user-name\",domProps:{\"innerHTML\":_vm._s(_vm.status.user.name_html)}}):_c('h4',{staticClass:\"user-name\"},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.name)+\"\\n \")]),_vm._v(\" \"),_c('router-link',{staticClass:\"account-name\",attrs:{\"to\":_vm.userProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.screen_name)+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"heading-right\"},[_c('router-link',{staticClass:\"timeago faint-link\",attrs:{\"to\":{ name: 'conversation', params: { id: _vm.status.id } }}},[_c('Timeago',{attrs:{\"time\":_vm.status.created_at,\"auto-update\":60}})],1),_vm._v(\" \"),(_vm.status.visibility)?_c('div',{staticClass:\"button-icon visibility-icon\"},[_c('i',{class:_vm.visibilityIcon(_vm.status.visibility),attrs:{\"title\":_vm._f(\"capitalize\")(_vm.status.visibility)}})]):_vm._e(),_vm._v(\" \"),(!_vm.status.is_local && !_vm.isPreview)?_c('a',{staticClass:\"source_url\",attrs:{\"href\":_vm.status.external_url,\"target\":\"_blank\",\"title\":\"Source\"}},[_c('i',{staticClass:\"button-icon icon-link-ext-alt\"})]):_vm._e(),_vm._v(\" \"),(_vm.expandable && !_vm.isPreview)?[_c('a',{attrs:{\"href\":\"#\",\"title\":\"Expand\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleExpanded($event)}}},[_c('i',{staticClass:\"button-icon icon-plus-squared\"})])]:_vm._e(),_vm._v(\" \"),(_vm.unmuted)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMute($event)}}},[_c('i',{staticClass:\"button-icon icon-eye-off\"})]):_vm._e()],2)]),_vm._v(\" \"),_c('div',{staticClass:\"heading-reply-row\"},[(_vm.isReply)?_c('div',{staticClass:\"reply-to-and-accountname\"},[(!_vm.isPreview)?_c('StatusPopover',{staticClass:\"reply-to-popover\",staticStyle:{\"min-width\":\"0\"},attrs:{\"status-id\":_vm.status.in_reply_to_status_id}},[_c('a',{staticClass:\"reply-to\",attrs:{\"href\":\"#\",\"aria-label\":_vm.$t('tool_tip.reply')},on:{\"click\":function($event){$event.preventDefault();return _vm.gotoOriginal(_vm.status.in_reply_to_status_id)}}},[_c('i',{staticClass:\"button-icon icon-reply\"}),_vm._v(\" \"),_c('span',{staticClass:\"faint-link reply-to-text\"},[_vm._v(_vm._s(_vm.$t('status.reply_to')))])])]):_c('span',{staticClass:\"reply-to\"},[_c('span',{staticClass:\"reply-to-text\"},[_vm._v(_vm._s(_vm.$t('status.reply_to')))])]),_vm._v(\" \"),_c('router-link',{attrs:{\"to\":_vm.replyProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.replyToName)+\"\\n \")]),_vm._v(\" \"),(_vm.replies && _vm.replies.length)?_c('span',{staticClass:\"faint replies-separator\"},[_vm._v(\"\\n -\\n \")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.inConversation && !_vm.isPreview && _vm.replies && _vm.replies.length)?_c('div',{staticClass:\"replies\"},[_c('span',{staticClass:\"faint\"},[_vm._v(_vm._s(_vm.$t('status.replies_list')))]),_vm._v(\" \"),_vm._l((_vm.replies),function(reply){return _c('StatusPopover',{key:reply.id,attrs:{\"status-id\":reply.id}},[_c('a',{staticClass:\"reply-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.gotoOriginal(reply.id)}}},[_vm._v(_vm._s(reply.name))])])})],2):_vm._e()])]):_vm._e(),_vm._v(\" \"),_c('StatusContent',{attrs:{\"status\":_vm.status,\"no-heading\":_vm.noHeading,\"highlight\":_vm.highlight,\"focused\":_vm.isFocused}}),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[(!_vm.hidePostStats && _vm.isFocused && _vm.combinedFavsAndRepeatsUsers.length > 0)?_c('div',{staticClass:\"favs-repeated-users\"},[_c('div',{staticClass:\"stats\"},[(_vm.statusFromGlobalRepository.rebloggedBy && _vm.statusFromGlobalRepository.rebloggedBy.length > 0)?_c('div',{staticClass:\"stat-count\"},[_c('a',{staticClass:\"stat-title\"},[_vm._v(_vm._s(_vm.$t('status.repeats')))]),_vm._v(\" \"),_c('div',{staticClass:\"stat-number\"},[_vm._v(\"\\n \"+_vm._s(_vm.statusFromGlobalRepository.rebloggedBy.length)+\"\\n \")])]):_vm._e(),_vm._v(\" \"),(_vm.statusFromGlobalRepository.favoritedBy && _vm.statusFromGlobalRepository.favoritedBy.length > 0)?_c('div',{staticClass:\"stat-count\"},[_c('a',{staticClass:\"stat-title\"},[_vm._v(_vm._s(_vm.$t('status.favorites')))]),_vm._v(\" \"),_c('div',{staticClass:\"stat-number\"},[_vm._v(\"\\n \"+_vm._s(_vm.statusFromGlobalRepository.favoritedBy.length)+\"\\n \")])]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"avatar-row\"},[_c('AvatarList',{attrs:{\"users\":_vm.combinedFavsAndRepeatsUsers}})],1)])]):_vm._e()]),_vm._v(\" \"),((_vm.mergedConfig.emojiReactionsOnTimeline || _vm.isFocused) && (!_vm.noHeading && !_vm.isPreview))?_c('EmojiReactions',{attrs:{\"status\":_vm.status}}):_vm._e(),_vm._v(\" \"),(!_vm.noHeading && !_vm.isPreview)?_c('div',{staticClass:\"status-actions media-body\"},[_c('div',[(_vm.loggedIn)?_c('i',{staticClass:\"button-icon icon-reply\",class:{'button-icon-active': _vm.replying},attrs:{\"title\":_vm.$t('tool_tip.reply')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleReplying($event)}}}):_c('i',{staticClass:\"button-icon button-icon-disabled icon-reply\",attrs:{\"title\":_vm.$t('tool_tip.reply')}}),_vm._v(\" \"),(_vm.status.replies_count > 0)?_c('span',[_vm._v(_vm._s(_vm.status.replies_count))]):_vm._e()]),_vm._v(\" \"),_c('retweet-button',{attrs:{\"visibility\":_vm.status.visibility,\"logged-in\":_vm.loggedIn,\"status\":_vm.status}}),_vm._v(\" \"),_c('favorite-button',{attrs:{\"logged-in\":_vm.loggedIn,\"status\":_vm.status}}),_vm._v(\" \"),(_vm.loggedIn)?_c('ReactButton',{attrs:{\"status\":_vm.status}}):_vm._e(),_vm._v(\" \"),_c('extra-buttons',{attrs:{\"status\":_vm.status},on:{\"onError\":_vm.showError,\"onSuccess\":_vm.clearError}})],1):_vm._e()],1)]),_vm._v(\" \"),(_vm.replying)?_c('div',{staticClass:\"container\"},[_c('PostStatusForm',{staticClass:\"reply-body\",attrs:{\"reply-to\":_vm.status.id,\"attentions\":_vm.status.attentions,\"replied-user\":_vm.status.user,\"copy-message-scope\":_vm.status.visibility,\"subject\":_vm.replySubject},on:{\"posted\":_vm.toggleReplying}})],1):_vm._e()]],2):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\nconst Popover = {\n name: 'Popover',\n props: {\n // Action to trigger popover: either 'hover' or 'click'\n trigger: String,\n // Either 'top' or 'bottom'\n placement: String,\n // Takes object with properties 'x' and 'y', values of these can be\n // 'container' for using offsetParent as boundaries for either axis\n // or 'viewport'\n boundTo: Object,\n // Takes a top/bottom/left/right object, how much space to leave\n // between boundary and popover element\n margin: Object,\n // Takes a x/y object and tells how many pixels to offset from\n // anchor point on either axis\n offset: Object,\n // Additional styles you may want for the popover container\n popoverClass: String\n },\n data () {\n return {\n hidden: true,\n styles: { opacity: 0 },\n oldSize: { width: 0, height: 0 }\n }\n },\n methods: {\n updateStyles () {\n if (this.hidden) {\n this.styles = {\n opacity: 0\n }\n return\n }\n\n // Popover will be anchored around this element, trigger ref is the container, so\n // its children are what are inside the slot. Expect only one slot=\"trigger\".\n const anchorEl = (this.$refs.trigger && this.$refs.trigger.children[0]) || this.$el\n const screenBox = anchorEl.getBoundingClientRect()\n // Screen position of the origin point for popover\n const origin = { x: screenBox.left + screenBox.width * 0.5, y: screenBox.top }\n const content = this.$refs.content\n // Minor optimization, don't call a slow reflow call if we don't have to\n const parentBounds = this.boundTo &&\n (this.boundTo.x === 'container' || this.boundTo.y === 'container') &&\n this.$el.offsetParent.getBoundingClientRect()\n const margin = this.margin || {}\n\n // What are the screen bounds for the popover? Viewport vs container\n // when using viewport, using default margin values to dodge the navbar\n const xBounds = this.boundTo && this.boundTo.x === 'container' ? {\n min: parentBounds.left + (margin.left || 0),\n max: parentBounds.right - (margin.right || 0)\n } : {\n min: 0 + (margin.left || 10),\n max: window.innerWidth - (margin.right || 10)\n }\n\n const yBounds = this.boundTo && this.boundTo.y === 'container' ? {\n min: parentBounds.top + (margin.top || 0),\n max: parentBounds.bottom - (margin.bottom || 0)\n } : {\n min: 0 + (margin.top || 50),\n max: window.innerHeight - (margin.bottom || 5)\n }\n\n let horizOffset = 0\n\n // If overflowing from left, move it so that it doesn't\n if ((origin.x - content.offsetWidth * 0.5) < xBounds.min) {\n horizOffset += -(origin.x - content.offsetWidth * 0.5) + xBounds.min\n }\n\n // If overflowing from right, move it so that it doesn't\n if ((origin.x + horizOffset + content.offsetWidth * 0.5) > xBounds.max) {\n horizOffset -= (origin.x + horizOffset + content.offsetWidth * 0.5) - xBounds.max\n }\n\n // Default to whatever user wished with placement prop\n let usingTop = this.placement !== 'bottom'\n\n // Handle special cases, first force to displaying on top if there's not space on bottom,\n // regardless of what placement value was. Then check if there's not space on top, and\n // force to bottom, again regardless of what placement value was.\n if (origin.y + content.offsetHeight > yBounds.max) usingTop = true\n if (origin.y - content.offsetHeight < yBounds.min) usingTop = false\n\n const yOffset = (this.offset && this.offset.y) || 0\n const translateY = usingTop\n ? -anchorEl.offsetHeight - yOffset - content.offsetHeight\n : yOffset\n\n const xOffset = (this.offset && this.offset.x) || 0\n const translateX = (anchorEl.offsetWidth * 0.5) - content.offsetWidth * 0.5 + horizOffset + xOffset\n\n // Note, separate translateX and translateY avoids blurry text on chromium,\n // single translate or translate3d resulted in blurry text.\n this.styles = {\n opacity: 1,\n transform: `translateX(${Math.floor(translateX)}px) translateY(${Math.floor(translateY)}px)`\n }\n },\n showPopover () {\n if (this.hidden) this.$emit('show')\n this.hidden = false\n this.$nextTick(this.updateStyles)\n },\n hidePopover () {\n if (!this.hidden) this.$emit('close')\n this.hidden = true\n this.styles = { opacity: 0 }\n },\n onMouseenter (e) {\n if (this.trigger === 'hover') this.showPopover()\n },\n onMouseleave (e) {\n if (this.trigger === 'hover') this.hidePopover()\n },\n onClick (e) {\n if (this.trigger === 'click') {\n if (this.hidden) {\n this.showPopover()\n } else {\n this.hidePopover()\n }\n }\n },\n onClickOutside (e) {\n if (this.hidden) return\n if (this.$el.contains(e.target)) return\n this.hidePopover()\n }\n },\n updated () {\n // Monitor changes to content size, update styles only when content sizes have changed,\n // that should be the only time we need to move the popover box if we don't care about scroll\n // or resize\n const content = this.$refs.content\n if (!content) return\n if (this.oldSize.width !== content.offsetWidth || this.oldSize.height !== content.offsetHeight) {\n this.updateStyles()\n this.oldSize = { width: content.offsetWidth, height: content.offsetHeight }\n }\n },\n created () {\n document.addEventListener('click', this.onClickOutside)\n },\n destroyed () {\n document.removeEventListener('click', this.onClickOutside)\n this.hidePopover()\n }\n}\n\nexport default Popover\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./popover.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./popover.js\"\nimport __vue_script__ from \"!!babel-loader!./popover.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-10f1984d\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./popover.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{on:{\"mouseenter\":_vm.onMouseenter,\"mouseleave\":_vm.onMouseleave}},[_c('div',{ref:\"trigger\",on:{\"click\":_vm.onClick}},[_vm._t(\"trigger\")],2),_vm._v(\" \"),(!_vm.hidden)?_c('div',{ref:\"content\",staticClass:\"popover\",class:_vm.popoverClass,style:(_vm.styles)},[_vm._t(\"content\",null,{\"close\":_vm.hidePopover})],2):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","export const SECOND = 1000\nexport const MINUTE = 60 * SECOND\nexport const HOUR = 60 * MINUTE\nexport const DAY = 24 * HOUR\nexport const WEEK = 7 * DAY\nexport const MONTH = 30 * DAY\nexport const YEAR = 365.25 * DAY\n\nexport const relativeTime = (date, nowThreshold = 1) => {\n if (typeof date === 'string') date = Date.parse(date)\n const round = Date.now() > date ? Math.floor : Math.ceil\n const d = Math.abs(Date.now() - date)\n let r = { num: round(d / YEAR), key: 'time.years' }\n if (d < nowThreshold * SECOND) {\n r.num = 0\n r.key = 'time.now'\n } else if (d < MINUTE) {\n r.num = round(d / SECOND)\n r.key = 'time.seconds'\n } else if (d < HOUR) {\n r.num = round(d / MINUTE)\n r.key = 'time.minutes'\n } else if (d < DAY) {\n r.num = round(d / HOUR)\n r.key = 'time.hours'\n } else if (d < WEEK) {\n r.num = round(d / DAY)\n r.key = 'time.days'\n } else if (d < MONTH) {\n r.num = round(d / WEEK)\n r.key = 'time.weeks'\n } else if (d < YEAR) {\n r.num = round(d / MONTH)\n r.key = 'time.months'\n }\n // Remove plural form when singular\n if (r.num === 1) r.key = r.key.slice(0, -1)\n return r\n}\n\nexport const relativeTimeShort = (date, nowThreshold = 1) => {\n const r = relativeTime(date, nowThreshold)\n r.key += '_short'\n return r\n}\n","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./progress_button.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./progress_button.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-9f751ae6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./progress_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{attrs:{\"disabled\":_vm.progress || _vm.disabled},on:{\"click\":_vm.onClick}},[(_vm.progress && _vm.$slots.progress)?[_vm._t(\"progress\")]:[_vm._t(\"default\")]],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { hex2rgb } from '../color_convert/color_convert.js'\nconst highlightStyle = (prefs) => {\n if (prefs === undefined) return\n const { color, type } = prefs\n if (typeof color !== 'string') return\n const rgb = hex2rgb(color)\n if (rgb == null) return\n const solidColor = `rgb(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)})`\n const tintColor = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .1)`\n const tintColor2 = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .2)`\n if (type === 'striped') {\n return {\n backgroundImage: [\n 'repeating-linear-gradient(135deg,',\n `${tintColor} ,`,\n `${tintColor} 20px,`,\n `${tintColor2} 20px,`,\n `${tintColor2} 40px`\n ].join(' '),\n backgroundPosition: '0 0'\n }\n } else if (type === 'solid') {\n return {\n backgroundColor: tintColor2\n }\n } else if (type === 'side') {\n return {\n backgroundImage: [\n 'linear-gradient(to right,',\n `${solidColor} ,`,\n `${solidColor} 2px,`,\n `transparent 6px`\n ].join(' '),\n backgroundPosition: '0 0'\n }\n }\n}\n\nconst highlightClass = (user) => {\n return 'USER____' + user.screen_name\n .replace(/\\./g, '_')\n .replace(/@/g, '_AT_')\n}\n\nexport {\n highlightClass,\n highlightStyle\n}\n","import Vue from 'vue'\n\nimport './tab_switcher.scss'\n\nexport default Vue.component('tab-switcher', {\n name: 'TabSwitcher',\n props: {\n renderOnlyFocused: {\n required: false,\n type: Boolean,\n default: false\n },\n onSwitch: {\n required: false,\n type: Function,\n default: undefined\n },\n activeTab: {\n required: false,\n type: String,\n default: undefined\n },\n scrollableTabs: {\n required: false,\n type: Boolean,\n default: false\n }\n },\n data () {\n return {\n active: this.$slots.default.findIndex(_ => _.tag)\n }\n },\n computed: {\n activeIndex () {\n // In case of controlled component\n if (this.activeTab) {\n return this.$slots.default.findIndex(slot => this.activeTab === slot.key)\n } else {\n return this.active\n }\n }\n },\n beforeUpdate () {\n const currentSlot = this.$slots.default[this.active]\n if (!currentSlot.tag) {\n this.active = this.$slots.default.findIndex(_ => _.tag)\n }\n },\n methods: {\n activateTab (index) {\n return (e) => {\n e.preventDefault()\n if (typeof this.onSwitch === 'function') {\n this.onSwitch.call(null, this.$slots.default[index].key)\n }\n this.active = index\n }\n }\n },\n render (h) {\n const tabs = this.$slots.default\n .map((slot, index) => {\n if (!slot.tag) return\n const classesTab = ['tab']\n const classesWrapper = ['tab-wrapper']\n\n if (this.activeIndex === index) {\n classesTab.push('active')\n classesWrapper.push('active')\n }\n if (slot.data.attrs.image) {\n return (\n

\n )\n }\n return (\n
\n \n {slot.data.attrs.label}\n
\n )\n })\n\n const contents = this.$slots.default.map((slot, index) => {\n if (!slot.tag) return\n const active = this.activeIndex === index\n if (this.renderOnlyFocused) {\n return active\n ?
{slot}
\n :
\n }\n return
{slot}
\n })\n\n return (\n
\n
\n {tabs}\n
\n
\n {contents}\n
\n
\n )\n }\n})\n","/* eslint-env browser */\nimport statusPosterService from '../../services/status_poster/status_poster.service.js'\nimport fileSizeFormatService from '../../services/file_size_format/file_size_format.js'\n\nconst mediaUpload = {\n data () {\n return {\n uploading: false,\n uploadReady: true\n }\n },\n methods: {\n uploadFile (file) {\n const self = this\n const store = this.$store\n if (file.size > store.state.instance.uploadlimit) {\n const filesize = fileSizeFormatService.fileSizeFormat(file.size)\n const allowedsize = fileSizeFormatService.fileSizeFormat(store.state.instance.uploadlimit)\n self.$emit('upload-failed', 'file_too_big', { filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit })\n return\n }\n const formData = new FormData()\n formData.append('file', file)\n\n self.$emit('uploading')\n self.uploading = true\n\n statusPosterService.uploadMedia({ store, formData })\n .then((fileData) => {\n self.$emit('uploaded', fileData)\n self.uploading = false\n }, (error) => { // eslint-disable-line handle-callback-err\n self.$emit('upload-failed', 'default')\n self.uploading = false\n })\n },\n fileDrop (e) {\n if (e.dataTransfer.files.length > 0) {\n e.preventDefault() // allow dropping text like before\n this.uploadFile(e.dataTransfer.files[0])\n }\n },\n fileDrag (e) {\n let types = e.dataTransfer.types\n if (types.contains('Files')) {\n e.dataTransfer.dropEffect = 'copy'\n } else {\n e.dataTransfer.dropEffect = 'none'\n }\n },\n clearFile () {\n this.uploadReady = false\n this.$nextTick(() => {\n this.uploadReady = true\n })\n },\n change ({ target }) {\n for (var i = 0; i < target.files.length; i++) {\n let file = target.files[i]\n this.uploadFile(file)\n }\n }\n },\n props: [\n 'dropFiles'\n ],\n watch: {\n 'dropFiles': function (fileInfos) {\n if (!this.uploading) {\n this.uploadFile(fileInfos[0])\n }\n }\n }\n}\n\nexport default mediaUpload\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./media_upload.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./media_upload.js\"\nimport __vue_script__ from \"!!babel-loader!./media_upload.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-74382032\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./media_upload.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"media-upload\",on:{\"drop\":[function($event){$event.preventDefault();},_vm.fileDrop],\"dragover\":function($event){$event.preventDefault();return _vm.fileDrag($event)}}},[_c('label',{staticClass:\"label\",attrs:{\"title\":_vm.$t('tool_tip.media_upload')}},[(_vm.uploading)?_c('i',{staticClass:\"progress-icon icon-spin4 animate-spin\"}):_vm._e(),_vm._v(\" \"),(!_vm.uploading)?_c('i',{staticClass:\"new-icon icon-upload\"}):_vm._e(),_vm._v(\" \"),(_vm.uploadReady)?_c('input',{staticStyle:{\"position\":\"fixed\",\"top\":\"-100em\"},attrs:{\"type\":\"file\",\"multiple\":\"true\"},on:{\"change\":_vm.change}}):_vm._e()])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import * as DateUtils from 'src/services/date_utils/date_utils.js'\nimport { uniq } from 'lodash'\n\nexport default {\n name: 'PollForm',\n props: ['visible'],\n data: () => ({\n pollType: 'single',\n options: ['', ''],\n expiryAmount: 10,\n expiryUnit: 'minutes'\n }),\n computed: {\n pollLimits () {\n return this.$store.state.instance.pollLimits\n },\n maxOptions () {\n return this.pollLimits.max_options\n },\n maxLength () {\n return this.pollLimits.max_option_chars\n },\n expiryUnits () {\n const allUnits = ['minutes', 'hours', 'days']\n const expiry = this.convertExpiryFromUnit\n return allUnits.filter(\n unit => this.pollLimits.max_expiration >= expiry(unit, 1)\n )\n },\n minExpirationInCurrentUnit () {\n return Math.ceil(\n this.convertExpiryToUnit(\n this.expiryUnit,\n this.pollLimits.min_expiration\n )\n )\n },\n maxExpirationInCurrentUnit () {\n return Math.floor(\n this.convertExpiryToUnit(\n this.expiryUnit,\n this.pollLimits.max_expiration\n )\n )\n }\n },\n methods: {\n clear () {\n this.pollType = 'single'\n this.options = ['', '']\n this.expiryAmount = 10\n this.expiryUnit = 'minutes'\n },\n nextOption (index) {\n const element = this.$el.querySelector(`#poll-${index + 1}`)\n if (element) {\n element.focus()\n } else {\n // Try adding an option and try focusing on it\n const addedOption = this.addOption()\n if (addedOption) {\n this.$nextTick(function () {\n this.nextOption(index)\n })\n }\n }\n },\n addOption () {\n if (this.options.length < this.maxOptions) {\n this.options.push('')\n return true\n }\n return false\n },\n deleteOption (index, event) {\n if (this.options.length > 2) {\n this.options.splice(index, 1)\n }\n },\n convertExpiryToUnit (unit, amount) {\n // Note: we want seconds and not milliseconds\n switch (unit) {\n case 'minutes': return (1000 * amount) / DateUtils.MINUTE\n case 'hours': return (1000 * amount) / DateUtils.HOUR\n case 'days': return (1000 * amount) / DateUtils.DAY\n }\n },\n convertExpiryFromUnit (unit, amount) {\n // Note: we want seconds and not milliseconds\n switch (unit) {\n case 'minutes': return 0.001 * amount * DateUtils.MINUTE\n case 'hours': return 0.001 * amount * DateUtils.HOUR\n case 'days': return 0.001 * amount * DateUtils.DAY\n }\n },\n expiryAmountChange () {\n this.expiryAmount =\n Math.max(this.minExpirationInCurrentUnit, this.expiryAmount)\n this.expiryAmount =\n Math.min(this.maxExpirationInCurrentUnit, this.expiryAmount)\n this.updatePollToParent()\n },\n updatePollToParent () {\n const expiresIn = this.convertExpiryFromUnit(\n this.expiryUnit,\n this.expiryAmount\n )\n\n const options = uniq(this.options.filter(option => option !== ''))\n if (options.length < 2) {\n this.$emit('update-poll', { error: this.$t('polls.not_enough_options') })\n return\n }\n this.$emit('update-poll', {\n options,\n multiple: this.pollType === 'multiple',\n expiresIn\n })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./poll_form.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./poll_form.js\"\nimport __vue_script__ from \"!!babel-loader!./poll_form.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1f896331\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./poll_form.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.visible)?_c('div',{staticClass:\"poll-form\"},[_vm._l((_vm.options),function(option,index){return _c('div',{key:index,staticClass:\"poll-option\"},[_c('div',{staticClass:\"input-container\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.options[index]),expression:\"options[index]\"}],staticClass:\"poll-option-input\",attrs:{\"id\":(\"poll-\" + index),\"type\":\"text\",\"placeholder\":_vm.$t('polls.option'),\"maxlength\":_vm.maxLength},domProps:{\"value\":(_vm.options[index])},on:{\"change\":_vm.updatePollToParent,\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.stopPropagation();$event.preventDefault();return _vm.nextOption(index)},\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.options, index, $event.target.value)}}})]),_vm._v(\" \"),(_vm.options.length > 2)?_c('div',{staticClass:\"icon-container\"},[_c('i',{staticClass:\"icon-cancel\",on:{\"click\":function($event){return _vm.deleteOption(index)}}})]):_vm._e()])}),_vm._v(\" \"),(_vm.options.length < _vm.maxOptions)?_c('a',{staticClass:\"add-option faint\",on:{\"click\":_vm.addOption}},[_c('i',{staticClass:\"icon-plus\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t(\"polls.add_option\"))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"poll-type-expiry\"},[_c('div',{staticClass:\"poll-type\",attrs:{\"title\":_vm.$t('polls.type')}},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"poll-type-selector\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.pollType),expression:\"pollType\"}],staticClass:\"select\",on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.pollType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.updatePollToParent]}},[_c('option',{attrs:{\"value\":\"single\"}},[_vm._v(_vm._s(_vm.$t('polls.single_choice')))]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"multiple\"}},[_vm._v(_vm._s(_vm.$t('polls.multiple_choices')))])]),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"poll-expiry\",attrs:{\"title\":_vm.$t('polls.expiry')}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.expiryAmount),expression:\"expiryAmount\"}],staticClass:\"expiry-amount hide-number-spinner\",attrs:{\"type\":\"number\",\"min\":_vm.minExpirationInCurrentUnit,\"max\":_vm.maxExpirationInCurrentUnit},domProps:{\"value\":(_vm.expiryAmount)},on:{\"change\":_vm.expiryAmountChange,\"input\":function($event){if($event.target.composing){ return; }_vm.expiryAmount=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"expiry-unit select\"},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.expiryUnit),expression:\"expiryUnit\"}],on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.expiryUnit=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.expiryAmountChange]}},_vm._l((_vm.expiryUnits),function(unit){return _c('option',{key:unit,domProps:{\"value\":unit}},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"time.\" + unit + \"_short\"), ['']))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])])])],2):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import statusPoster from '../../services/status_poster/status_poster.service.js'\nimport MediaUpload from '../media_upload/media_upload.vue'\nimport ScopeSelector from '../scope_selector/scope_selector.vue'\nimport EmojiInput from '../emoji_input/emoji_input.vue'\nimport PollForm from '../poll/poll_form.vue'\nimport fileTypeService from '../../services/file_type/file_type.service.js'\nimport { findOffset } from '../../services/offset_finder/offset_finder.service.js'\nimport { reject, map, uniqBy } from 'lodash'\nimport suggestor from '../emoji_input/suggestor.js'\nimport { mapGetters } from 'vuex'\nimport Checkbox from '../checkbox/checkbox.vue'\n\nconst buildMentionsString = ({ user, attentions = [] }, currentUser) => {\n let allAttentions = [...attentions]\n\n allAttentions.unshift(user)\n\n allAttentions = uniqBy(allAttentions, 'id')\n allAttentions = reject(allAttentions, { id: currentUser.id })\n\n let mentions = map(allAttentions, (attention) => {\n return `@${attention.screen_name}`\n })\n\n return mentions.length > 0 ? mentions.join(' ') + ' ' : ''\n}\n\nconst PostStatusForm = {\n props: [\n 'replyTo',\n 'repliedUser',\n 'attentions',\n 'copyMessageScope',\n 'subject'\n ],\n components: {\n MediaUpload,\n EmojiInput,\n PollForm,\n ScopeSelector,\n Checkbox\n },\n mounted () {\n this.resize(this.$refs.textarea)\n const textLength = this.$refs.textarea.value.length\n this.$refs.textarea.setSelectionRange(textLength, textLength)\n\n if (this.replyTo) {\n this.$refs.textarea.focus()\n }\n },\n data () {\n const preset = this.$route.query.message\n let statusText = preset || ''\n\n const { scopeCopy } = this.$store.getters.mergedConfig\n\n if (this.replyTo) {\n const currentUser = this.$store.state.users.currentUser\n statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)\n }\n\n const scope = ((this.copyMessageScope && scopeCopy) || this.copyMessageScope === 'direct')\n ? this.copyMessageScope\n : this.$store.state.users.currentUser.default_scope\n\n const { postContentType: contentType } = this.$store.getters.mergedConfig\n\n return {\n dropFiles: [],\n submitDisabled: false,\n error: null,\n posting: false,\n highlighted: 0,\n newStatus: {\n spoilerText: this.subject || '',\n status: statusText,\n nsfw: false,\n files: [],\n poll: {},\n visibility: scope,\n contentType\n },\n caret: 0,\n pollFormVisible: false\n }\n },\n computed: {\n users () {\n return this.$store.state.users.users\n },\n userDefaultScope () {\n return this.$store.state.users.currentUser.default_scope\n },\n showAllScopes () {\n return !this.mergedConfig.minimalScopesMode\n },\n emojiUserSuggestor () {\n return suggestor({\n emoji: [\n ...this.$store.state.instance.emoji,\n ...this.$store.state.instance.customEmoji\n ],\n users: this.$store.state.users.users,\n updateUsersList: (query) => this.$store.dispatch('searchUsers', { query })\n })\n },\n emojiSuggestor () {\n return suggestor({\n emoji: [\n ...this.$store.state.instance.emoji,\n ...this.$store.state.instance.customEmoji\n ]\n })\n },\n emoji () {\n return this.$store.state.instance.emoji || []\n },\n customEmoji () {\n return this.$store.state.instance.customEmoji || []\n },\n statusLength () {\n return this.newStatus.status.length\n },\n spoilerTextLength () {\n return this.newStatus.spoilerText.length\n },\n statusLengthLimit () {\n return this.$store.state.instance.textlimit\n },\n hasStatusLengthLimit () {\n return this.statusLengthLimit > 0\n },\n charactersLeft () {\n return this.statusLengthLimit - (this.statusLength + this.spoilerTextLength)\n },\n isOverLengthLimit () {\n return this.hasStatusLengthLimit && (this.charactersLeft < 0)\n },\n minimalScopesMode () {\n return this.$store.state.instance.minimalScopesMode\n },\n alwaysShowSubject () {\n return this.mergedConfig.alwaysShowSubjectInput\n },\n postFormats () {\n return this.$store.state.instance.postFormats || []\n },\n safeDMEnabled () {\n return this.$store.state.instance.safeDM\n },\n pollsAvailable () {\n return this.$store.state.instance.pollsAvailable &&\n this.$store.state.instance.pollLimits.max_options >= 2\n },\n hideScopeNotice () {\n return this.$store.getters.mergedConfig.hideScopeNotice\n },\n pollContentError () {\n return this.pollFormVisible &&\n this.newStatus.poll &&\n this.newStatus.poll.error\n },\n ...mapGetters(['mergedConfig'])\n },\n methods: {\n postStatus (newStatus) {\n if (this.posting) { return }\n if (this.submitDisabled) { return }\n\n if (this.newStatus.status === '') {\n if (this.newStatus.files.length === 0) {\n this.error = 'Cannot post an empty status with no files'\n return\n }\n }\n\n const poll = this.pollFormVisible ? this.newStatus.poll : {}\n if (this.pollContentError) {\n this.error = this.pollContentError\n return\n }\n\n this.posting = true\n statusPoster.postStatus({\n status: newStatus.status,\n spoilerText: newStatus.spoilerText || null,\n visibility: newStatus.visibility,\n sensitive: newStatus.nsfw,\n media: newStatus.files,\n store: this.$store,\n inReplyToStatusId: this.replyTo,\n contentType: newStatus.contentType,\n poll\n }).then((data) => {\n if (!data.error) {\n this.newStatus = {\n status: '',\n spoilerText: '',\n files: [],\n visibility: newStatus.visibility,\n contentType: newStatus.contentType,\n poll: {}\n }\n this.pollFormVisible = false\n this.$refs.mediaUpload.clearFile()\n this.clearPollForm()\n this.$emit('posted')\n let el = this.$el.querySelector('textarea')\n el.style.height = 'auto'\n el.style.height = undefined\n this.error = null\n } else {\n this.error = data.error\n }\n this.posting = false\n })\n },\n addMediaFile (fileInfo) {\n this.newStatus.files.push(fileInfo)\n this.enableSubmit()\n },\n removeMediaFile (fileInfo) {\n let index = this.newStatus.files.indexOf(fileInfo)\n this.newStatus.files.splice(index, 1)\n },\n uploadFailed (errString, templateArgs) {\n templateArgs = templateArgs || {}\n this.error = this.$t('upload.error.base') + ' ' + this.$t('upload.error.' + errString, templateArgs)\n this.enableSubmit()\n },\n disableSubmit () {\n this.submitDisabled = true\n },\n enableSubmit () {\n this.submitDisabled = false\n },\n type (fileInfo) {\n return fileTypeService.fileType(fileInfo.mimetype)\n },\n paste (e) {\n this.resize(e)\n if (e.clipboardData.files.length > 0) {\n // prevent pasting of file as text\n e.preventDefault()\n // Strangely, files property gets emptied after event propagation\n // Trying to wrap it in array doesn't work. Plus I doubt it's possible\n // to hold more than one file in clipboard.\n this.dropFiles = [e.clipboardData.files[0]]\n }\n },\n fileDrop (e) {\n if (e.dataTransfer.files.length > 0) {\n e.preventDefault() // allow dropping text like before\n this.dropFiles = e.dataTransfer.files\n }\n },\n fileDrag (e) {\n e.dataTransfer.dropEffect = 'copy'\n },\n onEmojiInputInput (e) {\n this.$nextTick(() => {\n this.resize(this.$refs['textarea'])\n })\n },\n resize (e) {\n const target = e.target || e\n if (!(target instanceof window.Element)) { return }\n\n // Reset to default height for empty form, nothing else to do here.\n if (target.value === '') {\n target.style.height = null\n this.$refs['emoji-input'].resize()\n return\n }\n\n const formRef = this.$refs['form']\n const bottomRef = this.$refs['bottom']\n /* Scroller is either `window` (replies in TL), sidebar (main post form,\n * replies in notifs) or mobile post form. Note that getting and setting\n * scroll is different for `Window` and `Element`s\n */\n const bottomBottomPaddingStr = window.getComputedStyle(bottomRef)['padding-bottom']\n const bottomBottomPadding = Number(bottomBottomPaddingStr.substring(0, bottomBottomPaddingStr.length - 2))\n\n const scrollerRef = this.$el.closest('.sidebar-scroller') ||\n this.$el.closest('.post-form-modal-view') ||\n window\n\n // Getting info about padding we have to account for, removing 'px' part\n const topPaddingStr = window.getComputedStyle(target)['padding-top']\n const bottomPaddingStr = window.getComputedStyle(target)['padding-bottom']\n const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2))\n const bottomPadding = Number(bottomPaddingStr.substring(0, bottomPaddingStr.length - 2))\n const vertPadding = topPadding + bottomPadding\n\n /* Explanation:\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight\n * scrollHeight returns element's scrollable content height, i.e. visible\n * element + overscrolled parts of it. We use it to determine when text\n * inside the textarea exceeded its height, so we can set height to prevent\n * overscroll, i.e. make textarea grow with the text. HOWEVER, since we\n * explicitly set new height, scrollHeight won't go below that, so we can't\n * SHRINK the textarea when there's extra space. To workaround that we set\n * height to 'auto' which makes textarea tiny again, so that scrollHeight\n * will match text height again. HOWEVER, shrinking textarea can screw with\n * the scroll since there might be not enough padding around form-bottom to even\n * warrant a scroll, so it will jump to 0 and refuse to move anywhere,\n * so we check current scroll position before shrinking and then restore it\n * with needed delta.\n */\n\n // this part has to be BEFORE the content size update\n const currentScroll = scrollerRef === window\n ? scrollerRef.scrollY\n : scrollerRef.scrollTop\n const scrollerHeight = scrollerRef === window\n ? scrollerRef.innerHeight\n : scrollerRef.offsetHeight\n const scrollerBottomBorder = currentScroll + scrollerHeight\n\n // BEGIN content size update\n target.style.height = 'auto'\n const newHeight = target.scrollHeight - vertPadding\n target.style.height = `${newHeight}px`\n // END content size update\n\n // We check where the bottom border of form-bottom element is, this uses findOffset\n // to find offset relative to scrollable container (scroller)\n const bottomBottomBorder = bottomRef.offsetHeight + findOffset(bottomRef, scrollerRef).top + bottomBottomPadding\n\n const isBottomObstructed = scrollerBottomBorder < bottomBottomBorder\n const isFormBiggerThanScroller = scrollerHeight < formRef.offsetHeight\n const bottomChangeDelta = bottomBottomBorder - scrollerBottomBorder\n // The intention is basically this;\n // Keep form-bottom always visible so that submit button is in view EXCEPT\n // if form element bigger than scroller and caret isn't at the end, so that\n // if you scroll up and edit middle of text you won't get scrolled back to bottom\n const shouldScrollToBottom = isBottomObstructed &&\n !(isFormBiggerThanScroller &&\n this.$refs.textarea.selectionStart !== this.$refs.textarea.value.length)\n const totalDelta = shouldScrollToBottom ? bottomChangeDelta : 0\n const targetScroll = currentScroll + totalDelta\n\n if (scrollerRef === window) {\n scrollerRef.scroll(0, targetScroll)\n } else {\n scrollerRef.scrollTop = targetScroll\n }\n\n this.$refs['emoji-input'].resize()\n },\n showEmojiPicker () {\n this.$refs['textarea'].focus()\n this.$refs['emoji-input'].triggerShowPicker()\n },\n clearError () {\n this.error = null\n },\n changeVis (visibility) {\n this.newStatus.visibility = visibility\n },\n togglePollForm () {\n this.pollFormVisible = !this.pollFormVisible\n },\n setPoll (poll) {\n this.newStatus.poll = poll\n },\n clearPollForm () {\n if (this.$refs.pollForm) {\n this.$refs.pollForm.clear()\n }\n },\n dismissScopeNotice () {\n this.$store.dispatch('setOption', { name: 'hideScopeNotice', value: true })\n }\n }\n}\n\nexport default PostStatusForm\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./post_status_form.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./post_status_form.js\"\nimport __vue_script__ from \"!!babel-loader!./post_status_form.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c2ba770c\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./post_status_form.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"form\",staticClass:\"post-status-form\"},[_c('form',{attrs:{\"autocomplete\":\"off\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.postStatus(_vm.newStatus)}}},[_c('div',{staticClass:\"form-group\"},[(!_vm.$store.state.users.currentUser.locked && _vm.newStatus.visibility == 'private')?_c('i18n',{staticClass:\"visibility-notice\",attrs:{\"path\":\"post_status.account_not_locked_warning\",\"tag\":\"p\"}},[_c('router-link',{attrs:{\"to\":{ name: 'user-settings' }}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.account_not_locked_warning_link'))+\"\\n \")])],1):_vm._e(),_vm._v(\" \"),(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'public')?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.public')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();return _vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'unlisted')?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.unlisted')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();return _vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'private' && _vm.$store.state.users.currentUser.locked)?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.private')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();return _vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(_vm.newStatus.visibility === 'direct')?_c('p',{staticClass:\"visibility-notice\"},[(_vm.safeDMEnabled)?_c('span',[_vm._v(_vm._s(_vm.$t('post_status.direct_warning_to_first_only')))]):_c('span',[_vm._v(_vm._s(_vm.$t('post_status.direct_warning_to_all')))])]):_vm._e(),_vm._v(\" \"),(_vm.newStatus.spoilerText || _vm.alwaysShowSubject)?_c('EmojiInput',{staticClass:\"form-control\",attrs:{\"enable-emoji-picker\":\"\",\"suggest\":_vm.emojiSuggestor},model:{value:(_vm.newStatus.spoilerText),callback:function ($$v) {_vm.$set(_vm.newStatus, \"spoilerText\", $$v)},expression:\"newStatus.spoilerText\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.spoilerText),expression:\"newStatus.spoilerText\"}],staticClass:\"form-post-subject\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('post_status.content_warning')},domProps:{\"value\":(_vm.newStatus.spoilerText)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newStatus, \"spoilerText\", $event.target.value)}}})]):_vm._e(),_vm._v(\" \"),_c('EmojiInput',{ref:\"emoji-input\",staticClass:\"form-control main-input\",attrs:{\"suggest\":_vm.emojiUserSuggestor,\"enable-emoji-picker\":\"\",\"hide-emoji-button\":\"\",\"enable-sticker-picker\":\"\"},on:{\"input\":_vm.onEmojiInputInput,\"sticker-uploaded\":_vm.addMediaFile,\"sticker-upload-failed\":_vm.uploadFailed},model:{value:(_vm.newStatus.status),callback:function ($$v) {_vm.$set(_vm.newStatus, \"status\", $$v)},expression:\"newStatus.status\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.status),expression:\"newStatus.status\"}],ref:\"textarea\",staticClass:\"form-post-body\",attrs:{\"placeholder\":_vm.$t('post_status.default'),\"rows\":\"1\",\"disabled\":_vm.posting},domProps:{\"value\":(_vm.newStatus.status)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if(!$event.metaKey){ return null; }return _vm.postStatus(_vm.newStatus)},\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if(!$event.ctrlKey){ return null; }return _vm.postStatus(_vm.newStatus)},\"drop\":_vm.fileDrop,\"dragover\":function($event){$event.preventDefault();return _vm.fileDrag($event)},\"input\":[function($event){if($event.target.composing){ return; }_vm.$set(_vm.newStatus, \"status\", $event.target.value)},_vm.resize],\"compositionupdate\":_vm.resize,\"paste\":_vm.paste}}),_vm._v(\" \"),(_vm.hasStatusLengthLimit)?_c('p',{staticClass:\"character-counter faint\",class:{ error: _vm.isOverLengthLimit }},[_vm._v(\"\\n \"+_vm._s(_vm.charactersLeft)+\"\\n \")]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"visibility-tray\"},[_c('scope-selector',{attrs:{\"show-all\":_vm.showAllScopes,\"user-default\":_vm.userDefaultScope,\"original-scope\":_vm.copyMessageScope,\"initial-scope\":_vm.newStatus.visibility,\"on-scope-change\":_vm.changeVis}}),_vm._v(\" \"),(_vm.postFormats.length > 1)?_c('div',{staticClass:\"text-format\"},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"post-content-type\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.contentType),expression:\"newStatus.contentType\"}],staticClass:\"form-control\",attrs:{\"id\":\"post-content-type\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.newStatus, \"contentType\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.postFormats),function(postFormat){return _c('option',{key:postFormat,domProps:{\"value\":postFormat}},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"post_status.content_type[\\\"\" + postFormat + \"\\\"]\")))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]):_vm._e(),_vm._v(\" \"),(_vm.postFormats.length === 1 && _vm.postFormats[0] !== 'text/plain')?_c('div',{staticClass:\"text-format\"},[_c('span',{staticClass:\"only-format\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"post_status.content_type[\\\"\" + (_vm.postFormats[0]) + \"\\\"]\")))+\"\\n \")])]):_vm._e()],1)],1),_vm._v(\" \"),(_vm.pollsAvailable)?_c('poll-form',{ref:\"pollForm\",attrs:{\"visible\":_vm.pollFormVisible},on:{\"update-poll\":_vm.setPoll}}):_vm._e(),_vm._v(\" \"),_c('div',{ref:\"bottom\",staticClass:\"form-bottom\"},[_c('div',{staticClass:\"form-bottom-left\"},[_c('media-upload',{ref:\"mediaUpload\",staticClass:\"media-upload-icon\",attrs:{\"drop-files\":_vm.dropFiles},on:{\"uploading\":_vm.disableSubmit,\"uploaded\":_vm.addMediaFile,\"upload-failed\":_vm.uploadFailed}}),_vm._v(\" \"),_c('div',{staticClass:\"emoji-icon\"},[_c('i',{staticClass:\"icon-smile btn btn-default\",attrs:{\"title\":_vm.$t('emoji.add_emoji')},on:{\"click\":_vm.showEmojiPicker}})]),_vm._v(\" \"),(_vm.pollsAvailable)?_c('div',{staticClass:\"poll-icon\",class:{ selected: _vm.pollFormVisible }},[_c('i',{staticClass:\"icon-chart-bar btn btn-default\",attrs:{\"title\":_vm.$t('polls.add_poll')},on:{\"click\":_vm.togglePollForm}})]):_vm._e()],1),_vm._v(\" \"),(_vm.posting)?_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.posting'))+\"\\n \")]):(_vm.isOverLengthLimit)?_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.submit'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":_vm.submitDisabled,\"type\":\"submit\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.submit'))+\"\\n \")])]),_vm._v(\" \"),(_vm.error)?_c('div',{staticClass:\"alert error\"},[_vm._v(\"\\n Error: \"+_vm._s(_vm.error)+\"\\n \"),_c('i',{staticClass:\"button-icon icon-cancel\",on:{\"click\":_vm.clearError}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"attachments\"},_vm._l((_vm.newStatus.files),function(file){return _c('div',{key:file.url,staticClass:\"media-upload-wrapper\"},[_c('i',{staticClass:\"fa button-icon icon-cancel\",on:{\"click\":function($event){return _vm.removeMediaFile(file)}}}),_vm._v(\" \"),_c('div',{staticClass:\"media-upload-container attachment\"},[(_vm.type(file) === 'image')?_c('img',{staticClass:\"thumbnail media-upload\",attrs:{\"src\":file.url}}):_vm._e(),_vm._v(\" \"),(_vm.type(file) === 'video')?_c('video',{attrs:{\"src\":file.url,\"controls\":\"\"}}):_vm._e(),_vm._v(\" \"),(_vm.type(file) === 'audio')?_c('audio',{attrs:{\"src\":file.url,\"controls\":\"\"}}):_vm._e(),_vm._v(\" \"),(_vm.type(file) === 'unknown')?_c('a',{attrs:{\"href\":file.url}},[_vm._v(_vm._s(file.url))]):_vm._e()])])}),0),_vm._v(\" \"),(_vm.newStatus.files.length > 0)?_c('div',{staticClass:\"upload_settings\"},[_c('Checkbox',{model:{value:(_vm.newStatus.nsfw),callback:function ($$v) {_vm.$set(_vm.newStatus, \"nsfw\", $$v)},expression:\"newStatus.nsfw\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.attachments_sensitive'))+\"\\n \")])],1):_vm._e()],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const StillImage = {\n props: [\n 'src',\n 'referrerpolicy',\n 'mimetype',\n 'imageLoadError',\n 'imageLoadHandler'\n ],\n data () {\n return {\n stopGifs: this.$store.getters.mergedConfig.stopGifs\n }\n },\n computed: {\n animated () {\n return this.stopGifs && (this.mimetype === 'image/gif' || this.src.endsWith('.gif'))\n }\n },\n methods: {\n onLoad () {\n this.imageLoadHandler && this.imageLoadHandler(this.$refs.src)\n const canvas = this.$refs.canvas\n if (!canvas) return\n const width = this.$refs.src.naturalWidth\n const height = this.$refs.src.naturalHeight\n canvas.width = width\n canvas.height = height\n canvas.getContext('2d').drawImage(this.$refs.src, 0, 0, width, height)\n },\n onError () {\n this.imageLoadError && this.imageLoadError()\n }\n }\n}\n\nexport default StillImage\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./still-image.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./still-image.js\"\nimport __vue_script__ from \"!!babel-loader!./still-image.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1bc509fc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./still-image.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"still-image\",class:{ animated: _vm.animated }},[(_vm.animated)?_c('canvas',{ref:\"canvas\"}):_vm._e(),_vm._v(\" \"),_c('img',{key:_vm.src,ref:\"src\",attrs:{\"src\":_vm.src,\"referrerpolicy\":_vm.referrerpolicy},on:{\"load\":_vm.onLoad,\"error\":_vm.onError}})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./timeago.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./timeago.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ac499830\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./timeago.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('time',{attrs:{\"datetime\":_vm.time,\"title\":_vm.localeDateString}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(_vm.relativeTime.key, [_vm.relativeTime.num]))+\"\\n\")])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const fileSizeFormat = (num) => {\n var exponent\n var unit\n var units = ['B', 'KiB', 'MiB', 'GiB', 'TiB']\n if (num < 1) {\n return num + ' ' + units[0]\n }\n\n exponent = Math.min(Math.floor(Math.log(num) / Math.log(1024)), units.length - 1)\n num = (num / Math.pow(1024, exponent)).toFixed(2) * 1\n unit = units[exponent]\n return { num: num, unit: unit }\n}\nconst fileSizeFormatService = {\n fileSizeFormat\n}\nexport default fileSizeFormatService\n","import { debounce } from 'lodash'\n/**\n * suggest - generates a suggestor function to be used by emoji-input\n * data: object providing source information for specific types of suggestions:\n * data.emoji - optional, an array of all emoji available i.e.\n * (state.instance.emoji + state.instance.customEmoji)\n * data.users - optional, an array of all known users\n * updateUsersList - optional, a function to search and append to users\n *\n * Depending on data present one or both (or none) can be present, so if field\n * doesn't support user linking you can just provide only emoji.\n */\n\nconst debounceUserSearch = debounce((data, input) => {\n data.updateUsersList(input)\n}, 500, { leading: true, trailing: false })\n\nexport default data => input => {\n const firstChar = input[0]\n if (firstChar === ':' && data.emoji) {\n return suggestEmoji(data.emoji)(input)\n }\n if (firstChar === '@' && data.users) {\n return suggestUsers(data)(input)\n }\n return []\n}\n\nexport const suggestEmoji = emojis => input => {\n const noPrefix = input.toLowerCase().substr(1)\n return emojis\n .filter(({ displayText }) => displayText.toLowerCase().match(noPrefix))\n .sort((a, b) => {\n let aScore = 0\n let bScore = 0\n\n // An exact match always wins\n aScore += a.displayText.toLowerCase() === noPrefix ? 200 : 0\n bScore += b.displayText.toLowerCase() === noPrefix ? 200 : 0\n\n // Prioritize custom emoji a lot\n aScore += a.imageUrl ? 100 : 0\n bScore += b.imageUrl ? 100 : 0\n\n // Prioritize prefix matches somewhat\n aScore += a.displayText.toLowerCase().startsWith(noPrefix) ? 10 : 0\n bScore += b.displayText.toLowerCase().startsWith(noPrefix) ? 10 : 0\n\n // Sort by length\n aScore -= a.displayText.length\n bScore -= b.displayText.length\n\n // Break ties alphabetically\n const alphabetically = a.displayText > b.displayText ? 0.5 : -0.5\n\n return bScore - aScore + alphabetically\n })\n}\n\nexport const suggestUsers = data => input => {\n const noPrefix = input.toLowerCase().substr(1)\n const users = data.users\n\n const newUsers = users.filter(\n user =>\n user.screen_name.toLowerCase().startsWith(noPrefix) ||\n user.name.toLowerCase().startsWith(noPrefix)\n\n /* taking only 20 results so that sorting is a bit cheaper, we display\n * only 5 anyway. could be inaccurate, but we ideally we should query\n * backend anyway\n */\n ).slice(0, 20).sort((a, b) => {\n let aScore = 0\n let bScore = 0\n\n // Matches on screen name (i.e. user@instance) makes a priority\n aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0\n bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0\n\n // Matches on name takes second priority\n aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0\n bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0\n\n const diff = (bScore - aScore) * 10\n\n // Then sort alphabetically\n const nameAlphabetically = a.name > b.name ? 1 : -1\n const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1\n\n return diff + nameAlphabetically + screenNameAlphabetically\n /* eslint-disable camelcase */\n }).map(({ screen_name, name, profile_image_url_original }) => ({\n displayText: screen_name,\n detailText: name,\n imageUrl: profile_image_url_original,\n replacement: '@' + screen_name + ' '\n }))\n\n // BE search users if there are no matches\n if (newUsers.length === 0 && data.updateUsersList) {\n debounceUserSearch(data, noPrefix)\n }\n return newUsers\n /* eslint-enable camelcase */\n}\n","import { map } from 'lodash'\nimport apiService from '../api/api.service.js'\n\nconst postStatus = ({ store, status, spoilerText, visibility, sensitive, poll, media = [], inReplyToStatusId = undefined, contentType = 'text/plain' }) => {\n const mediaIds = map(media, 'id')\n\n return apiService.postStatus({\n credentials: store.state.users.currentUser.credentials,\n status,\n spoilerText,\n visibility,\n sensitive,\n mediaIds,\n inReplyToStatusId,\n contentType,\n poll })\n .then((data) => {\n if (!data.error) {\n store.dispatch('addNewStatuses', {\n statuses: [data],\n timeline: 'friends',\n showImmediately: true,\n noIdUpdate: true // To prevent missing notices on next pull.\n })\n }\n return data\n })\n .catch((err) => {\n return {\n error: err.message\n }\n })\n}\n\nconst uploadMedia = ({ store, formData }) => {\n const credentials = store.state.users.currentUser.credentials\n\n return apiService.uploadMedia({ credentials, formData })\n}\n\nconst statusPosterService = {\n postStatus,\n uploadMedia\n}\n\nexport default statusPosterService\n","export const findOffset = (child, parent, { top = 0, left = 0 } = {}, ignorePadding = true) => {\n const result = {\n top: top + child.offsetTop,\n left: left + child.offsetLeft\n }\n if (!ignorePadding && child !== window) {\n const { topPadding, leftPadding } = findPadding(child)\n result.top += ignorePadding ? 0 : topPadding\n result.left += ignorePadding ? 0 : leftPadding\n }\n\n if (child.offsetParent && (parent === window || parent.contains(child.offsetParent) || parent === child.offsetParent)) {\n return findOffset(child.offsetParent, parent, result, false)\n } else {\n if (parent !== window) {\n const { topPadding, leftPadding } = findPadding(parent)\n result.top += topPadding\n result.left += leftPadding\n }\n return result\n }\n}\n\nconst findPadding = (el) => {\n const topPaddingStr = window.getComputedStyle(el)['padding-top']\n const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2))\n const leftPaddingStr = window.getComputedStyle(el)['padding-left']\n const leftPadding = Number(leftPaddingStr.substring(0, leftPaddingStr.length - 2))\n\n return { topPadding, leftPadding }\n}\n","import { reduce, find } from 'lodash'\n\nexport const replaceWord = (str, toReplace, replacement) => {\n return str.slice(0, toReplace.start) + replacement + str.slice(toReplace.end)\n}\n\nexport const wordAtPosition = (str, pos) => {\n const words = splitIntoWords(str)\n const wordsWithPosition = addPositionToWords(words)\n\n return find(wordsWithPosition, ({ start, end }) => start <= pos && end > pos)\n}\n\nexport const addPositionToWords = (words) => {\n return reduce(words, (result, word) => {\n const data = {\n word,\n start: 0,\n end: word.length\n }\n\n if (result.length > 0) {\n const previous = result.pop()\n\n data.start += previous.end\n data.end += previous.end\n\n result.push(previous)\n }\n\n result.push(data)\n\n return result\n }, [])\n}\n\nexport const splitIntoWords = (str) => {\n // Split at word boundaries\n const regex = /\\b/\n const triggers = /[@#:]+$/\n\n let split = str.split(regex)\n\n // Add trailing @ and # to the following word.\n const words = reduce(split, (result, word) => {\n if (result.length > 0) {\n let previous = result.pop()\n const matches = previous.match(triggers)\n if (matches) {\n previous = previous.replace(triggers, '')\n word = matches[0] + word\n }\n result.push(previous)\n }\n result.push(word)\n\n return result\n }, [])\n\n return words\n}\n\nconst completion = {\n wordAtPosition,\n addPositionToWords,\n splitIntoWords,\n replaceWord\n}\n\nexport default completion\n","import Checkbox from '../checkbox/checkbox.vue'\n\n// At widest, approximately 20 emoji are visible in a row,\n// loading 3 rows, could be overkill for narrow picker\nconst LOAD_EMOJI_BY = 60\n\n// When to start loading new batch emoji, in pixels\nconst LOAD_EMOJI_MARGIN = 64\n\nconst filterByKeyword = (list, keyword = '') => {\n return list.filter(x => x.displayText.includes(keyword))\n}\n\nconst EmojiPicker = {\n props: {\n enableStickerPicker: {\n required: false,\n type: Boolean,\n default: false\n }\n },\n data () {\n return {\n keyword: '',\n activeGroup: 'custom',\n showingStickers: false,\n groupsScrolledClass: 'scrolled-top',\n keepOpen: false,\n customEmojiBufferSlice: LOAD_EMOJI_BY,\n customEmojiTimeout: null,\n customEmojiLoadAllConfirmed: false\n }\n },\n components: {\n StickerPicker: () => import('../sticker_picker/sticker_picker.vue'),\n Checkbox\n },\n methods: {\n onStickerUploaded (e) {\n this.$emit('sticker-uploaded', e)\n },\n onStickerUploadFailed (e) {\n this.$emit('sticker-upload-failed', e)\n },\n onEmoji (emoji) {\n const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement\n this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen })\n },\n onScroll (e) {\n const target = (e && e.target) || this.$refs['emoji-groups']\n this.updateScrolledClass(target)\n this.scrolledGroup(target)\n this.triggerLoadMore(target)\n },\n highlight (key) {\n const ref = this.$refs['group-' + key]\n const top = ref[0].offsetTop\n this.setShowStickers(false)\n this.activeGroup = key\n this.$nextTick(() => {\n this.$refs['emoji-groups'].scrollTop = top + 1\n })\n },\n updateScrolledClass (target) {\n if (target.scrollTop <= 5) {\n this.groupsScrolledClass = 'scrolled-top'\n } else if (target.scrollTop >= target.scrollTopMax - 5) {\n this.groupsScrolledClass = 'scrolled-bottom'\n } else {\n this.groupsScrolledClass = 'scrolled-middle'\n }\n },\n triggerLoadMore (target) {\n const ref = this.$refs['group-end-custom'][0]\n if (!ref) return\n const bottom = ref.offsetTop + ref.offsetHeight\n\n const scrollerBottom = target.scrollTop + target.clientHeight\n const scrollerTop = target.scrollTop\n const scrollerMax = target.scrollHeight\n\n // Loads more emoji when they come into view\n const approachingBottom = bottom - scrollerBottom < LOAD_EMOJI_MARGIN\n // Always load when at the very top in case there's no scroll space yet\n const atTop = scrollerTop < 5\n // Don't load when looking at unicode category or at the very bottom\n const bottomAboveViewport = bottom < scrollerTop || scrollerBottom === scrollerMax\n if (!bottomAboveViewport && (approachingBottom || atTop)) {\n this.loadEmoji()\n }\n },\n scrolledGroup (target) {\n const top = target.scrollTop + 5\n this.$nextTick(() => {\n this.emojisView.forEach(group => {\n const ref = this.$refs['group-' + group.id]\n if (ref[0].offsetTop <= top) {\n this.activeGroup = group.id\n }\n })\n })\n },\n loadEmoji () {\n const allLoaded = this.customEmojiBuffer.length === this.filteredEmoji.length\n\n if (allLoaded) {\n return\n }\n\n this.customEmojiBufferSlice += LOAD_EMOJI_BY\n },\n startEmojiLoad (forceUpdate = false) {\n if (!forceUpdate) {\n this.keyword = ''\n }\n this.$nextTick(() => {\n this.$refs['emoji-groups'].scrollTop = 0\n })\n const bufferSize = this.customEmojiBuffer.length\n const bufferPrefilledAll = bufferSize === this.filteredEmoji.length\n if (bufferPrefilledAll && !forceUpdate) {\n return\n }\n this.customEmojiBufferSlice = LOAD_EMOJI_BY\n },\n toggleStickers () {\n this.showingStickers = !this.showingStickers\n },\n setShowStickers (value) {\n this.showingStickers = value\n }\n },\n watch: {\n keyword () {\n this.customEmojiLoadAllConfirmed = false\n this.onScroll()\n this.startEmojiLoad(true)\n }\n },\n computed: {\n activeGroupView () {\n return this.showingStickers ? '' : this.activeGroup\n },\n stickersAvailable () {\n if (this.$store.state.instance.stickers) {\n return this.$store.state.instance.stickers.length > 0\n }\n return 0\n },\n filteredEmoji () {\n return filterByKeyword(\n this.$store.state.instance.customEmoji || [],\n this.keyword\n )\n },\n customEmojiBuffer () {\n return this.filteredEmoji.slice(0, this.customEmojiBufferSlice)\n },\n emojis () {\n const standardEmojis = this.$store.state.instance.emoji || []\n const customEmojis = this.customEmojiBuffer\n\n return [\n {\n id: 'custom',\n text: this.$t('emoji.custom'),\n icon: 'icon-smile',\n emojis: customEmojis\n },\n {\n id: 'standard',\n text: this.$t('emoji.unicode'),\n icon: 'icon-picture',\n emojis: filterByKeyword(standardEmojis, this.keyword)\n }\n ]\n },\n emojisView () {\n return this.emojis.filter(value => value.emojis.length > 0)\n },\n stickerPickerEnabled () {\n return (this.$store.state.instance.stickers || []).length !== 0\n }\n }\n}\n\nexport default EmojiPicker\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./emoji_picker.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./emoji_picker.js\"\nimport __vue_script__ from \"!!babel-loader!./emoji_picker.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-47d21b3b\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./emoji_picker.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"emoji-picker panel panel-default panel-body\"},[_c('div',{staticClass:\"heading\"},[_c('span',{staticClass:\"emoji-tabs\"},_vm._l((_vm.emojis),function(group){return _c('span',{key:group.id,staticClass:\"emoji-tabs-item\",class:{\n active: _vm.activeGroupView === group.id,\n disabled: group.emojis.length === 0\n },attrs:{\"title\":group.text},on:{\"click\":function($event){$event.preventDefault();return _vm.highlight(group.id)}}},[_c('i',{class:group.icon})])}),0),_vm._v(\" \"),(_vm.stickerPickerEnabled)?_c('span',{staticClass:\"additional-tabs\"},[_c('span',{staticClass:\"stickers-tab-icon additional-tabs-item\",class:{active: _vm.showingStickers},attrs:{\"title\":_vm.$t('emoji.stickers')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleStickers($event)}}},[_c('i',{staticClass:\"icon-star\"})])]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('div',{staticClass:\"emoji-content\",class:{hidden: _vm.showingStickers}},[_c('div',{staticClass:\"emoji-search\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.keyword),expression:\"keyword\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('emoji.search_emoji')},domProps:{\"value\":(_vm.keyword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.keyword=$event.target.value}}})]),_vm._v(\" \"),_c('div',{ref:\"emoji-groups\",staticClass:\"emoji-groups\",class:_vm.groupsScrolledClass,on:{\"scroll\":_vm.onScroll}},_vm._l((_vm.emojisView),function(group){return _c('div',{key:group.id,staticClass:\"emoji-group\"},[_c('h6',{ref:'group-' + group.id,refInFor:true,staticClass:\"emoji-group-title\"},[_vm._v(\"\\n \"+_vm._s(group.text)+\"\\n \")]),_vm._v(\" \"),_vm._l((group.emojis),function(emoji){return _c('span',{key:group.id + emoji.displayText,staticClass:\"emoji-item\",attrs:{\"title\":emoji.displayText},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.onEmoji(emoji)}}},[(!emoji.imageUrl)?_c('span',[_vm._v(_vm._s(emoji.replacement))]):_c('img',{attrs:{\"src\":emoji.imageUrl}})])}),_vm._v(\" \"),_c('span',{ref:'group-end-' + group.id,refInFor:true})],2)}),0),_vm._v(\" \"),_c('div',{staticClass:\"keep-open\"},[_c('Checkbox',{model:{value:(_vm.keepOpen),callback:function ($$v) {_vm.keepOpen=$$v},expression:\"keepOpen\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.keep_open'))+\"\\n \")])],1)]),_vm._v(\" \"),(_vm.showingStickers)?_c('div',{staticClass:\"stickers-content\"},[_c('sticker-picker',{on:{\"uploaded\":_vm.onStickerUploaded,\"upload-failed\":_vm.onStickerUploadFailed}})],1):_vm._e()])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Completion from '../../services/completion/completion.js'\nimport EmojiPicker from '../emoji_picker/emoji_picker.vue'\nimport { take } from 'lodash'\nimport { findOffset } from '../../services/offset_finder/offset_finder.service.js'\n\n/**\n * EmojiInput - augmented inputs for emoji and autocomplete support in inputs\n * without having to give up the comfort of and