diff --git a/Credits.txt b/Credits.txt index 0a2420e9..719a06a1 100644 --- a/Credits.txt +++ b/Credits.txt @@ -346,7 +346,7 @@ Web Push Library for PHP Whoops Description: Provides error handling for development mode Location: dev/Whoops - Included Version: 2.15.2 + Included Version: 2.16.0 Website: http://filp.github.io/whoops/ License: https://github.com/filp/whoops/blob/master/LICENSE.md diff --git a/applications/blog/data/javascript.xml b/applications/blog/data/javascript.xml index 9071a8f0..728e8c41 100644 --- a/applications/blog/data/javascript.xml +++ b/applications/blog/data/javascript.xml @@ -1,6 +1,6 @@ - - \ "); diff --git a/applications/blog/data/lang.xml b/applications/blog/data/lang.xml index fc615fd3..65901663 100644 --- a/applications/blog/data/lang.xml +++ b/applications/blog/data/lang.xml @@ -1,6 +1,6 @@ - + Blogs Blogs a comment on a blog entry diff --git a/applications/blog/data/theme.xml b/applications/blog/data/theme.xml index dac7e776..9ac84a3a 100644 --- a/applications/blog/data/theme.xml +++ b/applications/blog/data/theme.xml @@ -374,7 +374,7 @@ {{if !( $blog->owner() instanceof \IPS\Member )}} -

{lang="byline" htmlsprintf="trim( $blog->latestEntry()->author()->link() )"} {datetime="$blog->latestEntry()->date"}

+

{lang="byline_name_date" htmlsprintf="trim( $blog->latestEntry()->author()->link() ), \IPS\DateTime::ts( $blog->latestEntry()->date )->html(TRUE)"} {datetime=""}

{{endif}} @@ -1018,21 +1018,21 @@ {template="userPhoto" app="core" params="$entry->author(), 'mini'" group="global"}

- {{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}} - {{if $entry->prefix()}} - {template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"} - {{endif}} - - canEdit()}}{lang="click_hold_edit"}{{endif}}" {{if $entry->canEdit()}}data-role="editableTitle"{{endif}}> - {{if $entry->unread()}} -
- {{endif}} - {$entry->name} -
-
+
+ {{foreach $entry->badges() as $badge}}{$badge|raw}{{endforeach}} + {{if $entry->prefix()}} + {template="prefix" group="global" app="core" params="$entry->prefix( TRUE ), $entry->prefix()"} + {{endif}} +
+ canEdit()}}{lang="click_hold_edit"}{{endif}}" {{if $entry->canEdit()}}data-role="editableTitle"{{endif}}> + {{if $entry->unread()}} +
+ {{endif}} + {$entry->name} +

@@ -1627,9 +1627,6 @@ {{foreach $blog->latestEntry()->badges() as $badge}}{$badge|raw}{{endforeach}} - {{if $blog->latestEntry()->unread()}} - - {{endif}} {$blog->latestEntry()->name} @@ -1657,16 +1654,13 @@
  • {template="userPhoto" app="core" params="$entry->author(), 'fluid'" group="global"}
    -

    - {{if $entry->unread()}} - - {{endif}} +

    {$entry->name}

    {{if !( $blog->owner() instanceof \IPS\Member )}} -

    {lang="byline" htmlsprintf="trim( $blog->latestEntry()->author()->link() )"} {datetime="$blog->latestEntry()->date"}

    +

    {lang="byline_name_date" htmlsprintf="trim( $blog->latestEntry()->author()->link() ), \IPS\DateTime::ts( $blog->latestEntry()->date )->html(TRUE)"}

    {{endif}}
  • diff --git a/applications/blog/data/versions.json b/applications/blog/data/versions.json index 2c69c0f9..052c0a7a 100644 --- a/applications/blog/data/versions.json +++ b/applications/blog/data/versions.json @@ -281,5 +281,7 @@ "5000029": "5.0.0 Beta 3", "5000030": "5.0.0 Beta 4", "5000031": "5.0.0 Beta 5", - "5000032": "5.0.0 Beta 6" + "5000032": "5.0.0 Beta 6", + "5000033": "5.0.0 Beta 7", + "5000034": "5.0.0 Beta 7" } \ No newline at end of file diff --git a/applications/blog/setup/upg_5000033/data.json b/applications/blog/setup/upg_5000033/data.json new file mode 100644 index 00000000..18e84531 --- /dev/null +++ b/applications/blog/setup/upg_5000033/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000033, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": true, + "themeeditor": true, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/blog/setup/upg_5000033/theme.json b/applications/blog/setup/upg_5000033/theme.json new file mode 100644 index 00000000..65330ee0 --- /dev/null +++ b/applications/blog/setup/upg_5000033/theme.json @@ -0,0 +1,21 @@ +{ + "html": { + "added": [], + "edited": [ + "front\/browse\/rows", + "front\/view\/blogViewMedium", + "front\/widgets\/blogs" + ], + "removed": [] + }, + "css": { + "added": [], + "edited": [], + "removed": [] + }, + "resources": { + "added": [], + "edited": [], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/blog/setup/upg_5000033/themeeditor.json b/applications/blog/setup/upg_5000033/themeeditor.json new file mode 100644 index 00000000..6493d217 --- /dev/null +++ b/applications/blog/setup/upg_5000033/themeeditor.json @@ -0,0 +1,14 @@ +{ + "categories": { + "added": [], + "edited": [], + "removed": [] + }, + "settings": { + "added": [], + "edited": [ + "layout_blog_view" + ], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/blog/setup/upg_5000034/data.json b/applications/blog/setup/upg_5000034/data.json new file mode 100644 index 00000000..b770b51b --- /dev/null +++ b/applications/blog/setup/upg_5000034/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000034, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": false, + "themeeditor": true, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/blog/setup/upg_5000034/themeeditor.json b/applications/blog/setup/upg_5000034/themeeditor.json new file mode 100644 index 00000000..6493d217 --- /dev/null +++ b/applications/blog/setup/upg_5000034/themeeditor.json @@ -0,0 +1,14 @@ +{ + "categories": { + "added": [], + "edited": [], + "removed": [] + }, + "settings": { + "added": [], + "edited": [ + "layout_blog_view" + ], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/calendar/data/javascript.xml b/applications/calendar/data/javascript.xml index 11b891ee..2903b917 100644 --- a/applications/calendar/data/javascript.xml +++ b/applications/calendar/data/javascript.xml @@ -1,6 +1,6 @@ - - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -2113,7 +2113,7 @@ var PER_PAGE = 16; }); }(jQuery, _)); - \ ");]]> -
    diff --git a/applications/calendar/data/lang.xml b/applications/calendar/data/lang.xml index df3964a4..f6fe5a18 100644 --- a/applications/calendar/data/lang.xml +++ b/applications/calendar/data/lang.xml @@ -1,6 +1,6 @@ - + Events Events a comment on an event diff --git a/applications/calendar/data/theme.xml b/applications/calendar/data/theme.xml index 1bced61e..a135bbcb 100644 --- a/applications/calendar/data/theme.xml +++ b/applications/calendar/data/theme.xml @@ -968,7 +968,7 @@
    {{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}} {{if $row->prefix()}} - {template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"} + {template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"} {{endif}}

    @@ -979,13 +979,12 @@
    {$row->tableDescription()|raw}
    {{else}}
    - {lang="byline" htmlsprintf="$row->author()->link( $row->warningRef() )"}{datetime="$row->__get( $row::$databaseColumnMap['date'] )"} + {lang="byline_name_date" htmlsprintf="$row->author()->link( $row->warningRef() ), \IPS\DateTime::ts( $row->__get( $row::$databaseColumnMap['date'] ) )->html(TRUE)"} {lang="in"} {$row->container()->_title}
    {{endif}}

    - {{if $row->_followData['follow_is_anon']}}
    @@ -1034,7 +1033,7 @@
    {{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}} {{if $row->prefix()}} - {template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"} + {template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"} {{endif}}

    tableHoverUrl}}data-ipsHover{{endif}}> diff --git a/applications/calendar/data/versions.json b/applications/calendar/data/versions.json index 2c69c0f9..052c0a7a 100644 --- a/applications/calendar/data/versions.json +++ b/applications/calendar/data/versions.json @@ -281,5 +281,7 @@ "5000029": "5.0.0 Beta 3", "5000030": "5.0.0 Beta 4", "5000031": "5.0.0 Beta 5", - "5000032": "5.0.0 Beta 6" + "5000032": "5.0.0 Beta 6", + "5000033": "5.0.0 Beta 7", + "5000034": "5.0.0 Beta 7" } \ No newline at end of file diff --git a/applications/calendar/setup/upg_5000033/data.json b/applications/calendar/setup/upg_5000033/data.json new file mode 100644 index 00000000..19ca6e6d --- /dev/null +++ b/applications/calendar/setup/upg_5000033/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000033, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": true, + "themeeditor": false, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/calendar/setup/upg_5000033/theme.json b/applications/calendar/setup/upg_5000033/theme.json new file mode 100644 index 00000000..75ef9e26 --- /dev/null +++ b/applications/calendar/setup/upg_5000033/theme.json @@ -0,0 +1,20 @@ +{ + "html": { + "added": [], + "edited": [ + "front\/global\/manageFollowRow", + "front\/global\/rows" + ], + "removed": [] + }, + "css": { + "added": [], + "edited": [], + "removed": [] + }, + "resources": { + "added": [], + "edited": [], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/calendar/setup/upg_5000034/data.json b/applications/calendar/setup/upg_5000034/data.json new file mode 100644 index 00000000..c72cb400 --- /dev/null +++ b/applications/calendar/setup/upg_5000034/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000034, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": false, + "themeeditor": false, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/cms/data/cms_theme.xml b/applications/cms/data/cms_theme.xml index bb4eff07..f2f066a4 100644 --- a/applications/cms/data/cms_theme.xml +++ b/applications/cms/data/cms_theme.xml @@ -710,14 +710,14 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi {{endif}} {{if $comment->author()->member_id}} - + {{endif}}

    - {{if $comment->author()->member_id}} + {{if $comment->author()->member_id}} - {template="miniProfile" app="core" group="global" params="$comment, $comment->$idField"} + {template="miniProfileWrap" app="core" group="global" params="$comment->author(), $comment->$idField, remoteLoading: true"} - {{endif}} + {{endif}}
    @@ -1142,12 +1142,12 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie {{if $review->author()->member_id}} - + {{endif}}
    - {{if $review->author()->member_id}} - {template="miniProfile" app="core" group="global" params="$review, $review->id, 'review'"} - {{endif}} + {{if $review->author()->member_id}} + {template="miniProfileWrap" app="core" group="global" params="$review->author(), $review->id, 'review', remoteLoading: true"} + {{endif}}
    {{if $review->hidden() AND $review->hidden() != -2}} @@ -1893,7 +1893,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie {{$iposted = $table ? $table->contentPostedIn : array();}} {{foreach $rows as $row}} {{$idField = $row::$databaseColumnId;}} -
  • unread()}}data-ips-unread{{else}}data-ips-read{{endif}}> +
  • unread()}}data-ips-unread{{else}}data-ips-read{{endif}}> {{if $row->showRecordImage()}}
    @@ -1916,7 +1916,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie {{endif}}

    {{if member.member_id}} - {{if $row->unread()}} + {{if $table !== null and $row->unread()}} {{else}} diff --git a/applications/cms/data/javascript.xml b/applications/cms/data/javascript.xml index 73786686..f009634e 100644 --- a/applications/cms/data/javascript.xml +++ b/applications/cms/data/javascript.xml @@ -1,6 +1,6 @@ - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -156,7 +156,7 @@ } }); }(jQuery, _)); - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -1420,7 +1420,7 @@ } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -1470,7 +1470,7 @@ } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -1542,7 +1542,7 @@ } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -3009,7 +3009,7 @@ } }); }(jQuery, _)); - \ {{{contents}}}\ \ @@ -3026,7 +3026,7 @@ ips.templates.set( 'templates.media.noSearchResults', "\ {{#lang}}mediaNoResults{{/lang}}\

  • \ ");]]> - {{title}} \ diff --git a/applications/cms/data/lang.xml b/applications/cms/data/lang.xml index 35cb612c..99b8ac2a 100644 --- a/applications/cms/data/lang.xml +++ b/applications/cms/data/lang.xml @@ -1,6 +1,6 @@ - + Pages Pages file diff --git a/applications/cms/data/theme.xml b/applications/cms/data/theme.xml index e716844d..2aeebb77 100644 --- a/applications/cms/data/theme.xml +++ b/applications/cms/data/theme.xml @@ -1234,7 +1234,7 @@ {template="navigationLine" app="cms" group="widgets" params="$folder, null, $currentContainer"} {{endforeach}} {{else}} - {template="navigationLine" app="cms" group="widgets" params="$folders, $title, $currentContainer"} + {template="navigationLine" app="cms" group="widgets" params="$folders, null, $currentContainer"} {{endif}} {{if $rootId == 0 AND \count( $pages )}}
    diff --git a/applications/cms/data/versions.json b/applications/cms/data/versions.json index 3a3d91ac..eaea7651 100644 --- a/applications/cms/data/versions.json +++ b/applications/cms/data/versions.json @@ -599,5 +599,7 @@ "5000029": "5.0.0 Beta 3", "5000030": "5.0.0 Beta 4", "5000031": "5.0.0 Beta 5", - "5000032": "5.0.0 Beta 6" + "5000032": "5.0.0 Beta 6", + "5000033": "5.0.0 Beta 7", + "5000034": "5.0.0 Beta 7" } \ No newline at end of file diff --git a/applications/cms/extensions/core/Queue/MoveComments.php b/applications/cms/extensions/core/Queue/MoveComments.php index 88e8c03b..7bac3f09 100644 --- a/applications/cms/extensions/core/Queue/MoveComments.php +++ b/applications/cms/extensions/core/Queue/MoveComments.php @@ -303,57 +303,61 @@ class MoveComments extends QueueAbstract } foreach( new ActiveRecordIterator( Db::i()->select( '*', 'forums_posts', array( "pid>? AND new_topic=? AND " . Db::i()->in( 'topic_id', $subquery ), $data['lastId'], 0 ), "pid ASC", $this->rebuild ), 'IPS\forums\Topic\Post' ) AS $row ) { - /* @var Records $recordClass */ - $record = $recordClass::load( $row->topic_id, 'record_topicid' ); - - $approved = $row->queued; - if ( $row->queued == 1 ) + try { - $approved = 0; - } - else if ( $row->queued == 0 ) - { - $approved = 1; - } - - $comment = new $commentClass; - $comment->user = $row->author_id; - $comment->database_id = $database->_id; - $comment->record_id = $record->primary_id_field; - $comment->date = $row->post_date; - $comment->ip_address = $row->ip_address; - $comment->post = $row->post; - $comment->approved = $approved; - $comment->author = $row->author_name; - $comment->edit_date = $row->edit_time ?: 0; - $comment->edit_reason = $row->edit_reason; - $comment->edit_member_name = $row->edit_name; - $comment->save(); + /* @var Records $recordClass */ + $record = $recordClass::load( $row->topic_id, 'record_topicid' ); - /* Update post before register */ - Db::i()->update( 'core_post_before_registering', array( 'class' => $commentClass, 'id' => $comment->id ), array( 'class=? and id=?', "\IPS\forums\Topic\Post", $row->id ) ); + $approved = $row->queued; + if ( $row->queued == 1 ) + { + $approved = 0; + } + else if ( $row->queued == 0 ) + { + $approved = 1; + } - Index::i()->index( $comment ); - - $row->delete(); - - $data['lastId'] = $row->pid; - $data['done']++; - $done++; - - /* If we're no longer keeping the topic, then delete it, but only if we're really done with it (ex, only the first post still exists). Otherwise, we still want the topic linked, we're just not using it for comments anymore. */ - if ( $data['deleteTopics'] AND (int) Db::i()->select( 'COUNT(*)', 'forums_posts', array( "topic_id=?", $row->topic_id ) )->first() === 1 ) - { - Topic::load( $row->topic_id )->delete(); - $record->record_topicid = 0; + $comment = new $commentClass; + $comment->user = $row->author_id; + $comment->database_id = $database->_id; + $comment->record_id = $record->primary_id_field; + $comment->date = $row->post_date; + $comment->ip_address = $row->ip_address; + $comment->post = $row->post; + $comment->approved = $approved; + $comment->author = $row->author_name; + $comment->edit_date = $row->edit_time ?: 0; + $comment->edit_reason = $row->edit_reason; + $comment->edit_member_name = $row->edit_name; + $comment->save(); + + /* Update post before register */ + Db::i()->update( 'core_post_before_registering', array( 'class' => $commentClass, 'id' => $comment->id ), array( 'class=? and id=?', "\IPS\forums\Topic\Post", $row->id ) ); + + Index::i()->index( $comment ); + + $row->delete(); + + $data['lastId'] = $row->pid; + $data['done']++; + $done++; + + /* If we're no longer keeping the topic, then delete it, but only if we're really done with it (ex, only the first post still exists). Otherwise, we still want the topic linked, we're just not using it for comments anymore. */ + if ( $data['deleteTopics'] and (int)Db::i()->select( 'COUNT(*)', 'forums_posts', array( "topic_id=?", $row->topic_id ) )->first() === 1 ) + { + Topic::load( $row->topic_id )->delete(); + $record->record_topicid = 0; + } + + $record->resyncCommentCounts(); + $record->save(); + + $category = $record->container(); + $category->resetCommentCounts(); + $category->save(); } - - $record->resyncCommentCounts(); - $record->save(); - - $category = $record->container(); - $category->resetCommentCounts(); - $category->save(); + catch ( OutOfRangeException ) {} // this may have already been handled } return $done; diff --git a/applications/cms/setup/upg_5000033/data.json b/applications/cms/setup/upg_5000033/data.json new file mode 100644 index 00000000..19ca6e6d --- /dev/null +++ b/applications/cms/setup/upg_5000033/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000033, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": true, + "themeeditor": false, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/cms/setup/upg_5000033/theme.json b/applications/cms/setup/upg_5000033/theme.json new file mode 100644 index 00000000..39f14c7e --- /dev/null +++ b/applications/cms/setup/upg_5000033/theme.json @@ -0,0 +1,19 @@ +{ + "html": { + "added": [], + "edited": [ + "front\/widgets\/FolderNavigation" + ], + "removed": [] + }, + "css": { + "added": [], + "edited": [], + "removed": [] + }, + "resources": { + "added": [], + "edited": [], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/cms/setup/upg_5000034/data.json b/applications/cms/setup/upg_5000034/data.json new file mode 100644 index 00000000..c72cb400 --- /dev/null +++ b/applications/cms/setup/upg_5000034/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000034, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": false, + "themeeditor": false, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/cms/sources/Records/Records.php b/applications/cms/sources/Records/Records.php index 279b76f1..09fafe18 100644 --- a/applications/cms/sources/Records/Records.php +++ b/applications/cms/sources/Records/Records.php @@ -827,17 +827,6 @@ class Records extends Item implements } } - if ( static::modPermission( 'feature', NULL, $container ) ) - { - $options['feature'] = 'create_record_featured'; - $toggles['feature'] = array( 'create_record_featured' ); - - if ( $item AND $item->record_featured === 1 ) - { - $values[] = 'feature'; - } - } - if ( Member::loggedIn()->modPermission('can_content_edit_meta_tags') ) { $formElements['record_meta_keywords'] = new TextArea( 'record_meta_keywords', $item ? $item->record_meta_keywords : '', FALSE ); @@ -1011,15 +1000,6 @@ class Records extends Item implements { $this->record_pinned = 0; } - - if ( in_array( 'feature', $values['create_record_state'] ) ) - { - $this->record_featured = 1; - } - else - { - $this->record_featured = 0; - } } /* Dates */ diff --git a/applications/cms/widgets/FolderNavigation.php b/applications/cms/widgets/FolderNavigation.php index a4042c1c..384e0ff9 100644 --- a/applications/cms/widgets/FolderNavigation.php +++ b/applications/cms/widgets/FolderNavigation.php @@ -95,11 +95,6 @@ class FolderNavigation extends Widget */ public function render(): string { - if( !Page::$currentPage ) - { - return ""; - } - $rootId = $this->configuration['block_nav_folder'] ?? 0; if( $rootId !== 0 ) { @@ -124,6 +119,6 @@ class FolderNavigation extends Widget ) ); - return $this->output( $folders, $rootId, $pages, $this->configuration['block_nav_title'] ?? null, Page::$currentPage->folder_id ?: null ); + return $this->output( $folders, $rootId, $pages, $this->configuration['block_nav_title'] ?? null, ( Page::$currentPage ? ( Page::$currentPage->folder_id ?: null ) : null ) ); } } \ No newline at end of file diff --git a/applications/convert/data/javascript.xml b/applications/convert/data/javascript.xml index 4b53aef8..45ef6f00 100644 --- a/applications/convert/data/javascript.xml +++ b/applications/convert/data/javascript.xml @@ -1,6 +1,6 @@ - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -45,7 +45,7 @@ } } ); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * diff --git a/applications/convert/data/lang.xml b/applications/convert/data/lang.xml index e5dc60a0..97c30b35 100644 --- a/applications/convert/data/lang.xml +++ b/applications/convert/data/lang.xml @@ -1,6 +1,6 @@ - + Converter Conversions Start New Conversion diff --git a/applications/convert/data/versions.json b/applications/convert/data/versions.json index 2c69c0f9..052c0a7a 100644 --- a/applications/convert/data/versions.json +++ b/applications/convert/data/versions.json @@ -281,5 +281,7 @@ "5000029": "5.0.0 Beta 3", "5000030": "5.0.0 Beta 4", "5000031": "5.0.0 Beta 5", - "5000032": "5.0.0 Beta 6" + "5000032": "5.0.0 Beta 6", + "5000033": "5.0.0 Beta 7", + "5000034": "5.0.0 Beta 7" } \ No newline at end of file diff --git a/applications/convert/setup/upg_5000033/data.json b/applications/convert/setup/upg_5000033/data.json new file mode 100644 index 00000000..0aa30336 --- /dev/null +++ b/applications/convert/setup/upg_5000033/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000033, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": false, + "themeeditor": false, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/convert/setup/upg_5000034/data.json b/applications/convert/setup/upg_5000034/data.json new file mode 100644 index 00000000..c72cb400 --- /dev/null +++ b/applications/convert/setup/upg_5000034/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000034, + "name": "5.0.0 Beta 7", + "steps": { + "queries": false, + "lang": false, + "theme": false, + "themeeditor": false, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/convert/sources/Software/Forums/Bbpress.php b/applications/convert/sources/Software/Forums/Bbpress.php index 3e63e6e9..16c21d46 100644 --- a/applications/convert/sources/Software/Forums/Bbpress.php +++ b/applications/convert/sources/Software/Forums/Bbpress.php @@ -117,7 +117,7 @@ class Bbpress extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); @@ -141,14 +141,14 @@ class Bbpress extends Software /** * @brief User cache to minimise repeated DB lookups */ - protected static $userCache = array(); + protected static array $userCache = array(); /** * Convert topics * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'ID' ); @@ -190,7 +190,7 @@ class Bbpress extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'ID' ); diff --git a/applications/convert/sources/Software/Forums/Expressionengine.php b/applications/convert/sources/Software/Forums/Expressionengine.php index 9f035247..0ec3b3c6 100644 --- a/applications/convert/sources/Software/Forums/Expressionengine.php +++ b/applications/convert/sources/Software/Forums/Expressionengine.php @@ -17,7 +17,7 @@ use DomainException; use Exception; use IPS\Content; use IPS\convert\Software; -use IPS\convert\Software\Core\Expressionengine; +use IPS\convert\Software\Core\Expressionengine as ExpressionEngineCore; use IPS\Db; use IPS\Http\Url; use IPS\Member; @@ -197,14 +197,14 @@ class Expressionengine extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Expressionengine::fixPostData( $post, $className, $contentId ); + return ExpressionEngineCore::fixPostData( $post, $className, $contentId ); } /** @@ -212,7 +212,7 @@ class Expressionengine extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); @@ -248,7 +248,7 @@ class Expressionengine extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); @@ -352,7 +352,7 @@ class Expressionengine extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); @@ -394,7 +394,7 @@ class Expressionengine extends Software * * @return void */ - public function convertOtherPosts() + public function convertOtherPosts() : void { $libraryClass = $this->getLibrary(); @@ -436,7 +436,7 @@ class Expressionengine extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments() : void { $libraryClass = $this->getLibrary(); diff --git a/applications/convert/sources/Software/Forums/Invisioncommunity.php b/applications/convert/sources/Software/Forums/Invisioncommunity.php index 64023f3c..31ff9486 100644 --- a/applications/convert/sources/Software/Forums/Invisioncommunity.php +++ b/applications/convert/sources/Software/Forums/Invisioncommunity.php @@ -22,6 +22,7 @@ use IPS\convert\App; use IPS\convert\Library; use IPS\convert\Software; use IPS\Db; +use IPS\Db\Exception as DbException; use IPS\Http\Url; use IPS\Member; use IPS\Node\Model; @@ -46,12 +47,12 @@ class Invisioncommunity extends Software /** * @brief Whether the versions of IPS4 match */ - public static $versionMatch = FALSE; + public static bool $versionMatch = FALSE; /** * @brief Whether the database has been required */ - public static $dbNeeded = FALSE; + public static bool $dbNeeded = FALSE; /** * Constructor @@ -61,12 +62,12 @@ class Invisioncommunity extends Software * @return void * @throws InvalidArgumentException */ - public function __construct( App $app, $needDB=TRUE ) + public function __construct( App $app, bool $needDB=TRUE ) { /* Set filename obscuring flag */ Library::$obscureFilenames = FALSE; - $return = parent::__construct( $app, $needDB ); + parent::__construct( $app, $needDB ); if( $needDB ) { @@ -82,13 +83,11 @@ class Invisioncommunity extends Software static::$versionMatch = TRUE; } } - catch( \IPS\Db\Exception $e ) {} + catch( DbException $e ) {} /* Get parent sauce */ $this->parent = $this->app->_parent->getSource(); } - - return $return; } /** @@ -181,17 +180,15 @@ class Invisioncommunity extends Software case 'core_rss_imported': try { - return $this->db->select( 'COUNT(*)', 'core_rss_imported', array( 'rss_imported_import_id IN(' . (string) $this->db->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) )->first(); + return $this->db->select( 'COUNT(*)', 'core_rss_imported', array( 'rss_imported_import_id IN(' . $this->db->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) )->first(); } catch( Exception $e ) { throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) ); } - break; default: return parent::countRows( $table, $where, $recache ); - break; } } @@ -235,7 +232,7 @@ class Invisioncommunity extends Software $return[ $method ] = array( 'upload_path' => array( 'field_class' => 'IPS\\Helpers\\Form\\Text', - 'field_default' => isset( $this->parent->app->_session['more_info']['convertEmoticons']['upload_path'] ) ? $this->parent->app->_session['more_info']['convertEmoticons']['upload_path'] : NULL, + 'field_default' => $this->parent->app->_session['more_info']['convertEmoticons']['upload_path'] ?? NULL, 'field_required' => TRUE, 'field_extra' => array(), 'field_hint' => Member::loggedIn()->language()->addToStack('convert_invision_upload_path'), @@ -287,7 +284,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsAnswerRatings() + public function convertForumsAnswerRatings() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'id' ); @@ -307,7 +304,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'id' ); @@ -348,7 +345,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'tid' ); @@ -402,7 +399,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'pid' ); @@ -445,7 +442,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsQuestionRatings() + public function convertForumsQuestionRatings() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'id' ); @@ -465,7 +462,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsTopicsMultimods() + public function convertForumsTopicsMultimods() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'mm_id' ); @@ -488,7 +485,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsRssImports() + public function convertForumsRssImports() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'rss_import_id' ); @@ -511,11 +508,11 @@ class Invisioncommunity extends Software * * @return void */ - public function convertForumsRssImported() + public function convertForumsRssImported() : void { $libraryClass = $this->getLibrary(); - foreach( $this->fetch( 'core_rss_imported', 'rss_imported_content_id', array( 'rss_imported_id IN(' . (string) Db::i()->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) ) AS $row ) + foreach( $this->fetch( 'core_rss_imported', 'rss_imported_content_id', array( 'rss_imported_id IN(' . Db::i()->select( 'rss_import_id', 'core_rss_import', array( "rss_import_class='IPS\\forums\\Topic'" ) ) . ')' ) ) AS $row ) { /* Remove non-standard columns */ $this->parent->unsetNonStandardColumns( $row, 'core_rss_imported', 'core' ); @@ -529,7 +526,7 @@ class Invisioncommunity extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'attach_id' ); diff --git a/applications/convert/sources/Software/Forums/Mybb.php b/applications/convert/sources/Software/Forums/Mybb.php index 28c0caef..e5710d3b 100644 --- a/applications/convert/sources/Software/Forums/Mybb.php +++ b/applications/convert/sources/Software/Forums/Mybb.php @@ -17,7 +17,7 @@ use DomainException; use Exception; use IPS\Content; use IPS\convert\Software; -use IPS\convert\Software\Core\Mybb; +use IPS\convert\Software\Core\Mybb as MybbCore; use IPS\Db; use IPS\Http\Url; use IPS\Member; @@ -209,14 +209,14 @@ class Mybb extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Mybb::fixPostData( $post, $className, $contentId ); + return MybbCore::fixPostData( $post, $className, $contentId ); } /** @@ -224,7 +224,7 @@ class Mybb extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums(): void { $libraryClass = $this->getLibrary(); @@ -283,7 +283,7 @@ class Mybb extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics(): void { $libraryClass = $this->getLibrary(); @@ -380,10 +380,7 @@ class Mybb extends Software $this->db->select( 'fid', 'threads', array( "tid=?", $moved[1] ) )->first() ); } - catch( UnderflowException $e ) - { - $moved_to = NULL; - } + catch( UnderflowException $e ){} } $info = array( @@ -473,7 +470,7 @@ class Mybb extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts(): void { $libraryClass = $this->getLibrary(); @@ -512,7 +509,7 @@ class Mybb extends Software 'author_name' => $row['username'], 'ip_address' => $row['ipaddress'], 'post_date' => $row['dateline'], - 'queued' => $queued, + 'queued' => $queued ?? 0, 'post_edit_reason' => $row['editreason'], ); @@ -574,7 +571,7 @@ class Mybb extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments(): void { $libraryClass = $this->getLibrary(); @@ -629,9 +626,8 @@ class Mybb extends Software } } } - catch( UnderflowException $e ) {} - catch( OutOfRangeException $e ) {} - + catch( UnderflowException|OutOfRangeException $e ) {} + $libraryClass->setLastKeyValue( $row['aid'] ); } } diff --git a/applications/convert/sources/Software/Forums/Phpbb.php b/applications/convert/sources/Software/Forums/Phpbb.php index ff671547..c25a5d31 100644 --- a/applications/convert/sources/Software/Forums/Phpbb.php +++ b/applications/convert/sources/Software/Forums/Phpbb.php @@ -17,7 +17,7 @@ use DomainException; use Exception; use IPS\Content; use IPS\convert\Software; -use IPS\convert\Software\Core\Phpbb; +use IPS\convert\Software\Core\Phpbb as PhpbbCore; use IPS\Db; use IPS\Http\Url; use IPS\Member; @@ -192,14 +192,14 @@ class Phpbb extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Phpbb::fixPostData( $post, $className, $contentId ); + return PhpbbCore::fixPostData( $post, $className, $contentId ); } /** @@ -207,7 +207,7 @@ class Phpbb extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums(): void { $libraryClass = $this->getLibrary(); @@ -219,8 +219,8 @@ class Phpbb extends Software 'id' => $row['forum_id'], 'name' => $row['forum_name'], 'description' => $row['forum_desc'], - 'topics' => isset( $row['forum_topics_approved'] ) ? $row['forum_topics_approved'] : $row['forum_topics'], - 'posts' => isset( $row['forum_posts_approved'] ) ? $row['forum_posts_approved'] : $row['forum_posts'], + 'topics' => $row['forum_topics_approved'] ?? $row['forum_topics'], + 'posts' => $row['forum_posts_approved'] ?? $row['forum_posts'], 'last_post' => $row['forum_last_post_time'], 'last_poster_id' => $row['forum_last_poster_id'], 'last_poster_name' => $row['forum_last_poster_name'], @@ -229,9 +229,9 @@ class Phpbb extends Software 'position' => $row['left_id'], 'password' => ( isset( $this->app->_session['more_info']['convertForumsForums']["forum_password_{$row['forum_id']}"] ) ) ? $this->app->_session['more_info']['convertForumsForums']["forum_password_{$row['forum_id']}"] : NULL, 'last_title' => $row['forum_last_post_subject'], - 'queued_topics' => isset( $row['forum_topics_unapproved'] ) ? $row['forum_topics_unapproved'] : 0, + 'queued_topics' => $row['forum_topics_unapproved'] ?? 0, 'queued_posts' => isset( $row['forum_posts_unapproved'] ) ? $row['forum_topics_unapproved'] : 0, - 'sub_can_post' => ( $row['forum_type'] == 1 ) ? TRUE : FALSE + 'sub_can_post' => $row['forum_type'] == 1 ); $libraryClass->convertForumsForum( $info ); @@ -264,7 +264,7 @@ class Phpbb extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics(): void { $libraryClass = $this->getLibrary(); @@ -327,15 +327,8 @@ class Phpbb extends Software ); } } - - if ( isset( $row['topic_visibility'] ) ) - { - $visibility = $row['topic_visibility']; - } - else - { - $visibility = $row['topic_approved']; - } + + $visibility = $row['topic_visibility'] ?? $row['topic_approved']; /* Global Topics */ if ( !$row['forum_id'] ) @@ -361,7 +354,7 @@ class Phpbb extends Software 'title' => $row['topic_title'], 'forum_id' => $row['forum_id'], 'state' => ( $row['topic_status'] == 0 ) ? 'open' : 'closed', - 'posts' => isset( $row['topic_posts_approved'] ) ? $row['topic_posts_approved'] : $row['topic_replies'], + 'posts' => $row['topic_posts_approved'] ?? $row['topic_replies'], 'starter_id' => $row['topic_poster'], 'start_date' => $row['topic_time'], 'last_poster_id' => $row['topic_last_poster_id'], @@ -406,7 +399,7 @@ class Phpbb extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts(): void { $libraryClass = $this->getLibrary(); @@ -414,14 +407,7 @@ class Phpbb extends Software foreach( $this->fetch( 'posts', 'post_id' ) AS $row ) { - if ( isset( $row['post_visibility'] ) ) - { - $visibility = $row['post_visibility']; - } - else - { - $visibility = $row['post_approved']; - } + $visibility = $row['post_visibility'] ?? $row['post_approved']; $editName = null; if( $row['post_edit_time'] AND $row['post_edit_user'] ) @@ -436,7 +422,7 @@ class Phpbb extends Software $info = array( 'pid' => $row['post_id'], 'topic_id' => $row['topic_id'], - 'post' => Phpbb::stripUid( $row['post_text'], $row['bbcode_uid'] ), + 'post' => PhpbbCore::stripUid( $row['post_text'], $row['bbcode_uid'] ), 'append_edit' => ( $row['post_edit_user'] ) ? 1 : 0, 'edit_time' => $row['post_edit_time'], 'edit_name' => $editName, @@ -445,7 +431,7 @@ class Phpbb extends Software 'ip_address' => $row['poster_ip'], 'post_date' => $row['post_time'], 'queued' => ( $visibility == 1 ) ? 0 : -1, - 'pdelete_time' => isset( $row['post_delete_time'] ) ? $row['post_delete_time'] : NULL, + 'pdelete_time' => $row['post_delete_time'] ?? NULL, ); $libraryClass->convertForumsPost( $info ); @@ -470,7 +456,7 @@ class Phpbb extends Software 'wl_moderator' => $log['user_id'], 'wl_date' => $warning['warning_time'], 'wl_points' => 1, - 'wl_note_member' => isset( $data[0] ) ? $data[0] : NULL, + 'wl_note_member' => $data[0] ?? NULL, ) ); /* Add a member history record for this member */ @@ -492,14 +478,14 @@ class Phpbb extends Software /** * @brief temporarily store post content */ - protected $_postContent = array(); + protected array $_postContent = array(); /** * Convert attachments * * @return void */ - public function convertAttachments() + public function convertAttachments(): void { $libraryClass = $this->getLibrary(); @@ -559,8 +545,7 @@ class Phpbb extends Software $this->_postContent[ $pid ] .= '
    ' . $replacement; } } - catch( UnderflowException $e ) {} - catch( OutOfRangeException $e ) {} + catch( UnderflowException|OutOfRangeException $e ) {} } $libraryClass->setLastKeyValue( $row['attach_id'] ); diff --git a/applications/convert/sources/Software/Forums/Punbb.php b/applications/convert/sources/Software/Forums/Punbb.php index 310a6b16..c60fdbb9 100644 --- a/applications/convert/sources/Software/Forums/Punbb.php +++ b/applications/convert/sources/Software/Forums/Punbb.php @@ -16,7 +16,7 @@ namespace IPS\convert\Software\Forums; use Exception; use IPS\Content; use IPS\convert\Software; -use IPS\convert\Software\Core\Punbb; +use IPS\convert\Software\Core\Punbb as PunbbCore; use IPS\Http\Url; use IPS\Node\Model; use IPS\Request; @@ -122,14 +122,14 @@ class Punbb extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Punbb::fixPostData( $post, $className, $contentId ); + return PunbbCore::fixPostData( $post, $className, $contentId ); } /** @@ -137,7 +137,7 @@ class Punbb extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums(): void { $libraryClass = $this->getLibrary(); @@ -200,7 +200,7 @@ class Punbb extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics(): void { $libraryClass = $this->getLibrary(); @@ -280,7 +280,7 @@ class Punbb extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts(): void { $libraryClass = $this->getLibrary(); diff --git a/applications/convert/sources/Software/Forums/Smf.php b/applications/convert/sources/Software/Forums/Smf.php index 65e21b17..4bd871d8 100644 --- a/applications/convert/sources/Software/Forums/Smf.php +++ b/applications/convert/sources/Software/Forums/Smf.php @@ -18,7 +18,7 @@ use DomainException; use Exception; use IPS\Content; use IPS\convert\Software; -use IPS\convert\Software\Core\Smf; +use IPS\convert\Software\Core\Smf as SmfCore; use IPS\Db; use IPS\Http\Url; use IPS\Member; @@ -141,11 +141,9 @@ class Smf extends Software { throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) ); } - break; default: return parent::countRows( $table, $where, $recache ); - break; } } @@ -230,14 +228,14 @@ class Smf extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Smf::fixPostData( $post, $className, $contentId ); + return SmfCore::fixPostData( $post, $className, $contentId ); } /** @@ -245,7 +243,7 @@ class Smf extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums(): void { $libraryClass = $this->getLibrary(); @@ -266,7 +264,7 @@ class Smf extends Software * * @return void */ - public function convertForumsBoards() + public function convertForumsBoards(): void { $libraryClass = $this->getLibrary(); @@ -319,7 +317,7 @@ class Smf extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics(): void { $libraryClass = $this->getLibrary(); @@ -437,7 +435,7 @@ class Smf extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts(): void { $libraryClass = $this->getLibrary(); @@ -466,14 +464,14 @@ class Smf extends Software /** * @brief Cached attachment paths */ - protected static $paths = NULL; + protected static ?array $paths = NULL; /** * Convert attachments * * @return void */ - public function convertAttachments() + public function convertAttachments(): void { if ( is_null( static::$paths ) ) { diff --git a/applications/convert/sources/Software/Forums/UBBthreads.php b/applications/convert/sources/Software/Forums/UBBthreads.php index 65536f33..2e55dc41 100644 --- a/applications/convert/sources/Software/Forums/UBBthreads.php +++ b/applications/convert/sources/Software/Forums/UBBthreads.php @@ -15,7 +15,8 @@ namespace IPS\convert\Software\Forums; use Exception; use IPS\convert\Software; -use IPS\convert\Software\Core\UBBthreads; +use IPS\convert\Software\Core\UBBthreads as UBBthreadsCore; +use IPS\convert\Software\Exception as SoftwareException; use IPS\DateTime; use IPS\Db; use IPS\forums\Forum; @@ -245,14 +246,14 @@ class UBBthreads extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return UBBthreads::fixPostData( $post, $className, $contentId ); + return UBBthreadsCore::fixPostData( $post, $className, $contentId ); } /** @@ -260,7 +261,7 @@ class UBBthreads extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums(): void { $libraryClass = $this->getLibrary(); @@ -299,7 +300,7 @@ class UBBthreads extends Software ) ); } - throw new \IPS\convert\Software\Exception; + throw new SoftwareException; } /** @@ -307,7 +308,7 @@ class UBBthreads extends Software * * @return void */ - public function convertForumsForumsFollowers() + public function convertForumsForumsFollowers(): void { $libraryClass = $this->getLibrary(); @@ -329,7 +330,7 @@ class UBBthreads extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics(): void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'TOPIC_ID' ); @@ -429,7 +430,7 @@ class UBBthreads extends Software * * @return void */ - public function convertForumsTopicsRatings() + public function convertForumsTopicsRatings(): void { $libraryClass = $this->getLibrary(); @@ -450,7 +451,7 @@ class UBBthreads extends Software * * @return void */ - public function convertForumsTopicsFollowers() + public function convertForumsTopicsFollowers(): void { $libraryClass = $this->getLibrary(); @@ -472,7 +473,7 @@ class UBBthreads extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts(): void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'POST_ID' ); @@ -503,7 +504,7 @@ class UBBthreads extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments(): void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'FILE_ID' ); diff --git a/applications/convert/sources/Software/Forums/Vanilla.php b/applications/convert/sources/Software/Forums/Vanilla.php index 446854a3..050eb7d2 100644 --- a/applications/convert/sources/Software/Forums/Vanilla.php +++ b/applications/convert/sources/Software/Forums/Vanilla.php @@ -43,7 +43,7 @@ class Vanilla extends Software /** * @brief Store the result of the check for reaction support */ - protected static $_supportsReactions = FALSE; + protected static bool $_supportsReactions = FALSE; /** * Constructor @@ -53,17 +53,15 @@ class Vanilla extends Software * @return void * @throws InvalidArgumentException */ - public function __construct( App $app, $needDB=TRUE ) + public function __construct( App $app, bool $needDB=TRUE ) { - $return = parent::__construct( $app, $needDB ); + parent::__construct( $app, $needDB ); /* Check for reaction support - This is a Vanilla2 addon, so it may not be installed */ if ( $needDB ) { static::$_supportsReactions = $this->db->checkForTable( 'Action' ); } - - return $return; } /** * Software Name @@ -186,11 +184,9 @@ class Vanilla extends Software { throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) ); } - break; default: return parent::countRows( $table, $where, $recache ); - break; } } @@ -317,9 +313,9 @@ class Vanilla extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string @@ -332,7 +328,7 @@ class Vanilla extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments(): void { $libraryClass = $this->getLibrary(); @@ -391,7 +387,7 @@ class Vanilla extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums(): void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'c.CategoryID' ); @@ -433,7 +429,7 @@ class Vanilla extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics(): void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'd.DiscussionID' ); @@ -469,12 +465,12 @@ class Vanilla extends Software continue; } - $row['DateLastComment'] = 0; - $row['LastCommentUserID'] = 0; - $row['LastCommentUserName'] = ''; + $row['DateLastComment'] = $row['DateLastComment'] ?? 0; + $row['LastCommentUserID'] = $row['LastCommentUserID'] ?? 0; + $row['LastCommentUserName'] = $row['LastCommentUserName'] ?? ''; /* If last post info is empty, fetch it */ - if( $row['DateLastComment'] === NULL ) + if( !$row['DateLastComment'] ) { try { @@ -542,7 +538,7 @@ class Vanilla extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts(): void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'DiscussionID' ); @@ -634,7 +630,7 @@ class Vanilla extends Software * * @return void */ - public function convertForumsPosts2() + public function convertForumsPosts2(): void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'CommentID' ); diff --git a/applications/convert/sources/Software/Forums/Vbulletin.php b/applications/convert/sources/Software/Forums/Vbulletin.php index 5a7a6724..d5d3c49e 100644 --- a/applications/convert/sources/Software/Forums/Vbulletin.php +++ b/applications/convert/sources/Software/Forums/Vbulletin.php @@ -18,7 +18,7 @@ use Exception; use InvalidArgumentException; use IPS\convert\App; use IPS\convert\Software; -use IPS\convert\Software\Core\Vbulletin; +use IPS\convert\Software\Core\Vbulletin as VbulletinCore; use IPS\Db; use IPS\forums\Forum; use IPS\forums\Topic; @@ -49,12 +49,12 @@ class Vbulletin extends Software /** * @brief vBulletin 4 Stores all attachments under one table - this will store the content type for the forums app. */ - protected static $postContentType = NULL; + protected static ?int $postContentType = NULL; /** * @brief The schematic for vB3 and vB4 is similar enough that we can make specific concessions in a single converter for either version. */ - protected static $isLegacy = NULL; + protected static ?bool $isLegacy = NULL; /** * @brief Flag to indicate the post data has been fixed during conversion, and we only need to use Legacy Parser @@ -69,9 +69,9 @@ class Vbulletin extends Software * @return void * @throws InvalidArgumentException */ - public function __construct( App $app, $needDB=TRUE ) + public function __construct( App $app, bool $needDB=TRUE ) { - $return = parent::__construct( $app, $needDB ); + parent::__construct( $app, $needDB ); if ( $needDB ) { @@ -101,8 +101,6 @@ class Vbulletin extends Software } catch( Exception $e ) {} } - - return $return; } /** @@ -240,14 +238,14 @@ class Vbulletin extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Vbulletin::fixPostData( $post, $className, $contentId ); + return VbulletinCore::fixPostData( $post, $className, $contentId ); } /** @@ -340,7 +338,7 @@ class Vbulletin extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); @@ -357,7 +355,7 @@ class Vbulletin extends Software $key = 'options'; } - if ( $forum[$key] & $self::$bitOptions[$name][$perm] ) + if ( $forum[$key] & static::$bitOptions[$name][$perm] ) { return TRUE; } @@ -432,7 +430,7 @@ class Vbulletin extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'threadid' ); @@ -469,7 +467,7 @@ class Vbulletin extends Software $votes[$index] = $vote; $index++; - $numvotes += $vote; + $numvotes += (int) $vote; } $poll = array(); @@ -552,7 +550,7 @@ class Vbulletin extends Software 'poll_state' => $poll, 'last_vote' => $lastVote, 'views' => $topic['views'], - 'approved' => $approved, + 'approved' => $approved ?? 1, 'pinned' => $topic['sticky'], 'topic_hiddenposts' => $topic['hiddencount'] + $topic['deletedcount'] ); @@ -627,7 +625,7 @@ class Vbulletin extends Software * * @return void */ - public function convertForumsTopicsFollowers() + public function convertForumsTopicsFollowers() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'subscribethreadid' ); @@ -677,7 +675,7 @@ class Vbulletin extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'postid' ); @@ -819,7 +817,7 @@ class Vbulletin extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments() : void { $libraryClass = $this->getLibrary(); @@ -918,8 +916,7 @@ class Vbulletin extends Software Db::i()->update( 'forums_posts', array( 'post' => $post ), array( "pid=?", $pid ) ); } } - catch( UnderflowException $e ) {} - catch( OutOfRangeException $e ) {} + catch( UnderflowException|OutOfRangeException $e ) {} } $libraryClass->setLastKeyValue( $attachment['attachmentid'] ); @@ -931,7 +928,7 @@ class Vbulletin extends Software * * @return void */ - public function convertClubForums() + public function convertClubForums() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'groupid' ); @@ -954,7 +951,7 @@ class Vbulletin extends Software * * @return void */ - public function convertClubTopics() + public function convertClubTopics() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'discussionid' ); @@ -996,7 +993,7 @@ class Vbulletin extends Software 'last_post' => $row['lastpost'], 'starter_name' => $firstpost['postusername'], 'last_poster_name' => $row['lastposter'], - 'approved' => $approved, + 'approved' => $approved ?? 1, ) ); $libraryClass->setLastKeyValue( $row['discussionid'] ); @@ -1008,7 +1005,7 @@ class Vbulletin extends Software * * @return void */ - public function convertClubPosts() + public function convertClubPosts() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'gmid' ); @@ -1036,7 +1033,7 @@ class Vbulletin extends Software 'author_id' => $row['postuserid'], 'author_name' => $row['postusername'], 'post_date' => $row['dateline'], - 'queued' => $queued, + 'queued' => $queued ?? 0, ) ); $libraryClass->setLastKeyValue( $row['gmid'] ); } diff --git a/applications/convert/sources/Software/Forums/Vbulletin5.php b/applications/convert/sources/Software/Forums/Vbulletin5.php index eac16ad7..dfa7ec75 100644 --- a/applications/convert/sources/Software/Forums/Vbulletin5.php +++ b/applications/convert/sources/Software/Forums/Vbulletin5.php @@ -17,7 +17,7 @@ use DomainException; use Exception; use IPS\convert\App; use IPS\convert\Software; -use IPS\convert\Software\Core\Vbulletin5; +use IPS\convert\Software\Core\Vbulletin5 as Vbulletin5Core; use IPS\Db; use IPS\forums\Topic; use IPS\forums\Topic\Post; @@ -135,7 +135,6 @@ class Vbulletin5 extends Software { case 'forum': return count( $this->fetchForums() ); - break; case 'thread': try @@ -146,7 +145,6 @@ class Vbulletin5 extends Software { throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) ); } - break; case 'post': try @@ -157,15 +155,12 @@ class Vbulletin5 extends Software { throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) ); } - break; case 'attachment': return parent::countRows( 'node', array( "contenttypeid IN (" . $this->fetchType( 'Attach' ) . ',' . $this->fetchType( 'Photo' ) . ")" ) ); - break; default: return parent::countRows( $table, $where, $recache ); - break; } } @@ -213,14 +208,14 @@ class Vbulletin5 extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Vbulletin5::fixPostData( $post, $className, $contentId ); + return Vbulletin5Core::fixPostData( $post, $className, $contentId ); } /** @@ -297,7 +292,7 @@ class Vbulletin5 extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); @@ -325,7 +320,7 @@ class Vbulletin5 extends Software $key = 'nodeoptions'; } - if ( $forum[$key] & $self::$bitOptions[$name][$perm] ) + if ( $forum[$key] & static::$bitOptions[$name][$perm] ) { return TRUE; } @@ -362,7 +357,7 @@ class Vbulletin5 extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); @@ -441,8 +436,7 @@ class Vbulletin5 extends Software ); } } - catch( UnderflowException $e ) {} # if the poll is missing, don't bother - catch( UnexpectedValueException $e ) {} # if poll data is corrupt, then skip + catch( UnderflowException|UnexpectedValueException $e ) {} # if the poll is missing, don't bother # if poll data is corrupt, then skip $info = array( 'tid' => $topic['nodeid'], @@ -517,7 +511,7 @@ class Vbulletin5 extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); @@ -741,7 +735,7 @@ LINK; * * @return void */ - public function convertAttachments() + public function convertAttachments() : void { $libraryClass = $this->getLibrary(); @@ -891,7 +885,7 @@ LINK; * * @return void */ - public function convertAttachments2() + public function convertAttachments2() : void { $libraryClass = $this->getLibrary(); @@ -1020,7 +1014,7 @@ LINK; * * @return array */ - protected function fetchForums() + protected function fetchForums() : array { $forums = array(); $clubs = $this->fetchClubs(); @@ -1037,7 +1031,7 @@ LINK; * * @return array */ - protected function fetchClubs() + protected function fetchClubs() : array { $clubs = array(); @@ -1066,29 +1060,25 @@ LINK; /** * @brief Types Cache */ - protected $typesCache = array(); + protected array $typesCache = array(); /** * Helper method to retrieve content type ids * * @param int|string $type The content type - * @return void + * @return array */ - protected function fetchType( $type ) + protected function fetchType( int|string $type ) : array { - if ( count( $this->typesCache ) ) - { - return $this->typesCache[ $type ]; - } - else + if ( !count( $this->typesCache ) ) { foreach( $this->db->select( '*', 'contenttype' ) AS $contenttype ) { $this->typesCache[ $contenttype['class'] ] = $contenttype['contenttypeid']; } - - return $this->typesCache[ $type ]; } + + return $this->typesCache[ $type ]; } /** diff --git a/applications/convert/sources/Software/Forums/Woltlab.php b/applications/convert/sources/Software/Forums/Woltlab.php index 39dbe06b..56a0966f 100644 --- a/applications/convert/sources/Software/Forums/Woltlab.php +++ b/applications/convert/sources/Software/Forums/Woltlab.php @@ -17,7 +17,7 @@ use DomainException; use Exception; use IPS\Content; use IPS\convert\Software; -use IPS\convert\Software\Core\Woltlab; +use IPS\convert\Software\Core\Woltlab as WoltlabCore; use IPS\Db; use IPS\Http\Url; use IPS\Member; @@ -44,7 +44,7 @@ class Woltlab extends Software /** * @brief The WBB table prefix can change depending on the number of installs */ - public static $installId = 1; + public static int $installId = 1; /** * Software Name @@ -166,25 +166,23 @@ class Woltlab extends Software { throw new \IPS\convert\Exception( sprintf( Member::loggedIn()->language()->get( 'could_not_count_rows' ), $table ) ); } - break; default: return parent::countRows( $table, $where, $recache ); - break; } } /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Woltlab::fixPostData( $post, $className, $contentId ); + return WoltlabCore::fixPostData( $post, $className, $contentId ); } /** @@ -263,7 +261,7 @@ class Woltlab extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'boardID' ); @@ -316,7 +314,7 @@ class Woltlab extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'threadID' ); @@ -388,7 +386,7 @@ class Woltlab extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'postID' ); @@ -438,7 +436,7 @@ class Woltlab extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'attachmentID' ); diff --git a/applications/convert/sources/Software/Forums/Wpforo.php b/applications/convert/sources/Software/Forums/Wpforo.php index 43a29cc2..16a9a1ca 100644 --- a/applications/convert/sources/Software/Forums/Wpforo.php +++ b/applications/convert/sources/Software/Forums/Wpforo.php @@ -16,7 +16,7 @@ namespace IPS\convert\Software\Forums; use Exception; use IPS\Content; use IPS\convert\Software; -use IPS\convert\Software\Core\Wpforo; +use IPS\convert\Software\Core\Wpforo as WpforoCore; use IPS\Db; use IPS\Http\Url; use IPS\Member; @@ -138,14 +138,14 @@ class Wpforo extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Wpforo::fixPostData( $post, $className, $contentId ); + return WpforoCore::fixPostData( $post, $className, $contentId ); } /** @@ -202,7 +202,7 @@ class Wpforo extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'forumid' ); @@ -256,7 +256,7 @@ class Wpforo extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'topicid' ); @@ -325,7 +325,7 @@ class Wpforo extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'postid' ); @@ -366,14 +366,14 @@ class Wpforo extends Software /** * @brief temporarily store post content */ - protected $_postContent = []; + protected array $_postContent = []; /** * Convert attachments * * @return void */ - public function convertAttachments() + public function convertAttachments() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'postid' ); @@ -431,8 +431,7 @@ class Wpforo extends Software $this->_postContent[ $pid ] = str_replace( $matches[0][ $key ], '[attachment=' . $attachId . ':name]', $this->_postContent[ $pid ] ); } } - catch( UnderflowException $e ) {} - catch( OutOfRangeException $e ) {} + catch( UnderflowException|OutOfRangeException $e ) {} } } @@ -473,8 +472,7 @@ class Wpforo extends Software $this->_postContent[ $pid ] = str_replace( $matches[0][ $key ], '[attachment=' . $attachId . ':name]', $this->_postContent[ $pid ] ); } } - catch( UnderflowException $e ) {} - catch( OutOfRangeException $e ) {} + catch( UnderflowException|OutOfRangeException $e ) {} } } @@ -496,7 +494,7 @@ class Wpforo extends Software public function checkRedirects(): ?Url { $url = Request::i()->url(); - $wpForoSlug = defined('WPFORO_SLUG') ? WPFOROSLUG : 'community'; + $wpForoSlug = defined('WPFORO_SLUG') ? WPFORO_SLUG : 'community'; $matches = []; if( preg_match( '#/' . $wpForoSlug . '/([a-z0-9-]+)/([a-z0-9-]+)#i', $url->data[ Url::COMPONENT_PATH ], $matches ) ) diff --git a/applications/convert/sources/Software/Forums/Xenforo.php b/applications/convert/sources/Software/Forums/Xenforo.php index 430b962c..710689ff 100644 --- a/applications/convert/sources/Software/Forums/Xenforo.php +++ b/applications/convert/sources/Software/Forums/Xenforo.php @@ -19,7 +19,7 @@ use InvalidArgumentException; use IPS\Content; use IPS\convert\App; use IPS\convert\Software; -use IPS\convert\Software\Core\Xenforo; +use IPS\convert\Software\Core\Xenforo as XenforoCore; use IPS\Db; use IPS\Http\Url; use IPS\Member; @@ -51,7 +51,7 @@ class Xenforo extends Software /** * @brief The similarities between XF1 and XF2 are close enough that we can use the same converter */ - public static $isLegacy = NULL; + public static ?bool $isLegacy = NULL; /** * @brief Flag to indicate the post data has been fixed during conversion, and we only need to use Legacy Parser @@ -61,7 +61,7 @@ class Xenforo extends Software /** * @brief XF2.1 changed serialized data to json decoded */ - public static $useJson = FALSE; + public static bool $useJson = FALSE; /** * Constructor @@ -71,9 +71,9 @@ class Xenforo extends Software * @return void * @throws InvalidArgumentException */ - public function __construct( App $app, $needDB=TRUE ) + public function __construct( App $app, bool $needDB=TRUE ) { - $return = parent::__construct( $app, $needDB ); + parent::__construct( $app, $needDB ); if ( $needDB ) { @@ -104,8 +104,6 @@ class Xenforo extends Software } catch( Exception $e ) {} # If we can't query, we won't be able to do anything anyway } - - return $return; } /** @@ -275,14 +273,14 @@ class Xenforo extends Software /** * Pre-process content for the Invision Community text parser * - * @param string The post - * @param string|null Content Classname passed by post-conversion rebuild - * @param int|null Content ID passed by post-conversion rebuild + * @param string $post The post + * @param string|null $className Content Classname passed by post-conversion rebuild + * @param int|null $contentId Content ID passed by post-conversion rebuild * @return string The converted post */ public static function fixPostData( string $post, ?string $className=null, ?int $contentId=null ): string { - return Xenforo::fixPostData( $post, $className, $contentId ); + return XenforoCore::fixPostData( $post, $className, $contentId ); } /** @@ -292,7 +290,7 @@ class Xenforo extends Software * @param string $xfTwoTitle XF2 Phrase Title * @return string|null */ - protected function getPhrase( $xfOneTitle, $xfTwoTitle ) + protected function getPhrase( string $xfOneTitle, string $xfTwoTitle ) : ?string { try { @@ -310,7 +308,7 @@ class Xenforo extends Software * * @return void */ - public function convertForumsForums() + public function convertForumsForums() : void { $libraryClass = $this->getLibrary(); @@ -384,7 +382,7 @@ class Xenforo extends Software * * @return void */ - public function convertForumsTopics() + public function convertForumsTopics() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'thread_id' ); @@ -494,7 +492,7 @@ class Xenforo extends Software 'last_poster_name' => $row['last_post_username'], 'poll_state' => $poll, 'views' => $row['view_count'], - 'approved' => $approved, + 'approved' => $approved ?? 0, 'pinned' => $row['sticky'], 'moved_to' => $moved_to, ); @@ -571,7 +569,7 @@ class Xenforo extends Software * * @return void */ - public function convertForumsPosts() + public function convertForumsPosts() : void { $libraryClass = $this->getLibrary(); @@ -628,7 +626,7 @@ class Xenforo extends Software 'author_name' => $row['username'], 'ip_address' => $row['ip'] ?? '127.0.0.1', 'post_date' => $row['post_date'], - 'queued' => $queued, + 'queued' => $queued ?? 0, ); $libraryClass->convertForumsPost( $info ); @@ -726,7 +724,7 @@ class Xenforo extends Software * * @return void */ - public function convertAttachments() + public function convertAttachments() : void { $libraryClass = $this->getLibrary(); $libraryClass::setKey( 'xf_attachment.attachment_id' ); @@ -786,9 +784,8 @@ class Xenforo extends Software } } } - catch( UnderflowException $e ) {} - catch( OutOfRangeException $e ) {} - + catch( UnderflowException|OutOfRangeException $e ) {} + $libraryClass->setLastKeyValue( $row['attachment_id'] ); } } diff --git a/applications/core/data/javascript.xml b/applications/core/data/javascript.xml index 62f3c9cb..e8819108 100644 --- a/applications/core/data/javascript.xml +++ b/applications/core/data/javascript.xml @@ -1,6 +1,6 @@ - { + options = (options && typeof options ==='object') ? options : {}; + const defaults = _defaults[key] || {}; + options = {...defaults, ...options}; + return compiled(options, ...otherArgs); + }; } return $.noop; @@ -741,7 +753,7 @@ ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCg==") e.submitter = e.target.querySelector('button, input[type=button], input[type=image]'); }, true); }();]]> - - { const raw = String.raw({raw:str}, ...values) return ips.getString(raw) || raw }]]> - { } else { // If we're not indev, we need to locate the bundle the controller exists in try { + let url; // Load from static folders if ipsApps if( _.indexOf( ips.getSetting('ipsApps'), bits[0] ) !== -1 ) { - const url = ips.getSetting('baseURL') + 'static/js/' + bits[0] + '/' + bits[1] + '_' + bits[1] + '_' + bits[2] + '.js'; + url = ips.getSetting('baseURL') + 'static/js/' + bits[0] + '/' + bits[1] + '_' + bits[1] + '_' + bits[2] + '.js'; } else { // Third party stuff - const url = ipsJsFileMap[bits[0]][bits[1] + '_' + bits[2]]; + url = ipsJsFileMap[bits[0]][bits[1] + '_' + bits[2]]; } if (url.indexOf('?') != -1) { @@ -1766,7 +1779,7 @@ const ilang = (str, ...values) => { }( jQuery, _ )); ]]> - { } }); }( jQuery, _ )); ]]> - { }); }( jQuery, _ ));]]> - { + { "use strict"; /** @@ -2401,7 +2414,7 @@ const ilang = (str, ...values) => { } } })(jQuery, _));]]> - { }; }); }(jQuery, _));]]> - /* global ips, _, Debug */ + /* global ips, _, Debug */ /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com @@ -2962,7 +2975,7 @@ const ilang = (str, ...values) => { }; }(jQuery, _)); - { return AlertMessage.buildModuleAndRegisterWidget('alertMessage'); }) }(jQuery, _));]]> - { }; }(jQuery, _));]]> - { }(jQuery, _)); ]]> - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -5571,7 +5584,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _)); - - { + { "use strict"; ips.createModule('ips.ui._codehighlighting', function() { @@ -5786,7 +5799,7 @@ function recaptcha2Callback(){ return {} }) })(jQuery, _))]]> - - } ipsUiControlsToggleEvent */ @@ -6909,7 +6924,6 @@ function recaptcha2Callback(){ * @param {jQuery} elem The element this widget is being created on */ function respond(elem) { - } function handleEvent(e){ @@ -6957,7 +6971,7 @@ function recaptcha2Callback(){ } // Update visibility of element - _showEl(content, toggle, !(isExpanded === "true")); + showOrHide(content, toggle, !(isExpanded === "true")); // If this content is part of a group, only show a single element at a time. Useful for tabs, off-canvas menus, etc const isInGroup = content.getAttribute("data-ips-hidden-group"); @@ -6967,7 +6981,7 @@ function recaptcha2Callback(){ for (const groupElement of groupElements){ // Hide other group elements, except for the one being triggered if (groupElement != content){ - _showEl(groupElement, toggle, false); + showOrHide(groupElement, toggle, false); } } } @@ -6980,7 +6994,7 @@ function recaptcha2Callback(){ for(const lightDismissEl of lightDismiss){ // Close the element unless the click event occurred inside the light-dismiss element or if the clicked element was a light-dismiss dialog (ie. ::backdrop) if (lightDismissEl.contains(e.target) && e.target.tagName.toLowerCase() !== "dialog") continue; - _showEl(lightDismissEl, e.target, false); + showOrHide(lightDismissEl, e.target, false); } } @@ -6990,7 +7004,7 @@ function recaptcha2Callback(){ * @param {Element} trigger * @param {boolean} show */ - function _showEl(content, trigger, show = true){ + async function showOrHide(content, trigger, show = true){ // Move element to end of body if it's being opened and has data-ips-hidden-top-layer, or if it's a dialog if(show && (content.hasAttribute("data-ips-hidden-top-layer") || content.tagName === "DIALOG")){ @@ -7003,17 +7017,68 @@ function recaptcha2Callback(){ // Toggle aria-expanded attribute on trigger element document.querySelectorAll(`[data-ipscontrols][aria-controls="${content.id}"]`).forEach(t => t.setAttribute("aria-expanded", show)); - if(show){ - - if (contentTag === "DIALOG"){ + if (show) { + if (contentTag === "DIALOG") { content.showModal(); content.addEventListener("close", _closeEvent); } else { content.hidden = false; } - - // Apply autofocus to inputs - content.querySelector("[data-autofocus]")?.focus(); + + const src = trigger.dataset.ipscontrolsSrc; + if (typeof src === 'string' && !content.dataset.ipscontrolsLoaded) { + /** if we know the content, just use it */ + if (CACHED_REMOTE_RESPONSES.has(src) && typeof CACHED_REMOTE_RESPONSES.get(src).html === 'string' && !(typeof CACHED_REMOTE_RESPONSES.get(src).expiresAt === 'number' && CACHED_REMOTE_RESPONSES.get(src).expiresAt < Date.now() / 1000)) { + Debug.log(`ips.ui.controls: Using cached response for ${src}`); + content.innerHTML = CACHED_REMOTE_RESPONSES.get(src).html; + for (const cls of [...content.classList]) { + if (cls.startsWith('ipsLoading')) { + content.classList.remove('ipsLoading'); + } + } + $(document).trigger('contentChange', [$(content)]); + content.ipsHide(); + content.dataset.ipscontrolsLoaded = '1'; + content.querySelector("[data-autofocus]")?.focus(); + // on the first time, we wait a split second for the browser to execute a reflow + await new Promise(resolve => setTimeout(resolve, 50)); + content.ipsShow(); + } else { + content.classList.add('ipsLoading'); + const start = Date.now(); + loadContent(src) + .then(html => new Promise( + /** + * + * @param {function(string)} resolve + */ + resolve => { + // first, make sure the animation completed + if (Date.now() - start < 700) { + setTimeout(() => resolve(html), 700 - (Date.now() - start)) + } else { + resolve(html) + } + } + )) + .then(html => { + content.innerHTML = html; + + for (const cls of [...content.classList]) { + if (cls.startsWith('ipsLoading')) { + content.classList.remove('ipsLoading'); + } + } + $(document).trigger('contentChange', [$(content)]); + content.dataset.ipscontrolsLoaded = '1'; + content.querySelector("[data-autofocus]")?.focus(); + }) + } + } else { + + // Apply autofocus to inputs + content.querySelector("[data-autofocus]")?.focus(); + } } // Ensure the above has painted before the height is calculated @@ -7024,25 +7089,25 @@ function recaptcha2Callback(){ content.setAttribute("data-ips-animating", (show) ? 'opening' : 'closing'); // Once animations are done, remove animation - Promise.all( + await Promise.allSettled( content.getAnimations().map((a) => a.finished) - ).then(() => { - if(!show){ - (contentTag === "DIALOG") ? content.close() : content.hidden = true; - } - content.removeAttribute("data-ips-animating"); + ); - // Dispatch event so other elements can respond to the changed state; always dispatch `ips:toggleComplete`, then optionally another event if the dataset specifies an event property - const eventNames = ['ips:toggleComplete'] - if (content.dataset.ipsHiddenEvent) { - eventNames.push(content.dataset.ipsHiddenEvent) - } + if (!show) { + (contentTag === "DIALOG") ? content.close() : content.hidden = true; + } + content.removeAttribute("data-ips-animating"); - eventNames.forEach(eventName => content.dispatchEvent(new CustomEvent(eventName, { - bubbles: true, - detail: { hidden: content.hidden, trigger: trigger } - }))); - }); + // Dispatch event so other elements can respond to the changed state; always dispatch `ips:toggleComplete`, then optionally another event if the dataset specifies an event property + const eventNames = ['ips:toggleComplete'] + if (content.dataset.ipsHiddenEvent) { + eventNames.push(content.dataset.ipsHiddenEvent) + } + + eventNames.forEach(eventName => content.dispatchEvent(new CustomEvent(eventName, { + bubbles: true, + detail: { hidden: content.hidden, trigger: trigger } + }))); } /** @@ -7051,19 +7116,66 @@ function recaptcha2Callback(){ */ function _closeEvent(e) { if(!e.target.getAttribute("open")){ - _showEl(e.target, e.target, false); + showOrHide(e.target, e.target, false); + } + } + + /** + * Load the content at a given url, contained to this module + * + * @param {string|URL} src Where to load content from + * @param {boolean} [forceRequest=false] Force an xhr request + * + * @return {Promise} + */ + async function loadContent(src, forceRequest=false) { + src = (new URL(src)).toString(); + const cachedContents = CACHED_REMOTE_RESPONSES.get(src); + if (!forceRequest && cachedContents && typeof cachedContents.html === 'string') { + if (!(typeof cachedContents.expiresAt === 'number' && cachedContents.expiresAt < Date.now() / 1000)) { + Debug.log(`ips.ui.controls: Using cached response for ${src}`); + return cachedContents.html; + } + CACHED_REMOTE_RESPONSES.delete(src); + } + + try { + const response = await ips.fetch(src); + if (typeof response !== 'object' || typeof response.html !== 'string') { + throw new TypeError(`Expected an object with an html:string property`); + } + + if (!response.noCache) { + response.expiresAt = response.expiresAt || Math.round(Date.now() / 1000 + 3600); + if (typeof response.expiresAt === 'string') { + response.expiresAt = parseInt(response.expiresAt); + } + if (typeof response.expiresAt !== 'number' || Number.isNaN(response.expiresAt)) { + response.expiresAt = Math.round(Date.now() / 1000 + 3600); + } + if (!Number.isInteger(response.expiresAt)) { + response.expiresAt = Math.round(response.expiresAt); + } + + if (response.expiresAt * 1000 > Date.now()) { + CACHED_REMOTE_RESPONSES.set(src, response); + } + } + return response.html; + } catch (e) { + return ips.templates.render("ips.ui.controls.cannot_load", {message: typeof e.responseJSON?.errorMessage === 'string' ? e.responseJSON.errorMessage : undefined}); } } // Register this widget with ips.ui - ips.ui.registerWidget( 'controls', ips.ui.controls ); + ips.ui.registerWidget( 'controls', ips.ui.controls, ['src'] ); return { respond } }); -}());]]> - /** +}(jQuery, _));]]> + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -7110,7 +7222,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _)); - - - - - - - - - - - - - - - - - - - - - ;( function(){ + ;( function(){ "use strict"; ips.createModule('ips.ui.readmore', function(){ @@ -15332,7 +15444,7 @@ function recaptcha2Callback(){ }); }()); - - - - - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -19758,7 +19870,7 @@ function recaptcha2Callback(){ }); }(jQuery, _)); - - - - - - - - - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -23854,7 +23966,7 @@ function recaptcha2Callback(){ }; }); }(jQuery, _)); - - { + { "use strict"; ips.createModule('ips.utils.pagebuildericons', function() { @@ -24102,7 +24214,7 @@ function recaptcha2Callback(){ return {} }) })(jQuery, _))]]> - - - - - - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -27587,7 +27699,7 @@ var escapeRegExp; }); }(jQuery, _)); - - - - - - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -29809,7 +29921,7 @@ var escapeRegExp; }); }(jQuery, _)); - - - - - - } */ const OLD_TIME_ELEMENTS = new WeakSet(); }(jQuery, _));]]> - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -33520,7 +33632,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * IPS Social Suite 4 * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -33562,7 +33674,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -34177,7 +34289,7 @@ var escapeRegExp; }); }(jQuery, _)); - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -35232,7 +35344,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://invisioncommunity.com * @@ -35760,7 +35872,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -35798,7 +35910,7 @@ var escapeRegExp; }); }(jQuery, _)); - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -36347,7 +36459,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -36929,7 +37041,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -37501,7 +37613,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * IPS Social Suite 4 * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -37560,7 +37672,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -37585,7 +37697,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -37973,7 +38085,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * IPS Social Suite 4 * (c) 2018 Invision Power Services - http://www.invisionpower.com * @@ -38048,7 +38160,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * IPS Social Suite 4 * (c) 2013 Invision Power Services - http://www.invisionpower.com * @@ -38069,7 +38181,7 @@ var escapeRegExp; }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -38783,7 +38895,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -38904,7 +39016,7 @@ var escapeRegExp; }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -39781,7 +39893,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -40674,7 +40786,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -41006,7 +41118,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -41392,7 +41504,7 @@ var escapeRegExp; - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -41455,7 +41567,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -42603,7 +42715,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -42959,7 +43071,7 @@ var escapeRegExp; }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43113,7 +43225,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43237,7 +43349,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43263,7 +43375,7 @@ var escapeRegExp; }); }(jQuery, _)); - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43711,7 +43823,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -43757,7 +43869,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -45956,7 +46068,7 @@ var escapeRegExp; }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -46019,7 +46131,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -46642,7 +46754,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -47735,7 +47847,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -47801,7 +47913,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -50911,7 +51023,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -51289,7 +51401,7 @@ var escapeRegExp; }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -51419,7 +51531,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -51536,7 +51648,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -51586,7 +51698,7 @@ var escapeRegExp; } }); }(jQuery, _)); - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -51634,7 +51746,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -52214,7 +52326,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -52594,7 +52706,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - - - - \x20\t\r\n\f]*)[^>]*)\/>/gi;s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.migrateEnablePatches("self-closed-tags")},i(s,"htmlPrefilter",function(e){var t,r;return(r=(t=e).replace(F,"<$1>"))!==t&&T(t)!==T(r)&&u("self-closed-tags","HTML tags must be properly nested and closed: "+t),e.replace(F,"<$1>")},"self-closed-tags"),s.migrateDisablePatches("self-closed-tags");var D,W,_,I=s.fn.offset;return i(s.fn,"offset",function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?I.apply(this,arguments):(u("offset-valid-elem","jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},"offset-valid-elem"),s.ajax&&(D=s.param,i(s,"param",function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(u("param-ajax-traditional","jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),D.call(this,e,t)},"param-ajax-traditional")),c(s.fn,"andSelf",s.fn.addBack,"andSelf","jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),s.Deferred&&(W=s.Deferred,_=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],i(s,"Deferred",function(e){var a=W(),i=a.promise();function t(){var o=arguments;return s.Deferred(function(n){s.each(_,function(e,t){var r="function"==typeof o[e]&&o[e];a[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===i?n.promise():this,r?[e]:arguments)})}),o=null}).promise()}return c(a,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),c(i,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),e&&e.call(a,a),a},"deferred-pipe"),s.Deferred.exceptionHook=W.exceptionHook),s});]]> - - +~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0
    - 1?a[1]:a[0];break;case S+"X":l[2]=r.tan(M(a));break;case S+"Y":l[1]=r.tan(M(a));break;case x:a=a.split(",");l[0]=a[0];l[1]=a[1];l[2]=a[2];l[3]=a[3];l[4]=parseInt(a[4],10);l[5]=parseInt(a[5],10);break}c[0]=f[0]*l[0]+f[2]*l[1];c[1]=f[1]*l[0]+f[3]*l[1];c[2]=f[0]*l[2]+f[2]*l[3];c[3]=f[1]*l[2]+f[3]*l[3];c[4]=f[0]*l[4]+f[2]*l[5]+f[4];c[5]=f[1]*l[4]+f[3]*l[5]+f[5];f=[c[0],c[1],c[2],c[3],c[4],c[5]]}return c}function N(e){var t,n,i,s=e[0],o=e[1],u=e[2],a=e[3];if(s*a-o*u){t=r.sqrt(s*s+o*o);s/=t;o/=t;i=s*u+o*a;u-=s*i;a-=o*i;n=r.sqrt(u*u+a*a);u/=n;a/=n;i/=n;if(s*a1?t[1]:e==E?r||t[0]:n+"")]:[n,n];break;case S+"X":case S+"Y":case w:t=t?M(t):0;break;case x:return N(t?_(t):[1,0,0,1,0,0]);break}return[[i,t]]}function L(e){return m.test(e)}function A(e){return e.replace(/(?:\([^)]*\))|\s/g,"")}function O(e,t,n){while(n=t.shift()){e.push(n)}}function M(e){return~e.indexOf("deg")?parseInt(e,10)*(r.PI*2/360):~e.indexOf("grad")?parseInt(e,10)*(r.PI/200):parseFloat(e)}function _(e){e=/([^,]*),([^,]*),([^,]*),([^,]*),([^,p]*)(?:px)?,([^)p]*)(?:px)?/.exec(e);return[e[1],e[2],e[3],e[4],e[5],e[6]]}var s=n.createElement("div"),o=s.style,u="Transform",a=["O"+u,"ms"+u,"Webkit"+u,"Moz"+u],f=a.length,l,c,h="Float32Array"in t,p,d,v=/Matrix([^)]*)/,m=/^\s*matrix\(\s*1\s*,\s*0\s*,\s*0\s*,\s*1\s*(?:,\s*0(?:px)?\s*){2}\)\s*$/,g="transform",y="transformOrigin",b="translate",w="rotate",E="scale",S="skew",x="matrix";while(f--){if(a[f]in o){e.support[g]=l=a[f];e.support[y]=l+"Origin";continue}}if(!l){e.support.matrixFilter=c=o.filter===""}e.cssNumber[g]=e.cssNumber[y]=true;if(l&&l!=g){e.cssProps[g]=l;e.cssProps[y]=l+"Origin";if(l=="Moz"+u){p={get:function(t,n){return n?e.css(t,l).split("px").join(""):t.style[l]},set:function(e,t){e.style[l]=/matrix\([^)p]*\)/.test(t)?t.replace(/matrix((?:[^,]*,){4})([^,]*),([^)]*)/,x+"$1$2px,$3px"):t}}}else if(/^1\.[0-5](?:\.|$)/.test(e.fn.jquery)){p={get:function(t,n){return n?e.css(t,l.replace(/^ms/,"Ms")):t.style[l]}}}}else if(c){p={get:function(t,n,r){var s=n&&t.currentStyle?t.currentStyle:t.style,o,u;if(s&&v.test(s.filter)){o=RegExp.$1.split(",");o=[o[0].split("=")[1],o[2].split("=")[1],o[1].split("=")[1],o[3].split("=")[1]]}else{o=[1,0,0,1]}if(!e.cssHooks[y]){o[4]=s?parseInt(s.left,10)||0:0;o[5]=s?parseInt(s.top,10)||0:0}else{u=e._data(t,"transformTranslate",i);o[4]=u?u[0]:0;o[5]=u?u[1]:0}return r?o:x+"("+o+")"},set:function(t,n,r){var i=t.style,s,o,u,a;if(!r){i.zoom=1}n=T(n);o=["Matrix("+"M11="+n[0],"M12="+n[2],"M21="+n[1],"M22="+n[3],"SizingMethod='auto expand'"].join();u=(s=t.currentStyle)&&s.filter||i.filter||"";i.filter=v.test(u)?u.replace(v,o):u+" progid:DXImageTransform.Microsoft."+o+")";if(!e.cssHooks[y]){if(a=e.transform.centerOrigin){i[a=="margin"?"marginLeft":"left"]=-(t.offsetWidth/2)+t.clientWidth/2+"px";i[a=="margin"?"marginTop":"top"]=-(t.offsetHeight/2)+t.clientHeight/2+"px"}i.left=n[4]+"px";i.top=n[5]+"px"}else{e.cssHooks[y].set(t,n)}}}}if(p){e.cssHooks[g]=p}d=p&&p.get||e.css;e.fx.step.transform=function(t){var n=t.elem,i=t.start,s=t.end,o=t.pos,u="",a=1e5,f,h,v,m;if(!i||typeof i==="string"){if(!i){i=d(n,l)}if(c){n.style.zoom=1}s=s.split("+=").join(i);e.extend(t,C(i,s));i=t.start;s=t.end}f=i.length;while(f--){h=i[f];v=s[f];m=+false;switch(h[0]){case b:m="px";case E:m||(m="");u=h[0]+"("+r.round((h[1][0]+(v[1][0]-h[1][0])*o)*a)/a+m+","+r.round((h[1][1]+(v[1][1]-h[1][1])*o)*a)/a+m+")"+u;break;case S+"X":case S+"Y":case w:u=h[0]+"("+r.round((h[1]+(v[1]-h[1])*o)*a)/a+"rad)"+u;break}}t.origin&&(u=t.origin+u);p&&p.set?p.set(n,u,+true):n.style[l]=u};e.transform={centerOrigin:"margin"}})(jQuery,window,document,Math)]]> - =0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}t="default"in t?t["default"]:t;var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);]]> - 2&&void 0!==arguments[2]?arguments[2]:{},o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||h.defaultProtocol,this.events=t.events||h.events,this.format=t.format||h.format,this.formatHref=t.formatHref||h.formatHref,this.nl2br=t.nl2br||h.nl2br,this.tagName=t.tagName||h.tagName,this.target=t.target||h.target,this.validate=t.validate||h.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||h.attributes,this.className=t.className||t.linkClass||h.className;for(var e=t.ignoreTags||h.ignoreTags,n=0;n=r)return[];for(;a1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),A=u("mailto:"),L=u("?"),E=u("/"),C=u("_"),P=u(),R=u(),q=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,MAILTO:A,SLASH:E,UNDERSCORE:C,SYM:P,TLD:R,WS:q,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),W="0123456789".split(""),X="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Z=[" ","\f","\r","\t","\x0B"," "," ","᠎"],F=[],J=function(t){return new m(t)},V=J(),$=J(O),tt=J(v),et=J(),nt=J(q);V.on("@",J(y)).on(".",J(w)).on("+",J(S)).on("#",J(N)).on("?",J(L)).on("/",J(E)).on("_",J(C)).on(":",J(k)).on("{",J(H)).on("[",J(B)).on("<",J(U)).on("(",J(M)).on("}",J(D)).on("]",J(I)).on(">",J(K)).on(")",J(_)).on("&",J(G)).on([",",";","!",'"',"'"],J(j)),V.on("\n",J(z)).on(Z,nt),nt.on(Z,nt);for(var ot=0;ot=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var p=l.emit();o.push(new p(t.substr(a-c,c)))}}return o},yt=V,kt=Object.freeze({State:m,TOKENS:Y,run:vt,start:yt}),wt=l();wt.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var jt=n(wt,l(),{type:"email",isLink:!0}),xt=n(wt,l(),{type:"email",isLink:!0,toHref:function(){this.v;return"mailto:"+this.toString()}}),zt=n(wt,l(),{type:"text"}),Ot=n(wt,l(),{type:"nl"}),St=n(wt,l(),{type:"url",isLink:!0,toHref:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof T;)e=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof E;)n=!0,a.push(o[r].toString()),r++;for(;p(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r=0&&u++,n++,c++;if(u<0)for(var p=n-c;p0&&(o.push(new zt(a)),a=[]),n-=u,c-=u;var h=l.emit();o.push(new h(t.slice(n-c,n)))}}return a.length>0&&o.push(new zt(a)),o},fe=Object.freeze({State:d,TOKENS:Nt,run:ge,start:At});Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var me=function(t){return ge(vt(t))},de=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=me(t),o=[],a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=me(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=de,e.inherits=n,e.options=g,e.parser=fe,e.scanner=kt,e.test=be,e.tokenize=me}(self.linkify=self.linkify||{})}();]]> - =0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}t="default"in t?t["default"]:t;var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);]]> + 2&&void 0!==arguments[2]?arguments[2]:{},o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||h.defaultProtocol,this.events=t.events||h.events,this.format=t.format||h.format,this.formatHref=t.formatHref||h.formatHref,this.nl2br=t.nl2br||h.nl2br,this.tagName=t.tagName||h.tagName,this.target=t.target||h.target,this.validate=t.validate||h.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||h.attributes,this.className=t.className||t.linkClass||h.className;for(var e=t.ignoreTags||h.ignoreTags,n=0;n=r)return[];for(;a1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),A=u("mailto:"),L=u("?"),E=u("/"),C=u("_"),P=u(),R=u(),q=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,MAILTO:A,SLASH:E,UNDERSCORE:C,SYM:P,TLD:R,WS:q,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),W="0123456789".split(""),X="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Z=[" ","\f","\r","\t","\x0B"," "," ","᠎"],F=[],J=function(t){return new m(t)},V=J(),$=J(O),tt=J(v),et=J(),nt=J(q);V.on("@",J(y)).on(".",J(w)).on("+",J(S)).on("#",J(N)).on("?",J(L)).on("/",J(E)).on("_",J(C)).on(":",J(k)).on("{",J(H)).on("[",J(B)).on("<",J(U)).on("(",J(M)).on("}",J(D)).on("]",J(I)).on(">",J(K)).on(")",J(_)).on("&",J(G)).on([",",";","!",'"',"'"],J(j)),V.on("\n",J(z)).on(Z,nt),nt.on(Z,nt);for(var ot=0;ot=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var p=l.emit();o.push(new p(t.substr(a-c,c)))}}return o},yt=V,kt=Object.freeze({State:m,TOKENS:Y,run:vt,start:yt}),wt=l();wt.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var jt=n(wt,l(),{type:"email",isLink:!0}),xt=n(wt,l(),{type:"email",isLink:!0,toHref:function(){this.v;return"mailto:"+this.toString()}}),zt=n(wt,l(),{type:"text"}),Ot=n(wt,l(),{type:"nl"}),St=n(wt,l(),{type:"url",isLink:!0,toHref:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof T;)e=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof E;)n=!0,a.push(o[r].toString()),r++;for(;p(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r=0&&u++,n++,c++;if(u<0)for(var p=n-c;p0&&(o.push(new zt(a)),a=[]),n-=u,c-=u;var h=l.emit();o.push(new h(t.slice(n-c,n)))}}return a.length>0&&o.push(new zt(a)),o},fe=Object.freeze({State:d,TOKENS:Nt,run:ge,start:At});Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var me=function(t){return ge(vt(t))},de=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=me(t),o=[],a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=me(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=de,e.inherits=n,e.options=g,e.parser=fe,e.scanner=kt,e.test=be,e.tokenize=me}(self.linkify=self.linkify||{})}();]]> + - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -54542,7 +54654,7 @@ var escapeRegExp; } }); }(jQuery, _)); - - - ":">",'"':""","'":"'","/":"/","`":"`","=":"="};function escapeHtml(string){return String(string).replace(/[&<>"'`=\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var lineHasNonSpace=false;var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;var indentation="";var tagIndex=0;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i"){token=[type,value,start,scanner.pos,indentation,tagIndex,lineHasNonSpace]}else{token=[type,value,start,scanner.pos]}tagIndex++;tokens.push(token);if(type==="#"||type==="^"){sections.push(token)}else if(type==="/"){openSection=sections.pop();if(!openSection)throw new Error('Unopened section "'+value+'" at '+start);if(openSection[1]!==value)throw new Error('Unclosed section "'+openSection[1]+'" at '+start)}else if(type==="name"||type==="{"||type==="&"){nonSpace=true}else if(type==="="){compileTags(value)}}stripSpace();openSection=sections.pop();if(openSection)throw new Error('Unclosed section "'+openSection[1]+'" at '+scanner.pos);return nestTokens(squashTokens(tokens))}function squashTokens(tokens){var squashedTokens=[];var token,lastToken;for(var i=0,numTokens=tokens.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,intermediateValue,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){intermediateValue=context.view;names=name.split(".");index=0;while(intermediateValue!=null&&index")value=this.renderPartial(token,context,partials,config);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context,config);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate,config){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials,config)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j0||!lineHasNonSpace)){partialByNl[i]=filteredIndentation+partialByNl[i]}}return partialByNl.join("\n")};Writer.prototype.renderPartial=function renderPartial(token,context,partials,config){if(!partials)return;var tags=this.getConfigTags(config);var value=isFunction(partials)?partials(token[1]):partials[token[1]];if(value!=null){var lineHasNonSpace=token[6];var tagIndex=token[5];var indentation=token[4];var indentedValue=value;if(tagIndex==0&&indentation){indentedValue=this.indentPartial(value,indentation,lineHasNonSpace)}var tokens=this.parse(indentedValue,tags);return this.renderTokens(tokens,context,partials,indentedValue,config)}};Writer.prototype.unescapedValue=function unescapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return value};Writer.prototype.escapedValue=function escapedValue(token,context,config){var escape=this.getConfigEscape(config)||mustache.escape;var value=context.lookup(token[1]);if(value!=null)return typeof value==="number"&&escape===mustache.escape?String(value):escape(value)};Writer.prototype.rawValue=function rawValue(token){return token[1]};Writer.prototype.getConfigTags=function getConfigTags(config){if(isArray(config)){return config}else if(config&&typeof config==="object"){return config.tags}else{return undefined}};Writer.prototype.getConfigEscape=function getConfigEscape(config){if(config&&typeof config==="object"&&!isArray(config)){return config.escape}else{return undefined}};var mustache={name:"mustache.js",version:"4.2.0",tags:["{{","}}"],clearCache:undefined,escape:undefined,parse:undefined,render:undefined,Scanner:undefined,Context:undefined,Writer:undefined,set templateCache(cache){defaultWriter.templateCache=cache},get templateCache(){return defaultWriter.templateCache}};var defaultWriter=new Writer;mustache.clearCache=function clearCache(){return defaultWriter.clearCache()};mustache.parse=function parse(template,tags){return defaultWriter.parse(template,tags)};mustache.render=function render(template,view,partials,config){if(typeof template!=="string"){throw new TypeError('Invalid template! Template should be a "string" '+'but "'+typeStr(template)+'" was given as the first '+"argument for mustache#render(template, view, partials)")}return defaultWriter.render(template,view,partials,config)};mustache.escape=escapeHtml;mustache.Scanner=Scanner;mustache.Context=Context;mustache.Writer=Writer;return mustache});]]> - \ "); @@ -54861,7 +54973,7 @@ ips.templates.set('support.ticket.supportSummary', " \ {{#lang}}health_ticket_beforeproceeding{{/lang}}\
    \ ");]]>
    - \ {{{contents}}}\ \ @@ -54878,7 +54990,7 @@ ips.templates.set( 'templates.customizationMedia.noSearchResults', "\ {{#lang}}mediaNoResults{{/lang}}\
    \ ");]]>
    -
    @@ -54905,7 +55017,7 @@ ips.templates.set('dashboard.menuItem', ` {{name}} `);]]> - \
    \ @@ -54918,7 +55030,7 @@ ips.templates.set( 'moderatorPermissions.checkUncheckAll', "\
    \ \ ");]]>
    - \ \ {{#lang}}menuManagerNewItem{{/lang}}\ @@ -54952,7 +55064,7 @@ ips.templates.set( 'menuManager.temporaryMenuItem', "\ ips.templates.set( 'menuManager.emptyList', "\
  • {{#lang}}menuManagerEmptyList{{/lang}}
  • \ ");]]>
    - -`);]]> - {{message}}
    +`, { + classList: 'ipsMessage ipsMessage--info', + get message() { + return ips.getString('ips.ui.controls.cannot_load') + } +})]]>
    + \ \ \ @@ -56219,7 +56343,7 @@ ips.templates.set('club.request.decline', "\ ips.templates.set('club.menu.dragHandle', "\  \ ");]]> - \ \ @@ -56230,7 +56354,7 @@ ips.templates.set('messages.view.placeholder', " \ ips.templates.set('messages.main.folderMenu', "\
  • {{name}} {{count}}
  • \ ");]]>
    - @@ -56249,7 +56373,7 @@ ips.templates.set('core.streams.noMore', ` ips.templates.set('core.streams.loadMore', ` {{#lang}}loadNewActivity{{/lang}} `);]]> - \ {{/hasNotifications}}\ @@ -56258,7 +56382,7 @@ ips.templates.set('core.streams.loadMore', ` {{/hasNotifications}}\ {{text}}\ ");]]> - {{title}}\ "); @@ -56404,7 +56528,7 @@ ips.templates.set('vse.colorizer.panel', " \ \ \ ");]]> - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -57100,7 +57224,7 @@ ips.templates.set('vse.colorizer.panel', " \ }; }); }(jQuery, _)); - - =0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t - diff --git a/applications/core/data/lang.xml b/applications/core/data/lang.xml index 69bc5172..bc645180 100644 --- a/applications/core/data/lang.xml +++ b/applications/core/data/lang.xml @@ -1,6 +1,6 @@ - + System a personal conversation a message in a personal conversation @@ -127,7 +127,7 @@ %s is logging in You've chosen to ignore content by %s. You've chosen to ignore signatures by %s. - as]]> + %s as Number to show Devices Show on all devices? @@ -211,6 +211,7 @@ Your submission and email address has been removed We could not locate your submission details. View all + Cannot load author stats at this time. Account More Sections @@ -727,7 +728,6 @@ Mark as By %s - %s, %s By %s By %s, %s]]> @@ -2268,7 +2268,7 @@ follows member history Solutions - See answers + See all answers Answers from %s %s in %s was marked as the answer]]> Reputation @@ -4194,8 +4194,8 @@ Custom iframes Allow links to be converted to iframes? When this is enabled, users with permission will see a button to convert the link to an iframe if the URL's Domain is allowed. - Allowed Domains - Use * as a wildcard. e.g. 'http://*.example.com/*' + Allowed Domain Patterns + * as a wildcard. Note that subdomains must be explicitly specified in a pattern to be allowed. For example, the pattern google.com would not allow https://www.google.com/, but *.google.com or www.google.com would. This setting only applies when saving new content and edits in the future.]]> Moderate iframes in Posts Allow Any iframe can be directly posted. @@ -7036,9 +7036,9 @@ in all areas in %s There are no members to show - %s]]> - %s]]> - Congratulations, you had the most liked content! + You had the most liked content on %s + They last won the day on %s + Congratulations! %s had the most liked content! Days Won The number of times %s had the most number of content likes for a day @@ -9522,6 +9522,10 @@ In PHP8, altering overloaded method signatures within a subclass results in a fa Small screen menu (mobile devices, etc) Icon You may pick a custom icon for this menu item. If none is selected, a context relevant default icon may be used. + Title + Use the node name. + I will enter a different title. + Title Open in IDE You must be in developer mode to use this tool. Build for release @@ -12124,5 +12128,6 @@ In PHP8, altering overloaded method signatures within a subclass results in a fa OS Native Your reply has been sent View Reply + This content cannot be loaded at this time. diff --git a/applications/core/data/theme.xml b/applications/core/data/theme.xml index f59feadf..51ffec0c 100644 --- a/applications/core/data/theme.xml +++ b/applications/core/data/theme.xml @@ -4867,7 +4867,7 @@
  • - {lang="byline" sprintf="$item->author()->name"} {datetime="$item->mapped('date')"} + {lang="byline_name_date" htmlsprintf="$item->author()->name, \IPS\DateTime::ts( $item->mapped('date') )->html(TRUE)"}
  • {{if $item::$commentClass}} @@ -5763,7 +5763,7 @@
  • {lang="editor_attach_other"}
  • {{endif}} @@ -8365,8 +8365,8 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi {$comment->menu()|raw} {{if $comment->author()->member_id}} - - {template="miniProfile" app="core" group="global" params="$comment, $comment->$idField, 'comment'"} + + {template="miniProfileWrap" app="core" group="global" params="$comment->author(), $comment->$idField, 'comment', remoteLoading:true"} {{endif}} @@ -10251,7 +10251,7 @@ data-ips-layout='{theme="view.global_view_mode"}' {{endif}} {{endif}}]]> -