+ {{ name }} +
++ {{ description }} +
++ {{ $formatNumber(downloads) }} downloads +
++ {{ $formatNumber(follows) }} followers +
++ Your new collection will be created as a public collection with + {{ projectIds.length > 0 ? projectIds.length : 'no' }} + {{ projectIds.length !== 1 ? 'projects' : 'project' }}. +
+New projects are created as drafts and can be found under your profile page.
+You are done moderating this project! There are {{ futureProjects.length }} left.
++ Enter your moderation message here. Remember to check the Moderation tab to answer any + questions an author might have! +
+All permissions obtained. You may skip this step!
+All permission checks complete!
+ +What is the approval type of {{ modPackData[modPackIndex].file_name }}?
++ What is the approval type of {{ modPackData[modPackIndex].title }} ({{ modPackData[modPackIndex].url }}? +
++ Does this project provide identification and permission for + {{ modPackData[modPackIndex].file_name }}? +
++ Does this project provide attribution for + {{ modPackData[modPackIndex].file_name }}? +
++ Does this project provide proof of permission for + {{ modPackData[modPackIndex].file_name }}? +
++ Title: {{ project.title }} +
+Slug: {{ project.slug }}
++ Summary: {{ project.description }} +
+
+
+ Issues:
+ {{ project.issues_url }}
+
+
+ Source:
+ {{ project.source_url }}
+
+
+ Wiki:
+ {{ project.wiki_url }}
+
+
+ Discord:
+ {{ project.discord_url }}
+
+
+
+ {{ donation.platform }}:
+ {{ donation.url }}
+
+
+
+ Categories:
+
+ Client side: {{ project.client_side }}
+ Server side: {{ project.server_side }}
+
+ Organizations can be found under your profile page. You will be set as its owner, but you + can invite other members and transfer ownership at any time. +
++ {{ description }} +
++ {{ $formatNumber(downloads) }} downloads +
++ {{ $formatNumber(follows) }} followers +
++ You've been invited be a member of this project with the role of '{{ currentMember.role }}'. +
+You don't have any active reports.
+ + diff --git a/apps/knossos/components/ui/search/Categories.vue b/apps/knossos/components/ui/search/Categories.vue new file mode 100644 index 000000000..d72b8c3aa --- /dev/null +++ b/apps/knossos/components/ui/search/Categories.vue @@ -0,0 +1,69 @@ + +This thread is closed and new messages cannot be sent to it.
+ + + +{{ error.message }}
+ ++ {{ organization.name }} +
+
+ {{ member.name }}
+
+ {{ member.role }} +
++ {{ item.description }} +
+
+ Your project has been approved by the moderators and you may freely change project
+ visibility in
+
+ Modrinth's team of content moderators work hard to review all submitted projects. + Typically, you can expect a new project to be reviewed within 24 to 48 hours. Please keep + in mind that larger projects, especially modpacks, may require more time to review. + Certain holidays or events may also lead to delays depending on moderator availability. + Modrinth's moderators will leave a message below if they have any questions or concerns + for you. +
++ If your review has taken more than 48 hours, check our + + support article on review times + + for moderation delays. +
+
+ Your project does not currently meet Modrinth's
+
+
+ This is a private conversation thread with the Modrinth moderators. They may message you + with issues concerning this project. This thread is only checked when you submit your + project for review. For additional inquiries, contact + Modrinth support. +
++ This page shows you the analytics for your project, {{ project.title }}. You can see the number of downloads, page views and revenue earned for your project, as + well as the total downloads and page views for {{ project.title }} by country. +
++ Removes your project from Modrinth's servers and search. Clicking on this will delete your + project, so be extra careful! +
+ +{{ member.name }}
+{{ member.role }}
+
+ This project is managed by {{ props.organization.name }}. The defaults for member
+ permissions are set in the
+
+ This project is not managed by an organization. If you are the member of any organizations, + you can transfer management to one of them. +
+{{ member.user.username }}
+{{ member.role }}
++ Accurate tagging is important to help people find your + {{ $formatProjectType(project.project_type).toLowerCase() }}. Make sure to select all tags + that apply. +
++ Please upload a version first in order to select tags! +
+ + ++ Select at least one category in order to feature a category. +
++ Package your data pack as a mod. This will create a new version with support for the + selected mod loaders. You will be redirected to the new version and can edit it to your + liking. +
+
+
+ + Modrinth makes it easy to manage all your mods in one place. You can install, uninstall, + and update mods with a single click. +
++ Build, share, and play modpacks with any of the thousands of mods and modpacks hosted + here on Modrinth. +
++ The Modrinth App performs better than many of the leading mod managers, using just 150mb + of RAM! +
++ The Modrinth App is fully integrated with the website, so you can access all your + favorite projects from the app! +
++ Import all your favorite profiles from the launcher you were using before, and get + started with the Modrinth App in seconds! +
+
+
+ + {{ error.data.error }}: + {{ error.data.description }} +
+
+
+ {{ formatMessage(methodChoiceMessages.description) }} +
+ +{{ formatMessage(postChallengeMessages.description) }}
+ +
+
{{ formatMessage(alreadyVerifiedMessages.description) }}
+ +{{ formatMessage(postVerificationMessages.description) }}
+ ++ + {{ formatMessage(failedVerificationMessages.loggedInDescription) }} + + + {{ formatMessage(failedVerificationMessages.description) }} + +
+ + + ++ {{ formatMessage(messages.welcomeDescription) }} +
+ +
+
You have no unread notifications.
+Loading notifications...
+ +Error loading notifications:
+
+ {{ error }}
+
+
+
+ You don't have any unread notifications.
++ Any links you specify below will be overwritten on each of the selected projects. Any you + leave blank will be ignored. You can clear a link from all selected projects using the + trash can button. +
++ Changes will be applied to + {{ selectedProjects.length }} project{{ + selectedProjects.length > 1 ? 's' : '' + }}. +
++ You don't have any projects yet. Click the green button above to begin. +
+ +You can edit multiple projects at once by selecting them below.
++ You have + {{ $formatMoney(auth.user.payout_data.balance) }} + available to withdraw. +
++ You have made + {{ $formatMoney(auth.user.payout_data.balance) }}, which is under the minimum of ${{ minWithdraw }} to withdraw. +
+
+ By uploading projects to Modrinth and withdrawing money from your account, you agree to the
+
+ Your PayPal {{ auth.user.payout_data.paypal_country }} account is currently connected with + email + {{ auth.user.payout_data.paypal_address }} +
+ + + +Connect your PayPal account to enable withdrawing to your PayPal balance.
+ +
+ Tremendous payments are sent to your Modrinth email. To change/set your Modrinth email,
+ visit
+
Enter your Venmo username below to enable withdrawing to your Venmo balance.
+ + + +All of your withdrawals from your Modrinth balance will be listed here:
++ {{ + selectedYear !== 'all' + ? selectedMethod !== 'all' + ? formatMessage(messages.transfersTotalYearMethod, { + amount: $formatMoney(totalAmount), + year: selectedYear, + method: selectedMethod, + }) + : formatMessage(messages.transfersTotalYear, { + amount: $formatMoney(totalAmount), + year: selectedYear, + }) + : selectedMethod !== 'all' + ? formatMessage(messages.transfersTotalMethod, { + amount: $formatMoney(totalAmount), + method: selectedMethod, + }) + : formatMessage(messages.transfersTotal, { amount: $formatMoney(totalAmount) }) + }} +
++ You are initiating a transfer of your revenue from Modrinth's Creator Monetization Program. + How much of your + {{ $formatMoney(auth.user.payout_data.balance) }} balance would you like to + transfer to {{ selectedMethod.name }}? +
++ This method has a fixed transfer amount of + {{ $formatMoney(minWithdrawAmount) }}. +
++ This method has a minimum transfer amount of + {{ $formatMoney(minWithdrawAmount) }} and a maximum transfer amount of + {{ $formatMoney(maxWithdrawAmount) }}. +
+ ++ You have entered {{ $formatMoney(parsedAmount) }} to transfer. +
+{{ formatMessage(messages.frogDescription) }}
+
+ {{ formatMessage(messages.frogSinceOpened, { ago: formattedOpenedCounter }) }}
+{{ formatMessage(messages.frogFroggedPeople, { count: peopleFroggedCount }) }}
++ From magical biomes to cursed dungeons, you can be sure to find content to bring your + gameplay to the next level. +
++ Modrinth's lightning-fast search and powerful filters let you find what you want as + you type. +
+Get notified every time your favorite projects update and stay in the loop
++ Version {{ ['1.1.2', '1.0.3', '15.1'][index] }} has been released for + {{ + $capitalizeString( + notification.display_categories[ + notification.display_categories.length - 1 + ] + ) + }} + {{ notification.versions[notification.versions.length - 1] }} +
++ Give an online home to your creations and reach a massive audience of dedicated players +
++ Get your project discovered by thousands of users through search, our home page, Discord + server, and more ways to come in the future! +
+Invite your teammates and manage roles and permissions with ease
+Get paid ad revenue from your project pages and withdraw your funds at any time
++ Integrate with your build tools through Minotaur for automatic uploads right when you + release a new version +
+Get detailed reports on page views, download counts, and revenue
++ Get the best modding experience possible with constant updates from the Modrinth team +
+Effective Date: August 5th, 2023
+Last reviewed on: August 5th, 2023
+
+ This Privacy Notice for California Residents supplements the information contained in the
+
+ Our Service collects information that identifies, relates to, describes, references, is + capable of being associated with, or could reasonably be linked, directly or indirectly, with + a particular consumer or device ("personal information"). In particular, our + Service has collected the following categories of personal information from its consumers + within the last twelve (12) months: +
+| Category | +Examples | +Collected | +
|---|---|---|
| A. Identifiers. | ++ A real name, alias, postal address, unique personal identifier, online identifier, + Internet Protocol address, email address, account name, Social Security number, driver's + license number, passport number, or other similar identifiers. + | +YES | +
| + B. Personal information categories listed in the California Customer Records statute (Cal. + Civ. Code § 1798.80(e)). + | +
+ A name, signature, Social Security number, physical characteristics or description,
+ address, telephone number, passport number, driver's license or state identification card
+ number, insurance policy number, education, employment, employment history, bank account
+ number, credit card number, debit card number, or any other financial information, medical
+ information, or health insurance information. + Some personal information included in this category may overlap with other categories. + |
+ NO | +
| C. Protected classification characteristics. | ++ Age (40 years or older), race, color, ancestry, national origin, citizenship, religion or + creed, marital status, medical condition, physical or mental disability, sex (including + gender, gender identity, gender expression, pregnancy or childbirth and related medical + conditions), sexual orientation, veteran or military status, genetic information + (including familial genetic information). + | +NO | +
| D. Commercial information. | ++ Records of personal property, products or services purchased, obtained, or considered, or + other purchasing or consuming histories or tendencies. + | +NO | +
| E. Biometric information. | ++ Genetic, physiological, behavioral, and biological characteristics, or activity patterns + used to extract a template or other identifier or identifying information, such as, + fingerprints, faceprints, and voiceprints, iris or retina scans, keystroke, gait, or other + physical patterns, and sleep, health, or exercise data. + | +NO | +
| F. Internet or other similar network activity. | ++ Browsing history, search history, information on a consumer's interaction with a website, + application, or advertisement. + | +YES | +
| G. Geolocation data. | +Physical location or movements. | +YES | +
| H. Sensory data. | +Audio, electronic, visual, thermal, olfactory, or similar information. | +NO | +
| I. Professional or employment-related information. | +Current or past job history or performance evaluations. | +NO | +
| + J. Non-public education information (per the Family Educational Rights and Privacy Act (20 + U.S.C. Section 1232g, 34 C.F.R. Part 99)). + | ++ Education records directly related to a student maintained by an educational institution + or party acting on its behalf, such as grades, transcripts, class lists, student + schedules, student identification codes, student financial information, or student + disciplinary records. + | +NO | +
| K. Inferences drawn from other personal information. | ++ Profile reflecting a person's preferences, characteristics, psychological trends, + predispositions, behavior, attitudes, intelligence, abilities, and aptitudes. + | +NO | +
Personal information does not include:
++ We obtain the categories of personal information listed above from the following categories of + sources: +
++ We may use or disclose the personal information we collect for one or more of the following + business purposes: +
++ We will not collect additional categories of personal information or use the personal + information we collected for materially different, unrelated, or incompatible purposes without + providing you notice. +
+ ++ We may disclose your personal information to a third party for a business purpose. When we + disclose personal information for a business purpose, we enter a contract that describes the + purpose and requires the recipient to both keep that personal information confidential and not + use it for any purpose except performing the contract. The CCPA prohibits third parties who + purchase the personal information we hold from reselling it unless you have received explicit + notice and an opportunity to opt-out of further sales. +
+ ++ In the preceding twelve (12) months, Company has disclosed the following categories of + personal information for a business purpose: +
++ We disclose your personal information for a business purpose to the following categories of + third parties: +
+In the preceding twelve (12) months, Company has not sold personal information.
+ ++ The CCPA provides consumers (California residents) with specific rights regarding their + personal information. This section describes your CCPA rights and explains how to exercise + those rights. +
+ ++ You have the right to request that we disclose certain information to you about our collection + and use of your personal information over the past 12 months. Once we receive and confirm your + verifiable consumer request (see + Exercising Access, Data Portability, and Deletion Rights), we will disclose to you: +
++ You have the right to request that we delete any of your personal information that we + collected from you and retained, subject to certain exceptions. Once we receive and confirm + your verifiable consumer request (see + Exercising Access, Data Portability, and Deletion Rights), we will delete (and direct + our service providers to delete) your personal information from our records, unless an + exception applies. +
++ We may deny your deletion request if retaining the information is necessary for us or our + service provider(s) to: +
++ To exercise the access, data portability, and deletion rights described above, please submit a + verifiable consumer request to us by emailing us at + support@modrinth.com. +
++ Only you, or a person registered with the California Secretary of State that you authorize to + act on your behalf, may make a verifiable consumer request related to your personal + information. You may also make a verifiable consumer request on behalf of your minor child. +
++ You may only make a verifiable consumer request for access or data portability twice within a + 12-month period. The verifiable consumer request must: +
++ We cannot respond to your request or provide you with personal information if we cannot verify + your identity or authority to make the request and confirm the personal information relates to + you. +
++ Making a verifiable consumer request does not require you to create an account with us. + However, we do consider requests made through your password protected account sufficiently + verified when the request relates to personal information associated with that specific + account. +
++ We will only use personal information provided in a verifiable consumer request to verify the + requestor's identity or authority to make the request. +
++ For instructions on exercising sale opt-out rights, see + Personal Information Sales Opt-Out and Opt-In Rights. +
+ ++ We endeavor to respond to a verifiable consumer request within forty-five (45) days of its + receipt. If we require more time (up to 90 days), we will inform you of the reason and + extension period in writing. +
++ If you have an account with us, we will deliver our written response to that account. If you + do not have an account with us, we will deliver our written response by mail or + electronically, at your option. +
++ Any disclosures we provide will only cover the 12-month period preceding the verifiable + consumer request's receipt. The response we provide will also explain the reasons we cannot + comply with a request, if applicable. For data portability requests, we will select a format + to provide your personal information that is readily useable and should allow you to transmit + the information from one entity to another entity without hindrance. +
++ We do not charge a fee to process or respond to your verifiable consumer request unless it is + excessive, repetitive, or manifestly unfounded. If we determine that the request warrants a + fee, we will tell you why we made that decision and provide you with a cost estimate before + completing your request. +
+ ++ We will not discriminate against you for exercising any of your CCPA rights. Unless permitted + by the CCPA, we will not: +
++ However, we may offer you certain financial incentives permitted by the CCPA that + can result + in different prices, rates, or quality levels. Any CCPA-permitted financial incentive we offer + will reasonably relate to your personal information's value and contain written terms that + describe the program's material aspects. Participation in a financial incentive program + requires your prior opt in consent, which you may revoke at any time. +
++ We reserve the right to amend this privacy notice at our discretion and at any time. When we + make changes to this privacy notice, we will post the updated notice on the Service and update + the notice's effective date. + Your continued use of our Service following the posting of changes constitutes your + acceptance of such changes. + +
+
+ If you have any questions or comments about this notice, the ways in which we collect and use
+ your information described below and in the
+
Last modified: May 13, 2024
++ This page was created for transparency for how the rewards program works on Modrinth. Feel + free to join our Discord or email + support@modrinth.com if you have any questions! +
++ This document is provided for informational purposes only and does not constitute a legal + agreement. Modrinth makes no representations or warranties as to the accuracy, completeness, + or reliability of the information contained herein. +
++ We collect ad revenue on our website and app through our ad network + Adrinth. We then distribute this ad revenue to creators. +
++ The advertising revenue of the entire website and app is split 90% to creators and 10% to + Modrinth. +
++ The creator allotment to the pool is decided by how many page views and in-app downloads your + project receives (user profiles are not used in this calculation). Each page view and in-app + download counts as a "point". Then, the money is distributed based on each author's point + earnings daily. +
+For example, consider this test scenario (all numbers are fake):
+In this scenario, the earnings for each creator and Modrinth would be as follows:
++ Page views are counted when a legitimate browser views a project page. In-app downloads when a + user logged into the launcher downloads a project. Project downloads alongside modpack + downloads are counted equally. In each category, Modrinth actively removes botted downloads + and page views at our own discretion. If users are caught botting, they will be permanently + banned from using Modrinth's services. +
++ You can view your page views and project downloads in your + analytics dashboard. +
++ This section covers some common concerns people have about our monetization program. If you + have more, feel free to join our Discord or contact support. +
++ No. All creators who upload to Modrinth automatically will receive funds as according to the + above algorithm. However, if you would like to withdraw money from your account, you must + enroll by adding your payment information. +
++ Right now, you can use PayPal or Venmo to withdraw money from your Modrinth account. We are + working on more methods to withdraw money from your account. There are fees to withdraw money + from your Modrinth account—see the revenue page in your dashboard for more information. +
++ While this is true, our new system (as of 08/05/23) gives more of the site's revenue to + creators, so creators will earn more. In the old system, we would earn revenue through + advertisements in search and user profile pages. This amounted on average each month to about + 15-20% of the site's total advertising revenue (so a 80-85% split to creators). The new system + gives creators more revenue and a more favorable split towards creators (90%). +
+ ++ These REWARDS PROGRAM TERMS ("Terms") constitute a legally binding agreement between you (or + the entity you represent) ("you") and Rinth, Inc. ("Rinth") concerning your participation in + the Modrinth Rewards Program (the "Rewards Program"). +
++ The Rewards Program provides developers and content creators an opportunity to monetize the + projects ("Projects") that they upload to the Modrinth website. +
+
+ These Terms are in addition to and do not in any manner limit the applicability of the
+
+ Rinth shall pay to you the percentage set forth
+
+ Your relationship with Rinth relating to the Rewards Program is that of an independent + contractor. In participating in the Rewards Program, you will not be deemed an employee of + Rinth, you are not eligible for any Rinth employee benefits, and you are solely responsible + for determining and paying any taxes applicable to amounts paid to you by Rinth hereunder. You + agree to indemnify and hold harmless Rinth from and against any claim that Rinth is + responsible for payment of any such taxes. +
+ ++ YOUR PARTICIPATION IN THE REWARDS PROGRAM IS AT YOUR OWN RISK. THE REWARDS PROGRAM IS PROVIDED + ON AN "AS IS" AND "AS AVAILABLE" BASIS. TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, + RINTH EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NON-INFRINGEMENT. RINTH MAKES NO WARRANTY THAT (I) THE REWARDS PROGRAM WILL MEET + YOUR REQUIREMENTS, (II) THE REWARDS PROGRAM WILL GENERATE ANY MINIMUM REVENUE, AND/OR (III) + THE REWARDS PROGRAM WILL BE UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE. +
+ ++ YOU ACKNOWLEDGE AND AGREE THAT, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, (A) RINTH + WILL NOT BE LIABLE TO YOU FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR EXEMPLARY + DAMAGES, WHICH YOU MAY INCUR, EVEN IF RINTH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES, ARISING OUT OF OR IN CONNECTION WITH THE REWARDS PROGRAM OR THESE TERMS AND (B) RINTH + WILL NOT BE LIABLE TO YOU FOR MORE THAN THE AMOUNT YOU RECEIVED IN CONNECTION WITH THE REWARDS + PROGRAM IN THE SIX MONTHS PRIOR TO THE TIME YOUR CAUSE OF ACTION AROSE. +
+ ++ These Terms shall be governed by and construed in accordance with the internal laws of the + State of Delaware. +
+ ++ Rinth reserves the right, in our sole discretion and without notice or liability, to terminate + these Terms or modify or cease to offer the Rewards Program at any time, to any person, for + any reason or no reason. +
++ We take claims of copyright infringement seriously. We will respond to notices of alleged + copyright infringement that comply with applicable law. If you believe any materials + accessible on or from this site (the "Website") infringe your copyright, you + may request removal of those materials (or access to them) from the Website by submitting + written notification to our copyright agent designated below. In accordance with the Online + Copyright Infringement Liability Limitation Act of the Digital Millennium Copyright Act (17 + U.S.C. § 512) ("DMCA"), the written notice (the + "DMCA Notice") must include substantially the following: +
+Our designated copyright agent to receive DMCA Notices is:
+
+ Jai Agrawal
+ Rinth, Inc.
+ 410 N Scottsdale Road, Suite 1000, Tempe, Arizona, 85281
+ support@modrinth.com
+
+ If you fail to comply with all of the requirements of Section 512(c)(3) of the DMCA, your DMCA + Notice may not be effective. +
++ Please be aware that if you knowingly materially misrepresent that material or activity on the + Website is infringing your copyright, you may be held liable for damages (including costs and + attorneys' fees) under Section 512(f) of the DMCA. +
++ If you believe that material you posted on the Website was removed or access to it was + disabled by mistake or misidentification, you may file a counter notification with us (a + "Counter Notice") by submitting written notification to our copyright agent + designated above. Pursuant to the DMCA, the Counter Notice must include substantially the + following: +
++ The DMCA allows us to restore the removed content if the party filing the original DMCA Notice + does not file a court action against you within ten business days of receiving the copy of + your Counter Notice. +
++ Please be aware that if you knowingly materially misrepresent that material or activity on the + Website was removed or disabled by mistake or misidentification, you may be held liable for + damages (including costs and attorneys' fees) under Section 512(f) of the DMCA. +
++ It is our policy in appropriate circumstances to disable and/or terminate the accounts of + users who are repeat infringers. +
+Last modified: November 17, 2023
+ ++ Modrinth is part of Rinth, Inc. ("Company", "us", "we", + "our"). This privacy policy explains how we collect data, process it, and your rights relative + to your data. +
++ This policy describes the types of information we may collect from you or that you may provide + when you use www.modrinth.com, api.modrinth.com, or the Modrinth App ("Service" or "Website"), + and our practices for collecting, using, maintaining, protecting, and disclosing that + information. +
+This policy applies to information we collect:
+It does not apply to information collected by:
++ Please read this policy carefully to understand our policies and practices regarding your + information and how we will treat it. If you do not agree with our policies and practices, + your choice is not to use our Website. By accessing or using this Website, you agree to this + privacy policy. This policy may change from time to time (see Changes to the Privacy Policy). + Your continued use of this Website after we make changes is deemed to be acceptance of those + changes, so please check the policy periodically for updates. +
+ ++ The following document was created as required by several laws, including but not limited to: +
+Rinth, Inc. is the data controller for data collected through Modrinth.
+ +When you create an account, we collect:
++ This data is used to identify you and display your profile. It will be linked to your + projects. +
+ +When you view a project page or download a file from Modrinth, we collect:
+This data is used to monitor automated access to our service and deliver statistics.
+ +When you use the Modrinth App to play Modrinth projects, we collect:
+This data is used to deliver statistics.
+ +When you interact with the Modrinth App or the Website, we collect through MixPanel:
+This data is used to deliver statistics.
+ ++ When you sign up for our + + Creator Monetization Program + (the "CMP"), we collect: +
+This data is used to carry out the CMP. It will be linked to your transactions.
+ +
+ View data and download data are anonymized 24 months after being recorded. All personal
+ information will be removed from those records during anonymization.
+ Data is retained indefinitely. We do not delete any data unless you request it.
+
+ We use some third-party services to make Modrinth run. Please refer to each of their privacy + policies for more information: +
++ Data that we specifically collect isn't shared with any other third party. We do not sell any + data. +
+ +
+ Database access is limited to the minimum amount of Rinth, Inc. employees required to run the
+ service.
+ Data is stored in a jurisdiction that is part of the European Economic Area (EEA), encrypted
+ both in storage and in transit.
+
+ We use anonymized statistics to conduct marketing and advertising through + Adrinth. +
+ +We use cookies to log you into your account and save your cosmetic preferences.
++ Cookies are text files placed on your computer to collect standard Internet information. For + more information, please visit + allaboutcookies.org. +
++ You can set your browser not to accept cookies, and the above website tells you how to remove + cookies from your browser. However, in a few cases, some of our website features may not + function as a result. +
+ +Every user is entitled to the following:
++ If you would like to exercise those rights, contact us at + gdpr@modrinth.com. We may ask you to verify your + identity before proceeding and will respond to your request within 30 days as required by law, + or notify you of an extended reply time. +
+ ++ Another part of our priority is adding protection for children while using the Internet. We + encourage parents and guardians to observe, participate in, and/or monitor and guide their + online activity. +
++ Modrinth does not knowingly collect any Personal Identifiable Information from children under + the age of 13. If you think that your child provided this kind of information on our website, + we strongly encourage you to contact us immediately and we will do our best efforts to + promptly remove such information from our records. +
+ ++ This Privacy Policy applies only to our online activities and is valid for visitors to our + website with regards to the information that they shared and/or collect in Modrinth. This + policy is not applicable to any information collected offline or via channels other than this + website. +
+ ++ By using our website, you hereby consent to our Privacy Policy and agree to its Terms and + Conditions. +
+ +
+ If you are a California resident, California law may provide you with additional rights
+ regarding our use of your personal information. To learn more about your California privacy
+ rights, visit
+ California's "Shine the Light" law (Civil Code Section § 1798.83) permits users of our App + that are California residents to request certain information regarding our disclosure of + personal information to third parties for their direct marketing purposes. To make such a + request, please send an email to + support@modrinth.com. +
+ ++ We keep this privacy policy under regular review and place any updates on this web page. If we + do this, we will post the changes on this page and update the "Last edited" date at the top of + this page, after which such changes will become effective immediately. We will make an effort + to keep users updated on any such changes, but because most changes do not affect how we + process existing data, a notice will not be sent for all changes. +
+ ++ If you have any questions about this privacy policy or how we process your data, contact us at + gdpr@modrinth.com or write us at: +
+
+ Rinth, Inc.
+ 410 North Scottsdale Road
+ Suite 1000
+ Tempe, AZ 85281
+
+ Should you wish to fill a complaint or if you feel like we haven't addressed your concerns or + request, you may contact the + Information Commissioner's Office + using their online form or by writing at: +
+
+ Information Commissioner's Office
+ Wycliffe House
+ Water Lane
+ Wilmslow
+ Cheshire
+ SK9 5AF
+ United Kingdom
+
+ You do not need to be a citizen of the United Kingdom to use this method of lodging + complaints. +
+
+ These Content Rules are to be considered part of our
+
+ If you find any violations of these Rules on our website, you should make us aware. You may + use the Report button on any project, version, or user page, or you may email us at + support@modrinth.com. +
+ ++ Content must in their entirety comply with all applicable federal, state, local, and + international laws and regulations. Without limiting the foregoing, Content must not: +
++ Projects, a form of Content, must make a clear and honest attempt to describe their purpose in + designated areas on the project page. Necessary information must not be obscured in any way. + Using confusing language or technical jargon when it is not necessary constitutes a violation. +
+ ++ From a project description, users should be able to understand what the project does and how + to use it. Projects must attempt to describe the following three things within their + description: +
++ Project descriptions must be accessible so that they can be read through a variety of mediums. + All descriptions must have a plain-text version, though images, videos, and other content can + take priority if desired. Headers must not be used for body text. +
+ ++ Project descriptions must have an English-language translation unless they are exclusively + meant for use in a specific language, such as translation packs. Descriptions may provide + translations into other languages if desired. +
+ ++ Projects cannot contain or download "cheats", which we define as a client-side modification + that: +
++ You must own or have the necessary licenses, rights, consents, and permissions to store, + share, and distribute the Content that is uploaded under your Modrinth account. +
+ ++ Content may not be directly reuploaded from another source without explicit permission from + the original author. If explicit permission has been granted, or it is a license-abiding + "fork", this restriction does not apply. We define "forks" as modified copies of a project + which have diverged substantially from the original project. +
+ ++ There are certain other small aspects to creating projects that all authors should attempt to + abide by. These will not necessarily always be enforced, but abiding by all will result in a + faster review with fewer potential issues. +
++ This is the security notice for all Modrinth repositories. The notice explains how + vulnerabilities should be reported. +
++ If you've found a vulnerability, we would like to know so we can fix it before it is released + publicly. + Do not open a GitHub issue for a found vulnerability. +
++ Send details to jai@modrinth.com + including: +
+We will do our best to reply as fast as possible.
+The following vulnerabilities are not in scope:
+If you aren't sure, you can still reach out via email or direct message.
++ This notice is inspired by the + + Python Discord Security Notice. +
+Version 2022-11
+Last modified: September 16, 2023
++ These terms of use are entered into by and between You and Rinth, Inc. + ("Company", "we" or "us"). The following + terms and conditions, together with any documents they expressly incorporate by reference + (collectively, these "Terms of Use"), govern your access to and use of www.modrinth.com, + api.modrinth.com, or the Modrinth App, including any content, functionality and services + offered on or through www.modrinth.com, api.modrinth.com, or the Modrinth App (the "Service"), + whether as a guest or a registered user. +
++ Please read the Terms of Use carefully before you start to use the Service. By accessing or + using the Service, you accept and agree to be bound and abide by these Terms of Use, our + Privacy Policy, our Copyright Policy, and our California Privacy Notice. If you do not want to + agree to these terms and policies, you must not access or use the Service. +
++ The Service is offered and available to users who are 13 years of age or older. By using the + Service, you represent and warrant that you are of legal age to form a binding contract with + the Company and meet all of the foregoing eligibility requirements. If you do not meet all of + these requirements, you must not access or use the Service. +
++ We may revise and update these Terms of Use from time to time in our sole discretion. All + changes are effective immediately when we post them, and apply to all access to and use of the + Service thereafter. +
++ Your continued use of the Service following the posting of revised Terms of Use means that you + accept and agree to the changes. You are expected to check this page each time you access the + Service so you are aware of any changes, as they are binding on you. +
++ We reserve the right to withdraw or amend the Service, and any service or material we provide + through the Service, in our sole discretion without notice. We will not be liable if for any + reason all or any part of the Service is unavailable at any time or for any period. From time + to time, we may restrict access to some parts of the Service, or the entire Service, to users, + including registered users. +
++ You are responsible for making all arrangements necessary for you to have access to the + Service, and ensuring that all persons who access the Service through your internet connection + are aware of these Terms of Use and comply with them. +
++ To access the Service or some of the resources it offers, you may be asked to provide certain + registration details or other information. It is a condition of your use of the Service that + all the information you provide on the Service is correct, current and complete. You agree + that all information you provide to register with the Service or otherwise, including but not + limited to through the use of any interactive features on the Service, is governed by our + Privacy Policy, and you consent to all actions we take with respect to your information + consistent with our Privacy Policy. +
++ If you choose, or are provided with, a email, password or any other piece of information as + part of our security procedures, you must treat such information as confidential, and you must + not disclose it to any other person or entity. You also acknowledge that your account is + personal to you and agree not to provide any other person with access to the Service or + portions of it using your user name, password or other security information (and if you do, + you agree to be responsible for and to indemnify, defend and hold us harmless from any damages + caused by any such person to whom you provide any such information). You agree to notify us + immediately of any unauthorized access to or use of your user name or password or any other + breach of security. You should use particular caution when accessing your account from a + public or shared computer so that others are not able to view or record your password or other + personal information. +
++ We have the right to disable any user name, password or other identifier, whether chosen by + you or provided by us, at any time in our sole discretion for any or no reason, including if, + in our opinion, you have violated any provision of these Terms of Use. +
++ The Service allows you to upload and share your gaming content (the "Gaming Content", to be + distinguished from User Contributions, defined below) with other users of our Service. Unlike + User Contributions, which are owned by the Company, when you use the Service and upload and + share your Gaming Content, the Company does not claim any right, title or interest in or to + your Gaming Content. At the same time, the Company disclaims any and all liability in + connection with the Gaming Content, and you are solely responsible for any and all claims, + actions, damages and the like in connection with the Gaming Content. +
++ When you upload your Gaming Content, you hereby grant us a limited use, non-exclusive, + royalty-free, fully paid up, right to display and distribute your Gaming Content to our users + through the Service, which our users in turn may then use at their sole discretion. +
++ When you delete your Gaming Content, you agree that your Gaming Content may continue to be + used by any users who have previously downloaded your Gaming Content pursuant to the preceding + license, and you also agree that your Gaming Content may continue to be part of any + already-existing Gaming Content "packs" created by other users as part of our Service until + such time as such Gaming Content has been deleted by such user(s) as part of such "pack(s)". + Otherwise, for the avoidance of doubt, as between the Company and you, you own and will + continue to own all right, title and interest in and to your Gaming Content. +
+
+ All Gaming Content must abide by the
+ As part of our Services, we provide a tool known as Application Programming Interfaces + (Modrinth API). The Modrinth API enables users to perform actions on the Service via their own + services, such as their websites and/or applications. +
++ We grant the User of the Modrinth API a limited, non-exclusive, non-sublicensable and + revocable license to download, display, query, create, edit, and delete the User Generated + Content on the Service via their own services, such as their websites and/or applications (the + API License), provided the User complies with the following conditions: +
++ Each User using the Modrinth API shall indemnify Modrinth and keep Modrinth indemnified for + all claims, proceedings or actions brought by another User or any other third party, including + governmental authorities. +
++ Our rewards program ("Rewards Program") provides developers and content + creators with an opportunity to monetize the projects that they upload to the Service. +
+
+ The Company pays to you a percentage of net revenue collected by us and attributable to ad
+ impressions displayed solely on your project pages. The funds are directly deposited into your
+ account, which you can monitor and access via your creator dashboard. Simply enroll in the
+ Rewards Program on your dashboard in order to be able to take advantage of this program.
+ Please review the
+ Except for the Gaming Content, the Service and its entire contents, features and functionality + (including but not limited to all information, software, text, displays, images, video and + audio, and the design, selection and arrangement thereof), are owned by the Company, its + licensors or other providers of such material and are protected by United States and + international copyright, trademark, patent, trade secret and other intellectual property or + proprietary rights laws. +
++ These Terms of Use permit you to use the Service for your personal, non-commercial use only. +
++ No right, title or interest in or to the Service or any content contained therein is + transferred to you, and all rights not expressly granted are reserved by the Company. Any use + of the Service not expressly permitted by these Terms of Use is a breach of these Terms of Use + and may violate copyright, trademark and other laws. +
++ The Company name, the terms Modrinth, the Company logo and all related names, logos, product + and service names, designs and slogans are trademarks of the Company or its affiliates or + licensors. You must not use such marks without the prior written permission of the Company. + All other names, logos, product and service names, designs and slogans contained in the + Service are the trademarks of their respective owners. +
++ You may use the Service only for lawful purposes and in accordance with these Terms of Use. + You agree not to use the Service: +
+Additionally, you agree not to:
++ The Service may contain message boards, chat rooms, personal web pages or profiles, forums, + bulletin boards and other interactive features (collectively, + "Interactive Services") that allow users to post, submit, publish, display or + transmit to other users or other persons (hereinafter, "post") content (other + than Gaming Content, as defined above) or materials (collectively, + "User Contributions") on or through the Service. +
+
+ All User Contributions and use of Interactive Services must abide by the
+
+ Any User Contribution you post to the site will be considered non-confidential and + non-proprietary. By providing any User Contribution through the Service, you grant us and our + affiliates and service providers, and each of their and our respective licensees, successors + and assigns the right to use, reproduce, modify, perform, display, distribute and otherwise + disclose to third parties any such material for any purpose consistent with your account + settings. +
+You represent and warrant that:
++ You understand and acknowledge that you are responsible for any User Contributions you submit + or contribute, and you, not the Company, have full responsibility for such content, including + its legality, reliability, accuracy and appropriateness. +
++ We are not responsible, or liable to any third party, for the content or accuracy of any User + Contributions posted by you or any other user of the Service. +
+We have the right to:
++ Without limiting the foregoing, we have the right to fully cooperate with any law enforcement + authorities or court order requesting or directing us to disclose the identity or other + information of anyone posting any materials on or through the Service. YOU WAIVE AND HOLD + HARMLESS THE COMPANY AND ITS AFFILIATES, LICENSEES AND SERVICE PROVIDERS FROM ANY CLAIMS + RESULTING FROM ANY ACTION TAKEN BY ANY OF THE FOREGOING PARTIES DURING OR AS A RESULT OF ITS + INVESTIGATIONS AND FROM ANY ACTIONS TAKEN AS A CONSEQUENCE OF INVESTIGATIONS BY EITHER SUCH + PARTIES OR LAW ENFORCEMENT AUTHORITIES. +
++ However, we cannot ensure prompt removal of objectionable material after it has been posted. + Accordingly, we assume no liability for any action or inaction regarding transmissions, + communications or content provided by any user or third party. We have no liability or + responsibility to anyone for performance or nonperformance of the activities described in this + section. +
++ If you believe that any User Contributions violate your copyright, please see our Copyright + Policy for instructions on sending us a notice of copyright infringement. It is the policy of + the Company to terminate the user accounts of repeat infringers. +
++ The information presented on or through the Service is made available solely for general + information purposes. We do not warrant the accuracy, completeness or usefulness of this + information. Any reliance you place on such information is strictly at your own risk. We + disclaim all liability and responsibility arising from any reliance placed on such materials + by you or any other visitor to the Service, or by anyone who may be informed of any of its + contents. +
++ The Service includes content provided by third parties, including materials provided by other + users, bloggers and third-party licensors, syndicators, aggregators and/or reporting services. + All statements and/or opinions expressed in these materials, and all articles and responses to + questions and other content, other than the content provided by the Company, are solely the + opinions and the responsibility of the person or entity providing those materials. These + materials do not necessarily reflect the opinion of the Company. We are not responsible, or + liable to you or any third party, for the content or accuracy of any materials provided by any + third parties. +
++ We may update the content on the Service from time to time, but its content is not necessarily + complete or up-to-date. Any of the material on the Service may be out of date at any given + time, and we are under no obligation to update such material. +
++ You may link to our website, provided you do so in a way that is fair and legal and does not + damage our reputation or take advantage of it, but you must not establish a link in such a way + as to suggest any form of association, approval or endorsement on our part. +
+The Service may provide certain social media features that enable you to:
++ You may use these features solely as they are provided by us, and solely with respect to the + content they are displayed with and otherwise in accordance with any additional terms and + conditions we provide with respect to such features. Subject to the foregoing, you must not: +
+
+ The website from which you are linking, or on which you make certain content accessible, must
+ comply in all respects with the
+ You agree to cooperate with us in causing any unauthorized framing or linking immediately to + cease. We reserve the right to withdraw linking permission without notice. +
++ We may disable all or any social media features and any links at any time without notice at + our discretion. +
++ If the Service contains links to other sites and resources provided by third parties, these + links are provided for your convenience only. This includes links contained in advertisements, + including banner advertisements and sponsored links. We have no control over the contents of + those sites or resources, and accept no responsibility for them or for any loss or damage that + may arise from your use of them. If you decide to access any of the third party websites + linked to this Service, you do so entirely at your own risk and subject to the terms and + conditions of use for such websites. +
++ The owner of the Service is based in the state of Delaware in the United States. Access to the + Service may not be legal by certain persons or in certain countries. If you access the Service + from outside the United States, you do so on your own initiative and are responsible for + compliance with local laws. +
++ You understand that we cannot and do not guarantee or warrant that files available for + downloading from the internet or the Service will be free of viruses or other destructive + code. You are responsible for implementing sufficient procedures and checkpoints to satisfy + your particular requirements for anti-virus protection and accuracy of data input and output, + and for maintaining a means external to our site for any reconstruction of any lost data. WE + WILL NOT BE LIABLE FOR ANY LOSS OR DAMAGE CAUSED BY A DISTRIBUTED DENIAL-OF-SERVICE ATTACK, + VIRUSES OR OTHER TECHNOLOGICALLY HARMFUL MATERIAL THAT MAY INFECT YOUR COMPUTER EQUIPMENT, + COMPUTER PROGRAMS, DATA OR OTHER PROPRIETARY MATERIAL DUE TO YOUR USE OF THE SERVICE OR ANY + SERVICES OR ITEMS OBTAINED THROUGH THE SERVICE OR TO YOUR DOWNLOADING OF ANY MATERIAL POSTED + ON IT, OR ON ANY WEBSITE LINKED TO IT. +
++ YOUR USE OF THE SERVICE, ITS CONTENT AND ANY SERVICES OR ITEMS OBTAINED THROUGH THE SERVICE IS + AT YOUR OWN RISK. THE SERVICE, ITS CONTENT AND ANY SERVICES OR ITEMS OBTAINED THROUGH THE + SERVICE ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS, WITHOUT ANY WARRANTIES OF ANY + KIND, EITHER EXPRESS OR IMPLIED. NEITHER THE COMPANY NOR ANY PERSON ASSOCIATED WITH THE + COMPANY MAKES ANY WARRANTY OR REPRESENTATION WITH RESPECT TO THE COMPLETENESS, SECURITY, + RELIABILITY, QUALITY, ACCURACY OR AVAILABILITY OF THE SERVICE. WITHOUT LIMITING THE FOREGOING, + NEITHER THE COMPANY NOR ANYONE ASSOCIATED WITH THE COMPANY REPRESENTS OR WARRANTS THAT THE + SERVICE, ITS CONTENT OR ANY SERVICES OR ITEMS OBTAINED THROUGH THE SERVICE WILL BE ACCURATE, + RELIABLE, ERROR-FREE OR UNINTERRUPTED, THAT DEFECTS WILL BE CORRECTED, THAT THE SERVICE OR THE + SERVER THAT MAKES IT AVAILABLE ARE FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS OR THAT THE + SERVICE OR ANY SERVICES OR ITEMS OBTAINED THROUGH THE SERVICE WILL OTHERWISE MEET YOUR NEEDS + OR EXPECTATIONS. +
++ THE COMPANY HEREBY DISCLAIMS ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED, STATUTORY + OR OTHERWISE, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT + AND FITNESS FOR PARTICULAR PURPOSE. +
++ THE FOREGOING DOES NOT AFFECT ANY WARRANTIES WHICH CANNOT BE EXCLUDED OR LIMITED UNDER + APPLICABLE LAW. +
++ IN NO EVENT WILL THE COMPANY, ITS AFFILIATES OR THEIR LICENSORS, SERVICE PROVIDERS, EMPLOYEES, + AGENTS, OFFICERS OR DIRECTORS BE LIABLE FOR DAMAGES OF ANY KIND, UNDER ANY LEGAL THEORY, + ARISING OUT OF OR IN CONNECTION WITH YOUR USE, OR INABILITY TO USE, THE SERVICE, ANY WEBSITES + LINKED TO IT, ANY CONTENT ON THE SERVICE OR SUCH OTHER WEBSITES OR ANY SERVICES OR ITEMS + OBTAINED THROUGH THE SERVICE OR SUCH OTHER WEBSITES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING BUT NOT LIMITED TO, PERSONAL INJURY, + PAIN AND SUFFERING, EMOTIONAL DISTRESS, LOSS OF REVENUE, LOSS OF PROFITS, LOSS OF BUSINESS OR + ANTICIPATED SAVINGS, LOSS OF USE, LOSS OF GOODWILL, LOSS OF DATA, AND WHETHER CAUSED BY TORT + (INCLUDING NEGLIGENCE), BREACH OF CONTRACT OR OTHERWISE, EVEN IF FORESEEABLE. +
++ IN NO EVENT WILL THE COMPANY, ITS AFFILIATES OR THEIR LICENSORS, SERVICE PROVIDERS, EMPLOYEES, + AGENTS, OFFICERS OR DIRECTORS BE LIABLE FOR DAMAGES OF ANY KIND, UNDER ANY LEGAL THEORY + WHATSOEVER, FOR DAMAGES TO YOU AND/OR ANY OTHER PARTY WHATSOEVER (TAKEN IN THE AGGREGATE) IN + EXCESS OF THE AMOUNTS RECEIVED FROM YOU DURING THE THREE (3) MONTH PERIOD PRIOR TO THE EVENT + GIVING RISE TO THE CLAIM. +
++ THE FOREGOING DOES NOT AFFECT ANY LIABILITY WHICH CANNOT BE EXCLUDED OR LIMITED UNDER + APPLICABLE LAW. +
++ You agree to defend, indemnify and hold harmless the Company, its affiliates, licensors and + service providers, and its and their respective officers, directors, employees, contractors, + agents, licensors, suppliers, successors and assigns from and against any claims, liabilities, + damages, judgments, awards, losses, costs, expenses or fees (including reasonable attorneys' + fees and court costs) arising out of or relating to your violation of these Terms of Use or + your use of the Services, including, but not limited to, your User Contributions, any use of + the Service's content, services and products other than as expressly authorized in these Terms + of Use or your use of any information obtained from the Service. +
++ All matters relating to the Service and these Terms of Use and any dispute or claim arising + therefrom or related thereto (in each case, including non-contractual disputes or claims), + shall be governed by and construed in accordance with the internal laws of the State of + Delaware without giving effect to any choice or conflict of law provision or rule (whether of + the State of Delaware or any other jurisdiction). Any legal suit, action or proceeding arising + out of, or related to, these Terms of Use or the Service shall be instituted exclusively in + the federal courts of the United States or the courts of the State of Delaware in each case + located in Delaware, although we retain the right to bring any suit, action or proceeding + against you for breach of these Terms of Use in your country of residence or any other + relevant country. You irrevocably waive any and all objections to the exercise of jurisdiction + over you by such courts and to venue in such courts. +
++ At the Company's sole discretion, it may require You to submit any disputes arising from the + use of these Terms of Use or the Service, including disputes arising from or concerning their + interpretation, violation, invalidity, non-performance, or termination, to final and binding + arbitration under the Rules of Arbitration of the American Arbitration Association applying + Delaware law. +
++ ANY CAUSE OF ACTION OR CLAIM YOU MAY HAVE ARISING OUT OF OR RELATING TO THESE TERMS OF USE OR + THE WEBSITE MUST BE COMMENCED WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES, + OTHERWISE, SUCH CAUSE OF ACTION OR CLAIM IS PERMANENTLY BARRED. +
++ No waiver of by the Company of any term or condition set forth in these Terms of Use shall be + deemed a further or continuing waiver of such term or condition or a waiver of any other term + or condition, and any failure of the Company to assert a right or provision under these Terms + of Use shall not constitute a waiver of such right or provision. If any provision of these + Terms of Use is held by a court or other tribunal of competent jurisdiction to be invalid, + illegal or unenforceable for any reason, such provision shall be eliminated or limited to the + minimum extent such that the remaining provisions of the Terms of Use will continue in full + force and effect. +
++ The Terms of Use, our Privacy Policy, our + Copyright Policy, our Content Guidelines, and our + California Privacy Notice (if applicable) constitute the sole and entire + agreement between you and the Company with respect to the Service and supersede all prior and + contemporaneous understandings, agreements, representations and warranties, both written and + oral, with respect to the Service. +
+This website is operated by:
+
+ Rinth, Inc.
+ 410 North Scottsdale Road
+ Suite 1000
+ Tempe, AZ 85281
+
+ All notices of copyright infringement claims should be sent to the copyright agent designated + in our Copyright Policy in the manner and by the means set forth therein. +
++ All other feedback, comments, requests for technical support and other communications relating + to the Service should be directed to: + support@modrinth.com. +
++ Showing {{ projectsFiltered.length }} {{ projectTypePlural }} of {{ projects.length }} total + projects in the queue. +
+There are {{ projects.length }} projects in the queue.
+
+
+
You have been invited to join {{ organization.name }}.
++ This page shows you the analytics for your organization's projects. You can see the number + of downloads, page views and revenue earned for all of your projects, as well as the total + downloads and page views for each project by country. +
++ Deleting your organization will transfer all of its projects to the organization owner. This + action cannot be undone. +
+ +{{ member.user.username }}
+{{ member.role }}
++ Any links you specify below will be overwritten on each of the selected projects. Any you + leave blank will be ignored. You can clear a link from all selected projects using the + trash can button. +
++ Changes will be applied to + {{ selectedProjects.length }} project{{ + selectedProjects.length > 1 ? 's' : '' + }}. +
++ You don't have any projects yet. Click the green button above to begin. +
+ +You can edit multiple projects at once by selecting them below.
+
+ Modding should be safe for everyone, so we take abuse and malicious intent seriously
+ at Modrinth. If you encounter content that violates our
+
+ This form is intended exclusively for reporting abuse or harmful content to Modrinth + staff. For bugs related to specific projects, please use the project's designated + Issues link or Discord channel. +
++ Your privacy is important to us; rest assured that your identifying information will + be kept confidential. +
++ Please provide additional context about your report. Include links and images if + possible. Empty reports will be closed. +
+No results found for your query!
+Your account information is not displayed publicly.
+ + +The code entered is incorrect!
+
+ Two-factor authentication keeps your account secure by requiring access to a second
+ device in order to sign in.
+
+ Scan the QR code with Authy,
+
+ Microsoft Authenticator, or any other 2FA app to begin.
+
+ If the QR code does not scan, you can manually enter the secret: + {{ twoFactorSecret }} +
+ + + + +The code entered is incorrect!
+ + ++ Download and save these back-up codes in a safe place. You can use these in-place of a + 2FA code if you ever lose access to your device! You should protect these codes like + your password. +
+Backup codes can only be used once.
++ Once you delete your account, there is no going back. Deleting your account will remove all + attached data, excluding projects, from our servers. +
+ ++ Applications can be used to authenticate Modrinth's users with your products. For more + information, see + Modrinth's API documentation. +
++ When you authorize an application with your Modrinth account, you grant it access to your + account. You can manage and review access to your account here at any time. +
+{{ formatMessage(colorTheme.description) }}
+ +{{ formatMessage(projectListLayouts.description) }}
+{{ formatMessage(toggleFeatures.description) }}
+
+
+
+ {{ formatMessage(messages.sessionsDescription) }} +
+" + escapeHtml(tokens[idx].content) + "";
++ return "" + escapeHtml(token.content) + "";
+ };
+ default_rules.code_block = function(tokens, idx, options, env, slf) {
+ var token = tokens[idx];
+@@ -3306,7 +3289,7 @@
+ if (type === "inline") {
+ result += this.renderInline(tokens[i].children, options, env);
+ } else if (typeof rules[type] !== "undefined") {
+- result += rules[tokens[i].type](tokens, i, options, env, this);
++ result += rules[type](tokens, i, options, env, this);
+ } else {
+ result += this.renderToken(tokens, i, options, env);
+ }
+@@ -4527,7 +4510,7 @@
+ return false;
+ }
+ // check the block quote marker
+- if (state.src.charCodeAt(pos++) !== 62 /* > */) {
++ if (state.src.charCodeAt(pos) !== 62 /* > */) {
+ return false;
+ }
+ // we know that it's going to be a valid blockquote,
+@@ -4535,57 +4518,10 @@
+ if (silent) {
+ return true;
+ }
+- // set offset past spaces and ">"
+- initial = offset = state.sCount[startLine] + 1;
+- // skip one optional space after '>'
+- if (state.src.charCodeAt(pos) === 32 /* space */) {
+- // ' > test '
+- // ^ -- position start of line here:
+- pos++;
+- initial++;
+- offset++;
+- adjustTab = false;
+- spaceAfterMarker = true;
+- } else if (state.src.charCodeAt(pos) === 9 /* tab */) {
+- spaceAfterMarker = true;
+- if ((state.bsCount[startLine] + offset) % 4 === 3) {
+- // ' >\t test '
+- // ^ -- position start of line here (tab has width===1)
+- pos++;
+- initial++;
+- offset++;
+- adjustTab = false;
+- } else {
+- // ' >\t test '
+- // ^ -- position start of line here + shift bsCount slightly
+- // to make extra space appear
+- adjustTab = true;
+- }
+- } else {
+- spaceAfterMarker = false;
+- }
+- oldBMarks = [ state.bMarks[startLine] ];
+- state.bMarks[startLine] = pos;
+- while (pos < max) {
+- ch = state.src.charCodeAt(pos);
+- if (isSpace$9(ch)) {
+- if (ch === 9) {
+- offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4;
+- } else {
+- offset++;
+- }
+- } else {
+- break;
+- }
+- pos++;
+- }
+- oldBSCount = [ state.bsCount[startLine] ];
+- state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);
+- lastLineEmpty = pos >= max;
+- oldSCount = [ state.sCount[startLine] ];
+- state.sCount[startLine] = offset - initial;
+- oldTShift = [ state.tShift[startLine] ];
+- state.tShift[startLine] = pos - state.bMarks[startLine];
++ oldBMarks = [];
++ oldBSCount = [];
++ oldSCount = [];
++ oldTShift = [];
+ terminatorRules = state.md.block.ruler.getRules("blockquote");
+ oldParentType = state.parentType;
+ state.parentType = "blockquote";
+@@ -4607,7 +4543,7 @@
+ // > test
+ // - - -
+ // ```
+- for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {
++ for (nextLine = startLine; nextLine < endLine; nextLine++) {
+ // check if it's outdented, i.e. it's inside list item and indented
+ // less than said list item:
+ // ```
+@@ -4625,24 +4561,22 @@
+ if (state.src.charCodeAt(pos++) === 62 /* > */ && !isOutdented) {
+ // This line is inside the blockquote.
+ // set offset past spaces and ">"
+- initial = offset = state.sCount[nextLine] + 1;
++ initial = state.sCount[nextLine] + 1;
+ // skip one optional space after '>'
+ if (state.src.charCodeAt(pos) === 32 /* space */) {
+ // ' > test '
+ // ^ -- position start of line here:
+ pos++;
+ initial++;
+- offset++;
+ adjustTab = false;
+ spaceAfterMarker = true;
+ } else if (state.src.charCodeAt(pos) === 9 /* tab */) {
+ spaceAfterMarker = true;
+- if ((state.bsCount[nextLine] + offset) % 4 === 3) {
++ if ((state.bsCount[nextLine] + initial) % 4 === 3) {
+ // ' >\t test '
+ // ^ -- position start of line here (tab has width===1)
+ pos++;
+ initial++;
+- offset++;
+ adjustTab = false;
+ } else {
+ // ' >\t test '
+@@ -4653,6 +4587,7 @@
+ } else {
+ spaceAfterMarker = false;
+ }
++ offset = initial;
+ oldBMarks.push(state.bMarks[nextLine]);
+ state.bMarks[nextLine] = pos;
+ while (pos < max) {
+@@ -4845,9 +4780,9 @@
+ }
+ }
+ var list = function list(state, startLine, endLine, silent) {
+- var ch, contentStart, i, indent, indentAfterMarker, initial, isOrdered, itemLines, l, listLines, listTokIdx, markerCharCode, markerValue, max, nextLine, offset, oldListIndent, oldParentType, oldSCount, oldTShift, oldTight, pos, posAfterMarker, prevEmptyEnd, start, terminate, terminatorRules, token, isTerminatingParagraph = false, tight = true;
++ var ch, contentStart, i, indent, indentAfterMarker, initial, isOrdered, itemLines, l, listLines, listTokIdx, markerCharCode, markerValue, max, offset, oldListIndent, oldParentType, oldSCount, oldTShift, oldTight, pos, posAfterMarker, prevEmptyEnd, start, terminate, terminatorRules, token, nextLine = startLine, isTerminatingParagraph = false, tight = true;
+ // if it's indented more than 3 spaces, it should be a code block
+- if (state.sCount[startLine] - state.blkIndent >= 4) {
++ if (state.sCount[nextLine] - state.blkIndent >= 4) {
+ return false;
+ }
+ // Special case:
+@@ -4856,7 +4791,7 @@
+ // - item 3
+ // - item 4
+ // - this one is a paragraph continuation
+- if (state.listIndent >= 0 && state.sCount[startLine] - state.listIndent >= 4 && state.sCount[startLine] < state.blkIndent) {
++ if (state.listIndent >= 0 && state.sCount[nextLine] - state.listIndent >= 4 && state.sCount[nextLine] < state.blkIndent) {
+ return false;
+ }
+ // limit conditions when list can interrupt
+@@ -4865,19 +4800,19 @@
+ // Next list item should still terminate previous list item;
+ // This code can fail if plugins use blkIndent as well as lists,
+ // but I hope the spec gets fixed long before that happens.
+- if (state.sCount[startLine] >= state.blkIndent) {
++ if (state.sCount[nextLine] >= state.blkIndent) {
+ isTerminatingParagraph = true;
+ }
+ }
+ // Detect list type and position after marker
+- if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {
++ if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) {
+ isOrdered = true;
+- start = state.bMarks[startLine] + state.tShift[startLine];
++ start = state.bMarks[nextLine] + state.tShift[nextLine];
+ markerValue = Number(state.src.slice(start, posAfterMarker - 1));
+ // If we're starting a new ordered list right after
+ // a paragraph, it should start with 1.
+ if (isTerminatingParagraph && markerValue !== 1) return false;
+- } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {
++ } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) {
+ isOrdered = false;
+ } else {
+ return false;
+@@ -4885,14 +4820,14 @@
+ // If we're starting a new unordered list right after
+ // a paragraph, first line should not be empty.
+ if (isTerminatingParagraph) {
+- if (state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]) return false;
++ if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false;
+ }
+- // We should terminate list on style change. Remember first one to compare.
+- markerCharCode = state.src.charCodeAt(posAfterMarker - 1);
+ // For validation mode we can terminate immediately
+ if (silent) {
+ return true;
+ }
++ // We should terminate list on style change. Remember first one to compare.
++ markerCharCode = state.src.charCodeAt(posAfterMarker - 1);
+ // Start list
+ listTokIdx = state.tokens.length;
+ if (isOrdered) {
+@@ -4903,20 +4838,19 @@
+ } else {
+ token = state.push("bullet_list_open", "ul", 1);
+ }
+- token.map = listLines = [ startLine, 0 ];
++ token.map = listLines = [ nextLine, 0 ];
+ token.markup = String.fromCharCode(markerCharCode);
+
+ // Iterate list items
+
+- nextLine = startLine;
+- prevEmptyEnd = false;
++ prevEmptyEnd = false;
+ terminatorRules = state.md.block.ruler.getRules("list");
+ oldParentType = state.parentType;
+ state.parentType = "list";
+ while (nextLine < endLine) {
+ pos = posAfterMarker;
+ max = state.eMarks[nextLine];
+- initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine]);
++ initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine]);
+ while (pos < max) {
+ ch = state.src.charCodeAt(pos);
+ if (ch === 9) {
+@@ -4946,14 +4880,14 @@
+ // Run subparser & write tokens
+ token = state.push("list_item_open", "li", 1);
+ token.markup = String.fromCharCode(markerCharCode);
+- token.map = itemLines = [ startLine, 0 ];
++ token.map = itemLines = [ nextLine, 0 ];
+ if (isOrdered) {
+ token.info = state.src.slice(start, posAfterMarker - 1);
+ }
+ // change current state, then restore it after parser subcall
+ oldTight = state.tight;
+- oldTShift = state.tShift[startLine];
+- oldSCount = state.sCount[startLine];
++ oldTShift = state.tShift[nextLine];
++ oldSCount = state.sCount[nextLine];
+ // - example list
+ // ^ listIndent position will be here
+ // ^ blkIndent position will be here
+@@ -4962,9 +4896,9 @@
+ state.listIndent = state.blkIndent;
+ state.blkIndent = indent;
+ state.tight = true;
+- state.tShift[startLine] = contentStart - state.bMarks[startLine];
+- state.sCount[startLine] = offset;
+- if (contentStart >= max && state.isEmpty(startLine + 1)) {
++ state.tShift[nextLine] = contentStart - state.bMarks[nextLine];
++ state.sCount[nextLine] = offset;
++ if (contentStart >= max && state.isEmpty(nextLine + 1)) {
+ // workaround for this case
+ // (list item is empty, list terminates before "foo"):
+ // ~~~~~~~~
+@@ -4973,7 +4907,7 @@
+ // ~~~~~~~~
+ state.line = Math.min(state.line + 2, endLine);
+ } else {
+- state.md.block.tokenize(state, startLine, endLine, true);
++ state.md.block.tokenize(state, nextLine, endLine, true);
+ }
+ // If any of list item is tight, mark list as tight
+ if (!state.tight || prevEmptyEnd) {
+@@ -4981,17 +4915,16 @@
+ }
+ // Item become loose if finish with empty line,
+ // but we should filter last element, because it means list finish
+- prevEmptyEnd = state.line - startLine > 1 && state.isEmpty(state.line - 1);
++ prevEmptyEnd = state.line - nextLine > 1 && state.isEmpty(state.line - 1);
+ state.blkIndent = state.listIndent;
+ state.listIndent = oldListIndent;
+- state.tShift[startLine] = oldTShift;
+- state.sCount[startLine] = oldSCount;
++ state.tShift[nextLine] = oldTShift;
++ state.sCount[nextLine] = oldSCount;
+ state.tight = oldTight;
+ token = state.push("list_item_close", "li", -1);
+ token.markup = String.fromCharCode(markerCharCode);
+- nextLine = startLine = state.line;
++ nextLine = state.line;
+ itemLines[1] = nextLine;
+- contentStart = state.bMarks[startLine];
+ if (nextLine >= endLine) {
+ break;
+ }
+@@ -5002,7 +4935,7 @@
+ break;
+ }
+ // if it's indented more than 3 spaces, it should be a code block
+- if (state.sCount[startLine] - state.blkIndent >= 4) {
++ if (state.sCount[nextLine] - state.blkIndent >= 4) {
+ break;
+ }
+ // fail if terminating block found
+@@ -5410,8 +5343,8 @@
+ return true;
+ };
+ // Paragraph
+- var paragraph = function paragraph(state, startLine /*, endLine*/) {
+- var content, terminate, i, l, token, oldParentType, nextLine = startLine + 1, terminatorRules = state.md.block.ruler.getRules("paragraph"), endLine = state.lineMax;
++ var paragraph = function paragraph(state, startLine, endLine) {
++ var content, terminate, i, l, token, oldParentType, nextLine = startLine + 1, terminatorRules = state.md.block.ruler.getRules("paragraph");
+ oldParentType = state.parentType;
+ state.parentType = "paragraph";
+ // jump line-by-line until empty one or EOF
+@@ -5677,7 +5610,7 @@
+ // Generate tokens for input range
+
+ ParserBlock.prototype.tokenize = function(state, startLine, endLine) {
+- var ok, i, rules = this.ruler.getRules(""), len = rules.length, line = startLine, hasEmptyLines = false, maxNesting = state.md.options.maxNesting;
++ var ok, i, prevLine, rules = this.ruler.getRules(""), len = rules.length, line = startLine, hasEmptyLines = false, maxNesting = state.md.options.maxNesting;
+ while (line < endLine) {
+ state.line = line = state.skipEmptyLines(line);
+ if (line >= endLine) {
+@@ -5700,12 +5633,18 @@
+ // - update `state.line`
+ // - update `state.tokens`
+ // - return true
+- for (i = 0; i < len; i++) {
++ prevLine = state.line;
++ for (i = 0; i < len; i++) {
+ ok = rules[i](state, line, endLine, false);
+ if (ok) {
++ if (prevLine >= state.line) {
++ throw new Error("block rule didn't increment state.line");
++ }
+ break;
+ }
+ }
++ // this can only happen if user disables paragraph rule
++ if (!ok) throw new Error("none of the block rules matched");
+ // set state.tight if we had an empty line before current tag
+ // i.e. latest empty line should not count
+ state.tight = !hasEmptyLines;
+@@ -5931,7 +5870,7 @@
+ state.pos += openerLength;
+ return true;
+ }
+- matchStart = matchEnd = pos;
++ matchEnd = pos;
+ // Nothing found in the cache, scan until the end of the line (or until marker is found)
+ while ((matchStart = state.src.indexOf("`", matchEnd)) !== -1) {
+ matchEnd = matchStart + 1;
+@@ -6485,7 +6424,7 @@
+ }
+ if (!silent) {
+ token = state.push("html_inline", "", 0);
+- token.content = state.src.slice(pos, pos + match[0].length);
++ token.content = match[0];
+ if (isLinkOpen(token.content)) state.linkLevel++;
+ if (isLinkClose(token.content)) state.linkLevel--;
+ }
+@@ -6533,7 +6472,7 @@
+ return false;
+ };
+ // For each opening emphasis-like marker find a matching closing one
+- function processDelimiters(state, delimiters) {
++ function processDelimiters(delimiters) {
+ var closerIdx, openerIdx, closer, opener, minOpenerIdx, newMinOpenerIdx, isOddMatch, lastJump, openersBottom = {}, max = delimiters.length;
+ if (!max) return;
+ // headerIdx is the first delimiter of the current (where closer is) delimiter run
+@@ -6617,10 +6556,10 @@
+ }
+ var balance_pairs = function link_pairs(state) {
+ var curr, tokens_meta = state.tokens_meta, max = state.tokens_meta.length;
+- processDelimiters(state, state.delimiters);
++ processDelimiters(state.delimiters);
+ for (curr = 0; curr < max; curr++) {
+ if (tokens_meta[curr] && tokens_meta[curr].delimiters) {
+- processDelimiters(state, tokens_meta[curr].delimiters);
++ processDelimiters(tokens_meta[curr].delimiters);
+ }
+ }
+ };
+@@ -6818,6 +6757,9 @@
+ ok = rules[i](state, true);
+ state.level--;
+ if (ok) {
++ if (pos >= state.pos) {
++ throw new Error("inline rule didn't increment state.pos");
++ }
+ break;
+ }
+ }
+@@ -6839,17 +6781,21 @@
+ // Generate tokens for input range
+
+ ParserInline.prototype.tokenize = function(state) {
+- var ok, i, rules = this.ruler.getRules(""), len = rules.length, end = state.posMax, maxNesting = state.md.options.maxNesting;
++ var ok, i, prevPos, rules = this.ruler.getRules(""), len = rules.length, end = state.posMax, maxNesting = state.md.options.maxNesting;
+ while (state.pos < end) {
+ // Try all possible rules.
+ // On success, rule should:
+ // - update `state.pos`
+ // - update `state.tokens`
+ // - return true
++ prevPos = state.pos;
+ if (state.level < maxNesting) {
+ for (i = 0; i < len; i++) {
+ ok = rules[i](state, false);
+ if (ok) {
++ if (prevPos >= state.pos) {
++ throw new Error("inline rule didn't increment state.pos");
++ }
+ break;
+ }
+ }
+@@ -7490,386 +7436,6 @@
+ * Override to modify basic RegExp-s.
+ **/ LinkifyIt.prototype.onCompile = function onCompile() {};
+ var linkifyIt = LinkifyIt;
+- /*! https://mths.be/punycode v1.4.1 by @mathias */
+- /** Highest positive signed 32-bit float value */ var maxInt = 2147483647;
+- // aka. 0x7FFFFFFF or 2^31-1
+- /** Bootstring parameters */ var base = 36;
+- var tMin = 1;
+- var tMax = 26;
+- var skew = 38;
+- var damp = 700;
+- var initialBias = 72;
+- var initialN = 128;
+- // 0x80
+- var delimiter = "-";
+- // '\x2D'
+- /** Regular expressions */ var regexPunycode = /^xn--/;
+- var regexNonASCII = /[^\x20-\x7E]/;
+- // unprintable ASCII chars + non-ASCII chars
+- var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g;
+- // RFC 3490 separators
+- /** Error messages */ var errors = {
+- overflow: "Overflow: input needs wider integers to process",
+- "not-basic": "Illegal input >= 0x80 (not a basic code point)",
+- "invalid-input": "Invalid input"
+- };
+- /** Convenience shortcuts */ var baseMinusTMin = base - tMin;
+- var floor = Math.floor;
+- var stringFromCharCode = String.fromCharCode;
+- /*--------------------------------------------------------------------------*/
+- /**
+- * A generic error utility function.
+- * @private
+- * @param {String} type The error type.
+- * @returns {Error} Throws a `RangeError` with the applicable error message.
+- */ function error(type) {
+- throw new RangeError(errors[type]);
+- }
+- /**
+- * A generic `Array#map` utility function.
+- * @private
+- * @param {Array} array The array to iterate over.
+- * @param {Function} callback The function that gets called for every array
+- * item.
+- * @returns {Array} A new array of values returned by the callback function.
+- */ function map(array, fn) {
+- var length = array.length;
+- var result = [];
+- while (length--) {
+- result[length] = fn(array[length]);
+- }
+- return result;
+- }
+- /**
+- * A simple `Array#map`-like wrapper to work with domain name strings or email
+- * addresses.
+- * @private
+- * @param {String} domain The domain name or email address.
+- * @param {Function} callback The function that gets called for every
+- * character.
+- * @returns {Array} A new string of characters returned by the callback
+- * function.
+- */ function mapDomain(string, fn) {
+- var parts = string.split("@");
+- var result = "";
+- if (parts.length > 1) {
+- // In email addresses, only the domain name should be punycoded. Leave
+- // the local part (i.e. everything up to `@`) intact.
+- result = parts[0] + "@";
+- string = parts[1];
+- }
+- // Avoid `split(regex)` for IE8 compatibility. See #17.
+- string = string.replace(regexSeparators, ".");
+- var labels = string.split(".");
+- var encoded = map(labels, fn).join(".");
+- return result + encoded;
+- }
+- /**
+- * Creates an array containing the numeric code points of each Unicode
+- * character in the string. While JavaScript uses UCS-2 internally,
+- * this function will convert a pair of surrogate halves (each of which
+- * UCS-2 exposes as separate characters) into a single code point,
+- * matching UTF-16.
+- * @see `punycode.ucs2.encode`
+- * @see "+I(e[r].content)+"\n"},M.fence=function(e,r,t,n,s){var o,i,a,c,l,u=e[r],p=u.info?T(u.info).trim():"",h="",f="";return p&&(h=(a=p.split(/(\s+)/g))[0],f=a.slice(2).join("")),0===(o=t.highlight&&t.highlight(u.content,h,f)||I(u.content)).indexOf(""+o+"\n"):""+o+"\n"},M.image=function(e,r,t,n,s){var o=e[r];return o.attrs[o.attrIndex("alt")][1]=s.renderInlineAsText(o.children,t,n),s.renderToken(e,r,t)},M.hardbreak=function(e,r,t){return t.xhtmlOut?"=4))break;s=++n}return e.line=s,(o=e.push("code_block","code",0)).content=e.getLines(r,s,4+e.blkIndent,!1)+"\n",o.map=[r,e.line],!0}],["fence",function(e,r,t,n){var s,o,i,a,c,l,u,p=!1,h=e.bMarks[r]+e.tShift[r],f=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(s=e.src.charCodeAt(h))&&96!==s)return!1;if(c=h,(o=(h=e.skipChars(h,s))-c)<3)return!1;if(u=e.src.slice(c,h),i=e.src.slice(h,f),96===s&&i.indexOf(String.fromCharCode(s))>=0)return!1;if(n)return!0;for(a=r;!(++a>=t)&&!((h=c=e.bMarks[a]+e.tShift[a])<(f=e.eMarks[a])&&e.sCount[a] i;n-=d[n]+1)if((o=r[n]).marker===s.marker&&o.open&&o.end<0&&(c=!1,(o.close||s.open)&&(o.length+s.length)%3==0&&(o.length%3==0&&s.length%3==0||(c=!0)),!c)){l=n>0&&!r[n-1].open?d[n-1]+1:0,d[t]=t-n+l,d[n]=l,s.open=!1,o.end=t,o.close=!1,a=-1,f=-2;break}-1!==a&&(u[s.marker][(s.open?3:0)+(s.length||0)%3]=a)}}}var tr=w.isWhiteSpace,nr=w.isPunctChar,sr=w.isMdAsciiPunct;function or(e,r,t,n){this.src=e,this.env=t,this.md=r,this.tokens=n,this.tokens_meta=Array(n.length),this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache={},this.delimiters=[],this._prev_delimiters=[],this.backticks={},this.backticksScanned=!1,this.linkLevel=0}or.prototype.pushPending=function(){var e=new oe("text","",0);return e.content=this.pending,e.level=this.pendingLevel,this.tokens.push(e),this.pending="",e},or.prototype.push=function(e,r,t){this.pending&&this.pushPending();var n=new oe(e,r,t),s=null;return t<0&&(this.level--,this.delimiters=this._prev_delimiters.pop()),n.level=this.level,t>0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],s={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(n),this.tokens_meta.push(s),n},or.prototype.scanDelims=function(e,r){var t,n,s,o,i,a,c,l,u,p=e,h=!0,f=!0,d=this.posMax,m=this.src.charCodeAt(e);for(t=e>0?this.src.charCodeAt(e-1):32;p =4))break;s=++n}return e.line=s,(i=e.push("code_block","code",0)).content=e.getLines(r,s,4+e.blkIndent,!1)+"\n",i.map=[r,e.line],!0}],["fence",function(e,r,t,n){var s,i,o,a,c,l,u,p=!1,h=e.bMarks[r]+e.tShift[r],f=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(s=e.src.charCodeAt(h))&&96!==s)return!1;if(c=h,(i=(h=e.skipChars(h,s))-c)<3)return!1;if(u=e.src.slice(c,h),o=e.src.slice(h,f),96===s&&o.indexOf(String.fromCharCode(s))>=0)return!1;if(n)return!0;for(a=r;!(++a>=t)&&!((h=c=e.bMarks[a]+e.tShift[a])<(f=e.eMarks[a])&&e.sCount[a]
\n"},I.fence=function(e,r,t,n,s){var i,o,a,c,l,u=e[r],p=u.info?z(u.info).trim():"",h="",f="";return p&&(h=(a=p.split(/(\s+)/g))[0],f=a.slice(2).join("")),0===(i=t.highlight&&t.highlight(u.content,h,f)||T(u.content)).indexOf(""+T(e[r].content)+"
\n"):""+i+"
\n"},I.image=function(e,r,t,n,s){var i=e[r];return i.attrs[i.attrIndex("alt")][1]=s.renderInlineAsText(i.children,t,n),s.renderToken(e,r,t)},I.hardbreak=function(e,r,t){return t.xhtmlOut?""+i+"
\n":"
\n"},I.softbreak=function(e,r,t){return t.breaks?t.xhtmlOut?"
\n":"
\n":"\n"},I.text=function(e,r){return T(e[r].content)},I.html_block=function(e,r){return e[r].content},I.html_inline=function(e,r){return e[r].content},R.prototype.renderAttrs=function(e){var r,t,n;if(!e.attrs)return"";for(n="",r=0,t=e.attrs.length;r