Commit c9399f50 authored by Lukas Fülling's avatar Lukas Fülling

Merge branch 'master' of github.com:tootsuite/mastodon

parents 7fc325ea fbff73ec
......@@ -3,6 +3,18 @@ Changelog
All notable changes to this project will be documented in this file.
## [2.8.2] - 2019-05-05
### Added
- Add `SOURCE_TAG` environment variable ([ushitora-anqou](https://github.com/tootsuite/mastodon/pull/10698))
### Fixed
- Fix cropped hero image on frontpage ([BaptisteGelez](https://github.com/tootsuite/mastodon/pull/10702))
- Fix blurhash gem not compiling on some operating systems ([Gargron](https://github.com/tootsuite/mastodon/pull/10700))
- Fix unexpected CSS animations in some browsers ([ThibG](https://github.com/tootsuite/mastodon/pull/10699))
- Fix closing video modal scrolling timelines to top ([ThibG](https://github.com/tootsuite/mastodon/pull/10695))
## [2.8.1] - 2019-05-04
### Added
......
......@@ -116,7 +116,7 @@ group :test do
gem 'rspec-sidekiq', '~> 3.0'
gem 'simplecov', '~> 0.16', require: false
gem 'webmock', '~> 3.5'
gem 'parallel_tests', '~> 2.28'
gem 'parallel_tests', '~> 2.29'
end
group :development do
......
......@@ -99,7 +99,7 @@ GEM
rack (>= 0.9.0)
binding_of_caller (0.8.0)
debug_inspector (>= 0.0.1)
blurhash (0.1.2)
blurhash (0.1.3)
ffi (~> 1.10.0)
bootsnap (1.4.4)
msgpack (~> 1.0)
......@@ -393,7 +393,7 @@ GEM
av (~> 0.9.0)
paperclip (>= 2.5.2)
parallel (1.17.0)
parallel_tests (2.28.0)
parallel_tests (2.29.0)
parallel
parser (2.6.3.0)
ast (~> 2.4.0)
......@@ -478,7 +478,7 @@ GEM
link_header (~> 0.0, >= 0.0.8)
rdf-normalize (0.3.3)
rdf (>= 2.2, < 4.0)
redis (4.1.0)
redis (4.1.1)
redis-actionpack (5.0.2)
actionpack (>= 4.0, < 6)
redis-rack (>= 1, < 3)
......@@ -724,7 +724,7 @@ DEPENDENCIES
ox (~> 2.10)
paperclip (~> 6.0)
paperclip-av-transcoder (~> 0.6)
parallel_tests (~> 2.28)
parallel_tests (~> 2.29)
pg (~> 1.1)
pghero (~> 2.2)
pkg-config (~> 1.3)
......
......@@ -88,6 +88,7 @@ export default class MediaItem extends ImmutablePureComponent {
const width = `${Math.floor((displayWidth - 4) / 3) - 4}px`;
const height = width;
const status = attachment.get('status');
const title = status.get('spoiler_text') || attachment.get('description');
let thumbnail = '';
......@@ -133,7 +134,7 @@ export default class MediaItem extends ImmutablePureComponent {
return (
<div className='account-gallery__item' style={{ width, height }}>
<a className='media-gallery__item-thumbnail' href={status.get('url')} target='_blank' style={{ cursor: 'pointer' }} onClick={this.handleClick}>
<a className='media-gallery__item-thumbnail' href={status.get('url')} target='_blank' onClick={this.handleClick} title={title}>
<canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />
{visible && thumbnail}
</a>
......
......@@ -47,7 +47,8 @@ import {
Lists,
} from './util/async-components';
import { me } from '../../initial_state';
import { previewState } from './components/media_modal';
import { previewState as previewMediaState } from './components/media_modal';
import { previewState as previewVideoState } from './components/video_modal';
// Dummy import, to make sure that <Status /> ends up in the application bundle.
// Without this it ends up in ~8 very commonly used bundles.
......@@ -122,7 +123,7 @@ class SwitchingColumnsArea extends React.PureComponent {
}
shouldUpdateScroll (_, { location }) {
return location.state !== previewState;
return location.state !== previewMediaState && location.state !== previewVideoState;
}
handleResize = debounce(() => {
......
......@@ -17,7 +17,7 @@
"account.hide_reblogs": "Amaga els impulsos de @{name}",
"account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}",
"account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.",
"account.media": "Media",
"account.media": "Mèdia",
"account.mention": "Esmentar @{name}",
"account.moved_to": "{name} s'ha mogut a:",
"account.mute": "Silencia @{name}",
......@@ -77,6 +77,7 @@
"compose_form.poll.remove_option": "Elimina aquesta opció",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.hide": "Marcar mèdia com a sensible",
"compose_form.sensitive.marked": "Mèdia marcat com a sensible",
"compose_form.sensitive.unmarked": "Mèdia no està marcat com a sensible",
"compose_form.spoiler.marked": "Text es ocult sota l'avís",
......@@ -85,7 +86,7 @@
"confirmation_modal.cancel": "Cancel·la",
"confirmations.block.block_and_report": "Block & Report",
"confirmations.block.confirm": "Bloca",
"confirmations.block.message": "Estàs segur que vols blocar {name}?",
"confirmations.block.message": "Estàs segur que vols bloquejar a {name}?",
"confirmations.delete.confirm": "Suprimeix",
"confirmations.delete.message": "Estàs segur que vols suprimir aquest estat?",
"confirmations.delete_list.confirm": "Suprimeix",
......@@ -125,7 +126,7 @@
"empty_column.favourited_statuses": "Encara no tens cap toot favorit. Quan en tinguis, apareixerà aquí.",
"empty_column.favourites": "Encara ningú ha marcat aquest toot com a favorit. Quan algú ho faci, apareixera aquí.",
"empty_column.follow_requests": "Encara no teniu cap petició de seguiment. Quan rebeu una, apareixerà aquí.",
"empty_column.hashtag": "Encara no hi ha res amb aquesta etiqueta.",
"empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
"empty_column.home": "Encara no segueixes ningú. Visita {public} o fes cerca per començar i conèixer altres usuaris.",
"empty_column.home.public_timeline": "la línia de temps pública",
"empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin nous estats, apareixeran aquí.",
......@@ -209,6 +210,7 @@
"lightbox.close": "Tancar",
"lightbox.next": "Següent",
"lightbox.previous": "Anterior",
"lightbox.view_context": "Veure el context",
"lists.account.add": "Afegir a la llista",
"lists.account.remove": "Treure de la llista",
"lists.delete": "Delete list",
......@@ -340,7 +342,6 @@
"status.reply": "Respondre",
"status.replyAll": "Respondre al tema",
"status.report": "Informar sobre @{name}",
"status.sensitive_toggle": "Clic per veure",
"status.sensitive_warning": "Contingut sensible",
"status.share": "Compartir",
"status.show_less": "Mostra menys",
......
......@@ -77,6 +77,7 @@
"compose_form.poll.remove_option": "Odstranit tuto volbu",
"compose_form.publish": "Tootnout",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.hide": "Označit média jako citlivá",
"compose_form.sensitive.marked": "Média jsou označena jako citlivá",
"compose_form.sensitive.unmarked": "Média nejsou označena jako citlivá",
"compose_form.spoiler.marked": "Text je skrytý za varováním",
......@@ -209,6 +210,7 @@
"lightbox.close": "Zavřít",
"lightbox.next": "Další",
"lightbox.previous": "Předchozí",
"lightbox.view_context": "Zobrazit kontext",
"lists.account.add": "Přidat do seznamu",
"lists.account.remove": "Odebrat ze seznamu",
"lists.delete": "Smazat seznam",
......
......@@ -180,10 +180,6 @@
{
"defaultMessage": "Media hidden",
"id": "status.media_hidden"
},
{
"defaultMessage": "Click to view",
"id": "status.sensitive_toggle"
}
],
"path": "app/javascript/mastodon/components/media_gallery.json"
......@@ -1108,6 +1104,10 @@
{
"defaultMessage": "Media is not marked as sensitive",
"id": "compose_form.sensitive.unmarked"
},
{
"defaultMessage": "Mark media as sensitive",
"id": "compose_form.sensitive.hide"
}
],
"path": "app/javascript/mastodon/features/compose/containers/sensitive_button_container.json"
......@@ -2261,6 +2261,10 @@
{
"defaultMessage": "Next",
"id": "lightbox.next"
},
{
"defaultMessage": "View context",
"id": "lightbox.view_context"
}
],
"path": "app/javascript/mastodon/features/ui/components/media_modal.json"
......@@ -2353,6 +2357,15 @@
],
"path": "app/javascript/mastodon/features/ui/components/upload_area.json"
},
{
"descriptors": [
{
"defaultMessage": "View context",
"id": "lightbox.view_context"
}
],
"path": "app/javascript/mastodon/features/ui/components/video_modal.json"
},
{
"descriptors": [
{
......@@ -2407,10 +2420,6 @@
{
"defaultMessage": "Media hidden",
"id": "status.media_hidden"
},
{
"defaultMessage": "Click to view",
"id": "status.sensitive_toggle"
}
],
"path": "app/javascript/mastodon/features/video/index.json"
......
......@@ -77,6 +77,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.hide": "Mark media as sensitive",
"compose_form.sensitive.marked": "Media is marked as sensitive",
"compose_form.sensitive.unmarked": "Media is not marked as sensitive",
"compose_form.spoiler.marked": "Text is hidden behind warning",
......@@ -209,6 +210,7 @@
"lightbox.close": "Close",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
"lightbox.view_context": "View context",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
......@@ -340,7 +342,6 @@
"status.reply": "Reply",
"status.replyAll": "Reply to thread",
"status.report": "Report @{name}",
"status.sensitive_toggle": "Click to view",
"status.sensitive_warning": "Sensitive content",
"status.share": "Share",
"status.show_less": "Show less",
......
......@@ -77,6 +77,7 @@
"compose_form.poll.remove_option": "この項目を削除",
"compose_form.publish": "トゥート",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.hide": "メディアを閲覧注意にする",
"compose_form.sensitive.marked": "メディアに閲覧注意が設定されています",
"compose_form.sensitive.unmarked": "メディアに閲覧注意が設定されていません",
"compose_form.spoiler.marked": "閲覧注意が設定されています",
......@@ -209,6 +210,7 @@
"lightbox.close": "閉じる",
"lightbox.next": "次",
"lightbox.previous": "前",
"lightbox.view_context": "トゥートを表示",
"lists.account.add": "リストに追加",
"lists.account.remove": "リストから外す",
"lists.delete": "リストを削除",
......@@ -340,7 +342,6 @@
"status.reply": "返信",
"status.replyAll": "全員に返信",
"status.report": "@{name}さんを通報",
"status.sensitive_toggle": "クリックして表示",
"status.sensitive_warning": "閲覧注意",
"status.share": "共有",
"status.show_less": "隠す",
......
......@@ -77,6 +77,7 @@
"compose_form.poll.remove_option": "Deze keuze verwijderen",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.hide": "Media als gevoelig markeren",
"compose_form.sensitive.marked": "Media is als gevoelig gemarkeerd",
"compose_form.sensitive.unmarked": "Media is niet als gevoelig gemarkeerd",
"compose_form.spoiler.marked": "Tekst is achter een waarschuwing verborgen",
......
......@@ -50,6 +50,7 @@ $content-width: 840px;
color: $darker-text-color;
text-decoration: none;
transition: all 200ms linear;
transition-property: color, background-color;
border-radius: 4px 0 0 4px;
i.fa {
......@@ -60,6 +61,7 @@ $content-width: 840px;
color: $primary-text-color;
background-color: darken($ui-base-color, 5%);
transition: all 100ms linear;
transition-property: color, background-color;
}
&.selected {
......
......@@ -1980,6 +1980,7 @@ a.account__display-name {
font-weight: 500;
border-bottom: 2px solid lighten($ui-base-color, 8%);
transition: all 50ms linear;
transition-property: border-bottom, background, color;
.fa {
font-weight: 400;
......@@ -2145,7 +2146,7 @@ a.account__display-name {
padding: 0;
border-radius: 30px;
background-color: $ui-base-color;
transition: all 0.2s ease;
transition: background-color 0.2s ease;
}
.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {
......@@ -2198,7 +2199,6 @@ a.account__display-name {
}
.react-toggle-thumb {
transition: all 0.5s cubic-bezier(0.23, 1, 0.32, 1) 0ms;
position: absolute;
top: 1px;
left: 1px;
......@@ -2209,6 +2209,7 @@ a.account__display-name {
background-color: darken($simple-background-color, 2%);
box-sizing: border-box;
transition: all 0.25s ease;
transition-property: border-color, left;
}
.react-toggle--checked .react-toggle-thumb {
......@@ -3603,6 +3604,7 @@ a.status-card.compact:hover {
display: inline-block;
opacity: 0;
transition: all 100ms linear;
transition-property: transform, opacity;
font-size: 18px;
width: 18px;
height: 18px;
......
......@@ -4,7 +4,6 @@
&__img {
width: 100%;
height: 167px;
position: relative;
overflow: hidden;
border-radius: 4px 4px 0 0;
......
......@@ -270,6 +270,7 @@ ca:
created_msg: El bloqueig de domini ara s'està processant
destroyed_msg: El bloqueig de domini s'ha desfet
domain: Domini
existing_domain_block_html: Ja has imposat uns limits més estrictes a %{name}, l'hauries de <a href="%{unblock_url}">desbloquejar-lo</a> primer.
new:
create: Crea un bloqueig
hint: El bloqueig de domini no impedirà la creació de nous comptes en la base de dades, però s'aplicaran de manera retroactiva mètodes de moderació específics sobre aquests comptes.
......@@ -656,7 +657,7 @@ ca:
invalid_token: Els tokens de Keybase són hashs de signatures i han de tenir 66 caràcters hexadecimals
verification_failed: Keybase no reconeix aquest token com a signatura del usuari de Keybase %{kb_username}. Si us plau prova des de Keybase.
wrong_user: No es pot crear una prova per a %{proving} mentre es connectava com a %{current}. Inicia sessió com a %{proving} i prova de nou.
explanation_html: Aquí pots connectar criptogràficament les teves altres identitats com ara el teu perfil de Keybase. Això permet que altres persones t'envïin missatges xifrats i continguts de confiança que els hi enviess.
explanation_html: Aquí pots connectar criptogràficament les teves altres identitats com ara el teu perfil de Keybase. Això permet que altres persones t'envïin missatges xifrats i confiar en el contingut que els hi envies.
i_am_html: Sóc %{username} a %{service}.
identity: Identitat
inactive: Inactiu
......@@ -676,7 +677,7 @@ ca:
blocking: Llista de blocats
domain_blocking: Llistat de dominis bloquejats
following: Llista de seguits
muting: Llista d'apagats
muting: Llista de silenciats
upload: Carregar
in_memoriam_html: En Memòria.
invites:
......@@ -779,7 +780,7 @@ ca:
preferences:
languages: Llengues
other: Altre
publishing: Publicació
publishing: Publicant
web: Web
relationships:
activity: Activitat del compte
......@@ -923,7 +924,7 @@ ca:
sensitive_content: Contingut sensible
terms:
body_html: |
<h2>Privacy Policy</h2>
<h2>Política de Privacitat</h2>
<h3 id="collect">Quina informació recollim?</h3>
<ul>
......
......@@ -270,6 +270,7 @@ co:
created_msg: U blucchime di u duminiu hè attivu
destroyed_msg: U blucchime di u duminiu ùn hè più attivu
domain: Duminiu
existing_domain_block_html: Avete digià impostu limite più strette nant'à %{name}, duvete <a href="%{unblock_url}">sbluccallu</a> primu.
new:
create: Creà un blucchime
hint: U blucchime di duminiu ùn impedirà micca a creazione di conti indè a database, mà metudi di muderazione specifiche saranu applicati.
......
......@@ -273,6 +273,7 @@ cs:
created_msg: Blokace domény se právě vyřizuje
destroyed_msg: Blokace domény byla zrušena
domain: Doména
existing_domain_block_html: Pro účet %{name} jste již nastavil/a přísnější omezení, musíte jej nejdříve <a href="%{unblock_url}">odblokovat</a>.
new:
create: Vytvořit blokaci
hint: Blokace domény nezakáže vytváření záznamů účtů v databázi, ale bude na tyto účty zpětně a automaticky aplikovat specifické metody moderování.
......
......@@ -12,7 +12,7 @@ ja:
last_attempt: あと1回失敗するとアカウントがロックされます。
locked: アカウントはロックされました。
not_found_in_database: "%{authentication_keys}かパスワードが誤っています。"
pending: あなたのアカウントはまだ審査中です。
pending: あなたのアカウントはまだ承認待ちです。
timeout: セッションの有効期限が切れました。続行するには再度ログインしてください。
unauthenticated: 続行するにはログインするか、アカウントを作成してください。
unconfirmed: 続行するにはメールアドレスを確認する必要があります。
......
......@@ -20,7 +20,7 @@ ja:
extended_description_html: |
<h3>ルールを書くのに適した場所</h3>
<p>詳細説明が設定されていません。</p>
federation_hint_html: "%{instance} にアカウントがあればどの互換性のあるサーバーのユーザーでもフォローできるでしょう。"
federation_hint_html: "%{instance} のアカウントひとつでどんなMastodon互換サーバーのユーザーでもフォローできるでしょう。"
generic_description: "%{domain} は、Mastodon サーバーの一つです"
get_apps: モバイルアプリを試す
hosted_on: Mastodon hosted on %{domain}
......@@ -269,6 +269,7 @@ ja:
created_msg: ドメインブロック処理を完了しました
destroyed_msg: ドメインブロックを外しました
domain: ドメイン
existing_domain_block_html: 既に%{name}に対しより厳しい制限を課しています 。まずは<a href="%{unblock_url}">それを解除する</a>必要があります。
new:
create: ブロックを作成
hint: ドメインブロックはデータベース中のアカウント項目の作成を妨げませんが、遡って自動的に指定されたモデレーションをそれらのアカウントに適用します。
......@@ -659,7 +660,7 @@ ja:
i_am_html: I am %{username} on %{service}.
identity: Identity
inactive: 非アクティブ
publicize_checkbox: 'そしてこれをトゥートしてください:'
publicize_checkbox: 'そしてこれをトゥートします:'
publicize_toot: 'It is proven! I am %{username} on %{service}: %{url}'
status: 認証状態
view_proof: 証明を表示
......@@ -1049,21 +1050,21 @@ ja:
suspend: アカウントが停止されました
welcome:
edit_profile_action: プロフィールを設定
edit_profile_step: バター画像やヘッダー画像をアップロードしたり、表示名やその他プロフィールを変更しカスタマイズすることができます。新しいフォロワーからのフォローを許可する前に検討したい場合、アカウントを承認制にすることができます。
edit_profile_step: イコンやヘッダーの画像をアップロードしたり、表示名を変更したりして、自分のプロフィールをカスタマイズすることができます。また、誰かからの新規フォローを許可する前にその人の様子を見ておきたい場合、アカウントを承認制にすることもできます。
explanation: 始めるにあたってのアドバイスです
final_action: 始めましょう
final_step: 'さあ始めましょう! たとえフォロワーがいなくても、あなたの公開した投稿はローカルタイムラインやハッシュタグなどで誰かの目に止まるかもしれません。自己紹介をしたい時は #introductions ハッシュタグを使うといいかもしれません。'
full_handle: あなたの正式なユーザー
full_handle_hint: これは別のサーバーからフォローしてもらったりメッセージのやり取りをする際に、友達に伝えるといいでしょう
final_step: 'さあ、始めましょう! たとえフォロワーがまだいなくても、あなたの公開した投稿はローカルタイムラインやハッシュタグなどを通じて誰かの目にとまるはずです。自己紹介をしたいときには #introductions ハッシュタグが便利かもしれません。'
full_handle: あなたの正式なユーザーID
full_handle_hint: 別のサーバーの友達とフォローやメッセージをやり取りする際には、これを伝えることになります
review_preferences_action: 設定の変更
review_preferences_step: 受け取りたいメールや投稿の公開範囲などの設定を必ず行ってください。不快でないならアニメーション GIF の自動再生を有効にすることもできます
review_preferences_step: 受け取りたいメールの種類や投稿のデフォルト公開範囲など、ユーザー設定を必ず済ませておきましょう。目が回らない自信があるなら、アニメーション GIF を自動再生する設定もご検討ください
subject: Mastodon へようこそ
tip_federated_timeline: 連合タイムラインは Mastodon ネットワークの流れを見られるものです。ただしあなたと同じサーバーの人がフォローしている人だけが含まれるので、それが全てではありません。
tip_following: 標準では自動でサーバーの管理者をフォローしています。もっと興味のある人たちを見つけるには、ローカルタイムラインと連合タイムラインを確認してください
tip_local_timeline: ローカルタイムラインは %{instance} にいる人々の流れを見られるものです。彼らはあなたと同じサーバーにいる隣人のようなものです!
tip_mobile_webapp: もしモバイル端末のブラウザで Mastodon をホーム画面に追加できる場合、プッシュ通知を受け取ることができます。それはまるでネイティブアプリのように動作します!
tip_federated_timeline: 連合タイムラインは、Mastodon ネットワークによる巨大流しそうめんです。ただし、あなたの「隣人」達がフォローしている人々だけが流れてくる場所なので、決してそこに全てがあるわけではありません。
tip_following: 最初は、サーバーの管理者をフォローした状態になっています。もっと興味のある人たちを見つけるには、ローカルタイムラインと連合タイムラインを確認してみましょう
tip_local_timeline: ローカルタイムラインには、%{instance} にいる人々が流しそうめんのごとく流れてきます。彼らはあなたと同じサーバーに暮らす、愛すべき隣人です!
tip_mobile_webapp: お使いのモバイル端末で、ブラウザから Mastodon をホーム画面に追加できますか? もし追加できる場合、プッシュ通知の受け取りなど、まるで「普通の」アプリのような機能が楽しめます!
tips: 豆知識
title: ようこそ、%{name}
title: ようこそ、%{name}!
users:
follow_limit_reached: あなたは現在 %{limit} 人以上フォローできません
invalid_email: メールアドレスが無効です
......
......@@ -268,10 +268,11 @@ sk:
week_users_active: aktívni tento týždeň
week_users_new: užívateľov počas tohto týždňa
domain_blocks:
add_new: Pridaj nové doménové blokovanie
add_new: Blokuj novú doménu
created_msg: Doména je v štádiu blokovania
destroyed_msg: Blokovanie domény bolo zrušené
domain: Doména
existing_domain_block_html: Pre účet %{name} si už nahodil/a přísnejšie obmedzenie, najskôr ho teda musíš <a href="%{unblock_url}">odblokovať</a>.
new:
create: Vytvor blokovanie domény
hint: Blokovanie domény stále dovolí vytvárať nové účty v databázi, ale tieto budú spätne automaticky moderované.
......@@ -299,7 +300,7 @@ sk:
silence: Zruš stíšenie všetkých existujúcich účtov z tejto domény
suspend: Zruš suspendáciu všetkých existujúcich účtov z tejto domény
title: Zruš blokovanie domény %{domain}
undo: Vrátiť späť
undo: Vráť späť
undo: Odvolaj blokovanie domény
email_domain_blocks:
add_new: Pridaj nový
......
......@@ -13,7 +13,7 @@ module Mastodon
end
def patch
1
2
end
def pre
......@@ -42,7 +42,7 @@ module Mastodon
# specify git tag or commit hash here
def source_tag
nil
ENV.fetch('SOURCE_TAG') { nil }
end
def source_url
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment