summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/gitblit/Constants.java3
-rw-r--r--src/main/java/com/gitblit/models/Menu.java9
-rw-r--r--src/main/java/com/gitblit/models/NavLink.java2
-rw-r--r--src/main/java/com/gitblit/utils/GitBlitRequestUtils.java47
-rw-r--r--src/main/java/com/gitblit/wicket/GitBlitWebApp.java165
-rw-r--r--src/main/java/com/gitblit/wicket/GitBlitWebSession.java26
-rw-r--r--src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java442
-rw-r--r--src/main/java/com/gitblit/wicket/GitblitRedirectException.java20
-rw-r--r--src/main/java/com/gitblit/wicket/GitblitWicketFilter.java204
-rw-r--r--src/main/java/com/gitblit/wicket/Html5DateField.java11
-rw-r--r--src/main/java/com/gitblit/wicket/MarkupProcessor.java12
-rw-r--r--src/main/java/com/gitblit/wicket/PluginClassResolver.java4
-rw-r--r--src/main/java/com/gitblit/wicket/SessionlessForm.java23
-rw-r--r--src/main/java/com/gitblit/wicket/WicketUtils.java328
-rw-r--r--src/main/java/com/gitblit/wicket/charting/Charts.java3
-rw-r--r--src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java22
-rw-r--r--src/main/java/com/gitblit/wicket/charting/flotr2.custom.css (renamed from src/main/resources/flotr2/flotr2.custom.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/charting/flotr2.min.js (renamed from src/main/resources/flotr2/flotr2.min.js)0
-rw-r--r--src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java2
-rw-r--r--src/main/java/com/gitblit/wicket/ng/NgController.java28
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ActivityPage.java11
-rw-r--r--src/main/java/com/gitblit/wicket/pages/BasePage.html5
-rw-r--r--src/main/java/com/gitblit/wicket/pages/BasePage.java86
-rw-r--r--src/main/java/com/gitblit/wicket/pages/BlamePage.java10
-rw-r--r--src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/BlobPage.java12
-rw-r--r--src/main/java/com/gitblit/wicket/pages/BranchesPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java13
-rw-r--r--src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java21
-rw-r--r--src/main/java/com/gitblit/wicket/pages/CommitPage.java229
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ComparePage.java21
-rw-r--r--src/main/java/com/gitblit/wicket/pages/DashboardPage.java9
-rw-r--r--src/main/java/com/gitblit/wicket/pages/DocPage.java6
-rw-r--r--src/main/java/com/gitblit/wicket/pages/DocsPage.java18
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EditFilePage.java6
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java30
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EditTeamPage.java7
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EditTicketPage.java12
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EditUserPage.java7
-rw-r--r--src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java8
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java27
-rw-r--r--src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/FilestorePage.java11
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ForkPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ForksPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/GitSearchPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/HistoryPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java13
-rw-r--r--src/main/java/com/gitblit/wicket/pages/LogPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/LogoutPage.java14
-rw-r--r--src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java22
-rw-r--r--src/main/java/com/gitblit/wicket/pages/MetricsPage.java5
-rw-r--r--src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java6
-rw-r--r--src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java24
-rw-r--r--src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java5
-rw-r--r--src/main/java/com/gitblit/wicket/pages/NewTicketPage.java10
-rw-r--r--src/main/java/com/gitblit/wicket/pages/NoDocsPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/OverviewPage.java5
-rw-r--r--src/main/java/com/gitblit/wicket/pages/PatchPage.java4
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ProjectPage.java5
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ProjectsPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/RawPage.java53
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ReflogPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/RepositoryPage.java51
-rw-r--r--src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/RootPage.java53
-rw-r--r--src/main/java/com/gitblit/wicket/pages/RootSubPage.java5
-rw-r--r--src/main/java/com/gitblit/wicket/pages/SendProposalPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/SessionPage.java11
-rw-r--r--src/main/java/com/gitblit/wicket/pages/SummaryPage.java7
-rw-r--r--src/main/java/com/gitblit/wicket/pages/TagPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/TagsPage.java2
-rw-r--r--src/main/java/com/gitblit/wicket/pages/TicketPage.java66
-rw-r--r--src/main/java/com/gitblit/wicket/pages/TicketsPage.java35
-rw-r--r--src/main/java/com/gitblit/wicket/pages/TreePage.java191
-rw-r--r--src/main/java/com/gitblit/wicket/pages/UserPage.java9
-rw-r--r--src/main/java/com/gitblit/wicket/panels/AccessPolicyPanel.java2
-rw-r--r--src/main/java/com/gitblit/wicket/panels/BasePanel.java7
-rw-r--r--src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java2
-rw-r--r--src/main/java/com/gitblit/wicket/panels/BranchesPanel.java17
-rw-r--r--src/main/java/com/gitblit/wicket/panels/CommentPanel.java11
-rw-r--r--src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java3
-rw-r--r--src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java3
-rw-r--r--src/main/java/com/gitblit/wicket/panels/HistoryPanel.java6
-rw-r--r--src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java6
-rw-r--r--src/main/java/com/gitblit/wicket/panels/LinkPanel.java26
-rw-r--r--src/main/java/com/gitblit/wicket/panels/LogPanel.java4
-rw-r--r--src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java4
-rw-r--r--src/main/java/com/gitblit/wicket/panels/ObjectContainer.java14
-rw-r--r--src/main/java/com/gitblit/wicket/panels/PagerPanel.java4
-rw-r--r--src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java19
-rw-r--r--src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java11
-rw-r--r--src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java42
-rw-r--r--src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java28
-rw-r--r--src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java2
-rw-r--r--src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java6
-rw-r--r--src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java4
-rw-r--r--src/main/java/com/gitblit/wicket/panels/TagsPanel.java10
-rw-r--r--src/main/java/com/gitblit/wicket/panels/TeamsPanel.java4
-rw-r--r--src/main/java/com/gitblit/wicket/panels/TicketListPanel.java8
-rw-r--r--src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java8
-rw-r--r--src/main/java/com/gitblit/wicket/panels/UsersPanel.java4
-rw-r--r--src/main/java/com/gitblit/wicket/resources/StaticResources.java43
-rw-r--r--src/main/java/com/gitblit/wicket/resources/add_16x16.png (renamed from src/main/resources/add_16x16.png)bin698 -> 698 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/arrow_down.png (renamed from src/main/resources/arrow_down.png)bin189 -> 189 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/arrow_left.png (renamed from src/main/resources/arrow_left.png)bin371 -> 371 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/arrow_line.png (renamed from src/main/resources/arrow_line.png)bin241 -> 241 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/arrow_off.png (renamed from src/main/resources/arrow_off.png)bin178 -> 178 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/arrow_page.png (renamed from src/main/resources/arrow_page.png)bin196 -> 196 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/arrow_project.png (renamed from src/main/resources/arrow_project.png)bin201 -> 201 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/arrow_up.png (renamed from src/main/resources/arrow_up.png)bin189 -> 189 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/background.png (renamed from src/main/resources/background.png)bin561 -> 561 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/barnum_32x32.png (renamed from src/main/resources/barnum_32x32.png)bin1436 -> 1436 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/blank.png (renamed from src/main/resources/blank.png)bin704 -> 704 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/blink32.png (renamed from src/main/resources/blink32.png)bin1749 -> 1749 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/book_16x16.png (renamed from src/main/resources/book_16x16.png)bin542 -> 542 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java58
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap-responsive.css (renamed from src/main/resources/bootstrap/css/bootstrap-responsive.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap.css (renamed from src/main/resources/bootstrap/css/bootstrap.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/css/iconic.css (renamed from src/main/resources/bootstrap/css/iconic.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.afm (renamed from src/main/resources/bootstrap/font/iconic_fill.afm)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.css (renamed from src/main/resources/bootstrap/font/iconic_fill.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.eot (renamed from src/main/resources/bootstrap/font/iconic_fill.eot)bin30846 -> 30846 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.otf (renamed from src/main/resources/bootstrap/font/iconic_fill.otf)bin44808 -> 44808 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.svg (renamed from src/main/resources/bootstrap/font/iconic_fill.svg)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.ttf (renamed from src/main/resources/bootstrap/font/iconic_fill.ttf)bin18080 -> 18080 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.woff (renamed from src/main/resources/bootstrap/font/iconic_fill.woff)bin20560 -> 20560 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.afm (renamed from src/main/resources/bootstrap/font/iconic_stroke.afm)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.css (renamed from src/main/resources/bootstrap/font/iconic_stroke.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.eot (renamed from src/main/resources/bootstrap/font/iconic_stroke.eot)bin32026 -> 32026 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.otf (renamed from src/main/resources/bootstrap/font/iconic_stroke.otf)bin46916 -> 46916 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.svg (renamed from src/main/resources/bootstrap/font/iconic_stroke.svg)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.ttf (renamed from src/main/resources/bootstrap/font/iconic_stroke.ttf)bin18644 -> 18644 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.woff (renamed from src/main/resources/bootstrap/font/iconic_stroke.woff)bin21484 -> 21484 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings-white.png (renamed from src/main/resources/bootstrap/img/glyphicons-halflings-white.png)bin8777 -> 8777 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings.png (renamed from src/main/resources/bootstrap/img/glyphicons-halflings.png)bin13826 -> 13826 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bootstrap/js/bootstrap.js (renamed from src/main/resources/bootstrap/js/bootstrap.js)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bug_16x16.png (renamed from src/main/resources/bug_16x16.png)bin790 -> 790 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_black.png (renamed from src/main/resources/bullet_black.png)bin315 -> 315 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_blue.png (renamed from src/main/resources/bullet_blue.png)bin321 -> 321 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_delete.png (renamed from src/main/resources/bullet_delete.png)bin333 -> 333 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_error.png (renamed from src/main/resources/bullet_error.png)bin368 -> 368 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_feed.png (renamed from src/main/resources/bullet_feed.png)bin448 -> 448 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_green.png (renamed from src/main/resources/bullet_green.png)bin323 -> 323 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_key.png (renamed from src/main/resources/bullet_key.png)bin449 -> 449 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_orange.png (renamed from src/main/resources/bullet_orange.png)bin321 -> 321 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_red.png (renamed from src/main/resources/bullet_red.png)bin323 -> 323 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_white.png (renamed from src/main/resources/bullet_white.png)bin296 -> 296 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/bullet_yellow.png (renamed from src/main/resources/bullet_yellow.png)bin320 -> 320 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/clipboard_13x13.png (renamed from src/main/resources/clipboard_13x13.png)bin590 -> 590 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/clipboard_16x16.png (renamed from src/main/resources/clipboard_16x16.png)bin715 -> 715 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/clippy.png (renamed from src/main/resources/clippy.png)bin561 -> 561 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/clippy.swf (renamed from src/main/resources/clippy.swf)bin5380 -> 5380 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/cold_16x16.png (renamed from src/main/resources/cold_16x16.png)bin599 -> 599 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/commit_branch_16x16.png (renamed from src/main/resources/commit_branch_16x16.png)bin655 -> 655 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/commit_changes_16x16.png (renamed from src/main/resources/commit_changes_16x16.png)bin674 -> 674 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/commit_divide_16x16.png (renamed from src/main/resources/commit_divide_16x16.png)bin651 -> 651 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/commit_join_16x16.png (renamed from src/main/resources/commit_join_16x16.png)bin556 -> 556 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/commit_merge_16x16.png (renamed from src/main/resources/commit_merge_16x16.png)bin508 -> 508 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/commit_up_16x16.png (renamed from src/main/resources/commit_up_16x16.png)bin391 -> 391 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/federated_16x16.png (renamed from src/main/resources/federated_16x16.png)bin760 -> 760 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/feed_16x16.png (renamed from src/main/resources/feed_16x16.png)bin625 -> 625 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_16x16.png (renamed from src/main/resources/file_16x16.png)bin416 -> 416 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_acrobat_16x16.png (renamed from src/main/resources/file_acrobat_16x16.png)bin689 -> 689 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_c_16x16.png (renamed from src/main/resources/file_c_16x16.png)bin676 -> 676 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_code_16x16.png (renamed from src/main/resources/file_code_16x16.png)bin662 -> 662 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_cpp_16x16.png (renamed from src/main/resources/file_cpp_16x16.png)bin726 -> 726 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_cs_16x16.png (renamed from src/main/resources/file_cs_16x16.png)bin779 -> 779 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_doc_16x16.png (renamed from src/main/resources/file_doc_16x16.png)bin604 -> 604 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_excel_16x16.png (renamed from src/main/resources/file_excel_16x16.png)bin703 -> 703 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_h_16x16.png (renamed from src/main/resources/file_h_16x16.png)bin635 -> 635 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_java_16x16.png (renamed from src/main/resources/file_java_16x16.png)bin716 -> 716 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_php_16x16.png (renamed from src/main/resources/file_php_16x16.png)bin432 -> 432 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_ppt_16x16.png (renamed from src/main/resources/file_ppt_16x16.png)bin648 -> 648 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_ruby_16x16.png (renamed from src/main/resources/file_ruby_16x16.png)bin670 -> 670 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_settings_16x16.png (renamed from src/main/resources/file_settings_16x16.png)bin732 -> 732 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_vs_16x16.png (renamed from src/main/resources/file_vs_16x16.png)bin756 -> 756 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_world_16x16.png (renamed from src/main/resources/file_world_16x16.png)bin749 -> 749 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/file_zip_16x16.png (renamed from src/main/resources/file_zip_16x16.png)bin593 -> 593 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/folder_16x16.png (renamed from src/main/resources/folder_16x16.png)bin632 -> 632 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/folder_star_16x16.png (renamed from src/main/resources/folder_star_16x16.png)bin830 -> 830 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/folder_star_32x32.png (renamed from src/main/resources/folder_star_32x32.png)bin1529 -> 1529 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/FontAwesome.java18
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/css/font-awesome.min.css (renamed from src/main/resources/fontawesome/css/font-awesome.min.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/FontAwesome.otf (renamed from src/main/resources/fontawesome/fonts/FontAwesome.otf)bin109688 -> 109688 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.eot (renamed from src/main/resources/fontawesome/fonts/fontawesome-webfont.eot)bin70807 -> 70807 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.svg (renamed from src/main/resources/fontawesome/fonts/fontawesome-webfont.svg)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.ttf (renamed from src/main/resources/fontawesome/fonts/fontawesome-webfont.ttf)bin142072 -> 142072 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.woff (renamed from src/main/resources/fontawesome/fonts/fontawesome-webfont.woff)bin83588 -> 83588 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.woff2 (renamed from src/main/resources/fontawesome/fonts/fontawesome-webfont.woff2)bin66624 -> 66624 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fork-black_16x16.png (renamed from src/main/resources/fork-black_16x16.png)bin457 -> 457 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/fork_16x16.png (renamed from src/main/resources/fork_16x16.png)bin380 -> 380 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/git-black-16x16.png (renamed from src/main/resources/git-black-16x16.png)bin371 -> 371 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/git-black.png (renamed from src/main/resources/git-black.png)bin4980 -> 4980 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/git-black_210x210.png (renamed from src/main/resources/git-black_210x210.png)bin3811 -> 3811 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/git-black_32x32.png (renamed from src/main/resources/git-black_32x32.png)bin677 -> 677 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/git-orange-16x16.png (renamed from src/main/resources/git-orange-16x16.png)bin654 -> 654 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblit-editor.min.css (renamed from src/main/resources/gitblit-editor.min.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblit-editor.min.js (renamed from src/main/resources/gitblit-editor.min.js)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblit.css (renamed from src/main/resources/gitblit.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblt-favicon.png (renamed from src/main/resources/gitblt-favicon.png)bin654 -> 654 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblt-logo.png (renamed from src/main/resources/gitblt-logo.png)bin3050 -> 3050 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblt2.png (renamed from src/main/resources/gitblt2.png)bin6543 -> 6543 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblt2_white.png (renamed from src/main/resources/gitblt2_white.png)bin4408 -> 4408 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblt_25.png (renamed from src/main/resources/gitblt_25.png)bin3040 -> 3040 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitblt_25_white.png (renamed from src/main/resources/gitblt_25_white.png)bin2150 -> 2150 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/github_32x32.png (renamed from src/main/resources/github_32x32.png)bin1714 -> 1714 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/gitweb-favicon.png (renamed from src/main/resources/gitweb-favicon.png)bin164 -> 164 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/health_16x16.png (renamed from src/main/resources/health_16x16.png)bin569 -> 569 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/heart_16x16.png (renamed from src/main/resources/heart_16x16.png)bin742 -> 742 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/hideheader.css (renamed from src/main/resources/hideheader.css)0
-rw-r--r--src/main/java/com/gitblit/wicket/resources/information_16x16.png (renamed from src/main/resources/information_16x16.png)bin764 -> 764 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/lock_16x16.png (renamed from src/main/resources/lock_16x16.png)bin689 -> 689 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/lock_go_16x16.png (renamed from src/main/resources/lock_go_16x16.png)bin777 -> 777 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/lock_pull_16x16.png (renamed from src/main/resources/lock_pull_16x16.png)bin850 -> 850 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/mail_16x16.png (renamed from src/main/resources/mail_16x16.png)bin530 -> 530 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/mirror_16x16.png (renamed from src/main/resources/mirror_16x16.png)bin630 -> 630 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/Octicons.java19
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/octicons-local.ttfbin0 -> 52764 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/octicons.css235
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/octicons.eotbin0 -> 31440 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/octicons.less233
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/octicons.svg198
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/octicons.ttfbin0 -> 31272 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/octicons.woffbin0 -> 17492 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/octicons/sprockets-octicons.scss230
-rw-r--r--src/main/java/com/gitblit/wicket/resources/pixel.png (renamed from src/main/resources/pixel.png)bin178 -> 178 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/rosette_16x16.png (renamed from src/main/resources/rosette_16x16.png)bin646 -> 646 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/rosette_32x32.png (renamed from src/main/resources/rosette_32x32.png)bin1695 -> 1695 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/script_16x16.png (renamed from src/main/resources/script_16x16.png)bin626 -> 626 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/search-icon.png (renamed from src/main/resources/search-icon.png)bin395 -> 395 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/settings_16x16.png (renamed from src/main/resources/settings_16x16.png)bin528 -> 528 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/settings_32x32.png (renamed from src/main/resources/settings_32x32.png)bin1038 -> 1038 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/shield_16x16.png (renamed from src/main/resources/shield_16x16.png)bin704 -> 704 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/smartgithg_32x32.png (renamed from src/main/resources/smartgithg_32x32.png)bin1007 -> 1007 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/sourcetree_32x32.png (renamed from src/main/resources/sourcetree_32x32.png)bin2848 -> 2848 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/sparkleshare_32x32.png (renamed from src/main/resources/sparkleshare_32x32.png)bin1370 -> 1370 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/star_16x16.png (renamed from src/main/resources/star_16x16.png)bin611 -> 611 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/star_32x32.png (renamed from src/main/resources/star_32x32.png)bin1548 -> 1548 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/sub32.png (renamed from src/main/resources/sub32.png)bin954 -> 954 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/tag_16x16.png (renamed from src/main/resources/tag_16x16.png)bin604 -> 604 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/tortoise32.png (renamed from src/main/resources/tortoise32.png)bin1225 -> 1225 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/tower_32x32.png (renamed from src/main/resources/tower_32x32.png)bin1875 -> 1875 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/user_16x16.png (renamed from src/main/resources/user_16x16.png)bin601 -> 601 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/users_16x16.png (renamed from src/main/resources/users_16x16.png)bin918 -> 918 bytes
-rw-r--r--src/main/java/com/gitblit/wicket/resources/vcard_16x16.png (renamed from src/main/resources/vcard_16x16.png)bin642 -> 642 bytes
-rw-r--r--src/main/resources/bootstrap/js/jquery.js4
-rw-r--r--src/test/config/test-users.conf8
252 files changed, 2490 insertions, 1343 deletions
diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java
index 6232552e..9c5291ac 100644
--- a/src/main/java/com/gitblit/Constants.java
+++ b/src/main/java/com/gitblit/Constants.java
@@ -19,6 +19,7 @@ import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.jar.Attributes;
@@ -89,7 +90,7 @@ public class Constants {
public static final String PROPOSAL_EXT = ".json";
- public static final String ENCODING = "UTF-8";
+ public static final String ENCODING = StandardCharsets.UTF_8.name();
public static final int LEN_SHORTLOG = 78;
diff --git a/src/main/java/com/gitblit/models/Menu.java b/src/main/java/com/gitblit/models/Menu.java
index 7c949b3f..7fb46ddc 100644
--- a/src/main/java/com/gitblit/models/Menu.java
+++ b/src/main/java/com/gitblit/models/Menu.java
@@ -2,7 +2,7 @@ package com.gitblit.models;
import java.io.Serializable;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import com.gitblit.utils.StringUtils;
@@ -108,8 +108,9 @@ public class Menu {
isSelected = false;
} else {
parameters = new PageParameters(params);
- if (parameters.containsKey(parameter)) {
- isSelected = params.getString(parameter).equals(value);
+// if (parameters.containsKey(parameter)) {
+ if (!parameters.get(parameter).isEmpty()) {
+ isSelected = params.get(parameter).toString().equals(value);
// set the new selection value
setParameter(parameter, value);
} else {
@@ -125,7 +126,7 @@ public class Menu {
if (StringUtils.isEmpty(value)) {
this.parameters.remove(parameter);
} else {
- this.parameters.put(parameter, value);
+ this.parameters.add(parameter, value);
}
}
}
diff --git a/src/main/java/com/gitblit/models/NavLink.java b/src/main/java/com/gitblit/models/NavLink.java
index 993d6954..a12a37d8 100644
--- a/src/main/java/com/gitblit/models/NavLink.java
+++ b/src/main/java/com/gitblit/models/NavLink.java
@@ -19,7 +19,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import com.gitblit.models.Menu.MenuItem;
diff --git a/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java
new file mode 100644
index 00000000..74b3854b
--- /dev/null
+++ b/src/main/java/com/gitblit/utils/GitBlitRequestUtils.java
@@ -0,0 +1,47 @@
+package com.gitblit.utils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class GitBlitRequestUtils {
+ public static HttpServletRequest getServletRequest() {
+ return (HttpServletRequest) RequestCycle.get().getRequest().getContainerRequest();
+ }
+
+ public static HttpServletResponse getServletResponse() {
+ return (HttpServletResponse) RequestCycle.get().getResponse().getContainerResponse();
+ }
+
+ public static String toAbsoluteUrl(Class<? extends Page> pageClass, PageParameters params) {
+ String relativeUrl = RequestCycle.get().urlFor(pageClass, params).toString();
+ return RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(relativeUrl));
+ }
+
+ /**
+ * COPIED FROM WICKET 1.3 Docs:
+ *
+ * Gets a prefix to make this relative to the context root.
+ *
+ * For example, if your context root is http://server.com/myApp/ and the
+ * request is for /myApp/mountedPage/, then the prefix returned might be
+ * "../../".
+ *
+ * For a particular technology, this might return either an absolute prefix
+ * or a relative one.
+ */
+ public static String getRelativePathPrefixToContextRoot() {
+ // String contextUrl =
+ // RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot();
+ // TODO: test it! i thing deeper mounted pages will not work yet
+ Request r = RequestCycle.get().getRequest();
+ String p = r.getPrefixToContextPath();
+ return p;
+ }
+}
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
index c10d8873..0a2c90c2 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
@@ -15,23 +15,26 @@
*/
package com.gitblit.wicket;
+import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
-import org.apache.wicket.Application;
-import org.apache.wicket.Request;
-import org.apache.wicket.Response;
+import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.Session;
import org.apache.wicket.application.IClassResolver;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.util.time.Duration;
import ro.fortsoft.pf4j.PluginState;
import ro.fortsoft.pf4j.PluginWrapper;
+import com.gitblit.Constants;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.extensions.GitblitWicketPlugin;
@@ -94,6 +97,10 @@ import com.gitblit.wicket.pages.TicketsPage;
import com.gitblit.wicket.pages.TreePage;
import com.gitblit.wicket.pages.UserPage;
import com.gitblit.wicket.pages.UsersPage;
+import com.gitblit.wicket.resources.StaticResources;
+import com.gitblit.wicket.resources.bootstrap.Bootstrap;
+import com.gitblit.wicket.resources.fontawesome.FontAwesome;
+import com.gitblit.wicket.resources.octicons.Octicons;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@@ -134,24 +141,18 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
private final IGitblit gitblit;
private final IServicesManager services;
-
+
private final IFilestoreManager filestoreManager;
+ private static final Instant APPLICATION_STARTUP_TIME = Instant.now();
+
@Inject
- public GitBlitWebApp(
- Provider<IPublicKeyManager> publicKeyManagerProvider,
- Provider<ITicketService> ticketServiceProvider,
- IRuntimeManager runtimeManager,
- IPluginManager pluginManager,
- INotificationManager notificationManager,
- IUserManager userManager,
- IAuthenticationManager authenticationManager,
- IRepositoryManager repositoryManager,
- IProjectManager projectManager,
- IFederationManager federationManager,
- IGitblit gitblit,
- IServicesManager services,
- IFilestoreManager filestoreManager) {
+ public GitBlitWebApp(Provider<IPublicKeyManager> publicKeyManagerProvider,
+ Provider<ITicketService> ticketServiceProvider, IRuntimeManager runtimeManager,
+ IPluginManager pluginManager, INotificationManager notificationManager, IUserManager userManager,
+ IAuthenticationManager authenticationManager, IRepositoryManager repositoryManager,
+ IProjectManager projectManager, IFederationManager federationManager, IGitblit gitblit,
+ IServicesManager services, IFilestoreManager filestoreManager) {
super();
this.publicKeyManagerProvider = publicKeyManagerProvider;
@@ -191,7 +192,7 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
// configure the resource cache duration to 90 days for deployment
if (!isDebugMode()) {
- getResourceSettings().setDefaultCacheDuration(90 * 86400);
+ getResourceSettings().setDefaultCacheDuration(Duration.days(90));
}
// setup the standard gitweb-ish urls
@@ -246,10 +247,14 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
mount("/user", UserPage.class, "user");
mount("/forks", ForksPage.class, "r");
mount("/fork", ForkPage.class, "r");
-
+
// filestore URL
mount("/filestore", FilestorePage.class);
-
+ Bootstrap.install(this);
+ FontAwesome.install(this);
+ Octicons.install(this);
+ StaticResources.install(this);
+
// allow started Wicket plugins to initialize
for (PluginWrapper pluginWrapper : pluginManager.getPlugins()) {
if (PluginState.STARTED != pluginWrapper.getPluginState()) {
@@ -261,16 +266,19 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
}
}
- // customize the Wicket class resolver to load from plugins
+ // customize the Wicket class resolver to load from plugins
IClassResolver coreResolver = getApplicationSettings().getClassResolver();
- PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager);
- getApplicationSettings().setClassResolver(classResolver);
+ PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager);
+ getApplicationSettings().setClassResolver(classResolver);
- getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
+ getMarkupSettings().setDefaultMarkupEncoding(Constants.ENCODING);
}
- /* (non-Javadoc)
- * @see com.gitblit.wicket.Webapp#mount(java.lang.String, java.lang.Class, java.lang.String)
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.gitblit.wicket.Webapp#mount(java.lang.String, java.lang.Class,
+ * java.lang.String)
*/
@Override
public void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
@@ -280,7 +288,10 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
if (!settings.getBoolean(Keys.web.mountParameters, true)) {
parameters = new String[] {};
}
- mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, location, clazz, parameters));
+ // TODO: check if needed with wichet-7
+ // mount(new GitblitParamUrlCodingStrategy(settings, xssFilter,
+ // location, clazz, parameters));
+ mountPage(location, clazz);
// map the mount point to the cache control definition
if (clazz.isAnnotationPresent(CacheControl.class)) {
@@ -289,7 +300,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
}
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#getHomePage()
*/
@Override
@@ -301,7 +314,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return newRepositoryPageClass;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#isCacheablePage(java.lang.String)
*/
@Override
@@ -309,7 +324,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return cacheablePages.containsKey(mountPoint);
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#getCacheControl(java.lang.String)
*/
@Override
@@ -328,7 +345,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return gitBlitWebSession;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#settings()
*/
@Override
@@ -336,7 +355,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return settings;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#xssFilter()
*/
@Override
@@ -344,7 +365,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return xssFilter;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#isDebugMode()
*/
@Override
@@ -353,10 +376,12 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
}
/*
- * These methods look strange... and they are... but they are the first
- * step towards modularization across multiple commits.
+ * These methods look strange... and they are... but they are the first step
+ * towards modularization across multiple commits.
*/
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#getBootDate()
*/
@Override
@@ -364,7 +389,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return runtimeManager.getBootDate();
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#getLastActivityDate()
*/
@Override
@@ -372,7 +399,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return repositoryManager.getLastActivityDate();
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#runtime()
*/
@Override
@@ -380,7 +409,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return runtimeManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#plugins()
*/
@Override
@@ -388,7 +419,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return pluginManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#notifier()
*/
@Override
@@ -396,7 +429,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return notificationManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#users()
*/
@Override
@@ -404,7 +439,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return userManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#authentication()
*/
@Override
@@ -412,7 +449,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return authenticationManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#keys()
*/
@Override
@@ -420,7 +459,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return publicKeyManagerProvider.get();
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#repositories()
*/
@Override
@@ -428,7 +469,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return repositoryManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#projects()
*/
@Override
@@ -436,7 +479,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return projectManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#federation()
*/
@Override
@@ -444,7 +489,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return federationManager;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#gitblit()
*/
@Override
@@ -452,7 +499,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return gitblit;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#services()
*/
@Override
@@ -460,7 +509,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return services;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#tickets()
*/
@Override
@@ -468,7 +519,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return ticketServiceProvider.get();
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see com.gitblit.wicket.Webapp#getTimezone()
*/
@Override
@@ -476,12 +529,16 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
return runtimeManager.getTimezone();
}
+ public Instant getApplicationStartupTime() {
+ return APPLICATION_STARTUP_TIME;
+ }
+
@Override
- public final String getConfigurationType() {
+ public final RuntimeConfigurationType getConfigurationType() {
if (runtimeManager.isDebugMode()) {
- return Application.DEVELOPMENT;
+ return RuntimeConfigurationType.DEVELOPMENT;
}
- return Application.DEPLOYMENT;
+ return RuntimeConfigurationType.DEPLOYMENT;
}
public static GitBlitWebApp get() {
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java
index 31ccf1f5..0e53f315 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java
@@ -21,16 +21,20 @@ import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.wicket.Page;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RedirectToUrlException;
-import org.apache.wicket.Request;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.flow.RedirectToUrlException;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.protocol.http.WebRequestCycle;
import org.apache.wicket.protocol.http.WebSession;
import org.apache.wicket.protocol.http.request.WebClientInfo;
+import com.gitblit.GitBlitServer.Params;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
public final class GitBlitWebSession extends WebSession {
@@ -64,11 +68,15 @@ public final class GitBlitWebSession extends WebSession {
*/
public void cacheRequest(Class<? extends Page> pageClass) {
// build absolute url with correctly encoded parameters?!
- Request req = WebRequestCycle.get().getRequest();
- Map<String, ?> params = req.getRequestParameters().getParameters();
- PageParameters pageParams = new PageParameters(params);
- String relativeUrl = WebRequestCycle.get().urlFor(pageClass, pageParams).toString();
- requestUrl = RequestUtils.toAbsolutePath(relativeUrl);
+ Request req = RequestCycle.get().getRequest();
+ IRequestParameters params = req.getRequestParameters();
+ PageParameters pageParams = new PageParameters();
+ params.getParameterNames().forEach(name->{
+ pageParams.add(name, params.getParameterValue(name));
+ });
+ requestUrl = GitBlitRequestUtils.toAbsoluteUrl(pageClass, pageParams);
+
+
if (isTemporary())
{
// we must bind the temporary session into the session store
diff --git a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java
index 536f88f4..b87a2913 100644
--- a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java
+++ b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java
@@ -1,221 +1,221 @@
-/*
- * Copyright 2011 gitblit.com.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.gitblit.wicket;
-
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.wicket.IRequestTarget;
-import org.apache.wicket.Page;
-import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy;
-import org.apache.wicket.request.RequestParameters;
-import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;
-import org.apache.wicket.util.string.AppendingStringBuffer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.gitblit.IStoredSettings;
-import com.gitblit.Keys;
-import com.gitblit.utils.XssFilter;
-
-/**
- * Simple subclass of mixed parameter url coding strategy that works around the
- * encoded forward-slash issue that is present in some servlet containers.
- *
- * https://issues.apache.org/jira/browse/WICKET-1303
- * http://tomcat.apache.org/security-6.html
- *
- * @author James Moger
- *
- */
-public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy {
-
- private final String[] parameterNames;
-
- private Logger logger = LoggerFactory.getLogger(GitblitParamUrlCodingStrategy.class);
-
- private IStoredSettings settings;
-
- private XssFilter xssFilter;
-
- /**
- * Construct.
- *
- * @param <C>
- * @param mountPath
- * mount path (not empty)
- * @param bookmarkablePageClass
- * class of mounted page (not null)
- * @param parameterNames
- * the parameter names (not null)
- */
- public <C extends Page> GitblitParamUrlCodingStrategy(
- IStoredSettings settings,
- XssFilter xssFilter,
- String mountPath,
- Class<C> bookmarkablePageClass, String[] parameterNames) {
-
- super(mountPath, bookmarkablePageClass, parameterNames);
- this.parameterNames = parameterNames;
- this.settings = settings;
- this.xssFilter = xssFilter;
- }
-
- /**
- * Url encodes a string that is mean for a URL path (e.g., between slashes)
- *
- * @param string
- * string to be encoded
- * @return encoded string
- */
- @Override
- protected String urlEncodePathComponent(String string) {
- char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/');
- if (altChar != '/') {
- string = string.replace('/', altChar);
- }
- return super.urlEncodePathComponent(string);
- }
-
- /**
- * Returns a decoded value of the given value (taken from a URL path
- * section)
- *
- * @param value
- * @return Decodes the value
- */
- @Override
- protected String urlDecodePathComponent(String value) {
- char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/');
- if (altChar != '/') {
- value = value.replace(altChar, '/');
- }
- return super.urlDecodePathComponent(value);
- }
-
- /**
- * Gets the decoded request target.
- *
- * @param requestParameters
- * the request parameters
- * @return the decoded request target
- */
- @Override
- public IRequestTarget decode(RequestParameters requestParameters) {
- Map<String, Object> parameterMap = (Map<String, Object>) requestParameters.getParameters();
- for (Map.Entry<String, Object> entry : parameterMap.entrySet()) {
- String parameter = entry.getKey();
- if (parameter.startsWith(WebRequestCodingStrategy.NAME_SPACE)) {
- // ignore Wicket parameters
- continue;
- }
-
- // sanitize Gitblit request parameters
- Object o = entry.getValue();
- if (o instanceof String) {
- String value = o.toString();
- String safeValue = xssFilter.none(value);
- if (!value.equals(safeValue)) {
- logger.warn("XSS filter triggered on {} URL parameter: {}={}",
- getMountPath(), parameter, value);
- parameterMap.put(parameter, safeValue);
- }
- } else if (o instanceof String[]) {
- String[] values = (String[]) o;
- for (int i = 0; i < values.length; i++) {
- String value = values[i].toString();
- String safeValue = xssFilter.none(value);
- if (!value.equals(safeValue)) {
- logger.warn("XSS filter triggered on {} URL parameter: {}={}",
- getMountPath(), parameter, value);
- values[i] = safeValue;
- }
- }
- }
- }
-
- return super.decode(requestParameters);
- }
-
- /**
- * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer,
- * java.util.Map)
- */
- @Override
- protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters)
- {
- if (!url.endsWith("/"))
- {
- url.append("/");
- }
-
- Set<String> parameterNamesToAdd = new HashSet<String>(parameters.keySet());
-
- // Find index of last specified parameter
- boolean foundParameter = false;
- int lastSpecifiedParameter = parameterNames.length;
- while (lastSpecifiedParameter != 0 && !foundParameter)
- {
- foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]);
- }
-
- if (foundParameter)
- {
- for (int i = 0; i <= lastSpecifiedParameter; i++)
- {
- String parameterName = parameterNames[i];
- final Object param = parameters.get(parameterName);
- String value = param instanceof String[] ? ((String[])param)[0] : ((param == null)
- ? null : param.toString());
- if (value == null)
- {
- value = "";
- }
- if (!url.endsWith("/"))
- {
- url.append("/");
- }
- url.append(urlEncodePathComponent(value));
- parameterNamesToAdd.remove(parameterName);
- }
- }
-
- if (!parameterNamesToAdd.isEmpty())
- {
- boolean first = true;
- for (String parameterName : parameterNamesToAdd)
- {
- final Object param = parameters.get(parameterName);
- if (param instanceof String[]) {
- String [] values = (String[]) param;
- for (String value : values) {
- url.append(first ? '?' : '&');
- url.append(urlEncodeQueryComponent(parameterName)).append("=").append(
- urlEncodeQueryComponent(value));
- first = false;
- }
- } else {
- url.append(first ? '?' : '&');
- String value = String.valueOf(param);
- url.append(urlEncodeQueryComponent(parameterName)).append("=").append(
- urlEncodeQueryComponent(value));
- }
- first = false;
- }
- }
- }
-} \ No newline at end of file
+///*
+// * Copyright 2011 gitblit.com.
+// *
+// * Licensed under the Apache License, Version 2.0 (the "License");
+// * you may not use this file except in compliance with the License.
+// * You may obtain a copy of the License at
+// *
+// * http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing, software
+// * distributed under the License is distributed on an "AS IS" BASIS,
+// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// * See the License for the specific language governing permissions and
+// * limitations under the License.
+// */
+//package com.gitblit.wicket;
+//
+//import java.util.HashSet;
+//import java.util.Map;
+//import java.util.Set;
+//
+//import org.apache.wicket.IRequestTarget;
+//import org.apache.wicket.Page;
+//import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy;
+//import org.apache.wicket.request.RequestParameters;
+//import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;
+//import org.apache.wicket.util.string.AppendingStringBuffer;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//
+//import com.gitblit.IStoredSettings;
+//import com.gitblit.Keys;
+//import com.gitblit.utils.XssFilter;
+//
+///**
+// * Simple subclass of mixed parameter url coding strategy that works around the
+// * encoded forward-slash issue that is present in some servlet containers.
+// *
+// * https://issues.apache.org/jira/browse/WICKET-1303
+// * http://tomcat.apache.org/security-6.html
+// *
+// * @author James Moger
+// *
+// */
+//public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy {
+//
+// private final String[] parameterNames;
+//
+// private Logger logger = LoggerFactory.getLogger(GitblitParamUrlCodingStrategy.class);
+//
+// private IStoredSettings settings;
+//
+// private XssFilter xssFilter;
+//
+// /**
+// * Construct.
+// *
+// * @param <C>
+// * @param mountPath
+// * mount path (not empty)
+// * @param bookmarkablePageClass
+// * class of mounted page (not null)
+// * @param parameterNames
+// * the parameter names (not null)
+// */
+// public <C extends Page> GitblitParamUrlCodingStrategy(
+// IStoredSettings settings,
+// XssFilter xssFilter,
+// String mountPath,
+// Class<C> bookmarkablePageClass, String[] parameterNames) {
+//
+// super(mountPath, bookmarkablePageClass, parameterNames);
+// this.parameterNames = parameterNames;
+// this.settings = settings;
+// this.xssFilter = xssFilter;
+// }
+//
+// /**
+// * Url encodes a string that is mean for a URL path (e.g., between slashes)
+// *
+// * @param string
+// * string to be encoded
+// * @return encoded string
+// */
+// @Override
+// protected String urlEncodePathComponent(String string) {
+// char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/');
+// if (altChar != '/') {
+// string = string.replace('/', altChar);
+// }
+// return super.urlEncodePathComponent(string);
+// }
+//
+// /**
+// * Returns a decoded value of the given value (taken from a URL path
+// * section)
+// *
+// * @param value
+// * @return Decodes the value
+// */
+// @Override
+// protected String urlDecodePathComponent(String value) {
+// char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/');
+// if (altChar != '/') {
+// value = value.replace(altChar, '/');
+// }
+// return super.urlDecodePathComponent(value);
+// }
+//
+// /**
+// * Gets the decoded request target.
+// *
+// * @param requestParameters
+// * the request parameters
+// * @return the decoded request target
+// */
+// @Override
+// public IRequestTarget decode(RequestParameters requestParameters) {
+// Map<String, Object> parameterMap = (Map<String, Object>) requestParameters.getParameters();
+// for (Map.Entry<String, Object> entry : parameterMap.entrySet()) {
+// String parameter = entry.getKey();
+// if (parameter.startsWith(WebRequestCodingStrategy.NAME_SPACE)) {
+// // ignore Wicket parameters
+// continue;
+// }
+//
+// // sanitize Gitblit request parameters
+// Object o = entry.getValue();
+// if (o instanceof String) {
+// String value = o.toString();
+// String safeValue = xssFilter.none(value);
+// if (!value.equals(safeValue)) {
+// logger.warn("XSS filter triggered on {} URL parameter: {}={}",
+// getMountPath(), parameter, value);
+// parameterMap.put(parameter, safeValue);
+// }
+// } else if (o instanceof String[]) {
+// String[] values = (String[]) o;
+// for (int i = 0; i < values.length; i++) {
+// String value = values[i].toString();
+// String safeValue = xssFilter.none(value);
+// if (!value.equals(safeValue)) {
+// logger.warn("XSS filter triggered on {} URL parameter: {}={}",
+// getMountPath(), parameter, value);
+// values[i] = safeValue;
+// }
+// }
+// }
+// }
+//
+// return super.decode(requestParameters);
+// }
+//
+// /**
+// * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer,
+// * java.util.Map)
+// */
+// @Override
+// protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters)
+// {
+// if (!url.endsWith("/"))
+// {
+// url.append("/");
+// }
+//
+// Set<String> parameterNamesToAdd = new HashSet<String>(parameters.keySet());
+//
+// // Find index of last specified parameter
+// boolean foundParameter = false;
+// int lastSpecifiedParameter = parameterNames.length;
+// while (lastSpecifiedParameter != 0 && !foundParameter)
+// {
+// foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]);
+// }
+//
+// if (foundParameter)
+// {
+// for (int i = 0; i <= lastSpecifiedParameter; i++)
+// {
+// String parameterName = parameterNames[i];
+// final Object param = parameters.get(parameterName);
+// String value = param instanceof String[] ? ((String[])param)[0] : ((param == null)
+// ? null : param.toString());
+// if (value == null)
+// {
+// value = "";
+// }
+// if (!url.endsWith("/"))
+// {
+// url.append("/");
+// }
+// url.append(urlEncodePathComponent(value));
+// parameterNamesToAdd.remove(parameterName);
+// }
+// }
+//
+// if (!parameterNamesToAdd.isEmpty())
+// {
+// boolean first = true;
+// for (String parameterName : parameterNamesToAdd)
+// {
+// final Object param = parameters.get(parameterName);
+// if (param instanceof String[]) {
+// String [] values = (String[]) param;
+// for (String value : values) {
+// url.append(first ? '?' : '&');
+// url.append(urlEncodeQueryComponent(parameterName)).append("=").append(
+// urlEncodeQueryComponent(value));
+// first = false;
+// }
+// } else {
+// url.append(first ? '?' : '&');
+// String value = String.valueOf(param);
+// url.append(urlEncodeQueryComponent(parameterName)).append("=").append(
+// urlEncodeQueryComponent(value));
+// }
+// first = false;
+// }
+// }
+// }
+//} \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java
index 4721f0ad..13e246a3 100644
--- a/src/main/java/com/gitblit/wicket/GitblitRedirectException.java
+++ b/src/main/java/com/gitblit/wicket/GitblitRedirectException.java
@@ -15,12 +15,13 @@
*/
package com.gitblit.wicket;
-import org.apache.wicket.AbstractRestartResponseException;
import org.apache.wicket.Page;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RequestCycle;
-import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.request.target.basic.RedirectRequestTarget;
+import org.apache.wicket.RestartResponseException;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+import com.gitblit.utils.GitBlitRequestUtils;
/**
* This exception bypasses the servlet container rewriting relative redirect
@@ -31,7 +32,7 @@ import org.apache.wicket.request.target.basic.RedirectRequestTarget;
*
* @author James Moger
*/
-public class GitblitRedirectException extends AbstractRestartResponseException {
+public class GitblitRedirectException extends RestartResponseException {
private static final long serialVersionUID = 1L;
@@ -40,10 +41,9 @@ public class GitblitRedirectException extends AbstractRestartResponseException {
}
public <C extends Page> GitblitRedirectException(Class<C> pageClass, PageParameters params) {
+ super(pageClass, params);
RequestCycle cycle = RequestCycle.get();
- String relativeUrl = cycle.urlFor(pageClass, params).toString();
- String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
- cycle.setRequestTarget(new RedirectRequestTarget(absoluteUrl));
- cycle.setRedirect(true);
+ String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(pageClass,params);
+ cycle.scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
}
diff --git a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java
index 68ad84a5..2214cbc3 100644
--- a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java
+++ b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java
@@ -81,110 +81,118 @@ public class GitblitWicketFilter extends WicketFilter {
public WebApplication createApplication(WicketFilter filter) {
return webapp;
}
+
+ @Override
+ public void destroy(WicketFilter filter) {
+ // TODO Auto-generated method stub
+
+ }
};
}
-
+
/**
* Determines the last-modified date of the requested resource.
+ *
+ * TODO: check where to reimplement
*
* @param servletRequest
* @return The last modified time stamp
*/
- @Override
- protected long getLastModified(final HttpServletRequest servletRequest) {
- final String pathInfo = getRelativePath(servletRequest);
- if (Strings.isEmpty(pathInfo)) {
- return -1;
- }
- long lastModified = super.getLastModified(servletRequest);
- if (lastModified > -1) {
- return lastModified;
- }
-
- // try to match request against registered CacheControl pages
- String [] paths = pathInfo.split("/");
-
- String page = paths[0];
- String repo = "";
- String commitId = "";
- if (paths.length >= 2) {
- repo = paths[1];
- }
- if (paths.length >= 3) {
- commitId = paths[2];
- }
-
- if (!StringUtils.isEmpty(servletRequest.getParameter("r"))) {
- repo = servletRequest.getParameter("r");
- }
- if (!StringUtils.isEmpty(servletRequest.getParameter("h"))) {
- commitId = servletRequest.getParameter("h");
- }
-
- repo = repo.replace("%2f", "/").replace("%2F", "/").replace(settings.getChar(Keys.web.forwardSlashCharacter, '/'), '/');
-
- GitBlitWebApp app = (GitBlitWebApp) getWebApplication();
- int expires = settings.getInteger(Keys.web.pageCacheExpires, 0);
- if (!StringUtils.isEmpty(page) && app.isCacheablePage(page) && expires > 0) {
- // page can be cached by the browser
- CacheControl cacheControl = app.getCacheControl(page);
- Date bootDate = runtimeManager.getBootDate();
- switch (cacheControl.value()) {
- case ACTIVITY:
- // returns the last activity date of the server
- Date activityDate = repositoryManager.getLastActivityDate();
- if (activityDate != null) {
- return activityDate.after(bootDate) ? activityDate.getTime() : bootDate.getTime();
- }
- return bootDate.getTime();
- case BOOT:
- // return the boot date of the server
- return bootDate.getTime();
- case PROJECT:
- // return the latest change date for the project OR the boot date
- ProjectModel project = projectManager.getProjectModel(StringUtils.getRootPath(repo));
- if (project != null) {
- return project.lastChange.after(bootDate) ? project.lastChange.getTime() : bootDate.getTime();
- }
- break;
- case REPOSITORY:
- // return the lastest change date for the repository OR the boot
- // date, whichever is latest
- RepositoryModel repository = repositoryManager.getRepositoryModel(repo);
- if (repository != null && repository.lastChange != null) {
- return repository.lastChange.after(bootDate) ? repository.lastChange.getTime() : bootDate.getTime();
- }
- break;
- case COMMIT:
- // get the date of the specified commit
- if (StringUtils.isEmpty(commitId)) {
- // no commit id, use boot date
- return bootDate.getTime();
- } else {
- // last modified date is the commit date
- Repository r = null;
- try {
- // return the timestamp of the associated commit
- r = repositoryManager.getRepository(repo);
- if (r != null) {
- RevCommit commit = JGitUtils.getCommit(r, commitId);
- if (commit != null) {
- Date date = JGitUtils.getCommitDate(commit);
- return date.after(bootDate) ? date.getTime() : bootDate.getTime();
- }
- }
- } finally {
- if (r != null) {
- r.close();
- }
- }
- }
- break;
- default:
- break;
- }
- }
-
- return -1;
- }
+// @Override
+// protected long getLastModified(final HttpServletRequest servletRequest) {
+// final String pathInfo = getRelativePath(servletRequest);
+// if (Strings.isEmpty(pathInfo)) {
+// return -1;
+// }
+// long lastModified = super.getLastModified(servletRequest);
+// if (lastModified > -1) {
+// return lastModified;
+// }
+//
+// // try to match request against registered CacheControl pages
+// String [] paths = pathInfo.split("/");
+//
+// String page = paths[0];
+// String repo = "";
+// String commitId = "";
+// if (paths.length >= 2) {
+// repo = paths[1];
+// }
+// if (paths.length >= 3) {
+// commitId = paths[2];
+// }
+//
+// if (!StringUtils.isEmpty(servletRequest.getParameter("r"))) {
+// repo = servletRequest.getParameter("r");
+// }
+// if (!StringUtils.isEmpty(servletRequest.getParameter("h"))) {
+// commitId = servletRequest.getParameter("h");
+// }
+//
+// repo = repo.replace("%2f", "/").replace("%2F", "/").replace(settings.getChar(Keys.web.forwardSlashCharacter, '/'), '/');
+//
+// GitBlitWebApp app = (GitBlitWebApp) getApplication();
+// int expires = settings.getInteger(Keys.web.pageCacheExpires, 0);
+// if (!StringUtils.isEmpty(page) && app.isCacheablePage(page) && expires > 0) {
+// // page can be cached by the browser
+// CacheControl cacheControl = app.getCacheControl(page);
+// Date bootDate = runtimeManager.getBootDate();
+// switch (cacheControl.value()) {
+// case ACTIVITY:
+// // returns the last activity date of the server
+// Date activityDate = repositoryManager.getLastActivityDate();
+// if (activityDate != null) {
+// return activityDate.after(bootDate) ? activityDate.getTime() : bootDate.getTime();
+// }
+// return bootDate.getTime();
+// case BOOT:
+// // return the boot date of the server
+// return bootDate.getTime();
+// case PROJECT:
+// // return the latest change date for the project OR the boot date
+// ProjectModel project = projectManager.getProjectModel(StringUtils.getRootPath(repo));
+// if (project != null) {
+// return project.lastChange.after(bootDate) ? project.lastChange.getTime() : bootDate.getTime();
+// }
+// break;
+// case REPOSITORY:
+// // return the lastest change date for the repository OR the boot
+// // date, whichever is latest
+// RepositoryModel repository = repositoryManager.getRepositoryModel(repo);
+// if (repository != null && repository.lastChange != null) {
+// return repository.lastChange.after(bootDate) ? repository.lastChange.getTime() : bootDate.getTime();
+// }
+// break;
+// case COMMIT:
+// // get the date of the specified commit
+// if (StringUtils.isEmpty(commitId)) {
+// // no commit id, use boot date
+// return bootDate.getTime();
+// } else {
+// // last modified date is the commit date
+// Repository r = null;
+// try {
+// // return the timestamp of the associated commit
+// r = repositoryManager.getRepository(repo);
+// if (r != null) {
+// RevCommit commit = JGitUtils.getCommit(r, commitId);
+// if (commit != null) {
+// Date date = JGitUtils.getCommitDate(commit);
+// return date.after(bootDate) ? date.getTime() : bootDate.getTime();
+// }
+// }
+// } finally {
+// if (r != null) {
+// r.close();
+// }
+// }
+// }
+// break;
+// default:
+// break;
+// }
+// }
+//
+// return -1;
+// }
}
diff --git a/src/main/java/com/gitblit/wicket/Html5DateField.java b/src/main/java/com/gitblit/wicket/Html5DateField.java
index 927ee46e..e606272a 100644
--- a/src/main/java/com/gitblit/wicket/Html5DateField.java
+++ b/src/main/java/com/gitblit/wicket/Html5DateField.java
@@ -10,7 +10,7 @@ import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.convert.converters.DateConverter;
+import org.apache.wicket.util.convert.converter.DateConverter;
public class Html5DateField extends TextField<Date> implements ITextFormatProvider {
@@ -105,8 +105,8 @@ public class Html5DateField extends TextField<Date> implements ITextFormatProvid
* @return A pattern-specific converter
*/
@Override
- public IConverter getConverter(Class<?> type)
- {
+ public <C> IConverter<C> getConverter(Class<C> type) {
+
if (converter == null)
{
return super.getConverter(type);
@@ -148,9 +148,8 @@ public class Html5DateField extends TextField<Date> implements ITextFormatProvid
}
@Override
- protected String getInputType()
- {
- return "date";
+ protected String[] getInputTypes() {
+ return new String[]{"date"};
}
} \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/MarkupProcessor.java b/src/main/java/com/gitblit/wicket/MarkupProcessor.java
index b2032049..40cf9560 100644
--- a/src/main/java/com/gitblit/wicket/MarkupProcessor.java
+++ b/src/main/java/com/gitblit/wicket/MarkupProcessor.java
@@ -30,7 +30,7 @@ import java.util.List;
import java.util.Map;
import org.apache.wicket.Page;
-import org.apache.wicket.RequestCycle;
+import org.apache.wicket.request.cycle.RequestCycle;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
@@ -53,10 +53,12 @@ import org.pegdown.plugins.ToHtmlSerializerPlugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.gitblit.Constants;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.models.PathModel;
import com.gitblit.servlet.RawServlet;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
@@ -268,7 +270,7 @@ public class MarkupProcessor {
if (imagePath.indexOf("://") == -1) {
// relative image
String path = doc.getRelativePath(imagePath);
- String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot();
+ String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot();
url = RawServlet.asLink(contextUrl, repositoryName, commitId, path);
} else {
// absolute image
@@ -325,7 +327,7 @@ public class MarkupProcessor {
if (node.url.indexOf("://") == -1) {
// repository-relative image link
String path = doc.getRelativePath(node.url);
- String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot();
+ String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot();
String url = RawServlet.asLink(contextUrl, repositoryName, commitId, path);
return new Rendering(url, text);
}
@@ -339,7 +341,7 @@ public class MarkupProcessor {
if (url.indexOf("://") == -1) {
// repository-relative image link
String path = doc.getRelativePath(url);
- String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot();
+ String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot();
String wurl = RawServlet.asLink(contextUrl, repositoryName, commitId, path);
rendering = new Rendering(wurl, alt);
} else {
@@ -368,7 +370,7 @@ public class MarkupProcessor {
String fsc = settings.getString(Keys.web.forwardSlashCharacter, "/");
String encodedPath = document.replace(' ', '-');
try {
- encodedPath = URLEncoder.encode(encodedPath, "UTF-8");
+ encodedPath = URLEncoder.encode(encodedPath, Constants.ENCODING);
} catch (UnsupportedEncodingException e) {
logger.error(null, e);
}
diff --git a/src/main/java/com/gitblit/wicket/PluginClassResolver.java b/src/main/java/com/gitblit/wicket/PluginClassResolver.java
index 476f9611..0693891c 100644
--- a/src/main/java/com/gitblit/wicket/PluginClassResolver.java
+++ b/src/main/java/com/gitblit/wicket/PluginClassResolver.java
@@ -117,4 +117,8 @@ public class PluginClassResolver implements IClassResolver {
}
}
}
+
+ @Override
+ public ClassLoader getClassLoader() {
+ return getClass().getClassLoader(); }
} \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/SessionlessForm.java b/src/main/java/com/gitblit/wicket/SessionlessForm.java
index 6f790717..d3a9c9c3 100644
--- a/src/main/java/com/gitblit/wicket/SessionlessForm.java
+++ b/src/main/java/com/gitblit/wicket/SessionlessForm.java
@@ -15,21 +15,22 @@
*/
package com.gitblit.wicket;
+import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.markup.html.form.StatelessForm;
-import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.protocol.http.WicketURLDecoder;
-import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy;
+import org.apache.wicket.util.encoding.UrlDecoder;
import org.apache.wicket.util.string.AppendingStringBuffer;
import org.apache.wicket.util.string.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.gitblit.Constants;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.wicket.pages.BasePage;
/**
@@ -100,12 +101,12 @@ public class SessionlessForm<T> extends StatelessForm<T> {
* The open tag for the body
*/
@Override
- protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag)
+ public void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag)
{
// render the hidden bookmarkable page field
AppendingStringBuffer buffer = new AppendingStringBuffer(HIDDEN_DIV_START);
buffer.append("<input type=\"hidden\" name=\"")
- .append(WebRequestCodingStrategy.BOOKMARKABLE_PAGE_PARAMETER_NAME)
+ .append("wicket:bookmarkablePage")
.append("\" value=\":")
.append(pageClass.getName())
.append("\" />");
@@ -113,7 +114,7 @@ public class SessionlessForm<T> extends StatelessForm<T> {
// insert the page parameters, if any, as hidden fields as long as they
// do not collide with any child wicket:id of the form.
if (pageParameters != null) {
- for (String key : pageParameters.keySet()) {
+ for (String key : pageParameters.getNamedKeys()) {
Component c = get(key);
if (c != null) {
// this form has a field id which matches the
@@ -121,7 +122,7 @@ public class SessionlessForm<T> extends StatelessForm<T> {
log.warn(MessageFormat.format("Skipping page parameter \"{0}\" from sessionless form hidden fields because it collides with a form child wicket:id", key));
continue;
}
- String value = pageParameters.getString(key);
+ String value = pageParameters.get(key).toString();
buffer.append("<input type=\"hidden\" name=\"")
.append(recode(key))
.append("\" value=\"")
@@ -143,7 +144,7 @@ public class SessionlessForm<T> extends StatelessForm<T> {
* @return reencoded value
*/
private String recode(String s) {
- String un = WicketURLDecoder.QUERY_INSTANCE.decode(s);
+ String un = UrlDecoder.QUERY_INSTANCE.decode(s, Constants.ENCODING);
return Strings.escapeMarkup(un).toString();
}
@@ -152,8 +153,6 @@ public class SessionlessForm<T> extends StatelessForm<T> {
}
protected String getAbsoluteUrl(Class<? extends BasePage> pageClass, PageParameters pageParameters) {
- String relativeUrl = urlFor(pageClass, pageParameters).toString();
- String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
- return absoluteUrl;
+ return GitBlitRequestUtils.toAbsoluteUrl(pageClass, pageParameters);
}
}
diff --git a/src/main/java/com/gitblit/wicket/WicketUtils.java b/src/main/java/com/gitblit/wicket/WicketUtils.java
index 99c1e08f..356b35b6 100644
--- a/src/main/java/com/gitblit/wicket/WicketUtils.java
+++ b/src/main/java/com/gitblit/wicket/WicketUtils.java
@@ -26,19 +26,19 @@ import java.util.TimeZone;
import javax.servlet.http.HttpServletRequest;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.Request;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ContextRelativeResource;
import org.apache.wicket.behavior.AttributeAppender;
-import org.apache.wicket.behavior.HeaderContributor;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
-import org.apache.wicket.markup.html.IHeaderContributor;
-import org.apache.wicket.markup.html.IHeaderResponse;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.StringHeaderItem;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.model.Model;
-import org.apache.wicket.protocol.http.WebRequest;
-import org.apache.wicket.resource.ContextRelativeResource;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import com.gitblit.Constants;
@@ -49,6 +49,7 @@ import com.gitblit.Keys;
import com.gitblit.models.FederationModel;
import com.gitblit.models.Metric;
import com.gitblit.utils.DiffUtils.DiffComparator;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.TimeUtils;
@@ -56,7 +57,7 @@ import com.gitblit.utils.TimeUtils;
public class WicketUtils {
public static void setCssClass(Component container, String value) {
- container.add(new SimpleAttributeModifier("class", value));
+ container.add(new AttributeModifier("class", value));
}
public static void addCssClass(Component container, String value) {
@@ -64,21 +65,20 @@ public class WicketUtils {
}
public static void setCssStyle(Component container, String value) {
- container.add(new SimpleAttributeModifier("style", value));
+ container.add(new AttributeModifier("style", value));
}
public static void setCssBackground(Component container, String value) {
- String background = MessageFormat.format("background-color:{0};",
- StringUtils.getColor(value));
- container.add(new SimpleAttributeModifier("style", background));
+ String background = MessageFormat.format("background-color:{0};", StringUtils.getColor(value));
+ container.add(new AttributeModifier("style", background));
}
public static Component setHtmlTooltip(Component container, String value) {
- return container.add(new SimpleAttributeModifier("title", value));
+ return container.add(new AttributeModifier("title", value));
}
public static void setInputPlaceholder(Component container, String value) {
- container.add(new SimpleAttributeModifier("placeholder", value));
+ container.add(new AttributeModifier("placeholder", value));
}
public static void setChangeTypeCssClass(Component container, ChangeType type) {
@@ -175,8 +175,7 @@ public class WicketUtils {
return newImage(wicketId, "file_h_16x16.png");
} else if (filename.endsWith(".sln")) {
return newImage(wicketId, "file_vs_16x16.png");
- } else if (filename.endsWith(".csv") || filename.endsWith(".xls")
- || filename.endsWith(".xlsx")) {
+ } else if (filename.endsWith(".csv") || filename.endsWith(".xls") || filename.endsWith(".xlsx")) {
return newImage(wicketId, "file_excel_16x16.png");
} else if (filename.endsWith(".doc") || filename.endsWith(".docx")) {
return newImage(wicketId, "file_doc_16x16.png");
@@ -202,14 +201,11 @@ public class WicketUtils {
return newImage(wicketId, "file_16x16.png");
}
- public static ContextImage getRegistrationImage(String wicketId, FederationModel registration,
- Component c) {
+ public static ContextImage getRegistrationImage(String wicketId, FederationModel registration, Component c) {
if (registration.isResultData()) {
- return WicketUtils.newImage(wicketId, "information_16x16.png",
- c.getString("gb.federationResults"));
+ return WicketUtils.newImage(wicketId, "information_16x16.png", c.getString("gb.federationResults"));
} else {
- return WicketUtils.newImage(wicketId, "arrow_left.png",
- c.getString("gb.federationRegistration"));
+ return WicketUtils.newImage(wicketId, "arrow_left.png", c.getString("gb.federationRegistration"));
}
}
@@ -251,17 +247,16 @@ public class WicketUtils {
}
public static String getGitblitURL(Request request) {
- HttpServletRequest req = ((WebRequest) request).getHttpServletRequest();
+ HttpServletRequest req = GitBlitRequestUtils.getServletRequest();
return HttpUtils.getGitblitURL(req);
}
- public static HeaderContributor syndicationDiscoveryLink(final String feedTitle,
- final String url) {
- return new HeaderContributor(new IHeaderContributor() {
+ public static Behavior syndicationDiscoveryLink(final String feedTitle, final String url) {
+ return new Behavior() {
private static final long serialVersionUID = 1L;
@Override
- public void renderHead(IHeaderResponse response) {
+ public void renderHead(Component c, IHeaderResponse response) {
String contentType = "application/rss+xml";
StringBuilder buffer = new StringBuilder();
@@ -269,226 +264,154 @@ public class WicketUtils {
buffer.append("type=\"").append(contentType).append("\" ");
buffer.append("title=\"").append(feedTitle).append("\" ");
buffer.append("href=\"").append(url).append("\" />");
- response.renderString(buffer.toString());
+ response.render(StringHeaderItem.forString(buffer.toString()));
}
- });
+ };
}
public static PageParameters newTokenParameter(String token) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("t", token);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("t", token);
}
- public static PageParameters newRegistrationParameter(String url,
- String name) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("u", url);
- parameterMap.put("n", name);
- return new PageParameters(parameterMap);
+ public static PageParameters newRegistrationParameter(String url, String name) {
+ return new PageParameters().add("u", url).add("n", name);
}
public static PageParameters newUsernameParameter(String username) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("user", username);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("user", username);
}
public static PageParameters newTeamnameParameter(String teamname) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("team", teamname);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("team", teamname);
}
public static PageParameters newProjectParameter(String projectName) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("p", projectName);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("p", projectName);
}
public static PageParameters newRepositoryParameter(String repositoryName) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- if (!StringUtils.isEmpty(repositoryName)) {
- parameterMap.put("r", repositoryName);
- }
- return new PageParameters(parameterMap);
+ return new PageParameters().add("r", repositoryName);
}
public static PageParameters newObjectParameter(String objectId) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("h", objectId);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("h", objectId);
}
- public static PageParameters newObjectParameter(String repositoryName,
- String objectId) {
- Map<String, String> parameterMap = new HashMap<String, String>();
+ public static PageParameters newObjectParameter(String repositoryName, String objectId) {
if (StringUtils.isEmpty(objectId)) {
return newRepositoryParameter(repositoryName);
}
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", objectId);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("r", repositoryName).add("h", objectId);
}
- public static PageParameters newDiffParameter(String repositoryName,
- String objectId, DiffComparator diffComparator) {
- Map<String, String> parameterMap = new HashMap<String, String>();
+ public static PageParameters newDiffParameter(String repositoryName, String objectId,
+ DiffComparator diffComparator) {
if (StringUtils.isEmpty(objectId)) {
return newRepositoryParameter(repositoryName);
}
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", objectId);
- parameterMap.put("w", "" + diffComparator.ordinal());
- return new PageParameters(parameterMap);
+ return new PageParameters().add("r", repositoryName).add("h", objectId).add("w", "" + diffComparator.ordinal());
}
- public static PageParameters newDiffParameter(String repositoryName,
- String objectId, DiffComparator diffComparator, String blobPath) {
- Map<String, String> parameterMap = new HashMap<String, String>();
+ public static PageParameters newDiffParameter(String repositoryName, String objectId, DiffComparator diffComparator,
+ String blobPath) {
if (StringUtils.isEmpty(objectId)) {
return newRepositoryParameter(repositoryName);
}
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", objectId);
- parameterMap.put("w", "" + diffComparator.ordinal());
- parameterMap.put("f", blobPath);
- return new PageParameters(parameterMap);
+ return newDiffParameter(repositoryName, objectId, diffComparator).add("f", blobPath);
}
- public static PageParameters newRangeParameter(String repositoryName,
- String startRange, String endRange) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", startRange + ".." + endRange);
- return new PageParameters(parameterMap);
+ public static PageParameters newRangeParameter(String repositoryName, String startRange, String endRange) {
+ return new PageParameters().add("r", repositoryName).add("h", startRange + ".." + endRange);
}
- public static PageParameters newPathParameter(String repositoryName,
- String objectId, String path) {
- Map<String, String> parameterMap = new HashMap<String, String>();
+ public static PageParameters newPathParameter(String repositoryName, String objectId, String path) {
if (StringUtils.isEmpty(path)) {
return newObjectParameter(repositoryName, objectId);
}
if (StringUtils.isEmpty(objectId)) {
- parameterMap.put("r", repositoryName);
- parameterMap.put("f", path);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("r", repositoryName).add("f", path);
}
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", objectId);
- parameterMap.put("f", path);
- return new PageParameters(parameterMap);
+ return new PageParameters().add("r", repositoryName).add("h", objectId).add("f", path);
}
- public static PageParameters newLogPageParameter(String repositoryName,
- String objectId, int pageNumber) {
- Map<String, String> parameterMap = new HashMap<String, String>();
+ public static PageParameters newLogPageParameter(String repositoryName, String objectId, int pageNumber) {
if (pageNumber <= 1) {
return newObjectParameter(repositoryName, objectId);
}
if (StringUtils.isEmpty(objectId)) {
- parameterMap.put("r", repositoryName);
- parameterMap.put("pg", String.valueOf(pageNumber));
- return new PageParameters(parameterMap);
+ return new PageParameters().add("r", repositoryName).add("pg", String.valueOf(pageNumber));
}
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", objectId);
- parameterMap.put("pg", String.valueOf(pageNumber));
- return new PageParameters(parameterMap);
+ return new PageParameters().add("r", repositoryName).add("h", objectId).add("pg", String.valueOf(pageNumber));
}
- public static PageParameters newHistoryPageParameter(String repositoryName,
- String objectId, String path, int pageNumber) {
- Map<String, String> parameterMap = new HashMap<String, String>();
+ public static PageParameters newHistoryPageParameter(String repositoryName, String objectId, String path, int pageNumber) {
if (pageNumber <= 1) {
return newObjectParameter(repositoryName, objectId);
}
- if (StringUtils.isEmpty(objectId)) {
- parameterMap.put("r", repositoryName);
- parameterMap.put("f", path);
- parameterMap.put("pg", String.valueOf(pageNumber));
- return new PageParameters(parameterMap);
+
+ PageParameters pp = new PageParameters();
+ pp.add("r", repositoryName);
+ pp.add("f", path);
+ pp.add("pg", String.valueOf(pageNumber));
+ if (!StringUtils.isEmpty(objectId)) {
+ pp.add("h", objectId);
}
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", objectId);
- parameterMap.put("f", path);
- parameterMap.put("pg", String.valueOf(pageNumber));
- return new PageParameters(parameterMap);
+ return pp;
}
public static PageParameters newFilestorePageParameter(int pageNumber, String filter) {
- Map<String, String> parameterMap = new HashMap<String, String>();
-
+ PageParameters pp = new PageParameters();
if (pageNumber > 1) {
- parameterMap.put("pg", String.valueOf(pageNumber));
+ pp.add("pg", String.valueOf(pageNumber));
}
if (filter != null) {
- parameterMap.put("s", String.valueOf(filter));
+ pp.add("s", String.valueOf(filter));
}
-
- return new PageParameters(parameterMap);
- }
-
- public static PageParameters newBlobDiffParameter(String repositoryName,
- String baseCommitId, String commitId, String path) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- if (StringUtils.isEmpty(commitId)) {
- parameterMap.put("r", repositoryName);
- parameterMap.put("f", path);
- parameterMap.put("hb", baseCommitId);
- return new PageParameters(parameterMap);
- }
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", commitId);
- parameterMap.put("f", path);
- parameterMap.put("hb", baseCommitId);
- return new PageParameters(parameterMap);
- }
-
- public static PageParameters newSearchParameter(String repositoryName,
- String commitId, String search, Constants.SearchType type) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- if (StringUtils.isEmpty(commitId)) {
- parameterMap.put("r", repositoryName);
- parameterMap.put("s", search);
- parameterMap.put("st", type.name());
- return new PageParameters(parameterMap);
- }
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", commitId);
- parameterMap.put("s", search);
- parameterMap.put("st", type.name());
- return new PageParameters(parameterMap);
- }
-
- public static PageParameters newSearchParameter(String repositoryName,
- String commitId, String search, Constants.SearchType type,
- int pageNumber) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- if (StringUtils.isEmpty(commitId)) {
- parameterMap.put("r", repositoryName);
- parameterMap.put("s", search);
- parameterMap.put("st", type.name());
- parameterMap.put("pg", String.valueOf(pageNumber));
- return new PageParameters(parameterMap);
- }
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", commitId);
- parameterMap.put("s", search);
- parameterMap.put("st", type.name());
- parameterMap.put("pg", String.valueOf(pageNumber));
- return new PageParameters(parameterMap);
- }
-
- public static PageParameters newBlameTypeParameter(String repositoryName,
- String commitId, String path, String blameType) {
- Map<String, String> parameterMap = new HashMap<String, String>();
- parameterMap.put("r", repositoryName);
- parameterMap.put("h", commitId);
- parameterMap.put("f", path);
- parameterMap.put("blametype", blameType);
- return new PageParameters(parameterMap);
+
+ return pp;
+ }
+
+ public static PageParameters newBlobDiffParameter(String repositoryName, String baseCommitId, String commitId,
+ String path) {
+ PageParameters pp = new PageParameters();
+ pp.add("r", repositoryName);
+ pp.add("f", path);
+ pp.add("hb", baseCommitId);
+ if (!StringUtils.isEmpty(commitId)) {
+ pp.add("h", commitId);
+ }
+ return pp;
+ }
+
+ public static PageParameters newSearchParameter(String repositoryName, String commitId, String search,
+ Constants.SearchType type) {
+ PageParameters pp = new PageParameters();
+ pp.add("r", repositoryName);
+ pp.add("s", search);
+ pp.add("st", type.name());
+ if (!StringUtils.isEmpty(commitId)) {
+ pp.add("h", commitId);
+ }
+ return pp;
+ }
+
+ public static PageParameters newSearchParameter(String repositoryName, String commitId, String search,
+ Constants.SearchType type, int pageNumber) {
+ PageParameters pp = new PageParameters();
+ pp.add("r", repositoryName);
+ pp.add("s", search);
+ pp.add("st", type.name());
+ pp.add("pg", String.valueOf(pageNumber));
+ if (!StringUtils.isEmpty(commitId)) {
+ pp.add("h", commitId);
+ }
+ return pp;
+ }
+
+ public static PageParameters newBlameTypeParameter(String repositoryName, String commitId, String path,
+ String blameType) {
+ return new PageParameters().add("r", repositoryName).add("h", commitId).add("f", path).add("blametype",
+ blameType);
}
public static PageParameters newTicketsParameters(String repositoryName, String... states) {
@@ -506,84 +429,85 @@ public class WicketUtils {
}
public static String getProjectName(PageParameters params) {
- return params.getString("p", "");
+ return params.get("p").toString("");
}
public static String getRepositoryName(PageParameters params) {
- return params.getString("r", "");
+ return params.get("r").toString("");
}
public static String getObject(PageParameters params) {
- return params.getString("h", null);
+ return params.get("h").toString(null);
}
public static String getPath(PageParameters params) {
- return params.getString("f", null);
+ return params.get("f").toString(null);
}
public static String getBaseObjectId(PageParameters params) {
- return params.getString("hb", null);
+ return params.get("hb").toString(null);
}
public static String getSearchString(PageParameters params) {
- return params.getString("s", null);
+ return params.get("s").toString(null);
}
public static String getSearchType(PageParameters params) {
- return params.getString("st", null);
+ return params.get("st").toString(null);
}
public static DiffComparator getDiffComparator(PageParameters params) {
- int ordinal = params.getInt("w", 0);
+ int ordinal = params.get("w").toInt(0);
return DiffComparator.values()[ordinal];
}
public static int getPage(PageParameters params) {
// index from 1
- return params.getInt("pg", 1);
+ return params.get("pg").toInt(1);
}
public static String getRegEx(PageParameters params) {
- return params.getString("x", "");
+ return params.get("x").toString("");
}
public static String getSet(PageParameters params) {
- return params.getString("set", "");
+ return params.get("set").toString("");
}
public static String getTeam(PageParameters params) {
- return params.getString("team", "");
+ return params.get("team").toString("");
}
public static int getDaysBack(PageParameters params) {
- return params.getInt("db", 0);
+ return params.get("db").toInt(0);
}
public static String getUsername(PageParameters params) {
- return params.getString("user", "");
+ return params.get("user").toString("");
}
public static String getTeamname(PageParameters params) {
- return params.getString("team", "");
+ return params.get("team").toString("");
}
public static String getToken(PageParameters params) {
- return params.getString("t", "");
+ return params.get("t").toString("");
}
public static String getUrlParameter(PageParameters params) {
- return params.getString("u", "");
+ return params.get("u").toString("");
}
public static String getNameParameter(PageParameters params) {
- return params.getString("n", "");
+ return params.get("n").toString("");
}
public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) {
return createDateLabel(wicketId, date, timeZone, timeUtils, true);
}
- public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils, boolean setCss) {
+ public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils,
+ boolean setCss) {
String format = GitBlitWebApp.get().settings().getString(Keys.web.datestampShortFormat, "MM/dd/yy");
DateFormat df = new SimpleDateFormat(format);
if (timeZone == null) {
diff --git a/src/main/java/com/gitblit/wicket/charting/Charts.java b/src/main/java/com/gitblit/wicket/charting/Charts.java
index 54a7689b..fa765bbd 100644
--- a/src/main/java/com/gitblit/wicket/charting/Charts.java
+++ b/src/main/java/com/gitblit/wicket/charting/Charts.java
@@ -18,6 +18,7 @@ package com.gitblit.wicket.charting;
import java.util.ArrayList;
import java.util.List;
+import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.html.IHeaderContributor;
/**
@@ -26,7 +27,7 @@ import org.apache.wicket.markup.html.IHeaderContributor;
* @author Tim Ryan
*
*/
-public abstract class Charts implements IHeaderContributor {
+public abstract class Charts extends Behavior {
private static final long serialVersionUID = 1L;
diff --git a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java
index 7a8adcf2..ba31831c 100644
--- a/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java
+++ b/src/main/java/com/gitblit/wicket/charting/Flotr2Charts.java
@@ -17,8 +17,12 @@ package com.gitblit.wicket.charting;
import javax.servlet.ServletContext;
-import org.apache.wicket.markup.html.IHeaderResponse;
-import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.request.resource.PackageResourceReference;
/**
* Concrete class for Flotr2 charts
@@ -31,20 +35,15 @@ public class Flotr2Charts extends Charts {
private static final long serialVersionUID = 1L;
@Override
- public void renderHead(IHeaderResponse response) {
+ public void renderHead(Component component, IHeaderResponse response) {
// add Google Chart JS API reference
- ServletContext servletContext = WebApplication.get().getServletContext();
- String contextPath = servletContext.getContextPath();
-
- response.renderJavascriptReference(contextPath + "/bootstrap/js/jquery.js");
- response.renderJavascriptReference(contextPath + "/flotr2/flotr2.min.js");
- response.renderCSSReference(contextPath + "/flotr2/flotr2.custom.css");
+ response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(Flotr2Charts.class, "flotr2.min.js")));
+ response.render(CssHeaderItem.forReference(new PackageResourceReference(Flotr2Charts.class, "flotr2.custom.css")));
// prepare draw chart function
StringBuilder sb = new StringBuilder();
- line(sb, "$( document ).ready(function() {");
line(sb, "try {");
// add charts to header
for (Chart chart : charts) {
@@ -57,8 +56,7 @@ public class Flotr2Charts extends Charts {
line(sb, " }");
line(sb, "}");
// end draw chart function
- line(sb, "});");
- response.renderJavascript(sb.toString(), null);
+ response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
}
@Override
diff --git a/src/main/resources/flotr2/flotr2.custom.css b/src/main/java/com/gitblit/wicket/charting/flotr2.custom.css
index d3f92707..d3f92707 100644
--- a/src/main/resources/flotr2/flotr2.custom.css
+++ b/src/main/java/com/gitblit/wicket/charting/flotr2.custom.css
diff --git a/src/main/resources/flotr2/flotr2.min.js b/src/main/java/com/gitblit/wicket/charting/flotr2.min.js
index c348a695..c348a695 100644
--- a/src/main/resources/flotr2/flotr2.min.js
+++ b/src/main/java/com/gitblit/wicket/charting/flotr2.min.js
diff --git a/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java b/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java
index aaf1a135..f5d1726d 100644
--- a/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java
+++ b/src/main/java/com/gitblit/wicket/freemarker/FreemarkerPanel.java
@@ -120,7 +120,7 @@ public class FreemarkerPanel extends Panel
* MarkupStream, org.apache.wicket.markup.ComponentTag)
*/
@Override
- protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag)
+ public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag)
{
if (!Strings.isEmpty(stackTraceAsString))
{
diff --git a/src/main/java/com/gitblit/wicket/ng/NgController.java b/src/main/java/com/gitblit/wicket/ng/NgController.java
index 19e419a0..65ba78cd 100644
--- a/src/main/java/com/gitblit/wicket/ng/NgController.java
+++ b/src/main/java/com/gitblit/wicket/ng/NgController.java
@@ -17,11 +17,16 @@ package com.gitblit.wicket.ng;
import java.text.MessageFormat;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
-import org.apache.wicket.ResourceReference;
-import org.apache.wicket.markup.html.IHeaderContributor;
-import org.apache.wicket.markup.html.IHeaderResponse;
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.head.HeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.resource.JQueryResourceReference;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -34,7 +39,7 @@ import com.google.gson.GsonBuilder;
* @author James Moger
*
*/
-public class NgController implements IHeaderContributor {
+public class NgController extends Behavior {
private static final long serialVersionUID = 1L;
@@ -52,9 +57,18 @@ public class NgController implements IHeaderContributor {
}
@Override
- public void renderHead(IHeaderResponse response) {
+ public void renderHead(Component component, IHeaderResponse response) {
// add Google AngularJS reference
- response.renderJavascriptReference(new ResourceReference(NgController.class, "angular.js"));
+ response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(NgController.class, "angular.js"){
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public List<HeaderItem> getDependencies() {
+ List<HeaderItem> deps = super.getDependencies();
+ deps.add(JavaScriptHeaderItem.forReference(JQueryResourceReference.get()));
+ return deps;
+ }
+ }));
Gson gson = new GsonBuilder().create();
@@ -69,7 +83,7 @@ public class NgController implements IHeaderContributor {
}
line(sb, "}");
- response.renderJavascript(sb.toString(), null);
+ response.render(JavaScriptHeaderItem.forScript(sb.toString(), "angularController-"+name));
}
private void line(StringBuilder sb, String line) {
diff --git a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java
index c505a666..82e64c15 100644
--- a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java
@@ -24,8 +24,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.HeaderContributor;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Fragment;
@@ -118,8 +117,8 @@ public class ActivityPage extends RootPage {
// create the activity charts
if (app().settings().getBoolean(Keys.web.generateActivityGraph, true)) {
Charts charts = createCharts(recentActivity);
- add(new HeaderContributor(charts));
- add(new Fragment("chartsPanel", "chartsFragment", this));
+ add(charts);
+ add(new Fragment("chartsPanel", "chartsFragment", ActivityPage.this));
} else {
add(new Label("chartsPanel").setVisible(false));
}
@@ -141,8 +140,8 @@ public class ActivityPage extends RootPage {
PageParameters currentParameters = getPageParameters();
int daysBack = app().settings().getInteger(Keys.web.activityDuration, 7);
- if (currentParameters != null && !currentParameters.containsKey("db")) {
- currentParameters.put("db", daysBack);
+ if (currentParameters != null && currentParameters.get("db").isEmpty()) {
+ currentParameters.add("db", daysBack);
}
// preserve time filter options on repository choices
diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.html b/src/main/java/com/gitblit/wicket/pages/BasePage.html
index b998428c..9b026982 100644
--- a/src/main/java/com/gitblit/wicket/pages/BasePage.html
+++ b/src/main/java/com/gitblit/wicket/pages/BasePage.html
@@ -7,11 +7,11 @@
<!-- Head -->
<wicket:head>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<title wicket:id="title">[page title]</title>
+
<link rel="icon" href="gitblt-favicon.png" type="image/png" />
-
<link rel="stylesheet" href="bootstrap/css/bootstrap.css"/>
<link rel="stylesheet" href="bootstrap/css/iconic.css"/>
<link rel="stylesheet" href="fontawesome/css/font-awesome.min.css"/>
@@ -49,7 +49,6 @@
</style>
<!-- Include scripts at end for faster page loading -->
- <script type="text/javascript" src="bootstrap/js/jquery.js"></script>
<script type="text/javascript" src="bootstrap/js/bootstrap.js"></script>
<wicket:container wicket:id="bottomScripts"></wicket:container>
</body>
diff --git a/src/main/java/com/gitblit/wicket/pages/BasePage.java b/src/main/java/com/gitblit/wicket/pages/BasePage.java
index 0d99f5e5..51e671c8 100644
--- a/src/main/java/com/gitblit/wicket/pages/BasePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/BasePage.java
@@ -31,23 +31,23 @@ import java.util.Set;
import java.util.TimeZone;
import java.util.regex.Pattern;
-import javax.servlet.http.HttpServletRequest;
-
import org.apache.commons.io.IOUtils;
import org.apache.wicket.Application;
import org.apache.wicket.Page;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RedirectToUrlException;
-import org.apache.wicket.markup.html.CSSPackageResource;
+import org.apache.wicket.request.flow.RedirectToUrlException;
+import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ContextRelativeResourceReference;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.resource.JQueryResourceReference;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
-import org.apache.wicket.markup.html.resources.JavascriptResourceReference;
import org.apache.wicket.markup.repeater.RepeatingView;
-import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.protocol.http.WebResponse;
-import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
-import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import org.apache.wicket.util.time.Duration;
import org.apache.wicket.util.time.Time;
import org.slf4j.Logger;
@@ -62,27 +62,31 @@ import com.gitblit.Keys;
import com.gitblit.models.ProjectModel;
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.TimeUtils;
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.GitBlitWebApp;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.resources.bootstrap.Bootstrap;
public abstract class BasePage extends SessionPage {
+ private static final long serialVersionUID = 1L;
+
private transient Logger logger;
private transient TimeUtils timeUtils;
public BasePage() {
super();
- customizeHeader();
+ // customizeHeader();
}
public BasePage(PageParameters params) {
super(params);
- customizeHeader();
+ // customizeHeader();
}
protected Logger logger() {
@@ -92,17 +96,21 @@ public abstract class BasePage extends SessionPage {
return logger;
}
- private void customizeHeader() {
+ @Override
+ public void renderHead(IHeaderResponse response) {
+ super.renderHead(response);
+ response.render(JavaScriptHeaderItem.forReference(JQueryResourceReference.get()));
+
if (app().settings().getBoolean(Keys.web.useResponsiveLayout, true)) {
- add(CSSPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css"));
+ response.render(CssHeaderItem.forReference(Application.get().getSharedResources().get(Bootstrap.BOOTSTRAP_RESPONSIVE_CSS_RESOURCE)));
}
if (app().settings().getBoolean(Keys.web.hideHeader, false)) {
- add(CSSPackageResource.getHeaderContribution("hideheader.css"));
+ response.render(CssHeaderItem.forReference(new ContextRelativeResourceReference("/hideheader.css", false)));
}
}
protected String getContextUrl() {
- return getRequest().getRelativePathPrefixToContextRoot();
+ return GitBlitRequestUtils.getRelativePathPrefixToContextRoot();
}
protected String getCanonicalUrl() {
@@ -110,9 +118,7 @@ public abstract class BasePage extends SessionPage {
}
protected String getCanonicalUrl(Class<? extends BasePage> clazz, PageParameters params) {
- String relativeUrl = urlFor(clazz, params).toString();
- String canonicalUrl = RequestUtils.toAbsolutePath(relativeUrl);
- return canonicalUrl;
+ return GitBlitRequestUtils.toAbsoluteUrl(clazz, params);
}
protected void redirectTo(Class<? extends BasePage> pageClass) {
@@ -121,7 +127,7 @@ public abstract class BasePage extends SessionPage {
protected void redirectTo(Class<? extends BasePage> pageClass, PageParameters parameters) {
String absoluteUrl = getCanonicalUrl(pageClass, parameters);
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
protected String getLanguageCode() {
@@ -136,7 +142,8 @@ public abstract class BasePage extends SessionPage {
if (timeUtils == null) {
ResourceBundle bundle;
try {
- bundle = ResourceBundle.getBundle("com.gitblit.wicket.GitBlitWebApp", GitBlitWebSession.get().getLocale());
+ bundle = ResourceBundle.getBundle("com.gitblit.wicket.GitBlitWebApp",
+ GitBlitWebSession.get().getLocale());
} catch (Throwable t) {
bundle = ResourceBundle.getBundle("com.gitblit.wicket.GitBlitWebApp");
}
@@ -164,7 +171,7 @@ public abstract class BasePage extends SessionPage {
}
@Override
- protected void setHeaders(WebResponse response) {
+ protected void setHeaders(WebResponse response) {
// set canonical link as http header for SEO (issue-304)
// https://support.google.com/webmasters/answer/139394?hl=en
response.setHeader("Link", MessageFormat.format("<{0}>; rel=\"canonical\"", getCanonicalUrl()));
@@ -184,7 +191,7 @@ public abstract class BasePage extends SessionPage {
}
/**
- * Sets the last-modified header date, if appropriate, for this page. The
+ * Sets the last-modified header date, if appropriate, for this page. The
* date used is determined by the CacheControl annotation.
*
*/
@@ -227,7 +234,8 @@ public abstract class BasePage extends SessionPage {
int expires = app().settings().getInteger(Keys.web.pageCacheExpires, 0);
WebResponse response = (WebResponse) getResponse();
response.setLastModifiedTime(Time.valueOf(when));
- response.setDateHeader("Expires", System.currentTimeMillis() + Duration.minutes(expires).getMilliseconds());
+ response.addHeader("Expires",
+ String.valueOf(System.currentTimeMillis() + Duration.minutes(expires).getMilliseconds()));
}
protected String getPageTitle(String repositoryName) {
@@ -245,7 +253,8 @@ public abstract class BasePage extends SessionPage {
protected void setupPage(String repositoryName, String pageName) {
add(new Label("title", getPageTitle(repositoryName)));
getBottomScriptContainer();
- String rootLinkUrl = app().settings().getString(Keys.web.rootLink, urlFor(GitBlitWebApp.get().getHomePage(), null).toString());
+ String rootLinkUrl = app().settings().getString(Keys.web.rootLink,
+ urlFor(GitBlitWebApp.get().getHomePage(), null).toString());
ExternalLink rootLink = new ExternalLink("rootLink", rootLinkUrl);
WicketUtils.setHtmlTooltip(rootLink, app().settings().getString(Keys.web.siteName, Constants.NAME));
add(rootLink);
@@ -347,14 +356,12 @@ public abstract class BasePage extends SessionPage {
}
protected TimeZone getTimeZone() {
- return app().settings().getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get()
- .getTimezone() : app().getTimezone();
+ return app().settings().getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get().getTimezone()
+ : app().getTimezone();
}
protected String getServerName() {
- ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest();
- HttpServletRequest req = servletWebRequest.getHttpServletRequest();
- return req.getServerName();
+ return GitBlitRequestUtils.getServletRequest().getServerName();
}
protected List<ProjectModel> getProjectModels() {
@@ -371,7 +378,7 @@ public abstract class BasePage extends SessionPage {
boolean hasParameter = false;
String regex = WicketUtils.getRegEx(params);
String team = WicketUtils.getTeam(params);
- int daysBack = params.getInt("db", 0);
+ int daysBack = params.get("db").toInt(0);
int maxDaysBack = app().settings().getInteger(Keys.web.activityDurationMaximum, 30);
List<ProjectModel> availableModels = getProjectModels();
@@ -462,14 +469,13 @@ public abstract class BasePage extends SessionPage {
public void error(String message, Throwable t, Class<? extends Page> toPage, PageParameters params) {
if (t == null) {
- logger().error(message + " for " + GitBlitWebSession.get().getUsername());
+ logger().error(message + " for " + GitBlitWebSession.get().getUsername());
} else {
- logger().error(message + " for " + GitBlitWebSession.get().getUsername(), t);
+ logger().error(message + " for " + GitBlitWebSession.get().getUsername(), t);
}
if (toPage != null) {
GitBlitWebSession.get().cacheErrorMessage(message);
- String relativeUrl = urlFor(toPage, params).toString();
- String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
+ String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(toPage, params);
throw new RedirectToUrlException(absoluteUrl);
} else {
super.error(message);
@@ -477,7 +483,7 @@ public abstract class BasePage extends SessionPage {
}
public void authenticationError(String message) {
- logger().error(getRequest().getURL() + " for " + GitBlitWebSession.get().getUsername());
+ logger().error(getRequest().getUrl() + " for " + GitBlitWebSession.get().getUsername());
if (!GitBlitWebSession.get().isLoggedIn()) {
// cache the request if we have not authenticated.
// the request will continue after authentication.
@@ -519,15 +525,17 @@ public abstract class BasePage extends SessionPage {
}
/**
- * Adds a HTML script element loading the javascript designated by the given path.
+ * Adds a HTML script element loading the javascript designated by the given
+ * path.
*
* @param scriptPath
- * page-relative path to the Javascript resource; normally starts with "scripts/"
+ * page-relative path to the Javascript resource; normally starts
+ * with "scripts/"
*/
protected void addBottomScript(String scriptPath) {
RepeatingView bottomScripts = getBottomScriptContainer();
Label script = new Label(bottomScripts.newChildId(), "<script type='text/javascript' src='"
- + urlFor(new JavascriptResourceReference(this.getClass(), scriptPath)) + "'></script>\n");
+ + urlFor(new JavaScriptResourceReference(this.getClass(), scriptPath), null) + "'></script>\n");
bottomScripts.add(script.setEscapeModelStrings(false).setRenderBodyOnly(true));
}
diff --git a/src/main/java/com/gitblit/wicket/pages/BlamePage.java b/src/main/java/com/gitblit/wicket/pages/BlamePage.java
index 2fcca0ae..e9c2aca1 100644
--- a/src/main/java/com/gitblit/wicket/pages/BlamePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/BlamePage.java
@@ -27,9 +27,9 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -90,7 +90,7 @@ public class BlamePage extends RepositoryPage {
final String blobPath = WicketUtils.getPath(params);
- final String blameTypeParam = params.getString("blametype", BlameType.COMMIT.toString());
+ final String blameTypeParam = params.get("blametype").toString(BlameType.COMMIT.toString());
final BlameType activeBlameType = BlameType.get(blameTypeParam);
RevCommit commit = getCommit();
@@ -145,7 +145,7 @@ public class BlamePage extends RepositoryPage {
new BookmarkablePageLink<Void>(blameByLinkText, BlamePage.class, blameTypePageParam);
if (activeBlameType == type) {
- blameByPageLink.add(new SimpleAttributeModifier("style", "font-weight:bold;"));
+ blameByPageLink.add(new AttributeModifier("style", "font-weight:bold;"));
}
add(blameByPageLink);
@@ -226,7 +226,7 @@ public class BlamePage extends RepositoryPage {
break;
}
Component data = new Label("data", StringUtils.escapeForHtml(entry.data, true, tabLength)).setEscapeModelStrings(false);
- data.add(new SimpleAttributeModifier("style", "background-color: " + color + ";"));
+ data.add(new AttributeModifier("style", "background-color: " + color + ";"));
item.add(data);
}
};
diff --git a/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java b/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java
index adf815e6..cf0413e3 100644
--- a/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/BlobDiffPage.java
@@ -17,7 +17,7 @@ package com.gitblit.wicket.pages;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.eclipse.jgit.lib.Repository;
diff --git a/src/main/java/com/gitblit/wicket/pages/BlobPage.java b/src/main/java/com/gitblit/wicket/pages/BlobPage.java
index 1ef8f227..0c9bc626 100644
--- a/src/main/java/com/gitblit/wicket/pages/BlobPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/BlobPage.java
@@ -20,8 +20,8 @@ import java.util.HashMap;
import java.util.Map;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RedirectException;
+import org.apache.wicket.RestartResponseException;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -54,7 +54,7 @@ public class BlobPage extends RepositoryPage {
String [] encodings = getEncodings();
if (StringUtils.isEmpty(objectId) && StringUtils.isEmpty(blobPath)) {
- throw new RedirectException(TreePage.class, WicketUtils.newRepositoryParameter(repositoryName));
+ throw new RestartResponseException(TreePage.class, WicketUtils.newRepositoryParameter(repositoryName));
}
if (StringUtils.isEmpty(blobPath)) {
@@ -127,7 +127,7 @@ public class BlobPage extends RepositoryPage {
case 3:
// binary blobs
add(new Label("blobText", "Binary File"));
- add(new Image("blobImage").setVisible(false));
+ add(new Image("blobImage", "blobImage").setVisible(false));
break;
default:
// plain text
@@ -140,7 +140,7 @@ public class BlobPage extends RepositoryPage {
addBottomScriptInline("jQuery(prettyPrint);");
}
add(new Label("blobText", table).setEscapeModelStrings(false));
- add(new Image("blobImage").setVisible(false));
+ add(new Image("blobImage", "blobImage").setVisible(false));
fileExtension = extension;
}
} else {
@@ -154,7 +154,7 @@ public class BlobPage extends RepositoryPage {
addBottomScriptInline("jQuery(prettyPrint);");
}
add(new Label("blobText", table).setEscapeModelStrings(false));
- add(new Image("blobImage").setVisible(false));
+ add(new Image("blobImage", "blobImage").setVisible(false));
}
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/BranchesPage.java b/src/main/java/com/gitblit/wicket/pages/BranchesPage.java
index fe7483e4..d30a68c7 100644
--- a/src/main/java/com/gitblit/wicket/pages/BranchesPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/BranchesPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.CacheControl.LastModified;
diff --git a/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java b/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java
index 259a4bf4..95850c63 100644
--- a/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ChangePasswordPage.java
@@ -22,18 +22,19 @@ import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
-import org.apache.wicket.protocol.http.WebRequest;
-import org.apache.wicket.protocol.http.WebResponse;
import com.gitblit.GitBlitException;
import com.gitblit.Keys;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.NonTrimmedPasswordTextField;
public class ChangePasswordPage extends RootSubPage {
+ private static final long serialVersionUID = 1L;
+
IModel<String> password = new Model<String>("");
IModel<String> confirmPassword = new Model<String>("");
@@ -100,16 +101,13 @@ public class ChangePasswordPage extends RootSubPage {
try {
app().gitblit().reviseUser(user.username, user);
if (app().settings().getBoolean(Keys.web.allowCookieAuthentication, false)) {
- WebRequest request = (WebRequest) getRequestCycle().getRequest();
- WebResponse response = (WebResponse) getRequestCycle().getResponse();
- app().authentication().setCookie(request.getHttpServletRequest(),
- response.getHttpServletResponse(), user);
+ app().authentication().setCookie(GitBlitRequestUtils.getServletRequest(),
+ GitBlitRequestUtils.getServletResponse(), user);
}
} catch (GitBlitException e) {
error(e.getMessage());
return;
}
- setRedirect(false);
info(getString("gb.passwordChanged"));
setResponsePage(RepositoriesPage.class);
}
@@ -128,7 +126,6 @@ public class ChangePasswordPage extends RootSubPage {
@Override
public void onSubmit() {
- setRedirect(false);
error(getString("gb.passwordChangeAborted"));
setResponsePage(RepositoriesPage.class);
}
diff --git a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
index f127517d..2092bba7 100644
--- a/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java
@@ -20,7 +20,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -28,7 +29,6 @@ import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
import org.apache.wicket.util.resource.IResourceStream;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
@@ -61,6 +61,8 @@ import com.gitblit.wicket.panels.RefsPanel;
@CacheControl(LastModified.BOOT)
public class CommitDiffPage extends RepositoryPage {
+ private static final long serialVersionUID = 1L;
+
public CommitDiffPage(PageParameters params) {
super(params);
@@ -191,8 +193,9 @@ public class CommitDiffPage extends RepositoryPage {
}
};
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }}));
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); }}));
}
else
{
@@ -240,8 +243,9 @@ public class CommitDiffPage extends RepositoryPage {
};
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }});
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); }});
item.add(new Link<Object>("raw", null) {
@@ -264,8 +268,9 @@ public class CommitDiffPage extends RepositoryPage {
};
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }});
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); }});
} else {
item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils
.newPathParameter(repositoryName, entry.commitId, entry.path))
diff --git a/src/main/java/com/gitblit/wicket/pages/CommitPage.java b/src/main/java/com/gitblit/wicket/pages/CommitPage.java
index 3998204d..4b01fbde 100644
--- a/src/main/java/com/gitblit/wicket/pages/CommitPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/CommitPage.java
@@ -20,7 +20,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -29,7 +30,6 @@ import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.StringResourceModel;
-import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
import org.apache.wicket.util.resource.IResourceStream;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
@@ -58,6 +58,8 @@ import com.gitblit.wicket.panels.RefsPanel;
@CacheControl(LastModified.BOOT)
public class CommitPage extends RepositoryPage {
+ private static final long serialVersionUID = 1L;
+
public CommitPage(PageParameters params) {
super(params);
@@ -76,11 +78,10 @@ public class CommitPage extends RepositoryPage {
add(new Label("parentLink", "none"));
add(new Label("commitdiffLink", getString("gb.commitdiff")));
} else {
- add(new LinkPanel("parentLink", null, getShortObjectId(parents.get(0)),
- CommitPage.class, newCommitParameter(parents.get(0))));
- add(new LinkPanel("commitdiffLink", null, new StringResourceModel("gb.commitdiff",
- this, null), CommitDiffPage.class, WicketUtils.newObjectParameter(
- repositoryName, objectId)));
+ add(new LinkPanel("parentLink", null, getShortObjectId(parents.get(0)), CommitPage.class,
+ newCommitParameter(parents.get(0))));
+ add(new LinkPanel("commitdiffLink", null, new StringResourceModel("gb.commitdiff", this, null),
+ CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
}
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId)));
@@ -91,18 +92,17 @@ public class CommitPage extends RepositoryPage {
// author
add(createPersonPanel("commitAuthor", c.getAuthorIdent(), Constants.SearchType.AUTHOR));
- add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(),
- getTimeZone(), getTimeUtils()));
+ add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(), getTimeZone(),
+ getTimeUtils()));
// committer
add(createPersonPanel("commitCommitter", c.getCommitterIdent(), Constants.SearchType.COMMITTER));
- add(WicketUtils.createTimestampLabel("commitCommitterDate",
- c.getCommitterIdent().getWhen(), getTimeZone(), getTimeUtils()));
+ add(WicketUtils.createTimestampLabel("commitCommitterDate", c.getCommitterIdent().getWhen(), getTimeZone(),
+ getTimeUtils()));
add(new Label("commitId", c.getName()));
- add(new LinkPanel("commitTree", "list", c.getTree().getName(), TreePage.class,
- newCommitParameter()));
+ add(new LinkPanel("commitTree", "list", c.getTree().getName(), TreePage.class, newCommitParameter()));
add(new BookmarkablePageLink<Void>("treeLink", TreePage.class, newCommitParameter()));
final String baseUrl = WicketUtils.getGitblitURL(getRequest());
@@ -116,12 +116,9 @@ public class CommitPage extends RepositoryPage {
@Override
public void populateItem(final Item<String> item) {
String entry = item.getModelObject();
- item.add(new LinkPanel("commitParent", "list", entry, CommitPage.class,
- newCommitParameter(entry)));
- item.add(new BookmarkablePageLink<Void>("view", CommitPage.class,
- newCommitParameter(entry)));
- item.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class,
- newCommitParameter(entry)));
+ item.add(new LinkPanel("commitParent", "list", entry, CommitPage.class, newCommitParameter(entry)));
+ item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, newCommitParameter(entry)));
+ item.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class, newCommitParameter(entry)));
}
};
add(parentsView);
@@ -138,13 +135,13 @@ public class CommitPage extends RepositoryPage {
public void populateItem(final Item<GitNote> item) {
GitNote entry = item.getModelObject();
item.add(new RefsPanel("refName", repositoryName, Arrays.asList(entry.notesRef)));
- item.add(createPersonPanel("authorName", entry.notesRef.getAuthorIdent(),
- Constants.SearchType.AUTHOR));
+ item.add(createPersonPanel("authorName", entry.notesRef.getAuthorIdent(), Constants.SearchType.AUTHOR));
item.add(new AvatarImage("noteAuthorAvatar", entry.notesRef.getAuthorIdent()));
- item.add(WicketUtils.createTimestampLabel("authorDate", entry.notesRef
- .getAuthorIdent().getWhen(), getTimeZone(), getTimeUtils()));
- item.add(new Label("noteContent", bugtraqProcessor().processPlainCommitMessage(getRepository(), repositoryName,
- entry.content)).setEscapeModelStrings(false));
+ item.add(WicketUtils.createTimestampLabel("authorDate", entry.notesRef.getAuthorIdent().getWhen(),
+ getTimeZone(), getTimeUtils()));
+ item.add(new Label("noteContent",
+ bugtraqProcessor().processPlainCommitMessage(getRepository(), repositoryName, entry.content))
+ .setEscapeModelStrings(false));
}
};
add(notesView.setVisible(notes.size() > 0));
@@ -170,22 +167,21 @@ public class CommitPage extends RepositoryPage {
@Override
public void populateItem(final Item<PathChangeModel> item) {
final PathChangeModel entry = item.getModelObject();
-
+
Label changeType = new Label("changeType", "");
WicketUtils.setChangeTypeCssClass(changeType, entry.changeType);
setChangeTypeTooltip(changeType, entry.changeType);
item.add(changeType);
item.add(new DiffStatPanel("diffStat", entry.insertions, entry.deletions, true));
item.add(WicketUtils.setHtmlTooltip(new Label("filestore", ""), getString("gb.filestore"))
- .setVisible(entry.isFilestoreItem()));
+ .setVisible(entry.isFilestoreItem()));
boolean hasSubmodule = false;
String submodulePath = null;
if (entry.isTree()) {
// tree
item.add(new LinkPanel("pathName", null, entry.path, TreePage.class,
- WicketUtils
- .newPathParameter(repositoryName, entry.commitId, entry.path)));
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
} else if (entry.isSubmodule()) {
// submodule
String submoduleId = entry.objectId;
@@ -193,9 +189,9 @@ public class CommitPage extends RepositoryPage {
submodulePath = submodule.gitblitPath;
hasSubmodule = submodule.hasSubmodule;
- item.add(new LinkPanel("pathName", "list", entry.path + " @ " +
- getShortObjectId(submoduleId), TreePage.class,
- WicketUtils.newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule));
+ item.add(new LinkPanel("pathName", "list", entry.path + " @ " + getShortObjectId(submoduleId),
+ TreePage.class, WicketUtils.newPathParameter(submodulePath, submoduleId, ""))
+ .setEnabled(hasSubmodule));
} else {
// blob
String displayPath = entry.path;
@@ -204,125 +200,132 @@ public class CommitPage extends RepositoryPage {
path = JGitUtils.getStringContent(getRepository(), getCommit().getTree(), path);
displayPath = entry.path + " -> " + path;
}
-
+
if (entry.isFilestoreItem()) {
item.add(new LinkPanel("pathName", "list", entry.path, new Link<Object>("link", null) {
-
+
private static final long serialVersionUID = 1L;
@Override
- public void onClick() {
-
- IResourceStream resourceStream = new AbstractResourceStreamWriter() {
-
+ public void onClick() {
+
+ IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+
private static final long serialVersionUID = 1L;
- @Override
- public void write(OutputStream output) {
- UserModel user = GitBlitWebSession.get().getUser();
- user = user == null ? UserModel.ANONYMOUS : user;
-
- app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
- }
- };
-
-
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }}));
-
-
+ @Override
+ public void write(OutputStream output) {
+ UserModel user = GitBlitWebSession.get().getUser();
+ user = user == null ? UserModel.ANONYMOUS : user;
+
+ app().filestore().downloadBlob(entry.getFilestoreOid(), user,
+ getRepositoryModel(), output);
+ }
+ };
+
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler);
+ }
+ }));
+
} else {
item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class,
- WicketUtils.newPathParameter(repositoryName, entry.commitId, path)));
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, path)));
}
}
-
// quick links
if (entry.isSubmodule()) {
item.add(new ExternalLink("raw", "").setEnabled(false));
// submodule
- item.add(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class, WicketUtils
- .newPathParameter(repositoryName, entry.commitId, entry.path))
- .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
- item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, WicketUtils
- .newObjectParameter(submodulePath, entry.objectId)).setEnabled(hasSubmodule));
+ item.add(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class,
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))
+ .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
+ item.add(new BookmarkablePageLink<Void>("view", CommitPage.class,
+ WicketUtils.newObjectParameter(submodulePath, entry.objectId)).setEnabled(hasSubmodule));
item.add(new ExternalLink("blame", "").setEnabled(false));
- item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils
- .newPathParameter(repositoryName, entry.commitId, entry.path))
- .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
+ item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))
+ .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
} else {
// tree or blob
- item.add(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class, WicketUtils
- .newPathParameter(repositoryName, entry.commitId, entry.path))
- .setEnabled(!entry.changeType.equals(ChangeType.ADD)
- && !entry.changeType.equals(ChangeType.DELETE)));
-
+ item.add(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class,
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))
+ .setEnabled(!entry.changeType.equals(ChangeType.ADD)
+ && !entry.changeType.equals(ChangeType.DELETE)));
+
if (entry.isFilestoreItem()) {
item.add(new Link<Object>("view", null) {
-
+
private static final long serialVersionUID = 1L;
@Override
- public void onClick() {
-
- IResourceStream resourceStream = new AbstractResourceStreamWriter() {
-
+ public void onClick() {
+
+ IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+
private static final long serialVersionUID = 1L;
- @Override
- public void write(OutputStream output) {
- UserModel user = GitBlitWebSession.get().getUser();
- user = user == null ? UserModel.ANONYMOUS : user;
-
- app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
- }
- };
-
-
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }});
-
+ @Override
+ public void write(OutputStream output) {
+ UserModel user = GitBlitWebSession.get().getUser();
+ user = user == null ? UserModel.ANONYMOUS : user;
+
+ app().filestore().downloadBlob(entry.getFilestoreOid(), user,
+ getRepositoryModel(), output);
+ }
+ };
+
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler);
+ }
+ });
+
item.add(new Link<Object>("raw", null) {
-
+
private static final long serialVersionUID = 1L;
@Override
- public void onClick() {
-
- IResourceStream resourceStream = new AbstractResourceStreamWriter() {
-
+ public void onClick() {
+
+ IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+
private static final long serialVersionUID = 1L;
- @Override
- public void write(OutputStream output) {
- UserModel user = GitBlitWebSession.get().getUser();
- user = user == null ? UserModel.ANONYMOUS : user;
-
- app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
- }
- };
-
-
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }});
-
+ @Override
+ public void write(OutputStream output) {
+ UserModel user = GitBlitWebSession.get().getUser();
+ user = user == null ? UserModel.ANONYMOUS : user;
+
+ app().filestore().downloadBlob(entry.getFilestoreOid(), user,
+ getRepositoryModel(), output);
+ }
+ };
+
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler);
+ }
+ });
+
} else {
- item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils
- .newPathParameter(repositoryName, entry.commitId, entry.path))
- .setEnabled(!entry.changeType.equals(ChangeType.DELETE)));
+ item.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))
+ .setEnabled(!entry.changeType.equals(ChangeType.DELETE)));
String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, entry.commitId, entry.path);
item.add(new ExternalLink("raw", rawUrl)
.setEnabled(!entry.changeType.equals(ChangeType.DELETE)));
}
- item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class, WicketUtils
- .newPathParameter(repositoryName, entry.commitId, entry.path))
- .setEnabled(!entry.changeType.equals(ChangeType.ADD)
- && !entry.changeType.equals(ChangeType.DELETE)));
- item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils
- .newPathParameter(repositoryName, entry.commitId, entry.path))
- .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
+ item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class,
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))
+ .setEnabled(!entry.changeType.equals(ChangeType.ADD)
+ && !entry.changeType.equals(ChangeType.DELETE)));
+ item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
+ WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path))
+ .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
}
WicketUtils.setAlternatingBackground(item, counter);
diff --git a/src/main/java/com/gitblit/wicket/pages/ComparePage.java b/src/main/java/com/gitblit/wicket/pages/ComparePage.java
index 7e7ac2f5..98c5abc8 100644
--- a/src/main/java/com/gitblit/wicket/pages/ComparePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ComparePage.java
@@ -19,7 +19,8 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
@@ -33,7 +34,6 @@ import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -45,6 +45,7 @@ import com.gitblit.models.RepositoryModel;
import com.gitblit.models.SubmoduleModel;
import com.gitblit.servlet.RawServlet;
import com.gitblit.utils.DiffUtils;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.DiffUtils.DiffComparator;
import com.gitblit.utils.DiffUtils.DiffOutput;
import com.gitblit.utils.DiffUtils.DiffOutputType;
@@ -83,7 +84,7 @@ public class ComparePage extends RepositoryPage {
add(new Label("comparison").setVisible(false));
} else {
// active comparison
- Fragment comparison = new Fragment("comparison", "comparisonFragment", this);
+ Fragment comparison = new Fragment("comparison", "comparisonFragment", ComparePage.this);
add(comparison);
RevCommit fromCommit;
@@ -236,12 +237,11 @@ public class ComparePage extends RepositoryPage {
PageParameters params = WicketUtils.newRangeParameter(repositoryName, from, to);
if (ignoreWS) {
- params.put("w", 1);
+ params.add("w", 1);
}
- String relativeUrl = urlFor(ComparePage.class, params).toString();
- String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(ComparePage.class, params);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
};
@@ -278,11 +278,10 @@ public class ComparePage extends RepositoryPage {
PageParameters params = WicketUtils.newRangeParameter(repositoryName, from, to);
if (ignoreWS) {
- params.put("w", 1);
+ params.add("w", 1);
}
- String relativeUrl = urlFor(ComparePage.class, params).toString();
- String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(ComparePage.class, params);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
};
diff --git a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java
index 9c10e01b..51a73f95 100644
--- a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java
@@ -28,8 +28,7 @@ import java.util.Set;
import java.util.TimeZone;
import java.util.TreeSet;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.HeaderContributor;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Fragment;
import org.eclipse.jgit.lib.Repository;
@@ -89,7 +88,7 @@ public abstract class DashboardPage extends RootPage {
}
}
- Fragment activityFragment = new Fragment("activity", "activityFragment", this);
+ Fragment activityFragment = new Fragment("activity", "activityFragment", DashboardPage.this);
add(activityFragment);
activityFragment.add(new Label("feedTitle", feedTitle));
if (digests.size() == 0) {
@@ -240,8 +239,8 @@ public abstract class DashboardPage extends RootPage {
chart.setShowLegend(false);
charts.addChart(chart);
- add(new HeaderContributor(charts));
- frag.add(new Fragment("charts", "chartsFragment", this));
+ add(charts);
+ frag.add(new Fragment("charts", "chartsFragment", DashboardPage.this));
} else {
frag.add(new Label("charts").setVisible(false));
}
diff --git a/src/main/java/com/gitblit/wicket/pages/DocPage.java b/src/main/java/com/gitblit/wicket/pages/DocPage.java
index 5d711343..5b365c46 100644
--- a/src/main/java/com/gitblit/wicket/pages/DocPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/DocPage.java
@@ -17,7 +17,7 @@ package com.gitblit.wicket.pages;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -83,9 +83,9 @@ public class DocPage extends RepositoryPage {
Fragment fragment;
MarkupDocument markupDoc = processor.parse(repositoryName, getBestCommitId(commit), documentPath, markupText);
if (MarkupSyntax.PLAIN.equals(markupDoc.syntax)) {
- fragment = new Fragment("doc", "plainContent", this);
+ fragment = new Fragment("doc", "plainContent", DocPage.this);
} else {
- fragment = new Fragment("doc", "markupContent", this);
+ fragment = new Fragment("doc", "markupContent", DocPage.this);
}
// document page links
diff --git a/src/main/java/com/gitblit/wicket/pages/DocsPage.java b/src/main/java/com/gitblit/wicket/pages/DocsPage.java
index 52443862..2345b907 100644
--- a/src/main/java/com/gitblit/wicket/pages/DocsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/DocsPage.java
@@ -17,9 +17,9 @@ package com.gitblit.wicket.pages;
import java.util.List;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -71,11 +71,11 @@ public class DocsPage extends RepositoryPage {
Fragment fragment = null;
if (roots.isEmpty()) {
// no identified root documents
- fragment = new Fragment("docs", "noIndexFragment", this);
+ fragment = new Fragment("docs", "noIndexFragment", DocsPage.this);
setResponsePage(NoDocsPage.class, params);
} else {
// root documents, use tabbed ui of index/root and document list
- fragment = new Fragment("docs", "tabsFragment", this);
+ fragment = new Fragment("docs", "tabsFragment", DocsPage.this);
ListDataProvider<MarkupDocument> docDp = new ListDataProvider<MarkupDocument>(roots);
// tab titles
@@ -95,7 +95,7 @@ public class DocsPage extends RepositoryPage {
item.add(link);
if (counter == 0) {
counter++;
- item.add(new SimpleAttributeModifier("class", "active"));
+ item.add(new AttributeModifier("class", "active"));
}
}
};
@@ -128,13 +128,13 @@ public class DocsPage extends RepositoryPage {
Component content = new Label("content", doc.html)
.setEscapeModelStrings(false);
if (!MarkupSyntax.PLAIN.equals(doc.syntax)) {
- content.add(new SimpleAttributeModifier("class", "markdown"));
+ content.add(new AttributeModifier("class", "markdown"));
}
item.add(content);
- item.add(new SimpleAttributeModifier("id", file));
+ item.add(new AttributeModifier("id", file));
if (counter == 0) {
counter++;
- item.add(new SimpleAttributeModifier("class", "tab-pane active"));
+ item.add(new AttributeModifier("class", "tab-pane active"));
}
}
};
@@ -143,7 +143,7 @@ public class DocsPage extends RepositoryPage {
// document list
final ByteFormat byteFormat = new ByteFormat();
- Fragment docs = new Fragment("documents", "documentsFragment", this);
+ Fragment docs = new Fragment("documents", "documentsFragment", DocsPage.this);
ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths);
DataView<PathModel> pathsView = new DataView<PathModel>("document", pathsDp) {
private static final long serialVersionUID = 1L;
diff --git a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java
index dbf8a79e..86d20d09 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java
@@ -22,7 +22,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
@@ -103,7 +103,7 @@ public class EditFilePage extends RepositoryPage {
final Model<String> commitMessage = new Model<String>("Document update");
final Model<String> commitIdAtLoad = new Model<String>(displayedCommitId);
- fragment = new Fragment("doc", "markupContent", this);
+ fragment = new Fragment("doc", "markupContent", EditFilePage.this);
Form<Void> form = new Form<Void>("documentEditor") {
@@ -182,7 +182,7 @@ public class EditFilePage extends RepositoryPage {
MarkupDocument markupDoc = processor.parse(repositoryName, displayedCommitId, documentPath, markupText);
final Model<String> documentContent = new Model<String>(markupDoc.html);
- fragment = new Fragment("doc", "plainContent", this);
+ fragment = new Fragment("doc", "plainContent", EditFilePage.this);
fragment.add(new Label("content", documentContent).setEscapeModelStrings(false));
}
diff --git a/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java b/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java
index dc326654..ccb807c6 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/EditMilestonePage.java
@@ -20,7 +20,7 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
diff --git a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java
index 6bcf6f51..355867b6 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -26,10 +26,10 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
@@ -79,6 +79,8 @@ import com.gitblit.wicket.panels.TextOption;
public class EditRepositoryPage extends RootSubPage {
+ private static final long serialVersionUID = 1L;
+
private final boolean isCreate;
RepositoryNamePanel namePanel;
@@ -388,7 +390,6 @@ public class EditRepositoryPage extends RootSubPage {
error(e.getMessage());
return;
}
- setRedirect(false);
setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name));
}
};
@@ -408,7 +409,7 @@ public class EditRepositoryPage extends RootSubPage {
}
// do not let the browser pre-populate these fields
- form.add(new SimpleAttributeModifier("autocomplete", "off"));
+ form.add(new AttributeModifier("autocomplete", "off"));
//
@@ -638,9 +639,9 @@ public class EditRepositoryPage extends RootSubPage {
repositoryModel.authorizationControl = AuthorizationControl.NAMED;
}
- target.addComponent(verifyCommitter);
- target.addComponent(usersPalette);
- target.addComponent(teamsPalette);
+ target.add(verifyCommitter);
+ target.add(usersPalette);
+ target.add(teamsPalette);
}
};
@@ -776,6 +777,11 @@ public class EditRepositoryPage extends RootSubPage {
public String getIdValue(FederationStrategy type, int index) {
return Integer.toString(index);
}
+
+ @Override
+ public FederationStrategy getObject(String id, IModel<? extends List<? extends FederationStrategy>> choices) {
+ return choices.getObject().get(Integer.valueOf(id));
+ }
}
private class GCPeriodRenderer implements IChoiceRenderer<Integer> {
@@ -798,6 +804,11 @@ public class EditRepositoryPage extends RootSubPage {
public String getIdValue(Integer value, int index) {
return Integer.toString(index);
}
+
+ @Override
+ public Integer getObject(String id, IModel<? extends List<? extends Integer>> choices) {
+ return choices.getObject().get(Integer.valueOf(id));
+ }
}
private class MaxActivityCommitsRenderer implements IChoiceRenderer<Integer> {
@@ -822,5 +833,10 @@ public class EditRepositoryPage extends RootSubPage {
public String getIdValue(Integer value, int index) {
return Integer.toString(index);
}
+
+ @Override
+ public Integer getObject(String id, IModel<? extends List<? extends Integer>> choices) {
+ return choices.getObject().get(Integer.valueOf(id));
+ }
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java
index a43d8db0..2346ce13 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/EditTeamPage.java
@@ -24,8 +24,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBox;
@@ -208,7 +208,6 @@ public class EditTeamPage extends RootSubPage {
error(e.getMessage());
return;
}
- setRedirect(false);
if (isCreate) {
// create another team
info(MessageFormat.format(getString("gb.teamCreated"),
@@ -220,7 +219,7 @@ public class EditTeamPage extends RootSubPage {
};
// do not let the browser pre-populate these fields
- form.add(new SimpleAttributeModifier("autocomplete", "off"));
+ form.add(new AttributeModifier("autocomplete", "off"));
// not all user providers support manipulating team memberships
boolean editMemberships = app().authentication().supportsTeamMembershipChanges(teamModel);
diff --git a/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java b/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java
index 192b48ca..8cc2c611 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/EditTicketPage.java
@@ -22,7 +22,7 @@ import java.util.List;
import java.util.Set;
import java.util.TreeSet;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.basic.Label;
@@ -163,7 +163,7 @@ public class EditTicketPage extends RepositoryPage {
} else {
statusChoices = Arrays.asList(TicketModel.Status.requestWorkflow);
}
- Fragment status = new Fragment("status", "statusFragment", this);
+ Fragment status = new Fragment("status", "statusFragment", EditTicketPage.this);
status.add(new DropDownChoice<TicketModel.Status>("status", statusModel, statusChoices));
form.add(status);
@@ -200,7 +200,7 @@ public class EditTicketPage extends RepositoryPage {
}
Collections.sort(responsibles);
responsibles.add(new TicketResponsible(NIL, "", ""));
- Fragment responsible = new Fragment("responsible", "responsibleFragment", this);
+ Fragment responsible = new Fragment("responsible", "responsibleFragment", EditTicketPage.this);
responsible.add(new DropDownChoice<TicketResponsible>("responsible", responsibleModel, responsibles));
form.add(responsible.setVisible(!responsibles.isEmpty()));
@@ -224,12 +224,12 @@ public class EditTicketPage extends RepositoryPage {
}
// milestone
- Fragment milestone = new Fragment("milestone", "milestoneFragment", this);
+ Fragment milestone = new Fragment("milestone", "milestoneFragment", EditTicketPage.this);
milestone.add(new DropDownChoice<TicketMilestone>("milestone", milestoneModel, milestones));
form.add(milestone.setVisible(!milestones.isEmpty()));
// priority
- Fragment priority = new Fragment("priority", "priorityFragment", this);
+ Fragment priority = new Fragment("priority", "priorityFragment", EditTicketPage.this);
List<TicketModel.Priority> priorityChoices = Arrays.asList(TicketModel.Priority.choices());
priority.add(new DropDownChoice<TicketModel.Priority>("priority", priorityModel, priorityChoices));
form.add(priority);
@@ -245,7 +245,7 @@ public class EditTicketPage extends RepositoryPage {
branches.remove(Repository.shortenRefName(getRepositoryModel().mergeTo));
branches.add(0, Repository.shortenRefName(getRepositoryModel().mergeTo));
- Fragment mergeto = new Fragment("mergeto", "mergeToFragment", this);
+ Fragment mergeto = new Fragment("mergeto", "mergeToFragment", EditTicketPage.this);
mergeto.add(new DropDownChoice<String>("mergeto", mergeToModel, branches));
form.add(mergeto.setVisible(!branches.isEmpty()));
} else {
diff --git a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java
index 220bee3f..9cdb4c95 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditUserPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/EditUserPage.java
@@ -21,8 +21,8 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBox;
@@ -203,7 +203,6 @@ public class EditUserPage extends RootSubPage {
error(e.getMessage());
return;
}
- setRedirect(false);
if (isCreate) {
// create another user
info(MessageFormat.format(getString("gb.userCreated"),
@@ -217,7 +216,7 @@ public class EditUserPage extends RootSubPage {
};
// do not let the browser pre-populate these fields
- form.add(new SimpleAttributeModifier("autocomplete", "off"));
+ form.add(new AttributeModifier("autocomplete", "off"));
// not all user providers support manipulating username and password
boolean editCredentials = app().authentication().supportsCredentialChanges(userModel);
diff --git a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java
index 72d1e1a4..d1d77aa7 100644
--- a/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java
@@ -19,13 +19,13 @@ import java.util.List;
import javax.servlet.http.HttpServletRequest;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.protocol.http.WebRequest;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.RepositoryUrl;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.GitblitRedirectException;
import com.gitblit.wicket.WicketUtils;
@@ -33,6 +33,8 @@ import com.gitblit.wicket.panels.RepositoryUrlPanel;
public class EmptyRepositoryPage extends RepositoryPage {
+ private static final long serialVersionUID = 1L;
+
public EmptyRepositoryPage(PageParameters params) {
super(params);
@@ -54,7 +56,7 @@ public class EmptyRepositoryPage extends RepositoryPage {
user = UserModel.ANONYMOUS;
}
- HttpServletRequest req = ((WebRequest) getRequest()).getHttpServletRequest();
+ HttpServletRequest req = GitBlitRequestUtils.getServletRequest();
List<RepositoryUrl> repositoryUrls = app().services().getRepositoryUrls(req, user, repository);
RepositoryUrl primaryUrl = repositoryUrls.size() == 0 ? null : repositoryUrls.get(0);
String url = primaryUrl != null ? primaryUrl.url : "";
diff --git a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java
index 57f61f78..c60f83a3 100644
--- a/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ExportTicketPage.java
@@ -15,10 +15,10 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.IRequestTarget;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RequestCycle;
-import org.apache.wicket.protocol.http.WebResponse;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,6 +30,8 @@ import com.gitblit.wicket.WicketUtils;
public class ExportTicketPage extends SessionPage {
+ private static final long serialVersionUID = 1L;
+
private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
String contentType;
@@ -37,18 +39,15 @@ public class ExportTicketPage extends SessionPage {
public ExportTicketPage(final PageParameters params) {
super(params);
- if (!params.containsKey("r")) {
+ if (params.get("r").isEmpty()) {
error(getString("gb.repositoryNotSpecified"));
redirectToInterceptPage(new RepositoriesPage());
}
- getRequestCycle().setRequestTarget(new IRequestTarget() {
- @Override
- public void detach(RequestCycle requestCycle) {
- }
-
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new IRequestHandler() {
+
@Override
- public void respond(RequestCycle requestCycle) {
+ public void respond(IRequestCycle requestCycle) {
WebResponse response = (WebResponse) requestCycle.getResponse();
final String repositoryName = WicketUtils.getRepositoryName(params);
@@ -69,6 +68,12 @@ public class ExportTicketPage extends SessionPage {
logger.error("Failed to write text response", e);
}
}
+
+ @Override
+ public void detach(IRequestCycle requestCycle) {
+ // TODO Auto-generated method stub
+
+ }
});
}
diff --git a/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java b/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java
index c26c9757..7c46e621 100644
--- a/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/FederationRegistrationPage.java
@@ -18,7 +18,7 @@ package com.gitblit.wicket.pages;
import java.util.Collections;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
diff --git a/src/main/java/com/gitblit/wicket/pages/FilestorePage.java b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java
index 29b3d60d..6fc7b6d7 100644
--- a/src/main/java/com/gitblit/wicket/pages/FilestorePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java
@@ -24,7 +24,7 @@ import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.FileUtils;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -243,7 +243,7 @@ public class FilestorePage extends RootPage {
ok, pending, inprogress, error, deleted;
}
- private static class SortableFilestoreProvider extends SortableDataProvider<FilestoreModel> {
+ private static class SortableFilestoreProvider extends SortableDataProvider<FilestoreModel, String> {
private static final long serialVersionUID = 1L;
@@ -254,7 +254,7 @@ public class FilestorePage extends RootPage {
}
@Override
- public int size() {
+ public long size() {
if (list == null) {
return 0;
}
@@ -267,15 +267,16 @@ public class FilestorePage extends RootPage {
}
@Override
- public Iterator<FilestoreModel> iterator(int first, int count) {
+ public Iterator<? extends FilestoreModel> iterator(long first, long count) {
Collections.sort(list, new Comparator<FilestoreModel>() {
@Override
public int compare(FilestoreModel o1, FilestoreModel o2) {
return o2.getChangedOn().compareTo(o1.getChangedOn());
}
});
- return list.subList(first, first + count).iterator();
+ return list.subList(Math.toIntExact(first), Math.toIntExact(first + count)).iterator();
}
+
}
} \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/pages/ForkPage.java b/src/main/java/com/gitblit/wicket/pages/ForkPage.java
index 12020128..90a7ee3b 100644
--- a/src/main/java/com/gitblit/wicket/pages/ForkPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ForkPage.java
@@ -17,7 +17,7 @@ package com.gitblit.wicket.pages;
import java.text.MessageFormat;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/com/gitblit/wicket/pages/ForksPage.java b/src/main/java/com/gitblit/wicket/pages/ForksPage.java
index 045f5f7e..dbfb3d67 100644
--- a/src/main/java/com/gitblit/wicket/pages/ForksPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ForksPage.java
@@ -20,7 +20,7 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
diff --git a/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java b/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java
index befa5f10..0dfae3be 100644
--- a/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/GitSearchPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import com.gitblit.Constants;
diff --git a/src/main/java/com/gitblit/wicket/pages/HistoryPage.java b/src/main/java/com/gitblit/wicket/pages/HistoryPage.java
index 3021cb3c..9b04f3bb 100644
--- a/src/main/java/com/gitblit/wicket/pages/HistoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/HistoryPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import com.gitblit.wicket.CacheControl;
diff --git a/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java b/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java
index dc0c5ae8..29e308d5 100644
--- a/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java
+++ b/src/main/java/com/gitblit/wicket/pages/ImageDiffHandler.java
@@ -15,15 +15,16 @@
*/
package com.gitblit.wicket.pages;
-import java.nio.charset.StandardCharsets;
import java.util.List;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.protocol.http.WicketURLEncoder;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.util.encoding.UrlEncoder;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffEntry.Side;
import org.jsoup.nodes.Element;
+import com.gitblit.Constants;
import com.gitblit.servlet.RawServlet;
import com.gitblit.utils.DiffUtils;
import com.gitblit.utils.HtmlBuilder;
@@ -145,8 +146,8 @@ public class ImageDiffHandler implements DiffUtils.BinaryDiffHandler {
* Returns a URL that will fetch the designated static resource from within GitBlit.
*/
protected String getStaticResourceUrl(String contextRelativePath) {
- return WebApplication.get().getRequestCycleProcessor().getRequestCodingStrategy().rewriteStaticRelativeUrl(contextRelativePath);
- }
+ return RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(contextRelativePath));
+ }
/**
* Encode a URL component of a {@link RawServlet} URL in the special way that the servlet expects it. Note that
@@ -165,6 +166,6 @@ public class ImageDiffHandler implements DiffUtils.BinaryDiffHandler {
// Actually, this should be done in RawServlet.asLink(). As it is now, this may be incorrect if that
// operation ever uses query parameters instead of paths, or if it is fixed to urlencode its path
// components. But I don't want to touch that static method in RawServlet.
- return WicketURLEncoder.PATH_INSTANCE.encode(component, StandardCharsets.UTF_8.name()).replaceAll("%2[fF]", "/");
+ return UrlEncoder.PATH_INSTANCE.encode(component, Constants.ENCODING).replaceAll("%2[fF]", "/");
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/LogPage.java b/src/main/java/com/gitblit/wicket/pages/LogPage.java
index 411d7edd..9c9b7398 100644
--- a/src/main/java/com/gitblit/wicket/pages/LogPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/LogPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import com.gitblit.utils.StringUtils;
diff --git a/src/main/java/com/gitblit/wicket/pages/LogoutPage.java b/src/main/java/com/gitblit/wicket/pages/LogoutPage.java
index a8ae7d0f..e9f6bde3 100644
--- a/src/main/java/com/gitblit/wicket/pages/LogoutPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/LogoutPage.java
@@ -15,10 +15,11 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.protocol.http.WebRequest;
-import org.apache.wicket.protocol.http.WebResponse;
+
+import org.apache.wicket.RestartResponseException;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.wicket.GitBlitWebSession;
public class LogoutPage extends BasePage {
@@ -27,8 +28,7 @@ public class LogoutPage extends BasePage {
super();
GitBlitWebSession session = GitBlitWebSession.get();
UserModel user = session.getUser();
- app().authentication().logout(((WebRequest) getRequest()).getHttpServletRequest(),
- ((WebResponse) getResponse()).getHttpServletResponse(), user);
+ app().authentication().logout(GitBlitRequestUtils.getServletRequest(), GitBlitRequestUtils.getServletResponse(), user);
session.invalidate();
/*
@@ -36,14 +36,14 @@ public class LogoutPage extends BasePage {
* If so, it is likely to be cached by the browser, and cannot be undone. Effectively, this means
* that you cannot log out...
*/
- if ( ((WebRequest)getRequest()).getHttpServletRequest().getHeader("Authorization") != null ) {
+ if (GitBlitRequestUtils.getServletRequest().getHeader("Authorization") != null ) {
// authentication will be done via this route anyway, show a page to close the browser:
// this will be done by Wicket.
setupPage(null, getString("gb.logout"));
} else {
- setRedirect(true);
- setResponsePage(getApplication().getHomePage());
+// setResponsePage(getApplication().getHomePage());
+ throw new RestartResponseException(getApplication().getHomePage());
} // not via WWW-Auth
} // LogoutPage
} \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java b/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java
index 1d81061e..357b5036 100644
--- a/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/LuceneSearchPage.java
@@ -22,7 +22,7 @@ import java.util.List;
import java.util.Set;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.ListMultipleChoice;
@@ -88,19 +88,19 @@ public class LuceneSearchPage extends RootPage {
page = WicketUtils.getPage(params);
- if (params.containsKey("repositories")) {
- String value = params.getString("repositories", "");
+ if (!params.get("repositories").isEmpty()) {
+ String value = params.get("repositories").toString("");
List<String> list = StringUtils.getStringsFromValue(value);
repositories.addAll(list);
}
- allRepos = params.getAsBoolean("allrepos", false);
+ allRepos = params.get("allrepos").toBoolean(false);
if (allRepos) {
repositories.addAll(availableRepositories);
}
- if (params.containsKey("query")) {
- query = params.getString("query", "");
+ if (!params.get("query").isEmpty()) {
+ query = params.get("query").toString("");
} else {
String value = WicketUtils.getSearchString(params);
String type = WicketUtils.getSearchType(params);
@@ -153,9 +153,9 @@ public class LuceneSearchPage extends RootPage {
return;
}
PageParameters params = new PageParameters();
- params.put("repositories", StringUtils.flattenStrings(repositoriesModel.getObject()));
- params.put("query", queryModel.getObject());
- params.put("allrepos", allreposModel.getObject());
+ params.add("repositories", StringUtils.flattenStrings(repositoriesModel.getObject()));
+ params.add("query", queryModel.getObject());
+ params.add("allrepos", allreposModel.getObject());
LuceneSearchPage page = new LuceneSearchPage(params);
setResponsePage(page);
}
@@ -249,8 +249,8 @@ public class LuceneSearchPage extends RootPage {
add(resultsView.setVisible(results.size() > 0));
PageParameters pagerParams = new PageParameters();
- pagerParams.put("repositories", StringUtils.flattenStrings(repositoriesModel.getObject()));
- pagerParams.put("query", queryModel.getObject());
+ pagerParams.add("repositories", StringUtils.flattenStrings(repositoriesModel.getObject()));
+ pagerParams.add("query", queryModel.getObject());
boolean showPager = false;
int totalPages = 0;
diff --git a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java
index 96113b0f..bf8a474a 100644
--- a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java
@@ -25,8 +25,7 @@ import java.util.Comparator;
import java.util.Date;
import java.util.List;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.HeaderContributor;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.eclipse.jgit.lib.Repository;
@@ -72,7 +71,7 @@ public class MetricsPage extends RepositoryPage {
createBarChart(charts, "dayOfWeekChart", getDayOfWeekMetrics(r, objectId));
createPieChart(charts, "authorsChart", getAuthorMetrics(r, objectId));
- add(new HeaderContributor(charts));
+ add(charts);
}
diff --git a/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java b/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java
index 0f7d602b..4f34e5da 100644
--- a/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java
@@ -30,7 +30,7 @@ import java.util.List;
import java.util.Set;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Fragment;
import org.eclipse.jgit.lib.Constants;
@@ -159,9 +159,9 @@ public class MyDashboardPage extends DashboardPage {
Fragment repositoryTabs;
if (UserModel.ANONYMOUS.equals(user)) {
- repositoryTabs = new Fragment("repositoryTabs", "anonymousTabsFragment", this);
+ repositoryTabs = new Fragment("repositoryTabs", "anonymousTabsFragment", MyDashboardPage.this);
} else {
- repositoryTabs = new Fragment("repositoryTabs", "authenticatedTabsFragment", this);
+ repositoryTabs = new Fragment("repositoryTabs", "authenticatedTabsFragment", MyDashboardPage.this);
}
add(repositoryTabs);
diff --git a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java
index bfcedf6e..70ab1d2f 100644
--- a/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/MyTicketsPage.java
@@ -22,7 +22,8 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.repeater.Item;
@@ -56,7 +57,9 @@ import com.gitblit.wicket.panels.UserTitlePanel;
*/
public class MyTicketsPage extends RootPage {
- public MyTicketsPage() {
+ private static final long serialVersionUID = 1L;
+
+ public MyTicketsPage() {
this(null);
}
@@ -66,21 +69,20 @@ public class MyTicketsPage extends RootPage {
UserModel currentUser = GitBlitWebSession.get().getUser();
if (currentUser == null || UserModel.ANONYMOUS.equals(currentUser)) {
- setRedirect(true);
setResponsePage(getApplication().getHomePage());
return;
}
final String username = currentUser.getName();
- final String[] statiiParam = (params == null) ? TicketsUI.openStatii : params.getStringArray(Lucene.status.name());
- final String assignedToParam = (params == null) ? "" : params.getString(Lucene.responsible.name(), null);
- final String milestoneParam = (params == null) ? "" : params.getString(Lucene.milestone.name(), null);
- final String queryParam = (params == null) ? null : params.getString("q", null);
- final String searchParam = (params == null) ? "" : params.getString("s", null);
- final String sortBy = (params == null) ? "" : Lucene.fromString(params.getString("sort", Lucene.created.name())).name();
- final String repositoryId = (params == null) ? "" : params.getString(Lucene.rid.name(), null);
- final boolean desc = (params == null) ? true : !"asc".equals(params.getString("direction", "desc"));
+ final String[] statiiParam = (params == null) ? TicketsUI.openStatii : (String[]) params.getValues(Lucene.status.name()).stream().map(StringValue::toString).toArray();
+ final String assignedToParam = (params == null) ? "" : params.get(Lucene.responsible.name()).toString();
+ final String milestoneParam = (params == null) ? "" : params.get(Lucene.milestone.name()).toString();
+ final String queryParam = (params == null) ? null : params.get("q").toString();
+ final String searchParam = (params == null) ? "" : params.get("s").toString();
+ final String sortBy = (params == null) ? "" : Lucene.fromString(params.get("sort").toString(Lucene.created.name())).name();
+ final String repositoryId = (params == null) ? "" : params.get(Lucene.rid.name()).toString();
+ final boolean desc = (params == null) ? true : !"asc".equals(params.get("direction").toString("desc"));
// add the user title panel
diff --git a/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java b/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java
index 2250f38a..833c6d47 100644
--- a/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/NewMilestonePage.java
@@ -17,7 +17,7 @@ package com.gitblit.wicket.pages;
import java.util.Date;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
diff --git a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java
index d2589e6f..bf897de3 100644
--- a/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/NewRepositoryPage.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.CompoundPropertyModel;
@@ -145,13 +145,12 @@ public class NewRepositoryPage extends RootSubPage {
error(e.getMessage());
return;
}
- setRedirect(true);
setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name));
}
};
// do not let the browser pre-populate these fields
- form.add(new SimpleAttributeModifier("autocomplete", "off"));
+ form.add(new AttributeModifier("autocomplete", "off"));
namePanel = new RepositoryNamePanel("namePanel", repositoryModel);
form.add(namePanel);
diff --git a/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java b/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java
index 0c52505c..1fd5839d 100644
--- a/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/NewTicketPage.java
@@ -22,7 +22,7 @@ import java.util.List;
import java.util.Set;
import java.util.TreeSet;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.basic.Label;
@@ -149,18 +149,18 @@ public class NewTicketPage extends RepositoryPage {
}
}
Collections.sort(responsibles);
- Fragment responsible = new Fragment("responsible", "responsibleFragment", this);
+ Fragment responsible = new Fragment("responsible", "responsibleFragment", NewTicketPage.this);
responsible.add(new DropDownChoice<TicketResponsible>("responsible", responsibleModel, responsibles));
form.add(responsible.setVisible(!responsibles.isEmpty()));
// milestone
List<TicketMilestone> milestones = app().tickets().getMilestones(getRepositoryModel(), Status.Open);
- Fragment milestone = new Fragment("milestone", "milestoneFragment", this);
+ Fragment milestone = new Fragment("milestone", "milestoneFragment", NewTicketPage.this);
milestone.add(new DropDownChoice<TicketMilestone>("milestone", milestoneModel, milestones));
form.add(milestone.setVisible(!milestones.isEmpty()));
// priority
- Fragment priority = new Fragment("priority", "priorityFragment", this);
+ Fragment priority = new Fragment("priority", "priorityFragment", NewTicketPage.this);
priority.add(new DropDownChoice<TicketModel.Priority>("priority", priorityModel, Arrays.asList(TicketModel.Priority.choices())));
form.add(priority);
@@ -175,7 +175,7 @@ public class NewTicketPage extends RepositoryPage {
branches.remove(Repository.shortenRefName(getRepositoryModel().HEAD));
branches.add(0, Repository.shortenRefName(getRepositoryModel().HEAD));
- Fragment mergeto = new Fragment("mergeto", "mergeToFragment", this);
+ Fragment mergeto = new Fragment("mergeto", "mergeToFragment", NewTicketPage.this);
mergeto.add(new DropDownChoice<String>("mergeto", mergeToModel, branches));
form.add(mergeto.setVisible(!branches.isEmpty()));
} else {
diff --git a/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java b/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java
index 7dcc0227..bb70294f 100644
--- a/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/NoDocsPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
public class NoDocsPage extends RepositoryPage {
diff --git a/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java b/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java
index 8e98a00f..a1645ab1 100644
--- a/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/NoTicketsPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import com.gitblit.models.UserModel;
diff --git a/src/main/java/com/gitblit/wicket/pages/OverviewPage.java b/src/main/java/com/gitblit/wicket/pages/OverviewPage.java
index 1979f97f..4ec54691 100644
--- a/src/main/java/com/gitblit/wicket/pages/OverviewPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/OverviewPage.java
@@ -19,8 +19,7 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.HeaderContributor;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.repeater.Item;
@@ -147,7 +146,7 @@ public class OverviewPage extends RepositoryPage {
chart.setHeight(150);
charts.addChart(chart);
- add(new HeaderContributor(charts));
+ add(charts);
}
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/PatchPage.java b/src/main/java/com/gitblit/wicket/pages/PatchPage.java
index bd904e1f..384885ad 100644
--- a/src/main/java/com/gitblit/wicket/pages/PatchPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/PatchPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -36,7 +36,7 @@ public class PatchPage extends SessionPage {
public PatchPage(final PageParameters params) {
super(params);
- if (!params.containsKey("r")) {
+ if (params.get("r").isEmpty()) {
error(getString("gb.repositoryNotSpecified"));
redirectToInterceptPage(new RepositoriesPage());
}
diff --git a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java
index d358b775..101f89e1 100644
--- a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java
@@ -21,7 +21,7 @@ import java.util.Comparator;
import java.util.List;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -35,6 +35,7 @@ import com.gitblit.models.ProjectModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.servlet.SyndicationServlet;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.CacheControl;
@@ -107,7 +108,7 @@ public class ProjectPage extends DashboardPage {
add(new Label("projectTitle", project.getDisplayName()));
add(new Label("projectDescription", project.description));
- String feedLink = SyndicationServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), projectName, null, 0);
+ String feedLink = SyndicationServlet.asLink(GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), projectName, null, 0);
add(new ExternalLink("syndication", feedLink));
add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(project.getDisplayName(),
diff --git a/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java b/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java
index 132a39dd..4cdeb009 100644
--- a/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ProjectsPage.java
@@ -18,7 +18,7 @@ package com.gitblit.wicket.pages;
import java.util.Collections;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
diff --git a/src/main/java/com/gitblit/wicket/pages/RawPage.java b/src/main/java/com/gitblit/wicket/pages/RawPage.java
index c4357478..310d928b 100644
--- a/src/main/java/com/gitblit/wicket/pages/RawPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RawPage.java
@@ -24,20 +24,21 @@ import java.util.Map;
import javax.servlet.http.HttpServletResponse;
-import org.apache.wicket.IRequestTarget;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RequestCycle;
-import org.apache.wicket.protocol.http.WebRequest;
-import org.apache.wicket.protocol.http.WebResponse;
-import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.gitblit.Constants;
import com.gitblit.Keys;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
@@ -45,6 +46,8 @@ import com.gitblit.wicket.WicketUtils;
public class RawPage extends SessionPage {
+ private static final long serialVersionUID = 1L;
+
private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
String contentType;
@@ -52,18 +55,15 @@ public class RawPage extends SessionPage {
public RawPage(final PageParameters params) {
super(params);
- if (!params.containsKey("r")) {
+ if (params.get("r").isEmpty()) {
error(getString("gb.repositoryNotSpecified"));
redirectToInterceptPage(new RepositoriesPage());
}
- getRequestCycle().setRequestTarget(new IRequestTarget() {
- @Override
- public void detach(RequestCycle requestCycle) {
- }
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new IRequestHandler() {
@Override
- public void respond(RequestCycle requestCycle) {
+ public void respond(IRequestCycle requestCycle) {
WebResponse response = (WebResponse) requestCycle.getResponse();
final String repositoryName = WicketUtils.getRepositoryName(params);
@@ -96,7 +96,7 @@ public class RawPage extends SessionPage {
final String objectNotFound = MessageFormat.format("Raw page failed to find object {0} in {1}",
objectId, repositoryName);
logger.error(objectNotFound);
- throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, objectNotFound);
+ throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, objectNotFound);
}
contentType = "application/octet-stream";
response.setContentType(contentType);
@@ -113,7 +113,7 @@ public class RawPage extends SessionPage {
final String commitNotFound = MessageFormat.format("Raw page failed to find commit {0} in {1}",
objectId, repositoryName);
logger.error(commitNotFound);
- throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, commitNotFound);
+ throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, commitNotFound);
}
String filename = blobPath;
@@ -149,7 +149,7 @@ public class RawPage extends SessionPage {
byte[] image = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
if (image == null) {
logger.error(blobNotFound);
- throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
+ throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "image/" + extension.toLowerCase();
response.setContentType(contentType);
@@ -165,25 +165,24 @@ public class RawPage extends SessionPage {
byte[] binary = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
if (binary == null) {
logger.error(blobNotFound);
- throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
+ throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "application/octet-stream";
response.setContentLength(binary.length);
response.setContentType(contentType);
try {
- WebRequest request = (WebRequest) requestCycle.getRequest();
- String userAgent = request.getHttpServletRequest().getHeader("User-Agent");
+ String userAgent = GitBlitRequestUtils.getServletRequest().getHeader("User-Agent");
if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) {
response.setHeader("Content-Disposition", "filename=\""
- + URLEncoder.encode(filename, "UTF-8") + "\"");
+ + URLEncoder.encode(filename, Constants.ENCODING) + "\"");
} else if (userAgent != null && userAgent.indexOf("MSIE") > -1) {
response.setHeader("Content-Disposition", "attachment; filename=\""
- + URLEncoder.encode(filename, "UTF-8") + "\"");
+ + URLEncoder.encode(filename, Constants.ENCODING) + "\"");
} else {
response.setHeader("Content-Disposition", "attachment; filename=\""
- + new String(filename.getBytes("UTF-8"), "latin1") + "\"");
+ + new String(filename.getBytes(Constants.ENCODING), "latin1") + "\"");
}
}
catch (UnsupportedEncodingException e) {
@@ -202,7 +201,7 @@ public class RawPage extends SessionPage {
blobPath, encodings);
if (content == null) {
logger.error(blobNotFound);
- throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
+ throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "text/plain; charset=UTF-8";
response.setContentType(contentType);
@@ -219,7 +218,7 @@ public class RawPage extends SessionPage {
encodings);
if (content == null) {
logger.error(blobNotFound);
- throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
+ throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "text/plain; charset=UTF-8";
response.setContentType(contentType);
@@ -232,7 +231,15 @@ public class RawPage extends SessionPage {
}
r.close();
}
+
+ @Override
+ public void detach(IRequestCycle requestCycle) {
+ // TODO Auto-generated method stub
+
+ }
+
});
+
}
@Override
diff --git a/src/main/java/com/gitblit/wicket/pages/ReflogPage.java b/src/main/java/com/gitblit/wicket/pages/ReflogPage.java
index 44fb2227..3c89e65e 100644
--- a/src/main/java/com/gitblit/wicket/pages/ReflogPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ReflogPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import com.gitblit.wicket.CacheControl;
diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java
index 660b4ed1..06df0139 100644
--- a/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -25,7 +25,7 @@ import java.util.Iterator;
import java.util.List;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.eclipse.jgit.lib.Constants;
diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
index 36c5ae16..00d75590 100644
--- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java
@@ -26,10 +26,11 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.RestartResponseException;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.TextField;
@@ -37,7 +38,6 @@ import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
-import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
@@ -63,6 +63,7 @@ import com.gitblit.servlet.SyndicationServlet;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.BugtraqProcessor;
import com.gitblit.utils.DeepCopier;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.ModelUtils;
import com.gitblit.utils.RefLogUtils;
@@ -134,9 +135,9 @@ public abstract class RepositoryPage extends RootPage {
}
}
- if (params.containsKey(PARAM_STAR)) {
+ if (!params.get(PARAM_STAR).isEmpty()) {
// set starred state
- boolean star = params.getBoolean(PARAM_STAR);
+ boolean star = params.get(PARAM_STAR).toBoolean();
UserModel user = GitBlitWebSession.get().getUser();
if (user != null && user.isAuthenticated) {
UserRepositoryPreferences prefs = user.getPreferences().getRepositoryPreferences(getRepositoryModel().name);
@@ -167,7 +168,7 @@ public abstract class RepositoryPage extends RootPage {
NavigationPanel navigationPanel = new NavigationPanel("repositoryNavPanel", getRepoNavPageClass(), navLinks);
add(navigationPanel);
- add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest()
+ add(new ExternalLink("syndication", SyndicationServlet.asLink(GitBlitRequestUtils
.getRelativePathPrefixToContextRoot(), getRepositoryName(), null, 0)));
// add floating search form
@@ -245,7 +246,7 @@ public abstract class RepositoryPage extends RootPage {
// per-repository extra navlinks
if (JGitUtils.getPagesBranch(r) != null) {
ExternalNavLink pagesLink = new ExternalNavLink("gb.pages", PagesServlet.asLink(
- getRequest().getRelativePathPrefixToContextRoot(), getRepositoryName(), null), true);
+ GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), getRepositoryName(), null), true);
navLinks.add(pagesLink);
}
@@ -304,16 +305,16 @@ public abstract class RepositoryPage extends RootPage {
RepositoryModel model = getRepositoryModel();
if (StringUtils.isEmpty(model.originRepository)) {
if (model.isMirror) {
- add(new Fragment("repoIcon", "mirrorIconFragment", this));
- Fragment mirrorFrag = new Fragment("originRepository", "mirrorFragment", this);
+ add(new Fragment("repoIcon", "mirrorIconFragment", RepositoryPage.this));
+ Fragment mirrorFrag = new Fragment("originRepository", "mirrorFragment", RepositoryPage.this);
Label lbl = new Label("originRepository", MessageFormat.format(getString("gb.mirrorOf"), "<b>" + model.origin + "</b>"));
mirrorFrag.add(lbl.setEscapeModelStrings(false));
add(mirrorFrag);
} else {
if (model.isBare) {
- add(new Fragment("repoIcon", "repoIconFragment", this));
+ add(new Fragment("repoIcon", "repoIconFragment", RepositoryPage.this));
} else {
- add(new Fragment("repoIcon", "cloneIconFragment", this));
+ add(new Fragment("repoIcon", "cloneIconFragment", RepositoryPage.this));
}
add(new Label("originRepository", Optional.of(model.description).or("")));
}
@@ -322,21 +323,21 @@ public abstract class RepositoryPage extends RootPage {
if (origin == null) {
// no origin repository, show description if available
if (model.isBare) {
- add(new Fragment("repoIcon", "repoIconFragment", this));
+ add(new Fragment("repoIcon", "repoIconFragment", RepositoryPage.this));
} else {
- add(new Fragment("repoIcon", "cloneIconFragment", this));
+ add(new Fragment("repoIcon", "cloneIconFragment", RepositoryPage.this));
}
add(new Label("originRepository", Optional.of(model.description).or("")));
} else if (!user.canView(origin)) {
// show origin repository without link
- add(new Fragment("repoIcon", "forkIconFragment", this));
- Fragment forkFrag = new Fragment("originRepository", "originFragment", this);
+ add(new Fragment("repoIcon", "forkIconFragment", RepositoryPage.this));
+ Fragment forkFrag = new Fragment("originRepository", "originFragment", RepositoryPage.this);
forkFrag.add(new Label("originRepository", StringUtils.stripDotGit(model.originRepository)));
add(forkFrag);
} else {
// link to origin repository
- add(new Fragment("repoIcon", "forkIconFragment", this));
- Fragment forkFrag = new Fragment("originRepository", "originFragment", this);
+ add(new Fragment("repoIcon", "forkIconFragment", RepositoryPage.this));
+ Fragment forkFrag = new Fragment("originRepository", "originFragment", RepositoryPage.this);
forkFrag.add(new LinkPanel("originRepository", null, StringUtils.stripDotGit(model.originRepository),
SummaryPage.class, WicketUtils.newRepositoryParameter(model.originRepository)));
add(forkFrag);
@@ -354,7 +355,7 @@ public abstract class RepositoryPage extends RootPage {
// (un)star link allows a user to star a repository
if (user.isAuthenticated && model.hasCommits) {
PageParameters starParams = DeepCopier.copy(getPageParameters());
- starParams.put(PARAM_STAR, !user.getPreferences().isStarredRepository(model.name));
+ starParams.add(PARAM_STAR, !user.getPreferences().isStarredRepository(model.name));
String toggleStarUrl = getRequestCycle().urlFor(getClass(), starParams).toString();
if (user.getPreferences().isStarredRepository(model.name)) {
// show unstar button
@@ -414,18 +415,18 @@ public abstract class RepositoryPage extends RootPage {
}
protected void addToolbarButton(String wicketId, String iconClass, String label, String url) {
- Fragment button = new Fragment(wicketId, "toolbarLinkFragment", this);
+ Fragment button = new Fragment(wicketId, "toolbarLinkFragment", RepositoryPage.this);
Label icon = new Label("icon");
WicketUtils.setCssClass(icon, iconClass);
button.add(icon);
button.add(new Label("label", label));
- button.add(new SimpleAttributeModifier("href", url));
+ button.add(new AttributeModifier("href", url));
add(button);
}
protected void addSyndicationDiscoveryLink() {
add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(repositoryName,
- objectId), SyndicationServlet.asLink(getRequest()
+ objectId), SyndicationServlet.asLink(GitBlitRequestUtils
.getRelativePathPrefixToContextRoot(), repositoryName, objectId, 0)));
}
@@ -620,14 +621,14 @@ public abstract class RepositoryPage extends RootPage {
value = getString("gb.missingUsername");
}
}
- Fragment partial = new Fragment(wicketId, "partialPersonIdent", this);
+ Fragment partial = new Fragment(wicketId, "partialPersonIdent", RepositoryPage.this);
LinkPanel link = new LinkPanel("personName", "list", value, GitSearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType));
setPersonSearchTooltip(link, value, searchType);
partial.add(link);
return partial;
} else {
- Fragment fullPerson = new Fragment(wicketId, "fullPersonIdent", this);
+ Fragment fullPerson = new Fragment(wicketId, "fullPersonIdent", RepositoryPage.this);
LinkPanel nameLink = new LinkPanel("personName", "list", name, GitSearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, name, searchType));
setPersonSearchTooltip(nameLink, name, searchType);
@@ -763,7 +764,7 @@ public abstract class RepositoryPage extends RootPage {
if (StringUtils.isEmpty(searchString)) {
// redirect to self to avoid wicket page update bug
String absoluteUrl = getCanonicalUrl();
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
return;
}
for (Constants.SearchType type : Constants.SearchType.values()) {
@@ -785,7 +786,7 @@ public abstract class RepositoryPage extends RootPage {
// mounted url parameters (issue-111)
PageParameters params = WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType);
String absoluteUrl = getCanonicalUrl(searchPageClass, params);
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java b/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java
index ceca1ec2..ec785eaf 100644
--- a/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ReviewProposalPage.java
@@ -19,7 +19,7 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import com.gitblit.Constants.FederationToken;
diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java
index 12779ca2..0d802816 100644
--- a/src/main/java/com/gitblit/wicket/pages/RootPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java
@@ -34,12 +34,16 @@ import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RequestCycle;
-import org.apache.wicket.behavior.HeaderContributor;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.IHeaderContributor;
-import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -49,8 +53,6 @@ import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
-import org.apache.wicket.protocol.http.WebRequest;
-import org.apache.wicket.protocol.http.WebResponse;
import com.gitblit.Constants;
import com.gitblit.Constants.AuthenticationType;
@@ -68,6 +70,7 @@ import com.gitblit.models.NavLink.PageNavLink;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.ModelUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
@@ -87,6 +90,8 @@ import com.gitblit.wicket.panels.NavigationPanel;
*/
public abstract class RootPage extends BasePage {
+ private static final long serialVersionUID = 1L;
+
boolean showAdmin;
IModel<String> username = new Model<String>("");
@@ -105,13 +110,13 @@ public abstract class RootPage extends BasePage {
protected void setupPage(String repositoryName, String pageName) {
// CSS header overrides
- add(new HeaderContributor(new IHeaderContributor() {
+ add(new Behavior() {
private static final long serialVersionUID = 1L;
@Override
- public void renderHead(IHeaderResponse response) {
+ public void renderHead(Component component, IHeaderResponse response) {
StringBuilder buffer = new StringBuilder();
- buffer.append("<style type=\"text/css\">\n");
+// buffer.append("<style type=\"text/css\">\n");
buffer.append(".navbar-inner {\n");
final String headerBackground = app().settings().getString(Keys.web.headerBackgroundColor, null);
if (!StringUtils.isEmpty(headerBackground)) {
@@ -143,10 +148,10 @@ public abstract class RootPage extends BasePage {
buffer.append(MessageFormat.format("color: {0} !important;\n", headerHover));
buffer.append("}\n");
}
- buffer.append("</style>\n");
- response.renderString(buffer.toString());
+// buffer.append("</style>\n");
+ response.render(CssHeaderItem.forCSS(buffer.toString(), "rootCss"));
}
- }));
+ });
boolean authenticateView = app().settings().getBoolean(Keys.web.authenticateViewPages, false);
boolean authenticateAdmin = app().settings().getBoolean(Keys.web.authenticateAdminPages, true);
@@ -255,8 +260,8 @@ public abstract class RootPage extends BasePage {
params.remove("user");
// remove days back parameter if it is the default value
- if (params.containsKey("db")
- && params.getInt("db") == app().settings().getInteger(Keys.web.activityDuration, 7)) {
+ if (!params.get("db").isEmpty()
+ && params.get("db").toInt() == app().settings().getInteger(Keys.web.activityDuration, 7)) {
params.remove("db");
}
return params;
@@ -271,8 +276,8 @@ public abstract class RootPage extends BasePage {
private void loginUser(UserModel user) {
if (user != null) {
- HttpServletRequest request = ((WebRequest) getRequest()).getHttpServletRequest();
- HttpServletResponse response = ((WebResponse) getResponse()).getHttpServletResponse();
+ HttpServletRequest request = GitBlitRequestUtils.getServletRequest();
+ HttpServletResponse response = GitBlitRequestUtils.getServletResponse();
// Set the user into the session
GitBlitWebSession session = GitBlitWebSession.get();
@@ -281,8 +286,8 @@ public abstract class RootPage extends BasePage {
session.replaceSession();
session.setUser(user);
- request = ((WebRequest) getRequest()).getHttpServletRequest();
- response = ((WebResponse) getResponse()).getHttpServletResponse();
+ request = GitBlitRequestUtils.getServletRequest();
+ response = GitBlitRequestUtils.getServletResponse();
request.getSession().setAttribute(Constants.ATTRIB_AUTHTYPE, AuthenticationType.CREDENTIALS);
// Set Cookie
@@ -393,8 +398,8 @@ public abstract class RootPage extends BasePage {
clonedParams = new PageParameters(params);
}
- if (!clonedParams.containsKey("db")) {
- clonedParams.put("db", daysBack);
+ if (clonedParams.get("db").isEmpty()) {
+ clonedParams.add("db", daysBack);
}
List<MenuItem> items = new ArrayList<MenuItem>();
@@ -434,7 +439,7 @@ public abstract class RootPage extends BasePage {
String set = WicketUtils.getSet(params);
String regex = WicketUtils.getRegEx(params);
String team = WicketUtils.getTeam(params);
- int daysBack = params.getInt("db", 0);
+ int daysBack = params.get("db").toInt(0);
int maxDaysBack = app().settings().getInteger(Keys.web.activityDurationMaximum, 30);
List<RepositoryModel> availableModels = getRepositoryModels();
@@ -569,7 +574,7 @@ public abstract class RootPage extends BasePage {
String username = RootPage.this.username.getObject();
char[] password = RootPage.this.password.getObject().toCharArray();
- HttpServletRequest request = ((WebRequest)RequestCycle.get().getRequest()).getHttpServletRequest();
+ HttpServletRequest request = GitBlitRequestUtils.getServletRequest();
UserModel user = app().authentication().authenticate(username, password, request.getRemoteAddr());
if (user == null) {
@@ -613,7 +618,7 @@ public abstract class RootPage extends BasePage {
GitBlitWebSession session = GitBlitWebSession.get();
UserModel user = session.getUser();
boolean editCredentials = app().authentication().supportsCredentialChanges(user);
- HttpServletRequest request = ((WebRequest) getRequest()).getHttpServletRequest();
+ HttpServletRequest request = GitBlitRequestUtils.getServletRequest();
AuthenticationType authenticationType = (AuthenticationType) request.getAttribute(Constants.ATTRIB_AUTHTYPE);
boolean standardLogin = (null != authenticationType) ? authenticationType.isStandard() : true;
@@ -687,7 +692,7 @@ public abstract class RootPage extends BasePage {
* @return a submenu fragment
*/
private Fragment newSubmenu(String wicketId, String submenuTitle, List<MenuItem> menuItems) {
- Fragment submenu = new Fragment(wicketId, "submenuFragment", this);
+ Fragment submenu = new Fragment(wicketId, "submenuFragment", RootPage.this);
submenu.add(new Label("submenuTitle", submenuTitle).setRenderBodyOnly(true));
ListDataProvider<MenuItem> menuItemsDp = new ListDataProvider<MenuItem>(menuItems);
DataView<MenuItem> submenuItems = new DataView<MenuItem>("submenuItem", menuItemsDp) {
diff --git a/src/main/java/com/gitblit/wicket/pages/RootSubPage.java b/src/main/java/com/gitblit/wicket/pages/RootSubPage.java
index 62d07a7f..76111dba 100644
--- a/src/main/java/com/gitblit/wicket/pages/RootSubPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RootSubPage.java
@@ -18,7 +18,7 @@ package com.gitblit.wicket.pages;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.basic.Label;
@@ -57,7 +57,8 @@ public abstract class RootSubPage extends RootPage {
// Wicket seems to get confused as to when it really should
// generate a page map for complex pages. Conditionally ensure we
// have a page map for complex AJAX pages like the EditNNN pages.
- Session.get().pageMapForName(null, true);
+ //TODO: check if no longer needed
+// Session.get().pageMapForName(null, true);
setVersioned(true);
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java b/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java
index 9ccf1aa2..aa073cf7 100644
--- a/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/SendProposalPage.java
@@ -19,7 +19,7 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
diff --git a/src/main/java/com/gitblit/wicket/pages/SessionPage.java b/src/main/java/com/gitblit/wicket/pages/SessionPage.java
index d715aaee..cb3a9bae 100644
--- a/src/main/java/com/gitblit/wicket/pages/SessionPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/SessionPage.java
@@ -18,15 +18,16 @@ package com.gitblit.wicket.pages;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.protocol.http.WebRequest;
-import org.apache.wicket.protocol.http.WebResponse;
import com.gitblit.Constants;
import com.gitblit.Constants.AuthenticationType;
import com.gitblit.Keys;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebApp;
import com.gitblit.wicket.GitBlitWebSession;
@@ -53,8 +54,8 @@ public abstract class SessionPage extends WebPage {
private void login() {
GitBlitWebSession session = GitBlitWebSession.get();
- HttpServletRequest request = ((WebRequest) getRequest()).getHttpServletRequest();
- HttpServletResponse response = ((WebResponse) getResponse()).getHttpServletResponse();
+ HttpServletRequest request = GitBlitRequestUtils.getServletRequest();
+ HttpServletResponse response = GitBlitRequestUtils.getServletResponse();
// If using container/external servlet authentication, use request attribute
String authedUser = (String) request.getAttribute(Constants.ATTRIB_AUTHUSER);
diff --git a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java
index 3cfa152e..485f4d0a 100644
--- a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java
@@ -23,8 +23,7 @@ import java.util.Date;
import java.util.List;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.HeaderContributor;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Fragment;
@@ -144,7 +143,7 @@ public class SummaryPage extends RepositoryPage {
if (markupDoc == null || markupDoc.markup == null) {
add(new Label("readme").setVisible(false));
} else {
- Fragment fragment = new Fragment("readme", MarkupSyntax.PLAIN.equals(markupDoc.syntax) ? "plaintextPanel" : "markdownPanel", this);
+ Fragment fragment = new Fragment("readme", MarkupSyntax.PLAIN.equals(markupDoc.syntax) ? "plaintextPanel" : "markdownPanel", SummaryPage.this);
fragment.add(new Label("readmeFile", markupDoc.documentPath));
// Add the html to the page
Component content = new Label("readmeContent", markupDoc.html).setEscapeModelStrings(false);
@@ -160,7 +159,7 @@ public class SummaryPage extends RepositoryPage {
add(new Label("commitsChart").setVisible(false));
} else {
Charts charts = createCharts(metrics);
- add(new HeaderContributor(charts));
+ add(charts);
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/TagPage.java b/src/main/java/com/gitblit/wicket/pages/TagPage.java
index ffeea6f2..1aa6c15d 100644
--- a/src/main/java/com/gitblit/wicket/pages/TagPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TagPage.java
@@ -20,7 +20,7 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.eclipse.jgit.lib.Constants;
diff --git a/src/main/java/com/gitblit/wicket/pages/TagsPage.java b/src/main/java/com/gitblit/wicket/pages/TagsPage.java
index d6b8abb2..367cd54e 100644
--- a/src/main/java/com/gitblit/wicket/pages/TagsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TagsPage.java
@@ -15,7 +15,7 @@
*/
package com.gitblit.wicket.pages;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.CacheControl.LastModified;
diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java
index cd049f4d..25c24738 100644
--- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java
@@ -35,10 +35,9 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -51,7 +50,6 @@ import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.protocol.http.WebRequest;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
@@ -87,6 +85,7 @@ import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.JGitUtils.MergeStatus;
import com.gitblit.utils.CommitCache;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.RefLogUtils;
import com.gitblit.utils.StringUtils;
@@ -265,7 +264,7 @@ public class TicketPage extends RepositoryPage {
} else {
milestoneParameters = WicketUtils.newRepositoryParameter(repositoryName);
}
- milestoneParameters.put(Lucene.milestone.name(), ticket.milestone);
+ milestoneParameters.add(Lucene.milestone.name(), ticket.milestone);
int progress = 0;
int open = 0;
int closed = 0;
@@ -275,7 +274,7 @@ public class TicketPage extends RepositoryPage {
closed = tm.getClosedTickets();
}
- Fragment milestoneProgress = new Fragment("milestone", "milestoneProgressFragment", this);
+ Fragment milestoneProgress = new Fragment("milestone", "milestoneProgressFragment", TicketPage.this);
milestoneProgress.add(new LinkPanel("link", null, ticket.milestone, TicketsPage.class, milestoneParameters));
Label label = new Label("progress");
WicketUtils.setCssStyle(label, "width:" + progress + "%;");
@@ -334,7 +333,7 @@ public class TicketPage extends RepositoryPage {
/*
* LARGE STATUS INDICATOR WITH ICON (DISCUSSION TAB->SIDE BAR)
*/
- Fragment ticketStatus = new Fragment("ticketStatus", "ticketStatusFragment", this);
+ Fragment ticketStatus = new Fragment("ticketStatus", "ticketStatusFragment", TicketPage.this);
Label ticketIcon = TicketsUI.getStateIcon("ticketIcon", ticket);
ticketStatus.add(ticketIcon);
ticketStatus.add(new Label("ticketStatus", ticket.status.toString()));
@@ -350,7 +349,7 @@ public class TicketPage extends RepositoryPage {
/*
* OPEN TICKET
*/
- Fragment controls = new Fragment("controls", "openControlsFragment", this);
+ Fragment controls = new Fragment("controls", "openControlsFragment", TicketPage.this);
/*
* STATUS
@@ -510,7 +509,7 @@ public class TicketPage extends RepositoryPage {
/*
* CLOSED TICKET
*/
- Fragment controls = new Fragment("controls", "closedControlsFragment", this);
+ Fragment controls = new Fragment("controls", "closedControlsFragment", TicketPage.this);
String editHref = urlFor(EditTicketPage.class, params).toString();
controls.add(new ExternalLink("editLink", editHref, getString("gb.edit")));
@@ -635,7 +634,7 @@ public class TicketPage extends RepositoryPage {
Label label = new Label("label", value);
TicketLabel tLabel = app().tickets().getLabel(repository, value);
String background = MessageFormat.format("background-color:{0};", tLabel.color);
- label.add(new SimpleAttributeModifier("style", background));
+ label.add(new AttributeModifier("style", background));
item.add(label);
}
};
@@ -649,7 +648,7 @@ public class TicketPage extends RepositoryPage {
if (comments.size() == 0) {
add(new Label("discussion").setVisible(false));
} else {
- Fragment discussionFragment = new Fragment("discussion", "discussionFragment", this);
+ Fragment discussionFragment = new Fragment("discussion", "discussionFragment", TicketPage.this);
ListDataProvider<Change> discussionDp = new ListDataProvider<Change>(discussion);
DataView<Change> discussionView = new DataView<Change>("discussion", discussionDp) {
private static final long serialVersionUID = 1L;
@@ -682,7 +681,7 @@ public class TicketPage extends RepositoryPage {
commitLink = mergedPatch.toString();
}
- Fragment mergeFragment = new Fragment("entry", "mergeFragment", this);
+ Fragment mergeFragment = new Fragment("entry", "mergeFragment", TicketPage.this);
mergeFragment.add(new LinkPanel("commitLink", null, commitLink,
CommitPage.class, WicketUtils.newObjectParameter(repositoryName, resolvedBy)));
mergeFragment.add(new Label("toBranch", MessageFormat.format(getString("gb.toBranch"),
@@ -695,7 +694,7 @@ public class TicketPage extends RepositoryPage {
/*
* STATUS CHANGE
*/
- Fragment frag = new Fragment("entry", "statusFragment", this);
+ Fragment frag = new Fragment("entry", "statusFragment", TicketPage.this);
Label status = new Label("statusChange", entry.getStatus().toString());
String css = TicketsUI.getLozengeClass(entry.getStatus(), false);
WicketUtils.setCssClass(status, css);
@@ -710,7 +709,7 @@ public class TicketPage extends RepositoryPage {
String bugtraq = bugtraqProcessor().processText(getRepository(), repositoryName, entry.comment.text);
String comment = MarkdownUtils.transformGFM(app().settings(), bugtraq, repositoryName);
String safeComment = app().xssFilter().relaxed(comment);
- Fragment frag = new Fragment("entry", "commentFragment", this);
+ Fragment frag = new Fragment("entry", "commentFragment", TicketPage.this);
Label commentIcon = new Label("commentIcon");
if (entry.comment.src == CommentSource.Email) {
WicketUtils.setCssClass(commentIcon, "iconic-mail");
@@ -742,7 +741,7 @@ public class TicketPage extends RepositoryPage {
add(new Label("newComment").setVisible(false));
} else {
// permit user to comment
- Fragment newComment = new Fragment("newComment", "newCommentFragment", this);
+ Fragment newComment = new Fragment("newComment", "newCommentFragment", TicketPage.this);
AvatarImage img = new AvatarImage("newCommentAvatar", user.username, user.emailAddress,
"gravatar-round", avatarWidth, true);
newComment.add(img);
@@ -763,7 +762,7 @@ public class TicketPage extends RepositoryPage {
if (ticket.isOpen() && app().tickets().isAcceptingNewPatchsets(repository) && canPropose) {
// ticket & repo will accept a proposal patchset
// show the instructions for proposing a patchset
- Fragment changeIdFrag = new Fragment("patchset", "proposeFragment", this);
+ Fragment changeIdFrag = new Fragment("patchset", "proposeFragment", TicketPage.this);
changeIdFrag.add(new Label("proposeInstructions", MarkdownUtils.transformMarkdown(getString("gb.proposeInstructions"))).setEscapeModelStrings(false));
changeIdFrag.add(new Label("ptWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Barnum")));
changeIdFrag.add(new Label("ptWorkflowSteps", getProposeWorkflow("propose_pt.md", repoUrl.url, ticket.number)).setEscapeModelStrings(false));
@@ -772,7 +771,7 @@ public class TicketPage extends RepositoryPage {
add(changeIdFrag);
} else {
// explain why you can't propose a patchset
- Fragment fragment = new Fragment("patchset", "canNotProposeFragment", this);
+ Fragment fragment = new Fragment("patchset", "canNotProposeFragment", TicketPage.this);
String reason = "";
if (ticket.isClosed()) {
reason = getString("gb.ticketIsClosed");
@@ -796,7 +795,7 @@ public class TicketPage extends RepositoryPage {
}
} else {
// show current patchset
- Fragment patchsetFrag = new Fragment("patchset", "patchsetFragment", this);
+ Fragment patchsetFrag = new Fragment("patchset", "patchsetFragment", TicketPage.this);
patchsetFrag.add(new Label("commitsInPatchset", MessageFormat.format(getString("gb.commitsInPatchsetN"), currentPatchset.number)));
patchsetFrag.add(createMergePanel(user, repository));
@@ -843,7 +842,7 @@ public class TicketPage extends RepositoryPage {
/*
* ACTIVITY TAB
*/
- Fragment revisionHistory = new Fragment("activity", "activityFragment", this);
+ Fragment revisionHistory = new Fragment("activity", "activityFragment", TicketPage.this);
List<Change> events = new ArrayList<Change>(ticket.changes);
Collections.sort(events);
Collections.reverse(events);
@@ -1091,7 +1090,7 @@ public class TicketPage extends RepositoryPage {
patchsets.remove(currentPatchset);
Collections.reverse(patchsets);
- Fragment panel = new Fragment(wicketId, "collapsiblePatchsetFragment", this);
+ Fragment panel = new Fragment(wicketId, "collapsiblePatchsetFragment", TicketPage.this);
// patchset header
String ps = "<b>" + currentPatchset.number + "</b>";
@@ -1168,7 +1167,7 @@ public class TicketPage extends RepositoryPage {
}
// user can review, add review controls
- Fragment reviewControls = new Fragment("reviewControls", "reviewControlsFragment", this);
+ Fragment reviewControls = new Fragment("reviewControls", "reviewControlsFragment", TicketPage.this);
// show "approve" button if no review OR not current score
if (user.canApprovePatchset(repository) && (myReview == null || Score.approved != myReview.score)) {
@@ -1362,7 +1361,7 @@ public class TicketPage extends RepositoryPage {
}
protected <X extends MarkupContainer> X setNewTarget(X x) {
- x.add(new SimpleAttributeModifier("target", "_blank"));
+ x.add(new AttributeModifier("target", "_blank"));
return x;
}
@@ -1416,7 +1415,7 @@ public class TicketPage extends RepositoryPage {
if (allowMerge) {
if (MergeStatus.MERGEABLE == mergeStatus) {
// patchset can be cleanly merged to integration branch OR has already been merged
- Fragment mergePanel = new Fragment("mergePanel", "mergeableFragment", this);
+ Fragment mergePanel = new Fragment("mergePanel", "mergeableFragment", TicketPage.this);
mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetMergeable"), ticket.mergeTo)));
if (user.canPush(repository)) {
// user can merge locally
@@ -1483,18 +1482,18 @@ public class TicketPage extends RepositoryPage {
return mergePanel;
} else if (MergeStatus.ALREADY_MERGED == mergeStatus) {
// patchset already merged
- Fragment mergePanel = new Fragment("mergePanel", "alreadyMergedFragment", this);
+ Fragment mergePanel = new Fragment("mergePanel", "alreadyMergedFragment", TicketPage.this);
mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetAlreadyMerged"), ticket.mergeTo)));
return mergePanel;
} else if (MergeStatus.MISSING_INTEGRATION_BRANCH == mergeStatus) {
// target/integration branch is missing
- Fragment mergePanel = new Fragment("mergePanel", "notMergeableFragment", this);
+ Fragment mergePanel = new Fragment("mergePanel", "notMergeableFragment", TicketPage.this);
mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetNotMergeable"), ticket.mergeTo)));
mergePanel.add(new Label("mergeMore", MessageFormat.format(getString("gb.missingIntegrationBranchMore"), ticket.mergeTo)));
return mergePanel;
} else {
// patchset can not be cleanly merged
- Fragment mergePanel = new Fragment("mergePanel", "notMergeableFragment", this);
+ Fragment mergePanel = new Fragment("mergePanel", "notMergeableFragment", TicketPage.this);
mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetNotMergeable"), ticket.mergeTo)));
if (user.canPush(repository)) {
// user can merge locally
@@ -1509,17 +1508,17 @@ public class TicketPage extends RepositoryPage {
// merge not allowed
if (MergeStatus.ALREADY_MERGED == mergeStatus) {
// patchset already merged
- Fragment mergePanel = new Fragment("mergePanel", "alreadyMergedFragment", this);
+ Fragment mergePanel = new Fragment("mergePanel", "alreadyMergedFragment", TicketPage.this);
mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetAlreadyMerged"), ticket.mergeTo)));
return mergePanel;
} else if (ticket.isVetoed(patchset)) {
// patchset has been vetoed
- Fragment mergePanel = new Fragment("mergePanel", "vetoedFragment", this);
+ Fragment mergePanel = new Fragment("mergePanel", "vetoedFragment", TicketPage.this);
mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetNotMergeable"), ticket.mergeTo)));
return mergePanel;
} else if (repository.requireApproval) {
// patchset has been not been approved for merge
- Fragment mergePanel = new Fragment("mergePanel", "notApprovedFragment", this);
+ Fragment mergePanel = new Fragment("mergePanel", "notApprovedFragment", TicketPage.this);
mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetNotApproved"), ticket.mergeTo)));
mergePanel.add(new Label("mergeMore", MessageFormat.format(getString("gb.patchsetNotApprovedMore"), ticket.mergeTo)));
return mergePanel;
@@ -1531,7 +1530,7 @@ public class TicketPage extends RepositoryPage {
}
protected Component getMergeInstructions(UserModel user, RepositoryModel repository, String markupId, String infoKey) {
- Fragment cmd = new Fragment(markupId, "commandlineMergeFragment", this);
+ Fragment cmd = new Fragment(markupId, "commandlineMergeFragment", TicketPage.this);
cmd.add(new Label("instructions", MessageFormat.format(getString(infoKey), ticket.mergeTo)));
// git instructions
@@ -1569,7 +1568,7 @@ public class TicketPage extends RepositoryPage {
* @return the primary repository url
*/
protected RepositoryUrl getRepositoryUrl(UserModel user, RepositoryModel repository) {
- HttpServletRequest req = ((WebRequest) getRequest()).getHttpServletRequest();
+ HttpServletRequest req = GitBlitRequestUtils.getServletRequest();
List<RepositoryUrl> urls = app().services().getRepositoryUrls(req, user, repository);
if (ArrayUtils.isEmpty(urls)) {
return null;
@@ -1640,7 +1639,7 @@ public class TicketPage extends RepositoryPage {
protected Fragment createCopyFragment(String wicketId, String text) {
if (app().settings().getBoolean(Keys.web.allowFlashCopyToClipboard, true)) {
// clippy: flash-based copy & paste
- Fragment copyFragment = new Fragment(wicketId, "clippyPanel", this);
+ Fragment copyFragment = new Fragment(wicketId, "clippyPanel", TicketPage.this);
String baseUrl = WicketUtils.getGitblitURL(getRequest());
ShockWaveComponent clippy = new ShockWaveComponent("clippy", baseUrl + "/clippy.swf");
clippy.setValue("flashVars", "text=" + StringUtils.encodeURL(text));
@@ -1648,7 +1647,7 @@ public class TicketPage extends RepositoryPage {
return copyFragment;
} else {
// javascript: manual copy & paste with modal browser prompt dialog
- Fragment copyFragment = new Fragment(wicketId, "jsPanel", this);
+ Fragment copyFragment = new Fragment(wicketId, "jsPanel", TicketPage.this);
ContextImage img = WicketUtils.newImage("copyIcon", "clippy.png");
img.add(new JavascriptTextPrompt("onclick", "Copy to Clipboard (Ctrl+C, Enter)", text));
copyFragment.add(img);
@@ -1723,8 +1722,7 @@ public class TicketPage extends RepositoryPage {
}
//Force reload of the page to rebuild ticket change cache
- String relativeUrl = urlFor(TicketsPage.class, getPageParameters()).toString();
- String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
+ String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(TicketsPage.class, getPageParameters());
setResponsePage(new RedirectPage(absoluteUrl));
}
};
diff --git a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java
index ecfed250..560cd40d 100644
--- a/src/main/java/com/gitblit/wicket/pages/TicketsPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TicketsPage.java
@@ -24,9 +24,10 @@ import java.util.List;
import java.util.Set;
import java.util.TreeSet;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Fragment;
@@ -87,13 +88,13 @@ public class TicketsPage extends RepositoryPage {
UserModel user = GitBlitWebSession.get().getUser();
boolean isAuthenticated = user != null && user.isAuthenticated;
- final String [] statiiParam = params.getStringArray(Lucene.status.name());
- final String assignedToParam = params.getString(Lucene.responsible.name(), null);
- final String milestoneParam = params.getString(Lucene.milestone.name(), null);
- final String queryParam = params.getString("q", null);
- final String searchParam = params.getString("s", null);
- final String sortBy = Lucene.fromString(params.getString("sort", Lucene.created.name())).name();
- final boolean desc = !"asc".equals(params.getString("direction", "desc"));
+ final String [] statiiParam = (String[]) params.getValues(Lucene.status.name()).stream().map(StringValue::toString).toArray();
+ final String assignedToParam = params.get(Lucene.responsible.name()).toString(null);
+ final String milestoneParam = params.get(Lucene.milestone.name()).toString(null);
+ final String queryParam = params.get("q").toString(null);
+ final String searchParam = params.get("s").toString(null);
+ final String sortBy = Lucene.fromString(params.get("sort").toString( Lucene.created.name())).name();
+ final boolean desc = !"asc".equals(params.get("direction").toString("desc"));
// add search form
add(new TicketSearchForm("ticketSearchForm", repositoryName, searchParam, getClass(), params));
@@ -164,10 +165,10 @@ public class TicketsPage extends RepositoryPage {
Fragment milestonePanel;
if (currentMilestone == null) {
- milestonePanel = new Fragment("milestonePanel", "noMilestoneFragment", this);
+ milestonePanel = new Fragment("milestonePanel", "noMilestoneFragment", TicketsPage.this);
add(milestonePanel);
} else {
- milestonePanel = new Fragment("milestonePanel", "milestoneProgressFragment", this);
+ milestonePanel = new Fragment("milestonePanel", "milestoneProgressFragment", TicketsPage.this);
milestonePanel.add(new Label("currentMilestone", currentMilestone.name));
if (currentMilestone.due == null) {
milestonePanel.add(new Label("currentDueDate", getString("gb.notSpecified")));
@@ -193,7 +194,7 @@ public class TicketsPage extends RepositoryPage {
add(milestonePanel);
}
- Fragment milestoneDropdown = new Fragment("milestoneDropdown", "milestoneDropdownFragment", this);
+ Fragment milestoneDropdown = new Fragment("milestoneDropdown", "milestoneDropdownFragment", TicketsPage.this);
PageParameters resetMilestone = queryParameters(queryParam, null, statiiParam, assignedToParam, sortBy, desc, 1);
milestoneDropdown.add(new BookmarkablePageLink<Void>("resetMilestone", TicketsPage.class, resetMilestone));
@@ -353,7 +354,7 @@ public class TicketsPage extends RepositoryPage {
if (dynamicQueries.size() == 0) {
add(new Label("dynamicQueries").setVisible(false));
} else {
- Fragment fragment = new Fragment("dynamicQueries", "dynamicQueriesFragment", this);
+ Fragment fragment = new Fragment("dynamicQueries", "dynamicQueriesFragment", TicketsPage.this);
ListDataProvider<TicketQuery> dynamicQueriesDp = new ListDataProvider<TicketQuery>(new ArrayList<TicketQuery>(dynamicQueries));
DataView<TicketQuery> dynamicQueriesList = new DataView<TicketQuery>("dynamicQuery", dynamicQueriesDp) {
private static final long serialVersionUID = 1L;
@@ -367,7 +368,7 @@ public class TicketsPage extends RepositoryPage {
tq.color = StringUtils.getColor(tq.name);
}
String background = MessageFormat.format("background-color:{0};", tq.color);
- swatch.add(new SimpleAttributeModifier("style", background));
+ swatch.add(new AttributeModifier("style", background));
item.add(swatch);
if (activeQuery.contains(tq.query)) {
// selected
@@ -377,7 +378,7 @@ public class TicketsPage extends RepositoryPage {
Label checked = new Label("checked");
WicketUtils.setCssClass(checked, "iconic-o-x");
item.add(checked);
- item.add(new SimpleAttributeModifier("style", background));
+ item.add(new AttributeModifier("style", background));
} else {
// unselected
String q = QueryBuilder.q(queryParam).toSubquery().and(tq.query).build();
@@ -546,7 +547,7 @@ public class TicketsPage extends RepositoryPage {
@Override
public void populateItem(final Item<TicketMilestone> item) {
- Fragment entryPanel = new Fragment("entryPanel", "milestoneListFragment", this);
+ Fragment entryPanel = new Fragment("entryPanel", "milestoneListFragment", TicketsPage.this);
item.add(entryPanel);
final TicketMilestone tm = item.getModelObject();
@@ -594,7 +595,7 @@ public class TicketsPage extends RepositoryPage {
// re-load milestone with query results
TicketMilestone m = app().tickets().getMilestone(getRepositoryModel(), tm.name);
- Fragment milestonePanel = new Fragment("milestonePanel", "openMilestoneFragment", this);
+ Fragment milestonePanel = new Fragment("milestonePanel", "openMilestoneFragment", TicketsPage.this);
Label label = new Label("progress");
WicketUtils.setCssStyle(label, "width:" + m.getProgress() + "%;");
milestonePanel.add(label);
diff --git a/src/main/java/com/gitblit/wicket/pages/TreePage.java b/src/main/java/com/gitblit/wicket/pages/TreePage.java
index eecad26e..98bb1d7a 100644
--- a/src/main/java/com/gitblit/wicket/pages/TreePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TreePage.java
@@ -18,7 +18,8 @@ package com.gitblit.wicket.pages;
import java.io.OutputStream;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -27,7 +28,6 @@ import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
import org.apache.wicket.util.resource.IResourceStream;
import org.eclipse.jgit.lib.FileMode;
@@ -39,6 +39,7 @@ import com.gitblit.models.SubmoduleModel;
import com.gitblit.models.UserModel;
import com.gitblit.servlet.RawServlet;
import com.gitblit.utils.ByteFormat;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.GitBlitWebSession;
@@ -52,6 +53,8 @@ import com.gitblit.wicket.panels.PathBreadcrumbsPanel;
@CacheControl(LastModified.BOOT)
public class TreePage extends RepositoryPage {
+ private static final long serialVersionUID = 1L;
+
public TreePage(PageParameters params) {
super(params);
@@ -64,8 +67,8 @@ public class TreePage extends RepositoryPage {
// tree page links
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, path)));
- add(new CompressedDownloadsPanel("compressedLinks", getRequest()
- .getRelativePathPrefixToContextRoot(), repositoryName, objectId, path));
+ add(new CompressedDownloadsPanel("compressedLinks", GitBlitRequestUtils.getRelativePathPrefixToContextRoot(),
+ repositoryName, objectId, path));
add(new CommitHeaderPanel("commitHeader", repositoryName, commit));
@@ -83,7 +86,7 @@ public class TreePage extends RepositoryPage {
}
final String id = getBestCommitId(commit);
-
+
final ByteFormat byteFormat = new ByteFormat();
final String baseUrl = WicketUtils.getGitblitURL(getRequest());
@@ -96,10 +99,10 @@ public class TreePage extends RepositoryPage {
@Override
public void populateItem(final Item<PathModel> item) {
final PathModel entry = item.getModelObject();
-
+
item.add(new Label("pathPermissions", JGitUtils.getPermissionsFromMode(entry.mode)));
item.add(WicketUtils.setHtmlTooltip(new Label("filestore", ""), getString("gb.filestore"))
- .setVisible(entry.isFilestoreItem()));
+ .setVisible(entry.isFilestoreItem()));
if (entry.isParentPath) {
// parent .. path
@@ -114,19 +117,16 @@ public class TreePage extends RepositoryPage {
item.add(WicketUtils.newImage("pathIcon", "folder_16x16.png"));
item.add(new Label("pathSize", ""));
item.add(new LinkPanel("pathName", "list", entry.name, TreePage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- entry.path)));
+ WicketUtils.newPathParameter(repositoryName, id, entry.path)));
// links
- Fragment links = new Fragment("pathLinks", "treeLinks", this);
+ Fragment links = new Fragment("pathLinks", "treeLinks", TreePage.this);
links.add(new BookmarkablePageLink<Void>("tree", TreePage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- entry.path)));
+ WicketUtils.newPathParameter(repositoryName, id, entry.path)));
links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- entry.path)));
- links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl,
- repositoryName, objectId, entry.path));
+ WicketUtils.newPathParameter(repositoryName, id, entry.path)));
+ links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl, repositoryName, objectId,
+ entry.path));
item.add(links);
} else if (entry.isSubmodule()) {
@@ -140,21 +140,20 @@ public class TreePage extends RepositoryPage {
item.add(WicketUtils.newImage("pathIcon", "git-orange-16x16.png"));
item.add(new Label("pathSize", ""));
- item.add(new LinkPanel("pathName", "list", entry.name + " @ " +
- getShortObjectId(submoduleId), TreePage.class,
- WicketUtils.newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule));
+ item.add(new LinkPanel("pathName", "list", entry.name + " @ " + getShortObjectId(submoduleId),
+ TreePage.class, WicketUtils.newPathParameter(submodulePath, submoduleId, ""))
+ .setEnabled(hasSubmodule));
- Fragment links = new Fragment("pathLinks", "submoduleLinks", this);
+ Fragment links = new Fragment("pathLinks", "submoduleLinks", TreePage.this);
links.add(new BookmarkablePageLink<Void>("view", SummaryPage.class,
WicketUtils.newRepositoryParameter(submodulePath)).setEnabled(hasSubmodule));
links.add(new BookmarkablePageLink<Void>("tree", TreePage.class,
- WicketUtils.newPathParameter(submodulePath, submoduleId,
- "")).setEnabled(hasSubmodule));
+ WicketUtils.newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule));
links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- entry.path)));
- links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl,
- submodulePath, submoduleId, "").setEnabled(hasSubmodule));
+ WicketUtils.newPathParameter(repositoryName, id, entry.path)));
+ links.add(
+ new CompressedDownloadsPanel("compressedLinks", baseUrl, submodulePath, submoduleId, "")
+ .setEnabled(hasSubmodule));
item.add(links);
} else {
// blob link
@@ -166,101 +165,107 @@ public class TreePage extends RepositoryPage {
}
item.add(WicketUtils.getFileImage("pathIcon", entry.name));
item.add(new Label("pathSize", byteFormat.format(entry.size)));
-
+
// links
- Fragment links = new Fragment("pathLinks", "blobLinks", this);
-
+ Fragment links = new Fragment("pathLinks", "blobLinks", TreePage.this);
+
if (entry.isFilestoreItem()) {
item.add(new LinkPanel("pathName", "list", displayPath, new Link<Object>("link", null) {
-
+
private static final long serialVersionUID = 1L;
@Override
- public void onClick() {
-
- IResourceStream resourceStream = new AbstractResourceStreamWriter() {
-
+ public void onClick() {
+
+ IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+
private static final long serialVersionUID = 1L;
- @Override
- public void write(OutputStream output) {
- UserModel user = GitBlitWebSession.get().getUser();
- user = user == null ? UserModel.ANONYMOUS : user;
-
- app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
- }
- };
-
-
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }}));
-
+ @Override
+ public void write(OutputStream output) {
+ UserModel user = GitBlitWebSession.get().getUser();
+ user = user == null ? UserModel.ANONYMOUS : user;
+
+ app().filestore().downloadBlob(entry.getFilestoreOid(), user,
+ getRepositoryModel(), output);
+ }
+ };
+
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler);
+
+ }
+ }));
+
links.add(new Link<Object>("view", null) {
-
+
private static final long serialVersionUID = 1L;
@Override
- public void onClick() {
-
- IResourceStream resourceStream = new AbstractResourceStreamWriter() {
-
+ public void onClick() {
+
+ IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+
private static final long serialVersionUID = 1L;
- @Override
- public void write(OutputStream output) {
- UserModel user = GitBlitWebSession.get().getUser();
- user = user == null ? UserModel.ANONYMOUS : user;
-
- app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
- }
- };
-
-
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }});
-
+ @Override
+ public void write(OutputStream output) {
+ UserModel user = GitBlitWebSession.get().getUser();
+ user = user == null ? UserModel.ANONYMOUS : user;
+
+ app().filestore().downloadBlob(entry.getFilestoreOid(), user,
+ getRepositoryModel(), output);
+ }
+ };
+
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler);
+ }
+ });
+
links.add(new Link<Object>("raw", null) {
-
+
private static final long serialVersionUID = 1L;
@Override
- public void onClick() {
-
- IResourceStream resourceStream = new AbstractResourceStreamWriter() {
-
+ public void onClick() {
+
+ IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+
private static final long serialVersionUID = 1L;
- @Override
- public void write(OutputStream output) {
- UserModel user = GitBlitWebSession.get().getUser();
- user = user == null ? UserModel.ANONYMOUS : user;
-
- app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
- }
- };
-
-
- getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
- }});
-
+ @Override
+ public void write(OutputStream output) {
+ UserModel user = GitBlitWebSession.get().getUser();
+ user = user == null ? UserModel.ANONYMOUS : user;
+
+ app().filestore().downloadBlob(entry.getFilestoreOid(), user,
+ getRepositoryModel(), output);
+ }
+ };
+
+ ResourceStreamRequestHandler resourceStreamRequestHandler = new ResourceStreamRequestHandler(
+ resourceStream, entry.path);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler);
+ }
+ });
+
} else {
item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- path)));
-
+ WicketUtils.newPathParameter(repositoryName, id, path)));
+
links.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- path)));
+ WicketUtils.newPathParameter(repositoryName, id, path)));
String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, id, path);
links.add(new ExternalLink("raw", rawUrl));
}
-
+
links.add(new BookmarkablePageLink<Void>("blame", BlamePage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- path)));
+ WicketUtils.newPathParameter(repositoryName, id, path)));
links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
- WicketUtils.newPathParameter(repositoryName, id,
- path)));
+ WicketUtils.newPathParameter(repositoryName, id, path)));
item.add(links);
}
}
diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java
index ea68f25b..b37e75d8 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java
@@ -23,7 +23,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.Locale;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.basic.Label;
@@ -291,7 +291,6 @@ public class UserPage extends RootPage {
try {
app().gitblit().reviseUser(user.username, user);
- setRedirect(true);
setResponsePage(UserPage.class, WicketUtils.newUsernameParameter(user.username));
} catch (GitBlitException e) {
// logger.error("Failed to update user " + user.username, e);
@@ -302,17 +301,17 @@ public class UserPage extends RootPage {
// add the preferences tab
add(new Fragment("preferencesLink", "preferencesLinkFragment", this).setRenderBodyOnly(true));
- Fragment fragment = new Fragment("preferencesTab", "preferencesTabFragment", this);
+ Fragment fragment = new Fragment("preferencesTab", "preferencesTabFragment", UserPage.this);
fragment.add(prefs);
add(fragment.setRenderBodyOnly(true));
}
private void addSshKeys(final UserModel user) {
- Fragment keysTab = new Fragment("sshKeysTab", "sshKeysTabFragment", this);
+ Fragment keysTab = new Fragment("sshKeysTab", "sshKeysTabFragment", UserPage.this);
keysTab.add(new SshKeysPanel("sshKeysPanel", user));
// add the SSH keys tab
- add(new Fragment("sshKeysLink", "sshKeysLinkFragment", this).setRenderBodyOnly(true));
+ add(new Fragment("sshKeysLink", "sshKeysLinkFragment", UserPage.this).setRenderBodyOnly(true));
add(keysTab.setRenderBodyOnly(true));
}
diff --git a/src/main/java/com/gitblit/wicket/panels/AccessPolicyPanel.java b/src/main/java/com/gitblit/wicket/panels/AccessPolicyPanel.java
index 2c880247..25895ec8 100644
--- a/src/main/java/com/gitblit/wicket/panels/AccessPolicyPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/AccessPolicyPanel.java
@@ -145,7 +145,7 @@ public class AccessPolicyPanel extends BasePanel {
add(policiesGroup);
if (app().settings().getBoolean(Keys.web.allowForking, true)) {
- Fragment fragment = new Fragment("allowForks", "allowForksFragment", this);
+ Fragment fragment = new Fragment("allowForks", "allowForksFragment", AccessPolicyPanel.this);
fragment.add(new BooleanOption("allowForks",
getString("gb.allowForks"),
getString("gb.allowForksDescription"),
diff --git a/src/main/java/com/gitblit/wicket/panels/BasePanel.java b/src/main/java/com/gitblit/wicket/panels/BasePanel.java
index 73f8e471..f46e10b3 100644
--- a/src/main/java/com/gitblit/wicket/panels/BasePanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/BasePanel.java
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
import com.gitblit.Constants;
import com.gitblit.Keys;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.TimeUtils;
import com.gitblit.wicket.GitBlitWebApp;
import com.gitblit.wicket.GitBlitWebSession;
@@ -56,7 +57,7 @@ public abstract class BasePanel extends Panel {
}
protected String getContextUrl() {
- return getRequest().getRelativePathPrefixToContextRoot();
+ return GitBlitRequestUtils.getRelativePathPrefixToContextRoot();
}
protected TimeZone getTimeZone() {
@@ -90,7 +91,7 @@ public abstract class BasePanel extends Panel {
private static final long serialVersionUID = 1L;
public JavascriptEventConfirmation(String event, String msg) {
- super(event, true, new Model<String>(msg));
+ super(event, new Model<String>(msg));
}
@Override
@@ -112,7 +113,7 @@ public abstract class BasePanel extends Panel {
private String initialValue = "";
public JavascriptTextPrompt(String event, String msg, String value) {
- super(event, true, new Model<String>(msg));
+ super(event, new Model<String>(msg));
initialValue = value;
}
diff --git a/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java b/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java
index 98a700b7..9de3aa17 100644
--- a/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java
+++ b/src/main/java/com/gitblit/wicket/panels/BooleanChoiceOption.java
@@ -68,7 +68,7 @@ public class BooleanChoiceOption<T> extends BasePanel {
@Override
protected void onUpdate(AjaxRequestTarget target) {
choice.setEnabled(checkbox.getModelObject());
- target.addComponent(choice);
+ target.add(choice);
if (!choice.isEnabled()) {
choice.setModelObject(null);
}
diff --git a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java
index 7a564aa5..92e7fb6d 100644
--- a/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/BranchesPanel.java
@@ -21,7 +21,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -31,8 +32,6 @@ import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.StringResourceModel;
-import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
@@ -43,6 +42,7 @@ import com.gitblit.models.UserModel;
import com.gitblit.servlet.RawServlet;
import com.gitblit.servlet.SyndicationServlet;
import com.gitblit.utils.CommitCache;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.RefLogUtils;
import com.gitblit.utils.StringUtils;
@@ -140,21 +140,21 @@ public class BranchesPanel extends BasePanel {
item.add(shortlog);
if (maxCount <= 0) {
- Fragment fragment = new Fragment("branchLinks", showDelete? "branchPageAdminLinks" : "branchPageLinks", this);
+ Fragment fragment = new Fragment("branchLinks", showDelete? "branchPageAdminLinks" : "branchPageLinks", BranchesPanel.this);
fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class, shortUniqRef));
fragment.add(new BookmarkablePageLink<Void>("tree", TreePage.class, shortUniqRef));
String rawUrl = RawServlet.asLink(getContextUrl(), model.name, Repository.shortenRefName(entry.getName()), null);
fragment.add(new ExternalLink("raw", rawUrl));
fragment.add(new BookmarkablePageLink<Void>("metrics", MetricsPage.class, shortUniqRef));
fragment.add(new ExternalLink("syndication", SyndicationServlet.asLink(
- getRequest().getRelativePathPrefixToContextRoot(), model.name,
+ GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), model.name,
Repository.shortenRefName(entry.getName()), 0)));
if (showDelete) {
fragment.add(createDeleteBranchLink(model, entry));
}
item.add(fragment);
} else {
- Fragment fragment = new Fragment("branchLinks", "branchPanelLinks", this);
+ Fragment fragment = new Fragment("branchLinks", "branchPanelLinks", BranchesPanel.this);
fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class, shortUniqRef));
fragment.add(new BookmarkablePageLink<Void>("tree", TreePage.class, shortUniqRef));
String rawUrl = RawServlet.asLink(getContextUrl(), model.name, Repository.shortenRefName(entry.getName()), null);
@@ -231,9 +231,8 @@ public class BranchesPanel extends BasePanel {
// redirect to the owning page
PageParameters params = WicketUtils.newRepositoryParameter(repositoryModel.name);
- String relativeUrl = urlFor(getPage().getClass(), params).toString();
- String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl);
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(getPage().getClass(), params);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
};
diff --git a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java
index 2bc08899..3de07346 100644
--- a/src/main/java/com/gitblit/wicket/panels/CommentPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/CommentPanel.java
@@ -15,19 +15,19 @@
*/
package com.gitblit.wicket.panels;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
-import org.apache.wicket.protocol.http.RequestUtils;
-import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TicketModel;
import com.gitblit.models.TicketModel.Change;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.models.UserModel;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.pages.BasePage;
@@ -103,9 +103,8 @@ public class CommentPanel extends BasePanel {
*/
private void redirectTo(Class<? extends BasePage> pageClass, PageParameters parameters)
{
- String relativeUrl = urlFor(pageClass, parameters).toString();
- String canonicalUrl = RequestUtils.toAbsolutePath(relativeUrl);
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(canonicalUrl));
+ String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(pageClass, parameters);
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
}.setVisible(ticket != null && ticket.number > 0));
diff --git a/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java b/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java
index 3a269a93..952fba34 100644
--- a/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java
+++ b/src/main/java/com/gitblit/wicket/panels/FilterableProjectList.java
@@ -26,7 +26,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.basic.Label;
import com.gitblit.Keys;
@@ -121,7 +120,7 @@ public class FilterableProjectList extends BasePanel {
// inject an AngularJS controller with static data
NgController ctrl = new NgController(ngCtrl);
ctrl.addVariable(ngList, list);
- add(new HeaderContributor(ctrl));
+ add(ctrl);
}
protected class ProjectListItem implements Serializable {
diff --git a/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java b/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java
index e4ce5ced..bf97d4f1 100644
--- a/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java
+++ b/src/main/java/com/gitblit/wicket/panels/FilterableRepositoryList.java
@@ -24,7 +24,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.basic.Label;
import com.gitblit.Keys;
@@ -140,7 +139,7 @@ public class FilterableRepositoryList extends BasePanel {
// inject an AngularJS controller with static data
NgController ctrl = new NgController(ngCtrl);
ctrl.addVariable(ngList, list);
- add(new HeaderContributor(ctrl));
+ add(ctrl);
}
protected class RepoListItem implements Serializable {
diff --git a/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java b/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java
index 75fd70e7..cf5854e1 100644
--- a/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java
@@ -207,7 +207,7 @@ public class HistoryPanel extends BasePanel {
WicketUtils.setHtmlTooltip(commitHash, entry.getName());
item.add(commitHash);
- Fragment links = new Fragment("historyLinks", "treeLinks", this);
+ Fragment links = new Fragment("historyLinks", "treeLinks", HistoryPanel.this);
links.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(links);
@@ -230,7 +230,7 @@ public class HistoryPanel extends BasePanel {
WicketUtils.setHtmlTooltip(commitHash, submoduleId);
item.add(commitHash.setEnabled(hasSubmodule));
}
- Fragment links = new Fragment("historyLinks", "treeLinks", this);
+ Fragment links = new Fragment("historyLinks", "treeLinks", HistoryPanel.this);
links.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(links);
@@ -244,7 +244,7 @@ public class HistoryPanel extends BasePanel {
WicketUtils.setHtmlTooltip(commitHash, entry.getName());
item.add(commitHash);
- Fragment links = new Fragment("historyLinks", "blobLinks", this);
+ Fragment links = new Fragment("historyLinks", "blobLinks", HistoryPanel.this);
links.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getName())));
links.add(new BookmarkablePageLink<Void>("difftocurrent", BlobDiffPage.class,
diff --git a/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java b/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java
index eb2288ba..a496db3b 100644
--- a/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java
+++ b/src/main/java/com/gitblit/wicket/panels/IconAjaxLink.java
@@ -17,9 +17,9 @@ package com.gitblit.wicket.panels;
import java.text.MessageFormat;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.model.IModel;
@@ -36,12 +36,12 @@ public abstract class IconAjaxLink<T> extends AjaxLink<T> {
}
@Override
- protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
+ public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
replaceComponentTagBody(markupStream, openTag, MessageFormat.format("<i class=\"{0}\"></i> {1}", iconClass, getModelObject().toString()));
}
public void setNoFollow() {
Component c = get("link");
- c.add(new SimpleAttributeModifier("rel", "nofollow"));
+ c.add(new AttributeModifier("rel", "nofollow"));
}
}
diff --git a/src/main/java/com/gitblit/wicket/panels/LinkPanel.java b/src/main/java/com/gitblit/wicket/panels/LinkPanel.java
index aa09be09..609a1e13 100644
--- a/src/main/java/com/gitblit/wicket/panels/LinkPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/LinkPanel.java
@@ -15,12 +15,9 @@
*/
package com.gitblit.wicket.panels;
-import java.io.OutputStream;
-import java.util.concurrent.Callable;
-
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -29,13 +26,8 @@ import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
-import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
-import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
-import org.apache.wicket.util.resource.IResourceStream;
-import com.gitblit.models.UserModel;
import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
public class LinkPanel extends Panel {
@@ -80,10 +72,10 @@ public class LinkPanel extends Panel {
link = new BookmarkablePageLink<Void>("link", clazz, parameters);
}
if (newWindow) {
- link.add(new SimpleAttributeModifier("target", "_blank"));
+ link.add(new AttributeModifier("target", "_blank"));
}
if (linkCssClass != null) {
- link.add(new SimpleAttributeModifier("class", linkCssClass));
+ link.add(new AttributeModifier("class", linkCssClass));
}
Label icon = new Label("icon");
if (StringUtils.isEmpty(bootstrapIcon)) {
@@ -106,10 +98,10 @@ public class LinkPanel extends Panel {
this.labelModel = new Model<String>(label);
ExternalLink link = new ExternalLink("link", href);
if (newWindow) {
- link.add(new SimpleAttributeModifier("target", "_blank"));
+ link.add(new AttributeModifier("target", "_blank"));
}
if (linkCssClass != null) {
- link.add(new SimpleAttributeModifier("class", linkCssClass));
+ link.add(new AttributeModifier("class", linkCssClass));
}
link.add(new Label("icon").setVisible(false));
link.add(new Label("label", labelModel));
@@ -122,7 +114,7 @@ public class LinkPanel extends Panel {
this.labelModel = new Model<String>(label);
if (linkCssClass != null) {
- link.add(new SimpleAttributeModifier("class", linkCssClass));
+ link.add(new AttributeModifier("class", linkCssClass));
}
link.add(new Label("icon").setVisible(false));
@@ -132,12 +124,12 @@ public class LinkPanel extends Panel {
public void setNoFollow() {
Component c = get("link");
- c.add(new SimpleAttributeModifier("rel", "nofollow"));
+ c.add(new AttributeModifier("rel", "nofollow"));
}
public void setTooltip(String tooltip) {
Component c = get("link");
- c.add(new SimpleAttributeModifier("title", tooltip));
+ c.add(new AttributeModifier("title", tooltip));
}
}
diff --git a/src/main/java/com/gitblit/wicket/panels/LogPanel.java b/src/main/java/com/gitblit/wicket/panels/LogPanel.java
index e9d240d0..fe9f4d7c 100644
--- a/src/main/java/com/gitblit/wicket/panels/LogPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/LogPanel.java
@@ -19,8 +19,8 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -85,7 +85,7 @@ public class LogPanel extends BasePanel {
graph.setVisible(false);
} else {
// set the rowspan on the graph row and +1 for the graph row itself
- graph.add(new SimpleAttributeModifier("rowspan", "" + (commits.size() + 1)));
+ graph.add(new AttributeModifier("rowspan", "" + (commits.size() + 1)));
graph.add(new ExternalImage("image", BranchGraphServlet.asLink(baseUrl, repositoryName, commits.get(0).name(), commits.size())));
}
diff --git a/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java b/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java
index ade92c09..f922686f 100644
--- a/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java
+++ b/src/main/java/com/gitblit/wicket/panels/MarkdownTextArea.java
@@ -45,7 +45,7 @@ public class MarkdownTextArea extends TextArea {
protected void onUpdate(AjaxRequestTarget target) {
renderPreview(previewModel);
if (target != null) {
- target.addComponent(previewLabel);
+ target.add(previewLabel);
}
}
});
@@ -56,7 +56,7 @@ public class MarkdownTextArea extends TextArea {
protected void onUpdate(AjaxRequestTarget target) {
renderPreview(previewModel);
if (target != null) {
- target.addComponent(previewLabel);
+ target.add(previewLabel);
}
}
});
diff --git a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java
index 3c09e7c7..02aada59 100644
--- a/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java
+++ b/src/main/java/com/gitblit/wicket/panels/ObjectContainer.java
@@ -19,17 +19,17 @@ package com.gitblit.wicket.panels;
import java.util.List;
import org.apache.wicket.Component;
-import org.apache.wicket.ResourceReference;
-import org.apache.wicket.Response;
+//import org.apache.wicket.ResourceReference;
+import org.apache.wicket.core.request.ClientInfo;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.protocol.http.ClientProperties;
-import org.apache.wicket.protocol.http.WebRequestCycle;
import org.apache.wicket.protocol.http.WebSession;
import org.apache.wicket.protocol.http.request.WebClientInfo;
-import org.apache.wicket.request.ClientInfo;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.util.value.IValueMap;
/**
@@ -85,8 +85,8 @@ public abstract class ObjectContainer extends WebMarkupContainer {
parent = parent.getParent();
}
if (parent != null) {
- ResourceReference resRef = new ResourceReference(parent.getClass(), src, false);
- return (urlFor(resRef).toString());
+ PackageResourceReference resRef = new PackageResourceReference(parent.getClass(), src);
+ return (urlFor(resRef, getPage().getPageParameters()).toString());
}
return (src);
@@ -149,7 +149,7 @@ public abstract class ObjectContainer extends WebMarkupContainer {
ClientInfo clientInfo = WebSession.get().getClientInfo();
if (clientInfo == null || !(clientInfo instanceof WebClientInfo)) {
- clientInfo = new WebClientInfo((WebRequestCycle) getRequestCycle());
+ clientInfo = new WebClientInfo(getRequestCycle());
WebSession.get().setClientInfo(clientInfo);
}
diff --git a/src/main/java/com/gitblit/wicket/panels/PagerPanel.java b/src/main/java/com/gitblit/wicket/panels/PagerPanel.java
index 2d774c41..c80bb73c 100644
--- a/src/main/java/com/gitblit/wicket/panels/PagerPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/PagerPanel.java
@@ -19,7 +19,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
@@ -69,7 +69,7 @@ public class PagerPanel extends Panel {
public void populateItem(final Item<PageObject> item) {
PageObject pageItem = item.getModelObject();
PageParameters pageParams = new PageParameters(baseParams);
- pageParams.put("pg", pageItem.page);
+ pageParams.add("pg", pageItem.page);
LinkPanel link = new LinkPanel("pageLink", null, pageItem.text, pageClass, pageParams);
link.setRenderBodyOnly(true);
item.add(link);
diff --git a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
index efcb1cb6..6c0d1c67 100644
--- a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
@@ -19,7 +19,7 @@ import java.util.Map;
import org.apache.wicket.Component;
import org.apache.wicket.Localizer;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
@@ -31,6 +31,7 @@ import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.servlet.SyndicationServlet;
import com.gitblit.utils.ArrayUtils;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
@@ -59,13 +60,13 @@ public class ProjectRepositoryPanel extends BasePanel {
Fragment iconFragment;
if (entry.isMirror) {
- iconFragment = new Fragment("repoIcon", "mirrorIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "mirrorIconFragment", ProjectRepositoryPanel.this);
} else if (entry.isFork()) {
- iconFragment = new Fragment("repoIcon", "forkIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "forkIconFragment", ProjectRepositoryPanel.this);
} else if (entry.isBare) {
- iconFragment = new Fragment("repoIcon", "repoIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "repoIconFragment", ProjectRepositoryPanel.this);
} else {
- iconFragment = new Fragment("repoIcon", "cloneIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "cloneIconFragment", ProjectRepositoryPanel.this);
}
if (showSwatch) {
WicketUtils.setCssStyle(iconFragment, "color:" + StringUtils.getColor(entry.toString()));
@@ -75,7 +76,7 @@ public class ProjectRepositoryPanel extends BasePanel {
if (StringUtils.isEmpty(entry.originRepository)) {
add(new Label("originRepository").setVisible(false));
} else {
- Fragment forkFrag = new Fragment("originRepository", "originFragment", this);
+ Fragment forkFrag = new Fragment("originRepository", "originFragment", ProjectRepositoryPanel.this);
forkFrag.add(new LinkPanel("originRepository", null, StringUtils.stripDotGit(entry.originRepository),
SummaryPage.class, WicketUtils.newRepositoryParameter(entry.originRepository)));
add(forkFrag);
@@ -125,11 +126,11 @@ public class ProjectRepositoryPanel extends BasePanel {
}
Fragment repositoryLinks;
if (user.canAdmin(entry)) {
- repositoryLinks = new Fragment("repositoryLinks", "repositoryOwnerLinks", this);
+ repositoryLinks = new Fragment("repositoryLinks", "repositoryOwnerLinks", ProjectRepositoryPanel.this);
repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository", EditRepositoryPage.class,
WicketUtils.newRepositoryParameter(entry.name)));
} else {
- repositoryLinks = new Fragment("repositoryLinks", "repositoryUserLinks", this);
+ repositoryLinks = new Fragment("repositoryLinks", "repositoryUserLinks", ProjectRepositoryPanel.this);
}
repositoryLinks.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils
@@ -158,7 +159,7 @@ public class ProjectRepositoryPanel extends BasePanel {
add(new Label("repositorySize", localizer.getString("gb.empty", parent)).setEscapeModelStrings(false));
}
- add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest()
+ add(new ExternalLink("syndication", SyndicationServlet.asLink(GitBlitRequestUtils
.getRelativePathPrefixToContextRoot(), entry.name, null, 0)));
}
}
diff --git a/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java b/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
index 447e1789..839d80f9 100644
--- a/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
@@ -214,7 +214,7 @@ public class RegistrantPermissionsPanel extends BasePanel {
@Override
protected void onUpdate(AjaxRequestTarget target) {
- target.addComponent(permissionChoice);
+ target.add(permissionChoice);
}
});
}
@@ -277,7 +277,7 @@ public class RegistrantPermissionsPanel extends BasePanel {
registrants.remove(rp.registrant);
// force the panel to refresh
- target.addComponent(RegistrantPermissionsPanel.this);
+ target.add(RegistrantPermissionsPanel.this);
}
};
addPermissionForm.add(button);
@@ -312,6 +312,11 @@ public class RegistrantPermissionsPanel extends BasePanel {
public String getIdValue(AccessPermission type, int index) {
return Integer.toString(index);
}
+
+ @Override
+ public AccessPermission getObject(String id, IModel<? extends List<? extends AccessPermission>> choices) {
+ return choices.getObject().get(Integer.valueOf(id));
+ }
}
private class ShowStateButton extends AjaxButton {
@@ -339,7 +344,7 @@ public class RegistrantPermissionsPanel extends BasePanel {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
RegistrantPermissionsPanel.this.activeState = buttonState;
- target.addComponent(RegistrantPermissionsPanel.this);
+ target.add(RegistrantPermissionsPanel.this);
}
};
}
diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java
index c3f07099..57ae1270 100644
--- a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -24,8 +24,9 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.html.basic.Label;
@@ -74,7 +75,7 @@ public class RepositoriesPanel extends BasePanel {
Fragment managementLinks;
if (showAdmin) {
// user is admin
- managementLinks = new Fragment("managementPanel", "adminLinks", this);
+ managementLinks = new Fragment("managementPanel", "adminLinks", RepositoriesPanel.this);
managementLinks.add(new Link<Void>("clearCache") {
private static final long serialVersionUID = 1L;
@@ -89,7 +90,7 @@ public class RepositoriesPanel extends BasePanel {
add(managementLinks);
} else if (showManagement && user != null && user.canCreate()) {
// user can create personal repositories
- managementLinks = new Fragment("managementPanel", "personalLinks", this);
+ managementLinks = new Fragment("managementPanel", "personalLinks", RepositoriesPanel.this);
managementLinks.add(new BookmarkablePageLink<Void>("newRepository", app().getNewRepositoryPage()));
add(managementLinks);
} else {
@@ -159,7 +160,7 @@ public class RepositoriesPanel extends BasePanel {
if (entry instanceof GroupRepositoryModel) {
GroupRepositoryModel groupRow = (GroupRepositoryModel) entry;
currGroupName = entry.name;
- Fragment row = new Fragment("rowContent", "groupRepositoryRow", this);
+ Fragment row = new Fragment("rowContent", "groupRepositoryRow", RepositoriesPanel.this);
item.add(row);
String name = groupRow.name;
@@ -179,19 +180,19 @@ public class RepositoriesPanel extends BasePanel {
counter = 0;
return;
}
- Fragment row = new Fragment("rowContent", "repositoryRow", this);
+ Fragment row = new Fragment("rowContent", "repositoryRow", RepositoriesPanel.this);
item.add(row);
// show colored repository type icon
Fragment iconFragment;
if (entry.isMirror) {
- iconFragment = new Fragment("repoIcon", "mirrorIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "mirrorIconFragment", RepositoriesPanel.this);
} else if (entry.isFork()) {
- iconFragment = new Fragment("repoIcon", "forkIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "forkIconFragment", RepositoriesPanel.this);
} else if (entry.isBare) {
- iconFragment = new Fragment("repoIcon", "repoIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "repoIconFragment", RepositoriesPanel.this);
} else {
- iconFragment = new Fragment("repoIcon", "cloneIconFragment", this);
+ iconFragment = new Fragment("repoIcon", "cloneIconFragment", RepositoriesPanel.this);
}
if (showSwatch) {
WicketUtils.setCssStyle(iconFragment, "color:" + StringUtils.getColor(entry.toString()));
@@ -307,10 +308,10 @@ public class RepositoriesPanel extends BasePanel {
};
add(dataView);
- if (dp instanceof SortableDataProvider<?>) {
+ if (dp instanceof SortableDataProvider<?,?>) {
// add sortable header
- SortableDataProvider<?> sdp = (SortableDataProvider<?>) dp;
- Fragment fragment = new Fragment("headerContent", "flatRepositoryHeader", this);
+ SortableDataProvider<?,?> sdp = (SortableDataProvider<?,?>) dp;
+ Fragment fragment = new Fragment("headerContent", "flatRepositoryHeader", RepositoriesPanel.this);
fragment.add(newSort("orderByRepository", SortBy.repository, sdp, dataView));
fragment.add(newSort("orderByDescription", SortBy.description, sdp, dataView));
fragment.add(newSort("orderByOwner", SortBy.owner, sdp, dataView));
@@ -318,7 +319,7 @@ public class RepositoriesPanel extends BasePanel {
add(fragment);
} else {
// not sortable
- Fragment fragment = new Fragment("headerContent", "groupRepositoryHeader", this);
+ Fragment fragment = new Fragment("headerContent", "groupRepositoryHeader", RepositoriesPanel.this);
add(fragment);
}
}
@@ -345,7 +346,7 @@ public class RepositoriesPanel extends BasePanel {
repository, description, owner, date;
}
- protected OrderByBorder newSort(String wicketId, SortBy field, SortableDataProvider<?> dp,
+ protected OrderByBorder newSort(String wicketId, SortBy field, SortableDataProvider<?,?> dp,
final DataView<?> dataView) {
return new OrderByBorder(wicketId, field.name(), dp) {
private static final long serialVersionUID = 1L;
@@ -357,7 +358,7 @@ public class RepositoriesPanel extends BasePanel {
};
}
- private static class SortableRepositoriesProvider extends SortableDataProvider<RepositoryModel> {
+ private static class SortableRepositoriesProvider extends SortableDataProvider<RepositoryModel, String> {
private static final long serialVersionUID = 1L;
@@ -365,11 +366,11 @@ public class RepositoriesPanel extends BasePanel {
protected SortableRepositoriesProvider(List<RepositoryModel> list) {
this.list = list;
- setSort(SortBy.date.name(), false);
+ setSort(SortBy.date.name(), SortOrder.DESCENDING);
}
@Override
- public int size() {
+ public long size() {
if (list == null) {
return 0;
}
@@ -382,8 +383,8 @@ public class RepositoriesPanel extends BasePanel {
}
@Override
- public Iterator<RepositoryModel> iterator(int first, int count) {
- SortParam sp = getSort();
+ public Iterator<? extends RepositoryModel> iterator(long first, long count) {
+ SortParam<String> sp = getSort();
String prop = sp.getProperty();
final boolean asc = sp.isAscending();
@@ -430,7 +431,8 @@ public class RepositoriesPanel extends BasePanel {
}
});
}
- return list.subList(first, first + count).iterator();
+ return list.subList(Math.toIntExact(first), Math.toIntExact(first + count)).iterator();
}
+
}
}
diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java
index 207f1250..19fe46c1 100644
--- a/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java
@@ -24,15 +24,14 @@ import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.wicket.Component;
-import org.apache.wicket.RequestCycle;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.apache.wicket.protocol.http.WebRequest;
import org.apache.wicket.protocol.http.request.WebClientInfo;
+import org.apache.wicket.request.cycle.RequestCycle;
import com.gitblit.Constants.AccessPermission;
import com.gitblit.Constants.AccessRestrictionType;
@@ -41,6 +40,7 @@ import com.gitblit.models.GitClientApplication;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.RepositoryUrl;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.ExternalImage;
import com.gitblit.wicket.GitBlitWebSession;
@@ -78,7 +78,7 @@ public class RepositoryUrlPanel extends BasePanel {
protected void onInitialize() {
super.onInitialize();
- HttpServletRequest req = ((WebRequest) getRequest()).getHttpServletRequest();
+ HttpServletRequest req = GitBlitRequestUtils.getServletRequest();
List<RepositoryUrl> repositoryUrls = app().services().getRepositoryUrls(req, user, repository);
// grab primary url from the top of the list
@@ -119,7 +119,7 @@ public class RepositoryUrlPanel extends BasePanel {
protected Fragment createPrimaryUrlPanel(String wicketId, final RepositoryModel repository, List<RepositoryUrl> repositoryUrls) {
- Fragment urlPanel = new Fragment(wicketId, "repositoryUrlFragment", this);
+ Fragment urlPanel = new Fragment(wicketId, "repositoryUrlFragment", RepositoryUrlPanel.this);
urlPanel.setRenderBodyOnly(true);
if (repositoryUrls.size() == 1) {
@@ -139,7 +139,7 @@ public class RepositoryUrlPanel extends BasePanel {
public void populateItem(final Item<RepositoryUrl> item) {
RepositoryUrl repoUrl = item.getModelObject();
// repository url
- Fragment fragment = new Fragment("repoUrl", "actionFragment", this);
+ Fragment fragment = new Fragment("repoUrl", "actionFragment", RepositoryUrlPanel.this);
Component content = new Label("content", repoUrl.url).setRenderBodyOnly(true);
WicketUtils.setCssClass(content, "commandMenuItem");
fragment.add(content);
@@ -154,7 +154,7 @@ public class RepositoryUrlPanel extends BasePanel {
}
};
- Fragment urlMenuFragment = new Fragment("menu", "urlProtocolMenuFragment", this);
+ Fragment urlMenuFragment = new Fragment("menu", "urlProtocolMenuFragment", RepositoryUrlPanel.this);
urlMenuFragment.setRenderBodyOnly(true);
urlMenuFragment.add(new Label("menuText", getString("gb.url")));
urlMenuFragment.add(repoUrlMenuItems);
@@ -253,7 +253,7 @@ public class RepositoryUrlPanel extends BasePanel {
return;
}
- Fragment appMenu = new Fragment("appMenu", "appMenuFragment", this);
+ Fragment appMenu = new Fragment("appMenu", "appMenuFragment", RepositoryUrlPanel.this);
appMenu.setRenderBodyOnly(true);
item.add(appMenu);
@@ -304,7 +304,7 @@ public class RepositoryUrlPanel extends BasePanel {
@Override
public void populateItem(final Item<RepositoryUrl> repoLinkItem) {
RepositoryUrl repoUrl = repoLinkItem.getModelObject();
- Fragment fragment = new Fragment("actionItem", "actionFragment", this);
+ Fragment fragment = new Fragment("actionItem", "actionFragment", RepositoryUrlPanel.this);
fragment.add(createPermissionBadge("permission", repoUrl));
if (!StringUtils.isEmpty(clientApp.cloneUrl)) {
@@ -329,7 +329,7 @@ public class RepositoryUrlPanel extends BasePanel {
}
};
- Fragment applicationMenus = new Fragment(wicketId, "applicationMenusFragment", this);
+ Fragment applicationMenus = new Fragment(wicketId, "applicationMenusFragment", RepositoryUrlPanel.this);
applicationMenus.add(appMenus);
return applicationMenus;
}
@@ -349,7 +349,7 @@ public class RepositoryUrlPanel extends BasePanel {
protected Fragment createCopyFragment(String text) {
if (app().settings().getBoolean(Keys.web.allowFlashCopyToClipboard, true)) {
// clippy: flash-based copy & paste
- Fragment copyFragment = new Fragment("copyFunction", "clippyPanel", this);
+ Fragment copyFragment = new Fragment("copyFunction", "clippyPanel", RepositoryUrlPanel.this);
String baseUrl = WicketUtils.getGitblitURL(getRequest());
ShockWaveComponent clippy = new ShockWaveComponent("clippy", baseUrl + "/clippy.swf");
clippy.setValue("flashVars", "text=" + StringUtils.encodeURL(text));
@@ -357,7 +357,7 @@ public class RepositoryUrlPanel extends BasePanel {
return copyFragment;
} else {
// javascript: manual copy & paste with modal browser prompt dialog
- Fragment copyFragment = new Fragment("copyFunction", "jsPanel", this);
+ Fragment copyFragment = new Fragment("copyFunction", "jsPanel", RepositoryUrlPanel.this);
ContextImage img = WicketUtils.newImage("copyIcon", "clippy.png");
img.add(new JavascriptTextPrompt("onclick", "Copy to Clipboard (Ctrl+C, Enter)", text));
copyFragment.add(img);
@@ -441,11 +441,11 @@ public class RepositoryUrlPanel extends BasePanel {
}
protected Component createRepositoryIndicators(RepositoryModel repository) {
- Fragment fragment = new Fragment("repositoryIndicators", "indicatorsFragment", this);
+ Fragment fragment = new Fragment("repositoryIndicators", "indicatorsFragment", RepositoryUrlPanel.this);
if (repository.isBare) {
fragment.add(new Label("workingCopyIndicator").setVisible(false));
} else {
- Fragment wc = new Fragment("workingCopyIndicator", "workingCopyFragment", this);
+ Fragment wc = new Fragment("workingCopyIndicator", "workingCopyFragment", RepositoryUrlPanel.this);
Label lbl = new Label("workingCopy", getString("gb.workingCopy"));
WicketUtils.setHtmlTooltip(lbl, getString("gb.workingCopyWarning"));
wc.add(lbl);
@@ -464,7 +464,7 @@ public class RepositoryUrlPanel extends BasePanel {
if (hasFork || !canFork) {
if (user.canFork() && !repository.allowForks) {
// show forks prohibited indicator
- Fragment wc = new Fragment("forksProhibitedIndicator", "forksProhibitedFragment", this);
+ Fragment wc = new Fragment("forksProhibitedIndicator", "forksProhibitedFragment", RepositoryUrlPanel.this);
Label lbl = new Label("forksProhibited", getString("gb.forksProhibited"));
WicketUtils.setHtmlTooltip(lbl, getString("gb.forksProhibitedWarning"));
wc.add(lbl);
diff --git a/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java b/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java
index 78822c6d..416337f4 100644
--- a/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java
+++ b/src/main/java/com/gitblit/wicket/panels/ShockWaveComponent.java
@@ -22,9 +22,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.wicket.Response;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
+import org.apache.wicket.request.Response;
import org.apache.wicket.util.value.IValueMap;
/**
diff --git a/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java b/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java
index d7466522..6a3cca06 100644
--- a/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java
+++ b/src/main/java/com/gitblit/wicket/panels/SimpleAjaxLink.java
@@ -15,9 +15,9 @@
*/
package com.gitblit.wicket.panels;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.model.IModel;
@@ -31,12 +31,12 @@ public abstract class SimpleAjaxLink<T> extends AjaxLink<T> {
}
@Override
- protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
+ public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
replaceComponentTagBody(markupStream, openTag, getModelObject().toString());
}
public void setNoFollow() {
Component c = get("link");
- c.add(new SimpleAttributeModifier("rel", "nofollow"));
+ c.add(new AttributeModifier("rel", "nofollow"));
}
}
diff --git a/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java
index 15ebd67b..a06f9c4d 100644
--- a/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java
@@ -86,7 +86,7 @@ public class SshKeysPanel extends BasePanel {
keys.addAll(app().keys().getKeys(user.username));
// update the panel
- target.addComponent(SshKeysPanel.this);
+ target.add(SshKeysPanel.this);
}
}
};
@@ -159,7 +159,7 @@ public class SshKeysPanel extends BasePanel {
keys.addAll(app().keys().getKeys(user.username));
// update the panel
- target.addComponent(SshKeysPanel.this);
+ target.add(SshKeysPanel.this);
}
}
});
diff --git a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java
index f1f82739..85a50139 100644
--- a/src/main/java/com/gitblit/wicket/panels/TagsPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/TagsPanel.java
@@ -17,7 +17,6 @@ package com.gitblit.wicket.panels;
import java.util.List;
-import org.apache.wicket.RequestCycle;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -32,6 +31,7 @@ import org.eclipse.jgit.lib.Repository;
import com.gitblit.models.RefModel;
import com.gitblit.servlet.RawServlet;
+import com.gitblit.utils.GitBlitRequestUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.WicketUtils;
@@ -106,7 +106,7 @@ public class TagsPanel extends BasePanel {
}
item.add(messageLink);
- Fragment fragment = new Fragment("tagLinks", "blobLinks", this);
+ Fragment fragment = new Fragment("tagLinks", "blobLinks", TagsPanel.this);
fragment.add(new BookmarkablePageLink<Void>("tag", TagPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getObjectId().getName()))
.setEnabled(entry.isAnnotatedTag()));
@@ -115,7 +115,7 @@ public class TagsPanel extends BasePanel {
.newObjectParameter(repositoryName, entry.getReferencedObjectId()
.getName())));
- String contextUrl = RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot();
+ String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot();
String rawUrl = RawServlet.asLink(contextUrl, repositoryName, entry.displayName,
entry.getReferencedObjectId().getName());
fragment.add(new ExternalLink("raw", rawUrl));
@@ -133,7 +133,7 @@ public class TagsPanel extends BasePanel {
}
item.add(messageLink);
- Fragment fragment = new Fragment("tagLinks", "annotatedLinks", this);
+ Fragment fragment = new Fragment("tagLinks", "annotatedLinks", TagsPanel.this);
fragment.add(new BookmarkablePageLink<Void>("tag", TagPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getObjectId()
.getName())).setEnabled(entry.isAnnotatedTag()));
@@ -150,7 +150,7 @@ public class TagsPanel extends BasePanel {
item.add(new LinkPanel("tagDescription", "list", message, CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getObjectId()
.getName())));
- Fragment fragment = new Fragment("tagLinks", "lightweightLinks", this);
+ Fragment fragment = new Fragment("tagLinks", "lightweightLinks", TagsPanel.this);
fragment.add(new BookmarkablePageLink<Void>("commit", CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, entry
.getReferencedObjectId().getName())));
diff --git a/src/main/java/com/gitblit/wicket/panels/TeamsPanel.java b/src/main/java/com/gitblit/wicket/panels/TeamsPanel.java
index 7f3fd9a2..69c64fc7 100644
--- a/src/main/java/com/gitblit/wicket/panels/TeamsPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/TeamsPanel.java
@@ -37,7 +37,7 @@ public class TeamsPanel extends BasePanel {
public TeamsPanel(String wicketId, final boolean showAdmin) {
super(wicketId);
- Fragment adminLinks = new Fragment("adminPanel", "adminLinks", this);
+ Fragment adminLinks = new Fragment("adminPanel", "adminLinks", TeamsPanel.this);
adminLinks.add(new BookmarkablePageLink<Void>("newTeam", EditTeamPage.class));
add(adminLinks.setVisible(showAdmin));
@@ -65,7 +65,7 @@ public class TeamsPanel extends BasePanel {
: ""));
item.add(new Label("repositories",
entry.repositories.size() > 0 ? ("" + entry.repositories.size()) : ""));
- Fragment teamLinks = new Fragment("teamLinks", "teamAdminLinks", this);
+ Fragment teamLinks = new Fragment("teamLinks", "teamAdminLinks", TeamsPanel.this);
teamLinks.add(new BookmarkablePageLink<Void>("editTeam", EditTeamPage.class,
WicketUtils.newTeamnameParameter(entry.name)));
Link<Void> deleteLink = new Link<Void>("deleteTeam") {
diff --git a/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java b/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java
index 1fbe87cd..6c6435bb 100644
--- a/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/TicketListPanel.java
@@ -19,8 +19,8 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.Item;
@@ -101,7 +101,7 @@ public class TicketListPanel extends BasePanel {
if (ticket.updatedAt == null) {
item.add(new Label("updated").setVisible(false));
} else {
- Fragment updated = new Fragment("updated", "updatedFragment", this);
+ Fragment updated = new Fragment("updated", "updatedFragment", TicketListPanel.this);
UserModel updater = app().users().getUserModel(ticket.updatedBy);
if (updater != null) {
updated.add(new LinkPanel("updatedBy", null, updater.getDisplayName(),
@@ -143,7 +143,7 @@ public class TicketListPanel extends BasePanel {
}
String background = MessageFormat.format("background-color:{0};", tLabel.color);
- label.add(new SimpleAttributeModifier("style", background));
+ label.add(new AttributeModifier("style", background));
labelItem.add(label);
}
};
diff --git a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java
index 21bf1bab..75a12dc5 100644
--- a/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java
+++ b/src/main/java/com/gitblit/wicket/panels/TicketSearchForm.java
@@ -18,11 +18,11 @@ package com.gitblit.wicket.panels;
import java.io.Serializable;
import java.text.MessageFormat;
-import org.apache.wicket.PageParameters;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
-import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.SessionlessForm;
@@ -64,7 +64,7 @@ public class TicketSearchForm extends SessionlessForm<Void> implements Serializa
if (StringUtils.isEmpty(searchString)) {
// redirect to self to avoid wicket page update bug
String absoluteUrl = getAbsoluteUrl();
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
return;
}
@@ -73,6 +73,6 @@ public class TicketSearchForm extends SessionlessForm<Void> implements Serializa
PageParameters params = WicketUtils.newRepositoryParameter(repositoryName);
params.add("s", searchString);
String absoluteUrl = getAbsoluteUrl(pageClass, params);
- getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl));
+ getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
}
}
diff --git a/src/main/java/com/gitblit/wicket/panels/UsersPanel.java b/src/main/java/com/gitblit/wicket/panels/UsersPanel.java
index 5d626552..7200cb76 100644
--- a/src/main/java/com/gitblit/wicket/panels/UsersPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/UsersPanel.java
@@ -38,7 +38,7 @@ public class UsersPanel extends BasePanel {
public UsersPanel(String wicketId, final boolean showAdmin) {
super(wicketId);
- Fragment adminLinks = new Fragment("adminPanel", "adminLinks", this);
+ Fragment adminLinks = new Fragment("adminPanel", "adminLinks", UsersPanel.this);
adminLinks.add(new BookmarkablePageLink<Void>("newUser", EditUserPage.class));
add(adminLinks.setVisible(showAdmin));
@@ -85,7 +85,7 @@ public class UsersPanel extends BasePanel {
item.add(new Label("teams", entry.teams.size() > 0 ? ("" + entry.teams.size()) : ""));
item.add(new Label("repositories",
entry.permissions.size() > 0 ? ("" + entry.permissions.size()) : ""));
- Fragment userLinks = new Fragment("userLinks", "userAdminLinks", this);
+ Fragment userLinks = new Fragment("userLinks", "userAdminLinks", UsersPanel.this);
userLinks.add(new BookmarkablePageLink<Void>("editUser", EditUserPage.class,
WicketUtils.newUsernameParameter(entry.username)));
Link<Void> deleteLink = new Link<Void>("deleteUser") {
diff --git a/src/main/java/com/gitblit/wicket/resources/StaticResources.java b/src/main/java/com/gitblit/wicket/resources/StaticResources.java
new file mode 100644
index 00000000..a93d31d3
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/StaticResources.java
@@ -0,0 +1,43 @@
+package com.gitblit.wicket.resources;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.PackageResourceReference;
+
+public class StaticResources {
+
+ public static void install(WebApplication app) {
+ try {
+ List<String> names = getResourceFiles();
+ for (String res : names) {
+ app.mountResource("/" + res, new PackageResourceReference(StaticResources.class, res));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private static List<String> getResourceFiles() throws IOException {
+ List<String> filenames = new ArrayList<>();
+
+ try (InputStream in = StaticResources.class.getResourceAsStream("");
+ BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
+ String resource;
+
+ while ((resource = br.readLine()) != null) {
+ if (!resource.equals("StaticResources.class")){
+ filenames.add(resource);
+ }
+ }
+ }
+
+ return filenames;
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/add_16x16.png b/src/main/java/com/gitblit/wicket/resources/add_16x16.png
index 0ea124a7..0ea124a7 100644
--- a/src/main/resources/add_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/add_16x16.png
Binary files differ
diff --git a/src/main/resources/arrow_down.png b/src/main/java/com/gitblit/wicket/resources/arrow_down.png
index f31cc819..f31cc819 100644
--- a/src/main/resources/arrow_down.png
+++ b/src/main/java/com/gitblit/wicket/resources/arrow_down.png
Binary files differ
diff --git a/src/main/resources/arrow_left.png b/src/main/java/com/gitblit/wicket/resources/arrow_left.png
index d9c50c4d..d9c50c4d 100644
--- a/src/main/resources/arrow_left.png
+++ b/src/main/java/com/gitblit/wicket/resources/arrow_left.png
Binary files differ
diff --git a/src/main/resources/arrow_line.png b/src/main/java/com/gitblit/wicket/resources/arrow_line.png
index ac45c8bf..ac45c8bf 100644
--- a/src/main/resources/arrow_line.png
+++ b/src/main/java/com/gitblit/wicket/resources/arrow_line.png
Binary files differ
diff --git a/src/main/resources/arrow_off.png b/src/main/java/com/gitblit/wicket/resources/arrow_off.png
index f9b1ced2..f9b1ced2 100644
--- a/src/main/resources/arrow_off.png
+++ b/src/main/java/com/gitblit/wicket/resources/arrow_off.png
Binary files differ
diff --git a/src/main/resources/arrow_page.png b/src/main/java/com/gitblit/wicket/resources/arrow_page.png
index 93a125a4..93a125a4 100644
--- a/src/main/resources/arrow_page.png
+++ b/src/main/java/com/gitblit/wicket/resources/arrow_page.png
Binary files differ
diff --git a/src/main/resources/arrow_project.png b/src/main/java/com/gitblit/wicket/resources/arrow_project.png
index 608c0600..608c0600 100644
--- a/src/main/resources/arrow_project.png
+++ b/src/main/java/com/gitblit/wicket/resources/arrow_project.png
Binary files differ
diff --git a/src/main/resources/arrow_up.png b/src/main/java/com/gitblit/wicket/resources/arrow_up.png
index 63031c33..63031c33 100644
--- a/src/main/resources/arrow_up.png
+++ b/src/main/java/com/gitblit/wicket/resources/arrow_up.png
Binary files differ
diff --git a/src/main/resources/background.png b/src/main/java/com/gitblit/wicket/resources/background.png
index 6f75e43d..6f75e43d 100644
--- a/src/main/resources/background.png
+++ b/src/main/java/com/gitblit/wicket/resources/background.png
Binary files differ
diff --git a/src/main/resources/barnum_32x32.png b/src/main/java/com/gitblit/wicket/resources/barnum_32x32.png
index e364909d..e364909d 100644
--- a/src/main/resources/barnum_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/barnum_32x32.png
Binary files differ
diff --git a/src/main/resources/blank.png b/src/main/java/com/gitblit/wicket/resources/blank.png
index 109296b9..109296b9 100644
--- a/src/main/resources/blank.png
+++ b/src/main/java/com/gitblit/wicket/resources/blank.png
Binary files differ
diff --git a/src/main/resources/blink32.png b/src/main/java/com/gitblit/wicket/resources/blink32.png
index da593505..da593505 100644
--- a/src/main/resources/blink32.png
+++ b/src/main/java/com/gitblit/wicket/resources/blink32.png
Binary files differ
diff --git a/src/main/resources/book_16x16.png b/src/main/java/com/gitblit/wicket/resources/book_16x16.png
index e48ff95e..e48ff95e 100644
--- a/src/main/resources/book_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/book_16x16.png
Binary files differ
diff --git a/src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java b/src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java
new file mode 100644
index 00000000..0d0778d2
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/Bootstrap.java
@@ -0,0 +1,58 @@
+package com.gitblit.wicket.resources.bootstrap;
+
+import java.util.List;
+
+import org.apache.wicket.markup.head.HeaderItem;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.CssPackageResource;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.request.resource.SharedResourceReference;
+import org.apache.wicket.resource.JQueryResourceReference;
+
+
+public class Bootstrap {
+
+ public static final String BOOTSTRAP_RESPONSIVE_CSS_RESOURCE = "bootstrap:responsiveCss";
+
+ public static void install(WebApplication app) {
+ app.mountResource("/bootstrap/css/bootstrap.css", new PackageResourceReference(Bootstrap.class, "css/bootstrap.css"));
+
+ app.getSharedResources().add(BOOTSTRAP_RESPONSIVE_CSS_RESOURCE, new CssPackageResource(Bootstrap.class, "css/bootstrap-responsive.css", null, null, null));
+ app.mountResource("/bootstrap/css/bootstrap-responsive.css", app.getSharedResources().get(BOOTSTRAP_RESPONSIVE_CSS_RESOURCE));
+
+ app.mountResource("/bootstrap/css/iconic.css", new PackageResourceReference(Bootstrap.class, "css/iconic.css"));
+
+ app.mountResource("/bootstrap/font/iconic_fill.afm", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.afm"));
+ app.mountResource("/bootstrap/font/iconic_fill.css", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.css"));
+ app.mountResource("/bootstrap/font/iconic_fill.eot", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.eot"));
+ app.mountResource("/bootstrap/font/iconic_fill.otf", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.otf"));
+ app.mountResource("/bootstrap/font/iconic_fill.svg", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.svg"));
+ app.mountResource("/bootstrap/font/iconic_fill.ttf", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.ttf"));
+ app.mountResource("/bootstrap/font/iconic_fill.woff", new PackageResourceReference(Bootstrap.class, "font/iconic_fill.woff"));
+
+ app.mountResource("/bootstrap/font/iconic_stroke.afm", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.afm"));
+ app.mountResource("/bootstrap/font/iconic_stroke.css", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.css"));
+ app.mountResource("/bootstrap/font/iconic_stroke.eot", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.eot"));
+ app.mountResource("/bootstrap/font/iconic_stroke.otf", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.otf"));
+ app.mountResource("/bootstrap/font/iconic_stroke.svg", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.svg"));
+ app.mountResource("/bootstrap/font/iconic_stroke.ttf", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.ttf"));
+ app.mountResource("/bootstrap/font/iconic_stroke.woff", new PackageResourceReference(Bootstrap.class, "font/iconic_stroke.woff"));
+
+ app.mountResource("/bootstrap/img/glyphicons-halflings-white.png", new PackageResourceReference(Bootstrap.class, "img/glyphicons-halflings-white.png"));
+ app.mountResource("/bootstrap/img/glyphicons-halflings.png", new PackageResourceReference(Bootstrap.class, "img/glyphicons-halflings.png"));
+
+ app.mountResource("/bootstrap/js/bootstrap.js", new PackageResourceReference(Bootstrap.class, "js/bootstrap.js"){
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public List<HeaderItem> getDependencies() {
+ List<HeaderItem> deps = super.getDependencies();
+ deps.add(JavaScriptHeaderItem.forReference(JQueryResourceReference.get()));
+ return deps;
+ }
+ });
+ }
+
+}
diff --git a/src/main/resources/bootstrap/css/bootstrap-responsive.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap-responsive.css
index 7e7ec697..7e7ec697 100644
--- a/src/main/resources/bootstrap/css/bootstrap-responsive.css
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap-responsive.css
diff --git a/src/main/resources/bootstrap/css/bootstrap.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap.css
index bb40c85f..bb40c85f 100644
--- a/src/main/resources/bootstrap/css/bootstrap.css
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/bootstrap.css
diff --git a/src/main/resources/bootstrap/css/iconic.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/iconic.css
index 66b9fe29..66b9fe29 100644
--- a/src/main/resources/bootstrap/css/iconic.css
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/css/iconic.css
diff --git a/src/main/resources/bootstrap/font/iconic_fill.afm b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.afm
index 0cca7c40..0cca7c40 100644
--- a/src/main/resources/bootstrap/font/iconic_fill.afm
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.afm
diff --git a/src/main/resources/bootstrap/font/iconic_fill.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.css
index 8943a93f..8943a93f 100644
--- a/src/main/resources/bootstrap/font/iconic_fill.css
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.css
diff --git a/src/main/resources/bootstrap/font/iconic_fill.eot b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.eot
index f1e8f85c..f1e8f85c 100644
--- a/src/main/resources/bootstrap/font/iconic_fill.eot
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.eot
Binary files differ
diff --git a/src/main/resources/bootstrap/font/iconic_fill.otf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.otf
index 1b8caffc..1b8caffc 100644
--- a/src/main/resources/bootstrap/font/iconic_fill.otf
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.otf
Binary files differ
diff --git a/src/main/resources/bootstrap/font/iconic_fill.svg b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.svg
index 95e13591..95e13591 100644
--- a/src/main/resources/bootstrap/font/iconic_fill.svg
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.svg
diff --git a/src/main/resources/bootstrap/font/iconic_fill.ttf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.ttf
index 83342540..83342540 100644
--- a/src/main/resources/bootstrap/font/iconic_fill.ttf
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.ttf
Binary files differ
diff --git a/src/main/resources/bootstrap/font/iconic_fill.woff b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.woff
index 9596d8ec..9596d8ec 100644
--- a/src/main/resources/bootstrap/font/iconic_fill.woff
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_fill.woff
Binary files differ
diff --git a/src/main/resources/bootstrap/font/iconic_stroke.afm b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.afm
index bf772836..bf772836 100644
--- a/src/main/resources/bootstrap/font/iconic_stroke.afm
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.afm
diff --git a/src/main/resources/bootstrap/font/iconic_stroke.css b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.css
index f311e412..f311e412 100644
--- a/src/main/resources/bootstrap/font/iconic_stroke.css
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.css
diff --git a/src/main/resources/bootstrap/font/iconic_stroke.eot b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.eot
index eb04fd37..eb04fd37 100644
--- a/src/main/resources/bootstrap/font/iconic_stroke.eot
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.eot
Binary files differ
diff --git a/src/main/resources/bootstrap/font/iconic_stroke.otf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.otf
index 0d132a95..0d132a95 100644
--- a/src/main/resources/bootstrap/font/iconic_stroke.otf
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.otf
Binary files differ
diff --git a/src/main/resources/bootstrap/font/iconic_stroke.svg b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.svg
index e46ede76..e46ede76 100644
--- a/src/main/resources/bootstrap/font/iconic_stroke.svg
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.svg
diff --git a/src/main/resources/bootstrap/font/iconic_stroke.ttf b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.ttf
index f891c8da..f891c8da 100644
--- a/src/main/resources/bootstrap/font/iconic_stroke.ttf
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.ttf
Binary files differ
diff --git a/src/main/resources/bootstrap/font/iconic_stroke.woff b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.woff
index 85f5be59..85f5be59 100644
--- a/src/main/resources/bootstrap/font/iconic_stroke.woff
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/font/iconic_stroke.woff
Binary files differ
diff --git a/src/main/resources/bootstrap/img/glyphicons-halflings-white.png b/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings-white.png
index 3bf6484a..3bf6484a 100644
--- a/src/main/resources/bootstrap/img/glyphicons-halflings-white.png
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings-white.png
Binary files differ
diff --git a/src/main/resources/bootstrap/img/glyphicons-halflings.png b/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings.png
index 79bc568c..79bc568c 100644
--- a/src/main/resources/bootstrap/img/glyphicons-halflings.png
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/img/glyphicons-halflings.png
Binary files differ
diff --git a/src/main/resources/bootstrap/js/bootstrap.js b/src/main/java/com/gitblit/wicket/resources/bootstrap/js/bootstrap.js
index 5d6e65b8..5d6e65b8 100644
--- a/src/main/resources/bootstrap/js/bootstrap.js
+++ b/src/main/java/com/gitblit/wicket/resources/bootstrap/js/bootstrap.js
diff --git a/src/main/resources/bug_16x16.png b/src/main/java/com/gitblit/wicket/resources/bug_16x16.png
index c7299fd7..c7299fd7 100644
--- a/src/main/resources/bug_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/bug_16x16.png
Binary files differ
diff --git a/src/main/resources/bullet_black.png b/src/main/java/com/gitblit/wicket/resources/bullet_black.png
index 29be5679..29be5679 100644
--- a/src/main/resources/bullet_black.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_black.png
Binary files differ
diff --git a/src/main/resources/bullet_blue.png b/src/main/java/com/gitblit/wicket/resources/bullet_blue.png
index b9c8e024..b9c8e024 100644
--- a/src/main/resources/bullet_blue.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_blue.png
Binary files differ
diff --git a/src/main/resources/bullet_delete.png b/src/main/java/com/gitblit/wicket/resources/bullet_delete.png
index 7736d692..7736d692 100644
--- a/src/main/resources/bullet_delete.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_delete.png
Binary files differ
diff --git a/src/main/resources/bullet_error.png b/src/main/java/com/gitblit/wicket/resources/bullet_error.png
index b2e6b752..b2e6b752 100644
--- a/src/main/resources/bullet_error.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_error.png
Binary files differ
diff --git a/src/main/resources/bullet_feed.png b/src/main/java/com/gitblit/wicket/resources/bullet_feed.png
index c6e5f241..c6e5f241 100644
--- a/src/main/resources/bullet_feed.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_feed.png
Binary files differ
diff --git a/src/main/resources/bullet_green.png b/src/main/java/com/gitblit/wicket/resources/bullet_green.png
index 3e89eb1c..3e89eb1c 100644
--- a/src/main/resources/bullet_green.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_green.png
Binary files differ
diff --git a/src/main/resources/bullet_key.png b/src/main/java/com/gitblit/wicket/resources/bullet_key.png
index 62600135..62600135 100644
--- a/src/main/resources/bullet_key.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_key.png
Binary files differ
diff --git a/src/main/resources/bullet_orange.png b/src/main/java/com/gitblit/wicket/resources/bullet_orange.png
index 456774e9..456774e9 100644
--- a/src/main/resources/bullet_orange.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_orange.png
Binary files differ
diff --git a/src/main/resources/bullet_red.png b/src/main/java/com/gitblit/wicket/resources/bullet_red.png
index 6d2d08fe..6d2d08fe 100644
--- a/src/main/resources/bullet_red.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_red.png
Binary files differ
diff --git a/src/main/resources/bullet_white.png b/src/main/java/com/gitblit/wicket/resources/bullet_white.png
index 5c638737..5c638737 100644
--- a/src/main/resources/bullet_white.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_white.png
Binary files differ
diff --git a/src/main/resources/bullet_yellow.png b/src/main/java/com/gitblit/wicket/resources/bullet_yellow.png
index a0bb7e5f..a0bb7e5f 100644
--- a/src/main/resources/bullet_yellow.png
+++ b/src/main/java/com/gitblit/wicket/resources/bullet_yellow.png
Binary files differ
diff --git a/src/main/resources/clipboard_13x13.png b/src/main/java/com/gitblit/wicket/resources/clipboard_13x13.png
index 85f6cd7f..85f6cd7f 100644
--- a/src/main/resources/clipboard_13x13.png
+++ b/src/main/java/com/gitblit/wicket/resources/clipboard_13x13.png
Binary files differ
diff --git a/src/main/resources/clipboard_16x16.png b/src/main/java/com/gitblit/wicket/resources/clipboard_16x16.png
index ee4bd3e9..ee4bd3e9 100644
--- a/src/main/resources/clipboard_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/clipboard_16x16.png
Binary files differ
diff --git a/src/main/resources/clippy.png b/src/main/java/com/gitblit/wicket/resources/clippy.png
index 7a462e16..7a462e16 100644
--- a/src/main/resources/clippy.png
+++ b/src/main/java/com/gitblit/wicket/resources/clippy.png
Binary files differ
diff --git a/src/main/resources/clippy.swf b/src/main/java/com/gitblit/wicket/resources/clippy.swf
index e46886cd..e46886cd 100644
--- a/src/main/resources/clippy.swf
+++ b/src/main/java/com/gitblit/wicket/resources/clippy.swf
Binary files differ
diff --git a/src/main/resources/cold_16x16.png b/src/main/java/com/gitblit/wicket/resources/cold_16x16.png
index 79cb7567..79cb7567 100644
--- a/src/main/resources/cold_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/cold_16x16.png
Binary files differ
diff --git a/src/main/resources/commit_branch_16x16.png b/src/main/java/com/gitblit/wicket/resources/commit_branch_16x16.png
index d1fe7175..d1fe7175 100644
--- a/src/main/resources/commit_branch_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/commit_branch_16x16.png
Binary files differ
diff --git a/src/main/resources/commit_changes_16x16.png b/src/main/java/com/gitblit/wicket/resources/commit_changes_16x16.png
index 257cfee3..257cfee3 100644
--- a/src/main/resources/commit_changes_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/commit_changes_16x16.png
Binary files differ
diff --git a/src/main/resources/commit_divide_16x16.png b/src/main/java/com/gitblit/wicket/resources/commit_divide_16x16.png
index e611bd57..e611bd57 100644
--- a/src/main/resources/commit_divide_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/commit_divide_16x16.png
Binary files differ
diff --git a/src/main/resources/commit_join_16x16.png b/src/main/java/com/gitblit/wicket/resources/commit_join_16x16.png
index 51e7de97..51e7de97 100644
--- a/src/main/resources/commit_join_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/commit_join_16x16.png
Binary files differ
diff --git a/src/main/resources/commit_merge_16x16.png b/src/main/java/com/gitblit/wicket/resources/commit_merge_16x16.png
index 5a066e59..5a066e59 100644
--- a/src/main/resources/commit_merge_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/commit_merge_16x16.png
Binary files differ
diff --git a/src/main/resources/commit_up_16x16.png b/src/main/java/com/gitblit/wicket/resources/commit_up_16x16.png
index 30d005f2..30d005f2 100644
--- a/src/main/resources/commit_up_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/commit_up_16x16.png
Binary files differ
diff --git a/src/main/resources/federated_16x16.png b/src/main/java/com/gitblit/wicket/resources/federated_16x16.png
index 8e208515..8e208515 100644
--- a/src/main/resources/federated_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/federated_16x16.png
Binary files differ
diff --git a/src/main/resources/feed_16x16.png b/src/main/java/com/gitblit/wicket/resources/feed_16x16.png
index 99987a30..99987a30 100644
--- a/src/main/resources/feed_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/feed_16x16.png
Binary files differ
diff --git a/src/main/resources/file_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_16x16.png
index eda44886..eda44886 100644
--- a/src/main/resources/file_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_16x16.png
Binary files differ
diff --git a/src/main/resources/file_acrobat_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_acrobat_16x16.png
index f1627837..f1627837 100644
--- a/src/main/resources/file_acrobat_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_acrobat_16x16.png
Binary files differ
diff --git a/src/main/resources/file_c_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_c_16x16.png
index 44045a9b..44045a9b 100644
--- a/src/main/resources/file_c_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_c_16x16.png
Binary files differ
diff --git a/src/main/resources/file_code_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_code_16x16.png
index 931b0d6a..931b0d6a 100644
--- a/src/main/resources/file_code_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_code_16x16.png
Binary files differ
diff --git a/src/main/resources/file_cpp_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_cpp_16x16.png
index d3f55ee0..d3f55ee0 100644
--- a/src/main/resources/file_cpp_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_cpp_16x16.png
Binary files differ
diff --git a/src/main/resources/file_cs_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_cs_16x16.png
index 80130209..80130209 100644
--- a/src/main/resources/file_cs_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_cs_16x16.png
Binary files differ
diff --git a/src/main/resources/file_doc_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_doc_16x16.png
index 225c3b09..225c3b09 100644
--- a/src/main/resources/file_doc_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_doc_16x16.png
Binary files differ
diff --git a/src/main/resources/file_excel_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_excel_16x16.png
index 04e03327..04e03327 100644
--- a/src/main/resources/file_excel_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_excel_16x16.png
Binary files differ
diff --git a/src/main/resources/file_h_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_h_16x16.png
index 3f7f5394..3f7f5394 100644
--- a/src/main/resources/file_h_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_h_16x16.png
Binary files differ
diff --git a/src/main/resources/file_java_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_java_16x16.png
index 16620e5c..16620e5c 100644
--- a/src/main/resources/file_java_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_java_16x16.png
Binary files differ
diff --git a/src/main/resources/file_php_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_php_16x16.png
index 4ac56183..4ac56183 100644
--- a/src/main/resources/file_php_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_php_16x16.png
Binary files differ
diff --git a/src/main/resources/file_ppt_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_ppt_16x16.png
index 44bbf26f..44bbf26f 100644
--- a/src/main/resources/file_ppt_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_ppt_16x16.png
Binary files differ
diff --git a/src/main/resources/file_ruby_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_ruby_16x16.png
index f29349da..f29349da 100644
--- a/src/main/resources/file_ruby_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_ruby_16x16.png
Binary files differ
diff --git a/src/main/resources/file_settings_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_settings_16x16.png
index 92953fec..92953fec 100644
--- a/src/main/resources/file_settings_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_settings_16x16.png
Binary files differ
diff --git a/src/main/resources/file_vs_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_vs_16x16.png
index 645fa7a0..645fa7a0 100644
--- a/src/main/resources/file_vs_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_vs_16x16.png
Binary files differ
diff --git a/src/main/resources/file_world_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_world_16x16.png
index 0a4fa8be..0a4fa8be 100644
--- a/src/main/resources/file_world_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_world_16x16.png
Binary files differ
diff --git a/src/main/resources/file_zip_16x16.png b/src/main/java/com/gitblit/wicket/resources/file_zip_16x16.png
index 15845924..15845924 100644
--- a/src/main/resources/file_zip_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/file_zip_16x16.png
Binary files differ
diff --git a/src/main/resources/folder_16x16.png b/src/main/java/com/gitblit/wicket/resources/folder_16x16.png
index f1ed9abe..f1ed9abe 100644
--- a/src/main/resources/folder_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/folder_16x16.png
Binary files differ
diff --git a/src/main/resources/folder_star_16x16.png b/src/main/java/com/gitblit/wicket/resources/folder_star_16x16.png
index ae8fdeda..ae8fdeda 100644
--- a/src/main/resources/folder_star_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/folder_star_16x16.png
Binary files differ
diff --git a/src/main/resources/folder_star_32x32.png b/src/main/java/com/gitblit/wicket/resources/folder_star_32x32.png
index d2a076a9..d2a076a9 100644
--- a/src/main/resources/folder_star_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/folder_star_32x32.png
Binary files differ
diff --git a/src/main/java/com/gitblit/wicket/resources/fontawesome/FontAwesome.java b/src/main/java/com/gitblit/wicket/resources/fontawesome/FontAwesome.java
new file mode 100644
index 00000000..8f3188a7
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/FontAwesome.java
@@ -0,0 +1,18 @@
+package com.gitblit.wicket.resources.fontawesome;
+
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.PackageResourceReference;
+
+public class FontAwesome {
+ public static void install(WebApplication app) {
+ app.mountResource("/fontawesome/css/font-awesome.min.css", new PackageResourceReference(FontAwesome.class, "css/font-awesome.min.css"));
+
+ app.mountResource("/fontawesome/fonts/fontawesome-webfont.eot", new PackageResourceReference(FontAwesome.class, "fonts/fontawesome-webfont.eot"));
+ app.mountResource("/fontawesome/fonts/fontawesome-webfont.svg", new PackageResourceReference(FontAwesome.class, "fonts/fontawesome-webfont.svg"));
+ app.mountResource("/fontawesome/fonts/fontawesome-webfont.ttf", new PackageResourceReference(FontAwesome.class, "fonts/fontawesome-webfont.ttf"));
+ app.mountResource("/fontawesome/fonts/fontawesome-webfont.woff", new PackageResourceReference(FontAwesome.class, "fonts/fontawesome-webfont.woff"));
+ app.mountResource("/fontawesome/fonts/fontawesome-webfont.woff2", new PackageResourceReference(FontAwesome.class, "fonts/fontawesome-webfont.woff2"));
+ app.mountResource("/fontawesome/fonts/FontAwesome.otf", new PackageResourceReference(FontAwesome.class, "fonts/FontAwesome.otf"));
+
+ }
+}
diff --git a/src/main/resources/fontawesome/css/font-awesome.min.css b/src/main/java/com/gitblit/wicket/resources/fontawesome/css/font-awesome.min.css
index d0603cb4..d0603cb4 100644
--- a/src/main/resources/fontawesome/css/font-awesome.min.css
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/css/font-awesome.min.css
diff --git a/src/main/resources/fontawesome/fonts/FontAwesome.otf b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/FontAwesome.otf
index 3ed7f8b4..3ed7f8b4 100644
--- a/src/main/resources/fontawesome/fonts/FontAwesome.otf
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/FontAwesome.otf
Binary files differ
diff --git a/src/main/resources/fontawesome/fonts/fontawesome-webfont.eot b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.eot
index 9b6afaed..9b6afaed 100644
--- a/src/main/resources/fontawesome/fonts/fontawesome-webfont.eot
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/src/main/resources/fontawesome/fonts/fontawesome-webfont.svg b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.svg
index d05688e9..d05688e9 100644
--- a/src/main/resources/fontawesome/fonts/fontawesome-webfont.svg
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.svg
diff --git a/src/main/resources/fontawesome/fonts/fontawesome-webfont.ttf b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.ttf
index 26dea795..26dea795 100644
--- a/src/main/resources/fontawesome/fonts/fontawesome-webfont.ttf
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/src/main/resources/fontawesome/fonts/fontawesome-webfont.woff b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.woff
index dc35ce3c..dc35ce3c 100644
--- a/src/main/resources/fontawesome/fonts/fontawesome-webfont.woff
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/src/main/resources/fontawesome/fonts/fontawesome-webfont.woff2 b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.woff2
index 500e5172..500e5172 100644
--- a/src/main/resources/fontawesome/fonts/fontawesome-webfont.woff2
+++ b/src/main/java/com/gitblit/wicket/resources/fontawesome/fonts/fontawesome-webfont.woff2
Binary files differ
diff --git a/src/main/resources/fork-black_16x16.png b/src/main/java/com/gitblit/wicket/resources/fork-black_16x16.png
index aeb8211d..aeb8211d 100644
--- a/src/main/resources/fork-black_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/fork-black_16x16.png
Binary files differ
diff --git a/src/main/resources/fork_16x16.png b/src/main/java/com/gitblit/wicket/resources/fork_16x16.png
index efb749c1..efb749c1 100644
--- a/src/main/resources/fork_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/fork_16x16.png
Binary files differ
diff --git a/src/main/resources/git-black-16x16.png b/src/main/java/com/gitblit/wicket/resources/git-black-16x16.png
index 559c45a4..559c45a4 100644
--- a/src/main/resources/git-black-16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/git-black-16x16.png
Binary files differ
diff --git a/src/main/resources/git-black.png b/src/main/java/com/gitblit/wicket/resources/git-black.png
index 8bc4c439..8bc4c439 100644
--- a/src/main/resources/git-black.png
+++ b/src/main/java/com/gitblit/wicket/resources/git-black.png
Binary files differ
diff --git a/src/main/resources/git-black_210x210.png b/src/main/java/com/gitblit/wicket/resources/git-black_210x210.png
index 465cd399..465cd399 100644
--- a/src/main/resources/git-black_210x210.png
+++ b/src/main/java/com/gitblit/wicket/resources/git-black_210x210.png
Binary files differ
diff --git a/src/main/resources/git-black_32x32.png b/src/main/java/com/gitblit/wicket/resources/git-black_32x32.png
index 037f61a1..037f61a1 100644
--- a/src/main/resources/git-black_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/git-black_32x32.png
Binary files differ
diff --git a/src/main/resources/git-orange-16x16.png b/src/main/java/com/gitblit/wicket/resources/git-orange-16x16.png
index 2fefab41..2fefab41 100644
--- a/src/main/resources/git-orange-16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/git-orange-16x16.png
Binary files differ
diff --git a/src/main/resources/gitblit-editor.min.css b/src/main/java/com/gitblit/wicket/resources/gitblit-editor.min.css
index c89df033..c89df033 100644
--- a/src/main/resources/gitblit-editor.min.css
+++ b/src/main/java/com/gitblit/wicket/resources/gitblit-editor.min.css
diff --git a/src/main/resources/gitblit-editor.min.js b/src/main/java/com/gitblit/wicket/resources/gitblit-editor.min.js
index 79af3c95..79af3c95 100644
--- a/src/main/resources/gitblit-editor.min.js
+++ b/src/main/java/com/gitblit/wicket/resources/gitblit-editor.min.js
diff --git a/src/main/resources/gitblit.css b/src/main/java/com/gitblit/wicket/resources/gitblit.css
index 10c9a0e8..10c9a0e8 100644
--- a/src/main/resources/gitblit.css
+++ b/src/main/java/com/gitblit/wicket/resources/gitblit.css
diff --git a/src/main/resources/gitblt-favicon.png b/src/main/java/com/gitblit/wicket/resources/gitblt-favicon.png
index 64b52fe2..64b52fe2 100644
--- a/src/main/resources/gitblt-favicon.png
+++ b/src/main/java/com/gitblit/wicket/resources/gitblt-favicon.png
Binary files differ
diff --git a/src/main/resources/gitblt-logo.png b/src/main/java/com/gitblit/wicket/resources/gitblt-logo.png
index 7ec945b5..7ec945b5 100644
--- a/src/main/resources/gitblt-logo.png
+++ b/src/main/java/com/gitblit/wicket/resources/gitblt-logo.png
Binary files differ
diff --git a/src/main/resources/gitblt2.png b/src/main/java/com/gitblit/wicket/resources/gitblt2.png
index c1642941..c1642941 100644
--- a/src/main/resources/gitblt2.png
+++ b/src/main/java/com/gitblit/wicket/resources/gitblt2.png
Binary files differ
diff --git a/src/main/resources/gitblt2_white.png b/src/main/java/com/gitblit/wicket/resources/gitblt2_white.png
index f4c5463d..f4c5463d 100644
--- a/src/main/resources/gitblt2_white.png
+++ b/src/main/java/com/gitblit/wicket/resources/gitblt2_white.png
Binary files differ
diff --git a/src/main/resources/gitblt_25.png b/src/main/java/com/gitblit/wicket/resources/gitblt_25.png
index ad580fad..ad580fad 100644
--- a/src/main/resources/gitblt_25.png
+++ b/src/main/java/com/gitblit/wicket/resources/gitblt_25.png
Binary files differ
diff --git a/src/main/resources/gitblt_25_white.png b/src/main/java/com/gitblit/wicket/resources/gitblt_25_white.png
index eeea0214..eeea0214 100644
--- a/src/main/resources/gitblt_25_white.png
+++ b/src/main/java/com/gitblit/wicket/resources/gitblt_25_white.png
Binary files differ
diff --git a/src/main/resources/github_32x32.png b/src/main/java/com/gitblit/wicket/resources/github_32x32.png
index 8b25551a..8b25551a 100644
--- a/src/main/resources/github_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/github_32x32.png
Binary files differ
diff --git a/src/main/resources/gitweb-favicon.png b/src/main/java/com/gitblit/wicket/resources/gitweb-favicon.png
index de637c06..de637c06 100644
--- a/src/main/resources/gitweb-favicon.png
+++ b/src/main/java/com/gitblit/wicket/resources/gitweb-favicon.png
Binary files differ
diff --git a/src/main/resources/health_16x16.png b/src/main/java/com/gitblit/wicket/resources/health_16x16.png
index de43e4b1..de43e4b1 100644
--- a/src/main/resources/health_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/health_16x16.png
Binary files differ
diff --git a/src/main/resources/heart_16x16.png b/src/main/java/com/gitblit/wicket/resources/heart_16x16.png
index 53e1013a..53e1013a 100644
--- a/src/main/resources/heart_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/heart_16x16.png
Binary files differ
diff --git a/src/main/resources/hideheader.css b/src/main/java/com/gitblit/wicket/resources/hideheader.css
index 7a368d91..7a368d91 100644
--- a/src/main/resources/hideheader.css
+++ b/src/main/java/com/gitblit/wicket/resources/hideheader.css
diff --git a/src/main/resources/information_16x16.png b/src/main/java/com/gitblit/wicket/resources/information_16x16.png
index 85c1876b..85c1876b 100644
--- a/src/main/resources/information_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/information_16x16.png
Binary files differ
diff --git a/src/main/resources/lock_16x16.png b/src/main/java/com/gitblit/wicket/resources/lock_16x16.png
index ddf83d95..ddf83d95 100644
--- a/src/main/resources/lock_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/lock_16x16.png
Binary files differ
diff --git a/src/main/resources/lock_go_16x16.png b/src/main/java/com/gitblit/wicket/resources/lock_go_16x16.png
index 63d42859..63d42859 100644
--- a/src/main/resources/lock_go_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/lock_go_16x16.png
Binary files differ
diff --git a/src/main/resources/lock_pull_16x16.png b/src/main/java/com/gitblit/wicket/resources/lock_pull_16x16.png
index 85c5c53e..85c5c53e 100644
--- a/src/main/resources/lock_pull_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/lock_pull_16x16.png
Binary files differ
diff --git a/src/main/resources/mail_16x16.png b/src/main/java/com/gitblit/wicket/resources/mail_16x16.png
index 83278739..83278739 100644
--- a/src/main/resources/mail_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/mail_16x16.png
Binary files differ
diff --git a/src/main/resources/mirror_16x16.png b/src/main/java/com/gitblit/wicket/resources/mirror_16x16.png
index a0c25e97..a0c25e97 100644
--- a/src/main/resources/mirror_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/mirror_16x16.png
Binary files differ
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/Octicons.java b/src/main/java/com/gitblit/wicket/resources/octicons/Octicons.java
new file mode 100644
index 00000000..773574db
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/Octicons.java
@@ -0,0 +1,19 @@
+package com.gitblit.wicket.resources.octicons;
+
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.PackageResourceReference;
+
+
+public class Octicons {
+ public static void install(WebApplication app) {
+ app.mountResource("/octicons/octicons.css", new PackageResourceReference(Octicons.class, "octicons.css"));
+ app.mountResource("/octicons/octicons-local.ttf", new PackageResourceReference(Octicons.class, "octicons-local.ttf"));
+ app.mountResource("/octicons/octicons.eot", new PackageResourceReference(Octicons.class, "octicons.eot"));
+ app.mountResource("/octicons/octicons.less", new PackageResourceReference(Octicons.class, "octicons.less"));
+ app.mountResource("/octicons/octicons.svg", new PackageResourceReference(Octicons.class, "octicons.svg"));
+ app.mountResource("/octicons/octicons.ttf", new PackageResourceReference(Octicons.class, "octicons.ttf"));
+ app.mountResource("/octicons/octicons.woff", new PackageResourceReference(Octicons.class, "octicons.woff"));
+ app.mountResource("/octicons/sprockets-octicons.scss", new PackageResourceReference(Octicons.class, "sprockets-octicons.scss"));
+
+ }
+}
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/octicons-local.ttf b/src/main/java/com/gitblit/wicket/resources/octicons/octicons-local.ttf
new file mode 100644
index 00000000..03d78cca
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/octicons-local.ttf
Binary files differ
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/octicons.css b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.css
new file mode 100644
index 00000000..a5dcd153
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.css
@@ -0,0 +1,235 @@
+@font-face {
+ font-family: 'octicons';
+ src: url('octicons.eot?#iefix') format('embedded-opentype'),
+ url('octicons.woff') format('woff'),
+ url('octicons.ttf') format('truetype'),
+ url('octicons.svg#octicons') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+/*
+
+.octicon is optimized for 16px.
+.mega-octicon is optimized for 32px but can be used larger.
+
+*/
+.octicon, .mega-octicon {
+ font: normal normal normal 16px/1 octicons;
+ display: inline-block;
+ text-decoration: none;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.mega-octicon { font-size: 32px; }
+
+
+.octicon-alert:before { content: '\f02d'} /*  */
+.octicon-alignment-align:before { content: '\f08a'} /*  */
+.octicon-alignment-aligned-to:before { content: '\f08e'} /*  */
+.octicon-alignment-unalign:before { content: '\f08b'} /*  */
+.octicon-arrow-down:before { content: '\f03f'} /*  */
+.octicon-arrow-left:before { content: '\f040'} /*  */
+.octicon-arrow-right:before { content: '\f03e'} /*  */
+.octicon-arrow-small-down:before { content: '\f0a0'} /*  */
+.octicon-arrow-small-left:before { content: '\f0a1'} /*  */
+.octicon-arrow-small-right:before { content: '\f071'} /*  */
+.octicon-arrow-small-up:before { content: '\f09f'} /*  */
+.octicon-arrow-up:before { content: '\f03d'} /*  */
+.octicon-beer:before { content: '\f069'} /*  */
+.octicon-book:before { content: '\f007'} /*  */
+.octicon-bookmark:before { content: '\f07b'} /*  */
+.octicon-briefcase:before { content: '\f0d3'} /*  */
+.octicon-broadcast:before { content: '\f048'} /*  */
+.octicon-browser:before { content: '\f0c5'} /*  */
+.octicon-bug:before { content: '\f091'} /*  */
+.octicon-calendar:before { content: '\f068'} /*  */
+.octicon-check:before { content: '\f03a'} /*  */
+.octicon-checklist:before { content: '\f076'} /*  */
+.octicon-chevron-down:before { content: '\f0a3'} /*  */
+.octicon-chevron-left:before { content: '\f0a4'} /*  */
+.octicon-chevron-right:before { content: '\f078'} /*  */
+.octicon-chevron-up:before { content: '\f0a2'} /*  */
+.octicon-circle-slash:before { content: '\f084'} /*  */
+.octicon-circuit-board:before { content: '\f0d6'} /*  */
+.octicon-clippy:before { content: '\f035'} /*  */
+.octicon-clock:before { content: '\f046'} /*  */
+.octicon-cloud-download:before { content: '\f00b'} /*  */
+.octicon-cloud-upload:before { content: '\f00c'} /*  */
+.octicon-code:before { content: '\f05f'} /*  */
+.octicon-color-mode:before { content: '\f065'} /*  */
+.octicon-comment-add:before,
+.octicon-comment:before { content: '\f02b'} /*  */
+.octicon-comment-discussion:before { content: '\f04f'} /*  */
+.octicon-credit-card:before { content: '\f045'} /*  */
+.octicon-dash:before { content: '\f0ca'} /*  */
+.octicon-dashboard:before { content: '\f07d'} /*  */
+.octicon-database:before { content: '\f096'} /*  */
+.octicon-device-camera:before { content: '\f056'} /*  */
+.octicon-device-camera-video:before { content: '\f057'} /*  */
+.octicon-device-desktop:before { content: '\f27c'} /*  */
+.octicon-device-mobile:before { content: '\f038'} /*  */
+.octicon-diff:before { content: '\f04d'} /*  */
+.octicon-diff-added:before { content: '\f06b'} /*  */
+.octicon-diff-ignored:before { content: '\f099'} /*  */
+.octicon-diff-modified:before { content: '\f06d'} /*  */
+.octicon-diff-removed:before { content: '\f06c'} /*  */
+.octicon-diff-renamed:before { content: '\f06e'} /*  */
+.octicon-ellipsis:before { content: '\f09a'} /*  */
+.octicon-eye-unwatch:before,
+.octicon-eye-watch:before,
+.octicon-eye:before { content: '\f04e'} /*  */
+.octicon-file-binary:before { content: '\f094'} /*  */
+.octicon-file-code:before { content: '\f010'} /*  */
+.octicon-file-directory:before { content: '\f016'} /*  */
+.octicon-file-media:before { content: '\f012'} /*  */
+.octicon-file-pdf:before { content: '\f014'} /*  */
+.octicon-file-submodule:before { content: '\f017'} /*  */
+.octicon-file-symlink-directory:before { content: '\f0b1'} /*  */
+.octicon-file-symlink-file:before { content: '\f0b0'} /*  */
+.octicon-file-text:before { content: '\f011'} /*  */
+.octicon-file-zip:before { content: '\f013'} /*  */
+.octicon-flame:before { content: '\f0d2'} /*  */
+.octicon-fold:before { content: '\f0cc'} /*  */
+.octicon-gear:before { content: '\f02f'} /*  */
+.octicon-gift:before { content: '\f042'} /*  */
+.octicon-gist:before { content: '\f00e'} /*  */
+.octicon-gist-secret:before { content: '\f08c'} /*  */
+.octicon-git-branch-create:before,
+.octicon-git-branch-delete:before,
+.octicon-git-branch:before { content: '\f020'} /*  */
+.octicon-git-commit:before { content: '\f01f'} /*  */
+.octicon-git-compare:before { content: '\f0ac'} /*  */
+.octicon-git-merge:before { content: '\f023'} /*  */
+.octicon-git-pull-request-abandoned:before,
+.octicon-git-pull-request:before { content: '\f009'} /*  */
+.octicon-globe:before { content: '\f0b6'} /*  */
+.octicon-graph:before { content: '\f043'} /*  */
+.octicon-heart:before { content: '\2665'} /* ♥ */
+.octicon-history:before { content: '\f07e'} /*  */
+.octicon-home:before { content: '\f08d'} /*  */
+.octicon-horizontal-rule:before { content: '\f070'} /*  */
+.octicon-hourglass:before { content: '\f09e'} /*  */
+.octicon-hubot:before { content: '\f09d'} /*  */
+.octicon-inbox:before { content: '\f0cf'} /*  */
+.octicon-info:before { content: '\f059'} /*  */
+.octicon-issue-closed:before { content: '\f028'} /*  */
+.octicon-issue-opened:before { content: '\f026'} /*  */
+.octicon-issue-reopened:before { content: '\f027'} /*  */
+.octicon-jersey:before { content: '\f019'} /*  */
+.octicon-jump-down:before { content: '\f072'} /*  */
+.octicon-jump-left:before { content: '\f0a5'} /*  */
+.octicon-jump-right:before { content: '\f0a6'} /*  */
+.octicon-jump-up:before { content: '\f073'} /*  */
+.octicon-key:before { content: '\f049'} /*  */
+.octicon-keyboard:before { content: '\f00d'} /*  */
+.octicon-law:before { content: '\f0d8'} /* */
+.octicon-light-bulb:before { content: '\f000'} /*  */
+.octicon-link:before { content: '\f05c'} /*  */
+.octicon-link-external:before { content: '\f07f'} /*  */
+.octicon-list-ordered:before { content: '\f062'} /*  */
+.octicon-list-unordered:before { content: '\f061'} /*  */
+.octicon-location:before { content: '\f060'} /*  */
+.octicon-gist-private:before,
+.octicon-mirror-private:before,
+.octicon-git-fork-private:before,
+.octicon-lock:before { content: '\f06a'} /*  */
+.octicon-logo-github:before { content: '\f092'} /*  */
+.octicon-mail:before { content: '\f03b'} /*  */
+.octicon-mail-read:before { content: '\f03c'} /*  */
+.octicon-mail-reply:before { content: '\f051'} /*  */
+.octicon-mark-github:before { content: '\f00a'} /*  */
+.octicon-markdown:before { content: '\f0c9'} /*  */
+.octicon-megaphone:before { content: '\f077'} /*  */
+.octicon-mention:before { content: '\f0be'} /*  */
+.octicon-microscope:before { content: '\f089'} /*  */
+.octicon-milestone:before { content: '\f075'} /*  */
+.octicon-mirror-public:before,
+.octicon-mirror:before { content: '\f024'} /*  */
+.octicon-mortar-board:before { content: '\f0d7'} /* */
+.octicon-move-down:before { content: '\f0a8'} /*  */
+.octicon-move-left:before { content: '\f074'} /*  */
+.octicon-move-right:before { content: '\f0a9'} /*  */
+.octicon-move-up:before { content: '\f0a7'} /*  */
+.octicon-mute:before { content: '\f080'} /*  */
+.octicon-no-newline:before { content: '\f09c'} /*  */
+.octicon-octoface:before { content: '\f008'} /*  */
+.octicon-organization:before { content: '\f037'} /*  */
+.octicon-package:before { content: '\f0c4'} /*  */
+.octicon-paintcan:before { content: '\f0d1'} /*  */
+.octicon-pencil:before { content: '\f058'} /*  */
+.octicon-person-add:before,
+.octicon-person-follow:before,
+.octicon-person:before { content: '\f018'} /*  */
+.octicon-pin:before { content: '\f041'} /*  */
+.octicon-playback-fast-forward:before { content: '\f0bd'} /*  */
+.octicon-playback-pause:before { content: '\f0bb'} /*  */
+.octicon-playback-play:before { content: '\f0bf'} /*  */
+.octicon-playback-rewind:before { content: '\f0bc'} /*  */
+.octicon-plug:before { content: '\f0d4'} /*  */
+.octicon-repo-create:before,
+.octicon-gist-new:before,
+.octicon-file-directory-create:before,
+.octicon-file-add:before,
+.octicon-plus:before { content: '\f05d'} /*  */
+.octicon-podium:before { content: '\f0af'} /*  */
+.octicon-primitive-dot:before { content: '\f052'} /*  */
+.octicon-primitive-square:before { content: '\f053'} /*  */
+.octicon-pulse:before { content: '\f085'} /*  */
+.octicon-puzzle:before { content: '\f0c0'} /*  */
+.octicon-question:before { content: '\f02c'} /*  */
+.octicon-quote:before { content: '\f063'} /*  */
+.octicon-radio-tower:before { content: '\f030'} /*  */
+.octicon-repo-delete:before,
+.octicon-repo:before { content: '\f001'} /*  */
+.octicon-repo-clone:before { content: '\f04c'} /*  */
+.octicon-repo-force-push:before { content: '\f04a'} /*  */
+.octicon-gist-fork:before,
+.octicon-repo-forked:before { content: '\f002'} /*  */
+.octicon-repo-pull:before { content: '\f006'} /*  */
+.octicon-repo-push:before { content: '\f005'} /*  */
+.octicon-rocket:before { content: '\f033'} /*  */
+.octicon-rss:before { content: '\f034'} /*  */
+.octicon-ruby:before { content: '\f047'} /*  */
+.octicon-screen-full:before { content: '\f066'} /*  */
+.octicon-screen-normal:before { content: '\f067'} /*  */
+.octicon-search-save:before,
+.octicon-search:before { content: '\f02e'} /*  */
+.octicon-server:before { content: '\f097'} /*  */
+.octicon-settings:before { content: '\f07c'} /*  */
+.octicon-log-in:before,
+.octicon-sign-in:before { content: '\f036'} /*  */
+.octicon-log-out:before,
+.octicon-sign-out:before { content: '\f032'} /*  */
+.octicon-split:before { content: '\f0c6'} /*  */
+.octicon-squirrel:before { content: '\f0b2'} /*  */
+.octicon-star-add:before,
+.octicon-star-delete:before,
+.octicon-star:before { content: '\f02a'} /*  */
+.octicon-steps:before { content: '\f0c7'} /*  */
+.octicon-stop:before { content: '\f08f'} /*  */
+.octicon-repo-sync:before,
+.octicon-sync:before { content: '\f087'} /*  */
+.octicon-tag-remove:before,
+.octicon-tag-add:before,
+.octicon-tag:before { content: '\f015'} /*  */
+.octicon-telescope:before { content: '\f088'} /*  */
+.octicon-terminal:before { content: '\f0c8'} /*  */
+.octicon-three-bars:before { content: '\f05e'} /*  */
+.octicon-tools:before { content: '\f031'} /*  */
+.octicon-trashcan:before { content: '\f0d0'} /*  */
+.octicon-triangle-down:before { content: '\f05b'} /*  */
+.octicon-triangle-left:before { content: '\f044'} /*  */
+.octicon-triangle-right:before { content: '\f05a'} /*  */
+.octicon-triangle-up:before { content: '\f0aa'} /*  */
+.octicon-unfold:before { content: '\f039'} /*  */
+.octicon-unmute:before { content: '\f0ba'} /*  */
+.octicon-versions:before { content: '\f064'} /*  */
+.octicon-remove-close:before,
+.octicon-x:before { content: '\f081'} /*  */
+.octicon-zap:before { content: '\26A1'} /* ⚡ */
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/octicons.eot b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.eot
new file mode 100644
index 00000000..22881a8b
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.eot
Binary files differ
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/octicons.less b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.less
new file mode 100644
index 00000000..b054eb89
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.less
@@ -0,0 +1,233 @@
+@octicons-font-path: ".";
+@octicons-version: "a594b5fd4cae0b2afd156bca8dad8d27ac3d7594";
+
+@font-face {
+ font-family: 'octicons';
+ src: ~"url('@{octicons-font-path}/octicons.eot?#iefix&v=@{octicons-version}') format('embedded-opentype')",
+ ~"url('@{octicons-font-path}/octicons.woff?v=@{octicons-version}') format('woff')",
+ ~"url('@{octicons-font-path}/octicons.ttf?v=@{octicons-version}') format('truetype')",
+ ~"url('@{octicons-font-path}/octicons.svg?v=@{octicons-version}#octicons') format('svg')";
+ font-weight: normal;
+ font-style: normal;
+}
+
+// .octicon is optimized for 16px.
+// .mega-octicon is optimized for 32px but can be used larger.
+.octicon, .mega-octicon {
+ font: normal normal normal 16px/1 octicons;
+ display: inline-block;
+ text-decoration: none;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.mega-octicon { font-size: 32px; }
+
+.octicon-alert:before { content: '\f02d'} /*  */
+.octicon-alignment-align:before { content: '\f08a'} /*  */
+.octicon-alignment-aligned-to:before { content: '\f08e'} /*  */
+.octicon-alignment-unalign:before { content: '\f08b'} /*  */
+.octicon-arrow-down:before { content: '\f03f'} /*  */
+.octicon-arrow-left:before { content: '\f040'} /*  */
+.octicon-arrow-right:before { content: '\f03e'} /*  */
+.octicon-arrow-small-down:before { content: '\f0a0'} /*  */
+.octicon-arrow-small-left:before { content: '\f0a1'} /*  */
+.octicon-arrow-small-right:before { content: '\f071'} /*  */
+.octicon-arrow-small-up:before { content: '\f09f'} /*  */
+.octicon-arrow-up:before { content: '\f03d'} /*  */
+.octicon-beer:before { content: '\f069'} /*  */
+.octicon-book:before { content: '\f007'} /*  */
+.octicon-bookmark:before { content: '\f07b'} /*  */
+.octicon-briefcase:before { content: '\f0d3'} /*  */
+.octicon-broadcast:before { content: '\f048'} /*  */
+.octicon-browser:before { content: '\f0c5'} /*  */
+.octicon-bug:before { content: '\f091'} /*  */
+.octicon-calendar:before { content: '\f068'} /*  */
+.octicon-check:before { content: '\f03a'} /*  */
+.octicon-checklist:before { content: '\f076'} /*  */
+.octicon-chevron-down:before { content: '\f0a3'} /*  */
+.octicon-chevron-left:before { content: '\f0a4'} /*  */
+.octicon-chevron-right:before { content: '\f078'} /*  */
+.octicon-chevron-up:before { content: '\f0a2'} /*  */
+.octicon-circle-slash:before { content: '\f084'} /*  */
+.octicon-circuit-board:before { content: '\f0d6'} /*  */
+.octicon-clippy:before { content: '\f035'} /*  */
+.octicon-clock:before { content: '\f046'} /*  */
+.octicon-cloud-download:before { content: '\f00b'} /*  */
+.octicon-cloud-upload:before { content: '\f00c'} /*  */
+.octicon-code:before { content: '\f05f'} /*  */
+.octicon-color-mode:before { content: '\f065'} /*  */
+.octicon-comment-add:before,
+.octicon-comment:before { content: '\f02b'} /*  */
+.octicon-comment-discussion:before { content: '\f04f'} /*  */
+.octicon-credit-card:before { content: '\f045'} /*  */
+.octicon-dash:before { content: '\f0ca'} /*  */
+.octicon-dashboard:before { content: '\f07d'} /*  */
+.octicon-database:before { content: '\f096'} /*  */
+.octicon-device-camera:before { content: '\f056'} /*  */
+.octicon-device-camera-video:before { content: '\f057'} /*  */
+.octicon-device-desktop:before { content: '\f27c'} /*  */
+.octicon-device-mobile:before { content: '\f038'} /*  */
+.octicon-diff:before { content: '\f04d'} /*  */
+.octicon-diff-added:before { content: '\f06b'} /*  */
+.octicon-diff-ignored:before { content: '\f099'} /*  */
+.octicon-diff-modified:before { content: '\f06d'} /*  */
+.octicon-diff-removed:before { content: '\f06c'} /*  */
+.octicon-diff-renamed:before { content: '\f06e'} /*  */
+.octicon-ellipsis:before { content: '\f09a'} /*  */
+.octicon-eye-unwatch:before,
+.octicon-eye-watch:before,
+.octicon-eye:before { content: '\f04e'} /*  */
+.octicon-file-binary:before { content: '\f094'} /*  */
+.octicon-file-code:before { content: '\f010'} /*  */
+.octicon-file-directory:before { content: '\f016'} /*  */
+.octicon-file-media:before { content: '\f012'} /*  */
+.octicon-file-pdf:before { content: '\f014'} /*  */
+.octicon-file-submodule:before { content: '\f017'} /*  */
+.octicon-file-symlink-directory:before { content: '\f0b1'} /*  */
+.octicon-file-symlink-file:before { content: '\f0b0'} /*  */
+.octicon-file-text:before { content: '\f011'} /*  */
+.octicon-file-zip:before { content: '\f013'} /*  */
+.octicon-flame:before { content: '\f0d2'} /*  */
+.octicon-fold:before { content: '\f0cc'} /*  */
+.octicon-gear:before { content: '\f02f'} /*  */
+.octicon-gift:before { content: '\f042'} /*  */
+.octicon-gist:before { content: '\f00e'} /*  */
+.octicon-gist-secret:before { content: '\f08c'} /*  */
+.octicon-git-branch-create:before,
+.octicon-git-branch-delete:before,
+.octicon-git-branch:before { content: '\f020'} /*  */
+.octicon-git-commit:before { content: '\f01f'} /*  */
+.octicon-git-compare:before { content: '\f0ac'} /*  */
+.octicon-git-merge:before { content: '\f023'} /*  */
+.octicon-git-pull-request-abandoned:before,
+.octicon-git-pull-request:before { content: '\f009'} /*  */
+.octicon-globe:before { content: '\f0b6'} /*  */
+.octicon-graph:before { content: '\f043'} /*  */
+.octicon-heart:before { content: '\2665'} /* ♥ */
+.octicon-history:before { content: '\f07e'} /*  */
+.octicon-home:before { content: '\f08d'} /*  */
+.octicon-horizontal-rule:before { content: '\f070'} /*  */
+.octicon-hourglass:before { content: '\f09e'} /*  */
+.octicon-hubot:before { content: '\f09d'} /*  */
+.octicon-inbox:before { content: '\f0cf'} /*  */
+.octicon-info:before { content: '\f059'} /*  */
+.octicon-issue-closed:before { content: '\f028'} /*  */
+.octicon-issue-opened:before { content: '\f026'} /*  */
+.octicon-issue-reopened:before { content: '\f027'} /*  */
+.octicon-jersey:before { content: '\f019'} /*  */
+.octicon-jump-down:before { content: '\f072'} /*  */
+.octicon-jump-left:before { content: '\f0a5'} /*  */
+.octicon-jump-right:before { content: '\f0a6'} /*  */
+.octicon-jump-up:before { content: '\f073'} /*  */
+.octicon-key:before { content: '\f049'} /*  */
+.octicon-keyboard:before { content: '\f00d'} /*  */
+.octicon-law:before { content: '\f0d8'} /* */
+.octicon-light-bulb:before { content: '\f000'} /*  */
+.octicon-link:before { content: '\f05c'} /*  */
+.octicon-link-external:before { content: '\f07f'} /*  */
+.octicon-list-ordered:before { content: '\f062'} /*  */
+.octicon-list-unordered:before { content: '\f061'} /*  */
+.octicon-location:before { content: '\f060'} /*  */
+.octicon-gist-private:before,
+.octicon-mirror-private:before,
+.octicon-git-fork-private:before,
+.octicon-lock:before { content: '\f06a'} /*  */
+.octicon-logo-github:before { content: '\f092'} /*  */
+.octicon-mail:before { content: '\f03b'} /*  */
+.octicon-mail-read:before { content: '\f03c'} /*  */
+.octicon-mail-reply:before { content: '\f051'} /*  */
+.octicon-mark-github:before { content: '\f00a'} /*  */
+.octicon-markdown:before { content: '\f0c9'} /*  */
+.octicon-megaphone:before { content: '\f077'} /*  */
+.octicon-mention:before { content: '\f0be'} /*  */
+.octicon-microscope:before { content: '\f089'} /*  */
+.octicon-milestone:before { content: '\f075'} /*  */
+.octicon-mirror-public:before,
+.octicon-mirror:before { content: '\f024'} /*  */
+.octicon-mortar-board:before { content: '\f0d7'} /* */
+.octicon-move-down:before { content: '\f0a8'} /*  */
+.octicon-move-left:before { content: '\f074'} /*  */
+.octicon-move-right:before { content: '\f0a9'} /*  */
+.octicon-move-up:before { content: '\f0a7'} /*  */
+.octicon-mute:before { content: '\f080'} /*  */
+.octicon-no-newline:before { content: '\f09c'} /*  */
+.octicon-octoface:before { content: '\f008'} /*  */
+.octicon-organization:before { content: '\f037'} /*  */
+.octicon-package:before { content: '\f0c4'} /*  */
+.octicon-paintcan:before { content: '\f0d1'} /*  */
+.octicon-pencil:before { content: '\f058'} /*  */
+.octicon-person-add:before,
+.octicon-person-follow:before,
+.octicon-person:before { content: '\f018'} /*  */
+.octicon-pin:before { content: '\f041'} /*  */
+.octicon-playback-fast-forward:before { content: '\f0bd'} /*  */
+.octicon-playback-pause:before { content: '\f0bb'} /*  */
+.octicon-playback-play:before { content: '\f0bf'} /*  */
+.octicon-playback-rewind:before { content: '\f0bc'} /*  */
+.octicon-plug:before { content: '\f0d4'} /*  */
+.octicon-repo-create:before,
+.octicon-gist-new:before,
+.octicon-file-directory-create:before,
+.octicon-file-add:before,
+.octicon-plus:before { content: '\f05d'} /*  */
+.octicon-podium:before { content: '\f0af'} /*  */
+.octicon-primitive-dot:before { content: '\f052'} /*  */
+.octicon-primitive-square:before { content: '\f053'} /*  */
+.octicon-pulse:before { content: '\f085'} /*  */
+.octicon-puzzle:before { content: '\f0c0'} /*  */
+.octicon-question:before { content: '\f02c'} /*  */
+.octicon-quote:before { content: '\f063'} /*  */
+.octicon-radio-tower:before { content: '\f030'} /*  */
+.octicon-repo-delete:before,
+.octicon-repo:before { content: '\f001'} /*  */
+.octicon-repo-clone:before { content: '\f04c'} /*  */
+.octicon-repo-force-push:before { content: '\f04a'} /*  */
+.octicon-gist-fork:before,
+.octicon-repo-forked:before { content: '\f002'} /*  */
+.octicon-repo-pull:before { content: '\f006'} /*  */
+.octicon-repo-push:before { content: '\f005'} /*  */
+.octicon-rocket:before { content: '\f033'} /*  */
+.octicon-rss:before { content: '\f034'} /*  */
+.octicon-ruby:before { content: '\f047'} /*  */
+.octicon-screen-full:before { content: '\f066'} /*  */
+.octicon-screen-normal:before { content: '\f067'} /*  */
+.octicon-search-save:before,
+.octicon-search:before { content: '\f02e'} /*  */
+.octicon-server:before { content: '\f097'} /*  */
+.octicon-settings:before { content: '\f07c'} /*  */
+.octicon-log-in:before,
+.octicon-sign-in:before { content: '\f036'} /*  */
+.octicon-log-out:before,
+.octicon-sign-out:before { content: '\f032'} /*  */
+.octicon-split:before { content: '\f0c6'} /*  */
+.octicon-squirrel:before { content: '\f0b2'} /*  */
+.octicon-star-add:before,
+.octicon-star-delete:before,
+.octicon-star:before { content: '\f02a'} /*  */
+.octicon-steps:before { content: '\f0c7'} /*  */
+.octicon-stop:before { content: '\f08f'} /*  */
+.octicon-repo-sync:before,
+.octicon-sync:before { content: '\f087'} /*  */
+.octicon-tag-remove:before,
+.octicon-tag-add:before,
+.octicon-tag:before { content: '\f015'} /*  */
+.octicon-telescope:before { content: '\f088'} /*  */
+.octicon-terminal:before { content: '\f0c8'} /*  */
+.octicon-three-bars:before { content: '\f05e'} /*  */
+.octicon-tools:before { content: '\f031'} /*  */
+.octicon-trashcan:before { content: '\f0d0'} /*  */
+.octicon-triangle-down:before { content: '\f05b'} /*  */
+.octicon-triangle-left:before { content: '\f044'} /*  */
+.octicon-triangle-right:before { content: '\f05a'} /*  */
+.octicon-triangle-up:before { content: '\f0aa'} /*  */
+.octicon-unfold:before { content: '\f039'} /*  */
+.octicon-unmute:before { content: '\f0ba'} /*  */
+.octicon-versions:before { content: '\f064'} /*  */
+.octicon-remove-close:before,
+.octicon-x:before { content: '\f081'} /*  */
+.octicon-zap:before { content: '\26A1'} /* ⚡ */
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/octicons.svg b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.svg
new file mode 100644
index 00000000..ea3e0f16
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.svg
@@ -0,0 +1,198 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+(c) 2012-2014 GitHub
+
+When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos)
+
+Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL)
+Applies to all font files
+
+Code License: MIT (http://choosealicense.com/licenses/mit/)
+Applies to all other files
+</metadata>
+<defs>
+<font id="octicons" horiz-adv-x="1024" >
+<font-face font-family="octicons" font-weight="400" font-stretch="normal" units-per-em="1024" ascent="832" descent="-192" />
+<missing-glyph d="M512 832C229.25 832 0 602.75 0 320c0-226.25 146.688-418.125 350.156-485.812 25.594-4.688 34.938 11.125 34.938 24.625 0 12.188-0.469 52.562-0.719 95.312C242-76.81200000000001 211.906 14.5 211.906 14.5c-23.312 59.125-56.844 74.875-56.844 74.875-46.531 31.75 3.53 31.125 3.53 31.125 51.406-3.562 78.47-52.75 78.47-52.75 45.688-78.25 119.875-55.625 149-42.5 4.654 33 17.904 55.625 32.5 68.375C304.906 106.56200000000001 185.344 150.5 185.344 346.688c0 55.938 19.969 101.562 52.656 137.406-5.219 13-22.844 65.094 5.062 135.562 0 0 42.938 13.75 140.812-52.5 40.812 11.406 84.594 17.031 128.125 17.219 43.5-0.188 87.312-5.875 128.188-17.281 97.688 66.312 140.688 52.5 140.688 52.5 28-70.531 10.375-122.562 5.125-135.5 32.812-35.844 52.625-81.469 52.625-137.406 0-196.688-119.75-240-233.812-252.688 18.438-15.875 34.75-47 34.75-94.75 0-68.438-0.688-123.625-0.688-140.5 0-13.625 9.312-29.562 35.25-24.562C877.438-98 1024 93.875 1024 320 1024 602.75 794.75 832 512 832z" horiz-adv-x="1024" />
+<glyph glyph-name="alert" unicode="&#xf02d;" d="M1005.854 31.753000000000043l-438.286 767C556.173 818.694 534.967 831 512 831s-44.173-12.306-55.567-32.247l-438.286-767c-11.319-19.809-11.238-44.144 0.213-63.876C29.811-51.85500000000002 50.899-64 73.714-64h876.572c22.814 0 43.903 12.145 55.354 31.877S1017.173 11.94399999999996 1005.854 31.753000000000043zM576 64H448V192h128V64zM576 256H448V512h128V256z" horiz-adv-x="1024" />
+<glyph glyph-name="alignment-align" unicode="&#xf08a;" d="M192 768C85.938 768 0 682.062 0 576s85.938-192 192-192c106.062 0 192 85.938 192 192S298.062 768 192 768zM672 224l160 160H384v-448l160 160 288-288 128 128L672 224z" horiz-adv-x="960" />
+<glyph glyph-name="alignment-aligned-to" unicode="&#xf08e;" d="M384 256l128 128 288-288 160 160v-448H512l160 160L384 256zM192 384C85.938 384 0 469.938 0 576S85.938 768 192 768c106.062 0 192-85.938 192-192S298.062 384 192 384z" horiz-adv-x="960" />
+<glyph glyph-name="alignment-unalign" unicode="&#xf08b;" d="M512 640L384 512 128 768 0 640l256-256L128 256l64-64 384 384L512 640zM640 256l128 128-64 64L320 64l64-64 128 128 256-256 128 128L640 256z" horiz-adv-x="896" />
+<glyph glyph-name="arrow-down" unicode="&#xf03f;" d="M448 384V640H192v-256H0l320-384 320 384H448z" horiz-adv-x="640" />
+<glyph glyph-name="arrow-left" unicode="&#xf040;" d="M384 448V640L0 320l384-320V192h256V448H384z" horiz-adv-x="640" />
+<glyph glyph-name="arrow-right" unicode="&#xf03e;" d="M640 320L256 640v-192H0v-256h256v-192L640 320z" horiz-adv-x="640" />
+<glyph glyph-name="arrow-small-down" unicode="&#xf0a0;" d="M256 384V512H128v-128H0l192-256 192 256H256z" horiz-adv-x="384" />
+<glyph glyph-name="arrow-small-left" unicode="&#xf0a1;" d="M256 384V512L0 320l256-192V256h128V384H256z" horiz-adv-x="384" />
+<glyph glyph-name="arrow-small-right" unicode="&#xf071;" d="M384 320L128 512v-128H0v-128h128v-128L384 320z" horiz-adv-x="384" />
+<glyph glyph-name="arrow-small-up" unicode="&#xf09f;" d="M192 512L0 256h128v-128h128V256h128L192 512z" horiz-adv-x="384" />
+<glyph glyph-name="arrow-up" unicode="&#xf03d;" d="M320 640L0 256h192v-256h256V256h192L320 640z" horiz-adv-x="640" />
+<glyph glyph-name="beer" unicode="&#xf069;" d="M896 576c-31 0-192 0-192 0v128c0 71-158 128-352 128s-352-57-352-128v-768c0-71 158-128 352-128s352 57 352 128v128s160 0 192 0 64 30 64 64 0 350 0 384-29 64-64 64z m-704-576h-64v512h64v-512z m192-64h-64v512h64v-512z m192 64h-64v512h64v-512z m-224 640c-124 0-224 29-224 64s100 64 224 64 224-29 224-64-100-64-224-64z m480-448h-128v256h128v-256z" horiz-adv-x="1024" />
+<glyph glyph-name="book" unicode="&#xf007;" d="M768 256h-128c-34 0-64-32-64-64h256c0 34-32 64-64 64z m-55 416c-167 0-209-32-233-56-24 24-66 56-233 56s-247-46-247-78v-586c29 16 119 48 214 56 115 9 234-9 234-32 0-16 8-31 31-32 0 0 0 0 1 0 0 0 0 0 1 0 23 1 31 16 31 32 0 23 119 41 234 32 94-7 185-40 214-56v586c0 32-80 78-247 78z m-265-572c-30 16-103 28-192 28s-170-12-192-27c0 0 0 411 0 443s64 59 192 59 192-27 192-59 0-444 0-444z m448 1c-22 15-103 27-192 27s-162-12-192-28c0 0 0 412 0 444s64 59 192 59 192-27 192-59 0-443 0-443z m-128 283h-128c-34 0-64-32-64-64h256c0 34-32 64-64 64z m0 128h-128c-34 0-64-32-64-64h256c0 34-32 64-64 64z m-448-128h-128c-32 0-64-30-64-64h256c0 32-30 64-64 64z m0-128h-128c-32 0-64-30-64-64h256c0 32-30 64-64 64z m0 256h-128c-32 0-64-30-64-64h256c0 32-30 64-64 64z" horiz-adv-x="1024" />
+<glyph glyph-name="bookmark" unicode="&#xf07b;" d="M0 704v-768l192 128 192-128V704H0zM316.25 507.25l-71.875-51.938 27.188-83.406c2.75-8.375-0.688-11.062-7.562-6.594l-72 52.094-72-52.031c-6.844-4.469-10.312-1.781-7.562 6.594l27.219 83.406L67.783 507.25c-6.469 5.125-5 9.219 3.906 9.219l88 0.125 27.125 83.094c2.812 8.812 7.562 8.812 10.375 0l27.188-83.094 87.938-0.125C321.25 516.469 322.688 512.375 316.25 507.25z" horiz-adv-x="384" />
+<glyph glyph-name="briefcase" unicode="&#xf0d3;" d="M896 640H640v66c0 34.2-27.8 62-62 62H446c-34.2 0-62-27.8-62-62v-66H128c-35.3 0-64-28.7-64-64v-512c0-35.3 28.7-64 64-64h768c35.3 0 64 28.7 64 64V576C960 611.3 931.3 640 896 640zM448 688c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16v-48H448V688zM896 320H576v-64H448v64H128V576h64v-192h640V576h64V320z" horiz-adv-x="1024" />
+<glyph glyph-name="broadcast" unicode="&#xf048;" d="M448 640c142 0 256-115 256-256 0-69-28-132-72-178l-16-93c91 56 152 156 152 271 0 177-143 320-320 320s-320-143-320-320c0-115 61-215 152-271l-16 93c-45 46-72 109-72 178 0 142 114 256 256 256z m-64-320c-36 0-64-29-64-64v-128c0-36 30-64 64-64v-256h128v256c34 0 64 28 64 64v128c0 35-28 64-64 64s-64 0-64 0-28 0-64 0z m192 128c0 71-57 128-128 128s-128-57-128-128 57-128 128-128 128 57 128 128z m-128 384c-247 0-448-201-448-448 0-197 128-363 305-423l-12 72c-135 60-229 194-229 351 0 212 172 384 384 384s384-172 384-384c0-157-94-291-229-351l-12-72c177 60 305 225 305 423 0 247-201 448-448 448z" horiz-adv-x="896" />
+<glyph glyph-name="browser" unicode="&#xf0c5;" d="M320 640h64v-64h-64V640zM192 640h64v-64h-64V640zM64 640h64v-64H64V640zM832 0H64V512h768V0zM832 576H448v64h384V576zM896 640c0 35.35-28.65 64-64 64H64c-35.35 0-64-28.65-64-64v-640c0-35.35 28.65-64 64-64h768c35.35 0 64 28.65 64 64V640z" horiz-adv-x="896" />
+<glyph glyph-name="bug" unicode="&#xf091;" d="M243.621 675.469C190.747 618.688 205.34 528 205.34 528s53.968-64 160-64c106.031 0 160.031 64 160.031 64s14.375 89.469-37.375 146.312c32.375 18.031 51.438 44.094 43.562 61.812-8.938 19.969-48.375 21.75-88.25 3.969-14.812-6.594-27.438-14.969-37.25-23.875-12.438 2.25-25.625 3.781-40.72 3.781-14.061 0-26.561-1.344-38.344-3.25-9.656 8.75-22.062 16.875-36.531 23.344-39.875 17.719-79.375 15.938-88.25-3.969C194.465 718.781 212.497 693.438 243.621 675.469zM644.746 262.25c-8.25 1.75-16.125 2.75-23.75 3.5 0 2.125 0.375 4.125 0.375 6.312 0 33.594-4.75 65.654-12.438 96.125 16.438-1.406 37.375 2.375 58.562 11.779 39.875 17.781 65 48.375 56.125 68.219-8.875 19.969-48.375 21.75-88.25 3.969-18.625-8.312-33.812-19.469-44-30.906-7.75 18.25-16.5 35.781-26.812 51.719-30.188-25.156-87.312-62.719-167.062-71.062v-321.781c0 0-0.25-32-32.031-32-31.75 0-32 32-32 32V401.781c-79.811 8.344-136.968 45.969-167.093 71.062-9.875-15.312-18.375-32-25.938-49.344-10.281 10.625-24.625 20.844-41.969 28.594-39.875 17.719-79.375 15.938-88.25-3.969-8.906-19.906 16.25-50.438 56.125-68.219 19.844-8.846 39.531-12.812 55.469-12.096-7.656-30.404-12.469-62.344-12.469-95.812 0-2.188 0.375-4.25 0.438-6.5-6.719-0.75-13.688-1.75-20.781-3.25-51.969-10.75-91.781-37.625-88.844-59.812 2.938-22.312 47.5-31.5 99.594-20.688 6.781 1.375 13.438 3.125 19.781 5.062C128.684 146 143.34 108.125 163.622 75.5c-12.031-6.062-24.531-15-36.031-26.625C95.715 17 82.779-21.75 98.715-37.68799999999999c15.938-15.937 54.656-3 86.531 28.812 9.344 9.375 16.844 19.25 22.656 29C251.434-22.5 305.965-48 365.465-48c60.343 0 115.781 26.25 159.531 69.938 5.875-10.312 13.75-20.812 23.625-30.688 31.812-31.875 70.625-44.812 86.562-28.875s3 54.625-28.875 86.5c-12.312 12.375-25.688 21.75-38.438 27.938 20.125 32.5 34.625 70.375 43.688 111.062 7.188-2.25 14.688-4.375 22.562-6.062 52.061-10.812 96.625-1.562 99.625 20.688C736.558 224.625 696.746 251.5 644.746 262.25z" horiz-adv-x="733.886" />
+<glyph glyph-name="calendar" unicode="&#xf068;" d="M704 320h-64v-128h64V320zM576 320h-64v-128h64V320zM704 512h-64v-128h64V512zM832 320h-64v-128h64V320zM576 128h-64v-128h64V128zM768 832h-64v-128h64V832zM256 832h-64v-128h64V832zM832 512h-64v-128h64V512zM576 512h-64v-128h64V512zM320 128h-64v-128h64V128zM192 320h-64v-128h64V320zM320 320h-64v-128h64V320zM832 768v-128H640V768H320v-128H128V768H0v-896h960V768H832zM896-64H64V576h832V-64zM192 128h-64v-128h64V128zM448 512h-64v-128h64V512zM448 128h-64v-128h64V128zM320 512h-64v-128h64V512zM448 320h-64v-128h64V320zM704 128h-64v-128h64V128z" horiz-adv-x="1024" />
+<glyph glyph-name="check" unicode="&#xf03a;" d="M640 640L256 256 128 384 0 256l256-256 512 512L640 640z" horiz-adv-x="768" />
+<glyph glyph-name="checklist" unicode="&#xf076;" d="M760.688 315.78099999999995l-49.812 49.656c-6.438 6.529-16.938 6.594-23.375 0L582.5 260.5 462.375 140.125l-93.031 93.125c-6.531 6.562-17.031 6.562-23.5 0l-49.719-49.688c-6.531-6.562-6.531-17.062 0-23.562l104.781-104.875 17.969-17.875 31.688-31.812c6.562-6.562 17.188-6.562 23.562 0l49.625 49.688L760.625 292.22C767.25 298.688 767.25 309.188 760.688 315.78099999999995zM228.469 251.188L278.156 301c42.469 42.375 116.344 42.438 158.781-0.062l25.312-25.312L576 384V704H0v-704h320l-91.531 92.125C184.688 136.062 184.688 207.375 228.469 251.188zM192 640h320v-64H192V640zM192 512h320v-64H192V512zM128 320H64v64h64V320zM128 448H64v64h64V448zM128 576H64v64h64V576zM192 384h64v-64h-64V384z" horiz-adv-x="765.602" />
+<glyph glyph-name="chevron-down" unicode="&#xf0a3;" d="M512 512L320 320 128 512 0 384l320-320 320 320L512 512z" horiz-adv-x="640" />
+<glyph glyph-name="chevron-left" unicode="&#xf0a4;" d="M448 512L320 640 0 320l320-320 128 128L256 320 448 512z" horiz-adv-x="448" />
+<glyph glyph-name="chevron-right" unicode="&#xf078;" d="M128 640L0 512l192-192L0 128l128-128 320 320L128 640z" horiz-adv-x="448" />
+<glyph glyph-name="chevron-up" unicode="&#xf0a2;" d="M320 576L0 256l128-128 192 192 192-192 128 128L320 576z" horiz-adv-x="640" />
+<glyph glyph-name="circle-slash" unicode="&#xf084;" d="M320 640C143.219 640 0 496.781 0 320c0-176.75 143.219-320 320-320 176.75 0 320 143.25 320 320C640 496.781 496.75 640 320 640zM320 512c27.656 0 53.688-6.094 77.438-16.562L144.562 242.562C134.094 266.312 128 292.34400000000005 128 320 128 426 213.938 512 320 512zM320 128c-28.031 0-54.531 6.375-78.594 17.125l253.906 252.5C505.875 373.812 512 347.719 512 320 512 213.938 426.062 128 320 128z" horiz-adv-x="640" />
+<glyph glyph-name="circuit-board" unicode="&#xf0d6;" d="M320 576c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64s-64 28.654-64 64C256 547.346 284.654 576 320 576zM960 64c0-106.039-85.961-192-192-192H320l192 192h81.128c22.132-38.258 63.494-64 110.872-64 70.692 0 128 57.308 128 128s-57.308 128-128 128c-47.377 0-88.74-25.742-110.872-64H448L156.044-99.95600000000002C100.845-66.23199999999997 64-5.419999999999959 64 64V576c0 106.039 85.961 192 192 192v-145.128C217.742 600.74 192 559.377 192 512c0-70.692 57.308-128 128-128 47.276 0 88.56 25.633 110.727 63.756l162.416 0.219C615.279 409.731 656.633 384 704 384c70.692 0 128 57.308 128 128s-57.308 128-128 128c-47.388 0-88.758-25.753-110.887-64.025l-162.097-0.219c-11.246 19.54-27.503 35.828-47.016 47.116V768h384c106.039 0 192-85.961 192-192V64zM640 128c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64S640 92.654 640 128zM640 512c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64S640 476.654 640 512z" horiz-adv-x="1024" />
+<glyph glyph-name="clippy" unicode="&#xf035;" d="M704-64h-640v576h640v-192h64v320c0 35-29 64-64 64h-192c0 71-57 128-128 128s-128-57-128-128h-192c-35 0-64-29-64-64v-704c0-35 29-64 64-64h640c35 0 64 29 64 64v128h-64v-128z m-512 704c29 0 29 0 64 0s64 29 64 64 29 64 64 64 64-29 64-64 32-64 64-64 33 0 64 0 64-29 64-64h-512c0 39 28 64 64 64z m-64-512h128v64h-128v-64z m448 128v128l-256-192 256-192v128h320v128h-320z m-448-256h192v64h-192v-64z m320 448h-320v-64h320v64z m-192-128h-128v-64h128v64z" horiz-adv-x="896" />
+<glyph glyph-name="clock" unicode="&#xf046;" d="M384 256h256l64 64-64 64H512V576l-64 64-64-64V256zM448 768C200.562 768 0 567.438 0 320c0-247.438 200.562-448 448-448 247.438 0 448 200.562 448 448C896 567.438 695.438 768 448 768zM448 0c-176.25 0-320 143.75-320 320 0 175.938 144.188 319.5 320 320 175.812-0.5 320-144.062 320-320C768 143.75 624.25 0 448 0z" horiz-adv-x="896" />
+<glyph glyph-name="cloud-download" unicode="&#xf00b;" d="M832 512c-8.75 0-17.125-1.406-25.625-2.562C757.625 623.75 644.125 704 512 704c-132.156 0-245.562-80.25-294.406-194.562C209.156 510.594 200.781 512 192 512 85.938 512 0 426.062 0 320s85.938-192 192-192c20.531 0 39.875 4.25 58.375 10.375C284.469 100.625 331.312 75.25 384 67.5v65.25c-49.844 10.375-91.594 42.812-112.625 87.875C249.531 203 222.219 192 192 192c-70.656 0-128 57.375-128 128 0 70.656 57.344 128 128 128 25.281 0 48.625-7.562 68.406-20.094C281.344 548.219 385.594 640 512 640c126.5 0 229.75-92.219 250.5-212.75 20 13 43.875 20.75 69.5 20.75 70.625 0 128-57.344 128-128 0-70.625-57.375-128-128-128-10.25 0-20 1.5-29.625 3.75C773.438 154.875 725.938 128 672 128c-11.062 0-21.625 1.625-32 4v-64.938c10.438-1.688 21.062-3.062 32-3.062 61.188 0 116.5 24.625 156.938 64.438C830 128.375 830.875 128 832 128c106.062 0 192 85.938 192 192S938.062 512 832 512zM576 320H448v-320H320l192-192 192 192H576V320z" horiz-adv-x="1024" />
+<glyph glyph-name="cloud-upload" unicode="&#xf00c;" d="M512 448L320 256h128v-320h128V256h128L512 448zM832 512c-8.75 0-17.125-1.406-25.625-2.562C757.625 623.812 644.125 704 512 704c-132.156 0-245.562-80.188-294.406-194.562C209.156 510.594 200.781 512 192 512 85.938 512 0 426 0 320c0-106.062 85.938-192 192-192 20.531 0 39.875 4.25 58.375 10.438C284.469 100.625 331.312 75.25 384 67.5v65.25c-49.844 10.375-91.594 42.812-112.625 87.75C249.531 203 222.219 192 192 192c-70.656 0-128 57.375-128 128 0 70.656 57.344 128 128 128 25.281 0 48.625-7.562 68.406-20.156C281.344 548.219 385.594 640 512 640c126.5 0 229.75-92.219 250.5-212.75 20 13 43.875 20.75 69.5 20.75 70.625 0 128-57.344 128-128 0-70.625-57.375-128-128-128-10.25 0-20 1.5-29.625 3.75C773.438 154.875 725.938 128 672 128c-11.062 0-21.625 1.625-32 4v-64.938c10.438-1.688 21.062-3.062 32-3.062 61.188 0 116.5 24.688 157 64.438 1 0 1.875-0.438 3-0.438 106.062 0 192 85.938 192 192C1024 426 938.062 512 832 512z" horiz-adv-x="1024" />
+<glyph glyph-name="code" unicode="&#xf05f;" d="M608 640l-96-96 224-224L512 96l96-96 288 320L608 640zM288 640L0 320l288-320 96 96L160 320l224 224L288 640z" horiz-adv-x="896" />
+<glyph glyph-name="color-mode" unicode="&#xf065;" d="M0 704v-768h768V704H0zM64 0V640h640L64 0z" horiz-adv-x="768" />
+<glyph glyph-name="comment" unicode="&#xf02b;" d="M768 704H128C66 704 0 640 0 576v-384c0-128 128-128 128-128h64v-256l256 256c0 0 258 0 320 0s128 68 128 128V576C896 638 832 704 768 704z" horiz-adv-x="896" />
+<glyph glyph-name="comment-discussion" unicode="&#xf04f;" d="M256 320c0 64 0 192 0 192s-160 0-192 0-64-32-64-64 0-288 0-320 32-64 64-64 64 0 64 0v-192l194 192s162 0 192 0 62 32 62 64 0 64 0 64-128 0-192 0-128 64-128 128z m576 384c-32 0-416 0-448 0s-64-32-64-64 0-288 0-320 32-64 64-64 190 0 190 0l194-192v192s32 0 64 0 64 32 64 64 0 288 0 320-32 64-64 64z" horiz-adv-x="896" />
+<glyph glyph-name="credit-card" unicode="&#xf045;" d="M128 128h128v64h-128v-64z m192 0h128v64h-128v-64z m64 192h-256v-64h256v64z m-128 64h64l128 128h-64l-128-128z m192-128h192v64h-192v-64z m512 384c-32 0-864 0-896 0s-64-32-64-64 0-480 0-512 32-64 64-64 864 0 896 0 64 32 64 64 0 480 0 512-32 64-64 64z m0-256v-288s0-32-32-32h-832c-32 0-32 32-32 32v288h64l128 128h-192v32s0 32 32 32h832c32 0 32-32 32-32v-32h-384l-128-128h512z" horiz-adv-x="1024" />
+<glyph glyph-name="dash" unicode="&#xf0ca;" d="M0 384v-128h512V384H0z" horiz-adv-x="512" />
+<glyph glyph-name="dashboard" unicode="&#xf07d;" d="M416 367.5c-61.562 0-111.5-49.938-111.5-111.5S354.438 144.5 416 144.5 527.5 194.438 527.5 256c0 8.5-1.125 16.75-3 24.688C606.125 375.625 732.5 523.656 800 608c23.125 28.875-2.312 56.188-32 32-85.188-69.375-232.312-194.688-326.906-275.594C433.031 366.281 424.625 367.5 416 367.5zM447.875 576.125c0 17.656-14.344 32-32 32s-32-14.344-32-32 14.344-32 32-32S447.875 558.469 447.875 576.125zM639.875 320.125c0-17.656 14.375-32 32-32s32 14.344 32 32-14.375 32-32 32S639.875 337.781 639.875 320.125zM287.875 576.125c-17.656 0-32-14.344-32-32s14.344-32 32-32 32 14.344 32 32S305.531 576.125 287.875 576.125zM223.875 448.125c0 17.656-14.344 32-32 32s-32-14.344-32-32 14.344-32 32-32S223.875 430.469 223.875 448.125zM127.875 320.125c0-17.656 14.344-32 32-32s32 14.344 32 32-14.344 32-32 32S127.875 337.781 127.875 320.125zM575.875 544.125c0 17.656-14.375 32-32 32s-32-14.344-32-32 14.375-32 32-32S575.875 526.469 575.875 544.125zM792.875 495.312l-68.75-89.938C731.625 378.188 736 349.625 736 320c0-176.75-143.312-320-320-320S96 143.25 96 320c0 176.688 143.312 320 320 320 65.875 0 127-19.969 177.875-54.094l79.25 60.625C602.375 702.406 513.25 736 416 736 186.25 736 0 549.75 0 320s186.25-416 416-416 416 186.25 416 416C832 382.719 817.75 442 792.875 495.312z" horiz-adv-x="832" />
+<glyph glyph-name="database" unicode="&#xf096;" d="M384-128C171.969-128 0-70.625 0 0c0 38.625 0 80.875 0 128 0 11.125 5.562 21.688 13.562 32C56.375 104.875 205.25 64 384 64s327.625 40.875 370.438 96c8-10.312 13.562-20.875 13.562-32 0-37.062 0-76.375 0-128C768-70.625 596-128 384-128zM384 128C171.969 128 0 185.375 0 256c0 38.656 0 80.844 0 128 0 6.781 2.562 13.375 6 19.906l0 0C7.938 408 10.5 412.031 13.562 416 56.375 360.906 205.25 320 384 320s327.625 40.906 370.438 96c3.062-3.969 5.625-8 7.562-12.094l0 0c3.438-6.531 6-13.125 6-19.906 0-37.062 0-76.344 0-128C768 185.375 596 128 384 128zM384 384C171.969 384 0 441.344 0 512c0 20.219 0 41.594 0 64 0 20.344 0 41.469 0 64C0 710.656 171.969 768 384 768c212 0 384-57.344 384-128 0-19.969 0-41.156 0-64 0-19.594 0-40.25 0-64C768 441.344 596 384 384 384zM384 704c-141.375 0-256-28.594-256-64s114.625-64 256-64 256 28.594 256 64S525.375 704 384 704z" horiz-adv-x="768" />
+<glyph glyph-name="device-camera" unicode="&#xf056;" d="M512 447.999c-70.691 0-127.999-57.308-127.999-127.999S441.309 192.00099999999998 512 192.00099999999998c5.713 0 11.337 0.38 16.852 1.105-46.344 7.058-81.851 47.079-81.851 95.394 0 53.295 43.204 96.499 96.499 96.499 48.314 0 88.336-35.507 95.394-81.851 0.726 5.515 1.105 11.139 1.105 16.852C639.999 390.691 582.691 447.999 512 447.999zM896 576H767.999L640 704H384L255.999 576H128c-35.348 0-64-28.652-64-64v-448c0-35.347 28.652-64 64-64h768c35.347 0 64 28.653 64 64V512C960 547.348 931.347 576 896 576zM416 640h192l64-64H352L416 640zM160.143 64C142.391 64 128 78.39099999999996 128 96.14300000000003V384h64v64h-64v31.857C128 497.609 142.391 512 160.143 512h182.526c-3.98-3.518-7.881-7.174-11.688-10.98-99.974-99.975-99.974-262.064 0-362.039l74.98-74.98H160.143zM512 128.00099999999998c-106.038 0-191.999 85.961-191.999 191.999S405.962 511.999 512 511.999 703.999 426.038 703.999 320 618.038 128.00099999999998 512 128.00099999999998zM832 352L681.327 512H832V352z" horiz-adv-x="1024" />
+<glyph glyph-name="device-camera-video" unicode="&#xf057;" d="M576 640c-35.347 0-64-28.653-64-64s28.653-64 64-64 64 28.653 64 64S611.347 640 576 640zM896 448L768 320v64c0 30.625-21.515 56.21-50.25 62.503C748.958 480.646 768 526.097 768 575.998 768 682.038 682.039 768 576 768c-101.123 0-183.986-78.178-191.45-177.393C350.516 621.306 305.442 640 256 640c-106.038 0-192-85.962-192-192.002C64 341.961 149.962 256 256 256h-64v-128h64v-128c0-35.347 28.653-64 64-64h384c35.347 0 64 28.653 64 64v64l128-128h64V448H896zM256 512c-35.347 0-64-28.653-64-64s28.653-64 64-64v-64c-70.692 0-128 57.308-128 127.999C128 518.692 185.308 576 256 576s128-57.307 128-128h-64C320 483.347 291.347 512 256 512zM576 128H448V256h128V128zM704 237.21299999999997c-33.526 33.547-70.276 70.317-73.373 73.414C624.837 316.418 616.837 320 608 320H416c-17.674 0-32-14.326-32-32v-192c0-8.329 3.183-15.915 8.396-21.607 0.53-0.58 39.123-39.164 74.409-74.393H352c-17.674 0-32 14.326-32 32V352c0 17.674 14.326 32 32 32h320c17.674 0 32-14.326 32-32V237.21299999999997zM576 448c-70.692 0-128 57.308-128 127.999C448 646.692 505.308 704 576 704s128-57.308 128-128.001C704 505.308 646.692 448 576 448zM896 128l-64 64 0.082 128.084L896 384.002V128z" horiz-adv-x="1024" />
+<glyph glyph-name="device-desktop" unicode="&#xf27c;" d="M960 768c-32 0-864 0-896 0s-64-32-64-64 0-544 0-576 32-64 64-64 320 0 320 0-192-64-192-128c0-32 32-64 64-64s480 0 512 0 64 32 64 64c0 64-192 128-192 128s288 0 320 0 64 32 64 64 0 544 0 576-32 64-64 64z m0-640h-896v576h896v-576z m-64 512h-192c-384-64-542-300-576-384v-64h768v448z" horiz-adv-x="1024" />
+<glyph glyph-name="device-mobile" unicode="&#xf038;" d="M576 832H64C28.688 832 0 803.312 0 768v-896c0-35.375 28.688-64 64-64h512c35.375 0 64 28.625 64 64V768C640 803.312 611.375 832 576 832zM288 768h64c17.625 0 32-14.344 32-32s-14.375-32-32-32h-64c-17.656 0-32 14.344-32 32S270.344 768 288 768zM352-128h-64c-17.656 0-32 14.375-32 32s14.344 32 32 32h64c17.625 0 32-14.375 32-32S369.625-128 352-128zM576 0H64V640h512V0z" horiz-adv-x="640" />
+<glyph glyph-name="diff" unicode="&#xf04d;" d="M448 576H320v-128H192v-128h128v-128h128V320h128V448H448V576zM192-64h384V64H192V-64zM640 832H128v-64h480l224-224v-608h64V576L640 832zM0 704v-896h768V512L576 704H0zM704-128H64V640h480l160-160V-128z" horiz-adv-x="896" />
+<glyph glyph-name="diff-added" unicode="&#xf06b;" d="M512 512h-128v-128h-128v-128h128v-128h128v128h128v128h-128v128z m320 256c-32 0-736 0-768 0s-64-32-64-64 0-736 0-768 32-64 64-64 736 0 768 0 64 32 64 64 0 736 0 768-32 64-64 64z m-64-736c0-16-17-32-32-32s-558 0-576 0-32 12-32 32c0 16 0 560 0 576s16 32 32 32 561 0 576 0 32-16 32-32 0-560 0-576z" horiz-adv-x="896" />
+<glyph glyph-name="diff-ignored" unicode="&#xf099;" d="M832 768h-768c-32 0-64-32-64-64v-768c0-32 32-64 64-64h768c32 0 64 32 64 64v768c0 32-32 64-64 64z m-64-736c0-16-17-32-32-32h-576c-18 0-32 12-32 32v576c0 16 16 32 32 32h576c15 0 32-16 32-32v-576z m-512 194v-98h98l286 286v98h-98l-286-286z" horiz-adv-x="896" />
+<glyph glyph-name="diff-modified" unicode="&#xf06d;" d="M832 768h-768c-32 0-64-32-64-64v-768c0-32 32-64 64-64h768c32 0 64 32 64 64v768c0 32-32 64-64 64z m-64-736c0-16-17-32-32-32h-576c-18 0-32 12-32 32v576c0 16 16 32 32 32h576c15 0 32-16 32-32v-576z m-320 416c-71 0-128-57-128-128s57-128 128-128 128 57 128 128-57 128-128 128z" horiz-adv-x="896" />
+<glyph glyph-name="diff-removed" unicode="&#xf06c;" d="M832 768h-768c-32 0-64-32-64-64v-768c0-32 32-64 64-64h768c32 0 64 32 64 64v768c0 32-32 64-64 64z m-64-736c0-16-17-32-32-32h-576c-18 0-32 12-32 32v576c0 16 16 32 32 32h576c15 0 32-16 32-32v-576z m-512 224h384v128h-384v-128z" horiz-adv-x="896" />
+<glyph glyph-name="diff-renamed" unicode="&#xf06e;" d="M832 768h-768c-32 0-64-32-64-64v-768c0-32 32-64 64-64h768c32 0 64 32 64 64v768c0 32-32 64-64 64z m-64-736c0-16-17-32-32-32h-576c-18 0-32 12-32 32v576c0 16 16 32 32 32h576c15 0 32-16 32-32v-576z m-320 352h-192v-128h192v-128l256 192-256 192v-128z" horiz-adv-x="896" />
+<glyph glyph-name="ellipsis" unicode="&#xf09a;" d="M640 512c-64 0-448 0-512 0s-128-64-128-128 0-64 0-128 64-128 128-128 448 0 512 0 128 64 128 128 0 64 0 128-64 128-128 128z m-384-256h-128v128h128v-128z m192 0h-128v128h128v-128z m192 0h-128v128h128v-128z" horiz-adv-x="768" />
+<glyph glyph-name="eye" unicode="&#xf04e;" d="M512 704c-192 0-416-128-512-384 96-192 288-320 512-320s416 128 512 320c-96 256-320 384-512 384z m0-640c-192 0-352 128-384 256 32 128 192 256 384 256s352-128 384-256c-32-128-192-256-384-256z m0 448c-20 0-38-4-56-9 33-15 56-48 56-87 0-53-43-96-96-96-39 0-72 23-87 56-5-18-9-36-9-56 0-106 86-192 192-192s192 86 192 192-86 192-192 192z" horiz-adv-x="1024" />
+<glyph glyph-name="file-binary" unicode="&#xf094;" d="M0-128V768h576l192-192v-704H0zM704 512L512 704H64v-768h640V512zM320 320H128V576h192V320zM256 512h-64v-128h64V512zM256 64h64v-64H128v64h64V192h-64v64h128V64zM512 384h64v-64H384v64h64V512h-64v64h128V384zM576 0H384V256h192V0zM512 192h-64v-128h64V192z" horiz-adv-x="768" />
+<glyph glyph-name="file-code" unicode="&#xf010;" d="M288 448L128 288l160-160 64 64-96 96 96 96L288 448zM416 384l96-96-96-96 64-64 160 160L480 448 416 384zM576 768H0v-896h768V576L576 768zM704-64H64V704h448l192-192V-64z" horiz-adv-x="768" />
+<glyph glyph-name="file-directory" unicode="&#xf016;" d="M832 640c-32 0-336 0-352 0s-32 16-32 32 0 0 0 32-32 64-64 64-288 0-320 0-64-32-64-64 0-704 0-704h896s0 544 0 576-32 64-64 64z m-448 0h-320s0 15 0 32 16 32 32 32 241 0 256 0 32-15 32-32 0-32 0-32z" horiz-adv-x="896" />
+<glyph glyph-name="file-media" unicode="&#xf012;" d="M576 768H0v-896h768V576L576 768zM704-64H64V704h448l192-192V-64zM128 576v-512h128c0 70.625 57.344 128 128 128-70.656 0-128 57.375-128 128 0 70.656 57.344 128 128 128 70.625 0 128-57.344 128-128 0-70.625-57.375-128-128-128 70.625 0 128-57.375 128-128h128V448L512 576H128z" horiz-adv-x="768" />
+<glyph glyph-name="file-pdf" unicode="&#xf014;" d="M576 768H0v-896h768V576L576 768zM64 704h255.812c-13.188-4.094-27.281-15.031-34.625-42.875-13.25-49.406-7.031-130.75 15.625-209.344C276.688 370.562 178.188 175.125 171.531 163.5c-15.625-4.875-65.344-23.625-107.531-59.812V704zM347.125 396.531c57.625-149.781 95-149.531 135.188-167.594C398.344 216 334.219 206.75 249.781 169.5 246.094 163.062 326.281 315.40599999999995 347.125 396.531zM704-64H65.844 64v0.375c0.781-0.062 1.094-0.375 1.844-0.375 33.812 0 84.75 21 180.562 182.375 38.188 15.438 72.062 26.875 78.469 28.938 58.812 14.875 125 26.625 187.562 33.375C566.875 153.5 639.125 135 680.25 132.375c9.625-0.5 16.062 1.188 23.75 2V-64zM704 246.625c-23.688 14.688-54 25-89.125 25-24.25 0-50.625-1.375-78.688-4.375-26.938 13-92.562 32.719-147.188 190.219 17.094 103.625 12.719 173.562 12.719 173.562 6.781 52.938-23.344 72.844-51.625 72.844 0 0-0.279 0.125-0.344 0.125H512l192-192V246.625z" horiz-adv-x="768" />
+<glyph glyph-name="file-submodule" unicode="&#xf017;" d="M832 320c-32 0-192 0-192 0 0 32-32 64-64 64s-96 0-128 0-64-32-64-64 0-320 0-320h512s0 224 0 256-32 64-64 64z m-256-64h-128s0 17 0 32 15 32 32 32 48 0 64 0 32-15 32-32 0-32 0-32z m256 320c-32 0-336 0-352 0s-32 17-32 32 0 0 0 32-32 64-64 64-288 0-320 0-64-32-64-64 0-640 0-640h320s0 352 0 384 32 64 64 64 224 0 256 0 64-32 64-64h192s0 96 0 128-32 64-64 64z m-448 0h-320s0 16 0 32 16 32 32 32 240 0 256 0 32-17 32-32 0-32 0-32z" horiz-adv-x="896" />
+<glyph glyph-name="file-symlink-directory" unicode="&#xf0b1;" d="M832 640h-352c-16 0-32 16-32 32s0 0 0 32-32 64-64 64h-320c-32 0-64-32-64-64s0-704 0-704h896s0 544 0 576-32 64-64 64z m-768 32c0 17 16 32 32 32h256c15 0 32-15 32-32s0-32 0-32h-320s0 15 0 32z m384-544v128c-125 0-224-56-256-192 0 209 107 320 256 320 0 49 0 128 0 128l256-192-256-192z" horiz-adv-x="896" />
+<glyph glyph-name="file-symlink-file" unicode="&#xf0b0;" d="M576 768h-576v-896h768v704l-192 192z m128-832h-640v768h448l192-192v-576z m-320 448c-149 0-256-111-256-320 32 136 131 192 256 192v-128l256 192-256 192s0-79 0-128z" horiz-adv-x="768" />
+<glyph glyph-name="file-text" unicode="&#xf011;" d="M448 576H128v-64h320V576zM576 768H0v-896h768V576L576 768zM704-64H64V704h448l192-192V-64zM128 64h512v64H128V64zM128 192h512v64H128V192zM128 320h512v64H128V320z" horiz-adv-x="768" />
+<glyph glyph-name="file-zip" unicode="&#xf013;" d="M320 256v64h-64v-64H320zM320 384v64h-64v-64H320zM320 512v64h-64v-64H320zM192 448h64v64h-64V448zM576 768H0v-896h768V576L576 768zM704-64H64V704h192v-64h64v64h192l192-192V-64zM192 576h64v64h-64V576zM192 320h64v64h-64V320zM192 192l-64-64v-128h256V128l-64 64h-64v64h-64V192zM320 128v-64H192v64H320z" horiz-adv-x="768" />
+<glyph glyph-name="flame" unicode="&#xf0d2;" d="M433 787c50-134 24-207-32-265-61-64-156-112-223-206-89-125-104-400 217-472-135 71-164 277-18 406-38-125 32-205 119-176 85 29 141-32 139-102-1-48-20-89-69-112 209 37 293 210 293 342 0 174-155 198-77 344-93-8-125-69-116-169 6-66-63-111-114-81-41 25-40 73-4 109 77 76 107 251-115 382z" horiz-adv-x="1024" />
+<glyph glyph-name="fold" unicode="&#xf0cc;" d="M896 576H672l-64-64h192L672 384H224L96 512h192l-64 64H0v-63.999L160 352 0 192v-64h224l64 64H96l128 128h448l128-128H608l64-64h224v64L736 352l160 160.001V576zM640 640H512V832H384v-192H256l192-192L640 640zM256 64h128v-192h128V64h128L448 256 256 64z" horiz-adv-x="896" />
+<glyph glyph-name="gear" unicode="&#xf02f;" d="M447.938 482C358.531 482 286 409.469 286 320c0-89.375 72.531-162.062 161.938-162.062 89.438 0 161.438 72.688 161.438 162.062C609.375 409.469 537.375 482 447.938 482zM772.625 226.938l-29.188-70.312 52.062-102.25 6.875-13.5-72.188-72.188L611.75 24.625l-70.312-28.875L505.75-113.5l-4.562-14.5H399.156L355-4.687999999999988l-70.312 29-102.404-51.938-13.5-6.75-72.156 72.125 55.875 118.5-28.969 70.25L14.469 262.125 0 266.812V368.781L123.406 413l28.969 70.188-51.906 102.469-6.844 13.438 72.062 72.062 118.594-55.844 70.219 29.031 35.656 109.188L394.75 768h102l44.188-123.469 70.125-29.031L713.5 667.469l13.625 6.844 72.125-72.062-55.875-118.406L772.25 413.5l109.375-35.656L896 373.25v-101.938L772.625 226.938z" horiz-adv-x="896" />
+<glyph glyph-name="gift" unicode="&#xf042;" d="M448-128h320V192H448V-128zM64-128h320V192H64V-128zM447.75 455.812c31.469 3.5 66.875 7.406 87.375 9.719C619 474.875 694.5 550.406 703.812 634.25c9.312 83.75-51 144.125-134.688 134.719C503.688 761.656 443.844 714 416 653.625 388.156 714 328.312 761.656 262.906 769.031 179.188 778.375 118.781 718 128.188 634.25c9.344-83.844 84.875-159.312 168.656-168.719 20.531-2.312 55.938-6.281 87.406-9.719C383.75 451.594 384 448 384 448h64C448 448 448.25 451.594 447.75 455.812zM555.375 691.312c45.25 5.062 78-27.562 72.875-72.875-5-45.312-45.875-86.156-91.125-91.219-45.375-5.031-78 27.594-72.938 72.906C469.249 645.436 510.125 686.281 555.375 691.312zM294.906 527.219c-45.25 5.062-86.062 45.906-91.125 91.219-5.063 45.313 27.594 77.938 72.812 72.875 45.312-5.031 86.156-45.875 91.222-91.188C372.875 554.812 340.219 522.188 294.906 527.219zM448 448v-192h384V448H448zM0 256h384V448H0V256z" horiz-adv-x="896" />
+<glyph glyph-name="gist" unicode="&#xf00e;" d="M416 448l96-96-96-96 64-64 160 160-160 160-64-64z m-416 320v-832h768v832h-768z m704-768h-640v704h640v-704z m-352 256l-96 96 96 96-64 64-160-160 160-160 64 64z" horiz-adv-x="768" />
+<glyph glyph-name="gist-secret" unicode="&#xf08c;" d="M193 128l128-192h-256l-65 256 257 64-64-128z m448 128l64-128-128-192h256l64 256-256 64z m-84 0h-216l44-102-64-218h256l-64 218 44 102z m84 192h-384l-128-64h640l-128 64z m-64 256l-128-64-128 64-64-192h384l-64 192z" horiz-adv-x="896" />
+<glyph glyph-name="git-branch" unicode="&#xf020;" d="M512 640c-71 0-128-57-128-128 0-47 26-88 64-110v-18c0-64-64-128-128-128-53 0-95-11-128-29v303c38 22 64 63 64 110 0 71-57 128-128 128s-128-57-128-128c0-47 26-88 64-110v-419c-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 34-13 64-34 87 19 23 49 41 98 41 128 0 256 128 256 256v18c38 22 64 63 64 110 0 71-57 128-128 128z m-384 64c35 0 64-29 64-64s-29-64-64-64-64 29-64 64 29 64 64 64z m0-768c-35 0-64 29-64 64s29 64 64 64 64-29 64-64-29-64-64-64z m384 512c-35 0-64 29-64 64s29 64 64 64 64-29 64-64-29-64-64-64z" horiz-adv-x="640" />
+<glyph glyph-name="git-commit" unicode="&#xf01f;" d="M694.875 384C666.375 494.219 567.125 576 448 576c-119.094 0-218.375-81.781-246.906-192H0v-128h201.094C229.625 145.75 328.906 64 448 64c119.125 0 218.375 81.75 246.875 192H896V384H694.875zM448 192c-70.656 0-128 57.375-128 128 0 70.656 57.344 128 128 128 70.625 0 128-57.344 128-128C576 249.375 518.625 192 448 192z" horiz-adv-x="896" />
+<glyph glyph-name="git-compare" unicode="&#xf0ac;" d="M832 110s0 306 0 402-96 192-192 192c-64 0-64 0-64 0v128l-192-192 192-192v128s32 0 64 0 64-32 64-64 0-402 0-402c-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110z m-64-174c-35 0-64 29-64 64s29 64 64 64 64-29 64-64-29-64-64-64z m-448 128s-32 0-64 0-64 32-64 64 0 402 0 402c38 22 64 63 64 110 0 71-57 128-128 128s-128-57-128-128c0-47 26-88 64-110 0 0 0-306 0-402s96-192 192-192c64 0 64 0 64 0v-128l192 192-192 192v-128z m-192 512c-35 0-64 29-64 64s29 64 64 64 64-29 64-64-29-64-64-64z" horiz-adv-x="896" />
+<glyph glyph-name="git-merge" unicode="&#xf023;" d="M640 384c-47.625 0-88.625-26.312-110.625-64.906C523.625 319.5 518 320 512 320c-131.062 0-255.438 99.844-300.812 223.438C238.469 566.906 256 601.281 256 640c0 70.656-57.344 128-128 128S0 710.656 0 640c0-47.219 25.844-88.062 64-110.281V110.25C25.844 88.06200000000001 0 47.25 0 0c0-70.625 57.344-128 128-128s128 57.375 128 128c0 47.25-25.844 88.062-64 110.25V340.531C276.156 251.5 392.375 192 512 192c6.375 0 11.625 0.438 17.375 0.625C551.5 154.188 592.5 128 640 128c70.625 0 128 57.375 128 128C768 326.656 710.625 384 640 384zM128-64c-35.312 0-64 28.625-64 64 0 35.312 28.688 64 64 64 35.406 0 64-28.688 64-64C192-35.375 163.406-64 128-64zM128 576c-35.312 0-64 28.594-64 64s28.688 64 64 64c35.406 0 64-28.594 64-64S163.406 576 128 576zM640 192c-35.312 0-64 28.625-64 64 0 35.406 28.688 64 64 64 35.375 0 64-28.594 64-64C704 220.625 675.375 192 640 192z" horiz-adv-x="768" />
+<glyph glyph-name="git-pull-request" unicode="&#xf009;" d="M704 110s0 306 0 402-96 192-192 192c-64 0-64 0-64 0v128l-192-192 192-192v128s32 0 64 0 64-32 64-64 0-402 0-402c-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110z m-64-174c-35 0-64 29-64 64s29 64 64 64 64-29 64-64-29-64-64-64z m-512 832c-71 0-128-57-128-128 0-47 26-88 64-110v-419c-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110v419c38 22 64 63 64 110 0 71-57 128-128 128z m0-832c-35 0-64 29-64 64s29 64 64 64 64-29 64-64-29-64-64-64z m0 640c-35 0-64 29-64 64s29 64 64 64 64-29 64-64-29-64-64-64z" horiz-adv-x="768" />
+<glyph glyph-name="globe" unicode="&#xf0b6;" d="M512 704c-212.077 0-384-171.923-384-384s171.923-384 384-384c25.953 0 51.303 2.582 75.812 7.49-9.879 4.725-10.957 40.174-1.188 60.385 10.875 22.5 45 79.5 11.25 98.625s-24.375 27.75-45 49.875-12.19 25.451-13.5 31.125c-4.5 19.5 19.875 48.75 21 51.75s1.125 14.25 0.75 17.625S545.75 265.25 542 265.625s-5.625-6-10.875-6.375-28.125 13.875-33 17.625-7.125 12.75-13.875 19.5-7.5 1.5-18 5.625-44.25 16.5-70.125 27-28.125 25.219-28.5 35.625-15.75 25.5-22.961 36.375c-7.209 10.875-8.539 25.875-11.164 22.5s13.5-42.75 10.875-43.875-8.25 10.875-15.75 20.625 7.875 4.5-16.125 51.75 7.5 71.344 9 96 20.25-9 10.5 6.75 0.75 48.75-6.75 60.75S275 602 275 602c1.125 11.625 37.5 31.5 63.75 49.875s42.281 4.125 63.375-2.625 22.5-4.5 15.375 2.25 3 10.125 19.5 7.5 21-22.5 46.125-20.625 2.625-4.875 6-11.25-3.75-5.625-20.25-16.875S469.25 599 498.5 577.625s20.25 14.25 17.25 30S537.125 611 537.125 611c18-12 14.674-0.66 27.799-4.785S613.625 572 613.625 572c-44.625-24.375-16.5-27-9-32.625s-15.375-16.5-15.375-16.5c-9.375 9.375-10.875-0.375-16.875-3.75s-0.375-12-0.375-12c-31.031-4.875-24-37.5-23.625-45.375s-19.875-19.875-25.125-31.125S536.75 395 527 393.5s-19.5 36.75-72 22.5c-15.828-4.297-51-22.5-32.25-59.625s49.875 10.5 60.375 5.25-3-28.875-0.75-29.25 29.625-1.031 31.125-33 41.625-29.25 50.25-30 37.5 23.625 41.625 24.75S626 309.125 662 288.5s54.375-17.625 66.75-26.25 3.75-25.875 15.375-31.5 58.125 1.875 69.75-17.25-48-115.125-66.75-125.625S719.75 53.375 701 38s-45-34.406-69.75-49.125c-21.908-13.027-25.85-36.365-35.609-43.732C767.496-16.67999999999995 896 136.64999999999998 896 320 896 532.077 724.077 704 512 704zM602 343.625c-5.25-1.5-16.125-11.25-42.75 4.5s-45 12.75-47.25 15.375c0 0-2.25 6.375 9.375 7.5 23.871 2.311 54-22.125 60.75-22.5s10.125 6.75 22.125 2.883C616.25 347.52 607.25 345.125 602 343.625zM476.375 665.75c-2.615 1.902 2.166 4.092 5.016 7.875 1.645 2.186 0.425 5.815 2.484 7.875 5.625 5.625 33.375 13.5 27.949-1.875C506.4 664.25 480.5 662.75 476.375 665.75zM543.5 617c-9.375 0.375-31.443 2.707-27.375 6.75 15.844 15.75-6 20.25-19.5 21.375S477.5 653.75 484.25 654.5s33.75-0.375 38.25-4.125 28.875-13.5 30.375-20.625S552.875 616.625 543.5 617zM624.875 619.625c-7.5-6-45.24 21.529-52.5 27.75-31.5 27-48.375 18-54.99 22.5-6.617 4.5-4.26 10.5 5.865 19.5s38.625-3 55.125-4.875 35.625-14.625 36-29.781C614.75 639.564 632.375 625.625 624.875 619.625z" horiz-adv-x="1024" />
+<glyph glyph-name="graph" unicode="&#xf043;" d="M704 576H512v-640h192V576zM960 384H768v-448h192V384zM64-128V0h64v64H64V192h64v64H64V384h64v64H64V576h64v64H64V768h64V832H0v-1024h1024v64H64zM448 256H256v-320h192V256z" horiz-adv-x="1024" />
+<glyph glyph-name="heart" unicode="&#x2665;" d="M384-32c399 314 384 425 384 512s-72 192-192 192-192-128-192-128-72 128-192 128-192-105-192-192-15-198 384-512z" horiz-adv-x="768.199" />
+<glyph glyph-name="history" unicode="&#xf07e;" d="M448 768c-90.938 0-175.312-27.531-245.938-74.062L128 768v-256h256l-88 88c45.438 24.688 96.688 40 152 40 176.75 0 320-143.219 320-320 0-176.75-143.25-320-320-320-176.781 0-320 143.25-320 320 0 45.562 9.781 88.781 27 128H64v99.406C24.312 480.5 0 403.406 0 320c0-247.438 200.562-448 448-448 247.438 0 448 200.562 448 448C896 567.438 695.438 768 448 768zM447.031 1L512 64V256h128l64 64-64 64H512l-64 64L320 320l64-64v-192L447.031 1z" horiz-adv-x="896" />
+<glyph glyph-name="home" unicode="&#xf08d;" d="M192 256l64-384h192V192h128v-320h192l64 384L512 576 192 256zM832 448V704H704l0.312-128.312L512 768 0 256h128l384 384 384-384h128L832 448z" horiz-adv-x="1024" />
+<glyph glyph-name="horizontal-rule" unicode="&#xf070;" d="M63.938 384h128v-128h64V639.938h-64V448h-128V639.938H0V256h63.938V384zM639.875 256V384h-63.938v-128H639.875zM639.875 448V575.938h-63.938V448H639.875zM447.938 448V575.938h128v64h-192V256h64V384h128v64H447.938zM0 0h639.875V128H0V0z" horiz-adv-x="639.875" />
+<glyph glyph-name="hourglass" unicode="&#xf09e;" d="M571 320c118 85 197 240 197 384 0 71-172 128-384 128s-384-57-384-128c0-144 80-299 197-384-118-85-197-240-197-384 0-71 172-128 384-128s384 57 384 128c0 144-80 299-197 384z m-187 448c141 0 256-29 256-64s-115-64-256-64-256 29-256 64 115 64 256 64z m-64-706c-154-7-238-40-253-82 16 114 75 189 141 251 73 68 112 60 112 103v-273z m-105 352c-70 55-122 130-142 215 70-32 183-53 311-53s241 21 311 53c-20-85-72-160-142-215-24 17-70 34-169 34s-145-17-169-34z m233-352v273c0-43 39-35 112-103 66-62 125-138 141-251-14 41-99 75-253 82z" horiz-adv-x="768" />
+<glyph glyph-name="hubot" unicode="&#xf09d;" d="M512 768c-283 0-512-229-512-512 0 0 0-192 0-256s64-128 128-128 704 0 768 0 128 64 128 128 0 256 0 256c0 283-229 512-512 512z m96-768h-192c-18 0-32 14-32 32s14 32 32 32h192c18 0 32-14 32-32s-14-32-32-32z m288 128c0-32-32-64-64-64s-128 0-128 0c0 32-32 64-64 64s-224 0-256 0-64-32-64-64c0 0-96 0-128 0s-64 32-64 64 0 360 0 360c78 129 220 216 384 216s306-87 384-216c0 0 0-328 0-360z m-128 384c-32 0-480 0-512 0s-64-32-64-64 0-96 0-128 32-64 64-64 480 0 512 0 64 32 64 64 0 96 0 128-32 64-64 64z m0-128l-64-64h-128l-64 64-64-64h-128l-64 64v64h64l64-64 64 64h128l64-64 64 64h64v-64z" horiz-adv-x="1024" />
+<glyph glyph-name="inbox" unicode="&#xf0cf;" d="M704 640H64L0 256v-256h768V256L704 640zM576 256l-64-128H256l-64 128H79l49 320h512l49-320H576z" horiz-adv-x="768" />
+<glyph glyph-name="info" unicode="&#xf059;" d="M448 448c35 0 64 29 64 64s-29 64-64 64-64-29-64-64 29-64 64-64z m0 320c-247 0-448-201-448-448s201-448 448-448 448 201 448 448-201 448-448 448z m0-768c-177 0-320 143-320 320s143 320 320 320 320-143 320-320-143-320-320-320z m64 320c0 32-32 64-64 64s-32 0-64 0-64-32-64-64h64s0-160 0-192 32-64 64-64 32 0 64 0 64 32 64 64h-64s0 160 0 192z" horiz-adv-x="896" />
+<glyph glyph-name="issue-closed" unicode="&#xf028;" d="M704 515.969l-96-96L768 256l256 256-96 96L769.25 449.219 704 515.969zM512 0c-176.781 0-320 143.25-320 320 0 176.781 143.219 320 320 320 88.375 0 168.375-35.844 226.25-93.75l90.562 90.5C747.75 717.875 635.75 768 512 768 264.562 768 64 567.438 64 320c0-247.438 200.562-448 448-448 247.438 0 448 200.562 448 448L759.75 119.75C768.688 130.75 684.75 0 512 0zM576 576H448v-320h128V576zM448 64h128V192H448V64z" horiz-adv-x="1024" />
+<glyph glyph-name="issue-opened" unicode="&#xf026;" d="M448 768C200.562 768 0 567.438 0 320c0-247.438 200.562-448 448-448 247.438 0 448 200.562 448 448C896 567.438 695.438 768 448 768zM448 0c-176.781 0-320 143.25-320 320 0 176.781 143.219 320 320 320 176.75 0 320-143.219 320-320C768 143.25 624.75 0 448 0zM384 64h128V192H384V64zM384 256h128V576H384V256z" horiz-adv-x="896" />
+<glyph glyph-name="issue-reopened" unicode="&#xf027;" d="M639.125 64.75C585.75 24.625 520 0 448 0c-176.781 0-320 143.25-320 320 0 45.562 9.781 88.781 27 128H64v99.469C24.312 480.562 0 403.406 0 320c0-247.438 200.562-448 448-448 107.375 0 204.5 39.312 281.75 102.25L768-64V128H576L639.125 64.75zM384 64h128V192H384V64zM512 576H384v-320h128V576zM896 320c0 247.438-200.562 448-448 448-107.406 0-204.531-39.312-281.656-102.344L128 704v-192h192l-63.156 63.156C310.281 615.312 376 640 448 640c176.75 0 320-143.219 320-320 0-45.562-9.75-88.75-27-128h91v-99.5C871.688 159.438 896 236.5 896 320z" horiz-adv-x="896" />
+<glyph glyph-name="jersey" unicode="&#xf019;" d="M704 832h-192c0-32-33-64-97-64s-95 32-95 64h-192c0-128-2-384-128-384 0 0-1-544-1-576s32-64 64-64 672 0 704 0 64 32 64 64 0 576 0 576c-126 0-128 256-128 384z m-609-960c-16 0-31 10-31 32 0 32 0 480 0 480 119 64 128 192 128 384h64c0-96 32-191 160-192s160 96 160 192h64c0-186 32-276 64-339v-557s-593 0-609 0z m385 576l-32-32v-320l32-32h128l32 32v320l-32 32h-128z m96-320h-64v256h64v-256z m-352 320l-32-32v-320l32-32h128l32 32v320l-32 32h-128z m96-320h-64v256h64v-256z" horiz-adv-x="896" />
+<glyph glyph-name="jump-down" unicode="&#xf072;" d="M767.75 640H0.25L384 256.25 767.75 640zM0 128v-128h768V128H0z" horiz-adv-x="768" />
+<glyph glyph-name="jump-left" unicode="&#xf0a5;" d="M256.25 320L640-63.75v767.5L256.25 320zM0-64h128V704H0V-64z" horiz-adv-x="640" />
+<glyph glyph-name="jump-right" unicode="&#xf0a6;" d="M0-63.75L383.75 320 0 703.812V-63.75zM512 704v-768h128V704H512z" horiz-adv-x="640" />
+<glyph glyph-name="jump-up" unicode="&#xf073;" d="M0.188 0h767.5L384 383.75 0.188 0zM0 640v-128h768V640H0z" horiz-adv-x="768" />
+<glyph glyph-name="key" unicode="&#xf049;" d="M640.9 768.1c-141.4 0-256-114.6-256-256 0-19.6 2.2-38.6 6.4-56.9L0 64v-64l64-64h128l64 64v64h64v64h64v64h128l70.8 70.8c18.7-4.3 38.1-6.6 58.1-6.6 141.4 0 256 114.6 256 256S782.2 768.1 640.9 768.1zM384 320L64 0v64l320 320V320zM704 512c-35.3 0-64 28.7-64 64 0 35.3 28.7 64 64 64s64-28.7 64-64C768 540.7 739.3 512 704 512z" horiz-adv-x="896.9" />
+<glyph glyph-name="keyboard" unicode="&#xf00d;" d="M640 256h64V384h-64V256zM768 576h-64v-128h64V576zM640 576h-64v-128h64V576zM512 256h64V384h-64V256zM384 64h320V192H384V64zM768 256h128V576h-64v-192h-64V256zM256 64h64V192h-64V64zM768 64h128V192H768V64zM512 576h-64v-128h64V576zM192 384h-64v-128h64V384zM192 192h-64v-128h64V192zM0 704v-768h1024V704H0zM960 0H64V640h896V0zM384 256h64V384h-64V256zM256 576H128v-128h128V576zM384 576h-64v-128h64V576zM256 256h64V384h-64V256z" horiz-adv-x="1024" />
+<glyph glyph-name="law" unicode="&#xf0d8;" d="M514 640c34 1 61 28 62 62 1 37-29 67-66 66-34-1-61-28-62-62-1-37 29-67 66-66z m464-384h-18l-127 246c18 2 36 9 52 16 24 11 29 43 11 62l-1 1c-11 11-28 15-43 8-14-6-34-13-53-13-56 0-81 64-287 64s-231-64-287-64c-20 0-39 6-53 13-15 6-32 3-43-8l-1-1c-18-19-13-50 11-62 16-8 34-14 52-16l-127-246h-18c-8 0-14-7-13-15 11-64 92-113 191-113s180 49 191 113c1 8-5 15-13 15h-18l-127 245c83 7 127 49 191 49v-486c-35 0-64-29-64-64h-71c-28 0-57-29-57-64h512c0 35-29 64-71 64h-57c0 35-29 64-64 64v486c64 0 108-42 191-49l-127-245h-18c-8 0-14-7-13-15 11-64 92-113 191-113s180 49 191 113c1 8-5 15-13 15z m-658 0h-192l96 180 96-180z m384 0l96 180 96-180h-192z" horiz-adv-x="1024" />
+<glyph glyph-name="light-bulb" unicode="&#xf000;" d="M512 768c-176.731 0-320-143.269-320-320 0-104.69 50.278-197.633 128-256.015V0c0-35.346 28.653-64 64-64 0-35.346 28.653-64 64-64h128c35.347 0 64 28.654 64 64 35.347 0 64 28.654 64 64V191.985C781.722 250.36699999999996 832 343.31 832 448 832 624.731 688.731 768 512 768zM640 32c0-17.673-14.326-32-32-32H416c-17.674 0-32 14.327-32 32v32h256V32zM704 278.693c-33.234-33.03-64-42.389-64-124.041V128h-64V256l128 128v64l-64 64-64-64-64 64-64-64-64 64-64-64v-64l128-128v-128h-64v26.652c0 81.652-30.766 91.011-64 124.041C280.177 323.82 256 383.082 256 448c0 141.385 114.615 256 256 256s256-114.615 256-256C768 383.082 743.823 323.82 704 278.693zM512 256L384 384v64l64-64 64 64 64-64 64 64v-64L512 256z" horiz-adv-x="1024" />
+<glyph glyph-name="link" unicode="&#xf05c;" d="M768 576h-138c48-32 93-89 107-128h30c65 0 128-64 128-128s-65-128-128-128h-192c-63 0-128 64-128 128 0 23 7 45 18 64h-137c-5-21-8-42-8-64 0-128 127-256 255-256s65 0 193 0 256 128 256 256-128 256-256 256z m-481-384h-30c-65 0-128 64-128 128s65 128 128 128h192c63 0 128-64 128-128 0-23-7-45-18-64h137c5 21 8 42 8 64 0 128-127 256-255 256s-65 0-193 0-256-128-256-256 128-256 256-256h138c-48 32-93 89-107 128z" horiz-adv-x="1024" />
+<glyph glyph-name="link-external" unicode="&#xf07f;" d="M640 64H128V574.094L256 576V704H0v-768h768V256H640V64zM384 704l128-128L320 384l128-128 192 192 128-128V704H384z" horiz-adv-x="768" />
+<glyph glyph-name="list-ordered" unicode="&#xf062;" d="M320 256h448v128h-448v-128z m0-256h448v128h-448v-128z m0 640v-128h448v128h-448z m-241-256h78v256h-36l-85-23v-50l43 2v-185z m110-206c0 36-12 78-96 78-33 0-64-6-83-16l1-66c21 10 42 15 67 15s32-11 32-28c0-26-30-58-110-112v-50h192v67l-91-2c49 30 87 66 87 113l1 1z" horiz-adv-x="768" />
+<glyph glyph-name="list-unordered" unicode="&#xf061;" d="M0 256h128v128h-128v-128z m0 256h128v128h-128v-128z m0-512h128v128h-128v-128z m256 256h512v128h-512v-128z m0 256h512v128h-512v-128z m0-512h512v128h-512v-128z" horiz-adv-x="768" />
+<glyph glyph-name="location" unicode="&#xf060;" d="M320 832c-177 0-320-143-320-320s160-416 320-704c160 288 320 527 320 704s-143 320-320 320z m0-448c-71 0-128 57-128 128s57 128 128 128 128-57 128-128-57-128-128-128z" horiz-adv-x="640" />
+<glyph glyph-name="lock" unicode="&#xf06a;" d="M704 384c-32 0-64 0-64 0s0 64 0 192-128 256-256 256-256-128-256-256 0-192 0-192-32 0-64 0-64-32-64-64 0-416 0-448 32-64 64-64 608 0 640 0 64 32 64 64 0 416 0 448-32 64-64 64z m-192-128h-384v-64h384v-64h-384v-64h384v-64h-384v-64h384v-64h-448v448h448v-64z m0 128h-256s0 128 0 192 64 128 128 128 128-64 128-128 0-192 0-192z" horiz-adv-x="768" />
+<glyph glyph-name="logo-github" unicode="&#xf092;" d="M552.73 499.865H311.557c-6.205 0-11.25-5.045-11.25-11.297v-117.887c0-6.252 5.045-11.272 11.25-11.272h94.109v-146.542c0 0-21.145-7.057-79.496-7.057-68.914 0-165.156 25.244-165.156 236.795 0 211.642 100.197 239.491 194.307 239.491 81.465 0 116.514-14.304 138.869-21.241 7.01-2.203 13.404 4.831 13.404 11.105L534.543 785.87c0 2.912-1.041 6.417-4.262 8.785C521.186 801.048 465.865 832 326.168 832 165.133 832 0 763.513 0 434.243 0 105.02099999999996 189.051 56 348.381 56c131.883 0 212.021 56.314 212.021 56.314 3.268 1.801 3.6 6.395 3.6 8.479V488.568C563.955 494.773 558.887 499.865 552.73 499.865zM1772.381 803.866h-135.695c-6.252 0-11.271-5.044-11.271-11.296v-262.393h-211.619V792.57c0 6.252-5.068 11.296-11.178 11.296h-135.838c-6.111 0-11.084-5.044-11.084-11.296v-710.473c0-6.299 5.021-11.32 11.084-11.32h135.838c6.203 0 11.178 5.068 11.178 11.32V385.933h211.619l-0.475-303.883c0-6.3 5.021-11.272 11.084-11.272h135.885c6.252 0 11.131 5.068 11.131 11.272l0.473 710.521C1783.607 798.822 1778.539 803.866 1772.381 803.866zM714.949 787.763c-48.357 0-87.574-39.572-87.574-88.403 0-48.855 39.217-88.428 87.574-88.428s87.527 39.572 87.527 88.428C802.477 748.19 763.307 787.763 714.949 787.763zM792.861 559.874c0 6.205-5.02 11.344-11.131 11.344H646.32c-6.348 0-11.746-6.394-11.746-12.67 0 0 0-394.654 0-469.867 0-13.735 8.572-17.903 19.703-17.903 0 0 57.688 0 121.959 0 13.311 0 16.814 6.536 16.814 18.188-0.094 25.197-0.094 123.808-0.094 142.942C792.861 250.09500000000003 792.861 559.874 792.861 559.874zM2297.973 570.152h-134.701c-6.158 0-11.084-5.092-11.084-11.344v-348.31c0 0-34.244-25.197-82.934-25.197-48.547 0-61.525 22.024-61.525 69.719 0 47.553 0 303.835 0 303.835 0 6.252-5.068 11.345-11.131 11.345h-136.643c-6.252 0-11.178-5.093-11.178-11.345 0 0 0-185.521 0-326.807 0-141.284 78.766-175.906 186.99-175.906 88.854 0 160.609 49.115 160.609 49.115s3.363-25.766 5.068-28.844c1.422-3.078 5.447-6.158 9.852-6.158h86.58c6.158 0 11.178 5.069 11.178 11.321l0.379 477.278C2309.15 565.0609999999999 2304.129 570.152 2297.973 570.152zM2666.932 586.1610000000001c-76.539 0-128.592-34.148-128.592-34.148V792.57c0 6.252-5.068 11.296-11.131 11.296h-136.264c-6.109 0-11.131-5.044-11.131-11.296l-0.379-710.521c0-6.3 5.068-11.272 11.225-11.272 0 0 94.773 0 94.869 0 4.215 0 7.389 2.179 9.805 5.968 2.369 3.837 5.73 32.775 5.73 32.775s55.557-52.763 161.035-52.763c123.807 0 194.758 62.804 194.758 281.906C2856.859 557.482 2743.471 586.1610000000001 2666.932 586.1610000000001zM2613.791 185.77499999999998c-46.701 1.421-78.34 22.64-78.34 22.64v225.07c0 0 31.307 19.206 69.672 22.593 48.547 4.31 95.438-10.326 95.438-126.13C2700.322 207.94100000000003 2679.199 183.83399999999995 2613.791 185.77499999999998zM1185.125 188.33299999999997c-5.969 0-21.219-2.368-36.85-2.368-49.92 0-66.971 23.256-66.971 53.331 0 30.218 0 199.85 0 199.85h101.926c6.252 0 11.178 5.044 11.178 11.343v109.48c0.094 6.299-4.926 11.344-11.178 11.344h-101.926l-0.143 134.535c0 5.092-2.699 7.625-8.572 7.625H933.861c-5.352 0-8.336-2.391-8.336-7.578v-139.035c0 0-69.576-16.79-74.266-18.188-4.641-1.326-8.051-5.684-8.051-10.822v-87.408c0-6.252 5.068-11.344 11.178-11.344h71.139c0 0 0-91.34 0-210.222 0-156.109 109.553-171.455 183.439-171.455 33.723 0 74.076 10.988 80.848 13.356 4.074 1.421 6.395 5.637 6.395 10.136l0.047 96.101C1196.254 183.312 1190.998 188.428 1185.125 188.33299999999997z" horiz-adv-x="2856.857" />
+<glyph glyph-name="mail" unicode="&#xf03b;" d="M0 640v-640h896V640H0zM768 576L448 312 128 576H768zM64 512l252.031-191.625L64 128V512zM128 64l254 206.25L448 220l65.875 50.125L768 64H128zM832 128L579.625 320.062 832 512V128z" horiz-adv-x="896" />
+<glyph glyph-name="mail-read" unicode="&#xf03c;" d="M576 448H256v-64h320V448zM384 576H256v-64h128V576zM768 603.469V704H627.188L448 832 268.812 704H128v-100.531L0 512v-640h896V512L768 603.469zM192 640h512v-244.812L448 184 192 395.188V640zM64 384l252.031-191.625L64 0V384zM128-64l254 206.25L448 92l65.875 50.125L768-64H128zM832 0L579.625 192.062 832 384V0z" horiz-adv-x="896" />
+<glyph glyph-name="mail-reply" unicode="&#xf051;" d="M384 672l-384-288 384-288v192c111 0 329-61 384-280 0 291-196 451-384 472v192z" horiz-adv-x="768" />
+<glyph glyph-name="mark-github" unicode="&#xf00a;" d="M512 832C229.25 832 0 602.75 0 320c0-226.25 146.688-418.125 350.156-485.812 25.594-4.688 34.938 11.125 34.938 24.625 0 12.188-0.469 52.562-0.719 95.312C242-76.81200000000001 211.906 14.5 211.906 14.5c-23.312 59.125-56.844 74.875-56.844 74.875-46.531 31.75 3.53 31.125 3.53 31.125 51.406-3.562 78.47-52.75 78.47-52.75 45.688-78.25 119.875-55.625 149-42.5 4.654 33 17.904 55.625 32.5 68.375C304.906 106.56200000000001 185.344 150.5 185.344 346.688c0 55.938 19.969 101.562 52.656 137.406-5.219 13-22.844 65.094 5.062 135.562 0 0 42.938 13.75 140.812-52.5 40.812 11.406 84.594 17.031 128.125 17.219 43.5-0.188 87.312-5.875 128.188-17.281 97.688 66.312 140.688 52.5 140.688 52.5 28-70.531 10.375-122.562 5.125-135.5 32.812-35.844 52.625-81.469 52.625-137.406 0-196.688-119.75-240-233.812-252.688 18.438-15.875 34.75-47 34.75-94.75 0-68.438-0.688-123.625-0.688-140.5 0-13.625 9.312-29.562 35.25-24.562C877.438-98 1024 93.875 1024 320 1024 602.75 794.75 832 512 832z" horiz-adv-x="1024" />
+<glyph glyph-name="markdown" unicode="&#xf0c9;" d="M950.154 640H73.846C33.127 640 0 606.873 0 566.154v-492.308C0 33.125 33.127 0 73.846 0h876.308c40.721 0 73.846 33.125 73.846 73.846V566.154C1024 606.873 990.875 640 950.154 640zM576 128.125L448 128V320l-96-123.077L256 320v-192H128V512h128l96-128 96 128 128 0.125V128.125zM767.091 96.125L608 320h96V512h128v-192h96L767.091 96.125z" horiz-adv-x="1024" />
+<glyph glyph-name="megaphone" unicode="&#xf077;" d="M832 800c-130 0-124-130-704-128C57.344 672 0 557.375 0 416s57.344-256 128-256c22.781 0 43.188-0.5 64.188-0.875L256-128l192-32 64 96-45.125 203.125C709.375 102.875 733.75 32 832 32c106 0 192 172 192 384C1024 628.031 938 800 832 800zM197 349.062c-39.188 1.469-82.188 2.25-127.562 2.625C66 371.406 64 393.094 64 416c0 88.375 28.688 192 64 192 39.031-0.125 75 0.438 109 1.406C209.656 562.438 192 493.688 192 416 192 392.688 194.062 370.562 197 349.062zM261.312 346.062C258.125 368.312 256 391.625 256 416c0 79.5 18.438 149.5 46.906 196.219 155.156 8.312 251.906 28.469 319.031 50.188C593.625 595.531 576 510.344 576 416c0-40 3.875-78 9.5-114.312C513.344 320.375 412.812 337.406 261.312 346.062zM832 128c-12.125 0-23.688 5.062-34.812 12.125-15.25 67.312-83.438 418.344 117.438 494.188C942.125 581.5 960 503.812 960 416 960 257 902.625 128 832 128z" horiz-adv-x="1024" />
+<glyph glyph-name="mention" unicode="&#xf0be;" d="M466.697 732.899C238.66 760.898 31.1 598.735 3.102 370.698c-28-228.038 134.163-435.598 362.2-463.597 71.429-8.756 145.115 0.913 213.325 29.946l-0.016 0.032c24.404 10.357 35.788 38.538 25.431 62.939-10.359 24.403-38.538 35.787-62.94 25.43l-0.001 0.004c-52.472-22.339-109.15-29.799-164.1-23.067-175.413 21.538-300.153 181.2-278.616 356.613 21.538 175.413 181.199 300.154 356.613 278.616 175.412-21.538 300.154-181.199 278.617-356.612-4.309-35.083-21.542-55.725-61.6-55.725-42.5 0-64 45.889-64 81.222V432c0 26.51-21.49 48-48 48-9.699 0-18.72-2.887-26.269-7.833-25.684 20.259-57.437 33.87-94.349 38.402-105.246 12.923-201.045-61.924-213.967-167.17C212.508 238.15200000000004 287.354 142.35400000000004 392.6 129.43200000000002c57.379-7.045 116.216 14.707 157.871 53.13 24.959-28.124 59.866-47.624 100.121-52.567 87.707-10.769 167.537 51.602 178.307 139.309C856.898 497.34 694.734 704.899 466.697 732.899zM511.285 308.30100000000004c-6.462-52.623-54.361-90.047-106.985-83.585-52.623 6.461-90.046 54.36-83.585 106.984 6.461 52.623 54.361 90.046 106.984 83.585C480.322 408.823 517.746 360.924 511.285 308.30100000000004z" horiz-adv-x="832" />
+<glyph glyph-name="microscope" unicode="&#xf089;" d="M617-64c86.312 18.75 151 100 151 192 0 58.438-26.625 110.125-67.875 145.375C702.5 288.625 704 304.125 704 320c0 104.844-49.875 197.875-128 256l64 64v64l64 64L640 832l-64-64h-64L256 512l-128-64v-128l64-64h128l64 128 96 96c55.5-33.406 96-90.438 96-160-106.062 0-192-85.938-192-192H0v-64h192c19.125-14.25 42.062-22.125 64-32v-96H128L0-192h768L640-64H617zM512 128c0 35.375 28.625 64 64 64s64-28.625 64-64c0-35.312-28.625-64-64-64S512 92.68799999999999 512 128z" horiz-adv-x="768" />
+<glyph glyph-name="milestone" unicode="&#xf075;" d="M704 640H0v-256h704l128 128L704 640zM448 448H320V576h128V448zM448 832H320v-128h128V832zM320-192h128V320H320V-192z" horiz-adv-x="832" />
+<glyph glyph-name="mirror" unicode="&#xf024;" d="M320 512L128 320l192-192V256h384v-128l192 192L704 512v-128H320V512zM512 832L0 512v-704l512 256 512-256V512L512 832zM960-64L576 128v64H448v-64L64-64V448l384 256v-256h128V704l384-256V-64z" horiz-adv-x="1024" />
+<glyph glyph-name="mortar-board" unicode="&#xf0d7;" d="M501 244l-245 76s0-96 0-160 115-96 256-96 256 32 256 96 0 160 0 160l-245-76c-7-2-15-2-23 0h1z m18 409c-4 1-9 1-13 0l-489-152c-21-7-21-36 0-43l111-35v-113c-19-11-32-32-32-55 0-12 3-23 9-32-5-9-9-20-9-32v-165c0-35 128-35 128 0v165c0 12-3 23-9 32 5 9 9 20 9 32 0 24-13 44-32 55v93l313-98c4-1 9-1 13 0l489 152c21 7 21 36 0 43l-488 153z m-6-205c-35 0-64 14-64 32s29 32 64 32 64-14 64-32-29-32-64-32z" horiz-adv-x="1024" />
+<glyph glyph-name="move-down" unicode="&#xf0a8;" d="M640 512H448V832H192v-320H0l320-384L640 512zM0-192h640V0H0V-192z" horiz-adv-x="640" />
+<glyph glyph-name="move-left" unicode="&#xf074;" d="M0 0h192V640H0V0zM704 448V640L320 320l384-320V192h320V448H704z" horiz-adv-x="1024" />
+<glyph glyph-name="move-right" unicode="&#xf0a9;" d="M832 640v-640h192V640H832zM320 448H0v-256h320v-192l384 320L320 640V448z" horiz-adv-x="1024" />
+<glyph glyph-name="move-up" unicode="&#xf0a7;" d="M0 128h192v-320h256V128h192L320 512 0 128zM0 832v-192h640V832H0z" horiz-adv-x="640" />
+<glyph glyph-name="mute" unicode="&#xf080;" d="M128 448H0v-256h128l256-192h64V640h-64L128 448zM864 416l-64 64-96-96-96 96-63-63.5 95-96.5-96-96 64-64 96 96 96-96 64 64-96 96L864 416z" horiz-adv-x="896" />
+<glyph glyph-name="no-newline" unicode="&#xf09c;" d="M896 512v-128H768V512L576 320l192-192V256h192c0 0 64 0.375 64 64s0 192 0 192H896zM224 544C100.281 544 0 443.719 0 320c0-123.75 100.281-224 224-224s224 100.25 224 224C448 443.719 347.719 544 224 544zM96 320c0 70.656 57.344 128 128 128 18.75 0 36.406-4.219 52.469-11.531L107.531 267.5C100.219 283.625 96 301.25 96 320zM224 192c-18.75 0-36.406 4.25-52.469 11.5l168.938 168.969C347.781 356.406 352 338.75 352 320 352 249.375 294.656 192 224 192z" horiz-adv-x="1024" />
+<glyph glyph-name="octoface" unicode="&#xf008;" d="M940.812 554.312c8.25 20.219 35.375 101.75-8.562 211.906 0 0-67.375 21.312-219.875-82.906C648.5 700.875 579.875 703.5 512 703.5c-67.906 0-136.438-2.625-200.5-20.25C159.031 787.531 91.719 766.219 91.719 766.219 47.812 656 74.938 574.531 83.188 554.312 31.5 498.438 0 427.125 0 339.656 0 10.437999999999988 213.25-64 510.844-64 808.562-64 1024 10.437999999999988 1024 339.656 1024 427.125 992.5 498.438 940.812 554.312zM512-1c-211.406 0-382.781 9.875-382.781 214.688 0 48.938 24.062 94.595 65.344 132.312 68.75 62.969 185.281 29.688 317.438 29.688 132.25 0 248.625 33.281 317.438-29.625 41.312-37.78 65.438-83.312 65.438-132.312C894.875 8.875 723.375-1 512-1zM351.156 319.562c-42.469 0-76.906-51.062-76.906-114.188s34.438-114.312 76.906-114.312c42.375 0 76.812 51.188 76.812 114.312S393.531 319.562 351.156 319.562zM672.875 319.562C630.5 319.562 596 268.5 596 205.375s34.5-114.312 76.875-114.312 76.812 51.188 76.812 114.312C749.75 268.5 715.312 319.562 672.875 319.562z" horiz-adv-x="1024" />
+<glyph glyph-name="organization" unicode="&#xf037;" d="M768 448h-64H576h-64-64-64-64H192h-64C57.344 448 0 390.656 0 320v-64c0-47.25 25.844-88.062 64-110.25V-64h256v-128h256V-64h256V145.75c38.125 22.188 64 62.938 64 110.25v64C896 390.656 838.625 448 768 448zM256 0H128V256H64v64c0 35.312 28.688 64 64 64h81.719c-11-18.875-17.719-40.562-17.719-64v-128c0-47.25 25.844-88.062 64-110.25V0zM576 128V256h-64v-384H384V256h-64v-128c-35.312 0-64 28.625-64 64V320c0 35.312 28.688 64 64 64h256c35.375 0 64-28.688 64-64v-128C640 156.625 611.375 128 576 128zM832 256h-64v-256H640v81.75c38.125 22.188 64 62.938 64 110.25V320c0 23.438-6.75 45.125-17.75 64H768c35.375 0 64-28.688 64-64V256zM303.688 514.625C338.875 474.125 390.156 448 448 448c57.875 0 109.125 26.125 144.312 66.625C614.125 475.062 655.688 448 704 448c70.625 0 128 57.344 128 128s-57.375 128-128 128c-25.625 0-49.375-7.688-69.375-20.688C614.875 768.438 539.062 832 448 832S281.094 768.438 261.375 683.312C241.344 696.312 217.594 704 192 704c-70.656 0-128-57.344-128-128s57.344-128 128-128C240.312 448 281.844 475.062 303.688 514.625zM704 640c35.375 0 64-28.594 64-64s-28.625-64-64-64c-35.312 0-64 28.594-64 64S668.688 640 704 640zM448 768c70.625 0 128-57.344 128-128s-57.375-128-128-128c-70.656 0-128 57.344-128 128S377.344 768 448 768zM192 512c-35.312 0-64 28.594-64 64s28.688 64 64 64c35.406 0 64-28.594 64-64S227.406 512 192 512z" horiz-adv-x="896" />
+<glyph glyph-name="package" unicode="&#xf0c4;" d="M480 768L0 640v-576l480-128 480 128V640L480 768zM63.875 111.06600000000003L63.5 544l384.498-102.533 0.001-432.833L63.875 111.06600000000003zM63.5 608l160.254 42.734L640 539.735v-0.135l-160-42.667L63.5 608zM896.125 111.06600000000003L512.001 8.634000000000015l0.001 432.833L640 475.6v-156l128 34.135V509.733L896.5 544 896.125 111.06600000000003zM768 573.733v0.125L351.734 684.862 480 719.066 896.5 608 768 573.733z" horiz-adv-x="1024" />
+<glyph glyph-name="paintcan" unicode="&#xf0d1;" d="M384 832C171.923 832 0 660.077 0 448v-64c0-35.346 28.654-64 64-64v-320c0-70.692 143.269-128 320-128s320 57.308 320 128V320c35.346 0 64 28.654 64 64v64C768 660.077 596.077 832 384 832zM576 192v-32c0-17.673-14.327-32-32-32s-32 14.327-32 32v32c0 17.673-14.327 32-32 32s-32-14.327-32-32v-160c0-17.673-14.327-32-32-32s-32 14.327-32 32V160c0 17.673-14.327 32-32 32s-32-14.327-32-32v-32c0-35.346-28.654-64-64-64s-64 28.654-64 64v64c-35.346 0-64 28.654-64 64V371.193C186.382 340.108 279.318 320 384 320s197.618 20.108 256 51.193V256C640 220.654 611.346 192 576 192zM384 384c-107.433 0-199.393 26.474-237.372 64 37.979 37.526 129.939 64 237.372 64s199.393-26.474 237.372-64C583.393 410.474 491.433 384 384 384zM384 576c-176.62 0-319.816-57.236-319.996-127.867-0.001 0.001-0.002 0.001-0.003 0.002C64.075 624.804 207.314 768 384 768c176.731 0 320-143.269 320-320C704 518.692 560.731 576 384 576z" horiz-adv-x="768" />
+<glyph glyph-name="pencil" unicode="&#xf058;" d="M704 768L576 640l192-192 128 128L704 768zM0 64l0.688-192.562L192-128l512 512L512 576 0 64zM192-64H64V64h64v-64h64V-64z" horiz-adv-x="896" />
+<glyph glyph-name="person" unicode="&#xf018;" d="M448 640C448 746 362.062 832 256 832S64 746 64 640c0-106.062 85.938-192 192-192S448 533.938 448 640zM256 512c-70.656 0-128 57.344-128 128S185.344 768 256 768c70.625 0 128-57.344 128-128S326.625 512 256 512zM384 448H256 128C57.344 448 0 390.656 0 320v-128c0-70.625 57.344-128 128-128v-256h256V64c70.625 0 128 57.375 128 128V320C512 390.656 454.625 448 384 448zM448 192c0-35.375-28.625-64-64-64V256h-64v-384H192V256h-64v-128c-35.312 0-64 28.625-64 64V320c0 35.312 28.688 64 64 64h256c35.375 0 64-28.688 64-64V192z" horiz-adv-x="512" />
+<glyph glyph-name="pin" unicode="&#xf041;" d="M196 128l64-320 64 320c-20-2-43-3-64-3s-44 1-64 3z m254 299c-33 17-62 59-62 85v64c0 22 12 39 23 52 15 13 24 29 24 45 0 53-61 95-175 95s-175-42-175-95c0-16 9-32 24-45 11-13 23-30 23-52v-64c0-26-29-68-62-85-38-19-70-54-70-88 0-74 101-148 260-148s260 73 260 148c0 33-31 68-70 88z" horiz-adv-x="519.657" />
+<glyph glyph-name="playback-fast-forward" unicode="&#xf0bd;" d="M0 64l384 256L0 576V64zM768 320L384 576v-256-256L768 320z" horiz-adv-x="768" />
+<glyph glyph-name="playback-pause" unicode="&#xf0bb;" d="M0 0h192V640H0V0zM320 640v-640h192V640H320z" horiz-adv-x="512" />
+<glyph glyph-name="playback-play" unicode="&#xf0bf;" d="M0 640l512-320L0 0V640z" horiz-adv-x="512" />
+<glyph glyph-name="playback-rewind" unicode="&#xf0bc;" d="M384 320l384-256V576L384 320zM0 320l384-256V320 576L0 320z" horiz-adv-x="768" />
+<glyph glyph-name="plug" unicode="&#xf0d4;" d="M1003.386 627.336l-0.905 0.905c-24.744 24.744-64.861 24.744-89.605 0l-45.707-45.707-90.51 90.51 45.707 45.707c24.744 24.744 24.744 64.861 0 89.605l-0.905 0.905c-24.744 24.744-64.861 24.744-89.605 0l-47.973-47.973C621.76 802.446 537.237 795.66 482.502 740.926l-24.89-24.89c-109.011-109.011-121.948-277.692-38.854-400.892l-4.138-4.138c-62.392-62.392-62.484-163.493-0.275-225.999 12.41-12.469 12.642-33.327 0.121-45.683-12.509-12.343-32.655-12.292-45.101 0.153l-89.427 89.427c-62.637 62.638-164.63 63.747-227.299 1.141-62.542-62.479-62.562-163.829-0.058-226.332l8.763-8.763c24.744-24.744 64.861-24.744 89.605 0l0.905 0.905c24.744 24.744 24.744 64.861 0 89.605l-8.292 8.292c-12.329 12.329-13.085 32.418-1.098 45.081 12.437 13.138 33.174 13.353 45.882 0.645l89.328-89.328c62.92-62.92 165.504-63.814 228.081-0.553 61.793 62.468 61.65 163.161-0.431 225.451-12.55 12.592-12.777 32.866-0.207 45.437l4.151 4.151c123.2-83.095 291.881-70.158 400.892 38.854l24.89 24.89c54.734 54.735 61.52 139.258 20.362 201.382l47.973 47.973C1028.129 562.475 1028.129 602.593 1003.386 627.336zM889.796 333.632c-37.49-37.49-98.274-37.49-135.765 0L527.757 559.906c-37.49 37.49-37.49 98.274 0 135.765 29.556 29.556 73.585 35.804 109.269 18.759l-41.839-41.839c-24.744-24.744-24.744-64.861 0-89.604l0.905-0.905c24.744-24.744 64.861-24.744 89.605 0l45.707 45.707 90.51-90.51-45.707-45.707c-24.744-24.744-24.744-64.861 0-89.605l0.905-0.905c24.744-24.744 64.861-24.744 89.604 0l41.839 41.839C925.6 407.218 919.351 363.188 889.796 333.632z" horiz-adv-x="1024" />
+<glyph glyph-name="plus" unicode="&#xf05d;" d="M384 384V640H256v-256H0v-128h256v-256h128V256h256V384H384z" horiz-adv-x="640" />
+<glyph glyph-name="podium" unicode="&#xf0af;" d="M320 832c-32 0-64-32-64-64s0-64 0-64h-64l-192-192v-128h192l64-384-128-64v-64h512v64l-128 64 64 384h192v128l-192 192h-256v64s14 0 32 0 32 17 32 32-16 32-32 32 0 0-32 0z m0-832l-53 320h118l-1-320h-64z m-224 512l128 128h32v-64h64v64h224l128-128h-576z" horiz-adv-x="768" />
+<glyph glyph-name="primitive-dot" unicode="&#xf052;" d="M-0.088 320c0 141.5 114.5 256 256 256 141.438 0 256-114.5 256-256s-114.562-256-256-256C114.413 64-0.088 178.5-0.088 320z" horiz-adv-x="511.825" />
+<glyph glyph-name="primitive-square" unicode="&#xf053;" d="M512 64H0V576h512V64z" horiz-adv-x="512" />
+<glyph glyph-name="pulse" unicode="&#xf085;" d="M736 320.062L563.188 486.406 422.406 288 352 729.594 152.438 320.062H0V192h230.406L288 307.188l57.594-345.562L576 288l102.375-96H896V320.062H736z" horiz-adv-x="896" />
+<glyph glyph-name="puzzle" unicode="&#xf0c0;" d="M755.75 256.85c-13.95 9.96-28.52 16.59-43.47 19.92-8.84 1.69-18.06 2.33-27.57 1.81-8.99-0.5-17.56-1.68-25.69-3.52-6.1-1.69-12.22-3.89-18.35-6.59-18.18-8.02-33.89-18.12-46.79-30.33-12.22-12.9-22.32-28.62-30.34-46.79-2.7-6.12-4.9-12.24-6.59-18.34-1.84-8.14-3.03-16.7-3.52-25.69-0.52-9.51 0.12-18.73 1.81-27.57 3.33-14.95 9.96-29.52 19.92-43.47 3.89-5.44 8.08-10.4 12.56-14.88 20.06-20.03 45.83-30.7 75.42-34.11 8.92-1.02 18.12-1.68 26.53-4.48 5.12-1.7 9.16-4.08 12.08-7.02 6.65-6.6 7.63-16.1 2.5-27.24-3.15-6.84-7.7-13.45-12.96-18.84l-2.79-2.86c-3.93-3.92-6.41-6.4-7.05-7.04-3.13-3.16-6.1-6.15-9.06-9.15l-2.96-2.92c-10.52-10.58-21.09-21.12-31.66-31.65-22.76-22.82-45.57-45.58-68.38-68.36-7.5-7.5-15-15-22.5-22.49-3.46-3.45-7.07-6.38-10.78-8.79-1.8-1.22-3.49-2.24-5.18-3.16-19.6-9.89-41.43-5.92-59.24 11.88-5.4 5.4-10.62 10.62-15.85 15.84-30.25 30.25-60.48 60.52-90.77 90.73-8.59 8.57-17.13 17.08-25.68 25.59-6.12 6.09-12.67 11.85-19.56 17.06-5.72 4.33-11.59 7.56-17.46 9.73-21.16 7.32-41.41 2.01-54.67-13.26-3.81-4.8-7-10.47-9.39-16.94-3.43-9.26-4.6-19.47-5.9-29.36-4.9-37.53-25.8-68.43-55.98-82.65-7.48-3.65-15.49-6.29-23.9-7.78-7.95-1.41-15.95-1.71-23.85-1.04-26.61 1.35-49.48 13.09-68.51 32.57-1.68 1.67-2.1 2.09-2.51 2.51-19.48 19.02-31.22 41.9-32.57 68.5-0.68 7.9-0.37 15.9 1.04 23.85 1.49 8.41 4.13 16.43 7.78 23.9 14.22 30.18 45.13 51.07 82.65 55.97 9.89 1.29 20.1 2.47 29.36 5.9 6.94 2.56 12.96 6.05 17.97 10.23 14.54 13.15 19.59 32.63 12.84 52.34-2.78 7.35-6 13.22-10.33 18.94-5.21 6.88-10.97 13.43-17.06 19.55-8.51 8.55-17.03 17.09-25.55 25.63-26.92 26.98-53.84 53.88-80.75 80.78l-10.03 10.03c-5.22 5.22-10.45 10.45-15.26 15.27-18.39 18.4-22.35 40.22-12.46 59.82 0.92 1.69 1.94 3.37 3.08 5.05 2.49 3.84 5.42 7.45 8.87 10.91 7.49 7.5 14.99 15 22.49 22.5 22.77 22.81 45.54 45.62 68.36 68.38 10.53 10.57 21.06 21.14 31.65 31.66l2.92 2.96c2.99 2.97 5.99 5.93 8.98 8.9 0.8 0.81 3.28 3.29 7.2 7.22l2.86 2.79c5.39 5.26 12 9.8 18.84 12.96 11.14 5.13 20.63 4.15 27.24-2.5 2.94-2.92 5.32-6.96 7.02-12.08 2.79-8.41 3.45-17.61 4.48-26.53 3.41-29.59 14.08-55.35 34.11-75.41 4.49-4.48 9.44-8.67 14.88-12.56 13.95-9.96 28.52-16.59 43.47-19.92 8.84-1.69 18.06-2.33 27.57-1.81 8.99 0.5 17.56 1.68 25.69 3.52 6.1 1.69 12.22 3.89 18.35 6.59 18.18 8.02 33.89 18.12 46.79 30.33 12.22 12.9 22.32 28.62 30.34 46.79 2.7 6.12 4.9 12.24 6.59 18.34 1.84 8.14 3.03 16.7 3.52 25.69 0.52 9.51-0.12 18.73-1.81 27.57-3.33 14.95-9.96 29.52-19.92 43.47-3.89 5.44-8.08 10.4-12.56 14.88-20.06 20.03-45.83 30.7-75.42 34.11-8.92 1.02-18.12 1.68-26.53 4.48-5.12 1.7-9.16 4.08-12.08 7.02-6.65 6.6-7.63 16.1-2.5 27.24 3.15 6.84 7.7 13.45 12.96 18.84l2.79 2.86c3.93 3.92 6.41 6.4 7.05 7.04 3.13 3.16 6.1 6.15 9.06 9.15l2.96 2.92c10.52 10.58 21.09 21.12 31.66 31.65 22.76 22.82 45.57 45.58 68.38 68.35 7.5 7.5 15 15 22.5 22.49 3.46 3.45 7.07 6.38 10.78 8.79 1.8 1.22 3.49 2.24 5.18 3.16 19.6 9.89 41.43 5.92 59.24-11.88 5.4-5.4 10.62-10.62 15.85-15.84 30.25-30.25 60.48-60.52 90.77-90.73 8.59-8.57 17.13-17.08 25.68-25.59 6.12-6.09 12.67-11.85 19.56-17.06 5.72-4.33 11.59-7.56 17.46-9.73 21.16-7.32 41.41-2.01 54.67 13.26 3.81 4.8 7 10.47 9.39 16.94 3.43 9.26 4.6 19.47 5.9 29.36 4.9 37.53 25.8 68.43 55.98 82.65 7.48 3.65 15.49 6.28 23.9 7.78 7.95 1.41 15.95 1.71 23.85 1.04 26.61-1.35 49.48-13.09 68.51-32.57 1.68-1.67 2.1-2.09 2.51-2.51 19.48-19.02 31.22-41.9 32.57-68.5 0.68-7.9 0.37-15.9-1.04-23.85-1.49-8.41-4.13-16.43-7.78-23.9-14.22-30.18-45.13-51.07-82.65-55.97-9.89-1.29-20.1-2.47-29.36-5.9-6.94-2.56-12.96-6.05-17.97-10.23-14.54-13.15-19.59-32.63-12.84-52.34 2.78-7.35 6-13.22 10.33-18.94 5.21-6.88 10.97-13.43 17.06-19.55 8.51-8.55 17.03-17.09 25.55-25.63 30.26-30.33 60.54-60.56 90.78-90.81 5.22-5.22 10.45-10.45 15.26-15.27 18.39-18.4 22.35-40.22 12.46-59.82-0.92-1.69-1.94-3.37-3.08-5.05-2.49-3.84-5.42-7.45-8.87-10.91-7.49-7.5-14.99-15-22.49-22.5-22.77-22.81-45.54-45.62-68.36-68.38-10.53-10.57-21.06-21.14-31.65-31.66l-2.92-2.96c-2.99-2.97-5.99-5.93-8.98-8.9-0.8-0.81-3.28-3.29-7.2-7.22l-2.86-2.79c-5.39-5.26-12-9.8-18.84-12.96-11.14-5.13-20.63-4.15-27.24 2.5-2.94 2.92-5.32 6.96-7.02 12.08-2.79 8.41-3.45 17.61-4.48 26.53-3.41 29.59-14.08 55.35-34.11 75.41C766.15 248.76999999999998 761.19 252.97000000000003 755.75 256.85z" horiz-adv-x="1024" />
+<glyph glyph-name="question" unicode="&#xf02c;" d="M448 64h128v128h-128v-128z m64 512c-96 0-192-96-192-192h128c0 32 32 64 64 64s64-32 64-64c0-64-128-64-128-128h128c64 22 128 64 128 160s-96 160-192 160z m0 256c-283 0-512-229-512-512s229-512 512-512 512 229 512 512-229 512-512 512z m0-896c-212 0-384 172-384 384s172 384 384 384 384-172 384-384-172-384-384-384z" horiz-adv-x="1024" />
+<glyph glyph-name="quote" unicode="&#xf063;" d="M0 320v-256h256V320H128c0 0 0 128 128 128V576C256 576 0 576 0 320zM640 448V576c0 0-256 0-256-256v-256h256V320H512C512 320 512 448 640 448z" horiz-adv-x="640" />
+<glyph glyph-name="radio-tower" unicode="&#xf030;" d="M306.838 441.261c15.868 16.306 15.868 42.731 0 59.037-20.521 21.116-30.643 48.417-30.705 76.124 0.062 27.77 10.183 55.039 30.705 76.186 15.868 16.337 15.868 42.764 0 59.069-7.934 8.184-18.272 12.275-28.706 12.275-10.371 0-20.804-4.029-28.738-12.213-36.266-37.297-54.633-86.433-54.57-135.317-0.062-48.792 18.305-97.927 54.57-135.161C265.262 424.955 290.97 424.955 306.838 441.261zM149.093 798.858c-8.121 8.309-18.68 12.463-29.3 12.463-10.558 0-21.179-4.154-29.237-12.463C30.8 737.509 0.751 656.856 0.813 576.422 0.751 496.081 30.8 415.272 90.494 353.985c16.181-16.618 42.356-16.618 58.537 0 16.118 16.587 16.118 43.513 0 60.067-43.7 44.98-65.44 103.456-65.44 162.368s21.74 117.449 65.44 162.368C165.149 755.439 165.149 782.365 149.093 798.858zM513.031 472.153c57.351 0 103.956 46.574 103.956 103.956 0 57.382-46.605 103.955-103.956 103.955-57.381 0-103.956-46.573-103.956-103.955C409.076 518.727 455.65 472.153 513.031 472.153zM933.539 798.233c-16.181 16.618-42.355 16.618-58.475 0-16.181-16.587-16.181-43.513 0-60.068 43.668-44.918 65.409-103.456 65.409-162.368 0-58.85-21.805-117.387-65.473-162.306-16.117-16.618-16.117-43.575 0.062-60.068 8.059-8.309 18.616-12.463 29.237-12.463 10.558 0 21.178 4.154 29.236 12.463 59.726 61.287 89.774 142.096 89.649 222.437C1023.313 656.138 993.264 736.947 933.539 798.233zM513.281 389.127L513.281 389.127c-26.489-0.062-53.04 6.466-77.091 19.429L235.057-127.59000000000003h95.209l54.819 63.973h255.891l53.977-63.973h95.272L589.124 408.431C565.384 395.655 539.395 389.127 513.281 389.127zM512.656 358.483L577.004 128.29999999999995H449.059L512.656 358.483zM385.086 0.3550000000000182l63.974 63.973h127.944l63.974-63.973H385.086zM717.194 710.958c-15.868-16.306-15.868-42.731 0-59.037 20.491-21.116 30.611-48.511 30.674-76.124-0.062-27.77-10.183-55.102-30.674-76.187-15.868-16.336-15.868-42.763 0-59.068 7.871-8.184 18.242-12.213 28.737-12.213 10.309 0 20.741 4.029 28.675 12.213 36.298 37.234 54.665 86.433 54.54 135.255 0.125 48.792-18.181 97.927-54.54 135.161C758.801 727.264 733.062 727.264 717.194 710.958z" horiz-adv-x="1024" />
+<glyph glyph-name="repo" unicode="&#xf001;" d="M320 576h-64v-64h64v64z m0 128h-64v-64h64v64z m384 128c-32 0-608 0-640 0s-64-32-64-64 0-736 0-768 32-64 64-64 128 0 128 0v-128l96 96 96-96v128s288 0 320 0 64 32 64 64 0 736 0 768-32 64-64 64z m0-800c0-16-15-32-32-32s-288 0-288 0v64h-192v-64s-79 0-96 0-32 17-32 32 0 96 0 96h640s0-80 0-96z m0 160h-512v576h513l-1-576z m-384 128h-64v-64h64v64z m0 128h-64v-64h64v64z" horiz-adv-x="768" />
+<glyph glyph-name="repo-clone" unicode="&#xf04c;" d="M320 448h-64v-64h64v64z m-128 320h256v64s-352 0-384 0-64-32-64-64 0-736 0-768 32-64 64-64 128 0 128 0v-128l96 96 96-96v128s286 0 320 0 64 32 64 64 0 192 0 192h-576v576z m512-640s0-79 0-96-14-32-32-32-288 0-288 0v64h-192v-64s-80 0-96 0-32 16-32 32 0 96 0 96h640z m-384 448h-64v-64h64v64z m-64-320h64v64h-64v-64z m704 576c-32 0-288 0-320 0s-64-32-64-64 0-352 0-384 32-64 64-64 64 0 64 0v-64l32 32 32-32v64s160 0 192 0 64 32 64 64 0 352 0 384-32 64-64 64z m-256-448s-15 0-32 0-32 15-32 32 0 32 0 32h64v-64z m256 32c0-16-15-32-32-32s-160 0-160 0v64h192s0-16 0-32z m0 96h-256v256h224s32 0 32-32 0-224 0-224z m-640 192h-64v-64h64v64z" horiz-adv-x="1024" />
+<glyph glyph-name="repo-force-push" unicode="&#xf04a;" d="M768 768c0 32-32 64-64 64s-608 0-640 0-64-32-64-64 0-768 0-768 0 32 0 0 32-64 64-64 128 0 128 0v-128l128 128v128h-128v-64s-79 0-96 0-32 15-32 32 0 96 0 96h256v64h-128v576h512v-576h-128v-64h128s0-80 0-96-15-32-32-32-96 0-96 0v-64s96 0 128 0 64 32 64 64 0 736 0 768z m-272-320h144l-192 256-192-256h144l-144-192h128v-448h128v448h128l-144 192z" horiz-adv-x="767.896" />
+<glyph glyph-name="repo-forked" unicode="&#xf002;" d="M768 704c0 71-57 128-128 128s-128-57-128-128c0-47 26-89 64-111v-106l-192-212-192 212v106c38 22 64 63 64 111 0 71-57 128-128 128s-128-57-128-128c0-47 26-89 64-111v-156l256-282v-109c-38-22-64-63-64-111 0-71 57-128 128-128s128 57 128 128c0 47-26 89-64 111v109l256 282v156c38 22 64 63 64 111z m-640 63c34 0 62-28 62-62s-28-62-62-62-62 28-62 62 28 62 62 62z m256-891c-34 0-62 28-62 62s28 62 62 62 62-28 62-62-28-62-62-62z m256 891c34 0 62-28 62-62s-28-62-62-62-62 28-62 62 28 62 62 62z" horiz-adv-x="768" />
+<glyph glyph-name="repo-pull" unicode="&#xf006;" d="M1024 512l-192 192v-128h-384v-128h384v-128l192 192z m-320-320h-512v576h512v-128h64s0 96 0 128-32 64-64 64-608 0-640 0-64-32-64-64 0-736 0-768 32-64 64-64 128 0 128 0v-128l96 96 96-96v128s288 0 320 0 64 32 64 64 0 384 0 384h-64v-192z m0-160c0-15-15-32-32-32s-288 0-288 0v64h-192v-64s-79 0-96 0-32 16-32 32 0 96 0 96h640s0-81 0-96z m-384 544h-64v-64h64v64z m0 128h-64v-64h64v64z m0-256h-64v-64h64v64z m-64-192h64v64h-64v-64z" horiz-adv-x="1024" />
+<glyph glyph-name="repo-push" unicode="&#xf005;" d="M448 512l-192-256h128v-448h128v448h128l-192 256z m-192 0h64v64h-64v-64z m64 192h-64v-64h64v64z m384 128c-32 0-608 0-640 0s-64-32-64-64 0-736 0-768 32-64 64-64 128 0 128 0v-128l128 128v128h-128v-64s-79 0-96 0-32 14-32 32 0 96 0 96h256v64h-128v576h513l-1-576h-128v-64h128s0-79 0-96-15-32-32-32-96 0-96 0v-64s96 0 128 0 64 32 64 64 0 736 0 768-32 64-64 64z" horiz-adv-x="768" />
+<glyph glyph-name="rocket" unicode="&#xf033;" d="M716.737 707.944c-71.926-41.686-148.041-96.13-218.436-166.555-45-45.031-81.213-88.78-110.39-129.778L209.538 378.65 0.047 169.00300000000004l186.818-5.815 131.562 131.562c-46.439-96.224-50.536-160.019-50.536-160.019l58.854-58.792c0 0 65.827 6.255 162.737 53.163L355.107-5.119000000000028l5.88-186.881 209.585 209.521 33.086 179.252c41.403 29.02 85.185 65.046 129.716 109.545 70.425 70.455 124.837 146.541 166.555 218.466-45.97 9.351-88.125 28.488-121.397 61.668C745.257 619.819 725.994 661.975 716.737 707.944zM786.161 745.157c5.004-45 19.952-81.274 44.78-105.98 24.769-24.985 60.98-39.902 106.138-44.844C1003.063 727.677 1023.953 832 1023.953 832S919.63 811.142 786.161 745.157z" horiz-adv-x="1024" />
+<glyph glyph-name="rss" unicode="&#xf034;" d="M128 192C57.344 192 0 134.625 0 64s57.344-128 128-128 128 57.375 128 128S198.656 192 128 192zM128 448c0 0-64-2-64-64s64-64 64-64c141.375 0 256-114.625 256-256 0 0 0-64 64-64s64 64 64 64C512 276 340.031 448 128 448zM128 704c0 0-64 0-64-64s64-64 64-64c282.75 0 512-229.25 512-512 0 0 0-64 64-64s64 64 64 64C768 417.406 481.5 704 128 704z" horiz-adv-x="768" />
+<glyph glyph-name="ruby" unicode="&#xf047;" d="M768 704H256L0 448l512-512 512 512L768 704zM128 448l192 192h384l192-192L512 64 128 448zM704 576H512v-448l320 320L704 576z" horiz-adv-x="1024" />
+<glyph glyph-name="screen-full" unicode="&#xf066;" d="M128 64h639.875V576H128V64zM255.938 448h384v-256h-384V448zM64 639.938h191.938v64H0V448h64V639.938zM64 192H0v-255.938h255.938V0H64V192zM639.938 703.938v-64h191.938V448h64V703.938H639.938zM831.875 0H639.938v-63.938h255.938V192h-64V0z" horiz-adv-x="895.875" />
+<glyph glyph-name="screen-normal" unicode="&#xf067;" d="M127.938 640.062H0v-64h191.938V768h-64V640.062zM0-0.06200000000001182h127.938V-128h64V63.93799999999999H0V-0.06200000000001182zM768.062 640.062V768h-64v-191.938H896v64H768.062zM704.062-128h64V-0.06200000000001182H896v64H704.062V-128zM192.062 128H704V512H192.062V128zM320 384h256v-128H320V384z" horiz-adv-x="896" />
+<glyph glyph-name="search" unicode="&#xf02e;" d="M960 0L710.875 249.125C746.438 307.188 768 374.844 768 448 768 660.031 596 832 384 832 171.969 832 0 660.031 0 448c0-212 171.969-384 384-384 73.156 0 140.812 21.562 198.875 57L832-128c17.5-17.5 46.5-17.375 64 0l64 64C977.5-46.5 977.5-17.5 960 0zM384 192c-141.375 0-256 114.625-256 256s114.625 256 256 256 256-114.625 256-256S525.375 192 384 192z" horiz-adv-x="973.125" />
+<glyph glyph-name="server" unicode="&#xf097;" d="M704 448h-640c-35 0-64-32-64-64v-128c0-32 32-64 64-64h640c32 0 64 32 64 64v128c0 32-32 64-64 64z m-576-192h-64v128h64v-128z m128 0h-64v128h64v-128z m128 0h-64v128h64v-128z m128 0h-64v128h64v-128z m192-128h-640c-35 0-64-32-64-64v-128c0-32 32-64 64-64h640c32 0 64 32 64 64v128c0 32-32 64-64 64z m-576-192h-64v128h64v-128z m128 0h-64v128h64v-128z m128 0h-64v128h64v-128z m128 0h-64v128h64v-128z m192 832h-640c-35 0-64-32-64-64v-128c0-32 32-64 64-64h640c32 0 64 32 64 64v128c0 32-32 64-64 64z m-576-192h-64v128h64v-128z m128 0h-64v128h64v-128z m128 0h-64v128h64v-128z m128 0h-64v128h64v-128z m192 64h-64v64h64v-64z" horiz-adv-x="768" />
+<glyph glyph-name="settings" unicode="&#xf07c;" d="M64-64h128V128H64V-64zM192 704H64v-320h128V704zM512 704H384v-128h128V704zM0 192h256V320H0V192zM384-64h128V320H384V-64zM320 384h256V512H320V384zM832 704H704v-384h128V704zM640 256v-128h256V256H640zM704-64h128V64H704V-64z" horiz-adv-x="896" />
+<glyph glyph-name="sign-in" unicode="&#xf036;" d="M640 256L640 384 896 384 896 512 640 512 640 640 448 496 448 640 192 768 704 768 704 576 768 576 768 832 64 832 64 0 448-192 448 0 768 0 768 320 704 320 704 64 448 64 448 400z" horiz-adv-x="896" />
+<glyph glyph-name="sign-out" unicode="&#xf032;" d="M640 64H384V640L128 768h512v-192h64V832H0v-832l384-192V0h320V320h-64V64zM1024 448L768 640v-128H512v-128h256v-128L1024 448z" horiz-adv-x="1024" />
+<glyph glyph-name="split" unicode="&#xf0c6;" d="M448 576l-256 256-192-192 311-300c15 81 43 136 133 230l5 6z m128 256l133-133-197-197c-99-99-128-162-128-309v-384h256v384c0 52 19 94 53 128l197 197 133-133v448h-448z" horiz-adv-x="1024" />
+<glyph glyph-name="squirrel" unicode="&#xf0b2;" d="M768 768c-141.385 0-256-83.75-256-186.875C512 457.25 544 387 512 192c0 288-177 405.783-256 405.783 3.266 32.17-30.955 42.217-30.955 42.217s-14-7.124-19.354-21.583c-17.231 20.053-36.154 17.54-36.154 17.54l-8.491-37.081c0 0-117.045-40.876-118.635-206.292C56 371 141.311 353.898 201.887 364.882c57.157-2.956 42.991-50.648 30.193-63.446C178.083 247.438 128 320 64 320s-64-64 0-64 64-64 192-64c-198-77 0-256 0-256h-64c-64 0-64-64-64-64s256 0 384 0c192 0 320 64 320 222.182 0 54.34-27.699 114.629-64 162.228C697.057 349.433 782.453 427.566 832 384s192-64 192 128C1024 653.385 909.385 768 768 768zM160 448c-17.674 0-32 14.327-32 32 0 17.674 14.326 32 32 32 17.673 0 32-14.326 32-32C192 462.327 177.673 448 160 448z" horiz-adv-x="1024" />
+<glyph glyph-name="star" unicode="&#xf02a;" d="M896 448l-313.5 40.781L448 768 313.469 488.781 0 448l230.469-208.875L171-63.93799999999999l277 148.812 277.062-148.812L665.5 239.125 896 448z" horiz-adv-x="896" />
+<glyph glyph-name="steps" unicode="&#xf0c7;" d="M136 768C60.89 768 0 667.71 0 544c0-68.83 17.02-141.84 34-254.54C47.3 201.16999999999996 79.67 128 136 128s94.08 48.79 94.08 137.97c0 30.37-24.97 78.75-26.08 120.03-2.02 74.46 49.93 104.17 49.93 173C253.93 682.71 211.1 768 136 768zM502.97 512c-75.1 0-117.93-85.29-117.93-209 0-68.83 51.95-98.54 49.93-173-1.109-41.28-26.08-89.66-26.08-120.03 0-89.18 37.75-137.97 94.08-137.97s88.7 73.17 102 161.46c16.98 112.7 34 185.71 34 254.54C638.97 411.71 578.08 512 502.97 512z" horiz-adv-x="640" />
+<glyph glyph-name="stop" unicode="&#xf08f;" d="M704 832H320L0 512v-384l320-320h384l320 320V512L704 832zM896 192L640-64H384L128 192V448l256 256h256l256-256V192zM448 256h128V576H448V256zM448 64h128V192H448V64z" horiz-adv-x="1024" />
+<glyph glyph-name="sync" unicode="&#xf087;" d="M655.461 358.531c11.875-81.719-13.062-167.781-76.812-230.594-94.188-92.938-239.5-104.375-346.375-34.562l74.875 73L31.96 204.75 70.367-64l84.031 80.5c150.907-111.25 364.938-100.75 502.063 34.562 79.5 78.438 115.75 182.562 111.25 285.312L655.461 358.531zM189.46 511.938c94.156 92.938 239.438 104.438 346.313 34.562l-75-72.969 275.188-38.406L697.586 704l-83.938-80.688C462.711 734.656 248.742 724.031 111.585 588.75 32.085 510.344-4.133 406.219 0.335 303.5l112.25-22.125C100.71 363.125 125.71 449.094 189.46 511.938z" horiz-adv-x="768.051" />
+<glyph glyph-name="tag" unicode="&#xf015;" d="M384 768H128L0 640v-256l512-512 384 384L384 768zM64 416V608l96 96h192l448-448L512-32 64 416zM448 512L256 320l256-256 192 192L448 512zM352 320l96 96 160-160-96-96L352 320zM320 544c0 53-43 96-96 96s-96-43-96-96 43-96 96-96S320 491 320 544zM224 512c-17.656 0-32 14.344-32 32s14.344 32 32 32 32-14.344 32-32S241.656 512 224 512z" horiz-adv-x="896" />
+<glyph glyph-name="telescope" unicode="&#xf088;" d="M76 409c32 8 229 59 229 59-1-6-2-19-2-19 0-71 49-128 128-128s128 59 128 128c0 11-8 22-19 32l49-3s7 2 31 8c-51-14-108 31-126 99s8 135 60 149c-24-6-31-8-31-8l-168-110c-34-9-55-46-46-80 2-9 7-17 12-23-7-12-12-26-15-40-27 1-51 19-59 46-9 34 11 69 45 78l-245-65c-34-9-54-43-45-77s41-54 73-46z m419-153h-128v-64l-320-320h128l192 128v-128h128v128l192-128h128l-320 320v64z m429 448c-18 68-70 110-122 96-69-18-98-28-186-51-51-14-79-80-61-148s74-115 125-102c87 23 117 33 186 51 51 14 76 85 58 154z m-70-90c-17-5-42 17-51 51s-4 66 13 70 42-17 51-51 4-66-13-70z" horiz-adv-x="929.875" />
+<glyph glyph-name="terminal" unicode="&#xf0c8;" d="M831 705H63c-35.35 0-64-28.65-64-64v-640c0-35.35 28.65-64 64-64h768c35.35 0 64 28.65 64 64V641C895 676.35 866.35 705 831 705zM127 257l128 128L127 513l64 64 192-192L191 193 127 257zM639 193H383v64h256V193z" horiz-adv-x="896" />
+<glyph glyph-name="three-bars" unicode="&#xf05e;" d="M0 640v-128h768v128h-768z m0-384h768v128h-768v-128z m0-256h768v128h-768v-128z" horiz-adv-x="768" />
+<glyph glyph-name="tools" unicode="&#xf031;" d="M286.547 366.984c16.843-16.812 81.716-85.279 81.716-85.279l35.968 37.093-56.373 58.248L456.072 491.98c0 0-48.842 47.623-27.468 28.655 20.438 75.903 1.812 160.589-55.842 220.243C315.608 800.064 234.392 819.47 161.425 799.096l123.653-127.715-32.53-125.309-121.06-33.438L7.898 640.3820000000001c-19.718-75.436-0.969-159.339 56.311-218.556C124.302 359.703 210.83 341.453 286.547 366.984zM698.815 242.769L549.694 95.46100000000001l245.932-254.805c20.062-20.812 46.498-31.188 72.872-31.188 26.25 0 52.624 10.375 72.811 31.188 40.249 41.624 40.249 108.997 0 150.62L698.815 242.769zM1023.681 670.162L867.06 832.001 405.387 354.703l56.373-58.248L185.425 10.839000000000055l-63.154-33.749-89.217-145.559 22.719-23.562 140.839 92.247 32.655 65.312 276.336 285.554 56.404-58.248L1023.681 670.162z" horiz-adv-x="1024" />
+<glyph glyph-name="trashcan" unicode="&#xf0d0;" d="M704 704H448c0 0 0 24.057 0 32 0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 0-32 0-32H128c-35.346 0-64-28.654-64-64v-64c0-35.346 28.654-64 64-64v-576c0-35.346 28.654-64 64-64h448c35.346 0 64 28.654 64 64V512c35.346 0 64 28.654 64 64v64C768 675.346 739.346 704 704 704zM640-32c0-17.673-14.327-32-32-32H224c-17.673 0-32 14.327-32 32V512h64v-480c0-17.673 14.327-32 32-32s32 14.327 32 32l0.387 480H384v-480c0-17.673 14.327-32 32-32s32 14.327 32 32l0.387 480h64L512 32c0-17.673 14.327-32 32-32s32 14.327 32 32V512h64V-32zM704 592c0-8.837-7.163-16-16-16H144c-8.837 0-16 7.163-16 16v32c0 8.837 7.163 16 16 16h544c8.837 0 16-7.163 16-16V592z" horiz-adv-x="768" />
+<glyph glyph-name="triangle-down" unicode="&#xf05b;" d="M0 448l383.75-383.75L767.5 448H0z" horiz-adv-x="767.5" />
+<glyph glyph-name="triangle-left" unicode="&#xf044;" d="M0 320.125l383.75-383.75v767.5L0 320.125z" horiz-adv-x="383.75" />
+<glyph glyph-name="triangle-right" unicode="&#xf05a;" d="M0.062 703.75L383.812 320 0.062-63.75V703.75z" horiz-adv-x="383.875" />
+<glyph glyph-name="triangle-up" unicode="&#xf0aa;" d="M383.75 576L0 192.25h767.5L383.75 576z" horiz-adv-x="767.5" />
+<glyph glyph-name="unfold" unicode="&#xf039;" d="M384 448h128V640h128L448 832 256 640h128V448zM576 576v-64h224L672 384H224L96 512h224v64H0v-63.999L160 352 0 192v-64h320v64H96l128 128h448l128-128H576v-64h320v64L736 352l160 160.001V576H576zM512 256H384v-192H256l192-192 192 192H512V256z" horiz-adv-x="896" />
+<glyph glyph-name="unmute" unicode="&#xf0ba;" d="M128 448H0v-256h128l256-192h64V640h-64L128 448zM538.51 410.51c-12.496 12.497-32.758 12.497-45.255 0-12.496-12.496-12.496-32.758 0-45.255 24.994-24.993 24.994-65.516 0-90.51-12.496-12.496-12.496-32.758 0-45.255 12.497-12.496 32.759-12.496 45.255 0C588.497 279.47900000000004 588.497 360.523 538.51 410.51zM629.02 501.019c-12.495 12.497-32.758 12.497-45.255 0-12.495-12.496-12.495-32.758 0-45.255 74.981-74.98 74.981-196.548 0-271.528-12.495-12.497-12.495-32.76 0-45.256 12.497-12.496 32.76-12.496 45.255 0C728.994 238.95399999999995 728.994 401.045 629.02 501.019zM719.529 591.529c-12.497 12.497-32.76 12.497-45.255 0-12.496-12.496-12.496-32.758 0-45.255 124.968-124.968 124.968-327.58 0-452.548-12.496-12.497-12.496-32.759 0-45.255 12.495-12.497 32.758-12.497 45.255 0C869.49 198.433 869.49 441.568 719.529 591.529z" horiz-adv-x="896" />
+<glyph glyph-name="versions" unicode="&#xf064;" d="M0 128h128v64H64V448h64v64H0V128zM384 640v-640h512V640H384zM768 128H512V512h256V128zM192 64h128v64h-64V512h64v64H192V64z" horiz-adv-x="896" />
+<glyph glyph-name="x" unicode="&#xf081;" d="M640 512L512 640 320 448 128 640 0 512l192-192L0 128l128-128 192 192 192-192 128 128L448 320 640 512z" horiz-adv-x="640" />
+<glyph glyph-name="zap" unicode="&#x26A1;" d="M640 384H384L576 832 0 256h256L64-192 640 384z" horiz-adv-x="640" />
+</font>
+</defs>
+</svg>
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/octicons.ttf b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.ttf
new file mode 100644
index 00000000..189ca281
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.ttf
Binary files differ
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/octicons.woff b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.woff
new file mode 100644
index 00000000..2b770e42
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/octicons.woff
Binary files differ
diff --git a/src/main/java/com/gitblit/wicket/resources/octicons/sprockets-octicons.scss b/src/main/java/com/gitblit/wicket/resources/octicons/sprockets-octicons.scss
new file mode 100644
index 00000000..0e518fc1
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/resources/octicons/sprockets-octicons.scss
@@ -0,0 +1,230 @@
+@font-face {
+ font-family: 'octicons';
+ src: font-url('octicons.eot?#iefix') format('embedded-opentype'),
+ font-url('octicons.woff') format('woff'),
+ font-url('octicons.ttf') format('truetype'),
+ font-url('octicons.svg#octicons') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+// .octicon is optimized for 16px.
+// .mega-octicon is optimized for 32px but can be used larger.
+.octicon, .mega-octicon {
+ font: normal normal normal 16px/1 octicons;
+ display: inline-block;
+ text-decoration: none;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.mega-octicon { font-size: 32px; }
+
+.octicon-alert:before { content: '\f02d'} /*  */
+.octicon-alignment-align:before { content: '\f08a'} /*  */
+.octicon-alignment-aligned-to:before { content: '\f08e'} /*  */
+.octicon-alignment-unalign:before { content: '\f08b'} /*  */
+.octicon-arrow-down:before { content: '\f03f'} /*  */
+.octicon-arrow-left:before { content: '\f040'} /*  */
+.octicon-arrow-right:before { content: '\f03e'} /*  */
+.octicon-arrow-small-down:before { content: '\f0a0'} /*  */
+.octicon-arrow-small-left:before { content: '\f0a1'} /*  */
+.octicon-arrow-small-right:before { content: '\f071'} /*  */
+.octicon-arrow-small-up:before { content: '\f09f'} /*  */
+.octicon-arrow-up:before { content: '\f03d'} /*  */
+.octicon-beer:before { content: '\f069'} /*  */
+.octicon-book:before { content: '\f007'} /*  */
+.octicon-bookmark:before { content: '\f07b'} /*  */
+.octicon-briefcase:before { content: '\f0d3'} /*  */
+.octicon-broadcast:before { content: '\f048'} /*  */
+.octicon-browser:before { content: '\f0c5'} /*  */
+.octicon-bug:before { content: '\f091'} /*  */
+.octicon-calendar:before { content: '\f068'} /*  */
+.octicon-check:before { content: '\f03a'} /*  */
+.octicon-checklist:before { content: '\f076'} /*  */
+.octicon-chevron-down:before { content: '\f0a3'} /*  */
+.octicon-chevron-left:before { content: '\f0a4'} /*  */
+.octicon-chevron-right:before { content: '\f078'} /*  */
+.octicon-chevron-up:before { content: '\f0a2'} /*  */
+.octicon-circle-slash:before { content: '\f084'} /*  */
+.octicon-circuit-board:before { content: '\f0d6'} /*  */
+.octicon-clippy:before { content: '\f035'} /*  */
+.octicon-clock:before { content: '\f046'} /*  */
+.octicon-cloud-download:before { content: '\f00b'} /*  */
+.octicon-cloud-upload:before { content: '\f00c'} /*  */
+.octicon-code:before { content: '\f05f'} /*  */
+.octicon-color-mode:before { content: '\f065'} /*  */
+.octicon-comment-add:before,
+.octicon-comment:before { content: '\f02b'} /*  */
+.octicon-comment-discussion:before { content: '\f04f'} /*  */
+.octicon-credit-card:before { content: '\f045'} /*  */
+.octicon-dash:before { content: '\f0ca'} /*  */
+.octicon-dashboard:before { content: '\f07d'} /*  */
+.octicon-database:before { content: '\f096'} /*  */
+.octicon-device-camera:before { content: '\f056'} /*  */
+.octicon-device-camera-video:before { content: '\f057'} /*  */
+.octicon-device-desktop:before { content: '\f27c'} /*  */
+.octicon-device-mobile:before { content: '\f038'} /*  */
+.octicon-diff:before { content: '\f04d'} /*  */
+.octicon-diff-added:before { content: '\f06b'} /*  */
+.octicon-diff-ignored:before { content: '\f099'} /*  */
+.octicon-diff-modified:before { content: '\f06d'} /*  */
+.octicon-diff-removed:before { content: '\f06c'} /*  */
+.octicon-diff-renamed:before { content: '\f06e'} /*  */
+.octicon-ellipsis:before { content: '\f09a'} /*  */
+.octicon-eye-unwatch:before,
+.octicon-eye-watch:before,
+.octicon-eye:before { content: '\f04e'} /*  */
+.octicon-file-binary:before { content: '\f094'} /*  */
+.octicon-file-code:before { content: '\f010'} /*  */
+.octicon-file-directory:before { content: '\f016'} /*  */
+.octicon-file-media:before { content: '\f012'} /*  */
+.octicon-file-pdf:before { content: '\f014'} /*  */
+.octicon-file-submodule:before { content: '\f017'} /*  */
+.octicon-file-symlink-directory:before { content: '\f0b1'} /*  */
+.octicon-file-symlink-file:before { content: '\f0b0'} /*  */
+.octicon-file-text:before { content: '\f011'} /*  */
+.octicon-file-zip:before { content: '\f013'} /*  */
+.octicon-flame:before { content: '\f0d2'} /*  */
+.octicon-fold:before { content: '\f0cc'} /*  */
+.octicon-gear:before { content: '\f02f'} /*  */
+.octicon-gift:before { content: '\f042'} /*  */
+.octicon-gist:before { content: '\f00e'} /*  */
+.octicon-gist-secret:before { content: '\f08c'} /*  */
+.octicon-git-branch-create:before,
+.octicon-git-branch-delete:before,
+.octicon-git-branch:before { content: '\f020'} /*  */
+.octicon-git-commit:before { content: '\f01f'} /*  */
+.octicon-git-compare:before { content: '\f0ac'} /*  */
+.octicon-git-merge:before { content: '\f023'} /*  */
+.octicon-git-pull-request-abandoned:before,
+.octicon-git-pull-request:before { content: '\f009'} /*  */
+.octicon-globe:before { content: '\f0b6'} /*  */
+.octicon-graph:before { content: '\f043'} /*  */
+.octicon-heart:before { content: '\2665'} /* ♥ */
+.octicon-history:before { content: '\f07e'} /*  */
+.octicon-home:before { content: '\f08d'} /*  */
+.octicon-horizontal-rule:before { content: '\f070'} /*  */
+.octicon-hourglass:before { content: '\f09e'} /*  */
+.octicon-hubot:before { content: '\f09d'} /*  */
+.octicon-inbox:before { content: '\f0cf'} /*  */
+.octicon-info:before { content: '\f059'} /*  */
+.octicon-issue-closed:before { content: '\f028'} /*  */
+.octicon-issue-opened:before { content: '\f026'} /*  */
+.octicon-issue-reopened:before { content: '\f027'} /*  */
+.octicon-jersey:before { content: '\f019'} /*  */
+.octicon-jump-down:before { content: '\f072'} /*  */
+.octicon-jump-left:before { content: '\f0a5'} /*  */
+.octicon-jump-right:before { content: '\f0a6'} /*  */
+.octicon-jump-up:before { content: '\f073'} /*  */
+.octicon-key:before { content: '\f049'} /*  */
+.octicon-keyboard:before { content: '\f00d'} /*  */
+.octicon-law:before { content: '\f0d8'} /* */
+.octicon-light-bulb:before { content: '\f000'} /*  */
+.octicon-link:before { content: '\f05c'} /*  */
+.octicon-link-external:before { content: '\f07f'} /*  */
+.octicon-list-ordered:before { content: '\f062'} /*  */
+.octicon-list-unordered:before { content: '\f061'} /*  */
+.octicon-location:before { content: '\f060'} /*  */
+.octicon-gist-private:before,
+.octicon-mirror-private:before,
+.octicon-git-fork-private:before,
+.octicon-lock:before { content: '\f06a'} /*  */
+.octicon-logo-github:before { content: '\f092'} /*  */
+.octicon-mail:before { content: '\f03b'} /*  */
+.octicon-mail-read:before { content: '\f03c'} /*  */
+.octicon-mail-reply:before { content: '\f051'} /*  */
+.octicon-mark-github:before { content: '\f00a'} /*  */
+.octicon-markdown:before { content: '\f0c9'} /*  */
+.octicon-megaphone:before { content: '\f077'} /*  */
+.octicon-mention:before { content: '\f0be'} /*  */
+.octicon-microscope:before { content: '\f089'} /*  */
+.octicon-milestone:before { content: '\f075'} /*  */
+.octicon-mirror-public:before,
+.octicon-mirror:before { content: '\f024'} /*  */
+.octicon-mortar-board:before { content: '\f0d7'} /* */
+.octicon-move-down:before { content: '\f0a8'} /*  */
+.octicon-move-left:before { content: '\f074'} /*  */
+.octicon-move-right:before { content: '\f0a9'} /*  */
+.octicon-move-up:before { content: '\f0a7'} /*  */
+.octicon-mute:before { content: '\f080'} /*  */
+.octicon-no-newline:before { content: '\f09c'} /*  */
+.octicon-octoface:before { content: '\f008'} /*  */
+.octicon-organization:before { content: '\f037'} /*  */
+.octicon-package:before { content: '\f0c4'} /*  */
+.octicon-paintcan:before { content: '\f0d1'} /*  */
+.octicon-pencil:before { content: '\f058'} /*  */
+.octicon-person-add:before,
+.octicon-person-follow:before,
+.octicon-person:before { content: '\f018'} /*  */
+.octicon-pin:before { content: '\f041'} /*  */
+.octicon-playback-fast-forward:before { content: '\f0bd'} /*  */
+.octicon-playback-pause:before { content: '\f0bb'} /*  */
+.octicon-playback-play:before { content: '\f0bf'} /*  */
+.octicon-playback-rewind:before { content: '\f0bc'} /*  */
+.octicon-plug:before { content: '\f0d4'} /*  */
+.octicon-repo-create:before,
+.octicon-gist-new:before,
+.octicon-file-directory-create:before,
+.octicon-file-add:before,
+.octicon-plus:before { content: '\f05d'} /*  */
+.octicon-podium:before { content: '\f0af'} /*  */
+.octicon-primitive-dot:before { content: '\f052'} /*  */
+.octicon-primitive-square:before { content: '\f053'} /*  */
+.octicon-pulse:before { content: '\f085'} /*  */
+.octicon-puzzle:before { content: '\f0c0'} /*  */
+.octicon-question:before { content: '\f02c'} /*  */
+.octicon-quote:before { content: '\f063'} /*  */
+.octicon-radio-tower:before { content: '\f030'} /*  */
+.octicon-repo-delete:before,
+.octicon-repo:before { content: '\f001'} /*  */
+.octicon-repo-clone:before { content: '\f04c'} /*  */
+.octicon-repo-force-push:before { content: '\f04a'} /*  */
+.octicon-gist-fork:before,
+.octicon-repo-forked:before { content: '\f002'} /*  */
+.octicon-repo-pull:before { content: '\f006'} /*  */
+.octicon-repo-push:before { content: '\f005'} /*  */
+.octicon-rocket:before { content: '\f033'} /*  */
+.octicon-rss:before { content: '\f034'} /*  */
+.octicon-ruby:before { content: '\f047'} /*  */
+.octicon-screen-full:before { content: '\f066'} /*  */
+.octicon-screen-normal:before { content: '\f067'} /*  */
+.octicon-search-save:before,
+.octicon-search:before { content: '\f02e'} /*  */
+.octicon-server:before { content: '\f097'} /*  */
+.octicon-settings:before { content: '\f07c'} /*  */
+.octicon-log-in:before,
+.octicon-sign-in:before { content: '\f036'} /*  */
+.octicon-log-out:before,
+.octicon-sign-out:before { content: '\f032'} /*  */
+.octicon-split:before { content: '\f0c6'} /*  */
+.octicon-squirrel:before { content: '\f0b2'} /*  */
+.octicon-star-add:before,
+.octicon-star-delete:before,
+.octicon-star:before { content: '\f02a'} /*  */
+.octicon-steps:before { content: '\f0c7'} /*  */
+.octicon-stop:before { content: '\f08f'} /*  */
+.octicon-repo-sync:before,
+.octicon-sync:before { content: '\f087'} /*  */
+.octicon-tag-remove:before,
+.octicon-tag-add:before,
+.octicon-tag:before { content: '\f015'} /*  */
+.octicon-telescope:before { content: '\f088'} /*  */
+.octicon-terminal:before { content: '\f0c8'} /*  */
+.octicon-three-bars:before { content: '\f05e'} /*  */
+.octicon-tools:before { content: '\f031'} /*  */
+.octicon-trashcan:before { content: '\f0d0'} /*  */
+.octicon-triangle-down:before { content: '\f05b'} /*  */
+.octicon-triangle-left:before { content: '\f044'} /*  */
+.octicon-triangle-right:before { content: '\f05a'} /*  */
+.octicon-triangle-up:before { content: '\f0aa'} /*  */
+.octicon-unfold:before { content: '\f039'} /*  */
+.octicon-unmute:before { content: '\f0ba'} /*  */
+.octicon-versions:before { content: '\f064'} /*  */
+.octicon-remove-close:before,
+.octicon-x:before { content: '\f081'} /*  */
+.octicon-zap:before { content: '\26A1'} /* ⚡ */
diff --git a/src/main/resources/pixel.png b/src/main/java/com/gitblit/wicket/resources/pixel.png
index 4d5f6df1..4d5f6df1 100644
--- a/src/main/resources/pixel.png
+++ b/src/main/java/com/gitblit/wicket/resources/pixel.png
Binary files differ
diff --git a/src/main/resources/rosette_16x16.png b/src/main/java/com/gitblit/wicket/resources/rosette_16x16.png
index 6dedc271..6dedc271 100644
--- a/src/main/resources/rosette_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/rosette_16x16.png
Binary files differ
diff --git a/src/main/resources/rosette_32x32.png b/src/main/java/com/gitblit/wicket/resources/rosette_32x32.png
index ecbcc0a6..ecbcc0a6 100644
--- a/src/main/resources/rosette_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/rosette_32x32.png
Binary files differ
diff --git a/src/main/resources/script_16x16.png b/src/main/java/com/gitblit/wicket/resources/script_16x16.png
index ec93a22f..ec93a22f 100644
--- a/src/main/resources/script_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/script_16x16.png
Binary files differ
diff --git a/src/main/resources/search-icon.png b/src/main/java/com/gitblit/wicket/resources/search-icon.png
index 90e8d2c6..90e8d2c6 100644
--- a/src/main/resources/search-icon.png
+++ b/src/main/java/com/gitblit/wicket/resources/search-icon.png
Binary files differ
diff --git a/src/main/resources/settings_16x16.png b/src/main/java/com/gitblit/wicket/resources/settings_16x16.png
index 1619e3de..1619e3de 100644
--- a/src/main/resources/settings_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/settings_16x16.png
Binary files differ
diff --git a/src/main/resources/settings_32x32.png b/src/main/java/com/gitblit/wicket/resources/settings_32x32.png
index 39af4be9..39af4be9 100644
--- a/src/main/resources/settings_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/settings_32x32.png
Binary files differ
diff --git a/src/main/resources/shield_16x16.png b/src/main/java/com/gitblit/wicket/resources/shield_16x16.png
index 4eb8031c..4eb8031c 100644
--- a/src/main/resources/shield_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/shield_16x16.png
Binary files differ
diff --git a/src/main/resources/smartgithg_32x32.png b/src/main/java/com/gitblit/wicket/resources/smartgithg_32x32.png
index e232791b..e232791b 100644
--- a/src/main/resources/smartgithg_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/smartgithg_32x32.png
Binary files differ
diff --git a/src/main/resources/sourcetree_32x32.png b/src/main/java/com/gitblit/wicket/resources/sourcetree_32x32.png
index a5dd96fb..a5dd96fb 100644
--- a/src/main/resources/sourcetree_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/sourcetree_32x32.png
Binary files differ
diff --git a/src/main/resources/sparkleshare_32x32.png b/src/main/java/com/gitblit/wicket/resources/sparkleshare_32x32.png
index 51afbe2c..51afbe2c 100644
--- a/src/main/resources/sparkleshare_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/sparkleshare_32x32.png
Binary files differ
diff --git a/src/main/resources/star_16x16.png b/src/main/java/com/gitblit/wicket/resources/star_16x16.png
index 883e4dec..883e4dec 100644
--- a/src/main/resources/star_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/star_16x16.png
Binary files differ
diff --git a/src/main/resources/star_32x32.png b/src/main/java/com/gitblit/wicket/resources/star_32x32.png
index 92865b19..92865b19 100644
--- a/src/main/resources/star_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/star_32x32.png
Binary files differ
diff --git a/src/main/resources/sub32.png b/src/main/java/com/gitblit/wicket/resources/sub32.png
index ebcfe13e..ebcfe13e 100644
--- a/src/main/resources/sub32.png
+++ b/src/main/java/com/gitblit/wicket/resources/sub32.png
Binary files differ
diff --git a/src/main/resources/tag_16x16.png b/src/main/java/com/gitblit/wicket/resources/tag_16x16.png
index 7e75cba0..7e75cba0 100644
--- a/src/main/resources/tag_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/tag_16x16.png
Binary files differ
diff --git a/src/main/resources/tortoise32.png b/src/main/java/com/gitblit/wicket/resources/tortoise32.png
index 40aa9786..40aa9786 100644
--- a/src/main/resources/tortoise32.png
+++ b/src/main/java/com/gitblit/wicket/resources/tortoise32.png
Binary files differ
diff --git a/src/main/resources/tower_32x32.png b/src/main/java/com/gitblit/wicket/resources/tower_32x32.png
index 4de46f2a..4de46f2a 100644
--- a/src/main/resources/tower_32x32.png
+++ b/src/main/java/com/gitblit/wicket/resources/tower_32x32.png
Binary files differ
diff --git a/src/main/resources/user_16x16.png b/src/main/java/com/gitblit/wicket/resources/user_16x16.png
index d5edd4d4..d5edd4d4 100644
--- a/src/main/resources/user_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/user_16x16.png
Binary files differ
diff --git a/src/main/resources/users_16x16.png b/src/main/java/com/gitblit/wicket/resources/users_16x16.png
index 247af645..247af645 100644
--- a/src/main/resources/users_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/users_16x16.png
Binary files differ
diff --git a/src/main/resources/vcard_16x16.png b/src/main/java/com/gitblit/wicket/resources/vcard_16x16.png
index b8a9fea4..b8a9fea4 100644
--- a/src/main/resources/vcard_16x16.png
+++ b/src/main/java/com/gitblit/wicket/resources/vcard_16x16.png
Binary files differ
diff --git a/src/main/resources/bootstrap/js/jquery.js b/src/main/resources/bootstrap/js/jquery.js
deleted file mode 100644
index 198b3ff0..00000000
--- a/src/main/resources/bootstrap/js/jquery.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file
diff --git a/src/test/config/test-users.conf b/src/test/config/test-users.conf
index 4361410c..dfb2e46a 100644
--- a/src/test/config/test-users.conf
+++ b/src/test/config/test-users.conf
@@ -1,3 +1,11 @@
+[user "TicketRefTest"]
+ password = admin
+ displayName = TicketRefTest
+ emailAddress = TicketRefTest@example.com
+ accountType = LOCAL
+ emailMeOnMyTicketChanges = true
+ role = "#none"
+ repository = RW+:ticketreferencetest.git
[user "admin"]
password = admin
cookie = dd94709528bb1c83d08f3088d4043f4742891f4f