CINXE.COM
toolforge-repos / fourohfour 路 GitLab
<!DOCTYPE html> <html class="gl-light ui-gray with-top-bar with-header " lang="en"> <head prefix="og: http://ogp.me/ns#"> <meta charset="utf-8"> <meta content="IE=edge" http-equiv="X-UA-Compatible"> <meta content="width=device-width, initial-scale=1" name="viewport"> <title>toolforge-repos / fourohfour 路 GitLab</title> <script nonce="6ku4zUAxGQaYrlBSvlV/fg=="> //<![CDATA[ window.gon={};gon.features={"removeMonitorMetrics":true,"explainCodeChat":false,"issueEmailParticipants":true,"editBranchRules":false,"pageSpecificStyles":false,"workItems":true,"workItemsBeta":false,"workItemsAlpha":false,"namespaceLevelWorkItems":false}; //]]> </script> <script nonce="6ku4zUAxGQaYrlBSvlV/fg=="> //<![CDATA[ var gl = window.gl || {}; gl.startup_calls = {"/toolforge-repos/fourohfour/-/refs/main/logs_tree/?format=json\u0026offset=0\u0026ref_type=heads":{},"/toolforge-repos/fourohfour/-/blob/main/README.md?format=json\u0026viewer=rich":{}}; gl.startup_graphql_calls = [{"query":"query pathLastCommit($projectPath: ID!, $path: String, $ref: String!, $refType: RefType) {\n project(fullPath: $projectPath) {\n __typename\n id\n repository {\n __typename\n paginatedTree(path: $path, ref: $ref, refType: $refType) {\n __typename\n nodes {\n __typename\n lastCommit {\n __typename\n id\n sha\n title\n titleHtml\n descriptionHtml\n message\n webPath\n authoredDate\n authorName\n authorGravatar\n author {\n __typename\n id\n name\n avatarUrl\n webPath\n }\n signature {\n __typename\n ... on GpgSignature {\n gpgKeyPrimaryKeyid\n verificationStatus\n }\n ... on X509Signature {\n verificationStatus\n x509Certificate {\n id\n subject\n subjectKeyIdentifier\n x509Issuer {\n id\n subject\n subjectKeyIdentifier\n }\n }\n }\n ... on SshSignature {\n verificationStatus\n keyFingerprintSha256\n }\n }\n pipelines(ref: $ref, first: 1) {\n __typename\n edges {\n __typename\n node {\n __typename\n id\n detailedStatus {\n __typename\n id\n detailsPath\n icon\n tooltip\n text\n group\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}\n","variables":{"projectPath":"toolforge-repos/fourohfour","ref":"main","path":""}}]; if (gl.startup_calls && window.fetch) { Object.keys(gl.startup_calls).forEach(apiCall => { gl.startup_calls[apiCall] = { fetchCall: fetch(apiCall, { // Emulate XHR for Rails AJAX request checks headers: { 'X-Requested-With': 'XMLHttpRequest' }, // fetch won鈥檛 send cookies in older browsers, unless you set the credentials init option. // We set to `same-origin` which is default value in modern browsers. // See https://github.com/whatwg/fetch/pull/585 for more information. credentials: 'same-origin' }) }; }); } if (gl.startup_graphql_calls && window.fetch) { const headers = {"X-CSRF-Token":"JSdOGuOc374d0o2L0eYRDFb3_8a3-B7HwAXMZoKdehYt6inZoua3umGRl_1gdnO8CzIkkCfG8g7TIk3s8FY5lQ","x-gitlab-feature-category":"groups_and_projects"}; const url = `https://gitlab.wikimedia.org/api/graphql` const opts = { method: "POST", headers: { "Content-Type": "application/json", ...headers, } }; gl.startup_graphql_calls = gl.startup_graphql_calls.map(call => ({ ...call, fetchCall: fetch(url, { ...opts, credentials: 'same-origin', body: JSON.stringify(call) }) })) } //]]> </script> <link href="https://gitlab.wikimedia.org/toolforge-repos/fourohfour" rel="canonical"> <link rel="stylesheet" href="/assets/application-487de60d9ab3205ffe87ebd3b4dad8a80e7fa602d5390d64849d67476445b683.css" /> <link rel="stylesheet" href="/assets/page_bundles/project-ae8d77068744c6462915a411c22add9bec8913b004cc5f255fe041e8bc15f7d2.css" /><link rel="stylesheet" href="/assets/page_bundles/tree-cbd647503ee10871208725ec59e7d967eb696a14f20623ad870223f433739228.css" /><link rel="stylesheet" href="/assets/page_bundles/commit_description-065c52911d70ac846b47cc0f64e7a6e0d3daadd0cd34f5788259712569dc0dc3.css" /><link rel="stylesheet" href="/assets/page_bundles/projects-358b5dc804263e0dd1daa21dc5ca36c8cc2ad2cd149f3ec69bb44718ac5e6e43.css" /><link rel="stylesheet" href="/assets/page_bundles/work_items-1a645abe79ac6548485568d8d034b67a35f8417ffba26e5da4b581e79dff7ba7.css" /> <link rel="stylesheet" href="/assets/application_utilities-be9c243fb45936837f5df8f56b584844abb57127eb153b72a5f74f5fdfcf6388.css" /> <link rel="stylesheet" href="/assets/tailwind-c4a59d85bb930bf2e7ecc96190d540b832d994119d6a38a97cb684ad82e28053.css" /> <link rel="stylesheet" href="/assets/fonts-fae5d3f79948bd85f18b6513a025f863b19636e85b09a1492907eb4b1bb0557b.css" /> <link rel="stylesheet" href="/assets/highlight/themes/white-1285cce1be88ce2ec9caaa6f50ee58d75ce1412f0c5b019194f2477139509e18.css" /> <link rel="preload" href="/assets/application_utilities-be9c243fb45936837f5df8f56b584844abb57127eb153b72a5f74f5fdfcf6388.css" as="style" type="text/css" nonce="H1fEOG+7II3fIqkrbKo1/Q=="> <link rel="preload" href="/assets/application-487de60d9ab3205ffe87ebd3b4dad8a80e7fa602d5390d64849d67476445b683.css" as="style" type="text/css" nonce="H1fEOG+7II3fIqkrbKo1/Q=="> <link rel="preload" href="/assets/highlight/themes/white-1285cce1be88ce2ec9caaa6f50ee58d75ce1412f0c5b019194f2477139509e18.css" as="style" type="text/css" nonce="H1fEOG+7II3fIqkrbKo1/Q=="> <script src="/assets/webpack/runtime.aa3289d3.bundle.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/main.3c711c2b.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/graphql.e1f11a07.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.admin.abuse_reports.show-pages.dashboard.issues-pages.dashboard.milestones.show-pages.-0be646db.f2b9e702.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.admin.abuse_reports.show-pages.dashboard.issues-pages.groups.boards-pages.groups.issue-9703a78b.4e2b4f67.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.admin.abuse_reports.show-pages.dashboard.issues-pages.groups.boards-pages.groups.issue-b7fd6ac6.2cc0562b.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.groups.new-pages.import.gitlab_projects.new-pages.import.manifest.new-pages.projects.n-44c6c18e.1642148b.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.search.show-super_sidebar.9facb163.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/super_sidebar.6613e4a8.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.admin.runners.show-pages.clusters.agents.dashboard-pages.dashboard.groups.index-pages.-03de76a8.411f5d91.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.blob.show-pages.projects.branches.new-pages.projects.commits.show-pages.proje-81161c0b.5de26e81.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.blob.show-pages.projects.show-pages.projects.snippets.show-pages.projects.tre-c684fcf6.ef16e963.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.groups.details-pages.groups.show-pages.profiles.notifications.show-pages.projects.home-289c4da9.3d68ed61.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.blame.show-pages.projects.blame.streaming-pages.projects.blob.show-pages.proj-9f3d272f.ca3488ff.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.branches.index-pages.projects.show-pages.projects.tags.index-pages.projects.tree.show.e0d0b6e5.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.blob.show-pages.projects.forks.new-pages.projects.show-pages.projects.tree.show.2526842c.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.blob.show-pages.projects.show-pages.projects.tree.show.0650db6c.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.groups.show-pages.projects.home_panel-pages.projects.show.47168a2d.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.show-pages.projects.tree.show.af0af7fc.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/commons-pages.projects.home_panel-pages.projects.show.f4c62f01.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <script src="/assets/webpack/pages.projects.show.6427e798.chunk.js" defer="defer" nonce="6ku4zUAxGQaYrlBSvlV/fg=="></script> <meta content="object" property="og:type"> <meta content="GitLab" property="og:site_name"> <meta content="toolforge-repos / fourohfour 路 GitLab" property="og:title"> <meta content="A 404 Not Found (and other error page) handler for Toolforge" property="og:description"> <meta content="https://gitlab.wikimedia.org/assets/twitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" property="og:image"> <meta content="64" property="og:image:width"> <meta content="64" property="og:image:height"> <meta content="https://gitlab.wikimedia.org/toolforge-repos/fourohfour" property="og:url"> <meta content="summary" property="twitter:card"> <meta content="toolforge-repos / fourohfour 路 GitLab" property="twitter:title"> <meta content="A 404 Not Found (and other error page) handler for Toolforge" property="twitter:description"> <meta content="https://gitlab.wikimedia.org/assets/twitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" property="twitter:image"> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="bTVPJJpHtXkUl0Od7IMqSGorns8lRr6Z7G0R7xHVoddl-Cjn2z3dfWjUWetdE0j4N-5FmbV4UlD_SpBlYx7iVA" /> <meta name="csp-nonce" content="6ku4zUAxGQaYrlBSvlV/fg==" /> <meta name="action-cable-url" content="/-/cable" /> <link href="/-/manifest.json" rel="manifest"> <link rel="icon" type="image/png" href="/uploads/-/system/appearance/favicon/1/favicon.png" id="favicon" data-original-href="/uploads/-/system/appearance/favicon/1/favicon.png" /> <link rel="apple-touch-icon" type="image/x-icon" href="/assets/apple-touch-icon-b049d4bc0dd9626f31db825d61880737befc7835982586d015bded10b4435460.png" /> <link href="/search/opensearch.xml" rel="search" title="Search GitLab" type="application/opensearchdescription+xml"> <link rel="alternate" type="application/atom+xml" title="fourohfour activity" href="/toolforge-repos/fourohfour.atom" /> <meta content="A 404 Not Found (and other error page) handler for Toolforge" name="description"> <meta content="#28272d" name="theme-color"> </head> <body class="tab-width-8 gl-browser-ie gl-platform-windows" data-find-file="/toolforge-repos/fourohfour/-/find_file/main?ref_type=heads" data-group="toolforge-repos" data-group-full-path="toolforge-repos" data-namespace-id="688" data-page="projects:show" data-page-type-id="fourohfour" data-project="fourohfour" data-project-full-path="toolforge-repos/fourohfour" data-project-id="641"> <script nonce="6ku4zUAxGQaYrlBSvlV/fg=="> //<![CDATA[ gl = window.gl || {}; gl.client = {"isIe":true,"isWindows":true}; //]]> </script> <header class="header-logged-out" data-testid="navbar"> <a class="gl-sr-only gl-accessibility" href="#content-body">Skip to content</a> <div class="container-fluid"> <nav aria-label="Explore GitLab" class="header-logged-out-nav gl-display-flex gl-gap-3 gl-justify-content-space-between"> <div class="gl-display-flex gl-align-items-center gl-gap-1"> <span class="gl-sr-only">GitLab</span> <a title="Homepage" id="logo" class="header-logged-out-logo has-tooltip" aria-label="Homepage" href="/"><img class="brand-header-logo lazy" alt="" data-src="/uploads/-/system/appearance/header_logo/1/header_logo_small.svg" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" /> </a></div> <ul class="gl-list-none gl-p-0 gl-m-0 gl-display-flex gl-gap-3 gl-align-items-center gl-flex-grow-1"> <li class="header-logged-out-nav-item"> <a class="" href="/explore">Explore</a> </li> </ul> <ul class="gl-list-none gl-p-0 gl-m-0 gl-display-flex gl-gap-3 gl-align-items-center gl-justify-content-end"> <li class="header-logged-out-nav-item"> <a href="/users/sign_in?redirect_to_referer=yes">Sign in</a> </li> </ul> </nav> </div> </header> <div class="layout-page page-with-super-sidebar"> <aside class="js-super-sidebar super-sidebar super-sidebar-loading" data-command-palette="{"project_files_url":"/toolforge-repos/fourohfour/-/files/main?format=json","project_blob_url":"/toolforge-repos/fourohfour/-/blob/main"}" data-force-desktop-expanded-sidebar="" data-root-path="/" data-sidebar="{"is_logged_in":false,"context_switcher_links":[{"title":"Explore","link":"/explore","icon":"compass"}],"current_menu_items":[{"id":"project_overview","title":"fourohfour","icon":null,"avatar":null,"entity_id":641,"link":"/toolforge-repos/fourohfour","pill_count":null,"link_classes":"shortcuts-project","is_active":true},{"id":"manage_menu","title":"Manage","icon":"users","avatar":null,"avatar_shape":"rect","entity_id":null,"link":"/toolforge-repos/fourohfour/activity","is_active":false,"pill_count":null,"items":[{"id":"activity","title":"Activity","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/activity","pill_count":null,"link_classes":"shortcuts-project-activity","is_active":false},{"id":"members","title":"Members","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/project_members","pill_count":null,"link_classes":null,"is_active":false},{"id":"labels","title":"Labels","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/labels","pill_count":null,"link_classes":null,"is_active":false}],"separated":false},{"id":"plan_menu","title":"Plan","icon":"planning","avatar":null,"avatar_shape":"rect","entity_id":null,"link":"https://phabricator.wikimedia.org/","is_active":false,"pill_count":null,"items":[{"id":"external_issue_tracker","title":"Phorge","icon":null,"avatar":null,"entity_id":null,"link":"https://phabricator.wikimedia.org/","pill_count":null,"link_classes":"shortcuts-external_tracker","is_active":false}],"separated":false},{"id":"code_menu","title":"Code","icon":"code","avatar":null,"avatar_shape":"rect","entity_id":null,"link":"/toolforge-repos/fourohfour/-/merge_requests","is_active":false,"pill_count":null,"items":[{"id":"project_merge_request_list","title":"Merge requests","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/merge_requests","pill_count":"1","link_classes":"shortcuts-merge_requests","is_active":false},{"id":"files","title":"Repository","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/tree/main","pill_count":null,"link_classes":"shortcuts-tree","is_active":false},{"id":"branches","title":"Branches","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/branches","pill_count":null,"link_classes":null,"is_active":false},{"id":"commits","title":"Commits","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/commits/main?ref_type=heads","pill_count":null,"link_classes":"shortcuts-commits","is_active":false},{"id":"tags","title":"Tags","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/tags","pill_count":null,"link_classes":null,"is_active":false},{"id":"graphs","title":"Repository graph","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/network/main?ref_type=heads","pill_count":null,"link_classes":"shortcuts-network","is_active":false},{"id":"compare","title":"Compare revisions","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/compare?from=main\u0026to=main","pill_count":null,"link_classes":null,"is_active":false}],"separated":false},{"id":"build_menu","title":"Build","icon":"rocket","avatar":null,"avatar_shape":"rect","entity_id":null,"link":"/toolforge-repos/fourohfour/-/pipelines","is_active":false,"pill_count":null,"items":[{"id":"pipelines","title":"Pipelines","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/pipelines","pill_count":null,"link_classes":"shortcuts-pipelines","is_active":false},{"id":"jobs","title":"Jobs","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/jobs","pill_count":null,"link_classes":"shortcuts-builds","is_active":false},{"id":"pipeline_schedules","title":"Pipeline schedules","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/pipeline_schedules","pill_count":null,"link_classes":"shortcuts-builds","is_active":false},{"id":"artifacts","title":"Artifacts","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/artifacts","pill_count":null,"link_classes":"shortcuts-builds","is_active":false}],"separated":false},{"id":"deploy_menu","title":"Deploy","icon":"deployments","avatar":null,"avatar_shape":"rect","entity_id":null,"link":"/toolforge-repos/fourohfour/-/releases","is_active":false,"pill_count":null,"items":[{"id":"releases","title":"Releases","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/releases","pill_count":null,"link_classes":"shortcuts-deployments-releases","is_active":false},{"id":"packages_registry","title":"Package Registry","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/packages","pill_count":null,"link_classes":"shortcuts-container-registry","is_active":false}],"separated":false},{"id":"operations_menu","title":"Operate","icon":"cloud-pod","avatar":null,"avatar_shape":"rect","entity_id":null,"link":"/toolforge-repos/fourohfour/-/environments","is_active":false,"pill_count":null,"items":[{"id":"environments","title":"Environments","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/environments","pill_count":null,"link_classes":"shortcuts-environments","is_active":false},{"id":"infrastructure_registry","title":"Terraform modules","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/terraform_module_registry","pill_count":null,"link_classes":null,"is_active":false}],"separated":false},{"id":"analyze_menu","title":"Analyze","icon":"chart","avatar":null,"avatar_shape":"rect","entity_id":null,"link":"/toolforge-repos/fourohfour/-/value_stream_analytics","is_active":false,"pill_count":null,"items":[{"id":"cycle_analytics","title":"Value stream analytics","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/value_stream_analytics","pill_count":null,"link_classes":"shortcuts-project-cycle-analytics","is_active":false},{"id":"contributors","title":"Contributor analytics","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/graphs/main?ref_type=heads","pill_count":null,"link_classes":null,"is_active":false},{"id":"ci_cd_analytics","title":"CI/CD analytics","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/pipelines/charts","pill_count":null,"link_classes":null,"is_active":false},{"id":"repository_analytics","title":"Repository analytics","icon":null,"avatar":null,"entity_id":null,"link":"/toolforge-repos/fourohfour/-/graphs/main/charts","pill_count":null,"link_classes":"shortcuts-repository-charts","is_active":false}],"separated":false}],"current_context_header":"Project","support_path":"https://about.gitlab.com/get-help/","docs_path":"/help/docs","display_whats_new":false,"show_version_check":null,"search":{"search_path":"/search","issues_path":"/dashboard/issues","mr_path":"/dashboard/merge_requests","autocomplete_path":"/search/autocomplete","settings_path":"/search/settings","search_context":{"group":{"id":688,"name":"toolforge-repos","full_name":"toolforge-repos"},"group_metadata":{"issues_path":"/groups/toolforge-repos/-/issues","mr_path":"/groups/toolforge-repos/-/merge_requests"},"project":{"id":641,"name":"fourohfour"},"project_metadata":{"mr_path":"/toolforge-repos/fourohfour/-/merge_requests"},"code_search":true,"ref":"main","scope":null,"for_snippets":null}},"panel_type":"project","shortcut_links":[{"title":"Snippets","href":"/explore/snippets","css_class":"dashboard-shortcuts-snippets"},{"title":"Groups","href":"/explore/groups","css_class":"dashboard-shortcuts-groups"},{"title":"Projects","href":"/explore/projects/starred","css_class":"dashboard-shortcuts-projects"}]}"></aside> <div class="content-wrapper"> <div class="alert-wrapper gl-force-block-formatting-context"> <div class="gl-alert gl-alert-danger gl-alert-not-dismissible" role="alert"> <div class="gl-alert-icon-container"> <svg class="s16 gl-alert-icon gl-alert-icon-no-title" data-testid="error-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#error"></use></svg> </div> <div class="gl-alert-content" role="alert"> <div class="gl-alert-body"> GitLab may not work properly, because you are using an outdated web browser. <br> Please install a <a target="_blank" rel="noopener noreferrer" href="/help/install/requirements#supported-web-browsers">supported web browser</a> for a better experience. </div> </div> </div> <div class="gl-broadcast-message broadcast-banner-message banner js-broadcast-notification-17 indigo" data-broadcast-banner data-testid="banner-broadcast-message" role="alert"> <div class="gl-broadcast-message-content"> <div class="gl-broadcast-message-icon"> <svg class="s16" data-testid="bullhorn-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#bullhorn"></use></svg> </div> <div class="gl-broadcast-message-text"> <h2 class="gl-sr-only">Admin message</h2> <p><strong><a href="https://www.mediawiki.org/wiki/GitLab/Workflows/Registering_an_account_on_GitLab" rel="nofollow noreferrer noopener" target="_blank">How to register an account on GitLab</a></strong>. Due to spam, new accounts are locked until approved by an admin or <a href="https://wikitech.wikimedia.org/wiki/Tool:Gitlab-account-approval" rel="nofollow noreferrer noopener" target="_blank">the approver bot</a>. Your GitLab account gets automatically approved within one hour if you are a member of <a href="https://gerrit.wikimedia.org/r/admin/groups/2021f25e7515187a81d51f8fe14dd6f25617cce0,members" rel="nofollow noreferrer noopener" target="_blank">Trusted Contributors in Gerrit</a>, or a member of the <a href="https://phabricator.wikimedia.org/tag/trusted-contributors/" rel="nofollow noreferrer noopener" target="_blank">Trusted-Contributors group in Phabricator</a> and <a href="https://phabricator.wikimedia.org/settings/panel/external/" rel="nofollow noreferrer noopener" target="_blank">linked your Developer account to your Phabricator account</a>. If none of these apply, you can <a href="https://phabricator.wikimedia.org/maniphest/task/edit/form/117/" rel="nofollow noreferrer noopener" target="_blank">file an unlock request</a> to expedite access.</p> </div> </div> <button class="gl-button btn btn-icon btn-sm btn-default btn-default-tertiary gl-close-btn-color-inherit gl-broadcast-message-dismiss js-dismiss-current-broadcast-notification" aria-label="Close" data-id="17" data-expire-date="2029-05-15T22:01:45Z" data-cookie-key="hide_broadcast_message_17" type="button"><svg class="s16 gl-icon gl-button-icon gl-text-white" data-testid="close-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#close"></use></svg> </button> </div> <div class="gl-broadcast-message broadcast-banner-message banner js-broadcast-notification-37 light-indigo" data-broadcast-banner data-testid="banner-broadcast-message" role="alert"> <div class="gl-broadcast-message-content"> <div class="gl-broadcast-message-icon"> <svg class="s16" data-testid="bullhorn-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#bullhorn"></use></svg> </div> <div class="gl-broadcast-message-text"> <h2 class="gl-sr-only">Admin message</h2> <p><strong>Support:</strong> <a href="https://www.mediawiki.org/wiki/GitLab" rel="nofollow noreferrer noopener" target="_blank">mw:GitLab</a>, <a href="https://www.mediawiki.org/wiki/GitLab/Hosting_a_project_on_GitLab" rel="nofollow noreferrer noopener" target="_blank">how to host a project on GitLab</a>, <a href="https://web.libera.chat/?channel=#wikimedia-gitlab" rel="nofollow noreferrer noopener" target="_blank">#wikimedia-gitlab</a> on libera.chat, <a href="https://phabricator.wikimedia.org/tag/gitlab/" rel="nofollow noreferrer noopener" target="_blank">#GitLab</a> on Phabricator.</p> </div> </div> <button class="gl-button btn btn-icon btn-sm btn-default btn-default-tertiary gl-close-btn-color-inherit gl-broadcast-message-dismiss js-dismiss-current-broadcast-notification" aria-label="Close" data-id="37" data-expire-date="2029-03-26T23:42:40Z" data-cookie-key="hide_broadcast_message_37" type="button"><svg class="s16 gl-icon gl-button-icon gl-text-white" data-testid="close-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#close"></use></svg> </button> </div> <div class="top-bar-fixed container-fluid" data-testid="top-bar"> <div class="top-bar-container gl-display-flex gl-align-items-center gl-gap-2"> <button class="gl-button btn btn-icon btn-md btn-default btn-default-tertiary js-super-sidebar-toggle-expand super-sidebar-toggle -gl-ml-3" aria-controls="super-sidebar" aria-expanded="false" aria-label="Primary navigation sidebar" type="button"><svg class="s16 gl-icon gl-button-icon " data-testid="sidebar-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#sidebar"></use></svg> </button> <script type="application/ld+json"> {"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"toolforge-repos","item":"https://gitlab.wikimedia.org/toolforge-repos"},{"@type":"ListItem","position":2,"name":"fourohfour","item":"https://gitlab.wikimedia.org/toolforge-repos/fourohfour"}]} </script> <div data-testid="breadcrumb-links" id="js-vue-page-breadcrumbs-wrapper"> <div data-breadcrumbs-json="[{"text":"toolforge-repos","href":"/toolforge-repos","avatarPath":"/uploads/-/system/group/avatar/688/180px-Toolforge_logo.png"},{"text":"fourohfour","href":"/toolforge-repos/fourohfour","avatarPath":null}]" id="js-vue-page-breadcrumbs"></div> <div id="js-injected-page-breadcrumbs"></div> </div> <div id="js-work-item-feedback"></div> </div> </div> </div> <div class="container-fluid container-limited project-highlight-puc"> <main class="content" id="content-body" itemscope itemtype="http://schema.org/SoftwareSourceCode"> <div class="flash-container flash-container-page sticky" data-testid="flash-container"> <div id="js-global-alerts"></div> </div> <header class="project-home-panel js-show-on-project-root gl-mt-5"> <div class="gl-display-flex gl-justify-content-space-between gl-flex-wrap gl-flex-direction-column gl-md-flex-direction-row gl-gap-5"> <div class="home-panel-title-row gl-display-flex gl-align-items-center"> <div alt="fourohfour" class="gl-avatar gl-avatar-s48 gl-align-self-start gl-flex-shrink-0 gl-mr-3 gl-rounded-base! gl-avatar-identicon gl-avatar-identicon-bg5" itemprop="image"> F </div> <h1 class="home-panel-title gl-heading-1 gl-flex gl-items-center gl-flex-wrap gl-gap-3 gl-break-anywhere gl-mb-0" data-testid="project-name-content" itemprop="name"> fourohfour <span class="has-tooltip visibility-icon gl-inline-flex gl-text-secondary" data-container="body" data-placement="top" title="Public - The project can be accessed without any authentication."><svg class="s16 icon" data-testid="earth-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#earth"></use></svg></span> </h1> </div> <div data-can-read-project="true" data-id="641" data-is-group="false" data-is-project-archived="false" data-is-project-empty="false" data-project-id="641" data-project-name="fourohfour" data-project-visibility-level="public" data-sign-in-path="/users/sign_in?redirect_to_referer=yes" data-star-count="2" data-starred="false" data-starrers-path="/toolforge-repos/fourohfour/-/starrers" id="js-home-panel"></div> </div> </header> <div class="project-page-indicator js-show-on-project-root"></div> <div class="project-page-layout"> <div class="project-page-layout-sidebar js-show-on-project-root gl-mt-5"> <aside class="project-page-sidebar" data-testid="project-page-sidebar"> <div class="project-page-sidebar-block home-panel-home-desc gl-py-4 gl-border-b gl-border-gray-50 gl-pt-2!"> <h2 class="gl-font-base gl-font-bold gl-leading-reset gl-text-gray-900 gl-m-0 gl-mb-1">Project information</h2> <div class="home-panel-description gl-break-words"> <div class="home-panel-description-markdown read-more-container" data-read-more-height="320" itemprop="description"> <div class="read-more-content read-more-content--has-scrim"> <p data-sourcepos="1:1-1:60" dir="auto">A 404 Not Found (and other error page) handler for Toolforge</p> </div> <div class="js-read-more-trigger gl-hidden gl-w-full gl-h-8 gl-absolute gl-bottom-0 gl-z-2 gl-bg-default"> <button aria-label="Expand project information" type="button" class="gl-button btn btn-md btn-link "><span class="gl-button-text"> <svg class="s14" data-testid="chevron-down-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#chevron-down"></use></svg> Read more </span> </button></div> </div> </div> <div class="gl-mb-5"> <div class="gl-w-full gl-inline-flex gl-flex-wrap gl-font-base gl-font-normal gl-align-items-center -gl-mx-2 -gl-my-2" data-testid="project_topic_list"> <a class="gl-p-2" href="/explore/projects/topics/toolforge" itemprop="keywords"> <span class="gl-badge badge badge-pill badge-muted"><span class="gl-badge-content">toolforge</span></span> </a> </div> </div> <div class="gl-mb-2 gl-mb-4!"> <div class="progress repository-languages-bar js-show-on-project-root"><div class="progress-bar has-tooltip" style="width: 50.13%; background-color:#e34c26" data-html="true" title="<span class="repository-language-bar-tooltip-language">HTML</span>&nbsp;<span class="repository-language-bar-tooltip-share">50.1%</span>"></div><div class="progress-bar has-tooltip" style="width: 47.58%; background-color:#3572A5" data-html="true" title="<span class="repository-language-bar-tooltip-language">Python</span>&nbsp;<span class="repository-language-bar-tooltip-share">47.6%</span>"></div><div class="progress-bar has-tooltip" style="width: 2.29%; background-color:#a52a22" data-html="true" title="<span class="repository-language-bar-tooltip-language">Jinja</span>&nbsp;<span class="repository-language-bar-tooltip-share">2.3%</span>"></div></div> </div> <div class="project-badges gl-mb-2" data-testid="project-badges-content"> <a class="gl-mr-3" data-qa-link-url="https://gitlab.wikimedia.org/toolforge-repos/fourohfour/-/commits/main" data-testid="badge-image-link" href="https://gitlab.wikimedia.org/toolforge-repos/fourohfour/-/commits/main" rel="noopener noreferrer" target="_blank"><img alt="Project badge" aria-hidden class="project-badge" src="https://gitlab.wikimedia.org/toolforge-repos/fourohfour/badges/main/pipeline.svg?ignore_skipped=true"></a><a class="gl-mr-3" data-qa-link-url="https://gitlab.wikimedia.org/toolforge-repos/fourohfour/-/releases" data-testid="badge-image-link" href="https://gitlab.wikimedia.org/toolforge-repos/fourohfour/-/releases" rel="noopener noreferrer" target="_blank"><img alt="Project badge" aria-hidden class="project-badge" src="https://gitlab.wikimedia.org/toolforge-repos/fourohfour/-/badges/release.svg?order_by=release_at"></a></div> </div> <div class="project-page-sidebar-block gl-py-4 gl-border-b gl-border-gray-50"> <nav class="project-stats"> <ul class="nav gl-gap-y-2 gl-gap-x-5"> <li class="nav-item"> <a class="nav-link gl-display-flex gl-align-items-center stat-link gl-px-0! gl-pb-2!" href="/toolforge-repos/fourohfour/-/commits/main"><svg class="s16 icon gl-mr-3 gl-text-gray-500" data-testid="commit-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#commit"></use></svg><strong class="project-stat-value">78</strong> Commits</a> </li> <li class="nav-item"> <a class="nav-link gl-display-flex gl-align-items-center stat-link gl-px-0! gl-pb-2!" href="/toolforge-repos/fourohfour/-/branches"><svg class="s16 icon gl-mr-3 gl-text-gray-500" data-testid="branch-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#branch"></use></svg><strong class="project-stat-value">2</strong> Branches</a> </li> <li class="nav-item"> <a class="nav-link gl-display-flex gl-align-items-center stat-link gl-px-0! gl-pb-2!" href="/toolforge-repos/fourohfour/-/tags"><svg class="s16 icon gl-mr-3 gl-text-gray-500" data-testid="label-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#label"></use></svg><strong class="project-stat-value">0</strong> Tags</a> </li> </ul> </nav> </div> <div class="project-page-sidebar-block gl-py-4 gl-border-b gl-border-gray-50"> <div class="project-buttons gl-mb-2 js-show-on-project-root" data-testid="project-buttons"> <ul class="nav gl-gap-y-2 gl-gap-x-5"> <li class="nav-item"> <a class="nav-link gl-display-flex gl-align-items-center stat-link gl-px-0! gl-pb-2! btn-default" href="/toolforge-repos/fourohfour/-/blob/main/README.md"><svg class="s16 icon gl-mr-3 gl-text-gray-500" data-testid="doc-text-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#doc-text"></use></svg>README</a> </li> <li class="nav-item"> <a class="nav-link gl-display-flex gl-align-items-center stat-link gl-px-0! gl-pb-2! btn-default" itemprop="license" href="/toolforge-repos/fourohfour/-/blob/main/COPYING"><svg class="s16 icon gl-mr-3 gl-text-gray-500" data-testid="scale-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#scale"></use></svg><span class="project-stat-value">GNU General Public License v3.0 or later</span></a> </li> </ul> </div> </div> <div class="project-page-sidebar-block gl-py-4"> <p class="gl-font-bold gl-text-gray-900 gl-m-0 gl-mb-1">Created on</p> <span>September 07, 2022</span> </div> </aside> </div> <div class="project-page-layout-content"> <div class="project-show-files"> <div class="tree-holder clearfix js-per-page gl-mt-5" data-blame-per-page="1000" id="tree-holder"> <div class="nav-block gl-display-flex gl-flex-direction-column gl-sm-flex-direction-row gl-align-items-stretch"> <div class="tree-ref-container gl-display-flex gl-flex-wrap gl-gap-2 mb-2 mb-md-0"> <div class="tree-ref-holder gl-max-w-26" data-testid="ref-dropdown-container"> <div data-project-id="641" data-project-root-path="/toolforge-repos/fourohfour" data-ref-type="heads" id="js-tree-ref-switcher"></div> </div> <div data-can-collaborate="false" data-can-edit-tree="false" data-can-push-code="false" data-new-blob-path="/toolforge-repos/fourohfour/-/new/main" data-new-branch-path="/toolforge-repos/fourohfour/-/branches/new" data-new-dir-path="/toolforge-repos/fourohfour/-/create_dir/main" data-new-tag-path="/toolforge-repos/fourohfour/-/tags/new" data-upload-path="/toolforge-repos/fourohfour/-/create/main" id="js-repo-breadcrumb"></div> </div> <div id="js-blob-controls"></div> <div class="tree-controls"> <div class="gl-display-flex gl-flex-wrap gl-gap-3 gl-mb-3 gl-sm-mb-0"> <div data-history-link="/toolforge-repos/fourohfour/-/commits/main" id="js-tree-history-link"></div> <button class="gl-button btn btn-md btn-default has-tooltip shortcuts-find-file" title="Go to file, press <kbd class='flat ml-1' aria-hidden=true>/~</kbd> or <kbd class='flat ml-1' aria-hidden=true>t</kbd>" aria-keyshortcuts="/+~ t" data-html="true" data-event-tracking="click_find_file_button_on_repository_pages" type="button"><span class="gl-button-text"> Find file </span> </button> <div class="gl-display-inline-block" data-css-classes="gl-w-full gl-sm-w-auto" data-options="{"project_path":"toolforge-repos/fourohfour","ref":"main","is_fork":false,"needs_to_fork":true,"gitpod_enabled":false,"is_blob":false,"show_edit_button":false,"show_web_ide_button":false,"show_gitpod_button":false,"show_pipeline_editor_button":false,"web_ide_url":"/-/ide/project/toolforge-repos/fourohfour/edit/main","edit_url":"","pipeline_editor_url":"/toolforge-repos/fourohfour/-/ci/editor?branch_name=main","gitpod_url":"","user_preferences_gitpod_path":"/-/profile/preferences#user_gitpod_enabled","user_profile_enable_gitpod_path":"/-/user_settings/profile?user%5Bgitpod_enabled%5D=true","fork_path":"/toolforge-repos/fourohfour/-/forks/new","fork_modal_id":null}" data-web-ide-promo-popover-img="/assets/web-ide-promo-popover-9e59939b3b450a7ea385a520971151abb09ddad46141c333d6dcc783b9b91522.svg" id="js-tree-web-ide-link"></div> <div class="project-code-holder gl-hidden sm:gl-inline-block"> <div class="git-clone-holder js-git-clone-holder"> <div data-directory-download-links="[{"text":"zip","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.zip"},{"text":"tar.gz","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.tar.gz"},{"text":"tar.bz2","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.tar.bz2"},{"text":"tar","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.tar"}]" data-http-url="https://gitlab.wikimedia.org/toolforge-repos/fourohfour.git" data-ssh-url="git@gitlab.wikimedia.org:toolforge-repos/fourohfour.git" data-xcode-url="" id="js-code-dropdown"></div> </div> </div> </div> <div class="project-code-holder gl-display-flex gl-gap-3 sm:!gl-hidden"> <div class="js-source-code-dropdown" data-css-class="" data-download-artifacts="[]" data-download-links="[{"text":"zip","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.zip"},{"text":"tar.gz","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.tar.gz"},{"text":"tar.bz2","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.tar.bz2"},{"text":"tar","path":"/toolforge-repos/fourohfour/-/archive/main/fourohfour-main.tar"}]"></div> <div class="btn-group mobile-git-clone js-mobile-git-clone btn-block"> <button class="gl-button btn btn-md btn-confirm clone-dropdown-btn js-clone-dropdown-label" title="Copy" aria-label="Copy" aria-live="polite" data-toggle="tooltip" data-placement="bottom" data-container="body" data-html="true" data-button-text="Copy HTTPS clone URL" data-size="medium" data-category="primary" data-variant="confirm" data-hide-button-icon="true" data-clipboard-text="https://gitlab.wikimedia.org/toolforge-repos/fourohfour.git" type="button"><span class="gl-button-text"> Copy HTTPS clone URL </span> </button> <button class="btn gl-button btn-confirm dropdown-toggle js-dropdown-toggle flex-grow-0 d-flex-center w-auto ml-0" data-toggle="dropdown" type="button"> <svg class="s16 dropdown-btn-icon icon" data-testid="chevron-down-icon"><use href="/assets/icons-454317f5123bdb93dcb695c6092c458fb0ec6c862d0a56857aefa1c73469f743.svg#chevron-down"></use></svg> </button> <ul class="dropdown-menu dropdown-menu-selectable dropdown-menu-right clone-options-dropdown" data-dropdown> <li class="js-clone-links"> <a class="copy ssh clone url-selector is-active" href="git@gitlab.wikimedia.org:toolforge-repos/fourohfour.git" data-clone-type="ssh"><strong class="dropdown-menu-inner-title">Copy SSH clone URL</strong><span class="dropdown-menu-inner-content">git@gitlab.wikimedia.org:toolforge-repos/fourohfour.git</span></a> </li> <li class="js-clone-links"> <a class="copy https clone url-selector " href="https://gitlab.wikimedia.org/toolforge-repos/fourohfour.git" data-clone-type="http"><strong class="dropdown-menu-inner-title">Copy HTTPS clone URL</strong><span class="dropdown-menu-inner-content">https://gitlab.wikimedia.org/toolforge-repos/fourohfour.git</span></a> </li> </ul> </div> </div> </div> </div> <div class="info-well gl-hidden sm:gl-flex project-last-commit gl-flex-direction-column gl-mt-5"> <div class="gl-m-auto" data-ref-type="heads" id="js-last-commit"> <div class="gl-spinner-container" role="status"><span aria-label="Loading" class="gl-spinner gl-spinner-md gl-spinner-dark !gl-align-text-bottom"></span></div> </div> </div> <div data-escaped-ref="main" data-full-name="toolforge-repos / fourohfour" data-project-path="toolforge-repos/fourohfour" data-project-short-path="fourohfour" data-ref="main" data-ref-type="heads" id="js-tree-list"></div> </div> </div> </div> </div> </main> </div> </div> </div> <script nonce="6ku4zUAxGQaYrlBSvlV/fg=="> //<![CDATA[ if ('loading' in HTMLImageElement.prototype) { document.querySelectorAll('img.lazy').forEach(img => { img.loading = 'lazy'; let imgUrl = img.dataset.src; // Only adding width + height for avatars for now if (imgUrl.indexOf('/avatar/') > -1 && imgUrl.indexOf('?') === -1) { const targetWidth = img.getAttribute('width') || img.width; imgUrl += `?width=${targetWidth}`; } img.src = imgUrl; img.removeAttribute('data-src'); img.classList.remove('lazy'); img.classList.add('js-lazy-loaded'); img.dataset.testid = 'js-lazy-loaded-content'; }); } //]]> </script> <script nonce="6ku4zUAxGQaYrlBSvlV/fg=="> //<![CDATA[ gl = window.gl || {}; gl.experiments = {}; //]]> </script> </body> </html>